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
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])
|
|
|