hunting/middleware/McuManager/README.md
2024-05-14 17:47:44 +08:00

341 lines
11 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 1. 打猎相机外置MCU软件设计
  为满足打猎相机的低功耗需求使用外置MCU的硬件设计框架在非工作状态下保持外置MCU供电CPU断电满足低功耗的产品需求。
## 1.1. 基本概念
* **工作状态:**
| 工作状态 | 说明 |
| ---- | ---- |
| OFF状态 | 整机处于断电状态包括外置MCU和主控。 |
| TEST状态 | 非正常工作状态此时主控常通电除非无操作时自动切换到ON状态。 |
| ON状态 | 设备正常工作状态必须保证低功耗性能PIR触发抓拍后必须快速关机主控断电。 |
**评审补充:**
1. 首次整机上电必须CPU物理上电完成SD卡产测文件检测实现产测功能
2. 动态切换到TEST/ON状态需要CPU物理上电
* **启动模式决定CPU单次启动的任务内容**
  每次启动的时间都是有限的由CPU完成单次启动完成任务后发送断电关机指令给MCUMCU给CPU断开物理电源启动模式可以由CPU主动询问也可以由MCU主动发送。
| 启动模式 | 说明 |
| ---- | ---- |
| PIR启动 | PIR触发启动。 |
| TEST启动 | 三档拨键拨到“TEST”常通电的工作模式。 |
| ON启动 | 三档拨键拨到“ON”正常工作模式。 |
| 连拍启动 | PIR触发场景下用户可以设置连拍的张数和连拍的间隔CPU通过协议告诉MCU在多少时间之后进行连拍启动。 |
| PIR延时启动 | 同PIR启动只是PIR触发后需要延时一段时间再给CPU上电。 |
| 定时启动 | 间隔固定时间启动一次例如60min/次 **待定** |
| 关机启动 | 某种场景下需要关机给CPU上电一次由CPU正式下发“关机”指令。 |
| 低电关机 | 电池低电需要关机给CPU上电一次由CPU正式下发“关机”指令。 |
| 异常启动 | CPU不正常时断电重启例如喂狗异常超时启动异常。 |
  工作模式对应板子上的三档拨键,有三个工作模式:关机/TEST/ON。
**评审补充:**
* 一个PIR连拍周期内忽略PIR触发
## 1.2. MCU基本功能
* 外围连接RTCPIR传感器电量计
* 保存数据包括CPU的启动模式CPU定时启动时间工作时间周期PIR灵敏度
* 使用串口协议与CPU进行数据/功能协议交互;
| 需要保存的数据 | 说明 |
| ---- | ---- |
| 启动模式 | ---- |
| 定时启动时间 | 例如60min/次 |
| 工作时间 | 打猎机正常PIR触发的时间周期例如200 ~ 2000 |
| PIR灵敏度 | PIR灵敏度设置 |
**存疑:**
硬件光敏接在主控上先由主控内置MCU控制正常启动后Linux是否可以复用此GPIO口。
## 1.3. 功能UML时序图
### 1.3.1. 整机物理上电启动
  整机物理上电时,根据实际情况刷新设备的工作状态。
补充:
如果掉电无法保存数据,首次物理上电向主控获取;
默认开启喂狗;
```mermaid
sequenceDiagram
participant CPU
participant MCU
MCU ->> MCU:物理上电
MCU ->> MCU:串口初始化
opt 检测到TEST拨档挡位
MCU ->> CPU:物理上电
MCU ->> +CPU:发送启动模式TEST启动
CPU ->> CPU:TEST启动
CPU -->> -MCU:回复OK
loop 无操作
CPU ->> +MCU:发送关机指令
MCU -->> -CPU:回复OK
MCU ->> CPU:物理断电
end
end
opt 检测到ON拨档挡位
note over MCU:正常工作模式PIR触发后可给主控上电
end
opt PIR触发中断
MCU ->> CPU:物理上电
MCU ->> +CPU:发送PIR触发启动
CPU ->> CPU:PIR启动
CPU -->> -MCU:回复OK
CPU ->> +MCU:发送关机指令
MCU -->> -CPU:回复OK
MCU ->> CPU:物理断电
end
MCU ->> MCU:休眠
note over MCU:休眠后进入正常工作模式当发生PIR触发时<br>给CPU物理上电并发送PIR启动命令
```
### 1.3.2. MCU休眠逻辑
&emsp;&emsp;合理的休眠设计,最大降低产品功耗,延长单次换电的使用周期。
定时中断待确认;
```mermaid
sequenceDiagram
participant CPU
participant MCU
loop 常通电待机
opt CPU关机
CPU ->> MCU:发送关机指令
MCU ->> CPU:物理断电
MCU ->> MCU:休眠
end
opt PIR触发中断
MCU ->> MCU:休眠唤醒
MCU ->> CPU:物理上电
MCU ->> +CPU:发送PIR触发启动
CPU -->> -MCU:回复OK
end
opt TEST按键中断
MCU ->> MCU:休眠唤醒
MCU ->> CPU:物理上电
MCU ->> +CPU:发送TEST启动
CPU -->> -MCU:回复OK
end
opt 设置定时唤醒
CPU ->> MCU:发送设置定时唤醒协议
opt 定时唤醒中断
MCU ->> MCU:休眠唤醒
MCU ->> CPU:物理上电
MCU ->> +CPU:发送定时唤醒启动
CPU -->> -MCU:回复OK
end
end
end
```
### 1.3.3. 常通电待机
&emsp;&emsp;描述上电后的各种场景。
#### 1.3.3.1. 定时唤醒刷新环境数据(**待定,忽略**
&emsp;&emsp;MCU定时唤醒更新环境参数保证工作触发时的环境参数正确性。
```mermaid
sequenceDiagram
participant CPU
participant MCU
loop 常通电待机
loop 大循环定时中断(20min/次)
note over MCU:大循环定时中断负责定时触发小循环定时中断
opt 定时唤醒中断
loop 小循环采集数据1s/次共30次
note over MCU:小循环定时器,短时间间隔唤醒,多次采集环境数据,<br>计算出合理稳定的环境参数并保存,在工作时可快速响应。
MCU ->> MCU:采集环境数据
note right of MCU:采集光敏数据
opt 采集30次完成
note over MCU:计算平均值作为单次采集的真实数据
MCU ->> MCU:计算30次平均值
opt 对比上次发生翻转
MCU ->> MCU:保存最新数据(白天/黑夜)
MCU ->> +CPU:发送数据同步任务
CPU -->> -MCU:回复OK
MCU ->> CPU:物理上电
CPU ->> +MCU:读取白天黑夜数据
MCU -->> -CPU:回复白天黑夜数据
CPU ->> MCU:断电关机
MCU ->> CPU:物理断电
end
end
end
end
end
end
```
#### 1.3.3.2. 喂狗
&emsp;&emsp;外置MCU充当硬件狗在系统异常时断电重启系统。喂狗逻辑和启动模式无关。
默认开启喂狗;
```mermaid
sequenceDiagram
participant CPU
participant MCU
MCU ->> MCU:物理上电
MCU ->> CPU:某种启动模式触发物理上电
opt 主控开启喂狗
CPU ->> +MCU:开启狗/设置喂狗周期
MCU -->> -CPU:回复OK
loop 主控喂狗
note over MCU:喂狗不需要回复
CPU ->> MCU:喂狗
end
loop MCU定时查狗
alt 主控喂狗异常
MCU ->> CPU:断电重启
MCU ->> +CPU:发送启动模式:喂狗异常启动
CPU ->> CPU:喂狗异常启动
CPU -->> -MCU:回复OK
CPU ->> MCU:断电关机
end
end
end
CPU ->> MCU:断电关机
MCU ->> CPU:物理断电
MCU ->> MCU:休眠
note over MCU:休眠后进入正常工作模式当发生PIR触发时<br>给CPU物理上电并发送PIR启动命令
```
#### 1.3.3.3. 心跳
&emsp;&emsp;CPU单次上电时间都是有限的在主控未主动开启喂狗时30s主动查询一次心跳未回复则断电重启。此设计保证程序异常时电量不会一直消耗完。
**注意:** 整机上电之后如果从来未开启过喂狗功能,此功能不生效。避免调试版本不停重启。
取消心跳,默认开启喂狗。喂狗线程模拟主线程心跳;
单次上电时间异常重启总时间3min
```mermaid
sequenceDiagram
participant CPU
participant MCU
MCU ->> MCU:物理上电
MCU ->> CPU:某种启动模式触发物理上电
opt 主控开启喂狗
CPU ->> +MCU:开启狗/设置喂狗周期
MCU -->> -CPU:回复OK
MCU ->> MCU:激活心跳功能
end
CPU ->> MCU:断电关机
MCU ->> CPU:物理断电
MCU ->> MCU:休眠
note over MCU:只要CPU某次启动开启喂狗功能下次启动心跳功能就会生效。
MCU ->> CPU:某种启动模式触发物理上电
opt 心跳功能已经激活
note over MCU:心跳功能在主控未开启喂狗时(异常)发挥作用。
opt 主控未开启喂狗
loop 30s主动查询一次心跳
MCU ->> +CPU:发送心跳包
alt 心跳回复
CPU -->> -MCU:回复OK
else 5s超时 心跳未回复
MCU ->> CPU:断电重启
MCU ->> +CPU:发送启动模式:心跳异常启动
CPU ->> CPU:心跳异常启动
CPU -->> -MCU:回复OK
CPU ->> MCU:断电关机
end
end
end
CPU ->> MCU:断电关机
MCU ->> CPU:物理断电
MCU ->> MCU:休眠
end
```
#### 1.3.3.4. PIR触发任务
&emsp;&emsp;PIR触发是相机的正常工作模式相机会快速启动抓拍并快速关机。
```mermaid
sequenceDiagram
participant CPU
participant MCU
loop 常通电待机
opt PIR触发中断
MCU ->> MCU:休眠唤醒
MCU ->> CPU:物理上电
MCU ->> +CPU:发送PIR触发启动模式
CPU ->> CPU:PIR启动
CPU -->> -MCU:回复OK
CPU ->> MCU:断电关机
MCU ->> CPU:物理断电
MCU ->> MCU:休眠
end
end
```
#### 1.3.3.5. TEST拨键启动
&emsp;&emsp;TEST模式相机处于一个长通电状态功耗较高长时间无操作会进入正常工作状态。
**存疑:** 实际使用时当有人把按键从ON拨到TEST时大概率会先触发PIR启动再触发TEST启动。
```mermaid
sequenceDiagram
participant CPU
participant MCU
MCU ->> MCU:常电待机
opt 拨键从ON拨到TEST
note over MCU:TEST模式启动只会发生在从ON切换到TEST的瞬间<br>如果PIR触发时已经处于TEST挡位此时不影响PIR模式启动
MCU ->> CPU:物理上电
MCU ->> +CPU:发送启动模式TEST启动
CPU ->> CPU:TEST启动
CPU -->> -MCU:回复OK
opt 拨键从TEST拨到ON
note over MCU:进入ON模式设备处于正常工作状态
CPU ->> MCU:发送断电关机
MCU ->> CPU:物理断电
end
opt CPU关机
note over MCU:超时关机时,<br>此时拨键还是处于“TEST”挡位的
CPU ->> MCU:发送断电关机
MCU ->> CPU:物理断电
end
end
MCU ->> MCU:休眠
```
#### 1.3.3.6. 数据同步
&emsp;&emsp;主控和外置MCU之间数据同步包括主控发给外置MCU的也包括外置MCU发给主控的。数据同步流程可以在任意的工作状态下进行。
```mermaid
sequenceDiagram
participant CPU
participant MCU
MCU ->> MCU:物理上电
MCU ->> CPU:某种启动模式触发物理上电
opt 数据同步
note over MCU:此处根据协议只做一个数据示例,其它协议雷同。
CPU ->> +MCU:设置灵敏度
MCU -->> -CPU:回复OK
end
CPU ->> MCU:断电关机
MCU ->> CPU:物理断电
MCU ->> MCU:休眠
note over MCU:休眠后进入正常工作模式当发生PIR触发时<br>给CPU物理上电并发送PIR启动命令
```
## 1.4. MCU协议
&emsp;&emsp;负责对MCU协议进行封包/解包,协议封包/解包功能独立封装成库,详见[协议文档](../../utils/McuProtocol/README.md)。