Mehrere IOWARRIOR unter Linux

Dies ist das deutsche Forum für alle Themen um den IO-Warrior. Beiträge bitte nur in Deutsch.

Moderator: Guido Körber

Post Reply
Johnny
Posts: 10
Joined: Wed Oct 03, 2007 11:26 am

Mehrere IOWARRIOR unter Linux

Post by Johnny »

Hi,

ich benutze den iowarrior schon länger und bin vor kurzem
auf ein Problem (Bug?) gestoßen:

Bei mir läuft seit einem halben Jahr ein iow24 zur Steuerung meiner
elektrischen Rollos (über Optokoppler, ULN2803, etc.) unter Linux
Das funktioniert soweit problemlos. Ich hab dazu das Beispielprogramm
iowkittest.c "umgebaut" :)
Nun bin ich endlich dazu gekommen eine zweite Platine mit einem
iow40 fertig zu stellen (ich hab da ein paar mehr Rollos zum Steuern)
Ein zweites Programm, eine kopierte und für den iow40 geänderte
Variante des vorhandenen Programms ist auch schon fertig.
Beide iowarrior werden nach dem Anstecken erkannt:

--------------------------------------------------------------------------------
...
... LinuxSDK/Kernel_2.6/Driver/iowarrior.c: IOWarrior product=0x1501, serial=00000974 interface=0 now attached to iowarrior0
... LinuxSDK/Kernel_2.6/Driver/iowarrior.c: IOWarrior product=0x1501, serial=00000974 interface=1 now attached to iowarrior1
... LinuxSDK/LinuxSDK/Kernel_2.6/Driver/iowarrior.c: IOWarrior product=0x1500, serial=000011B1 interface=0 now attached to iowarrior2
... LinuxSDK/LinuxSDK/Kernel_2.6/Driver/iowarrior.c: IOWarrior product=0x1500, serial=000011B1 interface=1 now attached to iowarrior3
...
---------------------------------------------------------------------------------

Für beide iowarrior gibts auch die devices:

----------------------------------------------------------------------------
...
crw-rw-rw- 1 root users 180, 208 May 28 23:30 /dev/usb/iowarrior0
crw-rw-rw- 1 root users 180, 209 May 28 23:30 /dev/usb/iowarrior1
crw-rw-rw- 1 root users 180, 210 Oct 3 11:51 /dev/usb/iowarrior2
crw-rw-rw- 1 root users 180, 211 Oct 3 11:51 /dev/usb/iowarrior3
...
-----------------------------------------------------------------------------

Und wenn ich eines der beiden Programme starte, dann sieht das auch gut aus:

---------------------------------------------------------------------
...
2 IOWs in system
1 PID 1501, S/N "00000974"
2 PID 1500, S/N "000011B1"
Found iow24 with serno 00000974, waiting for keys...
...
-------------------------------------------------------------------------

Soweit so gut, aber ...

Jedes Programm alleine läuft, wenn jedoch ein Programm läuft,
lässt sich das andere nicht mehr starten:
--------------------------------------------------------------------
...
Failed to open device
...
---------------------------------------------------------------------

Ich kann also die Funktion "IowKitOpenDevice()"
nur aus einem Programm heraus aufrufen???

--------------------------------------------------
devHandle = IowKitOpenDevice();
if (devHandle == NULL)
{
printf("Failed to open device\n");
goto out;
}
--------------------------------------------------

Mit " iows = IowKitGetDeviceHandle(i + 1)"
bekomme ich in einem Programm für jeden iowarrior
ein Handle.

Muss ich jetzt beide Programme in ein Programm "umschreiben"?

Kann ich unter Linux nicht zwei getrennte Programme für zwei
iowarrior laufen lassen?

Liegt mein Problem evtl. daran, dass das erste Programm einen
Handle für beide iowarrior öffnet?? Wie gibt man das Handle zurück?

Kann eigentlich nicht sein, da das zweite Programm bereits bei
"IowKitOpenDevice()" scheitert noch bevor es versucht
"IowKitGetDeviceHandle" aufzurufen!?!


Ich verwende das iowkit 1.5 aus dem Linux-SDK

Ich hab zum Test auch mal das Kernel-Modul aus iowkit 1.4
gebaut und ausprobiert. Leider beenden sich damit meine Programme
(und auch das Original "iowkittest") nach einigen Sekunden
ohne Fehlermeldung. Hm, müsste dafür vermutlich
die Programme neu mit dem iowkit 1.4 kompilieren ??!!
Wenn man in den paar Sekunden in denen das erste Programm
läuft das zweite Programm startet, hab ich das gleiche Problem:
"Failed to open device"

Gibt es unter Linux diese Einschränkung?
Ich hab mal danach mal Google gefragt, aber leider nichts gefunden.

Wer hat das schon mal probiert und kennt sich aus??

Danke!!

bye
Johnny
User avatar
Christoph Jung
Posts: 673
Joined: Sun Oct 08, 2006 3:43 pm
Location: Germany / Berlin
Contact:

Post by Christoph Jung »

Egentlich sollte man jeden IO-Warrior mit einem eigenständigen Programm steuern können. Was bis jetzt nich geht ist einen IOWarrior mit mehreren Programmen laufen zu lassen. Daran wird im moment gearbeitet.



Ich kann also die Funktion "IowKitOpenDevice()"
nur aus einem Programm heraus aufrufen???
Nein, man kann es auch in verschiedenen Programmen aufrufen.
Mit " iows = IowKitGetDeviceHandle(i + 1)"
bekomme ich in einem Programm für jeden iowarrior
ein Handle.

Muss ich jetzt beide Programme in ein Programm "umschreiben"?


Umschreiben nicht ganz. Die einzelnen Programme müssen auf den jeweiligen IOWarrior angepasst werden. Am besten anhand der Seriennummer.

Kann ich unter Linux nicht zwei getrennte Programme für zwei
iowarrior laufen lassen?


Sollte eigentlich kein problem sein. Ich bin aber leider nur der mann für Windows.

Liegt mein Problem evtl. daran, dass das erste Programm einen
Handle für beide iowarrior öffnet?? Wie gibt man das Handle zurück?


Daran wirds am warscheinlichsten liegen. Ein handle einfach mit IowKitCloseDevice(HANDLE); zerstören.

Kann eigentlich nicht sein, da das zweite Programm bereits bei
"IowKitOpenDevice()" scheitert noch bevor es versucht
"IowKitGetDeviceHandle" aufzurufen!?!


kann sehr wohl sein, denn IowKitOpenDevice() erstellt ja das Handle. Wenn bereits jemand auf den IOWarrior zugreift, dann macht er das nicht mehr mit. Ist eine Sicherheitsmaßnahme glaub ich (bin mir aber nicht sicher)

Gibt es unter Linux diese Einschränkung?

Kann ich leider nicht beantworten, da ich wie gesagt noch nicht viel mit Linux in der Hinsicht gemacht habe
Software developer
Johnny
Posts: 10
Joined: Wed Oct 03, 2007 11:26 am

Post by Johnny »

Hi nochmal!

Danke für die Antwort, aber so ganz verstehe ich die Doku nicht.
In der Doku zur Library Version 1.5 steht:

"IowKitOpenDevice" öffnet alle iowarrior und gibt aber nur das handle
auf den ersten gefundenen iowarrior zurück

Wenn man nun mehrere iowarrior angeschlossen hat
(Anzahl kann man mit "IowKitGetNumDevs" herausfinden)
kann man mit "IowKitGetDeviceHandle" einen Handle für
die weiteren iowarrior bekommen.

Ich rufe also in meinem Programm "IowKitOpenDevice" auf
bekomme einen Handle für den ersten iowarrior.
"IowKitGetNumDevs" sagt mir ich hab noch einen zweiten iowarrior.
Also benutze ich "IowKitGetDeviceHandle" um einen Handle
für den zweiten iowarrior zu bekommen.
Jetzt kann ich die Seriennummern abfragen und mein Programm
benutzt z.B den ersten Handle für den zum Programm
passenden iowarrior.
Soweit funktioniert das ja auch.
Wenn ich jetzt den zweiten unbenutzten Handle zurück geben will
soll ich "IowKitCloseDevice" benutzen.
Nur leider steht in der Doku:

"Close all IO-Warriors.
...
If multiple IO-Warriors are present all will be closed by this function."

Das ist nun wirklich nicht das was ich will!
Dann funktioniert vielleicht das zweite Programm aber das
erste Programm wird ohne Handle nicht mehr funktionieren!

In der Doku zu Version 1.5 steht noch:
As of dynamic library version 1.4 the function ignores the parameter completely.

Hm, steht hier zwar nicht, aber vielleicht wird der Parameter
in der Version 1.5 ja nicht ignoriert??!
Vielleicht werden in der Version 1.5 nicht alle iowarrior geschlossen??

Ich denke ich probier das mal aus, vielleicht habe ich ja richtig
geraten :-) ("Die Hoffnung stirbt zuletzt" :-)

Wer am Ergebnis interessiert ist, bitte dranbleiben,
mehr dazu demnächst auf diesem Sender :-)

bye
Johnny










Christoph Jung wrote:Egentlich sollte man jeden IO-Warrior mit einem eigenständigen Programm steuern können. Was bis jetzt nich geht ist einen IOWarrior mit mehreren Programmen laufen zu lassen. Daran wird im moment gearbeitet.



Ich kann also die Funktion "IowKitOpenDevice()"
nur aus einem Programm heraus aufrufen???
Nein, man kann es auch in verschiedenen Programmen aufrufen.
Mit " iows = IowKitGetDeviceHandle(i + 1)"
bekomme ich in einem Programm für jeden iowarrior
ein Handle.

Muss ich jetzt beide Programme in ein Programm "umschreiben"?


Umschreiben nicht ganz. Die einzelnen Programme müssen auf den jeweiligen IOWarrior angepasst werden. Am besten anhand der Seriennummer.

Kann ich unter Linux nicht zwei getrennte Programme für zwei
iowarrior laufen lassen?


Sollte eigentlich kein problem sein. Ich bin aber leider nur der mann für Windows.

Liegt mein Problem evtl. daran, dass das erste Programm einen
Handle für beide iowarrior öffnet?? Wie gibt man das Handle zurück?


Daran wirds am warscheinlichsten liegen. Ein handle einfach mit IowKitCloseDevice(HANDLE); zerstören.

Kann eigentlich nicht sein, da das zweite Programm bereits bei
"IowKitOpenDevice()" scheitert noch bevor es versucht
"IowKitGetDeviceHandle" aufzurufen!?!


kann sehr wohl sein, denn IowKitOpenDevice() erstellt ja das Handle. Wenn bereits jemand auf den IOWarrior zugreift, dann macht er das nicht mehr mit. Ist eine Sicherheitsmaßnahme glaub ich (bin mir aber nicht sicher)

Gibt es unter Linux diese Einschränkung?

Kann ich leider nicht beantworten, da ich wie gesagt noch nicht viel mit Linux in der Hinsicht gemacht habe
Johnny
Posts: 10
Joined: Wed Oct 03, 2007 11:26 am

Post by Johnny »

Hi,

ich schon wieder :-)

Hier die Auflösung des Rätsels: Funktioniert nicht!

"IowKitCloseDevice" schließt wirklich alle Handles!

Wenn der erste gefunden iowarrior nicht der richtige ist
und schließe sofort danach mit "IowKitCloseDevice"
den Handle, finde ich natürlich keinen zweiten mehr.
Wenn ich erst alle Handles suche und rufe dann
"IowKitCloseDevice" mit dem Parameter für den unbenutzten
iowarrior auf funktioniert auch der aktive iowarrior nicht mehr :-(

Also funktioniert die in meinem letzten Beitrag beschriebene
Vorgehensweise nicht!!
Hat jemand noch eine andere Idee??

bye
Johnny
User avatar
Christoph Jung
Posts: 673
Joined: Sun Oct 08, 2006 3:43 pm
Location: Germany / Berlin
Contact:

Post by Christoph Jung »

Frage: Wie genu ist der Aublauf im Programm, wenn OpenDevice aufgeruffen wird und die Handles kontrolliert werden?
Software developer
Johnny
Posts: 10
Joined: Wed Oct 03, 2007 11:26 am

Post by Johnny »

Christoph Jung wrote:Frage: Wie genu ist der Aublauf im Programm, wenn OpenDevice aufgeruffen wird und die Handles kontrolliert werden?
Hm eigentlich genau so wie im Beispiel iowkittest.c:

Zuerst ein open:

// Open device
devHandle = IowKitOpenDevice();
if (devHandle == NULL)
{
printf("Failed to open device\n");
goto out;
}

Dann frag ich wieviele iowarrior da sind:

numIows = IowKitGetNumDevs();
printf("%d IOWs in system\n", numIows);

danach werden in einer Schleife die Handles (und Seriennummern, etc.)
aller weiteren iowarrior geholt:

// Get all IOW handles
for (i = 0; i < numIows; i++)
{
// Get device handle and init object
iows = IowKitGetDeviceHandle(i + 1);
// Get serial number
IowKitGetSerialNumber(iows, sn);
pid = IowKitGetProductId(iows);
for (j = 0; j < 9; j++)
snt[j] = sn[j];
printf("%d PID %x, S/N "%s"\n", i + 1, (unsigned int) pid, snt);

// check if one of iow has serial no "000011B1" and set iow40index
// usbrollo needs this sn, cause its a iowarrior40
if (strncmp(snt, "000011B1", 8) == 0)
iow40index = i;

IowKitSetWriteTimeout(iows, 1000);
}

So funktioniert es für einen iowarrior, das zweite Programm macht genau das
gleiche bekommt aber - nur wenn das erste Programm läuft - bereits beim
devHandle = IowKitOpenDevice();
ein NULL zurück und beendet sich!


Ich hab dann in der for-Schleife IowKitCloseDevice aufgerufen:

// check if one of iow has serial no "000011B1" and set iow40index
// usbrollo needs this sn, cause its a iowarrior40
if (strncmp(snt, "000011B1", 8) == 0)
iow40index = i;
else
{

// test: if its not our iow40, close handle
IowKitCloseDevice(iows);
printf("iow %d (ser no. %s ) will not be used, close handle\n",i + 1, snt);

}

Das war allerdings quatsch, da als erstes der iow24 gefunden wurde.
Close hat dann den Handle geschlossen und der zweite Aufruf in der Schleife
hat dann gar nichts mehr gefunden!

Danach hab ich probiert den nicht benutzten Handle nach der Schleife zu schließen:

for (i = 0; i < numIows; i++)
{
// Get device handle and init object
iows = IowKitGetDeviceHandle(i + 1);
// Get serial number
IowKitGetSerialNumber(iows, sn);
pid = IowKitGetProductId(iows);
for (j = 0; j < 9; j++)
snt[j] = sn[j];
printf("%d PID %x, S/N "%s"\n", i + 1, (unsigned int) pid, snt);

// check if one of iow has serial no "000011B1" and set iow40index
// usbrollo needs this sn, cause its a iowarrior40
if (strncmp(snt, "000011B1", 8) == 0)
iow40index = i;

IowKitSetWriteTimeout(iows, 1000);
}

// test: closed unused handle:
if (iow40index == 1)
{
IowKitCloseDevice(iows[0]);
printf("iow 0 will not be used, close handle\n");
}
else
{
IowKitCloseDevice(iows[1]);
printf("iow 1 will not be used, close handle\n");
}


Das Programm findet beide iowarrior, bekommt beide Handles
und übergiebt das nicht benötgite Handle dem IowKitCloseDevice.

Leider schließt IowKitCloseDevice beide Handles
- wie auch in der Doku richtig beschrieben :-|
und das aktuell laufende Programm beendet sich nach dem nächsten
read (oder write?!) mit dem Handle "iows[iow40index]"

Ich hoffe das war verständlich :-)

Gibts noch eine einfache Lösung für mich, oder muss ich
beide iowarrior mit einem Programm steuern.
Wäre aufwändig zu realisieren, da ich beide Programme schon
einzeln lauffähig habe und beide Programme inetrn oft die gleichen Variablen
benutzen ==> viel Aufwand für die Änderung.

Nebenbei: Ich hab gar noch nicht probiert, ob ich aus einem Programm
heraus read und write mit den beiden verschiedenen Handles auf
die beiden iowarrior machen kann ??!!
Ich hoffe das geht wenigstens??

bye
Johnny
User avatar
Christoph Jung
Posts: 673
Joined: Sun Oct 08, 2006 3:43 pm
Location: Germany / Berlin
Contact:

Post by Christoph Jung »

Eine schlechte nachricht: Wenn man einmal mit einem Programm IowKitOpenDevice() aufgerufen hat, dann werden alle angeschlossenen IOWarrior für andere Anwendungen blockiert. Habs nochmal genau nachgeschlagen.
Ich hab gar noch nicht probiert, ob ich aus einem Programm
heraus read und write mit den beiden verschiedenen Handles auf
die beiden iowarrior machen kann ??!!
Ich hoffe das geht wenigstens??
Man kann allerdings in einem Programm mehrere IOWarrior (16 insgesamt) steuern.

Ich weiß jetzt nich wie das Programm direkt ausschaut, aber ich nehme mal an, dass es eine Dialogfeld-Anwedung oder ähnliches ist?

Dann würde man das sehr einfach umstricken können. Mann muss dazu nur eine Auswahlmöglichkeit für das jeweilige handle einbauen und das Handle dann an die Write / Read-Funktion senden. Ich würde ein Drop-Down-Menü empfehlen.

Wenn man das im Zusammenhang mit

Code: Select all

for (int i = 0; i < numIOW; i++)
		{
		        allHandles[i] = IowKitGetDeviceHandle(i + 1);
			IowKitGetSerialNumber(allHandles[i], sn);
			//MessageBox( NULL, "found", MB_OK);
		}
verwendet, kann man auf die Handles mit dem Array-index () auf das jeweilige Handle zugreifen und damit arbeiten.
Software developer
Johnny
Posts: 10
Joined: Wed Oct 03, 2007 11:26 am

Post by Johnny »

Christoph Jung wrote:Eine schlechte nachricht: Wenn man einmal mit einem Programm IowKitOpenDevice() aufgerufen hat, dann werden alle angeschlossenen IOWarrior für andere Anwendungen blockiert. Habs nochmal genau nachgeschlagen.
... schade ...
wird sich das in zukünftigen Versionen mal ändern??
Man hört ja immer wieder von einer Version 2.0 ??
Ich hab noch mehr Rollos zum Steuern und Löte gerade
eine Schaltung mit einem iow56 zusammen :-)
Christoph Jung wrote:
Ich hab gar noch nicht probiert, ob ich aus einem Programm
heraus read und write mit den beiden verschiedenen Handles auf
die beiden iowarrior machen kann ??!!
Ich hoffe das geht wenigstens??
Man kann allerdings in einem Programm mehrere IOWarrior (16 insgesamt) steuern.

Ich weiß jetzt nich wie das Programm direkt ausschaut, aber ich nehme mal an, dass es eine Dialogfeld-Anwedung oder ähnliches ist?
Ganz einfach: Die Hälfte der Ports am iow (8 am iow24 und 16 am iow40)
sind Eingänge die über Optokoppler die Up/Down-Tasten der Rollos lesen (24V-Technik).
Die andere Hälfte steuert über Optokoppler und ULN2803 Koppelrelais an,
(auch 24V - Technik) die dann den Rollo-Motor steuern.

Das Programm pollt die Tasten und steuert die Koppelrelais.
Langer Tastendruck -> Rollo fährt solange Taste gedrückt.
Kurzer Tastendruck -> Rollo fährt automatisch bis Endeposition
Dann gibts da noch eine Zeitsteuereung (abends runter, morgens hoch)
und irgendwann eine Verbindung zu einer Wetterstation ...
Christoph Jung wrote: Dann würde man das sehr einfach umstricken können. Mann muss dazu nur eine Auswahlmöglichkeit für das jeweilige handle einbauen und das Handle dann an die Write / Read-Funktion senden. Ich würde ein Drop-Down-Menü empfehlen.

Wenn man das im Zusammenhang mit

Code: Select all

for (int i = 0; i < numIOW; i++)
		{
		        allHandles[i] = IowKitGetDeviceHandle(i + 1);
			IowKitGetSerialNumber(allHandles[i], sn);
			//MessageBox( NULL, "found", MB_OK);
		}
verwendet, kann man auf die Handles mit dem Array-index () auf das jeweilige Handle zugreifen und damit arbeiten.


Grundsätzlich ja, nur:
Das zweite Programm ist aus einer Kopie des ersten entstanden, d.h.
die verwendeten Variablen sind gleich und dann gibts da noch ein paar
Anpassungen (der erste iow24 hatte nur 16 Ports, für den iow40
hab ich das alles so erweitert dass ich mit noch einer Kopie den
iow56 sofort in Betrieb nehmen könnte...)
In den Funktionen kein Problem,
aber die Variablen im Hauptprogramm und die globalen Variablen müssen
umbenannt werden ...
Keine unlösbare Aufgabe, aber wenn das mit den zwei Programmen
bzw. später drei Programmen funktionieren würde ...


Andere Frage: was ist wenn ich das alles mit den low-level Funktionen
aus dem Beispiel minimum_read0 / minimum_write0 ...
realisiert hätte also mit
open( "/dev/usb/iowarrior0", O_RDWR)
result=select(fd+1,&rfds,NULL,NULL,&tv);
result = read(fd,in_buffer,info.packet_size);
usw. ????

Dann sollte das doch ohne Probleme in mehreren Programmen relaisierbar sein ??

bye
Johnny
User avatar
Christoph Jung
Posts: 673
Joined: Sun Oct 08, 2006 3:43 pm
Location: Germany / Berlin
Contact:

Post by Christoph Jung »

Ja eine neue Veriosn des iowKit iet in arbeit. Leider ist der dafür zuständige Programmierer erkrankt und wir haben scho so genug zu tun. Es wird als leider noch ein weilchen dauern, bis wir neues vom 2.0 API berichten können.

Die "minimum-Funktionen" sagen mir leider nichts. Ist warschinlich ein Extra für Linux. Aber wenn man mit dem Low-Level, sprich den reinen Hid-Funktionen arbeitet, dann soltle es möglich sein. Eine Warnung vorab: Das ist erheblich umfangreicher als die Funktionen des IowKits.
Software developer
Johnny
Posts: 10
Joined: Wed Oct 03, 2007 11:26 am

Post by Johnny »

Christoph Jung wrote:Ja eine neue Veriosn des iowKit iet in arbeit. Leider ist der dafür zuständige Programmierer erkrankt und wir haben scho so genug zu tun. Es wird als leider noch ein weilchen dauern, bis wir neues vom 2.0 API berichten können.

Die "minimum-Funktionen" sagen mir leider nichts. Ist warschinlich ein Extra für Linux. Aber wenn man mit dem Low-Level, sprich den reinen Hid-Funktionen arbeitet, dann soltle es möglich sein. Eine Warnung vorab: Das ist erheblich umfangreicher als die Funktionen des IowKits.
Sorry hab ich mich wohl falsch ausgedrückt:

minimum_read0.c und minimum_write0.c sind Beispielprogramme
aus dem Linux-SDK ohne API-Aufrufe.
Hab mir gleich gedacht, dass das komplizierter ist als die API zu verwenden... :-)
Johnny
Posts: 10
Joined: Wed Oct 03, 2007 11:26 am

Post by Johnny »

Neuigkeiten: Jetzt gehts doch!

Alledings musste ich dazu die libiowkit.so ändern.

Ich hab IowKitOpenDevice und IowKitCloseDevice aus iowkit.c
"geringfügig" angepasst :-)

Genauer:
In IowKitOpenDevice gibt die Funktion nicht einfach den Handle zurück:

> return IowKitGetDeviceHandle(1);

sondern gibt den ersten verfügbaren Handle zurück:
< // look for first unused handle and return it:
< for(i = 0; i < IOWKIT_MAX_DEVICES*2; i++)
< {
< //debug: printf("OpenDevice-Return-Handle: %x\n", IowKitGetDeviceHandle(i+1));
< if (IowKitGetDeviceHandle(i+1) != NULL) return IowKitGetDeviceHandle(i+1);
<
< }
< return NULL;

Und in IowKitCloseDevice wird nicht einfach alles gelöscht und geschlossen:

> IowiClear();

sondern nur die Filedescriptoren des übergebenen Handles geschlossen:

< int fdpipe1, fdpipe2;
< IowDevice_t *dev;
<
< dev = IowiGetDeviceByHandle(devHandle);
<
< fdpipe1 = dev->fd[0];
< fdpipe2 = dev->fd[1];
<
< // don't delete all, just close found fd:
< // IowiClear();
< close(fdpipe1);
< close(fdpipe2);
<
< // destroy data for iowarrior
< dev->dev_num[0] = 0;
< dev->dev_num[1] = 0;
<


Mit den Änderungen kann ich nun meine beiden Programme laufen lassen wobei
jedes Programm auf einen anderen iowarrior zugreift.


Meine Programm sind nahezu gleich geblieben, ich habe nur in der Schleife in der alle
iowarrior geöffnet werden die nicht benutzten Handles mit IowKitCloseDevice geschlossen:

// Get all IOW handles
for (i = 0; i < numIows; i++)
{
// Get device handle and init object
iows = IowKitGetDeviceHandle(i + 1);
// Get serial number
IowKitGetSerialNumber(iows, sn);
pid = IowKitGetProductId(iows);
for (j = 0; j < 9; j++)
snt[j] = sn[j];
printf("%d PID %x, S/N \"%s\"\n", i + 1, (unsigned int) pid, snt);

IowKitSetWriteTimeout(iows, 1000);
// check if one of iow has serial no "000011B1" and set iow40index
// usbrollo needs this sn, cause its a iowarrior40
if (strncmp(snt, "000011B1", 8) == 0)
iow40index = i;
else
{

// if its not our iow40, close handle
IowKitCloseDevice(iows);
printf("iow %d (ser no. %s ) will not be used, close handle\n",i + 1, snt);

}

}





Achtung! Die Änderung funktioniert - bis jetzt und nur bei mir!
Ich hatte nich keine Zeit, das ausführlich zu testen!
Und: Das alles ist nicht ganz sauber programmiert!
Das Problem: Angenommen man hat 3 iowarrior (ID: 0,1 und 2) und
verwendet in einem Programm den zweiten (ID: 1),
dann werden die Filedescriptoren der beiden anderen iowarrior
geschlossen, aber die Anzhal der iowarrior (IowKitGetNumDevs();) wird nicht
geändert. Man muß im Programm wissen , dass nur noch ein iowarrior (ID: 1)
vorhanden ist! Das zweite Programm findet beim open nur noch zwei iowarrior
(der Versuch den dritten iowarrior zu öffnen wird mit einer Fehlermeldung
abgewiesen).
Die Anzahl der iowarrior habe ich absichtlich nicht geändert, da es sonst evtl. Probleme
mit der Zählweise und dem index gibt?!

Sauber wäre es gewesen, wenn durch den Close auch noch die Liste der iowarrior
"richtig" sortiert werden würde. Im obigen Beispiel also entfällt Index 0 und Index 2 somit wird aus ID:1 -> ID:0. Und IowKitOpenDevice sollte das auch berücksichtigen.
Dann sollte auch ein weiteres IowKitOpenDevice im Programm
funktionieren??

bye
Johnny
Post Reply