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.
63 lines
1.7 KiB
63 lines
1.7 KiB
import serial
|
|
import sys
|
|
import argparse
|
|
|
|
class Const:
|
|
_ = {
|
|
35:"Крутилка 5",
|
|
36:"Крутилка 2",
|
|
32:"Крутилка 1",
|
|
39:"Крутилка 3",
|
|
34:"Крутилка 4",
|
|
26:"Кнопки"
|
|
}
|
|
|
|
class Pin:
|
|
def __init__(self, id, initValue):
|
|
self.id = id
|
|
self.value = initValue
|
|
self.name = Const._[id] if id in Const._ else None
|
|
|
|
def updateValue(self, value):
|
|
if self.value == value:
|
|
return (self, 0)
|
|
else:
|
|
self.value = value
|
|
return (self, value)
|
|
|
|
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
|
|
|
|
if pin[0].name != None:
|
|
print(pin[0].id, pin[1])
|
|
|