diff --git a/board/fischertechnik/TXT/rootfs/etc/udev/rules.d/99-ftduino.rules b/board/fischertechnik/TXT/rootfs/etc/udev/rules.d/99-ftduino.rules new file mode 100644 index 0000000000..9613efe172 --- /dev/null +++ b/board/fischertechnik/TXT/rootfs/etc/udev/rules.d/99-ftduino.rules @@ -0,0 +1,2 @@ +ATTRS{idVendor}=="1c40" ATTRS{idProduct}=="0537", ENV{ID_MM_DEVICE_IGNORE}="1" +ATTRS{idVendor}=="1c40" ATTRS{idProduct}=="0538", ENV{ID_MM_DEVICE_IGNORE}="1" diff --git a/board/fischertechnik/TXT/rootfs/opt/ftc/ftduino_direct.py b/board/fischertechnik/TXT/rootfs/opt/ftc/ftduino_direct.py new file mode 100644 index 0000000000..7107b32774 --- /dev/null +++ b/board/fischertechnik/TXT/rootfs/opt/ftc/ftduino_direct.py @@ -0,0 +1,109 @@ +# v1.0.4 (c) 2017 Peter Habermehl +# +# Kommandos fuer ftduino.comm : +# +# void led_set <0|1> +# +# string ftduino_direct_get_version +# char[16] ftduino_id_set +# char[16] ftduino_id_get +# +# +# void input_set_mode +# uint16_t input_get +# +# void output_set mode: 0=open 1=switch to plus (normal operation) 2=switch to gnd +# void motor_set +# +# void ultrasonic_enable +# int16_t ultrasonic_get() +# +# void counter_set_mode +# uint16_t counter_get +# void counter_clear +# uint8_t counter_get_state +# +# Beispiel: +# myftd=ftduino_direct.ftduino() +# myftd.comm("motor M1 right 512") +# + + +import serial +import serial.tools.list_ports +import time + +FTDUINO_VIDPID="1c40:0538" + +__all__ = ["ftduino_scan", "ftduino_find_by_name", "ftduino"] + +def ftduino_scan(): + # scannt nach ftduinos und gibt eine Liste zurueck, die den device-pfad und die vom ftduino zurueckgemeldete ID beinhaltet + # [x][0] enthaelt den device-pfad, [x][1] die ID + # + devices = [] + try: + for dev in serial.tools.list_ports.grep("vid:pid="+FTDUINO_VIDPID): + o = serial.Serial(dev[0], 115200, timeout=.1) + time.sleep(0.25) + o.flushInput() + o.flushOutput() + o.write("ftduino_id_get\n".encode("utf-8")) + n=o.readline().decode("utf-8")[:-2] + o.close() + devices.append([dev[0], n]) + except: + pass + + return devices + +def ftduino_find_by_name(duino): + # sucht nach einem ftduino mit angegebenem Namen und gibt im Erfolgsfall den device-pfad zurueck + # der device-Pfad kann beim Erzeugen eines ftduino-Objekts angegeben werden, um gezielt einen + # bestimmten ftduino anzusprechen. + d=ftduino_scan() + try: + return next(c for c in ftduino_scan() if c[1] == duino)[0] + except: + return None + +class ftduino(object): + + def __init__(self, device=None): + self.ftduino=None + + # bei Angabe eines device-Pfades wird versucht, diesen ftduino zu oeffnen + # ansonsten wird der erste gefundene ftduino angesprochen + + try: + if device==None: + liste=ftduino_scan() + port=liste[0][0] + if liste!=None: + self.ftduino = serial.Serial(port, 115200, timeout=.1) + time.sleep(0.5) #give the connection a second to settle + else: + self.ftduino = serial.Serial(device, 115200, timeout=.1) + except: + pass + + def getDevice(self): + return self.ftduino + + def comm(self, command): + try: + command=command+"\n" + self.ftduino.flushInput() + self.ftduino.flushOutput() + self.ftduino.write(command.encode("utf-8")) + data = self.ftduino.readline() + if data: + return data.decode("utf-8")[:-2] + else: + return False + except: + return False + + def close(self): + self.ftduino.close() +