pico: merge keyboard and gamepad buttons when both are detected Instead of overwiting the keyboard. Sometimes keyboards also claim to be mice and we mistake a mouse for a gamepad... resulting in the keyboard not working.
diff --git a/32blit-pico/input/usb_hid.cpp b/32blit-pico/input/usb_hid.cpp index 2bce8d2..0ebc2d7 100644 --- a/32blit-pico/input/usb_hid.cpp +++ b/32blit-pico/input/usb_hid.cpp
@@ -60,9 +60,10 @@ return; } + uint32_t new_buttons = 0; + // keyboard if(hid_keyboard_detected) { - uint32_t new_buttons = 0; for(int i = 0; i < 6; i++) { switch(hid_keys[i]) { @@ -114,8 +115,6 @@ break; } } - - api_data.buttons = new_buttons; } if(!hid_gamepad_id) @@ -126,18 +125,21 @@ while(mapping->id && mapping->id != hid_gamepad_id) mapping++; - api_data.buttons = dpad_map[hid_hat > 8 ? 8 : hid_hat] - | (hid_buttons & (1 << mapping->left) ? uint32_t(Button::DPAD_LEFT) : 0) - | (hid_buttons & (1 << mapping->right) ? uint32_t(Button::DPAD_RIGHT) : 0) - | (hid_buttons & (1 << mapping->up) ? uint32_t(Button::DPAD_UP) : 0) - | (hid_buttons & (1 << mapping->down) ? uint32_t(Button::DPAD_DOWN) : 0) - | (hid_buttons & (1 << mapping->a) ? uint32_t(Button::A) : 0) - | (hid_buttons & (1 << mapping->b) ? uint32_t(Button::B) : 0) - | (hid_buttons & (1 << mapping->x) ? uint32_t(Button::X) : 0) - | (hid_buttons & (1 << mapping->y) ? uint32_t(Button::Y) : 0) - | (hid_buttons & (1 << mapping->menu) ? uint32_t(Button::MENU) : 0) - | (hid_buttons & (1 << mapping->home) ? uint32_t(Button::HOME) : 0) - | (hid_buttons & (1 << mapping->joystick) ? uint32_t(Button::JOYSTICK) : 0); + new_buttons = new_buttons + | dpad_map[hid_hat > 8 ? 8 : hid_hat] + | (hid_buttons & (1 << mapping->left) ? uint32_t(Button::DPAD_LEFT) : 0) + | (hid_buttons & (1 << mapping->right) ? uint32_t(Button::DPAD_RIGHT) : 0) + | (hid_buttons & (1 << mapping->up) ? uint32_t(Button::DPAD_UP) : 0) + | (hid_buttons & (1 << mapping->down) ? uint32_t(Button::DPAD_DOWN) : 0) + | (hid_buttons & (1 << mapping->a) ? uint32_t(Button::A) : 0) + | (hid_buttons & (1 << mapping->b) ? uint32_t(Button::B) : 0) + | (hid_buttons & (1 << mapping->x) ? uint32_t(Button::X) : 0) + | (hid_buttons & (1 << mapping->y) ? uint32_t(Button::Y) : 0) + | (hid_buttons & (1 << mapping->menu) ? uint32_t(Button::MENU) : 0) + | (hid_buttons & (1 << mapping->home) ? uint32_t(Button::HOME) : 0) + | (hid_buttons & (1 << mapping->joystick) ? uint32_t(Button::JOYSTICK) : 0); + + api_data.buttons = new_buttons; api_data.joystick.x = (float(hid_joystick[0]) - 0x80) / 0x80; api_data.joystick.y = (float(hid_joystick[1]) - 0x80) / 0x80;