Clean up processMouseAction() by using floats instead of divisor values. Move MouseSpeed_* into mouse_speed_action_t
This commit is contained in:
@@ -121,10 +121,10 @@ static parser_error_t parseMouseAction(key_action_t *keyAction, config_buffer_t
|
|||||||
keyAction->mouse.scrollActions = MouseScroll_Right;
|
keyAction->mouse.scrollActions = MouseScroll_Right;
|
||||||
break;
|
break;
|
||||||
case SerializedMouseAction_Accelerate:
|
case SerializedMouseAction_Accelerate:
|
||||||
keyAction->mouse.moveActions = MouseMove_Accelerate;
|
keyAction->mouse.speedActions = MouseSpeed_Accelerate;
|
||||||
break;
|
break;
|
||||||
case SerializedMouseAction_Decelerate:
|
case SerializedMouseAction_Decelerate:
|
||||||
keyAction->mouse.moveActions = MouseMove_Decelerate;
|
keyAction->mouse.speedActions = MouseSpeed_Decelerate;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
return ParserError_InvalidSerializedMouseAction;
|
return ParserError_InvalidSerializedMouseAction;
|
||||||
|
|||||||
@@ -9,14 +9,6 @@
|
|||||||
#include "usb_composite_device.h"
|
#include "usb_composite_device.h"
|
||||||
#include "module.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:
|
// Typedefs:
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
@@ -49,11 +41,13 @@
|
|||||||
MouseMove_Down = 1 << 1,
|
MouseMove_Down = 1 << 1,
|
||||||
MouseMove_Left = 1 << 2,
|
MouseMove_Left = 1 << 2,
|
||||||
MouseMove_Right = 1 << 3,
|
MouseMove_Right = 1 << 3,
|
||||||
|
|
||||||
MouseMove_Accelerate = 1 << 4,
|
|
||||||
MouseMove_Decelerate = 1 << 5,
|
|
||||||
} mouse_move_action_t;
|
} mouse_move_action_t;
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
MouseSpeed_Accelerate = 1 << 0,
|
||||||
|
MouseSpeed_Decelerate = 1 << 1,
|
||||||
|
} mouse_speed_action_t;
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
MouseScroll_Up = 1 << 0,
|
MouseScroll_Up = 1 << 0,
|
||||||
MouseScroll_Down = 1 << 1,
|
MouseScroll_Down = 1 << 1,
|
||||||
@@ -74,6 +68,7 @@
|
|||||||
mouse_button_t buttonActions;
|
mouse_button_t buttonActions;
|
||||||
mouse_scroll_t scrollActions;
|
mouse_scroll_t scrollActions;
|
||||||
mouse_move_action_t moveActions;
|
mouse_move_action_t moveActions;
|
||||||
|
mouse_speed_action_t speedActions;
|
||||||
} ATTR_PACKED mouse;
|
} ATTR_PACKED mouse;
|
||||||
struct {
|
struct {
|
||||||
bool isToggle;
|
bool isToggle;
|
||||||
|
|||||||
@@ -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_GUI }},
|
||||||
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_LEFT_ALT }},
|
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_LEFT_ALT }},
|
||||||
{ .type = KeyActionType_None },
|
{ .type = KeyActionType_None },
|
||||||
{ .type = KeyActionType_Mouse, .mouse = { .moveActions = MouseMove_Decelerate }},
|
{ .type = KeyActionType_Mouse, .mouse = { .speedActions = MouseSpeed_Decelerate }},
|
||||||
{ .type = KeyActionType_Mouse, .mouse = { .moveActions = MouseMove_Accelerate }},
|
{ .type = KeyActionType_Mouse, .mouse = { .speedActions = MouseSpeed_Accelerate }},
|
||||||
{ .type = KeyActionType_None },
|
{ .type = KeyActionType_None },
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
#include <math.h>
|
||||||
#include "key_action.h"
|
#include "key_action.h"
|
||||||
#include "led_display.h"
|
#include "led_display.h"
|
||||||
#include "layer.h"
|
#include "layer.h"
|
||||||
@@ -15,69 +16,66 @@
|
|||||||
#include "key_debouncer.h"
|
#include "key_debouncer.h"
|
||||||
|
|
||||||
uint32_t UsbReportUpdateTime = 0;
|
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 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)
|
void processMouseAction(key_action_t *action)
|
||||||
{
|
{
|
||||||
bool isWheelAction = action->mouse.scrollActions && !action->mouse.moveActions && !action->mouse.buttonActions;
|
uint16_t distance = mouseMoveSpeed * elapsedTime;
|
||||||
uint16_t distance = mouseSpeed * elapsedTime / 25;
|
|
||||||
|
|
||||||
if (isWheelAction && wasPreviousMouseActionWheelAction) {
|
if (action->mouse.speedActions) {
|
||||||
mouseWheelDivisorCounter++;
|
if (action->mouse.speedActions & MouseSpeed_Accelerate) {
|
||||||
}
|
if (mouseMoveSpeed < mouseMoveMaxSpeed) {
|
||||||
|
mouseMoveSpeed++;
|
||||||
if (action->mouse.scrollActions) {
|
|
||||||
if (mouseWheelDivisorCounter == MOUSE_WHEEL_DIVISOR) {
|
|
||||||
mouseWheelDivisorCounter = 0;
|
|
||||||
if (action->mouse.scrollActions & MouseScroll_Up) {
|
|
||||||
ActiveUsbMouseReport->wheelX = 1;
|
|
||||||
}
|
}
|
||||||
if (action->mouse.scrollActions & MouseScroll_Down) {
|
} else if (action->mouse.speedActions & MouseSpeed_Decelerate) {
|
||||||
ActiveUsbMouseReport->wheelX = -1;
|
if (mouseMoveSpeed > 1) {
|
||||||
|
mouseMoveSpeed--;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (action->mouse.moveActions & MouseMove_Accelerate || action->mouse.moveActions & MouseMove_Decelerate) {
|
if (action->mouse.moveActions) {
|
||||||
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 & MouseMove_Left) {
|
if (action->mouse.moveActions & MouseMove_Left) {
|
||||||
ActiveUsbMouseReport->x = -distance;
|
ActiveUsbMouseReport->x = -distance;
|
||||||
}
|
} else if (action->mouse.moveActions & MouseMove_Right) {
|
||||||
if (action->mouse.moveActions & MouseMove_Right) {
|
|
||||||
ActiveUsbMouseReport->x = distance;
|
ActiveUsbMouseReport->x = distance;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (action->mouse.moveActions & MouseMove_Up) {
|
if (action->mouse.moveActions & MouseMove_Up) {
|
||||||
ActiveUsbMouseReport->y = -distance;
|
ActiveUsbMouseReport->y = -distance;
|
||||||
}
|
} else if (action->mouse.moveActions & MouseMove_Down) {
|
||||||
if (action->mouse.moveActions & MouseMove_Down) {
|
|
||||||
ActiveUsbMouseReport->y = distance;
|
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;
|
static uint8_t basicScancodeIndex = 0;
|
||||||
|
|||||||
Reference in New Issue
Block a user