From 8429ee2b716b9709f768a3d1eaef96fc3179623c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A1szl=C3=B3=20Monda?= Date: Tue, 21 Nov 2017 21:15:12 +0100 Subject: [PATCH] Implement mouse acceleration. --- right/src/key_action.h | 4 ++-- right/src/usb_report_updater.c | 23 +++++++++++++++++++++-- 2 files changed, 23 insertions(+), 4 deletions(-) diff --git a/right/src/key_action.h b/right/src/key_action.h index 2170abc..245fb7c 100644 --- a/right/src/key_action.h +++ b/right/src/key_action.h @@ -1,5 +1,5 @@ -#ifndef __ACTION_H__ -#define __ACTION_H__ +#ifndef __KEY_ACTION_H__ +#define __KEY_ACTION_H__ // Includes: diff --git a/right/src/usb_report_updater.c b/right/src/usb_report_updater.c index 6cf6607..1762e47 100644 --- a/right/src/usb_report_updater.c +++ b/right/src/usb_report_updater.c @@ -19,7 +19,9 @@ uint32_t UsbReportUpdateTime = 0; static uint32_t elapsedTime; static float mouseMoveSpeed = 0.4; -static float mouseMoveMaxSpeed = 10; +static float mouseMoveInitialSpeed = 1; +static float mouseMoveAcceleration = 5; +static float mouseMoveMaxSpeed = 5; static float mouseScrollSpeed = 0.1; static float mouseScrollMaxSpeed = 0.1; @@ -27,9 +29,16 @@ static float mouseScrollMaxSpeed = 0.1; static float mouseAccelerateFactor = 2; static float mouseDecelerateFactor = 0.5; +static bool isMouseActionProcessed; +static bool wasMouseActionProcessed; void processMouseAction(key_action_t *action) { - uint16_t distance = mouseMoveSpeed * elapsedTime; + static float mouseMoveCurrentSpeed; + + isMouseActionProcessed = true; + if (!wasMouseActionProcessed) { + mouseMoveCurrentSpeed = mouseMoveInitialSpeed; + } if (action->mouse.speedActions) { if (action->mouse.speedActions & MouseSpeed_Accelerate) { @@ -44,6 +53,13 @@ void processMouseAction(key_action_t *action) } if (action->mouse.moveActions) { + mouseMoveCurrentSpeed += mouseMoveAcceleration * elapsedTime / 1000; + if (mouseMoveCurrentSpeed > mouseMoveMaxSpeed) { + mouseMoveCurrentSpeed = mouseMoveMaxSpeed; + } + + uint16_t distance = mouseMoveCurrentSpeed * elapsedTime / 10; + if (action->mouse.moveActions & MouseMove_Left) { ActiveUsbMouseReport->x = -distance; } else if (action->mouse.moveActions & MouseMove_Right) { @@ -132,6 +148,9 @@ static secondary_role_t secondaryRole; void updateActiveUsbReports(void) { + wasMouseActionProcessed = isMouseActionProcessed; + isMouseActionProcessed = false; + static uint8_t previousModifiers = 0; elapsedTime = Timer_GetElapsedTime(&UsbReportUpdateTime);