11 KiB
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)目录
引言
本项目GeomativeStudio是一个用于地质勘探设备管理的应用程序,其核心功能围绕设备管理展开。系统通过Device类来封装和管理各种设备(如GD10)的属性和行为,包括设备型号、固件版本、通信端口、设备状态及硬件参数配置等。Device类通过DevManager进行统一管理,并与底层驱动(如stmcdc.inf)和通信协议(CtrlProtocolDef.h)交互。设备检测逻辑在DetcGD10Dev.cpp中实现,负责识别设备并进行状态轮询。设备参数的持久化存储与config.ini文件联动,确保配置信息的持久性。在设备热插拔和通信异常时,系统具备相应的错误处理策略,保证了系统的稳定性和可靠性。
项目结构
项目结构清晰地组织了各个模块,便于维护和扩展。核心代码位于cpp目录下,分为多个子目录,如Managers、Operator、ProblemZone等,分别处理不同的业务逻辑。头文件位于h目录下,定义了类和结构体。安装文件和配置文件位于Install目录下,其中config.ini文件用于存储用户配置信息。日志文件位于LOG目录下,记录系统运行时的信息。数据库相关文件位于DB目录下,管理设备和任务数据。
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
- DevManager.h
- [config.ini](file://Install/Geomative Studio/config.ini)
Section sources
- Device.h
- DevManager.h
- [config.ini](file://Install/Geomative Studio/config.ini)
核心组件
Device类是设备管理的核心,封装了设备的各种属性和方法。它通过DevManager进行统一管理,实现了设备的注册、注销、参数修改等功能。Device类还负责与底层驱动和通信协议交互,确保设备的正常运行。
Section sources
架构概述
系统架构采用分层设计,上层为UI层,中间为业务逻辑层,底层为设备驱动层。DevManager作为业务逻辑层的核心,负责管理所有设备实例。Device类通过SComPort类与设备进行通信,使用Zmodem协议进行文件传输。CtrlProtocolDef.h定义了通信协议,确保数据的正确传输。
graph TD
A[UI层] --> B[业务逻辑层]
B --> C[设备驱动层]
B --> D[DevManager]
D --> E[Device]
E --> F[SComPort]
F --> G[设备]
H[CtrlProtocolDef.h] --> F
Diagram sources
详细组件分析
Device类分析
Device类封装了设备的各种属性,如设备型号(GD10)、固件版本、通信端口(串口/USB)、设备状态(在线/离线/故障)及硬件参数配置。通过GetDevInfo方法,可以从设备获取这些信息并更新到数据库中。
类图
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
Section sources
DevManager类分析
DevManager类负责管理所有设备实例,提供设备的增删改查功能。它通过m_devLinkList链表存储设备实例,并通过m_handleProcessor生成设备句柄。
类图
classDiagram
class CDevManager {
+CLinkList<CDevice*> m_devLinkList
+_ConnectionPtr m_pConnection
+std : : set<STSigRemoteDev> 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<STSigRemoteDev> 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
Section sources
DetcGD10Dev类分析
DetcGD10Dev类负责检测GD10设备,通过USB接口查找设备并建立连接。它使用FindUsbDevice方法遍历所有可移动驱动器,通过卷标名或特定目录结构来识别设备。
序列图
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
Section sources
依赖分析
系统依赖于多个外部组件,包括数据库连接、串口通信、文件操作等。DevManager依赖于Device类,Device类依赖于SComPort类进行通信,SComPort类依赖于Windows API进行串口操作。此外,系统还依赖于Zmodem协议进行文件传输。
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
Section sources
性能考虑
系统在设计时考虑了性能优化,如使用链表存储设备实例,减少内存分配开销;使用异步通信避免阻塞主线程;使用缓存减少数据库查询次数。此外,系统还实现了错误重试机制,提高通信的可靠性。
故障排除指南
当设备无法连接时,首先检查USB线缆是否连接正常,设备是否上电。然后检查设备的卷标名是否正确,或是否存在特定目录结构。如果问题仍然存在,可以查看日志文件detect_gd20_log.txt,获取详细的错误信息。对于通信异常,可以尝试重启设备或重新插拔USB线缆。
Section sources
- DetcGD10Dev.cpp
- [Install/Geomative Studio/LOG/detect_gd20_log.txt](file://Install/Geomative Studio/LOG/detect_gd20_log.txt)
结论
通过深入分析Device类及其相关组件,我们了解了GeomativeStudio项目中设备管理的核心机制。Device类通过封装设备属性和方法,实现了对设备的全面管理。DevManager类提供了统一的管理接口,确保了设备实例的一致性和完整性。DetcGD10Dev类实现了设备检测功能,保证了设备的自动识别和连接。整个系统设计合理,层次分明,具有良好的可维护性和扩展性。