Draft: shared protocol, remote firmware, project docs
Not yet verified on hardware. - shared/HexapodProtocol: CmdPacket (now 20 bytes, adds remote_roll / remote_pitch), FLAG_* bits and radio settings as the single protocol definition; static payload size = sizeof(CmdPacket) on both radios. - robot: use the shared protocol; vx = forward (harness w/x <-> q/e); InputMapper adds remote tilt on top of the right stick when FLAG_REMOTE_GYRO is set, and robot.ino no longer zeroes stick roll/pitch when it's off. - remote (Teensy 4.1): Sticks (calibration, EEPROM), RemoteIMU, RemoteState (interlocks, link-loss disarm, smoothing), PacketBuilder, RadioLink, NextionUI, SerialConsole. - CLAUDE.md, README.md, remote/README.md, remote/NEXTION.md. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
ad77b06c36
commit
91dac16fca
30 files changed
+1706
-57
No files matched your search
@@ -0,0 +1,59 @@
|
||||
#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_; }
|
||||
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;
|
||||
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();
|
||||
};
|
||||
Reference in new issue
Block a user