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.
 
 
 
 
 
 

85 lines
2.3 KiB

import serial
import sys
import argparse
#100x - button
#10x - encoder
#1x - variable resitor
class Const:
_ = {
35:"Крутилка 5",
36:"Крутилка 2",
32:"Крутилка 1",
39:"Крутилка 3",
34:"Крутилка 4",
26:"Кнопки"
}
FULL = 100
class MOVEMENT:
RIGHT = 1
NONE = 0
LEFT = -1
class Pin:
def __init__(self, id, initValue):
self.id = id
self.value = initValue
self.name = Const._[id] if id in Const._ else None
self.movement = MOVEMENT.NONE
def updateValue(self, value): #(Pin.class, value, movement)
if self.value == value:
self.value = 0
self.movement = MOVEMENT.NONE
return (self, self.value, MOVEMENT.NONE)
else:
self.movement = MOVEMENT.LEFT if value < self.value else MOVEMENT.RIGHT
self.value = value
return (self, value, self.movement)
def __call__(self):
return (self, self.value, self.movement)
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:
try:
self.ser.close()
self.ser.open()
except:
pass
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 ValueError:
continue
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].name, pin[1])