diff --git a/Keypad.Flasher.Client/src/KeypadFlasherApp.tsx b/Keypad.Flasher.Client/src/KeypadFlasherApp.tsx index 87654c8..64320ac 100644 --- a/Keypad.Flasher.Client/src/KeypadFlasherApp.tsx +++ b/Keypad.Flasher.Client/src/KeypadFlasherApp.tsx @@ -504,6 +504,7 @@ export default function KeypadFlasherApp() { const defaultDemoKey = "144-165-233-190"; // 6 Keys 1 Knob const demoOptions = useMemo(() => Object.entries(DEVICE_PROFILES) + .filter(([, profile]) => !profile.hideFromDemo) .map(([key, profile]) => ({ key, name: profile.name, diff --git a/Keypad.Flasher.Client/src/lib/keypad-configs.ts b/Keypad.Flasher.Client/src/lib/keypad-configs.ts index 1bddd26..f71ee88 100644 --- a/Keypad.Flasher.Client/src/lib/keypad-configs.ts +++ b/Keypad.Flasher.Client/src/lib/keypad-configs.ts @@ -60,7 +60,7 @@ export type BindingProfileDto = { encoders: { id: number; clockwise: HidBindingDto; counterClockwise: HidBindingDto; press?: HidBindingDto }[]; }; -export type KnownDeviceProfile = { name: string; layout: DeviceLayoutDto; defaultBindings: BindingProfileDto }; +export type KnownDeviceProfile = { name: string; layout: DeviceLayoutDto; defaultBindings: BindingProfileDto; hideFromDemo?: boolean }; const key = (ch: string, modifiers = 0): HidStepDto => ({ kind: "Key", keycode: ch.charCodeAt(0), modifiers, holdMs: 10, gapMs: 10 }); const fnStep = (fn: string, gapMs = 0): HidStepDto => ({ kind: "Function", functionPointer: fn, gapMs }); @@ -169,6 +169,39 @@ export const DEVICE_PROFILES: Record = { ], }, }, + "165-238-32-190": { + name: "6 Keys 1 Knob (Sikai)", + hideFromDemo: true, + layout: { + buttons: [ + { id: 0, pin: 11, activeLow: true, ledIndex: 0, bootloaderOnBoot: false, bootloaderChordMember: true }, + { id: 1, pin: 17, activeLow: true, ledIndex: 1, bootloaderOnBoot: false, bootloaderChordMember: true }, + { id: 2, pin: 16, activeLow: true, ledIndex: 2, bootloaderOnBoot: false, bootloaderChordMember: true }, + { id: 3, pin: 15, activeLow: true, ledIndex: 3, bootloaderOnBoot: false, bootloaderChordMember: true }, + { id: 4, pin: 14, activeLow: true, ledIndex: 4, bootloaderOnBoot: false, bootloaderChordMember: true }, + { id: 5, pin: 32, activeLow: true, ledIndex: 5, bootloaderOnBoot: false, bootloaderChordMember: true }, + ], + encoders: [ + { id: 0, pinA: 31, pinB: 30, press: { pin: 33, activeLow: true, bootloaderOnBoot: true, bootloaderChordMember: false } }, + ], + neoPixelPin: 34, + neoPixelReversed: false, + displayRows: [3, 3], + }, + defaultBindings: { + buttons: [ + { id: 0, binding: fnBinding("hid_consumer_media_previous") }, + { id: 1, binding: fnBinding("hid_consumer_media_play_pause") }, + { id: 2, binding: fnBinding("hid_consumer_media_next") }, + { id: 3, binding: seq("c", 1) }, + { id: 4, binding: seq("x", 1) }, + { id: 5, binding: seq("v", 1) }, + ], + encoders: [ + { id: 0, clockwise: fnBinding("hid_consumer_volume_up"), counterClockwise: fnBinding("hid_consumer_volume_down"), press: fnBinding("hid_consumer_mute") }, + ], + }, + }, "24-26-109-190": { name: "10 Keys", layout: { diff --git a/README.md b/README.md index 713f687..0e1a302 100644 --- a/README.md +++ b/README.md @@ -87,6 +87,7 @@ They all have USB-C connectors unless otherwise noted: - [3 Keys 1 Knob](https://www.aliexpress.com/item/1005006627901462.html?spm=a2g0o.order_detail.order_detail_item.3.295bf19c3IDC8m) - [4 Keys](https://www.aliexpress.com/item/1005008020501723.html?spm=a2g0o.order_detail.order_detail_item.3.7d51f19cZTzoOY) - [6 Keys 1 Knob](https://www.aliexpress.com/item/1005009812219099.html?spm=a2g0o.order_detail.order_detail_item.3.6afff19cXlayc4) +- [6 Keys 1 Knob (Sikai)](https://sikaicase.com/products/6key-usb-c-macro-programmable-keyboard-osu-one-handed-mechanical-keyboard-with-knobs-6-fully-programmable-keys-hotkeys-rgb-backlit-mini-keypad-for-pc-gamer-1) - [10 Keys](https://www.aliexpress.com/item/1005005509140217.html?spm=a2g0o.order_detail.order_detail_item.7.3c7af19cNrdJJB) - Uses a Micro-USB connector, will need a Micro-USB to USB-C adapter and USB-C cable to use the bootloader adapter / contraption above - Uses fixed blue LEDs that are always on and cannot be controlled by the firmware