20 KiB
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)目录
介绍
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设备的命令交互。
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模块的核心组件包括CDevManager类、CDetcGD10Dev类和CDevice类。CDevManager类负责管理设备的生命周期,包括设备的添加、删除、状态更新等操作。CDetcGD10Dev类用于检测GD10设备的连接状态,CDevice类则封装了设备的状态和操作。
组件源
架构概述
DevManager模块的架构设计遵循分层原则,将设备管理、通信、状态监控等功能分离。CDevManager类作为顶层管理器,负责协调各个子组件的工作。CDetcGD10Dev类负责设备检测,CDevice类负责设备状态的封装和操作,SComPort类提供串口通信功能,GD10OperCmd类处理与GD10设备的命令交互。
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分析
CDevManager类是设备管理的核心,负责管理所有设备的生命周期。它通过InitialDevLinkList方法初始化设备列表,从数据库中读取设备信息并创建CDevice对象。AddDevice方法用于添加新设备,DeleteDevice方法用于删除设备。GetDeviceByID、GetDevice和GetDevice方法用于根据不同的标识符获取设备对象。GetOLDevList和GetFLDevList方法分别获取在线和离线设备列表。UpdateDevInfo方法用于更新设备信息,SetDeviceHandle方法用于设置设备句柄。
设备初始化和状态轮询
设备初始化和状态轮询是DevManager模块的重要功能。设备初始化通过InitialDevLinkList方法完成,该方法从数据库中读取设备信息并创建CDevice对象。状态轮询通过GetOLDevList和GetFLDevList方法实现,定期检查设备的连接状态并更新设备列表。
sequenceDiagram
participant DevManager as "DevManager"
participant Database as "数据库"
participant Device as "Device"
DevManager->>Database : 查询设备信息
Database-->>DevManager : 返回设备信息
DevManager->>Device : 创建CDevice对象
Device-->>DevManager : 返回设备对象
DevManager->>DevManager : 更新设备列表
图源
DetcGD10Dev分析
CDetcGD10Dev类负责检测GD10设备的连接状态。DetectGD10Dev方法通过调用FindUsbDevice方法查找USB设备,GetGD10DevAddr方法返回设备的地址,IsGD10DevConnect方法返回设备是否已连接。
设备检测流程
设备检测流程通过DetectGD10Dev方法实现,该方法首先清空设备地址,然后调用FindUsbDevice方法查找USB设备。如果找到设备,m_strDevAddr将被设置为设备地址,m_bGD10DevIsCon将被设置为true。
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
图源
Device分析
CDevice类封装了设备的状态和操作。CDevice类的构造函数接收设备ID和数据库连接指针,初始化设备对象。Reset方法用于重置设备,ShowFLDetailInfo和ShowOLDetailInfo方法用于显示设备的详细信息,ShowGRInfo和ShowACInfo方法用于显示接地电阻和视极化率信息。ReceiveFile和SendFile方法用于文件传输,ExecuteOrder和ExecuteSignleOrder方法用于执行命令。
文件传输流程
文件传输流程通过ReceiveFile和SendFile方法实现。ReceiveFile方法接收文件,SendFile方法发送文件。文件传输过程中,CProgressDlg对话框用于显示传输进度。
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 : 销毁对话框对象
图源
与其他管理器的数据交互
DevManager模块与其他管理器(如ProManager、TdManager)协同工作,确保设备连接成功后能够同步项目信息和测量数据。ProManager类负责管理项目信息,TdManager类负责管理测量数据。
项目信息同步
项目信息同步通过ProManager类的ShowProList方法实现。当设备连接成功后,ProManager会从数据库中读取项目信息,并将其同步到设备上。
sequenceDiagram
participant DevManager as "DevManager"
participant ProManager as "ProManager"
participant Database as "数据库"
DevManager->>ProManager : 请求项目列表
ProManager->>Database : 查询项目信息
Database-->>ProManager : 返回项目信息
ProManager-->>DevManager : 返回项目列表
DevManager->>Device : 同步项目信息
图源
测量数据同步
测量数据同步通过TdManager类的ShowTdListByProject方法实现。当设备连接成功后,TdManager会从数据库中读取测量数据,并将其同步到设备上。
sequenceDiagram
participant DevManager as "DevManager"
participant TdManager as "TdManager"
participant Database as "数据库"
DevManager->>TdManager : 请求测量数据列表
TdManager->>Database : 查询测量数据信息
Database-->>TdManager : 返回测量数据信息
TdManager-->>DevManager : 返回测量数据列表
DevManager->>Device : 同步测量数据
图源
依赖分析
DevManager模块依赖于多个其他模块,包括DetcGD10Dev、Device、SComPort、GD10OperCmd、ProManager和TdManager。这些模块共同协作,确保设备管理功能的正常运行。
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模块在设计时考虑了性能优化。例如,InitialDevLinkList方法在初始化设备列表时,会从数据库中批量读取设备信息,减少数据库查询次数。GetOLDevList和GetFLDevList方法在获取设备列表时,会缓存设备信息,减少重复查询。此外,CDevice类的ExecuteOrder和ExecuteSignleOrder方法支持重试机制,确保命令执行的可靠性。
故障排除指南
设备连接失败
设备连接失败可能是由于USB线缆问题、设备驱动问题或设备未正确连接。解决方法包括检查USB线缆、重新安装设备驱动、重新连接设备。
通信超时
通信超时可能是由于串口配置错误、设备响应慢或网络问题。解决方法包括检查串口配置、增加超时时间、检查网络连接。
文件传输失败
文件传输失败可能是由于文件路径错误、存储空间不足或设备忙。解决方法包括检查文件路径、清理存储空间、等待设备空闲。
组件源
结论
DevManager模块是Geomative Studio系统中的核心组件,负责管理与GD10设备的连接、状态监控、参数配置和固件升级。通过详细的分析,我们了解了DevManager模块的职责和实现,包括设备初始化、状态轮询、文件传输、与其他管理器的数据交互等。此外,我们还提供了设备连接失败、通信超时等常见问题的解决方案。DevManager模块的设计考虑了性能优化,确保了系统的高效运行。未来的工作可以进一步优化设备管理功能,提高系统的稳定性和用户体验。