# Animation File Format Version 2 - Encoding Specification ## File Structure The file consists of three sections in order: 1. **Filename Block** (optional, for serial transmission) 2. **Header Block** (16 bytes) 3. **Frame Data Block** (variable size) ## Encoding Details ### 1. Filename Block ``` [filename_length: 2 bytes, uint16_t, little-endian] [filename_bytes: N bytes, UTF-8 string] ``` ### 2. Header Block (16 bytes total) ``` [0-3] "ANIM" (4 bytes, ASCII) [4-5] frameCount (2 bytes, uint16_t, little-endian) [6] version (1 byte, uint8_t) = 2 [7] frameRate (1 byte, uint8_t) = FPS [8-15] reserved (8 bytes, all zeros) ``` ### 3. Frame Data Block For each frame (0 to frameCount-1), all motors are stored in the same order: ``` For each frame: For each motor (in consistent order): [motor_id: 1 byte, uint8_t] [position: 2 bytes, uint16_t, little-endian, range 0-4095] ``` **Important**: - All frames contain the same motors in the same order - Motor count = (Frame Data Block size) / (frameCount * 3) - Each motor record is exactly 3 bytes: 1 byte ID + 2 bytes position ## Example File Layout For a file with 100 frames and 20 motors: ``` [0-1] Filename length (2 bytes) [2-N] Filename (N bytes) [N+0-N+3] "ANIM" (4 bytes) [N+4-N+5] 100 (frameCount, 2 bytes) [N+6] 2 (version, 1 byte) [N+7] 24 (frameRate, 1 byte) [N+8-N+15] Reserved (8 bytes) [N+16+] Frame data: Frame 0: [motor0_id][motor0_pos][motor1_id][motor1_pos]...[motor19_id][motor19_pos] Frame 1: [motor0_id][motor0_pos][motor1_id][motor1_pos]...[motor19_id][motor19_pos] ... Frame 99: [motor0_id][motor0_pos][motor1_id][motor1_pos]...[motor19_id][motor19_pos] ``` Total frame data size = 100 frames × 20 motors × 3 bytes = 6,000 bytes