Dial editing & upload
Inspection
Section titled “Inspection”uv run fwkit wf-info watchfaces/wf1.bin --treeuv run fwkit wf-res watchfaces/wf1.binuv run fwkit wf-unpack watchfaces/wf1.bin work/wf1wf-unpack writes header.bin, tree.bin, resources/ (decoded PNGs) and raw LZ4 blocks
unless --no-png is used.
Editing
Section titled “Editing”Replacing a single resource by index:
uv run fwkit wf-set-res watchfaces/wf1.bin 0 icon.png -o work/wf1_new.binRebuilding from a directory of NNN_*.png replacements:
uv run fwkit wf-build work/wf1 work/wf1_new.bin --resources work/new_pngs --name "My Dial"The toolkit keeps the original compression format unless --cf is forced. Images stay inside
the original dimensions; the watch does not scale arbitrary layouts.
Installation
Section titled “Installation”Current dials and slots are listed first:
uv run python tools/cmf_watch.py wf-dialsA dry run:
uv run python tools/cmf_watch.py wf-flash --file work/wf1_new.bin --dry-runAppending to a free slot:
uv run python tools/cmf_watch.py wf-flash --file work/wf1_new.binReplacing an existing dial by id:
uv run python tools/cmf_watch.py wf-flash --file work/wf1_new.bin --old-id 0x12345678The reliable update path observed on hardware is delete + append:
uv run python tools/cmf_watch.py wf-delete --id 0x12345678 --file work/wf1_new.binuv run python tools/cmf_watch.py wf-flash --file work/wf1_new.binKnown quirks
Section titled “Known quirks”- The upload handshake is
0x8052→0x9075→ watch pulls with0xA064→0x9064chunks →0xA065→0x9065. - A finish code of
0x0Ameans stored but not activated: all slots full, or--old-idis stale. 0xA055byte 3 read7on the tested unit while the public FMC client hardcodes capacity6. Side-loaded dials are not reported in thewf-dialslist, so an id map is kept separately.- The
.wfdlheader byte+0x17is not fully understood; it is preserved during hand-editing.