From 4dd8eec39d5f05d6aa55fff98894d4b84c56fdf0 Mon Sep 17 00:00:00 2001 From: 4yn <4yn@users.noreply.github.com> Date: Sat, 13 Aug 2022 12:42:09 +0800 Subject: [PATCH 1/3] only calculate and update encoder values during a mouse cycle for keyboard mode --- src/pico_game_controller.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/pico_game_controller.c b/src/pico_game_controller.c index 68fa3a6..962bbf1 100644 --- a/src/pico_game_controller.c +++ b/src/pico_game_controller.c @@ -135,18 +135,18 @@ void key_mode() { } } - /*------------- Mouse -------------*/ - // find the delta between previous and current enc_val - int delta[ENC_GPIO_SIZE] = {0}; - for (int i = 0; i < ENC_GPIO_SIZE; i++) { - delta[i] = (enc_val[i] - prev_enc_val[i]) * (ENC_REV[i] ? 1 : -1); - prev_enc_val[i] = enc_val[i]; - } - if (kbm_report) { tud_hid_n_report(0x00, REPORT_ID_KEYBOARD, &nkro_report, sizeof(nkro_report)); } else { + /*------------- Mouse -------------*/ + // find the delta between previous and current enc_val + int delta[ENC_GPIO_SIZE] = {0}; + for (int i = 0; i < ENC_GPIO_SIZE; i++) { + delta[i] = (enc_val[i] - prev_enc_val[i]) * (ENC_REV[i] ? 1 : -1); + prev_enc_val[i] = enc_val[i]; + } + tud_hid_mouse_report(REPORT_ID_MOUSE, 0x00, delta[0] * MOUSE_SENS, delta[1] * MOUSE_SENS, 0, 0); } From f6470d414c834a74adb4d514bab4dae1ed714d86 Mon Sep 17 00:00:00 2001 From: 4yn <4yn@users.noreply.github.com> Date: Sat, 13 Aug 2022 13:27:04 +0800 Subject: [PATCH 2/3] only calculate keyboard nkro report when needed --- src/pico_game_controller.c | 25 ++++++++++++------------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/src/pico_game_controller.c b/src/pico_game_controller.c index 962bbf1..abd6bfa 100644 --- a/src/pico_game_controller.c +++ b/src/pico_game_controller.c @@ -121,21 +121,20 @@ void joy_mode() { void key_mode() { if (tud_hid_ready()) { // Wait for ready, updating mouse too fast hampers // movement - /*------------- Keyboard -------------*/ - uint8_t nkro_report[32] = {0}; - for (int i = 0; i < SW_GPIO_SIZE; i++) { - if ((report.buttons >> i) % 2 == 1) { - uint8_t bit = SW_KEYCODE[i] % 8; - uint8_t byte = (SW_KEYCODE[i] / 8) + 1; - if (SW_KEYCODE[i] >= 240 && SW_KEYCODE[i] <= 247) { - nkro_report[0] |= (1 << bit); - } else if (byte > 0 && byte <= 31) { - nkro_report[byte] |= (1 << bit); + if (kbm_report) { + /*------------- Keyboard -------------*/ + uint8_t nkro_report[32] = {0}; + for (int i = 0; i < SW_GPIO_SIZE; i++) { + if ((report.buttons >> i) % 2 == 1) { + uint8_t bit = SW_KEYCODE[i] % 8; + uint8_t byte = (SW_KEYCODE[i] / 8) + 1; + if (SW_KEYCODE[i] >= 240 && SW_KEYCODE[i] <= 247) { + nkro_report[0] |= (1 << bit); + } else if (byte > 0 && byte <= 31) { + nkro_report[byte] |= (1 << bit); + } } } - } - - if (kbm_report) { tud_hid_n_report(0x00, REPORT_ID_KEYBOARD, &nkro_report, sizeof(nkro_report)); } else { From 6edb00c2bdd76018f0605cac4ecf79b67777a494 Mon Sep 17 00:00:00 2001 From: 4yn <4yn@users.noreply.github.com> Date: Sat, 13 Aug 2022 13:39:36 +0800 Subject: [PATCH 3/3] update prebuilt uf2 --- build_uf2/Pico_Game_Controller.uf2 | Bin 76800 -> 76800 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/build_uf2/Pico_Game_Controller.uf2 b/build_uf2/Pico_Game_Controller.uf2 index 26bc47e0209fad631e56498b1ad980722f37d27c..cf7fad71434f6e0eb33103251113bab8748deb23 100644 GIT binary patch delta 11958 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 G8Tda^)?*w1 delta 12174 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