corrently handle spi protocol switch with custom profiles

This commit is contained in:
dekunukem
2021-12-24 21:12:18 +00:00
parent c3d0b3217f
commit 215d3589ab
2 changed files with 72 additions and 62 deletions

View File

@@ -68,21 +68,21 @@ PROTOCOL_RAW_KEYBOARD = {'pid':125, 'display_name':"Raw data", 'is_custom':0}
PROTOCOL_RAW_MOUSE = {'pid':126, 'display_name':"Raw data", 'is_custom':0} PROTOCOL_RAW_MOUSE = {'pid':126, 'display_name':"Raw data", 'is_custom':0}
PROTOCOL_RAW_GAMEPAD = {'pid':127, 'display_name':"Raw data", 'is_custom':0} PROTOCOL_RAW_GAMEPAD = {'pid':127, 'display_name':"Raw data", 'is_custom':0}
BTN_SOUTH = 0x130 GP_BTN_SOUTH = 0x130
BTN_EAST = 0x131 GP_BTN_EAST = 0x131
BTN_C = 0x132 GP_BTN_C = 0x132
BTN_NORTH = 0x133 GP_BTN_NORTH = 0x133
BTN_WEST = 0x134 GP_BTN_WEST = 0x134
BTN_Z = 0x135 GP_BTN_Z = 0x135
BTN_TL = 0x136 GP_BTN_TL = 0x136
BTN_TR = 0x137 GP_BTN_TR = 0x137
BTN_TL2 = 0x138 GP_BTN_TL2 = 0x138
BTN_TR2 = 0x139 GP_BTN_TR2 = 0x139
BTN_SELECT = 0x13a GP_BTN_SELECT = 0x13a
BTN_START = 0x13b GP_BTN_START = 0x13b
BTN_MODE = 0x13c GP_BTN_MODE = 0x13c
BTN_THUMBL = 0x13d GP_BTN_THUMBL = 0x13d
BTN_THUMBR = 0x13e GP_BTN_THUMBR = 0x13e
IBMPC_GGP_BUTTON_1 = 1 IBMPC_GGP_BUTTON_1 = 1
IBMPC_GGP_BUTTON_2 = 2 IBMPC_GGP_BUTTON_2 = 2
@@ -104,12 +104,12 @@ custom_profile_1 = {
'pid':PROTOCOL_GENERIC_GAMEPORT_GAMEPAD['pid'], 'pid':PROTOCOL_GENERIC_GAMEPORT_GAMEPAD['pid'],
'mapping': 'mapping':
{ {
BTN_SOUTH: IBMPC_GGP_BUTTON_1, GP_BTN_SOUTH: IBMPC_GGP_BUTTON_1,
BTN_EAST: IBMPC_GGP_BUTTON_2, GP_BTN_EAST: IBMPC_GGP_BUTTON_2,
BTN_WEST: IBMPC_GGP_BUTTON_3, GP_BTN_WEST: IBMPC_GGP_BUTTON_3,
BTN_NORTH: IBMPC_GGP_BUTTON_4, GP_BTN_NORTH: IBMPC_GGP_BUTTON_4,
BTN_TL: IBMPC_GGP_BUTTON_1, GP_BTN_TL: IBMPC_GGP_BUTTON_1,
BTN_TR2: IBMPC_GGP_BUTTON_2, GP_BTN_TR2: IBMPC_GGP_BUTTON_2,
} }
} }
@@ -120,12 +120,12 @@ custom_profile_2 = {
'pid':PROTOCOL_GENERIC_GAMEPORT_GAMEPAD['pid'], 'pid':PROTOCOL_GENERIC_GAMEPORT_GAMEPAD['pid'],
'mapping': 'mapping':
{ {
BTN_SOUTH: IBMPC_GGP_BUTTON_1, GP_BTN_SOUTH: IBMPC_GGP_BUTTON_1,
BTN_EAST: IBMPC_GGP_BUTTON_1, GP_BTN_EAST: IBMPC_GGP_BUTTON_1,
BTN_WEST: IBMPC_GGP_BUTTON_1, GP_BTN_WEST: IBMPC_GGP_BUTTON_1,
BTN_NORTH: IBMPC_GGP_BUTTON_1, GP_BTN_NORTH: IBMPC_GGP_BUTTON_1,
BTN_TL: IBMPC_GGP_BUTTON_1, GP_BTN_TL: IBMPC_GGP_BUTTON_1,
BTN_TR2: IBMPC_GGP_BUTTON_1, GP_BTN_TR2: IBMPC_GGP_BUTTON_1,
} }
} }
@@ -169,17 +169,17 @@ def oled_print_centered(text, font, y, this_canvas):
start_x = 0 start_x = 0
this_canvas.text((start_x, y), text, font=font, fill="white") this_canvas.text((start_x, y), text, font=font, fill="white")
keyboard_protocol_options_ibmpc = [PROTOCOL_AT_PS2_KB, PROTOCOL_XT_KB, PROTOCOL_OFF] keyboard_protocol_options_ibmpc = [PROTOCOL_OFF, PROTOCOL_AT_PS2_KB, PROTOCOL_XT_KB]
mouse_protocol_options_ibmpc = [PROTOCOL_PS2_MOUSE, PROTOCOL_MICROSOFT_SERIAL_MOUSE, PROTOCOL_OFF] mouse_protocol_options_ibmpc = [PROTOCOL_OFF, PROTOCOL_PS2_MOUSE, PROTOCOL_MICROSOFT_SERIAL_MOUSE]
gamepad_protocol_options_ibmpc = [PROTOCOL_GENERIC_GAMEPORT_GAMEPAD, PROTOCOL_GAMEPORT_GRAVIS_GAMEPAD, PROTOCOL_GAMEPORT_MICROSOFT_SIDEWINDER, PROTOCOL_OFF] gamepad_protocol_options_ibmpc = [PROTOCOL_OFF, PROTOCOL_GENERIC_GAMEPORT_GAMEPAD, PROTOCOL_GAMEPORT_GRAVIS_GAMEPAD, PROTOCOL_GAMEPORT_MICROSOFT_SIDEWINDER]
keyboard_protocol_options_adb = [PROTOCOL_ADB_KB, PROTOCOL_OFF] keyboard_protocol_options_adb = [PROTOCOL_OFF, PROTOCOL_ADB_KB]
mouse_protocol_options_adb = [PROTOCOL_ADB_MOUSE, PROTOCOL_OFF] mouse_protocol_options_adb = [PROTOCOL_OFF, PROTOCOL_ADB_MOUSE]
gamepad_protocol_options_adb = [PROTOCOL_OFF] gamepad_protocol_options_adb = [PROTOCOL_OFF]
keyboard_protocol_options_raw = [PROTOCOL_RAW_KEYBOARD, PROTOCOL_OFF] keyboard_protocol_options_raw = [PROTOCOL_OFF, PROTOCOL_RAW_KEYBOARD]
mouse_protocol_options_raw = [PROTOCOL_RAW_MOUSE, PROTOCOL_OFF] mouse_protocol_options_raw = [PROTOCOL_OFF, PROTOCOL_RAW_MOUSE]
gamepad_protocol_options_raw = [PROTOCOL_RAW_GAMEPAD, PROTOCOL_OFF] gamepad_protocol_options_raw = [PROTOCOL_OFF, PROTOCOL_RAW_GAMEPAD]
mouse_sensitivity_list = [1, 1.25, 1.5, 1.75, 0.25, 0.5, 0.75] mouse_sensitivity_list = [1, 1.25, 1.5, 1.75, 0.25, 0.5, 0.75]
@@ -295,16 +295,22 @@ class usb4vc_menu(object):
def send_spi(self): def send_spi(self):
status_dict = {} status_dict = {}
for index, item in enumerate(self.kb_opts): for index, item in enumerate(self.kb_opts):
if item['pid'] & 0x7f in status_dict and status_dict[item['pid'] & 0x7f] == 1:
continue
status_dict[item['pid'] & 0x7f] = 0 status_dict[item['pid'] & 0x7f] = 0
if index == self.current_keyboard_protocol_index: if index == self.current_keyboard_protocol_index:
status_dict[item['pid'] & 0x7f] = 1 status_dict[item['pid'] & 0x7f] = 1
for index, item in enumerate(self.mouse_opts): for index, item in enumerate(self.mouse_opts):
if item['pid'] & 0x7f in status_dict and status_dict[item['pid'] & 0x7f] == 1:
continue
status_dict[item['pid'] & 0x7f] = 0 status_dict[item['pid'] & 0x7f] = 0
if index == self.current_mouse_protocol_index: if index == self.current_mouse_protocol_index:
status_dict[item['pid'] & 0x7f] = 1 status_dict[item['pid'] & 0x7f] = 1
for index, item in enumerate(self.gamepad_opts): for index, item in enumerate(self.gamepad_opts):
if item['pid'] & 0x7f in status_dict and status_dict[item['pid'] & 0x7f] == 1:
continue
status_dict[item['pid'] & 0x7f] = 0 status_dict[item['pid'] & 0x7f] = 0
if index == self.current_gamepad_protocol_index: if index == self.current_gamepad_protocol_index:
status_dict[item['pid'] & 0x7f] = 1 status_dict[item['pid'] & 0x7f] = 1
@@ -321,6 +327,12 @@ class usb4vc_menu(object):
this_msg = list(usb4vc_shared.set_protocl_spi_msg_template) this_msg = list(usb4vc_shared.set_protocl_spi_msg_template)
this_msg[3:3+len(protocol_bytes)] = protocol_bytes this_msg[3:3+len(protocol_bytes)] = protocol_bytes
self.current_keyboard_protocol = self.kb_opts[self.current_keyboard_protocol_index]
self.current_mouse_protocol = self.mouse_opts[self.current_mouse_protocol_index]
self.current_gamepad_protocol = self.gamepad_opts[self.current_gamepad_protocol_index]
print('this', this_msg)
print('last', self.last_spi_message)
if this_msg == self.last_spi_message: if this_msg == self.last_spi_message:
print("SPI: no need to send") print("SPI: no need to send")
return return
@@ -328,9 +340,6 @@ class usb4vc_menu(object):
usb4vc_usb_scan.set_protocol(this_msg) usb4vc_usb_scan.set_protocol(this_msg)
print('new status:', [hex(x) for x in usb4vc_usb_scan.get_pboard_info()]) print('new status:', [hex(x) for x in usb4vc_usb_scan.get_pboard_info()])
self.last_spi_message = list(this_msg) self.last_spi_message = list(this_msg)
self.current_keyboard_protocol = self.kb_opts[self.current_keyboard_protocol_index]
self.current_mouse_protocol = self.mouse_opts[self.current_mouse_protocol_index]
self.current_gamepad_protocol = self.gamepad_opts[self.current_gamepad_protocol_index]
def action(self, level, page): def action(self, level, page):
if level == 0: if level == 0:
@@ -405,7 +414,7 @@ def ui_init():
if 'rpi_app_ver' not in configuration_dict: if 'rpi_app_ver' not in configuration_dict:
configuration_dict['rpi_app_ver'] = usb4vc_shared.RPI_APP_VERSION_TUPLE configuration_dict['rpi_app_ver'] = usb4vc_shared.RPI_APP_VERSION_TUPLE
if this_pboard_id not in configuration_dict: if this_pboard_id not in configuration_dict:
configuration_dict[this_pboard_id] = {"keyboard_protocol_index":0, "mouse_protocol_index":0, "mouse_sensitivity_index":0, "gamepad_protocol_index":0} configuration_dict[this_pboard_id] = {"keyboard_protocol_index":1, "mouse_protocol_index":1, "mouse_sensitivity_index":0, "gamepad_protocol_index":1}
plus_button = my_button(PLUS_BUTTON_PIN) plus_button = my_button(PLUS_BUTTON_PIN)
minus_button = my_button(MINUS_BUTTON_PIN) minus_button = my_button(MINUS_BUTTON_PIN)

View File

@@ -162,34 +162,35 @@ def make_mouse_spi_packet(mouse_dict, mouse_id):
to_transfer[17] = dict_get_if_exist(mouse_dict, BTN_EXTRA) to_transfer[17] = dict_get_if_exist(mouse_dict, BTN_EXTRA)
return to_transfer return to_transfer
PID_GENERIC_GAMEPORT_GAMEPAD = 7
def make_gamepad_spi_packet(gp_status_dict, gp_id, axes_info): def make_gamepad_spi_packet(gp_status_dict, gp_id, axes_info):
# do the mapping here current_gamepad_protocol = usb4vc_ui.get_gamepad_protocol()
print(usb4vc_ui.get_gamepad_protocol()) if current_gamepad_protocol['pid'] == PID_GENERIC_GAMEPORT_GAMEPAD:
result = list(gamepad_event_mapped_spi_msg_template)
result[3] = gp_id;
result[4] = dict_get_if_exist(gp_status_dict[gp_id], GP_BTN_SOUTH)
result[5] = dict_get_if_exist(gp_status_dict[gp_id], GP_BTN_EAST)
result[6] = dict_get_if_exist(gp_status_dict[gp_id], GP_BTN_WEST)
result[7] = dict_get_if_exist(gp_status_dict[gp_id], GP_BTN_NORTH)
result = list(gamepad_event_mapped_spi_msg_template) result[8] = dict_get_if_exist(gp_status_dict[gp_id], ABS_X)
if ABS_X in axes_info and 'max' in axes_info[ABS_X]:
result[8] = int(result[8] / (axes_info[ABS_X]['max'] / 127)) + 127
result[3] = gp_id; result[9] = dict_get_if_exist(gp_status_dict[gp_id], ABS_Y)
result[4] = dict_get_if_exist(gp_status_dict[gp_id], GP_BTN_SOUTH) if ABS_Y in axes_info and 'max' in axes_info[ABS_Y]:
result[5] = dict_get_if_exist(gp_status_dict[gp_id], GP_BTN_EAST) result[9] = int(result[9] / (axes_info[ABS_Y]['max'] / 127)) + 127
result[6] = dict_get_if_exist(gp_status_dict[gp_id], GP_BTN_WEST)
result[7] = dict_get_if_exist(gp_status_dict[gp_id], GP_BTN_NORTH)
result[8] = dict_get_if_exist(gp_status_dict[gp_id], ABS_X) result[10] = dict_get_if_exist(gp_status_dict[gp_id], ABS_RX)
if ABS_X in axes_info and 'max' in axes_info[ABS_X]: if ABS_RX in axes_info and 'max' in axes_info[ABS_RX]:
result[8] = int(result[8] / (axes_info[ABS_X]['max'] / 127)) + 127 result[10] = int(result[10] / (axes_info[ABS_RX]['max'] / 127)) + 127
result[9] = dict_get_if_exist(gp_status_dict[gp_id], ABS_Y) result[11] = dict_get_if_exist(gp_status_dict[gp_id], ABS_RY)
if ABS_Y in axes_info and 'max' in axes_info[ABS_Y]: if ABS_RY in axes_info and 'max' in axes_info[ABS_RY]:
result[9] = int(result[9] / (axes_info[ABS_Y]['max'] / 127)) + 127 result[11] = int(result[11] / (axes_info[ABS_RY]['max'] / 127)) + 127
return result
result[10] = dict_get_if_exist(gp_status_dict[gp_id], ABS_RX) return list(nop_spi_msg_template)
if ABS_RX in axes_info and 'max' in axes_info[ABS_RX]:
result[10] = int(result[10] / (axes_info[ABS_RX]['max'] / 127)) + 127
result[11] = dict_get_if_exist(gp_status_dict[gp_id], ABS_RY)
if ABS_RY in axes_info and 'max' in axes_info[ABS_RY]:
result[11] = int(result[11] / (axes_info[ABS_RY]['max'] / 127)) + 127
return result
def change_kb_led(scrolllock, numlock, capslock): def change_kb_led(scrolllock, numlock, capslock):
led_file_list = os.listdir(led_device_path) led_file_list = os.listdir(led_device_path)