mirror of
https://github.com/dekuNukem/USB4VC.git
synced 2025-10-31 11:26:46 -07:00
added raw gamepad event spi message
This commit is contained in:
@@ -1,3 +1,6 @@
|
|||||||
|
usb4vc_oled.oled_print_centered("HOLD + during", usb4vc_oled.font_medium, 0, draw)
|
||||||
|
usb4vc_oled.oled_print_centered("input to exit", usb4vc_oled.font_medium, 15, draw)
|
||||||
|
|
||||||
axis_value_8bit = cat.event.value
|
axis_value_8bit = cat.event.value
|
||||||
try:
|
try:
|
||||||
gamepad_status = usb4vc_usb_scan.gamepad_status_dict.get(usb4vc_usb_scan.opened_device_dict[device.path]['id'])
|
gamepad_status = usb4vc_usb_scan.gamepad_status_dict.get(usb4vc_usb_scan.opened_device_dict[device.path]['id'])
|
||||||
|
|||||||
@@ -80,6 +80,8 @@ SPI_MOSI_MAGIC = 0xde
|
|||||||
SPI_MISO_MAGIC = 0xcd
|
SPI_MISO_MAGIC = 0xcd
|
||||||
|
|
||||||
BTN_SOUTH = 0x130
|
BTN_SOUTH = 0x130
|
||||||
|
BTN_TR = 0x137
|
||||||
|
BTN_TL2 = 0x138
|
||||||
BTN_THUMBR = 0x13e
|
BTN_THUMBR = 0x13e
|
||||||
|
|
||||||
ABS_X = 0x00
|
ABS_X = 0x00
|
||||||
@@ -104,6 +106,7 @@ info_request_spi_msg_template = [SPI_MOSI_MAGIC, 0, SPI_MOSI_MSG_TYPE_INFO_REQUE
|
|||||||
keyboard_event_spi_msg_template = [SPI_MOSI_MAGIC, 0, SPI_MOSI_MSG_TYPE_KEYBOARD_EVENT] + [0]*29
|
keyboard_event_spi_msg_template = [SPI_MOSI_MAGIC, 0, SPI_MOSI_MSG_TYPE_KEYBOARD_EVENT] + [0]*29
|
||||||
mouse_event_spi_msg_template = [SPI_MOSI_MAGIC, 0, SPI_MOSI_MSG_TYPE_MOUSE_EVENT] + [0]*29
|
mouse_event_spi_msg_template = [SPI_MOSI_MAGIC, 0, SPI_MOSI_MSG_TYPE_MOUSE_EVENT] + [0]*29
|
||||||
gamepad_event_ibm_ggp_spi_msg_template = [SPI_MOSI_MAGIC, 0, SPI_MOSI_MSG_TYPE_GAMEPAD_EVENT_MAPPED, 0, 0, 0, 0, 0, 127, 127, 127, 127] + [0]*20
|
gamepad_event_ibm_ggp_spi_msg_template = [SPI_MOSI_MAGIC, 0, SPI_MOSI_MSG_TYPE_GAMEPAD_EVENT_MAPPED, 0, 0, 0, 0, 0, 127, 127, 127, 127] + [0]*20
|
||||||
|
raw_usb_gamepad_event_spi_msg_template = [SPI_MOSI_MAGIC, 0, SPI_MOSI_MSG_TYPE_GAMEPAD_EVENT_RAW] + [0]*7 + [127]*8 + [0]*14
|
||||||
|
|
||||||
def make_spi_msg_ack():
|
def make_spi_msg_ack():
|
||||||
return [SPI_MOSI_MAGIC, 0, SPI_MOSI_MSG_TYPE_REQ_ACK] + [0]*29
|
return [SPI_MOSI_MAGIC, 0, SPI_MOSI_MSG_TYPE_REQ_ACK] + [0]*29
|
||||||
@@ -135,8 +138,9 @@ def make_mouse_spi_packet(mouse_dict, mouse_id):
|
|||||||
to_transfer[17] = mouse_dict[BTN_EXTRA]
|
to_transfer[17] = mouse_dict[BTN_EXTRA]
|
||||||
return to_transfer
|
return to_transfer
|
||||||
|
|
||||||
PID_GENERIC_GAMEPORT_GAMEPAD = 7
|
|
||||||
PID_PROTOCOL_OFF = 0
|
PID_PROTOCOL_OFF = 0
|
||||||
|
PID_GENERIC_GAMEPORT_GAMEPAD = 7
|
||||||
|
PID_RAW_USB_GAMEPAD = 127
|
||||||
|
|
||||||
def get_range_max_and_midpoint(axes_dict, axis_key):
|
def get_range_max_and_midpoint(axes_dict, axis_key):
|
||||||
try:
|
try:
|
||||||
@@ -150,7 +154,10 @@ def convert_to_8bit_midpoint127(value, axes_dict, axis_key):
|
|||||||
if rmax is None:
|
if rmax is None:
|
||||||
return 127
|
return 127
|
||||||
value -= rmid
|
value -= rmid
|
||||||
return int((value / rmax) * 255) + 127
|
result = int((value / rmax) * 255) + 127
|
||||||
|
if result == 254:
|
||||||
|
result = 255
|
||||||
|
return result
|
||||||
|
|
||||||
IBMPC_GGP_SPI_LOOKUP = {
|
IBMPC_GGP_SPI_LOOKUP = {
|
||||||
'IBM_GGP_BTN_1':4,
|
'IBM_GGP_BTN_1':4,
|
||||||
@@ -490,16 +497,16 @@ def gamepad_type_lookup(vendor_id, product_id):
|
|||||||
return "DualShock 4 [CUH-ZCT1x]"
|
return "DualShock 4 [CUH-ZCT1x]"
|
||||||
if vendor_id == 0x054c and product_id == 0x0ce6:
|
if vendor_id == 0x054c and product_id == 0x0ce6:
|
||||||
return "DualSense wireless controller"
|
return "DualSense wireless controller"
|
||||||
if vendor_id == 0x57e and product_id == 0x2009:
|
if vendor_id == 0x057e and product_id == 0x2009:
|
||||||
return "Switch Pro Controller"
|
return "Switch Pro Controller"
|
||||||
if vendor_id == 0x45e:
|
if vendor_id == 0x045e:
|
||||||
return "Xbox"
|
return "Xbox"
|
||||||
return "Generic"
|
return "Generic"
|
||||||
|
|
||||||
prev_gp_output = {}
|
prev_gp_output = {}
|
||||||
prev_kb_output = {}
|
prev_kb_output = {}
|
||||||
curr_mouse_output = {}
|
curr_mouse_output = {}
|
||||||
def make_generic_gamepad_spi_packet(gp_status_dict, gp_id, this_device_info, mapping_info):
|
def make_generic_gamepad_spi_packet(gp_status_dict, this_device_info, mapping_info):
|
||||||
global prev_gp_output
|
global prev_gp_output
|
||||||
global prev_kb_output
|
global prev_kb_output
|
||||||
global curr_mouse_output
|
global curr_mouse_output
|
||||||
@@ -507,6 +514,7 @@ def make_generic_gamepad_spi_packet(gp_status_dict, gp_id, this_device_info, map
|
|||||||
axes_info = this_device_info['axes_info']
|
axes_info = this_device_info['axes_info']
|
||||||
this_gamepad_name = this_device_info.get('name', '').lower().strip()
|
this_gamepad_name = this_device_info.get('name', '').lower().strip()
|
||||||
usb_gamepad_type = gamepad_type_lookup(this_device_info['vendor_id'], this_device_info['product_id'])
|
usb_gamepad_type = gamepad_type_lookup(this_device_info['vendor_id'], this_device_info['product_id'])
|
||||||
|
gp_id = this_device_info['id']
|
||||||
this_gp_dict = gp_status_dict[gp_id]
|
this_gp_dict = gp_status_dict[gp_id]
|
||||||
curr_gp_output = {
|
curr_gp_output = {
|
||||||
'IBM_GGP_BTN_1':set([0]),
|
'IBM_GGP_BTN_1':set([0]),
|
||||||
@@ -674,11 +682,59 @@ def make_generic_gamepad_spi_packet(gp_status_dict, gp_id, this_device_info, map
|
|||||||
gp_spi_msg[10], gp_spi_msg[11] = apply_curve(gp_spi_msg[10], gp_spi_msg[11])
|
gp_spi_msg[10], gp_spi_msg[11] = apply_curve(gp_spi_msg[10], gp_spi_msg[11])
|
||||||
return gp_spi_msg, kb_spi_msg, mouse_spi_msg
|
return gp_spi_msg, kb_spi_msg, mouse_spi_msg
|
||||||
|
|
||||||
def make_gamepad_spi_packet(gp_status_dict, gp_id, this_device_info):
|
raw_usb_gamepad_abs_axes_to_spi_msg_index_lookup = {
|
||||||
|
0x00:10, #ABS_X
|
||||||
|
0x01:11, #ABS_Y
|
||||||
|
0x02:12, #ABS_Z
|
||||||
|
0x03:13, #ABS_RX
|
||||||
|
0x04:14, #ABS_RY
|
||||||
|
0x05:15, #ABS_RZ
|
||||||
|
0x06:None, #ABS_THROTTLE
|
||||||
|
0x07:None, #ABS_RUDDER
|
||||||
|
0x08:None, #ABS_WHEEL
|
||||||
|
0x09:None, #ABS_GAS
|
||||||
|
0x0a:None, #ABS_BRAKE
|
||||||
|
0x10:16, #ABS_HAT0X
|
||||||
|
0x11:17, #ABS_HAT0Y
|
||||||
|
0x12:None, #ABS_HAT1X
|
||||||
|
0x13:None, #ABS_HAT1Y
|
||||||
|
0x14:None, #ABS_HAT2X
|
||||||
|
0x15:None, #ABS_HAT2Y
|
||||||
|
0x16:None, #ABS_HAT3X
|
||||||
|
0x17:None, #ABS_HAT3Y
|
||||||
|
0x18:None, #ABS_PRESSURE
|
||||||
|
0x19:None, #ABS_DISTANCE
|
||||||
|
0x1a:None, #ABS_TILT_X
|
||||||
|
0x1b:None, #ABS_TILT_Y
|
||||||
|
0x1c:None, #ABS_TOOL_WIDTH
|
||||||
|
}
|
||||||
|
|
||||||
|
def make_raw_gamepad_spi_packet(gp_status_dict, this_device_info):
|
||||||
|
gp_id = this_device_info['id']
|
||||||
|
this_msg = list(raw_usb_gamepad_event_spi_msg_template)
|
||||||
|
this_msg[3] = gp_id
|
||||||
|
this_msg[4:6] = this_device_info['vendor_id'].to_bytes(2, byteorder='little')
|
||||||
|
this_msg[6:8] = this_device_info['product_id'].to_bytes(2, byteorder='little')
|
||||||
|
|
||||||
|
for event_code in gp_status_dict[gp_id]:
|
||||||
|
if BTN_SOUTH <= event_code <= BTN_TR:
|
||||||
|
this_msg[8] |= (gp_status_dict[gp_id][event_code] << (event_code - BTN_SOUTH))
|
||||||
|
elif BTN_TL2 <= event_code <= BTN_THUMBR:
|
||||||
|
this_msg[9] |= (gp_status_dict[gp_id][event_code] << (event_code - BTN_TL2))
|
||||||
|
elif ABS_X <= event_code <= ABS_HAT3Y:
|
||||||
|
msg_index = raw_usb_gamepad_abs_axes_to_spi_msg_index_lookup.get(event_code)
|
||||||
|
if msg_index is not None:
|
||||||
|
this_msg[msg_index] = gp_status_dict[gp_id][event_code]
|
||||||
|
# print('{:08b}'.format(this_msg[9]))
|
||||||
|
return this_msg, None, None
|
||||||
|
|
||||||
|
def make_gamepad_spi_packet(gp_status_dict, this_device_info):
|
||||||
current_protocol = usb4vc_ui.get_gamepad_protocol()
|
current_protocol = usb4vc_ui.get_gamepad_protocol()
|
||||||
try:
|
try:
|
||||||
if current_protocol['pid'] in [PID_GENERIC_GAMEPORT_GAMEPAD, PID_PROTOCOL_OFF]:
|
if current_protocol['pid'] in [PID_GENERIC_GAMEPORT_GAMEPAD, PID_PROTOCOL_OFF]:
|
||||||
return make_generic_gamepad_spi_packet(gp_status_dict, gp_id, this_device_info, current_protocol)
|
return make_generic_gamepad_spi_packet(gp_status_dict, this_device_info, current_protocol)
|
||||||
|
elif current_protocol['pid'] == PID_RAW_USB_GAMEPAD:
|
||||||
|
return make_raw_gamepad_spi_packet(gp_status_dict, this_device_info)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
print("exception make_generic_gamepad_spi_packet:", e)
|
print("exception make_generic_gamepad_spi_packet:", e)
|
||||||
return list(nop_spi_msg_template), None, None
|
return list(nop_spi_msg_template), None, None
|
||||||
@@ -834,7 +890,8 @@ def raw_input_event_worker():
|
|||||||
this_gp_dict = gamepad_status_dict[this_device['id']]
|
this_gp_dict = gamepad_status_dict[this_device['id']]
|
||||||
if axes_code in this_gp_dict and 127 - 12 <= this_gp_dict[axes_code] <= 127 + 12:
|
if axes_code in this_gp_dict and 127 - 12 <= this_gp_dict[axes_code] <= 127 + 12:
|
||||||
this_gp_dict[axes_code] = 127
|
this_gp_dict[axes_code] = 127
|
||||||
gamepad_output = make_gamepad_spi_packet(gamepad_status_dict, this_id, this_device)
|
gamepad_output = make_gamepad_spi_packet(gamepad_status_dict, this_device)
|
||||||
|
# print(gamepad_output[0])
|
||||||
if gamepad_output != last_gamepad_msg:
|
if gamepad_output != last_gamepad_msg:
|
||||||
gp_to_transfer, kb_to_transfer, mouse_to_transfer = gamepad_output
|
gp_to_transfer, kb_to_transfer, mouse_to_transfer = gamepad_output
|
||||||
pcard_spi.xfer(list(gp_to_transfer))
|
pcard_spi.xfer(list(gp_to_transfer))
|
||||||
|
|||||||
Reference in New Issue
Block a user