bec76d67962bd3e55e87e730f5a7ebeed5c5b149
Smaage Frontend Prototype
Install Requirements
uv sync
Run
uv run -m frontend
Navigation
stateDiagram-v2
[*] --> Main
state "Main View<br>(timer + weight)" as Main
state "Menu<br>(carousel)" as Menu
state "Bluetooth Pairing<br>(waiting for connection)" as BTPairing
state "Recipe Selection<br>(carousel)" as RecipeSelection
state "Do Recipe<br>(step-by-step)" as DoRecipe
state "Edit Recipe<br>(step list)" as EditRecipe
state "Edit Recipe – Move Mode<br>(reorder steps)" as MoveMode
state "Edit Step – Type Selection<br>(list view)" as TypeSelect
state "Edit Step – Value Entry<br>(morse input)" as ValueEntry
state "Edit Step – Goal Time Entry<br>(morse input)" as GoalTime
Main --> Menu : both long press
Main --> RecipeSelection : right long press
Menu --> Main : left long press [back]
Menu --> BTPairing : right long press [BT Pair]
BTPairing --> Menu : left long press [cancel]
RecipeSelection --> Main : left long press
RecipeSelection --> DoRecipe : right long press [on recipe → run]
RecipeSelection --> EditRecipe : both long press [on recipe → edit]<br>or right long press [on + → add]
DoRecipe --> Main : left long press [back]<br>or right press [last step → done]
EditRecipe --> RecipeSelection : left long press [back]<br>or right long press [on save]
EditRecipe --> TypeSelect : right long press [on step]<br>or right long press [on + → add step]
EditRecipe --> ValueEntry : right long press [on name]
EditRecipe --> MoveMode : both long press [on step]
MoveMode --> EditRecipe : both long press [confirm]<br>or left long press [cancel]
TypeSelect --> ValueEntry : right long press [type with value]
TypeSelect --> EditRecipe : right long press [type w/o value → saved]<br>or right long press [delete → deleted]<br>or left long press [back]
ValueEntry --> EditRecipe : left long press [save]<br>or left press [cancel]
ValueEntry --> GoalTime : left long press [WEIGH_WITH_TIMER]
GoalTime --> EditRecipe : left long press [save]<br>or left press [cancel]
Tools
export_loading_frames.py
Renders the loading screen animation and exports every unique frame as both PNG files and a NumPy array.
Usage
uv run export_loading_frames.py [--out-dir <directory>]
| Argument | Default | Description |
|---|---|---|
--out-dir |
frames/ |
Directory to write output files into |
Outputs
| File | Description |
|---|---|
frames/frame_XXXX.png |
One PNG per unique frame, zero-padded index |
frames/frames.npy |
NumPy array of shape (N, H, W), dtype bool |
Consecutive duplicate frames are collapsed so only visually distinct frames are exported. The script prints the total number of frames rendered and the number of unique frames kept.
Description
Languages
Python
100%