diff --git a/right/src/config_parser/parse_keymap.c b/right/src/config_parser/parse_keymap.c index 58e1342..2803f02 100644 --- a/right/src/config_parser/parse_keymap.c +++ b/right/src/config_parser/parse_keymap.c @@ -121,10 +121,10 @@ static parser_error_t parseMouseAction(key_action_t *keyAction, config_buffer_t keyAction->mouse.scrollActions = MouseScroll_Right; break; case SerializedMouseAction_Accelerate: - keyAction->mouse.moveActions = MouseMove_Accelerate; + keyAction->mouse.speedActions = MouseSpeed_Accelerate; break; case SerializedMouseAction_Decelerate: - keyAction->mouse.moveActions = MouseMove_Decelerate; + keyAction->mouse.speedActions = MouseSpeed_Decelerate; break; default: return ParserError_InvalidSerializedMouseAction; diff --git a/right/src/key_action.h b/right/src/key_action.h index d984965..2170abc 100644 --- a/right/src/key_action.h +++ b/right/src/key_action.h @@ -9,14 +9,6 @@ #include "usb_composite_device.h" #include "module.h" -// Macros: - - #define MOUSE_WHEEL_SPEED 1 - #define MOUSE_WHEEL_DIVISOR 4 - - #define MOUSE_MAX_SPEED 10 - #define MOUSE_SPEED_ACCEL_DIVISOR 50 - // Typedefs: typedef enum { @@ -49,11 +41,13 @@ MouseMove_Down = 1 << 1, MouseMove_Left = 1 << 2, MouseMove_Right = 1 << 3, - - MouseMove_Accelerate = 1 << 4, - MouseMove_Decelerate = 1 << 5, } mouse_move_action_t; + typedef enum { + MouseSpeed_Accelerate = 1 << 0, + MouseSpeed_Decelerate = 1 << 1, + } mouse_speed_action_t; + typedef enum { MouseScroll_Up = 1 << 0, MouseScroll_Down = 1 << 1, @@ -74,6 +68,7 @@ mouse_button_t buttonActions; mouse_scroll_t scrollActions; mouse_move_action_t moveActions; + mouse_speed_action_t speedActions; } ATTR_PACKED mouse; struct { bool isToggle; diff --git a/right/src/keymap.c b/right/src/keymap.c index d67b1c2..a623fe7 100644 --- a/right/src/keymap.c +++ b/right/src/keymap.c @@ -411,8 +411,8 @@ key_action_t CurrentKeymap[LAYER_COUNT][SLOT_COUNT][MAX_KEY_COUNT_PER_MODULE] = { .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_LEFT_GUI }}, { .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_LEFT_ALT }}, { .type = KeyActionType_None }, - { .type = KeyActionType_Mouse, .mouse = { .moveActions = MouseMove_Decelerate }}, - { .type = KeyActionType_Mouse, .mouse = { .moveActions = MouseMove_Accelerate }}, + { .type = KeyActionType_Mouse, .mouse = { .speedActions = MouseSpeed_Decelerate }}, + { .type = KeyActionType_Mouse, .mouse = { .speedActions = MouseSpeed_Accelerate }}, { .type = KeyActionType_None }, } }, diff --git a/right/src/usb_report_updater.c b/right/src/usb_report_updater.c index 0b0b271..6cf6607 100644 --- a/right/src/usb_report_updater.c +++ b/right/src/usb_report_updater.c @@ -1,3 +1,4 @@ +#include #include "key_action.h" #include "led_display.h" #include "layer.h" @@ -15,69 +16,66 @@ #include "key_debouncer.h" uint32_t UsbReportUpdateTime = 0; - -static uint8_t mouseWheelDivisorCounter = 0; -static uint8_t mouseSpeedAccelDivisorCounter = 0; -static uint8_t mouseSpeed = 10; -static bool wasPreviousMouseActionWheelAction = false; static uint32_t elapsedTime; +static float mouseMoveSpeed = 0.4; +static float mouseMoveMaxSpeed = 10; + +static float mouseScrollSpeed = 0.1; +static float mouseScrollMaxSpeed = 0.1; + +static float mouseAccelerateFactor = 2; +static float mouseDecelerateFactor = 0.5; + void processMouseAction(key_action_t *action) { - bool isWheelAction = action->mouse.scrollActions && !action->mouse.moveActions && !action->mouse.buttonActions; - uint16_t distance = mouseSpeed * elapsedTime / 25; + uint16_t distance = mouseMoveSpeed * elapsedTime; - if (isWheelAction && wasPreviousMouseActionWheelAction) { - mouseWheelDivisorCounter++; - } - - if (action->mouse.scrollActions) { - if (mouseWheelDivisorCounter == MOUSE_WHEEL_DIVISOR) { - mouseWheelDivisorCounter = 0; - if (action->mouse.scrollActions & MouseScroll_Up) { - ActiveUsbMouseReport->wheelX = 1; + if (action->mouse.speedActions) { + if (action->mouse.speedActions & MouseSpeed_Accelerate) { + if (mouseMoveSpeed < mouseMoveMaxSpeed) { + mouseMoveSpeed++; } - if (action->mouse.scrollActions & MouseScroll_Down) { - ActiveUsbMouseReport->wheelX = -1; + } else if (action->mouse.speedActions & MouseSpeed_Decelerate) { + if (mouseMoveSpeed > 1) { + mouseMoveSpeed--; } } } - if (action->mouse.moveActions & MouseMove_Accelerate || action->mouse.moveActions & MouseMove_Decelerate) { - mouseSpeedAccelDivisorCounter++; - - if (mouseSpeedAccelDivisorCounter == MOUSE_SPEED_ACCEL_DIVISOR) { - mouseSpeedAccelDivisorCounter = 0; - - if (action->mouse.moveActions & MouseMove_Accelerate) { - if (mouseSpeed < MOUSE_MAX_SPEED) { - mouseSpeed++; - } - } - if (action->mouse.moveActions & MouseMove_Decelerate) { - if (mouseSpeed > 1) { - mouseSpeed--; - } - } - } - } else if (action->mouse.moveActions) { + if (action->mouse.moveActions) { if (action->mouse.moveActions & MouseMove_Left) { ActiveUsbMouseReport->x = -distance; - } - if (action->mouse.moveActions & MouseMove_Right) { + } else if (action->mouse.moveActions & MouseMove_Right) { ActiveUsbMouseReport->x = distance; } + if (action->mouse.moveActions & MouseMove_Up) { ActiveUsbMouseReport->y = -distance; - } - if (action->mouse.moveActions & MouseMove_Down) { + } else if (action->mouse.moveActions & MouseMove_Down) { ActiveUsbMouseReport->y = distance; } } - ActiveUsbMouseReport->buttons |= action->mouse.buttonActions; + static float mouseScrollDistanceSum = 0; + if (action->mouse.scrollActions) { + mouseScrollDistanceSum += mouseScrollSpeed; + float mouseScrollDistanceIntegerSum; + float mouseScrollDistanceFractionSum = modff(mouseScrollDistanceSum, &mouseScrollDistanceIntegerSum); - wasPreviousMouseActionWheelAction = isWheelAction; + if (mouseScrollDistanceIntegerSum) { + if (action->mouse.scrollActions & MouseScroll_Up) { + ActiveUsbMouseReport->wheelX = mouseScrollDistanceIntegerSum; + } else if (action->mouse.scrollActions & MouseScroll_Down) { + ActiveUsbMouseReport->wheelX = -mouseScrollDistanceIntegerSum; + } + mouseScrollDistanceSum = mouseScrollDistanceFractionSum; + } + } else { + mouseScrollDistanceSum = 0; + } + + ActiveUsbMouseReport->buttons |= action->mouse.buttonActions; } static uint8_t basicScancodeIndex = 0;