Seite 1 von 1

Swig-Objekt / comedi

Verfasst: Montag 6. Januar 2014, 18:40
von Hase
Hallo,
ich wollte mal wieder was Löten und habe mir ein Velleman K8055N USB-IO-Board gekauft. Funktioniert auch, im Linux-Kernel gibt es für das Board schon fertig einen comedi-Driver. Per Swig gibt es dafür auch eine Python-Schnittstelle (comedi.py). Leider ist das Ding völlig undokumentiert, was die ganze Sache ziemlich mühsam macht. Zudem wird nur ein Bruchteil der comedi-Funktionen von meinem Board unterstützt. Aus der Datei comedi.c werde ich nicht so richtig schlau, dafür reichen meine C-Kenntnisse nicht aus.
Die Digitalen und Analoge IO-Ports kann ich mit Python ansprechen, es werden Python-Listen oder -Integers zurückgegeben, funktioniert. Bei manchen Funktionen werden allerdings nur Pointer auf C-Objekte zurückgegeben. Das sieht dann so aus:

Code: Alles auswählen

import comedi as c

def main():
    dev0 = c.comedi_open("/dev/comedi0")
    print "Maxrange analog input: ", c.comedi_get_range(dev0,0,0,0)
    c.comedi_close(dev0)

if __name__ == '__main__':
    main()
Ausgabe:
Maxrange analog input: <comedi.comedi_range; proxy of <Swig Object of type 'comedi_range *' at 0x7f98f525f480> >
Das C-Objekt hat folgende Struktur:

Code: Alles auswählen

comedi_range * comedi_get_range(	comedi_t * device,
 	unsigned int subdevice,
 	unsigned int channel,
 	unsigned int range);
Gibt es irgend eine einfache Möglickeit, mit Python auf diese Objekt zuzugreifen? Eigentlich will ich nur "range" abfragen.

Vielen Dank.

Re: Swig-Objekt / comedi

Verfasst: Montag 6. Januar 2014, 18:49
von Sirius3
Vielleicht hilft Dir ja das weiter: https://pypi.python.org/pypi/pycomedi/.

Re: Swig-Objekt / comedi

Verfasst: Montag 6. Januar 2014, 19:19
von BlackJack
@Hase: Du hast da nicht die Struktur von dem Rückgabewert gezeigt sondern die Signatur von dem Funktionsaufruf der diese Struktur zurück gibt. Die Dokumentation der C-Struktur sagt, dass es die Attribute `min`, `max`, und `unit` gibt, wobei die ersten beiden Gleitkommazahlen sind und das letzte eine Zahl wo es Konstanten für gibt, welche die physikalische Einheit (Volt, …) verrät: http://www.comedi.org/doc/datatypesstru ... medi-range

Die Attributnamen hätte man vielleicht auch auf Python-Seite mit `dir()` herausgefunden.

Re: Swig-Objekt / comedi

Verfasst: Montag 6. Januar 2014, 19:49
von Hase
Vielen Dank für die Rückmeldung.

Stimmt, ja, da habe ich die falsche C-Struktur angegeben.

Aber die Frage bleibt ja die gleiche.
Gibt es eine Möglichkeit, auf den Rückgabewert von

Code: Alles auswählen

c.comedi_get_range(dev0,0,0,0)
zuzugreifen?

Die Attributnamen hätte man vielleicht auch auf Python-Seite mit `dir()` herausgefunden.
Ja, so ist es, nur sind das gefühlt so um die 200 Stück. Von meinem Board unterstützt werden aber tatsächlich nur vielleicht 10.

Re: Swig-Objekt / comedi

Verfasst: Montag 6. Januar 2014, 19:54
von BlackJack
@Hase: Ich denke die Frage ist damit beantwortet, denn ich denke mal es werden genau die drei Attribute sein die in der C-Struktur stecken die von dem Objekt gekapselt werden. Und ich denke ebenfalls ein `dir()` wird hauptsächlich *die* ausspucken und nicht noch hunderte von anderen.

Re: Swig-Objekt / comedi

Verfasst: Montag 6. Januar 2014, 19:58
von Hase
Ja, danke, jetzt hab ich es verstanden.
Ich war auf dem falschen weg.