diff --git a/package.json b/package.json index e95293eebfb..4a97a5e0cb5 100644 --- a/package.json +++ b/package.json @@ -6,7 +6,7 @@ "version": "9.0.1", "firmwareVersion": "16.1.1", "deviceProtocolVersion": "4.17.0", - "userConfigVersion": "13.0.0", + "userConfigVersion": "14.0.0", "hardwareConfigVersion": "1.0.0", "description": "Agent is the configuration application of the Ultimate Hacking Keyboard.", "repository": { diff --git a/packages/uhk-common/src/config-serializer/config-items/host-connection.ts b/packages/uhk-common/src/config-serializer/config-items/host-connection.ts index 46319368722..cc1fb304df5 100644 --- a/packages/uhk-common/src/config-serializer/config-items/host-connection.ts +++ b/packages/uhk-common/src/config-serializer/config-items/host-connection.ts @@ -75,6 +75,7 @@ export class HostConnection { case 11: case 12: case 13: + case 14: return this.fromJsonObjectV9(jsonObject, serialisationInfo); default: @@ -91,6 +92,7 @@ export class HostConnection { case 11: case 12: case 13: + case 14: return this.fromJsonBinaryV9(buffer, serialisationInfo); default: diff --git a/packages/uhk-common/src/config-serializer/config-items/index.ts b/packages/uhk-common/src/config-serializer/config-items/index.ts index 3be6d3e55c5..8e0466b6f9f 100644 --- a/packages/uhk-common/src/config-serializer/config-items/index.ts +++ b/packages/uhk-common/src/config-serializer/config-items/index.ts @@ -13,6 +13,8 @@ export * from './layer.js'; export * from './layer-name.js'; export * from './secondary-role-action.js'; export * from './secondary-role-advanced-strategy-timeout-action.js'; +export * from './secondary-role-advanced-strategy-timeout-type.js'; +export * from './secondary-role-advanced-strategy-triggering-event.js'; export * from './secondary-role-strategy.js'; export * from './macro.js'; export * from './module.js'; diff --git a/packages/uhk-common/src/config-serializer/config-items/key-action/helper.ts b/packages/uhk-common/src/config-serializer/config-items/key-action/helper.ts index 083c36ad27c..a01331a6b9e 100644 --- a/packages/uhk-common/src/config-serializer/config-items/key-action/helper.ts +++ b/packages/uhk-common/src/config-serializer/config-items/key-action/helper.ts @@ -41,6 +41,7 @@ export class Helper { case 11: case 12: case 13: + case 14: return this.fromUhkBufferV1(buffer, macros, serialisationInfo); default: @@ -130,6 +131,7 @@ export class Helper { case 11: case 12: case 13: + case 14: return this.fromJSONObjectV1(keyAction, macros, serialisationInfo); default: diff --git a/packages/uhk-common/src/config-serializer/config-items/key-action/keystroke-action.ts b/packages/uhk-common/src/config-serializer/config-items/key-action/keystroke-action.ts index 1fc7fe9d6d2..973c4e7d37b 100644 --- a/packages/uhk-common/src/config-serializer/config-items/key-action/keystroke-action.ts +++ b/packages/uhk-common/src/config-serializer/config-items/key-action/keystroke-action.ts @@ -86,6 +86,7 @@ export class KeystrokeAction extends KeyAction { case 11: case 12: case 13: + case 14: this.fromJsonObjectV6(jsonObject, serialisationInfo); break; @@ -113,6 +114,7 @@ export class KeystrokeAction extends KeyAction { case 11: case 12: case 13: + case 14: this.fromBinaryV6(buffer, serialisationInfo); break; diff --git a/packages/uhk-common/src/config-serializer/config-items/key-action/mouse-action.ts b/packages/uhk-common/src/config-serializer/config-items/key-action/mouse-action.ts index fe34292d770..8fa6b93a70c 100644 --- a/packages/uhk-common/src/config-serializer/config-items/key-action/mouse-action.ts +++ b/packages/uhk-common/src/config-serializer/config-items/key-action/mouse-action.ts @@ -65,6 +65,7 @@ export class MouseAction extends KeyAction { case 11: case 12: case 13: + case 14: this.fromJsonObjectV6(jsonObject, serialisationInfo); break; @@ -92,6 +93,7 @@ export class MouseAction extends KeyAction { case 11: case 12: case 13: + case 14: this.fromBinaryV6(buffer, serialisationInfo); break; diff --git a/packages/uhk-common/src/config-serializer/config-items/key-action/play-macro-action.ts b/packages/uhk-common/src/config-serializer/config-items/key-action/play-macro-action.ts index fdfc705cdb0..c31350db345 100644 --- a/packages/uhk-common/src/config-serializer/config-items/key-action/play-macro-action.ts +++ b/packages/uhk-common/src/config-serializer/config-items/key-action/play-macro-action.ts @@ -96,6 +96,7 @@ export class PlayMacroAction extends KeyAction { case 11: case 12: case 13: + case 14: this.fromJsonObjectV6(jsonObject, macros, serialisationInfo); break; @@ -123,6 +124,7 @@ export class PlayMacroAction extends KeyAction { case 11: case 12: case 13: + case 14: this.fromBinaryV6(buffer, macros, serialisationInfo); break; diff --git a/packages/uhk-common/src/config-serializer/config-items/key-action/switch-keymap-action.ts b/packages/uhk-common/src/config-serializer/config-items/key-action/switch-keymap-action.ts index aa2d3622954..4dd0c8f1cc3 100644 --- a/packages/uhk-common/src/config-serializer/config-items/key-action/switch-keymap-action.ts +++ b/packages/uhk-common/src/config-serializer/config-items/key-action/switch-keymap-action.ts @@ -44,6 +44,7 @@ export class SwitchKeymapAction extends KeyAction { case 11: case 12: case 13: + case 14: this.fromJsonObjectV6(jsonObject, serialisationInfo); break; @@ -121,6 +122,7 @@ export class UnresolvedSwitchKeymapAction extends KeyAction { case 11: case 12: case 13: + case 14: this.fromBinaryV6(buffer, serialisationInfo); break; diff --git a/packages/uhk-common/src/config-serializer/config-items/key-action/switch-layer-action.ts b/packages/uhk-common/src/config-serializer/config-items/key-action/switch-layer-action.ts index accc5211c13..a8812a99eca 100644 --- a/packages/uhk-common/src/config-serializer/config-items/key-action/switch-layer-action.ts +++ b/packages/uhk-common/src/config-serializer/config-items/key-action/switch-layer-action.ts @@ -74,6 +74,7 @@ export class SwitchLayerAction extends KeyAction { case 11: case 12: case 13: + case 14: this.fromJsonObjectV6(jsonObject, serialisationInfo); break; @@ -101,6 +102,7 @@ export class SwitchLayerAction extends KeyAction { case 11: case 12: case 13: + case 14: this.fromBinaryV6(buffer, serialisationInfo); break; diff --git a/packages/uhk-common/src/config-serializer/config-items/keymap.ts b/packages/uhk-common/src/config-serializer/config-items/keymap.ts index f3cbdb06777..8152682fa90 100644 --- a/packages/uhk-common/src/config-serializer/config-items/keymap.ts +++ b/packages/uhk-common/src/config-serializer/config-items/keymap.ts @@ -43,6 +43,7 @@ export class Keymap { case 11: case 12: case 13: + case 14: this.fromJsonObjectV1(jsonObject, macros, serialisationInfo); break; @@ -69,6 +70,7 @@ export class Keymap { case 11: case 12: case 13: + case 14: this.fromBinaryV1(buffer, macros, serialisationInfo); break; diff --git a/packages/uhk-common/src/config-serializer/config-items/layer.ts b/packages/uhk-common/src/config-serializer/config-items/layer.ts index ea18d841994..e6a0cc78e3f 100644 --- a/packages/uhk-common/src/config-serializer/config-items/layer.ts +++ b/packages/uhk-common/src/config-serializer/config-items/layer.ts @@ -42,6 +42,7 @@ export class Layer { case 11: case 12: case 13: + case 14: this.fromJsonObjectV5(jsonObject, macros, serialisationInfo); break; @@ -69,6 +70,7 @@ export class Layer { case 11: case 12: case 13: + case 14: this.fromBinaryV5(buffer, macros, serialisationInfo); break; diff --git a/packages/uhk-common/src/config-serializer/config-items/macro-action/command-macro-action.ts b/packages/uhk-common/src/config-serializer/config-items/macro-action/command-macro-action.ts index 8221437fe3f..8b78f5d6148 100644 --- a/packages/uhk-common/src/config-serializer/config-items/macro-action/command-macro-action.ts +++ b/packages/uhk-common/src/config-serializer/config-items/macro-action/command-macro-action.ts @@ -28,6 +28,7 @@ export class CommandMacroAction extends MacroAction { case 11: case 12: case 13: + case 14: this.fromJsonObjectV1(jsonObject); break; @@ -52,6 +53,7 @@ export class CommandMacroAction extends MacroAction { case 11: case 12: case 13: + case 14: this.fromBinaryV1(buffer); break; diff --git a/packages/uhk-common/src/config-serializer/config-items/macro-action/delay-macro-action.ts b/packages/uhk-common/src/config-serializer/config-items/macro-action/delay-macro-action.ts index 78c6202174a..3841411a580 100644 --- a/packages/uhk-common/src/config-serializer/config-items/macro-action/delay-macro-action.ts +++ b/packages/uhk-common/src/config-serializer/config-items/macro-action/delay-macro-action.ts @@ -29,6 +29,7 @@ export class DelayMacroAction extends MacroAction { case 11: case 12: case 13: + case 14: this.fromJsonObjectV1(jsonObject); break; @@ -53,6 +54,7 @@ export class DelayMacroAction extends MacroAction { case 11: case 12: case 13: + case 14: this.fromBinaryV1(buffer); break; diff --git a/packages/uhk-common/src/config-serializer/config-items/macro-action/key-macro-action.ts b/packages/uhk-common/src/config-serializer/config-items/macro-action/key-macro-action.ts index 1607dbf4c7a..0f4ca6aa101 100644 --- a/packages/uhk-common/src/config-serializer/config-items/macro-action/key-macro-action.ts +++ b/packages/uhk-common/src/config-serializer/config-items/macro-action/key-macro-action.ts @@ -61,6 +61,7 @@ export class KeyMacroAction extends MacroAction { case 11: case 12: case 13: + case 14: this.fromJsonObjectV1(jsonObject); break; @@ -85,6 +86,7 @@ export class KeyMacroAction extends MacroAction { case 11: case 12: case 13: + case 14: this.fromBinaryV1(buffer); break; diff --git a/packages/uhk-common/src/config-serializer/config-items/macro-action/mouse-button-macro-action.ts b/packages/uhk-common/src/config-serializer/config-items/macro-action/mouse-button-macro-action.ts index 014458ff7bd..28b99ca213f 100644 --- a/packages/uhk-common/src/config-serializer/config-items/macro-action/mouse-button-macro-action.ts +++ b/packages/uhk-common/src/config-serializer/config-items/macro-action/mouse-button-macro-action.ts @@ -43,6 +43,7 @@ export class MouseButtonMacroAction extends MacroAction { case 11: case 12: case 13: + case 14: this.fromJsonObjectV1(jsonObject); break; @@ -67,6 +68,7 @@ export class MouseButtonMacroAction extends MacroAction { case 11: case 12: case 13: + case 14: this.fromBinaryV1(buffer); break; diff --git a/packages/uhk-common/src/config-serializer/config-items/macro-action/move-mouse-macro-action.ts b/packages/uhk-common/src/config-serializer/config-items/macro-action/move-mouse-macro-action.ts index 95c9ded53c3..f3ccd2e7a4d 100644 --- a/packages/uhk-common/src/config-serializer/config-items/macro-action/move-mouse-macro-action.ts +++ b/packages/uhk-common/src/config-serializer/config-items/macro-action/move-mouse-macro-action.ts @@ -32,6 +32,7 @@ export class MoveMouseMacroAction extends MacroAction { case 11: case 12: case 13: + case 14: this.fromJsonObjectV1(jsonObject); break; @@ -56,6 +57,7 @@ export class MoveMouseMacroAction extends MacroAction { case 11: case 12: case 13: + case 14: this.fromBinaryV1(buffer); break; diff --git a/packages/uhk-common/src/config-serializer/config-items/macro-action/scroll-mouse-macro-action.ts b/packages/uhk-common/src/config-serializer/config-items/macro-action/scroll-mouse-macro-action.ts index e5637b212a0..c19643cd4a9 100644 --- a/packages/uhk-common/src/config-serializer/config-items/macro-action/scroll-mouse-macro-action.ts +++ b/packages/uhk-common/src/config-serializer/config-items/macro-action/scroll-mouse-macro-action.ts @@ -32,6 +32,7 @@ export class ScrollMouseMacroAction extends MacroAction { case 11: case 12: case 13: + case 14: this.fromJsonObjectV1(jsonObject); break; @@ -56,6 +57,7 @@ export class ScrollMouseMacroAction extends MacroAction { case 11: case 12: case 13: + case 14: this.fromBinaryV1(buffer); break; diff --git a/packages/uhk-common/src/config-serializer/config-items/macro-action/text-macro-action.ts b/packages/uhk-common/src/config-serializer/config-items/macro-action/text-macro-action.ts index 1859ba33e7d..42e5cfd16a9 100644 --- a/packages/uhk-common/src/config-serializer/config-items/macro-action/text-macro-action.ts +++ b/packages/uhk-common/src/config-serializer/config-items/macro-action/text-macro-action.ts @@ -28,6 +28,7 @@ export class TextMacroAction extends MacroAction { case 11: case 12: case 13: + case 14: this.fromJsonObjectV1(jsonObject); break; @@ -52,6 +53,7 @@ export class TextMacroAction extends MacroAction { case 11: case 12: case 13: + case 14: this.fromBinaryV1(buffer); break; diff --git a/packages/uhk-common/src/config-serializer/config-items/macro.ts b/packages/uhk-common/src/config-serializer/config-items/macro.ts index 88ece98f1ba..cc9099e3dd2 100644 --- a/packages/uhk-common/src/config-serializer/config-items/macro.ts +++ b/packages/uhk-common/src/config-serializer/config-items/macro.ts @@ -41,6 +41,7 @@ export class Macro { case 11: case 12: case 13: + case 14: this.fromJsonObjectV1(jsonObject, serialisationInfo); break; @@ -65,6 +66,7 @@ export class Macro { case 11: case 12: case 13: + case 14: this.fromBinaryV1(buffer, serialisationInfo); break; diff --git a/packages/uhk-common/src/config-serializer/config-items/module-configuration.ts b/packages/uhk-common/src/config-serializer/config-items/module-configuration.ts index ea4f3a4f0aa..e3f1113cb88 100644 --- a/packages/uhk-common/src/config-serializer/config-items/module-configuration.ts +++ b/packages/uhk-common/src/config-serializer/config-items/module-configuration.ts @@ -96,6 +96,7 @@ export class ModuleConfiguration { case 11: case 12: case 13: + case 14: this.fromJsonObjectV7(jsonObject); break; @@ -122,6 +123,7 @@ export class ModuleConfiguration { case 11: case 12: case 13: + case 14: this.fromBinaryV7(buffer); break; diff --git a/packages/uhk-common/src/config-serializer/config-items/module.ts b/packages/uhk-common/src/config-serializer/config-items/module.ts index 613a9d37275..d31efc3597b 100644 --- a/packages/uhk-common/src/config-serializer/config-items/module.ts +++ b/packages/uhk-common/src/config-serializer/config-items/module.ts @@ -45,6 +45,7 @@ export class Module { case 11: case 12: case 13: + case 14: this.fromJsonObjectV1(jsonObject, macros, serialisationInfo); break; @@ -69,6 +70,7 @@ export class Module { case 11: case 12: case 13: + case 14: this.fromBinaryV1(buffer, macros, serialisationInfo); break; diff --git a/packages/uhk-common/src/config-serializer/config-items/rgb-color.ts b/packages/uhk-common/src/config-serializer/config-items/rgb-color.ts index 7e1608d06c4..d42dab40b19 100644 --- a/packages/uhk-common/src/config-serializer/config-items/rgb-color.ts +++ b/packages/uhk-common/src/config-serializer/config-items/rgb-color.ts @@ -38,6 +38,7 @@ export class RgbColor { case 11: case 12: case 13: + case 14: this.fromJsonV6(jsonObject); break; @@ -64,6 +65,7 @@ export class RgbColor { case 11: case 12: case 13: + case 14: this.fromBinaryV6(buffer); break; diff --git a/packages/uhk-common/src/config-serializer/config-items/secondary-role-advanced-strategy-timeout-action.ts b/packages/uhk-common/src/config-serializer/config-items/secondary-role-advanced-strategy-timeout-action.ts index 96b932e205c..5b3ab8f6355 100644 --- a/packages/uhk-common/src/config-serializer/config-items/secondary-role-advanced-strategy-timeout-action.ts +++ b/packages/uhk-common/src/config-serializer/config-items/secondary-role-advanced-strategy-timeout-action.ts @@ -1,4 +1,5 @@ export enum SecondaryRoleAdvancedStrategyTimeoutAction { Primary, Secondary, + None, } diff --git a/packages/uhk-common/src/config-serializer/config-items/secondary-role-advanced-strategy-timeout-type.ts b/packages/uhk-common/src/config-serializer/config-items/secondary-role-advanced-strategy-timeout-type.ts new file mode 100644 index 00000000000..a7dbb7d5941 --- /dev/null +++ b/packages/uhk-common/src/config-serializer/config-items/secondary-role-advanced-strategy-timeout-type.ts @@ -0,0 +1,4 @@ +export enum SecondaryRoleAdvancedStrategyTimeoutType { + Active, + Passive, +} diff --git a/packages/uhk-common/src/config-serializer/config-items/secondary-role-advanced-strategy-triggering-event.ts b/packages/uhk-common/src/config-serializer/config-items/secondary-role-advanced-strategy-triggering-event.ts new file mode 100644 index 00000000000..f9577bd7543 --- /dev/null +++ b/packages/uhk-common/src/config-serializer/config-items/secondary-role-advanced-strategy-triggering-event.ts @@ -0,0 +1,5 @@ +export enum SecondaryRoleAdvancedStrategyTriggeringEvent { + Press, + Release, + None, +} diff --git a/packages/uhk-common/src/config-serializer/config-items/user-configuration.spec.ts b/packages/uhk-common/src/config-serializer/config-items/user-configuration.spec.ts index b4af6c05884..2493f0b3a64 100644 --- a/packages/uhk-common/src/config-serializer/config-items/user-configuration.spec.ts +++ b/packages/uhk-common/src/config-serializer/config-items/user-configuration.spec.ts @@ -8,7 +8,7 @@ describe('user-configuration', () => { it('should transform an empty config', () => { jsonTester({ - userConfigMajorVersion: 13, + userConfigMajorVersion: 14, userConfigMinorVersion: 0, userConfigPatchVersion: 0, lastSaveAgentTag: '', @@ -40,9 +40,13 @@ describe('user-configuration', () => { secondaryRoleAdvancedStrategyDoubletapTimeout: 200, secondaryRoleAdvancedStrategyTimeout: 350, secondaryRoleAdvancedStrategySafetyMargin: 50, - secondaryRoleAdvancedStrategyTriggerByRelease: true, + secondaryRoleAdvancedStrategyTrigger: 'Release', secondaryRoleAdvancedStrategyDoubletapToPrimary: true, secondaryRoleAdvancedStrategyTimeoutAction: 'Secondary', + secondaryRoleAdvancedStrategyTriggerByMouse: false, + secondaryRoleAdvancedStrategyTriggerFromSameHalf: true, + secondaryRoleAdvancedStrategyMinimumHoldTime: 0, + secondaryRoleAdvancedStrategyTimeoutType: 'Active', mouseScrollAxisSkew: 1, mouseMoveAxisSkew: 1, diagonalSpeedCompensation: false, diff --git a/packages/uhk-common/src/config-serializer/config-items/user-configuration.ts b/packages/uhk-common/src/config-serializer/config-items/user-configuration.ts index c89832071df..818ed231485 100644 --- a/packages/uhk-common/src/config-serializer/config-items/user-configuration.ts +++ b/packages/uhk-common/src/config-serializer/config-items/user-configuration.ts @@ -23,6 +23,8 @@ import { RgbColor } from './rgb-color.js'; import { isAllowedScancode } from './scancode-checker.js'; import { SecondaryRoleAction } from './secondary-role-action.js'; import { SecondaryRoleAdvancedStrategyTimeoutAction } from './secondary-role-advanced-strategy-timeout-action.js'; +import { SecondaryRoleAdvancedStrategyTimeoutType } from './secondary-role-advanced-strategy-timeout-type.js'; +import { SecondaryRoleAdvancedStrategyTriggeringEvent } from './secondary-role-advanced-strategy-triggering-event.js'; import { SecondaryRoleStrategy } from './secondary-role-strategy.js'; import { isSerialisationInfoGte, SerialisationInfo } from './serialisation-info.js'; @@ -137,12 +139,27 @@ export class UserConfiguration implements MouseSpeedConfiguration { @assertInt16 secondaryRoleAdvancedStrategySafetyMargin: number; + /** + * Deprecated in version 14. + * Use + * - `secondaryRoleAdvancedStrategyTrigger` + */ secondaryRoleAdvancedStrategyTriggerByRelease: boolean; + @assertEnum(SecondaryRoleAdvancedStrategyTriggeringEvent) secondaryRoleAdvancedStrategyTrigger: SecondaryRoleAdvancedStrategyTriggeringEvent; + secondaryRoleAdvancedStrategyDoubletapToPrimary: boolean; @assertEnum(SecondaryRoleAdvancedStrategyTimeoutAction) secondaryRoleAdvancedStrategyTimeoutAction: SecondaryRoleAdvancedStrategyTimeoutAction; + secondaryRoleAdvancedStrategyTriggerByMouse: boolean; + + secondaryRoleAdvancedStrategyTriggerFromSameHalf: boolean; + + @assertUInt8 secondaryRoleAdvancedStrategyMinimumHoldTime: number; + + @assertEnum(SecondaryRoleAdvancedStrategyTimeoutType) secondaryRoleAdvancedStrategyTimeoutType: SecondaryRoleAdvancedStrategyTimeoutType; + @assertFloat mouseScrollAxisSkew: number; @assertFloat mouseMoveAxisSkew: number; @@ -205,6 +222,7 @@ export class UserConfiguration implements MouseSpeedConfiguration { case 11: case 12: case 13: + case 14: this.fromJsonObjectV9(jsonObject); break; @@ -228,6 +246,7 @@ export class UserConfiguration implements MouseSpeedConfiguration { this.migrateToV12(); this.migrateToV12_1(); this.migrateToV13(); + this.migrateToV14(); this.recalculateConfigurationLength(); @@ -264,6 +283,7 @@ export class UserConfiguration implements MouseSpeedConfiguration { case 11: case 12: case 13: + case 14: this.fromBinaryV9(buffer); break; @@ -332,6 +352,10 @@ export class UserConfiguration implements MouseSpeedConfiguration { this.userConfigurationLength = 0; } + if (this.migrateToV14()) { + this.userConfigurationLength = 0; + } + if (this.userConfigurationLength === 0) { this.recalculateConfigurationLength(); } @@ -373,9 +397,13 @@ export class UserConfiguration implements MouseSpeedConfiguration { secondaryRoleAdvancedStrategyDoubletapTimeout: this.secondaryRoleAdvancedStrategyDoubletapTimeout, secondaryRoleAdvancedStrategyTimeout: this.secondaryRoleAdvancedStrategyTimeout, secondaryRoleAdvancedStrategySafetyMargin: this.secondaryRoleAdvancedStrategySafetyMargin, - secondaryRoleAdvancedStrategyTriggerByRelease: this.secondaryRoleAdvancedStrategyTriggerByRelease, + secondaryRoleAdvancedStrategyTrigger: SecondaryRoleAdvancedStrategyTriggeringEvent[this.secondaryRoleAdvancedStrategyTrigger], secondaryRoleAdvancedStrategyDoubletapToPrimary: this.secondaryRoleAdvancedStrategyDoubletapToPrimary, secondaryRoleAdvancedStrategyTimeoutAction: SecondaryRoleAdvancedStrategyTimeoutAction[this.secondaryRoleAdvancedStrategyTimeoutAction], + secondaryRoleAdvancedStrategyTriggerByMouse: this.secondaryRoleAdvancedStrategyTriggerByMouse, + secondaryRoleAdvancedStrategyTriggerFromSameHalf: this.secondaryRoleAdvancedStrategyTriggerFromSameHalf, + secondaryRoleAdvancedStrategyMinimumHoldTime: this.secondaryRoleAdvancedStrategyMinimumHoldTime, + secondaryRoleAdvancedStrategyTimeoutType: SecondaryRoleAdvancedStrategyTimeoutType[this.secondaryRoleAdvancedStrategyTimeoutType], mouseScrollAxisSkew: this.mouseScrollAxisSkew, mouseMoveAxisSkew: this.mouseMoveAxisSkew, diagonalSpeedCompensation: this.diagonalSpeedCompensation, @@ -434,7 +462,7 @@ export class UserConfiguration implements MouseSpeedConfiguration { buffer.writeUInt16(this.secondaryRoleAdvancedStrategyDoubletapTimeout); buffer.writeUInt16(this.secondaryRoleAdvancedStrategyTimeout); buffer.writeInt16(this.secondaryRoleAdvancedStrategySafetyMargin); - buffer.writeBoolean(this.secondaryRoleAdvancedStrategyTriggerByRelease); + buffer.writeUInt8(this.secondaryRoleAdvancedStrategyTrigger); buffer.writeBoolean(this.secondaryRoleAdvancedStrategyDoubletapToPrimary); buffer.writeUInt8(this.secondaryRoleAdvancedStrategyTimeoutAction); buffer.writeFloat(this.mouseScrollAxisSkew); @@ -454,6 +482,10 @@ export class UserConfiguration implements MouseSpeedConfiguration { buffer.writeUInt8(this.keyBacklightBrightnessChargingDefault); buffer.writeUInt8(this.batteryChargingMode); + buffer.writeBoolean(this.secondaryRoleAdvancedStrategyTriggerByMouse); + buffer.writeBoolean(this.secondaryRoleAdvancedStrategyTriggerFromSameHalf); + buffer.writeUInt8(this.secondaryRoleAdvancedStrategyMinimumHoldTime); + buffer.writeUInt8(this.secondaryRoleAdvancedStrategyTimeoutType); for(let i = 0; i < HOST_CONNECTION_COUNT_MAX; i++) { const hostConnection = this.hostConnections[i]; @@ -743,6 +775,9 @@ export class UserConfiguration implements MouseSpeedConfiguration { this.setDefaultDeviceName(); this.doubleTapSwitchLayerTimeout = buffer.readUInt16(); this.perKeyRgbPresent = buffer.readBoolean(); + + const serialisationInfo = this.getSerialisationInfo(); + this.backlightingMode = buffer.readUInt8(); this.backlightingNoneActionColor = new RgbColor().fromBinary(buffer, this.userConfigMajorVersion); this.backlightingScancodeColor = new RgbColor().fromBinary(buffer, this.userConfigMajorVersion); @@ -768,7 +803,14 @@ export class UserConfiguration implements MouseSpeedConfiguration { this.secondaryRoleAdvancedStrategyDoubletapTimeout = buffer.readUInt16(); this.secondaryRoleAdvancedStrategyTimeout = buffer.readUInt16(); this.secondaryRoleAdvancedStrategySafetyMargin = buffer.readInt16(); - this.secondaryRoleAdvancedStrategyTriggerByRelease = buffer.readBoolean(); + + if (isSerialisationInfoGte(serialisationInfo, '14.0.0')) { + this.secondaryRoleAdvancedStrategyTrigger = buffer.readUInt8(); + } + else { + this.secondaryRoleAdvancedStrategyTriggerByRelease = buffer.readBoolean(); + } + this.secondaryRoleAdvancedStrategyDoubletapToPrimary = buffer.readBoolean(); this.secondaryRoleAdvancedStrategyTimeoutAction = buffer.readUInt8(); this.mouseScrollAxisSkew = buffer.readFloat(); @@ -786,13 +828,18 @@ export class UserConfiguration implements MouseSpeedConfiguration { this.keyBacklightFadeOutTimeout = buffer.readUInt16(); this.keyBacklightFadeOutBatteryTimeout = buffer.readUInt16(); - const serialisationInfo = this.getSerialisationInfo(); - if (isSerialisationInfoGte(serialisationInfo, '9.99.0')) { this.keyBacklightBrightnessChargingDefault = buffer.readUInt8(); this.batteryChargingMode = buffer.readUInt8(); } + if (isSerialisationInfoGte(serialisationInfo, '14.0.0')) { + this.secondaryRoleAdvancedStrategyTriggerByMouse = buffer.readBoolean(); + this.secondaryRoleAdvancedStrategyTriggerFromSameHalf = buffer.readBoolean(); + this.secondaryRoleAdvancedStrategyMinimumHoldTime = buffer.readUInt8(); + this.secondaryRoleAdvancedStrategyTimeoutType = buffer.readUInt8(); + } + this.hostConnections = []; for (let i = 0; i < HOST_CONNECTION_COUNT_MAX; i++) { const hostConnection = new HostConnection().fromBinary(buffer, serialisationInfo); @@ -1024,6 +1071,9 @@ export class UserConfiguration implements MouseSpeedConfiguration { this.setDefaultDeviceName(); this.doubleTapSwitchLayerTimeout = jsonObject.doubleTapSwitchLayerTimeout; this.perKeyRgbPresent = jsonObject.perKeyRgbPresent; + + const serialisationInfo = this.getSerialisationInfo(); + this.backlightingMode = BacklightingMode[jsonObject.backlightingMode as string]; this.backlightingNoneActionColor = new RgbColor().fromJsonObject(jsonObject.backlightingNoneActionColor, this.userConfigMajorVersion); this.backlightingScancodeColor = new RgbColor().fromJsonObject(jsonObject.backlightingScancodeColor, this.userConfigMajorVersion); @@ -1058,6 +1108,14 @@ export class UserConfiguration implements MouseSpeedConfiguration { this.doubletapTimeout = jsonObject.doubletapTimeout; this.keystrokeDelay = jsonObject.keystrokeDelay; + if (isSerialisationInfoGte(serialisationInfo, '14.0.0')) { + this.secondaryRoleAdvancedStrategyTrigger = SecondaryRoleAdvancedStrategyTriggeringEvent[jsonObject.secondaryRoleAdvancedStrategyTrigger as string]; + this.secondaryRoleAdvancedStrategyTriggerByMouse = jsonObject.secondaryRoleAdvancedStrategyTriggerByMouse; + this.secondaryRoleAdvancedStrategyTriggerFromSameHalf = jsonObject.secondaryRoleAdvancedStrategyTriggerFromSameHalf; + this.secondaryRoleAdvancedStrategyMinimumHoldTime = jsonObject.secondaryRoleAdvancedStrategyMinimumHoldTime; + this.secondaryRoleAdvancedStrategyTimeoutType = SecondaryRoleAdvancedStrategyTimeoutType[jsonObject.secondaryRoleAdvancedStrategyTimeoutType as string]; + } + this.displayBrightness = jsonObject.displayBrightness; this.displayBrightnessBattery = jsonObject.displayBrightnessBattery; this.keyBacklightBrightness = jsonObject.keyBacklightBrightness; @@ -1067,8 +1125,6 @@ export class UserConfiguration implements MouseSpeedConfiguration { this.keyBacklightFadeOutTimeout = jsonObject.keyBacklightFadeOutTimeout; this.keyBacklightFadeOutBatteryTimeout = jsonObject.keyBacklightFadeOutBatteryTimeout; - const serialisationInfo = this.getSerialisationInfo(); - if (isSerialisationInfoGte(serialisationInfo, '9.99.0')) { this.keyBacklightBrightnessChargingDefault = jsonObject.keyBacklightBrightnessChargingDefault; this.batteryChargingMode = BatteryChargingMode[jsonObject.batteryChargingMode as string]; @@ -1423,6 +1479,27 @@ export class UserConfiguration implements MouseSpeedConfiguration { this.lastSaveFirmwareTag = ''; } + private migrateToV14(): boolean { + if (this.userConfigMajorVersion > 13) { + return false; + } + + this.userConfigMajorVersion = 14; + this.userConfigMinorVersion = 0; + this.userConfigPatchVersion = 0; + + if (this.secondaryRoleAdvancedStrategyTriggerByRelease) { + this.secondaryRoleAdvancedStrategyTrigger = SecondaryRoleAdvancedStrategyTriggeringEvent.Release; + } + else { + this.secondaryRoleAdvancedStrategyTrigger = SecondaryRoleAdvancedStrategyTriggeringEvent.Press; + } + this.secondaryRoleAdvancedStrategyTriggerByMouse = false; + this.secondaryRoleAdvancedStrategyTriggerFromSameHalf = true; + this.secondaryRoleAdvancedStrategyMinimumHoldTime = 0; + this.secondaryRoleAdvancedStrategyTimeoutType = SecondaryRoleAdvancedStrategyTimeoutType.Active; + } + private getSerialisationInfo(): SerialisationInfo { return { isUserConfigContainsRgbColors: this.perKeyRgbPresent, diff --git a/packages/uhk-common/user-config-80.json b/packages/uhk-common/user-config-80.json index 48cad8c363c..e120c15a352 100644 --- a/packages/uhk-common/user-config-80.json +++ b/packages/uhk-common/user-config-80.json @@ -1,5 +1,5 @@ { - "userConfigMajorVersion": 13, + "userConfigMajorVersion": 14, "userConfigMinorVersion": 0, "userConfigPatchVersion": 0, "lastSaveAgentTag": "", @@ -67,9 +67,13 @@ "secondaryRoleAdvancedStrategyDoubletapTimeout": 200, "secondaryRoleAdvancedStrategyTimeout": 350, "secondaryRoleAdvancedStrategySafetyMargin": 50, - "secondaryRoleAdvancedStrategyTriggerByRelease": true, + "secondaryRoleAdvancedStrategyTrigger": "Release", "secondaryRoleAdvancedStrategyDoubletapToPrimary": true, "secondaryRoleAdvancedStrategyTimeoutAction": "Secondary", + "secondaryRoleAdvancedStrategyTriggerByMouse": false, + "secondaryRoleAdvancedStrategyTriggerFromSameHalf": true, + "secondaryRoleAdvancedStrategyMinimumHoldTime": 0, + "secondaryRoleAdvancedStrategyTimeoutType": "Active", "mouseScrollAxisSkew": 1, "mouseMoveAxisSkew": 1, "diagonalSpeedCompensation": false, diff --git a/packages/uhk-web/src/app/components/device/typing-behavior-page/typing-behavior-page.component.html b/packages/uhk-web/src/app/components/device/typing-behavior-page/typing-behavior-page.component.html index 560e51ba805..3d8b27bd472 100644 --- a/packages/uhk-web/src/app/components/device/typing-behavior-page/typing-behavior-page.component.html +++ b/packages/uhk-web/src/app/components/device/typing-behavior-page/typing-behavior-page.component.html @@ -13,7 +13,7 @@

Secondary roles

+ [width]="380"/>

Secondary role keys, also dual-role keys, are keys that act depending on context.

For instance, a key may act as an escape key when tapped alone, but act as a mouse layer switcher when used with another key (which is then executed in the mouse layer). @@ -24,7 +24,7 @@

Secondary roles

Resolution strategy + [width]="380"/>

Simple resolution strategy activates the secondary role whenever there is another keypress while the dual-role key is pressed. If there is no such press, it briefly activates the primary role on the release of the dual-role key.

Advanced strategy allows for more complex activation conditions, in order to allow using secondary roles on alphanumeric keys, as Simple strategy tends to interfere with writing. @@ -53,10 +53,27 @@

Secondary roles

+ + Minimum hold time + + + + + + Timeout + [width]="250"/> Secondary roles /> + + Timeout type + + +

Assume timeout leads to Primary or None:

+

Active: timeout action is applied immediately when timeout is reached. Secondary role can no longer be activated after timeout was reached.

+ Passive: timeout action is delayed until release. Secondary role can still be triggered until key release. +
+ + +
+ + +
+
+ + +
+ + Timeout action + [width]="250"/>
@@ -98,25 +150,82 @@

Secondary roles

Secondary
+
+ + +
+ + + + Triggering event + + +

Press: just as with simple strategy, secondary role activated immediately when another key is pressed.

+

Release: secondary role is activated when another key is released while the dual role-key is pressed. Thus the role is determined by the release order of the two keys.

+ None: secondary role key is triggered only by timeout. +
+ + +
+ + +
+
+ + +
+
+ + +
- Trigger by release - + Trigger by mouse + Trigger safety margin + [width]="380"/>

This virtually offsets the release time of the dual-role key. Thus positive values fine-tune the dual role resolution sensitivity towards the primary role, while negative values fine-tune the dual role resolution sensitivity towards the secondary role.

Intended to be used with the Trigger by release option. @@ -137,7 +246,7 @@

Secondary roles

Double tap primary + [width]="250"/>

If the dual-role key is double-tapped, the primary role is activated.

Useful for keys that need to be held, such as space. @@ -154,7 +263,7 @@

Secondary roles

Double tap timeout + [width]="250"/> Secondary roles /> + + Accept triggers from same half + + + + + + @@ -177,7 +299,7 @@

Miscellaneous

Double tap to lock layer timeout + [width]="250"/> Miscellaneous Keystroke delay + [width]="380"/>

Minimum delay between two consecutive USB reports. Thus, it's possible to slow down keyboard output in case of fast bursts (for example, from the macro engine).

This improves compatibility as many programs (especially RDP clients) have problems accepting too fast input. On the flip side, this limits caret navigation mode sensitivity and introduces (possibly undesired) delays. diff --git a/packages/uhk-web/src/app/components/device/typing-behavior-page/typing-behavior-page.component.scss b/packages/uhk-web/src/app/components/device/typing-behavior-page/typing-behavior-page.component.scss index 3a35dec3bbb..4386a856164 100644 --- a/packages/uhk-web/src/app/components/device/typing-behavior-page/typing-behavior-page.component.scss +++ b/packages/uhk-web/src/app/components/device/typing-behavior-page/typing-behavior-page.component.scss @@ -7,6 +7,12 @@ td:not([colspan='2']):first-of-type { width: 35%; } + + td { + .form-check-label { + min-width: 70px; + } + } } } } diff --git a/packages/uhk-web/src/app/components/device/typing-behavior-page/typing-behavior-page.component.ts b/packages/uhk-web/src/app/components/device/typing-behavior-page/typing-behavior-page.component.ts index 63273ec8c01..84b4a3e3931 100644 --- a/packages/uhk-web/src/app/components/device/typing-behavior-page/typing-behavior-page.component.ts +++ b/packages/uhk-web/src/app/components/device/typing-behavior-page/typing-behavior-page.component.ts @@ -5,6 +5,8 @@ import { Subscription } from 'rxjs'; import { SecondaryRoleStrategy, SecondaryRoleAdvancedStrategyTimeoutAction, + SecondaryRoleAdvancedStrategyTimeoutType, + SecondaryRoleAdvancedStrategyTriggeringEvent, } from 'uhk-common'; import { AppState, getUserConfiguration } from '../../../store'; @@ -23,14 +25,20 @@ export class TypingBehaviorPage implements OnInit, OnDestroy { faSlidersH = faSlidersH; SecondaryRoleStrategy = SecondaryRoleStrategy; SecondaryRoleAdvancedStrategyTimeoutAction = SecondaryRoleAdvancedStrategyTimeoutAction; + SecondaryRoleAdvancedStrategyTriggeringEvent = SecondaryRoleAdvancedStrategyTriggeringEvent; + SecondaryRoleAdvancedStrategyTimeoutType = SecondaryRoleAdvancedStrategyTimeoutType; secondaryRoleStrategy = SecondaryRoleStrategy.Simple; secondaryRoleAdvancedStrategyTimeout = 350; secondaryRoleAdvancedStrategyTimeoutAction = SecondaryRoleAdvancedStrategyTimeoutAction.Secondary; - secondaryRoleAdvancedStrategyTriggerByRelease = true; + secondaryRoleAdvancedStrategyTrigger = SecondaryRoleAdvancedStrategyTriggeringEvent.Release; secondaryRoleAdvancedStrategySafetyMargin = 50; secondaryRoleAdvancedStrategyDoubletapToPrimary = true; secondaryRoleAdvancedStrategyDoubletapTimeout = 200; + secondaryRoleAdvancedStrategyTriggerByMouse = false; + secondaryRoleAdvancedStrategyTriggerFromSameHalf = true; + secondaryRoleAdvancedStrategyMinimumHoldTime = 0; + secondaryRoleAdvancedStrategyTimeoutType = SecondaryRoleAdvancedStrategyTimeoutType.Active; doubletapTimeout = 400; keystrokeDelay = 0; @@ -46,10 +54,14 @@ export class TypingBehaviorPage implements OnInit, OnDestroy { this.secondaryRoleStrategy = config.secondaryRoleStrategy; this.secondaryRoleAdvancedStrategyTimeout = config.secondaryRoleAdvancedStrategyTimeout; this.secondaryRoleAdvancedStrategyTimeoutAction = config.secondaryRoleAdvancedStrategyTimeoutAction; - this.secondaryRoleAdvancedStrategyTriggerByRelease = config.secondaryRoleAdvancedStrategyTriggerByRelease; + this.secondaryRoleAdvancedStrategyTrigger = config.secondaryRoleAdvancedStrategyTrigger; this.secondaryRoleAdvancedStrategySafetyMargin = config.secondaryRoleAdvancedStrategySafetyMargin; this.secondaryRoleAdvancedStrategyDoubletapToPrimary = config.secondaryRoleAdvancedStrategyDoubletapToPrimary; this.secondaryRoleAdvancedStrategyDoubletapTimeout = config.secondaryRoleAdvancedStrategyDoubletapTimeout; + this.secondaryRoleAdvancedStrategyTriggerByMouse = config.secondaryRoleAdvancedStrategyTriggerByMouse; + this.secondaryRoleAdvancedStrategyTriggerFromSameHalf = config.secondaryRoleAdvancedStrategyTriggerFromSameHalf; + this.secondaryRoleAdvancedStrategyMinimumHoldTime = config.secondaryRoleAdvancedStrategyMinimumHoldTime; + this.secondaryRoleAdvancedStrategyTimeoutType = config.secondaryRoleAdvancedStrategyTimeoutType; this.doubletapTimeout = config.doubletapTimeout; this.keystrokeDelay = config.keystrokeDelay;