# 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类实现了设备检测功能,保证了设备的自动识别和连接。整个系统设计合理,层次分明,具有良好的可维护性和扩展性。