Needs docs, but is basically complete. #3

This commit is contained in:
Kyle Brown 2018-10-19 19:01:39 -07:00
parent 8d3e4e0a63
commit 744d7c1f5d
2 changed files with 31 additions and 24 deletions

View File

@ -34,11 +34,11 @@ import kmk.internal_state # isort:skip
# Thanks for sticking around. Now let's do real work, starting below # Thanks for sticking around. Now let's do real work, starting below
import gc
import supervisor
import board import board
import busio import busio
import gc
import supervisor
from kmk.consts import LeaderMode, UnicodeModes from kmk.consts import LeaderMode, UnicodeModes
from kmk.hid import USB_HID from kmk.hid import USB_HID
from kmk.internal_state import InternalState from kmk.internal_state import InternalState
@ -62,11 +62,11 @@ class Firmware:
hid_helper = USB_HID hid_helper = USB_HID
split_type = None
split_offsets = () split_offsets = ()
split_flip = True split_flip = False
split_master_left = True split_master_left = True
uart = None uart = None
uart_flip = False
def __init__(self): def __init__(self):
self._state = InternalState(self) self._state = InternalState(self)
@ -85,10 +85,6 @@ class Firmware:
self._send_hid() self._send_hid()
def _handle_update(self, update): def _handle_update(self, update):
# if self.split_type is not None and not self.split_master_left:
# update[1] += self.split_offsets[update[1]]
print(update[1])
if update is not None: if update is not None:
self._state.matrix_changed( self._state.matrix_changed(
update[0], update[0],
@ -113,33 +109,41 @@ class Firmware:
print('New State: {}'.format(self._state._to_dict())) print('New State: {}'.format(self._state._to_dict()))
def _send_to_master(self, update): def _send_to_master(self, update):
if self.split_type == "UART": if self.uart is not None:
if self.uart is None:
self.uart = busio.UART(board.TX, board.RX, timeout=1)
if self.split_master_left:
update[1] += self.split_offsets[update[0]]
self.uart.write(update) self.uart.write(update)
def _receive_from_slave(self): def _receive_from_slave(self):
if self.split_type == "UART": if self.uart is not None and self.uart.in_waiting > 0:
if self.uart is None:
self.uart = busio.UART(board.TX, board.RX, timeout=1)
if self.uart.in_waiting > 0:
update = bytearray(self.uart.read()) update = bytearray(self.uart.read())
if self.split_master_left:
update[1] += self.split_offsets[update[0]]
return update return update
return None return None
def _master_half(self):
return supervisor.runtime.serial_connected
def init_uart(self, tx=None, rx=None, timeout=1):
if self._master_half():
# If running with one wire, only receive on master
if rx is None or self.uart_flip:
return busio.UART(tx=rx, rx=None, timeout=timeout)
else:
return busio.UART(tx=tx, rx=rx, timeout=timeout)
else:
return busio.UART(tx=tx, rx=rx, timeout=timeout)
def go(self): def go(self):
assert self.keymap, 'must define a keymap with at least one row' assert self.keymap, 'must define a keymap with at least one row'
assert self.row_pins, 'no GPIO pins defined for matrix rows' assert self.row_pins, 'no GPIO pins defined for matrix rows'
assert self.col_pins, 'no GPIO pins defined for matrix columns' assert self.col_pins, 'no GPIO pins defined for matrix columns'
assert self.diode_orientation is not None, 'diode orientation must be defined' assert self.diode_orientation is not None, 'diode orientation must be defined'
if self.split_flip and not supervisor.runtime.serial_connected: if self.split_flip and not self._master_half():
self.col_pins = list(reversed(self.col_pins)) self.col_pins = list(reversed(self.col_pins))
self.matrix = MatrixScanner( self.matrix = MatrixScanner(
@ -156,7 +160,7 @@ class Firmware:
print("Firin' lazers. Keyboard is booted.") print("Firin' lazers. Keyboard is booted.")
while True: while True:
if self.split_type is not None and supervisor.runtime.serial_connected: if self.split_type is not None and self._master_half:
update = self._receive_from_slave() update = self._receive_from_slave()
if update is not None: if update is not None:
print(str(update)) print(str(update))
@ -165,8 +169,7 @@ class Firmware:
for update in self.matrix.scan_for_changes(): for update in self.matrix.scan_for_changes():
if update is not None: if update is not None:
# Abstract this later. Bluetooth will fail here # Abstract this later. Bluetooth will fail here
if supervisor.runtime.serial_connected: if self._master_half():
print(str(update))
self._handle_update(update) self._handle_update(update)
else: else:

View File

@ -1,3 +1,6 @@
import board
import busio
from kmk.consts import DiodeOrientation, UnicodeModes from kmk.consts import DiodeOrientation, UnicodeModes
from kmk.keycodes import KC from kmk.keycodes import KC
from kmk.keycodes import generate_leader_dictionary_seq as glds from kmk.keycodes import generate_leader_dictionary_seq as glds
@ -22,6 +25,7 @@ keyboard.debug_enabled = True
keyboard.split_type = "UART" keyboard.split_type = "UART"
keyboard.split_flip = True keyboard.split_flip = True
keyboard.split_offsets = [6, 6, 6, 6] keyboard.split_offsets = [6, 6, 6, 6]
keyboard.uart = keyboard.init_uart(tx=board.TX, rx=board.RX)
emoticons = compile_unicode_string_sequences({ emoticons = compile_unicode_string_sequences({
# Emoticons, but fancier # Emoticons, but fancier