External QMK userspace for Dan's keyboards.
sofle/rev1:ddyobastardkb/charybdis/4x6/splinktegrated_rev1:ddyo
The ddyo keymap adapts an older Elite-C Charybdis shield to a Sea-Picro/Splinky RP2040 controller:
- When changing
keyboards/bastardkb/charybdis/4x6/keymaps/ddyo/keymap.c, ask whether matching changes should also be made in the Argos keymap. - Custom left/right matrix maps use the bottom GP12-GP16 pins, freeing GP26 for the optional FSR and GP21 for trackball CS.
- Handedness on GP27 and USB VBUS detection on GP19.
- The optional GP26 FSR uses selectable Sentinel detectors (v1–v3, Atlas) with console diagnostics.
- Optional GP28 thumb witness is off by default (
FSR_WITNESS_ENABLEto turn on). - Elite-C pin names map to the RP2040 controller so the old shield wiring still works.
- Auto Mouse, precision, drag-scroll, and DPI state come from BastardKB's pointing-device module.
Pinned as Git submodules:
modules/bastardkb, containing BastardKB's Argos and pointing-device modules plus Dan's external VIA dispatch guardmodules/ddyo/fsr_layer, optional FSR Sentinel touch input with a QMK Auto Mouse bridgesrwi/keypeek_layer_notify
The keymap boots with FSR Sentinel v1 as its touch detector. Its technical
evidence identifier remains run7-provisional-v1. WebHID can switch at runtime
to the v2 signal envelope, v3 motion-assisted envelope, or experimental
FSR Atlas Phase v1. Every selection or parameter change resets state and forces
release; reboot returns to v1. The selected Sentinel drives is_fsr_touched()
plus QMK Auto Mouse. V1–v3 use an approximately 20 ms observation cadence;
Atlas uses its editable 1-to-20 ms cadence. See
modules/ddyo/fsr_layer/README.md for
parameters, evidence limits, resistor-tuning guidance, and rollback.
The FSR is sampled every 1 ms. The current keymap emits compact CSV every scan; the non-compact mode buffers samples and flushes on a configurable cadence. Each algorithm applies its own front-end filtering (median-of-three for v1–v3; selectable for Atlas). The current hardware's ADC value rises under touch.
FSR_CAL is an explicit reset, not a calibration. It releases active Sentinel
touch and reinitializes the runtime.
If a touch remains active for FSR_TOUCH_TIMEOUT_SECONDS, the module prints a
warning, resets the Sentinel from the current reading, and forces an FSR
release. QMK then applies its normal Auto Mouse timeout. Set the timeout to 0 or
lower to disable this recovery, although keeping it enabled is highly
recommended.
FSR_CAL/FSRCAL: reset Sentinel and force releaseFSR_TOG/FSRTOG: toggle FSR scanning
Live algorithm and parameter edits persist in the FSR/trackball half’s EEPROM
(debounced ~0.5s after the last change) and restore on reboot, including the
last selected algorithm. Tune them with
tools/fsr-sentinel-web.
With FSR_MOUSE_LAYER defined, is_fsr_touched() is the sole activation signal
for QMK Auto Mouse. The module observes pointing reports so motion-aware
algorithms (v3, Atlas) can use trackball deltas. QMK keeps the layer active
while the FSR remains touched, lets configured mouse keys keep it active
afterward, and then removes it after AUTO_MOUSE_TIME or an eligible normal
key. The current keymap uses a 300 ms hold and 5 ms Auto Mouse debounce. The
FSR module does not call layer_on() or layer_off() itself.
Leave FSR_MOUSE_LAYER undefined to disable the bridge and use
is_fsr_touched() for custom behavior. On a split keyboard, that state is not
currently transported from the sensor half to the master; this keymap assumes
the right sensor half is the master.
For a synchronized Borumi recording, run mise run capture-fsr. Full field
docs and capture steps are in
modules/ddyo/fsr_layer/LOGGING.md.
tools/fsr-sentinel-web— live algorithm/param UI (WebHID); settings persist in EEPROM on the FSR halftools/fsr-normalize— console log → CSV normalizertools/fsr-sentinel-lab— offline v2/v3 search/replay (Codex 2026-08-06)tools/fsr-replay— early edge-detector replay harness
Local captures under fsr-recordings/ are gitignored.
git submodule update --init --recursive
qmk flash -kb sofle/rev1 -km ddyo
qmk flash # guarded Charybdis backup + both halves + restoreThe Charybdis flash task waits for the normal right/trackball half, saves and commits an Argos-compatible JSON backup, flashes the right half and then the left half, then waits for the right half again to restore and verify Argos. A failed backup or commit aborts before QMK runs, and the task does not finish until restoration succeeds.
qmk flash # backup, flash both halves, restore, verify
mise run flash # alias: mise run qf
mise run flash-right # alias: mise run qfr
mise run flash-left # alias: mise run qfl
mise run backup # alias: mise run qbThe current backup is kept beside the keymap at
keyboards/bastardkb/charybdis/4x6/keymaps/ddyo/argos.json. Every successful
changed backup commits only that file as chore: update Argos backup; unchanged
backups do not create empty commits. Unrelated staged and working-tree changes
are left untouched. A custom --output must already be tracked inside this
repository so the same safety guarantee applies. Close Argos and KeyPeek if
another app consumes the Raw HID replies during backup. Use
./bin/flash-charybdis --no-backup only as an explicit emergency bypass.
Mise prepends a repository guard for qmk. In this userspace, qmk flash and an
explicit Charybdis qmk flash -kb ... -km ddyo both route to the backup-first
wrapper. Normal QMK commands and flashes for other keyboards pass through. The
wrapper applies a scoped bypass only after the Argos export succeeds. It starts
each compile without an input prompt and checks USB/HID state while waiting for
the required half. Physical-half detection belongs to the ddyo keymap, not
the Argos module. It uses VIA's custom-get-value request 08 00 DD and returns
1 for right or 0 for left at response offset 3. argosctl uses that keymap
response for the wrapper's --require-right-half backup and restore guards.