diff --git a/src/main/python/keyboard.py b/src/main/python/keyboard.py index 863344a..aaf948d 100644 --- a/src/main/python/keyboard.py +++ b/src/main/python/keyboard.py @@ -31,13 +31,13 @@ class Keyboard: self.rows = self.cols = self.layers = 0 self.keys = [] - def reload(self): + def reload(self, sideload_json=None): """ Load information about the keyboard: number of layers, physical key layout """ self.rowcol = OrderedDict() self.layout = dict() - self.reload_layout() + self.reload_layout(sideload_json) self.reload_layers() self.reload_keymap() @@ -46,25 +46,28 @@ class Keyboard: self.layers = self.usb_send(self.dev, struct.pack("B", CMD_VIA_GET_LAYER_COUNT))[1] - def reload_layout(self): + def reload_layout(self, sideload_json=None): """ Requests layout data from the current device """ - # get the size - data = self.usb_send(self.dev, struct.pack("BB", CMD_VIA_VIAL_PREFIX, CMD_VIAL_GET_SIZE)) - sz = struct.unpack(" 0: - data = self.usb_send(self.dev, struct.pack(" 0: + data = self.usb_send(self.dev, struct.pack("= 0: - keyboard = Keyboard(open_device(self.devices[idx])) - keyboard.reload() - self.keyboard_container.rebuild(keyboard) + dev = self.devices[idx] + self.keyboard = Keyboard(open_device(dev)) + if dev["vendor_id"] == self.sideload_vid and dev["product_id"] == self.sideload_pid: + self.keyboard.reload(self.sideload_json) + else: + self.keyboard.reload() + self.keyboard_container.rebuild(self.keyboard) def on_number_layers_changed(self): recreate_layer_keycodes(self.keyboard_container.keyboard.layers) @@ -109,3 +126,16 @@ class MainWindow(QMainWindow): def on_keycode_changed(self, code): self.keyboard_container.set_key(code) + + def on_sideload_json(self): + dialog = QFileDialog() + dialog.setDefaultSuffix("json") + dialog.setAcceptMode(QFileDialog.AcceptOpen) + dialog.setNameFilters(["VIA layout JSON (*.json)"]) + if dialog.exec_() == QDialog.Accepted: + with open(dialog.selectedFiles()[0], "rb") as inf: + data = inf.read() + self.sideload_json = json.loads(data) + self.sideload_vid = int(self.sideload_json["vendorId"], 16) + self.sideload_pid = int(self.sideload_json["productId"], 16) + self.on_click_refresh() diff --git a/src/main/python/util.py b/src/main/python/util.py index 7b2cd51..ce7bc46 100644 --- a/src/main/python/util.py +++ b/src/main/python/util.py @@ -33,11 +33,13 @@ def is_rawhid(dev): return dev["interface_number"] == 1 -def find_vial_keyboards(): +def find_vial_keyboards(sideload_vid, sideload_pid): filtered = [] for dev in hid.enumerate(): if VIAL_SERIAL_NUMBER_MAGIC in dev["serial_number"] and is_rawhid(dev): filtered.append(dev) + elif dev["vendor_id"] == sideload_vid and dev["product_id"] == sideload_pid and is_rawhid(dev): + filtered.append(dev) return filtered