#pragma once #include #include "FS.h" #include "FFat.h" #include #include "nodegraph.h" #define NUM_CHANNELS 5 #define FRAMES_PER_SECOND 50 #define MAX_DURATION_SECONDS 10 #define MAX_FRAMES (FRAMES_PER_SECOND * MAX_DURATION_SECONDS) struct AnimationHeader { char magic[4]; // 0–3 ANIM tag uint16_t frameCount; // 4–5 Number of total frames uint8_t version; // 6 uint8_t frameRate; // 7 Frames per second uint8_t reserved[8]; // 8–15 }; struct __attribute__((packed)) CurveSegment { uint8_t motorID; uint16_t startTime;// centiseconds (0.01s) MAX 655.35 seconds uint16_t endTime;// centiseconds (0.01s) MAX 655.35 seconds // remapped from -1 to 1 → 0–65535 int16_t startPointY; uint16_t startHandleX; int16_t startHandleY; uint16_t endHandleX; int16_t endHandleY; int16_t endPointY; }; class Animation { public: Animation(); void setFrame(uint16_t frameIndex, uint16_t channel, uint16_t value); uint16_t getFrame(uint16_t frameIndex, uint16_t channel) const; bool getFramePositions(uint16_t frameIndex, uint16_t* outPositions); void addCurveSegment(const CurveSegment& segment); void clearCurves(uint8_t motorID); void clearAllCurves(); void printCurves(); uint16_t getMotorPosition(uint8_t motorID, uint16_t timeCS); void clear(); //uint16_t* getRawData(); // Optional: for bulk access //size_t getSize() const; bool saveToFile(const char* filename); bool loadFromFile(const char* filename); uint16_t getFrameCount() const; void setFrameCount(uint16_t count); void createBasicSCurve(); void createEaseOutCurve(); AnimationHeader header; NodeGraph nodeGraph; private: //uint16_t data[MAX_FRAMES][NUM_CHANNELS]; std::unordered_map> curves; };