Dokumentation der Bibliothek lumax.dll
Mit Hilfe der mitgeliefterten DLL (Dynamic Link Library) kann das Minilumax Ausgabeboard in eigene Windows-Programme eingebunden werden. Dabei spielt es keine Rolle in welcher Programmiersprache die Anwendung erstellt wird.
Dies soll keine allgemeine Anleitung für den Umgang mit DLLs sein; hier werden lediglich die verfügbaren Routinen dokumentiert. Für weiterführende Informationen zur Einbindung von DLLs in eigene Programme stehen im Internet ausreichend Quellen zur Verfügung.
Die angegebenen Datentypen basieren auf der Programmiersprache C, in anderen Sprachen sind die jeweils entsprechenden Datentypen zu verwenden.
Die Ausgabe von Laserframes an die Karte läuft üblicherweise in den folgenden Schritten ab:
- Abfragen, wieviele Minilumax Ausgabekarten angeschlossen sind
- Öffnen der gewünschten Ausgabekarte(n) für die exklusive Nutzung
- Warten, bis Karte bereit ist für Empfang neuer Daten
- Senden eines Laserframes, und weitermachen mit vorherigem Schritt
- Am Showende: Laserausgabe anhalten
- Am Programmende: Ausgabekarte freigeben
Die meisten Funktionen haben als Rückgabewert einen int. Ist das Ergebnis 0, war der Funktionsaufruf erfolgreich, bei ungleich 0 ist ein Fehler aufgetreten.
Eine Beschreibung der API-Aufrufe für den Zugriff auf die Kopierschutz-Dongle-Funktionen (XTEA 128 Bit Verschlüsselung) ist auf Anfrage erhältlich.
int __stdcall Lumax_GetApiVersion()
Liefert die Versionsnummer der DLL zurück.
int __stdcall Lumax_GetPhysicalDevices()
Liefert als Ergebnis die Anzahl aller angeschlossenen Minilumax-Ausgabekarten zurück. Sofern keine Karte angeschlossen ist, wird 0 zurückgeliefert.
int __stdcall Lumax_OpenDevice(int PhysicalDevice, int Channel)
Öffnet das angegebene Gerät für die weitere Nutzung. Eine möglicherweise von vorheriger Nutzung noch laufende Laserausgabe wird angehalten, DMX512-Sender und -Empfänger werden abgeschaltet.
PhysicalDevice | Nummer der zu öffnenden Ausgabekarte. Wenn die Funktion Lumax_GetPhysicalDevices als Ergebnis z.B. 3 zurückgeliefert hat, so können als mögliche Parameter für PhysicalDevice die Werte 1, 2 oder 3 übergeben werden. Alle angeschlossenen Karten werden anhand ihrer alphanumerischen Seriennummer aufsteigend sortiert. Karte Nummer 1 ist also immer die alphabetisch erste Karte. |
Channel | Immer auf 0 setzen. |
Der Rückgabewert der Funktion ist ein Handle auf das Gerät, das beim Zugriff auf das Gerät mit Hilfe der folgenden Routinen angegeben werden muss. Wenn das Gerät nicht geöffnet werden konnte, so wird 0 zurückgegeben.
int __stdcall Lumax_CloseDevice(int Handle)
Schließt das Gerät, so dass andere Programme darauf zugreifen können.
int __stdcall Lumax_GetDeviceInfo(int PhysicalDevice, int Info_ID, unsigned char *InBuffer, int InLength, unsigned char *OutBuffer, int OutLength)
Liefert Informationen zum angeschlossenen Gerät.
Für die Abfrage der Information muss die Karte nicht unbedingt zuvor mit Lumax_OpenDevice geöffnet worden sein, es schadet aber auch nicht, sollte sie bereits geöffnet sein.
PhysicalDevice | Nummer der Ausgabekarte, die abgefragt werden soll. Es handelt sich nicht um das Handle, wie es von Lumax_OpenDevice zurückgeliefert wird, sondern um die laufende Nummer der Ausgabekarte. Wenn die Funktion Lumax_GetPhysicalDevices als Ergebnis z.B. 3 zurückgeliefert hat, so können als mögliche Parameter für PhysicalDevice die Werte 1, 2 oder 3 übergeben werden. |
Info_ID | Art der Information, die abgefragt werden soll. Zulässige Werte siehe nachfolgende Tabelle. |
InBuffer | Zeiger auf einen Puffer, in dem Daten stehen, die an die Funktion übergeben werden sollen. |
InLength | Größe (in Bytes) des Puffers, auf den InBuffer zeigt. |
OutBuffer | Zeiger auf einen Puffer, in dem die Funktion die zurückzuliefernden Daten ablegen kann. |
OutLength | Größe (in Bytes) des Puffers, auf den OutBuffer zeigt. |
Info_ID | Funktion |
1 | Seriennummer der Karte abfragen. In dem Puffer, auf den OutBuffer zeigt, wird die alphanumerische Seriennummer (8 Zeichen plus Null-Byte) zurückgeliefert. Die Größe OutLength des Puffers muss also mindestens 9 Byte betragen. Es handelt sich um dieselbe Seriennummer, wie sie auch im Minilumax-Testprogramm in der rechten oberen Ecke angezeigt wird. Die Parameter InBuffer und InLength sind ungenutzt und sollten auf 0 gesetzt werden. |
2 | Firmware Hauptversionsnummer der Karte abfragen (erst ab DLL-Version 2.19). In die 32 Bit Integer Variable, auf die OutBuffer zeigt, wird die Firmware Hauptversionsnummer zurückgeliefert. Die Größe OutLength des Puffers muss also mindestens 4 Byte betragen. Es handelt sich um dieselbe Versionsnummer, wie sie auch im Minilumax-Testprogramm unter "Current Firmware" in den ersten drei Ziffern angezeigt wird. Die Parameter InBuffer und InLength sind ungenutzt und sollten auf 0 gesetzt werden. |
int __stdcall Lumax_SendFrame(int Handle, TLumax_Point *Points, int NumOfPoints, int ScanSpeed, int UpdateMode, int *TimeToWait)
Sendet einen Laserframe mit der angegebenen Anzahl Punkten an die Ausgabekarte.
Handle | Handle zur eindeutigen Identifizierung des Geräts |
Points | Zeiger auf einen Speicherbereich, in dem nacheinander alle Punkte des Frames hinterlegt sind. Die einzelnen Punkte haben den Datentyp TLumax_Point (siehe unten). |
NumOfPoints | Gibt die Anzahl der Punkte des Frames an. |
ScanSpeed | Gibt die Ausgabegeschwindigkeit (PPS, points per second) an. Gültig sind Werte zwischen 250 und 70000 PPS. Diese Ausgabegeschwindigkeit kommt erst zur Anwendung, wenn die Ausgabe dieses Frames startet. Die Geschwindigkeit eines möglicherweise aktuell noch laufenden Frames wird nicht geändert. |
UpdateMode | Immer auf 0 setzen. |
TimeToWait | Immer auf 0 setzen. |
Aufbau der Punktinformation:
typedef struct
{
unsigned short Ch1, Ch2, Ch3, Ch4, Ch5, Ch6, Ch7, Ch8, TTL;
} TLumax_Point;
Es handelt sich um vorzeichenlose 16-Bit-Werte
- Ch1=X, Ch2=Y (0=links/unten, 32768=mitte, 65535=rechts/oben)
- Ch3=Red, Ch4=Green, Ch5=Blue (0=aus, 65535=volle Helligkeit)
- Ch6=Deep Blue, Ch7=Yellow (0=aus, 65535=volle Helligkeit): wird nur von manchen Varianten der Minilumax Ausgabekarte unterstützt, sollte aber dennoch grundsätzlich von der Lasershowsoftware beschrieben werden (sofern diese mehr als 3 Farbkanäle unterstützt).
- Ch8=Cyan oder Intensity (0=aus, 65535=volle Helligkeit): wird nur von manchen Varianten der Minilumax Ausgabekarte unterstützt, sollte aber dennoch grundsätzlich von der Lasershowsoftware beschrieben werden (sofern diese mehr als 3 Farbkanäle unterstützt). Kanal 8 kann je nach Variante entweder als Cyan oder Intensity Ausgang genutzt werden.
- TTL: manche Betriebsmodi der Minilumax-Karte erlauben ein punktsynchrones schalten der TTL-Ausgänge. In diesen Fällen stehen im Low-Byte die 8 TTL-Ausgänge. Üblicherweise werden die TTL-Ausgänge aber mit Lumax_SetTTL (siehe unten) angesteuert; der Wert von dem hier diskutierten TTL wird dann ignoriert.
int __stdcall Lumax_WaitForBuffer(int Handle, int Timeout, int *TimeToWait, int *BufferChanged)
Wartet auf das Freiwerden des Empfangspuffers bzw. liefert dessen Status zurück.
Handle | Handle zur eindeutigen Identifizierung des Geräts |
Timeout | Wenn als Timeout 0 angegeben wird, so wird lediglich der aktuelle Status abgefragt; die Funktion kehrt sofort zurück. Die Zeit bis zum Ende des Frames wird im Parameter TimeToWait zurückgeliefert, in BufferChanged steht, ob auf den zuletzt gesendeten Puffer bereits umgeschaltet wurde. Wenn bereits umgeschaltet wurde, also die Laserausgabe dieses Frames begonnen hat, dann ist dieser Wert logisch 1 und es kann mit der Übertragung des nächsten Frames begonnen werden. |
TimeToWait | Zeiger auf eine int-Variable, in der die Zeit (Millisekunden) bis zum Frameende zurückgeliefert wird (siehe Timeout). |
BufferChanged | Zeiger auf eine int-Variable, in der zurückgeliefert wird, ob bereits auf den nächsten Frame umgeschaltet wurde (=1) oder nicht (=0) (siehe Timeout). |
int __stdcall Lumax_StopFrame(int Handle)
Hält die Laserausgabe an. Alle Farbkanäle werden auf den Wert 0 gesetzt. X- und Y-Achse werden auf die Bildmitte positioniert. Alle TTL-Ausgänge werden abgeschaltet.
Handle | Handle zur eindeutigen Identifizierung des Geräts |
int __stdcall Lumax_SetTTL(int Handle, int TTL)
Setzt die TTL-Ausgänge der Minilumax-Karte.
Handle | Handle zur eindeutigen Identifizierung des Geräts |
TTL | Ein 32-Bit-Wert, dessen unterste 8 Bit auf den TTL-Ausgangspins ausgegeben werden. |
Hinweis: Bei älteren Firmware-Varianten der Ausgabekarten wird der Zustand der TTL-Ausgänge erst dann aktualisiert, wenn ein neuer Laserframe per Lumax_SendFrame ausgegeben wird. Es wird daher empfohlen, den Aufruf von Lumax_SetTTL immer unmittelbar vor den Aufruf von Lumax_SendFrame zu platzieren.
int __stdcall Lumax_SetDmxMode(int Handle, int NumOfTxChannels, int NumOfRxChannels)
Aktiviert bzw. deaktiviert den DMX512 Sender bzw. Empfänger auf der Minilumax-Karte. Es ist zu beachten, dass ein aktiver Sender/Empfänger Rechenleistung auf der Ausgabekarte benötigt, und daher nicht mehr die volle Ausgabegeschwindigkeit gewährleistet werden kann. Wenn DMX512 nicht benötigt wird, sollte es daher auch nicht aktiviert werden.
Handle | Handle zur eindeutigen Identifizierung des Geräts |
NumOfTxChannels | Anzahl der zu übertragenden DMX512-Nutzkanäle. Für einen kompletten DMX-Frame mit 1 Startbyte und 512 Nutzbytes muss der Wert also 512 sein. Der Wert 0 schaltet den DMX-Sender aus. |
NumOfRxChannels | Anzahl der maximal zu empfangenen DMX512-Nutzkanäle. Da laut DMX512-Spezifikation eine Länge von 512 Byte plus 1 Startbyte erlaubt ist, sollte der Wert auf 512 gesetzt werden, um den Empfänger zu aktivieren. Der Wert 0 schaltet den DMX-Empfänger aus. |
int __stdcall Lumax_SendDmx(int Handle, char *DmxBuffer, int Length)
Überträgt DMX512-Daten an den Ausgabepuffer der Minilumax-Karte.
Handle | Handle zur eindeutigen Identifizierung des Geräts |
DmxBuffer | Zeiger auf einen Speicherbereich, in dem die zu sendenden DMX-Daten liegen. Jeder DMX-Kanal belegt 1 Byte. Achtung: Das DMX-Startbyte wird an der ersten Stelle des Puffers erwartet (es sollte üblicherweise den Wert 0 haben), anschließend folgen die DMX-Nutzbytes. |
Length | Gibt die Anzahl der Bytes an, die in den Puffer der Ausgabekarte kopiert werden sollen, inklusive DMX-Startbyte. Für einen kompletten DMX-Frame mit 1 Startbyte und 512 Nutzbytes muss der Wert also 513 sein. Achtung: diese Angabe ist unabhängig von der tatsächlich ausgegebenen Länge der DMX-Frames; diese wird mit Lumax_SetDmxMode gesetzt. |
int __stdcall Lumax_ReceiveDmx(int Handle, char *DmxBuffer, int Length)
Kopiert den empfangenen DMX512-Frame aus dem Empfangspuffer der Minilumax-Karte in den angegebenen Speicherbereich.
Handle | Handle zur eindeutigen Identifizierung des Geräts |
DmxBuffer | Zeiger auf einen Speicherbereich, in dem der empfangene DMX-Eingangspuffer abgelegt werden soll. Jeder DMX-Kanal belegt 1 Byte. Achtung: Das DMX-Startbyte wird an der ersten Stelle des Puffers abgelegt (es sollte üblicherweise den Wert 0 haben), anschließend folgen die DMX-Nutzbytes. Der Speicherbereich muss groß genug sein, um die mit Length angegebene Anzahl Bytes aufzunehmen. |
Length | Gibt die Anzahl der Bytes an, die in den angegebenen Speicherbereich kopiert werden sollen, inklusive DMX-Startbyte. Für einen kompletten DMX-Frame mit 1 Startbyte und 512 Nutzbytes muss der Wert also 513 sein. |
int __stdcall Lumax_Read_E2P(int Handle, unsigned char *Buffer, int EepromAdress, int Length)
Die Ausgabekarte enthält einen vom Anwender frei nutzbaren, nichtflüchtigen Speicherbereich. Hier kann die Lasershowsoftware Daten ablegen, die auch nach Abschalten der Betriebsspannung erhalten bleiben.
Insgesamt stehen 64 Byte Speicher zur Verfügung. Grundsätzlich können diese zwar beliebig genutzt werden, es wird aber empfohlen, die ersten 32 Byte zur Ablage eines Klartextnamens zu verwenden. Dieser Name beschreibt den Verwendungszweck der Ausgabekarte, z.B. "Projektor links oben".
Bei neuen, unbeschriebenen Karten ist dieser Speicherbereich mit 0xFF initialisiert, d.h. alle Bits sind gesetzt.
Die Funktion Lumax_Read_E2P dient zum Lesen des nichtflüchtigen Speichers.
Erst ab DLL-Version 2.18 und Firmware Hauptversion 7 verfügbar.
Handle | Handle zur eindeutigen Identifizierung des Geräts |
Buffer | Zeiger auf einen Speicherbereich, in den der Inhalt des nichtflüchtigen Speichers eingelesen wird. Der Speicherbereich muss groß genug sein, um die mit Length angegebene Anzahl Bytes aufzunehmen. |
EepromAdress | Adresse innerhalb des nichtflüchtigen Speichers, ab der gelesen werden soll. Zulässig sind Werte von 0 bis 63. |
Length | Gibt die Anzahl der Bytes an, die in den angegebenen Speicherbereich kopiert werden sollen. Zulässig sind Werte von 1 bis 64. Die Summe aus (EepromAdress + Length) darf nicht größer als 64 sein. |
int __stdcall Lumax_Write_E2P(int Handle, unsigned char *Buffer, int EepromAdress, int Length)
Dient zum Schreiben des nichtflüchtigen Speichers.
Erst ab DLL-Version 2.18 und Firmware Hauptversion 7 verfügbar.
Da der EEPROM Speicher eine begrenzte Lebensdauer von etwa 100000 Schreibzyklen hat, sollte er nicht unnötig oft (z.B. in einer Programmschleife) geschrieben werden, sondern nur wenn wirklich Änderungsbedarf besteht.
Handle | Handle zur eindeutigen Identifizierung des Geräts |
Buffer | Zeiger auf einen Speicherbereich, dessen Inhalt in den nichtflüchtigen Speichers geschrieben werden soll. |
EepromAdress | Adresse innerhalb des nichtflüchtigen Speichers, ab der die Daten abgelegt werden soll. Zulässig sind Werte von 0 bis 63. |
Length | Gibt die Anzahl der Bytes an, die in den angegebenen Speicherbereich kopiert werden sollen. Zulässig sind Werte von 1 bis 64. Die Summe aus (EepromAdress + Length) darf nicht größer als 64 sein. |
int __stdcall Lumax_GetInputCapture(int Handle, int *NumOfEvents, unsigned char *Buffer)
Holt die seit dem letzten Aufruf der Funktion gemessenen Input Capture Ereignisse von der Minilumax-Karte ab. Kann für den Bau einer Laserharp (Laserharfe) verwendet werden. Für die ausführliche Dokumentation bitte dem Link folgen.
Beispiel
Das folgende Beispiel fragt die Anzahl aller angeschlossenen MiniLumax Karten ab, öffnet (sofern vorhanden) die erste Karte, und gibt drei Linien in den Farben rot, grün und blau aus. Die Ausgabe erfolgt mit einer Scanrate von 10000 Punkten pro Sekunde. Nach einer Pause von 5 Sekunden wird die Ausgabe angehalten und die Karte wieder freigegeben.
Das Beispiel wurde in C programmiert, das Grundprinzip ist für andere Sprachen identisch. Die eigentlichen API-Aufrufe sind fett hervorgehoben.
Ein weiteres Beispiel für Visual Basic wurde freundlicherweise von Tschosef zur Verfügung gestellt:
Example_VB.zip
typedef struct
{
unsigned short Ch1, Ch2, Ch3, Ch4, Ch5, Ch6, Ch7, Ch8, TTL;
} TLumax_Point;
TLumax_Point Lumax_Points[4000];
typedef int __stdcall (*tLumax_SendFrame)(int, TLumax_Point *, int, int, int, int *);
typedef int __stdcall (*tLumax_StopFrame)(int);
typedef int __stdcall (*tLumax_WaitForBuffer)(int, int, int *, int *);
typedef int __stdcall (*tLumax_GetPhysicalDevices)();
typedef int __stdcall (*tLumax_OpenDevice)(int, int);
typedef int __stdcall (*tLumax_CloseDevice)(int);
tLumax_SendFrame fLumax_SendFrame;
tLumax_StopFrame fLumax_StopFrame;
tLumax_WaitForBuffer fLumax_WaitForBuffer;
tLumax_GetPhysicalDevices fLumax_GetPhysicalDevices;
tLumax_OpenDevice fLumax_OpenDevice;
tLumax_CloseDevice fLumax_CloseDevice;
void main(void)
{
int i, j, PointCounter, LumaxHandle, TimeToWait, BufferChanged;
HINSTANCE DllHandle;
DllHandle = LoadLibrary("lumax.dll"); // open DLL
if (DllHandle != NULL)
{ // DLL successfully opened -> get functions
fLumax_SendFrame = (tLumax_SendFrame)GetProcAddress(DllHandle, "Lumax_SendFrame");
fLumax_StopFrame = (tLumax_StopFrame)GetProcAddress(DllHandle, "Lumax_StopFrame");
fLumax_WaitForBuffer = (tLumax_WaitForBuffer)GetProcAddress(DllHandle, "Lumax_WaitForBuffer");
fLumax_GetPhysicalDevices = (tLumax_GetPhysicalDevices)GetProcAddress(DllHandle, "Lumax_GetPhysicalDevices");
fLumax_OpenDevice = (tLumax_OpenDevice)GetProcAddress(DllHandle, "Lumax_OpenDevice");
fLumax_CloseDevice = (tLumax_CloseDevice)GetProcAddress(DllHandle, "Lumax_CloseDevice");
if ( (fLumax_SendFrame != NULL)
&& (fLumax_StopFrame != NULL)
&& (fLumax_WaitForBuffer != NULL)
&& (fLumax_GetPhysicalDevices != NULL)
&& (fLumax_OpenDevice != NULL)
&& (fLumax_CloseDevice != NULL))
{ // now we have all functions
i = fLumax_GetPhysicalDevices(); // get number of connected Minilumax devices
if (i > 0)
{ // there's at least 1 Minilumax device
LumaxHandle = fLumax_OpenDevice(1, 0); // open the first available Minilumax card
if (LumaxHandle != 0)
{ // card successfully opened
// now, prepare the output buffer (draw 3 lines colored R/G/B)
PointCounter = 0;
for (i = 0; i < 3; i++) // loop for colors
{
for (j = 0; j < 100; j++) // each line consists of 100 points
{
Lumax_Points[PointCounter].Ch1 = j * 600; // x position
Lumax_Points[PointCounter].Ch2 = i * 10000; // y position
Lumax_Points[PointCounter].Ch3 = (i == 0) ? 65535 : 0; // red
Lumax_Points[PointCounter].Ch4 = (i == 1) ? 65535 : 0; // green
Lumax_Points[PointCounter].Ch5 = (i == 2) ? 65535 : 0; // blue
PointCounter = PointCounter + 1;
}
}
// before we can send the frame to the Minilumax card, we have to ask if the buffer is free
do
{
// we could do something useful here, like calculation of new frame data
// ...
// ...
// ...
fLumax_WaitForBuffer(LumaxHandle, 0, &TimeToWait, &BufferChanged);
}
while (BufferChanged == 0); // repeat loop until the buffer is free
fLumax_SendFrame(LumaxHandle, Lumax_Points, PointCounter, 10000, 0, 0); // send frame
Sleep(5000); // wait 5 seconds
fLumax_StopFrame(LumaxHandle); // stop laser output
fLumax_CloseDevice(LumaxHandle); // close Minilumax device
}
}
}
}
}
Letztes Update: 22.11.2010
Zurück zur Hauptseite