Extract code into processMouseKineticState() and add mouse_kinetic_state_t

This commit is contained in:
László Monda
2017-11-26 21:35:50 +01:00
parent 5df6220ab7
commit ebbd74407d
2 changed files with 75 additions and 42 deletions

View File

@@ -21,76 +21,89 @@ static uint32_t elapsedTime;
static uint16_t doubleTapSwitchLayerTimeout = 300;
static float mouseMoveInitialSpeed = 1;
static float mouseMoveAcceleration = 3;
static float mouseMoveDeceleratedSpeed = 2.5;
static float mouseMoveBaseSpeed = 5;
static float mouseMoveAcceleratedSpeed = 10;
static float mouseScrollSpeed = 0.1;
static bool wasMoveAction;
static mouse_speed_t prevMouseSpeed = MouseSpeed_Normal;
static bool activeMouseStates[ACTIVE_MOUSE_STATES_COUNT];
void processMouseActions()
{
static float mouseMoveCurrentSpeed;
static mouse_kinetic_state_t mouseMoveState = {
.upState = SerializedMouseAction_MoveUp,
.downState = SerializedMouseAction_MoveDown,
.leftState = SerializedMouseAction_MoveLeft,
.rightState = SerializedMouseAction_MoveRight,
.initialSpeed = 1,
.acceleration = 3,
.deceleratedSpeed = 2.5,
.baseSpeed = 5,
.acceleratedSpeed = 10,
};
//static mouse_kinetic_state_t mouseScrollState;
if (!wasMoveAction) {
mouseMoveCurrentSpeed = mouseMoveInitialSpeed;
void processMouseKineticState(mouse_kinetic_state_t *kineticState)
{
if (!kineticState->wasMoveAction) {
kineticState->currentSpeed = kineticState->initialSpeed;
}
bool isMoveAction = activeMouseStates[SerializedMouseAction_MoveUp] ||
activeMouseStates[SerializedMouseAction_MoveDown] ||
activeMouseStates[SerializedMouseAction_MoveLeft] ||
activeMouseStates[SerializedMouseAction_MoveRight];
bool isMoveAction = activeMouseStates[kineticState->upState] ||
activeMouseStates[kineticState->downState] ||
activeMouseStates[kineticState->leftState] ||
activeMouseStates[kineticState->rightState];
float targetSpeed;
mouse_speed_t mouseSpeed = MouseSpeed_Normal;
if (activeMouseStates[SerializedMouseAction_Accelerate]) {
targetSpeed = mouseMoveAcceleratedSpeed;
kineticState->targetSpeed = kineticState->acceleratedSpeed;
mouseSpeed = MouseSpeed_Accelerated;
} else if (activeMouseStates[SerializedMouseAction_Decelerate]) {
targetSpeed = mouseMoveDeceleratedSpeed;
kineticState->targetSpeed = kineticState->deceleratedSpeed;
mouseSpeed = MouseSpeed_Decelerated;
} else if (isMoveAction) {
targetSpeed = mouseMoveBaseSpeed;
kineticState->targetSpeed = kineticState->baseSpeed;
}
if (mouseSpeed == MouseSpeed_Accelerated || (wasMoveAction && isMoveAction && (prevMouseSpeed != mouseSpeed))) {
mouseMoveCurrentSpeed = targetSpeed;
if (mouseSpeed == MouseSpeed_Accelerated || (kineticState->wasMoveAction && isMoveAction && (kineticState->prevMouseSpeed != mouseSpeed))) {
kineticState->currentSpeed = kineticState->targetSpeed;
}
if (isMoveAction) {
if (mouseMoveCurrentSpeed < targetSpeed) {
mouseMoveCurrentSpeed += mouseMoveAcceleration * elapsedTime / 1000;
if (mouseMoveCurrentSpeed > targetSpeed) {
mouseMoveCurrentSpeed = targetSpeed;
if (kineticState->currentSpeed < kineticState->targetSpeed) {
kineticState->currentSpeed += kineticState->acceleration * elapsedTime / 1000;
if (kineticState->currentSpeed > kineticState->targetSpeed) {
kineticState->currentSpeed = kineticState->targetSpeed;
}
} else {
mouseMoveCurrentSpeed -= mouseMoveAcceleration * elapsedTime / 1000;
if (mouseMoveCurrentSpeed < targetSpeed) {
mouseMoveCurrentSpeed = targetSpeed;
kineticState->currentSpeed -= kineticState->acceleration * elapsedTime / 1000;
if (kineticState->currentSpeed < kineticState->targetSpeed) {
kineticState->currentSpeed = kineticState->targetSpeed;
}
}
uint16_t distance = mouseMoveCurrentSpeed * elapsedTime / 10;
uint16_t distance = kineticState->currentSpeed * elapsedTime / 10;
if (activeMouseStates[SerializedMouseAction_MoveLeft]) {
ActiveUsbMouseReport->x = -distance;
} else if (activeMouseStates[SerializedMouseAction_MoveRight]) {
ActiveUsbMouseReport->x = distance;
if (activeMouseStates[kineticState->leftState]) {
kineticState->x = -distance;
} else if (activeMouseStates[kineticState->rightState]) {
kineticState->x = distance;
}
if (activeMouseStates[SerializedMouseAction_MoveUp]) {
ActiveUsbMouseReport->y = -distance;
} else if (activeMouseStates[SerializedMouseAction_MoveDown]) {
ActiveUsbMouseReport->y = distance;
if (activeMouseStates[kineticState->upState]) {
kineticState->y = -distance;
} else if (activeMouseStates[kineticState->downState]) {
kineticState->y = distance;
}
}
kineticState->prevMouseSpeed = mouseSpeed;
kineticState->wasMoveAction = isMoveAction;
}
void processMouseActions()
{
processMouseKineticState(&mouseMoveState);
ActiveUsbMouseReport->x = mouseMoveState.x;
ActiveUsbMouseReport->y = mouseMoveState.y;
mouseMoveState.x = 0;
mouseMoveState.y = 0;
bool isScrollAction = activeMouseStates[SerializedMouseAction_ScrollUp] ||
activeMouseStates[SerializedMouseAction_ScrollDown] ||
activeMouseStates[SerializedMouseAction_ScrollLeft] ||
@@ -130,8 +143,6 @@ void processMouseActions()
ActiveUsbMouseReport->buttons |= MouseButton_Right;
}
prevMouseSpeed = mouseSpeed;
wasMoveAction = isMoveAction;
}
static layer_id_t previousLayer = LayerId_Base;

View File

@@ -1,6 +1,10 @@
#ifndef __USB_REPORT_UPDATER_H__
#define __USB_REPORT_UPDATER_H__
// Includes:
#include "config_parser/parse_keymap.h"
// Macros:
#define ACTIVE_MOUSE_STATES_COUNT (SerializedMouseAction_Last + 1)
@@ -38,6 +42,24 @@
MouseSpeed_Decelerated,
} mouse_speed_t;
typedef struct {
bool wasMoveAction;
serialized_mouse_action_t upState;
serialized_mouse_action_t downState;
serialized_mouse_action_t leftState;
serialized_mouse_action_t rightState;
mouse_speed_t prevMouseSpeed;
float currentSpeed;
float targetSpeed;
float initialSpeed;
float acceleration;
float deceleratedSpeed;
float baseSpeed;
float acceleratedSpeed;
int16_t x;
int16_t y;
} mouse_kinetic_state_t;
// Functions:
void UpdateUsbReports(void);