52 lines
1.7 KiB
Python
52 lines
1.7 KiB
Python
class UART:
|
|
def __init__(self, tx=None, rx=None, is_target=True, uart_interval=20):
|
|
self._debug_enabled = True
|
|
self._uart_connection = None
|
|
self._uart = None
|
|
self._uart_interval = uart_interval
|
|
self._is_target = is_target
|
|
|
|
@property
|
|
def in_waiting(self):
|
|
return self._uart.in_waiting
|
|
|
|
def read(self, n):
|
|
return self._uart.read(n)
|
|
|
|
def readinto(self, buf):
|
|
return self._uart.readinto(buf)
|
|
|
|
def powersave(enable: bool):
|
|
return
|
|
|
|
def write(self, buffer, update):
|
|
if self._uart is not None:
|
|
if not self._is_target or self.data_pin2:
|
|
update = self._serialize_update(update)
|
|
self._uart.write(self.uart_header)
|
|
self._uart.write(update)
|
|
self._uart.write(self._checksum(update))
|
|
|
|
def receive(self, keyboard):
|
|
if self._transport.in_waiting > 0 or self._uart_buffer:
|
|
if self._transport.in_waiting >= 60:
|
|
# This is a dirty hack to prevent crashes in unrealistic cases
|
|
# TODO See if this hack is needed with checksum, and if not, use
|
|
# that to fix it.
|
|
import microcontroller
|
|
|
|
microcontroller.reset()
|
|
|
|
while self._transport.in_waiting >= 4:
|
|
# Check the header
|
|
if self._transport.read(1) == self.uart_header:
|
|
update = self._transport.read(2)
|
|
|
|
# check the checksum
|
|
if self._checksum(update) == self._transport.read(1):
|
|
self._uart_buffer.append(self._deserialize_update(update))
|
|
if self._uart_buffer:
|
|
return self._uart_buffer.pop(0)
|
|
|
|
return None
|