47 Commits

Author SHA1 Message Date
László Monda
0d6a5ae902 Bump firmware version number to 5.0.1 and update changelog. 2017-12-09 16:44:11 +01:00
László Monda
2f7f7b1cd2 Make scrolling immediately react to keypresses regardless of the previous internal scroll state. 2017-12-07 04:44:45 +01:00
László Monda
2eb25ce05c Make UpdateUsbReports() not exit prematurely even if a previously active USB interface is not polled anymore by the host. Tweak the Timer API to not set the current time automatically. 2017-12-07 03:24:53 +01:00
László Monda
6e47707037 Rename the misleadingly named error variable of usbDeviceCallback() to status. Clean up InitUsb() a bit. 2017-12-05 00:56:52 +01:00
László Monda
0932c14a2c Lowercamelcase UsbDeviceCallback because it's local. 2017-12-04 22:51:04 +01:00
László Monda
e57c2c21ca Don't define the NULL members of UsbDeviceCompositeConfigList. 2017-12-04 20:43:57 +01:00
László Monda
a5ce90779c Merge all the substructures of UsbDeviceCompositeConfigList across different files to a single structure. 2017-12-04 20:41:22 +01:00
László Monda
e9bf3dc355 Expand UsbDeviceCompositeClassConfig and UsbDeviceCompositeConfigList using structure member names. 2017-12-04 20:05:28 +01:00
László Monda
8cb8654459 Merge the substructures of UsbMouseClass into a single structure. 2017-12-04 19:57:43 +01:00
László Monda
745e8e1cf0 Merge the substructures of UsbSystemKeyboardClass into a single structure. 2017-12-04 19:50:39 +01:00
László Monda
5341109845 Merge the substructures of UsbMediaKeyboardClass into a single structure. 2017-12-04 19:41:51 +01:00
László Monda
ff0e5b0aa3 Merge the structs of UsbBasicKeyboardClass into a single structure. 2017-12-04 19:33:53 +01:00
László Monda
c4e79d8ed2 Merge the all the structures of UsbGenericHidClass into a single structure. 2017-12-04 19:16:04 +01:00
László Monda
6780c8177c Expose per-interface count values for debugging purposes via USB. 2017-12-04 17:38:31 +01:00
László Monda
71d6db0f35 Update CHANGELOG.md and package.json for version 5.0.0 2017-12-04 00:40:07 +01:00
László Monda
9b9bdbc03d Rename baseLayerPointerFunction to modLayerPointerFunction and modLayerPointerFunction to fnLayerPointerFunction. Suppress unused variable compilation warnings. 2017-12-03 23:53:32 +01:00
László Monda
bb5c118e97 Move pointerRole from keymaps to module configurations as pointerMode. Add angularShift, baseLayerPointerFunction, modLayerPointerFunction, and mouseLayerPointerFunction to module configurations. 2017-12-03 23:25:55 +01:00
László Monda
b3cbb8ea97 Bump version to 4.0.0 2017-11-30 20:31:09 +01:00
László Monda
f76780ec48 Make the parser parse mouse properties, LED brightness values, and double tap switch layer timeout. Rename pointer config properties. 2017-11-30 18:20:00 +01:00
László Monda
b7e73b7b38 Clean up the debug lines of processMouseAction() 2017-11-28 22:45:51 +01:00
László Monda
7318175ce7 Tweak scroll kinetic properties. 2017-11-28 22:39:37 +01:00
László Monda
420078449d Finish the fine-tuning of default mouse movement kinetic settings. 2017-11-28 20:12:01 +01:00
László Monda
dda3799877 Don't make the pointer jump when accelerating from zero while the decelerate key is pressed. 2017-11-28 19:10:13 +01:00
László Monda
712b87182a Double timer interval that wasn't right for an unknown reason. Adjust mouse kinetic values accordingly. Reprioritize interrupts to make mouse pointer movement as smooth as possible. 2017-11-28 18:52:39 +01:00
László Monda
46126e1e78 Tweak kinetic mouse values further. Temporarily maximize / minimize the acceleratedSpeed / deceleratedSpeed values for testing purposes. 2017-11-28 17:25:46 +01:00
László Monda
2ac9ca5d67 Make the initialSpeed, acceleration, deceleratedSpeed, baseSpeed, and acceleratedSpeed kinetic properties uint8_t and multiply them by intMultiplier to provide a fixed set of steps to choose from. 2017-11-28 03:23:09 +01:00
László Monda
729e0be0ad Make scrolling utilize mouse_kinetic_state_t, just like mouse movements. Fix scrolling issue by making distance float. Add new debug functions for ints and float. 2017-11-28 02:01:26 +01:00
László Monda
0867132ba3 Adjust the distance divisor from 10 to 1000 and other kinetic values accordingly. 2017-11-27 02:09:45 +01:00
László Monda
1b9273a5e5 Make processMouseKineticState() work with float x,y offsets to accumulate fractions. 2017-11-27 01:24:03 +01:00
László Monda
ebbd74407d Extract code into processMouseKineticState() and add mouse_kinetic_state_t 2017-11-26 21:35:50 +01:00
László Monda
5df6220ab7 Slightly reorder mouse movement related variables. 2017-11-26 02:32:53 +01:00
László Monda
3d0993998c Add double tap switch layer timeout. 2017-11-26 01:05:36 +01:00
László Monda
071be7e815 Implement "hold and double tap" layer switch mode and temporarily treat every hold mode keys this way. 2017-11-26 00:23:50 +01:00
László Monda
bb7faaa799 Make non-accelerated movements gradually accelerate from the start. Make all other movements and speed transitions immediate. 2017-11-24 22:49:39 +01:00
László Monda
368c724e6a Fix the stuck state of the decelerate key that triggered once it was pressed. 2017-11-24 17:39:45 +01:00
László Monda
210ef31f27 Implement mouse movement acceleration and deceleration. 2017-11-24 13:00:05 +01:00
László Monda
0cb3c7e0ad Implement horizontal scrolling. 2017-11-24 01:00:02 +01:00
László Monda
ab7e25692a Use hex numbers as the values of UsbCommandId_* 2017-11-23 04:18:37 +01:00
László Monda
b68e8a736e Make processMouseAction() handle acceleration and deceleration, even though I can't yet trigger these actions for some reason. 2017-11-23 01:54:54 +01:00
László Monda
4d211f0fe1 Reset mouseMoveCurrentSpeed when the mouse movement keys are no longer pressed, even if a mouse button key stays pressed due to drag and drop or selection purposes. 2017-11-22 02:34:37 +01:00
László Monda
8429ee2b71 Implement mouse acceleration. 2017-11-21 21:15:12 +01:00
László Monda
4bbc49f4ca Clean up processMouseAction() by using floats instead of divisor values. Move MouseSpeed_* into mouse_speed_action_t 2017-11-21 19:01:59 +01:00
László Monda
322ee0b35f Rename the misnamed MouseButton_t to MouseButton_6 2017-11-21 16:42:27 +01:00
László Monda
8252da86d8 Rename some files and identifiers that are related to USB commands. 2017-11-18 03:30:24 +01:00
László Monda
086ab239b4 Fix the previously introduced EEPROM read bug by making addressBuffer static. Rename EEPROM_ADDRESS_LENGTH to EEPROM_ADDRESS_SIZE. 2017-11-18 03:18:37 +01:00
László Monda
a7ba0add18 Simplify eeprom.c 2017-11-18 03:11:17 +01:00
László Monda
d2ef63184b Move updateUsbReports() from main.c to usb_report_updater.c and delete main.h 2017-11-17 01:21:30 +01:00
49 changed files with 835 additions and 612 deletions

View File

@@ -5,6 +5,27 @@ All notable changes to this project will be documented in this file.
The format is loosely based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) The format is loosely based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/)
and this project adheres to the [UHK Versioning](VERSIONING.md) conventions. and this project adheres to the [UHK Versioning](VERSIONING.md) conventions.
## [5.0.1] - 2017-12-09
Data Model: 4.0.0 (unchanged) | USB Protocol: 2.0.0 (unchanged) | Slave Protocol: 3.0.0 (unchanged)
- Make key presses continue to emit scancodes even if a USB interface (typically the mouse interface) is not polled by the host anymore.
- Make scrolling always immediately react to keypresses regardless of the previous internal scroll state.
## [5.0.0] - 2017-12-04
Data Model: 4.0.0 (major bump) | USB Protocol: 2.0.0 (unchanged) | Slave Protocol: 3.0.0 (unchanged)
- Move pointerRole from keymaps to module configurations as pointerMode. Add angularShift, modLayerPointerFunction, fnLayerPointerFunction, and mouseLayerPointerFunction to module configurations. `DATAMODEL:MAJOR`
## [4.0.0] - 2017-11-30
Data Model: 3.0.0 (major bump) | USB Protocol: 2.0.0 (unchanged) | Slave Protocol: 3.0.0 (unchanged)
- Implement mouse movement and scrolling deceleration and acceleration.
- Toggle layers upon double tapping their keys. Make the double tap timeout configurable.
- Make the parser read additional user configuration properties: dataModelMajorVersion, dataModelMinorVersion, dataModelPatchVersion, doubleTapSwitchLayerTimeout, iconsAndLayerTextsBrightness, alphanumericSegmentsBrightness, keyBacklightBrightness, mouseMoveInitialSpeed, mouseMoveAcceleration, mouseMoveDeceleratedSpeed, mouseMoveBaseSpeed, mouseMoveAcceleratedSpeed, mouseScrollInitialSpeed, mouseScrollAcceleration, mouseScrollDeceleratedSpeed, mouseScrollBaseSpeed, mouseScrollAcceleratedSpeed. `DATAMODEL:MAJOR`
## [3.0.0] - 2017-11-15 ## [3.0.0] - 2017-11-15
Data Model: 2.0.0 (major bump) | USB Protocol: 2.0.0 (major bump) | Slave Protocol: 3.0.0 (major bump) Data Model: 2.0.0 (major bump) | USB Protocol: 2.0.0 (major bump) | Slave Protocol: 3.0.0 (major bump)

View File

@@ -8,7 +8,6 @@ uint8_t ReadUInt8(config_buffer_t *buffer)
uint16_t ReadUInt16(config_buffer_t *buffer) uint16_t ReadUInt16(config_buffer_t *buffer)
{ {
uint16_t uInt16 = ReadUInt8(buffer); uint16_t uInt16 = ReadUInt8(buffer);
uInt16 |= ReadUInt8(buffer) << 8; uInt16 |= ReadUInt8(buffer) << 8;
return uInt16; return uInt16;
} }
@@ -26,14 +25,12 @@ bool ReadBool(config_buffer_t *buffer)
uint16_t ReadCompactLength(config_buffer_t *buffer) uint16_t ReadCompactLength(config_buffer_t *buffer)
{ {
uint16_t compactLength = ReadUInt8(buffer); uint16_t compactLength = ReadUInt8(buffer);
return compactLength == 0xFF ? ReadUInt16(buffer) : compactLength; return compactLength == 0xFF ? ReadUInt16(buffer) : compactLength;
} }
const char *ReadString(config_buffer_t *buffer, uint16_t *len) const char *ReadString(config_buffer_t *buffer, uint16_t *len)
{ {
const char *string; const char *string;
*len = ReadCompactLength(buffer); *len = ReadCompactLength(buffer);
string = (const char *)(buffer->buffer + buffer->offset); string = (const char *)(buffer->buffer + buffer->offset);
buffer->offset += *len; buffer->offset += *len;

View File

@@ -4,35 +4,95 @@
#include "keymap.h" #include "keymap.h"
#include "config_globals.h" #include "config_globals.h"
#include "macros.h" #include "macros.h"
#include "usb_report_updater.h"
static parser_error_t parseModuleConfiguration(config_buffer_t *buffer) static parser_error_t parseModuleConfiguration(config_buffer_t *buffer)
{ {
uint8_t id = ReadUInt8(buffer); uint8_t id = ReadUInt8(buffer);
uint8_t initialPointerSpeed = ReadUInt8(buffer); uint8_t pointerMode = ReadUInt8(buffer); // move vs scroll
uint8_t pointerAcceleration = ReadUInt8(buffer); uint8_t deceleratedPointerSpeedMultiplier = ReadUInt8(buffer);
uint8_t maxPointerSpeed = ReadUInt8(buffer); uint8_t basePointerSpeedMultiplier = ReadUInt8(buffer);
uint8_t acceleratedPointerSpeed = ReadUInt8(buffer);
uint16_t angularShift = ReadUInt16(buffer);
uint8_t modLayerPointerFunction = ReadUInt8(buffer); // none vs invertMode vs decelerate vs accelerate
uint8_t fnLayerPointerFunction = ReadUInt8(buffer); // none vs invertMode vs decelerate vs accelerate
uint8_t mouseLayerPointerFunction = ReadUInt8(buffer); // none vs invertMode vs decelerate vs accelerate
(void)id; (void)id;
(void)initialPointerSpeed; (void)pointerMode;
(void)pointerAcceleration; (void)deceleratedPointerSpeedMultiplier;
(void)maxPointerSpeed; (void)basePointerSpeedMultiplier;
(void)acceleratedPointerSpeed;
(void)angularShift;
(void)modLayerPointerFunction;
(void)fnLayerPointerFunction;
(void)mouseLayerPointerFunction;
return ParserError_Success; return ParserError_Success;
} }
parser_error_t ParseConfig(config_buffer_t *buffer) parser_error_t ParseConfig(config_buffer_t *buffer)
{ {
// Miscellaneous properties
uint16_t len; uint16_t len;
uint16_t macroCount; uint16_t macroCount;
uint16_t keymapCount; uint16_t keymapCount;
parser_error_t errorCode; parser_error_t errorCode;
uint16_t dataModelVersion = ReadUInt16(buffer); uint16_t dataModelMajorVersion = ReadUInt16(buffer);
uint16_t dataModelMinorVersion = ReadUInt16(buffer);
uint16_t dataModelPatchVersion = ReadUInt16(buffer);
uint16_t userConfigLength = ReadUInt16(buffer); uint16_t userConfigLength = ReadUInt16(buffer);
(void)userConfigLength; const char *deviceName = ReadString(buffer, &len);
ReadString(buffer, &len); // Ignore device name uint16_t doubleTapSwitchLayerTimeout = ReadUInt16(buffer);
uint16_t moduleConfigurationCount = ReadCompactLength(buffer);
(void)dataModelVersion; (void)userConfigLength;
(void)dataModelMajorVersion;
(void)dataModelMinorVersion;
(void)dataModelPatchVersion;
(void)deviceName;
// LED brightness
uint8_t iconsAndLayerTextsBrightness = ReadUInt8(buffer);
uint8_t alphanumericSegmentsBrightness = ReadUInt8(buffer);
uint8_t keyBacklightBrightness = ReadUInt8(buffer);
(void)iconsAndLayerTextsBrightness;
(void)alphanumericSegmentsBrightness;
(void)keyBacklightBrightness;
// Mouse kinetic properties
uint8_t mouseMoveInitialSpeed = ReadUInt8(buffer);
uint8_t mouseMoveAcceleration = ReadUInt8(buffer);
uint8_t mouseMoveDeceleratedSpeed = ReadUInt8(buffer);
uint8_t mouseMoveBaseSpeed = ReadUInt8(buffer);
uint8_t mouseMoveAcceleratedSpeed = ReadUInt8(buffer);
uint8_t mouseScrollInitialSpeed = ReadUInt8(buffer);
uint8_t mouseScrollAcceleration = ReadUInt8(buffer);
uint8_t mouseScrollDeceleratedSpeed = ReadUInt8(buffer);
uint8_t mouseScrollBaseSpeed = ReadUInt8(buffer);
uint8_t mouseScrollAcceleratedSpeed = ReadUInt8(buffer);
if (mouseMoveInitialSpeed == 0 ||
mouseMoveAcceleration == 0 ||
mouseMoveDeceleratedSpeed == 0 ||
mouseMoveBaseSpeed == 0 ||
mouseMoveAcceleratedSpeed == 0 ||
mouseScrollInitialSpeed == 0 ||
mouseScrollAcceleration == 0 ||
mouseScrollDeceleratedSpeed == 0 ||
mouseScrollBaseSpeed == 0 ||
mouseScrollAcceleratedSpeed == 0)
{
return ParserError_InvalidMouseKineticProperty;
}
// Module configurations
uint16_t moduleConfigurationCount = ReadCompactLength(buffer);
if (moduleConfigurationCount > 255) { if (moduleConfigurationCount > 255) {
return ParserError_InvalidModuleConfigurationCount; return ParserError_InvalidModuleConfigurationCount;
@@ -45,6 +105,8 @@ parser_error_t ParseConfig(config_buffer_t *buffer)
} }
} }
// Macros
macroCount = ReadCompactLength(buffer); macroCount = ReadCompactLength(buffer);
if (macroCount > MAX_MACRO_NUM) { if (macroCount > MAX_MACRO_NUM) {
return ParserError_InvalidMacroCount; return ParserError_InvalidMacroCount;
@@ -57,6 +119,8 @@ parser_error_t ParseConfig(config_buffer_t *buffer)
} }
} }
// Keymaps
keymapCount = ReadCompactLength(buffer); keymapCount = ReadCompactLength(buffer);
if (keymapCount == 0 || keymapCount > MAX_KEYMAP_NUM) { if (keymapCount == 0 || keymapCount > MAX_KEYMAP_NUM) {
return ParserError_InvalidKeymapCount; return ParserError_InvalidKeymapCount;
@@ -69,7 +133,23 @@ parser_error_t ParseConfig(config_buffer_t *buffer)
} }
} }
// If parsing succeeded then apply the parsed values.
if (!ParserRunDry) { if (!ParserRunDry) {
DoubleTapSwitchLayerTimeout = doubleTapSwitchLayerTimeout;
MouseMoveState.initialSpeed = mouseMoveInitialSpeed;
MouseMoveState.acceleration = mouseMoveAcceleration;
MouseMoveState.deceleratedSpeed = mouseMoveDeceleratedSpeed;
MouseMoveState.baseSpeed = mouseMoveBaseSpeed;
MouseMoveState.acceleratedSpeed = mouseMoveAcceleratedSpeed;
MouseScrollState.initialSpeed = mouseScrollInitialSpeed;
MouseScrollState.acceleration = mouseScrollAcceleration;
MouseScrollState.deceleratedSpeed = mouseScrollDeceleratedSpeed;
MouseScrollState.baseSpeed = mouseScrollBaseSpeed;
MouseScrollState.acceleratedSpeed = mouseScrollAcceleratedSpeed;
AllKeymapsCount = keymapCount; AllKeymapsCount = keymapCount;
AllMacrosCount = macroCount; AllMacrosCount = macroCount;
} }

View File

@@ -8,20 +8,21 @@
// Typedefs: // Typedefs:
typedef enum { typedef enum {
ParserError_Success, ParserError_Success = 0,
ParserError_InvalidSerializedKeystrokeType, ParserError_InvalidSerializedKeystrokeType = 1,
ParserError_InvalidSerializedMouseAction, ParserError_InvalidSerializedMouseAction = 2,
ParserError_InvalidSerializedKeyActionType, ParserError_InvalidSerializedKeyActionType = 3,
ParserError_InvalidLayerCount, ParserError_InvalidLayerCount = 4,
ParserError_InvalidModuleCount, ParserError_InvalidModuleCount = 5,
ParserError_InvalidActionCount, ParserError_InvalidActionCount = 6,
ParserError_InvalidSerializedMacroActionType, ParserError_InvalidSerializedMacroActionType = 7,
ParserError_InvalidSerializedSwitchKeymapAction, ParserError_InvalidSerializedSwitchKeymapAction = 8,
ParserError_InvalidModuleConfigurationCount, ParserError_InvalidModuleConfigurationCount = 9,
ParserError_InvalidKeymapCount, ParserError_InvalidKeymapCount = 10,
ParserError_InvalidAbbreviationLen, ParserError_InvalidAbbreviationLen = 11,
ParserError_InvalidMacroCount, ParserError_InvalidMacroCount = 12,
ParserError_InvalidSerializedPlayMacroAction, ParserError_InvalidSerializedPlayMacroAction = 13,
ParserError_InvalidMouseKineticProperty = 14,
} parser_error_t; } parser_error_t;
// Functions: // Functions:

View File

@@ -48,11 +48,11 @@ static parser_error_t parseKeyStrokeAction(key_action_t *keyAction, uint8_t keyS
static parser_error_t parseSwitchLayerAction(key_action_t *KeyAction, config_buffer_t *buffer) static parser_error_t parseSwitchLayerAction(key_action_t *KeyAction, config_buffer_t *buffer)
{ {
uint8_t layer = ReadUInt8(buffer) + 1; uint8_t layer = ReadUInt8(buffer) + 1;
bool isToggle = ReadBool(buffer); uint8_t mode = ReadBool(buffer) ? SwitchLayerMode_Toggle : SwitchLayerMode_HoldAndDoubleTapToggle;
KeyAction->type = KeyActionType_SwitchLayer; KeyAction->type = KeyActionType_SwitchLayer;
KeyAction->switchLayer.layer = layer; KeyAction->switchLayer.layer = layer;
KeyAction->switchLayer.isToggle = isToggle; KeyAction->switchLayer.mode = mode;
return ParserError_Success; return ParserError_Success;
} }
@@ -82,53 +82,16 @@ static parser_error_t parsePlayMacroAction(key_action_t *keyAction, config_buffe
static parser_error_t parseMouseAction(key_action_t *keyAction, config_buffer_t *buffer) static parser_error_t parseMouseAction(key_action_t *keyAction, config_buffer_t *buffer)
{ {
uint8_t mouseAction = ReadUInt8(buffer);
keyAction->type = KeyActionType_Mouse; keyAction->type = KeyActionType_Mouse;
memset(&keyAction->mouse, 0, sizeof keyAction->mouse);
switch (mouseAction) { uint8_t mouseAction = ReadUInt8(buffer);
case SerializedMouseAction_LeftClick: if (mouseAction > SerializedMouseAction_Last) {
keyAction->mouse.buttonActions = MouseButton_Left; return ParserError_InvalidSerializedMouseAction;
break;
case SerializedMouseAction_MiddleClick:
keyAction->mouse.buttonActions = MouseButton_Middle;
break;
case SerializedMouseAction_RightClick:
keyAction->mouse.buttonActions = MouseButton_Right;
break;
case SerializedMouseAction_MoveUp:
keyAction->mouse.moveActions = MouseMove_Up;
break;
case SerializedMouseAction_MoveDown:
keyAction->mouse.moveActions = MouseMove_Down;
break;
case SerializedMouseAction_MoveLeft:
keyAction->mouse.moveActions = MouseMove_Left;
break;
case SerializedMouseAction_MoveRight:
keyAction->mouse.moveActions = MouseMove_Right;
break;
case SerializedMouseAction_ScrollUp:
keyAction->mouse.scrollActions = MouseScroll_Up;
break;
case SerializedMouseAction_ScrollDown:
keyAction->mouse.scrollActions = MouseScroll_Down;
break;
case SerializedMouseAction_ScrollLeft:
keyAction->mouse.scrollActions = MouseScroll_Left;
break;
case SerializedMouseAction_ScrollRight:
keyAction->mouse.scrollActions = MouseScroll_Right;
break;
case SerializedMouseAction_Accelerate:
keyAction->mouse.moveActions = MouseMove_Accelerate;
break;
case SerializedMouseAction_Decelerate:
keyAction->mouse.moveActions = MouseMove_Decelerate;
break;
default:
return ParserError_InvalidSerializedMouseAction;
} }
memset(&keyAction->mouseAction, 0, sizeof keyAction->mouseAction);
keyAction->mouseAction = mouseAction;
return ParserError_Success; return ParserError_Success;
} }
@@ -153,7 +116,7 @@ static parser_error_t parseKeyAction(key_action_t *keyAction, config_buffer_t *b
return ParserError_InvalidSerializedKeyActionType; return ParserError_InvalidSerializedKeyActionType;
} }
static parser_error_t parseKeyActions(uint8_t targetLayer, config_buffer_t *buffer, uint8_t moduleId, uint8_t pointerRole) static parser_error_t parseKeyActions(uint8_t targetLayer, config_buffer_t *buffer, uint8_t moduleId)
{ {
parser_error_t errorCode; parser_error_t errorCode;
uint16_t actionCount = ReadCompactLength(buffer); uint16_t actionCount = ReadCompactLength(buffer);
@@ -174,9 +137,7 @@ static parser_error_t parseKeyActions(uint8_t targetLayer, config_buffer_t *buff
static parser_error_t parseModule(config_buffer_t *buffer, uint8_t layer) static parser_error_t parseModule(config_buffer_t *buffer, uint8_t layer)
{ {
uint8_t moduleId = ReadUInt8(buffer); uint8_t moduleId = ReadUInt8(buffer);
uint8_t pointerRole = ReadUInt8(buffer); return parseKeyActions(layer, buffer, moduleId);
return parseKeyActions(layer, buffer, moduleId, pointerRole);
} }
static parser_error_t parseLayer(config_buffer_t *buffer, uint8_t layer) static parser_error_t parseLayer(config_buffer_t *buffer, uint8_t layer)

View File

@@ -48,6 +48,10 @@
SerializedMouseAction_ScrollRight, SerializedMouseAction_ScrollRight,
SerializedMouseAction_Accelerate, SerializedMouseAction_Accelerate,
SerializedMouseAction_Decelerate, SerializedMouseAction_Decelerate,
SerializedMouseAction_Last = SerializedMouseAction_Decelerate,
SerializedMouseAction_Button_4,
SerializedMouseAction_Button_5,
SerializedMouseAction_Button_6,
} serialized_mouse_action_t; } serialized_mouse_action_t;
// Functions: // Functions:

View File

@@ -10,7 +10,7 @@ bool IsEepromBusy;
static eeprom_operation_t CurrentEepromOperation; static eeprom_operation_t CurrentEepromOperation;
static config_buffer_id_t CurrentConfigBufferId; static config_buffer_id_t CurrentConfigBufferId;
status_t LastEepromTransferStatus; status_t LastEepromTransferStatus;
void (*SuccessCallback)(); void (*SuccessCallback)(void);
static i2c_master_handle_t i2cHandle; static i2c_master_handle_t i2cHandle;
static i2c_master_transfer_t i2cTransfer; static i2c_master_transfer_t i2cTransfer;
@@ -21,7 +21,6 @@ static uint16_t eepromStartAddress;
static uint16_t sourceLength; static uint16_t sourceLength;
static uint8_t writeLength; static uint8_t writeLength;
static bool isReadSent; static bool isReadSent;
static uint8_t addressBuffer[EEPROM_ADDRESS_LENGTH];
static status_t i2cAsyncWrite(uint8_t *data, size_t dataSize) static status_t i2cAsyncWrite(uint8_t *data, size_t dataSize)
{ {
@@ -44,11 +43,10 @@ static status_t i2cAsyncRead(uint8_t *data, size_t dataSize)
static status_t writePage(void) static status_t writePage(void)
{ {
static uint8_t buffer[EEPROM_BUFFER_SIZE]; static uint8_t buffer[EEPROM_BUFFER_SIZE];
uint16_t targetEepromOffset = sourceOffset + eepromStartAddress; SetBufferUint16Be(buffer, 0, eepromStartAddress + sourceOffset);
SetBufferUint16Be(buffer, 0, targetEepromOffset);
writeLength = MIN(sourceLength - sourceOffset, EEPROM_PAGE_SIZE); writeLength = MIN(sourceLength - sourceOffset, EEPROM_PAGE_SIZE);
memcpy(buffer+EEPROM_ADDRESS_LENGTH, sourceBuffer+sourceOffset, writeLength); memcpy(buffer+EEPROM_ADDRESS_SIZE, sourceBuffer+sourceOffset, writeLength);
status_t status = i2cAsyncWrite(buffer, writeLength+EEPROM_ADDRESS_LENGTH); status_t status = i2cAsyncWrite(buffer, writeLength+EEPROM_ADDRESS_SIZE);
return status; return status;
} }
@@ -104,16 +102,17 @@ status_t EEPROM_LaunchTransfer(eeprom_operation_t operation, config_buffer_id_t
CurrentEepromOperation = operation; CurrentEepromOperation = operation;
CurrentConfigBufferId = config_buffer_id; CurrentConfigBufferId = config_buffer_id;
SuccessCallback = successCallback; SuccessCallback = successCallback;
bool isHardwareConfig = CurrentConfigBufferId == ConfigBufferId_HardwareConfig; bool isHardwareConfig = CurrentConfigBufferId == ConfigBufferId_HardwareConfig;
eepromStartAddress = isHardwareConfig ? 0 : HARDWARE_CONFIG_SIZE; eepromStartAddress = isHardwareConfig ? 0 : HARDWARE_CONFIG_SIZE;
SetBufferUint16Be(addressBuffer, 0, eepromStartAddress);
switch (CurrentEepromOperation) { switch (CurrentEepromOperation) {
case EepromOperation_Read: case EepromOperation_Read:
isReadSent = false; isReadSent = false;
LastEepromTransferStatus = i2cAsyncWrite(addressBuffer, EEPROM_ADDRESS_LENGTH); static uint8_t addressBuffer[EEPROM_ADDRESS_SIZE];
SetBufferUint16Be(addressBuffer, 0, eepromStartAddress);
LastEepromTransferStatus = i2cAsyncWrite(addressBuffer, EEPROM_ADDRESS_SIZE);
break; break;
case EepromOperation_Write: case EepromOperation_Write:
sourceBuffer = ConfigBufferIdToConfigBuffer(CurrentConfigBufferId)->buffer; sourceBuffer = ConfigBufferIdToConfigBuffer(CurrentConfigBufferId)->buffer;

View File

@@ -11,9 +11,9 @@
#define HARDWARE_CONFIG_SIZE 64 #define HARDWARE_CONFIG_SIZE 64
#define USER_CONFIG_SIZE (EEPROM_SIZE - HARDWARE_CONFIG_SIZE) #define USER_CONFIG_SIZE (EEPROM_SIZE - HARDWARE_CONFIG_SIZE)
#define EEPROM_ADDRESS_LENGTH 2 #define EEPROM_ADDRESS_SIZE 2
#define EEPROM_PAGE_SIZE 64 #define EEPROM_PAGE_SIZE 64
#define EEPROM_BUFFER_SIZE (EEPROM_ADDRESS_LENGTH + EEPROM_PAGE_SIZE) #define EEPROM_BUFFER_SIZE (EEPROM_ADDRESS_SIZE + EEPROM_PAGE_SIZE)
// Typedefs: // Typedefs:

View File

@@ -11,8 +11,9 @@
// Main bus // Main bus
#define I2C_MAIN_BUS_BASEADDR I2C0 #define I2C_MAIN_BUS_BASEADDR I2C0
#define I2C_MASTER_BUS_CLK_SRC I2C0_CLK_SRC #define I2C_MAIN_BUS_IRQ_ID I2C0_IRQn
#define I2C_MAIN_BUS_BAUD_RATE 100000 // 100 kHz works even with a 20 meter long bridge cable. #define I2C_MAIN_BUS_CLK_SRC I2C0_CLK_SRC
#define I2C_MAIN_BUS_BAUD_RATE 100000 // 100 kHz works even with a 20 meter long bridge cable.
#define I2C_MAIN_BUS_MUX kPORT_MuxAlt7 #define I2C_MAIN_BUS_MUX kPORT_MuxAlt7
#define I2C_MAIN_BUS_SDA_GPIO GPIOD #define I2C_MAIN_BUS_SDA_GPIO GPIOD
@@ -28,8 +29,9 @@
// EEPROM bus // EEPROM bus
#define I2C_EEPROM_BUS_BASEADDR I2C1 #define I2C_EEPROM_BUS_BASEADDR I2C1
#define I2C_EEPROM_BUS_IRQ_ID I2C1_IRQn
#define I2C_EEPROM_BUS_CLK_SRC I2C1_CLK_SRC #define I2C_EEPROM_BUS_CLK_SRC I2C1_CLK_SRC
#define I2C_EEPROM_BUS_BAUD_RATE 1000000 // 1 Mhz is the maximum speed of the EEPROM. #define I2C_EEPROM_BUS_BAUD_RATE 1000000 // 1 Mhz is the maximum speed of the EEPROM.
#define I2C_EEPROM_BUS_MUX kPORT_MuxAlt2 #define I2C_EEPROM_BUS_MUX kPORT_MuxAlt2
#define I2C_EEPROM_BUS_SDA_PORT PORTC #define I2C_EEPROM_BUS_SDA_PORT PORTC

View File

@@ -8,20 +8,22 @@
#include "peripherals/led_driver.h" #include "peripherals/led_driver.h"
#include "peripherals/merge_sensor.h" #include "peripherals/merge_sensor.h"
#include "led_pwm.h" #include "led_pwm.h"
#include "slave_scheduler.h"
#include "peripherals/adc.h" #include "peripherals/adc.h"
#include "init_peripherals.h" #include "init_peripherals.h"
#include "eeprom.h" #include "eeprom.h"
#include "microseconds/microseconds_pit.c"
#include "timer.h" #include "timer.h"
#include "key_debouncer.h" #include "key_debouncer.h"
#include "usb_api.h"
void InitInterruptPriorities(void) void InitInterruptPriorities(void)
{ {
NVIC_SetPriority(I2C0_IRQn, 1); NVIC_SetPriority(PIT_I2C_WATCHDOG_IRQ_ID, 1);
NVIC_SetPriority(I2C1_IRQn, 1); NVIC_SetPriority(PIT_TIMER_IRQ_ID, 2);
NVIC_SetPriority(USB0_IRQn, 1); NVIC_SetPriority(PIT_KEY_SCANNER_IRQ_ID, 3);
NVIC_SetPriority(PIT1_IRQn, 6); NVIC_SetPriority(PIT_KEY_DEBOUNCER_IRQ_ID, 3);
NVIC_SetPriority(I2C_MAIN_BUS_IRQ_ID, 3);
NVIC_SetPriority(I2C_EEPROM_BUS_IRQ_ID, 3);
NVIC_SetPriority(USB_IRQ_ID, 3);
} }
void delay(void) void delay(void)
@@ -77,7 +79,7 @@ void InitI2cMainBus(void)
i2c_master_config_t masterConfig; i2c_master_config_t masterConfig;
I2C_MasterGetDefaultConfig(&masterConfig); I2C_MasterGetDefaultConfig(&masterConfig);
masterConfig.baudRate_Bps = I2C_MAIN_BUS_BAUD_RATE; masterConfig.baudRate_Bps = I2C_MAIN_BUS_BAUD_RATE;
uint32_t sourceClock = CLOCK_GetFreq(I2C_MASTER_BUS_CLK_SRC); uint32_t sourceClock = CLOCK_GetFreq(I2C_MAIN_BUS_CLK_SRC);
I2C_MasterInit(I2C_MAIN_BUS_BASEADDR, &masterConfig, sourceClock); I2C_MasterInit(I2C_MAIN_BUS_BASEADDR, &masterConfig, sourceClock);
} }
@@ -125,5 +127,4 @@ void InitPeripherals(void)
#endif #endif
InitKeyDebouncer(); InitKeyDebouncer();
EEPROM_Init(); EEPROM_Init();
//microseconds_init();
} }

View File

@@ -1,5 +1,5 @@
#ifndef __ACTION_H__ #ifndef __KEY_ACTION_H__
#define __ACTION_H__ #define __KEY_ACTION_H__
// Includes: // Includes:
@@ -7,16 +7,8 @@
#include "attributes.h" #include "attributes.h"
#include "lufa/HIDClassCommon.h" #include "lufa/HIDClassCommon.h"
#include "usb_composite_device.h" #include "usb_composite_device.h"
#include "main.h"
#include "module.h" #include "module.h"
#include "config_parser/parse_keymap.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:
@@ -36,32 +28,21 @@
KeystrokeType_System, KeystrokeType_System,
} keystroke_type_t; } keystroke_type_t;
typedef enum {
SwitchLayerMode_Hold,
SwitchLayerMode_HoldAndDoubleTapToggle,
SwitchLayerMode_Toggle,
} switch_layer_mode_t;
typedef enum { typedef enum {
MouseButton_Left = 1 << 0, MouseButton_Left = 1 << 0,
MouseButton_Right = 1 << 1, MouseButton_Right = 1 << 1,
MouseButton_Middle = 1 << 2, MouseButton_Middle = 1 << 2,
MouseButton_4 = 1 << 3, MouseButton_4 = 1 << 3,
MouseButton_5 = 1 << 4, MouseButton_5 = 1 << 4,
MouseButton_t = 1 << 5, MouseButton_6 = 1 << 5,
} mouse_button_t; } mouse_button_t;
typedef enum {
MouseMove_Up = 1 << 0,
MouseMove_Down = 1 << 1,
MouseMove_Left = 1 << 2,
MouseMove_Right = 1 << 3,
MouseMove_Accelerate = 1 << 4,
MouseMove_Decelerate = 1 << 5,
} mouse_move_action_t;
typedef enum {
MouseScroll_Up = 1 << 0,
MouseScroll_Down = 1 << 1,
MouseScroll_Left = 1 << 2,
MouseScroll_Right = 1 << 3,
} mouse_scroll_t;
typedef struct { typedef struct {
uint8_t type; uint8_t type;
union { union {
@@ -71,13 +52,9 @@
uint8_t modifiers; uint8_t modifiers;
uint16_t scancode; uint16_t scancode;
} ATTR_PACKED keystroke; } ATTR_PACKED keystroke;
serialized_mouse_action_t mouseAction;
struct { struct {
mouse_button_t buttonActions; switch_layer_mode_t mode;
mouse_scroll_t scrollActions;
mouse_move_action_t moveActions;
} ATTR_PACKED mouse;
struct {
bool isToggle;
uint8_t layer; uint8_t layer;
} ATTR_PACKED switchLayer; } ATTR_PACKED switchLayer;
struct { struct {

View File

@@ -1,9 +1,12 @@
#include "fsl_pit.h" #include "fsl_pit.h"
#include "key_scanner.h" #include "key_scanner.h"
uint32_t KeyScannerCounter;
void PIT_KEY_SCANNER_HANDLER(void) void PIT_KEY_SCANNER_HANDLER(void)
{ {
KeyMatrix_ScanRow(&RightKeyMatrix); KeyMatrix_ScanRow(&RightKeyMatrix);
KeyScannerCounter++;
PIT_ClearStatusFlags(PIT, PIT_KEY_SCANNER_CHANNEL, PIT_TFLG_TIF_MASK); PIT_ClearStatusFlags(PIT, PIT_KEY_SCANNER_CHANNEL, PIT_TFLG_TIF_MASK);
} }

View File

@@ -10,6 +10,10 @@
#define KEY_SCANNER_INTERVAL_USEC (1000 / RIGHT_KEY_MATRIX_ROWS_NUM) #define KEY_SCANNER_INTERVAL_USEC (1000 / RIGHT_KEY_MATRIX_ROWS_NUM)
// Variables:
extern uint32_t KeyScannerCounter;
// Functions: // Functions:
void InitKeyScanner(void); void InitKeyScanner(void);

View File

@@ -332,23 +332,23 @@ key_action_t CurrentKeymap[LAYER_COUNT][SLOT_COUNT][MAX_KEY_COUNT_PER_MODULE] =
{ .type = KeyActionType_None }, { .type = KeyActionType_None },
// Row 2 // Row 2
{ .type = KeyActionType_Mouse, .mouse = { .buttonActions = MouseButton_4 }}, { .type = KeyActionType_Mouse, .mouseAction = SerializedMouseAction_Button_4 },
{ .type = KeyActionType_Mouse, .mouse = { .moveActions = MouseMove_Up }}, { .type = KeyActionType_Mouse, .mouseAction = SerializedMouseAction_MoveUp },
{ .type = KeyActionType_Mouse, .mouse = { .buttonActions = MouseButton_5 }}, { .type = KeyActionType_Mouse, .mouseAction = SerializedMouseAction_Button_5 },
{ .type = KeyActionType_Mouse, .mouse = { .buttonActions = MouseButton_t }}, { .type = KeyActionType_Mouse, .mouseAction = SerializedMouseAction_Button_6 },
{ .type = KeyActionType_None }, { .type = KeyActionType_None },
{ .type = KeyActionType_None }, { .type = KeyActionType_None },
{ .type = KeyActionType_None }, { .type = KeyActionType_None },
{ .type = KeyActionType_Mouse, .mouse = { .scrollActions = MouseScroll_Up }}, { .type = KeyActionType_Mouse, .mouseAction = SerializedMouseAction_ScrollUp },
// Row 3 // Row 3
{ .type = KeyActionType_Mouse, .mouse = { .moveActions = MouseMove_Left }}, { .type = KeyActionType_Mouse, .mouseAction= SerializedMouseAction_MoveLeft },
{ .type = KeyActionType_Mouse, .mouse = { .moveActions = MouseMove_Down }}, { .type = KeyActionType_Mouse, .mouseAction = SerializedMouseAction_MoveDown },
{ .type = KeyActionType_Mouse, .mouse = { .moveActions = MouseMove_Right }}, { .type = KeyActionType_Mouse, .mouseAction = SerializedMouseAction_MoveRight },
{ .type = KeyActionType_None }, { .type = KeyActionType_None },
{ .type = KeyActionType_None }, { .type = KeyActionType_None },
{ .type = KeyActionType_None }, { .type = KeyActionType_None },
{ .type = KeyActionType_Mouse, .mouse = { .scrollActions = MouseScroll_Down }}, { .type = KeyActionType_Mouse, .mouseAction = SerializedMouseAction_ScrollDown },
// Row 4 // Row 4
{ .type = KeyActionType_None }, { .type = KeyActionType_None },
@@ -391,9 +391,9 @@ key_action_t CurrentKeymap[LAYER_COUNT][SLOT_COUNT][MAX_KEY_COUNT_PER_MODULE] =
// Row 3 // Row 3
{ .type = KeyActionType_SwitchLayer, .switchLayer = { .layer = LayerId_Mouse }}, { .type = KeyActionType_SwitchLayer, .switchLayer = { .layer = LayerId_Mouse }},
{ .type = KeyActionType_None }, { .type = KeyActionType_None },
{ .type = KeyActionType_Mouse, .mouse = { .buttonActions = MouseButton_Right }}, { .type = KeyActionType_Mouse, .mouseAction = SerializedMouseAction_RightClick },
{ .type = KeyActionType_Mouse, .mouse = { .buttonActions = MouseButton_Middle }}, { .type = KeyActionType_Mouse, .mouseAction = SerializedMouseAction_MiddleClick },
{ .type = KeyActionType_Mouse, .mouse = { .buttonActions = MouseButton_Left }}, { .type = KeyActionType_Mouse, .mouseAction = SerializedMouseAction_LeftClick },
{ .type = KeyActionType_None }, { .type = KeyActionType_None },
{ .type = KeyActionType_None }, { .type = KeyActionType_None },
@@ -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, .mouseAction = SerializedMouseAction_Decelerate },
{ .type = KeyActionType_Mouse, .mouse = { .moveActions = MouseMove_Accelerate }}, { .type = KeyActionType_Mouse, .mouseAction = SerializedMouseAction_Accelerate },
{ .type = KeyActionType_None }, { .type = KeyActionType_None },
} }
}, },

View File

@@ -5,7 +5,7 @@
#include "keymap.h" #include "keymap.h"
static bool heldLayers[LAYER_COUNT]; static bool heldLayers[LAYER_COUNT];
static bool pressedLayers[LAYER_COUNT]; static switch_layer_mode_t pressedLayers[LAYER_COUNT];
void updateLayerStates(void) void updateLayerStates(void)
{ {
@@ -18,10 +18,11 @@ void updateLayerStates(void)
if (keyState->current) { if (keyState->current) {
key_action_t action = CurrentKeymap[LayerId_Base][slotId][keyId]; key_action_t action = CurrentKeymap[LayerId_Base][slotId][keyId];
if (action.type == KeyActionType_SwitchLayer) { if (action.type == KeyActionType_SwitchLayer) {
if (!action.switchLayer.isToggle) { if (action.switchLayer.mode != SwitchLayerMode_Toggle) {
heldLayers[action.switchLayer.layer] = true; heldLayers[action.switchLayer.layer] = true;
} else if (!keyState->previous && keyState->current) { }
pressedLayers[action.switchLayer.layer] = true; if (action.switchLayer.mode != SwitchLayerMode_Hold && !keyState->previous && keyState->current) {
pressedLayers[action.switchLayer.layer] = action.switchLayer.mode;
} }
} }
} }
@@ -30,6 +31,7 @@ void updateLayerStates(void)
} }
layer_id_t PreviousHeldLayer = LayerId_Base; layer_id_t PreviousHeldLayer = LayerId_Base;
layer_id_t ToggledLayer = LayerId_Base;
layer_id_t GetActiveLayer() layer_id_t GetActiveLayer()
{ {
@@ -37,22 +39,20 @@ layer_id_t GetActiveLayer()
// Handle toggled layers // Handle toggled layers
static layer_id_t toggledLayer = LayerId_Base;
for (layer_id_t layerId=LayerId_Mod; layerId<=LayerId_Mouse; layerId++) { for (layer_id_t layerId=LayerId_Mod; layerId<=LayerId_Mouse; layerId++) {
if (pressedLayers[layerId]) { if (pressedLayers[layerId]) {
if (toggledLayer == layerId) { if (ToggledLayer == layerId) {
toggledLayer = LayerId_Base; ToggledLayer = LayerId_Base;
break; break;
} else if (toggledLayer == LayerId_Base) { } else if (ToggledLayer == LayerId_Base && pressedLayers[layerId] == SwitchLayerMode_Toggle) {
toggledLayer = layerId; ToggledLayer = layerId;
break; break;
} }
} }
} }
if (toggledLayer != LayerId_Base) { if (ToggledLayer != LayerId_Base) {
return toggledLayer; return ToggledLayer;
} }
// Handle held layers // Handle held layers

View File

@@ -21,10 +21,10 @@
// Variables: // Variables:
extern layer_id_t PreviousHeldLayer; extern layer_id_t PreviousHeldLayer;
extern layer_id_t ToggledLayer;
// Functions: // Functions:
layer_id_t GetActiveLayer(); layer_id_t GetActiveLayer();
#endif #endif

View File

@@ -1,79 +1,16 @@
#include "config.h" #include "config.h"
#include "main.h"
#include "init_clock.h" #include "init_clock.h"
#include "init_peripherals.h" #include "init_peripherals.h"
#include "usb_composite_device.h" #include "usb_composite_device.h"
#include "peripherals/led_driver.h"
#include "key_action.h"
#include "slave_scheduler.h" #include "slave_scheduler.h"
#include "peripherals/test_led.h"
#include "usb_interfaces/usb_interface_basic_keyboard.h"
#include "usb_interfaces/usb_interface_media_keyboard.h"
#include "usb_protocol_handler.h"
#include "bus_pal_hardware.h" #include "bus_pal_hardware.h"
#include "command.h" #include "command.h"
#include "bootloader/wormhole.h" #include "bootloader/wormhole.h"
#include "eeprom.h" #include "eeprom.h"
#include "right_key_matrix.h"
#include "key_scanner.h" #include "key_scanner.h"
#include "key_states.h"
#include "usb_commands/usb_command_apply_config.h" #include "usb_commands/usb_command_apply_config.h"
#include "peripherals/reset_button.h" #include "peripherals/reset_button.h"
#include "usb_report_updater.h"
bool UsbBasicKeyboardReportEverSent = false;
bool UsbMediaKeyboardReportEverSent = false;
bool UsbSystemKeyboardReportEverSent = false;
bool UsbMouseReportEverSentEverSent = false;
void updateUsbReports(void)
{
if (IsUsbBasicKeyboardReportSent) {
UsbBasicKeyboardReportEverSent = true;
}
if (IsUsbMediaKeyboardReportSent) {
UsbMediaKeyboardReportEverSent = true;
}
if (IsUsbSystemKeyboardReportSent) {
UsbSystemKeyboardReportEverSent = true;
}
if (IsUsbMouseReportSent) {
UsbMouseReportEverSentEverSent = true;
}
bool areUsbReportsSent = true;
if (UsbBasicKeyboardReportEverSent) {
areUsbReportsSent &= IsUsbBasicKeyboardReportSent;
}
if (UsbMediaKeyboardReportEverSent) {
areUsbReportsSent &= IsUsbMediaKeyboardReportSent;
}
if (UsbSystemKeyboardReportEverSent) {
areUsbReportsSent &= IsUsbSystemKeyboardReportSent;
}
if (UsbMouseReportEverSentEverSent) {
areUsbReportsSent &= IsUsbMouseReportSent;
}
if (!areUsbReportsSent) {
return;
}
ResetActiveUsbBasicKeyboardReport();
ResetActiveUsbMediaKeyboardReport();
ResetActiveUsbSystemKeyboardReport();
ResetActiveUsbMouseReport();
UpdateActiveUsbReports();
SwitchActiveUsbBasicKeyboardReport();
SwitchActiveUsbMediaKeyboardReport();
SwitchActiveUsbSystemKeyboardReport();
SwitchActiveUsbMouseReport();
IsUsbBasicKeyboardReportSent = false;
IsUsbMediaKeyboardReportSent = false;
IsUsbSystemKeyboardReportSent = false;
IsUsbMouseReportSent = false;
}
bool IsEepromInitialized = false; bool IsEepromInitialized = false;
bool IsConfigInitialized = false; bool IsConfigInitialized = false;
@@ -105,7 +42,7 @@ void main(void)
InitSlaveScheduler(); InitSlaveScheduler();
KeyMatrix_Init(&RightKeyMatrix); KeyMatrix_Init(&RightKeyMatrix);
InitKeyScanner(); InitKeyScanner();
updateUsbReports(); UpdateUsbReports();
InitUsb(); InitUsb();
while (1) { while (1) {
@@ -113,7 +50,7 @@ void main(void)
UsbCommand_ApplyConfig(); UsbCommand_ApplyConfig();
IsConfigInitialized = true; IsConfigInitialized = true;
} }
updateUsbReports(); UpdateUsbReports();
__WFI(); __WFI();
} }
} }

View File

@@ -1,10 +0,0 @@
#ifndef __MAIN_H__
#define __MAIN_H__
// Includes:
#include "key_matrix.h"
#include "slot.h"
#include "module.h"
#endif

View File

@@ -3,7 +3,6 @@
#include "slave_scheduler.h" #include "slave_scheduler.h"
#include "slave_drivers/uhk_module_driver.h" #include "slave_drivers/uhk_module_driver.h"
#include "slave_protocol.h" #include "slave_protocol.h"
#include "main.h"
#include "peripherals/test_led.h" #include "peripherals/test_led.h"
#include "bool_array_converter.h" #include "bool_array_converter.h"
#include "crc16.h" #include "crc16.h"

View File

@@ -1,7 +1,6 @@
#include "fsl_i2c.h" #include "fsl_i2c.h"
#include "slave_scheduler.h" #include "slave_scheduler.h"
#include "slot.h" #include "slot.h"
#include "main.h"
#include "slave_drivers/is31fl3731_driver.h" #include "slave_drivers/is31fl3731_driver.h"
#include "slave_drivers/uhk_module_driver.h" #include "slave_drivers/uhk_module_driver.h"
#include "slave_drivers/kboot_driver.h" #include "slave_drivers/kboot_driver.h"

View File

@@ -14,15 +14,30 @@ void Timer_Init(void)
pit_config_t pitConfig; pit_config_t pitConfig;
PIT_GetDefaultConfig(&pitConfig); PIT_GetDefaultConfig(&pitConfig);
PIT_Init(PIT, &pitConfig); PIT_Init(PIT, &pitConfig);
PIT_SetTimerPeriod(PIT, PIT_TIMER_CHANNEL, MSEC_TO_COUNT(TIMER_INTERVAL_MSEC, PIT_SOURCE_CLOCK));
// TODO: Why the interval needs to be multiplied by two to arrive to the correct timing?
// Figure it out and clean this up.
PIT_SetTimerPeriod(PIT, PIT_TIMER_CHANNEL, MSEC_TO_COUNT(TIMER_INTERVAL_MSEC*2, PIT_SOURCE_CLOCK));
PIT_EnableInterrupts(PIT, PIT_TIMER_CHANNEL, kPIT_TimerInterruptEnable); PIT_EnableInterrupts(PIT, PIT_TIMER_CHANNEL, kPIT_TimerInterruptEnable);
EnableIRQ(PIT_TIMER_IRQ_ID); EnableIRQ(PIT_TIMER_IRQ_ID);
PIT_StartTimer(PIT, PIT_TIMER_CHANNEL); PIT_StartTimer(PIT, PIT_TIMER_CHANNEL);
} }
void Timer_SetCurrentTime(uint32_t *time)
{
*time = CurrentTime;
}
uint32_t Timer_GetElapsedTime(uint32_t *time) uint32_t Timer_GetElapsedTime(uint32_t *time)
{ {
uint32_t elapsedTime = CurrentTime - *time; uint32_t elapsedTime = CurrentTime - *time;
return elapsedTime;
}
uint32_t Timer_GetElapsedTimeAndSetCurrent(uint32_t *time)
{
uint32_t elapsedTime = Timer_GetElapsedTime(time);
*time = CurrentTime; *time = CurrentTime;
return elapsedTime; return elapsedTime;
} }

View File

@@ -16,6 +16,8 @@
// Functions: // Functions:
void Timer_Init(void); void Timer_Init(void);
void Timer_SetCurrentTime(uint32_t *time);
uint32_t Timer_GetElapsedTime(uint32_t *time); uint32_t Timer_GetElapsedTime(uint32_t *time);
uint32_t Timer_GetElapsedTimeAndSetCurrent(uint32_t *time);
#endif #endif

View File

@@ -18,6 +18,7 @@
#define USB_DEVICE_CLASS 0x00 #define USB_DEVICE_CLASS 0x00
#define USB_DEVICE_SUBCLASS 0x00 #define USB_DEVICE_SUBCLASS 0x00
#define USB_DEVICE_PROTOCOL 0x00 #define USB_DEVICE_PROTOCOL 0x00
#define USB_IRQ_ID USB0_IRQn
#define USB_INTERFACE_ALTERNATE_SETTING_NONE 0x00 #define USB_INTERFACE_ALTERNATE_SETTING_NONE 0x00
#define USB_STRING_DESCRIPTOR_NONE 0x00 #define USB_STRING_DESCRIPTOR_NONE 0x00

View File

@@ -5,6 +5,12 @@
#include "i2c_watchdog.h" #include "i2c_watchdog.h"
#include "buffer.h" #include "buffer.h"
#include "timer.h" #include "timer.h"
#include "key_scanner.h"
#include "usb_report_updater.h"
#include "usb_interfaces/usb_interface_basic_keyboard.h"
#include "usb_interfaces/usb_interface_media_keyboard.h"
#include "usb_interfaces/usb_interface_system_keyboard.h"
#include "usb_interfaces/usb_interface_mouse.h"
uint8_t DebugBuffer[USB_GENERIC_HID_OUT_BUFFER_LENGTH]; uint8_t DebugBuffer[USB_GENERIC_HID_OUT_BUFFER_LENGTH];
@@ -14,15 +20,16 @@ void UsbCommand_GetDebugBuffer(void)
SetDebugBufferUint32(5, I2cSlaveScheduler_Counter); SetDebugBufferUint32(5, I2cSlaveScheduler_Counter);
SetDebugBufferUint32(9, I2cWatchdog_WatchCounter); SetDebugBufferUint32(9, I2cWatchdog_WatchCounter);
SetDebugBufferUint32(13, I2cWatchdog_RecoveryCounter); SetDebugBufferUint32(13, I2cWatchdog_RecoveryCounter);
SetDebugBufferUint32(40, CurrentTime); SetDebugBufferUint32(17, KeyScannerCounter);
SetDebugBufferUint32(21, UsbReportUpdateCounter);
SetDebugBufferUint32(25, CurrentTime);
SetDebugBufferUint32(29, UsbGenericHidActionCounter);
SetDebugBufferUint32(33, UsbBasicKeyboardActionCounter);
SetDebugBufferUint32(37, UsbMediaKeyboardActionCounter);
SetDebugBufferUint32(41, UsbSystemKeyboardActionCounter);
SetDebugBufferUint32(45, UsbMouseActionCounter);
memcpy(GenericHidOutBuffer, DebugBuffer, USB_GENERIC_HID_OUT_BUFFER_LENGTH); memcpy(GenericHidOutBuffer, DebugBuffer, USB_GENERIC_HID_OUT_BUFFER_LENGTH);
/* uint64_t ticks = microseconds_get_ticks();
uint32_t microseconds = microseconds_convert_to_microseconds(ticks);
uint32_t milliseconds = microseconds/1000;
*(uint32_t*)(GenericHidOutBuffer+1) = ticks;
*/
} }
void SetDebugBufferUint8(uint32_t offset, uint8_t value) void SetDebugBufferUint8(uint32_t offset, uint8_t value)
@@ -39,3 +46,23 @@ void SetDebugBufferUint32(uint32_t offset, uint32_t value)
{ {
SetBufferUint32(DebugBuffer, offset, value); SetBufferUint32(DebugBuffer, offset, value);
} }
void SetDebugBufferInt8(uint32_t offset, int8_t value)
{
SetBufferInt8(DebugBuffer, offset, value);
}
void SetDebugBufferInt16(uint32_t offset, int16_t value)
{
SetBufferInt16(DebugBuffer, offset, value);
}
void SetDebugBufferInt32(uint32_t offset, int32_t value)
{
SetBufferInt32(DebugBuffer, offset, value);
}
void SetDebugBufferFloat(uint32_t offset, float value)
{
*(float*)(DebugBuffer + offset) = value;
}

View File

@@ -17,4 +17,10 @@
void SetDebugBufferUint16(uint32_t offset, uint16_t value); void SetDebugBufferUint16(uint32_t offset, uint16_t value);
void SetDebugBufferUint32(uint32_t offset, uint32_t value); void SetDebugBufferUint32(uint32_t offset, uint32_t value);
void SetDebugBufferInt8(uint32_t offset, int8_t value);
void SetDebugBufferInt16(uint32_t offset, int16_t value);
void SetDebugBufferInt32(uint32_t offset, int32_t value);
void SetDebugBufferFloat(uint32_t offset, float value);
#endif #endif

View File

@@ -1,14 +1,14 @@
#include "usb_protocol_handler.h" #include "usb_protocol_handler.h"
#include "usb_commands/usb_command_jump_to_slave_bootloader.h" #include "usb_commands/usb_command_jump_to_module_bootloader.h"
#include "slot.h" #include "slot.h"
#include "slave_drivers/uhk_module_driver.h" #include "slave_drivers/uhk_module_driver.h"
void UsbCommand_JumpToSlaveBootloader(void) void UsbCommand_JumpToModuleBootloader(void)
{ {
uint8_t slotId = GetUsbRxBufferUint8(1); uint8_t slotId = GetUsbRxBufferUint8(1);
if (!IS_VALID_SLAVE_SLOT(slotId)) { if (!IS_VALID_SLAVE_SLOT(slotId)) {
SetUsbTxBufferUint8(0, UsbStatusCode_JumpToSlaveBootloader_InvalidSlaveSlotId); SetUsbTxBufferUint8(0, UsbStatusCode_JumpToModuleBootloader_InvalidSlaveSlotId);
return; return;
} }

View File

@@ -0,0 +1,14 @@
#ifndef __USB_COMMAND_JUMP_TO_MODULE_BOOTLOADER_H__
#define __USB_COMMAND_JUMP_TO_MODULE_BOOTLOADER_H__
// Functions:
void UsbCommand_JumpToModuleBootloader(void);
// Typedefs:
typedef enum {
UsbStatusCode_JumpToModuleBootloader_InvalidSlaveSlotId = 2,
} usb_status_code_jump_to_module_bootloader_t;
#endif

View File

@@ -1,14 +0,0 @@
#ifndef __USB_COMMAND_JUMP_TO_SLAVE_BOOTLOADER_H__
#define __USB_COMMAND_JUMP_TO_SLAVE_BOOTLOADER_H__
// Functions:
void UsbCommand_JumpToSlaveBootloader(void);
// Typedefs:
typedef enum {
UsbStatusCode_JumpToSlaveBootloader_InvalidSlaveSlotId = 2,
} usb_status_code_jump_to_slave_bootloader_t;
#endif

View File

@@ -1,8 +0,0 @@
#ifndef __USB_COMMAND_SEND_KBOOT_COMMAND_H__
#define __USB_COMMAND_SEND_KBOOT_COMMAND_H__
// Functions:
void UsbCommand_SendKbootCommand(void);
#endif

View File

@@ -1,8 +1,8 @@
#include "usb_protocol_handler.h" #include "usb_protocol_handler.h"
#include "usb_commands/usb_command_send_kboot_command.h" #include "usb_commands/usb_command_send_kboot_command_to_module.h"
#include "slave_drivers/kboot_driver.h" #include "slave_drivers/kboot_driver.h"
void UsbCommand_SendKbootCommand(void) void UsbCommand_SendKbootCommandToModule(void)
{ {
KbootDriverState.phase = 0; KbootDriverState.phase = 0;
KbootDriverState.i2cAddress = GetUsbRxBufferUint8(2); KbootDriverState.i2cAddress = GetUsbRxBufferUint8(2);

View File

@@ -0,0 +1,8 @@
#ifndef __USB_COMMAND_SEND_KBOOT_COMMAND_TO_MODULE_H__
#define __USB_COMMAND_SEND_KBOOT_COMMAND_TO_MODULE_H__
// Functions:
void UsbCommand_SendKbootCommandToModule(void);
#endif

View File

@@ -5,37 +5,175 @@
#include "bus_pal_hardware.h" #include "bus_pal_hardware.h"
#include "bootloader/wormhole.h" #include "bootloader/wormhole.h"
static usb_status_t UsbDeviceCallback(usb_device_handle handle, uint32_t event, void *param);
usb_composite_device_t UsbCompositeDevice; usb_composite_device_t UsbCompositeDevice;
static usb_status_t usbDeviceCallback(usb_device_handle handle, uint32_t event, void *param);
usb_device_class_config_struct_t UsbDeviceCompositeClassConfig[USB_DEVICE_CONFIG_HID] = { static usb_device_class_config_list_struct_t UsbDeviceCompositeConfigList = {
{UsbGenericHidCallback, (class_handle_t)NULL, &UsbGenericHidClass}, .deviceCallback = usbDeviceCallback,
{UsbBasicKeyboardCallback, (class_handle_t)NULL, &UsbBasicKeyboardClass}, .count = USB_DEVICE_CONFIG_HID,
{UsbMediaKeyboardCallback, (class_handle_t)NULL, &UsbMediaKeyboardClass}, .config = (usb_device_class_config_struct_t[USB_DEVICE_CONFIG_HID]) {{
{UsbSystemKeyboardCallback, (class_handle_t)NULL, &UsbSystemKeyboardClass}, .classCallback = UsbGenericHidCallback,
{UsbMouseCallback, (class_handle_t)NULL, &UsbMouseClass}, .classInfomation = (usb_device_class_struct_t[]) {{
}; .type = kUSB_DeviceClassTypeHid,
.configurations = USB_DEVICE_CONFIGURATION_COUNT,
.interfaceList = (usb_device_interface_list_t[USB_DEVICE_CONFIGURATION_COUNT]) {{
.count = USB_GENERIC_HID_INTERFACE_COUNT,
.interfaces = (usb_device_interfaces_struct_t[USB_GENERIC_HID_INTERFACE_COUNT]) {{
.classCode = USB_CLASS_HID,
.subclassCode = USB_HID_SUBCLASS_NONE,
.protocolCode = USB_HID_PROTOCOL_NONE,
.interfaceNumber = USB_GENERIC_HID_INTERFACE_INDEX,
.count = 1,
.interface = (usb_device_interface_struct_t[]) {{
.alternateSetting = USB_INTERFACE_ALTERNATE_SETTING_NONE,
.endpointList = {
.count = USB_GENERIC_HID_ENDPOINT_COUNT,
.endpoint = (usb_device_endpoint_struct_t[USB_GENERIC_HID_ENDPOINT_COUNT]) {
{
.endpointAddress = USB_GENERIC_HID_ENDPOINT_IN_INDEX | (USB_IN << USB_DESCRIPTOR_ENDPOINT_ADDRESS_DIRECTION_SHIFT),
.transferType = USB_ENDPOINT_INTERRUPT,
.maxPacketSize = USB_GENERIC_HID_INTERRUPT_IN_PACKET_SIZE,
},
{
.endpointAddress = USB_GENERIC_HID_ENDPOINT_OUT_INDEX | (USB_OUT << USB_DESCRIPTOR_ENDPOINT_ADDRESS_DIRECTION_SHIFT),
.transferType = USB_ENDPOINT_INTERRUPT,
.maxPacketSize = USB_GENERIC_HID_INTERRUPT_OUT_PACKET_SIZE,
}
}
}
}}
}}
}}
}}
},
{
.classCallback = UsbBasicKeyboardCallback,
.classInfomation = (usb_device_class_struct_t[]) {{
.type = kUSB_DeviceClassTypeHid,
.configurations = USB_DEVICE_CONFIGURATION_COUNT,
.interfaceList = (usb_device_interface_list_t[USB_DEVICE_CONFIGURATION_COUNT]) {{
.count = USB_BASIC_KEYBOARD_INTERFACE_COUNT,
.interfaces = (usb_device_interfaces_struct_t[USB_BASIC_KEYBOARD_INTERFACE_COUNT]) {{
.classCode = USB_CLASS_HID,
.subclassCode = USB_HID_SUBCLASS_BOOT,
.protocolCode = USB_HID_PROTOCOL_KEYBOARD,
.interfaceNumber = USB_BASIC_KEYBOARD_INTERFACE_INDEX,
.count = 1,
.interface = (usb_device_interface_struct_t[]) {{
.alternateSetting = USB_INTERFACE_ALTERNATE_SETTING_NONE,
.endpointList = {
USB_BASIC_KEYBOARD_ENDPOINT_COUNT,
(usb_device_endpoint_struct_t[USB_BASIC_KEYBOARD_ENDPOINT_COUNT]) {{
.endpointAddress = USB_BASIC_KEYBOARD_ENDPOINT_INDEX | (USB_IN << USB_DESCRIPTOR_ENDPOINT_ADDRESS_DIRECTION_SHIFT),
.transferType = USB_ENDPOINT_INTERRUPT,
.maxPacketSize = USB_BASIC_KEYBOARD_INTERRUPT_IN_PACKET_SIZE,
}}
}
}}
}}
}}
}}
},
{
.classCallback = UsbMediaKeyboardCallback,
.classInfomation = (usb_device_class_struct_t[]) {{
.type = kUSB_DeviceClassTypeHid,
.configurations = USB_DEVICE_CONFIGURATION_COUNT,
.interfaceList = (usb_device_interface_list_t[USB_DEVICE_CONFIGURATION_COUNT]) {{
.count = USB_MEDIA_KEYBOARD_INTERFACE_COUNT,
.interfaces = (usb_device_interfaces_struct_t[USB_MEDIA_KEYBOARD_INTERFACE_COUNT]) {{
.classCode = USB_CLASS_HID,
.subclassCode = USB_HID_SUBCLASS_BOOT,
.protocolCode = USB_HID_PROTOCOL_KEYBOARD,
.interfaceNumber = USB_MEDIA_KEYBOARD_INTERFACE_INDEX,
.count = 1,
.interface = (usb_device_interface_struct_t[]) {{
.alternateSetting = USB_INTERFACE_ALTERNATE_SETTING_NONE,
.endpointList = {
USB_MEDIA_KEYBOARD_ENDPOINT_COUNT,
(usb_device_endpoint_struct_t[USB_MEDIA_KEYBOARD_ENDPOINT_COUNT]) {{
.endpointAddress = USB_MEDIA_KEYBOARD_ENDPOINT_INDEX | (USB_IN << USB_DESCRIPTOR_ENDPOINT_ADDRESS_DIRECTION_SHIFT),
.transferType = USB_ENDPOINT_INTERRUPT,
.maxPacketSize = USB_MEDIA_KEYBOARD_INTERRUPT_IN_PACKET_SIZE,
}}
}
}}
}}
}}
}}
},
{
.classCallback = UsbSystemKeyboardCallback,
.classInfomation = (usb_device_class_struct_t[]) {{
.type = kUSB_DeviceClassTypeHid,
.configurations = USB_DEVICE_CONFIGURATION_COUNT,
.interfaceList = (usb_device_interface_list_t[USB_DEVICE_CONFIGURATION_COUNT]) {{
.count = USB_SYSTEM_KEYBOARD_INTERFACE_COUNT,
.interfaces = (usb_device_interfaces_struct_t[USB_SYSTEM_KEYBOARD_INTERFACE_COUNT]) {{
.classCode = USB_CLASS_HID,
.subclassCode = USB_HID_SUBCLASS_BOOT,
.protocolCode = USB_HID_PROTOCOL_KEYBOARD,
.interfaceNumber = USB_SYSTEM_KEYBOARD_INTERFACE_INDEX,
.count = 1,
.interface = (usb_device_interface_struct_t[]) {{
.alternateSetting = USB_INTERFACE_ALTERNATE_SETTING_NONE,
.endpointList = {
USB_SYSTEM_KEYBOARD_ENDPOINT_COUNT,
(usb_device_endpoint_struct_t[USB_SYSTEM_KEYBOARD_ENDPOINT_COUNT]) {{
.endpointAddress = USB_SYSTEM_KEYBOARD_ENDPOINT_INDEX | (USB_IN << USB_DESCRIPTOR_ENDPOINT_ADDRESS_DIRECTION_SHIFT),
.transferType = USB_ENDPOINT_INTERRUPT,
.maxPacketSize = USB_SYSTEM_KEYBOARD_INTERRUPT_IN_PACKET_SIZE,
}}
}
}}
}}
}},
}}
},
{
.classCallback = UsbMouseCallback,
.classInfomation = (usb_device_class_struct_t[]) {{
.type = kUSB_DeviceClassTypeHid,
.configurations = USB_DEVICE_CONFIGURATION_COUNT,
.interfaceList = (usb_device_interface_list_t[USB_DEVICE_CONFIGURATION_COUNT]) {{
.count = USB_MOUSE_INTERFACE_COUNT,
.interfaces = (usb_device_interfaces_struct_t[USB_MOUSE_INTERFACE_COUNT]) {{
.classCode = USB_CLASS_HID,
.subclassCode = USB_HID_SUBCLASS_BOOT,
.protocolCode = USB_HID_PROTOCOL_MOUSE,
.interfaceNumber = USB_MOUSE_INTERFACE_INDEX,
.count = 1,
.interface = (usb_device_interface_struct_t[]) {{
.alternateSetting = USB_INTERFACE_ALTERNATE_SETTING_NONE,
.endpointList = {
USB_MOUSE_ENDPOINT_COUNT,
(usb_device_endpoint_struct_t[USB_MOUSE_ENDPOINT_COUNT]) {{
.endpointAddress = USB_MOUSE_ENDPOINT_INDEX | (USB_IN << USB_DESCRIPTOR_ENDPOINT_ADDRESS_DIRECTION_SHIFT),
.transferType = USB_ENDPOINT_INTERRUPT,
.maxPacketSize = USB_MOUSE_INTERRUPT_IN_PACKET_SIZE,
}}
}
}}
}}
}}
}}
}
}};
usb_device_class_config_list_struct_t UsbDeviceCompositeConfigList = { static usb_status_t usbDeviceCallback(usb_device_handle handle, uint32_t event, void *param)
UsbDeviceCompositeClassConfig,
UsbDeviceCallback,
USB_DEVICE_CONFIG_HID
};
static usb_status_t UsbDeviceCallback(usb_device_handle handle, uint32_t event, void *param)
{ {
usb_status_t error = kStatus_USB_Error; usb_status_t status = kStatus_USB_Error;
uint16_t *temp16 = (uint16_t*)param; uint16_t *temp16 = (uint16_t*)param;
uint8_t *temp8 = (uint8_t*)param; uint8_t *temp8 = (uint8_t*)param;
if (!param && event != kUSB_DeviceEventBusReset && event != kUSB_DeviceEventSetInterface) { if (!param && event != kUSB_DeviceEventBusReset && event != kUSB_DeviceEventSetInterface) {
return error; return status;
} }
switch (event) { switch (event) {
case kUSB_DeviceEventBusReset: case kUSB_DeviceEventBusReset:
UsbCompositeDevice.attach = 0; UsbCompositeDevice.attach = 0;
error = kStatus_USB_Success; status = kStatus_USB_Success;
break; break;
case kUSB_DeviceEventSetConfiguration: case kUSB_DeviceEventSetConfiguration:
UsbCompositeDevice.attach = 1; UsbCompositeDevice.attach = 1;
@@ -45,11 +183,11 @@ static usb_status_t UsbDeviceCallback(usb_device_handle handle, uint32_t event,
UsbMediaKeyboardSetConfiguration(UsbCompositeDevice.mediaKeyboardHandle, *temp8); UsbMediaKeyboardSetConfiguration(UsbCompositeDevice.mediaKeyboardHandle, *temp8);
UsbSystemKeyboardSetConfiguration(UsbCompositeDevice.systemKeyboardHandle, *temp8); UsbSystemKeyboardSetConfiguration(UsbCompositeDevice.systemKeyboardHandle, *temp8);
UsbMouseSetConfiguration(UsbCompositeDevice.mouseHandle, *temp8); UsbMouseSetConfiguration(UsbCompositeDevice.mouseHandle, *temp8);
error = kStatus_USB_Success; status = kStatus_USB_Success;
break; break;
case kUSB_DeviceEventGetConfiguration: case kUSB_DeviceEventGetConfiguration:
*temp8 = UsbCompositeDevice.currentConfiguration; *temp8 = UsbCompositeDevice.currentConfiguration;
error = kStatus_USB_Success; status = kStatus_USB_Success;
break; break;
case kUSB_DeviceEventSetInterface: case kUSB_DeviceEventSetInterface:
if (UsbCompositeDevice.attach) { if (UsbCompositeDevice.attach) {
@@ -62,7 +200,7 @@ static usb_status_t UsbDeviceCallback(usb_device_handle handle, uint32_t event,
UsbMediaKeyboardSetInterface(UsbCompositeDevice.mediaKeyboardHandle, interface, alternateSetting); UsbMediaKeyboardSetInterface(UsbCompositeDevice.mediaKeyboardHandle, interface, alternateSetting);
UsbSystemKeyboardSetInterface(UsbCompositeDevice.systemKeyboardHandle, interface, alternateSetting); UsbSystemKeyboardSetInterface(UsbCompositeDevice.systemKeyboardHandle, interface, alternateSetting);
UsbMouseSetInterface(UsbCompositeDevice.mouseHandle, interface, alternateSetting); UsbMouseSetInterface(UsbCompositeDevice.mouseHandle, interface, alternateSetting);
error = kStatus_USB_Success; status = kStatus_USB_Success;
} }
} }
break; break;
@@ -70,32 +208,32 @@ static usb_status_t UsbDeviceCallback(usb_device_handle handle, uint32_t event,
uint8_t interface = (uint8_t)((*temp16 & 0xFF00) >> 8); uint8_t interface = (uint8_t)((*temp16 & 0xFF00) >> 8);
if (interface < USB_DEVICE_CONFIG_HID) { if (interface < USB_DEVICE_CONFIG_HID) {
*temp16 = (*temp16 & 0xFF00) | UsbCompositeDevice.currentInterfaceAlternateSetting[interface]; *temp16 = (*temp16 & 0xFF00) | UsbCompositeDevice.currentInterfaceAlternateSetting[interface];
error = kStatus_USB_Success; status = kStatus_USB_Success;
} else { } else {
error = kStatus_USB_InvalidRequest; status = kStatus_USB_InvalidRequest;
} }
break; break;
case kUSB_DeviceEventGetDeviceDescriptor: case kUSB_DeviceEventGetDeviceDescriptor:
error = USB_DeviceGetDeviceDescriptor(handle, (usb_device_get_device_descriptor_struct_t *)param); status = USB_DeviceGetDeviceDescriptor(handle, (usb_device_get_device_descriptor_struct_t *)param);
break; break;
case kUSB_DeviceEventGetConfigurationDescriptor: case kUSB_DeviceEventGetConfigurationDescriptor:
error = USB_DeviceGetConfigurationDescriptor(handle, (usb_device_get_configuration_descriptor_struct_t *)param); status = USB_DeviceGetConfigurationDescriptor(handle, (usb_device_get_configuration_descriptor_struct_t *)param);
break; break;
case kUSB_DeviceEventGetStringDescriptor: case kUSB_DeviceEventGetStringDescriptor:
error = USB_DeviceGetStringDescriptor(handle, (usb_device_get_string_descriptor_struct_t *)param); status = USB_DeviceGetStringDescriptor(handle, (usb_device_get_string_descriptor_struct_t *)param);
break; break;
case kUSB_DeviceEventGetHidDescriptor: case kUSB_DeviceEventGetHidDescriptor:
error = USB_DeviceGetHidDescriptor(handle, (usb_device_get_hid_descriptor_struct_t *)param); status = USB_DeviceGetHidDescriptor(handle, (usb_device_get_hid_descriptor_struct_t *)param);
break; break;
case kUSB_DeviceEventGetHidReportDescriptor: case kUSB_DeviceEventGetHidReportDescriptor:
error = USB_DeviceGetHidReportDescriptor(handle, (usb_device_get_hid_report_descriptor_struct_t *)param); status = USB_DeviceGetHidReportDescriptor(handle, (usb_device_get_hid_report_descriptor_struct_t *)param);
break; break;
case kUSB_DeviceEventGetHidPhysicalDescriptor: case kUSB_DeviceEventGetHidPhysicalDescriptor:
error = USB_DeviceGetHidPhysicalDescriptor(handle, (usb_device_get_hid_physical_descriptor_struct_t *)param); status = USB_DeviceGetHidPhysicalDescriptor(handle, (usb_device_get_hid_physical_descriptor_struct_t *)param);
break; break;
} }
return error; return status;
} }
void USB0_IRQHandler(void) void USB0_IRQHandler(void)
@@ -107,9 +245,6 @@ void USB0_IRQHandler(void)
void InitUsb(void) void InitUsb(void)
{ {
uint8_t usbDeviceKhciIrq[] = USB_IRQS;
uint8_t irqNumber = usbDeviceKhciIrq[CONTROLLER_ID - kUSB_ControllerKhci0];
SystemCoreClockUpdate(); SystemCoreClockUpdate();
CLOCK_EnableUsbfs0Clock(kCLOCK_UsbSrcIrc48M, 48000000); CLOCK_EnableUsbfs0Clock(kCLOCK_UsbSrcIrc48M, 48000000);
@@ -121,7 +256,8 @@ void InitUsb(void)
UsbCompositeDevice.systemKeyboardHandle = UsbDeviceCompositeConfigList.config[USB_SYSTEM_KEYBOARD_INTERFACE_INDEX].classHandle; UsbCompositeDevice.systemKeyboardHandle = UsbDeviceCompositeConfigList.config[USB_SYSTEM_KEYBOARD_INTERFACE_INDEX].classHandle;
UsbCompositeDevice.mouseHandle = UsbDeviceCompositeConfigList.config[USB_MOUSE_INTERFACE_INDEX].classHandle; UsbCompositeDevice.mouseHandle = UsbDeviceCompositeConfigList.config[USB_MOUSE_INTERFACE_INDEX].classHandle;
NVIC_SetPriority((IRQn_Type)irqNumber, USB_DEVICE_INTERRUPT_PRIORITY); uint8_t usbDeviceKhciIrq[] = USB_IRQS;
uint8_t irqNumber = usbDeviceKhciIrq[CONTROLLER_ID - kUSB_ControllerKhci0];
NVIC_EnableIRQ((IRQn_Type)irqNumber); NVIC_EnableIRQ((IRQn_Type)irqNumber);
USB_DeviceRun(UsbCompositeDevice.deviceHandle); USB_DeviceRun(UsbCompositeDevice.deviceHandle);

View File

@@ -1,46 +1,7 @@
#include "main.h"
#include "key_action.h"
#include "fsl_port.h"
#include "usb_api.h"
#include "usb_composite_device.h" #include "usb_composite_device.h"
#include "peripherals/test_led.h"
#include "fsl_i2c.h"
#include "i2c.h"
#include "i2c_addresses.h"
static usb_device_endpoint_struct_t UsbBasicKeyboardEndpoints[USB_BASIC_KEYBOARD_ENDPOINT_COUNT] = {{
USB_BASIC_KEYBOARD_ENDPOINT_INDEX | (USB_IN << USB_DESCRIPTOR_ENDPOINT_ADDRESS_DIRECTION_SHIFT),
USB_ENDPOINT_INTERRUPT,
USB_BASIC_KEYBOARD_INTERRUPT_IN_PACKET_SIZE,
}};
static usb_device_interface_struct_t UsbBasicKeyboardInterface[] = {{
USB_INTERFACE_ALTERNATE_SETTING_NONE,
{USB_BASIC_KEYBOARD_ENDPOINT_COUNT, UsbBasicKeyboardEndpoints},
NULL,
}};
static usb_device_interfaces_struct_t UsbBasicKeyboardInterfaces[USB_BASIC_KEYBOARD_INTERFACE_COUNT] = {{
USB_CLASS_HID,
USB_HID_SUBCLASS_BOOT,
USB_HID_PROTOCOL_KEYBOARD,
USB_BASIC_KEYBOARD_INTERFACE_INDEX,
UsbBasicKeyboardInterface,
sizeof(UsbBasicKeyboardInterface) / sizeof(usb_device_interfaces_struct_t),
}};
static usb_device_interface_list_t UsbBasicKeyboardInterfaceList[USB_DEVICE_CONFIGURATION_COUNT] = {{
USB_BASIC_KEYBOARD_INTERFACE_COUNT,
UsbBasicKeyboardInterfaces,
}};
usb_device_class_struct_t UsbBasicKeyboardClass = {
UsbBasicKeyboardInterfaceList,
kUSB_DeviceClassTypeHid,
USB_DEVICE_CONFIGURATION_COUNT,
};
static usb_basic_keyboard_report_t usbBasicKeyboardReports[2]; static usb_basic_keyboard_report_t usbBasicKeyboardReports[2];
uint32_t UsbBasicKeyboardActionCounter;
usb_basic_keyboard_report_t* ActiveUsbBasicKeyboardReport = usbBasicKeyboardReports; usb_basic_keyboard_report_t* ActiveUsbBasicKeyboardReport = usbBasicKeyboardReports;
bool IsUsbBasicKeyboardReportSent = false; bool IsUsbBasicKeyboardReportSent = false;
@@ -65,6 +26,7 @@ static usb_status_t UsbBasicKeyboardAction(void)
UsbCompositeDevice.basicKeyboardHandle, USB_BASIC_KEYBOARD_ENDPOINT_INDEX, UsbCompositeDevice.basicKeyboardHandle, USB_BASIC_KEYBOARD_ENDPOINT_INDEX,
(uint8_t*)getInactiveUsbBasicKeyboardReport(), USB_BASIC_KEYBOARD_REPORT_LENGTH); (uint8_t*)getInactiveUsbBasicKeyboardReport(), USB_BASIC_KEYBOARD_REPORT_LENGTH);
IsUsbBasicKeyboardReportSent = true; IsUsbBasicKeyboardReportSent = true;
UsbBasicKeyboardActionCounter++;
return status; return status;
} }

View File

@@ -32,7 +32,7 @@
// Variables: // Variables:
extern bool IsUsbBasicKeyboardReportSent; extern bool IsUsbBasicKeyboardReportSent;
extern usb_device_class_struct_t UsbBasicKeyboardClass; extern uint32_t UsbBasicKeyboardActionCounter;
extern usb_basic_keyboard_report_t* ActiveUsbBasicKeyboardReport; extern usb_basic_keyboard_report_t* ActiveUsbBasicKeyboardReport;
// Functions: // Functions:

View File

@@ -1,47 +1,7 @@
#include "usb_composite_device.h" #include "usb_composite_device.h"
#include "usb_interface_generic_hid.h"
#include "usb_protocol_handler.h" #include "usb_protocol_handler.h"
static usb_device_endpoint_struct_t UsbGenericHidEndpoints[USB_GENERIC_HID_ENDPOINT_COUNT] = uint32_t UsbGenericHidActionCounter;
{
{
USB_GENERIC_HID_ENDPOINT_IN_INDEX | (USB_IN << USB_DESCRIPTOR_ENDPOINT_ADDRESS_DIRECTION_SHIFT),
USB_ENDPOINT_INTERRUPT,
USB_GENERIC_HID_INTERRUPT_IN_PACKET_SIZE,
},
{
USB_GENERIC_HID_ENDPOINT_OUT_INDEX | (USB_OUT << USB_DESCRIPTOR_ENDPOINT_ADDRESS_DIRECTION_SHIFT),
USB_ENDPOINT_INTERRUPT,
USB_GENERIC_HID_INTERRUPT_OUT_PACKET_SIZE,
}
};
static usb_device_interface_struct_t UsbGenericHidInterface[] = {{
USB_INTERFACE_ALTERNATE_SETTING_NONE,
{USB_GENERIC_HID_ENDPOINT_COUNT, UsbGenericHidEndpoints},
NULL,
}};
static usb_device_interfaces_struct_t UsbGenericHidInterfaces[USB_GENERIC_HID_INTERFACE_COUNT] = {{
USB_CLASS_HID,
USB_HID_SUBCLASS_NONE,
USB_HID_PROTOCOL_NONE,
USB_GENERIC_HID_INTERFACE_INDEX,
UsbGenericHidInterface,
sizeof(UsbGenericHidInterface) / sizeof(usb_device_interfaces_struct_t),
}};
static usb_device_interface_list_t UsbGenericHidInterfaceList[USB_DEVICE_CONFIGURATION_COUNT] = {{
USB_GENERIC_HID_INTERFACE_COUNT,
UsbGenericHidInterfaces,
}};
usb_device_class_struct_t UsbGenericHidClass = {
UsbGenericHidInterfaceList,
kUSB_DeviceClassTypeHid,
USB_DEVICE_CONFIGURATION_COUNT,
};
uint8_t GenericHidInBuffer[USB_GENERIC_HID_IN_BUFFER_LENGTH]; uint8_t GenericHidInBuffer[USB_GENERIC_HID_IN_BUFFER_LENGTH];
uint8_t GenericHidOutBuffer[USB_GENERIC_HID_OUT_BUFFER_LENGTH]; uint8_t GenericHidOutBuffer[USB_GENERIC_HID_OUT_BUFFER_LENGTH];
@@ -67,6 +27,7 @@ usb_status_t UsbGenericHidCallback(class_handle_t handle, uint32_t event, void *
USB_GENERIC_HID_ENDPOINT_IN_INDEX, USB_GENERIC_HID_ENDPOINT_IN_INDEX,
GenericHidOutBuffer, GenericHidOutBuffer,
USB_GENERIC_HID_OUT_BUFFER_LENGTH); USB_GENERIC_HID_OUT_BUFFER_LENGTH);
UsbGenericHidActionCounter++;
return UsbReceiveData(); return UsbReceiveData();
break; break;
case kUSB_DeviceHidEventGetReport: case kUSB_DeviceHidEventGetReport:

View File

@@ -25,7 +25,7 @@
// Variables: // Variables:
extern usb_device_class_struct_t UsbGenericHidClass; extern uint32_t UsbGenericHidActionCounter;
extern uint8_t GenericHidInBuffer[USB_GENERIC_HID_IN_BUFFER_LENGTH]; extern uint8_t GenericHidInBuffer[USB_GENERIC_HID_IN_BUFFER_LENGTH];
extern uint8_t GenericHidOutBuffer[USB_GENERIC_HID_OUT_BUFFER_LENGTH]; extern uint8_t GenericHidOutBuffer[USB_GENERIC_HID_OUT_BUFFER_LENGTH];

View File

@@ -1,45 +1,6 @@
#include "main.h"
#include "key_action.h"
#include "fsl_port.h"
#include "usb_api.h"
#include "usb_composite_device.h" #include "usb_composite_device.h"
#include "peripherals/test_led.h"
#include "fsl_i2c.h"
#include "i2c.h"
#include "i2c_addresses.h"
static usb_device_endpoint_struct_t UsbMediaKeyboardEndpoints[USB_MEDIA_KEYBOARD_ENDPOINT_COUNT] = {{
USB_MEDIA_KEYBOARD_ENDPOINT_INDEX | (USB_IN << USB_DESCRIPTOR_ENDPOINT_ADDRESS_DIRECTION_SHIFT),
USB_ENDPOINT_INTERRUPT,
USB_MEDIA_KEYBOARD_INTERRUPT_IN_PACKET_SIZE,
}};
static usb_device_interface_struct_t UsbMediaKeyboardInterface[] = {{
USB_INTERFACE_ALTERNATE_SETTING_NONE,
{USB_MEDIA_KEYBOARD_ENDPOINT_COUNT, UsbMediaKeyboardEndpoints},
NULL,
}};
static usb_device_interfaces_struct_t UsbMediaKeyboardInterfaces[USB_MEDIA_KEYBOARD_INTERFACE_COUNT] = {{
USB_CLASS_HID,
USB_HID_SUBCLASS_BOOT,
USB_HID_PROTOCOL_KEYBOARD,
USB_MEDIA_KEYBOARD_INTERFACE_INDEX,
UsbMediaKeyboardInterface,
sizeof(UsbMediaKeyboardInterface) / sizeof(usb_device_interfaces_struct_t),
}};
static usb_device_interface_list_t UsbMediaKeyboardInterfaceList[USB_DEVICE_CONFIGURATION_COUNT] = {{
USB_MEDIA_KEYBOARD_INTERFACE_COUNT,
UsbMediaKeyboardInterfaces,
}};
usb_device_class_struct_t UsbMediaKeyboardClass = {
UsbMediaKeyboardInterfaceList,
kUSB_DeviceClassTypeHid,
USB_DEVICE_CONFIGURATION_COUNT,
};
uint32_t UsbMediaKeyboardActionCounter;
static usb_media_keyboard_report_t usbMediaKeyboardReports[2]; static usb_media_keyboard_report_t usbMediaKeyboardReports[2];
usb_media_keyboard_report_t* ActiveUsbMediaKeyboardReport = usbMediaKeyboardReports; usb_media_keyboard_report_t* ActiveUsbMediaKeyboardReport = usbMediaKeyboardReports;
bool IsUsbMediaKeyboardReportSent = false; bool IsUsbMediaKeyboardReportSent = false;
@@ -65,6 +26,7 @@ static usb_status_t UsbMediaKeyboardAction(void)
UsbCompositeDevice.mediaKeyboardHandle, USB_MEDIA_KEYBOARD_ENDPOINT_INDEX, UsbCompositeDevice.mediaKeyboardHandle, USB_MEDIA_KEYBOARD_ENDPOINT_INDEX,
(uint8_t*)getInactiveUsbMediaKeyboardReport(), USB_MEDIA_KEYBOARD_REPORT_LENGTH); (uint8_t*)getInactiveUsbMediaKeyboardReport(), USB_MEDIA_KEYBOARD_REPORT_LENGTH);
IsUsbMediaKeyboardReportSent = true; IsUsbMediaKeyboardReportSent = true;
UsbMediaKeyboardActionCounter++;
return status; return status;
} }

View File

@@ -29,7 +29,7 @@
// Variables: // Variables:
extern bool IsUsbMediaKeyboardReportSent; extern bool IsUsbMediaKeyboardReportSent;
extern usb_device_class_struct_t UsbMediaKeyboardClass; extern uint32_t UsbMediaKeyboardActionCounter;
extern usb_media_keyboard_report_t* ActiveUsbMediaKeyboardReport; extern usb_media_keyboard_report_t* ActiveUsbMediaKeyboardReport;
// Functions: // Functions:

View File

@@ -1,45 +1,7 @@
#include "usb_composite_device.h" #include "usb_composite_device.h"
#include "usb_interface_mouse.h"
#include "fsl_i2c.h"
#include "i2c.h"
#include "peripherals/reset_button.h"
#include "key_action.h"
#include "buffer.h"
#include "usb_commands/usb_command_get_debug_buffer.h"
static usb_device_endpoint_struct_t UsbMouseEndpoints[USB_MOUSE_ENDPOINT_COUNT] = {{ uint32_t UsbMouseActionCounter;
USB_MOUSE_ENDPOINT_INDEX | (USB_IN << USB_DESCRIPTOR_ENDPOINT_ADDRESS_DIRECTION_SHIFT), static usb_mouse_report_t usbMouseReports[2];
USB_ENDPOINT_INTERRUPT,
USB_MOUSE_INTERRUPT_IN_PACKET_SIZE,
}};
static usb_device_interface_struct_t UsbMouseInterface[] = {{
USB_INTERFACE_ALTERNATE_SETTING_NONE,
{USB_MOUSE_ENDPOINT_COUNT, UsbMouseEndpoints},
NULL,
}};
static usb_device_interfaces_struct_t UsbMouseInterfaces[USB_MOUSE_INTERFACE_COUNT] = {{
USB_CLASS_HID,
USB_HID_SUBCLASS_BOOT,
USB_HID_PROTOCOL_MOUSE,
USB_MOUSE_INTERFACE_INDEX,
UsbMouseInterface,
sizeof(UsbMouseInterface) / sizeof(usb_device_interfaces_struct_t),
}};
static usb_device_interface_list_t UsbMouseInterfaceList[USB_DEVICE_CONFIGURATION_COUNT] = {{
USB_MOUSE_INTERFACE_COUNT,
UsbMouseInterfaces,
}};
usb_device_class_struct_t UsbMouseClass = {
UsbMouseInterfaceList,
kUSB_DeviceClassTypeHid,
USB_DEVICE_CONFIGURATION_COUNT,
};
usb_mouse_report_t usbMouseReports[2];
usb_mouse_report_t* ActiveUsbMouseReport = usbMouseReports; usb_mouse_report_t* ActiveUsbMouseReport = usbMouseReports;
bool IsUsbMouseReportSent = false; bool IsUsbMouseReportSent = false;
@@ -58,16 +20,9 @@ void ResetActiveUsbMouseReport(void)
bzero(ActiveUsbMouseReport, USB_MOUSE_REPORT_LENGTH); bzero(ActiveUsbMouseReport, USB_MOUSE_REPORT_LENGTH);
} }
static uint32_t count1 = 0;
static uint32_t count2 = 0;
static uint32_t count3 = 0;
static volatile usb_status_t usbMouseAction(void) static volatile usb_status_t usbMouseAction(void)
{ {
count3++;
usb_mouse_report_t *mouseReport = getInactiveUsbMouseReport(); usb_mouse_report_t *mouseReport = getInactiveUsbMouseReport();
SetDebugBufferUint16(29, mouseReport->x);
SetDebugBufferUint16(31, mouseReport->y);
IsUsbMouseReportSent = true; IsUsbMouseReportSent = true;
return USB_DeviceHidSend(UsbCompositeDevice.mouseHandle, USB_MOUSE_ENDPOINT_INDEX, return USB_DeviceHidSend(UsbCompositeDevice.mouseHandle, USB_MOUSE_ENDPOINT_INDEX,
(uint8_t*)mouseReport, USB_MOUSE_REPORT_LENGTH); (uint8_t*)mouseReport, USB_MOUSE_REPORT_LENGTH);
@@ -75,17 +30,11 @@ static volatile usb_status_t usbMouseAction(void)
usb_status_t UsbMouseCallback(class_handle_t handle, uint32_t event, void *param) usb_status_t UsbMouseCallback(class_handle_t handle, uint32_t event, void *param)
{ {
SetDebugBufferUint32(17, count1); UsbMouseActionCounter++;
SetDebugBufferUint32(21, count2);
SetDebugBufferUint32(25, count3);
count1++;
usb_status_t error = kStatus_USB_Error; usb_status_t error = kStatus_USB_Error;
switch (event) { switch (event) {
case kUSB_DeviceHidEventSendResponse: case kUSB_DeviceHidEventSendResponse:
count2++;
if (UsbCompositeDevice.attach) { if (UsbCompositeDevice.attach) {
return usbMouseAction(); return usbMouseAction();
} }

View File

@@ -25,14 +25,14 @@
uint8_t buttons; uint8_t buttons;
int16_t x; int16_t x;
int16_t y; int16_t y;
int8_t wheelX;
int8_t wheelY; int8_t wheelY;
int8_t wheelX;
} ATTR_PACKED usb_mouse_report_t; } ATTR_PACKED usb_mouse_report_t;
// Variables: // Variables:
extern bool IsUsbMouseReportSent; extern bool IsUsbMouseReportSent;
extern usb_device_class_struct_t UsbMouseClass; extern uint32_t UsbMouseActionCounter;
extern usb_mouse_report_t* ActiveUsbMouseReport; extern usb_mouse_report_t* ActiveUsbMouseReport;
// Functions: // Functions:

View File

@@ -1,45 +1,6 @@
#include "main.h"
#include "key_action.h"
#include "fsl_port.h"
#include "usb_api.h"
#include "usb_composite_device.h" #include "usb_composite_device.h"
#include "peripherals/test_led.h"
#include "fsl_i2c.h"
#include "i2c.h"
#include "i2c_addresses.h"
static usb_device_endpoint_struct_t UsbSystemKeyboardEndpoints[USB_SYSTEM_KEYBOARD_ENDPOINT_COUNT] = {{
USB_SYSTEM_KEYBOARD_ENDPOINT_INDEX | (USB_IN << USB_DESCRIPTOR_ENDPOINT_ADDRESS_DIRECTION_SHIFT),
USB_ENDPOINT_INTERRUPT,
USB_SYSTEM_KEYBOARD_INTERRUPT_IN_PACKET_SIZE,
}};
static usb_device_interface_struct_t UsbSystemKeyboardInterface[] = {{
USB_INTERFACE_ALTERNATE_SETTING_NONE,
{USB_SYSTEM_KEYBOARD_ENDPOINT_COUNT, UsbSystemKeyboardEndpoints},
NULL,
}};
static usb_device_interfaces_struct_t UsbSystemKeyboardInterfaces[USB_SYSTEM_KEYBOARD_INTERFACE_COUNT] = {{
USB_CLASS_HID,
USB_HID_SUBCLASS_BOOT,
USB_HID_PROTOCOL_KEYBOARD,
USB_SYSTEM_KEYBOARD_INTERFACE_INDEX,
UsbSystemKeyboardInterface,
sizeof(UsbSystemKeyboardInterface) / sizeof(usb_device_interfaces_struct_t),
}};
static usb_device_interface_list_t UsbSystemKeyboardInterfaceList[USB_DEVICE_CONFIGURATION_COUNT] = {{
USB_SYSTEM_KEYBOARD_INTERFACE_COUNT,
UsbSystemKeyboardInterfaces,
}};
usb_device_class_struct_t UsbSystemKeyboardClass = {
UsbSystemKeyboardInterfaceList,
kUSB_DeviceClassTypeHid,
USB_DEVICE_CONFIGURATION_COUNT,
};
uint32_t UsbSystemKeyboardActionCounter;
static usb_system_keyboard_report_t usbSystemKeyboardReports[2]; static usb_system_keyboard_report_t usbSystemKeyboardReports[2];
usb_system_keyboard_report_t* ActiveUsbSystemKeyboardReport = usbSystemKeyboardReports; usb_system_keyboard_report_t* ActiveUsbSystemKeyboardReport = usbSystemKeyboardReports;
bool IsUsbSystemKeyboardReportSent = false; bool IsUsbSystemKeyboardReportSent = false;
@@ -65,6 +26,7 @@ static usb_status_t UsbSystemKeyboardAction(void)
UsbCompositeDevice.systemKeyboardHandle, USB_SYSTEM_KEYBOARD_ENDPOINT_INDEX, UsbCompositeDevice.systemKeyboardHandle, USB_SYSTEM_KEYBOARD_ENDPOINT_INDEX,
(uint8_t*)getInactiveUsbSystemKeyboardReport(), USB_SYSTEM_KEYBOARD_REPORT_LENGTH); (uint8_t*)getInactiveUsbSystemKeyboardReport(), USB_SYSTEM_KEYBOARD_REPORT_LENGTH);
IsUsbSystemKeyboardReportSent = true; IsUsbSystemKeyboardReportSent = true;
UsbSystemKeyboardActionCounter++;
return status; return status;
} }

View File

@@ -30,7 +30,7 @@
// Variables: // Variables:
extern bool IsUsbSystemKeyboardReportSent; extern bool IsUsbSystemKeyboardReportSent;
extern usb_device_class_struct_t UsbSystemKeyboardClass; extern uint32_t UsbSystemKeyboardActionCounter;
extern usb_system_keyboard_report_t* ActiveUsbSystemKeyboardReport; extern usb_system_keyboard_report_t* ActiveUsbSystemKeyboardReport;
// Functions: // Functions:

View File

@@ -11,8 +11,8 @@
#include "usb_commands/usb_command_read_config.h" #include "usb_commands/usb_command_read_config.h"
#include "usb_commands/usb_command_get_keyboard_state.h" #include "usb_commands/usb_command_get_keyboard_state.h"
#include "usb_commands/usb_command_get_debug_buffer.h" #include "usb_commands/usb_command_get_debug_buffer.h"
#include "usb_commands/usb_command_jump_to_slave_bootloader.h" #include "usb_commands/usb_command_jump_to_module_bootloader.h"
#include "usb_commands/usb_command_send_kboot_command.h" #include "usb_commands/usb_command_send_kboot_command_to_module.h"
void UsbProtocolHandler(void) void UsbProtocolHandler(void)
{ {
@@ -55,14 +55,14 @@ void UsbProtocolHandler(void)
case UsbCommandId_GetKeyboardState: case UsbCommandId_GetKeyboardState:
UsbCommand_GetKeyboardState(); UsbCommand_GetKeyboardState();
break; break;
case UsbCommandId_GetDebugInfo: case UsbCommandId_GetDebugBuffer:
UsbCommand_GetDebugBuffer(); UsbCommand_GetDebugBuffer();
break; break;
case UsbCommandId_JumpToModuleBootloader: case UsbCommandId_JumpToModuleBootloader:
UsbCommand_JumpToSlaveBootloader(); UsbCommand_JumpToModuleBootloader();
break; break;
case UsbCommandId_SendKbootCommandToModule: case UsbCommandId_SendKbootCommandToModule:
UsbCommand_SendKbootCommand(); UsbCommand_SendKbootCommandToModule();
break; break;
default: default:
SetUsbTxBufferUint8(0, UsbStatusCode_InvalidCommand); SetUsbTxBufferUint8(0, UsbStatusCode_InvalidCommand);

View File

@@ -13,21 +13,21 @@
// Typedefs: // Typedefs:
typedef enum { typedef enum {
UsbCommandId_GetProperty = 0, UsbCommandId_GetProperty = 0x00,
UsbCommandId_Reenumerate = 1, UsbCommandId_Reenumerate = 0x01,
UsbCommandId_SetTestLed = 2, UsbCommandId_SetTestLed = 0x02,
UsbCommandId_WriteUserConfig = 8, UsbCommandId_WriteUserConfig = 0x08,
UsbCommandId_ApplyConfig = 9, UsbCommandId_ApplyConfig = 0x09,
UsbCommandId_SetLedPwmBrightness = 10, UsbCommandId_SetLedPwmBrightness = 0x0A,
UsbCommandId_GetAdcValue = 11, UsbCommandId_GetAdcValue = 0x0B,
UsbCommandId_LaunchEepromTransferLegacy = 12, UsbCommandId_LaunchEepromTransferLegacy = 0x0C,
UsbCommandId_ReadHardwareConfig = 13, UsbCommandId_ReadHardwareConfig = 0x0D,
UsbCommandId_WriteHardwareConfig = 14, UsbCommandId_WriteHardwareConfig = 0x0E,
UsbCommandId_ReadUserConfig = 15, UsbCommandId_ReadUserConfig = 0x0F,
UsbCommandId_GetKeyboardState = 16, UsbCommandId_GetKeyboardState = 0x10,
UsbCommandId_GetDebugInfo = 17, UsbCommandId_GetDebugBuffer = 0x11,
UsbCommandId_JumpToModuleBootloader = 18, UsbCommandId_JumpToModuleBootloader = 0x12,
UsbCommandId_SendKbootCommandToModule = 19, UsbCommandId_SendKbootCommandToModule = 0x13,
} usb_command_id_t; } usb_command_id_t;
typedef enum { typedef enum {

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"
@@ -13,76 +14,174 @@
#include "usb_report_updater.h" #include "usb_report_updater.h"
#include "timer.h" #include "timer.h"
#include "key_debouncer.h" #include "key_debouncer.h"
#include "config_parser/parse_keymap.h"
#include "usb_commands/usb_command_get_debug_buffer.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;
void processMouseAction(key_action_t *action) uint16_t DoubleTapSwitchLayerTimeout = 250;
static bool activeMouseStates[ACTIVE_MOUSE_STATES_COUNT];
mouse_kinetic_state_t MouseMoveState = {
.isScroll = false,
.upState = SerializedMouseAction_MoveUp,
.downState = SerializedMouseAction_MoveDown,
.leftState = SerializedMouseAction_MoveLeft,
.rightState = SerializedMouseAction_MoveRight,
.intMultiplier = 25,
.initialSpeed = 5,
.acceleration = 35,
.deceleratedSpeed = 10,
.baseSpeed = 40,
.acceleratedSpeed = 80,
};
mouse_kinetic_state_t MouseScrollState = {
.isScroll = true,
.upState = SerializedMouseAction_ScrollDown,
.downState = SerializedMouseAction_ScrollUp,
.leftState = SerializedMouseAction_ScrollLeft,
.rightState = SerializedMouseAction_ScrollRight,
.intMultiplier = 1,
.initialSpeed = 20,
.acceleration = 20,
.deceleratedSpeed = 10,
.baseSpeed = 20,
.acceleratedSpeed = 50,
};
void processMouseKineticState(mouse_kinetic_state_t *kineticState)
{ {
bool isWheelAction = action->mouse.scrollActions && !action->mouse.moveActions && !action->mouse.buttonActions; float initialSpeed = kineticState->intMultiplier * kineticState->initialSpeed;
uint16_t distance = mouseSpeed * elapsedTime / 25; float acceleration = kineticState->intMultiplier * kineticState->acceleration;
float deceleratedSpeed = kineticState->intMultiplier * kineticState->deceleratedSpeed;
float baseSpeed = kineticState->intMultiplier * kineticState->baseSpeed;
float acceleratedSpeed = kineticState->intMultiplier * kineticState->acceleratedSpeed;
if (isWheelAction && wasPreviousMouseActionWheelAction) { if (!kineticState->wasMoveAction && !activeMouseStates[SerializedMouseAction_Decelerate]) {
mouseWheelDivisorCounter++; kineticState->currentSpeed = initialSpeed;
} }
if (action->mouse.scrollActions) { bool isMoveAction = activeMouseStates[kineticState->upState] ||
if (mouseWheelDivisorCounter == MOUSE_WHEEL_DIVISOR) { activeMouseStates[kineticState->downState] ||
mouseWheelDivisorCounter = 0; activeMouseStates[kineticState->leftState] ||
if (action->mouse.scrollActions & MouseScroll_Up) { activeMouseStates[kineticState->rightState];
ActiveUsbMouseReport->wheelX = 1;
} mouse_speed_t mouseSpeed = MouseSpeed_Normal;
if (action->mouse.scrollActions & MouseScroll_Down) { if (activeMouseStates[SerializedMouseAction_Accelerate]) {
ActiveUsbMouseReport->wheelX = -1; kineticState->targetSpeed = acceleratedSpeed;
} mouseSpeed = MouseSpeed_Accelerated;
} } else if (activeMouseStates[SerializedMouseAction_Decelerate]) {
kineticState->targetSpeed = deceleratedSpeed;
mouseSpeed = MouseSpeed_Decelerated;
} else if (isMoveAction) {
kineticState->targetSpeed = baseSpeed;
} }
if (action->mouse.moveActions & MouseMove_Accelerate || action->mouse.moveActions & MouseMove_Decelerate) { if (mouseSpeed == MouseSpeed_Accelerated || (kineticState->wasMoveAction && isMoveAction && (kineticState->prevMouseSpeed != mouseSpeed))) {
mouseSpeedAccelDivisorCounter++; kineticState->currentSpeed = kineticState->targetSpeed;
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) {
ActiveUsbMouseReport->x = -distance;
}
if (action->mouse.moveActions & MouseMove_Right) {
ActiveUsbMouseReport->x = distance;
}
if (action->mouse.moveActions & MouseMove_Up) {
ActiveUsbMouseReport->y = -distance;
}
if (action->mouse.moveActions & MouseMove_Down) {
ActiveUsbMouseReport->y = distance;
}
} }
ActiveUsbMouseReport->buttons |= action->mouse.buttonActions; if (isMoveAction) {
if (kineticState->currentSpeed < kineticState->targetSpeed) {
kineticState->currentSpeed += acceleration * elapsedTime / 1000;
if (kineticState->currentSpeed > kineticState->targetSpeed) {
kineticState->currentSpeed = kineticState->targetSpeed;
}
} else {
kineticState->currentSpeed -= acceleration * elapsedTime / 1000;
if (kineticState->currentSpeed < kineticState->targetSpeed) {
kineticState->currentSpeed = kineticState->targetSpeed;
}
}
wasPreviousMouseActionWheelAction = isWheelAction; float distance = kineticState->currentSpeed * elapsedTime / 1000;
if (kineticState->isScroll && !kineticState->wasMoveAction) {
kineticState->xSum = 0;
kineticState->ySum = 0;
}
if (activeMouseStates[kineticState->leftState]) {
kineticState->xSum -= distance;
} else if (activeMouseStates[kineticState->rightState]) {
kineticState->xSum += distance;
}
float xSumInt;
float xSumFrac = modff(kineticState->xSum, &xSumInt);
kineticState->xSum = xSumFrac;
kineticState->xOut = xSumInt;
if (kineticState->isScroll && !kineticState->wasMoveAction && kineticState->xOut == 0) {
kineticState->xOut = kineticState->xSum > 0 ? 1 : -1;
kineticState->xSum = 0;
}
if (activeMouseStates[kineticState->upState]) {
kineticState->ySum -= distance;
} else if (activeMouseStates[kineticState->downState]) {
kineticState->ySum += distance;
}
float ySumInt;
float ySumFrac = modff(kineticState->ySum, &ySumInt);
kineticState->ySum = ySumFrac;
kineticState->yOut = ySumInt;
if (kineticState->isScroll && !kineticState->wasMoveAction && kineticState->yOut == 0) {
kineticState->yOut = kineticState->ySum > 0 ? 1 : -1;
kineticState->ySum = 0;
}
} else {
kineticState->currentSpeed = 0;
}
kineticState->prevMouseSpeed = mouseSpeed;
kineticState->wasMoveAction = isMoveAction;
} }
void processMouseActions()
{
processMouseKineticState(&MouseMoveState);
ActiveUsbMouseReport->x = MouseMoveState.xOut;
ActiveUsbMouseReport->y = MouseMoveState.yOut;
MouseMoveState.xOut = 0;
MouseMoveState.yOut = 0;
processMouseKineticState(&MouseScrollState);
ActiveUsbMouseReport->wheelX = MouseScrollState.xOut;
ActiveUsbMouseReport->wheelY = MouseScrollState.yOut;
MouseScrollState.xOut = 0;
MouseScrollState.yOut = 0;
// The following line makes the firmware crash for some reason:
// SetDebugBufferFloat(60, mouseScrollState.currentSpeed);
// TODO: Figure out why.
// Oddly, the following line (which is the inlined version of the above) works:
// *(float*)(DebugBuffer + 60) = mouseScrollState.currentSpeed;
// The value parameter of SetDebugBufferFloat() seems to be the culprit because
// if it's not used within the function it doesn't crash anymore.
if (activeMouseStates[SerializedMouseAction_LeftClick]) {
ActiveUsbMouseReport->buttons |= MouseButton_Left;
}
if (activeMouseStates[SerializedMouseAction_MiddleClick]) {
ActiveUsbMouseReport->buttons |= MouseButton_Middle;
}
if (activeMouseStates[SerializedMouseAction_RightClick]) {
ActiveUsbMouseReport->buttons |= MouseButton_Right;
}
}
static layer_id_t previousLayer = LayerId_Base;
static uint8_t basicScancodeIndex = 0; static uint8_t basicScancodeIndex = 0;
static uint8_t mediaScancodeIndex = 0; static uint8_t mediaScancodeIndex = 0;
static uint8_t systemScancodeIndex = 0; static uint8_t systemScancodeIndex = 0;
key_state_t *doubleTapSwitchLayerKey;
uint32_t doubleTapSwitchLayerStartTime;
void applyKeyAction(key_state_t *keyState, key_action_t *action) void applyKeyAction(key_state_t *keyState, key_action_t *action)
{ {
@@ -90,6 +189,10 @@ void applyKeyAction(key_state_t *keyState, key_action_t *action)
return; return;
} }
if (doubleTapSwitchLayerKey && doubleTapSwitchLayerKey != keyState && !keyState->previous) {
doubleTapSwitchLayerKey = NULL;
}
switch (action->type) { switch (action->type) {
case KeyActionType_Keystroke: case KeyActionType_Keystroke:
ActiveUsbBasicKeyboardReport->modifiers |= action->keystroke.modifiers; ActiveUsbBasicKeyboardReport->modifiers |= action->keystroke.modifiers;
@@ -116,26 +219,42 @@ void applyKeyAction(key_state_t *keyState, key_action_t *action)
} }
break; break;
case KeyActionType_Mouse: case KeyActionType_Mouse:
processMouseAction(action); activeMouseStates[action->mouseAction] = true;
break;
case KeyActionType_SwitchLayer:
if (!keyState->previous && previousLayer == LayerId_Base && action->switchLayer.mode == SwitchLayerMode_HoldAndDoubleTapToggle) {
if (doubleTapSwitchLayerKey) {
if (Timer_GetElapsedTimeAndSetCurrent(&doubleTapSwitchLayerStartTime) < DoubleTapSwitchLayerTimeout) {
ToggledLayer = action->switchLayer.layer;
}
doubleTapSwitchLayerKey = NULL;
} else {
doubleTapSwitchLayerKey = keyState;
doubleTapSwitchLayerStartTime = CurrentTime;
}
}
break; break;
case KeyActionType_SwitchKeymap: case KeyActionType_SwitchKeymap:
if (!keyState->previous && keyState->current) { if (!keyState->previous) {
SwitchKeymap(action->switchKeymap.keymapId); SwitchKeymap(action->switchKeymap.keymapId);
} }
break; break;
} }
} }
static layer_id_t previousLayer = LayerId_Base;
static uint8_t secondaryRoleState = SecondaryRoleState_Released; static uint8_t secondaryRoleState = SecondaryRoleState_Released;
static uint8_t secondaryRoleSlotId; static uint8_t secondaryRoleSlotId;
static uint8_t secondaryRoleKeyId; static uint8_t secondaryRoleKeyId;
static secondary_role_t secondaryRole; static secondary_role_t secondaryRole;
void UpdateActiveUsbReports(void) #define pos 35
void updateActiveUsbReports(void)
{ {
SetDebugBufferUint32(pos, 1);
memset(activeMouseStates, 0, ACTIVE_MOUSE_STATES_COUNT);
static uint8_t previousModifiers = 0; static uint8_t previousModifiers = 0;
elapsedTime = Timer_GetElapsedTime(&UsbReportUpdateTime); elapsedTime = Timer_GetElapsedTimeAndSetCurrent(&UsbReportUpdateTime);
basicScancodeIndex = 0; basicScancodeIndex = 0;
mediaScancodeIndex = 0; mediaScancodeIndex = 0;
@@ -163,6 +282,7 @@ void UpdateActiveUsbReports(void)
memcpy(&ActiveUsbSystemKeyboardReport, &MacroSystemKeyboardReport, sizeof MacroSystemKeyboardReport); memcpy(&ActiveUsbSystemKeyboardReport, &MacroSystemKeyboardReport, sizeof MacroSystemKeyboardReport);
return; return;
} }
SetDebugBufferUint32(pos, 2);
for (uint8_t slotId=0; slotId<SLOT_COUNT; slotId++) { for (uint8_t slotId=0; slotId<SLOT_COUNT; slotId++) {
for (uint8_t keyId=0; keyId<MAX_KEY_COUNT_PER_MODULE; keyId++) { for (uint8_t keyId=0; keyId<MAX_KEY_COUNT_PER_MODULE; keyId++) {
@@ -216,6 +336,10 @@ void UpdateActiveUsbReports(void)
keyState->previous = keyState->current; keyState->previous = keyState->current;
} }
} }
SetDebugBufferUint32(pos, 4);
processMouseActions();
SetDebugBufferUint32(pos, 5);
// When a layer switcher key gets pressed along with another key that produces some modifiers // When a layer switcher key gets pressed along with another key that produces some modifiers
// and the accomanying key gets released then keep the related modifiers active a long as the // and the accomanying key gets released then keep the related modifiers active a long as the
@@ -230,4 +354,74 @@ void UpdateActiveUsbReports(void)
previousModifiers = ActiveUsbBasicKeyboardReport->modifiers; previousModifiers = ActiveUsbBasicKeyboardReport->modifiers;
previousLayer = activeLayer; previousLayer = activeLayer;
SetDebugBufferUint32(pos, 7);
}
bool UsbBasicKeyboardReportEverSent = false;
bool UsbMediaKeyboardReportEverSent = false;
bool UsbSystemKeyboardReportEverSent = false;
bool UsbMouseReportEverSentEverSent = false;
uint32_t UsbReportUpdateCounter;
static uint32_t lastUsbUpdateTime;
void UpdateUsbReports(void)
{
UsbReportUpdateCounter++;
if (Timer_GetElapsedTime(&lastUsbUpdateTime) > 100) {
UsbBasicKeyboardReportEverSent = false;
UsbMediaKeyboardReportEverSent = false;
UsbSystemKeyboardReportEverSent = false;
UsbMouseReportEverSentEverSent = false;
}
if (IsUsbBasicKeyboardReportSent) {
UsbBasicKeyboardReportEverSent = true;
}
if (IsUsbMediaKeyboardReportSent) {
UsbMediaKeyboardReportEverSent = true;
}
if (IsUsbSystemKeyboardReportSent) {
UsbSystemKeyboardReportEverSent = true;
}
if (IsUsbMouseReportSent) {
UsbMouseReportEverSentEverSent = true;
}
bool areUsbReportsSent = true;
if (UsbBasicKeyboardReportEverSent) {
areUsbReportsSent &= IsUsbBasicKeyboardReportSent;
}
if (UsbMediaKeyboardReportEverSent) {
areUsbReportsSent &= IsUsbMediaKeyboardReportSent;
}
if (UsbSystemKeyboardReportEverSent) {
areUsbReportsSent &= IsUsbSystemKeyboardReportSent;
}
if (UsbMouseReportEverSentEverSent) {
areUsbReportsSent &= IsUsbMouseReportSent;
}
if (!areUsbReportsSent) {
return;
}
ResetActiveUsbBasicKeyboardReport();
ResetActiveUsbMediaKeyboardReport();
ResetActiveUsbSystemKeyboardReport();
ResetActiveUsbMouseReport();
updateActiveUsbReports();
SwitchActiveUsbBasicKeyboardReport();
SwitchActiveUsbMediaKeyboardReport();
SwitchActiveUsbSystemKeyboardReport();
SwitchActiveUsbMouseReport();
IsUsbBasicKeyboardReportSent = false;
IsUsbMediaKeyboardReportSent = false;
IsUsbSystemKeyboardReportSent = false;
IsUsbMouseReportSent = false;
Timer_SetCurrentTime(&lastUsbUpdateTime);
} }

View File

@@ -1,8 +1,14 @@
#ifndef __USB_REPORT_UPDATER_H__ #ifndef __USB_REPORT_UPDATER_H__
#define __USB_REPORT_UPDATER_H__ #define __USB_REPORT_UPDATER_H__
// Includes:
#include "config_parser/parse_keymap.h"
// Macros: // Macros:
#define ACTIVE_MOUSE_STATES_COUNT (SerializedMouseAction_Last + 1)
#define IS_SECONDARY_ROLE_MODIFIER(secondaryRole) (SecondaryRole_LeftCtrl <= (secondaryRole) && (secondaryRole) <= SecondaryRole_RightSuper) #define IS_SECONDARY_ROLE_MODIFIER(secondaryRole) (SecondaryRole_LeftCtrl <= (secondaryRole) && (secondaryRole) <= SecondaryRole_RightSuper)
#define IS_SECONDARY_ROLE_LAYER_SWITCHER(secondaryRole) (SecondaryRole_Mod <= (secondaryRole) && (secondaryRole) <= SecondaryRole_Mouse) #define IS_SECONDARY_ROLE_LAYER_SWITCHER(secondaryRole) (SecondaryRole_Mod <= (secondaryRole) && (secondaryRole) <= SecondaryRole_Mouse)
#define SECONDARY_ROLE_MODIFIER_TO_HID_MODIFIER(secondaryRoleModifier) (1 << ((secondaryRoleModifier) - 1)) #define SECONDARY_ROLE_MODIFIER_TO_HID_MODIFIER(secondaryRoleModifier) (1 << ((secondaryRoleModifier) - 1))
@@ -30,4 +36,43 @@
SecondaryRole_Mouse SecondaryRole_Mouse
} secondary_role_t; } secondary_role_t;
typedef enum {
MouseSpeed_Normal,
MouseSpeed_Accelerated,
MouseSpeed_Decelerated,
} mouse_speed_t;
typedef struct {
bool isScroll;
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 intMultiplier;
float currentSpeed;
float targetSpeed;
uint8_t initialSpeed;
uint8_t acceleration;
uint8_t deceleratedSpeed;
uint8_t baseSpeed;
uint8_t acceleratedSpeed;
float xSum;
float ySum;
int16_t xOut;
int16_t yOut;
} mouse_kinetic_state_t;
// Variables:
extern uint16_t DoubleTapSwitchLayerTimeout;
extern mouse_kinetic_state_t MouseMoveState;
extern mouse_kinetic_state_t MouseScrollState;
extern uint32_t UsbReportUpdateCounter;
// Functions:
void UpdateUsbReports(void);
#endif #endif

View File

@@ -15,10 +15,10 @@
"commander": "^2.11.0", "commander": "^2.11.0",
"shelljs": "^0.7.8" "shelljs": "^0.7.8"
}, },
"version": "3.0.0", "version": "5.0.1",
"dataModelVersion": "1.0.0", "dataModelVersion": "4.0.0",
"usbProtocolVersion": "1.2.0", "usbProtocolVersion": "2.0.0",
"slaveProtocolVersion": "2.1.0", "slaveProtocolVersion": "3.0.0",
"devices": [ "devices": [
{ {
"deviceId": 1, "deviceId": 1,

View File

@@ -45,6 +45,21 @@ void SetBufferUint32(uint8_t *buffer, uint32_t offset, uint32_t value)
*(uint32_t*)(buffer + offset) = value; *(uint32_t*)(buffer + offset) = value;
} }
void SetBufferInt8(uint8_t *buffer, uint32_t offset, int8_t value)
{
*(int8_t*)(buffer + offset) = value;
}
void SetBufferInt16(uint8_t *buffer, uint32_t offset, int16_t value)
{
*(int16_t*)(buffer + offset) = value;
}
void SetBufferInt32(uint8_t *buffer, uint32_t offset, int32_t value)
{
*(int32_t*)(buffer + offset) = value;
}
void SetBufferUint8Be(uint8_t *buffer, uint32_t offset, uint8_t value) void SetBufferUint8Be(uint8_t *buffer, uint32_t offset, uint8_t value)
{ {
buffer[offset] = value; buffer[offset] = value;
@@ -63,3 +78,8 @@ void SetBufferUint32Be(uint8_t *buffer, uint32_t offset, uint32_t value)
buffer[offset+2] = (value >> 8) & 0xff; buffer[offset+2] = (value >> 8) & 0xff;
buffer[offset+3] = (value >> 0) & 0xff; buffer[offset+3] = (value >> 0) & 0xff;
} }
void SetBufferFloat(uint8_t *buffer, uint32_t offset, float value)
{
*(float*)(buffer + offset) = value;
}

View File

@@ -19,8 +19,14 @@
void SetBufferUint16(uint8_t *buffer, uint32_t offset, uint16_t value); void SetBufferUint16(uint8_t *buffer, uint32_t offset, uint16_t value);
void SetBufferUint32(uint8_t *buffer, uint32_t offset, uint32_t value); void SetBufferUint32(uint8_t *buffer, uint32_t offset, uint32_t value);
void SetBufferInt8(uint8_t *buffer, uint32_t offset, int8_t value);
void SetBufferInt16(uint8_t *buffer, uint32_t offset, int16_t value);
void SetBufferInt32(uint8_t *buffer, uint32_t offset, int32_t value);
void SetBufferUint8Be(uint8_t *buffer, uint32_t offset, uint8_t value); void SetBufferUint8Be(uint8_t *buffer, uint32_t offset, uint8_t value);
void SetBufferUint16Be(uint8_t *buffer, uint32_t offset, uint16_t value); void SetBufferUint16Be(uint8_t *buffer, uint32_t offset, uint16_t value);
void SetBufferUint32Be(uint8_t *buffer, uint32_t offset, uint32_t value); void SetBufferUint32Be(uint8_t *buffer, uint32_t offset, uint32_t value);
void SetBufferFloat(uint8_t *buffer, uint32_t offset, float value);
#endif #endif