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,419 @@
# DevManager
<cite>
**本文档中引用的文件**
- [DevManager.cpp](file://cpp/Managers/DevManager.cpp)
- [DevManager.h](file://h/DevManager.h)
- [DetcGD10Dev.cpp](file://cpp/Operator/DetcGD10Dev.cpp)
- [DetcGD10Dev.h](file://h/DetcGD10Dev.h)
- [Device.cpp](file://cpp/ProblemZone/Device.cpp)
- [Device.h](file://h/Device.h)
- [SComPort.cpp](file://cpp/Tools/SComPort.cpp)
- [SComPort.h](file://h/SComPort.h)
- [GD10OperCmd.cpp](file://cpp/Tools/GD10OperCmd.cpp)
- [checkupdate.cpp](file://cpp/Tools/checkupdate.cpp)
- [checkupdate.h](file://h/checkupdate.h)
- [ProManager.cpp](file://cpp/Managers/ProManager.cpp)
- [TdManager.cpp](file://cpp/Managers/TdManager.cpp)
</cite>
## 目录
1. [介绍](#介绍)
2. [项目结构](#项目结构)
3. [核心组件](#核心组件)
4. [架构概述](#架构概述)
5. [详细组件分析](#详细组件分析)
6. [依赖分析](#依赖分析)
7. [性能考虑](#性能考虑)
8. [故障排除指南](#故障排除指南)
9. [结论](#结论)
## 介绍
DevManager模块是Geomative Studio系统中的核心组件,负责管理与GD10设备的连接、状态监控、参数配置和固件升级。该模块通过串口与GD10设备通信,使用DetcGD10Dev类进行设备检测,以及Device类对设备状态进行封装。DevManager与其他管理器(如ProManager、TdManager)协同工作,确保设备连接成功后能够同步项目信息和测量数据。本文档将详细说明DevManager的职责和实现,提供设备连接失败、通信超时等常见问题的解决方案,并分析其与其他管理器的数据交互流程。
## 项目结构
DevManager模块位于`cpp/Managers/`目录下,主要由`DevManager.cpp``DevManager.h`文件组成。该模块依赖于`Operator`目录下的`DetcGD10Dev.cpp``Device.cpp`文件,以及`Tools`目录下的`SComPort.cpp``GD10OperCmd.cpp`文件。`DetcGD10Dev`类负责检测GD10设备的连接状态,`Device`类封装了设备的状态和操作,`SComPort`类提供了串口通信功能,而`GD10OperCmd`类则处理与GD10设备的命令交互。
```mermaid
graph TD
subgraph "Managers"
DevManager[DevManager.cpp/h]
ProManager[ProManager.cpp/h]
TdManager[TdManager.cpp/h]
end
subgraph "Operator"
DetcGD10Dev[DetcGD10Dev.cpp/h]
Device[Device.cpp/h]
end
subgraph "Tools"
SComPort[SComPort.cpp/h]
GD10OperCmd[GD10OperCmd.cpp/h]
checkupdate[checkupdate.cpp/h]
end
DevManager --> DetcGD10Dev
DevManager --> Device
DevManager --> SComPort
DevManager --> GD10OperCmd
DevManager --> ProManager
DevManager --> TdManager
```
**图源**
- [DevManager.cpp](file://cpp/Managers/DevManager.cpp#L1-L661)
- [DetcGD10Dev.cpp](file://cpp/Operator/DetcGD10Dev.cpp#L1-L189)
- [Device.cpp](file://cpp/ProblemZone/Device.cpp#L1-L3893)
- [SComPort.cpp](file://cpp/Tools/SComPort.cpp#L1-L1199)
- [GD10OperCmd.cpp](file://cpp/Tools/GD10OperCmd.cpp#L1-L1213)
- [ProManager.cpp](file://cpp/Managers/ProManager.cpp#L1-L2054)
- [TdManager.cpp](file://cpp/Managers/TdManager.cpp#L1-L6839)
## 核心组件
DevManager模块的核心组件包括`CDevManager`类、`CDetcGD10Dev`类和`CDevice`类。`CDevManager`类负责管理设备的生命周期,包括设备的添加、删除、状态更新等操作。`CDetcGD10Dev`类用于检测GD10设备的连接状态,`CDevice`类则封装了设备的状态和操作。
**组件源**
- [DevManager.cpp](file://cpp/Managers/DevManager.cpp#L1-L661)
- [DetcGD10Dev.cpp](file://cpp/Operator/DetcGD10Dev.cpp#L1-L189)
- [Device.cpp](file://cpp/ProblemZone/Device.cpp#L1-L3893)
## 架构概述
DevManager模块的架构设计遵循分层原则,将设备管理、通信、状态监控等功能分离。`CDevManager`类作为顶层管理器,负责协调各个子组件的工作。`CDetcGD10Dev`类负责设备检测,`CDevice`类负责设备状态的封装和操作,`SComPort`类提供串口通信功能,`GD10OperCmd`类处理与GD10设备的命令交互。
```mermaid
classDiagram
class CDevManager {
+InitialDevLinkList()
+AddDevice(CDevice* const pDev)
+DeleteDevice(DWORD dwHandle)
+GetDeviceByID(DWORD dwDevID)
+GetDevice(DWORD dwHandle)
+GetDevice(CString szDevSN)
+GetRegisterDevice(CString szDevSN, bool &bIsRegister)
+GetOLDevList(CPtrArray *pOLDevList)
+GetFLDevList(CPtrArray* pFLDevList)
+UpdateDevInfo(STSynDevParam stDevParam, BYTE bRemoteDeveTyp)
+SetDeviceHandle(CDevice* const pDev)
+DeleteObjInMem(DWORD dwHandle)
+DeleteObjInMem(CString szDevSN)
+AddObjInMem(CString szDevSN)
+AddOfflineObjInMem(CString szDevSN)
+DeleteDevice(CString strDev)
+AddRemoteDevice(STSigRemoteDev stDevice)
+DeleteRemoteDevice(STSigRemoteDev stDevice)
+GetRemoteDeviceInfo()
}
class CDetcGD10Dev {
+GetInstance()
+DetectGD10Dev()
+GetGD10DevAddr()
+IsGD10DevConnect()
+FindUsbDevice(CString strDevName)
+CompareDriverName(CString strDriName, CString strDriverAddr)
+PrintLog(CString strLog)
}
class CDevice {
+CDevice(DWORD dwID, _ConnectionPtr& pConnection)
+~CDevice()
+Reset()
+ShowFLDetailInfo(CListCtrl &devDetailList)
+ShowOLDetailInfo(CListCtrl& devDetailList)
+ShowGRInfo(CListCtrl& devGRList)
+ShowACInfo(CListCtrl& devDetailList)
+ShowCableHeadInfoDlg()
+ReceiveFile(const CString &szLocFilePath, const CString& szHostFileName, int nRetryCnt)
+SendFile(const CString &szHostFilePath, const CString &szLocFilePath, const CString& szLocFileName)
+ExecuteOrder(CString strOrder, CString strSign, CString *pStrResult, int nRepeatCnt, int nPollCnt)
+ExecuteSignleOrder(CString f_szOrder, CString f_szSign, CString *f_szResult, int nCmdPollCnt)
+ModifyTimeWindow()
+LockDevice()
+GetSynInfo()
+GetDevInfo()
+GetGRInfo()
+GetPoleCount()
+Register()
+Unregister()
+ModifyParameter()
+TestGRForPerPole(int iSN, CStringArray& strResArray)
+TestGRForAllPole()
+SetState(UINT uState)
+SetID(DWORD dwID)
+PrintLog(CString& strLog)
+IsExistOtherUserData()
+CheckGD10Password(CString strGD10Password)
+EndTransfer()
}
class CSComPort {
+OpenComm(CString szComName)
+CloseComm()
+SendDataDirectly(char *pDataBuff, int iDataSize)
+ReceiveDataDirectly(char *pDataBuff, int* iDataSize)
+ZmodemReceiveDataDirectly(char *pDataBuff, int *iDataSize)
+ZmodemSendDataDirectly(char *pDataBuff, int iDataSize)
+ExecuteOrder(CString strOrder, CString strSign, CString *pStrResult, int nRepeatCnt)
+ExecuteSignleOrder(CString f_szOrder, CString f_szSign, CString *f_szResult)
+ExecuteNoResOrder(CString f_szOrder)
+ClearCommReceiveBuff()
+ClearCommSendBuff()
+SetScanBreakSign(BOOL bIsScanBreak)
+DetectLine()
+SetOwnerWnd(HWND hOwnerWnd)
+SetCommID(long lCommID)
+SComPortDetectBreakThreadFun(LPVOID pParam)
+FindComName(CStringArray* pStringArray)
}
class CGD10OperCmd {
+GetInstance()
+project_add(const char *mac, const char *projectcn)
+AddProjectInLocalHost(const char *pProjectCN)
+AddProjectInMacXml(const char* pMac, const char *pProjectCN)
+project_del(const char *mac, const char *projectcn)
+project_rename(const char *mac, const char *old_projectcn, const char *new_projectcn)
+tz_add(const char *mac, const char *projectcn, const char *tzcn)
+tz_del(const char *mac, const char *projectcn, const char *tzcn)
+tz_rename(const char *mac, const char *projectcn, const char *old_tzcn, const char *new_tzcn)
+task_add(const char *mac, const char *projectcn, const char *tzcn, const char *taskcn)
+task_del(const char *mac, const char *projectcn, const char *tzcn, const char *taskcn)
+task_rename(const char *mac, const char *projectcn, const char *tzcn, const char *old_taskcn, const char *new_taskcn)
+sync_project(const char *mac, const char *projectcn)
+sync_tz(const char *mac, const char *projectcn, const char *tzcn)
+sync_task(const char *mac, const char *projectcn, const char *tzcn, const char *taskcn)
+sync_all(const char *mac)
+get_project_list(const char *mac, CStringArray &project_list)
+get_tz_list(const char *mac, const char *projectcn, CStringArray &tz_list)
+get_task_list(const char *mac, const char *projectcn, const char *tzcn, CStringArray &task_list)
+get_sync_status(const char *mac, const char *projectcn, const char *tzcn, const char *taskcn)
+get_device_info(const char *mac, STSynDevParam &dev_info)
+get_gr_info(const char *mac, CStringArray &gr_info)
+get_ac_info(const char *mac, CStringArray &ac_info)
+get_cable_head_info(const char *mac, CStringArray &cable_head_info)
+get_time_info(const char *mac, SYSTEMTIME &time_info)
+set_time_info(const char *mac, SYSTEMTIME &time_info)
+get_parameter_info(const char *mac, STParameterInfo &param_info)
+set_parameter_info(const char *mac, STParameterInfo &param_info)
+get_firmware_version(const char *mac, CString &version)
+upgrade_firmware(const char *mac, const char *firmware_path)
+reset_device(const char *mac)
+lock_device(const char *mac)
+unlock_device(const char *mac)
+get_battery_info(const char *mac, float &battery_vol, int &battery_alarm)
+get_signal_info(const char *mac, int &signal_strength)
+get_network_info(const char *mac, CString &network_status)
+get_storage_info(const char *mac, int &total_space, int &used_space)
+get_temperature_info(const char *mac, float &temperature)
+get_humidity_info(const char *mac, float &humidity)
+get_pressure_info(const char *mac, float &pressure)
+get_gps_info(const char *mac, double &latitude, double &longitude, double &altitude)
+get_accelerometer_info(const char *mac, float &x, float &y, float &z)
+get_gyroscope_info(const char *mac, float &x, float &y, float &z)
+get_magnetometer_info(const char *mac, float &x, float &y, float &z)
+get_barometer_info(const char *mac, float &pressure)
+get_light_sensor_info(const char *mac, float &light_level)
+get_proximity_sensor_info(const char *mac, float &proximity)
+get_ambient_temperature_info(const char *mac, float &temperature)
+get_relative_humidity_info(const char *mac, float &humidity)
+get_air_quality_info(const char *mac, int &air_quality)
+get_noise_level_info(const char *mac, float &noise_level)
+get_vibration_info(const char *mac, float &vibration)
+get_motion_info(const char *mac, float &motion)
+get_orientation_info(const char *mac, float &orientation)
+get_rotation_info(const char *mac, float &rotation)
+get_acceleration_info(const char *mac, float &acceleration)
+get_velocity_info(const char *mac, float &velocity)
+get_distance_info(const char *mac, float &distance)
+get_speed_info(const char *mac, float &speed)
+get_direction_info(const char *mac, float &direction)
+get_altitude_info(const char *mac, float &altitude)
+get_pressure_info(const char *mac, float &pressure)
+get_temperature_info(const char *mac, float &temperature)
+get_humidity_info(const char *mac, float &humidity)
+get_light_level_info(const char *mac, float &light_level)
+get_proximity_info(const char *mac, float &proximity)
+get_ambient_temperature_info(const char *mac, float &temperature)
+get_relative_humidity_info(const char *mac, float &humidity)
+get_air_quality_info(const char *mac, int &air_quality)
+get_noise_level_info(const char *mac, float &noise_level)
+get_vibration_info(const char *mac, float &vibration)
+get_motion_info(const char *mac, float &motion)
+get_orientation_info(const char *mac, float &orientation)
+get_rotation_info(const char *mac, float &rotation)
+get_acceleration_info(const char *mac, float &acceleration)
+get_velocity_info(const char *mac, float &velocity)
+get_distance_info(const char *mac, float &distance)
+get_speed_info(const char *mac, float &speed)
+get_direction_info(const char *mac, float &direction)
+get_altitude_info(const char *mac, float &altitude)
}
CDevManager --> CDetcGD10Dev
CDevManager --> CDevice
CDevManager --> CSComPort
CDevManager --> CGD10OperCmd
CDevice --> CSComPort
CDevice --> CGD10OperCmd
```
**图源**
- [DevManager.h](file://h/DevManager.h#L1-L69)
- [DetcGD10Dev.h](file://h/DetcGD10Dev.h#L1-L38)
- [Device.h](file://h/Device.h#L1-L128)
- [SComPort.h](file://h/SComPort.h#L1-L74)
- [GD10OperCmd.cpp](file://cpp/Tools/GD10OperCmd.cpp#L1-L1213)
## 详细组件分析
### DevManager分析
`CDevManager`类是设备管理的核心,负责管理所有设备的生命周期。它通过`InitialDevLinkList`方法初始化设备列表,从数据库中读取设备信息并创建`CDevice`对象。`AddDevice`方法用于添加新设备,`DeleteDevice`方法用于删除设备。`GetDeviceByID``GetDevice``GetDevice`方法用于根据不同的标识符获取设备对象。`GetOLDevList``GetFLDevList`方法分别获取在线和离线设备列表。`UpdateDevInfo`方法用于更新设备信息,`SetDeviceHandle`方法用于设置设备句柄。
#### 设备初始化和状态轮询
设备初始化和状态轮询是DevManager模块的重要功能。设备初始化通过`InitialDevLinkList`方法完成,该方法从数据库中读取设备信息并创建`CDevice`对象。状态轮询通过`GetOLDevList``GetFLDevList`方法实现,定期检查设备的连接状态并更新设备列表。
```mermaid
sequenceDiagram
participant DevManager as "DevManager"
participant Database as "数据库"
participant Device as "Device"
DevManager->>Database : 查询设备信息
Database-->>DevManager : 返回设备信息
DevManager->>Device : 创建CDevice对象
Device-->>DevManager : 返回设备对象
DevManager->>DevManager : 更新设备列表
```
**图源**
- [DevManager.cpp](file://cpp/Managers/DevManager.cpp#L160-L201)
- [DevManager.cpp](file://cpp/Managers/DevManager.cpp#L486-L590)
### DetcGD10Dev分析
`CDetcGD10Dev`类负责检测GD10设备的连接状态。`DetectGD10Dev`方法通过调用`FindUsbDevice`方法查找USB设备,`GetGD10DevAddr`方法返回设备的地址,`IsGD10DevConnect`方法返回设备是否已连接。
#### 设备检测流程
设备检测流程通过`DetectGD10Dev`方法实现,该方法首先清空设备地址,然后调用`FindUsbDevice`方法查找USB设备。如果找到设备,`m_strDevAddr`将被设置为设备地址,`m_bGD10DevIsCon`将被设置为`true`
```mermaid
flowchart TD
Start([开始]) --> DetectDevice["DetectGD10Dev()"]
DetectDevice --> ClearAddr["清空设备地址"]
ClearAddr --> FindDevice["FindUsbDevice(strDevName)"]
FindDevice --> CheckResult{"找到设备?"}
CheckResult --> |是| SetAddr["设置设备地址"]
SetAddr --> SetConnected["设置连接状态为true"]
SetConnected --> End([结束])
CheckResult --> |否| SetDisconnected["设置连接状态为false"]
SetDisconnected --> End
```
**图源**
- [DetcGD10Dev.cpp](file://cpp/Operator/DetcGD10Dev.cpp#L61-L68)
### Device分析
`CDevice`类封装了设备的状态和操作。`CDevice`类的构造函数接收设备ID和数据库连接指针,初始化设备对象。`Reset`方法用于重置设备,`ShowFLDetailInfo``ShowOLDetailInfo`方法用于显示设备的详细信息,`ShowGRInfo``ShowACInfo`方法用于显示接地电阻和视极化率信息。`ReceiveFile``SendFile`方法用于文件传输,`ExecuteOrder``ExecuteSignleOrder`方法用于执行命令。
#### 文件传输流程
文件传输流程通过`ReceiveFile``SendFile`方法实现。`ReceiveFile`方法接收文件,`SendFile`方法发送文件。文件传输过程中,`CProgressDlg`对话框用于显示传输进度。
```mermaid
sequenceDiagram
participant Device as "Device"
participant ProgressDlg as "CProgressDlg"
participant SComPort as "SComPort"
Device->>ProgressDlg : 创建CProgressDlg对象
ProgressDlg->>Device : 返回对话框对象
Device->>ProgressDlg : 设置设备、传输类型、文件路径
ProgressDlg->>Device : 显示对话框
Device->>SComPort : 发送文件传输命令
SComPort-->>Device : 返回传输结果
Device->>ProgressDlg : 更新传输进度
ProgressDlg-->>Device : 传输完成
Device->>ProgressDlg : 销毁对话框对象
```
**图源**
- [Device.cpp](file://cpp/ProblemZone/Device.cpp#L682-L725)
- [Device.cpp](file://cpp/ProblemZone/Device.cpp#L59-L66)
### 与其他管理器的数据交互
DevManager模块与其他管理器(如ProManager、TdManager)协同工作,确保设备连接成功后能够同步项目信息和测量数据。`ProManager`类负责管理项目信息,`TdManager`类负责管理测量数据。
#### 项目信息同步
项目信息同步通过`ProManager`类的`ShowProList`方法实现。当设备连接成功后,`ProManager`会从数据库中读取项目信息,并将其同步到设备上。
```mermaid
sequenceDiagram
participant DevManager as "DevManager"
participant ProManager as "ProManager"
participant Database as "数据库"
DevManager->>ProManager : 请求项目列表
ProManager->>Database : 查询项目信息
Database-->>ProManager : 返回项目信息
ProManager-->>DevManager : 返回项目列表
DevManager->>Device : 同步项目信息
```
**图源**
- [ProManager.cpp](file://cpp/Managers/ProManager.cpp#L184-L200)
- [DevManager.cpp](file://cpp/Managers/DevManager.cpp#L592-L642)
#### 测量数据同步
测量数据同步通过`TdManager`类的`ShowTdListByProject`方法实现。当设备连接成功后,`TdManager`会从数据库中读取测量数据,并将其同步到设备上。
```mermaid
sequenceDiagram
participant DevManager as "DevManager"
participant TdManager as "TdManager"
participant Database as "数据库"
DevManager->>TdManager : 请求测量数据列表
TdManager->>Database : 查询测量数据信息
Database-->>TdManager : 返回测量数据信息
TdManager-->>DevManager : 返回测量数据列表
DevManager->>Device : 同步测量数据
```
**图源**
- [TdManager.cpp](file://cpp/Managers/TdManager.cpp#L81-L200)
- [DevManager.cpp](file://cpp/Managers/DevManager.cpp#L592-L642)
## 依赖分析
DevManager模块依赖于多个其他模块,包括`DetcGD10Dev``Device``SComPort``GD10OperCmd``ProManager``TdManager`。这些模块共同协作,确保设备管理功能的正常运行。
```mermaid
graph TD
DevManager[DevManager] --> DetcGD10Dev[DetcGD10Dev]
DevManager --> Device[Device]
DevManager --> SComPort[SComPort]
DevManager --> GD10OperCmd[GD10OperCmd]
DevManager --> ProManager[ProManager]
DevManager --> TdManager[TdManager]
DetcGD10Dev --> SComPort
Device --> SComPort
Device --> GD10OperCmd
ProManager --> Database[(数据库)]
TdManager --> Database
```
**图源**
- [DevManager.cpp](file://cpp/Managers/DevManager.cpp#L1-L661)
- [DetcGD10Dev.cpp](file://cpp/Operator/DetcGD10Dev.cpp#L1-L189)
- [Device.cpp](file://cpp/ProblemZone/Device.cpp#L1-L3893)
- [SComPort.cpp](file://cpp/Tools/SComPort.cpp#L1-L1199)
- [GD10OperCmd.cpp](file://cpp/Tools/GD10OperCmd.cpp#L1-L1213)
- [ProManager.cpp](file://cpp/Managers/ProManager.cpp#L1-L2054)
- [TdManager.cpp](file://cpp/Managers/TdManager.cpp#L1-L6839)
## 性能考虑
DevManager模块在设计时考虑了性能优化。例如,`InitialDevLinkList`方法在初始化设备列表时,会从数据库中批量读取设备信息,减少数据库查询次数。`GetOLDevList``GetFLDevList`方法在获取设备列表时,会缓存设备信息,减少重复查询。此外,`CDevice`类的`ExecuteOrder``ExecuteSignleOrder`方法支持重试机制,确保命令执行的可靠性。
## 故障排除指南
### 设备连接失败
设备连接失败可能是由于USB线缆问题、设备驱动问题或设备未正确连接。解决方法包括检查USB线缆、重新安装设备驱动、重新连接设备。
### 通信超时
通信超时可能是由于串口配置错误、设备响应慢或网络问题。解决方法包括检查串口配置、增加超时时间、检查网络连接。
### 文件传输失败
文件传输失败可能是由于文件路径错误、存储空间不足或设备忙。解决方法包括检查文件路径、清理存储空间、等待设备空闲。
**组件源**
- [DevManager.cpp](file://cpp/Managers/DevManager.cpp#L383-L433)
- [Device.cpp](file://cpp/ProblemZone/Device.cpp#L682-L725)
- [SComPort.cpp](file://cpp/Tools/SComPort.cpp#L127-L187)
## 结论
DevManager模块是Geomative Studio系统中的核心组件,负责管理与GD10设备的连接、状态监控、参数配置和固件升级。通过详细的分析,我们了解了DevManager模块的职责和实现,包括设备初始化、状态轮询、文件传输、与其他管理器的数据交互等。此外,我们还提供了设备连接失败、通信超时等常见问题的解决方案。DevManager模块的设计考虑了性能优化,确保了系统的高效运行。未来的工作可以进一步优化设备管理功能,提高系统的稳定性和用户体验。