# Model 模块迁移总结

## 已完成的工作

### 1. 创建了 C 版本的 model 模块

**文件**：
- `src/model.h` - 数据模型头文件
- `src/model.c` - 数据模型实现（工具函数）

### 2. 主要数据结构迁移

#### 枚举类型
- `app_state_t` - 应用状态枚举（原 `State`）
- `ant_telemetry_packet_type_t` - ANT 遥测包类型
- `engineering_calibration_mode_t` - 工程校准模式
- `fcs_zero_calibration_state_t` - FCS 零校准状态

#### 基础数据结构
- `milliseconds_t` - 毫秒时间结构
- `vec3f_t` - 3D 向量（浮点型，原模板 `Vec3<T>`）
- `imu_sample_t` - IMU 采样数据
- `adc_vdd_sample_t` - ADC VDD 采样数据
- `adc_strain_sample_t` - ADC 应变采样数据

#### 校准数据结构
- `packed_strain_calibration_set_t` - 应变校准集
- `packed_zero_calibration_set_t` - 零校准集

#### 采样结果结构
- `power_sample_t` - 功率采样（简化版，包含所有必要字段）
- `battery_sample_t` - 电池采样

#### ANT 遥测包结构
- `ant_telemetry_packet_t` - ANT 遥测包（基础）
- `ant_float_packet_t` - ANT 浮点包

#### ESM 包结构
- `esm_telemetry_packet_t` - ESM 遥测包
- `esm_rx_packet_t` - ESM 接收包（基础）
- `strain_calibration_packet_t` - 应变校准包
- `zero_calibration_packet_t` - 零校准包

#### FCS 状态结构
- `fcs_engineering_state_t` - FCS 工程状态
- `fcs_user_state_t` - FCS 用户状态

### 3. 工具函数

- `model_state_name()` - 获取状态名称字符串
- `vec3f_add()` - Vec3 向量加法（内联函数）
- `vec3f_sub()` - Vec3 向量减法（内联函数）
- `vec3f_div()` - Vec3 向量除法（内联函数）
- `packed_zero_calibration_set_add()` - 零校准集加法（内联函数）
- `packed_zero_calibration_set_div()` - 零校准集除法（内联函数）

### 4. 与原 C++ 版本的对比

| C++ 版本 | C 版本 | 说明 |
|---------|--------|------|
| `fsa::model::State` | `app_state_t` | 枚举类型 |
| `template<typename T> Vec3<T>` | `vec3f_t` | 固定为 float 类型 |
| `std::optional<T>` | 使用 `bool` 标志 + 结构体 | 可选类型 |
| `std::array<T, N>` | `T[N]` 或结构体成员 | 数组 |
| `constexpr` 函数 | `static inline` 函数 | 内联函数 |
| 模板特化 | 固定类型实现 | 无模板支持 |
| 操作符重载 | 函数调用 | 无操作符重载 |

### 5. 主要变化

#### Vec3 向量
- **C++ 版本**：模板类 `Vec3<T>`，支持任意类型
- **C 版本**：固定为 `vec3f_t`（float 类型），使用函数操作

#### PowerSample
- **C++ 版本**：包含私有成员和计算函数
- **C 版本**：简化为结构体，所有字段公开，计算逻辑移到外部函数

#### 可选类型
- **C++ 版本**：`std::optional<T>`
- **C 版本**：使用 `bool` 标志 + 结构体，或使用指针（NULL 表示不存在）

### 6. 已更新的文件

- `CMakeLists.txt` - 添加了 `src/model.c`
- `main.c` - 添加了 model 模块测试代码

## 注意事项

1. **模板转换**：C++ 模板转换为固定类型实现（如 `Vec3<T>` -> `vec3f_t`）
2. **操作符重载**：转换为函数调用（如 `a + b` -> `vec3f_add(&a, &b)`）
3. **可选类型**：使用 `bool` 标志或指针表示可选值
4. **结构体对齐**：保持了 `__packed__` 属性，确保与 C++ 版本兼容
5. **初始化宏**：提供了初始化宏，方便使用

## 待完成的工作

### 1. 编译测试
- [ ] 编译项目，检查是否有编译错误
- [ ] 修复可能的编译错误

### 2. 功能验证
- [ ] 测试 Vec3 向量操作
- [ ] 测试状态名称转换
- [ ] 验证结构体大小和对齐

### 3. 后续优化
- [ ] 如果需要，可以添加更多工具函数
- [ ] 可以添加结构体验证函数
- [ ] 可以添加序列化/反序列化函数

## 下一步

1. 编译项目，检查是否有错误
2. 如果编译成功，测试 model 模块功能
3. 如果一切正常，可以继续迁移下一个模块（如 `utils.c` 或驱动模块）

