peach-menu
OLED menu microservice module for PeachCloud. A state machine which listens for GPIO events (button presses) by subscribing to peach-buttons
over websockets and makes JSON-RPC calls to relevant PeachCloud microservices (peach-network
, peach-oled
, peach-stats
).
Note: This module is a work-in-progress.
Directory Tree
.
├── Cargo.lock
├── Cargo.toml
├── README.md
├── src
│ ├── buttons.rs // JSON-RPC WebSocket client for peach-buttons
│ ├── error.rs // custom MenuError type & From implementations
│ ├── lib.rs // launch state machine & RPC client for buttons
│ ├── main.rs // init logger, call run() & catch application errors
│ ├── network.rs // JSON-RPC HTTP client for peach-network
│ ├── oled.rs // JSON-RPC HTTP client for peach-oled
│ ├── state_machine.rs // state machine & state_changer()
│ ├── states.rs // state-specific logic called by state machine
│ ├── stats.rs // JSON-RPC HTTP client for peach-stats
│ └── structs.rs // data types used by RPC clients
Button Code Mappings
0 => Center,
1 => Left,
2 => Right,
3 => Up,
4 => Down,
5 => A,
6 => B
States
Home(0), // home menu
Home(1), // networking selected
Home(2), // system stats selected
Home(3), // display off selected
Home(4), // shutdown selected
Logo, // logo splash screen
Network, // network device view
NetworkConf(0), // network configuration menu
NetworkConf(1), // client mode selected
NetworkConf(2), // access point mode selected
NetworkMode(0), // client mode activated
NetworkMode(1), // access point mode activated
OledPower(0), // oled display off
OledPower(1), // oled display on
Reboot, // rebooting
Shutdown, // shutting down
Stats, // system statistics view
Setup
Clone this repo:
git clone https://github.com/peachcloud/peach-menu.git
Move into the repo and compile:
cd peach-menu
cargo build --release
Run the binary:
./target/target/peach-menu
Note: Will currently panic if peach_buttons
is not running (connection to ws server fails).
Environment
The JSON-RPC HTTP server address and port for the OLED microservice can be configured with the PEACH_OLED_SERVER
environment variable:
export PEACH_OLED_SERVER=127.0.0.1:5000
When not set, the value defaults to 127.0.0.1:5112
.
Logging is made available with env_logger
:
export RUST_LOG=info
Other logging levels include debug
, warn
and error
.
Resources
This work was made much, much easier by the awesome blog post titled Pretty State Machine Patterns in Rust by hoverbear. Thanks hoverbear!
Licensing
AGPL-3.0