Clean up processMouseAction() by using floats instead of divisor values. Move MouseSpeed_* into mouse_speed_action_t

This commit is contained in:
László Monda
2017-11-21 19:01:59 +01:00
parent 322ee0b35f
commit 4bbc49f4ca
4 changed files with 50 additions and 57 deletions

View File

@@ -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;

View File

@@ -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;

View File

@@ -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 },
} }
}, },

View File

@@ -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;