serial send backup
This commit is contained in:
parent
5306c671c6
commit
e58eda3523
@ -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]))
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user