# Device数据模型 **本文档引用的文件** - [Device.h](file://h/Device.h) - [Device.cpp](file://cpp/ProblemZone/Device.cpp) - [DevManager.h](file://h/DevManager.h) - [DevManager.cpp](file://cpp/Managers/DevManager.cpp) - [DetcGD10Dev.cpp](file://cpp/Operator/DetcGD10Dev.cpp) - [CtrlProtocolDef.h](file://h/CtrlProtocolDef.h) - [SComPort.h](file://h/SComPort.h) - [config.ini](file://Install/Geomative Studio/config.ini) ## 目录 1. [引言](#引言) 2. [项目结构](#项目结构) 3. [核心组件](#核心组件) 4. [架构概述](#架构概述) 5. [详细组件分析](#详细组件分析) 6. [依赖分析](#依赖分析) 7. [性能考虑](#性能考虑) 8. [故障排除指南](#故障排除指南) 9. [结论](#结论) ## 引言 本项目GeomativeStudio是一个用于地质勘探设备管理的应用程序,其核心功能围绕设备管理展开。系统通过Device类来封装和管理各种设备(如GD10)的属性和行为,包括设备型号、固件版本、通信端口、设备状态及硬件参数配置等。Device类通过DevManager进行统一管理,并与底层驱动(如stmcdc.inf)和通信协议(CtrlProtocolDef.h)交互。设备检测逻辑在DetcGD10Dev.cpp中实现,负责识别设备并进行状态轮询。设备参数的持久化存储与config.ini文件联动,确保配置信息的持久性。在设备热插拔和通信异常时,系统具备相应的错误处理策略,保证了系统的稳定性和可靠性。 ## 项目结构 项目结构清晰地组织了各个模块,便于维护和扩展。核心代码位于`cpp`目录下,分为多个子目录,如`Managers`、`Operator`、`ProblemZone`等,分别处理不同的业务逻辑。头文件位于`h`目录下,定义了类和结构体。安装文件和配置文件位于`Install`目录下,其中`config.ini`文件用于存储用户配置信息。日志文件位于`LOG`目录下,记录系统运行时的信息。数据库相关文件位于`DB`目录下,管理设备和任务数据。 ```mermaid graph TD subgraph "核心代码" A[cpp] --> B[Managers] A --> C[Operator] A --> D[ProblemZone] end subgraph "头文件" E[h] --> F[Device.h] E --> G[DevManager.h] E --> H[CtrlProtocolDef.h] end subgraph "资源文件" I[Install] --> J[config.ini] I --> K[stmcdc.inf] end subgraph "日志" L[LOG] --> M[detect_gd20_log.txt] end A --> E A --> I A --> L ``` **Diagram sources** - [Device.h](file://h/Device.h) - [DevManager.h](file://h/DevManager.h) - [config.ini](file://Install/Geomative Studio/config.ini) **Section sources** - [Device.h](file://h/Device.h) - [DevManager.h](file://h/DevManager.h) - [config.ini](file://Install/Geomative Studio/config.ini) ## 核心组件 Device类是设备管理的核心,封装了设备的各种属性和方法。它通过DevManager进行统一管理,实现了设备的注册、注销、参数修改等功能。Device类还负责与底层驱动和通信协议交互,确保设备的正常运行。 **Section sources** - [Device.h](file://h/Device.h) - [Device.cpp](file://cpp/ProblemZone/Device.cpp) ## 架构概述 系统架构采用分层设计,上层为UI层,中间为业务逻辑层,底层为设备驱动层。DevManager作为业务逻辑层的核心,负责管理所有设备实例。Device类通过SComPort类与设备进行通信,使用Zmodem协议进行文件传输。CtrlProtocolDef.h定义了通信协议,确保数据的正确传输。 ```mermaid graph TD A[UI层] --> B[业务逻辑层] B --> C[设备驱动层] B --> D[DevManager] D --> E[Device] E --> F[SComPort] F --> G[设备] H[CtrlProtocolDef.h] --> F ``` **Diagram sources** - [DevManager.h](file://h/DevManager.h) - [Device.h](file://h/Device.h) - [SComPort.h](file://h/SComPort.h) - [CtrlProtocolDef.h](file://h/CtrlProtocolDef.h) ## 详细组件分析 ### Device类分析 Device类封装了设备的各种属性,如设备型号(GD10)、固件版本、通信端口(串口/USB)、设备状态(在线/离线/故障)及硬件参数配置。通过GetDevInfo方法,可以从设备获取这些信息并更新到数据库中。 #### 类图 ```mermaid classDiagram class CDevice { +DWORD m_dwID +UINT m_uState +UINT m_uType +BYTE m_ucDevType +CSComPort m_sComPort +CString m_szDevSN +CString m_szDevName +CString m_szModelNO +CString m_szMDate +CString m_szHWV +CString m_szSWV +CString m_szMBatch +CString m_szMacAddress +_ConnectionPtr m_pConnection +FILE* m_pLogFile +CDevice(DWORD dwID, _ConnectionPtr& pConnection) +~CDevice() +void SetState(UINT uState) +void SetID(DWORD dwID) +BOOL Reset() +BOOL GetDevInfo() +BOOL GetGRInfo() +bool ShowFLDetailInfo(CListCtrl& devDetailList) +bool ShowOLDetailInfo(CListCtrl& devDetailList) +bool ShowGRInfo(CListCtrl& devGRList) +bool ShowACInfo(CListCtrl& devDetailList) +BOOL ModifyParameter() +BOOL ShowCableHeadInfoDlg() +BOOL IsTheNumofPoleChanged() +BOOL TestGRForPerPole(int iSN, CStringArray& strResArray) +BOOL TestGRForAllPole() +void PrintLog(CString& strLog) +int IsExistOtherUserData() +int CheckGD10Password(CString strGD10Password) +BOOL EndTransfer() +UINT32 GetXmlMaxTestPoint(int iSubIndex, CString strPrCN, CString strTzCN, CString strXmlFile) } class CSComPort { +HANDLE m_hCom +HWND m_hOwnerWnd +long m_lCommID +CString m_szComName +DCB m_dcbBlock +FILE* m_Log +CSComPort() +CSComPort(HWND hOwnerWnd, long lCommID) +~CSComPort() +BOOL OpenComm(CString szComName) +void CloseComm() +BOOL SendDataDirectly(char* pDataBuff, int iDataSize) +BOOL ReceiveDataDirectly(char* pDataBuff, int* iDataSize) +BOOL ZmodemReceiveDataDirectly(char* pDataBuff, int* iDataSize) +BOOL ZmodemSendDataDirectly(char* pDataBuff, int iDataSize) +void ClearCommReceiveBuff() +void ClearCommSendBuff() +BOOL ExecuteOrder(CString strOrder, CString strSign, CString* pStrResult, int nRepeatCnt=3) +BOOL ExecuteSignleOrder(CString f_szOrder, CString f_szSign, CString* f_szResult) +BOOL ExecuteNoResOrder(CString f_szOrder) } CDevice --> CSComPort : "uses" ``` **Diagram sources** - [Device.h](file://h/Device.h) - [SComPort.h](file://h/SComPort.h) **Section sources** - [Device.h](file://h/Device.h) - [Device.cpp](file://cpp/ProblemZone/Device.cpp) ### DevManager类分析 DevManager类负责管理所有设备实例,提供设备的增删改查功能。它通过m_devLinkList链表存储设备实例,并通过m_handleProcessor生成设备句柄。 #### 类图 ```mermaid classDiagram class CDevManager { +CLinkList m_devLinkList +_ConnectionPtr m_pConnection +std : : set m_setRemoteDev +CHandleProcessor m_handleProcessor +CDevManager(_ConnectionPtr& pConnection) +~CDevManager() +CDevice* GetDeviceByID(DWORD dwDevID) +CDevice* GetDevice(DWORD dwHandle) +CDevice* GetDevice(CString szDevSN) +void InitialDevLinkList() +BOOL AddDevice(CDevice* const pDev) +void DeleteObjInMem(DWORD dwHandle) +void DeleteObjInMem(CString szDevSN) +void AddObjInMem(CString szDevSN) +void AddOfflineObjInMem(CString szDevSN) +BOOL DeleteDevice(DWORD dwHandle) +BOOL DeleteDevice(CString strDev) +BOOL GetOLDevList(CPtrArray* pOLDevList) +BOOL GetFLDevList(CPtrArray* pFLDevList) +void UpdateDevInfo(STSynDevParam stDevParam, BYTE bRemoteDeveTyp) +BOOL SetDeviceHandle(CDevice* const pDev) +CDevice* GetRegisterDevice(CString szDevSN, bool& bIsRegister) +void DeleteRemoteDevice(STSigRemoteDev stDevice) +void AddRemoteDevice(STSigRemoteDev stDevice) +std : : set GetRemoteDeviceInfo() } class CDevice { +DWORD m_dwID +UINT m_uState +UINT m_uType +BYTE m_ucDevType +CSComPort m_sComPort +CString m_szDevSN +CString m_szDevName +CString m_szModelNO +CString m_szMDate +CString m_szHWV +CString m_szSWV +CString m_szMBatch +CString m_szMacAddress +_ConnectionPtr m_pConnection +FILE* m_pLogFile } CDevManager --> CDevice : "manages" ``` **Diagram sources** - [DevManager.h](file://h/DevManager.h) - [Device.h](file://h/Device.h) **Section sources** - [DevManager.h](file://h/DevManager.h) - [DevManager.cpp](file://cpp/Managers/DevManager.cpp) ### DetcGD10Dev类分析 DetcGD10Dev类负责检测GD10设备,通过USB接口查找设备并建立连接。它使用FindUsbDevice方法遍历所有可移动驱动器,通过卷标名或特定目录结构来识别设备。 #### 序列图 ```mermaid sequenceDiagram participant User as "用户" participant DetcGD10Dev as "CDetcGD10Dev" participant System as "系统" User->>DetcGD10Dev : DetectGD10Dev() DetcGD10Dev->>System : GetLogicalDriveStrings() System-->>DetcGD10Dev : 驱动器列表 loop 每个驱动器 DetcGD10Dev->>System : GetDriveType() alt 可移动驱动器 DetcGD10Dev->>System : GetVolumeInformation() System-->>DetcGD10Dev : 卷标名 alt 卷标名匹配 DetcGD10Dev-->>User : 找到设备 break else 目录结构匹配 DetcGD10Dev->>System : _stat() System-->>DetcGD10Dev : 目录存在 DetcGD10Dev-->>User : 找到设备 break end end end alt 未找到设备 DetcGD10Dev-->>User : 未找到设备 end ``` **Diagram sources** - [DetcGD10Dev.cpp](file://cpp/Operator/DetcGD10Dev.cpp) **Section sources** - [DetcGD10Dev.cpp](file://cpp/Operator/DetcGD10Dev.cpp) ## 依赖分析 系统依赖于多个外部组件,包括数据库连接、串口通信、文件操作等。DevManager依赖于Device类,Device类依赖于SComPort类进行通信,SComPort类依赖于Windows API进行串口操作。此外,系统还依赖于Zmodem协议进行文件传输。 ```mermaid graph TD A[DevManager] --> B[Device] B --> C[SComPort] C --> D[Windows API] B --> E[Zmodem] A --> F[数据库] G[DetcGD10Dev] --> H[Windows API] ``` **Diagram sources** - [DevManager.h](file://h/DevManager.h) - [Device.h](file://h/Device.h) - [SComPort.h](file://h/SComPort.h) **Section sources** - [DevManager.h](file://h/DevManager.h) - [Device.h](file://h/Device.h) - [SComPort.h](file://h/SComPort.h) ## 性能考虑 系统在设计时考虑了性能优化,如使用链表存储设备实例,减少内存分配开销;使用异步通信避免阻塞主线程;使用缓存减少数据库查询次数。此外,系统还实现了错误重试机制,提高通信的可靠性。 ## 故障排除指南 当设备无法连接时,首先检查USB线缆是否连接正常,设备是否上电。然后检查设备的卷标名是否正确,或是否存在特定目录结构。如果问题仍然存在,可以查看日志文件detect_gd20_log.txt,获取详细的错误信息。对于通信异常,可以尝试重启设备或重新插拔USB线缆。 **Section sources** - [DetcGD10Dev.cpp](file://cpp/Operator/DetcGD10Dev.cpp) - [Install/Geomative Studio/LOG/detect_gd20_log.txt](file://Install/Geomative Studio/LOG/detect_gd20_log.txt) ## 结论 通过深入分析Device类及其相关组件,我们了解了GeomativeStudio项目中设备管理的核心机制。Device类通过封装设备属性和方法,实现了对设备的全面管理。DevManager类提供了统一的管理接口,确保了设备实例的一致性和完整性。DetcGD10Dev类实现了设备检测功能,保证了设备的自动识别和连接。整个系统设计合理,层次分明,具有良好的可维护性和扩展性。