# 关于飞驰人生设备端代码介绍说明

## 功能特征
- 一套程序通过设备号判断进入相应的
- 本程序使用了https://github.com/HardySimpson/zlog 开源库进行日志写入

### 环境要求
- 香橙派使用了wiringPi库，换linux板需要改变
- curl库一般在linux中带有，如果没有带有，也需下载安装

### 代码从哪看起（简版）
- **入口**：`app/main/` 下主程序与线程拉起逻辑。
- **设备型号**：`app/device_identity/` 读设备号 → 调用 `device_init()`。
- **硬件抽象**：`drivers/gpio/`（初始化、`device_gpio_control`）。
- **车型逻辑**：`drivers/devicecontrol/`（各 `car*`、`tank*` 等）。
- **通信与公共模块**：`modules/`（MQTT、日志、线程池等）。
- **完整目录说明**：见文末 **[项目结构与模块职责](#项目结构与模块职责)**。

## 编译和运行
- 本项目使用 CMake 编译，顶层入口为 `CMakeLists.txt`，一级目录 `app/`、`drivers/`、`modules/`、`third_party/` 下也有各自的子 `CMakeLists.txt`。
- 默认编译类型在顶层 `CMakeLists.txt` 中设置：

```cmake
set(CAR_DEFAULT_BUILD_TYPE "Release")
```

- `Release` 为发布模式，会定义 `LOG_PRODUCTION`，日志只保留较高等级输出；`Debug` 为调试模式，日志输出更完整。
- 常规编译，在项目根目录 `/home/orangepi/car/master` 执行：

```bash
cmake -S . -B build
cmake --build build -j2
```

- 临时使用 Debug 编译，不修改 `CMakeLists.txt`，同样在项目根目录执行：

```bash
cmake -S . -B build -DCAR_BUILD_TYPE=Debug
cmake --build build -j2
```

- 如果当前已经在 `build/` 目录里面，则使用：

```bash
cmake -S .. -B . -DCAR_BUILD_TYPE=Debug
cmake --build . -j2
```

- 如果要在源码中长期切换为 Debug，可以把顶层 `CMakeLists.txt` 改为：

```cmake
set(CAR_DEFAULT_BUILD_TYPE "Debug")
```

- 编译完成后，可执行文件位于：

```bash
build/main
```

- 运行：

```bash
./build/main
```

## 设备识别与编号规则
- 设备类型由设备 ID 字符串（如烧录/配置文件中的 14 位号）的第 **3～6** 位四位数字决定，程序里与 `app/device_identity/device_identity.c` 中哈希表键一致（如 `0106`、`0203`）。
- 代码里 `DEVICE_*` 宏与 `g_device_type` / `emergency_code` 对齐（例如小车系 `101`～`106`，坦克 `202`～`207` 等），详见 `drivers/devicecontrol/devcontrol_common.h`、`drivers/gpio/device_init.c`。

## 设备清单（当前代码已注册）

### 陆地车辆（01xx）
| 编号 | 说明 |
|------|------|
| **0101** | 莽牛大车，`car0101`，速度上限约 **150**（尽量不要顶满） |
| **0102** | 莽牛小车，`car0102`，最大速度 **200** |
| **0103** | 挖掘机，`car0103`，最大速度 **200**，按电池电压调速（常见 7.6V 约 **140**） |
| **0104** | 推土机，`car0104`，最大速度 **200**，按电池电压调速 |
| **0105** | 人坐超大车，`car0105`，串口遥控方案，改遥控器后差异较大 |
| **0106** | F1 赛车（双电机大板），`car0106`，**前后**：`val` 最大 **200**，**>50** 才动；刚过阈值起步约 **30%** 占空比，`51～200` 线性升到 **100%**；**左右**：**≥42** 转向，输入上限 **62**，左右固定约 **60%**；软 PWM：前进 **7**、后退 **5**、左转 **24**、右转 **26** |

### 坦克（02xx）
| 编号 | 说明 |
|------|------|
| **0201** | 废弃坦克占位（哈希表里仍有键，业务上可不部署） |
| **0202** | 豹 2，`tank0202`，最大 **200**，按电池调速（7.6V 约 **140**） |
| **0203** | M1A2，`tank0203`，同上 |
| **0204** | 99A 主战等，`tank0204`，同上 |
| **0206** | 可喷水坦克，`tank0206`，约 **3.3V** 电池时速度参考 **80** 左右 |
| **0207** | 可发射水弹坦克，`tank0207` |

> 说明：文档里曾写的 **0205** 与仓库当前 `device_identity` 不一致，线上以代码里 **`0202/0203/0204/0206/0207`** 为准。

### 船舶（03xx）
| 编号 | 说明 |
|------|------|
| **0301** | 船，`ship0301` |
| **0302** | 船，`ship0302`，与 0301 控制逻辑相近、独立设备号 |

### 云台 / 定位（04xx）
| 编号 | 说明 |
|------|------|
| **0401** | 云台炮台，`ptz0401`，有限位 |
| **0403** | GPS 定位设备，`pg0403`，走串口线程 |
| **0404** | 烟花大云台等，`ptz0404`，有限位 |
| **0405** | 云台，`ptz0405`（例如仅射击 pin27 的配置） |
| **0406** | 水枪炮台，`ptz0406`，与 0405 参数可相近但逻辑分离 |

### 机器人（05xx）
| 编号 | 说明 |
|------|------|
| **0501** | 机械狗，`dog0501` |
| **0502** | 六自由度机械臂（CH340 串口总线舵机），`arm0502`，走串口线程 |

## 设备参数速查（沿用原备注）
- tank0202 / tank0203 / tank0204：最大 **200**，根据电池电压调速；原 **7.6V** 约 **140**
- tank0202～0204：眯眼潮玩坦克系列；**0202** 豹 2，**0203** M1A2，**0204** 99A 主战
- tank0206：水枪坦克；原 **3.3V** 约 **80**
- car0101：最大约 **150**，尽量不要顶满
- car0102：小车，最大 **200**
- car0103 / car0104：最大 **200**，按电压调速
- car0105：超大车，串口遥控，功能裁剪较多
- **car0106**：**前后** `val`≤50 停；**>50** 起步约 **30%**，`51～200` 升到 **100%**；**左右** **≥42**、上限 **62**，约 **60%**


## 国内国外二进制介绍(已取消，现在都是拉后端接口)
- mqtt_init.h改变里面的一个MQTT_IPMODE，游览器改变browser_open.h中的BROWSER_MODE

## 关于初始化
- `drivers/gpio/device_init.c`：按设备类型选择 GPIO / 软 PWM 初始化，并设置 `g_device_type`。
- `drivers/gpio/gpio_control.c`：统一输出入口 `device_gpio_control()`，分发到各设备的 pin / softPWM 处理函数。
- `drivers/gpio/gpio_init.c`：wiringPi 与软 PWM 通用初始化。

---

## 项目结构与模块职责

仓库根目录即工程根（例如本机路径 **`/home/orangepi/car/master`**；若在 `ctcar` 副本上开发，则为 **`/home/orangepi/ctcar/master`**，结构一致）。

### 目录树（节选）

```text
master/
├── CMakeLists.txt           # 顶层构建：生成可执行文件 main
├── include/                 # 全局头文件（common、分层聚合头、version.h.in）
├── app/                     # 应用：入口、设备身份、配网/设备变更
├── drivers/                 # 驱动：GPIO、车型控制、传感器、自控逻辑
├── modules/                 # 模块：MQTT、日志、线程池、HTTP 等
├── third_party/             # 第三方：mosquitto、cjson、zlog 等
├── build/                   # CMake 输出目录（可执行文件通常为 build/main）
├── zlog.conf                # zlog 运行时配置（若部署时使用）
└── fcsgdevintroduce.md      # 本文档
```

### 一级目录说明

| 目录 | 职责 |
|------|------|
| **`app/`** | 主程序入口、设备 ID 解析、MQTT topic、WiFi/设备侧配置等与「业务流程」相关的代码。 |
| **`drivers/`** | 与板子相关的驱动与控制：`gpio` 引脚与软 PWM、各车型 `devicecontrol`、传感器、自控逻辑等。 |
| **`modules/`** | 可复用基础能力：MQTT 收发、日志（zlog 封装）、线程池、延时、HTTP/部署辅助等。 |
| **`include/`** | 跨目录公共头文件（如 `common.h`、`drivers_common.h`、`modules_common.h`）。 |
| **`third_party/`** | 第三方库源码或 CMake 子工程（Mosquitto、cJSON、zlog 等）。 |

### 常用子路径（开发时常打开）

| 路径 | 内容 |
|------|------|
| `app/main/` | 程序入口、`main`、线程/任务启动相关。 |
| `app/device_identity/` | 设备号哈希、`device_judg` → `device_init`，MQTT topic 拼接。 |
| `app/device_change/` | 设备侧网络/配置变更等（视具体文件而定）。 |
| `drivers/gpio/` | `device_init.c`、`gpio_control.c`、`gpio_init.c`。 |
| `drivers/devicecontrol/` | 各车型控制（如 `car0106_control.c`）、`devcontrol_common.c` 汇总表。 |
| `modules/mqtt/` | MQTT 订阅发布与消息分发。 |
| `modules/logger/` | 日志封装（配合 zlog）。 |

### 关键文件速查

| 文件 | 作用 |
|------|------|
| `app/device_identity/device_identity.c` | 从设备 ID 字符串取四位型号 → 枚举 → `device_init(DEVICE_xxx)`。 |
| `drivers/gpio/device_init.c` | 按设备配置表初始化 GPIO / 软 PWM，写入 `g_device_type`。 |
| `drivers/devicecontrol/devcontrol_common.c` | 行走控制 `device_walk_control`、急停 `device_stop`、串口类设备 `device_serial_exit_run` 等。 |
| `drivers/gpio/gpio_control.c` | **`device_gpio_control(device_id, pin, val)`**：对外统一写数字 IO 与软 PWM。 |

### 技术栈（摘要）

| 类别 | 选型 |
|------|------|
| 语言 | C（CMake 工程 `LANGUAGES C`） |
| 构建 | CMake，`Release`/`Debug` 见上文编译章节 |
| 通信 | MQTT（Eclipse **Mosquitto**，静态库链接） |
| 板级 IO | **wiringPi**（含 softPWM） |
| 日志 | [**zlog**](https://github.com/HardySimpson/zlog) |
| JSON | **cJSON**（`third_party/cjson`） |

### MQTT 音频播放（`message_type` 2001 等）

- 实现文件：`drivers/sensors/audioplay.c`（`audioplay_mqtt_receive` / `audioplay_cycle`）。
- JSON 字段 `volume` 为 **线性增益**（传给 `ffplay` 的 `volume=` 滤镜）。
- **取值范围**：代码侧钳位为 **`[0, 2]`**（小于 0 按 0，大于 2 按 2）。
- **命令行格式**：`ffplay` 参数中音量格式化为 **`%.3f`**（保留 3 位小数）。

### 阅读顺序建议（给接手同事）

1. `app/device_identity/device_identity.c` → 搞清「设备号如何落到具体车型」。  
2. `drivers/gpio/device_init.c` → 搞清「该车型初始化哪些引脚、软 PWM」。  
3. `drivers/devicecontrol/devcontrol_common.c` + 对应 `*_control.c` → 搞清「遥控数据如何变成电机动作」。  
4. `modules/mqtt/` → 搞清「 topic 与 payload 如何进 `device_walk_control`」。
