diff --git a/CHANGELOG.md b/CHANGELOG.md index 71fcd31..8702b16 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,24 @@ 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 + +- 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/ISSUE_TEMPLATE b/ISSUE_TEMPLATE new file mode 100644 index 0000000..3e3240f --- /dev/null +++ b/ISSUE_TEMPLATE @@ -0,0 +1 @@ +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 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/right/src/macros.c b/right/src/macros.c index 97df053..b30bad8 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; @@ -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_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 { diff --git a/right/src/usb_report_updater.c b/right/src/usb_report_updater.c index d344ec2..c5f8022 100644 --- a/right/src/usb_report_updater.c +++ b/right/src/usb_report_updater.c @@ -226,11 +226,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; } } @@ -351,7 +351,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; } } @@ -361,13 +361,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; } @@ -406,6 +406,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; @@ -434,14 +435,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 bbdc507..493b2b4 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 { diff --git a/scripts/package.json b/scripts/package.json index 4ad6e2d..cbdd55a 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.1", + "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..0cf455c 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 1 #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