diff --git a/right/src/keyboard_layout.c b/right/src/keyboard_layout.c index 4cabe19..352452c 100644 --- a/right/src/keyboard_layout.c +++ b/right/src/keyboard_layout.c @@ -1,6 +1,7 @@ #include "keyboard_layout.h" #include "led_display.h" #include "layer.h" +#include "usb_interface_mouse.h" static uint8_t keyMasks[SLOT_COUNT][MAX_KEY_COUNT_PER_MODULE]; @@ -85,12 +86,89 @@ bool handleKey(uhk_key_t key, int scancodeIdx, usb_keyboard_report_t *report, co LedDisplay_SetLayerLed(ActiveLayer); return false; break; + case UHK_KEY_MOUSE: + fillMouseReport(key, prevKeyStates, currKeyStates, keyId); + return false; default: break; } return false; } + +#define MOUSE_WHEEL_SPEED 1 +#define MOUSE_WHEEL_DIVISOR 4 + +#define MOUSE_MAX_SPEED 10 +#define MOUSE_SPEED_ACCEL_DIVISOR 50 + +static uint8_t mouseWheelDivisorCounter = 0; +static uint8_t mouseSpeedAccelDivisorCounter = 0; +static uint8_t mouseSpeed = 3; +static bool wasPreviousMouseActionWheelAction = false; + +void HandleMouseKey(usb_mouse_report_t *report, uhk_key_t key, const uint8_t *prevKeyStates, const uint8_t *currKeyStates, uint8_t keyId) +{ + bool isWheelAction; + + if (!key_is_pressed(prevKeyStates, currKeyStates, keyId)) + return; + + isWheelAction = !!(key.mouse.scrollActions) && !(key.mouse.moveActions) && !(key.mouse.buttonActions); + + if (isWheelAction && wasPreviousMouseActionWheelAction) { + mouseWheelDivisorCounter++; + } + + if (key.mouse.scrollActions) { + if (mouseWheelDivisorCounter == MOUSE_WHEEL_DIVISOR) { + mouseWheelDivisorCounter = 0; + if (key.mouse.scrollActions & UHK_MOUSE_SCROLL_UP) { + report->wheelX = 1; + } + if (key.mouse.scrollActions & UHK_MOUSE_SCROLL_DOWN) { + report->wheelX = -1; + } + } + } + + if (key.mouse.moveActions & UHK_MOUSE_ACCELERATE || key.mouse.moveActions & UHK_MOUSE_DECELERATE) { + mouseSpeedAccelDivisorCounter++; + + if (mouseSpeedAccelDivisorCounter == MOUSE_SPEED_ACCEL_DIVISOR) { + mouseSpeedAccelDivisorCounter = 0; + + if (key.mouse.moveActions & UHK_MOUSE_ACCELERATE) { + if (mouseSpeed < MOUSE_MAX_SPEED) { + mouseSpeed++; + } + } + if (key.mouse.moveActions & UHK_MOUSE_DECELERATE) { + if (mouseSpeed > 1) { + mouseSpeed--; + } + } + } + } else if (key.mouse.moveActions) { + if (key.mouse.moveActions & UHK_MOUSE_MOVE_LEFT) { + report->x = -mouseSpeed; + } + if (key.mouse.moveActions & UHK_MOUSE_MOVE_RIGHT) { + report->x = mouseSpeed; + } + if (key.mouse.moveActions & UHK_MOUSE_MOVE_UP) { + report->y = -mouseSpeed; + } + if (key.mouse.moveActions & UHK_MOUSE_MOVE_DOWN) { + report->y = mouseSpeed; + } + } + + report->buttons |= key.mouse.buttonActions; + + wasPreviousMouseActionWheelAction = isWheelAction; +} + void fillKeyboardReport(usb_keyboard_report_t *report, const uint8_t *leftKeyStates, const uint8_t *rightKeyStates) { int scancodeIdx = 0; diff --git a/right/src/keyboard_layout.h b/right/src/keyboard_layout.h index 995efd8..b106b3f 100644 --- a/right/src/keyboard_layout.h +++ b/right/src/keyboard_layout.h @@ -101,5 +101,7 @@ extern uint8_t prevKeyStates[SLOT_COUNT][MAX_KEY_COUNT_PER_MODULE]; extern uhk_key_t CurrentKeymap[LAYER_COUNT][SLOT_COUNT][MAX_KEY_COUNT_PER_MODULE]; void fillKeyboardReport(usb_keyboard_report_t *report, const uint8_t *leftKeyStates, const uint8_t *rightKeyStates); +void HandleMouseKey(usb_mouse_report_t *report, uhk_key_t key, const uint8_t *prevKeyStates, const uint8_t *currKeyStates, uint8_t keyId); +extern void fillMouseReport(uhk_key_t key, const uint8_t *prevKeyStates, const uint8_t *currKeyStates, uint8_t keyId); #endif diff --git a/right/src/usb_interface_mouse.c b/right/src/usb_interface_mouse.c index e960799..54b17a6 100644 --- a/right/src/usb_interface_mouse.c +++ b/right/src/usb_interface_mouse.c @@ -3,6 +3,7 @@ #include "fsl_i2c.h" #include "i2c.h" #include "reset_button.h" +#include "keyboard_layout.h" static usb_device_endpoint_struct_t UsbMouseEndpoints[USB_MOUSE_ENDPOINT_COUNT] = {{ USB_MOUSE_ENDPOINT_INDEX | (USB_IN << USB_DESCRIPTOR_ENDPOINT_ADDRESS_DIRECTION_SHIFT), @@ -38,23 +39,23 @@ usb_device_class_struct_t UsbMouseClass = { static usb_mouse_report_t UsbMouseReport; -static uint8_t scrollCounter = 0; static volatile usb_status_t UsbMouseAction(void) { + usb_status_t ret; + ret = USB_DeviceHidSend(UsbCompositeDevice.mouseHandle, USB_MOUSE_ENDPOINT_INDEX, + (uint8_t*)&UsbMouseReport, USB_MOUSE_REPORT_LENGTH); UsbMouseReport.buttons = 0; UsbMouseReport.x = 0; UsbMouseReport.y = 0; UsbMouseReport.wheelX = 0; UsbMouseReport.wheelY = 0; - if (RESET_BUTTON_IS_PRESSED) { - if (!(scrollCounter % 10)) { - UsbMouseReport.wheelX = -1; - } - } - scrollCounter++; - return USB_DeviceHidSend(UsbCompositeDevice.mouseHandle, USB_MOUSE_ENDPOINT_INDEX, - (uint8_t*)&UsbMouseReport, USB_MOUSE_REPORT_LENGTH); + return ret; +} + +void fillMouseReport(uhk_key_t key, const uint8_t *prevKeyStates, const uint8_t *currKeyStates, uint8_t keyId) +{ + HandleMouseKey(&UsbMouseReport, key, prevKeyStates, currKeyStates, keyId); } usb_status_t UsbMouseCallback(class_handle_t handle, uint32_t event, void *param)