From a6f12848ed136bc99e32e25c8d5b6e1dc7c632a1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A1szl=C3=B3=20Monda?= Date: Sat, 11 Aug 2018 01:48:44 +0200 Subject: [PATCH 01/33] Add timer related changelog entry. --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5e08a92..950ce08 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -32,6 +32,7 @@ Device Protocol: 4.**4.0** | Module Protocol: 4.0.0 | User Config: 4.1.0 | Hardw Device Protocol: 4.3.1 | Module Protocol: 4.0.0 | User Config: 4.1.0 | Hardware Config: 1.0.0 - Implement the macro engine. +- Fix the timer which makes it tick twice as fast as before. - Fix the nondeterministic bug that made USB hang. - Restore the Windows related commits of firmware 8.3.1 because the USB hang bug has been fixed. - Restore debouncing to 100ms until it gets really fixed. From 640c03411186ee144b30a0dc3e20fc748d40d764 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A1szl=C3=B3=20Monda?= Date: Sat, 11 Aug 2018 01:53:45 +0200 Subject: [PATCH 02/33] Compensate "double tap to lock layer" timeouts for the timer fix to make them as long as before 8.3.3 --- right/src/usb_report_updater.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/right/src/usb_report_updater.c b/right/src/usb_report_updater.c index 156db1a..d50bf0c 100644 --- a/right/src/usb_report_updater.c +++ b/right/src/usb_report_updater.c @@ -20,8 +20,8 @@ static uint32_t mouseUsbReportUpdateTime = 0; static uint32_t mouseElapsedTime; -uint16_t DoubleTapSwitchLayerTimeout = 150; -static uint16_t DoubleTapSwitchLayerReleaseTimeout = 100; +uint16_t DoubleTapSwitchLayerTimeout = 300; +static uint16_t DoubleTapSwitchLayerReleaseTimeout = 200; static bool activeMouseStates[ACTIVE_MOUSE_STATES_COUNT]; bool TestUsbStack = false; From 7eb190489b4ae9a834f5d834c50b4fa08b181d4d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A1szl=C3=B3=20Monda?= Date: Sun, 12 Aug 2018 10:41:43 +0200 Subject: [PATCH 03/33] Bump firmware version to 8.4.3, update changelog, package.json, versions.h --- CHANGELOG.md | 6 ++++++ lib/agent | 2 +- scripts/package.json | 2 +- shared/versions.h | 2 +- 4 files changed, 9 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 950ce08..745b834 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,12 @@ 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.4.3] - 2018-08-12 + +Device Protocol: 4.4.0 | Module Protocol: 4.0.0 | User Config: 4.1.0 | Hardware Config: 1.0.0 + +- Compensate "double tap to lock layer" timeouts for the timer fix to make them as long as before 8.3.3 + ## [8.4.2] - 2018-08-02 Device Protocol: 4.4.0 | Module Protocol: 4.0.0 | User Config: 4.1.0 | Hardware Config: 1.0.0 diff --git a/lib/agent b/lib/agent index 67d42f6..80e8c01 160000 --- a/lib/agent +++ b/lib/agent @@ -1 +1 @@ -Subproject commit 67d42f666c0008921875ac5cf05ba730da269f0f +Subproject commit 80e8c014ec493378bde851c2ebfe4f906fbe2487 diff --git a/scripts/package.json b/scripts/package.json index fec2b1b..a90ed70 100644 --- a/scripts/package.json +++ b/scripts/package.json @@ -15,7 +15,7 @@ "commander": "^2.11.0", "shelljs": "^0.7.8" }, - "firmwareVersion": "8.4.2", + "firmwareVersion": "8.4.3", "deviceProtocolVersion": "4.4.0", "moduleProtocolVersion": "4.0.0", "userConfigVersion": "4.1.0", diff --git a/shared/versions.h b/shared/versions.h index bc737a3..3400aad 100644 --- a/shared/versions.h +++ b/shared/versions.h @@ -20,7 +20,7 @@ #define FIRMWARE_MAJOR_VERSION 8 #define FIRMWARE_MINOR_VERSION 4 - #define FIRMWARE_PATCH_VERSION 2 + #define FIRMWARE_PATCH_VERSION 3 #define DEVICE_PROTOCOL_MAJOR_VERSION 4 #define DEVICE_PROTOCOL_MINOR_VERSION 4 From 4bfcd6e02c32d84ef15ee234440afa39f7750b50 Mon Sep 17 00:00:00 2001 From: Eric Tang Date: Mon, 13 Aug 2018 12:07:08 -0700 Subject: [PATCH 04/33] Don't wake the host if a key is held down through the beginning of sleep --- right/src/usb_report_updater.c | 17 ++++------------- 1 file changed, 4 insertions(+), 13 deletions(-) diff --git a/right/src/usb_report_updater.c b/right/src/usb_report_updater.c index d50bf0c..3eb931c 100644 --- a/right/src/usb_report_updater.c +++ b/right/src/usb_report_updater.c @@ -372,6 +372,9 @@ static void updateActiveUsbReports(void) } if (keyState->current) { + if (SleepModeActive && !keyState->previous) { + WakeUpHost(); + } key_action_t *baseAction = &CurrentKeymap[LayerId_Base][slotId][keyId]; if (layerGotReleased && !(baseAction->type == KeyActionType_Keystroke && baseAction->keystroke.scancode == 0 && baseAction->keystroke.modifiers)) { keyState->suppressed = true; @@ -436,19 +439,7 @@ void UpdateUsbReports(void) KeyStates[SlotId_RightKeyboardHalf][keyId].current = RightKeyMatrix.keyStates[keyId]; } - if (SleepModeActive) { - for (uint8_t slotId = 0; slotId < SLOT_COUNT; slotId++) { - for (uint8_t keyId = 0; keyId < MAX_KEY_COUNT_PER_MODULE; keyId++) { - if (KeyStates[slotId][keyId].current) { - WakeUpHost(); - return; - } - } - } - return; - } - - if (UsbReportUpdateSemaphore) { + if (UsbReportUpdateSemaphore && !SleepModeActive) { return; } From 67f07abd0df95ea59d20764a705f1597cdfc98d6 Mon Sep 17 00:00:00 2001 From: Eric Tang Date: Mon, 13 Aug 2018 12:30:36 -0700 Subject: [PATCH 05/33] Ensure that secondary roles are triggered consistently --- right/src/usb_report_updater.c | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/right/src/usb_report_updater.c b/right/src/usb_report_updater.c index d50bf0c..5f7ce33 100644 --- a/right/src/usb_report_updater.c +++ b/right/src/usb_report_updater.c @@ -377,7 +377,11 @@ static void updateActiveUsbReports(void) keyState->suppressed = true; } - if (action->type == KeyActionType_Keystroke && action->keystroke.secondaryRole) { + // Trigger secondary role. + if (!keyState->previous && secondaryRoleState == SecondaryRoleState_Pressed) { + secondaryRoleState = SecondaryRoleState_Triggered; + keyState->current = false; + } else if (action->type == KeyActionType_Keystroke && action->keystroke.secondaryRole) { // Press released secondary role key. if (!keyState->previous && secondaryRoleState == SecondaryRoleState_Released) { secondaryRoleState = SecondaryRoleState_Pressed; @@ -387,13 +391,7 @@ static void updateActiveUsbReports(void) keyState->suppressed = true; } } else { - // Trigger secondary role. - if (!keyState->previous && secondaryRoleState == SecondaryRoleState_Pressed) { - secondaryRoleState = SecondaryRoleState_Triggered; - keyState->current = false; - } else { - applyKeyAction(keyState, action); - } + applyKeyAction(keyState, action); } } else { if (keyState->suppressed) { From b4c2204e504a56cfb0442d5147c62a460d11aa45 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A1szl=C3=B3=20Monda?= Date: Tue, 14 Aug 2018 00:07:21 +0200 Subject: [PATCH 06/33] Bump firmware version to 8.4.4, update changelog, package.json and versions.h --- CHANGELOG.md | 7 +++++++ scripts/package.json | 2 +- shared/versions.h | 2 +- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 745b834..6b3b8cf 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,13 @@ 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.4.4] - 2018-08-14 + +Device Protocol: 4.4.0 | Module Protocol: 4.0.0 | User Config: 4.1.0 | Hardware Config: 1.0.0 + +- Don't wake the host if a key is held down through the beginning of sleep. +- Ensure that secondary roles are triggered consistently. + ## [8.4.3] - 2018-08-12 Device Protocol: 4.4.0 | Module Protocol: 4.0.0 | User Config: 4.1.0 | Hardware Config: 1.0.0 diff --git a/scripts/package.json b/scripts/package.json index a90ed70..cb5d8c4 100644 --- a/scripts/package.json +++ b/scripts/package.json @@ -15,7 +15,7 @@ "commander": "^2.11.0", "shelljs": "^0.7.8" }, - "firmwareVersion": "8.4.3", + "firmwareVersion": "8.4.4", "deviceProtocolVersion": "4.4.0", "moduleProtocolVersion": "4.0.0", "userConfigVersion": "4.1.0", diff --git a/shared/versions.h b/shared/versions.h index 3400aad..19e6fbc 100644 --- a/shared/versions.h +++ b/shared/versions.h @@ -20,7 +20,7 @@ #define FIRMWARE_MAJOR_VERSION 8 #define FIRMWARE_MINOR_VERSION 4 - #define FIRMWARE_PATCH_VERSION 3 + #define FIRMWARE_PATCH_VERSION 4 #define DEVICE_PROTOCOL_MAJOR_VERSION 4 #define DEVICE_PROTOCOL_MINOR_VERSION 4 From 2e2b9d08a9a24868d218148e80520a7ab0691d89 Mon Sep 17 00:00:00 2001 From: Eric Tang Date: Sat, 18 Aug 2018 19:52:07 -0700 Subject: [PATCH 07/33] Suppress pressed keys when the layer or keymap changes --- right/src/keymap.c | 2 ++ right/src/usb_report_updater.c | 5 +++-- right/src/usb_report_updater.h | 1 + 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/right/src/keymap.c b/right/src/keymap.c index ef04bd2..6337101 100644 --- a/right/src/keymap.c +++ b/right/src/keymap.c @@ -5,6 +5,7 @@ #include "config_parser/parse_keymap.h" #include "config_parser/config_globals.h" #include "macros.h" +#include "usb_report_updater.h" keymap_reference_t AllKeymaps[MAX_KEYMAP_NUM] = { { @@ -24,6 +25,7 @@ void SwitchKeymapById(uint8_t index) ValidatedUserConfigBuffer.offset = AllKeymaps[index].offset; ParseKeymap(&ValidatedUserConfigBuffer, index, AllKeymapsCount, AllMacrosCount); LedDisplay_UpdateText(); + KeymapChanged = true; } bool SwitchKeymapByAbbreviation(uint8_t length, char *abbrev) diff --git a/right/src/usb_report_updater.c b/right/src/usb_report_updater.c index c3b7749..d0ae32a 100644 --- a/right/src/usb_report_updater.c +++ b/right/src/usb_report_updater.c @@ -25,6 +25,7 @@ static uint16_t DoubleTapSwitchLayerReleaseTimeout = 200; static bool activeMouseStates[ACTIVE_MOUSE_STATES_COUNT]; bool TestUsbStack = false; +bool KeymapChanged = false; volatile uint8_t UsbReportUpdateSemaphore = 0; @@ -333,7 +334,6 @@ static void updateActiveUsbReports(void) if (layerChanged) { stickyModifiers = 0; } - bool layerGotReleased = layerChanged && activeLayer == LayerId_Base; LedDisplay_SetLayer(activeLayer); if (TestUsbStack) { @@ -376,7 +376,7 @@ static void updateActiveUsbReports(void) WakeUpHost(); } key_action_t *baseAction = &CurrentKeymap[LayerId_Base][slotId][keyId]; - if (layerGotReleased && !(baseAction->type == KeyActionType_Keystroke && baseAction->keystroke.scancode == 0 && baseAction->keystroke.modifiers)) { + if ((layerChanged || KeymapChanged) && !(baseAction->type == KeyActionType_Keystroke && baseAction->keystroke.scancode == 0 && baseAction->keystroke.modifiers)) { keyState->suppressed = true; } @@ -427,6 +427,7 @@ static void updateActiveUsbReports(void) } previousLayer = activeLayer; + KeymapChanged = false; } uint32_t UsbReportUpdateCounter; diff --git a/right/src/usb_report_updater.h b/right/src/usb_report_updater.h index bbdc507..d3df70b 100644 --- a/right/src/usb_report_updater.h +++ b/right/src/usb_report_updater.h @@ -72,6 +72,7 @@ extern uint32_t UsbReportUpdateCounter; extern volatile uint8_t UsbReportUpdateSemaphore; extern bool TestUsbStack; + extern bool KeymapChanged; // Functions: From 4a1b7471977216c06b390772f0a79ae32b914fd1 Mon Sep 17 00:00:00 2001 From: Eric Tang Date: Sun, 19 Aug 2018 11:28:28 -0700 Subject: [PATCH 08/33] Implement a layer cache --- right/src/layer.c | 2 +- right/src/usb_report_updater.c | 33 +++++++++++++++++++-------------- 2 files changed, 20 insertions(+), 15 deletions(-) diff --git a/right/src/layer.c b/right/src/layer.c index 9ad9541..0d99520 100644 --- a/right/src/layer.c +++ b/right/src/layer.c @@ -15,7 +15,7 @@ void updateLayerStates(void) for (uint8_t slotId=0; slotIdcurrent) { + if (keyState->current && !keyState->suppressed) { key_action_t action = CurrentKeymap[LayerId_Base][slotId][keyId]; if (action.type == KeyActionType_SwitchLayer) { if (action.switchLayer.mode != SwitchLayerMode_Toggle) { diff --git a/right/src/usb_report_updater.c b/right/src/usb_report_updater.c index d0ae32a..4bd56b3 100644 --- a/right/src/usb_report_updater.c +++ b/right/src/usb_report_updater.c @@ -26,6 +26,7 @@ static uint16_t DoubleTapSwitchLayerReleaseTimeout = 200; static bool activeMouseStates[ACTIVE_MOUSE_STATES_COUNT]; bool TestUsbStack = false; bool KeymapChanged = false; +static uint8_t layerCache[SLOT_COUNT][MAX_KEY_COUNT_PER_MODULE]; volatile uint8_t UsbReportUpdateSemaphore = 0; @@ -334,6 +335,8 @@ static void updateActiveUsbReports(void) if (layerChanged) { stickyModifiers = 0; } + bool keymapChangedLastCycle = KeymapChanged; + KeymapChanged = false; LedDisplay_SetLayer(activeLayer); if (TestUsbStack) { @@ -358,7 +361,7 @@ static void updateActiveUsbReports(void) for (uint8_t slotId=0; slotIddebouncing) { if ((uint8_t)(Timer_GetCurrentTime() - keyState->timestamp) > (keyState->previous ? DebounceTimePress : DebounceTimeRelease)) { @@ -371,19 +374,24 @@ static void updateActiveUsbReports(void) keyState->debouncing = true; } - if (keyState->current) { - if (SleepModeActive && !keyState->previous) { + if (keyState->current && !keyState->previous) { + if (SleepModeActive) { WakeUpHost(); } - key_action_t *baseAction = &CurrentKeymap[LayerId_Base][slotId][keyId]; - if ((layerChanged || KeymapChanged) && !(baseAction->type == KeyActionType_Keystroke && baseAction->keystroke.scancode == 0 && baseAction->keystroke.modifiers)) { - keyState->suppressed = true; - } - - // Trigger secondary role. - if (!keyState->previous && secondaryRoleState == SecondaryRoleState_Pressed) { + if (secondaryRoleState == SecondaryRoleState_Pressed) { + // Trigger secondary role. secondaryRoleState = SecondaryRoleState_Triggered; keyState->current = false; + } else { + layerCache[slotId][keyId] = activeLayer; + } + } + + action = &CurrentKeymap[layerCache[slotId][keyId]][slotId][keyId]; + + if (keyState->current) { + if ((KeymapChanged || keymapChangedLastCycle) && keyState->previous) { + keyState->suppressed = true; } else if (action->type == KeyActionType_Keystroke && action->keystroke.secondaryRole) { // Press released secondary role key. if (!keyState->previous && secondaryRoleState == SecondaryRoleState_Released) { @@ -397,9 +405,7 @@ static void updateActiveUsbReports(void) applyKeyAction(keyState, action); } } else { - if (keyState->suppressed) { - keyState->suppressed = false; - } + keyState->suppressed = false; // Release secondary role key. if (keyState->previous && secondaryRoleSlotId == slotId && secondaryRoleKeyId == keyId) { @@ -427,7 +433,6 @@ static void updateActiveUsbReports(void) } previousLayer = activeLayer; - KeymapChanged = false; } uint32_t UsbReportUpdateCounter; From b89de6655e458b77d6066920b27f85c090347623 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A1szl=C3=B3=20Monda?= Date: Tue, 21 Aug 2018 03:50:30 +0200 Subject: [PATCH 09/33] Upgrade to the latest MCUXpresso IDE. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 67c6e78..cd796ff 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ If you're one of the brave few who wants to hack the firmware then read on. `git clone --recursive git@github.com:UltimateHackingKeyboard/firmware.git` -2. Download and install MCUXpresso IDE for [Linux](https://storage.googleapis.com/ugl-static/mcuxpresso-ide/mcuxpressoide-10.1.1_606.x86_64.deb.bin), [Mac](https://storage.googleapis.com/ugl-static/mcuxpresso-ide/MCUXpressoIDE_10.1.1_606.pkg), or [Windows](https://storage.googleapis.com/ugl-static/mcuxpresso-ide/MCUXpressoIDE_10.1.1_606.exe). +2. Download and install MCUXpresso IDE for [Linux](https://storage.googleapis.com/ugl-static/mcuxpresso-ide/mcuxpressoide-10.2.1_795.x86_64.deb.bin), [Mac](https://storage.googleapis.com/ugl-static/mcuxpresso-ide/MCUXpressoIDE_10.2.1_795.pkg), or [Windows](https://storage.googleapis.com/ugl-static/mcuxpresso-ide/MCUXpressoIDE_10.2.1_795.exe). 3. In the IDE, import the project by invoking *File -> Import -> General -> Existing Projects into Workspace*, select the *left* or *right* directory depending on the desired firmware, then click on the *Finish* button. From 1f9d31cad42b2f100f1196e834aebc50fbed21fa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A1szl=C3=B3=20Monda?= Date: Tue, 21 Aug 2018 04:18:54 +0200 Subject: [PATCH 10/33] Update build instructions. --- README.md | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index cd796ff..7ab8f15 100644 --- a/README.md +++ b/README.md @@ -16,15 +16,9 @@ If you're one of the brave few who wants to hack the firmware then read on. 3. In the IDE, import the project by invoking *File -> Import -> General -> Existing Projects into Workspace*, select the *left* or *right* directory depending on the desired firmware, then click on the *Finish* button. -## Building and flashing the firmware +4. At this point, you can flash the firmware via USB from the IDE. To achieve this, you must build [Agent](https://github.com/UltimateHackingKeyboard/agent) which is Git submodule of the this repo and located in the `lib/agent` directory. Then in the IDE, click on *Run -> External Tools -> External Tools Configurations*, then select a release firmware to be flashed such as *uhk60-right_release_kboot*, and click on the *Run* button. -For the left keyboard half, make sure to power it via the right keyboard half (which must be powered via USB). Also connect the left keyboard half to your SEGGER J-Link USB debug probe (which must also be connected via USB). Then in KDS, click on *Run -> Run Configurations*, select *GDB SEGGER J-Link Debugging -> uhk60-left_release_jlink*, and click on the *Debug* button. - -For the right keyboard half, flash [the bootloader](https://github.com/UltimateHackingKeyboard/bootloader) first. - -At this point, you can flash the right firmware via USB from KDS. To achieve this, you must build [Agent](https://github.com/UltimateHackingKeyboard/agent) that is Git submodule of the this repo and located in the `lib/agent` directory. Then in KDS, click on *Run -> Run Configurations*, select *C/C++ Application -> uhk60-right_release_kboot*, and click on the *Run* button. - -From this point on, you can upgrade the firmwares of both halves via USB by using the uhk60-left_release_kboot and uhk60-right_release_kboot run configurations. Alternatively, you can use your SEGGER J-Link probe. +Going forward, it's easier to flash the firmware of your choice by using the downwards toolbar icon which is located rightwards of the *green play + toolbox icon*. ## Contributing From c3a38c8b5932575de579a58652ffd2891b2a9546 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A1szl=C3=B3=20Monda?= Date: Tue, 21 Aug 2018 04:21:06 +0200 Subject: [PATCH 11/33] Split the point to point that features Agent installation and running the external tool. --- README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 7ab8f15..2a0138c 100644 --- a/README.md +++ b/README.md @@ -16,7 +16,9 @@ If you're one of the brave few who wants to hack the firmware then read on. 3. In the IDE, import the project by invoking *File -> Import -> General -> Existing Projects into Workspace*, select the *left* or *right* directory depending on the desired firmware, then click on the *Finish* button. -4. At this point, you can flash the firmware via USB from the IDE. To achieve this, you must build [Agent](https://github.com/UltimateHackingKeyboard/agent) which is Git submodule of the this repo and located in the `lib/agent` directory. Then in the IDE, click on *Run -> External Tools -> External Tools Configurations*, then select a release firmware to be flashed such as *uhk60-right_release_kboot*, and click on the *Run* button. +4. In order to be able to flash the firmware via USB from the IDE, you must build [Agent](https://github.com/UltimateHackingKeyboard/agent) which is Git submodule of the this repo and located in the `lib/agent` directory. + +5. Finally, in the IDE, click on *Run -> External Tools -> External Tools Configurations*, then select a release firmware to be flashed such as *uhk60-right_release_kboot*, and click on the *Run* button. Going forward, it's easier to flash the firmware of your choice by using the downwards toolbar icon which is located rightwards of the *green play + toolbox icon*. From 3196abe574ebcf4b196c757f76f1dfd71e83ab37 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A1szl=C3=B3=20Monda?= Date: Tue, 21 Aug 2018 21:56:41 +0200 Subject: [PATCH 12/33] Bump firmware version to 8.4.5, update changelog, package.json and versions.h --- CHANGELOG.md | 6 ++++++ lib/agent | 2 +- scripts/package.json | 2 +- shared/versions.h | 2 +- 4 files changed, 9 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6b3b8cf..71fcd31 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,12 @@ 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.4.5] - 2018-08-21 + +Device Protocol: 4.4.0 | Module Protocol: 4.0.0 | User Config: 4.1.0 | Hardware Config: 1.0.0 + +- Suppress pressed keys when the layer or keymap changes. + ## [8.4.4] - 2018-08-14 Device Protocol: 4.4.0 | Module Protocol: 4.0.0 | User Config: 4.1.0 | Hardware Config: 1.0.0 diff --git a/lib/agent b/lib/agent index 80e8c01..b41f141 160000 --- a/lib/agent +++ b/lib/agent @@ -1 +1 @@ -Subproject commit 80e8c014ec493378bde851c2ebfe4f906fbe2487 +Subproject commit b41f14192a2666cf7f6b18034338bcf4254c943e diff --git a/scripts/package.json b/scripts/package.json index cb5d8c4..4ad6e2d 100644 --- a/scripts/package.json +++ b/scripts/package.json @@ -15,7 +15,7 @@ "commander": "^2.11.0", "shelljs": "^0.7.8" }, - "firmwareVersion": "8.4.4", + "firmwareVersion": "8.4.5", "deviceProtocolVersion": "4.4.0", "moduleProtocolVersion": "4.0.0", "userConfigVersion": "4.1.0", diff --git a/shared/versions.h b/shared/versions.h index 19e6fbc..adc48e6 100644 --- a/shared/versions.h +++ b/shared/versions.h @@ -20,7 +20,7 @@ #define FIRMWARE_MAJOR_VERSION 8 #define FIRMWARE_MINOR_VERSION 4 - #define FIRMWARE_PATCH_VERSION 4 + #define FIRMWARE_PATCH_VERSION 5 #define DEVICE_PROTOCOL_MAJOR_VERSION 4 #define DEVICE_PROTOCOL_MINOR_VERSION 4 From 846342e851c1c459f36e4a68bf71d2a73463ac56 Mon Sep 17 00:00:00 2001 From: Eric Tang Date: Sat, 25 Aug 2018 07:22:48 -0500 Subject: [PATCH 13/33] Deactivate secondary roles when switching keymaps --- right/src/usb_report_updater.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/right/src/usb_report_updater.c b/right/src/usb_report_updater.c index 4bd56b3..a359b68 100644 --- a/right/src/usb_report_updater.c +++ b/right/src/usb_report_updater.c @@ -239,6 +239,10 @@ static uint8_t basicScancodeIndex = 0; static uint8_t mediaScancodeIndex = 0; static uint8_t systemScancodeIndex = 0; static uint8_t stickyModifiers; +static uint8_t secondaryRoleState = SecondaryRoleState_Released; +static uint8_t secondaryRoleSlotId; +static uint8_t secondaryRoleKeyId; +static secondary_role_t secondaryRole; static void applyKeyAction(key_state_t *keyState, key_action_t *action) { @@ -290,6 +294,7 @@ static void applyKeyAction(key_state_t *keyState, key_action_t *action) case KeyActionType_SwitchKeymap: if (!keyState->previous) { stickyModifiers = 0; + secondaryRoleState = SecondaryRoleState_Released; SwitchKeymapById(action->switchKeymap.keymapId); } break; @@ -302,11 +307,6 @@ static void applyKeyAction(key_state_t *keyState, key_action_t *action) } } -static uint8_t secondaryRoleState = SecondaryRoleState_Released; -static uint8_t secondaryRoleSlotId; -static uint8_t secondaryRoleKeyId; -static secondary_role_t secondaryRole; - static void updateActiveUsbReports(void) { if (MacroPlaying) { From b4908bf2ac2dec1500e9948d629d03f7c8ec47c4 Mon Sep 17 00:00:00 2001 From: Eric Tang Date: Sun, 26 Aug 2018 11:46:38 -0500 Subject: [PATCH 14/33] Only allow layer switcher keys to deactivate toggled layers --- right/src/usb_report_updater.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/right/src/usb_report_updater.c b/right/src/usb_report_updater.c index a359b68..4452199 100644 --- a/right/src/usb_report_updater.c +++ b/right/src/usb_report_updater.c @@ -208,15 +208,15 @@ static void handleSwitchLayerAction(key_state_t *keyState, key_action_t *action) doubleTapSwitchLayerKey = NULL; } + if (action->type != KeyActionType_SwitchLayer) { + return; + } + if (!keyState->previous && isLayerDoubleTapToggled && ToggledLayer == action->switchLayer.layer) { ToggledLayer = LayerId_Base; isLayerDoubleTapToggled = false; } - if (action->type != KeyActionType_SwitchLayer) { - return; - } - if (keyState->previous && doubleTapSwitchLayerKey == keyState && Timer_GetElapsedTime(&doubleTapSwitchLayerTriggerTime) > DoubleTapSwitchLayerReleaseTimeout) { From 9d0f41bf5e9e2e9a3570e7ec47d068a794a28cd4 Mon Sep 17 00:00:00 2001 From: Eric Tang Date: Sun, 2 Sep 2018 00:02:40 -0500 Subject: [PATCH 15/33] Send primary role modifiers consistently --- right/src/usb_report_updater.c | 1 + 1 file changed, 1 insertion(+) diff --git a/right/src/usb_report_updater.c b/right/src/usb_report_updater.c index 4452199..c16baad 100644 --- a/right/src/usb_report_updater.c +++ b/right/src/usb_report_updater.c @@ -411,6 +411,7 @@ static void updateActiveUsbReports(void) if (keyState->previous && secondaryRoleSlotId == slotId && secondaryRoleKeyId == keyId) { // Trigger primary role. if (secondaryRoleState == SecondaryRoleState_Pressed) { + keyState->previous = false; applyKeyAction(keyState, action); } secondaryRoleState = SecondaryRoleState_Released; From 58f81206114515145a86bf65aae9547e988b1c2c Mon Sep 17 00:00:00 2001 From: Eric Tang Date: Tue, 18 Sep 2018 23:10:08 -0500 Subject: [PATCH 16/33] Use the correct scancode so that commas are outputted --- right/src/macros.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/right/src/macros.c b/right/src/macros.c index 97df053..7dd7979 100644 --- a/right/src/macros.c +++ b/right/src/macros.c @@ -70,7 +70,7 @@ uint8_t characterToScancode(char character) return HID_KEYBOARD_SC_DOT_AND_GREATER_THAN_SIGN; case ',': case '<': - return HID_KEYBOARD_SC_KEYPAD_LESS_THAN_SIGN; + return HID_KEYBOARD_SC_COMMA_AND_LESS_THAN_SIGN; case '/': case '\?': return HID_KEYBOARD_SC_SLASH_AND_QUESTION_MARK; From e9309aab162cc23d01ba5810749fd9f4271941b9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A1szl=C3=B3=20Monda?= Date: Tue, 25 Sep 2018 23:52:09 +0200 Subject: [PATCH 17/33] Add issue template regarding Karabiner Elements --- .github/ISSUE_TEMPLATE/custom.md | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 .github/ISSUE_TEMPLATE/custom.md diff --git a/.github/ISSUE_TEMPLATE/custom.md b/.github/ISSUE_TEMPLATE/custom.md new file mode 100644 index 0000000..99bb9a0 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/custom.md @@ -0,0 +1,7 @@ +--- +name: Custom issue template +about: Describe this issue template's purpose here. + +--- + + From bc4f35e5781fb280d97a8634db7608383429a8a0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A1szl=C3=B3=20Monda?= Date: Tue, 25 Sep 2018 23:55:26 +0200 Subject: [PATCH 18/33] Delete issue template. --- .github/ISSUE_TEMPLATE/custom.md | 7 ------- 1 file changed, 7 deletions(-) delete mode 100644 .github/ISSUE_TEMPLATE/custom.md diff --git a/.github/ISSUE_TEMPLATE/custom.md b/.github/ISSUE_TEMPLATE/custom.md deleted file mode 100644 index 99bb9a0..0000000 --- a/.github/ISSUE_TEMPLATE/custom.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -name: Custom issue template -about: Describe this issue template's purpose here. - ---- - - From 3f5f83a19bb936149fc91a7a170a0636bd81560d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A1szl=C3=B3=20Monda?= Date: Tue, 25 Sep 2018 23:55:56 +0200 Subject: [PATCH 19/33] Add issue template. --- ISSUE_TEMPLATE | 1 + 1 file changed, 1 insertion(+) create mode 100644 ISSUE_TEMPLATE diff --git a/ISSUE_TEMPLATE b/ISSUE_TEMPLATE new file mode 100644 index 0000000..9eac894 --- /dev/null +++ b/ISSUE_TEMPLATE @@ -0,0 +1 @@ +test issue template \ No newline at end of file From 44799995b9efabdfff77fb72dbbca38e2ec43c51 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A1szl=C3=B3=20Monda?= Date: Wed, 26 Sep 2018 00:03:20 +0200 Subject: [PATCH 20/33] Update default issue text to include Karabiner Elements. --- ISSUE_TEMPLATE | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ISSUE_TEMPLATE b/ISSUE_TEMPLATE index 9eac894..3e3240f 100644 --- a/ISSUE_TEMPLATE +++ b/ISSUE_TEMPLATE @@ -1 +1 @@ -test issue template \ No newline at end of file +If you're using Karabiner Elements on your Mac, then stop here! Make sure to close Karabiner Elements, then try to reproduce the issue again, even if you think that Karabiner Elements shouldn't be the cause. Karabiner Elements is the source of numerous problems, and we don't want to receive any more reports it causes. \ No newline at end of file From af31ae210a16c95272317b3f7ab0b0e7bebe11e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A1szl=C3=B3=20Monda?= Date: Wed, 26 Sep 2018 16:34:01 +0200 Subject: [PATCH 21/33] Move the pointer not by 1 but by 5 pixels when testing the USB stack to make the pointer easier to see. --- right/src/usb_report_updater.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/right/src/usb_report_updater.c b/right/src/usb_report_updater.c index c16baad..c3d2b35 100644 --- a/right/src/usb_report_updater.c +++ b/right/src/usb_report_updater.c @@ -354,7 +354,7 @@ static void updateActiveUsbReports(void) isEvenMedia = !isEvenMedia; ActiveUsbMediaKeyboardReport->scancodes[mediaScancodeIndex++] = isEvenMedia ? MEDIA_VOLUME_DOWN : MEDIA_VOLUME_UP; } - MouseMoveState.xOut = isEven ? -1 : 1; + MouseMoveState.xOut = isEven ? -5 : 5; } } From c5cf738fd011bc67a31682302d0ce963eb0ba969 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A1szl=C3=B3=20Monda?= Date: Thu, 4 Oct 2018 19:23:38 +0200 Subject: [PATCH 22/33] Expose UsbReportUpdateSemaphore via UsbCommand_{Get,Set}Variable() --- right/src/usb_commands/usb_command_get_variable.c | 3 +++ right/src/usb_commands/usb_command_set_variable.c | 3 +++ right/src/usb_protocol_handler.h | 3 ++- 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/right/src/usb_commands/usb_command_get_variable.c b/right/src/usb_commands/usb_command_get_variable.c index 68df5b8..17d15bf 100644 --- a/right/src/usb_commands/usb_command_get_variable.c +++ b/right/src/usb_commands/usb_command_get_variable.c @@ -21,5 +21,8 @@ void UsbCommand_GetVariable(void) case UsbVariable_DebounceTimeRelease: SetUsbTxBufferUint8(1, DebounceTimeRelease); break; + case UsbVariable_UsbReportSemaphore: + SetUsbTxBufferUint8(1, UsbReportUpdateSemaphore); + break; } } diff --git a/right/src/usb_commands/usb_command_set_variable.c b/right/src/usb_commands/usb_command_set_variable.c index ab31554..8910f41 100644 --- a/right/src/usb_commands/usb_command_set_variable.c +++ b/right/src/usb_commands/usb_command_set_variable.c @@ -24,5 +24,8 @@ void UsbCommand_SetVariable(void) case UsbVariable_DebounceTimeRelease: DebounceTimeRelease = GetUsbRxBufferUint8(2); break; + case UsbVariable_UsbReportSemaphore: + UsbReportUpdateSemaphore = GetUsbRxBufferUint8(2); + break; } } diff --git a/right/src/usb_protocol_handler.h b/right/src/usb_protocol_handler.h index 48cc983..17aa380 100644 --- a/right/src/usb_protocol_handler.h +++ b/right/src/usb_protocol_handler.h @@ -42,7 +42,8 @@ UsbVariable_TestSwitches, UsbVariable_TestUsbStack, UsbVariable_DebounceTimePress, - UsbVariable_DebounceTimeRelease + UsbVariable_DebounceTimeRelease, + UsbVariable_UsbReportSemaphore, } usb_variable_id_t; typedef enum { From 98f7d512de42615829cfd6e5abbb31328d41b1bb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A1szl=C3=B3=20Monda?= Date: Thu, 4 Oct 2018 20:38:36 +0200 Subject: [PATCH 23/33] Extract CurrentTime and remove Timer_{Get,Set}CurrentTime() --- right/src/macros.c | 2 +- right/src/timer.c | 24 ++++++------------- right/src/timer.h | 6 +++-- .../usb_command_get_debug_buffer.c | 2 +- .../usb_command_get_device_property.c | 2 +- right/src/usb_report_updater.c | 8 +++---- 6 files changed, 18 insertions(+), 26 deletions(-) diff --git a/right/src/macros.c b/right/src/macros.c index 7dd7979..b30bad8 100644 --- a/right/src/macros.c +++ b/right/src/macros.c @@ -286,7 +286,7 @@ bool processDelayAction(void) inDelay = false; } } else { - Timer_SetCurrentTime(&delayStart); + delayStart = CurrentTime; inDelay = true; } return inDelay; diff --git a/right/src/timer.c b/right/src/timer.c index 3ddf4b9..5256401 100644 --- a/right/src/timer.c +++ b/right/src/timer.c @@ -2,12 +2,13 @@ #include "timer.h" #include "peripherals/test_led.h" +volatile uint32_t CurrentTime; static uint32_t timerClockFrequency; -static volatile uint32_t currentTime, delayLength; +static volatile uint32_t delayLength; void PIT_TIMER_HANDLER(void) { - currentTime++; + CurrentTime++; if (delayLength) { --delayLength; } @@ -28,15 +29,11 @@ void Timer_Init(void) PIT_StartTimer(PIT, PIT_TIMER_CHANNEL); } -uint32_t Timer_GetCurrentTime() { - return currentTime; -} - uint32_t Timer_GetCurrentTimeMicros() { uint32_t primask, count, ms; primask = DisableGlobalIRQ(); // Make sure the read is atomic count = PIT_GetCurrentTimerCount(PIT, PIT_TIMER_CHANNEL); // Read the current timer count - ms = currentTime; // Read the overflow counter + ms = CurrentTime; // Read the overflow counter EnableGlobalIRQ(primask); // Enable interrupts again if they where enabled before - this should make it interrupt safe // Calculate the counter value in microseconds - note that the PIT timer is counting downward, so we need to subtract the count from the period value @@ -44,11 +41,6 @@ uint32_t Timer_GetCurrentTimeMicros() { return ms * 1000U * TIMER_INTERVAL_MSEC + us; } -void Timer_SetCurrentTime(uint32_t *time) -{ - *time = Timer_GetCurrentTime(); -} - void Timer_SetCurrentTimeMicros(uint32_t *time) { *time = Timer_GetCurrentTimeMicros(); @@ -56,20 +48,18 @@ void Timer_SetCurrentTimeMicros(uint32_t *time) uint32_t Timer_GetElapsedTime(uint32_t *time) { - uint32_t elapsedTime = Timer_GetCurrentTime() - *time; - return elapsedTime; + return CurrentTime - *time; } uint32_t Timer_GetElapsedTimeMicros(uint32_t *time) { - uint32_t elapsedTime = Timer_GetCurrentTimeMicros() - *time; - return elapsedTime; + return Timer_GetCurrentTimeMicros() - *time; } uint32_t Timer_GetElapsedTimeAndSetCurrent(uint32_t *time) { uint32_t elapsedTime = Timer_GetElapsedTime(time); - *time = Timer_GetCurrentTime(); + *time = CurrentTime; return elapsedTime; } diff --git a/right/src/timer.h b/right/src/timer.h index 810bfc1..9d177d1 100644 --- a/right/src/timer.h +++ b/right/src/timer.h @@ -9,12 +9,14 @@ #define TIMER_INTERVAL_MSEC 1 +// Variables: + + extern volatile uint32_t CurrentTime; + // Functions: void Timer_Init(void); - uint32_t Timer_GetCurrentTime(); uint32_t Timer_GetCurrentTimeMicros(); - void Timer_SetCurrentTime(uint32_t *time); void Timer_SetCurrentTimeMicros(uint32_t *time); uint32_t Timer_GetElapsedTime(uint32_t *time); uint32_t Timer_GetElapsedTimeMicros(uint32_t *time); diff --git a/right/src/usb_commands/usb_command_get_debug_buffer.c b/right/src/usb_commands/usb_command_get_debug_buffer.c index 2347594..416cf47 100644 --- a/right/src/usb_commands/usb_command_get_debug_buffer.c +++ b/right/src/usb_commands/usb_command_get_debug_buffer.c @@ -22,7 +22,7 @@ void UsbCommand_GetDebugBuffer(void) SetDebugBufferUint32(13, I2cWatchdog_RecoveryCounter); SetDebugBufferUint32(17, MatrixScanCounter); SetDebugBufferUint32(21, UsbReportUpdateCounter); - SetDebugBufferUint32(25, Timer_GetCurrentTime()); + SetDebugBufferUint32(25, CurrentTime); SetDebugBufferUint32(29, UsbGenericHidActionCounter); SetDebugBufferUint32(33, UsbBasicKeyboardActionCounter); SetDebugBufferUint32(37, UsbMediaKeyboardActionCounter); diff --git a/right/src/usb_commands/usb_command_get_device_property.c b/right/src/usb_commands/usb_command_get_device_property.c index 50d67c6..62c1e5a 100644 --- a/right/src/usb_commands/usb_command_get_device_property.c +++ b/right/src/usb_commands/usb_command_get_device_property.c @@ -69,7 +69,7 @@ void UsbCommand_GetDeviceProperty(void) SetUsbTxBufferUint32(6, I2cMainBusActualBaudRateBps); break; case DevicePropertyId_Uptime: - SetUsbTxBufferUint32(1, Timer_GetCurrentTime()); + SetUsbTxBufferUint32(1, CurrentTime); break; default: SetUsbTxBufferUint8(0, UsbStatusCode_GetDeviceProperty_InvalidProperty); diff --git a/right/src/usb_report_updater.c b/right/src/usb_report_updater.c index c3d2b35..ef3b229 100644 --- a/right/src/usb_report_updater.c +++ b/right/src/usb_report_updater.c @@ -227,11 +227,11 @@ static void handleSwitchLayerAction(key_state_t *keyState, key_action_t *action) if (doubleTapSwitchLayerKey && Timer_GetElapsedTimeAndSetCurrent(&doubleTapSwitchLayerStartTime) < DoubleTapSwitchLayerTimeout) { ToggledLayer = action->switchLayer.layer; isLayerDoubleTapToggled = true; - doubleTapSwitchLayerTriggerTime = Timer_GetCurrentTime(); + doubleTapSwitchLayerTriggerTime = CurrentTime; } else { doubleTapSwitchLayerKey = keyState; } - doubleTapSwitchLayerStartTime = Timer_GetCurrentTime(); + doubleTapSwitchLayerStartTime = CurrentTime; } } @@ -364,13 +364,13 @@ static void updateActiveUsbReports(void) key_action_t *action; if (keyState->debouncing) { - if ((uint8_t)(Timer_GetCurrentTime() - keyState->timestamp) > (keyState->previous ? DebounceTimePress : DebounceTimeRelease)) { + if ((uint8_t)(CurrentTime - keyState->timestamp) > (keyState->previous ? DebounceTimePress : DebounceTimeRelease)) { keyState->debouncing = false; } else { keyState->current = keyState->previous; } } else if (keyState->previous != keyState->current) { - keyState->timestamp = Timer_GetCurrentTime(); + keyState->timestamp = CurrentTime; keyState->debouncing = true; } From 6f2b45c27c7109ea4c1b212714dc04988207bb01 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A1szl=C3=B3=20Monda?= Date: Thu, 4 Oct 2018 22:46:01 +0200 Subject: [PATCH 24/33] Update changelog, package.json, versions.h and Agent reference. --- CHANGELOG.md | 12 ++++++++++++ lib/agent | 2 +- scripts/package.json | 4 ++-- shared/versions.h | 6 +++--- 4 files changed, 18 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 71fcd31..4dc7836 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,18 @@ 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.5.0] - 2018-10-04 + +Device Protocol: 4.**5.0** | Module Protocol: 4.0.0 | User Config: 4.1.0 | Hardware Config: 1.0.0 + +- Send primary role modifiers consistently. +- Only allow layer switcher keys to deactivate toggled layers. +- Deactivate secondary roles when switching keymaps. +- Use the correct scancode so that commas are outputted for macros. +- Move the pointer not by 1 but by 5 pixels when testing the USB stack to make the pointer easier to see. +- Expose UsbReportUpdateSemaphore via UsbCommand_{Get,Set}Variable() `DEVICEPROTOCOL:MINOR` +- Extract CurrentTime and remove Timer_{Get,Set}CurrentTime() + ## [8.4.5] - 2018-08-21 Device Protocol: 4.4.0 | Module Protocol: 4.0.0 | User Config: 4.1.0 | Hardware Config: 1.0.0 diff --git a/lib/agent b/lib/agent index b41f141..6e2b1fb 160000 --- a/lib/agent +++ b/lib/agent @@ -1 +1 @@ -Subproject commit b41f14192a2666cf7f6b18034338bcf4254c943e +Subproject commit 6e2b1fb18d783d63dfb53fb717218562711ef580 diff --git a/scripts/package.json b/scripts/package.json index 4ad6e2d..ae44f4e 100644 --- a/scripts/package.json +++ b/scripts/package.json @@ -15,8 +15,8 @@ "commander": "^2.11.0", "shelljs": "^0.7.8" }, - "firmwareVersion": "8.4.5", - "deviceProtocolVersion": "4.4.0", + "firmwareVersion": "8.5.0", + "deviceProtocolVersion": "4.5.0", "moduleProtocolVersion": "4.0.0", "userConfigVersion": "4.1.0", "hardwareConfigVersion": "1.0.0", diff --git a/shared/versions.h b/shared/versions.h index adc48e6..f9315c7 100644 --- a/shared/versions.h +++ b/shared/versions.h @@ -19,11 +19,11 @@ // Variables: #define FIRMWARE_MAJOR_VERSION 8 - #define FIRMWARE_MINOR_VERSION 4 - #define FIRMWARE_PATCH_VERSION 5 + #define FIRMWARE_MINOR_VERSION 5 + #define FIRMWARE_PATCH_VERSION 0 #define DEVICE_PROTOCOL_MAJOR_VERSION 4 - #define DEVICE_PROTOCOL_MINOR_VERSION 4 + #define DEVICE_PROTOCOL_MINOR_VERSION 5 #define DEVICE_PROTOCOL_PATCH_VERSION 0 #define MODULE_PROTOCOL_MAJOR_VERSION 4 From 8b69a25ddae09522fe6f1b4030f83714e66a1366 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A1szl=C3=B3=20Monda?= Date: Thu, 4 Oct 2018 23:04:13 +0200 Subject: [PATCH 25/33] Reset UsbReportUpdateSemaphore if it gets stuck for 100ms. This should fix occasional freezes. --- right/src/usb_report_updater.c | 9 ++++++++- right/src/usb_report_updater.h | 2 ++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/right/src/usb_report_updater.c b/right/src/usb_report_updater.c index ef3b229..f2a9424 100644 --- a/right/src/usb_report_updater.c +++ b/right/src/usb_report_updater.c @@ -440,14 +440,21 @@ uint32_t UsbReportUpdateCounter; void UpdateUsbReports(void) { + static uint32_t lastUpdateTime; + for (uint8_t keyId = 0; keyId < RIGHT_KEY_MATRIX_KEY_COUNT; keyId++) { KeyStates[SlotId_RightKeyboardHalf][keyId].current = RightKeyMatrix.keyStates[keyId]; } if (UsbReportUpdateSemaphore && !SleepModeActive) { - return; + if (Timer_GetElapsedTime(&lastUpdateTime) < USB_SEMAPHORE_TIMEOUT) { + return; + } else { + UsbReportUpdateSemaphore = 0; + } } + lastUpdateTime = CurrentTime; UsbReportUpdateCounter++; ResetActiveUsbBasicKeyboardReport(); diff --git a/right/src/usb_report_updater.h b/right/src/usb_report_updater.h index d3df70b..02ed725 100644 --- a/right/src/usb_report_updater.h +++ b/right/src/usb_report_updater.h @@ -14,6 +14,8 @@ #define SECONDARY_ROLE_MODIFIER_TO_HID_MODIFIER(secondaryRoleModifier) (1 << ((secondaryRoleModifier) - 1)) #define SECONDARY_ROLE_LAYER_TO_LAYER_ID(secondaryRoleLayer) ((secondaryRoleLayer) - SecondaryRole_RightSuper) + #define USB_SEMAPHORE_TIMEOUT 100 // ms + // Typedefs: typedef enum { From a22dfdd917bdbb8796608375f75b35c335731d40 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A1szl=C3=B3=20Monda?= Date: Thu, 4 Oct 2018 23:10:58 +0200 Subject: [PATCH 26/33] Update version to 8.5.1, changelog, package.json and versions.h --- CHANGELOG.md | 6 ++++++ scripts/package.json | 2 +- shared/versions.h | 2 +- 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4dc7836..8702b16 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,12 @@ 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.5.1] - 2018-10-04 + +Device Protocol: 4.5.0 | Module Protocol: 4.0.0 | User Config: 4.1.0 | Hardware Config: 1.0.0 + +- Reset UsbReportUpdateSemaphore if it gets stuck for 100ms. This should fix occasional freezes. + ## [8.5.0] - 2018-10-04 Device Protocol: 4.**5.0** | Module Protocol: 4.0.0 | User Config: 4.1.0 | Hardware Config: 1.0.0 diff --git a/scripts/package.json b/scripts/package.json index ae44f4e..cbdd55a 100644 --- a/scripts/package.json +++ b/scripts/package.json @@ -15,7 +15,7 @@ "commander": "^2.11.0", "shelljs": "^0.7.8" }, - "firmwareVersion": "8.5.0", + "firmwareVersion": "8.5.1", "deviceProtocolVersion": "4.5.0", "moduleProtocolVersion": "4.0.0", "userConfigVersion": "4.1.0", diff --git a/shared/versions.h b/shared/versions.h index f9315c7..0cf455c 100644 --- a/shared/versions.h +++ b/shared/versions.h @@ -20,7 +20,7 @@ #define FIRMWARE_MAJOR_VERSION 8 #define FIRMWARE_MINOR_VERSION 5 - #define FIRMWARE_PATCH_VERSION 0 + #define FIRMWARE_PATCH_VERSION 1 #define DEVICE_PROTOCOL_MAJOR_VERSION 4 #define DEVICE_PROTOCOL_MINOR_VERSION 5 From cc6666b96d91994540d275337e1b310505934287 Mon Sep 17 00:00:00 2001 From: Eric Tang Date: Sat, 6 Oct 2018 09:44:52 -0500 Subject: [PATCH 27/33] Don't suppress keys upon keymap changes --- right/src/keymap.c | 2 -- right/src/usb_report_updater.c | 7 +------ right/src/usb_report_updater.h | 1 - 3 files changed, 1 insertion(+), 9 deletions(-) diff --git a/right/src/keymap.c b/right/src/keymap.c index 6337101..ef04bd2 100644 --- a/right/src/keymap.c +++ b/right/src/keymap.c @@ -5,7 +5,6 @@ #include "config_parser/parse_keymap.h" #include "config_parser/config_globals.h" #include "macros.h" -#include "usb_report_updater.h" keymap_reference_t AllKeymaps[MAX_KEYMAP_NUM] = { { @@ -25,7 +24,6 @@ void SwitchKeymapById(uint8_t index) ValidatedUserConfigBuffer.offset = AllKeymaps[index].offset; ParseKeymap(&ValidatedUserConfigBuffer, index, AllKeymapsCount, AllMacrosCount); LedDisplay_UpdateText(); - KeymapChanged = true; } bool SwitchKeymapByAbbreviation(uint8_t length, char *abbrev) diff --git a/right/src/usb_report_updater.c b/right/src/usb_report_updater.c index 4452199..3971c35 100644 --- a/right/src/usb_report_updater.c +++ b/right/src/usb_report_updater.c @@ -25,7 +25,6 @@ static uint16_t DoubleTapSwitchLayerReleaseTimeout = 200; static bool activeMouseStates[ACTIVE_MOUSE_STATES_COUNT]; bool TestUsbStack = false; -bool KeymapChanged = false; static uint8_t layerCache[SLOT_COUNT][MAX_KEY_COUNT_PER_MODULE]; volatile uint8_t UsbReportUpdateSemaphore = 0; @@ -335,8 +334,6 @@ static void updateActiveUsbReports(void) if (layerChanged) { stickyModifiers = 0; } - bool keymapChangedLastCycle = KeymapChanged; - KeymapChanged = false; LedDisplay_SetLayer(activeLayer); if (TestUsbStack) { @@ -390,9 +387,7 @@ static void updateActiveUsbReports(void) action = &CurrentKeymap[layerCache[slotId][keyId]][slotId][keyId]; if (keyState->current) { - if ((KeymapChanged || keymapChangedLastCycle) && keyState->previous) { - keyState->suppressed = true; - } else if (action->type == KeyActionType_Keystroke && action->keystroke.secondaryRole) { + if (action->type == KeyActionType_Keystroke && action->keystroke.secondaryRole) { // Press released secondary role key. if (!keyState->previous && secondaryRoleState == SecondaryRoleState_Released) { secondaryRoleState = SecondaryRoleState_Pressed; diff --git a/right/src/usb_report_updater.h b/right/src/usb_report_updater.h index d3df70b..bbdc507 100644 --- a/right/src/usb_report_updater.h +++ b/right/src/usb_report_updater.h @@ -72,7 +72,6 @@ extern uint32_t UsbReportUpdateCounter; extern volatile uint8_t UsbReportUpdateSemaphore; extern bool TestUsbStack; - extern bool KeymapChanged; // Functions: From 06e34fdcbca32cc827a7a4d2bd5213aa1a52ec40 Mon Sep 17 00:00:00 2001 From: Eric Tang Date: Sat, 6 Oct 2018 09:47:45 -0500 Subject: [PATCH 28/33] Convert the layer cache to an action cache --- right/src/usb_report_updater.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/right/src/usb_report_updater.c b/right/src/usb_report_updater.c index 3971c35..d344ec2 100644 --- a/right/src/usb_report_updater.c +++ b/right/src/usb_report_updater.c @@ -25,7 +25,7 @@ static uint16_t DoubleTapSwitchLayerReleaseTimeout = 200; static bool activeMouseStates[ACTIVE_MOUSE_STATES_COUNT]; bool TestUsbStack = false; -static uint8_t layerCache[SLOT_COUNT][MAX_KEY_COUNT_PER_MODULE]; +static key_action_t actionCache[SLOT_COUNT][MAX_KEY_COUNT_PER_MODULE]; volatile uint8_t UsbReportUpdateSemaphore = 0; @@ -380,11 +380,11 @@ static void updateActiveUsbReports(void) secondaryRoleState = SecondaryRoleState_Triggered; keyState->current = false; } else { - layerCache[slotId][keyId] = activeLayer; + actionCache[slotId][keyId] = CurrentKeymap[activeLayer][slotId][keyId]; } } - action = &CurrentKeymap[layerCache[slotId][keyId]][slotId][keyId]; + action = &actionCache[slotId][keyId]; if (keyState->current) { if (action->type == KeyActionType_Keystroke && action->keystroke.secondaryRole) { From fb38e4099b2de049c17e8d9433243a63dab26cda Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A1szl=C3=B3=20Monda?= Date: Sat, 6 Oct 2018 20:03:51 +0200 Subject: [PATCH 29/33] Update ISSUE_TEMPLATE --- ISSUE_TEMPLATE | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/ISSUE_TEMPLATE b/ISSUE_TEMPLATE index 3e3240f..4c979ec 100644 --- a/ISSUE_TEMPLATE +++ b/ISSUE_TEMPLATE @@ -1 +1,6 @@ -If you're using Karabiner Elements on your Mac, then stop here! Make sure to close Karabiner Elements, then try to reproduce the issue again, even if you think that Karabiner Elements shouldn't be the cause. Karabiner Elements is the source of numerous problems, and we don't want to receive any more reports it causes. \ No newline at end of file +Before submitting a new issue, make sure to do the following: + +1. If you're using Karabiner Elements on your Mac, close it! +2. Install the latest Agent: https://github.com/UltimateHackingKeyboard/agent/releases/latest +3. Use Agent to update to the latest firmware: https://github.com/UltimateHackingKeyboard/firmware/releases/latest +4. Try to reproduce the issue, and only report it if it still persists. From f61acc483baa82650303dfeb1e425cac949cb4e1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A1szl=C3=B3=20Monda?= Date: Sat, 6 Oct 2018 20:26:47 +0200 Subject: [PATCH 30/33] Update ISSUE_TEMPLATE --- ISSUE_TEMPLATE | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/ISSUE_TEMPLATE b/ISSUE_TEMPLATE index 4c979ec..4487bcf 100644 --- a/ISSUE_TEMPLATE +++ b/ISSUE_TEMPLATE @@ -1,6 +1,8 @@ Before submitting a new issue, make sure to do the following: 1. If you're using Karabiner Elements on your Mac, close it! -2. Install the latest Agent: https://github.com/UltimateHackingKeyboard/agent/releases/latest -3. Use Agent to update to the latest firmware: https://github.com/UltimateHackingKeyboard/firmware/releases/latest +2. Install the latest Agent: + https://github.com/UltimateHackingKeyboard/agent/releases/latest +3. Use Agent to update to the latest firmware: + https://github.com/UltimateHackingKeyboard/firmware/releases/latest 4. Try to reproduce the issue, and only report it if it still persists. From 21ae72dd9e7598036095bdfc60a5ad01df639f0d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A1szl=C3=B3=20Monda?= Date: Sat, 6 Oct 2018 21:31:32 +0200 Subject: [PATCH 31/33] Bump version to 8.5.2, update changelog, package.json, versions.h, and Agent. --- CHANGELOG.md | 6 ++++++ lib/agent | 2 +- scripts/package.json | 2 +- shared/versions.h | 2 +- 4 files changed, 9 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8702b16..9dfccc4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,12 @@ 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.5.2] - 2018-10-06 + +Device Protocol: 4.5.0 | Module Protocol: 4.0.0 | User Config: 4.1.0 | Hardware Config: 1.0.0 + +- Don't suppress keys upon keymap change. + ## [8.5.1] - 2018-10-04 Device Protocol: 4.5.0 | Module Protocol: 4.0.0 | User Config: 4.1.0 | Hardware Config: 1.0.0 diff --git a/lib/agent b/lib/agent index 6e2b1fb..2ff6553 160000 --- a/lib/agent +++ b/lib/agent @@ -1 +1 @@ -Subproject commit 6e2b1fb18d783d63dfb53fb717218562711ef580 +Subproject commit 2ff65537a006934c4a33ddfbe937c9c1200bb839 diff --git a/scripts/package.json b/scripts/package.json index cbdd55a..4b160f7 100644 --- a/scripts/package.json +++ b/scripts/package.json @@ -15,7 +15,7 @@ "commander": "^2.11.0", "shelljs": "^0.7.8" }, - "firmwareVersion": "8.5.1", + "firmwareVersion": "8.5.2", "deviceProtocolVersion": "4.5.0", "moduleProtocolVersion": "4.0.0", "userConfigVersion": "4.1.0", diff --git a/shared/versions.h b/shared/versions.h index 0cf455c..e908700 100644 --- a/shared/versions.h +++ b/shared/versions.h @@ -20,7 +20,7 @@ #define FIRMWARE_MAJOR_VERSION 8 #define FIRMWARE_MINOR_VERSION 5 - #define FIRMWARE_PATCH_VERSION 1 + #define FIRMWARE_PATCH_VERSION 2 #define DEVICE_PROTOCOL_MAJOR_VERSION 4 #define DEVICE_PROTOCOL_MINOR_VERSION 5 From ceb2f3de00a123da4860b6e769bcfe60fcff89f5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A1szl=C3=B3=20Monda?= Date: Sat, 20 Oct 2018 01:11:36 +0200 Subject: [PATCH 32/33] Re-enable the I2C watchdog of the left keyboard half which was accidentally disabled starting from firmware 8.4.3. This should fix the freezes of the left keyboard half. --- left/src/key_scanner.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/left/src/key_scanner.c b/left/src/key_scanner.c index 5c46040..6de9efc 100644 --- a/left/src/key_scanner.c +++ b/left/src/key_scanner.c @@ -5,9 +5,7 @@ void KEY_SCANNER_HANDLER(void) { KeyMatrix_ScanRow(&keyMatrix); -#ifdef I2C_WATCHDOG RunWatchdog(); -#endif LPTMR_ClearStatusFlags(KEY_SCANNER_LPTMR_BASEADDR, kLPTMR_TimerCompareFlag); } From a59b43b43374d28a4f152a968fe9bb35b885082a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A1szl=C3=B3=20Monda?= Date: Sat, 20 Oct 2018 01:20:31 +0200 Subject: [PATCH 33/33] Bump version to 8.5.3, update package.json, changelog, versions.h and reference the latest Agent. --- CHANGELOG.md | 6 ++++++ lib/agent | 2 +- scripts/package.json | 2 +- shared/versions.h | 2 +- 4 files changed, 9 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9dfccc4..5add778 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,12 @@ 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.5.3] - 2018-10-20 + +Device Protocol: 4.5.0 | Module Protocol: 4.0.0 | User Config: 4.1.0 | Hardware Config: 1.0.0 + +- Re-enable the I2C watchdog of the left keyboard half which was accidentally disabled starting from firmware 8.4.3. This should fix the freezes of the left keyboard half. + ## [8.5.2] - 2018-10-06 Device Protocol: 4.5.0 | Module Protocol: 4.0.0 | User Config: 4.1.0 | Hardware Config: 1.0.0 diff --git a/lib/agent b/lib/agent index 2ff6553..a4e3696 160000 --- a/lib/agent +++ b/lib/agent @@ -1 +1 @@ -Subproject commit 2ff65537a006934c4a33ddfbe937c9c1200bb839 +Subproject commit a4e3696078216bc787b682e3323d89a35a517a81 diff --git a/scripts/package.json b/scripts/package.json index 4b160f7..22142bb 100644 --- a/scripts/package.json +++ b/scripts/package.json @@ -15,7 +15,7 @@ "commander": "^2.11.0", "shelljs": "^0.7.8" }, - "firmwareVersion": "8.5.2", + "firmwareVersion": "8.5.3", "deviceProtocolVersion": "4.5.0", "moduleProtocolVersion": "4.0.0", "userConfigVersion": "4.1.0", diff --git a/shared/versions.h b/shared/versions.h index e908700..1a6ccf0 100644 --- a/shared/versions.h +++ b/shared/versions.h @@ -20,7 +20,7 @@ #define FIRMWARE_MAJOR_VERSION 8 #define FIRMWARE_MINOR_VERSION 5 - #define FIRMWARE_PATCH_VERSION 2 + #define FIRMWARE_PATCH_VERSION 3 #define DEVICE_PROTOCOL_MAJOR_VERSION 4 #define DEVICE_PROTOCOL_MINOR_VERSION 5