This commit is contained in:
coco
2026-07-03 16:05:30 +08:00
commit df489d5640
1101 changed files with 779140 additions and 0 deletions
@@ -0,0 +1,378 @@
# 固件升级
<cite>
**本文档引用的文件**
- [LicenseUpgrade.cpp](file://cpp/Operator/LicenseUpgrade.cpp)
- [GD10OperCmd.cpp](file://cpp/Tools/GD10OperCmd.cpp)
- [GD10OperCmd.h](file://h/GD10OperCmd.h)
- [FileTransfer.cpp](file://cpp/Tools/FileTransfer.cpp)
- [FileTransfer.h](file://h/FileTransfer.h)
- [IAP-GD10.bat](file://tools/IAP-GD10.bat)
- [License-GD10.bat](file://tools/License-GD10.bat)
- [GeoMative.cpp](file://cpp/Main/GeoMative.cpp)
</cite>
## 目录
1. [引言](#引言)
2. [固件升级流程概述](#固件升级流程概述)
3. [核心组件分析](#核心组件分析)
4. [升级准备阶段](#升级准备阶段)
5. [文件传输机制](#文件传输机制)
6. [升级执行与DFU工具](#升级执行与dfu工具)
7. [通信协议与指令集](#通信协议与指令集)
8. [升级状态监控与用户反馈](#升级状态监控与用户反馈)
9. [异常处理与恢复机制](#异常处理与恢复机制)
10. [版本兼容性考虑](#版本兼容性考虑)
## 引言
本文档全面描述了通过LicenseUpgrade模块触发并执行GD10设备固件升级的完整流程。文档详细阐述了升级准备、文件传输、升级执行、校验与重启等各个阶段的技术细节。通过分析GD10OperCmd中定义的升级指令集及其通信协议,解释了批处理脚本在调用DFU工具和传递参数中的作用。同时提供了升级失败、中断恢复、版本兼容性等关键问题的处理指南,并结合实际代码逻辑展示了升级状态监控和用户反馈机制。
## 固件升级流程概述
GD10设备的固件升级流程是一个多阶段的复杂过程,涉及多个组件的协同工作。整个流程从用户通过LicenseUpgrade模块触发升级开始,经过升级准备、文件下载、设备通信、固件刷写和最终验证等阶段。该流程依赖于FileTransfer组件进行文件传输,利用批处理脚本调用DFU工具执行实际的固件刷写操作,并通过GD10OperCmd定义的通信协议与设备进行交互。
```mermaid
flowchart TD
A[用户触发升级] --> B[升级准备]
B --> C[下载升级文件]
C --> D[建立设备通信]
D --> E[执行固件刷写]
E --> F[校验与重启]
F --> G[升级完成]
```
**图示来源**
- [LicenseUpgrade.cpp](file://cpp/Operator/LicenseUpgrade.cpp#L146-L269)
- [IAP-GD10.bat](file://tools/IAP-GD10.bat#L12-L16)
## 核心组件分析
### LicenseUpgrade模块
LicenseUpgrade模块是固件升级流程的入口点,负责协调整个升级过程。该模块通过对话框界面与用户交互,收集必要的升级信息,并协调其他组件完成升级任务。
```mermaid
classDiagram
class CLicenseUpgrade {
+m_bIsCrulInitaled bool
+m_bIsUpdating bool
+m_comDev CComboBox
+m_proDownFile CProgressCtrl
+m_FileTransfer FileTransfer
+OnInitDialog() BOOL
+OnOK() void
+GetLicenseFile(strDev CString) bool
+OnTimer(nIDEvent UINT) void
+UpdateGD10Dev(pCom CSComPort*) void
}
CLicenseUpgrade --> FileTransfer : "使用"
CLicenseUpgrade --> CSComPort : "通信"
```
**图示来源**
- [LicenseUpgrade.cpp](file://cpp/Operator/LicenseUpgrade.cpp#L20-L496)
- [FileTransfer.h](file://h/FileTransfer.h#L26-L46)
### GD10OperCmd指令集
GD10OperCmd类定义了与GD10设备通信的指令集,是实现设备控制的核心组件。该组件提供了项目管理、测区管理、脚本管理等功能的接口。
```mermaid
classDiagram
class CGD10OperCmd {
+m_pGD10Oper CGD10OperCmd*
+GetInstance() CGD10OperCmd*
+project_add(mac char*, projectcn char*) int
+project_delete(mac char*, projectcn char*) bool
+testzone_add(projectcn char*, testzonecn char*, type char*) int
+testzone_delete(projectcn char*, testzonecn char*) int
+script_add(scriptcn char*, scriptname char*, mudiumid char*) int
+script_delete(scriptcn char*) bool
+set_param(strParam CString) bool
+unregister_user(strMacAddr CString) bool
+loadDeviceMarkDataFromGD() bool
+LoadDevMarkDataFormGDThread(lParam LPVOID) UINT
}
CGD10OperCmd : "单例模式"
```
**图示来源**
- [GD10OperCmd.h](file://h/GD10OperCmd.h#L12-L52)
- [GD10OperCmd.cpp](file://cpp/Tools/GD10OperCmd.cpp#L24-L800)
## 升级准备阶段
升级准备阶段是固件升级流程的初始阶段,主要负责验证升级条件、初始化必要组件和设置升级参数。此阶段确保所有前置条件满足后,才开始实际的文件传输和固件刷写操作。
```mermaid
flowchart TD
A[初始化对话框] --> B[检查设备连接]
B --> C{设备是否在线?}
C --> |否| D[显示错误信息]
C --> |是| E[获取在线设备列表]
E --> F[设置进度条范围]
F --> G[初始化文件传输组件]
G --> H[准备升级]
```
**图示来源**
- [LicenseUpgrade.cpp](file://cpp/Operator/LicenseUpgrade.cpp#L49-L97)
- [GeoMative.cpp](file://cpp/Main/GeoMative.cpp#L56-L78)
**本节来源**
- [LicenseUpgrade.cpp](file://cpp/Operator/LicenseUpgrade.cpp#L49-L97)
## 文件传输机制
文件传输机制是固件升级流程中的关键环节,负责从远程服务器下载必要的升级文件到本地。该机制使用FileTransfer组件实现,支持进度监控和错误处理。
### FileTransfer组件
FileTransfer组件是基于C++的文件传输实现,提供了文件发送和接收的基本功能。该组件使用串口通信(CSComPort)作为传输媒介,并支持CRC校验确保数据完整性。
```mermaid
classDiagram
class FileTransfer {
+port CSComPort*
+file FILE*
+file_length long
+byte_count long
+file_count int
+file_name[128] char
+buffer[BUFFSIZE] char
+Send(files char*[]) BOOL
+Receive(Path CString) BOOL
+error(fmt char*, ...) void
+status(fmt char*, ...) void
}
FileTransfer --> CSComPort : "使用"
FileTransfer : "抽象基类"
```
**图示来源**
- [FileTransfer.h](file://h/FileTransfer.h#L26-L46)
- [FileTransfer.cpp](file://cpp/Tools/FileTransfer.cpp#L28-L47)
### 文件下载流程
文件下载流程从远程服务器获取固件升级所需的文件,包括FACTORY和LICENSE文件。该流程支持进度显示和错误恢复。
```mermaid
sequenceDiagram
participant UI as "用户界面"
participant LU as "LicenseUpgrade"
participant FT as "FileTransfer"
participant Server as "远程服务器"
UI->>LU : 点击升级按钮
LU->>LU : 验证设备选择
LU->>FT : 初始化传输组件
LU->>FT : 设置下载参数
loop 下载每个文件
LU->>FT : 开始下载
FT->>Server : 发送HTTP请求
Server-->>FT : 返回文件数据
FT->>LU : 更新下载进度
LU->>UI : 显示进度
end
FT-->>LU : 下载完成
LU->>LU : 准备固件刷写
```
**图示来源**
- [LicenseUpgrade.cpp](file://cpp/Operator/LicenseUpgrade.cpp#L215-L269)
- [FileTransfer.h](file://h/FileTransfer.h#L40-L41)
**本节来源**
- [LicenseUpgrade.cpp](file://cpp/Operator/LicenseUpgrade.cpp#L173-L269)
- [FileTransfer.h](file://h/FileTransfer.h#L26-L46)
## 升级执行与DFU工具
升级执行阶段使用DFUDevice Firmware Upgrade)工具将下载的固件文件刷写到GD10设备中。这一过程通过批处理脚本调用DFU工具完成,确保了升级过程的可靠性和一致性。
### IAP-GD10批处理脚本
IAP-GD10.bat批处理脚本是执行固件升级的核心脚本,它调用DFU工具完成固件刷写。该脚本首先使用DfuCreateFile工具将二进制固件文件转换为DFU格式,然后使用DfuSeCommand工具将DFU文件刷写到设备中。
```mermaid
flowchart TD
A[开始] --> B[延迟10秒]
B --> C[创建DFU文件]
C --> D[刷写固件]
D --> E[删除临时DFU文件]
E --> F[结束]
```
**图示来源**
- [IAP-GD10.bat](file://tools/IAP-GD10.bat#L10-L16)
### License-GD10批处理脚本
License-GD10.bat批处理脚本专门用于升级设备的许可证文件。该脚本分两步执行:首先刷写FACTORY文件,然后刷写LICENSE文件,确保许可证信息正确更新。
```mermaid
flowchart TD
A[开始] --> B[延迟2秒]
B --> C[创建FACTORY DFU文件]
C --> D[刷写FACTORY文件]
D --> E[删除FACTORY DFU文件]
E --> F[创建LICENSE DFU文件]
F --> G[刷写LICENSE文件]
G --> H[删除LICENSE DFU文件]
H --> I[结束]
```
**图示来源**
- [License-GD10.bat](file://tools/License-GD10.bat#L7-L20)
### DFU工具参数说明
DFU工具的调用参数具有特定含义,确保固件正确刷写到设备的指定位置:
- `0x0483`: STMicroelectronics的厂商ID
- `0xdf11`: DFU设备的产品ID
- `0x2200`: 设备的设备ID
- `APP`: 固件类型标识
- `0x08010000`: 固件在设备内存中的起始地址
- `"APP.dfu"`: 生成的DFU文件名
这些参数确保了固件被正确识别和刷写到GD10设备中。
**本节来源**
- [IAP-GD10.bat](file://tools/IAP-GD10.bat#L12-L16)
- [License-GD10.bat](file://tools/License-GD10.bat#L9-L20)
## 通信协议与指令集
GD10设备的通信协议定义了一套完整的指令集,用于控制设备的各种操作。这些指令通过串口通信发送到设备,实现对设备的远程控制。
### 指令集功能
GD10OperCmd类定义的指令集涵盖了设备管理的各个方面:
- **项目管理**: `project_add``project_delete`用于在设备上创建和删除项目
- **测区管理**: `testzone_add``testzone_delete`用于管理测区
- **脚本管理**: `script_add``script_delete`用于管理测量脚本
- **参数设置**: `set_param`用于设置设备参数
- **用户管理**: `unregister_user`用于用户注销
### 通信流程
通信流程遵循典型的请求-响应模式,确保指令的可靠执行:
```mermaid
sequenceDiagram
participant App as "应用程序"
participant Cmd as "GD10OperCmd"
participant Dev as "GD10设备"
App->>Cmd : 调用指令方法
Cmd->>Cmd : 验证设备连接
Cmd->>Dev : 发送指令
Dev-->>Cmd : 返回响应
Cmd->>App : 返回执行结果
alt 执行成功
App->>App : 更新UI状态
else 执行失败
App->>App : 显示错误信息
end
```
**图示来源**
- [GD10OperCmd.cpp](file://cpp/Tools/GD10OperCmd.cpp#L53-L800)
- [GD10OperCmd.h](file://h/GD10OperCmd.h#L20-L37)
**本节来源**
- [GD10OperCmd.h](file://h/GD10OperCmd.h#L20-L37)
- [GD10OperCmd.cpp](file://cpp/Tools/GD10OperCmd.cpp#L53-L800)
## 升级状态监控与用户反馈
升级过程中的状态监控和用户反馈机制确保用户能够实时了解升级进度,并在出现问题时及时获得提示。
### 进度监控实现
进度监控通过定时器和文件传输组件的回调机制实现,实时更新用户界面:
```mermaid
flowchart TD
A[启动定时器] --> B[获取当前下载大小]
B --> C[获取文件总大小]
C --> D[计算进度百分比]
D --> E[更新进度条]
E --> F[更新进度文本]
F --> G{升级完成?}
G --> |否| H[继续监控]
G --> |是| I[停止定时器]
```
**图示来源**
- [LicenseUpgrade.cpp](file://cpp/Operator/LicenseUpgrade.cpp#L293-L324)
### 用户反馈机制
用户反馈机制通过消息框和界面元素更新提供清晰的状态信息:
- **成功反馈**: 显示"升级成功"消息框
- **失败反馈**: 显示具体的错误信息
- **进度反馈**: 实时更新进度条和百分比文本
- **警告反馈**: 提示电量不足等潜在问题
```mermaid
flowchart TD
A[升级开始] --> B[显示"正在升级"状态]
B --> C[监控升级过程]
C --> D{升级成功?}
D --> |是| E[显示"升级成功"消息]
D --> |否| F[显示错误详情]
E --> G[关闭对话框]
F --> H[保持对话框]
```
**本节来源**
- [LicenseUpgrade.cpp](file://cpp/Operator/LicenseUpgrade.cpp#L100-L171)
- [LicenseUpgrade.cpp](file://cpp/Operator/LicenseUpgrade.cpp#L293-L324)
## 异常处理与恢复机制
异常处理与恢复机制确保升级过程在遇到问题时能够安全终止,并尽可能恢复到稳定状态。
### 常见异常情况
升级过程中可能遇到的异常情况包括:
- **设备连接中断**: 设备在升级过程中断开连接
- **文件下载失败**: 无法从服务器下载升级文件
- **电量不足**: 设备电量过低,无法安全执行升级
- **超时错误**: 操作在规定时间内未完成
- **权限不足**: 缺少执行升级所需的权限
### 异常处理策略
针对不同异常情况,系统采用相应的处理策略:
```mermaid
flowchart TD
A[检测到异常] --> B{异常类型}
B --> |文件下载失败| C[删除已下载的临时文件]
B --> |电量不足| D[终止升级并提示充电]
B --> |超时错误| E[释放资源并关闭连接]
B --> |权限不足| F[提示用户检查权限]
C --> G[清理资源]
D --> G
E --> G
F --> G
G --> H[显示错误信息]
```
**图示来源**
- [LicenseUpgrade.cpp](file://cpp/Operator/LicenseUpgrade.cpp#L247-L262)
- [LicenseUpgrade.cpp](file://cpp/Operator/LicenseUpgrade.cpp#L363-L370)
**本节来源**
- [LicenseUpgrade.cpp](file://cpp/Operator/LicenseUpgrade.cpp#L247-L262)
- [LicenseUpgrade.cpp](file://cpp/Operator/LicenseUpgrade.cpp#L363-L370)
## 版本兼容性考虑
版本兼容性是固件升级过程中需要重点考虑的问题,确保新固件与现有硬件和软件环境的兼容性。
### 兼容性检查
在执行升级前,系统应进行以下兼容性检查:
- **硬件版本检查**: 确认固件与设备硬件版本匹配
- **软件版本检查**: 确保升级不会破坏现有功能
- **依赖项检查**: 验证所有依赖组件的版本兼容性
- **配置兼容性**: 确保新固件支持现有配置
### 回滚机制
为应对升级后可能出现的兼容性问题,应具备回滚机制:
- **备份旧固件**: 在升级前备份当前固件
- **快速恢复**: 提供快速恢复到旧版本的功能
- **配置保留**: 确保用户配置在回滚后仍然有效
- **日志记录**: 记录升级和回滚过程,便于问题排查
虽然当前代码中未显式实现回滚机制,但通过分阶段的升级流程和临时文件管理,为实现回滚提供了基础。
**本节来源**
- [LicenseUpgrade.cpp](file://cpp/Operator/LicenseUpgrade.cpp#L156-L157)
- [LicenseUpgrade.cpp](file://cpp/Operator/LicenseUpgrade.cpp#L443-L495)
@@ -0,0 +1,165 @@
# 设备状态管理
<cite>
**本文档引用的文件**
- [DevManager.cpp](file://cpp/Managers/DevManager.cpp)
- [DevManager.h](file://h/DevManager.h)
- [Device.cpp](file://cpp/ProblemZone/Device.cpp)
- [Device.h](file://h/Device.h)
- [StateProcessor.cpp](file://cpp/Tools/StateProcessor.cpp)
- [StateProcessor.h](file://h/StateProcessor.h)
- [DialDevStatusTimerShow.cpp](file://cpp/Views/DialDevStatusTimerShow.cpp)
- [DialDevStatusTimerShow.h](file://h/DialDevStatusTimerShow.h)
- [CtrlProtocolDef.h](file://h/CtrlProtocolDef.h)
- [Constant.h](file://h/Constant.h)
</cite>
## 目录
1. [系统概述](#系统概述)
2. [CDevManager状态监控机制](#cdevmanager状态监控机制)
3. [CDevice状态字段设计与更新逻辑](#cdevice状态字段设计与更新逻辑)
4. [状态处理器(StateProcessor)作用](#状态处理器stateprocessor作用)
5. [DialDevStatusTimerShow状态可视化](#dialdevstatustimershows状态可视化)
6. [状态同步异常诊断与恢复](#状态同步异常诊断与恢复)
## 系统概述
GeomativeStudio系统通过CDevManager、CDevice、StateProcessor等核心组件实现对设备运行状态的全面监控与管理。系统采用定时轮询和事件驱动相结合的机制,实时监控设备的在线、离线、忙、空闲等状态。CDevManager作为设备管理的核心类,负责设备的生命周期管理和状态维护;CDevice类封装了单个设备的状态信息和行为;StateProcessor负责状态与UI显示之间的转换;DialDevStatusTimerShow对话框则提供了状态的可视化展示界面。整个系统通过心跳包、状态码解析和回调通知等机制,确保设备状态的准确同步和及时更新。
## CDevManager状态监控机制
CDevManager类通过定时轮询和事件驱动两种机制监控设备状态。在初始化时,通过InitialDevLinkList方法从数据库加载所有设备并设置初始状态为离线(PZ_STATE_OFFLINE)。系统通过GetOLDevList和GetFLDevList方法分别获取在线和离线设备列表,其中在线设备包括状态为PZ_STATE_ONLINE和PZ_STATE_NEW的设备。当设备连接或断开时,通过事件驱动机制更新设备状态:当设备上线时,调用AddRemoteDevice将设备信息加入远程设备集合,并更新设备状态为在线;当设备下线时,调用DeleteRemoteDevice从集合中移除设备,并将状态更新为离线。CDevManager还通过UpdateDevInfo方法接收设备同步参数,更新设备的硬件版本、软件版本、电池电压等信息,并持久化到数据库中。
**Section sources**
- [DevManager.cpp](file://cpp/Managers/DevManager.cpp#L160-L201)
- [DevManager.cpp](file://cpp/Managers/DevManager.cpp#L485-L591)
- [DevManager.h](file://h/DevManager.h#L16-L66)
## CDevice状态字段设计与更新逻辑
CDevice类中的状态字段m_uState是设备状态管理的核心,其设计基于Constant.h中定义的状态常量。设备状态包括PZ_STATE_OFFLINE(离线)、PZ_STATE_ONLINE(在线)和PZ_STATE_NEW(新设备)等。在构造函数中,设备初始状态被设置为PZ_STATE_OFFLINE。状态更新主要通过SetState方法实现,该方法被多个组件调用以反映设备的当前状态。例如,当设备成功连接时,ExecOperator等组件会将状态更新为PZ_STATE_ONLINE;当设备断开连接时,状态被重置为PZ_STATE_OFFLINE。对于新注册的设备,状态被设置为PZ_STATE_NEW,表示设备已注册但尚未建立连接。状态变化时,系统会触发相应的回调通知,更新UI显示和数据库记录。
```mermaid
classDiagram
class CDevice {
+DWORD m_dwID
+UINT m_uState
+UINT m_uType
+BYTE m_ucDevType
+CString m_szDevSN
+CString m_szDevName
+CString m_szModelNO
+CString m_szMDate
+CString m_szHWV
+CString m_szSWV
+CString m_szMBatch
+CString m_szMacAddress
+CSComPort m_sComPort
+_ConnectionPtr m_pConnection
+FILE* m_pLogFile
+SetState(UINT uState)
+SetID(DWORD dwID)
+PrintLog(CString& strLog)
}
class CDevManager {
+CLinkList<CDevice*> m_devLinkList
+_ConnectionPtr m_pConnection
+std : : set<STSigRemoteDev> m_setRemoteDev
+CHandleProcessor m_handleProcessor
+GetDeviceByID(DWORD dwDevID)
+GetDevice(DWORD dwHandle)
+GetDevice(CString szDevSN)
+InitialDevLinkList()
+AddDevice(CDevice* const pDev)
+DeleteObjInMem(DWORD dwHandle)
+DeleteObjInMem(CString szDevSN)
+AddObjInMem(CString szDevSN)
+AddOfflineObjInMem(CString szDevSN)
+DeleteDevice(DWORD dwHandle)
+GetOLDevList(CPtrArray* pOLDevList)
+GetFLDevList(CPtrArray* pFLDevList)
+UpdateDevInfo(STSynDevParam stDevParam, BYTE bRemoteDeveTyp)
+SetDeviceHandle(CDevice* const pDev)
+GetRegisterDevice(CString szDevSN, bool& bIsRegister)
+DeleteDevice(CString strDev)
+AddRemoteDevice(STSigRemoteDev stDevice)
+DeleteRemoteDevice(STSigRemoteDev stDevice)
+GetRemoteDeviceInfo()
}
CDevManager --> CDevice : "管理"
CDevice --> CDevManager : "状态更新"
```
**Diagram sources**
- [Device.h](file://h/Device.h#L33-L127)
- [DevManager.h](file://h/DevManager.h#L16-L66)
**Section sources**
- [Device.cpp](file://cpp/ProblemZone/Device.cpp#L43-L73)
- [Device.h](file://h/Device.h#L88-L105)
- [DevManager.cpp](file://cpp/Managers/DevManager.cpp#L191-L192)
## 状态处理器(StateProcessor)作用
StateProcessor类在设备状态管理和UI显示之间起着桥梁作用。其主要功能是实现设备状态与UI图像状态之间的相互转换。通过ChangeToImageState方法,将设备的内部状态值(如PZ_STATE_ONLINE、PZ_STATE_OFFLINE)转换为TreeView控件使用的图像状态掩码,从而在UI上显示对应的状态图标。反之,通过ChangeToItemState方法,将UI的图像状态转换回内部状态值,便于程序逻辑处理。这种转换机制使得UI显示与业务逻辑分离,提高了代码的可维护性和可扩展性。StateProcessor的实现简单高效,仅包含两个核心方法,避免了复杂的依赖关系。
```mermaid
flowchart TD
A["设备状态更新 (PZ_STATE_ONLINE)"] --> B["StateProcessor::ChangeToImageState()"]
B --> C["生成图像状态掩码"]
C --> D["TreeView控件显示在线图标"]
D --> E["用户看到设备在线"]
F["用户选择设备项"] --> G["TreeView获取图像状态"]
G --> H["StateProcessor::ChangeToItemState()"]
H --> I["转换为内部状态值"]
I --> J["程序逻辑处理"]
```
**Diagram sources**
- [StateProcessor.cpp](file://cpp/Tools/StateProcessor.cpp#L19-L40)
- [StateProcessor.h](file://h/StateProcessor.h#L12-L22)
**Section sources**
- [StateProcessor.cpp](file://cpp/Tools/StateProcessor.cpp#L19-L40)
- [StateProcessor.h](file://h/StateProcessor.h#L14-L19)
## DialDevStatusTimerShow状态可视化
DialDevStatusTimerShow对话框实现了设备状态的可视化展示,特别是PLC设备的状态信息。该对话框继承自CDialog,包含一个CListCtrl控件(m_listData)用于显示状态数据。在OnInitDialog方法中,初始化列表控件的列标题,包括时间、电压、温度和开关状态等。ShowPlcStatusData方法从TaskDataOper组件查询PLC状态数据,并将数据填充到列表控件中。数据显示包括模拟量电压(Voltage1-4)、电池电压、温度和四个开关的开关状态(ON/OFF)。通过设置列表控件的扩展样式(如LVS_EX_FULLROWSELECT、LVS_EX_GRIDLINES),提升了用户体验。该对话框为用户提供了直观的设备状态历史视图,便于监控设备运行状况。
```mermaid
sequenceDiagram
participant Dialog as "DialDevStatusTimerShow"
participant DataOper as "TaskDataOper"
participant DB as "数据库"
Dialog->>Dialog : OnInitDialog()
Dialog->>Dialog : 初始化列表控件列
Dialog->>Dialog : 设置扩展样式
Dialog->>DataOper : QueryPlcStatusData()
DataOper->>DB : 查询PLC状态数据
DB-->>DataOper : 返回状态数据
DataOper-->>Dialog : 返回状态数据向量
loop 遍历每个状态数据
Dialog->>Dialog : 格式化时间字符串
Dialog->>Dialog : 插入列表项
loop 显示6个模拟量
Dialog->>Dialog : 格式化电压值
Dialog->>Dialog : 设置单元格文本
end
loop 显示4个开关状态
Dialog->>Dialog : 转换开关值为ON/OFF
Dialog->>Dialog : 设置单元格文本
end
end
```
**Diagram sources**
- [DialDevStatusTimerShow.cpp](file://cpp/Views/DialDevStatusTimerShow.cpp#L45-L144)
- [DialDevStatusTimerShow.h](file://h/DialDevStatusTimerShow.h#L13-L44)
**Section sources**
- [DialDevStatusTimerShow.cpp](file://cpp/Views/DialDevStatusTimerShow.cpp#L45-L144)
- [DialDevStatusTimerShow.h](file://h/DialDevStatusTimerShow.h#L13-L44)
## 状态同步异常诊断与恢复
系统针对状态同步异常、心跳丢失和状态不一致等问题提供了完善的诊断与恢复策略。当设备长时间未收到心跳包(EN_REQ_HEART_BEAT_PACKET)时,系统判定为心跳丢失,将设备状态从PZ_STATE_ONLINE更新为PZ_STATE_OFFLINE,并记录日志。对于状态不一致问题,系统通过定时轮询和事件驱动双重机制确保状态同步:定时轮询定期检查设备连接状态,而事件驱动机制在收到设备上线/下线通知(EN_RECV_NOTIFY_DEVICE_ONLINE/OFFLINE)时立即更新状态。诊断策略包括:检查网络连接、验证设备响应、比对数据库记录与内存状态。恢复策略包括:重新建立连接、强制状态同步、重启设备通信模块。系统还通过UpdateDevInfo方法确保设备参数的及时更新,避免因参数不一致导致的状态错误。
**Section sources**
- [CtrlProtocolDef.h](file://h/CtrlProtocolDef.h#L546-L547)
- [DevManager.cpp](file://cpp/Managers/DevManager.cpp#L592-L642)
- [DevManager.h](file://h/DevManager.h#L43-L60)
@@ -0,0 +1,393 @@
# 设备管理
<cite>
**本文引用的文件**
- [DevManager.cpp](file://cpp/Managers/DevManager.cpp)
- [DevManager.h](file://h/DevManager.h)
- [Device.cpp](file://cpp/ProblemZone/Device.cpp)
- [Device.h](file://h/Device.h)
- [HandleProcessor.cpp](file://cpp/Tools/HandleProcessor.cpp)
- [HandleProcessor.h](file://h/HandleProcessor.h)
- [CtrlProtocolDef.h](file://h/CtrlProtocolDef.h)
- [Constant.h](file://h/Constant.h)
- [ProManager.cpp](file://cpp/Managers/ProManager.cpp)
- [SptManager.cpp](file://cpp/Managers/SptManager.cpp)
- [devmngframe.cpp](file://cpp/Views/devmngframe.cpp)
- [checkupdate.cpp](file://cpp/Tools/checkupdate.cpp)
</cite>
## 目录
1. [简介](#简介)
2. [项目结构](#项目结构)
3. [核心组件](#核心组件)
4. [架构总览](#架构总览)
5. [组件详解](#组件详解)
6. [依赖关系分析](#依赖关系分析)
7. [性能考量](#性能考量)
8. [故障排查指南](#故障排查指南)
9. [结论](#结论)
10. [附录](#附录)
## 简介
本文件系统性文档化设备管理模块的实现细节,重点覆盖:
- CDevManager 类如何管理设备生命周期(连接、状态监控、固件升级、删除)
- 设备链表 m_devLinkList 的数据结构设计与句柄处理器 HandleProcessor 的集成机制
- CDevice 类的数据模型与其与数据库的交互方式
- 设备注册、状态变更与异常处理的实际调用路径
- 与项目管理器、脚本管理器等模块的协作关系
- 在线/离线模式下的行为差异
- 设备通信协议、错误码处理与性能优化建议
## 项目结构
设备管理相关代码主要分布在以下目录与文件:
- 管理层:DevManager(设备管理器)、ProManager(项目管理器)、SptManager(脚本管理器)
- 业务层:Device(设备实体)
- 工具层:HandleProcessor(句柄处理器)、CtrlProtocolDef(通信协议与错误码定义)
- 视图层:devmngframe(设备管理界面框架),用于触发升级、参数修改等操作
- 工具:checkupdate(固件升级工具)
```mermaid
graph TB
subgraph "管理层"
DM["CDevManager<br/>设备管理器"]
PM["CProManager<br/>项目管理器"]
SM["CSptManager<br/>脚本管理器"]
end
subgraph "业务层"
DEV["CDevice<br/>设备实体"]
end
subgraph "工具层"
HP["CHandleProcessor<br/>句柄处理器"]
CPD["CtrlProtocolDef<br/>通信协议/错误码"]
CT["Constant<br/>常量/状态/句柄位宽"]
end
subgraph "视图层"
DVF["CDevMngFrame<br/>设备管理界面"]
CU["Ccheckupdate<br/>固件升级工具"]
end
DM --> DEV
DM --> HP
DM --> CPD
DM --> CT
PM --> DM
SM --> DM
DVF --> DM
DVF --> DEV
DVF --> CU
```
图表来源
- [DevManager.cpp](file://cpp/Managers/DevManager.cpp#L1-L200)
- [Device.cpp](file://cpp/ProblemZone/Device.cpp#L1-L120)
- [HandleProcessor.cpp](file://cpp/Tools/HandleProcessor.cpp#L1-L96)
- [CtrlProtocolDef.h](file://h/CtrlProtocolDef.h#L1-L120)
- [Constant.h](file://h/Constant.h#L60-L120)
- [ProManager.cpp](file://cpp/Managers/ProManager.cpp#L1-L120)
- [SptManager.cpp](file://cpp/Managers/SptManager.cpp#L1780-L1840)
- [devmngframe.cpp](file://cpp/Views/devmngframe.cpp#L47-L96)
- [checkupdate.cpp](file://cpp/Tools/checkupdate.cpp#L1292-L1336)
章节来源
- [DevManager.cpp](file://cpp/Managers/DevManager.cpp#L1-L200)
- [Device.cpp](file://cpp/ProblemZone/Device.cpp#L1-L120)
- [HandleProcessor.cpp](file://cpp/Tools/HandleProcessor.cpp#L1-L96)
- [CtrlProtocolDef.h](file://h/CtrlProtocolDef.h#L1-L120)
- [Constant.h](file://h/Constant.h#L60-L120)
- [ProManager.cpp](file://cpp/Managers/ProManager.cpp#L1-L120)
- [SptManager.cpp](file://cpp/Managers/SptManager.cpp#L1780-L1840)
- [devmngframe.cpp](file://cpp/Views/devmngframe.cpp#L47-L96)
- [checkupdate.cpp](file://cpp/Tools/checkupdate.cpp#L1292-L1336)
## 核心组件
- CDevManager:负责设备生命周期管理、设备链表维护、句柄分配、数据库交互、在线/离线设备列表构建、远程设备集合维护、设备信息更新等。
- CDevice:封装设备数据模型(ID、状态、类型、序列号、硬件/软件版本、电池电压、参数等),并提供与数据库交互的方法(展示详情、读取/写入参数、文件收发、GR/AC信息等)。
- CHandleProcessor:负责句柄生成与解析,将ID与类型打包进统一的DWORD句柄,支持从句柄中提取ID与类型。
- CtrlProtocolDef:定义控制协议头、设备参数结构、命令字、错误码、远程设备信息等。
- Constant:定义句柄位宽、状态枚举、消息常量、缓冲区大小、轮询超时等通用常量。
章节来源
- [DevManager.h](file://h/DevManager.h#L1-L69)
- [Device.h](file://h/Device.h#L1-L128)
- [HandleProcessor.h](file://h/HandleProcessor.h#L1-L29)
- [CtrlProtocolDef.h](file://h/CtrlProtocolDef.h#L1-L120)
- [Constant.h](file://h/Constant.h#L60-L120)
## 架构总览
设备管理模块围绕“设备管理器-设备实体-句柄处理器-通信协议-视图/工具”的分层组织,形成清晰的职责边界与调用链路。
```mermaid
sequenceDiagram
participant UI as "视图/界面"
participant DM as "CDevManager"
participant DEV as "CDevice"
participant HP as "CHandleProcessor"
participant DB as "数据库"
participant NET as "网络/远程设备"
UI->>DM : 请求初始化设备链表
DM->>DB : 查询设备表(device)
DB-->>DM : 返回设备记录集
loop 遍历记录
DM->>DEV : 构造CDevice实例
DM->>HP : 生成句柄(设备ID, 类型)
DM->>DM : m_devLinkList.Add(句柄, 设备)
end
UI->>DM : 获取在线/离线设备列表
DM->>DM : 遍历m_devLinkList
DM-->>UI : 返回在线/离线设备数组
UI->>DM : 更新设备参数/信息
DM->>DB : 写入设备参数/信息
DB-->>DM : 提交成功
UI->>DM : 删除设备
DM->>DB : 删除设备及关联表记录
DB-->>DM : 提交成功
UI->>DM : 远程设备上下线通知
DM->>NET : 维护远程设备集合(set)
DM-->>UI : 同步状态
```
图表来源
- [DevManager.cpp](file://cpp/Managers/DevManager.cpp#L160-L201)
- [DevManager.cpp](file://cpp/Managers/DevManager.cpp#L486-L508)
- [DevManager.cpp](file://cpp/Managers/DevManager.cpp#L510-L591)
- [DevManager.cpp](file://cpp/Managers/DevManager.cpp#L592-L642)
- [DevManager.cpp](file://cpp/Managers/DevManager.cpp#L383-L433)
- [DevManager.cpp](file://cpp/Managers/DevManager.cpp#L435-L483)
- [DevManager.h](file://h/DevManager.h#L20-L66)
- [HandleProcessor.cpp](file://cpp/Tools/HandleProcessor.cpp#L29-L57)
## 组件详解
### CDevManager:设备生命周期与链表管理
- 初始化设备链表:从数据库读取设备记录,构造 CDevice 对象,生成句柄并加入 m_devLinkList。
- 设备查询:按ID、句柄、序列号查询设备,并进行MAC白名单匹配。
- 设备增删改:新增设备(含默认desetting/acds表初始化)、删除设备(级联清理)、设置句柄。
- 在线/离线列表:遍历链表筛选在线/离线设备。
- 远程设备集合:维护远程GD10/PLC设备集合,支持增删。
- 设备信息更新:接收远程设备参数,写入数据库。
```mermaid
flowchart TD
Start(["初始化设备链表"]) --> QueryDB["查询设备表(device)"]
QueryDB --> Loop{"遍历记录"}
Loop --> |是| NewDev["构造CDevice实例"]
NewDev --> GenHandle["生成句柄(设备ID, 类型)"]
GenHandle --> AddList["m_devLinkList.Add(句柄, 设备)"]
AddList --> Loop
Loop --> |否| End(["完成"])
subgraph "查询与筛选"
Q1["按ID查询"] --> Q2["按句柄查询"]
Q3["按序列号查询"] --> Q4["在线/离线列表"]
end
```
图表来源
- [DevManager.cpp](file://cpp/Managers/DevManager.cpp#L160-L201)
- [DevManager.cpp](file://cpp/Managers/DevManager.cpp#L48-L80)
- [DevManager.cpp](file://cpp/Managers/DevManager.cpp#L82-L90)
- [DevManager.cpp](file://cpp/Managers/DevManager.cpp#L127-L158)
- [DevManager.cpp](file://cpp/Managers/DevManager.cpp#L486-L508)
- [DevManager.cpp](file://cpp/Managers/DevManager.cpp#L510-L591)
章节来源
- [DevManager.cpp](file://cpp/Managers/DevManager.cpp#L48-L158)
- [DevManager.cpp](file://cpp/Managers/DevManager.cpp#L160-L201)
- [DevManager.cpp](file://cpp/Managers/DevManager.cpp#L203-L281)
- [DevManager.cpp](file://cpp/Managers/DevManager.cpp#L283-L294)
- [DevManager.cpp](file://cpp/Managers/DevManager.cpp#L296-L323)
- [DevManager.cpp](file://cpp/Managers/DevManager.cpp#L325-L381)
- [DevManager.cpp](file://cpp/Managers/DevManager.cpp#L383-L483)
- [DevManager.cpp](file://cpp/Managers/DevManager.cpp#L486-L591)
- [DevManager.cpp](file://cpp/Managers/DevManager.cpp#L592-L642)
- [DevManager.h](file://h/DevManager.h#L16-L66)
### CDevice:设备数据模型与数据库交互
- 数据模型:包含设备ID、状态、类型、序列号、名称、型号、硬件/软件版本、生产日期、批次、MAC地址、数据库连接指针等。
- 数据库交互:展示离线/在线详情、读取/写入desetting/acds参数、读取devgr/devac信息、执行脚本同步等。
- 文件传输:支持接收/发送文件(Zmodem流程),带重试逻辑。
- 参数与状态:提供参数修改、时间窗修改、锁机、重置等能力。
```mermaid
classDiagram
class CDevice {
+DWORD m_dwID
+UINT m_uState
+UINT m_uType
+BYTE m_ucDevType
+CString m_szDevSN
+CString m_szDevName
+CString m_szModelNO
+CString m_szHWV
+CString m_szSWV
+CString m_szMacAddress
+_ConnectionPtr m_pConnection
+PrintLog(strLog)
+ShowFLDetailInfo(list)
+ShowOLDetailInfo(list)
+ShowGRInfo(list)
+ShowACInfo(list)
+ReceiveFile(local, host, retry)
+SendFile(host, local, name)
}
```
图表来源
- [Device.h](file://h/Device.h#L33-L128)
- [Device.cpp](file://cpp/ProblemZone/Device.cpp#L115-L192)
- [Device.cpp](file://cpp/ProblemZone/Device.cpp#L193-L280)
- [Device.cpp](file://cpp/ProblemZone/Device.cpp#L511-L547)
- [Device.cpp](file://cpp/ProblemZone/Device.cpp#L549-L649)
- [Device.cpp](file://cpp/ProblemZone/Device.cpp#L682-L727)
章节来源
- [Device.h](file://h/Device.h#L33-L128)
- [Device.cpp](file://cpp/ProblemZone/Device.cpp#L115-L280)
- [Device.cpp](file://cpp/ProblemZone/Device.cpp#L511-L649)
- [Device.cpp](file://cpp/ProblemZone/Device.cpp#L682-L727)
### 句柄处理器 CHandleProcessorID与类型编码
- 生成句柄:将设备ID与类型按固定位宽打包,类型高位存放,ID低位存放。
- 解析句柄:从句柄中提取ID与类型。
- 位宽定义:来自 Constant 中 HANDLE_OFFSET 常量,确保ID与类型的位域合理分配。
```mermaid
flowchart TD
A["输入: 设备ID, 类型"] --> B["类型左移HANDLE_OFFSET位"]
B --> C["ID按位或运算"]
C --> D["输出: 句柄DWORD"]
D --> E["解析: 取低27位ID, 取高5位类型"]
```
图表来源
- [HandleProcessor.cpp](file://cpp/Tools/HandleProcessor.cpp#L29-L57)
- [HandleProcessor.cpp](file://cpp/Tools/HandleProcessor.cpp#L59-L95)
- [Constant.h](file://h/Constant.h#L60-L70)
章节来源
- [HandleProcessor.cpp](file://cpp/Tools/HandleProcessor.cpp#L29-L95)
- [HandleProcessor.h](file://h/HandleProcessor.h#L12-L29)
- [Constant.h](file://h/Constant.h#L60-L70)
### 设备通信协议与错误码
- 协议头与参数结构:STCtrlProtoHeader、STSynDevParam、STModifyDevParam 等,定义了控制命令、数据类型、状态码、设备参数等。
- 命令字与状态:EN_CTRL_CMD_INFO 定义了登录、参数同步、参数设置、任务参数设置、测量数据、心跳等命令字;EN_RCV_MSG_RES/EN_ERROR_MSG 定义了接收结果与错误码。
- 远程设备信息:STSigRemoteDev 定义远程GD10/PLC设备标识与比较规则。
章节来源
- [CtrlProtocolDef.h](file://h/CtrlProtocolDef.h#L46-L120)
- [CtrlProtocolDef.h](file://h/CtrlProtocolDef.h#L126-L237)
- [CtrlProtocolDef.h](file://h/CtrlProtocolDef.h#L441-L548)
### 设备注册、状态变更与异常处理
- 注册查询:GetRegisterDevice 会检查设备是否已在链表中存在,并与当前MAC白名单比对,避免跨网卡误判。
- 状态变更:CDevice::SetState 设置设备状态;CDevManager::UpdateDevInfo 将远程设备参数写入数据库。
- 异常处理:数据库事务 Begin/Commit/Rollback 包裹关键操作;捕获_com_error 并弹窗提示;全局钩子用于统一错误提示。
章节来源
- [DevManager.cpp](file://cpp/Managers/DevManager.cpp#L92-L125)
- [DevManager.cpp](file://cpp/Managers/DevManager.cpp#L127-L158)
- [DevManager.cpp](file://cpp/Managers/DevManager.cpp#L592-L642)
- [Device.cpp](file://cpp/ProblemZone/Device.cpp#L75-L84)
### 与项目管理器、脚本管理器的协作
- 项目管理器:通过句柄处理器解析工程/测试区句柄,构建数据管理结构(CProject/CTestingZone),并与设备建立关联(dptt表)。
- 脚本管理器:在离线模式下创建脚本文件,与设备ID关联;在线模式下通过设备与脚本同步(脚本下发/接收)。
章节来源
- [ProManager.cpp](file://cpp/Managers/ProManager.cpp#L155-L182)
- [ProManager.cpp](file://cpp/Managers/ProManager.cpp#L184-L215)
- [SptManager.cpp](file://cpp/Managers/SptManager.cpp#L1782-L1834)
### 在线/离线模式行为差异
- 在线模式:设备状态可能为 EN_DEV_ONLINE 或 NEW;设备参数通过协议同步至数据库;支持实时数据接收与状态通知。
- 离线模式:设备状态为 OFFLINE;通过数据库直接展示设备参数与历史数据;部分操作(如参数同步)受限。
章节来源
- [CtrlProtocolDef.h](file://h/CtrlProtocolDef.h#L42-L44)
- [DevManager.cpp](file://cpp/Managers/DevManager.cpp#L486-L508)
- [devmngframe.cpp](file://cpp/Views/devmngframe.cpp#L1710-L1753)
### 固件升级与参数修改
- 固件升级:通过 CDevMngFrame 触发升级流程,使用 Ccheckupdate 下载/校验/执行升级,涉及文件发送、命令下发与结果校验。
- 参数修改:通过 CDevice 接口修改参数,结合 CtrlProtocolDef 中的命令字与参数结构进行下发与确认。
章节来源
- [devmngframe.cpp](file://cpp/Views/devmngframe.cpp#L47-L96)
- [checkupdate.cpp](file://cpp/Tools/checkupdate.cpp#L1292-L1336)
- [CtrlProtocolDef.h](file://h/CtrlProtocolDef.h#L508-L548)
## 依赖关系分析
- CDevManager 依赖 CDevice、CHandleProcessor、CtrlProtocolDef、Constant、数据库连接。
- CDevice 依赖数据库连接、文件传输工具、对话框组件。
- 视图层(CDevMngFrame)依赖设备管理器与升级工具。
- 项目/脚本管理器通过句柄与设备管理器解耦协作。
```mermaid
graph LR
DM["CDevManager"] --> DEV["CDevice"]
DM --> HP["CHandleProcessor"]
DM --> CPD["CtrlProtocolDef"]
DM --> CT["Constant"]
DEV --> DB["数据库"]
DVF["CDevMngFrame"] --> DM
DVF --> CU["Ccheckupdate"]
PM["CProManager"] --> DM
SM["CSptManager"] --> DM
```
图表来源
- [DevManager.h](file://h/DevManager.h#L16-L66)
- [Device.h](file://h/Device.h#L33-L128)
- [HandleProcessor.h](file://h/HandleProcessor.h#L12-L29)
- [CtrlProtocolDef.h](file://h/CtrlProtocolDef.h#L1-L120)
- [Constant.h](file://h/Constant.h#L60-L120)
- [ProManager.cpp](file://cpp/Managers/ProManager.cpp#L155-L182)
- [SptManager.cpp](file://cpp/Managers/SptManager.cpp#L1782-L1834)
- [devmngframe.cpp](file://cpp/Views/devmngframe.cpp#L47-L96)
- [checkupdate.cpp](file://cpp/Tools/checkupdate.cpp#L1292-L1336)
章节来源
- [DevManager.h](file://h/DevManager.h#L16-L66)
- [Device.h](file://h/Device.h#L33-L128)
- [HandleProcessor.h](file://h/HandleProcessor.h#L12-L29)
- [CtrlProtocolDef.h](file://h/CtrlProtocolDef.h#L1-L120)
- [Constant.h](file://h/Constant.h#L60-L120)
- [ProManager.cpp](file://cpp/Managers/ProManager.cpp#L155-L182)
- [SptManager.cpp](file://cpp/Managers/SptManager.cpp#L1782-L1834)
- [devmngframe.cpp](file://cpp/Views/devmngframe.cpp#L47-L96)
- [checkupdate.cpp](file://cpp/Tools/checkupdate.cpp#L1292-L1336)
## 性能考量
- 句柄位宽与哈希/索引:HANDLE_OFFSET 与类型位域设计保证了O(1)的句柄解析与查找效率,适合大规模设备场景。
- 数据库事务:关键操作(新增/删除设备、参数更新)使用事务包裹,减少中间态风险,但需注意事务开销与锁竞争。
- 文件传输重试:接收文件具备重试机制,提升稳定性,但应限制最大重试次数与退避策略,避免阻塞UI。
- 轮询与超时:通信轮询次数与超时常量(MAX_POLLING_TIME、COMM_TIMEOUT)影响响应速度与资源占用,应根据实际通信环境调整。
- 在线/离线列表构建:遍历链表筛选在线/离线设备为O(N),建议在频繁刷新场景引入增量更新与缓存。
## 故障排查指南
- 设备注册失败:检查 GetRegisterDevice 中 MAC 白名单匹配逻辑,确认当前网卡MAC与设备记录一致。
- 数据库异常:AddDevice/DeleteDevice/UpdateDevInfo 使用事务,捕获_com_error后回滚并弹窗提示,优先检查SQL语句与权限。
- 文件传输失败:查看 ReceiveFile 的重试逻辑与 EndTransfer 终止流程,确认Zmodem握手与缓冲区大小。
- 远程设备状态不同步:核对远程设备集合维护逻辑(AddRemoteDevice/DeleteRemoteDevice),确保上下线通知正确到达。
章节来源
- [DevManager.cpp](file://cpp/Managers/DevManager.cpp#L92-L125)
- [DevManager.cpp](file://cpp/Managers/DevManager.cpp#L203-L281)
- [DevManager.cpp](file://cpp/Managers/DevManager.cpp#L383-L483)
- [Device.cpp](file://cpp/ProblemZone/Device.cpp#L682-L727)
- [DevManager.h](file://h/DevManager.h#L41-L66)
## 结论
设备管理模块通过“设备管理器-设备实体-句柄处理器-通信协议-视图/工具”的分层设计,实现了设备生命周期的完整闭环管理。其数据结构与句柄编码保证了高效稳定的设备索引;数据库事务与错误处理提升了可靠性;与项目/脚本管理器的协作使设备与数据、脚本的联动更加顺畅。在线/离线模式的差异化行为满足多场景需求,配合通信协议与错误码体系,为后续扩展(如云端托管、远程诊断)提供了坚实基础。
## 附录
- 关键调用路径参考
- 初始化设备链表:[DevManager.cpp](file://cpp/Managers/DevManager.cpp#L160-L201)
- 查询设备:[DevManager.cpp](file://cpp/Managers/DevManager.cpp#L48-L158)
- 在线/离线列表:[DevManager.cpp](file://cpp/Managers/DevManager.cpp#L486-L591)
- 更新设备参数:[DevManager.cpp](file://cpp/Managers/DevManager.cpp#L592-L642)
- 删除设备:[DevManager.cpp](file://cpp/Managers/DevManager.cpp#L383-L483)
- 设备详情展示:[Device.cpp](file://cpp/ProblemZone/Device.cpp#L115-L280)
- GR/AC信息展示:[Device.cpp](file://cpp/ProblemZone/Device.cpp#L511-L649)
- 文件接收/发送:[Device.cpp](file://cpp/ProblemZone/Device.cpp#L682-L727)
- 固件升级触发:[devmngframe.cpp](file://cpp/Views/devmngframe.cpp#L47-L96)
- 升级执行与校验:[checkupdate.cpp](file://cpp/Tools/checkupdate.cpp#L1292-L1336)
@@ -0,0 +1,280 @@
# 设备连接与注册
<cite>
**本文档引用的文件**
- [DevManager.cpp](file://cpp/Managers/DevManager.cpp)
- [DevManager.h](file://h/DevManager.h)
- [SComPort.cpp](file://cpp/Tools/SComPort.cpp)
- [SComPort.h](file://h/SComPort.h)
- [Device.cpp](file://cpp/ProblemZone/Device.cpp)
- [Device.h](file://h/Device.h)
- [DetcGD10Dev.cpp](file://cpp/Operator/DetcGD10Dev.cpp)
- [DetcGD10Dev.h](file://h/DetcGD10Dev.h)
- [GD10OperCmd.cpp](file://cpp/Tools/GD10OperCmd.cpp)
- [GD10OperCmd.h](file://h/GD10OperCmd.h)
- [Global.cpp](file://cpp/Main/Global.cpp)
</cite>
## 目录
1. [引言](#引言)
2. [设备连接与枚举](#设备连接与枚举)
3. [设备注册与数据初始化](#设备注册与数据初始化)
4. [CDevice对象与链表管理](#cdevice对象与链表管理)
5. [连接状态与通知机制](#连接状态与通知机制)
6. [常见问题与解决方案](#常见问题与解决方案)
7. [结论](#结论)
## 引言
本文档详细阐述了GeomativeStudio软件中设备连接与注册功能的实现机制。核心组件`CDevManager`负责管理所有设备的生命周期,通过`SComPort`类与GD10设备建立串口通信,实现设备的自动检测、握手、注册和数据同步。文档将深入分析从物理连接检测到设备对象在内存中创建并注册的完整流程。
## 设备连接与枚举
设备连接的起点是检测物理设备的存在。系统通过`CDetcGD10Dev`类来检测连接的GD10设备。
```mermaid
flowchart TD
A[开始检测设备] --> B[枚举所有逻辑驱动器]
B --> C{驱动器类型为可移动磁盘?}
C --> |是| D[获取驱动器卷标]
D --> E{卷标为"GD10"或"GD20"?}
E --> |是| F[记录设备地址]
E --> |否| G[检查是否存在\\SD\\equipment目录]
G --> |存在| F
G --> |不存在| H[继续下一个驱动器]
C --> |否| H
H --> I{遍历完所有驱动器?}
I --> |否| B
I --> |是| J[返回设备地址]
```
**Diagram sources**
- [DetcGD10Dev.cpp](file://cpp/Operator/DetcGD10Dev.cpp#L100-L173)
**Section sources**
- [DetcGD10Dev.cpp](file://cpp/Operator/DetcGD10Dev.cpp#L61-L68)
- [DetcGD10Dev.h](file://h/DetcGD10Dev.h#L22)
### 串口通信建立
一旦检测到设备,`CDevManager`会通过`SComPort`类建立串口通信。`SComPort``OpenComm`方法负责初始化串口。
```mermaid
sequenceDiagram
participant CDevManager as CDevManager
participant SComPort as SComPort
participant OS as 操作系统
CDevManager->>SComPort : OpenComm("COM3")
SComPort->>OS : CreateFile("\\\\.\\COM3")
OS-->>SComPort : 返回设备句柄
SComPort->>SComPort : SetupComm(设置缓冲区大小)
SComPort->>SComPort : GetCommState(获取当前配置)
SComPort->>SComPort : 配置DCB结构体
SComPort->>SComPort : SetCommState(应用配置)
SComPort->>SComPort : SetCommMask(设置事件掩码)
SComPort-->>CDevManager : 返回TRUE(成功)
```
**Diagram sources**
- [SComPort.cpp](file://cpp/Tools/SComPort.cpp#L127-L222)
- [SComPort.h](file://h/SComPort.h#L34)
**Section sources**
- [SComPort.cpp](file://cpp/Tools/SComPort.cpp#L127-L222)
## 设备注册与数据初始化
当设备通过串口成功连接后,需要进行注册,将设备的物理信息同步到本地数据库。
### 设备信息读取
`CDevice`类的`GetDevInfo`方法负责从GD10设备读取其硬件和固件信息。
```mermaid
flowchart TD
A[调用GetDevInfo] --> B[发送"device_ex_info()"命令]
B --> C[等待设备响应]
C --> D{收到响应?}
D --> |是| E[解析响应数据]
E --> F[提取硬件版本(HWV)]
E --> G[提取固件版本(SWV)]
E --> H[提取生产日期(Mdate)]
E --> I[提取批次号(Mbatch)]
F --> J[更新CDevice对象属性]
G --> J
H --> J
I --> J
J --> K[将信息写入本地数据库]
K --> L[返回成功]
D --> |否| M[返回失败]
```
**Diagram sources**
- [Device.cpp](file://cpp/ProblemZone/Device.cpp#L1008-L1053)
**Section sources**
- [Device.cpp](file://cpp/ProblemZone/Device.cpp#L1008-L1113)
### 设备注册流程
设备信息读取成功后,`CDevManager`会调用`AddDevice`方法将设备正式注册到系统中。
```mermaid
classDiagram
class CDevManager {
+AddDevice(CDevice* pDev)
+InitialDevLinkList()
+GetDeviceByID(DWORD dwDevID)
}
class CDevice {
+m_szDevSN
+m_szModelNO
+m_szHWV
+m_szSWV
+m_uState
+m_dwID
}
class _ConnectionPtr {
+BeginTrans()
+CommitTrans()
+RollbackTrans()
}
CDevManager --> CDevice : 持有
CDevManager --> _ConnectionPtr : 使用
CDevManager --> CDevice : 注册
```
**Diagram sources**
- [DevManager.cpp](file://cpp/Managers/DevManager.cpp#L203-L280)
- [DevManager.h](file://h/DevManager.h#L30)
**Section sources**
- [DevManager.cpp](file://cpp/Managers/DevManager.cpp#L203-L280)
## CDevice对象与链表管理
`CDevManager`使用一个链表`m_devLinkList`来管理所有已注册的设备对象。
### 对象创建与注册
当一个新设备被发现时,`CDevManager`会创建一个`CDevice`对象,并将其添加到链表中。
```mermaid
sequenceDiagram
participant CDevManager as CDevManager
participant CDevice as CDevice
participant LinkList as CLinkList
CDevManager->>CDevice : new CDevice()
CDevice-->>CDevManager : 返回指针
CDevManager->>CDevManager : m_handleProcessor.GenerateHandle()
CDevManager->>LinkList : m_devLinkList.Add(句柄, CDevice指针)
LinkList-->>CDevManager : 添加成功
```
**Diagram sources**
- [DevManager.cpp](file://cpp/Managers/DevManager.cpp#L325-L343)
- [DevManager.h](file://h/DevManager.h#L63)
**Section sources**
- [DevManager.cpp](file://cpp/Managers/DevManager.cpp#L325-L343)
### 链表管理机制
`CLinkList`类提供了对设备对象的增删查改操作,`CDevManager`通过设备ID或句柄来访问特定的`CDevice`对象。
```mermaid
classDiagram
class CLinkList {
+Add(DWORD handle, CDevice* pDev)
+Delete(DWORD handle)
+Delete(CDevice* pDev)
+Get(DWORD handle) CDevice*
+Find(int index) CDevice*
+Length() int
+DeleteAll()
}
class CDevice {
+m_dwID
+m_szDevSN
+m_uState
}
CLinkList "1" --> "*" CDevice : 包含
```
**Diagram sources**
- [DevManager.h](file://h/DevManager.h#L63)
- [DevManager.cpp](file://cpp/Managers/DevManager.cpp#L48-L68)
**Section sources**
- [DevManager.h](file://h/DevManager.h#L63)
## 连接状态与通知机制
系统通过`CDevice`对象的`m_uState`属性来跟踪设备的连接状态,并通过UI层进行通知。
### 状态变更流程
设备的状态会随着连接过程而改变,从`PZ_STATE_NEW``PZ_STATE_ONLINE`
```mermaid
stateDiagram-v2
[*] --> PZ_STATE_OFFLINE
PZ_STATE_OFFLINE --> PZ_STATE_NEW : 设备被发现
PZ_STATE_NEW --> PZ_STATE_ONLINE : 注册成功
PZ_STATE_NEW --> PZ_STATE_OFFLINE : 注册失败
PZ_STATE_ONLINE --> PZ_STATE_OFFLINE : 连接断开
```
**Diagram sources**
- [Device.h](file://h/Device.h#L89)
- [Device.cpp](file://cpp/ProblemZone/Device.cpp#L75-L77)
**Section sources**
- [Device.h](file://h/Device.h#L89)
### UI层响应
当设备状态发生变化时,UI层会更新设备列表视图,显示最新的设备信息。
```mermaid
sequenceDiagram
participant CDevice as CDevice
participant CDevManager as CDevManager
participant UI as UI界面
CDevice->>CDevice : SetState(PZ_STATE_ONLINE)
CDevice->>CDevManager : 通知状态变更
CDevManager->>UI : 发送WM_DEVICE_STATE_CHANGED消息
UI->>UI : 更新设备列表
UI->>UI : 刷新设备详细信息
```
**Diagram sources**
- [Device.cpp](file://cpp/ProblemZone/Device.cpp#L75-L77)
- [DevManager.cpp](file://cpp/Managers/DevManager.cpp#L489-L507)
**Section sources**
- [Device.cpp](file://cpp/ProblemZone/Device.cpp#L75-L77)
## 常见问题与解决方案
在设备连接过程中可能会遇到各种问题,系统提供了相应的处理机制。
### 连接超时
如果在规定时间内未能收到设备的响应,则判定为连接超时。
**解决方案**:
1. 检查设备电源是否开启。
2. 检查USB线缆是否连接牢固。
3. 尝试更换USB端口或线缆。
4. 重启设备和软件。
### 端口占用
如果目标串口已被其他程序占用,则无法打开。
**解决方案**:
1. 关闭可能占用该串口的其他程序(如串口调试助手)。
2. 在设备管理器中检查端口状态。
3. 重启计算机以释放所有端口。
### 协议不匹配
如果设备固件版本过低,可能不支持当前软件的通信协议。
**解决方案**:
1. 检查设备固件版本。
2. 使用`IAP-GD10.bat`工具对设备进行固件升级。
3. 确保软件版本与设备固件版本兼容。
## 结论
GeomativeStudio的设备连接与注册功能通过`CDevManager``SComPort``CDevice`等核心类协同工作,实现了从物理设备检测、串口通信建立、设备信息读取、数据库注册到UI状态更新的完整流程。该设计具有良好的模块化和可维护性,能够稳定地管理GD10设备的连接生命周期。