# DevManager **本文档中引用的文件** - [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) ## 目录 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 ¶m_info) +set_parameter_info(const char *mac, STParameterInfo ¶m_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模块的设计考虑了性能优化,确保了系统的高效运行。未来的工作可以进一步优化设备管理功能,提高系统的稳定性和用户体验。