diff --git a/README.md b/README.md index 1ed4d85..d8ea72b 100644 --- a/README.md +++ b/README.md @@ -84,8 +84,23 @@ for handling some cross-situations when the walk fails between certain keys. It's recommended to learn the walk with `mirrorwalk_nomcc` first and really learn the walk since if you *can* do the walk it's faster than releasing the finger to press the few single-finger chord letters available in my -latest version of mirrorwalk. +latest version of mirrorwalk. +## Twiddler 4 Configs + +The `configs/t4/` folder contains configs for **Twiddler 4** with firmware 3.8.0+. + +- `default.cfg` - Factory default (for reference) +- `mirrorwalk_nomcc.cfg` - Mirrorwalk layout ready to use +- `mirrorwalk_nomcc.json` - For practice at [tutor.mytwiddler.com](https://tutor.mytwiddler.com/tutor2/settings.html) + +**Important**: Twiddler Tuner generates configs with version 0x0107 which crashes +firmware 3.8.0+. The T4 configs here use the correct version 0x0907 and include +system chords for config switching (Thumb Num + Row 4 Middle) and Bluetooth +cycling (Thumb Num + Row 4 Right). + +To install: copy to `1.CFG` on the Twiddler USB storage, unmount, disconnect, +then press T0+F4M to switch configs. ## Cheat-sheet template diff --git a/configs/t4/README.md b/configs/t4/README.md new file mode 100644 index 0000000..50fbb12 --- /dev/null +++ b/configs/t4/README.md @@ -0,0 +1,51 @@ +# Twiddler 4 Configs + +Configuration files for Twiddler 4 with firmware 3.8.0+. + +## Files + +- `default.cfg` - Factory default config (for reference and system chords) +- `mirrorwalk_nomcc.cfg` - Mirrorwalk layout with system chords +- `mirrorwalk_nomcc.json` - Mirrorwalk for Tutor practice (tutor.mytwiddler.com) + +## Installation + +1. Connect Twiddler 4 via USB-C +2. Mount the USB storage (FAT12 filesystem) +3. Copy config to `1.CFG` (or `2.CFG`) +4. Unmount and disconnect USB +5. Press T0+F4M (Thumb Num + Row 4 Middle) to switch configs + +## Important Notes + +### Firmware Version Compatibility + +These configs use format version 0x0907 which is required for firmware 3.8.0+. +Configs generated by Twiddler Tuner use version 0x0107 which will crash the device. + +### System Chords + +The configs include system chords from the default config for: +- Config switching (T0+F4M) +- Bluetooth cycling (T0+F4R) +- Mouse buttons + +Some system chords conflict with mirrorwalk letter positions (p, y, etc.) and are +omitted to preserve the layout. Essential functions (config/BT switching) are preserved. + +### Known Issue: Bluetooth Erase (N+S+4R) + +The Bluetooth erase chord (T14+F4R / N+S+4R) does not work with mirrorwalk_nomcc.cfg +due to a firmware quirk: having N+4L mapped to '0' (HID 0x27) interferes with the +N+S+4R system chord recognition. + +**Workaround**: Switch to `0.CFG` (default config) when you need to erase Bluetooth +pairings, then switch back to your custom config: +1. Press T0+F4M to cycle to config 0 (3 green LEDs) +2. Press N+S+4R to erase Bluetooth pairings (blue scanning animation) +3. Press T0+F4M to return to config 1 + +## Tools + +See https://github.com/yourusername/twiddler for Python tools to convert and +manipulate Twiddler 4 configs. diff --git a/configs/t4/default.cfg b/configs/t4/default.cfg new file mode 100644 index 0000000..f3c1cfa Binary files /dev/null and b/configs/t4/default.cfg differ diff --git a/configs/t4/mirrorwalk_nomcc.cfg b/configs/t4/mirrorwalk_nomcc.cfg new file mode 100644 index 0000000..05d36e5 Binary files /dev/null and b/configs/t4/mirrorwalk_nomcc.cfg differ diff --git a/configs/t4/mirrorwalk_nomcc.json b/configs/t4/mirrorwalk_nomcc.json new file mode 100644 index 0000000..e9de1fe --- /dev/null +++ b/configs/t4/mirrorwalk_nomcc.json @@ -0,0 +1,388 @@ +{ + "chords": [ + { + "chord": "N LOOO", + "key": "7" + }, + { + "chord": "N MOOO", + "key": "8" + }, + { + "chord": "N ROOO", + "key": "9" + }, + { + "chord": "NA LOOO", + "key": "f1" + }, + { + "chord": "NA MOOO", + "key": "f5" + }, + { + "chord": "NA ROOO", + "key": "f9" + }, + { + "chord": "N OLOO", + "key": "4" + }, + { + "chord": "LLOO", + "key": "x" + }, + { + "chord": "N LLOO", + "key": "/" + }, + { + "chord": "MLOO", + "key": "l" + }, + { + "chord": "RLOO", + "key": "q" + }, + { + "chord": "NA OLOO", + "key": "f2" + }, + { + "chord": "N OMOO", + "key": "5" + }, + { + "chord": "LMOO", + "key": "i" + }, + { + "chord": "MMOO", + "key": " " + }, + { + "chord": "N MMOO", + "key": "+" + }, + { + "chord": "RMOO", + "key": "s" + }, + { + "chord": "NA OMOO", + "key": "f6" + }, + { + "chord": "N OROO", + "key": "6" + }, + { + "chord": "LROO", + "key": "v" + }, + { + "chord": "MROO", + "key": "e" + }, + { + "chord": "RROO", + "key": "b" + }, + { + "chord": "N RROO", + "key": "*" + }, + { + "chord": "NA OROO", + "key": "f10" + }, + { + "chord": "N OOLO", + "key": "1" + }, + { + "chord": "LOLO", + "key": "f" + }, + { + "chord": "MOLO", + "key": "r" + }, + { + "chord": "ROLO", + "key": "u" + }, + { + "chord": "NA OOLO", + "key": "f3" + }, + { + "chord": "OLLO", + "key": "p" + }, + { + "chord": "N OLLO", + "key": "=" + }, + { + "chord": "OMLO", + "key": "o" + }, + { + "chord": "ORLO", + "key": "m" + }, + { + "chord": "MRLO", + "key": "left" + }, + { + "chord": "N OOMO", + "key": "2" + }, + { + "chord": "LOMO", + "key": "c" + }, + { + "chord": "MOMO", + "key": "a" + }, + { + "chord": "ROMO", + "key": "w" + }, + { + "chord": "NA OOMO", + "key": "f7" + }, + { + "chord": "OLMO", + "key": "y" + }, + { + "chord": "OMMO", + "key": "t" + }, + { + "chord": "N OMMO", + "key": "-" + }, + { + "chord": "ORMO", + "key": "h" + }, + { + "chord": "MRMO", + "key": "up" + }, + { + "chord": "N OORO", + "key": "3" + }, + { + "chord": "LORO", + "key": "k" + }, + { + "chord": "MORO", + "key": "d" + }, + { + "chord": "RORO", + "key": "j" + }, + { + "chord": "NA OORO", + "key": "f11" + }, + { + "chord": "OLRO", + "key": "z" + }, + { + "chord": "OMRO", + "key": "n" + }, + { + "chord": "ORRO", + "key": "g" + }, + { + "chord": "MRRO", + "key": "right" + }, + { + "chord": "N OOOL", + "key": "0" + }, + { + "chord": "LOOL", + "key": "{" + }, + { + "chord": "ROOL", + "key": "}" + }, + { + "chord": "NA OOOL", + "key": "f4" + }, + { + "chord": "MMOL", + "key": "enter" + }, + { + "chord": "OROL", + "key": "#" + }, + { + "chord": "MROL", + "key": "pageup" + }, + { + "chord": "LOLL", + "key": "capslock" + }, + { + "chord": "LLLL", + "key": "numlock" + }, + { + "chord": "MRLL", + "key": "home" + }, + { + "chord": "OOML", + "key": "\"" + }, + { + "chord": "MRML", + "key": "esc" + }, + { + "chord": "OORL", + "key": "@" + }, + { + "chord": "N OOOM", + "key": "." + }, + { + "chord": "LOOM", + "key": "(" + }, + { + "chord": "ROOM", + "key": ")" + }, + { + "chord": "NA OOOM", + "key": "f8" + }, + { + "chord": "OLOM", + "key": "[" + }, + { + "chord": "OMOM", + "key": "'" + }, + { + "chord": "MMOM", + "key": "backspace" + }, + { + "chord": "OROM", + "key": "]" + }, + { + "chord": "MROM", + "key": "down" + }, + { + "chord": "OOLM", + "key": "<" + }, + { + "chord": "OORM", + "key": ">" + }, + { + "chord": "S OMOM", + "key": "`" + }, + { + "chord": "N OOOR", + "key": "enter" + }, + { + "chord": "LOOR", + "key": "&" + }, + { + "chord": "MOOR", + "key": "*" + }, + { + "chord": "ROOR", + "key": "+" + }, + { + "chord": "NA OOOR", + "key": "f12" + }, + { + "chord": "OLOR", + "key": "|" + }, + { + "chord": "OMOR", + "key": "/" + }, + { + "chord": "MMOR", + "key": "delete" + }, + { + "chord": "OROR", + "key": "-" + }, + { + "chord": "MROR", + "key": "pagedown" + }, + { + "chord": "OOLR", + "key": "^" + }, + { + "chord": "OOMR", + "key": "%" + }, + { + "chord": "MRMR", + "key": "tab" + }, + { + "chord": "OORR", + "key": "=" + }, + { + "chord": "LRRR", + "key": "insert" + }, + { + "chord": "MRRR", + "key": "end" + }, + { + "chord": "S OMOR", + "key": "\\" + }, + { + "chord": "S OROR", + "key": "_" + } + ] +} \ No newline at end of file