You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
64 lines
1.6 KiB
64 lines
1.6 KiB
import serial
|
|
import sys
|
|
|
|
class Const:
|
|
S5 = 35
|
|
S2 = 36
|
|
S1 = 32
|
|
S3 = 39
|
|
S4 = 34
|
|
|
|
B1 = 26
|
|
|
|
class Pin:
|
|
def __init__(self, id, initValue):
|
|
self.id = id
|
|
self.value = initValue
|
|
|
|
def updateValue(self, value):
|
|
if (self.value > value):
|
|
diff = self.value - value
|
|
self.value = value
|
|
return (self, -1 * diff)
|
|
elif (self.value < value):
|
|
diff = value - self.value
|
|
self.value = value
|
|
return (self, diff)
|
|
else:
|
|
return (self, 0)
|
|
|
|
class SerialListener:
|
|
ser: serial.Serial = None
|
|
pins = {}
|
|
def __init__(self, device = '/dev/serial0', rate = 9600):
|
|
self.ser = serial.Serial(device, rate)
|
|
|
|
def reInit(self):
|
|
if self.ser:
|
|
self.ser.close()
|
|
self.ser.open()
|
|
|
|
def listen(self):
|
|
while True:
|
|
try:
|
|
if self.ser.in_waiting > 0:
|
|
data = self.ser.readline().decode().split("\n")[0].split("-")
|
|
pin = int(data[0])
|
|
value = int(data[1])
|
|
if pin not in self.pins:
|
|
self.pins[pin] = Pin(pin, value)
|
|
else:
|
|
yield self.pins[pin].updateValue(value)
|
|
except KeyboardInterrupt:
|
|
print("exit from main loop")
|
|
sys.exit(0)
|
|
except:
|
|
self.reInit()
|
|
|
|
if __name__ == "__main__":
|
|
listener = SerialListener()
|
|
for pin in listener.listen():
|
|
if (pin[1] == 0):
|
|
continue
|
|
|
|
print(pin[0].id, pin[1])
|
|
|