From d06791f28b41ac63831ad4c887f5fc45fd111dd7 Mon Sep 17 00:00:00 2001 From: Morio Date: Fri, 5 Jan 2024 18:36:45 -0800 Subject: [PATCH] Fix right mouse button and QuokkADB freezing The right mouse button wasn't lifting Control after being lifted. The fix for this also seems to fix the QuokkADB freezing after a while. The freezing only occurred in the release build. Under the debug build it worked fine. A possible memory leak was also addressed in the simple circular queue. Pointers to objects get the `delete` if the queue is full. --- .../lib/QuokkADB/include/platform_config.h | 2 +- .../QuokkADB/include/platformmouseparser.h | 7 ++ .../lib/QuokkADB/src/platformmouseparser.cpp | 118 ++++++++++++++---- src/firmware/lib/usb/include/scqueue.h | 1 + src/firmware/lib/usb/include/scqueue.tpp | 1 + src/firmware/lib/usb/include/usbmouseparser.h | 11 -- src/firmware/lib/usb/src/usbmouseparser.cpp | 55 ++------ 7 files changed, 114 insertions(+), 81 deletions(-) diff --git a/src/firmware/lib/QuokkADB/include/platform_config.h b/src/firmware/lib/QuokkADB/include/platform_config.h index 10d38db..dd1e8a8 100644 --- a/src/firmware/lib/QuokkADB/include/platform_config.h +++ b/src/firmware/lib/QuokkADB/include/platform_config.h @@ -25,7 +25,7 @@ #pragma once // Use macros for version number -#define FW_VER_NUM "0.5.0" +#define FW_VER_NUM "0.5.1" #define FW_VER_SUFFIX "beta" #define PLATFORM_FW_VERSION FW_VER_NUM "-" FW_VER_SUFFIX #define PRODUCT_NAME "QuokkADB" diff --git a/src/firmware/lib/QuokkADB/include/platformmouseparser.h b/src/firmware/lib/QuokkADB/include/platformmouseparser.h index 9f1f870..99f3a23 100644 --- a/src/firmware/lib/QuokkADB/include/platformmouseparser.h +++ b/src/firmware/lib/QuokkADB/include/platformmouseparser.h @@ -69,6 +69,11 @@ struct MOUSE_CLICK }; }; +enum class MouseRightBtnMode { + ctrl_click, + right_click +}; + class PlatformMouseParser { union { @@ -114,4 +119,6 @@ class PlatformMouseParser { int32_t m_coarse_y = 0; int32_t m_fine_x = 0; int32_t m_fine_y = 0; + + MouseRightBtnMode m_right_btn_mode = MouseRightBtnMode::ctrl_click; }; diff --git a/src/firmware/lib/QuokkADB/src/platformmouseparser.cpp b/src/firmware/lib/QuokkADB/src/platformmouseparser.cpp index 01727a7..69c5e5c 100644 --- a/src/firmware/lib/QuokkADB/src/platformmouseparser.cpp +++ b/src/firmware/lib/QuokkADB/src/platformmouseparser.cpp @@ -31,6 +31,7 @@ #include "tusb.h" #include #include "flashsettings.h" +#include extern FlashSettings setting_storage; @@ -77,55 +78,130 @@ void PlatformMouseParser::Parse(const hid_mouse_report_t *report){ if (mouse_info.dX / sensitivity_divisor == 0) m_fine_x += mouse_info.dX; if (mouse_info.dY / sensitivity_divisor == 0) m_fine_y += mouse_info.dY; - MOUSE_CLICK* click = new MOUSE_CLICK; - click->bmLeftButton = mouse_info.bmLeftButton; - click->bmMiddleButton = mouse_info.bmMiddleButton; - click->bmRightButton = mouse_info.bmRightButton; - if (m_click_events.isEmpty()) - { - m_click_events.enqueue(click); - } - else - { - MOUSE_CLICK* peek; - peek = m_click_events.peek(); - if (peek->bmLeftButton != click->bmLeftButton || - peek->bmMiddleButton != click->bmMiddleButton || - peek->bmRightButton != click->bmRightButton - ) - { - m_click_events.enqueue(click); - } - } - if(mouse_info.dX != 0 || mouse_info.dY != 0) { OnMouseMove(&mouse_info); } + bool left_change = false; + bool right_change = false; // change to mouse left button down if (!prevState.mouseInfo.bmLeftButton && mouse_info.bmLeftButton) { OnLeftButtonDown(&mouse_info); + left_change = true; } // change to mouse left button up if (prevState.mouseInfo.bmLeftButton && !mouse_info.bmLeftButton) { OnLeftButtonUp(&mouse_info); + left_change = true; } if (!prevState.mouseInfo.bmRightButton && mouse_info.bmRightButton) { OnRightButtonDown(&mouse_info); + right_change = true; } if (prevState.mouseInfo.bmRightButton && !mouse_info.bmRightButton) { OnRightButtonUp(&mouse_info); + right_change = true; } if (!prevState.mouseInfo.bmMiddleButton && mouse_info.bmMiddleButton) { OnMiddleButtonDown(&mouse_info); + switch (m_right_btn_mode) + { + case MouseRightBtnMode::ctrl_click : + m_right_btn_mode = MouseRightBtnMode::right_click; + break; + case MouseRightBtnMode::right_click : + m_right_btn_mode = MouseRightBtnMode::ctrl_click; + break; + } } + if (!prevState.mouseInfo.bmMiddleButton && mouse_info.bmMiddleButton) { OnMiddleButtonUp(&mouse_info); } + if (left_change || right_change) + { + if (right_change) + { + if (mouse_info.bmRightButton) + { + MOUSE_CLICK* click; + switch (m_right_btn_mode) + { + case MouseRightBtnMode::ctrl_click : + while(m_keyboard->PendingKeyboardEvent()); + m_keyboard->OnKeyDown(0, USB_KEY_LEFTCTRL); + while(m_keyboard->PendingKeyboardEvent()); + sleep_ms(200); + click = new MOUSE_CLICK; + click->bmLeftButton = true; + click->bmMiddleButton = mouse_info.bmMiddleButton; + click->bmRightButton = false; + if (!m_click_events.enqueue(click)) + { + Logmsg.println("Warning! unable to enqueue Ctrl + Click Down"); + } + break; + case MouseRightBtnMode::right_click : + click = new MOUSE_CLICK; + click->bmRightButton = true; + click->bmMiddleButton = mouse_info.bmMiddleButton; + click->bmLeftButton = mouse_info.bmLeftButton; + if (!m_click_events.enqueue(click)) + { + Logmsg.println("Warning! unable to enqueue Right Click Down"); + } + break; + } + } + else + { + MOUSE_CLICK* click; + switch (m_right_btn_mode) + { + case MouseRightBtnMode::ctrl_click : + click = new MOUSE_CLICK; + click->bmLeftButton = false; + click->bmMiddleButton = mouse_info.bmMiddleButton; + click->bmRightButton = false; + if (!m_click_events.enqueue(click)) + { + Logmsg.println("Warning! unable to enqueue Ctrl + Click Up"); + } + while(!m_click_events.isEmpty()); + sleep_ms(100); + while(m_keyboard->PendingKeyboardEvent()); + m_keyboard->OnKeyUp(0, USB_KEY_LEFTCTRL); + while(m_keyboard->PendingKeyboardEvent()); + break; + case MouseRightBtnMode::right_click : + click = new MOUSE_CLICK; + click->bmRightButton = false; + click->bmLeftButton = mouse_info.bmLeftButton; + if (!m_click_events.enqueue(click)) + { + Logmsg.println("Warning! unable to enqueue new Right Click Up"); + } + break; + } + } + } + else + { + MOUSE_CLICK* click = new MOUSE_CLICK; + click->bmLeftButton = mouse_info.bmLeftButton; + click->bmMiddleButton = mouse_info.bmMiddleButton; + click->bmRightButton = mouse_info.bmRightButton; + if (!m_click_events.enqueue(click)) + { + Logmsg.println("Warning! unable to enqueue Left Click event"); + } + } + } + memcpy(prevState.bInfo, &mouse_info, sizeof(prevState.bInfo)); m_ready = true; } \ No newline at end of file diff --git a/src/firmware/lib/usb/include/scqueue.h b/src/firmware/lib/usb/include/scqueue.h index 747923f..21103a3 100644 --- a/src/firmware/lib/usb/include/scqueue.h +++ b/src/firmware/lib/usb/include/scqueue.h @@ -31,6 +31,7 @@ namespace simple_circular_queue class SCQueue { public: SCQueue(void); + // Queues a pointer, if the queue is full it deletes the pointer bool enqueue(T item); T dequeue(void); T peek(void); diff --git a/src/firmware/lib/usb/include/scqueue.tpp b/src/firmware/lib/usb/include/scqueue.tpp index 2b253db..09d5254 100644 --- a/src/firmware/lib/usb/include/scqueue.tpp +++ b/src/firmware/lib/usb/include/scqueue.tpp @@ -38,6 +38,7 @@ namespace simple_circular_queue { // no overwriting, return false if queue is full if (!is_empty_ && first_ == new_last) { enqueued = false; + delete item; } else { if(is_empty_) { diff --git a/src/firmware/lib/usb/include/usbmouseparser.h b/src/firmware/lib/usb/include/usbmouseparser.h index b6f83a3..705079e 100644 --- a/src/firmware/lib/usb/include/usbmouseparser.h +++ b/src/firmware/lib/usb/include/usbmouseparser.h @@ -28,11 +28,6 @@ #include "platformmouseparser.h" -enum class MouseRightBtnMode { - ctrl_click, - right_click -}; - class MouseRptParser : public PlatformMouseParser { @@ -60,10 +55,4 @@ class MouseRptParser : public PlatformMouseParser bool m_mouse_left_button_is_pressed = false; bool m_mouse_right_button_is_pressed = false; bool m_mouse_button_changed = false; - #ifdef QUOKKADB - MouseRightBtnMode m_right_btn_mode = MouseRightBtnMode::ctrl_click; - #else - MouseRightBtnMode m_right_btn_mode = MouseRightBtnMode::right_click; - #endif - }; diff --git a/src/firmware/lib/usb/src/usbmouseparser.cpp b/src/firmware/lib/usb/src/usbmouseparser.cpp index 438c075..c3c2324 100644 --- a/src/firmware/lib/usb/src/usbmouseparser.cpp +++ b/src/firmware/lib/usb/src/usbmouseparser.cpp @@ -24,7 +24,6 @@ #include #include "usbmouseparser.h" -#include "usb_hid_keys.h" #include @@ -53,6 +52,7 @@ void MouseRptParser::OnLeftButtonUp(MOUSEINFO *mi) { Logmsg.println("L Bttn Up"); } + }; void MouseRptParser::OnLeftButtonDown(MOUSEINFO *mi) { @@ -60,6 +60,12 @@ void MouseRptParser::OnLeftButtonDown(MOUSEINFO *mi) { Logmsg.println("L Bttn Dn"); } + MOUSE_CLICK* click = new MOUSE_CLICK; + click->bmLeftButton = true; + if (!m_click_events.enqueue(click)) + { + Logmsg.println("Warning! unable to enqueue Click Down"); + } }; void MouseRptParser::OnRightButtonUp(MOUSEINFO *mi) { @@ -67,26 +73,6 @@ void MouseRptParser::OnRightButtonUp(MOUSEINFO *mi) { Logmsg.println("R Bttn Up"); } - switch (m_right_btn_mode) - { - case MouseRightBtnMode::ctrl_click : - - mi->bmLeftButton = false; - #ifdef QUOKKADB - sleep_ms(100); - #else - delay(100); - #endif - while(m_keyboard->PendingKeyboardEvent()); - m_keyboard->OnKeyUp(0, USB_KEY_LEFTCTRL); - while(m_keyboard->PendingKeyboardEvent()); - - break; - case MouseRightBtnMode::right_click : - mi->bmRightButton = false; - break; - } - }; void MouseRptParser::OnRightButtonDown(MOUSEINFO *mi) { @@ -94,23 +80,6 @@ void MouseRptParser::OnRightButtonDown(MOUSEINFO *mi) { Logmsg.println("R Bttn Dn"); } - switch (m_right_btn_mode) - { - case MouseRightBtnMode::ctrl_click : - while(m_keyboard->PendingKeyboardEvent()); - m_keyboard->OnKeyDown(0, USB_KEY_LEFTCTRL); - while(m_keyboard->PendingKeyboardEvent()); - #ifdef QUOKKADB - sleep_ms(200); - #else - delay(200); - #endif - mi->bmLeftButton = true; - break; - case MouseRightBtnMode::right_click : - mi->bmRightButton = true; - break; - } }; void MouseRptParser::OnMiddleButtonUp(MOUSEINFO *mi) { @@ -126,16 +95,6 @@ void MouseRptParser::OnMiddleButtonDown(MOUSEINFO *mi) { Logmsg.println("M Bttn Dn"); } - switch (m_right_btn_mode) - { - case MouseRightBtnMode::ctrl_click : - m_right_btn_mode = MouseRightBtnMode::right_click; - break; - case MouseRightBtnMode::right_click : - m_right_btn_mode = MouseRightBtnMode::ctrl_click; - break; - - } };