From 96ed8484704316acba8fc94ba2d9c30e2987a9b7 Mon Sep 17 00:00:00 2001
From: Fancy code <258828110.@qq.com>
Date: Wed, 15 May 2024 08:57:03 +0800
Subject: [PATCH 1/3] Backup.
---
middleware/McuManager/README.md | 109 +++++++++++++-------------------
utils/McuProtocol/README.md | 17 +++--
2 files changed, 57 insertions(+), 69 deletions(-)
diff --git a/middleware/McuManager/README.md b/middleware/McuManager/README.md
index 3863ba5a..d8768efa 100644
--- a/middleware/McuManager/README.md
+++ b/middleware/McuManager/README.md
@@ -66,39 +66,48 @@
整机物理上电时,根据实际情况刷新设备的工作状态。
-补充:
-如果掉电无法保存数据,首次物理上电向主控获取;
-默认开启喂狗;
-
```mermaid
sequenceDiagram
participant CPU
participant MCU
MCU ->> MCU:物理上电
MCU ->> MCU:串口初始化
-opt 检测到TEST拨档挡位
+alt 检测到TEST拨档挡位
MCU ->> CPU:物理上电
- MCU ->> +CPU:发送启动模式:TEST启动
- CPU ->> CPU:TEST启动
- CPU -->> -MCU:回复OK
+ CPU ->> +MCU:查询启动模式
+ MCU -->> -CPU:回复TEST启动
+ CPU ->> CPU:TEST启动
loop 无操作
- CPU ->> +MCU:发送关机指令
- MCU -->> -CPU:回复OK
+ CPU ->> MCU:发送关机指令
MCU ->> CPU:物理断电
end
-end
-opt 检测到ON拨档挡位
+else 检测到ON拨档挡位
note over MCU:正常工作模式,PIR触发后可给主控上电
+ MCU ->> CPU:物理上电
+ CPU ->> +MCU:查询启动模式
+ MCU -->> -CPU:回复ON启动
+ CPU ->> CPU:ON启动
+ CPU ->> MCU:发送关机指令
+ MCU ->> CPU:物理断电
end
opt PIR触发中断
MCU ->> CPU:物理上电
MCU ->> +CPU:发送PIR触发启动
CPU ->> CPU:PIR启动
CPU -->> -MCU:回复OK
- CPU ->> +MCU:发送关机指令
- MCU -->> -CPU:回复OK
+ CPU ->> MCU:发送关机指令
MCU ->> CPU:物理断电
end
+loop 默认开启喂狗
+ opt 喂狗超时
+ MCU ->> CPU:断电重启
+ MCU ->> +CPU:发送启动模式:喂狗异常启动
+ CPU ->> CPU:异常启动
+ CPU -->> -MCU:回复OK
+ CPU ->> MCU:发送关机指令
+ MCU ->> CPU:物理断电
+ end
+end
MCU ->> MCU:休眠
note over MCU:休眠后进入正常工作模式:当发生PIR触发时,
给CPU物理上电并发送PIR启动命令
```
@@ -187,29 +196,28 @@ end
外置MCU充当硬件狗,在系统异常时断电重启系统。喂狗逻辑和启动模式无关。
-默认开启喂狗;
-
```mermaid
sequenceDiagram
participant CPU
participant MCU
MCU ->> MCU:物理上电
MCU ->> CPU:某种启动模式触发物理上电
-opt 主控开启喂狗
- CPU ->> +MCU:开启狗/设置喂狗周期
- MCU -->> -CPU:回复OK
- loop 主控喂狗
+loop 默认开启喂狗
+ opt 设置喂狗周期
+ note over CPU:主控选择性设置喂狗周期
+ CPU ->> +MCU:开启狗/设置喂狗周期
+ MCU -->> -CPU:回复OK
+ end
+ opt 主控喂狗
note over MCU:喂狗不需要回复
CPU ->> MCU:喂狗
end
- loop MCU定时查狗
- alt 主控喂狗异常
- MCU ->> CPU:断电重启
- MCU ->> +CPU:发送启动模式:喂狗异常启动
- CPU ->> CPU:喂狗异常启动
- CPU -->> -MCU:回复OK
- CPU ->> MCU:断电关机
- end
+ alt 主控喂狗异常
+ MCU ->> CPU:断电重启
+ MCU ->> +CPU:发送启动模式:喂狗异常启动
+ CPU ->> CPU:喂狗异常启动
+ CPU -->> -MCU:回复OK
+ CPU ->> MCU:断电关机
end
end
CPU ->> MCU:断电关机
@@ -218,14 +226,9 @@ MCU ->> MCU:休眠
note over MCU:休眠后进入正常工作模式:当发生PIR触发时,
给CPU物理上电并发送PIR启动命令
```
-#### 1.3.3.3. 心跳
+#### 1.3.3.3. 超时异常启动
- CPU单次上电时间都是有限的,在主控未主动开启喂狗时,30s主动查询一次心跳,未回复则断电重启。此设计保证程序异常时电量不会一直消耗完。
-
-**注意:** 整机上电之后如果从来未开启过喂狗功能,此功能不生效。避免调试版本不停重启。
-
-取消心跳,默认开启喂狗。喂狗线程模拟主线程心跳;
-单次上电时间异常重启,总时间3min;
+ CPU单次上电时间都是有限的,在主控未正常发送关机指令时,3min后断电进行异常启动。
```mermaid
sequenceDiagram
@@ -233,37 +236,15 @@ participant CPU
participant MCU
MCU ->> MCU:物理上电
MCU ->> CPU:某种启动模式触发物理上电
-opt 主控开启喂狗
- CPU ->> +MCU:开启狗/设置喂狗周期
- MCU -->> -CPU:回复OK
- MCU ->> MCU:激活心跳功能
+opt 主控未正常发送关机指令
+ MCU ->> CPU:物理断电
+ MCU ->> +CPU:发送启动模式:喂狗异常启动
+ CPU ->> CPU:喂狗异常启动
+ CPU -->> -MCU:回复OK
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触发任务
@@ -331,8 +312,8 @@ MCU ->> MCU:物理上电
MCU ->> CPU:某种启动模式触发物理上电
opt 数据同步
note over MCU:此处根据协议只做一个数据示例,其它协议雷同。
- CPU ->> +MCU:设置灵敏度
- MCU -->> -CPU:回复OK
+ MCU ->> +CPU:获取灵敏度
+ CPU -->> -MCU:回复数据
end
CPU ->> MCU:断电关机
MCU ->> CPU:物理断电
diff --git a/utils/McuProtocol/README.md b/utils/McuProtocol/README.md
index 117864b7..c7520d3c 100644
--- a/utils/McuProtocol/README.md
+++ b/utils/McuProtocol/README.md
@@ -129,8 +129,8 @@ unsigned short calculate_check_sum(const unsigned char* pData, unsigned short le
| ---- | ---- | ---- | ---- | ---- | ---- |
| 0x8101 | ask | - | - | 获取启动模式 | - |
| 0x0101 | - | reply | Data[0]:启动模式
0x01:PIR启动
0x02:TEST启动
0x03:ON启动
0x04:连拍启动
0x05:PIR延时启动
0x06:定时(间隔一定时间)启动
0x07:关机
0x08:低电关机
0x09:异常启动 | 回复启动模式 | 异常启动数据:Data[1]
0x00:喂狗异常启动
0x01:超时异常启动 |
-| 0x8102 | ask | - | - | 断电关机 | - |
-| 0x8103 | ask | - | - | 喂狗 | - |
+| 0x8102 | ask | - | - | 断电关机 | 断电关机不用回复 |
+| 0x8103 | ask | - | - | 喂狗 | 喂狗不用回复 |
| 0x8104 | ask | - | Data[2]:两字节的数字,单位s | 设置喂狗周期 | 0s代表关闭喂狗 修改为两个字节,单位s |
| 0x0104 | - | reply | Data[0]:结果
0x01:成功
0x02:失败 | 设置喂狗周期回复 | - |
| 0x8105 | ask | - | - | 关闭狗 | 取消 |
@@ -141,8 +141,8 @@ unsigned short calculate_check_sum(const unsigned char* pData, unsigned short le
| 0x0107 | - | reply | Data[0]:结果
0x01:成功
0x02:失败 | 设置日期和时间回复 | - |
| 0x8108 | ask | - | Data[0]:灵敏度
0-9 | 设置PIR灵敏度 | - |
| 0x0108 | - | reply | Data[0]:结果
0x01:成功
0x02:失败 | 设置PIR灵敏度回复 | - |
-| 0x8109 | ask | - | Data[0]:Hour
0-23
Data[1]:Min
0-59
Data[2]:Sec
0-59 | 设置连拍间隔 | - |
-| 0x0109 | - | reply | Data[0]:结果
0x01:成功
0x02:失败 | 设置连拍间隔回复 | - |
+| 0x8109 | ask | - | Data[0]:连拍间隔,单位s | 设置连拍启动 | 设置连拍启动后会立即关机,一般连拍间隔较大时使用该功能,连拍间隔较小时Linux单次完成连拍。 |
+| 0x0109 | - | reply | Data[0]:结果
0x01:成功
0x02:失败 | 设置连拍启动回复 | - |
| 0x810A | ask | - | Data[0]:控制模式
0-关闭红外灯
1-开启红外灯 | 红外灯控制 | 取消 |
| 0x010A | - | reply | Data[0]:结果
0x01:成功
0x02:失败 | 红外灯控制回复 | 取消 |
| 0x810B | ask | - | - | 获取光敏值 | 取消 |
@@ -152,9 +152,16 @@ unsigned short calculate_check_sum(const unsigned char* pData, unsigned short le
| 0x4101 | - | ask | Data[0]:启动模式
0x01:PIR启动
0x02:TEST启动
0x03:ON启动
0x04:连拍启动
0x05:PIR延时启动
0x06:定时(间隔一定时间)启动
0x07:关机
0x08:低电关机
0x09:异常启动 | 发送启动模式 | 异常启动数据:Data[1]
0x00:喂狗异常启动
0x01:超时异常启动 |
| 0xC102 | reply | - | - | 回复心跳包 | 取消 |
| 0x4102 | - | ask | - | 发送心跳包 | 取消 |
+| 0xC106 | reply | - | Data[0]:Hour
0-23
Data[1]:Min
0-59
Data[2]:Sec
0-59 | 回复获取间隔启动时间 | - |
+| 0x4106 | - | ask | - | 获取间隔启动时间 | - |
+| 0xC107 | reply | - | Data[0]:Year
Data[1]:Mon
1-12
Data[2]:Day
0-31
Data[3]:Hour
0-23
Data[4]:Min
0-59
Data[5]:Sec
0-59 | 回复获取日期和时间 | - |
+| 0x4107 | - | ask | - | 获取日期和时间 | - |
+| 0xC108 | reply | - | Data[0]:灵敏度
0-9 | 回复获取PIR灵敏度 | - |
+| 0x4108 | - | ask | - | 获取PIR灵敏度 | - |
### 1.2.1. 名词解析
| 名词 | 解析 |
| ---- | ---- |
-| 超时异常启动 | MCU给主控上电后(**非TEST启动**),不管主控是否正常喂狗,如果单次上电时长超过3min未关机,给主控断电重启一次。 |
\ No newline at end of file
+| 超时异常启动 | MCU给主控上电后(**非TEST启动**),不管主控是否正常喂狗,如果单次上电时长超过3min未关机,给主控断电重启一次。 |
+| 间隔启动时间 | 例如:60min/次。 |
\ No newline at end of file
From 073087411b7ccc87ab6f47e71848853006fa5f83 Mon Sep 17 00:00:00 2001
From: Fancy code <258828110.@qq.com>
Date: Wed, 15 May 2024 11:22:37 +0800
Subject: [PATCH 2/3] Improve:External Mcu design.
---
middleware/McuManager/README.md | 163 +++++++++++++++++++++-----------
1 file changed, 106 insertions(+), 57 deletions(-)
diff --git a/middleware/McuManager/README.md b/middleware/McuManager/README.md
index d8768efa..091c3403 100644
--- a/middleware/McuManager/README.md
+++ b/middleware/McuManager/README.md
@@ -2,9 +2,10 @@
为满足打猎相机的低功耗需求,使用外置MCU的硬件设计框架,在非工作状态下保持外置MCU供电,CPU断电,满足低功耗的产品需求。
-| 修改 | 说明 |
-| ---- | ---- |
-| 2024-5-14 | 首次评审。 |
+| 版本 | 时间 | 说明 |
+| ---- | ---- | ---- |
+| V1.0 | 2024-5-14 | 首次评审。 |
+| V1.1 | 2024-5-15 | 完善时序图。 |
## 1.1. 基本概念
@@ -64,18 +65,17 @@
### 1.3.1. 整机物理上电启动
- 整机物理上电时,根据实际情况刷新设备的工作状态。
+ 整机物理上电时,设备一定会进入TEST或者ON状态,主控Linux启动一次。
```mermaid
sequenceDiagram
participant CPU
participant MCU
MCU ->> MCU:物理上电
-MCU ->> MCU:串口初始化
+MCU ->> CPU:物理上电
+CPU ->> MCU:查询启动模式
alt 检测到TEST拨档挡位
- MCU ->> CPU:物理上电
- CPU ->> +MCU:查询启动模式
- MCU -->> -CPU:回复TEST启动
+ MCU -->> CPU:回复TEST启动
CPU ->> CPU:TEST启动
loop 无操作
CPU ->> MCU:发送关机指令
@@ -83,27 +83,16 @@ alt 检测到TEST拨档挡位
end
else 检测到ON拨档挡位
note over MCU:正常工作模式,PIR触发后可给主控上电
- MCU ->> CPU:物理上电
- CPU ->> +MCU:查询启动模式
- MCU -->> -CPU:回复ON启动
+ MCU -->> CPU:回复ON启动
CPU ->> CPU:ON启动
CPU ->> MCU:发送关机指令
MCU ->> CPU:物理断电
end
-opt PIR触发中断
- MCU ->> CPU:物理上电
- MCU ->> +CPU:发送PIR触发启动
- CPU ->> CPU:PIR启动
- CPU -->> -MCU:回复OK
- CPU ->> MCU:发送关机指令
- MCU ->> CPU:物理断电
-end
loop 默认开启喂狗
opt 喂狗超时
MCU ->> CPU:断电重启
- MCU ->> +CPU:发送启动模式:喂狗异常启动
- CPU ->> CPU:异常启动
- CPU -->> -MCU:回复OK
+ CPU ->> +MCU:查询启动模式
+ MCU -->> -CPU:回复喂狗异常启动
CPU ->> MCU:发送关机指令
MCU ->> CPU:物理断电
end
@@ -123,32 +112,28 @@ 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
+ CPU ->> +MCU:查询启动模式
+ MCU -->> -CPU:回复PIR启动
end
- opt TEST按键中断
+ opt TEST/ON按键中断
MCU ->> MCU:休眠唤醒
MCU ->> CPU:物理上电
- MCU ->> +CPU:发送TEST启动
- CPU -->> -MCU:回复OK
+ CPU ->> +MCU:查询启动模式
+ MCU -->> -CPU:回复TEST/ON启动
end
opt 设置定时唤醒
CPU ->> MCU:发送设置定时唤醒协议
opt 定时唤醒中断
MCU ->> MCU:休眠唤醒
MCU ->> CPU:物理上电
- MCU ->> +CPU:发送定时唤醒启动
- CPU -->> -MCU:回复OK
+ CPU ->> +MCU:查询启动模式
+ MCU -->> -CPU:回复喂狗异常启动
end
end
+ MCU ->> MCU:休眠
end
```
@@ -214,9 +199,8 @@ loop 默认开启喂狗
end
alt 主控喂狗异常
MCU ->> CPU:断电重启
- MCU ->> +CPU:发送启动模式:喂狗异常启动
- CPU ->> CPU:喂狗异常启动
- CPU -->> -MCU:回复OK
+ CPU ->> +MCU:查询启动模式
+ MCU -->> -CPU:回复喂狗异常启动
CPU ->> MCU:断电关机
end
end
@@ -228,7 +212,7 @@ note over MCU:休眠后进入正常工作模式:当发生PIR触发时,
#### 1.3.3.3. 超时异常启动
- CPU单次上电时间都是有限的,在主控未正常发送关机指令时,3min后断电进行异常启动。
+ CPU单次上电时间都是有限的,在主控未正常发送关机指令时,3min后断电进行异常启动。TEST/产测模式等需要一直开机的场景,主控关闭喂狗功能即可。
```mermaid
sequenceDiagram
@@ -236,11 +220,13 @@ participant CPU
participant MCU
MCU ->> MCU:物理上电
MCU ->> CPU:某种启动模式触发物理上电
-opt 主控未正常发送关机指令
- MCU ->> CPU:物理断电
- MCU ->> +CPU:发送启动模式:喂狗异常启动
- CPU ->> CPU:喂狗异常启动
- CPU -->> -MCU:回复OK
+alt 主控未关闭喂狗
+note over MCU:如果主控关闭喂狗的功能,
也同时关闭超时异常启动功能
+ opt 主控未正常发送关机指令
+ MCU ->> CPU:物理断电
+ CPU ->> +MCU:查询启动模式
+ MCU -->> -CPU:回复喂狗异常启动
+ end
end
CPU ->> MCU:断电关机
MCU ->> CPU:物理断电
@@ -259,9 +245,9 @@ loop 常通电待机
opt PIR触发中断
MCU ->> MCU:休眠唤醒
MCU ->> CPU:物理上电
- MCU ->> +CPU:发送PIR触发启动模式
- CPU ->> CPU:PIR启动
- CPU -->> -MCU:回复OK
+ CPU ->> +MCU:查询启动模式
+ MCU -->> -CPU:回复PIR触发启动
+ CPU ->> CPU:Do something
CPU ->> MCU:断电关机
MCU ->> CPU:物理断电
MCU ->> MCU:休眠
@@ -280,17 +266,12 @@ sequenceDiagram
participant CPU
participant MCU
MCU ->> MCU:常电待机
-opt 拨键从ON拨到TEST
-note over MCU:TEST模式启动,只会发生在从ON切换到TEST的瞬间,
如果PIR触发时,已经处于TEST挡位,此时不影响PIR模式启动
+opt 拨键从ON/OFF拨到TEST
+note over MCU:TEST模式启动,只会发生在从ON/OFF切换到TEST的瞬间,
如果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
+ CPU ->> +MCU:查询启动模式
+ MCU -->> -CPU:回复TEST启动
+ CPU ->> CPU:Do something
opt CPU关机
note over MCU:超时关机时,
此时拨键还是处于“TEST”挡位的
CPU ->> MCU:发送断电关机
@@ -300,7 +281,69 @@ end
MCU ->> MCU:休眠
```
-#### 1.3.3.6. 数据同步
+#### 1.3.3.6. 主控通电时发生启动事件
+
+ 如果主控在通电后(主控发送关机指令之前)发生启动事件的动态变化,需要先主动发送启动事件,有主控发送关机指令后,再断电重启触发新的启动事件。
+
+```mermaid
+sequenceDiagram
+participant CPU
+participant MCU
+MCU ->> MCU:主控已经上电,常电待机
+note over MCU:此处不管由于何总原因的主控上电,
如果发生启动事件动态变化,需要先发送启动命令给主控
+opt 拨键从ON拨到TEST
+ MCU ->> +CPU:发送启动模式:TEST启动
+ CPU ->> CPU:Do something
+ CPU -->> -MCU:回复OK
+ CPU ->> MCU:发送断电关机
+ MCU ->> CPU:物理断电重启
+ CPU ->> +MCU:查询启动模式
+ MCU -->> -CPU:回复TEST启动
+ CPU ->> CPU:TEST启动
+ opt CPU关机
+ note over MCU:超时关机时,
此时拨键还是处于“TEST”挡位的
+ CPU ->> MCU:发送断电关机
+ MCU ->> CPU:物理断电
+ end
+end
+opt 拨键从TEST拨到ON
+ MCU ->> +CPU:发送启动模式:ON启动
+ CPU ->> CPU:Do something
+ CPU -->> -MCU:回复OK
+ CPU ->> MCU:发送断电关机
+ MCU ->> CPU:物理断电重启
+ CPU ->> +MCU:查询启动模式
+ MCU -->> -CPU:回复ON启动
+ CPU ->> CPU:ON启动
+ opt CPU关机
+ CPU ->> MCU:发送断电关机
+ MCU ->> CPU:物理断电
+ end
+end
+opt PIR触发
+note over MCU:上电后发生PIR触发,主控立即处理抓拍流程,无需断电重启。
+ MCU ->> +CPU:发送启动模式:PIR启动
+ CPU ->> CPU:Do something
+ CPU -->> -MCU:回复OK
+ opt CPU关机
+ CPU ->> MCU:发送断电关机
+ MCU ->> CPU:物理断电
+ end
+end
+opt 定时启动
+note over MCU:上电后发生定时启动,主控立即处理抓拍流程,无需断电重启。
+ MCU ->> +CPU:发送启动模式:定时启动
+ CPU ->> CPU:Do something
+ CPU -->> -MCU:回复OK
+ opt CPU关机
+ CPU ->> MCU:发送断电关机
+ MCU ->> CPU:物理断电
+ end
+end
+MCU ->> MCU:休眠
+```
+
+#### 1.3.3.7. 数据同步
主控和外置MCU之间数据同步,包括主控发给外置MCU的,也包括外置MCU发给主控的。数据同步流程可以在任意的工作状态下进行。
@@ -321,6 +364,12 @@ MCU ->> MCU:休眠
note over MCU:休眠后进入正常工作模式:当发生PIR触发时,
给CPU物理上电并发送PIR启动命令
```
+### 1.3.4. 连拍
+
+ 打猎机可以设置连拍张数和连拍间隔。连拍张数1-3,连拍间隔0-60s;
+
+**备注:竞品的连拍间隔为0/1/2s。先做0/1/2s连拍,此时与外置MCU无关。**
+
## 1.4. MCU协议
负责对MCU协议进行封包/解包,协议封包/解包功能独立封装成库,详见[协议文档](../../utils/McuProtocol/README.md)。
\ No newline at end of file
From 049521bad1cedac14d1545c30aba7b1394d0388d Mon Sep 17 00:00:00 2001
From: Fancy code <258828110.@qq.com>
Date: Wed, 15 May 2024 16:12:34 +0800
Subject: [PATCH 3/3] Improve:mcu manager recv function.
---
middleware/McuManager/include/IMcuManager.h | 69 +++++----
middleware/McuManager/src/IMcuManager.cpp | 42 +++++-
middleware/McuManager/src/McuManagerImpl.cpp | 138 +++++++++++-------
middleware/McuManager/src/McuManagerImpl.h | 19 ++-
.../McuManager/src/McuManager_Test.cpp | 2 +-
.../src_mock/McuManager_Mock_Test.cpp | 10 +-
utils/McuProtocol/include/McuProtocol.h | 11 +-
utils/McuProtocol/src/McuProtocol.cpp | 17 ++-
utils/McuProtocol/src/ProtocolHandle.cpp | 15 ++
utils/McuProtocol/src/ProtocolHandle.h | 13 +-
10 files changed, 234 insertions(+), 102 deletions(-)
diff --git a/middleware/McuManager/include/IMcuManager.h b/middleware/McuManager/include/IMcuManager.h
index 097e49dd..2cb992eb 100644
--- a/middleware/McuManager/include/IMcuManager.h
+++ b/middleware/McuManager/include/IMcuManager.h
@@ -42,41 +42,33 @@ enum class ControlLight
};
typedef struct mcu_ask_date_time
{
+ mcu_ask_date_time(const unsigned short year, const unsigned char mon, const unsigned char day,
+ const unsigned char hour, const unsigned char min, const unsigned char second);
const unsigned short mYear;
const unsigned char mMon;
const unsigned char mDay;
const unsigned char mHour;
const unsigned char mMin;
const unsigned char mSecond;
- mcu_ask_date_time(const unsigned short year, const unsigned char mon, const unsigned char day,
- const unsigned char hour, const unsigned char min, const unsigned char second)
- : mYear(year), mMon(mon), mDay(day), mHour(hour), mMin(min), mSecond(second)
- {
- }
} McuAskDateTime;
+typedef struct mcu_get_interval_start
+{
+ mcu_get_interval_start();
+ unsigned int mIntervalStart;
+} McuGetIntervalStart;
+/**
+ * @brief The application sends data to the MCU.
+ *
+ */
class VMcuAsk
{
public:
- VMcuAsk()
- {
- mSerialNumber = 0;
- }
+ VMcuAsk();
virtual ~VMcuAsk() = default;
- virtual ASK_RESULT Blocking(void)
- {
- return ASK_RESULT::END;
- }
- virtual bool NeedReply(void)
- {
- return false;
- }
- virtual void ReplyFinished(const bool result)
- {
- }
- virtual bool IfTimeout(const unsigned int &integrationTimeMs)
- {
- return false;
- }
+ virtual ASK_RESULT Blocking(void);
+ virtual bool NeedReply(void);
+ virtual void ReplyFinished(const bool result);
+ virtual bool IfTimeout(const unsigned int &integrationTimeMs);
public:
/**
@@ -96,13 +88,38 @@ public:
public:
T mDataReply;
};
+/**
+ * @brief Report the data received by the serial port to the application.
+ *
+ */
+class VMcuRecv
+{
+public:
+ VMcuRecv() = default;
+ virtual ~VMcuRecv() = default;
+ virtual void ReplyFinished(const bool result);
+};
+template
+class McuRecv : public VMcuRecv
+{
+
+public:
+ McuRecv() = default;
+ virtual ~McuRecv() = default;
+
+public:
+ T mDataRecvReply; ///< It includes both the data received by the serial port and the data replied to.
+};
class VMcuMonitor
{
public:
VMcuMonitor() = default;
virtual ~VMcuMonitor() = default;
- virtual void RecvIpcMissionEvent(std::shared_ptr &recv, const IpcMission &mission);
- virtual void RecvMcuHeartBeat(std::shared_ptr &recv);
+ virtual void RecvIpcMissionEvent(std::shared_ptr &recv, const IpcMission &mission);
+ virtual void RecvMcuHeartBeat(std::shared_ptr &recv);
+ virtual void RecvGetIntervalStart(std::shared_ptr &recv);
+ virtual void RecvGetDateTime(std::shared_ptr &recv);
+ virtual void RecvGetPirSensitivity(std::shared_ptr &recv);
};
class IMcuManager
{
diff --git a/middleware/McuManager/src/IMcuManager.cpp b/middleware/McuManager/src/IMcuManager.cpp
index 1248b4b8..d2c56124 100644
--- a/middleware/McuManager/src/IMcuManager.cpp
+++ b/middleware/McuManager/src/IMcuManager.cpp
@@ -14,10 +14,48 @@
*/
#include "IMcuManager.h"
#include "ILog.h"
-void VMcuMonitor::RecvIpcMissionEvent(std::shared_ptr &recv, const IpcMission &mission)
+mcu_ask_date_time::mcu_ask_date_time(const unsigned short year, const unsigned char mon, const unsigned char day,
+ const unsigned char hour, const unsigned char min, const unsigned char second)
+ : mYear(year), mMon(mon), mDay(day), mHour(hour), mMin(min), mSecond(second)
{
}
-void VMcuMonitor::RecvMcuHeartBeat(std::shared_ptr &recv)
+mcu_get_interval_start::mcu_get_interval_start() : mIntervalStart(0)
+{
+}
+VMcuAsk::VMcuAsk() : mSerialNumber(0)
+{
+}
+ASK_RESULT VMcuAsk::Blocking(void)
+{
+ return ASK_RESULT::END;
+}
+bool VMcuAsk::NeedReply(void)
+{
+ return false;
+}
+void VMcuAsk::ReplyFinished(const bool result)
+{
+}
+bool VMcuAsk::IfTimeout(const unsigned int &integrationTimeMs)
+{
+ return false;
+}
+void VMcuRecv::ReplyFinished(const bool result)
+{
+}
+void VMcuMonitor::RecvIpcMissionEvent(std::shared_ptr &recv, const IpcMission &mission)
+{
+}
+void VMcuMonitor::RecvMcuHeartBeat(std::shared_ptr &recv)
+{
+}
+void VMcuMonitor::RecvGetIntervalStart(std::shared_ptr &recv)
+{
+}
+void VMcuMonitor::RecvGetDateTime(std::shared_ptr &recv)
+{
+}
+void VMcuMonitor::RecvGetPirSensitivity(std::shared_ptr &recv)
{
}
std::shared_ptr &IMcuManager::GetInstance(std::shared_ptr *impl)
diff --git a/middleware/McuManager/src/McuManagerImpl.cpp b/middleware/McuManager/src/McuManagerImpl.cpp
index d9ef88ce..613b02e9 100644
--- a/middleware/McuManager/src/McuManagerImpl.cpp
+++ b/middleware/McuManager/src/McuManagerImpl.cpp
@@ -14,38 +14,22 @@
*/
#include "McuManagerImpl.h"
#include "ILog.h"
-#include "UartRecvAsk.h"
-class OtherSideSend : public UartRecvAsk, public McuAsk
+class McuRecvImpl
{
public:
- OtherSideSend(std::shared_ptr &mcuManager, const unsigned int &serialNumber,
- const OtherSideSendType &sendType)
- : mMcuManager(mcuManager), mSendType(sendType)
+ McuRecvImpl(const unsigned int &serialNumber, const OtherSideSendType &sendType)
+ : mSerialNumber(serialNumber), mSendType(sendType)
{
- McuAsk::mSerialNumber = serialNumber;
}
- virtual ~OtherSideSend() = default;
+ virtual ~McuRecvImpl() = default;
protected:
std::shared_ptr mMcuManager;
+ const unsigned int mSerialNumber;
public:
const OtherSideSendType mSendType;
};
-template
-class OtherSideSendWithData : public OtherSideSend
-{
-public:
- OtherSideSendWithData(std::shared_ptr &mcuManager, const unsigned int &serialNumber,
- const OtherSideSendType &sendType, const T &otherSideData)
- : OtherSideSend(mcuManager, serialNumber, sendType), mOtherSideData(otherSideData)
- {
- }
- virtual ~OtherSideSendWithData() = default;
-
-public:
- const T mOtherSideData;
-};
McuManagerImpl::McuManagerImpl()
{
mMcuAskHandle[OtherSideSendType::SEND_IPC_MISSION] =
@@ -74,7 +58,7 @@ const StatusCode McuManagerImpl::SetMcuMonitor(std::shared_ptr &mon
std::lock_guard locker(mMutex);
mMonitor = monitor;
for (auto ask : mMcuAskList) {
- std::shared_ptr data = std::dynamic_pointer_cast(ask);
+ std::shared_ptr data = std::dynamic_pointer_cast(ask);
auto handle = mMcuAskHandle.find(data->mSendType);
if (handle != mMcuAskHandle.end()) {
handle->second(ask);
@@ -163,62 +147,101 @@ std::shared_ptr McuManagerImpl::GetMcuMonitor(void)
}
void McuManagerImpl::OtherSideSendIpcMission(const unsigned int &serialNumber, const unsigned char &mission)
{
- class OtherSideSendV2 : public OtherSideSendWithData
+ class McuRecvIpcMission : public McuRecvImpl, public McuRecv
{
public:
- OtherSideSendV2(std::shared_ptr &mcuManager, const unsigned int &serialNumber,
- const OtherSideSendType &sendType, const unsigned char &mission)
- : OtherSideSendWithData(mcuManager, serialNumber, sendType, mission)
+ McuRecvIpcMission(std::shared_ptr &mcuManager, const unsigned int &serialNumber,
+ const OtherSideSendType &sendType, const unsigned char &mission)
+ : McuRecvImpl(serialNumber, sendType)
{
+ McuRecv::mDataRecvReply = mission;
+ McuRecvImpl::mMcuManager = mcuManager;
}
- ~OtherSideSendV2() = default;
+ ~McuRecvIpcMission() = default;
void ReplyFinished(const bool result) override
{
- mMcuManager->ReplyOtherSideSendIpcMission(McuAsk::mDataReply, VMcuAsk::mSerialNumber);
+ McuRecvImpl::mMcuManager->ReplyOtherSideSendIpcMission(ASK_RESULT::SUCCEED, McuRecvImpl::mSerialNumber);
}
};
std::shared_ptr monitor = GetMcuMonitor();
std::shared_ptr manager = std::dynamic_pointer_cast(SharedFromThis());
- std::shared_ptr ask =
- std::make_shared(manager, serialNumber, OtherSideSendType::SEND_IPC_MISSION, mission);
+ std::shared_ptr recv =
+ std::make_shared(manager, serialNumber, OtherSideSendType::SEND_IPC_MISSION, mission);
if (monitor) {
- monitor->RecvIpcMissionEvent(ask, static_cast(mission));
+ monitor->RecvIpcMissionEvent(recv, static_cast(mission));
}
else {
- LogWarning("mMonitor is nullptr, AddMcuAsk.\n");
- AddMcuAsk(ask);
+ LogWarning("mMonitor is nullptr, AddMcuRecv.\n");
+ AddMcuRecv(recv);
}
}
void McuManagerImpl::OtherSideSendHearBeat(const unsigned int &serialNumber)
{
- class OtherSideSendV2 : public OtherSideSend
+ class McuRecvHeartBeat : public McuRecvImpl, public VMcuRecv
{
public:
- OtherSideSendV2(std::shared_ptr &mcuManager, const unsigned int &serialNumber,
- const OtherSideSendType &sendType)
- : OtherSideSend(mcuManager, serialNumber, sendType)
+ McuRecvHeartBeat(std::shared_ptr &mcuManager, const unsigned int &serialNumber,
+ const OtherSideSendType &sendType)
+ : McuRecvImpl(serialNumber, sendType)
{
+ McuRecvImpl::mMcuManager = mcuManager;
}
- ~OtherSideSendV2() = default;
+ ~McuRecvHeartBeat() = default;
void ReplyFinished(const bool result) override
{
- LogInfo("Mcu monitor reply heart beat.\n");
- mMcuManager->ReplyOtherSideSendHeartBeat(mSerialNumber);
+ McuRecvImpl::mMcuManager->ReplyOtherSideSendHeartBeat(McuRecvImpl::mSerialNumber);
}
};
std::shared_ptr monitor = GetMcuMonitor();
std::shared_ptr manager = std::dynamic_pointer_cast(SharedFromThis());
- std::shared_ptr ask =
- std::make_shared(manager, serialNumber, OtherSideSendType::SEND_HEART_BEAT);
+ std::shared_ptr recv =
+ std::make_shared(manager, serialNumber, OtherSideSendType::SEND_HEART_BEAT);
if (monitor) {
LogInfo("Mcu manager report heart beat to mcu monitor.\n");
- monitor->RecvMcuHeartBeat(ask);
+ monitor->RecvMcuHeartBeat(recv);
}
else {
- LogWarning("mMonitor is nullptr, AddMcuAsk.\n");
- AddMcuAsk(ask);
+ LogWarning("mMonitor is nullptr, AddMcuRecv.\n");
+ AddMcuRecv(recv);
}
}
+void McuManagerImpl::OtherSideSendGetIntervalStart(const unsigned int &serialNumber)
+{
+ class McuRecvGetIntervalStart : public McuRecvImpl, public McuRecv
+ {
+ public:
+ McuRecvGetIntervalStart(std::shared_ptr &mcuManager, const unsigned int &serialNumber,
+ const OtherSideSendType &sendType)
+ : McuRecvImpl(serialNumber, sendType)
+ {
+ McuRecvImpl::mMcuManager = mcuManager;
+ }
+ ~McuRecvGetIntervalStart() = default;
+ void ReplyFinished(const bool result) override
+ {
+ McuRecvImpl::mMcuManager->ReplyOtherSideSendGetIntervalStart(mDataRecvReply.mIntervalStart,
+ McuRecvImpl::mSerialNumber);
+ }
+ };
+ std::shared_ptr monitor = GetMcuMonitor();
+ std::shared_ptr manager = std::dynamic_pointer_cast(SharedFromThis());
+ std::shared_ptr recv =
+ std::make_shared(manager, serialNumber, OtherSideSendType::GET_INTERVAL_START);
+ if (monitor) {
+ LogInfo("Mcu manager report heart beat to mcu monitor.\n");
+ monitor->RecvMcuHeartBeat(recv);
+ }
+ else {
+ LogWarning("mMonitor is nullptr, AddMcuRecv.\n");
+ AddMcuRecv(recv);
+ }
+}
+void McuManagerImpl::OtherSideSendGetDateTime(const unsigned int &serialNumber)
+{
+}
+void McuManagerImpl::OtherSideSendGetPirSensitivity(const unsigned int &serialNumber)
+{
+}
void McuManagerImpl::ReplyOtherSideSendIpcMission(const ASK_RESULT &result, const unsigned int &serialNumber)
{
LogInfo("ReplyOtherSideSendIpcMission\n");
@@ -229,24 +252,33 @@ void McuManagerImpl::ReplyOtherSideSendHeartBeat(const unsigned int &serialNumbe
LogInfo("ReplyOtherSideSendHeartBeat\n");
McuProtocol::ReplyOtherSideSendHearBeat(static_cast(ASK_RESULT::SUCCEED), serialNumber);
}
-void McuManagerImpl::AddMcuAsk(std::shared_ptr &ask)
+void McuManagerImpl::ReplyOtherSideSendGetIntervalStart(const unsigned int &interval, const unsigned int &serialNumber)
+{
+}
+void McuManagerImpl::ReplyOtherSideSendGetDateTime(const McuAskDateTime &time, const unsigned int &serialNumber)
+{
+}
+void McuManagerImpl::ReplyOtherSideSendGetPirSensitivity(const unsigned int &sensitivity,
+ const unsigned int &serialNumber)
+{
+}
+void McuManagerImpl::AddMcuRecv(std::shared_ptr &recv)
{
std::lock_guard locker(mMutex);
- mMcuAskList.push_back(ask);
+ mMcuAskList.push_back(recv);
}
-void McuManagerImpl::McuAskSendIpcMissionHandle(std::shared_ptr &ask)
+void McuManagerImpl::McuAskSendIpcMissionHandle(std::shared_ptr &recv)
{
std::shared_ptr monitor = GetMcuMonitor();
- std::shared_ptr> data =
- std::dynamic_pointer_cast>(ask);
+ std::shared_ptr> data = std::dynamic_pointer_cast>(recv);
if (monitor) {
- monitor->RecvIpcMissionEvent(ask, static_cast(data->mOtherSideData));
+ monitor->RecvIpcMissionEvent(recv, static_cast(data->mDataRecvReply));
}
}
-void McuManagerImpl::McuAskSendHeartBeatHandle(std::shared_ptr &ask)
+void McuManagerImpl::McuAskSendHeartBeatHandle(std::shared_ptr &recv)
{
std::shared_ptr monitor = GetMcuMonitor();
if (monitor) {
- monitor->RecvMcuHeartBeat(ask);
+ monitor->RecvMcuHeartBeat(recv);
}
}
\ No newline at end of file
diff --git a/middleware/McuManager/src/McuManagerImpl.h b/middleware/McuManager/src/McuManagerImpl.h
index 448c6bbb..9da328a4 100644
--- a/middleware/McuManager/src/McuManagerImpl.h
+++ b/middleware/McuManager/src/McuManagerImpl.h
@@ -22,11 +22,13 @@
#include