Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix right mouse button and QuokkADB freezing #23

Merged
merged 1 commit into from
Jan 6, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion src/firmware/lib/QuokkADB/include/platform_config.h
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down
7 changes: 7 additions & 0 deletions src/firmware/lib/QuokkADB/include/platformmouseparser.h
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,11 @@ struct MOUSE_CLICK
};
};

enum class MouseRightBtnMode {
ctrl_click,
right_click
};

class PlatformMouseParser {

union {
Expand Down Expand Up @@ -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;
};
118 changes: 97 additions & 21 deletions src/firmware/lib/QuokkADB/src/platformmouseparser.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@
#include "tusb.h"
#include <pico/mutex.h>
#include "flashsettings.h"
#include <usb_hid_keys.h>

extern FlashSettings setting_storage;

Expand Down Expand Up @@ -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;
}
1 change: 1 addition & 0 deletions src/firmware/lib/usb/include/scqueue.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
1 change: 1 addition & 0 deletions src/firmware/lib/usb/include/scqueue.tpp
Original file line number Diff line number Diff line change
Expand Up @@ -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_) {
Expand Down
11 changes: 0 additions & 11 deletions src/firmware/lib/usb/include/usbmouseparser.h
Original file line number Diff line number Diff line change
Expand Up @@ -28,11 +28,6 @@

#include "platformmouseparser.h"

enum class MouseRightBtnMode {
ctrl_click,
right_click
};


class MouseRptParser : public PlatformMouseParser
{
Expand Down Expand Up @@ -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

};
55 changes: 7 additions & 48 deletions src/firmware/lib/usb/src/usbmouseparser.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,6 @@

#include <Arduino.h>
#include "usbmouseparser.h"
#include "usb_hid_keys.h"
#include <platform_logmsg.h>


Expand Down Expand Up @@ -53,64 +52,34 @@ void MouseRptParser::OnLeftButtonUp(MOUSEINFO *mi)
{
Logmsg.println("L Bttn Up");
}

};
void MouseRptParser::OnLeftButtonDown(MOUSEINFO *mi)
{
if (global_debug)
{
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)
{
if (global_debug)
{
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)
{
if (global_debug)
{
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)
{
Expand All @@ -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;

}
};


Expand Down