An experimental native Flipper Zero application to evaluate whether the PSP-era Danzeff 3×3 keyboard is intuitive and fast with the Flipper's five text-entry buttons (D-pad + OK). The hardware Back button is reserved for canceling or leaving the editor, never for deleting text. The keyboard is not a firmware-wide text-input replacement.
- Implemented: single-line, append/backspace ASCII text editor (255 characters)
- Implemented: authentic Danzeff character table, including cases, digits and symbols
- Implemented: two-stage navigation/choice UI with fixed-size minimized cells and edge-anchored 44-48x20 hover expansion
- Implemented: three fixed, timed typing trials and CSV result capture
- Implemented: persistent free-edit draft on the SD card
- Verified: portable keyboard engine passes local C11 unit tests
- Verified by initial tester: v0.1 compiles with uFBT and runs on Flipper Zero.
- Verified by tester: v0.2 renders on-device; inconsistent row reflow motivates v0.3.
- Verified in CI: v0.4 builds using the official release SDK and passes portable tests.
- v0.5 anchors compact cells to the LCD edges.
- v0.6 shortens the drawn whitespace mark from 6×5 to 5×3 pixels without changing the cell layout.
- v0.7 restricts text editing to five buttons and removes hardware Back-to-delete.
- v0.8 uses a compact custom 9×7 pixel ⌫ backspace symbol instead of
<while preserving the on-screen delete action. - v0.9 adds 1px of left/right padding around ⌫ and ⎵ in compact and expanded cells, without changing the visible glyphs or cell dimensions. Physical-device visual verification remains pending.
| Context | Input | Action |
|---|---|---|
| Main menu | Up / Down | Select a menu item |
| Main menu | OK | Open the selection |
| Main menu | Back | Exit app |
| Editor: grid | Short D-pad | Move between 3×3 cells |
| Editor: grid | Hold Left / Right | Previous / next character set (wraps) |
| Editor: grid | Focused cell | Enlarges to show the 4 directional characters |
| Editor: grid | OK short | Select the cell (double-thick border) |
| Editor: choosing | Up / Left / Down / Right | Enter the displayed character, reset focus to center |
| Editor: choosing | Back short | Cancel choice (no text modification) |
| Editor: grid | Back short | Return to menu; save free-edit draft (do not delete) |
| Editor | OK long | Cycle lowercase → uppercase → digits → symbols → extra symbols |
| Editor | Back long | Return to menu; saves free-edit draft |
| Results | OK short | Retry the same phrase |
| Results | Back short | Return to menu |
Deletion is only available through the on-screen keyboard: move to the center cell and press OK → Up to erase one character. A short hardware Back press cannot erase text: it cancels an active selection or leaves the editor. An unfinished typing trial is abandoned when returning to the menu.
The character positions mirror the original PSP implementation: Triangle =
Up, Square = Left, Cross = Down, Circle = Right. The central
lowercase cell is [backspace, m, space, n] in that order. In the cell grid,
⌫ means backspace (drawn as a 9×7-pixel icon); ⎵ indicates space (rendered as a compact 5×3-pixel open-top bracket matching the v0.6 mockup; text storage remains ASCII space). Blank entries in the numbers layer
have no function; they leave the four-way chooser open. A usable 0 has been
added to the numbers layer at center-cell Left. An extra symbol page (EX+)
regroups common ASCII punctuation and digits for quicker access. The original
four Danzeff pages otherwise retain their mappings.
From the default center cell, press Up, Left, OK, Left.
That enters a and returns to the grid with the middle cell highlighted.
A hovered cell previews its four characters in a small directional cross.
All unselected cells remain 40×12 px. Left-column cells start at pixel
x=0, right-column cells end at x=127, and every bottom-row cell ends at
y=63. The grid starts at y=20, preserving the two text-preview lines.
The focused cell expands into the available gutters without resizing any other
cell: 44×20 px on the left or right, or 48×20 px in the middle
(to fill both horizontal gaps). Row positions adjust only as needed to
accommodate the 20-pixel focus. All direction glyphs remain centered. Press
OK to activate the double-thick border; press a direction to type. Non-hovered
cells always keep their four characters inline, so the full layout remains
visible. Canceling selection with Back retains the hovered cell. Choosing an
empty position in the number layer keeps the selection open.
- v0.3: focused row/column widened all cells, which distorted the grid.
- v0.4: all minimized cells became fixed at 40x12, but were still packed together rather than anchored to the outer display edges.
- v0.5 onward: outer columns and bottom row are edge-aligned; the focused cell consumes the empty spaces between compact cells, which keep their original 40x12 size.
In grid mode, hold Left for the previous set and Right for the next set:
abc ↔ ABC ↔ 123 ↔ SYM ↔ EX+ (wraps at either end). Hold OK still
advances one set. The current set is displayed next to the entered-text
preview, even during a timed trial. While choosing a character, normal short
arrow presses still type the expected character; hold Left/Right only switches
sets in grid mode. Horizontal navigation intentionally does not auto-repeat
because a hold switches the page.
This directory is a complete standalone uFBT application project; it does not need to be placed inside a full firmware checkout.
Install the official uFBT tool (on Windows, use PowerShell):
py -m pip install --upgrade ufbtFrom inside the extracted project directory:
ufbt
ufbt launchufbt creates a .fap under dist/. ufbt launch deploys it to a connected
Flipper Zero via USB. The first run downloads the toolchain and official SDK.
For reliability, match the SDK channel with the firmware installed on your
Flipper. If compiling with uFBT locally is inconvenient, the included GitHub
workflow publishes a downloadable .fap build artifact after each push.
To test the portable C core independently on macOS/Linux:
./tests/run.shUse the built-in trial modes and the reproducible protocol in docs/TEST_PROTOCOL.md. The app records the following:
duration_ms: from first physical button press to exact correct completionwpm_x10: gross five-character-standard words per minute, multiplied by 10button_presses: physical presses, including presses that initiate long actionsbackspaces: effective deletionswrong_entries: inserted characters that mismatched the target at insertion timeinsertions: total accepted character insertions, including later-corrected errors
Trial results are appended to results.csv; the free-edit draft is stored in
draft.txt. Both live in the Flipper app data directory, normally
/ext/apps_data/danzeff_lab/ on the microSD card. The editor stores up to
255 ASCII bytes and supports append/backspace only, not cursor insertion or
multiline editing. The app is purpose-built to benchmark keyboard ergonomics,
not to serve as a full-featured notepad.
- Two-button-chord or long-press shortcuts to skip the cell-open step
- A/B testing of v0.1 retained-selection navigation vs v0.2+ home-reset navigation
- Alternative layouts designed specifically for the Flipper D-pad
- In-device comparison against the Flipper's stock text entry mechanism
- Adaptive visual hints and practice indicators
- Cursor editing and richer text buffer, only after input method feasibility
Danzeff Lab acknowledges the authors and maintainers of
Danzeff-G: danzel, Jeff Chen, and
geecko (Clément G). Our foundational four character layouts have been
reviewed against the latest master source (2012-07-04,
daf3c4cd04b264504781d758c38411419d48bca1), not copied as a PSP library.
The BSD 3-Clause copyright and disclaimer are preserved in full at
docs/licenses/DANZEFF-G-LICENSE.txt,
with provenance and port-specific differences in
docs/THIRD_PARTY.md. Our own Flipper-only implementation
is BSD 2-Clause. Attribution is not endorsement by the original authors.