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:
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.

PhysicalDeviceNummer 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.
ChannelImmer 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.

PhysicalDeviceNummer 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_IDArt der Information, die abgefragt werden soll. Zulässige Werte siehe nachfolgende Tabelle.
InBufferZeiger auf einen Puffer, in dem Daten stehen, die an die Funktion übergeben werden sollen.
InLengthGröße (in Bytes) des Puffers, auf den InBuffer zeigt.
OutBufferZeiger auf einen Puffer, in dem die Funktion die zurückzuliefernden Daten ablegen kann.
OutLengthGröße (in Bytes) des Puffers, auf den OutBuffer zeigt.

Info_IDFunktion
1Seriennummer 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.
2Firmware 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.

HandleHandle zur eindeutigen Identifizierung des Geräts
PointsZeiger auf einen Speicherbereich, in dem nacheinander alle Punkte des Frames hinterlegt sind. Die einzelnen Punkte haben den Datentyp TLumax_Point (siehe unten).
NumOfPointsGibt die Anzahl der Punkte des Frames an.
ScanSpeedGibt 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.
UpdateModeImmer auf 0 setzen.
TimeToWaitImmer 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

int __stdcall Lumax_WaitForBuffer(int Handle, int Timeout, int *TimeToWait, int *BufferChanged)

Wartet auf das Freiwerden des Empfangspuffers bzw. liefert dessen Status zurück.

HandleHandle zur eindeutigen Identifizierung des Geräts
TimeoutWenn 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.
TimeToWaitZeiger auf eine int-Variable, in der die Zeit (Millisekunden) bis zum Frameende zurückgeliefert wird (siehe Timeout).
BufferChangedZeiger 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.

HandleHandle zur eindeutigen Identifizierung des Geräts


int __stdcall Lumax_SetTTL(int Handle, int TTL)

Setzt die TTL-Ausgänge der Minilumax-Karte.

HandleHandle zur eindeutigen Identifizierung des Geräts
TTLEin 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.

HandleHandle zur eindeutigen Identifizierung des Geräts
NumOfTxChannelsAnzahl 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.
NumOfRxChannelsAnzahl 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.

HandleHandle zur eindeutigen Identifizierung des Geräts
DmxBufferZeiger 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.
LengthGibt 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.

HandleHandle zur eindeutigen Identifizierung des Geräts
DmxBufferZeiger 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.
LengthGibt 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.

HandleHandle zur eindeutigen Identifizierung des Geräts
BufferZeiger 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.
EepromAdressAdresse innerhalb des nichtflüchtigen Speichers, ab der gelesen werden soll. Zulässig sind Werte von 0 bis 63.
LengthGibt 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.

HandleHandle zur eindeutigen Identifizierung des Geräts
BufferZeiger auf einen Speicherbereich, dessen Inhalt in den nichtflüchtigen Speichers geschrieben werden soll.
EepromAdressAdresse innerhalb des nichtflüchtigen Speichers, ab der die Daten abgelegt werden soll. Zulässig sind Werte von 0 bis 63.
LengthGibt 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