Initial implementation of mouse actions

This implements the mouse action handling. There is no acceleration while
holding the mouse movement keys yet, though, that will be a separate step.

Signed-off-by: Gergely Nagy <algernon@madhouse-project.org>
This commit is contained in:
Gergely Nagy
2016-12-15 18:30:51 +01:00
parent 21174c1b4f
commit 440c6d8ca8
3 changed files with 90 additions and 9 deletions

View File

@@ -1,6 +1,7 @@
#include "keyboard_layout.h"
#include "led_display.h"
#include "layer.h"
#include "usb_interface_mouse.h"
static uint8_t keyMasks[SLOT_COUNT][MAX_KEY_COUNT_PER_MODULE];
@@ -85,12 +86,89 @@ bool handleKey(uhk_key_t key, int scancodeIdx, usb_keyboard_report_t *report, co
LedDisplay_SetLayerLed(ActiveLayer);
return false;
break;
case UHK_KEY_MOUSE:
fillMouseReport(key, prevKeyStates, currKeyStates, keyId);
return false;
default:
break;
}
return false;
}
#define MOUSE_WHEEL_SPEED 1
#define MOUSE_WHEEL_DIVISOR 4
#define MOUSE_MAX_SPEED 10
#define MOUSE_SPEED_ACCEL_DIVISOR 50
static uint8_t mouseWheelDivisorCounter = 0;
static uint8_t mouseSpeedAccelDivisorCounter = 0;
static uint8_t mouseSpeed = 3;
static bool wasPreviousMouseActionWheelAction = false;
void HandleMouseKey(usb_mouse_report_t *report, uhk_key_t key, const uint8_t *prevKeyStates, const uint8_t *currKeyStates, uint8_t keyId)
{
bool isWheelAction;
if (!key_is_pressed(prevKeyStates, currKeyStates, keyId))
return;
isWheelAction = !!(key.mouse.scrollActions) && !(key.mouse.moveActions) && !(key.mouse.buttonActions);
if (isWheelAction && wasPreviousMouseActionWheelAction) {
mouseWheelDivisorCounter++;
}
if (key.mouse.scrollActions) {
if (mouseWheelDivisorCounter == MOUSE_WHEEL_DIVISOR) {
mouseWheelDivisorCounter = 0;
if (key.mouse.scrollActions & UHK_MOUSE_SCROLL_UP) {
report->wheelX = 1;
}
if (key.mouse.scrollActions & UHK_MOUSE_SCROLL_DOWN) {
report->wheelX = -1;
}
}
}
if (key.mouse.moveActions & UHK_MOUSE_ACCELERATE || key.mouse.moveActions & UHK_MOUSE_DECELERATE) {
mouseSpeedAccelDivisorCounter++;
if (mouseSpeedAccelDivisorCounter == MOUSE_SPEED_ACCEL_DIVISOR) {
mouseSpeedAccelDivisorCounter = 0;
if (key.mouse.moveActions & UHK_MOUSE_ACCELERATE) {
if (mouseSpeed < MOUSE_MAX_SPEED) {
mouseSpeed++;
}
}
if (key.mouse.moveActions & UHK_MOUSE_DECELERATE) {
if (mouseSpeed > 1) {
mouseSpeed--;
}
}
}
} else if (key.mouse.moveActions) {
if (key.mouse.moveActions & UHK_MOUSE_MOVE_LEFT) {
report->x = -mouseSpeed;
}
if (key.mouse.moveActions & UHK_MOUSE_MOVE_RIGHT) {
report->x = mouseSpeed;
}
if (key.mouse.moveActions & UHK_MOUSE_MOVE_UP) {
report->y = -mouseSpeed;
}
if (key.mouse.moveActions & UHK_MOUSE_MOVE_DOWN) {
report->y = mouseSpeed;
}
}
report->buttons |= key.mouse.buttonActions;
wasPreviousMouseActionWheelAction = isWheelAction;
}
void fillKeyboardReport(usb_keyboard_report_t *report, const uint8_t *leftKeyStates, const uint8_t *rightKeyStates) {
int scancodeIdx = 0;

View File

@@ -101,5 +101,7 @@ extern uint8_t prevKeyStates[SLOT_COUNT][MAX_KEY_COUNT_PER_MODULE];
extern uhk_key_t CurrentKeymap[LAYER_COUNT][SLOT_COUNT][MAX_KEY_COUNT_PER_MODULE];
void fillKeyboardReport(usb_keyboard_report_t *report, const uint8_t *leftKeyStates, const uint8_t *rightKeyStates);
void HandleMouseKey(usb_mouse_report_t *report, uhk_key_t key, const uint8_t *prevKeyStates, const uint8_t *currKeyStates, uint8_t keyId);
extern void fillMouseReport(uhk_key_t key, const uint8_t *prevKeyStates, const uint8_t *currKeyStates, uint8_t keyId);
#endif

View File

@@ -3,6 +3,7 @@
#include "fsl_i2c.h"
#include "i2c.h"
#include "reset_button.h"
#include "keyboard_layout.h"
static usb_device_endpoint_struct_t UsbMouseEndpoints[USB_MOUSE_ENDPOINT_COUNT] = {{
USB_MOUSE_ENDPOINT_INDEX | (USB_IN << USB_DESCRIPTOR_ENDPOINT_ADDRESS_DIRECTION_SHIFT),
@@ -38,23 +39,23 @@ usb_device_class_struct_t UsbMouseClass = {
static usb_mouse_report_t UsbMouseReport;
static uint8_t scrollCounter = 0;
static volatile usb_status_t UsbMouseAction(void)
{
usb_status_t ret;
ret = USB_DeviceHidSend(UsbCompositeDevice.mouseHandle, USB_MOUSE_ENDPOINT_INDEX,
(uint8_t*)&UsbMouseReport, USB_MOUSE_REPORT_LENGTH);
UsbMouseReport.buttons = 0;
UsbMouseReport.x = 0;
UsbMouseReport.y = 0;
UsbMouseReport.wheelX = 0;
UsbMouseReport.wheelY = 0;
if (RESET_BUTTON_IS_PRESSED) {
if (!(scrollCounter % 10)) {
UsbMouseReport.wheelX = -1;
}
}
scrollCounter++;
return USB_DeviceHidSend(UsbCompositeDevice.mouseHandle, USB_MOUSE_ENDPOINT_INDEX,
(uint8_t*)&UsbMouseReport, USB_MOUSE_REPORT_LENGTH);
return ret;
}
void fillMouseReport(uhk_key_t key, const uint8_t *prevKeyStates, const uint8_t *currKeyStates, uint8_t keyId)
{
HandleMouseKey(&UsbMouseReport, key, prevKeyStates, currKeyStates, keyId);
}
usb_status_t UsbMouseCallback(class_handle_t handle, uint32_t event, void *param)