keyboard: initial layout save/restore support

main
Ilya Zhuravlev 2020-10-17 05:43:17 -04:00
parent ea033c8ff5
commit 50b1c40d13
2 changed files with 50 additions and 1 deletions

View File

@ -28,7 +28,7 @@ class Keyboard:
# n.b. using OrderedDict here to make order of layout requests consistent for tests # n.b. using OrderedDict here to make order of layout requests consistent for tests
self.rowcol = OrderedDict() self.rowcol = OrderedDict()
self.layout = dict() self.layout = dict()
self.layers = 0 self.rows = self.cols = self.layers = 0
self.keys = [] self.keys = []
def reload(self): def reload(self):
@ -65,6 +65,10 @@ class Keyboard:
sz -= MSG_LEN sz -= MSG_LEN
payload = json.loads(lzma.decompress(payload)) payload = json.loads(lzma.decompress(payload))
self.rows = payload["matrix"]["rows"]
self.cols = payload["matrix"]["cols"]
serial = KleSerial() serial = KleSerial()
kb = serial.deserialize(payload["layouts"]["keymap"]) kb = serial.deserialize(payload["layouts"]["keymap"])
@ -93,3 +97,32 @@ class Keyboard:
if self.layout[key] != code: if self.layout[key] != code:
self.usb_send(self.dev, struct.pack(">BBBBH", CMD_VIA_SET_KEYCODE, layer, row, col, code)) self.usb_send(self.dev, struct.pack(">BBBBH", CMD_VIA_SET_KEYCODE, layer, row, col, code))
self.layout[key] = code self.layout[key] = code
def save_layout(self):
""" Serializes current layout to a binary """
# TODO: increase version before release
data = {"version": "0"}
layout = []
for l in range(self.layers):
layer = []
layout.append(layer)
for r in range(self.rows):
row = []
layer.append(row)
for c in range(self.cols):
val = self.layout.get((l, r, c), -1)
row.append(val)
data["layout"] = layout
# TODO: this should also save/restore macros, when implemented
return json.dumps(data).encode("utf-8")
def restore_layout(self, data):
""" Restores saved layout """
data = json.loads(data.decode("utf-8"))
for l, layer in enumerate(data["layout"]):
for r, row in enumerate(layer):
for c, col in enumerate(row):
if (l, r, c) in self.layout:
self.set_key(l, r, c, col)

View File

@ -123,3 +123,19 @@ class TestKeyboard(unittest.TestCase):
self.assertEqual(kb.layout[(1, 1, 0)], 9) self.assertEqual(kb.layout[(1, 1, 0)], 9)
dev.finish() dev.finish()
def test_layout_save_restore(self):
""" Tests that layout saving and restore works """
kb, dev = self.prepare_keyboard(LAYOUT_2x2, [[[1, 2], [3, 4]], [[5, 6], [7, 8]]])
dev.expect("05010100000A", "")
kb.set_key(1, 1, 0, 10)
self.assertEqual(kb.layout[(1, 1, 0)], 10)
data = kb.save_layout()
dev.finish()
kb, dev = self.prepare_keyboard(LAYOUT_2x2, [[[1, 2], [3, 4]], [[5, 6], [7, 8]]])
dev.expect("05010100000A", "")
kb.restore_layout(data)
self.assertEqual(kb.layout[(1, 1, 0)], 10)
dev.finish()