Einbindung der ArtNetLib in C#

Alles was nicht direkt mit dem normalen Verhalten des PC_DIMMERs zu tun hat
Antworten
Edgar
Beiträge: 5
Registriert: 24.08.2012, 16:36
Kontaktdaten:

Einbindung der ArtNetLib in C#

Beitrag von Edgar »

Hallo,

auf der Suche nach einer Möglichkeit in einer eigenen Anwendung Artnet-Daten an einen Artnet-Node zu senden, bin ich auf die Library von PC-Dimmer gestoßen. Jedoch bestehen Probleme bei der Anwendung. Ich würde gerne in C# programmieren, da dort die meisten Kenntnisse vorhanden sind. VB Kenntnisse sind auch vorhanden. Jedoch mangelt es mir an Delphie Kenntnissen. Deshalb werde ich auch aus dem mitgelieferten Beispielprogramm nicht wirklich schlau. Mir geht es erst einmal nur um das Senden von Informationen.

Gibt es irgendwo Beispielanwendungen oder hat jemand die lib schon einmal integriert? Beim googeln bin ich nicht fündig geworden.

In welcher Reihenfolge werden die einzelnen Funktionen aufgerufen?
1. Recieve auf off
2. Konfiguration (SetConfig)
3. aktivieren (Activate)
4. SetChannel
5. SendDMXUniverse

Das wäre meine Vorgehensweise. Dann bestehen jedoch teilweise Probleme beim Aufruf der einzelnen Funktionen.

Danke im Vorraus.

Grüße
Martin3182
Lichtchef
Beiträge: 93
Registriert: 20.07.2011, 12:41

Re: Einbindung der ArtNetLib in C#

Beitrag von Martin3182 »

Hey,

ich bin auch in C#/VB unterwegs, von daher kann ich dir evtl. helfen.

Beschreibe mal genauer was für "probleme" auftauchen.
Du kannst mir auch mal ne PM schreiben, ich hab auch Skype.

Grüße Martin
Jeglicher Text, den Ihr vor diesen Zeilen lest, ist durch Zufall generiert worden und muss nicht zwingend Sinn ergeben.
Edgar
Beiträge: 5
Registriert: 24.08.2012, 16:36
Kontaktdaten:

Re: Einbindung der ArtNetLib in C#

Beitrag von Edgar »

Hallo, danke für die Hilfe und die Unterstützung.

Z.B. die Datentypen, TDMXArray ist ein Array mit den zu sendenden Bytes? also z.B. ein Array mit 512 Feldern.
"PDMXArray = ^TDMXArray", dort liegt schon das erste Problem. was bedeutet das "^"? Eine XOR-Verknüpfung wird es ja sicher nicht sein oder?

Anschließend wird als erstes die SetConfig Kunktion aufgerufen?

Gruß
Martin3182
Lichtchef
Beiträge: 93
Registriert: 20.07.2011, 12:41

Re: Einbindung der ArtNetLib in C#

Beitrag von Martin3182 »

Hey,

so wie ich die Dokumentation verstehe ist TDMXArray ein Array von Bytes, PDMXArray ist der Zeiger auf dieses Array. ^ist in delphi der Referenzierer.

Du müsstest zuerst ArtNet_Activate, danach ArtNet_SetConfig,

danach musst du (Wahrscheinlich) mit SetChannel die einzelnen Kanalwerte ändern und zum Schluss das mittels SendDMXUniverse absenden. Dabei dient das TDMXArray nur als Buffer.

Hoffe ich konnte helfen ;)

Grüße Martin.

edit:

hier gibts ein stück fertigen Quellcode:
Das wäre die 2. Möglichkeit, einfach die ArtNet Spezifikation neu in C# implementieren ;)
Viel Spass noch beim Probieren^^
Jeglicher Text, den Ihr vor diesen Zeilen lest, ist durch Zufall generiert worden und muss nicht zwingend Sinn ergeben.
Benutzeravatar
Christian
PC_DIMMER-Entwickler
Beiträge: 1856
Registriert: 12.11.2007, 09:30
Wohnort: Knw.-Remsfeld
Kontaktdaten:

Re: Einbindung der ArtNetLib in C#

Beitrag von Christian »

Hallo,


einiges wurde ja schon erklärt. Hier nur ein paar kurze Hinweise:

"ArtNET_SetChannel" erlaubt das Ändern eines einzelnen Kanalwertes im ArtNet-Universum. Es wird zwar das gesamte Universe versendet, aber man kann so sehr einfach Kanalwertänderungen realisieren.

"ArtNET_SendDMXUniverse" ist für eine Änderung von mehreren Kanälen gleichzeitig gedacht. Man übergibt einfach ein ganzes Universe per Pointer.


Das Senden wird bei beiden Funktionen automatisch übernommen. Zusätzlich kann man dann in den Einstellungen noch definieren, dass die Übertragung der Universes per Netzwerk ununterbrochen durchgeführt werden sollen - also nicht nur bei einer Änderung.


beste Grüße,
Christian
Martin3182
Lichtchef
Beiträge: 93
Registriert: 20.07.2011, 12:41

Re: Einbindung der ArtNetLib in C#

Beitrag von Martin3182 »

Hallo Christian,

danke für die Aufklärung.

Ich dachte dass man per SetChannel nur pluginintern den Kanal setzt.

Der Rest war soweit klar.

PS: mein Plugin läuft jetzt in den Grundzügen, der PluginLoader für .NET ist soweit fertig ;)
Das Problem war dass du Pointer übergeben hast, aber C#/.NET Delegates erwartet (im Prinzip typisierte Pointer) Ich habs so gelöst dass ich noch eine in Delphi geschriebene DLL eingefügt habe, die deine untypisierten Pointer auf meine Delegaten castet.

@Edgar: Interesse mir zu Helfen bei der Entwicklung von einem Matrix Plugin?
Geschrieben wird in C#/VB.

Grüße, Martin
Jeglicher Text, den Ihr vor diesen Zeilen lest, ist durch Zufall generiert worden und muss nicht zwingend Sinn ergeben.
Edgar
Beiträge: 5
Registriert: 24.08.2012, 16:36
Kontaktdaten:

Re: Einbindung der ArtNetLib in C#

Beitrag von Edgar »

Hallo

@ Christian
Danke für die näheren Erläuterungen. Ich werde es die Woche mal probieren umzusetzen.

@Martin
Die 2. Möglichkeit habe ich schon veruscht, aber eher mit mäßigem Erfolg. Mein Scheinwerfer zum Test machte sich selbstständig und leuchtete immer dann, wenn er lust und laune hatte :)

Interesse dir zu helfen hätte ich schon, zur Zeit sieht es ein bisschen knapp mit der Zeit bei mir, muss demnächste meine Diplomarbeit verteidigen. Abe grundlegendes Interesse besteht auf jedenfall. Bin aber nicht der beste Programmierer, mache das auch nur hobbymäßig.

Grüße
Markus
Edgar
Beiträge: 5
Registriert: 24.08.2012, 16:36
Kontaktdaten:

Re: Einbindung der ArtNetLib in C#

Beitrag von Edgar »

Hallo,

da ich nur DMX-Telegramme versenden möchte, sind dafür die Callbackfunktionen notwendig?

Grüße Markus
Benutzeravatar
Christian
PC_DIMMER-Entwickler
Beiträge: 1856
Registriert: 12.11.2007, 09:30
Wohnort: Knw.-Remsfeld
Kontaktdaten:

Re: Einbindung der ArtNetLib in C#

Beitrag von Christian »

Guten Morgen,


nein, die Callback-Funktionen sind nur notwendig, wenn man Daten von der ArtNet-DLL in Richtung des Host-Programmes senden möchte - z.B. für DMX-In. Man braucht also nur folgende Funktionen aufrufen:

ArtNET_Activate(@Dummy, @Dummy);
ArtNET_SetChannel(0, 0, Ch, Value);


und dann sollte es funktionieren. Ggfs. muss man vorher noch mit ArtNET_ShowConfig() die notwendigen Einstellungen vornehmen.


viele Grüße,
Christian
Edgar
Beiträge: 5
Registriert: 24.08.2012, 16:36
Kontaktdaten:

Re: Einbindung der ArtNetLib in C#

Beitrag von Edgar »

Hallo,

die Einbindung hat soweit funktioniert, großen Dank an Martin. Wenn ich aus C# die Config-Funktion aufrufe, öffnet sich kurz das Konfigfenster mit der Fehlermeldung "Zugriff auf einen Socket war aufgrund der Zugriffsrechte des Sockets unzulässig (10013')". und dann stürzt das Problem ab.

Sendet da schon etwas auf dem Port?

Gruß Markus
Benutzeravatar
Christian
PC_DIMMER-Entwickler
Beiträge: 1856
Registriert: 12.11.2007, 09:30
Wohnort: Knw.-Remsfeld
Kontaktdaten:

Re: Einbindung der ArtNetLib in C#

Beitrag von Christian »

Hallo,

ja, der Port sollte bereits nach dem Initialisieren der DLL geöffnet werden. Beim Öffnen des Config-Fensters wird dann ein "Rundruf" also ein Scan nach ArtNet Nodes gestartet. Socket-Fehler 10013 heißt laut MS-Website:
Permission denied.

An attempt was made to access a socket in a way forbidden by its access permissions. An example is using a broadcast address for sendto without broadcast permission being set using setsockopt(SO_BROADCAST).

Another possible reason for the WSAEACCES error is that when the bind function is called (on Windows NT 4.0 with SP4 and later), another application, service, or kernel mode driver is bound to the same address with exclusive access. Such exclusive access is a new feature of Windows NT 4.0 with SP4 and later, and is implemented by using the SO_EXCLUSIVEADDRUSE option.

Der häufigste Fehler ist hier, dass der Port bereits auf dem Computer durch ein anderes Programm geöffnet wurde. Hast Du eventuell die DLL zweimal initialisiert?


viele Grüße,
Christian
Martin3182
Lichtchef
Beiträge: 93
Registriert: 20.07.2011, 12:41

Re: Einbindung der ArtNetLib in C#

Beitrag von Martin3182 »

Hallo,

also den Code vom Edgar hab ich ja nur ein wenig angepasst und der sieht so aus:

Code: Alles auswählen

        [DllImport("ArtNETlib.dll",BestFitMapping=true)]
        public extern static void ArtNET_ShowAbout();

        [DllImport("ArtNETlib.dll", BestFitMapping = true, CallingConvention = CallingConvention.StdCall)]
        public extern static void ArtNET_ShowConfig();

        [DllImport("ArtNETlib.dll", BestFitMapping=true, CallingConvention = CallingConvention.StdCall)]
        public extern static void ArtNET_Activate(object a, object b);
        [DllImport("ArtNETlib.dll", BestFitMapping = true, CallingConvention = CallingConvention.StdCall)]
        public extern static void ArtNET_Deactivate();
Das ist der Aufrufende Code:

Code: Alles auswählen

            try
            {
                ArtNET_Activate(null, null);
                ArtNET_ShowConfig();
                ArtNET_Deactivate();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
Grüße, Martin
Jeglicher Text, den Ihr vor diesen Zeilen lest, ist durch Zufall generiert worden und muss nicht zwingend Sinn ergeben.
Benutzeravatar
Christian
PC_DIMMER-Entwickler
Beiträge: 1856
Registriert: 12.11.2007, 09:30
Wohnort: Knw.-Remsfeld
Kontaktdaten:

Re: Einbindung der ArtNetLib in C#

Beitrag von Christian »

Hi,

naja, du deaktivierst das Plugin ja sofort wieder:

Code: Alles auswählen

                ArtNET_Activate(null, null);
                ArtNET_ShowConfig();
                ArtNET_Deactivate();
mit ArtNET_Deactivate(); wird sowohl die Verbindung, als auch das Config-Fenster komplett geschlossen und wieder freigegeben. ArtNET_Deactivate sollte nur beim Beenden des eigenen Programms aufgerufen werden. Den Config-Dialog beendet man in der Regel mit dem dafür vorgesehenen "OK" Button.


beste Grüße,
Christian
Martin3182
Lichtchef
Beiträge: 93
Registriert: 20.07.2011, 12:41

Re: Einbindung der ArtNetLib in C#

Beitrag von Martin3182 »

Hallo Christian,

dadurch dass das ShowConfig ein Dialogfeld ist, bekommt es mit dem Aufruf in .NET die alleinige Priorität, und die Ausführung des restlichen Codes wird solange angehalten, bis der Dialog wieder geschlossen wird.

Von daher wird ArtNET_Deactivate erst _nach_ dem Schließen des Dialogs ausgeführt wird.

Grüße, Martin
Jeglicher Text, den Ihr vor diesen Zeilen lest, ist durch Zufall generiert worden und muss nicht zwingend Sinn ergeben.
Antworten