#pragma once #include "UiTypes.h" #include "Sticks.h" #include "RemoteIMU.h" #include "SmoothedValue.h" #include "Config.h" // Operator-facing state of the remote: every toggle the touchscreen can // flip, the interlocks around them, and the smoothed setpoints. It does not // know the wire format - PacketBuilder turns this into a CmdPacket. class RemoteState { public: void begin(); // Applies one operator request. Sticks are needed for the arm interlock // and calibration, the IMU for re-zeroing. Returns true if accepted; // rejections leave an explanation in message(). bool handle(const UiEvent& e, Sticks& sticks, RemoteIMU& imu, uint32_t now_ms); // Advances smoothers and link-loss handling. Call once per TX tick. void update(float dt, bool link_ok, uint32_t now_ms); bool armed() const { return armed_; } bool standRequested() const { return stand_; } bool gaitWave() const { return gait_wave_; } bool modeB() const { return mode_b_; } bool rstickXlate() const { return rstick_xlate_; } bool remoteGyro() const { return remote_gyro_; } bool robotGyro() const { return robot_gyro_; } uint8_t speedTarget() const { return speed_target_; } int16_t height() const { return height_; } // -1000..1000, 0 = default uint8_t speedCurrent() const { return (uint8_t)lroundf(speed_.current); } float remoteTiltBlend() const { return tilt_blend_.current; } // 0..1, fades on the gyro toggle const char* message(uint32_t now_ms) const { return now_ms < message_until_ms_ ? message_ : ""; } void setMessage(const char* msg, uint32_t now_ms); void fillView(UiView& v, uint32_t now_ms) const; private: 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_ = SPEED_SCALE_DEFAULT; int16_t height_ = 0; SmoothedValue speed_{SPEED_SCALE_RATE_PER_SEC}; SmoothedValue tilt_blend_{REMOTE_TILT_FADE_PER_SEC}; bool link_was_ok_ = false; const char* message_ = ""; uint32_t message_until_ms_ = 0; void disarm(); };