serial send backup

This commit is contained in:
marios8543 2025-04-27 20:02:00 +03:00
parent 5306c671c6
commit e58eda3523

View File

@ -1,9 +1,10 @@
from pigpio import pi, error from pigpio import pi, error, OUTPUT
from asyncio import Queue, get_event_loop, sleep, CancelledError, create_task from asyncio import Queue, get_event_loop, sleep, CancelledError, create_task
from concurrent.futures import ThreadPoolExecutor from concurrent.futures import ThreadPoolExecutor
from os import getenv from os import getenv
RX_PIN = 27 RX_PIN = 27
TX_PIN = 17
BAUD_RATE = 4800 BAUD_RATE = 4800
DEBUG = False# getenv("TL_DEBUG", "false") == "true" DEBUG = False# getenv("TL_DEBUG", "false") == "true"
@ -54,6 +55,7 @@ class TunerListState:
class TunerList: class TunerList:
def __init__(self): def __init__(self):
self.pi = pi() self.pi = pi()
self.pi.set_mode(TX_PIN, OUTPUT)
while True: while True:
try: try:
self.pi.bb_serial_read_open(RX_PIN, BAUD_RATE, 8) self.pi.bb_serial_read_open(RX_PIN, BAUD_RATE, 8)
@ -67,29 +69,18 @@ class TunerList:
self.text = "" self.text = ""
self.preset = None self.preset = None
async def run(self): def _process_line(self, line):
buffer = b''
try: try:
while True: if line[0] == 0x0F and line[1] == 0xFF:
(count, data) = self.pi.bb_serial_read(RX_PIN) pass
if count > 0: elif line[0] == 0x0F:
buffer += data self.text = line[8:int(line[0]) + 1].decode("ascii").replace("\n", "")
while b'\r\n' in buffer: if (line[6] & 0xF0) == 0x70:
line, buffer = buffer.split(b'\r\n', 1) self.preset = line[6] & 0x0F
if not line == self.last_buffer: else:
self.last_buffer = line self.preset = None
print(line) elif line[0] == 0x0C:
self.process_line(line) self.text = line[5:int(line[0]) + 1].decode("ascii").replace("\n", "")
await sleep(0)
except CancelledError:
self.pi.bb_serial_read_close(RX_PIN)
self.pi.stop()
return
def process_line(self, line):
try:
if line[0] == 0x0F or line[0] == 0x0C:
self.text = line[(8 if line[0] == 0x0F else 5):].decode("ascii")
if (line[3] != 0x20): if (line[3] != 0x20):
self.preset = line[3] & 0x0F self.preset = line[3] & 0x0F
else: else:
@ -105,11 +96,36 @@ class TunerList:
print("[",self.text,"]", f" [P {self.preset}]") print("[",self.text,"]", f" [P {self.preset}]")
self.queue.put_nowait(TunerListState(self.text, self.preset)) self.queue.put_nowait(TunerListState(self.text, self.preset))
async def send_button(self, btn):
self.pi.wave_clear()
self.pi.wave_add_serial(TX_PIN, BAUD_RATE, bytearray(BUTTONS[btn]))
wave = self.pi.wave_create()
self.pi.wave_send_once(wave)
while self.pi.wave_tx_busy():
await sleep(0)
self.pi.wave_delete(wave)
async def run(self):
buffer = b''
try:
while True:
(count, data) = self.pi.bb_serial_read(RX_PIN)
if count > 0:
buffer += data
while b'\r\n' in buffer:
line, buffer = buffer.split(b'\r\n', 1)
if not line == self.last_buffer:
self.last_buffer = line
for c in line:
print(hex(c), " ", end="")
print()
self._process_line(line)
await sleep(0)
except CancelledError:
self.pi.bb_serial_read_close(RX_PIN)
self.pi.stop()
return
async def yield_new_state(self): async def yield_new_state(self):
while True: while True:
yield await self.queue.get() yield await self.queue.get()
async def send_button(self, btn):
with ThreadPoolExecutor() as executor:
loop = get_event_loop()
await loop.run_in_executor(executor, self.serial.write, bytearray(BUTTONS[btn]))