Compare commits
42 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c51542795f | ||
|
|
7eb83173ed | ||
|
|
5581dd26b5 | ||
|
|
1ac637af0f | ||
|
|
36951d1a34 | ||
|
|
5190265a2c | ||
|
|
40bf252852 | ||
|
|
85e92d21b4 | ||
|
|
fd43e81e46 | ||
|
|
c994a97d03 | ||
|
|
d59ba83d99 | ||
|
|
c1b887cea8 | ||
|
|
bd53b73685 | ||
|
|
beb7c3d4ee | ||
|
|
17571a5feb | ||
|
|
83e782d74a | ||
|
|
312f56048b | ||
|
|
494621a841 | ||
|
|
94af52892c | ||
|
|
5862a34f18 | ||
|
|
9b9e5ed1b5 | ||
|
|
4393377365 | ||
|
|
1570364741 | ||
|
|
738a240860 | ||
|
|
43b48aa643 | ||
|
|
61a0540007 | ||
|
|
f2e313dd0a | ||
|
|
b239d0da50 | ||
|
|
23459e3791 | ||
|
|
6a54944cb1 | ||
|
|
a52df9da7e | ||
|
|
28f98f179a | ||
|
|
5798f9e4fb | ||
|
|
4fe5ce45ac | ||
|
|
a212c254a9 | ||
|
|
235e18d706 | ||
|
|
7c91f8f6d1 | ||
|
|
c8cfe53136 | ||
|
|
f1f47ece14 | ||
|
|
a0dba2fa66 | ||
|
|
0f34b01189 | ||
|
|
5a449ad5c5 |
78
CHANGELOG.md
78
CHANGELOG.md
@@ -5,30 +5,62 @@ 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/)
|
||||
and this project adheres to the [UHK Versioning](VERSIONING.md) conventions.
|
||||
|
||||
## [8.0.1] - 2017-12-25
|
||||
|
||||
Device Protocol: 4.1.0 | Module Protocol: 4.0.0 | User Config: 4.0.0 | Hardware Config: 1.0.0
|
||||
|
||||
- Implement I2C watchdog for the left keyboard half which should resolve the occasional hangs of the left keyboard half.
|
||||
|
||||
## [8.0.0] - 2017-12-15
|
||||
|
||||
Device Protocol: 4.**1.0** | Module Protocol: **4.0.0** | User Config: 4.0.0 | Hardware Config: 1.0.0
|
||||
|
||||
- Make the modules transfer the module protocol version and firmware version composed of a major, a minor and a patch number. `MODULEPROTOCOL:MAJOR`
|
||||
- Query module key count and pointer count in separate messages instead of a combined message for improved clarity. `MODULEPROTOCOL:MAJOR`
|
||||
- Add new UsbCommand_GetModuleProperties() device protocol command. `DEVICEPROTOCOL:MINOR`
|
||||
|
||||
## [7.0.0] - 2017-12-14
|
||||
|
||||
Device Protocol: **4.0.0** | Module Protocol: 3.0.0 | User Config: 4.0.0 | Hardware Config: 1.0.0
|
||||
|
||||
- Make UsbCommand_JumpToModuleBootloader() more robust by not making it dependent on the state of the module driver.
|
||||
- Don't make horizontal scrolling and vertical scrolling affect each other.
|
||||
- Expose version numbers via the get property interface. `DEVICEPROTOCOL:MINOR`
|
||||
- Add DevicePropertyId_ConfigSizes. `DEVICEPROTOCOL:MINOR`
|
||||
- Remove DevicePropertyId_HardwareConfigSize and DevicePropertyId_UserConfigSize. `DEVICEPROTOCOL:MAJOR`
|
||||
|
||||
## [6.0.0] - 2017-12-12
|
||||
|
||||
Device Protocol: **3.0.0** | Module Protocol: 3.0.0 | User Config: 4.0.0 | Hardware Config: 1.0.0
|
||||
|
||||
- Change the value of almost every Device Protocol commands because there were unused intervals between them. `DEVICEPROTOCOL:MAJOR`
|
||||
- Disable LED display icons by default.
|
||||
- Update LED brightness levels upon applying the configuration.
|
||||
|
||||
## [5.0.1] - 2017-12-09
|
||||
|
||||
Data Model: 4.0.0 (unchanged) | USB Protocol: 2.0.0 (unchanged) | Slave Protocol: 3.0.0 (unchanged)
|
||||
Device Protocol: 2.0.0 | Module Protocol: 3.0.0 | User Config: 4.0.0 | Hardware Config: 1.0.0
|
||||
|
||||
- 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)
|
||||
Device Protocol: 2.0.0 | Module Protocol: 3.0.0 | User Config: **4.0.0** | Hardware Config: 1.0.0
|
||||
|
||||
- Move pointerRole from keymaps to module configurations as pointerMode. Add angularShift, modLayerPointerFunction, fnLayerPointerFunction, and mouseLayerPointerFunction to module configurations. `DATAMODEL:MAJOR`
|
||||
- Move pointerRole from keymaps to module configurations as pointerMode. Add angularShift, modLayerPointerFunction, fnLayerPointerFunction, and mouseLayerPointerFunction to module configurations. `USERCONFIG: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)
|
||||
Device Protocol: 2.0.0 | Module Protocol: 3.0.0 | User Config: **3.0.0** | Hardware Config: 1.0.0
|
||||
|
||||
- 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`
|
||||
- Make the parser read additional user configuration properties: USERCONFIGMajorVersion, USERCONFIGMinorVersion, USERCONFIGPatchVersion, doubleTapSwitchLayerTimeout, iconsAndLayerTextsBrightness, alphanumericSegmentsBrightness, keyBacklightBrightness, mouseMoveInitialSpeed, mouseMoveAcceleration, mouseMoveDeceleratedSpeed, mouseMoveBaseSpeed, mouseMoveAcceleratedSpeed, mouseScrollInitialSpeed, mouseScrollAcceleration, mouseScrollDeceleratedSpeed, mouseScrollBaseSpeed, mouseScrollAcceleratedSpeed. `USERCONFIG:MAJOR`
|
||||
|
||||
## [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)
|
||||
Device Protocol: **2.0.0** | Module Protocol: **3.0.0** | User Config: **2.0.0** | Hardware Config: 1.0.0
|
||||
|
||||
- Detect the use of USB interfaces and only wait for the ones that are actually used by the host.
|
||||
- Implement key debouncer.
|
||||
@@ -36,49 +68,49 @@ Data Model: 2.0.0 (major bump) | USB Protocol: 2.0.0 (major bump) | Slave Protoc
|
||||
- Make pressing the reset button revert to the factory preset.
|
||||
- Revert to the factory default state when the reset button is pressed upon firmware startup. Display FTY on the display in this case.
|
||||
- Make the LED display show the abbreviation of the current keymap even when it gets reinitialized by the I2C watchdog.
|
||||
- Swap SlaveCommand_RequestKeyStates and SlaveCommand_JumpToBootloader, thereby making SlaveCommand_JumpToBootloader the lower number because it's more essential and shouldn't change in the future. `SLAVEPROTOCOL:MAJOR`
|
||||
- Swap SlaveCommand_RequestKeyStates and SlaveCommand_JumpToBootloader, thereby making SlaveCommand_JumpToBootloader the lower number because it's more essential and shouldn't change in the future. `MODULEPROTOCOL:MAJOR`
|
||||
- Suppress pressed keys upon layer switcher key release.
|
||||
- Handle secondary role modifiers and layer switchers.
|
||||
- Make UsbCommand_JumpToSlaveBootloader expect a slave slot id instead of a uhkModuleDriverId. `USBPROTOCOL:MAJOR`
|
||||
- Set UsbResponse_InvalidCommand upon encountering with an invalid USB command. `USBPROTOCOL:MINOR`
|
||||
- Remove UsbCommandId_ReadMergeSensor now that it can be queried via UsbCommandId_GetKeyboardState. `USBPROTOCOL:MAJOR`
|
||||
- Make the getAdcValue and getDebugInfo USB commands utilize the first byte of the response to provide status as dictated by the UHK protocol. `USBPROTOCOL:MAJOR`
|
||||
- Make UsbCommand_JumpToSlaveBootloader expect a slave slot id instead of a uhkModuleDriverId. `DEVICEPROTOCOL:MAJOR`
|
||||
- Set UsbResponse_InvalidCommand upon encountering with an invalid USB command. `DEVICEPROTOCOL:MINOR`
|
||||
- Remove UsbCommandId_ReadMergeSensor now that it can be queried via UsbCommandId_GetKeyboardState. `DEVICEPROTOCOL:MAJOR`
|
||||
- Make the getAdcValue and getDebugInfo USB commands utilize the first byte of the response to provide status as dictated by the UHK protocol. `DEVICEPROTOCOL:MAJOR`
|
||||
- Switch keymap only upon keypress.
|
||||
- Handle layer toggle actions.
|
||||
- Keep the active layer active even if another layer switcher key gets pressed while holding it.
|
||||
- Read the new UserConfig.userConfigLength user config field. `DATAMODEL:MAJOR`
|
||||
- Read the new UserConfig.userConfigLength user config field. `USERCONFIG:MAJOR`
|
||||
- Change Ctrl and Alt back according to the official UHK factory keymap.
|
||||
- Update system keyboard HID descriptor which doesn't make the pointer go to the top left corner on OSX anymore.
|
||||
- Scan keyboard matrices in a more efficient manner from timer interrupts instead of the main loop.
|
||||
- Add UsbCommand_SendKbootCommand. `USBPROTOCOL:MINOR`
|
||||
- Make the reenumerate USB command accept a timeout value. `USBPROTOCOL:MINOR`
|
||||
- Make the config parser read the device name. `DATAMODEL:MAJOR`
|
||||
- Add UsbCommand_SendKbootCommand. `DEVICEPROTOCOL:MINOR`
|
||||
- Make the reenumerate USB command accept a timeout value. `DEVICEPROTOCOL:MINOR`
|
||||
- Make the config parser read the device name. `USERCONFIG:MAJOR`
|
||||
- Update release file format containing device and module directories and hex files instead of srec.
|
||||
- Remove obsolete ARM GCC build files.
|
||||
|
||||
## [2.1.0] - 2017-10-13
|
||||
|
||||
Data Model: 1.0.0 (unchanged) | USB Protocol: 1.2.0 (minor bump) | Slave Protocol: 2.1.0 (minor bump)
|
||||
Device Protocol: 1.**2.0** | Module Protocol: 2.**1.0** | User Config: 1.0.0 | Hardware Config: 1.0.0
|
||||
|
||||
- Add jumpToSlaveBootloader USB and slave protocol command. `USBPROTOCOL:MINOR` `SLAVEPROTOCOL:MINOR`
|
||||
- Add jumpToSlaveBootloader USB and Module Protocol command. `DEVICEPROTOCOL:MINOR` `MODULEPROTOCOL:MINOR`
|
||||
- Fix generic HID descriptor enumeration error.
|
||||
|
||||
## [2.0.0] - 2017-10-10
|
||||
|
||||
Data Model: 1.0.0 (unchanged) | USB Protocol: 1.1.0 (minor bump) | Slave Protocol: 2.0.0 (major bump)
|
||||
Device Protocol: 1.**1.0** | Module Protocol: **2.0.0** | User Config: 1.0.0 | Hardware Config: 1.0.0
|
||||
|
||||
- Read the hardware and user configuration area of the EEPROM upon startup and set the default keymap.
|
||||
- Greatly improve the I2C watchdog and drivers. Communication between the halves or the add-ons should never fail again.
|
||||
- Implement generic enumeration sequence and per-slave state for UHK modules, allowing add-ons to be added. `SLAVEPROTOCOL:MAJOR`
|
||||
- Implement generic enumeration sequence and per-slave state for UHK modules, allowing add-ons to be added. `MODULEPROTOCOL:MAJOR`
|
||||
- Make the master cache the output fields of slave modules, allowing for more frequent input updates.
|
||||
- Optimize I2C protocol scheduler resulting in increased roustness and more efficient use of I2C bandwidth.
|
||||
- Add I2C message headers containing a length header, allowing for variable-length messages and a CRC16-CCITT checksum, allowing for robust communication. `SLAVEPROTOCOL:MAJOR`
|
||||
- Add I2C message headers containing a length header, allowing for variable-length messages and a CRC16-CCITT checksum, allowing for robust communication. `MODULEPROTOCOL:MAJOR`
|
||||
- Add mechanism to dump the internal state of the KL03 via SPI for debugging purposes.
|
||||
- Add merge sensor state and attached module IDs to GetDebugInfo(). `USBPROTOCOL:PATCH`
|
||||
- Throw ParserError_InvalidKeymapCount if keymapCount == 0. `DATAMODEL:PATCH`
|
||||
- Add merge sensor state and attached module IDs to GetDebugInfo(). `DEVICEPROTOCOL:PATCH`
|
||||
- Throw ParserError_InvalidKeymapCount if keymapCount == 0. `USERCONFIG:PATCH`
|
||||
|
||||
## [1.0.0] - 2017-08-30
|
||||
|
||||
Data Model: 1.0.0 | USB Protocol: 1.0.0 | Slave Protocol: 1.0.0
|
||||
Device Protocol: 1.0.0 | Module Protocol: 1.0.0 | User Config: 1.0.0 | Hardware Config: 1.0.0
|
||||
|
||||
- First Release
|
||||
|
||||
@@ -50,7 +50,7 @@
|
||||
<intAttribute key="org.eclipse.cdt.debug.gdbjtag.core.portNumber" value="2331"/>
|
||||
<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.setPcRegister" value="false"/>
|
||||
<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.setResume" value="false"/>
|
||||
<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.setStopAt" value="false"/>
|
||||
<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.setStopAt" value="true"/>
|
||||
<stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.stopAt" value="main"/>
|
||||
<stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.symbolsFileName" value=""/>
|
||||
<stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.symbolsOffset" value=""/>
|
||||
@@ -77,6 +77,6 @@
|
||||
<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES">
|
||||
<listEntry value="4"/>
|
||||
</listAttribute>
|
||||
<stringAttribute key="org.eclipse.dsf.launch.MEMORY_BLOCKS" value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <memoryBlockExpressionList context="Context string"/> "/>
|
||||
<stringAttribute key="org.eclipse.dsf.launch.MEMORY_BLOCKS" value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <memoryBlockExpressionList context="Context string"/> "/>
|
||||
<stringAttribute key="process_factory_id" value="org.eclipse.cdt.dsf.gdb.GdbProcessFactory"/>
|
||||
</launchConfiguration>
|
||||
|
||||
@@ -77,6 +77,6 @@
|
||||
<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES">
|
||||
<listEntry value="4"/>
|
||||
</listAttribute>
|
||||
<stringAttribute key="org.eclipse.dsf.launch.MEMORY_BLOCKS" value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <memoryBlockExpressionList context="Context string"/> "/>
|
||||
<stringAttribute key="org.eclipse.dsf.launch.MEMORY_BLOCKS" value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <memoryBlockExpressionList context="Context string"/> "/>
|
||||
<stringAttribute key="process_factory_id" value="org.eclipse.cdt.dsf.gdb.GdbProcessFactory"/>
|
||||
</launchConfiguration>
|
||||
|
||||
@@ -3,36 +3,42 @@
|
||||
#include "i2c_watchdog.h"
|
||||
#include "test_led.h"
|
||||
#include "init_peripherals.h"
|
||||
#include "main.h"
|
||||
|
||||
//static uint32_t prevWatchdogCounter = 0;
|
||||
uint32_t I2cWatchdog_RecoveryCounter;
|
||||
volatile uint32_t I2cWatchdog_WatchCounter;
|
||||
/* NOTE: Because of a bug in the ROM bootloader of the KL03Z, the watchdog timer is disabled and cannot be re-enabled.
|
||||
* See https://community.nxp.com/thread/457893
|
||||
* Therefore the hardware watchdog timer cannot be used without an extra way to enter bootloader or application mode.
|
||||
*/
|
||||
#if KEY_USE_I2C_WATCHDOG_TIMER
|
||||
static uint32_t prevWatchdogCounter = 0;
|
||||
static uint32_t I2cWatchdog_RecoveryCounter; /* counter for how many times we had to recover and restart */
|
||||
#endif
|
||||
|
||||
void InitI2cWatchdog(void)
|
||||
{
|
||||
lptmr_config_t lptmrConfig;
|
||||
LPTMR_GetDefaultConfig(&lptmrConfig);
|
||||
LPTMR_Init(LPTMR0, &lptmrConfig);
|
||||
LPTMR_SetTimerPeriod(LPTMR0, USEC_TO_COUNT(LPTMR_USEC_COUNT, LPTMR_SOURCE_CLOCK));
|
||||
LPTMR_EnableInterrupts(LPTMR0, kLPTMR_TimerInterruptEnable);
|
||||
EnableIRQ(LPTMR0_IRQn);
|
||||
LPTMR_StartTimer(LPTMR0);
|
||||
}
|
||||
/*
|
||||
void I2C_WATCHDOG_LPTMR_HANDLER(void)
|
||||
|
||||
#if KEY_USE_I2C_WATCHDOG_TIMER
|
||||
void RunWatchdog(void)
|
||||
{
|
||||
TEST_LED_TOGGLE();
|
||||
I2cWatchdog_WatchCounter++;
|
||||
static volatile uint32_t I2cWatchdog_WatchCounter = 0; /* counter for timer */
|
||||
static int cntr = 0;
|
||||
|
||||
if (I2C_Watchdog == prevWatchdogCounter) { // Restart I2C if there hasn't been any interrupt during 100 ms
|
||||
// NVIC_SystemReset();
|
||||
I2cWatchdog_RecoveryCounter++;
|
||||
I2C_SlaveDeinit(I2C_BUS_BASEADDR);
|
||||
InitI2c();
|
||||
}
|
||||
cntr++;
|
||||
if (cntr==100) { /* we get called from KEY_SCANNER_HANDLER() which runs at 1ms, thus scaling down by 100 here to get 100 ms period */
|
||||
cntr=0;
|
||||
TEST_LED_TOGGLE();
|
||||
I2cWatchdog_WatchCounter++;
|
||||
|
||||
prevWatchdogCounter = I2C_Watchdog;
|
||||
|
||||
LPTMR_ClearStatusFlags(LPTMR0, kLPTMR_TimerCompareFlag);
|
||||
if (I2cWatchdog_WatchCounter>10) { /* do not check within the first 1000 ms, as I2C might not be running yet */
|
||||
if (I2C_Watchdog == prevWatchdogCounter) { // Restart I2C if there hasn't been any interrupt during 100 ms. I2C_Watchdog gets incremented for every I2C transaction
|
||||
// NVIC_SystemReset();
|
||||
I2cWatchdog_RecoveryCounter++;
|
||||
I2C_SlaveDeinit(I2C_BUS_BASEADDR);
|
||||
InitI2c();
|
||||
}
|
||||
}
|
||||
prevWatchdogCounter = I2C_Watchdog; /* remember previous counter */
|
||||
}
|
||||
}
|
||||
*/
|
||||
#endif
|
||||
|
||||
@@ -10,6 +10,7 @@
|
||||
#include "slave_protocol_handler.h"
|
||||
#include "i2c_watchdog.h"
|
||||
#include "debug_over_spi.h"
|
||||
#include "main.h"
|
||||
|
||||
i2c_slave_config_t slaveConfig;
|
||||
i2c_slave_handle_t slaveHandle;
|
||||
@@ -85,7 +86,9 @@ void InitPeripherals(void)
|
||||
InitLedDriver();
|
||||
InitTestLed();
|
||||
LedPwm_Init();
|
||||
// InitI2cWatchdog();
|
||||
DebugOverSpi_Init();
|
||||
InitI2c();
|
||||
#if KEY_USE_I2C_WATCHDOG_TIMER
|
||||
InitI2cWatchdog();
|
||||
#endif
|
||||
}
|
||||
|
||||
@@ -1,10 +1,16 @@
|
||||
#include "fsl_lptmr.h"
|
||||
#include "key_scanner.h"
|
||||
#include "main.h"
|
||||
#if KEY_USE_I2C_WATCHDOG_TIMER
|
||||
#include "i2c_watchdog.h"
|
||||
#endif
|
||||
|
||||
void KEY_SCANNER_HANDLER(void)
|
||||
{
|
||||
KeyMatrix_ScanRow(&keyMatrix);
|
||||
#if KEY_USE_I2C_WATCHDOG_TIMER
|
||||
RunWatchdog();
|
||||
#endif
|
||||
LPTMR_ClearStatusFlags(KEY_SCANNER_LPTMR_BASEADDR, kLPTMR_TimerCompareFlag);
|
||||
}
|
||||
|
||||
|
||||
@@ -14,4 +14,6 @@
|
||||
|
||||
extern key_matrix_t keyMatrix;
|
||||
|
||||
#define KEY_USE_I2C_WATCHDOG_TIMER (1) /* if set to 1, every 100 ms the I2C communication is checked */
|
||||
|
||||
#endif
|
||||
|
||||
@@ -6,6 +6,6 @@
|
||||
#define MODULE_PROTOCOL_VERSION 1
|
||||
#define MODULE_ID ModuleId_LeftKeyboardHalf
|
||||
#define MODULE_KEY_COUNT (KEYBOARD_MATRIX_ROWS_NUM * KEYBOARD_MATRIX_COLS_NUM)
|
||||
#define MODULE_HAS_POINTER false
|
||||
#define MODULE_POINTER_COUNT 0
|
||||
|
||||
#endif
|
||||
|
||||
@@ -10,10 +10,23 @@
|
||||
#include "bool_array_converter.h"
|
||||
#include "bootloader.h"
|
||||
#include "module.h"
|
||||
#include "versions.h"
|
||||
|
||||
i2c_message_t RxMessage;
|
||||
i2c_message_t TxMessage;
|
||||
|
||||
static version_t moduleProtocolVersion = {
|
||||
MODULE_PROTOCOL_MAJOR_VERSION,
|
||||
MODULE_PROTOCOL_MINOR_VERSION,
|
||||
MODULE_PROTOCOL_PATCH_VERSION,
|
||||
};
|
||||
|
||||
static version_t firmwareVersion = {
|
||||
FIRMWARE_MAJOR_VERSION,
|
||||
FIRMWARE_MINOR_VERSION,
|
||||
FIRMWARE_PATCH_VERSION,
|
||||
};
|
||||
|
||||
void SlaveRxHandler(void)
|
||||
{
|
||||
if (!CRC16_IsMessageValid(&RxMessage)) {
|
||||
@@ -51,21 +64,29 @@ void SlaveTxHandler(void)
|
||||
TxMessage.length = SLAVE_SYNC_STRING_LENGTH;
|
||||
break;
|
||||
}
|
||||
case SlaveProperty_ModuleProtocolVersion: {
|
||||
memcpy(TxMessage.data, &moduleProtocolVersion, sizeof(version_t));
|
||||
TxMessage.length = sizeof(version_t);
|
||||
break;
|
||||
}
|
||||
case SlaveProperty_FirmwareVersion: {
|
||||
memcpy(TxMessage.data, &firmwareVersion, sizeof(version_t));
|
||||
TxMessage.length = sizeof(version_t);
|
||||
break;
|
||||
}
|
||||
case SlaveProperty_ModuleId: {
|
||||
TxMessage.data[0] = MODULE_ID;
|
||||
TxMessage.length = 1;
|
||||
break;
|
||||
}
|
||||
case SlaveProperty_ProtocolVersion: {
|
||||
TxMessage.data[0] = MODULE_PROTOCOL_VERSION;
|
||||
case SlaveProperty_KeyCount: {
|
||||
TxMessage.data[0] = MODULE_KEY_COUNT;
|
||||
TxMessage.length = 1;
|
||||
break;
|
||||
}
|
||||
case SlaveProperty_Features: {
|
||||
uhk_module_features_t *moduleFeatures = (uhk_module_features_t*)&TxMessage.data;
|
||||
moduleFeatures->keyCount = MODULE_KEY_COUNT;
|
||||
moduleFeatures->hasPointer = MODULE_HAS_POINTER;
|
||||
TxMessage.length = sizeof(uhk_module_features_t);
|
||||
case SlaveProperty_PointerCount: {
|
||||
TxMessage.data[0] = MODULE_POINTER_COUNT;
|
||||
TxMessage.length = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
Submodule lib/agent updated: 04b43896c5...dd973c80ea
@@ -64,10 +64,10 @@
|
||||
<intAttribute key="org.eclipse.cdt.launch.ATTR_BUILD_BEFORE_LAUNCH_ATTR" value="2"/>
|
||||
<stringAttribute key="org.eclipse.cdt.launch.COREFILE_PATH" value=""/>
|
||||
<stringAttribute key="org.eclipse.cdt.launch.DEBUGGER_REGISTER_GROUPS" value=""/>
|
||||
<stringAttribute key="org.eclipse.cdt.launch.PROGRAM_NAME" value="uhk60-right_debug/uhk-right.elf"/>
|
||||
<stringAttribute key="org.eclipse.cdt.launch.PROGRAM_NAME" value="uhk60-right_debug_standalone/uhk-right.elf"/>
|
||||
<stringAttribute key="org.eclipse.cdt.launch.PROJECT_ATTR" value="uhk-right"/>
|
||||
<booleanAttribute key="org.eclipse.cdt.launch.PROJECT_BUILD_CONFIG_AUTO_ATTR" value="false"/>
|
||||
<stringAttribute key="org.eclipse.cdt.launch.PROJECT_BUILD_CONFIG_ID_ATTR" value="ilg.gnuarmeclipse.managedbuild.cross.config.elf.release.1939339834.1692217331.1297236062.2081695142"/>
|
||||
<stringAttribute key="org.eclipse.cdt.launch.PROJECT_BUILD_CONFIG_ID_ATTR" value=""/>
|
||||
<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS">
|
||||
<listEntry value="/uhk-right"/>
|
||||
</listAttribute>
|
||||
@@ -77,6 +77,6 @@
|
||||
<listAttribute key="org.eclipse.debug.ui.favoriteGroups">
|
||||
<listEntry value="org.eclipse.debug.ui.launchGroup.debug"/>
|
||||
</listAttribute>
|
||||
<stringAttribute key="org.eclipse.dsf.launch.MEMORY_BLOCKS" value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <memoryBlockExpressionList context="Context string"/> "/>
|
||||
<stringAttribute key="org.eclipse.dsf.launch.MEMORY_BLOCKS" value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <memoryBlockExpressionList context="Context string"/> "/>
|
||||
<stringAttribute key="process_factory_id" value="org.eclipse.cdt.dsf.gdb.GdbProcessFactory"/>
|
||||
</launchConfiguration>
|
||||
|
||||
@@ -12,6 +12,11 @@ config_buffer_t ValidatedUserConfigBuffer = { validatedUserConfig };
|
||||
|
||||
bool ParserRunDry;
|
||||
|
||||
bool IsConfigBufferIdValid(config_buffer_id_t configBufferId)
|
||||
{
|
||||
return ConfigBufferId_HardwareConfig <= configBufferId && configBufferId <= ConfigBufferId_ValidatedUserConfig;
|
||||
}
|
||||
|
||||
config_buffer_t* ConfigBufferIdToConfigBuffer(config_buffer_id_t configBufferId)
|
||||
{
|
||||
switch (configBufferId) {
|
||||
@@ -25,3 +30,16 @@ config_buffer_t* ConfigBufferIdToConfigBuffer(config_buffer_id_t configBufferId)
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
uint16_t ConfigBufferIdToBufferSize(config_buffer_id_t configBufferId)
|
||||
{
|
||||
switch (configBufferId) {
|
||||
case ConfigBufferId_HardwareConfig:
|
||||
return HARDWARE_CONFIG_SIZE;
|
||||
case ConfigBufferId_StagingUserConfig:
|
||||
case ConfigBufferId_ValidatedUserConfig:
|
||||
return USER_CONFIG_SIZE;
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -23,6 +23,8 @@
|
||||
|
||||
// Functions:
|
||||
|
||||
bool IsConfigBufferIdValid(config_buffer_id_t configBufferId);
|
||||
config_buffer_t* ConfigBufferIdToConfigBuffer(config_buffer_id_t configBufferId);
|
||||
uint16_t ConfigBufferIdToBufferSize(config_buffer_id_t configBufferId);
|
||||
|
||||
#endif
|
||||
|
||||
@@ -5,6 +5,9 @@
|
||||
#include "config_globals.h"
|
||||
#include "macros.h"
|
||||
#include "usb_report_updater.h"
|
||||
#include "led_display.h"
|
||||
#include "slave_scheduler.h"
|
||||
#include "slave_drivers/is31fl3731_driver.h"
|
||||
|
||||
static parser_error_t parseModuleConfiguration(config_buffer_t *buffer)
|
||||
{
|
||||
@@ -59,10 +62,6 @@ parser_error_t ParseConfig(config_buffer_t *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);
|
||||
@@ -138,6 +137,16 @@ parser_error_t ParseConfig(config_buffer_t *buffer)
|
||||
if (!ParserRunDry) {
|
||||
DoubleTapSwitchLayerTimeout = doubleTapSwitchLayerTimeout;
|
||||
|
||||
// Update LED brightnesses and reinitialize LED drivers
|
||||
|
||||
IconsAndLayerTextsBrightness = iconsAndLayerTextsBrightness;
|
||||
AlphanumericSegmentsBrightness = alphanumericSegmentsBrightness;
|
||||
KeyBacklightBrightness = keyBacklightBrightness;
|
||||
Slaves[SlaveId_LeftLedDriver].isConnected = false;
|
||||
Slaves[SlaveId_RightLedDriver].isConnected = false;
|
||||
|
||||
// Update mouse key speeds
|
||||
|
||||
MouseMoveState.initialSpeed = mouseMoveInitialSpeed;
|
||||
MouseMoveState.acceleration = mouseMoveAcceleration;
|
||||
MouseMoveState.deceleratedSpeed = mouseMoveDeceleratedSpeed;
|
||||
@@ -150,6 +159,8 @@ parser_error_t ParseConfig(config_buffer_t *buffer)
|
||||
MouseScrollState.baseSpeed = mouseScrollBaseSpeed;
|
||||
MouseScrollState.acceleratedSpeed = mouseScrollAcceleratedSpeed;
|
||||
|
||||
// Update counts
|
||||
|
||||
AllKeymapsCount = keymapCount;
|
||||
AllMacrosCount = macroCount;
|
||||
}
|
||||
|
||||
@@ -125,3 +125,8 @@ status_t EEPROM_LaunchTransfer(eeprom_operation_t operation, config_buffer_id_t
|
||||
IsEepromBusy = LastEepromTransferStatus == kStatus_Success;
|
||||
return LastEepromTransferStatus;
|
||||
}
|
||||
|
||||
bool IsEepromOperationValid(eeprom_operation_t operation)
|
||||
{
|
||||
return operation == EepromOperation_Read || operation == EepromOperation_Write;
|
||||
}
|
||||
|
||||
@@ -31,5 +31,6 @@
|
||||
|
||||
void EEPROM_Init(void);
|
||||
status_t EEPROM_LaunchTransfer(eeprom_operation_t operation, config_buffer_id_t config_buffer_id, void (*successCallback));
|
||||
bool IsEepromOperationValid(eeprom_operation_t operation);
|
||||
|
||||
#endif
|
||||
|
||||
@@ -3,6 +3,9 @@
|
||||
#include "layer.h"
|
||||
#include "keymap.h"
|
||||
|
||||
uint8_t IconsAndLayerTextsBrightness = 0xff;
|
||||
uint8_t AlphanumericSegmentsBrightness = 0xff;
|
||||
|
||||
static const uint16_t capitalLetterToSegmentSet[] = {
|
||||
0b0000000011110111,
|
||||
0b0001001010001111,
|
||||
@@ -69,13 +72,13 @@ void LedDisplay_SetText(uint8_t length, const char* text)
|
||||
allSegmentSets |= characterToSegmentSet(text[0]);
|
||||
}
|
||||
|
||||
LedDriverValues[LedDriverId_Left][11] = allSegmentSets & 0b00000001 ? LED_BRIGHTNESS_LEVEL : 0;
|
||||
LedDriverValues[LedDriverId_Left][12] = allSegmentSets & 0b00000010 ? LED_BRIGHTNESS_LEVEL : 0;
|
||||
LedDriverValues[LedDriverId_Left][11] = allSegmentSets & 0b00000001 ? AlphanumericSegmentsBrightness : 0;
|
||||
LedDriverValues[LedDriverId_Left][12] = allSegmentSets & 0b00000010 ? AlphanumericSegmentsBrightness : 0;
|
||||
allSegmentSets >>= 2;
|
||||
|
||||
for (uint8_t i = 24; i <= 136; i += 16) {
|
||||
for (uint8_t j = 0; j < 5; j++) {
|
||||
LedDriverValues[LedDriverId_Left][i + j] = allSegmentSets & 1 << j ? LED_BRIGHTNESS_LEVEL : 0;
|
||||
LedDriverValues[LedDriverId_Left][i + j] = allSegmentSets & 1 << j ? AlphanumericSegmentsBrightness : 0;
|
||||
}
|
||||
allSegmentSets >>= 5;
|
||||
}
|
||||
@@ -94,11 +97,11 @@ void LedDisplay_SetLayer(uint8_t layerId)
|
||||
}
|
||||
|
||||
if (layerId >= LayerId_Mod && layerId <= LayerId_Mouse) {
|
||||
LedDriverValues[LedDriverId_Left][16 * layerId - 3] = LED_BRIGHTNESS_LEVEL;
|
||||
LedDriverValues[LedDriverId_Left][16 * layerId - 3] = IconsAndLayerTextsBrightness;
|
||||
}
|
||||
}
|
||||
|
||||
void LedDisplay_SetIcon(led_display_icon_t icon, bool isEnabled)
|
||||
{
|
||||
LedDriverValues[LedDriverId_Left][8 + icon] = isEnabled ? LED_BRIGHTNESS_LEVEL : 0;
|
||||
LedDriverValues[LedDriverId_Left][8 + icon] = isEnabled ? IconsAndLayerTextsBrightness : 0;
|
||||
}
|
||||
|
||||
@@ -14,6 +14,11 @@
|
||||
LedDisplayIcon_Adaptive,
|
||||
} led_display_icon_t;
|
||||
|
||||
// Variables:
|
||||
|
||||
extern uint8_t IconsAndLayerTextsBrightness;
|
||||
extern uint8_t AlphanumericSegmentsBrightness;
|
||||
|
||||
// Functions:
|
||||
|
||||
void LedDisplay_SetText(uint8_t length, const char* text);
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
#include "slave_scheduler.h"
|
||||
#include "led_display.h"
|
||||
|
||||
uint8_t KeyBacklightBrightness = 0xff;
|
||||
uint8_t LedDriverValues[LED_DRIVER_MAX_COUNT][LED_DRIVER_LED_COUNT];
|
||||
|
||||
static led_driver_state_t ledDriverStates[LED_DRIVER_MAX_COUNT] = {
|
||||
@@ -70,8 +71,14 @@ void LedSlaveDriver_Init(uint8_t ledDriverId)
|
||||
led_driver_state_t *currentLedDriverState = ledDriverStates + ledDriverId;
|
||||
currentLedDriverState->phase = LedDriverPhase_SetFunctionFrame;
|
||||
currentLedDriverState->ledIndex = 0;
|
||||
memset(LedDriverValues[ledDriverId], LED_BRIGHTNESS_LEVEL, LED_DRIVER_LED_COUNT);
|
||||
LedDisplay_SetCurrentKeymapText();
|
||||
memset(LedDriverValues[ledDriverId], KeyBacklightBrightness, LED_DRIVER_LED_COUNT);
|
||||
|
||||
if (ledDriverId == LedDriverId_Left) {
|
||||
LedDisplay_SetIcon(LedDisplayIcon_CapsLock, false);
|
||||
LedDisplay_SetIcon(LedDisplayIcon_Agent, false);
|
||||
LedDisplay_SetIcon(LedDisplayIcon_Adaptive, false);
|
||||
LedDisplay_SetCurrentKeymapText();
|
||||
}
|
||||
}
|
||||
|
||||
status_t LedSlaveDriver_Update(uint8_t ledDriverId)
|
||||
|
||||
@@ -12,7 +12,6 @@
|
||||
#define LED_CONTROL_REGISTERS_COMMAND_LENGTH 19
|
||||
#define PMW_REGISTER_UPDATE_CHUNK_SIZE 8
|
||||
#define PWM_REGISTER_BUFFER_LENGTH (1 + PMW_REGISTER_UPDATE_CHUNK_SIZE)
|
||||
#define LED_BRIGHTNESS_LEVEL 0xff
|
||||
|
||||
#define IS_ISO true
|
||||
#define ISO_KEY_LED_DRIVER_ID LedDriverId_Left
|
||||
@@ -45,6 +44,7 @@
|
||||
|
||||
// Variables:
|
||||
|
||||
extern uint8_t KeyBacklightBrightness;
|
||||
extern uint8_t LedDriverValues[LED_DRIVER_MAX_COUNT][LED_DRIVER_LED_COUNT];
|
||||
|
||||
// Functions:
|
||||
|
||||
@@ -69,6 +69,13 @@ status_t UhkModuleSlaveDriver_Update(uint8_t uhkModuleDriverId)
|
||||
|
||||
switch (*uhkModulePhase) {
|
||||
|
||||
// Jump to bootloader
|
||||
case UhkModulePhase_JumpToBootloader:
|
||||
txMessage.data[0] = SlaveCommand_JumpToBootloader;
|
||||
txMessage.length = 1;
|
||||
status = tx(i2cAddress);
|
||||
break;
|
||||
|
||||
// Sync communication
|
||||
case UhkModulePhase_RequestSync:
|
||||
txMessage.data[0] = SlaveCommand_RequestProperty;
|
||||
@@ -86,30 +93,52 @@ status_t UhkModuleSlaveDriver_Update(uint8_t uhkModuleDriverId)
|
||||
bool isSyncValid = memcmp(rxMessage->data, SlaveSyncString, SLAVE_SYNC_STRING_LENGTH) == 0;
|
||||
status = kStatus_Uhk_NoTransfer;
|
||||
*uhkModulePhase = isSyncValid && isMessageValid
|
||||
? UhkModulePhase_RequestProtocolVersion
|
||||
? UhkModulePhase_RequestModuleProtocolVersion
|
||||
: UhkModulePhase_RequestSync;
|
||||
break;
|
||||
}
|
||||
|
||||
// Get protocol version
|
||||
case UhkModulePhase_RequestProtocolVersion:
|
||||
// Get module protocol version
|
||||
case UhkModulePhase_RequestModuleProtocolVersion:
|
||||
txMessage.data[0] = SlaveCommand_RequestProperty;
|
||||
txMessage.data[1] = SlaveProperty_ProtocolVersion;
|
||||
txMessage.data[1] = SlaveProperty_ModuleProtocolVersion;
|
||||
txMessage.length = 2;
|
||||
status = tx(i2cAddress);
|
||||
*uhkModulePhase = UhkModulePhase_ReceiveProtocolVersion;
|
||||
*uhkModulePhase = UhkModulePhase_ReceiveModuleProtocolVersion;
|
||||
break;
|
||||
case UhkModulePhase_ReceiveProtocolVersion:
|
||||
case UhkModulePhase_ReceiveModuleProtocolVersion:
|
||||
status = rx(rxMessage, i2cAddress);
|
||||
*uhkModulePhase = UhkModulePhase_ProcessProtocolVersion;
|
||||
*uhkModulePhase = UhkModulePhase_ProcessModuleProtocolVersion;
|
||||
break;
|
||||
case UhkModulePhase_ProcessProtocolVersion: {
|
||||
case UhkModulePhase_ProcessModuleProtocolVersion: {
|
||||
bool isMessageValid = CRC16_IsMessageValid(rxMessage);
|
||||
if (isMessageValid) {
|
||||
uhkModuleState->protocolVersion = rxMessage->data[0];
|
||||
memcpy(&uhkModuleState->moduleProtocolVersion, rxMessage->data, sizeof(version_t));
|
||||
}
|
||||
status = kStatus_Uhk_NoTransfer;
|
||||
*uhkModulePhase = isMessageValid ? UhkModulePhase_RequestModuleId : UhkModulePhase_RequestProtocolVersion;
|
||||
*uhkModulePhase = isMessageValid ? UhkModulePhase_RequestFirmwareVersion : UhkModulePhase_RequestModuleProtocolVersion;
|
||||
break;
|
||||
}
|
||||
|
||||
// Get firmware version
|
||||
case UhkModulePhase_RequestFirmwareVersion:
|
||||
txMessage.data[0] = SlaveCommand_RequestProperty;
|
||||
txMessage.data[1] = SlaveProperty_FirmwareVersion;
|
||||
txMessage.length = 2;
|
||||
status = tx(i2cAddress);
|
||||
*uhkModulePhase = UhkModulePhase_ReceiveFirmwareVersion;
|
||||
break;
|
||||
case UhkModulePhase_ReceiveFirmwareVersion:
|
||||
status = rx(rxMessage, i2cAddress);
|
||||
*uhkModulePhase = UhkModulePhase_ProcessFirmwareVersion;
|
||||
break;
|
||||
case UhkModulePhase_ProcessFirmwareVersion: {
|
||||
bool isMessageValid = CRC16_IsMessageValid(rxMessage);
|
||||
if (isMessageValid) {
|
||||
memcpy(&uhkModuleState->firmwareVersion, rxMessage->data, sizeof(version_t));
|
||||
}
|
||||
status = kStatus_Uhk_NoTransfer;
|
||||
*uhkModulePhase = isMessageValid ? UhkModulePhase_RequestModuleId : UhkModulePhase_RequestFirmwareVersion;
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -131,29 +160,51 @@ status_t UhkModuleSlaveDriver_Update(uint8_t uhkModuleDriverId)
|
||||
uhkModuleState->moduleId = rxMessage->data[0];
|
||||
}
|
||||
status = kStatus_Uhk_NoTransfer;
|
||||
*uhkModulePhase = isMessageValid ? UhkModulePhase_RequestModuleFeatures : UhkModulePhase_RequestModuleId;
|
||||
*uhkModulePhase = isMessageValid ? UhkModulePhase_RequestModuleKeyCount : UhkModulePhase_RequestModuleId;
|
||||
break;
|
||||
}
|
||||
|
||||
// Get module features
|
||||
case UhkModulePhase_RequestModuleFeatures:
|
||||
// Get module key count
|
||||
case UhkModulePhase_RequestModuleKeyCount:
|
||||
txMessage.data[0] = SlaveCommand_RequestProperty;
|
||||
txMessage.data[1] = SlaveProperty_Features;
|
||||
txMessage.data[1] = SlaveProperty_KeyCount;
|
||||
txMessage.length = 2;
|
||||
status = tx(i2cAddress);
|
||||
*uhkModulePhase = UhkModulePhase_ReceiveModuleFeatures;
|
||||
*uhkModulePhase = UhkModulePhase_ReceiveModuleKeyCount;
|
||||
break;
|
||||
case UhkModulePhase_ReceiveModuleFeatures:
|
||||
case UhkModulePhase_ReceiveModuleKeyCount:
|
||||
status = rx(rxMessage, i2cAddress);
|
||||
*uhkModulePhase = UhkModulePhase_ProcessModuleFeatures;
|
||||
*uhkModulePhase = UhkModulePhase_ProcessModuleKeyCount;
|
||||
break;
|
||||
case UhkModulePhase_ProcessModuleFeatures: {
|
||||
case UhkModulePhase_ProcessModuleKeyCount: {
|
||||
bool isMessageValid = CRC16_IsMessageValid(rxMessage);
|
||||
if (isMessageValid) {
|
||||
memcpy(&uhkModuleState->features, rxMessage->data, sizeof(uhk_module_features_t));
|
||||
uhkModuleState->keyCount = rxMessage->data[0];
|
||||
}
|
||||
status = kStatus_Uhk_NoTransfer;
|
||||
*uhkModulePhase = isMessageValid ? UhkModulePhase_RequestKeyStates : UhkModulePhase_RequestModuleFeatures;
|
||||
*uhkModulePhase = isMessageValid ? UhkModulePhase_RequestModulePointerCount : UhkModulePhase_RequestModuleKeyCount;
|
||||
break;
|
||||
}
|
||||
|
||||
// Get module pointer count
|
||||
case UhkModulePhase_RequestModulePointerCount:
|
||||
txMessage.data[0] = SlaveCommand_RequestProperty;
|
||||
txMessage.data[1] = SlaveProperty_PointerCount;
|
||||
txMessage.length = 2;
|
||||
status = tx(i2cAddress);
|
||||
*uhkModulePhase = UhkModulePhase_ReceiveModulePointerCount;
|
||||
break;
|
||||
case UhkModulePhase_ReceiveModulePointerCount:
|
||||
status = rx(rxMessage, i2cAddress);
|
||||
*uhkModulePhase = UhkModulePhase_ProcessModulePointerCount;
|
||||
break;
|
||||
case UhkModulePhase_ProcessModulePointerCount: {
|
||||
bool isMessageValid = CRC16_IsMessageValid(rxMessage);
|
||||
if (isMessageValid) {
|
||||
uhkModuleState->pointerCount = rxMessage->data[0];
|
||||
}
|
||||
status = kStatus_Uhk_NoTransfer;
|
||||
*uhkModulePhase = isMessageValid ? UhkModulePhase_RequestKeyStates : UhkModulePhase_RequestModulePointerCount;
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -171,25 +222,12 @@ status_t UhkModuleSlaveDriver_Update(uint8_t uhkModuleDriverId)
|
||||
case UhkModulePhase_ProcessKeystates:
|
||||
if (CRC16_IsMessageValid(rxMessage)) {
|
||||
uint8_t slotId = uhkModuleDriverId + 1;
|
||||
BoolBitsToBytes(rxMessage->data, keyStatesBuffer, uhkModuleState->features.keyCount);
|
||||
for (uint8_t keyId=0; keyId<uhkModuleState->features.keyCount; keyId++) {
|
||||
BoolBitsToBytes(rxMessage->data, keyStatesBuffer, uhkModuleState->keyCount);
|
||||
for (uint8_t keyId=0; keyId<uhkModuleState->keyCount; keyId++) {
|
||||
KeyStates[slotId][keyId].current = keyStatesBuffer[keyId];
|
||||
}
|
||||
}
|
||||
status = kStatus_Uhk_NoTransfer;
|
||||
*uhkModulePhase = UhkModulePhase_JumpToBootloader;
|
||||
break;
|
||||
|
||||
// Jump to bootloader
|
||||
case UhkModulePhase_JumpToBootloader:
|
||||
if (uhkModuleState->jumpToBootloader) {
|
||||
txMessage.data[0] = SlaveCommand_JumpToBootloader;
|
||||
txMessage.length = 1;
|
||||
status = tx(i2cAddress);
|
||||
uhkModuleState->jumpToBootloader = false;
|
||||
} else {
|
||||
status = kStatus_Uhk_NoTransfer;
|
||||
}
|
||||
*uhkModulePhase = UhkModulePhase_SetTestLed;
|
||||
break;
|
||||
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
|
||||
#include "fsl_common.h"
|
||||
#include "crc16.h"
|
||||
#include "versions.h"
|
||||
|
||||
// Macros:
|
||||
|
||||
@@ -29,19 +30,29 @@
|
||||
UhkModulePhase_ProcessSync,
|
||||
|
||||
// Get protocol version
|
||||
UhkModulePhase_RequestProtocolVersion,
|
||||
UhkModulePhase_ReceiveProtocolVersion,
|
||||
UhkModulePhase_ProcessProtocolVersion,
|
||||
UhkModulePhase_RequestModuleProtocolVersion,
|
||||
UhkModulePhase_ReceiveModuleProtocolVersion,
|
||||
UhkModulePhase_ProcessModuleProtocolVersion,
|
||||
|
||||
// Get firmware version
|
||||
UhkModulePhase_RequestFirmwareVersion,
|
||||
UhkModulePhase_ReceiveFirmwareVersion,
|
||||
UhkModulePhase_ProcessFirmwareVersion,
|
||||
|
||||
// Get module id
|
||||
UhkModulePhase_RequestModuleId,
|
||||
UhkModulePhase_ReceiveModuleId,
|
||||
UhkModulePhase_ProcessModuleId,
|
||||
|
||||
// Get module features
|
||||
UhkModulePhase_RequestModuleFeatures,
|
||||
UhkModulePhase_ReceiveModuleFeatures,
|
||||
UhkModulePhase_ProcessModuleFeatures,
|
||||
// Get module key count
|
||||
UhkModulePhase_RequestModuleKeyCount,
|
||||
UhkModulePhase_ReceiveModuleKeyCount,
|
||||
UhkModulePhase_ProcessModuleKeyCount,
|
||||
|
||||
// Get module key count
|
||||
UhkModulePhase_RequestModulePointerCount,
|
||||
UhkModulePhase_ReceiveModulePointerCount,
|
||||
UhkModulePhase_ProcessModulePointerCount,
|
||||
|
||||
// Get key states
|
||||
UhkModulePhase_RequestKeyStates,
|
||||
@@ -49,9 +60,9 @@
|
||||
UhkModulePhase_ProcessKeystates,
|
||||
|
||||
// Misc phases
|
||||
UhkModulePhase_JumpToBootloader,
|
||||
UhkModulePhase_SetTestLed,
|
||||
UhkModulePhase_SetLedPwmBrightness,
|
||||
UhkModulePhase_JumpToBootloader,
|
||||
|
||||
} uhk_module_phase_t;
|
||||
|
||||
@@ -62,15 +73,16 @@
|
||||
|
||||
typedef struct {
|
||||
uint8_t moduleId;
|
||||
uint8_t protocolVersion;
|
||||
version_t moduleProtocolVersion;
|
||||
version_t firmwareVersion;
|
||||
uhk_module_phase_t phase;
|
||||
uhk_module_vars_t sourceVars;
|
||||
uhk_module_vars_t targetVars;
|
||||
i2c_message_t rxMessage;
|
||||
uint8_t firmwareI2cAddress;
|
||||
uint8_t bootloaderI2cAddress;
|
||||
uhk_module_features_t features;
|
||||
bool jumpToBootloader;
|
||||
uint8_t keyCount;
|
||||
uint8_t pointerCount;
|
||||
} uhk_module_state_t;
|
||||
|
||||
typedef struct {
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
// Macros:
|
||||
|
||||
#define SLOT_COUNT 4
|
||||
#define IS_VALID_SLAVE_SLOT(slotId) (SlotId_LeftKeyboardHalf <= (slotId) && (slotId) <= SlotId_RightModule)
|
||||
#define IS_VALID_MODULE_SLOT(slotId) (SlotId_LeftKeyboardHalf <= (slotId) && (slotId) <= SlotId_RightModule)
|
||||
|
||||
// Typedefs:
|
||||
|
||||
|
||||
62
right/src/usb_commands/usb_command_get_device_property.c
Normal file
62
right/src/usb_commands/usb_command_get_device_property.c
Normal file
@@ -0,0 +1,62 @@
|
||||
#include "fsl_common.h"
|
||||
#include "usb_commands/usb_command_get_device_property.h"
|
||||
#include "usb_protocol_handler.h"
|
||||
#include "eeprom.h"
|
||||
#include "versions.h"
|
||||
|
||||
version_t deviceProtocolVersion = {
|
||||
DEVICE_PROTOCOL_MAJOR_VERSION,
|
||||
DEVICE_PROTOCOL_MINOR_VERSION,
|
||||
DEVICE_PROTOCOL_PATCH_VERSION,
|
||||
};
|
||||
|
||||
version_t protocolVersions[] =
|
||||
{
|
||||
{
|
||||
FIRMWARE_MAJOR_VERSION,
|
||||
FIRMWARE_MINOR_VERSION,
|
||||
FIRMWARE_PATCH_VERSION,
|
||||
},
|
||||
{
|
||||
DEVICE_PROTOCOL_MAJOR_VERSION,
|
||||
DEVICE_PROTOCOL_MINOR_VERSION,
|
||||
DEVICE_PROTOCOL_PATCH_VERSION,
|
||||
},
|
||||
{
|
||||
MODULE_PROTOCOL_MAJOR_VERSION,
|
||||
MODULE_PROTOCOL_MINOR_VERSION,
|
||||
MODULE_PROTOCOL_PATCH_VERSION,
|
||||
},
|
||||
{
|
||||
USER_CONFIG_MAJOR_VERSION,
|
||||
USER_CONFIG_MINOR_VERSION,
|
||||
USER_CONFIG_PATCH_VERSION,
|
||||
},
|
||||
{
|
||||
HARDWARE_CONFIG_MAJOR_VERSION,
|
||||
HARDWARE_CONFIG_MINOR_VERSION,
|
||||
HARDWARE_CONFIG_PATCH_VERSION,
|
||||
}
|
||||
};
|
||||
|
||||
uint16_t configSizes[] = {HARDWARE_CONFIG_SIZE, USER_CONFIG_SIZE};
|
||||
|
||||
void UsbCommand_GetDeviceProperty(void)
|
||||
{
|
||||
uint8_t propertyId = GetUsbRxBufferUint8(1);
|
||||
|
||||
switch (propertyId) {
|
||||
case DevicePropertyId_DeviceProtocolVersion:
|
||||
memcpy(GenericHidOutBuffer+1, (uint8_t*)&deviceProtocolVersion, sizeof(deviceProtocolVersion));
|
||||
break;
|
||||
case DevicePropertyId_ProtocolVersions:
|
||||
memcpy(GenericHidOutBuffer+1, (uint8_t*)&protocolVersions, sizeof(protocolVersions));
|
||||
break;
|
||||
case DevicePropertyId_ConfigSizes:
|
||||
memcpy(GenericHidOutBuffer+1, (uint8_t*)&configSizes, sizeof(configSizes));
|
||||
break;
|
||||
default:
|
||||
SetUsbTxBufferUint8(0, UsbStatusCode_GetDeviceProperty_InvalidProperty);
|
||||
break;
|
||||
}
|
||||
}
|
||||
20
right/src/usb_commands/usb_command_get_device_property.h
Normal file
20
right/src/usb_commands/usb_command_get_device_property.h
Normal file
@@ -0,0 +1,20 @@
|
||||
#ifndef __USB_COMMAND_GET_DEVICE_PROPERTY_H__
|
||||
#define __USB_COMMAND_GET_DEVICE_PROPERTY_H__
|
||||
|
||||
// Typedefs:
|
||||
|
||||
typedef enum {
|
||||
DevicePropertyId_DeviceProtocolVersion = 0,
|
||||
DevicePropertyId_ProtocolVersions = 1,
|
||||
DevicePropertyId_ConfigSizes = 2,
|
||||
} system_property_t;
|
||||
|
||||
typedef enum {
|
||||
UsbStatusCode_GetDeviceProperty_InvalidProperty = 2,
|
||||
} usb_status_code_get_device_property_t;
|
||||
|
||||
// Functions:
|
||||
|
||||
void UsbCommand_GetDeviceProperty(void);
|
||||
|
||||
#endif
|
||||
@@ -1,5 +1,5 @@
|
||||
#include "fsl_common.h"
|
||||
#include "usb_commands/usb_command_get_keyboard_state.h"
|
||||
#include "usb_commands/usb_command_get_device_state.h"
|
||||
#include "usb_protocol_handler.h"
|
||||
#include "eeprom.h"
|
||||
#include "peripherals/merge_sensor.h"
|
||||
21
right/src/usb_commands/usb_command_get_module_property.c
Normal file
21
right/src/usb_commands/usb_command_get_module_property.c
Normal file
@@ -0,0 +1,21 @@
|
||||
#include "fsl_common.h"
|
||||
#include "usb_commands/usb_command_get_module_property.h"
|
||||
#include "usb_protocol_handler.h"
|
||||
#include "slot.h"
|
||||
#include "slave_drivers/uhk_module_driver.h"
|
||||
|
||||
void UsbCommand_GetModuleProperty()
|
||||
{
|
||||
slot_t slotId = GetUsbRxBufferUint8(1);
|
||||
|
||||
if (!IS_VALID_MODULE_SLOT(slotId)) {
|
||||
SetUsbTxBufferUint8(0, UsbStatusCode_GetModuleProperty_InvalidModuleSlotId);
|
||||
}
|
||||
|
||||
uint8_t moduleDriverId = SLOT_ID_TO_UHK_MODULE_DRIVER_ID(slotId);
|
||||
uhk_module_state_t *moduleState = UhkModuleStates + moduleDriverId;
|
||||
|
||||
GenericHidOutBuffer[1] = moduleState->moduleId;
|
||||
memcpy(GenericHidOutBuffer + 2, &moduleState->moduleProtocolVersion, sizeof(version_t));
|
||||
memcpy(GenericHidOutBuffer + 2 + sizeof(version_t), &moduleState->firmwareVersion, sizeof(version_t));
|
||||
}
|
||||
14
right/src/usb_commands/usb_command_get_module_property.h
Normal file
14
right/src/usb_commands/usb_command_get_module_property.h
Normal file
@@ -0,0 +1,14 @@
|
||||
#ifndef __USB_COMMAND_GET_MODULE_PROPERTY_H__
|
||||
#define __USB_COMMAND_GET_MODULE_PROPERTY_H__
|
||||
|
||||
// Functions:
|
||||
|
||||
void UsbCommand_GetModuleProperty();
|
||||
|
||||
// Typedefs:
|
||||
|
||||
typedef enum {
|
||||
UsbStatusCode_GetModuleProperty_InvalidModuleSlotId = 2,
|
||||
} usb_status_code_get_module_property_t;
|
||||
|
||||
#endif
|
||||
@@ -1,33 +0,0 @@
|
||||
#include "fsl_common.h"
|
||||
#include "usb_commands/usb_command_get_property.h"
|
||||
#include "usb_protocol_handler.h"
|
||||
#include "eeprom.h"
|
||||
|
||||
void UsbCommand_GetProperty(void)
|
||||
{
|
||||
uint8_t propertyId = GetUsbRxBufferUint8(1);
|
||||
|
||||
switch (propertyId) {
|
||||
case SystemPropertyId_UsbProtocolVersion:
|
||||
SetUsbTxBufferUint8(1, SYSTEM_PROPERTY_USB_PROTOCOL_VERSION);
|
||||
break;
|
||||
case SystemPropertyId_BridgeProtocolVersion:
|
||||
SetUsbTxBufferUint8(1, SYSTEM_PROPERTY_BRIDGE_PROTOCOL_VERSION);
|
||||
break;
|
||||
case SystemPropertyId_DataModelVersion:
|
||||
SetUsbTxBufferUint8(1, SYSTEM_PROPERTY_DATA_MODEL_VERSION);
|
||||
break;
|
||||
case SystemPropertyId_FirmwareVersion:
|
||||
SetUsbTxBufferUint8(1, SYSTEM_PROPERTY_FIRMWARE_VERSION);
|
||||
break;
|
||||
case SystemPropertyId_HardwareConfigSize:
|
||||
SetUsbTxBufferUint16(1, HARDWARE_CONFIG_SIZE);
|
||||
break;
|
||||
case SystemPropertyId_UserConfigSize:
|
||||
SetUsbTxBufferUint16(1, USER_CONFIG_SIZE);
|
||||
break;
|
||||
default:
|
||||
SetUsbTxBufferUint8(0, UsbStatusCode_GetProperty_InvalidProperty);
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -1,30 +0,0 @@
|
||||
#ifndef __USB_COMMAND_GET_PROPERTY_H__
|
||||
#define __USB_COMMAND_GET_PROPERTY_H__
|
||||
|
||||
// Macros:
|
||||
|
||||
#define SYSTEM_PROPERTY_USB_PROTOCOL_VERSION 1
|
||||
#define SYSTEM_PROPERTY_BRIDGE_PROTOCOL_VERSION 1
|
||||
#define SYSTEM_PROPERTY_DATA_MODEL_VERSION 1
|
||||
#define SYSTEM_PROPERTY_FIRMWARE_VERSION 1
|
||||
|
||||
// Typedefs:
|
||||
|
||||
typedef enum {
|
||||
SystemPropertyId_UsbProtocolVersion = 0,
|
||||
SystemPropertyId_BridgeProtocolVersion = 1,
|
||||
SystemPropertyId_DataModelVersion = 2,
|
||||
SystemPropertyId_FirmwareVersion = 3,
|
||||
SystemPropertyId_HardwareConfigSize = 4,
|
||||
SystemPropertyId_UserConfigSize = 5,
|
||||
} system_property_t;
|
||||
|
||||
typedef enum {
|
||||
UsbStatusCode_GetProperty_InvalidProperty = 2,
|
||||
} usb_status_code_get_property_t;
|
||||
|
||||
// Functions:
|
||||
|
||||
void UsbCommand_GetProperty(void);
|
||||
|
||||
#endif
|
||||
@@ -7,11 +7,11 @@ void UsbCommand_JumpToModuleBootloader(void)
|
||||
{
|
||||
uint8_t slotId = GetUsbRxBufferUint8(1);
|
||||
|
||||
if (!IS_VALID_SLAVE_SLOT(slotId)) {
|
||||
if (!IS_VALID_MODULE_SLOT(slotId)) {
|
||||
SetUsbTxBufferUint8(0, UsbStatusCode_JumpToModuleBootloader_InvalidSlaveSlotId);
|
||||
return;
|
||||
}
|
||||
|
||||
uint8_t uhkModuleDriverId = SLOT_ID_TO_UHK_MODULE_DRIVER_ID(slotId);
|
||||
UhkModuleStates[uhkModuleDriverId].jumpToBootloader = true;
|
||||
UhkModuleStates[uhkModuleDriverId].phase = UhkModulePhase_JumpToBootloader;
|
||||
}
|
||||
|
||||
25
right/src/usb_commands/usb_command_launch_eeprom_transfer.c
Normal file
25
right/src/usb_commands/usb_command_launch_eeprom_transfer.c
Normal file
@@ -0,0 +1,25 @@
|
||||
#include "fsl_common.h"
|
||||
#include "usb_commands/usb_command_launch_eeprom_transfer.h"
|
||||
#include "usb_protocol_handler.h"
|
||||
#include "eeprom.h"
|
||||
#include "config_parser/config_globals.h"
|
||||
|
||||
void UsbCommand_LaunchEepromTransfer(void)
|
||||
{
|
||||
eeprom_operation_t eepromOperation = GetUsbRxBufferUint8(1);
|
||||
config_buffer_id_t configBufferId = GetUsbRxBufferUint8(2);
|
||||
|
||||
if (!IsEepromOperationValid(eepromOperation)) {
|
||||
SetUsbTxBufferUint8(0, UsbStatusCode_LaunchEepromTransfer_InvalidEepromOperation);
|
||||
}
|
||||
|
||||
if (!IsConfigBufferIdValid(configBufferId)) {
|
||||
SetUsbTxBufferUint8(0, UsbStatusCode_LaunchEepromTransfer_InvalidConfigBufferId);
|
||||
}
|
||||
|
||||
status_t status = EEPROM_LaunchTransfer(eepromOperation, configBufferId, NULL);
|
||||
if (status != kStatus_Success) {
|
||||
SetUsbTxBufferUint8(0, UsbStatusCode_LaunchEepromTransfer_TransferError);
|
||||
SetUsbTxBufferUint32(1, status);
|
||||
}
|
||||
}
|
||||
16
right/src/usb_commands/usb_command_launch_eeprom_transfer.h
Normal file
16
right/src/usb_commands/usb_command_launch_eeprom_transfer.h
Normal file
@@ -0,0 +1,16 @@
|
||||
#ifndef __USB_COMMAND_LAUNCH_EEPROM_TRANSFER_H__
|
||||
#define __USB_COMMAND_LAUNCH_EEPROM_TRANSFER_H__
|
||||
|
||||
// Typedef
|
||||
|
||||
typedef enum {
|
||||
UsbStatusCode_LaunchEepromTransfer_InvalidEepromOperation = 2,
|
||||
UsbStatusCode_LaunchEepromTransfer_InvalidConfigBufferId = 3,
|
||||
UsbStatusCode_LaunchEepromTransfer_TransferError = 4,
|
||||
} usb_status_code_launch_eeprom_transfer_t;
|
||||
|
||||
// Functions:
|
||||
|
||||
void UsbCommand_LaunchEepromTransfer(void);
|
||||
|
||||
#endif
|
||||
@@ -1,23 +0,0 @@
|
||||
#include "fsl_common.h"
|
||||
#include "usb_commands/usb_command_launch_eeprom_transfer_legacy.h"
|
||||
#include "usb_protocol_handler.h"
|
||||
#include "eeprom.h"
|
||||
|
||||
void UsbCommand_LaunchEepromTransferLegacy(void)
|
||||
{
|
||||
uint8_t legacyEepromTransferId = GetUsbRxBufferUint8(1);
|
||||
switch (legacyEepromTransferId) {
|
||||
case 0:
|
||||
EEPROM_LaunchTransfer(EepromOperation_Read, ConfigBufferId_HardwareConfig, NULL);
|
||||
break;
|
||||
case 1:
|
||||
EEPROM_LaunchTransfer(EepromOperation_Write, ConfigBufferId_HardwareConfig, NULL);
|
||||
break;
|
||||
case 2:
|
||||
EEPROM_LaunchTransfer(EepromOperation_Read, ConfigBufferId_ValidatedUserConfig, NULL);
|
||||
break;
|
||||
case 3:
|
||||
EEPROM_LaunchTransfer(EepromOperation_Write, ConfigBufferId_ValidatedUserConfig, NULL);
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -1,8 +0,0 @@
|
||||
#ifndef __USB_COMMAND_LAUNCH_EEPROM_TRANSFER_LEGACY_H__
|
||||
#define __USB_COMMAND_LAUNCH_EEPROM_TRANSFER_LEGACY_H__
|
||||
|
||||
// Functions:
|
||||
|
||||
void UsbCommand_LaunchEepromTransferLegacy(void);
|
||||
|
||||
#endif
|
||||
@@ -3,23 +3,28 @@
|
||||
#include "usb_protocol_handler.h"
|
||||
#include "eeprom.h"
|
||||
|
||||
void UsbCommand_ReadConfig(bool isHardware)
|
||||
void UsbCommand_ReadConfig()
|
||||
{
|
||||
uint8_t length = GetUsbRxBufferUint8(1);
|
||||
uint16_t offset = GetUsbRxBufferUint16(2);
|
||||
config_buffer_id_t configBufferId = GetUsbRxBufferUint8(1);
|
||||
uint8_t length = GetUsbRxBufferUint8(2);
|
||||
uint16_t offset = GetUsbRxBufferUint16(3);
|
||||
|
||||
if (!IsConfigBufferIdValid(configBufferId)) {
|
||||
SetUsbTxBufferUint8(0, UsbStatusCode_ReadConfig_InvalidConfigBufferId);
|
||||
}
|
||||
|
||||
if (length > USB_GENERIC_HID_OUT_BUFFER_LENGTH - USB_STATUS_CODE_SIZE) {
|
||||
SetUsbTxBufferUint8(0, UsbStatusCode_ReadConfig_LengthTooLarge);
|
||||
return;
|
||||
}
|
||||
|
||||
uint8_t *buffer = isHardware ? HardwareConfigBuffer.buffer : ValidatedUserConfigBuffer.buffer;
|
||||
uint16_t bufferLength = isHardware ? HARDWARE_CONFIG_SIZE : USER_CONFIG_SIZE;
|
||||
config_buffer_t *buffer = ConfigBufferIdToConfigBuffer(configBufferId);
|
||||
uint16_t bufferLength = ConfigBufferIdToBufferSize(configBufferId);
|
||||
|
||||
if (offset + length > bufferLength) {
|
||||
SetUsbTxBufferUint8(0, UsbStatusCode_ReadConfig_BufferOutOfBounds);
|
||||
return;
|
||||
}
|
||||
|
||||
memcpy(GenericHidOutBuffer + USB_STATUS_CODE_SIZE, buffer + offset, length);
|
||||
memcpy(GenericHidOutBuffer + USB_STATUS_CODE_SIZE, buffer->buffer + offset, length);
|
||||
}
|
||||
|
||||
@@ -3,13 +3,14 @@
|
||||
|
||||
// Functions:
|
||||
|
||||
void UsbCommand_ReadConfig(bool isHardware);
|
||||
void UsbCommand_ReadConfig();
|
||||
|
||||
// Typedefs:
|
||||
|
||||
typedef enum {
|
||||
UsbStatusCode_ReadConfig_LengthTooLarge = 2,
|
||||
UsbStatusCode_ReadConfig_BufferOutOfBounds = 3,
|
||||
UsbStatusCode_ReadConfig_InvalidConfigBufferId = 2,
|
||||
UsbStatusCode_ReadConfig_LengthTooLarge = 3,
|
||||
UsbStatusCode_ReadConfig_BufferOutOfBounds = 4,
|
||||
} usb_status_code_read_config_t;
|
||||
|
||||
#endif
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
#include "usb_protocol_handler.h"
|
||||
#include "eeprom.h"
|
||||
|
||||
void UsbCommand_WriteConfig(bool isHardware)
|
||||
void UsbCommand_WriteConfig(config_buffer_id_t configBufferId)
|
||||
{
|
||||
uint8_t length = GetUsbRxBufferUint8(1);
|
||||
uint16_t offset = GetUsbRxBufferUint16(2);
|
||||
@@ -14,8 +14,8 @@ void UsbCommand_WriteConfig(bool isHardware)
|
||||
return;
|
||||
}
|
||||
|
||||
uint8_t *buffer = isHardware ? HardwareConfigBuffer.buffer : StagingUserConfigBuffer.buffer;
|
||||
uint16_t bufferLength = isHardware ? HARDWARE_CONFIG_SIZE : USER_CONFIG_SIZE;
|
||||
uint8_t *buffer = ConfigBufferIdToConfigBuffer(configBufferId)->buffer;
|
||||
uint16_t bufferLength = ConfigBufferIdToBufferSize(configBufferId);
|
||||
|
||||
if (offset + length > bufferLength) {
|
||||
SetUsbTxBufferUint8(0, UsbStatusCode_WriteConfig_BufferOutOfBounds);
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
#ifndef __USB_COMMAND_WRITE_CONFIG_H__
|
||||
#define __USB_COMMAND_WRITE_CONFIG_H__
|
||||
|
||||
// Functions:
|
||||
// Includes:
|
||||
|
||||
void UsbCommand_WriteConfig(bool isHardware);
|
||||
#include "config_parser/config_globals.h"
|
||||
|
||||
// Typedefs:
|
||||
|
||||
@@ -12,4 +12,8 @@
|
||||
UsbStatusCode_WriteConfig_BufferOutOfBounds = 3,
|
||||
} usb_status_code_write_config_t;
|
||||
|
||||
// Functions:
|
||||
|
||||
void UsbCommand_WriteConfig(config_buffer_id_t configBufferId);
|
||||
|
||||
#endif
|
||||
|
||||
@@ -1,15 +1,16 @@
|
||||
#include "usb_protocol_handler.h"
|
||||
#include "buffer.h"
|
||||
#include "usb_commands/usb_command_get_property.h"
|
||||
#include "usb_commands/usb_command_get_device_property.h"
|
||||
#include "usb_commands/usb_command_get_module_property.h"
|
||||
#include "usb_commands/usb_command_reenumerate.h"
|
||||
#include "usb_commands/usb_command_set_test_led.h"
|
||||
#include "usb_commands/usb_command_write_config.h"
|
||||
#include "usb_commands/usb_command_apply_config.h"
|
||||
#include "usb_commands/usb_command_set_led_pwm_brightness.h"
|
||||
#include "usb_commands/usb_command_get_adc_value.h"
|
||||
#include "usb_commands/usb_command_launch_eeprom_transfer_legacy.h"
|
||||
#include "usb_commands/usb_command_launch_eeprom_transfer.h"
|
||||
#include "usb_commands/usb_command_read_config.h"
|
||||
#include "usb_commands/usb_command_get_keyboard_state.h"
|
||||
#include "usb_commands/usb_command_get_device_state.h"
|
||||
#include "usb_commands/usb_command_get_debug_buffer.h"
|
||||
#include "usb_commands/usb_command_jump_to_module_bootloader.h"
|
||||
#include "usb_commands/usb_command_send_kboot_command_to_module.h"
|
||||
@@ -19,51 +20,51 @@ void UsbProtocolHandler(void)
|
||||
bzero(GenericHidOutBuffer, USB_GENERIC_HID_OUT_BUFFER_LENGTH);
|
||||
uint8_t command = GetUsbRxBufferUint8(0);
|
||||
switch (command) {
|
||||
case UsbCommandId_GetProperty:
|
||||
UsbCommand_GetProperty();
|
||||
case UsbCommandId_GetDeviceProperty:
|
||||
UsbCommand_GetDeviceProperty();
|
||||
break;
|
||||
case UsbCommandId_Reenumerate:
|
||||
UsbCommand_Reenumerate();
|
||||
break;
|
||||
case UsbCommandId_SetTestLed:
|
||||
UsbCommand_SetTestLed();
|
||||
break;
|
||||
case UsbCommandId_WriteUserConfig:
|
||||
UsbCommand_WriteConfig(false);
|
||||
break;
|
||||
case UsbCommandId_ApplyConfig:
|
||||
UsbCommand_ApplyConfig();
|
||||
break;
|
||||
case UsbCommandId_SetLedPwmBrightness:
|
||||
UsbCommand_SetLedPwmBrightness();
|
||||
break;
|
||||
case UsbCommandId_GetAdcValue:
|
||||
UsbCommand_GetAdcValue();
|
||||
break;
|
||||
case UsbCommandId_LaunchEepromTransferLegacy:
|
||||
UsbCommand_LaunchEepromTransferLegacy();
|
||||
break;
|
||||
case UsbCommandId_ReadHardwareConfig:
|
||||
UsbCommand_ReadConfig(true);
|
||||
break;
|
||||
case UsbCommandId_WriteHardwareConfig:
|
||||
UsbCommand_WriteConfig(true);
|
||||
break;
|
||||
case UsbCommandId_ReadUserConfig:
|
||||
UsbCommand_ReadConfig(false);
|
||||
break;
|
||||
case UsbCommandId_GetKeyboardState:
|
||||
UsbCommand_GetKeyboardState();
|
||||
break;
|
||||
case UsbCommandId_GetDebugBuffer:
|
||||
UsbCommand_GetDebugBuffer();
|
||||
break;
|
||||
case UsbCommandId_JumpToModuleBootloader:
|
||||
UsbCommand_JumpToModuleBootloader();
|
||||
break;
|
||||
case UsbCommandId_SendKbootCommandToModule:
|
||||
UsbCommand_SendKbootCommandToModule();
|
||||
break;
|
||||
case UsbCommandId_ReadConfig:
|
||||
UsbCommand_ReadConfig();
|
||||
break;
|
||||
case UsbCommandId_WriteHardwareConfig:
|
||||
UsbCommand_WriteConfig(ConfigBufferId_HardwareConfig);
|
||||
break;
|
||||
case UsbCommandId_WriteStagingUserConfig:
|
||||
UsbCommand_WriteConfig(ConfigBufferId_StagingUserConfig);
|
||||
break;
|
||||
case UsbCommandId_ApplyConfig:
|
||||
UsbCommand_ApplyConfig();
|
||||
break;
|
||||
case UsbCommandId_LaunchEepromTransfer:
|
||||
UsbCommand_LaunchEepromTransfer();
|
||||
break;
|
||||
case UsbCommandId_GetDeviceState:
|
||||
UsbCommand_GetKeyboardState();
|
||||
break;
|
||||
case UsbCommandId_SetTestLed:
|
||||
UsbCommand_SetTestLed();
|
||||
break;
|
||||
case UsbCommandId_GetDebugBuffer:
|
||||
UsbCommand_GetDebugBuffer();
|
||||
break;
|
||||
case UsbCommandId_GetAdcValue:
|
||||
UsbCommand_GetAdcValue();
|
||||
break;
|
||||
case UsbCommandId_SetLedPwmBrightness:
|
||||
UsbCommand_SetLedPwmBrightness();
|
||||
break;
|
||||
case UsbCommandId_GetModuleProperty:
|
||||
UsbCommand_GetModuleProperty();
|
||||
break;
|
||||
default:
|
||||
SetUsbTxBufferUint8(0, UsbStatusCode_InvalidCommand);
|
||||
break;
|
||||
|
||||
@@ -13,21 +13,24 @@
|
||||
// Typedefs:
|
||||
|
||||
typedef enum {
|
||||
UsbCommandId_GetProperty = 0x00,
|
||||
UsbCommandId_Reenumerate = 0x01,
|
||||
UsbCommandId_SetTestLed = 0x02,
|
||||
UsbCommandId_WriteUserConfig = 0x08,
|
||||
UsbCommandId_ApplyConfig = 0x09,
|
||||
UsbCommandId_SetLedPwmBrightness = 0x0A,
|
||||
UsbCommandId_GetAdcValue = 0x0B,
|
||||
UsbCommandId_LaunchEepromTransferLegacy = 0x0C,
|
||||
UsbCommandId_ReadHardwareConfig = 0x0D,
|
||||
UsbCommandId_WriteHardwareConfig = 0x0E,
|
||||
UsbCommandId_ReadUserConfig = 0x0F,
|
||||
UsbCommandId_GetKeyboardState = 0x10,
|
||||
UsbCommandId_GetDebugBuffer = 0x11,
|
||||
UsbCommandId_JumpToModuleBootloader = 0x12,
|
||||
UsbCommandId_SendKbootCommandToModule = 0x13,
|
||||
UsbCommandId_GetDeviceProperty = 0x00,
|
||||
|
||||
UsbCommandId_Reenumerate = 0x01,
|
||||
UsbCommandId_JumpToModuleBootloader = 0x02,
|
||||
UsbCommandId_SendKbootCommandToModule = 0x03,
|
||||
|
||||
UsbCommandId_ReadConfig = 0x04,
|
||||
UsbCommandId_WriteHardwareConfig = 0x05,
|
||||
UsbCommandId_WriteStagingUserConfig = 0x06,
|
||||
UsbCommandId_ApplyConfig = 0x07,
|
||||
UsbCommandId_LaunchEepromTransfer = 0x08,
|
||||
|
||||
UsbCommandId_GetDeviceState = 0x09,
|
||||
UsbCommandId_SetTestLed = 0x0a,
|
||||
UsbCommandId_GetDebugBuffer = 0x0b,
|
||||
UsbCommandId_GetAdcValue = 0x0c,
|
||||
UsbCommandId_SetLedPwmBrightness = 0x0d,
|
||||
UsbCommandId_GetModuleProperty = 0x0e,
|
||||
} usb_command_id_t;
|
||||
|
||||
typedef enum {
|
||||
|
||||
@@ -99,15 +99,21 @@ void processMouseKineticState(mouse_kinetic_state_t *kineticState)
|
||||
|
||||
float distance = kineticState->currentSpeed * elapsedTime / 1000;
|
||||
|
||||
|
||||
if (kineticState->isScroll && !kineticState->wasMoveAction) {
|
||||
kineticState->xSum = 0;
|
||||
kineticState->ySum = 0;
|
||||
}
|
||||
|
||||
// Update horizontal state
|
||||
|
||||
bool horizontalMovement = true;
|
||||
if (activeMouseStates[kineticState->leftState]) {
|
||||
kineticState->xSum -= distance;
|
||||
} else if (activeMouseStates[kineticState->rightState]) {
|
||||
kineticState->xSum += distance;
|
||||
} else {
|
||||
horizontalMovement = false;
|
||||
}
|
||||
|
||||
float xSumInt;
|
||||
@@ -115,15 +121,20 @@ void processMouseKineticState(mouse_kinetic_state_t *kineticState)
|
||||
kineticState->xSum = xSumFrac;
|
||||
kineticState->xOut = xSumInt;
|
||||
|
||||
if (kineticState->isScroll && !kineticState->wasMoveAction && kineticState->xOut == 0) {
|
||||
if (kineticState->isScroll && !kineticState->wasMoveAction && kineticState->xOut == 0 && horizontalMovement) {
|
||||
kineticState->xOut = kineticState->xSum > 0 ? 1 : -1;
|
||||
kineticState->xSum = 0;
|
||||
}
|
||||
|
||||
// Update vertical state
|
||||
|
||||
bool verticalMovement = true;
|
||||
if (activeMouseStates[kineticState->upState]) {
|
||||
kineticState->ySum -= distance;
|
||||
} else if (activeMouseStates[kineticState->downState]) {
|
||||
kineticState->ySum += distance;
|
||||
} else {
|
||||
verticalMovement = false;
|
||||
}
|
||||
|
||||
float ySumInt;
|
||||
@@ -131,7 +142,7 @@ void processMouseKineticState(mouse_kinetic_state_t *kineticState)
|
||||
kineticState->ySum = ySumFrac;
|
||||
kineticState->yOut = ySumInt;
|
||||
|
||||
if (kineticState->isScroll && !kineticState->wasMoveAction && kineticState->yOut == 0) {
|
||||
if (kineticState->isScroll && !kineticState->wasMoveAction && kineticState->yOut == 0 && verticalMovement) {
|
||||
kineticState->yOut = kineticState->ySum > 0 ? 1 : -1;
|
||||
kineticState->ySum = 0;
|
||||
}
|
||||
|
||||
41
scripts/generate-versions-h.js
Executable file
41
scripts/generate-versions-h.js
Executable file
@@ -0,0 +1,41 @@
|
||||
#!/usr/bin/env node
|
||||
const fs = require('fs');
|
||||
|
||||
const versionPropertyPrefixes = ['firmware', 'deviceProtocol', 'moduleProtocol', 'userConfig', 'hardwareConfig'];
|
||||
const patchVersions = ['Major', 'Minor', 'Patch'];
|
||||
const package = JSON.parse(fs.readFileSync(`${__dirname}/package.json`));
|
||||
|
||||
const versionVariables = versionPropertyPrefixes.map(versionPropertyPrefix => {
|
||||
const versionPropertyName = `${versionPropertyPrefix}Version`
|
||||
const versionPropertyValues = package[versionPropertyName].split('.');
|
||||
return patchVersions.map(patchVersion => {
|
||||
const versionPropertyValue = versionPropertyValues.shift();
|
||||
const versionPropertyMacroName = `${versionPropertyPrefix}${patchVersion}Version`.split(/(?=[A-Z])/).join('_').toUpperCase()
|
||||
return ` #define ${versionPropertyMacroName} ${versionPropertyValue}`;
|
||||
}).join('\n') + '\n';
|
||||
}).join('\n');
|
||||
|
||||
fs.writeFileSync(`${__dirname}/../shared/versions.h`,
|
||||
`// Please do not edit this file by hand!
|
||||
// It is to be regenerated by /scripts/generate-versions-h.js
|
||||
|
||||
#ifndef __VERSIONS_H__
|
||||
#define __VERSIONS_H__
|
||||
|
||||
// Includes:
|
||||
|
||||
#include "fsl_common.h"
|
||||
|
||||
// Typedefs:
|
||||
|
||||
typedef struct {
|
||||
uint16_t major;
|
||||
uint16_t minor;
|
||||
uint16_t patch;
|
||||
} version_t;
|
||||
|
||||
// Variables:
|
||||
|
||||
${versionVariables}
|
||||
#endif
|
||||
`);
|
||||
@@ -5,8 +5,10 @@ require('shelljs/global');
|
||||
config.fatal = true;
|
||||
config.verbose = true;
|
||||
|
||||
exec(`${__dirname}/generate-versions-h.js`);
|
||||
|
||||
const package = JSON.parse(fs.readFileSync(`${__dirname}/package.json`));
|
||||
const version = package.version;
|
||||
const version = package.firmwareVersion;
|
||||
const releaseName = `uhk-firmware-${version}`;
|
||||
const releaseDir = `${__dirname}/${releaseName}`;
|
||||
const modulesDir = `${releaseDir}/modules`;
|
||||
@@ -28,7 +30,7 @@ exec(`/opt/Freescale/KDS_v3/eclipse/kinetis-design-studio \
|
||||
-cleanBuild uhk-right`
|
||||
);
|
||||
|
||||
for (let device of package.devices) {
|
||||
for (const device of package.devices) {
|
||||
const deviceDir = `${releaseDir}/devices/${device.name}`;
|
||||
const deviceSource = `${__dirname}/../${device.source}`;
|
||||
mkdir('-p', deviceDir);
|
||||
@@ -37,7 +39,7 @@ for (let device of package.devices) {
|
||||
exec(`${usbDir}/user-config-json-to-bin.ts ${deviceDir}/config.bin`);
|
||||
}
|
||||
|
||||
for (let module of package.modules) {
|
||||
for (const module of package.modules) {
|
||||
const moduleDir = `${releaseDir}/modules`;
|
||||
const moduleSource = `${__dirname}/../${module.source}`;
|
||||
mkdir('-p', moduleDir);
|
||||
|
||||
@@ -15,10 +15,11 @@
|
||||
"commander": "^2.11.0",
|
||||
"shelljs": "^0.7.8"
|
||||
},
|
||||
"version": "5.0.1",
|
||||
"dataModelVersion": "4.0.0",
|
||||
"usbProtocolVersion": "2.0.0",
|
||||
"slaveProtocolVersion": "3.0.0",
|
||||
"firmwareVersion": "8.0.1",
|
||||
"deviceProtocolVersion": "4.1.0",
|
||||
"moduleProtocolVersion": "4.0.0",
|
||||
"userConfigVersion": "4.0.0",
|
||||
"hardwareConfigVersion": "1.0.0",
|
||||
"devices": [
|
||||
{
|
||||
"deviceId": 1,
|
||||
|
||||
@@ -27,9 +27,11 @@
|
||||
|
||||
typedef enum {
|
||||
SlaveProperty_Sync,
|
||||
SlaveProperty_ProtocolVersion,
|
||||
SlaveProperty_ModuleProtocolVersion,
|
||||
SlaveProperty_FirmwareVersion,
|
||||
SlaveProperty_ModuleId,
|
||||
SlaveProperty_Features,
|
||||
SlaveProperty_KeyCount,
|
||||
SlaveProperty_PointerCount,
|
||||
} slave_property_t;
|
||||
|
||||
typedef enum {
|
||||
@@ -40,11 +42,6 @@
|
||||
ModuleId_TouchpadRight = 5,
|
||||
} module_id_t;
|
||||
|
||||
typedef struct {
|
||||
uint8_t keyCount;
|
||||
bool hasPointer;
|
||||
} uhk_module_features_t;
|
||||
|
||||
typedef struct {
|
||||
uint8_t length;
|
||||
uint16_t crc;
|
||||
|
||||
41
shared/versions.h
Normal file
41
shared/versions.h
Normal file
@@ -0,0 +1,41 @@
|
||||
// Please do not edit this file by hand!
|
||||
// It is to be regenerated by /scripts/generate-versions-h.js
|
||||
|
||||
#ifndef __VERSIONS_H__
|
||||
#define __VERSIONS_H__
|
||||
|
||||
// Includes:
|
||||
|
||||
#include "fsl_common.h"
|
||||
|
||||
// Typedefs:
|
||||
|
||||
typedef struct {
|
||||
uint16_t major;
|
||||
uint16_t minor;
|
||||
uint16_t patch;
|
||||
} version_t;
|
||||
|
||||
// Variables:
|
||||
|
||||
#define FIRMWARE_MAJOR_VERSION 8
|
||||
#define FIRMWARE_MINOR_VERSION 0
|
||||
#define FIRMWARE_PATCH_VERSION 1
|
||||
|
||||
#define DEVICE_PROTOCOL_MAJOR_VERSION 4
|
||||
#define DEVICE_PROTOCOL_MINOR_VERSION 1
|
||||
#define DEVICE_PROTOCOL_PATCH_VERSION 0
|
||||
|
||||
#define MODULE_PROTOCOL_MAJOR_VERSION 4
|
||||
#define MODULE_PROTOCOL_MINOR_VERSION 0
|
||||
#define MODULE_PROTOCOL_PATCH_VERSION 0
|
||||
|
||||
#define USER_CONFIG_MAJOR_VERSION 4
|
||||
#define USER_CONFIG_MINOR_VERSION 0
|
||||
#define USER_CONFIG_PATCH_VERSION 0
|
||||
|
||||
#define HARDWARE_CONFIG_MAJOR_VERSION 1
|
||||
#define HARDWARE_CONFIG_MINOR_VERSION 0
|
||||
#define HARDWARE_CONFIG_PATCH_VERSION 0
|
||||
|
||||
#endif
|
||||
Reference in New Issue
Block a user