63 lines
1.8 KiB
Plaintext
63 lines
1.8 KiB
Plaintext
# 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
|