From bb7faaa79995c0c03b26a02a8953b8e8b3bc4f26 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A1szl=C3=B3=20Monda?= Date: Fri, 24 Nov 2017 22:49:39 +0100 Subject: [PATCH] Make non-accelerated movements gradually accelerate from the start. Make all other movements and speed transitions immediate. --- right/src/usb_report_updater.c | 20 +++++++++++++------- right/src/usb_report_updater.h | 6 ++++++ 2 files changed, 19 insertions(+), 7 deletions(-) diff --git a/right/src/usb_report_updater.c b/right/src/usb_report_updater.c index 304f3cd..31c3cbf 100644 --- a/right/src/usb_report_updater.c +++ b/right/src/usb_report_updater.c @@ -27,8 +27,8 @@ static float mouseMoveDeceleratedSpeed = 2.5; static float mouseScrollSpeed = 0.1; -static bool isMouseMoving; -static bool wasMouseMoving; +static bool wasMoveAction; +static mouse_speed_t prevMouseSpeed = MouseSpeed_Normal; static bool activeMouseStates[ACTIVE_MOUSE_STATES_COUNT]; @@ -36,7 +36,7 @@ void processMouseActions() { static float mouseMoveCurrentSpeed; - if (!wasMouseMoving) { + if (!wasMoveAction) { mouseMoveCurrentSpeed = mouseMoveInitialSpeed; } @@ -46,17 +46,22 @@ void processMouseActions() activeMouseStates[SerializedMouseAction_MoveRight]; float targetSpeed; + mouse_speed_t mouseSpeed = MouseSpeed_Normal; if (activeMouseStates[SerializedMouseAction_Accelerate]) { targetSpeed = mouseMoveAcceleratedSpeed; + mouseSpeed = MouseSpeed_Accelerated; } else if (activeMouseStates[SerializedMouseAction_Decelerate]) { targetSpeed = mouseMoveDeceleratedSpeed; + mouseSpeed = MouseSpeed_Decelerated; } else if (isMoveAction) { targetSpeed = mouseMoveBaseSpeed; } - if (isMoveAction) { - isMouseMoving = true; + if (mouseSpeed == MouseSpeed_Accelerated || (wasMoveAction && isMoveAction && (prevMouseSpeed != mouseSpeed))) { + mouseMoveCurrentSpeed = targetSpeed; + } + if (isMoveAction) { if (mouseMoveCurrentSpeed < targetSpeed) { mouseMoveCurrentSpeed += mouseMoveBaseAcceleration * elapsedTime / 1000; if (mouseMoveCurrentSpeed > targetSpeed) { @@ -122,6 +127,9 @@ void processMouseActions() if (activeMouseStates[SerializedMouseAction_RightClick]) { ActiveUsbMouseReport->buttons |= MouseButton_Right; } + + prevMouseSpeed = mouseSpeed; + wasMoveAction = isMoveAction; } static uint8_t basicScancodeIndex = 0; @@ -179,8 +187,6 @@ static secondary_role_t secondaryRole; void updateActiveUsbReports(void) { memset(activeMouseStates, 0, ACTIVE_MOUSE_STATES_COUNT); - wasMouseMoving = isMouseMoving; - isMouseMoving = false; static uint8_t previousModifiers = 0; elapsedTime = Timer_GetElapsedTime(&UsbReportUpdateTime); diff --git a/right/src/usb_report_updater.h b/right/src/usb_report_updater.h index 2bc8ba0..4fee195 100644 --- a/right/src/usb_report_updater.h +++ b/right/src/usb_report_updater.h @@ -32,6 +32,12 @@ SecondaryRole_Mouse } secondary_role_t; + typedef enum { + MouseSpeed_Normal, + MouseSpeed_Accelerated, + MouseSpeed_Decelerated, + } mouse_speed_t; + // Functions: void UpdateUsbReports(void);