Files
hexapod-robot/2026-current/remote/RemoteState.h
T

61 lines
2.1 KiB
C++
Raw Normal View History

#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();
};