Probleme mit usbdmx.dll

Anfängerfragen zum Programmieren mit PureBasic.
Rigo
Beiträge: 2
Registriert: 06.03.2010 18:58

Probleme mit usbdmx.dll

Beitrag von Rigo »

Hallo...
Für mein neues Projekt möchte ich mein DMX Interface von Digital Enlightenment in mein Programm einbinden.

Hier mal der Link von Interface und dll: http://www.digital-enlightenment.de/usbdmx.htm

Leider gelingt es mir nicht die dazugehörige "usbdnx.dll" anzusprechen.
Ich bekomme es irgendwie nicht hin ein Array mit der DLL so komunizieren zu lassen, das
die DLL das Arrey füllen oder lesen kann.

Eventuell kapiere ich das Ganze auch noch nicht so richtig.
Vieleicht kann mir ja irgendjemand aus der Purebasic-Gemeinde bei meinem Problem helfen und mir ein
paar richtungsweisende Tips geben oder mich sogar mit Codebeispielen versorgen.

Zum besseren Verständniss habe ich mal die Spezifikation der dll angehängt.

Danke schonmal im voraus.

MFG Rigo

Code: Alles auswählen

usbdmx.dll - Schnittstelle:


-----------
Funktionen:
-----------

GetAllConnectedInterfaces: TSERIALLIST;
GetAllOpenedInterfaces: TSERIALLIST;
SetInterfaceMode(Serial: TSERIAL; Mode: byte): DWORD;
OpenLink(Serial: TSERIAL; DMXOutArray: PDMXArray; DMXInArray: PDMXArray): DWORD;
CloseLink(Serial: TSERIAL): DWORD;
CloseAllLinks: DWORD;
RegisterInterfaceChangeNotification(Proc: THOSTDEVICECHANGEPROC): DWORD;
UnregisterInterfaceChangeNotification: DWORD;
RegisterInputChangeNotification(Proc: THOSTINPUTCHANGEPROC): DWORD;
UnregisterInputChangeNotification: DWORD;
GetDeviceVersion(Serial: TSERIAL): DWORD;
SetInterfaceAdvTxConfig(Serial: TSERIAL; Control: Byte; Breaktime: word; Marktime: word; Interbytetime: word; Interframetime: word; Channelcount: word; Startbyte: byte): DWORD; stdcall; // >= v1.1
StoreInterfaceAdvTxConfig(Serial: TSERIAL): DWORD; stdcall; // >= v1.1
RegisterInputChangeBlockNotification(Proc: THOSTINPUTCHANGEPROCBLOCK): DWORD; // >= v1.1
UnregisterInputChangeBlockNotification: DWORD; // >= v1.1


-------------------------------------
Object-Pascal Deklarationsvorschläge:
-------------------------------------

function GetAllConnectedInterfaces: TSERIALLIST; stdcall external 'usbdmx.dll';
function GetAllOpenedInterfaces: TSERIALLIST; stdcall external 'usbdmx.dll';
function SetInterfaceMode(Serial: TSERIAL; Mode: byte): DWORD; stdcall external 'usbdmx.dll';
function OpenLink(Serial: TSERIAL; DMXOutArray: PDMXArray; DMXInArray: PDMXArray): DWORD; stdcall external 'usbdmx.dll';
function CloseLink(Serial: TSERIAL): DWORD; stdcall external 'usbdmx.dll';
function CloseAllLinks: DWORD; stdcall external 'usbdmx.dll';
function RegisterInterfaceChangeNotification(Proc: THOSTDEVICECHANGEPROC): DWORD; stdcall external 'usbdmx.dll';
function UnregisterInterfaceChangeNotification: DWORD; stdcall external 'usbdmx.dll';
function RegisterInputChangeNotification(Proc: THOSTDEVICECHANGEPROC): DWORD; stdcall external 'usbdmx.dll';
function UnregisterInputChangeNotification: DWORD; stdcall external 'usbdmx.dll';
function GetDeviceVersion(Serial: TSERIAL): DWORD; stdcall external 'usbdmx.dll';
function SetInterfaceAdvTxConfig(Serial: TSERIAL; Control: Byte; Breaktime: word; Marktime: word; Interbytetime: word; Interframetime: word; Channelcount: word; Startbyte: byte): DWORD; stdcall; stdcall external 'usbdmx.dll';
function StoreInterfaceAdvTxConfig(Serial: TSERIAL): DWORD; stdcall; stdcall external 'usbdmx.dll';
function RegisterInputChangeBlockNotification(Proc: THOSTINPUTCHANGEPROCBLOCK): DWORD; stdcall external 'usbdmx.dll';
function UnregisterInputChangeBlockNotification: DWORD; stdcall external 'usbdmx.dll';


------
Werte:
------
Mode: 0 - Standby; 1 - DMX In -> DMX Out; 2 - PC Out -> DMX Out; 3 - DMX In + PC Out -> DMX Out; 4 - DMX In -> PC In; 5 - DMX In -> DMX Out & DMX In -> PC In; 6 - PC Out -> DMX Out & DMX In -> PC In; 7 - DMX In + PC Out -> DMX Out & DMX In -> PC In;
Version: 0x0100 = v1.00, 0x0110 = v1.10 usw.
ConfigControl: Bit 0: Enable Interbytedelay, Bit 1: Enable Interframedelay, Default = 0
Breaktime: Zeit des Resetpulses, 5,333us Schrittweite, Default = 17
Marktime: Zeit zwischen Resetpuls und Startbyte, 0.666us Schrittweite, Default = 13
Interbytetime: Zeit zwischen zwei Datenbytes (8N2), 0.666us Schrittweite, Default = 0
Interframetime: Zeit zwischen dem letzten Datenbyte und dem Resetpuls, 21,333us Schrittweite, Default = 0
Channelcount: Default = 512
Startbyte: Default = 0


------------------------------
Object-Pascal Typenvorschläge:
------------------------------

PDMXArray = ^TDMXArray;
TDMXArray = array[0..511] of byte;
TSERIAL = array[0..15] of Char;
TSERIALLIST = array[0..31] of TSERIAL;
THOSTDEVICECHANGEPROC = procedure; stdcall;
THOSTINPUTCHANGEPROC = procedure; stdcall;
THOSTINPUTCHANGEPROCBLOCK = procedure(blocknumber: byte); stdcall; // >= v1.1


------------------------
Hilfsroutinenvorschläge:
------------------------

function SerialToSerialstring(Serial: TSERIAL): string;
var i: byte;
begin
Result := '';
for i := 0 to 15 do Result := Result + Serial[i];
end;

function SerialstringToSerial(Serialstr: string): TSERIAL;
var i: byte;
    len: byte;
begin
len := length(Serialstr);
if len > 16 then len := 16;
for i := 0 to 15 do Result[i] := '0';
for i := 1 to len do Result[i + 15 - len] := Serialstr[i];
end;
kk2012
Beiträge: 2
Registriert: 29.05.2012 01:03

Re: Probleme mit usbdmx.dll

Beitrag von kk2012 »

Hi Rigo,

ich habe ebenfalls Probleme damit. Poste doch mal Deine Sources, vielleicht finden wir dann gemeinsam eine Lösung.

Grüße


EDIT: Ok, die usbdmxsi.dll - Variante läuft jetzt bei mir. Ganz dummer Fehler: Hab das Interface zu schnell deinitialisiert, so schnell konnte die dll wohl garnicht merken, dass ich etwas ins Array geschrieben habe. Ein einfaches Sleep_(100) hat das Problem gelöst.
kk2012
Beiträge: 2
Registriert: 29.05.2012 01:03

Re: Probleme mit usbdmx.dll

Beitrag von kk2012 »

Ganz easy mit der usbdmxsi.dll:

Code: Alles auswählen

OpenLibrary(#dmxlib,"usbdmxsi.dll") 
CallFunction(#dmxlib,"OpenInterface",*DMXOut,*DMXIn,#InterfaceMode)           ;"OpenInterface"

For i = 0 To 511                                                             
     DMXOut(i) = 100
Next i 

Sleep_(100)
    
CallFunction (#dmxlib, "CloseInterface")                                      ;Interface schließen
CloseLibrary(#dmxlib)                                                         ;Library schließen
Der Code sendet auf allen Kanälen Wert 100.
Benutzeravatar
Then
Beiträge: 284
Registriert: 06.09.2004 13:26
Wohnort: Siegen

Re: Probleme mit usbdmx.dll

Beitrag von Then »

Hallo Bin auch gerade an der USBDMX.DLL (bzw (USBDMXSI.DLL) dran und bekomme keinerlei Verbindung :(

Der Freestyler öffnet alles und ich kann alle Farben einstellen, aber per PB geht ja gor nöscht.

Hat mal jemand ein Beispiel, um einfach mal die Verbindung herzustellen ?

[EDIT]
So, habe mit der USB2DMX.DLL endlich die Verbindung herstellen können, jedoch ist in dieser DLL ein OksidCommand(a,b,c) Kommando, mit der wohl die Werte übergeben werden, jedoch tut sich da nicht wirklich was...
PB 6.10LTs / Windows 11 64Bit (i9/32GB/ 1TB-SSD+4TB-HDD/3060GTX12GB) / 2x27" Multitouch

... ich mache dazu keine Aussage, weil ich mich damit selbst belasten könnte !
Derren
Beiträge: 558
Registriert: 23.07.2011 02:08

Re: Probleme mit usbdmx.dll

Beitrag von Derren »

Ich habe ein Interface von DMX4ALL und die DLL heißt entsprechend dmx4all.dll, müsst ihr mal ausprobieren, ob das bei euch funktioniert.

Code: Alles auswählen

EnableExplicit 
Define.i DMX4All_isInitialized_bool
Define.i DMX4All_LibraryHandle_handle

Prototype.i DMX4ALL_Prototype_FindInterface(maxport.i)
Prototype.i DMX4ALL_Prototype_SetDMXCh(channel.i, value.i)

Define DMX_FindInterface_protofunction.DMX4ALL_Prototype_FindInterface 
Define DMX_SetDMXCh_protofunction.DMX4ALL_Prototype_SetDMXCh



Procedure Requester(width.i, height.i, title.s, Array message.s(1), button1.s, button2.s="", button3.s="")
	Protected hWnd.i
	Protected arraySize.i
	Protected n.i, y.i
	
	hWnd = OpenWindow(#PB_Any, 0, 0, width, height, title, #PB_Window_ScreenCentered)
	arraySize = (ArraySize(message()) - 1)
	
	For n=0 To arraySize
		If message(n)
			TextGadget(#PB_Any, 5, 5+(n*20), width-10, 20, message(n))
			y+20
		EndIf 
	Next
	
	If button1:ButtonGadget(1, 5, y + 10, width-10, 30, button1):EndIf 
	If button2:ButtonGadget(2, 5, y + 45, width-10, 30, button2):EndIf 
	If button3:ButtonGadget(3, 5, y + 80, width-10, 30, button3):EndIf 
	
	Repeat
		Select WaitWindowEvent()
			Case #PB_Event_Gadget
				CloseWindow(hWnd)
				
				ProcedureReturn EventGadget()
		EndSelect 		
	ForEver 	
EndProcedure 













Procedure __DMX4All_Init()
	Shared DMX4All_isInitialized_bool
	Shared DMX4All_LibraryHandle_handle
	Shared DMX_FindInterface_protofunction
	Shared DMX_SetDMXCh_protofunction
	
	Protected result.i	
	
	If 	DMX4All_isInitialized_bool = #False	
		DMX4All_LibraryHandle_handle 		= OpenLibrary(#PB_Any, "DMX4All.dll")
		If DMX4All_LibraryHandle_handle
			DMX_FindInterface_protofunction		= GetFunction(DMX4All_LibraryHandle_handle, "__FindInterface")
			DMX_SetDMXCh_protofunction 			= GetFunction(DMX4All_LibraryHandle_handle, "__SetDmxCh")
			result = DMX_FindInterface_protofunction(256)
			If result = #False
				CloseLibrary(DMX4All_LibraryHandle_handle)
				ProcedureReturn #False
			Else 
				DMX4All_isInitialized_bool = #True
				ProcedureReturn #True 
			EndIf 
		Else 
			Dim message.s(10)
			message(0) = "Die Datei DMX4All.dll wurde nicht gefunden!"
			Select Requester(400, 105, "FEHLER", message(), "Ignorieren (Programm offline betreiben)", "Programm beenden")
			Case 1:ProcedureReturn #True
			Case 2:End
		EndSelect
		EndIf 
	EndIf  	
EndProcedure  

Procedure DMX_Init()	
	Dim message.s(10)
	message(0) = "Es wurde kein unterstütztes DMX-Interface gefunden!"
	message(1) = "Wie soll fortgefahren werden?"
	
	While Not __DMX4All_Init()
		Select Requester(400, 155, "FEHLER", message(), "Nochmal suchen", "Ignorieren (Programm offline betreiben)", "Programm beenden")
			Case 2:Break
			Case 3:End
		EndSelect 			
	Wend 
EndProcedure 

Procedure SetDMX(channel, value)
	Shared DMX_SetDMXCh_protofunction
	Shared DMX4All_isInitialized_bool
	
	If DMX4All_isInitialized_bool>0
		ProcedureReturn DMX_SetDMXCh_protofunction(channel, value)
	EndIf 
	
	ProcedureReturn #False
EndProcedure   
DisableExplicit



DMX_Init()
setDMX(1, 255)
Signatur und so
Benutzeravatar
Then
Beiträge: 284
Registriert: 06.09.2004 13:26
Wohnort: Siegen

Re: Probleme mit usbdmx.dll

Beitrag von Then »

Ich habe die USB2DMX.dll in einem Ordner und der DLL Helper hat mir folgendes ausgeworfen :

Code: Alles auswählen


Prototype  DasHardCommand()
Prototype  OksidCommand(a, b, c)

Global DasHardCommand.DasHardCommand
Global OksidCommand.OksidCommand

Procedure.i LoadDLL()
  Protected hDLL.i

  hDLL = OpenLibrary(#PB_Any, "usb2dmx.dll")
  If hDLL <> 0
    DasHardCommand = GetFunction(hDLL, "DasHardCommand")
    OksidCommand = GetFunction(hDLL, "OksidCommand")

    ProcedureReturn hDLL
  EndIf

  ProcedureReturn #False
EndProcedure


LoadDLL()
aber ich bekomme kein Licht an. Wenn ich dieses Beispielprogramm von denen nehme (kleine EXE) dann geht's sofort- wo hängts bei mir nur...
PB 6.10LTs / Windows 11 64Bit (i9/32GB/ 1TB-SSD+4TB-HDD/3060GTX12GB) / 2x27" Multitouch

... ich mache dazu keine Aussage, weil ich mich damit selbst belasten könnte !
Derren
Beiträge: 558
Registriert: 23.07.2011 02:08

Re: Probleme mit usbdmx.dll

Beitrag von Derren »

Dein Code macht ja nichts, außer die DLL zu laden.

Was machen denn DasHardCommand() und OksidCommand(a, b, c)?
Gibt's ne Beschreibung zu der DLL? Ich glaube kaum, dass das die beiden einzigen Funktionen der DLL sind. Evtl. muss man beim DLL Helper noch einstellen wie der die DLL laden soll, bzw. welche Funktionen ausgegeben werden sollen?

Ich find außer "Download usb2dmx.dll here" nichts auf Google. Wo kommt die DLL denn her? Freestyler? Und ist da eine Beschreibung zur DLL dabei? Martin Lightjockey kommt auch mit ner DLL, aber ohne Beschreibung^^
Signatur und so
Benutzeravatar
Then
Beiträge: 284
Registriert: 06.09.2004 13:26
Wohnort: Siegen

Re: Probleme mit usbdmx.dll

Beitrag von Then »

Hi, ja ich habe mit dem Befehl Oksidcommand alles mögliche gesendet, aber nix. Ich sehe nur an der LED des Controllers, dass ich Verbindung habe, mehr passiert nicht. Mit der EXE geht alles ... hier die DLL

DMX
PB 6.10LTs / Windows 11 64Bit (i9/32GB/ 1TB-SSD+4TB-HDD/3060GTX12GB) / 2x27" Multitouch

... ich mache dazu keine Aussage, weil ich mich damit selbst belasten könnte !
Derren
Beiträge: 558
Registriert: 23.07.2011 02:08

Re: Probleme mit usbdmx.dll

Beitrag von Derren »

Da ist ja auch die Dmx4all.dll drin^^
Probier doch mal meinen Code aus. Der ist zwar nicht kommentiert, aber wenn er klappt kann ich dir ja helfen.
Signatur und so
Benutzeravatar
Then
Beiträge: 284
Registriert: 06.09.2004 13:26
Wohnort: Siegen

Re: Probleme mit usbdmx.dll

Beitrag von Then »

Ja, habs gerade geändert, jetzt ists richtig - mein Fehler

habe die echte DMX4ALL.dll nicht
PB 6.10LTs / Windows 11 64Bit (i9/32GB/ 1TB-SSD+4TB-HDD/3060GTX12GB) / 2x27" Multitouch

... ich mache dazu keine Aussage, weil ich mich damit selbst belasten könnte !
Antworten