Swig-Objekt / comedi

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Hase
User
Beiträge: 101
Registriert: Donnerstag 1. Oktober 2009, 15:17
Wohnort: Bremer Speckgürtel

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.
Sirius3
User
Beiträge: 17750
Registriert: Sonntag 21. Oktober 2012, 17:20

Vielleicht hilft Dir ja das weiter: https://pypi.python.org/pypi/pycomedi/.
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.
Hase
User
Beiträge: 101
Registriert: Donnerstag 1. Oktober 2009, 15:17
Wohnort: Bremer Speckgürtel

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.
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.
Hase
User
Beiträge: 101
Registriert: Donnerstag 1. Oktober 2009, 15:17
Wohnort: Bremer Speckgürtel

Ja, danke, jetzt hab ich es verstanden.
Ich war auf dem falschen weg.
Antworten