#pragma once #include #include #include "protocol.h" #include "animation.h" #include "RobotConfig.h" #include "motorcontrol.h" // ============================================================================ // Animation State // ============================================================================ struct AnimationState { Animation animation; Animation* current = nullptr; PlayMode playMode = PLAY_IDLE; uint8_t repeatsRemaining = 0; uint16_t startFrame = 0; // Frame to start playback from void play(PlayMode mode, uint8_t repeats = 0, uint16_t startFrame = 0); void stop(); }; extern AnimationState animState; // ============================================================================ // Motor Position Streaming State // ============================================================================ struct MotorStreamState { bool active = false; unsigned long lastStreamTime = 0; static constexpr unsigned long STREAM_INTERVAL_MS = 50; void start(); void stop(); bool shouldStream(); }; extern MotorStreamState motorStream; // ============================================================================ // Command Dispatcher // ============================================================================ // Process a received packet - call after receivePacket() returns true void dispatchCommand(); // ============================================================================ // Individual Command Handlers // ============================================================================ // Identity & Config void handleIdent(const uint8_t* payload, uint16_t len); void handleConfig(const uint8_t* payload, uint16_t len); // File Operations void handleFileList(const uint8_t* payload, uint16_t len); void handleFileLoad(const uint8_t* payload, uint16_t len); void handleFileSave(const uint8_t* payload, uint16_t len); void handleFileDelete(const uint8_t* payload, uint16_t len); void handleFilePlay(const uint8_t* payload, uint16_t len); void handleFileStop(const uint8_t* payload, uint16_t len); // Motor Control void handleMotorSet(const uint8_t* payload, uint16_t len); void handleMotorScan(const uint8_t* payload, uint16_t len); void handleMotorWrite(const uint8_t* payload, uint16_t len); void handleMotorStream(const uint8_t* payload, uint16_t len); // System void handleBootloader(const uint8_t* payload, uint16_t len); // ============================================================================ // Helper Functions // ============================================================================ // Send current motor positions void sendMotorPositions(); // Parse animation from payload and save to file bool parseAndSaveAnimation(const uint8_t* payload, uint16_t len, Animation& animation); // Delete a file void deleteFile(fs::FS& fs, const char* path);