#pragma once #include // Operator commands. Produced by the Nextion touchscreen (NextionUI) and by // the USB serial console (SerialConsole) through the same path, so the // remote can be fully exercised on the bench without the display attached. enum class UiCmd : uint8_t { None = 0, ToggleArm, Disarm, // unconditional - the big red button ToggleStand, ToggleGait, // tripod <-> wave ToggleWalkMode, // direct (A) <-> heading-hold (B) ToggleRStickXlate, // right stick: rotation <-> translation ToggleRemoteGyro, ToggleRobotGyro, SetSpeed, // value = 0..255 SpeedUp, // serial console only SpeedDown, // serial console only ZeroGyro, // capture the handset's current attitude as "level" CalStartSave, // start sweep calibration, or save it if running CalCancel, }; struct UiEvent { UiCmd cmd = UiCmd::None; uint8_t value = 0; }; // Everything the display shows. The remote is authoritative: the Nextion // only sends requests, and always renders what's in here. struct UiView { bool armed = false; bool stand = false; bool gait_wave = false; bool mode_b = false; bool rstick_xlate = false; bool remote_gyro = false; bool robot_gyro = false; bool calibrating = false; uint8_t speed_target = 0; bool link_ok = false; uint8_t link_pct = 0; const char* message = ""; // always a string literal - NextionUI diffs it by pointer };