All notable changes to this project will be documented in this file.
The format is loosely based on Keep a Changelog and this project adheres to the UHK Versioning conventions.
Device Protocol: 4.18.0 | Module Protocol: 4.3.0 | Dongle Protocol: 1.0.2 | User Config: 14.0.0 | Hardware Config: 1.0.0 | Smart Macros: 3.14.0
- Fix: update numlock/capslock/scrolllock immediately on change.
- Fix: don't clog usb hubs by too fast usb retries.
- Fix: change resending logic to allow up to 1024ms long usb hub stalls without loosing reports, and make usb retries back off exponentially.
- Fix: in case of failed report sends, always send up-to-date state once the connection is alive again. Should fix remaining stuck key issues present since v12.0.0 firmware.
- Fix: enable I2C glitch filter to reject EMI above 2 MHz.
- Fix: bit-shift typo in UHK60v2 led backlight driver configuration.
- Fix: make uhk80 not freeze on deadlocked semaphores - just report these conditions.
- Fix: deduplicate Hid vs Dongle connections - prevent issues with dongle getting treated as a ble hid device (and consequently not working), getting written into host config multiple times, etc.
- Ble: disconnect bluetooth between halves when bridge cable is connected.
- Macros: add
ifAlreadyRunning/ifNotAlreadyRunningto simplify reentry guarding.SMARTMACROS:MINOR - Macros: validate macro event names.
SMARTMACROS:PATCH
Device Protocol: 4.18.0 | Module Protocol: 4.3.0 | Dongle Protocol: 1.0.2 | User Config: 14.0.0 | Hardware Config: 1.0.0 | Smart Macros: 3.13.2
- Move new Typing Behavior configurations into the native UserConfig section.
USERCONFIG:MAJOR - Schedule usb report dispatch - lowers bluetooth latency.
- Implement module-flashing for uhk80. (Agent support is yet needed.)
DEVICEPROTOCOL:MINOR - Don't report battery levels over bluetooth when the keyboard is sleeping. It tends to wake up MacOs hosts.
- Fix module unbricking procedure for modules listening on the default address. (Agent support is yet needed.)
- Fix sticky key integration with macros - macros would break sticky key sequences by a brief release before first macro command is executed.
SMARTMACROS:PATCH - Fix stuck layer hold when replaceLayer is triggered from macro after layer release.
SMARTMACROS:PATCH
Device Protocol: 4.17.0 | Module Protocol: 4.3.0 | Dongle Protocol: 1.0.2 | User Config: 13.0.0 | Hardware Config: 1.0.0 | Smart Macros: 3.13.1
Features:
- Second tap on a host switch action cancels it.
Fixes and maintenance:
- Refactor: port uhk60 onto c2usb in order to increase codebase maintainability.
- Refactor: rewrite usb stack integration.
- Fix: rework usb-report send failure handling.
- Fix: increase bluetooth reliability - bluetooth hid interfaces should no longer stop functioning randomly.
- Fix: implement workaround for slow scrolling on microsoft hosts.
- Fix: preprocess input during usb report send retries.
- Fix: don't accumulate mouse coordinates during usb report send retries to prevent cursor jumps.
Device Protocol: 4.17.0 | Module Protocol: 4.3.0 | Dongle Protocol: 1.0.2 | User Config: 13.0.0 | Hardware Config: 1.0.0 | Smart Macros: 3.13.1
General:
- Implement new zephyr backends for shell and logging.
- Refactor doubletap handling.
Macro fixes:
- Fix backlight update after overlayLayer, overlayKeymap, replaceLayer, replaceKeymap commands.
SMARTMACROS:PATCH - Fix macro crashes (main thread stack overflows) on too deeply nested expressions.
SMARTMACROS:PATCH - Fix a 16.2.0 macro parser benevolence: e.g., parser wouldn't accept
if(due to missing space.SMARTMACROS:PATCH - Fix some key release scenarios in postponed nested local scopes.
SMARTMACROS:PATCH
Device Protocol: 4.17.0 | Module Protocol: 4.3.0 | Dongle Protocol: 1.0.2 | User Config: 13.0.0 | Hardware Config: 1.0.0 | Smart Macros: 3.13.0
General:
- Fix: UHK 60 I2C scheduling caused various issues with modules and left half during 16.1.0 and 16.1.1.
- Fix: BLE reliability: always exchange MTU right after the connection is established.
- Fix: Macro key release detection that caused subtle timing bugs with advanced macros.
- Use a fixed keymap for the BLE pairing PIN flow.
Macro behaviors:
- Validate all macros in general context. In 16.1.x, unmapped macros weren't validated.
SMARTMACROS:PATCH - Lower default
ifGesturetimeout to 500ms.SMARTMACROS:MINOR - Add
notifycommand.SMARTMACROS:MINOR - Global doubletap detection:
- Doubletaps are now detected globally at the beginning of keypress lifecycle. Separate
secondaryRole.advanced.doubletapTimehas been deprecated.SMARTMACROS:MINOR - Macros will now remember and reuse secondary role resolutions for the rest of their runtime, regardless of key events
- Fix: secondary role could incorrectly trigger doubletaps
- Fix: macros could incorrectly trigger doubletaps
- Doubletaps are now detected globally at the beginning of keypress lifecycle. Separate
- Secondary Role keys (HRM):
- Added
secondaryRole.advanced.timeoutType { active | passive }option to postpone timeout action until release.SMARTMACROS:MINOR - Made Trigger by mouse subject to minimum hold time to prevent vibration on key press from triggering secondary role when using a trackball module.
SMARTMACROS:PATCH - Made Trigger by mouse reliably trigger secondary role immediately.
SMARTMACROS:PATCH - Fixed a number of edge cases related to safety margin where secondary role keys would not trigger in a timely manner.
SMARTMACROS:PATCH
- Added
Minor changes and refactors:
- Improve macro performance: use GNU perfect hashing for main macro switch.
- Refactor USB logging backend.
- Refactor event scheduler to use binary heap.
- Improve status buffer rolling.
- Fix shell initialization: logging levels and sometimes entire shell initialization would fail due to timing and thread priority issues.
- Lower some compiled-in logging levels, but set them manually to higher levels by default.
- Fix setting Zephyr log levels via
zephyr log enable inf Bt.
Device Protocol: 4.17.0 | Module Protocol: 4.3.0 | Dongle Protocol: 1.0.2 | User Config: 13.0.0 | Hardware Config: 1.0.0 | Smart Macros: 3.12.0
- Fix: fix Bluetooth issues caused by returning bad disconnect reasons: failing OOB pairing, connected but otherwise unhandled connections.
- Fix: when the same dongle is switched to multiple times, it now remains green instead of turning blue.
- Fix: exempt pairing scenarios from exponential advertising delay backoff.
- Fix: adjust the advertising exponential backoff.
- Fix: make sure that the dongle doesn't cause the pairing screen to pop up.
- Make it possible to gather logs from a disconnected UHK:
zephyr uhk logs 1now allows turning on the log buffer from a macro.zephyr uhk snaplogallows dumping the log into the status buffer and later retrieval from Agent.- when logging is enabled via the logs variable, logs are also shown on the OLED display.
Device Protocol: 4.17.0 | Module Protocol: 4.3.0 | Dongle Protocol: 1.0.2 | User Config: 13.0.0 | Hardware Config: 1.0.0 | Smart Macros: 3.12.0
- Fix: make Bluetooth no longer reconnect during pairing.
- Fix: when using
overlayLayer, the first empty action after any nonempty action would be overwritten. (In a sequence of at least two empty actions.)SMARTMACROS:PATCH - Fix: restart advertising when switch host selection ceases to be relevant.
- Fix: change Bluetooth disconnect reasons.
- Wake shortly when a key is tapped in light sleep mode.
- Log remote wakeup error codes onto the OLED display.
- Refactor UART and implement UART module support. (This should have no impacts.)
- Make the UHK Bluetooth functionality not rely on Agent:
- Assign newly paired Bluetooth connections into regular host slots.
- Don't unpair unknown devices upon config saves.
- Show Bluetooth relevant events on the OLED screen. ("Pairing...", "Slot freed", "Slot unassigned"...)
- If native switch host action is held for 3 seconds, unpair the connection and free its slot for other devices.
- Add the
unpairHostmacro command.SMARTMACROS:MINOR - For
unpairHostandswitchHost, allow numeric slot ids.SMARTMACROS:MINOR
- Macro string support:
- Add STRING variable type and comparison operators.
SMARTMACROS:MINOR - Add
$uhk.namevirtual variable.SMARTMACROS:MINOR
- Add STRING variable type and comparison operators.
- Macro templates:
- Distinguish
¯oArg.1and$macroArg.1expansionsSMARTMACROS:MINOR - Validate all macros in the context of their binding sites.
SMARTMACROS:PATCH
- Distinguish
- Bluetooth behavior:
- Reset host selection after 15 seconds if not successful.
- Implement exponential backoff for Bluetooth when hosts try to connect aggresively.
- Homerow mods (HRM) changes: Added a number of options to secondary role keys, mainly focused on adding options to reduce false positive activations of the secondary roles, making them more viable for HRM usage:
- Added
secondaryRole.advanced.acceptTriggersFromSameHalfoption and its inlineignoreTriggersFromSameHalf | acceptTriggersFromSameHalfoverrides to allow Secondary Role Keys to ignore triggers from their own keyboard half. This reduces false secondary triggers on key rolls as well as allows multi-mod combos at all when using Trigger on press.SMARTMACROS:MINOR - Added a
secondaryRole.advanced.minimumHoldTime <ms, 0-255 (INT)>option. This is the minimum hold time of a key that is required to trigger its secondary role.SMARTMACROS:MINOR - Added a
secondaryRole.advanced.timeoutAction nonesetting.SMARTMACROS:MINOR - Moved the Double tap primary activation to timeout to allow the secondary role key to be used for its primary role and then secondary role in quick succession
SMARTMACROS:PATCH - Refactor
secondaryRole.advanced.triggerByPressandtriggerByReleasetosecondaryRole.advanced.triggeringEvent { press | release | none }SMARTMACROS:MINOR
- Added
Device Protocol: 4.17.0 | Module Protocol: 4.3.0 | Dongle Protocol: 1.0.2 | User Config: 13.0.0 | Hardware Config: 1.0.0 | Smart Macros: 3.11.0
New Features:
- Implement macro templates.
USERCONFIG:MINOR- Macros can now be parameterized via
$macroArg.0. - Reimplement argument handling in config parser. Change key counting logic compared to original macro template implementation.
- Refactor macro validation to evaluate on per-key basis, including template expansion.
- Refactor error reporting to report the template expansion stack.
- Implement
altCodeOf,uCodeOf,decCodeOfandhexCodeOftemplate expansions that can be used for generic unicode sequences. E.g.,tapKeySeq altCodeOf(😊).SMARTMACROS:MINOR
- Macros can now be parameterized via
- Add UserConfig version fields to track failed migrations.
USERCONFIG: MAJOR
Fixes, maintenance:
- Eliminate minute delay of the OLED charging indicator, e.g., when rapidly reconnecting USB power.
- Prevent large jumps of the battery capacity detection algorithm.
- Change behavior regarding UHK 60 reset button "crashes":
- Revert 15.3.1 changes and let the keyboard reboot silently.
- Implement GPIO leakage test. (Please join #1380 if you are affected.)
Misc:
- Refactor PS/2 trackpoint driver.
- Improve debug mode icons.
Device Protocol: 4.17.0 | Module Protocol: 4.3.0 | Dongle Protocol: 1.0.2 | User Config: 12.0.1 | Hardware Config: 1.0.0 | Smart Macros: 3.10.0
- Detect spurious reset button activations with UHK 60 and fix the consequent false crash log activations.
Device Protocol: 4.17.0 | Module Protocol: 4.3.0 | Dongle Protocol: 1.0.2 | User Config: 12.0.1 | Hardware Config: 1.0.0 | Smart Macros: 3.10.0
Bug fixes:
- Fix secondary role unblock mouse bug.
- Fix UHK 60 backlight sleep mode when connected to an USB HID-disabled power source. Implement UHK 60 USB-report-send fail timeout, at 128ms.
- Fix stuck layer when switching keymaps. (When a held switch is not mapped in the new keymap while switching keymap.)
- Fix UHK 60 lock/unlock blinking when waking it up with the S+F and J+L keys together.
- Fix macro freezes when
ifShortcutorifPrimarywas used with braces.SMARTMACROS:PATCH
New features:
- Add runtime macro recording indicator for the UHK 80.
- Add preliminary support for macro templates. (Key labels, parametrizable macros, Alt code expansion. Needs Agent support.)
USERCONFIG:MINOR - Add
set simulateLowResScrolling BOOLmacro command for compatibility with some applications.SMARTMACROS:MINOR - Increase effective length of runtime macros by employing better serialization strategy, to 512 keystrokes per runtime macro, and 1024 total.
- Extend UHK 60 crash logging.
Power improvements:
- Make the key cluster module shut down the LED controller when not in use.
- Make the UHK 80 shut down the LED controllers when not in use.
Misc:
- Implement dynamic pin control for UART.
Device Protocol: 4.17.0 | Module Protocol: 4.3.0 | Dongle Protocol: 1.0.2 | User Config: 12.0.0 | Hardware Config: 1.0.0 | Smart Macros: 3.9.0
- Fix BLE pairing with Linux.
- Always switch to newly paired BLE connections.
- Suppress S, F and J, L scancodes for some time after sleep modeunlock.
- Log suspicious conditions and crashes only when the
devModemacro variable is enabled.SMARTMACROS:MINOR - Add the
replaceKeymapcommand, and thecurrentKEYID alias.SMARTMACROS:MINOR - Fix the
setLedTxtdry run mode, which occasionally acted as a delay.SMARTMACROS:PATCH - Make
whilemacro command yield after every iteration.SMARTMACROS:PATCH - Fix scope state reset and some control flow scenarios.
SMARTMACROS:PATCH - Add a device protocol variable to disable firmware checksum check during firmware updates.
DEVICEPROTOCOL:MINOR - Add command to read OLED content.
DEVICEPROTOCOL:MINOR
Device Protocol: 4.16.1 | Module Protocol: 4.3.0 | Dongle Protocol: 1.0.2 | User Config: 12.0.0 | Hardware Config: 1.0.0 | Smart Macros: 3.8.0
- Fix the
replaceLayer,overlayLayer, andoverlayKeymapmacro commands, which corrupted the keymap due to action compression.SMARTMACROS:PATCH - Fix the
postponeKeysmodifier that acted assuppressMods.SMARTMACROS:PATCH - Mitigate bridge cable disconnects caused by demanding macros.
- Add the
switchHost lastSelectedargument to switch to the last manually selected host connection.SMARTMACROS:MINOR - Add the
reconnectcommand to reconnect the current host connection.SMARTMACROS:MINOR - Add the
$currentTimemacro variable expansion.SMARTMACROS:MINOR - Make freeze detection and eventloop spin detection less likely to give false alarms.
Device Protocol: 4.16.1 | Module Protocol: 4.3.0 | Dongle Protocol: 1.0.2 | User Config: 12.0.0 | Hardware Config: 1.0.0 | Smart Macros: 3.7.0
- Update battery percentage indicator shortly after discharging a charged battery.
- Don't sanitize firmware log now that the relevant Agent bug is fixed.
- Detect and log possible spinning event loop bugs.
Device Protocol: 4.16.1 | Module Protocol: 4.3.0 | Dongle Protocol: 1.0.2 | User Config: 12.0.0 | Hardware Config: 1.0.0 | Smart Macros: 3.7.0
- Compress subsequent matching key actions for more efficient storage.
USERCONFIG:MAJOR - Make battery percentage indicator more accurate.
- Make system scancodes work in macro actions.
- Improve crash detection.
Device Protocol: 4.16.1 | Module Protocol: 4.3.0 | Dongle Protocol: 1.0.2 | User Config: 11.0.0 | Hardware Config: 1.0.0 | Smart Macros: 3.6.1
- Fix a macro engine bug where USB reports weren't updated at the end of a macro, which made the keys activated from the macro get stuck.
SMARTMACROS:PATCH - Make the UHK 60 not misinterpret firmware updates as crashes.
- Correctly detect full charge level on the UHK 80.
- Update battery percentage indicator quicker, especially when transitioning between charging and discharging.
- Show correct battery percentage shortly after a battery is (dis)connected.
- Fix the delay before the UHK 80 executes macro commands via USB, so that the macro commands are executed instantly.
- USB macro execution command fixes: Fix buffer underruns, return status code.
DEVICEPROTOCOL:PATCH
Device Protocol: 4.16.0 | Module Protocol: 4.3.0 | Dongle Protocol: 1.0.2 | User Config: 11.0.0 | Hardware Config: 1.0.0 | Smart Macros: 3.6.0
- Implement
$onSplitand$onJoinmacro events.SMARTMACROS:MINOR - Add persistent macro USB reports via the
persistentargument and addtoggleKeycommand.SMARTMACROS:MINOR - Implement locking mode for the UHK 60.
- Map sleep device action to Fn2+Pause on every keymap of the default configuration of the UHK 80.
Device Protocol: 4.16.0 | Module Protocol: 4.3.0 | Dongle Protocol: 1.0.2 | User Config: 11.0.0 | Hardware Config: 1.0.0 | Smart Macros: 3.5.0
- Fix some Bluetooth-related crashes.
- Changes to logging and crash-related behavior.
- Add the
zephyrsmart macro command to execute Zephyr shell commands.SMARTMACROS:MINOR - Implement Zephyr shell execute device protocol command.
DEVICEPROTOCOL:MINOR
Device Protocol: 4.15.0 | Module Protocol: 4.3.0 | Dongle Protocol: 1.0.2 | User Config: 11.0.0 | Hardware Config: 1.0.0 | Smart Macros: 3.4.1
- Fix bug that made the configuration not update when saving it in various circumstances.
Device Protocol: 4.15.0 | Module Protocol: 4.3.0 | Dongle Protocol: 1.0.2 | User Config: 11.0.0 | Hardware Config: 1.0.0 | Smart Macros: 3.4.1
- Make the UHK 80 connect via USB after pressing the reset button instead of being in disconnected state.
- Don't parse configurations of higher versions than what the firmware supports.
Device Protocol: 4.15.0 | Module Protocol: 4.3.0 | Dongle Protocol: 1.0.2 | User Config: 11.0.0 | Hardware Config: 1.0.0 | Smart Macros: 3.4.1
- Fix BLE connection count bug introduced in firmware 14.0.0, which caused BLE connection issues.
- Make UHK 80 mouse buttons work in UEFI BIOSes.
- Map 100% battery charge to actual battery maximum voltage, and store the maximum voltage in settings.
- Prevent firmware update issues due to boot loops caused by invalid bridge protocol commands of different firmware versions by delaying firmware startup by 5 seconds.
- Fix UHK 60 wormhole memory region alignment bug introduced in firmware 14.0.0, so that the firmware and the bootloader can pass data between each other.
- Fix
oneshotmacro command stickiness against the same key taps.SMARTMACROS:PATCH - Remove the 2 second sleep mode unlock interval.
- Make battery percentage values more accurate.
- Log debug traces on freezes.
- List peripheral counts in the "uhk connections" Zephyr shell command.
Device Protocol: 4.15.0 | Module Protocol: 4.3.0 | Dongle Protocol: 1.0.2 | User Config: 11.0.0 | Hardware Config: 1.0.0 | Smart Macros: 3.4.0
Fixes:
- Fix UHK 80 USB power transitioning issues. The UHK 80 should now resume from sleep without reconnecting USB.
- Fix variable interpolation when double quotes are not used on the UHK 80.
SMARTMACROS:PATCH - Fix key chatter on the UHK 60 when letters are typed while mouse-keys are being used.
- Fix warnings regarding the
switchHostmacro commands on the UHK 60.SMARTMACROS:PATCH - Fix "Invalid abbreviation length" produced when saving a configuration that removes currently active keymap.
Battery management:
- Make battery readings much more accurate and consistent.
- Add power saving mode.
- Disable key backlights and dim the OLED display in power saving mode.
- Blink the battery percentages of the halves that are in power saving mode.
- Implement battery health optimization mode for stationary use.
- Implement proper sleep mode. S+F keys together wake up the left half, J+L keys together wake up the right half.
- Change battery percentage indicator: use lightning icons instead of + signs to indicate battery charging.
Configuration changes:
- Add
set battery.chargeLimit { full | optimizeHealth }macro variable.SMARTMACROS:MINOR - Add configuration settings for extending battery life and limiting key backlight during charging.
USERCONFIG:MAJOR - Implement empty key action compression. This allows efficient storage of sparsely populated layers.
USERCONFIG:MAJOR
Logging changes:
- Implement a Zephyr logging backend that forwards logs to Agent.
DEVICEPROTOCOL:MINOR - Implement tracing mechanism to allow debugging UHK 60 crashes and freezes.
- Dump UHK 80 crash logs into the status buffer.
- Detect UHK 60 crashes and dump trace logs.
- Make crash logs survive UHK reboots.
Other features:
- Implement the
setLedTxtmacro command on the UHK 80.SMARTMACROS:PATCH - Refactor
setLedTxtsyntax to allow managing UHK 80 text positions.SMARTMACROS:MINOR - Improve OLED text renderer, allowing better positioning.
Device Protocol: 4.14.1 | Module Protocol: 4.3.0 | Dongle Protocol: 1.0.2 | User Config: 9.0.0 | Hardware Config: 1.0.0 | Smart Macros: 3.3.0
- Fix BLE HID to BLE HID switchover.
- Fix target getting stuck on "USB -> USB" connection transition when host connections are reordered.
- Exit pairing mode screen when pairing is cancelled on the host.
- Fix dongle connections. The UHK would not start advertising after scanning.
- Fix BLE advertising icon. Namely, update the icon when scanning/advertising/Bluetooth is stopped.
- Fix BLE advertising icon updates when Bluetooth is disabled.
- Make
bluetooth noAdvertisemacro command disablebluetooth.alwaysAdvertiseHid. - Fix the
ifShortcut orGatemacro command. It wouldn't consume keys. - Fix the
ifShortcut anyOrdermacro command. It would trigger randomly. - Fix "Can't allocate variables" due to configuration shifts.
Device Protocol: 4.14.1 | Module Protocol: 4.3.0 | Dongle Protocol: 1.0.2 | User Config: 9.0.0 | Hardware Config: 1.0.0 | Smart Macros: 3.3.0
- Fix bug that broke the factory-pairing of the keyboard halves.
Device Protocol: 4.14.1 | Module Protocol: 4.3.0 | Dongle Protocol: 1.0.2 | User Config: 9.0.0 | Hardware Config: 1.0.0 | Smart Macros: 3.3.0
- Parse device actions to easily switch between connections in Agent.
USERCONFIG:MAJOR - Add
rebootmacro command, making standing bugs more bearable by allowing easily rebooting the keyboard.SMARTMACROS:MINOR - Indicate HID advertisement on the OLED display. HID hosts should be disconnected before pairing new devices.
- Fix bug that sometimes made diagonal mouse key movements diverge from diagonal direction.
- Update target OLED widget when the connection is selected, so it doesn't get stuck on the old target.
- Check the dongle protocol version of the connected dongle and warn if it doesn't match the expected version.
- Fix unwanted pairing screen that was shown for dongles that were bonded on the dongle side but not on the right side.
- Disable gamepad USB interface by default.
- Delete bonds when deleting device pairings.
- Prevent simultaneous BLE HID connections until c2usb supports them.
- Fix main loop freezes.
- Add the
bluetooth [toggle] { pair | advertise | noAdvertise }macro command, but they can cause connection oscillations for now.SMARTMACROS:MINOR - Expose the
bluetooth.alwaysAdvertiseHidboolean variable.SMARTMACROS:MINOR - Expose the
bluetooth.peripheralConnectionCountinteger variable for development purposes.SMARTMACROS:MINOR - Always feature connection names in the Zephyr log.
Device Protocol: 4.14.1 | Module Protocol: 4.3.0 | Dongle Protocol: 1.0.2 | User Config: 8.3.0 | Hardware Config: 1.0.0 | Smart Macros: 3.2.0
- Make layers not stuck when locking them via double-tapping and then switching keymap.
- Fix the Agent icon of the UHK 60 LED display.
- Add
set bluetooth.enabled BOOLmacro variable.SMARTMACROS:MINOR - Add
set bluetooth.allowUnsecuredConnections BOOLmacro variable.SMARTMACROS:MINOR
Device Protocol: 4.14.1 | Module Protocol: 4.3.0 | Dongle Protocol: 1.0.2 | User Config: 8.3.0 | Hardware Config: 1.0.0 | Smart Macros: 3.1.0
- Fix right battery indication on the OLED display when the right-side USB is disconnected.
- Rename UHK 80 USB and BLE device names to make them easily distinguishable.
- Implement a number of measures to make the communication between UHK 80 halves more reliable. Recent changes:
- Set baud rate to 115200. (UART)
- Check message consistency with CRC. (UART)
- Redesign the UART protocol. (UART)
- Use control sequences that are not likely to be triggered by a constant signal.
- Explicitly start message frames to detect and ignore spurious signals or data originating from broken frames.
- When such spurious signal is detected, disable UART for a couple of milliseconds to make sure that other threads get some CPU time.
- Accept ping bytes from any traffic: we can't afford to reset the state sync state just because of a missed ping (e.g., because of a broken frame), as resending the data over a faulty connection would be likely to cause another reset.
- Resend any corrupted or undelivered messages. (UART)
- Explicitly check message sequence and order. (UART+NUS)
- Fix a couple of deadlock scenarios and set low semaphore timeouts to prevent any uncaught scenarios. (UART+NUS)
- Don't queue messages that were received multiple times, to prevent congestion. (UART)
- Distinguish low and high priority messages and spread them in time to prevent congestion. (NUS+UART)
Device Protocol: 4.14.1 | Module Protocol: 4.3.0 | Dongle Protocol: 1.0.0 | User Config: 8.3.0 | Hardware Config: 1.0.0 | Smart Macros: 3.1.0
- Fix bug that was introduced in firmware 12.3.3 and caused the firmware update on the UHK 60 to fail when the touchpad module was connected. Upgrade to this firmware version without the touchpad module connected on the UHK 60 if you're on firmware 12.3.3.
- Fix caps lock, num lock, and scroll lock states not being updated in a timely manner on the UHK 80.
- Fix touchpad ghosting in Agent on the UHK 80 when the keyboard halves were merged.
Device Protocol: 4.14.1 | Module Protocol: 4.3.0 | Dongle Protocol: 1.0.0 | User Config: 8.3.0 | Hardware Config: 1.0.0 | Smart Macros: 3.1.0
- Fix NUS latency issue, effectively lowering left-right and right-dongle BLE latencies from 50ms to 7ms, which should fix typing errors while the keyboard halves of the UHK 80 are wirelessly connected and/or when dongles are used.
- Decrease UART baud rate from 1,000,000Hz to 115,200Hz, making the bridge cable connection more stable.
- Make communication protocols more robust:
- Change UART control packets.
- Add message indexing.
- Add roundtrip time testing.
- Check message CRC for UART.
- Fix checksum and versioning related issues that resulted in partial upgrades. This resulted in left half or dongle sometimes remaining on incompatible versions, which in turn led to lags, freezes, and crashes.
DEVICEPROTOCOL:PATCH - Improve logging and implement a couple new debug features.
- Fix some potential causes of firmware crashes.
Device Protocol: 4.14.0 | Module Protocol: 4.3.0 | User Config: 8.3.0 | Hardware Config: 1.0.0 | Smart Macros: 3.1.0
- Don't require confirmation of BLE pairing on the host. Only the pairing code has to be typed on the UHK 80.
Device Protocol: 4.14.0 | Module Protocol: 4.3.0 | User Config: 8.3.0 | Hardware Config: 1.0.0 | Smart Macros: 3.1.0
- Implement high resolution scrolling for the UHK 80.
- Fix horizontal scrolling on the UHK 80.
- Use full keyboard scancode range for the UHK 80, including scancodes such as International 1.
Device Protocol: 4.14.0 | Module Protocol: 4.3.0 | User Config: 8.3.0 | Hardware Config: 1.0.0 | Smart Macros: 3.1.0
- Make connection handling more robust.
- Add the
switchHost { next | previous | last }macro command which iterates over host connections.SMARTMACROS:MINOR - Add the
switchHost "name"macro command, which can be used to select a specific host connection. - Implement connection switchover. If a host connection's switchover checkbox is checked, the UHK automatically switches to this host when its connection is established.
- When a connection is disconnected, switch to the host connection that is currently connected and highest in the host connection list.
- The OLED display now shows the name of the current host connection.
- Multiple dongles can be connected at the same time.
- Support caps/num/scroll lock states in host routing.
- Add
EraseAllSettingsdevice protocol command.DEVICEPROTOCOL:MINOR
Device Protocol: 4.13.0 | Module Protocol: 4.3.0 | User Config: 8.3.0 | Hardware Config: 1.0.0 | Smart Macros: 3.0.0
- Fix touchpad stuck tap and doubletap.
- Always update keymap on module change, including bootup.
- Make pairing screen always on.
- Reduce audible noise and expose related settings via the device protocol.
DEVICEPROTOCOL:MINOR - Fix ISO LED lighting in switch test mode.
- Fade UHK 80 LEDs gradually.
Device Protocol: 4.12.0 | Module Protocol: 4.3.0 | User Config: 8.3.0 | Hardware Config: 1.0.0 | Smart Macros: 3.0.0
- Fix layer toggling.
- Fix ISO LEDs handling.
- Fix firmware tags and version numbers returned by the firmware and shown by Agent.
- Make USB resume from sleep via keypress work.
- Fix NewPairings flag and add GetNewPairings paging device protocol command.
DEVICEPROTOCOL:MINOR - Fix BLE bond clearing.
- Make mouse interface not freeze when switching between host connections.
- Add HID battery interface.
- Upgrade to nRF Connect SDK 2.8.0
Device Protocol: 4.11.0 | Module Protocol: 4.3.0 | User Config: 8.3.0 | Hardware Config: 1.0.0 | Smart Macros: 3.0.0
- Fix left half dissapearing in Agent.
- Fix spurious loads of default module mappings.
- Fix touchpad gestures.
Device Protocol: 4.11.0 | Module Protocol: 4.3.0 | User Config: 8.3.0 | Hardware Config: 1.0.0 | Smart Macros: 3.0.0
- Add support for the UHK 80.
USERCONFIG:MAJORDEVICEPROTOCOL:MINOR - The UHK 60 v1 and UHK 60 v2 may experience some regressions due to major refactors, but this firmware should be well-suited for everyday use, as we are not aware of any major issues.
- The key ids have been changed to be more consistent with the UHK 80 and future keyboards. This means that old numeric key ids need to be migrated, ideally to key id abbreviations. Otherwise, for instance,
ifGesture 21 holdKey awill be triggered byh, where formerly it used to be triggered byj.SMARTMACROS:MAJOR - Key id abbreviations for UHK 80 have been added. Previous key id abbreviations remain the same and are universal for both the UHK 80 and UHK 60 v1/v2.
SMARTMACROS:MINOR - New
powerModemacro command and battery-relatedleds.*fade timeout variables.SMARTMACROS:MINOR - Implement high resolution scrolling for the UHK 60 v1 and UHK 60 v2.
Device Protocol: 4.10.0 | Module Protocol: 4.3.0 | User Config: 7.1.0 | Hardware Config: 1.0.0 | Smart Macros: 2.5.0
- Implement ifHold/ifTap commands.
SMARTMACROS:MINOR - Fix macroStartTime for postponed time.
SMARTMACROS:PATCH - Keyid parser fixes.
SMARTMACROS:PATCH
Device Protocol: 4.10.0 | Module Protocol: 4.3.0 | User Config: 7.1.0 | Hardware Config: 1.0.0 | Smart Macros: 2.4.4
- Reset in-memory configuration state when saving the configuration.
- Fix press modmask modifier.
SMARTMACROS:PATCH - Fix mouse button 20.
- Make the fn LED light up when activating fn2 to fn5 layers.
Device Protocol: 4.10.0 | Module Protocol: 4.3.0 | User Config: 7.1.0 | Hardware Config: 1.0.0 | Smart Macros: 2.4.3
- Allow inverting horizontal scroll direction for all modules.
USERCONFIG:MINOR - Fix USB Switch Keymap getting reverted on first macro layer switch.
SMARTMACROS:PATCH - Parse key id abbreviations in
set keymapAction.SMARTMACROS:PATCH
Device Protocol: 4.10.0 | Module Protocol: 4.3.0 | User Config: 7.0.0 | Hardware Config: 1.0.0 | Smart Macros: 2.4.2
- Fix UHK freeze on
ifGesture #key.SMARTMACROS:PATCH
Device Protocol: 4.10.0 | Module Protocol: 4.3.0 | User Config: 7.0.0 | Hardware Config: 1.0.0 | Smart Macros: 2.4.1
- Fix the
ifLayermacro command to work with native layer switching.SMARTMACROS:PATCH - Fix H key backlight on UHK 60 v1 keyboards.
Device Protocol: 4.10.0 | Module Protocol: 4.3.0 | User Config: 7.0.0 | Hardware Config: 1.0.0 | Smart Macros: 2.4.0
- Add user configuration entries for the new module pages, the "Typing behavior" page, and the new settings of the "Mouse key speed" page. Agent 4.0.0+ reveals the new settings.
USERCONFIG:MAJOR - Reorder USB interfaces to achieve better compatibility with KVM switches and docking stations. Only Agent 4.0.0+ is guaranteed to be able to save the configuration with the changed USB interfaces.
- Make per-key (monochrome) backlight work on the UHK 60 v1 (with the LEDs installed).
- Make key cluster RGB backlight work with the UHK 60 v1.
- Make the
oneShotcommand wait for actual USB report change. - Fix composite shortcuts in caret mode.
SMARTMACROS:PATCH - Revise advanced secondary role resolution strategy: safety-margin-related behavior might have changed.
- Add
ifLayerToggledcommand.SMARTMACROS:MINOR - Add
secondaryRole.advanced.triggerByMouseconfig value. Advanced secondary roles are now not triggered by mouse movement by default.SMARTMACROS:MINOR - Add
secondaryRole.advanced.triggerByPressconfig value.SMARTMACROS:MINOR - Extend UHK to 20 mouse buttons.
USERCONFIG:MINOR - Enable all LEDs in factory test mode.
- Make LEDs not blink momentarily upon startup.
Device Protocol: 4.10.0 | Module Protocol: 4.3.0 | User Config: 6.0.0 | Hardware Config: 1.0.0 | Smart Macros: 2.3.0
- Set trackpoint drift reset period to 1s, resulting in quicker auto-recovery.
- Don't change the test keymap when it's active upon module reconnection.
Device Protocol: 4.10.0 | Module Protocol: 4.3.0 | User Config: 6.0.0 | Hardware Config: 1.0.0 | Smart Macros: 2.3.0
- Automatically recover from trackpoint drifts after a couple of seconds. This initial implementation may use some fine-tuning, so we welcome feedback.
- Fix
final {command.SMARTMACROS:PATCH - Fix
ifDoubletapcommand to not miss doubletap if another macro fit in between the two activations.SMARTMACROS:PATCH - Add
ifModuleConnectedcondition.SMARTMACROS:MINOR - Return deprecation errors for removed functionality.
SMARTMACROS:PATCH - Make the smart macro documentation insert
invertScrollDirectionYinstead ofinvertScrollDirection.
Device Protocol: 4.10.0 | Module Protocol: 4.3.0 | User Config: 6.0.0 | Hardware Config: 1.0.0 | Smart Macros: 2.2.0
- Implement touchpad hold continuation timeout via
set module.touchpad.holdContinuationTimeout <0-65535>(milliseconds). If non-zero, the touchpad module allows the release of finger for the specified amount of time during drag-and-drop without the left click getting released.SMARTMACROS:MINOR - Blink adaptive mode (triangle) LED display icon when recording runtime macros.
SMARTMACROS:PATCH - Fix
repeatFor-related macro validation error.SMARTMACROS:PATCH - Fix
"$($keyId.*)"parsing.SMARTMACROS:PATCH - Clear sticky modifiers when navigation mode is active.
- Improve macro guide documentation and add examples.
Device Protocol: 4.10.0 | Module Protocol: 4.3.0 | User Config: 6.0.0 | Hardware Config: 1.0.0 | Smart Macros: 2.1.1
- Fix the
&¯o command.SMARTMACROS:PATCH - Fix the
setLedTxtmacro command to consume parameters correctly.SMARTMACROS:PATCH
Device Protocol: 4.10.0 | Module Protocol: 4.3.0 | User Config: 6.0.0 | Hardware Config: 1.0.0 | Smart Macros: 2.1.0
- Implement macro scopes via curly brackets.
SMARTMACROS:MINOR - Implement
whilemacro command.SMARTMACROS:MINOR - Implement
elsemacro condition.SMARTMACROS:MINOR - Implement
exitmacro command.SMARTMACROS:MINOR - Implement
oneShotmacro command timeout.SMARTMACROS:MINOR - Report macro line position in errors.
SMARTMACROS:MINOR - Don't throw "unprocessed input" macro error as consequence of another error.
SMARTMACROS:PATCH - Fix redundant "unprocessed input" warning after
if BOOLEANcondition.SMARTMACROS:PATCH - Fix
oneShotmacro command timeout in combination with commands that sleep until release.SMARTMACROS:PATCH
Device Protocol: 4.10.0 | Module Protocol: 4.3.0 | User Config: 6.0.0 | Hardware Config: 1.0.0 | Smart Macros: 2.0.0
- Introduce named, dynamically typed variables via the
setVarcommand and$syntax. For example:setVar myDelay 50andset doubletapDelay $myDelay - Introduce expression parser that allows in-line arithmetics, including
+,-,*,/,%,min(...),max(...)and boolean conditions, including<,<=,>,>=,==,!=,!,&&,||. For example:ifShift set leds.brightness ($leds.brightness * 1.5 + 0.01)andifNotShift set leds.brightness ($leds.brightness / 1.5) - Introduce
if (EXPRESSION)command. For example:if ($a < 2 || $a > 4) tapKey a - Introduce string parser. Strings must be enclosed in double or single quotes. Double-quote strings support variable expansion and
\escapes. For example:write "Current keystrokeDelay is $keystrokeDelay. One plus one is $(1 + 1).\n"andwrite 'This is literal "$" character. And here you have an apostrophe '"'"'.' - Introduce key id parser. As a result,
ifGesture,ifShortcut, and some other commands now accept key id abbreviations. For example:ifShortcut a b holdLayer fn - Make
setLedTxtaccept numeric expressions. For example:setLedTxt 500 $keystrokeDelay - Configuration values now can be retrieved using the
$<name>syntax, just as variables. For example:set leds.brightness ($leds.brightness * 1.5 + 0.01) - Deprecated
#,%, and@syntaxes. - Deprecated registers, including the
ifRegEq,ifNotRegEq,ifRegGt,ifRegLt,setReg,addReg,subReg,mulRegcommands. - Deprecate
#comments in favor of the//comment syntax. - Deprecated
writeExprandsetStatusPartcommands. - Implement
set autoShiftDelay <time in ms (NUMBER)>. If nonzero, the autoshift feature is turned on. This adds shift to a scancode when the key is held for at leastautoShiftDelayms. For example, tapping 'a' results in 'a', pressing 'a' for a little bit longer results in 'A'.SMARTMACROS:MINOR - Limit
setcommand values, preventing invalid values.SMARTMACROS:PATCH - Expose the status buffer via the UsbCommand_GetVariable:UsbVariable_StatusBuffer USB command.
DEVICEPROTOCOL:MINOR - Unify layer switching implementations, so macro commands behave like native layer switcher actions.
SMARTMACROS:PATCH - Expose the current keymap via the GetDeviceState USB command.
- Fix some initialization-related bugs.
DEVICEPROTOCOL:MINOR - Implement firmware MD5 checksums to make firmware udpates faster and more reliable.
DEVICEPROTOCOL:MINORMODULEPROTOCOL:MINOR - Add
untoggleLayeralias for theunToggleLayermacro command. - Switch error logs to line numbers and fix trailing newlines.
SMARTMACROS:PATCH - Validate all macros when the configuration is updated.
SMARTMACROS:PATCH - Always update LEDs according to
leds.fadeTimeout.SMARTMACROS:PATCH - Alternate between segment display texts when there is more than one thing to show, such as ERR, WRN, or the name of the current keymap.
- Fix the behavior of the advanced secondary role strategy when rolling over multiple secondary role keys. Latter keys tended to produce false secondary role.
Device Protocol: 4.9.0 | Module Protocol: 4.2.0 | User Config: 6.0.0 | Hardware Config: 1.0.0 | Smart Macros: 1.4.0
- Fix
oneShotmacro command for the proper composition of modifiers.SMARTMACROS:PATCH - Fix
ifPrimaryandifSecondarymacro commands, which were not functional after reconnection onto the default secondary role mechanism.SMARTMACROS:PATCH - Fix the navigation mode of modifier layers to always correspond to the base layer.
- Make non-keypress actions in modifier layers not receive the relevant modifier.
- Add
overlayKeymap,overlayLayer, andreplaceLayermacro commands.SMARTMACROS:MINOR - Add
module.MODULEID.{invertScrollDirectionX,invertScrollDirectionY}macro variables. Usemodule.MODULEID.invertScrollDirectionYinstead of the now deprecatedmodule.MODULEID.invertScrollDirection.SMARTMACROS:MINOR - Add
$onCapsLockStateChange,$onNumLockStateChange, and$onScrollLockStateChangemacro events. Scroll Lock only works as expected on Windows.SMARTMACROS:MINOR - Add
ifCapsLockOn,ifNotCapsLockOn,ifScrollLockOn,ifNotScrollLockOn,ifNumLockOn,ifNotNumLockOnconditional macro commands. Scroll Lock only works as expected on Windows.SMARTMACROS:MINOR - Add
set backlight.keyRgb.LAYERID.KEYIDmacro command.SMARTMACROS:MINOR - Add Artificial delay between touchpad presses and releases, fixing doubletap-to-select-word for systems that ignore sub-20ms mouse button releases.
- Any module pointer action now triggers secondary roles.
- Make module states not oscillate temporarily upon module attachment/detachment.
Device Protocol: 4.9.0 | Module Protocol: 4.2.0 | User Config: 6.0.0 | Hardware Config: 1.0.0 | Smart Macros: 1.3.0
- Add backlighting mode, per-key RGB values, functional backlighting color values, and LED fade timeout to the user configuration.
USERCONFIG:MAJOR - Add
oneShotsmart macro command.SMARTMACROS:MINOR - Add advanced, alphanumeric-friendly secondary role resolution strategy via
secondaryRole.*smart macro variables.SMARTMACROS:MINOR - Fix simple secondary role resolution when chording swaps releases.
- Fix macro-activated sticky modifiers.
Smart macro migration guide:
ifPrimaryandifSecondarycommands have been connected to thesimplesecondary role resolution strategy. Please migrateifPrimarytoifPrimary advancedStrategyandifSecondarytoifSecondary advancedStrategyin your macro commands.resolveSecondaryis kept for backward compatibility without changes. We strongly advise to avoid it.
Device Protocol: 4.9.0 | Module Protocol: 4.2.0 | User Config: 5.1.0 | Hardware Config: 1.0.0 | Smart Macros: 1.2.0
- Send empty report after every USB write command, fixing the bug that resulted in 'onewo' when encountering consecutive 'one', 'two' write commands.
SMARTMACROS:PATCH - Disallow navigation modes in modifier layers.
SMARTMACROS:MINOR - Switch the
leds.fadeTimeoutsmart macro variable from minutes to seconds.SMARTMACROS:MINOR - Add
onLayerChangeandonKeymapLayerChangemacro events.SMARTMACROS:MINOR - Add
prependoption for theactivateKeyPostponedcommand.SMARTMACROS:MINOR
Device Protocol: 4.9.0 | Module Protocol: 4.2.0 | User Config: 5.1.0 | Hardware Config: 1.0.0 | Smart Macros: 1.1.2
- Fix the initialization of non-base layers, resolving the fallback of unmapped modifier layer actions.
Device Protocol: 4.9.0 | Module Protocol: 4.2.0 | User Config: 5.1.0 | Hardware Config: 1.0.0 | Smart Macros: 1.1.2
- Make extended smart macro commands always available and ignore
set macroEngine.extendedCommands {0|1} - Fix
fork,call, andexecsmart macro commands on non-existent macro names.SMARTMACROS:PATCH - Fix the logic of the
resolveSecondarysmart macro command.SMARTMACROS:PATCH
Device Protocol: 4.9.0 | Module Protocol: 4.2.0 | User Config: 5.1.0 | Hardware Config: 1.0.0 | Smart Macros: 1.1.1
- Fix shortcut parser to parse
-correctly.SMARTMACROS:PATCH
Device Protocol: 4.9.0 | Module Protocol: 4.2.0 | User Config: 5.1.0 | Hardware Config: 1.0.0 | Smart Macros: 1.1.0
- Allow executing macro commands via USB.
DEVICEPROTOCOL:MINOR - Add set
i2cBaudRatemacro command.SMARTMACROS:MINOR - Rename super to gui and control to ctrl for the sake of consistency for smart macros. The old naming remains to be supported.
SMARTMACROS:MINOR - Fix bug that altered media navigation mode when the zoom mode was altered.
SMARTMACROS:PATCH - Make
ifRegEq,ifNotRegEq,ifRegGt, andifRegLtmacro commands treat registers as 32-bit values as they are instead of 8-bit values.SMARTMACROS:PATCH - Fix a macro unscheduling bug that made some macros stuck during or after using the
callsmart macro command.SMARTMACROS:PATCH - Fix maxiumum macro count.
Device Protocol: 4.8.0 | Module Protocol: 4.2.0 | User Config: 5.1.0 | Hardware Config: 1.0.0 | Smart Macros: 1.0.3
- Fix
goToand related smart macro command bug.SMARTMACROS:PATCH - Fix scheduling error in
callsmart macro command.SMARTMACROS:PATCH - Disable USB gamepad interface as it interferes with gamepads. Will re-enable it later after exposing its feature set via Agent.
Device Protocol: 4.8.0 | Module Protocol: 4.2.0 | User Config: 5.1.0 | Hardware Config: 1.0.0 | Smart Macros: 1.0.2
- Fix memory corruption in macro engine core which occasionally caused undefined behavior.
SMARTMACROS:PATCH
Device Protocol: 4.8.0 | Module Protocol: 4.2.0 | User Config: 5.1.0 | Hardware Config: 1.0.0 | Smart Macros: 1.0.1
- Fix interactive smart macro documentation to properly generate mouseKeys.{move,scroll}.initialAcceleration
SMARTMACROS:PATCH - Add USB gamepad interface, which cannot be used yet from Agent.
Device Protocol: 4.8.0 | Module Protocol: 4.2.0 | User Config: 5.1.0 | Hardware Config: 1.0.0 | Smart Macros: 1.0.0
- Make the touchpad module not blink in Agent, and make its pointer movement much smoother.
Device Protocol: 4.8.0 | Module Protocol: 4.2.0 | User Config: 5.1.0 | Hardware Config: 1.0.0 | Smart Macros: 1.0.0
- Fix layer activation/toggle priority. (Since v9.0.0, any layer activation, according to the base layer, released the toggled layer instead of triggering the relevant action on non-base layers.)
- Add the new layers to the list of secondary role layers.
USERCONFIG:MINOR - Hide the widgets of the smart macro documentation when no macro command is focused.
Device Protocol: 4.8.0 | Module Protocol: 4.2.0 | User Config: 5.0.0 | Hardware Config: 1.0.0 | Smart Macros: 1.0.0
- Fix 16-bit scancodes, such as "start calculator".
- Make the smart macro documentation of the repo self-contained, and add docDir property to /doc/package.json, allowing Agent to fetch the online documentation of any firmware release.
Device Protocol: 4.8.0 | Module Protocol: 4.2.0 | User Config: 5.0.0 | Hardware Config: 1.0.0 | Smart Macros: 1.0.0
The features marked with (*) can only be used with Agent 2.0.0 to be released soon, or above.
- Add smart macro engine. (*)
USERCONFIG:MINOR - Extend the original 4 layers with 4 regular layers (Fn2, Fn3, Fn4, Fn5) and 4 modifier layers (Shift, Ctrl, Alt, Super). (*)
USERCONFIG:MAJOR - Fix USB descriptors which caused high CPU load on Macintosh computers.
- Implement touchpad pinch-to-zoom, two-finger scrolling, and doubletap-to-drag.
- Allow rebinding touchpad tap action.
- Fix occasional trackpoint pointer jumps.
- Reload keymap when a module is swapped.
- Properly disconnect slaves on I2C reinitialization.
- Implement N-key rollover.
- Make accelerate and decelerate actions work with modules.
- Add resetTrackpoint macro command.
MODULEPROTOCOL:MINOR - Expose device and module git and version properties.
DEVICEPROTOCOL:MINORMODULEPROTOCOL:MINOR
Device Protocol: 4.7.1 | Module Protocol: 4.1.0 | User Config: 4.2.0 | Hardware Config: 1.0.0
- Reduce trackball module wake up lag.
- Reduce the audible noise of UHK 60 v2 LED drivers.
Device Protocol: 4.7.1 | Module Protocol: 4.1.0 | User Config: 4.2.0 | Hardware Config: 1.0.0
- Use the ANSI vs ISO RGB LED of the UHK 60 v2 according to the actual layout.
- Fix USB HID idle period.
Device Protocol: 4.7.1 | Module Protocol: 4.1.0 | User Config: 4.2.0 | Hardware Config: 1.0.0
- Fix occasional, accidental scrolling on key cluster module initialization.
- Always initialize key cluster module LEDs with the correct colors.
- Fix macOS wake up and a number of USB-related compliance issues potentially resolving other USB issues.
Device Protocol: 4.7.1 | Module Protocol: 4.1.0 | User Config: 4.2.0 | Hardware Config: 1.0.0
- Add caret navigation mode and bind it to the Fn layer.
- Fix the configuration parser to use the configuration of the attached modules upon applying the configuration.
- Fix the double tap to hold feature to not hold the layer when a key gets pressed during the second tap of the double tap.
- Fix a potential memory corruption bug related to SLAVE_COUNT that may result in random bugs occasionally.
Device Protocol: 4.7.1 | Module Protocol: 4.1.0 | User Config: 4.2.0 | Hardware Config: 1.0.0
- Make module cursor movement more accurate, especially at slower speed.
- Update the default user configuration and factory configuration so that "double tap to lock" is only enabled for the Mouse key.
- Fix the backlight color of Tab and Backspace.
Device Protocol: 4.7.1 | Module Protocol: 4.1.0 | User Config: 4.2.0 | Hardware Config: 1.0.0
- Allow saving the mapping of more than three modules which fixes the "Response code: 5" Agent error message.
- Adjust per-module speed and acceleration settings and add base speed setting.
- Make touchpad sensing more stable by adjusting Prox Hardware Settings firmware values.
- Set touchpad resolution to 1,000 DPI.
- Change default navigation modes to not affect mouse layer functionality.
- Improve the factory keymap in regard to modules.
- Fix the color of tab, backspace, and key cluster backspace keys on the base and mod layers.
- Adjust UHK 60 v2 backlighting according to the key backlight brightness setting.
Device Protocol: 4.7.1 | Module Protocol: 4.1.0 | User Config: 4.2.0 | Hardware Config: 1.0.0
- Use optimized per-module speed and acceleration settings.
- Use cursor navigation mode on base layer and scroll mode on the mouse layer for right-sided modules and vice versa for the key cluster module.
Device Protocol: 4.7.1 | Module Protocol: 4.1.0 | User Config: 4.2.0 | Hardware Config: 1.0.0
- Disable touchpad auto-sleep mode.
- Don't query touchpad delta values, resulting in a much faster refresh rate.
- Change UHK 60 v2 USB product ID from 0x6122 to 0x6124.
- Change USB product name to "UHK 60 v1" and "UHK 60 v2" according to the actual device.
Device Protocol: 4.7.1 | Module Protocol: 4.1.0 | User Config: 4.2.0 | Hardware Config: 1.0.0
- Make the GetKeyboardState USB command show the presence of the touchpad module.
DEVICEPROTOCOL:PATCH
Device Protocol: 4.7.0 | Module Protocol: 4.1.0 | User Config: 4.2.0 | Hardware Config: 1.0.0
- Support the UHK 60 v2.
- Migrate the key cluster module MCU back from MKL17Z32VFM4 to MKL03Z32VFK4.
- Add IS31FL3199 LED driver support which is utilized in the key cluster module.
- Change touchpad module I2C address.
- Increase trackball sensor resolution from 500 CPI to 1000 CPI.
Device Protocol: 4.7.0 | Module Protocol: 4.1.0 | User Config: 4.2.0 | Hardware Config: 1.0.0
- Migrate key cluster module MCU from MKL03Z32VFK4 to MKL17Z32VFM4.
- Fix trackball module right button port.
- Handle touchpad module single tap, two finger tap, and scroll events.
Device Protocol: 4.7.0 | Module Protocol: 4.1.0 | User Config: 4.2.0 | Hardware Config: 1.0.0
- Fix USB 3.x compatibility issues which mostly affected Ryzen PCs.
Device Protocol: 4.7.0 | Module Protocol: 4.1.0 | User Config: 4.2.0 | Hardware Config: 1.0.0
- Implement the $+-*/|\<>?_'",`@={} characters for the LED segment display.
USERCONFIG:MINOR
Device Protocol: 4.7.0 | Module Protocol: 4.1.0 | User Config: 4.1.1 | Hardware Config: 1.0.0
- Make sticky shortcuts not stick on the base layer.
Device Protocol: 4.7.0 | Module Protocol: 4.1.0 | User Config: 4.1.1 | Hardware Config: 1.0.0
- Make every layer switcher action always deactivate held layers of their own layer without any side effects.
- Allow to cycle keymaps without releasing the relevant layer switcher key.
Device Protocol: 4.7.0 | Module Protocol: 4.1.0 | User Config: 4.1.1 | Hardware Config: 1.0.0
- Fix the handling of layer toggle actions.
Device Protocol: 4.7.0 | Module Protocol: 4.1.0 | User Config: 4.1.1 | Hardware Config: 1.0.0
- Make secondary roles resolve recursively.
- Make Ctrl+tab and Ctrl+arrow shortcuts sticky.
- Fix memory corruption in the LED display driver that might have caused occasional issues.
Device Protocol: 4.7.0 | Module Protocol: 4.1.0 | User Config: 4.1.1 | Hardware Config: 1.0.0
- Make the empty characters of keymap abbreviations show up empty on the LED display.
- Add touchpad module slave driver.
- Enable the pull-up resistors for the GPIO pins of the hall sensors of the BlackBerry trackball. This makes the new sensors work correctly.
Device Protocol: 4.7.0 | Module Protocol: 4.1.0 | User Config: 4.1.1 | Hardware Config: 1.0.0
- Prevent deadlocks and races in USB semaphores. If your UHK frooze every now and then, it shouldn't happen again.
- Implement mouse buttons 4-8.
- Make arrow scancodes stick their modifiers.
- Implement functional trackpoint firmware.
- Expose toggled layer via the GetKeyboardState USB command.
DEVICEPROTOCOL:MINOR
Device Protocol: 4.6.0 | Module Protocol: 4.1.0 | User Config: 4.1.1 | Hardware Config: 1.0.0
- Don't make shortcuts sticky with the exception of Alt+Tab and Cmd+Tab.
- Add extra USB reports for pressing and releasing the modifiers of shortcuts. This makes the firmware play nicer with Karabiner, RDP, and possibly some other applications.
- Make scroll key actions always emit a USB scroll event, even when tapped momentarily.
- When conflicting mouse keys are pressed at the same time, make the most recent key the dominant one.
- Add key cluster, trackball, and trackpoint firmware images to the firmware tarball.
- Set sensible default key actions for modules.
- Make the key cluster scroll and the other modules move the pointer by default.
- Move from .tar.bz2 to .tar.gz as the firmware release file format because the latter can be attached in GitHub issues.
Device Protocol: 4.6.0 | Module Protocol: 4.1.0 | User Config: 4.1.1 | Hardware Config: 1.0.0
- Make the Agent icon of the LED display light up when Agent is running.
- Fix debouncer related data races which slightly affect the left keyboard half.
- When a dual-role key is held and the secondary role gets triggered by another key, don't debounce the latter key.
- Set the key states of disconnected modules to unpressed.
- Update module states upon disconnecting the left and right modules.
- Expose the active layer via the GetDeviceState USB command.
DEVICEPROTOCOL:MINOR
Device Protocol: 4.5.0 | Module Protocol: 4.1.0 | User Config: 4.1.1 | Hardware Config: 1.0.0
- Make the config parser accept mouse button 4 to 8.
USERCONFIG:PATCH - Implement API for modules to send pointer movements to the master.
MODULEPROTOCOL:MINOR - Fix empty macro playback.
Device Protocol: 4.5.0 | Module Protocol: 4.0.0 | User Config: 4.1.0 | Hardware Config: 1.0.0
- Make the modifiers of shortcut keys stick only as long as the layer switcher key of a shortcut key is being held.
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.
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.
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.
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()
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.
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.
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
Device Protocol: 4.4.0 | Module Protocol: 4.0.0 | User Config: 4.1.0 | Hardware Config: 1.0.0
- Fix various bugs related to secondary role handling and sticky modifier states.
Device Protocol: 4.4.0 | Module Protocol: 4.0.0 | User Config: 4.1.0 | Hardware Config: 1.0.0
- Make some improvements to the sleep/wake code.
Device Protocol: 4.4.0 | Module Protocol: 4.0.0 | User Config: 4.1.0 | Hardware Config: 1.0.0
- Rewrite the key debouncer and set the press and release timeouts to 50ms.
- Add hardcoded test keymap.
- Make debounce timeouts configurable via USB.
DEVICEPROTOCOL:MINOR - Make the hardcoded test keymap able to trigger via USB.
DEVICEPROTOCOL:MINOR - Allow the USB stack test mode to be activated via USB.
DEVICEPROTOCOL:MINOR
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.
Device Protocol: 4.3.1 | Module Protocol: 4.0.0 | User Config: 4.1.0 | Hardware Config: 1.0.0
- Make the debouncer debounce not only on key presses but also on key releases, and change the debounce interval from 100ms to the suggested 5ms of MX switches.
- Revert the Windows related commits of firmware 8.3.1 because they introduced a nondeterministic bug that made USB hang.
- Add base layer key mappings for the left and right add-ons for testing purposes.
Device Protocol: 4.3.1 | Module Protocol: 4.0.0 | User Config: 4.1.0 | Hardware Config: 1.0.0
- Fix media key repetition bug on Windows.
- Fix bug that made Windows unable to sleep when the UHK was plugged in.
- Fix bug that made Chrome Remote Desktop blocked from interacting on Windows.
- Fix bug that made locked layers not release. This bug was introduced in the previous release.
Device Protocol: 4.3.1 | Module Protocol: 4.0.0 | User Config: 4.1.0 | Hardware Config: 1.0.0
- Make the config parser handle switch layer actions with hold on double tap disabled.
USERCONFIG:MINOR - Set key debounce timeout from 80ms to 100ms. This should further reduce key chattering.
Device Protocol: 4.3.1 | Module Protocol: 4.0.0 | User Config: 4.0.1 | Hardware Config: 1.0.0
- Now really fix the bug that made the hardware and user configuration not load from the EEPROM on some hosts right after firmware update.
Device Protocol: 4.3.1 | Module Protocol: 4.0.0 | User Config: 4.0.1 | Hardware Config: 1.0.0
- Fix the bug that made the hardware and user configuration not load from the EEPROM on some hosts right after firmware update.
- Set the signature of the hardware config to "FTY" in the RAM when the keyboard is in factory reset mode, allowing Agent to be aware of the factory reset state.
DEVICEPROTOCOL:PATCH - Load the hardware and user configuration from the EEPROM even in factory reset mode.
- Set key debounce timeout from 60ms to 80ms. This should further reduce key chattering.
Device Protocol: 4.3.0 | Module Protocol: 4.0.0 | User Config: 4.0.1 | Hardware Config: 1.0.0
- Don't switch keymaps instead of playing macros.
- Make saving the user configuration faster by only writing the part of the EEPROM which actually contains the user configuration.
Device Protocol: 4.3.0 | Module Protocol: 4.0.0 | User Config: 4.0.1 | Hardware Config: 1.0.0
- Parse long media macro actions.
USERCONFIG:PATCH - Fix vendor-specific USB usage page entry. This makes the HIDAPI Linux/hidraw driver able to access interface 0.
Device Protocol: 4.3.0 | Module Protocol: 4.0.0 | User Config: 4.0.0 | Hardware Config: 1.0.0
- Don't suppress modifier keys upon releasing a layer.
- Restore Caps Lock indicator when saving the configuration.
Device Protocol: 4.3.0 | Module Protocol: 4.0.0 | User Config: 4.0.0 | Hardware Config: 1.0.0
- Change the scheduling of USB reports which changes mouse pointer speeds.
- Disable LEDs while the host sleeps.
- Make any key wake up the host while it sleeps.
- Add UsbCommand_SwitchKeymap().
DEVICEPROTOCOL:MINOR - Make GCC optimize the release builds for execution speed (-O3).
Device Protocol: 4.2.0 | Module Protocol: 4.0.0 | User Config: 4.0.0 | Hardware Config: 1.0.0
- Set key debounce timeout from 30ms to 60ms. This should eliminate key chattering.
- Use the correct scancode for the menu key of the factory keymap.
Device Protocol: 4.2.0 | Module Protocol: 4.0.0 | User Config: 4.0.0 | Hardware Config: 1.0.0
- Set key debounce timeout from 20ms to 30ms. This should eliminate key chattering.
- Set double tap lock layer timeout from 250ms to 150ms. This should minimize the chance of locking layers accidentally by double tapping their keys.
Device Protocol: 4.2.0 | Module Protocol: 4.0.0 | User Config: 4.0.0 | Hardware Config: 1.0.0
- Fix system keyboard descriptor, so it is byte-aligned.
- Set key debounce timeout from 15ms to 20ms. This should at least reduce and hopefully eliminate key chattering.
Device Protocol: 4.2.0 | Module Protocol: 4.0.0 | User Config: 4.0.0 | Hardware Config: 1.0.0
- Detect Caps Lock USB state and light up the Caps Lock icon of the LED display accordingly.
- Set key debounce timeout from 10ms to 15ms. This should at least reduce and hopefully eliminate key chattering.
Device Protocol: 4.2.0 | Module Protocol: 4.0.0 | User Config: 4.0.0 | Hardware Config: 1.0.0
- Lock layers every time when double-tapping their layer switcher keys, regardless of how many times the layer switcher key was tapped before.
- Only lock layers via double-tapping if the second tap gets released within 100ms.
Device Protocol: 4.2.0 | Module Protocol: 4.0.0 | User Config: 4.0.0 | Hardware Config: 1.0.0
- Enable left-half watchdog in reinit mode which seems to prevent freezes.
- Slow down main bus I2C baud rate to 30kHz when BusPal is on to make firmware transfer more robust.
- Implement UsbCommandId_GetSlaveI2cErrors.
DEVICEPROTOCOL:MINOR - Implement UsbCommandId_SetI2cBaudRate.
DEVICEPROTOCOL:MINOR - Implement DevicePropertyId_CurrentKbootCommand.
DEVICEPROTOCOL:MINOR - Implement DevicePropertyId_I2cMainBusBaudRate.
DEVICEPROTOCOL:MINOR - Implement DevicePropertyId_Uptime.
DEVICEPROTOCOL:MINOR
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.
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
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
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.
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.
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.
USERCONFIG:MAJOR
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: userConfigMajorVersion, userConfigMinorVersion, userConfigPatchVersion, doubleTapSwitchLayerTimeout, iconsAndLayerTextsBrightness, alphanumericSegmentsBrightness, keyBacklightBrightness, mouseMoveInitialSpeed, mouseMoveAcceleration, mouseMoveDeceleratedSpeed, mouseMoveBaseSpeed, mouseMoveAcceleratedSpeed, mouseScrollInitialSpeed, mouseScrollAcceleration, mouseScrollDeceleratedSpeed, mouseScrollBaseSpeed, mouseScrollAcceleratedSpeed.
USERCONFIG:MAJOR
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.
- Use the menu key in the factory keymap.
- 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.
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.
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.
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.
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.
Device Protocol: 1.2.0 | Module Protocol: 2.1.0 | User Config: 1.0.0 | Hardware Config: 1.0.0
- Add jumpToSlaveBootloader USB and Module Protocol command.
DEVICEPROTOCOL:MINORMODULEPROTOCOL:MINOR - Fix generic HID descriptor enumeration error.
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.
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.
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().
DEVICEPROTOCOL:PATCH - Throw ParserError_InvalidKeymapCount if keymapCount == 0.
USERCONFIG:PATCH
Device Protocol: 1.0.0 | Module Protocol: 1.0.0 | User Config: 1.0.0 | Hardware Config: 1.0.0
- First Release