Merge branch 'master-develop' of gitee.com:shenzhen-jiuyilian/ipc into master-develop
This commit is contained in:
commit
8cf8280a2c
153
doc/design.md
153
doc/design.md
|
@ -2,7 +2,7 @@
|
||||||
|
|
||||||
## 1.1. 产品概述
|
## 1.1. 产品概述
|
||||||
|
|
||||||
   一款低功耗的IPC产品设计方案。
|
  一款低功耗的IPC产品设计方案。
|
||||||
|
|
||||||
### 1.1.1. 名词说明:
|
### 1.1.1. 名词说明:
|
||||||
MCU:外接的单片机;
|
MCU:外接的单片机;
|
||||||
|
@ -14,7 +14,30 @@ MCU:外接的单片机;
|
||||||
2. 抽屉式电池箱组;
|
2. 抽屉式电池箱组;
|
||||||
3. 捆绑/相机支架安装方式;
|
3. 捆绑/相机支架安装方式;
|
||||||
4. 可拓展4G模块;
|
4. 可拓展4G模块;
|
||||||
5. 户外防水等级?;
|
5. 户外防水等级?
|
||||||
|
|
||||||
|
### 1.2.1. 结构
|
||||||
|
|
||||||
|
| 物料 | 备注 |
|
||||||
|
|----|----|
|
||||||
|
| 喇叭 | - |
|
||||||
|
| 麦克风 | - |
|
||||||
|
| 按键 | 恢复出厂<br>SD卡格式化<br>TEST拨键<br>硬件电源开关 |
|
||||||
|
| 指示灯 | RGB三色灯 |
|
||||||
|
| 红外灯 | 940nm |
|
||||||
|
| usb | TYPEC,充电 |
|
||||||
|
| 太阳能板 | - |
|
||||||
|
| 电池仓 | - |
|
||||||
|
| TF卡卡槽 | - |
|
||||||
|
| PIR | - |
|
||||||
|
|
||||||
|
### 1.2.2. 配件
|
||||||
|
|
||||||
|
| 物料 | 备注 |
|
||||||
|
|----|----|
|
||||||
|
| 捆绑轧带 | - |
|
||||||
|
| 快充电池 | - |
|
||||||
|
| 快充适配器 | - |
|
||||||
|
|
||||||
## 1.3. 硬件设计
|
## 1.3. 硬件设计
|
||||||
|
|
||||||
|
@ -35,11 +58,11 @@ MCU:外接的单片机;
|
||||||
|
|
||||||
### 1.4.1. 多态单例设计模式
|
### 1.4.1. 多态单例设计模式
|
||||||
|
|
||||||
   多态单例模式包含两部分:抽象接口 + 抽象接口实例,代码基于抽象接口存在,业务基于抽象接口实例存在。
|
  多态单例模式包含两部分:抽象接口 + 抽象接口实例,代码基于抽象接口存在,业务基于抽象接口实例存在。
|
||||||
|
|
||||||
#### 1.4.1.1. 多态单例图示
|
#### 1.4.1.1. 多态单例图示
|
||||||
|
|
||||||
   下述图示分别为:类图 / 依赖关系图 / 编译链接关系图
|
  下述图示分别为:类图 / 依赖关系图 / 编译链接关系图
|
||||||
```mermaid
|
```mermaid
|
||||||
classDiagram
|
classDiagram
|
||||||
APP --> AbstractInterface:使用
|
APP --> AbstractInterface:使用
|
||||||
|
@ -51,7 +74,7 @@ classDiagram
|
||||||
```
|
```
|
||||||
#### 1.4.1.2. 多态单例模块使用时序图
|
#### 1.4.1.2. 多态单例模块使用时序图
|
||||||
|
|
||||||
   在使用多态单例设计模式开发功能模块时,使用统一的命名规则:
|
  在使用多态单例设计模式开发功能模块时,使用统一的命名规则:
|
||||||
* 抽象接口命名:xxx + Abstract,例如:libLogAbstract.a;
|
* 抽象接口命名:xxx + Abstract,例如:libLogAbstract.a;
|
||||||
* 实例库命名:xxx + 具体实例名称,例如:libLogEasylogging.a;
|
* 实例库命名:xxx + 具体实例名称,例如:libLogEasylogging.a;
|
||||||
|
|
||||||
|
@ -67,7 +90,7 @@ libLogAbstract.a -->> -User:return
|
||||||
|
|
||||||
#### 1.4.1.3. 多态单例目录结构规范
|
#### 1.4.1.3. 多态单例目录结构规范
|
||||||
|
|
||||||
   根据多态单例设计模式,指定使用多态单例模式开发的模块的源码目录结构,耦合思路清晰。
|
  根据多态单例设计模式,指定使用多态单例模式开发的模块的源码目录结构,耦合思路清晰。
|
||||||
```
|
```
|
||||||
└── Log // 多态单例模式模块的目录
|
└── Log // 多态单例模式模块的目录
|
||||||
├── include // 多态单例模块对外暴露的头文件目录,抽象接口定义
|
├── include // 多态单例模块对外暴露的头文件目录,抽象接口定义
|
||||||
|
@ -78,13 +101,13 @@ libLogAbstract.a -->> -User:return
|
||||||
├── LogAstract.cpp
|
├── LogAstract.cpp
|
||||||
└── LogAstract.h
|
└── LogAstract.h
|
||||||
```
|
```
|
||||||
   构建时把abstract目录和src目录的源码分别编译成库,main线程根据实际需要链接并实例化即可。
|
  构建时把abstract目录和src目录的源码分别编译成库,main线程根据实际需要链接并实例化即可。
|
||||||
|
|
||||||
#### 1.4.1.4. 混合多态单例
|
#### 1.4.1.4. 混合多态单例
|
||||||
|
|
||||||
   多态单例的分类有C++版本多态单例,C语言版本多态单例,混合(C/C++)多态单例。混合多态单例的提出是由于纯C语言多态单例开发难度较高,纯C++语言的多态单例不适合底层(特指本文的分层结构中的适配层)接口为C++时,很多C语言代码调用困难。
|
  多态单例的分类有C++版本多态单例,C语言版本多态单例,混合(C/C++)多态单例。混合多态单例的提出是由于纯C语言多态单例开发难度较高,纯C++语言的多态单例不适合底层(特指本文的分层结构中的适配层)接口为C++时,很多C语言代码调用困难。
|
||||||
|
|
||||||
   混合多态单例,内部多态实现使用C++,保留C++开发便捷性和易维护性(智能指针),对外同时提供C语言多态抽象接口和C++多态抽象接口,满足C/C++混编时易用性。最大特点是include文件夹里面会包含两个头文件。
|
  混合多态单例,内部多态实现使用C++,保留C++开发便捷性和易维护性(智能指针),对外同时提供C语言多态抽象接口和C++多态抽象接口,满足C/C++混编时易用性。最大特点是include文件夹里面会包含两个头文件。
|
||||||
|
|
||||||
##### 1.4.1.4.1. 多态单例目录结构
|
##### 1.4.1.4.1. 多态单例目录结构
|
||||||
```
|
```
|
||||||
|
@ -112,11 +135,11 @@ hal
|
||||||
|
|
||||||
### 1.4.2. 产品业务功能设计
|
### 1.4.2. 产品业务功能设计
|
||||||
|
|
||||||
   基于芯片大小核架构的启动设计。
|
  基于芯片大小核架构的启动设计。
|
||||||
|
|
||||||
#### 1.4.2.1. 白/黑切换状态启动
|
#### 1.4.2.1. 白/黑切换状态启动
|
||||||
|
|
||||||
   由外置单片机检测光敏adc,判断由白天切换到黑夜或者黑夜切换到白天时,主动给主控上电,主控上电后会校验并保存新的环境参数,以下次正常PIR启动时,可以避免ircut耗时快速收敛第一帧,最大程度实现快启功能。
|
  由外置单片机检测光敏adc,判断由白天切换到黑夜或者黑夜切换到白天时,主动给主控上电,主控上电后会校验并保存新的环境参数,以下次正常PIR启动时,可以避免ircut耗时快速收敛第一帧,最大程度实现快启功能。
|
||||||
|
|
||||||
**启动时序图**
|
**启动时序图**
|
||||||
|
|
||||||
|
@ -164,7 +187,7 @@ end
|
||||||
|
|
||||||
#### 1.4.2.2. 红外触发状态启动(正常工作快启)
|
#### 1.4.2.2. 红外触发状态启动(正常工作快启)
|
||||||
|
|
||||||
   红外触发启动作为产品正常工作时最经常最重要的启动状态。启动后快速抓拍/录像,快速关机。
|
  红外触发启动作为产品正常工作时最经常最重要的启动状态。启动后快速抓拍/录像,快速关机。
|
||||||
|
|
||||||
1. 为保证快启速度,IRCUT需要业务设计进行提前切换;
|
1. 为保证快启速度,IRCUT需要业务设计进行提前切换;
|
||||||
2. 每次启动抓拍/录像完,需要校验IRCUT状态,保证sensor初始化参数和环境相匹配;
|
2. 每次启动抓拍/录像完,需要校验IRCUT状态,保证sensor初始化参数和环境相匹配;
|
||||||
|
@ -290,7 +313,7 @@ end
|
||||||
|
|
||||||
#### 1.4.2.4. 设置/调试状态启动
|
#### 1.4.2.4. 设置/调试状态启动
|
||||||
|
|
||||||
   特殊的启动状态,可以较长时间通电完成其它功能,期间可供用户完成相关调试和参数设置,此时功耗较高。超时进入工作模式。
|
  特殊的启动状态,可以较长时间通电完成其它功能,期间可供用户完成相关调试和参数设置,此时功耗较高。超时进入工作模式。
|
||||||
|
|
||||||
1. 设置状态按键触发CPU上电,首先进入设置状态启动,5分钟后自动切换到工作状态。
|
1. 设置状态按键触发CPU上电,首先进入设置状态启动,5分钟后自动切换到工作状态。
|
||||||
|
|
||||||
|
@ -432,13 +455,13 @@ deactivate 大核
|
||||||
|
|
||||||
##### 1.4.3.1.1. 应用层概述
|
##### 1.4.3.1.1. 应用层概述
|
||||||
|
|
||||||
   应用层负责处理产品级的复杂业务关系,是产品功能的直接体现,应用层模块全部使用C++接口的多态单例模式设计,各模块之间可以互相调用接口,应用层各库可以随意任意调用中间件或者工具类接口。
|
  应用层负责处理产品级的复杂业务关系,是产品功能的直接体现,应用层模块全部使用C++接口的多态单例模式设计,各模块之间可以互相调用接口,应用层各库可以随意任意调用中间件或者工具类接口。
|
||||||
|
|
||||||
##### 1.4.3.1.2. 网络服务模块
|
##### 1.4.3.1.2. 网络服务模块
|
||||||
|
|
||||||
###### 1.4.3.1.2.1. 网络服务概述
|
###### 1.4.3.1.2.1. 网络服务概述
|
||||||
|
|
||||||
   根据产品联网属性,网络服务模块分为不联网 / 联网(B端)/ 联网(自研)三个多态属性。联网时,IPC的图片 / 视频资源通过网络服务器进行管理。
|
  根据产品联网属性,网络服务模块分为不联网 / 联网(B端)/ 联网(自研)三个多态属性。联网时,IPC的图片 / 视频资源通过网络服务器进行管理。
|
||||||
|
|
||||||
1. 不联网版本:网络服务模块不实例化即可;
|
1. 不联网版本:网络服务模块不实例化即可;
|
||||||
2. 联网(B端):媒体资源由三方服务器管理;
|
2. 联网(B端):媒体资源由三方服务器管理;
|
||||||
|
@ -446,15 +469,15 @@ deactivate 大核
|
||||||
|
|
||||||
###### 1.4.3.1.2.2. 网络服务多态设计模式
|
###### 1.4.3.1.2.2. 网络服务多态设计模式
|
||||||
|
|
||||||
   通过构建配置文件选择需要实例化的网络服务模块代码。
|
  通过构建配置文件选择需要实例化的网络服务模块代码。
|
||||||
|
|
||||||
##### 1.4.3.1.3. 相机任务管理
|
##### 1.4.3.1.3. 相机任务管理
|
||||||
|
|
||||||
   相机主业务逻辑使用状态机机制进行管理。
|
  相机主业务逻辑使用状态机机制进行管理。
|
||||||
|
|
||||||
###### 1.4.3.1.3.1. 任务状态
|
###### 1.4.3.1.3.1. 任务状态
|
||||||
|
|
||||||
   任务状态是指相机启动需要执行的任务,可能是拍照 / 视频,可能是其它任务。
|
  任务状态是指相机启动需要执行的任务,可能是拍照 / 视频,可能是其它任务。
|
||||||
|
|
||||||
**例如:**
|
**例如:**
|
||||||
1. 移动物体侦测启动;
|
1. 移动物体侦测启动;
|
||||||
|
@ -463,7 +486,7 @@ deactivate 大核
|
||||||
|
|
||||||
###### 1.4.3.1.3.2. 任务状态获取启动
|
###### 1.4.3.1.3.2. 任务状态获取启动
|
||||||
|
|
||||||
   应用程序运行后,首先需要知道主控是由于何种任务被唤醒,然后根据任务来执行相应的功能代码;
|
  应用程序运行后,首先需要知道主控是由于何种任务被唤醒,然后根据任务来执行相应的功能代码;
|
||||||
|
|
||||||
**时序图**
|
**时序图**
|
||||||
|
|
||||||
|
@ -497,23 +520,23 @@ end
|
||||||
|
|
||||||
##### 1.4.3.2.1. 中间件概述
|
##### 1.4.3.2.1. 中间件概述
|
||||||
|
|
||||||
   一些相对中性的业务功能库,这些库可以提供给不同的产品需求使用,在应用层不同的调用方式可实现不同的产品功能。中间件只能被应用层调用或者向下调用适配层或者调用工具库,中间件各模块之间不能互相调用。中间件库接口可以使用C或者C++接口。
|
  一些相对中性的业务功能库,这些库可以提供给不同的产品需求使用,在应用层不同的调用方式可实现不同的产品功能。中间件只能被应用层调用或者向下调用适配层或者调用工具库,中间件各模块之间不能互相调用。中间件库接口可以使用C或者C++接口。
|
||||||
|
|
||||||
##### 1.4.3.2.2. 设备管理模块
|
##### 1.4.3.2.2. 设备管理模块
|
||||||
|
|
||||||
   设备,统指Linux的设备节点,应用层唯一的硬件设备接口库。包含灯 / 按键 / GPIO / SD卡 / 串口 / USB等。
|
  设备,统指Linux的设备节点,应用层唯一的硬件设备接口库。包含灯 / 按键 / GPIO / SD卡 / 串口 / USB等。
|
||||||
|
|
||||||
##### 1.4.3.2.3. 相机管理模块
|
##### 1.4.3.2.3. 相机管理模块
|
||||||
|
|
||||||
   应用层唯一的摄像头接口库。
|
  应用层唯一的摄像头接口库。
|
||||||
|
|
||||||
##### 1.4.3.2.4. MCU管理模块
|
##### 1.4.3.2.4. MCU管理模块
|
||||||
|
|
||||||
   MCU通信接口库,一般使用串口进行通信,需要考虑多态其它接口(例如I2C),考虑多态协议数据结构。MCU负责管理外设的电源控制 / 充当硬狗等。
|
  MCU通信接口库,一般使用串口进行通信,需要考虑多态其它接口(例如I2C),考虑多态协议数据结构。MCU负责管理外设的电源控制 / 充当硬狗等。
|
||||||
|
|
||||||
###### 1.4.3.2.4.1. MCU管理模块设计模式
|
###### 1.4.3.2.4.1. MCU管理模块设计模式
|
||||||
|
|
||||||
   使用C++接口的多态单例模式。
|
  使用C++接口的多态单例模式。
|
||||||
|
|
||||||
基本功能:
|
基本功能:
|
||||||
|
|
||||||
|
@ -524,7 +547,7 @@ end
|
||||||
|
|
||||||
##### 1.4.3.2.5. MCU协议模块
|
##### 1.4.3.2.5. MCU协议模块
|
||||||
|
|
||||||
   负责对MCU协议进行封包/解包,负责协议的多态替换。协议数据统一使用网络字节序(大端字节序)。
|
  负责对MCU协议进行封包/解包,负责协议的多态替换。协议数据统一使用网络字节序(大端字节序)。
|
||||||
|
|
||||||
###### 1.4.3.2.5.1. 协议格式
|
###### 1.4.3.2.5.1. 协议格式
|
||||||
|
|
||||||
|
@ -534,23 +557,23 @@ end
|
||||||
|
|
||||||
**流水号**
|
**流水号**
|
||||||
|
|
||||||
   流水号用于强绑定问答型协议的发送数据和回复数据,回复者原数据回传即可。例如:
|
  流水号用于强绑定问答型协议的发送数据和回复数据,回复者原数据回传即可。例如:
|
||||||
|
|
||||||
```
|
```
|
||||||
unsigned char ASK_IPC_MISSION[] = {0xFA, 0xC1, 0x00, 0x00, 0x00, 0x01, 0x81, 0x01, 0x00, 0x0C, 0x71, 0x88};
|
unsigned char ASK_IPC_MISSION[] = {0xFA, 0xC1, 0x00, 0x00, 0x00, 0x01, 0x81, 0x01, 0x00, 0x0C, 0x71, 0x88};
|
||||||
unsigned char REPLY_IPC_MISSION[] = {0xFA, 0xC1, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x00, 0x0D, 0x01, 0xAA, 0x89};
|
unsigned char REPLY_IPC_MISSION[] = {0xFA, 0xC1, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x00, 0x0D, 0x01, 0xAA, 0x89};
|
||||||
```
|
```
|
||||||
|
|
||||||
   流水号管理发送方和接收方互相独立,各自往外发的协议中流水号存在重复的可能,接收方直接复制回传即可。
|
  流水号管理发送方和接收方互相独立,各自往外发的协议中流水号存在重复的可能,接收方直接复制回传即可。
|
||||||
|
|
||||||
   流水号必须大于等于1,0用于代码初始化值,代码意义上表示无效的流水号。
|
  流水号必须大于等于1,0用于代码初始化值,代码意义上表示无效的流水号。
|
||||||
|
|
||||||
**协议收发匹配逻辑**
|
**协议收发匹配逻辑**
|
||||||
   协议发送时,附带自管理的流水号,对端回复时,根据流水号绑定发送的协议,为了避免对端回复时,流水号错误导致的业务逻辑错乱,本端除了匹配流水号,还需要根据协议匹配回复的命令字,保证回复内容的有效匹配。如果流水号和命令字无法同时匹配,该回复的数据包被丢弃。
|
  协议发送时,附带自管理的流水号,对端回复时,根据流水号绑定发送的协议,为了避免对端回复时,流水号错误导致的业务逻辑错乱,本端除了匹配流水号,还需要根据协议匹配回复的命令字,保证回复内容的有效匹配。如果流水号和命令字无法同时匹配,该回复的数据包被丢弃。
|
||||||
|
|
||||||
**校验码算法**
|
**校验码算法**
|
||||||
|
|
||||||
   校验码算法使用ModBus CRC16方法计算。
|
  校验码算法使用ModBus CRC16方法计算。
|
||||||
|
|
||||||
**参考代码(查表法)**
|
**参考代码(查表法)**
|
||||||
|
|
||||||
|
@ -672,11 +695,11 @@ unsigned short calculate_check_sum(const unsigned char* pData, unsigned short le
|
||||||
|
|
||||||
##### 1.4.3.2.6. IPC配置库
|
##### 1.4.3.2.6. IPC配置库
|
||||||
|
|
||||||
   负责管理IPC产品相关的配置数据。
|
  负责管理IPC产品相关的配置数据。
|
||||||
|
|
||||||
###### 1.4.3.2.6.1. IPC配置库设计模式
|
###### 1.4.3.2.6.1. IPC配置库设计模式
|
||||||
|
|
||||||
   使用多态单例设计模式,对外提供C语言接口,内部不局限使用C或者C++。
|
  使用多态单例设计模式,对外提供C语言接口,内部不局限使用C或者C++。
|
||||||
|
|
||||||
**基本功能**
|
**基本功能**
|
||||||
|
|
||||||
|
@ -699,7 +722,7 @@ classDiagram
|
||||||
|
|
||||||
###### 1.4.3.2.6.3. 关键业务时序图
|
###### 1.4.3.2.6.3. 关键业务时序图
|
||||||
|
|
||||||
   **时序图会忽略抽象接口直接使用实例接口表示。**
|
  **时序图会忽略抽象接口直接使用实例接口表示。**
|
||||||
|
|
||||||
* IPC配置库初始化 / 解初始化
|
* IPC配置库初始化 / 解初始化
|
||||||
```mermaid
|
```mermaid
|
||||||
|
@ -783,31 +806,31 @@ ipc_config -->> -User:return
|
||||||
|
|
||||||
##### 1.4.3.2.7. 高级配置库
|
##### 1.4.3.2.7. 高级配置库
|
||||||
|
|
||||||
   对配置库的二级封装,提供更便捷的功能服务,例如:可以监控文件的修改事件 / 可以直接捕获某个配置文件或者数据的操作对象。
|
  对配置库的二级封装,提供更便捷的功能服务,例如:可以监控文件的修改事件 / 可以直接捕获某个配置文件或者数据的操作对象。
|
||||||
|
|
||||||
###### 1.4.3.2.7.1. 高级配置库设计
|
###### 1.4.3.2.7.1. 高级配置库设计
|
||||||
|
|
||||||
   对外暴露C++接口,使用多态单例设计模式。
|
  对外暴露C++接口,使用多态单例设计模式。
|
||||||
|
|
||||||
##### 1.4.3.2.8. 状态机管理
|
##### 1.4.3.2.8. 状态机管理
|
||||||
|
|
||||||
   提供实现状态机管理机制C++接口,使用鸿蒙状态机开源源码进行改造封装。
|
  提供实现状态机管理机制C++接口,使用鸿蒙状态机开源源码进行改造封装。
|
||||||
|
|
||||||
###### 1.4.3.2.8.1. 状态机管理设计模式
|
###### 1.4.3.2.8.1. 状态机管理设计模式
|
||||||
|
|
||||||
   使用多态单例设计模式,暂定使用鸿蒙状态机开源代码改造实现,后续可替换其它源码或者自研代码。
|
  使用多态单例设计模式,暂定使用鸿蒙状态机开源代码改造实现,后续可替换其它源码或者自研代码。
|
||||||
|
|
||||||
##### 1.4.3.2.9. 文件数据库
|
##### 1.4.3.2.9. 文件数据库
|
||||||
|
|
||||||
   文件数据库负责管理设备的媒体资源(图片 / 视频等)。
|
  文件数据库负责管理设备的媒体资源(图片 / 视频等)。
|
||||||
|
|
||||||
###### 1.4.3.2.9.1. 文件数据设计模式
|
###### 1.4.3.2.9.1. 文件数据设计模式
|
||||||
|
|
||||||
   使用混合多态单例模式开发。
|
  使用混合多态单例模式开发。
|
||||||
|
|
||||||
###### 1.4.3.2.9.2. 开源库选型
|
###### 1.4.3.2.9.2. 开源库选型
|
||||||
|
|
||||||
   sqlite3开源库,编译成工具类库提供给文件数据库使用。
|
  sqlite3开源库,编译成工具类库提供给文件数据库使用。
|
||||||
|
|
||||||
###### 1.4.3.2.9.3. 基本功能和业务需求
|
###### 1.4.3.2.9.3. 基本功能和业务需求
|
||||||
|
|
||||||
|
@ -817,15 +840,15 @@ ipc_config -->> -User:return
|
||||||
|
|
||||||
#### 1.4.3.3. 硬件适配层(hal)
|
#### 1.4.3.3. 硬件适配层(hal)
|
||||||
|
|
||||||
   负责适配不同的硬件平台。
|
  负责适配不同的硬件平台。
|
||||||
|
|
||||||
##### 1.4.3.3.1. 硬件适配层设计模式
|
##### 1.4.3.3.1. 硬件适配层设计模式
|
||||||
|
|
||||||
   基于C语言接口的多态单例模式,编译时静态多态链接对应的芯片平台适配代码,实现芯片接口的标准功能定义。
|
  基于C语言接口的多态单例模式,编译时静态多态链接对应的芯片平台适配代码,实现芯片接口的标准功能定义。
|
||||||
|
|
||||||
##### 1.4.3.3.2. 媒体适配方案:
|
##### 1.4.3.3.2. 媒体适配方案:
|
||||||
|
|
||||||
   IPC应用在适配芯片平台的多媒体接口时,使用多进程的方式实现。满足IPC应用可以快起(无需等待媒体相关的初始化)的需求。
|
  IPC应用在适配芯片平台的多媒体接口时,使用多进程的方式实现。满足IPC应用可以快起(无需等待媒体相关的初始化)的需求。
|
||||||
|
|
||||||
**媒体基本需求**
|
**媒体基本需求**
|
||||||
|
|
||||||
|
@ -834,7 +857,7 @@ ipc_config -->> -User:return
|
||||||
|
|
||||||
**多进程通信方案**
|
**多进程通信方案**
|
||||||
|
|
||||||
   使用本地socket的方式进行多进程通信,媒体进程为客户端,IPC应用为服务端(IPC先启动)。
|
  使用本地socket的方式进行多进程通信,媒体进程为客户端,IPC应用为服务端(IPC先启动)。
|
||||||
|
|
||||||
1. 客户端可自动重连;
|
1. 客户端可自动重连;
|
||||||
2. 服务端可多次关闭和开启,满足gtest资源回收需求;
|
2. 服务端可多次关闭和开启,满足gtest资源回收需求;
|
||||||
|
@ -885,18 +908,18 @@ v_media_handle -->> -hal:return
|
||||||
#### 1.4.3.4. 工具库(utils)
|
#### 1.4.3.4. 工具库(utils)
|
||||||
|
|
||||||
##### 1.4.3.4.1. 工具库概述
|
##### 1.4.3.4.1. 工具库概述
|
||||||
   工具库是功能单一的不依赖任何三方库的独立库(日志库和返回码管理库除外),必须提供C语言接口,内部实现不限于C或者C++。工具类库可以被任意的其它模块调用,特别指hal/component/application三大层级。
|
  工具库是功能单一的不依赖任何三方库的独立库(日志库和返回码管理库除外),必须提供C语言接口,内部实现不限于C或者C++。工具类库可以被任意的其它模块调用,特别指hal/component/application三大层级。
|
||||||
|
|
||||||
##### 1.4.3.4.2. 日志库
|
##### 1.4.3.4.2. 日志库
|
||||||
|
|
||||||
###### 1.4.3.4.2.1. 日志库概述
|
###### 1.4.3.4.2.1. 日志库概述
|
||||||
   提供程序的日志管理功能,含日志的实时打印/保存/跟踪(实时上传云端)。
|
  提供程序的日志管理功能,含日志的实时打印/保存/跟踪(实时上传云端)。
|
||||||
|
|
||||||
###### 1.4.3.4.2.2. 日志库设计模式
|
###### 1.4.3.4.2.2. 日志库设计模式
|
||||||
   C语言接口的多态单例模式,可动态/静态加载多态实例。
|
  C语言接口的多态单例模式,可动态/静态加载多态实例。
|
||||||
|
|
||||||
###### 1.4.3.4.2.3. 日志库启动
|
###### 1.4.3.4.2.3. 日志库启动
|
||||||
   日志库是否启用一般来讲是dubug版本启用日志功能,release版本禁用日志功能,考虑到release版本的维护问题,标准启动时,main线程在启动时使用dlopen系列函数去加载日志库(多态),特殊版本仍可在main线程加载日志库后,二次实例化日志库(多态)来实现不同的日志功能。
|
  日志库是否启用一般来讲是dubug版本启用日志功能,release版本禁用日志功能,考虑到release版本的维护问题,标准启动时,main线程在启动时使用dlopen系列函数去加载日志库(多态),特殊版本仍可在main线程加载日志库后,二次实例化日志库(多态)来实现不同的日志功能。
|
||||||
|
|
||||||
1. 标准流程:main线程加载sd卡动态库,如有即可动态实现日志功能,正常出货sd卡不带日志库,此时没有日志功能;
|
1. 标准流程:main线程加载sd卡动态库,如有即可动态实现日志功能,正常出货sd卡不带日志库,此时没有日志功能;
|
||||||
2. 可以通过配置参数决定是否启用日志;
|
2. 可以通过配置参数决定是否启用日志;
|
||||||
|
@ -905,7 +928,7 @@ v_media_handle -->> -hal:return
|
||||||
|
|
||||||
##### 1.4.3.4.3. 状态码管理库
|
##### 1.4.3.4.3. 状态码管理库
|
||||||
|
|
||||||
   提供整个应用程序的返回码管理功能,例如:打印返回码的字符串含义。提供C语言接口,纯C语言开发的模块,形成项目内部唯一返回码标准。
|
  提供整个应用程序的返回码管理功能,例如:打印返回码的字符串含义。提供C语言接口,纯C语言开发的模块,形成项目内部唯一返回码标准。
|
||||||
|
|
||||||
###### 1.4.3.4.3.1. 状态码功能
|
###### 1.4.3.4.3.1. 状态码功能
|
||||||
|
|
||||||
|
@ -917,7 +940,7 @@ v_media_handle -->> -hal:return
|
||||||
|
|
||||||
###### 1.4.3.4.3.2. 基础状态码定义
|
###### 1.4.3.4.3.2. 基础状态码定义
|
||||||
|
|
||||||
   基础状态码是全局的基础状态码,枚举值全局唯一,其它独立模块必须继承基础状态码累加枚举值,但是,独立模块之间的枚举值可重复,状态码在使用时,日志只关注状态码的字符串,不关心状态码枚举值,代码逻辑使用枚举值。
|
  基础状态码是全局的基础状态码,枚举值全局唯一,其它独立模块必须继承基础状态码累加枚举值,但是,独立模块之间的枚举值可重复,状态码在使用时,日志只关注状态码的字符串,不关心状态码枚举值,代码逻辑使用枚举值。
|
||||||
|
|
||||||
```
|
```
|
||||||
enum STATUS_CODE
|
enum STATUS_CODE
|
||||||
|
@ -940,7 +963,7 @@ enum STATUS_CODE
|
||||||
|
|
||||||
###### 1.4.3.4.3.3. 已知漏洞
|
###### 1.4.3.4.3.3. 已知漏洞
|
||||||
|
|
||||||
   状态码在代码层面是存在重复的可能性的,代码逻辑在使用状态码枚举值时,可能会出现逻辑错误。
|
  状态码在代码层面是存在重复的可能性的,代码逻辑在使用状态码枚举值时,可能会出现逻辑错误。
|
||||||
|
|
||||||
* 解决方案
|
* 解决方案
|
||||||
在使用状态码进行逻辑判断时,使用状态码枚举值的字符串。
|
在使用状态码进行逻辑判断时,使用状态码枚举值的字符串。
|
||||||
|
@ -951,19 +974,19 @@ static inline bool StatusCodeEqual(const StatusCode code, const char *value)
|
||||||
|
|
||||||
##### 1.4.3.4.4. 系统标准接口库
|
##### 1.4.3.4.4. 系统标准接口库
|
||||||
|
|
||||||
   对系统标准接口的套壳封装,主要是为了对系统标准打桩满足测试需求。
|
  对系统标准接口的套壳封装,主要是为了对系统标准打桩满足测试需求。
|
||||||
|
|
||||||
   使用普通的C语言接口封装即可,通过使用gcc编译参数在Linux x86系统中满足打桩需求,在交叉编译(担心工具链兼容问题)测试程序中无法对系统标准接口进行打桩。
|
  使用普通的C语言接口封装即可,通过使用gcc编译参数在Linux x86系统中满足打桩需求,在交叉编译(担心工具链兼容问题)测试程序中无法对系统标准接口进行打桩。
|
||||||
|
|
||||||
##### 1.4.3.4.5. 通用配置库
|
##### 1.4.3.4.5. 通用配置库
|
||||||
|
|
||||||
###### 1.4.3.4.5.1. 通用配置库概述
|
###### 1.4.3.4.5.1. 通用配置库概述
|
||||||
|
|
||||||
   配置库负责管理软件配置参数,对配置数据进行设置 / 获取 / 存储 / 备份 / 升级等功能;通用配置库不限制使用场景,是一个通用的配置文件管理库。
|
  配置库负责管理软件配置参数,对配置数据进行设置 / 获取 / 存储 / 备份 / 升级等功能;通用配置库不限制使用场景,是一个通用的配置文件管理库。
|
||||||
|
|
||||||
###### 1.4.3.4.5.2. 配置库设计模式
|
###### 1.4.3.4.5.2. 配置库设计模式
|
||||||
|
|
||||||
   对外提供C语言接口,内部不局限使用C或者C++。整个软件唯一可以直接操作文件系统配置文件的库。配置库可以理解为简单的三方库的接口直接封装,使用多态单例设计模式实现静态或者动态切换三方库的使用。
|
  对外提供C语言接口,内部不局限使用C或者C++。整个软件唯一可以直接操作文件系统配置文件的库。配置库可以理解为简单的三方库的接口直接封装,使用多态单例设计模式实现静态或者动态切换三方库的使用。
|
||||||
|
|
||||||
**基本功能**
|
**基本功能**
|
||||||
|
|
||||||
|
@ -978,7 +1001,7 @@ static inline bool StatusCodeEqual(const StatusCode code, const char *value)
|
||||||
2. 使用sqlite3作为文件操作的开源库,作为数据库文件处理。
|
2. 使用sqlite3作为文件操作的开源库,作为数据库文件处理。
|
||||||
|
|
||||||
###### 1.4.3.4.5.4. 通用配置库类图
|
###### 1.4.3.4.5.4. 通用配置库类图
|
||||||
   多态单例设计模式,main线程静态链接多态库。
|
  多态单例设计模式,main线程静态链接多态库。
|
||||||
```mermaid
|
```mermaid
|
||||||
classDiagram
|
classDiagram
|
||||||
i_config_manager <.. config_manager:实现
|
i_config_manager <.. config_manager:实现
|
||||||
|
@ -989,18 +1012,18 @@ classDiagram
|
||||||
|
|
||||||
###### 1.4.3.4.5.5. 备份机制
|
###### 1.4.3.4.5.5. 备份机制
|
||||||
|
|
||||||
   备份数据用于数据异常时可还原旧数据。
|
  备份数据用于数据异常时可还原旧数据。
|
||||||
|
|
||||||
方案选择:
|
方案选择:
|
||||||
1. 出厂默认配置文件为只读文件,在数据破坏时还原;
|
1. 出厂默认配置文件为只读文件,在数据破坏时还原;
|
||||||
|
|
||||||
###### 1.4.3.4.5.6. 升级机制
|
###### 1.4.3.4.5.6. 升级机制
|
||||||
|
|
||||||
   程序升级后配置数据发生增 / 删时如何兼容和还原。
|
  程序升级后配置数据发生增 / 删时如何兼容和还原。
|
||||||
|
|
||||||
##### 1.4.3.4.6. 串口功能模块
|
##### 1.4.3.4.6. 串口功能模块
|
||||||
|
|
||||||
   串口的打开 / 关闭 / 数据读 / 数据写 功能。
|
  串口的打开 / 关闭 / 数据读 / 数据写 功能。
|
||||||
|
|
||||||
###### 1.4.3.4.6.1. 串口开源库
|
###### 1.4.3.4.6.1. 串口开源库
|
||||||
使用下述开源库对串口数据进行收发。
|
使用下述开源库对串口数据进行收发。
|
||||||
|
@ -1010,31 +1033,31 @@ https://gitee.com/RT-Thread-Mirror/TinyFrame
|
||||||
|
|
||||||
##### 1.4.3.4.7. MCU协议库
|
##### 1.4.3.4.7. MCU协议库
|
||||||
|
|
||||||
   负责MCU通信协议的组包 / 拆包 / 事件转换。
|
  负责MCU通信协议的组包 / 拆包 / 事件转换。
|
||||||
|
|
||||||
###### 1.4.3.4.7.1. MCU协议库设计模式
|
###### 1.4.3.4.7.1. MCU协议库设计模式
|
||||||
|
|
||||||
   基于C语言的多态单例设计模式。
|
  基于C语言的多态单例设计模式。
|
||||||
|
|
||||||
###### 1.4.3.4.7.2. 协议数据结构
|
###### 1.4.3.4.7.2. 协议数据结构
|
||||||
|
|
||||||
##### 1.4.3.4.8. 多进程通讯库
|
##### 1.4.3.4.8. 多进程通讯库
|
||||||
|
|
||||||
   负责多进程之间的数据交换。使用local socket方式实现。
|
  负责多进程之间的数据交换。使用local socket方式实现。
|
||||||
|
|
||||||
##### 1.4.3.4.9. 多进程协议库
|
##### 1.4.3.4.9. 多进程协议库
|
||||||
|
|
||||||
   负责IPC应用和媒体进程之间的协议组包 / 拆包,在协议和业务之间进行转换接口的封装。
|
  负责IPC应用和媒体进程之间的协议组包 / 拆包,在协议和业务之间进行转换接口的封装。
|
||||||
|
|
||||||
## 1.5. 生产测试/研发调试
|
## 1.5. 生产测试/研发调试
|
||||||
|
|
||||||
   基于公版代码派生出来的特定的定制版本,用于辅助生产和测试。
|
  基于公版代码派生出来的特定的定制版本,用于辅助生产和测试。
|
||||||
|
|
||||||
## 1.6. 自动化测试
|
## 1.6. 自动化测试
|
||||||
|
|
||||||
### 1.6.1. 自动化测试概述
|
### 1.6.1. 自动化测试概述
|
||||||
|
|
||||||
   自动化测试是该产品设计的一大特点,需要严格执行。自动化测试指使用纯代码对业务设计进行测试用例设计,实现业务集成测试的能力。
|
  自动化测试是该产品设计的一大特点,需要严格执行。自动化测试指使用纯代码对业务设计进行测试用例设计,实现业务集成测试的能力。
|
||||||
|
|
||||||
|
|
||||||
### 1.6.2. 自动化测试规范
|
### 1.6.2. 自动化测试规范
|
||||||
|
|
|
@ -15,6 +15,23 @@
|
||||||
#include "IHalCpp.h"
|
#include "IHalCpp.h"
|
||||||
#include "ILog.h"
|
#include "ILog.h"
|
||||||
#include <memory>
|
#include <memory>
|
||||||
|
void VKeyHalMonitor::KeyEventHappened(const std::string &keyName, const VirtualKeyEvent &event,
|
||||||
|
const unsigned int &timeMs)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
void VKeyHal::CheckKeyStatus(void)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
void VKeyHal::GetHoldPressingTimeMs(long int &holdTimeMs, VirtualKeyEvent &event)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
void VKeyHal::SetKeyMonitor(std::shared_ptr<VKeyHalMonitor> &monitor)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
StatusCode VWifiHal::OpenApMode(void)
|
||||||
|
{
|
||||||
|
return CreateStatusCode(STATUS_CODE_VIRTUAL_FUNCTION);
|
||||||
|
}
|
||||||
std::shared_ptr<IHalCpp> &IHalCpp::GetInstance(std::shared_ptr<IHalCpp> *impl)
|
std::shared_ptr<IHalCpp> &IHalCpp::GetInstance(std::shared_ptr<IHalCpp> *impl)
|
||||||
{
|
{
|
||||||
static auto instance = std::make_shared<IHalCpp>();
|
static auto instance = std::make_shared<IHalCpp>();
|
||||||
|
@ -48,4 +65,7 @@ StatusCode IHalCpp::GetAllKeys(std::map<std::string, std::shared_ptr<VKeyHal>> &
|
||||||
StatusCode IHalCpp::GetWifiHal(std::shared_ptr<VWifiHal> &wifi)
|
StatusCode IHalCpp::GetWifiHal(std::shared_ptr<VWifiHal> &wifi)
|
||||||
{
|
{
|
||||||
return CreateStatusCode(STATUS_CODE_VIRTUAL_FUNCTION);
|
return CreateStatusCode(STATUS_CODE_VIRTUAL_FUNCTION);
|
||||||
|
}
|
||||||
|
StatusCode IHalCpp::GetCameraHal(std::shared_ptr<VCameraHal> &camera)
|
||||||
|
{
|
||||||
}
|
}
|
|
@ -31,24 +31,16 @@ class VKeyHalMonitor
|
||||||
public:
|
public:
|
||||||
VKeyHalMonitor() = default;
|
VKeyHalMonitor() = default;
|
||||||
virtual ~VKeyHalMonitor() = default;
|
virtual ~VKeyHalMonitor() = default;
|
||||||
virtual void KeyEventHappened(const std::string &keyName, const VirtualKeyEvent &event, const unsigned int &timeMs)
|
virtual void KeyEventHappened(const std::string &keyName, const VirtualKeyEvent &event, const unsigned int &timeMs);
|
||||||
{
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
class VKeyHal
|
class VKeyHal
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
VKeyHal() = default;
|
VKeyHal() = default;
|
||||||
virtual ~VKeyHal() = default;
|
virtual ~VKeyHal() = default;
|
||||||
virtual void CheckKeyStatus(void)
|
virtual void CheckKeyStatus(void);
|
||||||
{
|
virtual void GetHoldPressingTimeMs(long int &holdTimeMs, VirtualKeyEvent &event);
|
||||||
}
|
virtual void SetKeyMonitor(std::shared_ptr<VKeyHalMonitor> &monitor);
|
||||||
virtual void GetHoldPressingTimeMs(long int &holdTimeMs, VirtualKeyEvent &event)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
virtual void SetKeyMonitor(std::shared_ptr<VKeyHalMonitor> &monitor)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
class VLedHal
|
class VLedHal
|
||||||
{
|
{
|
||||||
|
@ -61,10 +53,19 @@ class VWifiHal
|
||||||
public:
|
public:
|
||||||
VWifiHal() = default;
|
VWifiHal() = default;
|
||||||
virtual ~VWifiHal() = default;
|
virtual ~VWifiHal() = default;
|
||||||
virtual StatusCode OpenApMode(void)
|
virtual StatusCode OpenApMode(void);
|
||||||
{
|
};
|
||||||
return CreateStatusCode(STATUS_CODE_VIRTUAL_FUNCTION);
|
class VCameraHalMonitor
|
||||||
}
|
{
|
||||||
|
public:
|
||||||
|
VCameraHalMonitor() = default;
|
||||||
|
virtual ~VCameraHalMonitor() = default;
|
||||||
|
};
|
||||||
|
class VCameraHal
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
VCameraHal() = default;
|
||||||
|
virtual ~VCameraHal() = default;
|
||||||
};
|
};
|
||||||
class IHalCpp
|
class IHalCpp
|
||||||
{
|
{
|
||||||
|
@ -77,5 +78,6 @@ public:
|
||||||
virtual StatusCode GetAllLeds(std::map<std::string, std::shared_ptr<VLedHal>> &allLeds);
|
virtual StatusCode GetAllLeds(std::map<std::string, std::shared_ptr<VLedHal>> &allLeds);
|
||||||
virtual StatusCode GetAllKeys(std::map<std::string, std::shared_ptr<VKeyHal>> &allKeys);
|
virtual StatusCode GetAllKeys(std::map<std::string, std::shared_ptr<VKeyHal>> &allKeys);
|
||||||
virtual StatusCode GetWifiHal(std::shared_ptr<VWifiHal> &wifi);
|
virtual StatusCode GetWifiHal(std::shared_ptr<VWifiHal> &wifi);
|
||||||
|
virtual StatusCode GetCameraHal(std::shared_ptr<VCameraHal> &camera);
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -80,4 +80,9 @@ StatusCode HalMakePtr::CreateWifiHal(std::shared_ptr<VWifiHal> &impl)
|
||||||
LogWarning("CreateWifiHal.\n");
|
LogWarning("CreateWifiHal.\n");
|
||||||
impl = std::make_shared<WifiHal>();
|
impl = std::make_shared<WifiHal>();
|
||||||
return CreateStatusCode(STATUS_CODE_OK);
|
return CreateStatusCode(STATUS_CODE_OK);
|
||||||
|
}
|
||||||
|
StatusCode HalMakePtr::CreateCameraHal(std::shared_ptr<VCameraHal> &impl)
|
||||||
|
{
|
||||||
|
LogWarning("CreateCameraHal.\n");
|
||||||
|
return CreateStatusCode(STATUS_CODE_VIRTUAL_FUNCTION);
|
||||||
}
|
}
|
|
@ -35,5 +35,6 @@ public:
|
||||||
virtual StatusCode CreateHalPtr(IHal **hal);
|
virtual StatusCode CreateHalPtr(IHal **hal);
|
||||||
virtual StatusCode CreateHalSharePtr(std::shared_ptr<IHalCpp> &impl);
|
virtual StatusCode CreateHalSharePtr(std::shared_ptr<IHalCpp> &impl);
|
||||||
virtual StatusCode CreateWifiHal(std::shared_ptr<VWifiHal> &impl);
|
virtual StatusCode CreateWifiHal(std::shared_ptr<VWifiHal> &impl);
|
||||||
|
virtual StatusCode CreateCameraHal(std::shared_ptr<VCameraHal> &impl);
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
|
@ -48,25 +48,11 @@ class VSensorTask
|
||||||
public:
|
public:
|
||||||
VSensorTask() = default;
|
VSensorTask() = default;
|
||||||
virtual ~VSensorTask() = default;
|
virtual ~VSensorTask() = default;
|
||||||
virtual const SensorTaskType GetTaskType(void)
|
virtual const SensorTaskType GetTaskType(void);
|
||||||
{
|
virtual void Response(const std::vector<SensorTaskResponse> &response);
|
||||||
return SensorTaskType::END;
|
virtual bool IsTaskFinished(void);
|
||||||
}
|
virtual const signed int GetIsNight(void);
|
||||||
virtual void Response(const std::vector<SensorTaskResponse> &response)
|
virtual const unsigned int GetIsMultShot(void);
|
||||||
{
|
|
||||||
}
|
|
||||||
virtual bool IsTaskFinished(void)
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
virtual const signed int GetIsNight(void)
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
virtual const unsigned int GetIsMultShot(void)
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
class VSensorHandle
|
class VSensorHandle
|
||||||
{
|
{
|
||||||
|
|
|
@ -14,6 +14,25 @@
|
||||||
*/
|
*/
|
||||||
#include "IMediaManager.h"
|
#include "IMediaManager.h"
|
||||||
#include "ILog.h"
|
#include "ILog.h"
|
||||||
|
const SensorTaskType VSensorTask::GetTaskType(void)
|
||||||
|
{
|
||||||
|
return SensorTaskType::END;
|
||||||
|
}
|
||||||
|
void VSensorTask::Response(const std::vector<SensorTaskResponse> &response)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
bool VSensorTask::IsTaskFinished(void)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
const signed int VSensorTask::GetIsNight(void)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
const unsigned int VSensorTask::GetIsMultShot(void)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
std::shared_ptr<IMediaManager> &IMediaManager::GetInstance(std::shared_ptr<IMediaManager> *impl)
|
std::shared_ptr<IMediaManager> &IMediaManager::GetInstance(std::shared_ptr<IMediaManager> *impl)
|
||||||
{
|
{
|
||||||
static auto instance = std::make_shared<IMediaManager>();
|
static auto instance = std::make_shared<IMediaManager>();
|
||||||
|
|
|
@ -46,4 +46,7 @@ add_custom_command(
|
||||||
COMMAND make Log_code_check
|
COMMAND make Log_code_check
|
||||||
WORKING_DIRECTORY ${PLATFORM_PATH}/cmake-shell/
|
WORKING_DIRECTORY ${PLATFORM_PATH}/cmake-shell/
|
||||||
)
|
)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
file(GLOB_RECURSE INSTALL_HEADER_FILES include/*.h)
|
||||||
|
install(FILES ${INSTALL_HEADER_FILES} DESTINATION include)
|
Loading…
Reference in New Issue
Block a user