a
This commit is contained in:
@@ -0,0 +1,419 @@
|
||||
# DevManager
|
||||
|
||||
<cite>
|
||||
**本文档中引用的文件**
|
||||
- [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)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
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模块的设计考虑了性能优化,确保了系统的高效运行。未来的工作可以进一步优化设备管理功能,提高系统的稳定性和用户体验。
|
||||
@@ -0,0 +1,278 @@
|
||||
# IOManager
|
||||
|
||||
<cite>
|
||||
**本文档引用的文件**
|
||||
- [IOManager.cpp](file://cpp/Managers/IOManager.cpp)
|
||||
- [IOManager.h](file://h/IOManager.h)
|
||||
- [DataOperator.cpp](file://cpp/Operator/DataOperator.cpp)
|
||||
- [DataOperator.h](file://h/DataOperator.h)
|
||||
- [excel.cpp](file://cpp/Tools/excel.cpp)
|
||||
- [OperTxtFile.cpp](file://cpp/Tools/OperTxtFile.cpp)
|
||||
- [OperTxtFile.h](file://h/OperTxtFile.h)
|
||||
- [OperUrfFile.cpp](file://cpp/Tools/OperUrfFile.cpp)
|
||||
- [OperUrfFile.h](file://h/OperUrfFile.h)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [简介](#简介)
|
||||
2. [项目结构](#项目结构)
|
||||
3. [核心组件](#核心组件)
|
||||
4. [架构概述](#架构概述)
|
||||
5. [详细组件分析](#详细组件分析)
|
||||
6. [依赖分析](#依赖分析)
|
||||
7. [性能考虑](#性能考虑)
|
||||
8. [故障排除指南](#故障排除指南)
|
||||
9. [结论](#结论)
|
||||
|
||||
## 简介
|
||||
IOManager模块是Geomative Studio项目中的核心组件,负责处理数据的导入导出功能。该模块支持多种文件格式,包括Excel、CSV、TXT和URF等,能够协调DataOperator进行数据格式转换,并利用excel.cpp、OperTxtFile.cpp、OperUrfFile.cpp等工具类实现具体的文件读写操作。此外,IOManager还负责文件传输过程中的进度监控和错误处理机制,确保数据传输的可靠性和完整性。
|
||||
|
||||
## 项目结构
|
||||
IOManager模块位于`cpp/Managers/`目录下,主要由`IOManager.cpp`和`IOManager.h`两个文件组成。该模块依赖于`DataOperator`类进行数据操作,并通过`excel.cpp`、`OperTxtFile.cpp`和`OperUrfFile.cpp`等工具类实现具体的文件读写功能。`DataOperator`类位于`cpp/Operator/`目录下,而工具类则位于`cpp/Tools/`目录下。
|
||||
|
||||
```mermaid
|
||||
graph TD
|
||||
subgraph "IOManager模块"
|
||||
IOManager[IOManager]
|
||||
DataOperator[DataOperator]
|
||||
end
|
||||
subgraph "工具类"
|
||||
Excel[excel.cpp]
|
||||
OperTxtFile[OperTxtFile.cpp]
|
||||
OperUrfFile[OperUrfFile.cpp]
|
||||
end
|
||||
IOManager --> DataOperator
|
||||
DataOperator --> Excel
|
||||
DataOperator --> OperTxtFile
|
||||
DataOperator --> OperUrfFile
|
||||
```
|
||||
|
||||
**Diagram sources**
|
||||
- [IOManager.cpp](file://cpp/Managers/IOManager.cpp)
|
||||
- [DataOperator.cpp](file://cpp/Operator/DataOperator.cpp)
|
||||
- [excel.cpp](file://cpp/Tools/excel.cpp)
|
||||
- [OperTxtFile.cpp](file://cpp/Tools/OperTxtFile.cpp)
|
||||
- [OperUrfFile.cpp](file://cpp/Tools/OperUrfFile.cpp)
|
||||
|
||||
**Section sources**
|
||||
- [IOManager.cpp](file://cpp/Managers/IOManager.cpp)
|
||||
- [IOManager.h](file://h/IOManager.h)
|
||||
|
||||
## 核心组件
|
||||
IOManager模块的核心功能包括数据的导入导出、格式转换、文件读写以及进度监控和错误处理。该模块通过调用`DataOperator`类的方法来执行具体的数据操作,并利用`excel.cpp`、`OperTxtFile.cpp`和`OperUrfFile.cpp`等工具类来实现不同格式的文件读写。
|
||||
|
||||
**Section sources**
|
||||
- [IOManager.cpp](file://cpp/Managers/IOManager.cpp)
|
||||
- [DataOperator.cpp](file://cpp/Operator/DataOperator.cpp)
|
||||
|
||||
## 架构概述
|
||||
IOManager模块的架构设计遵循了分层原则,将数据操作与文件读写分离,提高了代码的可维护性和可扩展性。`IOManager`类负责协调整个数据导入导出流程,`DataOperator`类负责具体的数据操作,而`excel.cpp`、`OperTxtFile.cpp`和`OperUrfFile.cpp`等工具类则负责具体的文件读写操作。
|
||||
|
||||
```mermaid
|
||||
graph TD
|
||||
IOManager[IOManager] --> DataOperator[DataOperator]
|
||||
DataOperator --> Excel[excel.cpp]
|
||||
DataOperator --> OperTxtFile[OperTxtFile.cpp]
|
||||
DataOperator --> OperUrfFile[OperUrfFile.cpp]
|
||||
```
|
||||
|
||||
**Diagram sources**
|
||||
- [IOManager.cpp](file://cpp/Managers/IOManager.cpp)
|
||||
- [DataOperator.cpp](file://cpp/Operator/DataOperator.cpp)
|
||||
- [excel.cpp](file://cpp/Tools/excel.cpp)
|
||||
- [OperTxtFile.cpp](file://cpp/Tools/OperTxtFile.cpp)
|
||||
- [OperUrfFile.cpp](file://cpp/Tools/OperUrfFile.cpp)
|
||||
|
||||
## 详细组件分析
|
||||
### IOManager分析
|
||||
`IOManager`类的主要职责是协调数据的导入导出流程。它通过调用`DataOperator`类的方法来执行具体的数据操作,并利用`excel.cpp`、`OperTxtFile.cpp`和`OperUrfFile.cpp`等工具类来实现不同格式的文件读写。
|
||||
|
||||
#### 类图
|
||||
```mermaid
|
||||
classDiagram
|
||||
class IOManager {
|
||||
+Export()
|
||||
+Import()
|
||||
-CreateExpDatabase()
|
||||
-ExportDataToAccdbFile()
|
||||
-ImportProjectToDB()
|
||||
-ImportTzToDB()
|
||||
-ImportSptToDB()
|
||||
-ImportRspTdToDB()
|
||||
-ImportIpspTdToDB()
|
||||
}
|
||||
class DataOperator {
|
||||
+ExportRsp2DTdToExcel()
|
||||
+ExportRsp2DTdToCSV()
|
||||
+ExportRsp2DTdToUrf()
|
||||
+ExportRsp2DTdToTxt()
|
||||
+ExportRspCETdToExcel()
|
||||
+ExportRspCETdToCSV()
|
||||
+ExportRspCETdToUrf()
|
||||
+ExportRspCETdToTxt()
|
||||
+ExportIpCETdToExcel()
|
||||
+ExportIpCETdToCSV()
|
||||
+ExportIpCETdToTxt()
|
||||
+ExportIp2DTdToExcel()
|
||||
+ExportIp2DTdToCSV()
|
||||
+ExportIp2DTdToTxt()
|
||||
+ExportSPCETdToExcel()
|
||||
+ExportSPCETdToCSV()
|
||||
+ExportSPCETdToTxt()
|
||||
+ExportSP2DTdToExcel()
|
||||
+ExportSP2DTdToCSV()
|
||||
+ExportSP2DTdToTxt()
|
||||
}
|
||||
class excel {
|
||||
+_Application
|
||||
+_Workbook
|
||||
+_Worksheet
|
||||
}
|
||||
class OperTxtFile {
|
||||
+OpenFileforWrite()
|
||||
+CloseFile()
|
||||
+SetParamWidth()
|
||||
+WriteFileContent()
|
||||
+WriteEmptyRow()
|
||||
}
|
||||
class OperUrfFile {
|
||||
+OpenUrfFileForWrite()
|
||||
+WriteUrfHeadInfo()
|
||||
+Write3DUrfHeadInfo()
|
||||
+WriteUrfPoleInfo()
|
||||
+WriteUrfDataInfo()
|
||||
+CloseFile()
|
||||
+WriteElecByWenSch()
|
||||
+WriteElecByWenSch_AMN()
|
||||
+WriteElecByWenSch_MNB()
|
||||
+WriteElecByWenSch_AM()
|
||||
+WriteElecByCrossHole()
|
||||
+WriteElecByCrossHoleGeomative()
|
||||
+WriteElecByCrossHoleGeomativeAM()
|
||||
+WriteElecByAR()
|
||||
+WriteUrfPoleInfo()
|
||||
}
|
||||
IOManager --> DataOperator
|
||||
DataOperator --> excel
|
||||
DataOperator --> OperTxtFile
|
||||
DataOperator --> OperUrfFile
|
||||
```
|
||||
|
||||
**Diagram sources**
|
||||
- [IOManager.cpp](file://cpp/Managers/IOManager.cpp)
|
||||
- [DataOperator.cpp](file://cpp/Operator/DataOperator.cpp)
|
||||
- [excel.cpp](file://cpp/Tools/excel.cpp)
|
||||
- [OperTxtFile.cpp](file://cpp/Tools/OperTxtFile.cpp)
|
||||
- [OperUrfFile.cpp](file://cpp/Tools/OperUrfFile.cpp)
|
||||
|
||||
**Section sources**
|
||||
- [IOManager.cpp](file://cpp/Managers/IOManager.cpp)
|
||||
- [IOManager.h](file://h/IOManager.h)
|
||||
|
||||
### DataOperator分析
|
||||
`DataOperator`类负责具体的数据操作,包括数据的导出和导入。它提供了多种方法来导出不同格式的数据,如Excel、CSV、TXT和URF等。
|
||||
|
||||
#### 序列图
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant IOManager as "IOManager"
|
||||
participant DataOperator as "DataOperator"
|
||||
participant Excel as "excel.cpp"
|
||||
participant OperTxtFile as "OperTxtFile.cpp"
|
||||
participant OperUrfFile as "OperUrfFile.cpp"
|
||||
IOManager->>DataOperator : ExportRsp2DTdToExcel()
|
||||
DataOperator->>Excel : SaveTdToExcelFile()
|
||||
Excel-->>DataOperator : 返回结果
|
||||
DataOperator-->>IOManager : 返回结果
|
||||
IOManager->>DataOperator : ExportRsp2DTdToCSV()
|
||||
DataOperator->>DataOperator : SaveTdToCsvFile()
|
||||
DataOperator-->>IOManager : 返回结果
|
||||
IOManager->>DataOperator : ExportRsp2DTdToUrf()
|
||||
DataOperator->>OperUrfFile : ExportDataToUrf()
|
||||
OperUrfFile-->>DataOperator : 返回结果
|
||||
DataOperator-->>IOManager : 返回结果
|
||||
IOManager->>DataOperator : ExportRsp2DTdToTxt()
|
||||
DataOperator->>OperTxtFile : ExportResDataToTxt()
|
||||
OperTxtFile-->>DataOperator : 返回结果
|
||||
DataOperator-->>IOManager : 返回结果
|
||||
```
|
||||
|
||||
**Diagram sources**
|
||||
- [IOManager.cpp](file://cpp/Managers/IOManager.cpp)
|
||||
- [DataOperator.cpp](file://cpp/Operator/DataOperator.cpp)
|
||||
- [excel.cpp](file://cpp/Tools/excel.cpp)
|
||||
- [OperTxtFile.cpp](file://cpp/Tools/OperTxtFile.cpp)
|
||||
- [OperUrfFile.cpp](file://cpp/Tools/OperUrfFile.cpp)
|
||||
|
||||
**Section sources**
|
||||
- [DataOperator.cpp](file://cpp/Operator/DataOperator.cpp)
|
||||
- [DataOperator.h](file://h/DataOperator.h)
|
||||
|
||||
### 工具类分析
|
||||
`excel.cpp`、`OperTxtFile.cpp`和`OperUrfFile.cpp`等工具类负责具体的文件读写操作。这些类提供了丰富的API来支持不同格式的文件读写。
|
||||
|
||||
#### 流程图
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Start([开始]) --> ValidateInput["验证输入参数"]
|
||||
ValidateInput --> InputValid{"输入有效?"}
|
||||
InputValid --> |否| ReturnError["返回错误响应"]
|
||||
InputValid --> |是| CheckCache["检查缓存"]
|
||||
CheckCache --> CacheHit{"缓存命中?"}
|
||||
CacheHit --> |是| ReturnCache["返回缓存数据"]
|
||||
CacheHit --> |否| QueryDB["查询数据库"]
|
||||
QueryDB --> DBResult{"查询成功?"}
|
||||
DBResult --> |否| HandleError["处理数据库错误"]
|
||||
DBResult --> |是| ProcessData["处理原始数据"]
|
||||
ProcessData --> UpdateCache["更新缓存"]
|
||||
UpdateCache --> ReturnResult["返回处理结果"]
|
||||
HandleError --> ReturnError
|
||||
ReturnCache --> End([结束])
|
||||
ReturnResult --> End
|
||||
ReturnError --> End
|
||||
```
|
||||
|
||||
**Diagram sources**
|
||||
- [excel.cpp](file://cpp/Tools/excel.cpp)
|
||||
- [OperTxtFile.cpp](file://cpp/Tools/OperTxtFile.cpp)
|
||||
- [OperUrfFile.cpp](file://cpp/Tools/OperUrfFile.cpp)
|
||||
|
||||
**Section sources**
|
||||
- [excel.cpp](file://cpp/Tools/excel.cpp)
|
||||
- [OperTxtFile.cpp](file://cpp/Tools/OperTxtFile.cpp)
|
||||
- [OperUrfFile.cpp](file://cpp/Tools/OperUrfFile.cpp)
|
||||
|
||||
## 依赖分析
|
||||
IOManager模块依赖于`DataOperator`类进行数据操作,并通过`excel.cpp`、`OperTxtFile.cpp`和`OperUrfFile.cpp`等工具类实现具体的文件读写操作。这些依赖关系确保了模块的高内聚和低耦合,提高了代码的可维护性和可扩展性。
|
||||
|
||||
```mermaid
|
||||
graph TD
|
||||
IOManager[IOManager] --> DataOperator[DataOperator]
|
||||
DataOperator --> Excel[excel.cpp]
|
||||
DataOperator --> OperTxtFile[OperTxtFile.cpp]
|
||||
DataOperator --> OperUrfFile[OperUrfFile.cpp]
|
||||
```
|
||||
|
||||
**Diagram sources**
|
||||
- [IOManager.cpp](file://cpp/Managers/IOManager.cpp)
|
||||
- [DataOperator.cpp](file://cpp/Operator/DataOperator.cpp)
|
||||
- [excel.cpp](file://cpp/Tools/excel.cpp)
|
||||
- [OperTxtFile.cpp](file://cpp/Tools/OperTxtFile.cpp)
|
||||
- [OperUrfFile.cpp](file://cpp/Tools/OperUrfFile.cpp)
|
||||
|
||||
**Section sources**
|
||||
- [IOManager.cpp](file://cpp/Managers/IOManager.cpp)
|
||||
- [DataOperator.cpp](file://cpp/Operator/DataOperator.cpp)
|
||||
|
||||
## 性能考虑
|
||||
IOManager模块在设计时充分考虑了性能因素。通过使用高效的文件读写操作和缓存机制,确保了数据传输的高效性。此外,模块还支持批量导出功能,进一步提高了数据处理的效率。
|
||||
|
||||
## 故障排除指南
|
||||
在使用IOManager模块时,可能会遇到文件编码错误或格式不兼容的问题。为了解决这些问题,建议检查文件的编码格式,并确保文件格式与目标系统兼容。如果问题仍然存在,可以尝试使用不同的文件格式或编码方式。
|
||||
|
||||
**Section sources**
|
||||
- [IOManager.cpp](file://cpp/Managers/IOManager.cpp)
|
||||
- [DataOperator.cpp](file://cpp/Operator/DataOperator.cpp)
|
||||
|
||||
## 结论
|
||||
IOManager模块是Geomative Studio项目中的关键组件,负责处理数据的导入导出功能。通过协调`DataOperator`类和利用`excel.cpp`、`OperTxtFile.cpp`、`OperUrfFile.cpp`等工具类,该模块实现了对多种文件格式的支持,并确保了数据传输的可靠性和完整性。未来的工作可以进一步优化性能,提高用户体验。
|
||||
@@ -0,0 +1,84 @@
|
||||
# Managers模块
|
||||
|
||||
<cite>
|
||||
**Referenced Files in This Document**
|
||||
- [DevManager.cpp](file://cpp/Managers/DevManager.cpp)
|
||||
- [ProManager.cpp](file://cpp/Managers/ProManager.cpp)
|
||||
- [SptManager.cpp](file://cpp/Managers/SptManager.cpp)
|
||||
- [TdManager.cpp](file://cpp/Managers/TdManager.cpp)
|
||||
- [IOManager.cpp](file://cpp/Managers/IOManager.cpp)
|
||||
- [ExecManager.cpp](file://cpp/Managers/ExecManager.cpp)
|
||||
- [PasswordMng.cpp](file://cpp/Managers/PasswordMng.cpp)
|
||||
- [TestManager.cpp](file://cpp/Managers/TestManager.cpp)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [DevManager职责与实现](#devmanager职责与实现)
|
||||
2. [ProManager职责与实现](#promanager职责与实现)
|
||||
3. [SptManager职责与实现](#sptmanager职责与实现)
|
||||
4. [TdManager职责与实现](#tdmanager职责与实现)
|
||||
5. [IOManager职责与实现](#iomanager职责与实现)
|
||||
6. [ExecManager职责与实现](#execmanager职责与实现)
|
||||
7. [PasswordMng职责与实现](#passwordmng职责与实现)
|
||||
8. [TestManager职责与实现](#testmanager职责与实现)
|
||||
9. [管理器间协作示例](#管理器间协作示例)
|
||||
|
||||
## DevManager职责与实现
|
||||
|
||||
DevManager模块负责设备连接管理、状态监控和固件升级。该管理器通过`CDevManager`类实现,主要功能包括设备的添加、删除、状态更新和在线/离线设备列表的管理。它维护一个设备链表`m_devLinkList`,用于存储和管理所有设备对象。当设备连接时,DevManager会通过`AddDevice`方法将设备信息写入数据库,并在内存中创建设备对象。设备的状态(在线、离线)通过`m_uState`字段进行跟踪,状态更新通过`UpdateDevInfo`方法实现,该方法会将设备的硬件版本、软件版本、电池电压等信息同步到数据库中。对于固件升级,虽然具体实现未在代码中直接体现,但通过设备通信机制,可以实现固件的远程更新。
|
||||
|
||||
**Section sources**
|
||||
- [DevManager.cpp](file://cpp/Managers/DevManager.cpp#L24-#L642)
|
||||
|
||||
## ProManager职责与实现
|
||||
|
||||
ProManager模块负责项目创建、测区管理和任务配置。该管理器通过`CProManager`类实现,提供了创建、显示和管理项目、测区和任务的接口。`CreateProjectInDB`方法用于在数据库中创建新项目,包括项目名称、描述、位置等信息,并确保项目名称的唯一性。`CreateProjectInDev`方法则负责将项目信息同步到设备端,通过生成XML文件并传输到设备的SD卡目录下。对于测区管理,`InsertDefaultTzToProject`方法会在项目创建时自动添加一个默认测区。任务配置方面,ProManager通过`ShowTzList`和`ShowProList`等方法提供项目和测区的列表显示功能,支持用户进行任务的配置和选择。
|
||||
|
||||
**Section sources**
|
||||
- [ProManager.cpp](file://cpp/Managers/ProManager.cpp#L32-#L707)
|
||||
|
||||
## SptManager职责与实现
|
||||
|
||||
SptManager模块负责生成和管理2D/3D/跨孔测量脚本。该管理器通过`CSptManager`类实现,支持多种测量模式的脚本创建。`Create2DSConInDB`方法用于在数据库中创建二维测量脚本,包括脚本名称、电极数量、通道数等参数,并将脚本记录写入`script2d`表。对于跨孔测量,`CreateCESConInDB`方法实现了1D跨孔脚本的创建,支持自定义的测量参数。SptManager还维护了一个介质链表`m_medLinkList`,用于存储不同测量模式对应的介质对象,如`CMediumA`、`CMediumB`等,这些介质对象定义了具体的测量几何配置。脚本的生成过程涉及用户界面交互,通过`COpCreateSptDlg`等对话框收集用户输入,并最终将配置信息持久化到数据库。
|
||||
|
||||
**Section sources**
|
||||
- [SptManager.cpp](file://cpp/Managers/SptManager.cpp#L74-#L800)
|
||||
|
||||
## TdManager职责与实现
|
||||
|
||||
TdManager模块负责测试数据的采集、存储和分析。该管理器通过`CTdManager`类实现,提供了测试数据的列表显示、数据采集和存储功能。`ShowTdListByProject`和`ShowTdListByTz`方法用于根据项目或测区显示相关的测试数据列表,支持多种测试类型(如2D电阻率、IP等)。测试数据的存储通过`CTdManager`与数据库的交互实现,将测量结果写入`td`、`rspcon`、`ipspcon`等数据表中。对于数据分析,TdManager提供了数据导出功能,可以将测试数据导出为Access数据库文件,便于后续处理。此外,该管理器还负责管理测试数据的元信息,如测量时间、天气条件、操作人员等。
|
||||
|
||||
**Section sources**
|
||||
- [TdManager.cpp](file://cpp/Managers/TdManager.cpp#L57-#L800)
|
||||
|
||||
## IOManager职责与实现
|
||||
|
||||
IOManager模块负责数据导入导出功能,支持Excel、CSV、TXT、URF格式。该管理器通过`CIOManager`类实现,提供了`Export`和`Import`两个主要方法。`Export`方法允许用户将项目、测区和测试数据导出为Access数据库文件(.accdb),通过`CreateExpDatabase`方法创建目标数据库,并使用`ExportDataToAccdbFile`方法将数据写入。`Import`方法则从Access文件中读取数据,并将其导入到本地数据库中,支持项目、测区、脚本和测试数据的完整导入。虽然代码中主要实现了Access格式的导入导出,但通过扩展`OperTxtFile`、`OperUrfFile`等工具类,可以支持其他格式如TXT和URF。对于Excel和CSV格式,系统可能通过外部库或工具进行转换。
|
||||
|
||||
**Section sources**
|
||||
- [IOManager.cpp](file://cpp/Managers/IOManager.cpp#L23-#L800)
|
||||
|
||||
## ExecManager职责与实现
|
||||
|
||||
ExecManager模块负责任务执行流程的管理。该管理器通过`CExecManager`类实现,协调测试任务的执行。`Exec2DRSPTest`方法是执行2D电阻率测量的核心,它首先通过`Save2DRSPSetInfo`方法保存测试设置,然后将配置文件发送到设备端,最后初始化测量过程。任务执行流程包括:1) 用户在界面设置测量参数;2) ExecManager生成配置文件并发送到设备;3) 设备接收指令并开始测量;4) 测量数据实时回传并存储。`InitialMeasure`方法负责与设备通信,发送`meas_add`等命令来启动测量。整个流程通过非模态对话框`COpExec2DRSPTestDlg`进行监控,确保用户可以实时查看测量状态。
|
||||
|
||||
**Section sources**
|
||||
- [ExecManager.cpp](file://cpp/Managers/ExecManager.cpp#L49-#L613)
|
||||
|
||||
## PasswordMng职责与实现
|
||||
|
||||
PasswordMng模块负责密码管理机制。该管理器通过`CPasswordMng`类实现,提供密码的创建、修改和删除功能。密码信息存储在数据库的`password_info`表中,包含设备类型、设备名称和密码字段。`OperatePassword`方法根据操作类型(创建、修改、删除)生成相应的SQL语句,并执行数据库事务。对于GD-10设备,该管理器还通过串口命令与设备通信,使用`check_password`命令验证旧密码,并使用`set_param("password,...")`命令在设备端设置新密码,确保数据库和设备端的密码同步。密码的输入通过对话框界面完成,`OnOK`方法负责验证用户输入,确保新密码与确认密码一致,并调用`VerifyPassword`方法检查密码格式(必须由字母和数字组成)。
|
||||
|
||||
**Section sources**
|
||||
- [PasswordMng.cpp](file://cpp/Managers/PasswordMng.cpp#L21-#L623)
|
||||
|
||||
## TestManager职责与实现
|
||||
|
||||
TestManager模块负责测试任务的调度。该管理器通过`CTestManager`类实现,目前代码中仅包含构造函数和析构函数的定义,具体实现细节未在提供的文件中体现。根据命名和模块化设计原则,TestManager可能负责管理测试任务队列、调度任务执行顺序、处理任务间的依赖关系以及监控任务执行状态。它可能与其他管理器(如ExecManager、TdManager)协同工作,确保测试任务能够按照预定计划高效执行。
|
||||
|
||||
**Section sources**
|
||||
- [TestManager.cpp](file://cpp/Managers/TestManager.cpp#L18-#L27)
|
||||
|
||||
## 管理器间协作示例
|
||||
|
||||
各个管理器之间通过紧密协作实现完整的测量工作流。例如,当用户创建一个新项目时,ProManager首先在数据库中创建项目记录,然后触发SptManager生成默认的测量脚本。项目创建完成后,如果设备已连接,DevManager会检测到设备在线状态,并通知ProManager将项目数据同步到设备。ProManager调用`CreateProjectInDev`方法,生成项目配置文件并通过DevManager的设备对象发送到设备端。当用户开始执行测量任务时,ExecManager从ProManager获取项目和测区信息,从SptManager获取测量脚本,配置测试参数后,通过DevManager与设备通信,启动测量。测量过程中,TdManager负责接收和存储从设备传回的数据。整个流程体现了各管理器职责分明又相互协作的设计理念。
|
||||
@@ -0,0 +1,216 @@
|
||||
# ProManager
|
||||
|
||||
<cite>
|
||||
**本文档引用的文件**
|
||||
- [ProManager.cpp](file://cpp/Managers/ProManager.cpp)
|
||||
- [ProManager.h](file://h/ProManager.h)
|
||||
- [Project.cpp](file://cpp/ProblemZone/Project.cpp)
|
||||
- [Project.h](file://h/Project.h)
|
||||
- [TestingZone.cpp](file://cpp/ProblemZone/TestingZone.cpp)
|
||||
- [TestingZone.h](file://h/TestingZone.h)
|
||||
- [SptManager.cpp](file://cpp/Managers/SptManager.cpp)
|
||||
- [SptManager.h](file://h/SptManager.h)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [简介](#简介)
|
||||
2. [项目生命周期管理](#项目生命周期管理)
|
||||
3. [测区管理机制](#测区管理机制)
|
||||
4. [数据持久化流程](#数据持久化流程)
|
||||
5. [与SptManager的协调](#与sptmanager的协调)
|
||||
6. [恢复策略](#恢复策略)
|
||||
7. [代码示例](#代码示例)
|
||||
8. [结论](#结论)
|
||||
|
||||
## 简介
|
||||
|
||||
ProManager模块是Geomative Studio软件的核心组件之一,负责管理项目的整个生命周期。该模块提供了创建、打开、保存和关闭项目的基本功能,同时管理与项目相关的测区(TestingZone)和任务包配置。ProManager通过协调数据库和XML缓存文件之间的数据同步,确保项目数据的完整性和一致性。此外,它还与SptManager模块紧密协作,生成与项目关联的测量脚本。
|
||||
|
||||
**Section sources**
|
||||
- [ProManager.h](file://h/ProManager.h#L30-L64)
|
||||
- [ProManager.cpp](file://cpp/Managers/ProManager.cpp#L32-L37)
|
||||
|
||||
## 项目生命周期管理
|
||||
|
||||
ProManager模块实现了完整的项目生命周期管理功能,包括项目创建、打开、保存和关闭操作。当用户创建新项目时,ProManager首先通过`CreateProjectInDB`方法在数据库中创建项目记录,然后通过`CreateProjectInDev`方法在设备上创建相应的项目结构。项目创建过程中,系统会自动生成一个唯一的项目编号(CN),并创建一个默认的测区。
|
||||
|
||||
项目打开操作通过`LoadProjectFromDev`方法实现,该方法从设备加载项目数据并同步到本地数据库。项目保存操作则通过将内存中的项目数据序列化为XML格式并保存到缓存文件中来实现。项目关闭时,ProManager会清理内存中的项目对象,释放相关资源。
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Start([开始]) --> CreateProject["创建项目"]
|
||||
CreateProject --> CheckExist["检查项目名称是否存在"]
|
||||
CheckExist --> |存在| ShowError["显示错误信息"]
|
||||
CheckExist --> |不存在| InsertDB["在数据库插入记录"]
|
||||
InsertDB --> GenerateCN["生成项目编号"]
|
||||
GenerateCN --> CreateDefaultTz["创建默认测区"]
|
||||
CreateDefaultTz --> CreateDev["在设备创建项目"]
|
||||
CreateDev --> SaveXML["保存project.xml"]
|
||||
SaveXML --> End([结束])
|
||||
```
|
||||
|
||||
**Diagram sources**
|
||||
- [ProManager.cpp](file://cpp/Managers/ProManager.cpp#L249-L317)
|
||||
- [ProManager.cpp](file://cpp/Managers/ProManager.cpp#L343-L483)
|
||||
|
||||
**Section sources**
|
||||
- [ProManager.cpp](file://cpp/Managers/ProManager.cpp#L249-L317)
|
||||
- [ProManager.cpp](file://cpp/Managers/ProManager.cpp#L343-L483)
|
||||
- [Project.cpp](file://cpp/ProblemZone/Project.cpp#L19-L50)
|
||||
|
||||
## 测区管理机制
|
||||
|
||||
测区(TestingZone)是项目中的重要组成部分,用于组织和管理测量任务。ProManager通过`CreateTzInDB`和`CreateTzInDev`方法实现测区的创建。每个测区都有一个类型属性(TZtype),用于区分不同类型的测量任务,如1D VES、2D ERI或3D ERT。
|
||||
|
||||
测区配置逻辑包括设置测区名称、描述、位置和创建日期等基本信息。ProManager通过`ShowTzList`方法显示指定项目下的所有测区列表,用户可以通过界面操作选择和管理测区。当创建新测区时,系统会自动为其分配一个唯一的测区编号(CN),并在数据库和设备上同步创建相应的结构。
|
||||
|
||||
```mermaid
|
||||
classDiagram
|
||||
class CProManager {
|
||||
+ShowTzList(dwProHandle, tzList)
|
||||
+CreateTzInDB(dwID, dwPrID)
|
||||
+CreateTzInDev(dwID, pDev)
|
||||
+DeleteTzInDB(dwID)
|
||||
+DeleteTzInDev(szPrCN, szTzCN, pDev)
|
||||
}
|
||||
class CTestingZone {
|
||||
+m_szTZname
|
||||
+m_szCDate
|
||||
+m_szDesc
|
||||
+m_szLocation
|
||||
+m_szCN
|
||||
+m_szTZtype
|
||||
}
|
||||
CProManager --> CTestingZone : "创建"
|
||||
CProManager --> CTestingZone : "管理"
|
||||
```
|
||||
|
||||
**Diagram sources**
|
||||
- [ProManager.h](file://h/ProManager.h#L53-L58)
|
||||
- [TestingZone.h](file://h/TestingZone.h#L14-L30)
|
||||
|
||||
**Section sources**
|
||||
- [ProManager.cpp](file://cpp/Managers/ProManager.cpp#L53-L92)
|
||||
- [TestingZone.cpp](file://cpp/ProblemZone/TestingZone.cpp#L18-L44)
|
||||
- [TestingZone.h](file://h/TestingZone.h#L14-L30)
|
||||
|
||||
## 数据持久化流程
|
||||
|
||||
ProManager模块采用混合持久化策略,将项目数据存储在数据库和XML缓存文件中。核心项目数据(如项目名称、描述、位置等)存储在Access数据库的project表中,而项目结构和配置信息则以XML格式存储在CACHE目录下的project.xml文件中。
|
||||
|
||||
数据持久化流程如下:当项目创建或修改时,ProManager首先更新数据库中的记录,然后生成或更新project.xml文件。XML文件包含项目的基本信息、测区列表和配置参数。系统使用CMarkup类来处理XML文件的读写操作。项目数据在内存、数据库和XML文件之间保持同步,确保数据的一致性和完整性。
|
||||
|
||||
```mermaid
|
||||
flowchart LR
|
||||
Memory[内存对象] --> Database[(数据库)]
|
||||
Memory --> XML[project.xml]
|
||||
Database --> Memory
|
||||
XML --> Memory
|
||||
subgraph "数据流"
|
||||
Database
|
||||
XML
|
||||
Memory
|
||||
end
|
||||
```
|
||||
|
||||
**Diagram sources**
|
||||
- [ProManager.cpp](file://cpp/Managers/ProManager.cpp#L398-L426)
|
||||
- [ProManager.cpp](file://cpp/Managers/ProManager.cpp#L1746-L1863)
|
||||
|
||||
**Section sources**
|
||||
- [ProManager.cpp](file://cpp/Managers/ProManager.cpp#L398-L426)
|
||||
- [ProManager.cpp](file://cpp/Managers/ProManager.cpp#L1746-L1863)
|
||||
- [Project.h](file://h/Project.h#L16-L38)
|
||||
|
||||
## 与SptManager的协调
|
||||
|
||||
ProManager与SptManager模块紧密协作,共同完成项目相关的测量脚本管理。当需要为项目生成测量脚本时,ProManager会调用SptManager的相关方法。SptManager负责具体的脚本创建、编辑和验证逻辑,而ProManager则负责提供项目上下文和持久化支持。
|
||||
|
||||
这种协作关系体现在项目创建后的脚本生成流程中:ProManager首先创建项目结构,然后通知SptManager为该项目生成相应的测量脚本。脚本数据存储在独立的数据库表中,但与项目数据通过外键关联。这种设计实现了功能分离,同时保持了数据的完整性。
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant User as "用户"
|
||||
participant ProManager as "ProManager"
|
||||
participant SptManager as "SptManager"
|
||||
participant Database as "数据库"
|
||||
User->>ProManager : 创建新项目
|
||||
ProManager->>Database : 插入项目记录
|
||||
ProManager->>SptManager : 请求生成脚本
|
||||
SptManager->>SptManager : 创建脚本配置
|
||||
SptManager->>Database : 保存脚本数据
|
||||
SptManager-->>ProManager : 脚本创建完成
|
||||
ProManager-->>User : 项目创建成功
|
||||
```
|
||||
|
||||
**Diagram sources**
|
||||
- [ProManager.cpp](file://cpp/Managers/ProManager.cpp#L343-L483)
|
||||
- [SptManager.cpp](file://cpp/Managers/SptManager.cpp#L257-L487)
|
||||
|
||||
**Section sources**
|
||||
- [ProManager.cpp](file://cpp/Managers/ProManager.cpp#L343-L483)
|
||||
- [SptManager.cpp](file://cpp/Managers/SptManager.cpp#L257-L487)
|
||||
- [SptManager.h](file://h/SptManager.h#L30-L48)
|
||||
|
||||
## 恢复策略
|
||||
|
||||
ProManager模块实现了多种恢复策略,以应对项目文件损坏或版本不兼容的情况。当检测到project.xml文件损坏时,系统可以从数据库中重建XML文件。恢复流程首先验证数据库中的项目记录完整性,然后重新生成XML文件结构。
|
||||
|
||||
对于版本不兼容问题,ProManager采用向后兼容的设计原则。新版本的软件可以读取旧版本创建的项目文件,系统会自动进行必要的数据转换和升级。在极端情况下,如果项目数据无法恢复,系统会创建一个新的空白项目,并尝试从备份中恢复尽可能多的数据。
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Start([开始]) --> CheckXML["检查project.xml"]
|
||||
CheckXML --> |有效| LoadNormal["正常加载"]
|
||||
CheckXML --> |无效| CheckDB["检查数据库"]
|
||||
CheckDB --> |完整| RebuildXML["重建XML文件"]
|
||||
CheckDB --> |不完整| CreateNew["创建新项目"]
|
||||
RebuildXML --> Validate["验证数据"]
|
||||
Validate --> |成功| LoadRebuilt["加载重建文件"]
|
||||
Validate --> |失败| CreateNew
|
||||
CreateNew --> Initialize["初始化新项目"]
|
||||
Initialize --> End([结束])
|
||||
```
|
||||
|
||||
**Diagram sources**
|
||||
- [ProManager.cpp](file://cpp/Managers/ProManager.cpp#L1746-L1863)
|
||||
- [ProManager.cpp](file://cpp/Managers/ProManager.cpp#L1865-L1999)
|
||||
|
||||
**Section sources**
|
||||
- [ProManager.cpp](file://cpp/Managers/ProManager.cpp#L1746-L1863)
|
||||
- [ProManager.cpp](file://cpp/Managers/ProManager.cpp#L1865-L1999)
|
||||
|
||||
## 代码示例
|
||||
|
||||
以下代码示例展示了项目创建和测区配置的核心方法调用。`CreateProjectInDB`方法处理数据库层面的项目创建,而`CreateProjectInDev`方法负责在设备上创建项目结构。测区配置通过`InsertDefaultTzToProject`方法实现,该方法为新项目创建一个默认的测区。
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
A["CreateProjectInDB"] --> B["显示创建对话框"]
|
||||
B --> C["验证项目名称"]
|
||||
C --> |已存在| D["显示错误信息"]
|
||||
C --> |不存在| E["生成项目编号"]
|
||||
E --> F["插入数据库记录"]
|
||||
F --> G["创建默认测区"]
|
||||
G --> H["返回成功状态"]
|
||||
I["CreateProjectInDev"] --> J["获取项目信息"]
|
||||
J --> K["创建本地目录"]
|
||||
K --> L["生成project.xml"]
|
||||
L --> M["发送到设备"]
|
||||
M --> |成功| N["更新同步状态"]
|
||||
M --> |失败| O["清理并返回错误"]
|
||||
```
|
||||
|
||||
**Diagram sources**
|
||||
- [ProManager.cpp](file://cpp/Managers/ProManager.cpp#L249-L317)
|
||||
- [ProManager.cpp](file://cpp/Managers/ProManager.cpp#L343-L483)
|
||||
- [ProManager.cpp](file://cpp/Managers/ProManager.cpp#L319-L341)
|
||||
|
||||
**Section sources**
|
||||
- [ProManager.cpp](file://cpp/Managers/ProManager.cpp#L249-L317)
|
||||
- [ProManager.cpp](file://cpp/Managers/ProManager.cpp#L343-L483)
|
||||
- [ProManager.cpp](file://cpp/Managers/ProManager.cpp#L319-L341)
|
||||
|
||||
## 结论
|
||||
|
||||
ProManager模块作为Geomative Studio项目管理的核心,实现了完整的项目生命周期管理功能。通过精心设计的架构,该模块有效地协调了数据库存储和XML文件缓存,确保了项目数据的持久性和一致性。其与SptManager模块的协作机制,为测量脚本的生成和管理提供了坚实的基础。完善的恢复策略进一步增强了系统的可靠性和用户体验。
|
||||
@@ -0,0 +1,222 @@
|
||||
# SptManager
|
||||
|
||||
<cite>
|
||||
**本文档引用的文件**
|
||||
- [SptManager.cpp](file://cpp/Managers/SptManager.cpp)
|
||||
- [SptManager.h](file://h/SptManager.h)
|
||||
- [Script2D.cpp](file://cpp/ProblemZone/Script2D.cpp)
|
||||
- [Script3D.cpp](file://cpp/ProblemZone/Script3D.cpp)
|
||||
- [ScriptCE.cpp](file://cpp/ProblemZone/ScriptCE.cpp)
|
||||
- [Script.h](file://h/Script.h)
|
||||
- [ProManager.cpp](file://cpp/Managers/ProManager.cpp)
|
||||
- [testzone.xml](file://CACHE/testzone.xml)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [引言](#引言)
|
||||
2. [项目结构](#项目结构)
|
||||
3. [核心组件](#核心组件)
|
||||
4. [架构概述](#架构概述)
|
||||
5. [详细组件分析](#详细组件分析)
|
||||
6. [依赖分析](#依赖分析)
|
||||
7. [性能考虑](#性能考虑)
|
||||
8. [故障排除指南](#故障排除指南)
|
||||
9. [结论](#结论)
|
||||
|
||||
## 引言
|
||||
SptManager模块是Geomative Studio软件中的核心组件,负责生成和管理各种测量脚本(包括2D、3D和跨孔测量)。该模块根据ProManager中定义的项目和测区信息,调用Script2D、Script3D、ScriptCE等具体类来生成符合测量协议的脚本数据。SptManager不仅处理脚本的创建和验证,还负责脚本的存储(如testzone.xml)和导出流程。本文档将深入分析SptManager的职责和实现,提供脚本生成失败或逻辑错误的排查方法,并通过代码示例展示从测区参数到最终脚本数据的转换过程。
|
||||
|
||||
## 项目结构
|
||||
SptManager模块位于`cpp/Managers/`目录下,其主要功能是通过调用不同类型的脚本类(如Script2D、Script3D、ScriptCE)来生成测量脚本。这些脚本类位于`cpp/ProblemZone/`目录下,每个类负责特定类型的测量脚本生成。SptManager还与ProManager模块紧密协作,获取项目和测区信息,确保生成的脚本符合实际测量需求。
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "核心模块"
|
||||
SptManager[SptManager]
|
||||
ProManager[ProManager]
|
||||
end
|
||||
subgraph "脚本生成类"
|
||||
Script2D[Script2D]
|
||||
Script3D[Script3D]
|
||||
ScriptCE[ScriptCE]
|
||||
end
|
||||
SptManager --> ProManager
|
||||
SptManager --> Script2D
|
||||
SptManager --> Script3D
|
||||
SptManager --> ScriptCE
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [SptManager.cpp](file://cpp/Managers/SptManager.cpp#L1-L3589)
|
||||
- [Script2D.cpp](file://cpp/ProblemZone/Script2D.cpp#L1-L237)
|
||||
- [Script3D.cpp](file://cpp/ProblemZone/Script3D.cpp#L1-L221)
|
||||
- [ScriptCE.cpp](file://cpp/ProblemZone/ScriptCE.cpp#L1-L146)
|
||||
|
||||
**章节来源**
|
||||
- [SptManager.cpp](file://cpp/Managers/SptManager.cpp#L1-L3589)
|
||||
- [ProManager.cpp](file://cpp/Managers/ProManager.cpp#L1-L2054)
|
||||
|
||||
## 核心组件
|
||||
SptManager的核心功能包括脚本的创建、验证、存储和导出。它通过`Create2DSConInDB`、`CreateCESConInDB`等方法创建不同类型的测量脚本,并将这些脚本存储在数据库中。SptManager还负责将脚本导出到设备,并从设备加载脚本。
|
||||
|
||||
**章节来源**
|
||||
- [SptManager.cpp](file://cpp/Managers/SptManager.cpp#L257-L800)
|
||||
- [Script2D.cpp](file://cpp/ProblemZone/Script2D.cpp#L1-L237)
|
||||
|
||||
## 架构概述
|
||||
SptManager的架构设计遵循模块化原则,通过继承和多态机制实现不同类型的脚本生成。CScript类作为基类,定义了所有脚本的通用接口,而CScript2D、CScript3D、CScriptCE等派生类则实现了特定类型的脚本生成逻辑。SptManager通过`GetScript`方法根据句柄动态创建相应的脚本对象,实现了灵活的脚本管理。
|
||||
|
||||
```mermaid
|
||||
classDiagram
|
||||
class CScript {
|
||||
+DWORD m_dwID
|
||||
+_ConnectionPtr m_pConnection
|
||||
+int m_iAR
|
||||
+int m_iEAmount
|
||||
+CScript(DWORD dwID, _ConnectionPtr& pConnection)
|
||||
+~CScript()
|
||||
+virtual bool ShowSptDetailInfo(CListCtrl &sptDetailList)
|
||||
+virtual bool ShowChannelList(CListCtrl &sptChannelList)
|
||||
+virtual bool ShowSptConInfo(CListCtrl &sptConList)
|
||||
+virtual void AdjustRecListColumn(int iAR, CListCtrl& sptConListInfo)
|
||||
}
|
||||
class CScript2D {
|
||||
+CScript2D(DWORD dwID, _ConnectionPtr& pConnection)
|
||||
+~CScript2D()
|
||||
+bool ShowSptDetailInfo(CListCtrl &sptDetailList)
|
||||
+bool ShowChannelList(CListCtrl &sptChannelList)
|
||||
+bool ShowSptConInfo(CListCtrl &sptConList)
|
||||
+void AdjustRecListColumn(int iAR, CListCtrl& sptConListInfo)
|
||||
}
|
||||
class CScript3D {
|
||||
+CScript3D(DWORD dwID, _ConnectionPtr& pConnection)
|
||||
+~CScript3D()
|
||||
+bool ShowSptDetailInfo(CListCtrl &sptDetailList)
|
||||
+bool ShowChannelList(CListCtrl &sptChannelList)
|
||||
+bool ShowSptConInfo(CListCtrl &sptConList)
|
||||
+void AdjustRecListColumn(int iAR, CListCtrl& sptConListInfo)
|
||||
}
|
||||
class CScriptCE {
|
||||
+CScriptCE(DWORD dwID, _ConnectionPtr& pConnection)
|
||||
+~CScriptCE()
|
||||
+bool ShowSptDetailInfo(CListCtrl &sptDetailList)
|
||||
+bool ShowChannelList(CListCtrl &sptChannelList)
|
||||
+bool ShowSptConInfo(CListCtrl &sptConList)
|
||||
}
|
||||
CScript <|-- CScript2D
|
||||
CScript <|-- CScript3D
|
||||
CScript <|-- CScriptCE
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [Script.h](file://h/Script.h)
|
||||
- [Script2D.cpp](file://cpp/ProblemZone/Script2D.cpp#L1-L237)
|
||||
- [Script3D.cpp](file://cpp/ProblemZone/Script3D.cpp#L1-L221)
|
||||
- [ScriptCE.cpp](file://cpp/ProblemZone/ScriptCE.cpp#L1-L146)
|
||||
|
||||
## 详细组件分析
|
||||
|
||||
### SptManager分析
|
||||
SptManager模块的主要职责是协调脚本的生成和管理。它通过`Create2DSConInDB`方法创建2D测量脚本,通过`CreateCESConInDB`方法创建跨孔测量脚本。这些方法首先通过对话框获取用户输入的脚本参数,然后在数据库中创建相应的记录。
|
||||
|
||||
#### 脚本创建流程
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant 用户 as "用户"
|
||||
participant SptManager as "SptManager"
|
||||
participant 数据库 as "数据库"
|
||||
用户->>SptManager : 请求创建2D脚本
|
||||
SptManager->>SptManager : 显示创建对话框
|
||||
SptManager->>用户 : 获取脚本参数
|
||||
SptManager->>数据库 : 检查脚本名称是否已存在
|
||||
alt 脚本名称已存在
|
||||
数据库-->>SptManager : 返回存在
|
||||
SptManager-->>用户 : 显示错误消息
|
||||
else 脚本名称不存在
|
||||
数据库-->>SptManager : 返回不存在
|
||||
SptManager->>数据库 : 插入scon记录
|
||||
SptManager->>数据库 : 插入channel记录
|
||||
SptManager->>数据库 : 插入script2d记录
|
||||
数据库-->>SptManager : 确认插入成功
|
||||
SptManager-->>用户 : 显示成功消息
|
||||
end
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [SptManager.cpp](file://cpp/Managers/SptManager.cpp#L257-L800)
|
||||
|
||||
#### 脚本验证与存储
|
||||
SptManager在创建脚本时会进行严格的验证,确保脚本名称的唯一性。如果脚本名称已存在,系统会提示用户并取消创建操作。脚本数据存储在数据库的`scon`、`channel`和`script2d`表中,其中`scon`表存储脚本的基本信息,`channel`表存储通道信息,`script2d`表存储具体的测量点数据。
|
||||
|
||||
**章节来源**
|
||||
- [SptManager.cpp](file://cpp/Managers/SptManager.cpp#L334-L351)
|
||||
- [SptManager.cpp](file://cpp/Managers/SptManager.cpp#L363-L380)
|
||||
|
||||
### Script2D分析
|
||||
Script2D类负责生成2D测量脚本。它继承自CScript类,并实现了特定于2D测量的逻辑。Script2D的主要功能包括显示脚本详细信息、显示通道列表和显示脚本配置信息。
|
||||
|
||||
#### 显示脚本详细信息
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Start([开始]) --> GetSConData["从scon表获取数据"]
|
||||
GetSConData --> CheckRecordCount{"记录数 > 0?"}
|
||||
CheckRecordCount --> |是| SetDetailInfo["设置详细信息"]
|
||||
CheckRecordCount --> |否| End([结束])
|
||||
SetDetailInfo --> End
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [Script2D.cpp](file://cpp/ProblemZone/Script2D.cpp#L28-L71)
|
||||
|
||||
#### 显示通道列表
|
||||
Script2D通过查询`channel`和`medium`表来获取通道信息,并将其显示在列表控件中。每个通道的装置类型编号(AR)也会被获取并存储。
|
||||
|
||||
**章节来源**
|
||||
- [Script2D.cpp](file://cpp/ProblemZone/Script2D.cpp#L74-L109)
|
||||
|
||||
### Script3D分析
|
||||
Script3D类负责生成3D测量脚本。它的实现与Script2D类似,但针对3D测量的特点进行了优化。Script3D同样实现了显示脚本详细信息、显示通道列表和显示脚本配置信息的功能。
|
||||
|
||||
**章节来源**
|
||||
- [Script3D.cpp](file://cpp/ProblemZone/Script3D.cpp#L28-L151)
|
||||
|
||||
### ScriptCE分析
|
||||
ScriptCE类负责生成跨孔测量脚本。它继承自CScript类,并实现了特定于跨孔测量的逻辑。ScriptCE的主要功能包括显示脚本配置信息、显示脚本详细信息和显示通道列表。
|
||||
|
||||
**章节来源**
|
||||
- [ScriptCE.cpp](file://cpp/ProblemZone/ScriptCE.cpp#L28-L146)
|
||||
|
||||
## 依赖分析
|
||||
SptManager模块依赖于多个其他模块和类,包括ProManager、Script2D、Script3D、ScriptCE等。这些依赖关系确保了SptManager能够获取项目和测区信息,并生成符合实际测量需求的脚本。
|
||||
|
||||
```mermaid
|
||||
graph TD
|
||||
SptManager --> ProManager
|
||||
SptManager --> Script2D
|
||||
SptManager --> Script3D
|
||||
SptManager --> ScriptCE
|
||||
SptManager --> CMarkup
|
||||
SptManager --> _ConnectionPtr
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [SptManager.cpp](file://cpp/Managers/SptManager.cpp#L1-L3589)
|
||||
- [ProManager.cpp](file://cpp/Managers/ProManager.cpp#L1-L2054)
|
||||
|
||||
## 性能考虑
|
||||
SptManager在处理大量脚本数据时需要考虑性能问题。为了避免数据库操作的性能瓶颈,SptManager采用了事务处理机制,确保脚本创建的原子性。此外,SptManager还通过缓存机制减少对数据库的频繁访问,提高整体性能。
|
||||
|
||||
## 故障排除指南
|
||||
当脚本生成失败或出现逻辑错误时,可以按照以下步骤进行排查:
|
||||
|
||||
1. **检查脚本名称**:确保脚本名称在数据库中是唯一的,避免名称冲突。
|
||||
2. **验证数据库连接**:确保数据库连接正常,能够正确执行SQL语句。
|
||||
3. **检查参数输入**:确认用户输入的脚本参数是否正确,特别是电极数量、通道数量等关键参数。
|
||||
4. **查看日志文件**:检查系统日志文件,查找可能的错误信息或异常堆栈。
|
||||
|
||||
**章节来源**
|
||||
- [SptManager.cpp](file://cpp/Managers/SptManager.cpp#L334-L351)
|
||||
- [SptManager.cpp](file://cpp/Managers/SptManager.cpp#L488-L498)
|
||||
|
||||
## 结论
|
||||
SptManager模块是Geomative Studio软件中不可或缺的一部分,负责生成和管理各种测量脚本。通过深入分析SptManager的职责和实现,我们可以更好地理解其工作原理,并在实际应用中更有效地使用和维护该模块。未来的工作可以进一步优化SptManager的性能,提高脚本生成的效率和可靠性。
|
||||
@@ -0,0 +1,513 @@
|
||||
# TdManager
|
||||
|
||||
<cite>
|
||||
**本文档引用的文件**
|
||||
- [TdManager.cpp](file://cpp/Managers/TdManager.cpp)
|
||||
- [TdManager.h](file://h/TdManager.h)
|
||||
- [TaskDataOper.cpp](file://cpp/Operator/TaskDataOper.cpp)
|
||||
- [TaskDataOper.h](file://h/TaskDataOper.h)
|
||||
- [TdRecord.cpp](file://cpp/ProblemZone/TdRecord.cpp)
|
||||
- [TdRecord.h](file://h/TdRecord.h)
|
||||
- [TestingData.cpp](file://cpp/ProblemZone/TestingData.cpp)
|
||||
- [TestingData.h](file://h/TestingData.h)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [简介](#简介)
|
||||
2. [项目结构](#项目结构)
|
||||
3. [核心组件](#核心组件)
|
||||
4. [架构概述](#架构概述)
|
||||
5. [详细组件分析](#详细组件分析)
|
||||
6. [依赖分析](#依赖分析)
|
||||
7. [性能考虑](#性能考虑)
|
||||
8. [故障排除指南](#故障排除指南)
|
||||
9. [结论](#结论)
|
||||
10. [附录](#附录)(如有必要)
|
||||
|
||||
## 简介
|
||||
TdManager模块是GeomativeStudio软件中负责测试数据采集、存储和管理的核心组件。该模块主要负责接收来自设备或文件的原始测量数据,通过TaskDataOper进行处理,并将结果持久化到TdRecord和TestingData对象中。它在测试数据与项目、脚本的关联机制中起着关键作用,确保数据的完整性和一致性。本文档将详细介绍TdManager模块的职责和实现,包括数据解析错误或存储失败的解决方案,并提供代码示例展示数据接收和记录的核心流程。
|
||||
|
||||
## 项目结构
|
||||
GeomativeStudio项目的结构清晰,主要分为以下几个部分:
|
||||
- **CACHE**: 存储缓存文件,如`project.xml`和`testzone.xml`。
|
||||
- **DB**: 包含数据库相关的文件,如`数据库字段修改记录.txt`。
|
||||
- **Install**: 包含安装文件和配置文件,如`config.ini`和`version_info.txt`。
|
||||
- **LOG**: 存储日志文件,如`upg_geo_filetrans_log.txt`。
|
||||
- **Release**: 包含发布版本的文件,如`config.ini`和`msado15.tlh`。
|
||||
- **cpp**: 源代码目录,包含多个子目录,如`Managers`、`Operator`、`ProblemZone`等。
|
||||
- **h**: 头文件目录,包含与源代码对应的头文件。
|
||||
- **res**: 资源文件目录,包含资源文件如`GeoMative.rc2`。
|
||||
- **tools**: 工具脚本目录,包含批处理文件如`IAP-GD10.bat`。
|
||||
|
||||
```mermaid
|
||||
graph TD
|
||||
subgraph "根目录"
|
||||
CACHE["CACHE"]
|
||||
DB["DB"]
|
||||
Install["Install"]
|
||||
LOG["LOG"]
|
||||
Release["Release"]
|
||||
cpp["cpp"]
|
||||
h["h"]
|
||||
res["res"]
|
||||
tools["tools"]
|
||||
end
|
||||
subgraph "cpp"
|
||||
Managers["Managers"]
|
||||
Operator["Operator"]
|
||||
ProblemZone["ProblemZone"]
|
||||
end
|
||||
subgraph "Managers"
|
||||
TdManager["TdManager.cpp"]
|
||||
TaskDataOper["TaskDataOper.cpp"]
|
||||
end
|
||||
subgraph "ProblemZone"
|
||||
TdRecord["TdRecord.cpp"]
|
||||
TestingData["TestingData.cpp"]
|
||||
end
|
||||
subgraph "h"
|
||||
TdManagerH["TdManager.h"]
|
||||
TaskDataOperH["TaskDataOper.h"]
|
||||
TdRecordH["TdRecord.h"]
|
||||
TestingDataH["TestingData.h"]
|
||||
end
|
||||
TdManager --> TdManagerH
|
||||
TaskDataOper --> TaskDataOperH
|
||||
TdRecord --> TdRecordH
|
||||
TestingData --> TestingDataH
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [TdManager.cpp](file://cpp/Managers/TdManager.cpp#L1-L800)
|
||||
- [TaskDataOper.cpp](file://cpp/Operator/TaskDataOper.cpp#L1-L800)
|
||||
- [TdRecord.cpp](file://cpp/ProblemZone/TdRecord.cpp#L1-L325)
|
||||
- [TestingData.cpp](file://cpp/ProblemZone/TestingData.cpp#L1-L800)
|
||||
|
||||
**章节来源**
|
||||
- [TdManager.cpp](file://cpp/Managers/TdManager.cpp#L1-L800)
|
||||
- [TaskDataOper.cpp](file://cpp/Operator/TaskDataOper.cpp#L1-L800)
|
||||
- [TdRecord.cpp](file://cpp/ProblemZone/TdRecord.cpp#L1-L325)
|
||||
- [TestingData.cpp](file://cpp/ProblemZone/TestingData.cpp#L1-L800)
|
||||
|
||||
## 核心组件
|
||||
TdManager模块的核心组件包括`TdManager`、`TaskDataOper`、`TdRecord`和`TestingData`。这些组件协同工作,确保测试数据的高效采集、处理和存储。
|
||||
|
||||
**章节来源**
|
||||
- [TdManager.cpp](file://cpp/Managers/TdManager.cpp#L1-L800)
|
||||
- [TaskDataOper.cpp](file://cpp/Operator/TaskDataOper.cpp#L1-L800)
|
||||
- [TdRecord.cpp](file://cpp/ProblemZone/TdRecord.cpp#L1-L325)
|
||||
- [TestingData.cpp](file://cpp/ProblemZone/TestingData.cpp#L1-L800)
|
||||
|
||||
## 架构概述
|
||||
TdManager模块的架构设计旨在实现高效的数据管理和处理。模块通过`TdManager`类接收来自设备或文件的原始测量数据,然后通过`TaskDataOper`类进行数据处理,最终将结果持久化到`TdRecord`和`TestingData`对象中。这种设计确保了数据的完整性和一致性,同时提供了灵活的数据处理和存储机制。
|
||||
|
||||
```mermaid
|
||||
graph TD
|
||||
subgraph "数据采集"
|
||||
Device["设备"]
|
||||
File["文件"]
|
||||
end
|
||||
subgraph "数据处理"
|
||||
TdManager["TdManager"]
|
||||
TaskDataOper["TaskDataOper"]
|
||||
end
|
||||
subgraph "数据存储"
|
||||
TdRecord["TdRecord"]
|
||||
TestingData["TestingData"]
|
||||
end
|
||||
Device --> TdManager
|
||||
File --> TdManager
|
||||
TdManager --> TaskDataOper
|
||||
TaskDataOper --> TdRecord
|
||||
TaskDataOper --> TestingData
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [TdManager.cpp](file://cpp/Managers/TdManager.cpp#L1-L800)
|
||||
- [TaskDataOper.cpp](file://cpp/Operator/TaskDataOper.cpp#L1-L800)
|
||||
- [TdRecord.cpp](file://cpp/ProblemZone/TdRecord.cpp#L1-L325)
|
||||
- [TestingData.cpp](file://cpp/ProblemZone/TestingData.cpp#L1-L800)
|
||||
|
||||
## 详细组件分析
|
||||
### TdManager 分析
|
||||
`TdManager`类是测试数据管理的核心,负责接收和处理来自设备或文件的原始测量数据。它通过`ImportTdHeadToDB`、`Import2DTdOrgToDB`、`ImportCETdOrgToDB`等方法将数据导入数据库,并通过`UploadCETdFromDev`、`Upload2DTdFromDev`等方法从设备上载数据。
|
||||
|
||||
#### 类图
|
||||
```mermaid
|
||||
classDiagram
|
||||
class CTdManager {
|
||||
+void DeleteSPCETd(DWORD dwID)
|
||||
+void DeleteSP3DTd(DWORD dwID)
|
||||
+void DeleteSP2DTd(DWORD dwID)
|
||||
+void DeleteRsp3DTd(DWORD dwID)
|
||||
+void DeleteIpsp3DTd(DWORD dwID)
|
||||
+BOOL CheckTdExist(CString szPrCN, CString szTzCN, CString szTdCN, CDevice* const pDev, DWORD *TdId)
|
||||
+BOOL OnlineCheckTdExist(CString szTdID, CString szDevSN, DWORD *TdId)
|
||||
+BOOL OnlineCheckElecInfoExist(CString strTdID, CString szDevSN)
|
||||
+DWORD ImportTdHeadToDB(DWORD dwTzID, CString szHeadFile, CDevice* const pDev, DWORD* pExTdID = NULL)
|
||||
+BOOL Import2DTdOrgToDB(DWORD dwTdID, CString szOrgFile, CDevice* const pDev)
|
||||
+BOOL ImportCETdOrgToDB(DWORD dwTdID, CString szOrgFile, CDevice* const pDev)
|
||||
+BOOL Import3DTdOrgToDB(DWORD dwTdID, CString szOrgFile, CDevice* const pDev)
|
||||
+BOOL Import2DTdConToDB(DWORD dwTdID, CString szDatFile, CDevice* const pDev, int* pTSN=NULL)
|
||||
+BOOL ImportCETdConToDB(DWORD dwTdID, CString szDatFile, CDevice* const pDev)
|
||||
+BOOL Import3DTdConToDB(DWORD dwTdID, CString szDatFile, CDevice* const pDev, int* pTSN = NULL)
|
||||
+BOOL Import2DGRToDB(DWORD dwTdID, CString szGRFile, CDevice* const pDev)
|
||||
+BOOL Import3DGRToDB(DWORD dwTdID, CString szGRFile, CDevice* const pDev)
|
||||
+BOOL ImportCETGRToDB(DWORD dwTdID, CString szGRFile)
|
||||
+BOOL UploadCETdFromDev(CString szPrCN, CString szTzCN, CString szTdCN, CString strSubTdCN, CDevice* const pDev)
|
||||
+BOOL Upload2DTdFromDev(CString szPrCN, CString szTzCN, CString szTdCN, CString strSubTdCN, CDevice* const pDev)
|
||||
+BOOL Upload3DTdFromDev(CString szPrCN, CString szTzCN, CString szTdCN, CString strSubTdCN, CDevice* const pDev)
|
||||
+BOOL UploadWellTdFromDev(CString szPrCN, CString szTzCN, CString szTdCN, CString strSubTdCN, CDevice* const pDev)
|
||||
+BOOL DeleteTdInDev(CString szPrCN, CString szTzCN, CString szTdCN, CDevice* const pDev)
|
||||
+BOOL InitialTDListByTzForSyn(CListCtrl &tdList, CString szDeSN, CString szTzCN)
|
||||
+BOOL InitialTDListByProForSyn(CListCtrl &tdList, CString szDeSN, CString szPrCN)
|
||||
+BOOL InitialTDListByOnLineForSyn(CListCtrl &tdList, CString szDeSN, UINT32 &uiTotNum)
|
||||
+BOOL InitialDevListByOnLineForSyn(CListCtrl &tdList, CString szDeSN, STSynDevParam *ptLocalDevParam)
|
||||
+BOOL InitialCableListByOnLineForSyn(CListCtrl &tdList, CString szDeSN, STRemCableCallInfo *ptLocalCableInfo)
|
||||
+BOOL OnlineSevTDListSynToDB(STRemTaskArg *tTaskArg, CString szDeSN)
|
||||
+DWORD OnLineImportTdHeadToDB(STRemTaskArg *tTaskArg, CString szDevSN)
|
||||
+BOOL Convert2DTo3D(DWORD dwTzHandle)
|
||||
+void DeleteObjInMem(DWORD dwHandle)
|
||||
+void DeleteRspCETd(DWORD dwID)
|
||||
+void DeleteIpspCETd(DWORD dwID)
|
||||
+void DeleteRsp2DTd(DWORD dwID)
|
||||
+void DeleteIpsp2DTd(DWORD dwID)
|
||||
+CTestingData* GetTestingData(DWORD dwHandle)
|
||||
+bool ShowTdListByTz(DWORD dwTzHandle, CListCtrl& tdList)
|
||||
+bool ShowTd2DListByTz(DWORD dwTzHandle, int iEAmount, float fEDistance, int iAR, CListCtrl& tdList)
|
||||
+bool ShowTdListByDev(DWORD dwDevHandle, CListCtrl& tdList)
|
||||
+bool ImportTdSpecAttr(const CStringArray& strAttrArray, int iDataType, DWORD dwChID, int iTSN)
|
||||
+bool ShowTdListByProject(DWORD dwProHandle, CListCtrl& tdList)
|
||||
+void GetTaskAttr(DWORD dwHandle, DWORD& dwTdID, int& iStyle)
|
||||
+CTdManager(_ConnectionPtr& pConnection)
|
||||
+virtual ~CTdManager()
|
||||
+CHandleProcessor m_handleProcessor
|
||||
-CLinkList<CTestingData*> m_tdLinkList
|
||||
-_ConnectionPtr m_pConnection
|
||||
-FILE *m_pFile
|
||||
-CString m_log
|
||||
-BOOL InitialTd2DTo3DDlg(COpTd2DTo3DDlg *pOpTd2DTo3DDlg)
|
||||
}
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [TdManager.h](file://h/TdManager.h#L1-L109)
|
||||
|
||||
### TaskDataOper 分析
|
||||
`TaskDataOper`类负责处理测试数据,包括创建任务、查询任务信息、更新任务数据等。它通过`Create1DTask`、`Create2DTask`、`Create3DTask`等方法创建不同类型的任务,并通过`QueryTdDataByElec`等方法查询任务数据。
|
||||
|
||||
#### 类图
|
||||
```mermaid
|
||||
classDiagram
|
||||
class CTaskDataOper {
|
||||
+CTaskDataOper()
|
||||
+virtual ~CTaskDataOper()
|
||||
+CString CreateTaskCN(int iTestType)
|
||||
+int Create1DTask(const ST1DTaskParam& stTaskParam, CString strTaskCN)
|
||||
+int Create2DTask(const ST2DTaskParam& stTaskParam, CString strTaskCN)
|
||||
+int Create3DTask(const ST3DTaskParam& stTaskParam, CString strTaskCN)
|
||||
+void QuerySptByAR(int iAR, std : : vector<STQuerySptInfo>& vtQuerySptRes, int iSptType)
|
||||
+void QuerySptRectByARandSCname(int iAR, CString strSCname, CString& vtQuerySptRes, CString& strPoleStep, CString& strPoleDistance, CString& strLineDirection, BYTE& ucSptType)
|
||||
+void QueryMediumInfo(int iSptType, std : : vector<STQueryMediumInfo>& vtQueryAR)
|
||||
+void QueryCmInfo(CString strCName, std : : vector<STQueryCMInfo>& vtQueryCM)
|
||||
+bool DeleteTask(int iTaskID)
|
||||
+bool DeleteTaskArray(std : : vector<int> vtTaskID)
|
||||
+bool DeleteTaskArray(std : : vector<CString> vtTaskID)
|
||||
+bool Query2DSptInfo(int iSptID, int &iMinLayer, int &iMaxLayer)
|
||||
+bool QuerySptElecTpMount(int iSptID, int &iEAmount, int &iTpMount)
|
||||
+bool QueryTdBasicInfo(int iTaskID, STQueryTaskBasicInfo* pTaskBasicInfo, CString strTaskCN=_T(""))
|
||||
+bool UpdateGrData(int iTaskID, const char* pData, int iSptType, int iAddedVal = 0)
|
||||
+bool InsertGrData(int iTaskID, WORD wGrNum, const char* pData, int iSptType=1)
|
||||
+bool InsertCoordinatesData(CString strTaskID, WORD wGrNum, const char* pData, float fMaxWellDepth, int iSptType = 1)
|
||||
+bool DeleteGrInfo(int iTaskID, WORD wElecID, BYTE ucDelFlag)
|
||||
+bool DeleteTdDataInfo(BYTE ucTdType, int iTaskID, WORD wTSN, BYTE ucDelFlag)
|
||||
+bool OpenTdData(int iTaskID, BYTE ucTdType, WORD wStartTSN = 0, WORD wMaxChannel = 1)
|
||||
+void CloseTdData()
|
||||
+int QueryNextTdBasicData(std : : vector<STSigSndDataInfo>& vtTestData)
|
||||
+bool QueryTdSigBasicData(int iTaskID, BYTE ucTdType, WORD wTSN, LPSTSigSndDataInfo pMeasuBasicReq)
|
||||
+bool UpdateTdBasicData(BYTE ucTdType, BYTE ucTestType, int iTdChannelID, int iTsn, LPSTMeasuBasicDataRes pMeasuBasicData, void *pAttachData)
|
||||
+bool UpdateTdBasicData(BYTE ucTdType, BYTE ucTestType, int iTdChannelID, int iTsn, LPSTMeasuBasicDataResEx pMeasuBasicData, void *pAttachData)
|
||||
+bool OnlineDownloadRes2DData(BYTE ucTdType, STTaskDataRes *ptTaskData, DWORD dwChID)
|
||||
+bool OnlineUploadRes2DTask(DWORD dwChID)
|
||||
+bool OnlineUploadRes2DArg(DWORD dwChID, STQueryTaskBasicInfo stQueryTdInfo)
|
||||
+bool OnlineUploadRes2DRg(DWORD dwChID, STQueryTaskBasicInfo stQueryTdInfo)
|
||||
+bool OnlineUploadRes2DData(DWORD dwChID, STQueryTaskBasicInfo stQueryTdInfo)
|
||||
+bool UploadElecCoordinatesInfo(DWORD dwTdID, STQueryTaskBasicInfo stQueryTdInfo)
|
||||
+int GetCurSelTdTestType()
|
||||
+bool QueryTdDataFromTsn(int iTaskID, BYTE ucTdType, WORD wStartTSN, int iCnt, std : : vector<STTaskDetailBasicData>& vtRes)
|
||||
+bool QueryTdDataByElec(int iSptID, BYTE ucTdType, int iStartElec, int iEndElec, std : : vector<STTaskDetailBasicData>& vtRes)
|
||||
+bool QueryElecMaxWellDepthByCN(CString strScriptCN, BYTE ucTdType, STElecCoordinatesInfoHead& stElecInfoHead)
|
||||
+bool QueryElecCoordinatesDataByCN(CString strScriptCN, BYTE ucTdType, WORD wStartTSN, int iCnt, std : : vector<STElecCoordinatesInfoBody>& vtRes)
|
||||
+void QueryTdAttrToCtrl(CListCtrl& listAttr, int iTaskID)
|
||||
+void QueryTdDataToCtrl(CListCtrl& listData, int iTaskID, int iSptType, int iTestType)
|
||||
+void QueryOnLineTdAttrToCtrl(CListCtrl& listAttr, STTaskListItem taskItem, STRemTaskArg *pstTaskArg)
|
||||
+bool QueryOnLineTdAttrFromSev(STRemTaskTable stTaskTable, STRemTaskArg *pstTaskArg)
|
||||
+bool QueryOnLineTdRgFromSev(STRemTaskArg stTaskArg, char *pRg)
|
||||
+bool QueryOnLineElecInfoFromSev(STRemTaskArg stTaskArg, char* pElecInfo)
|
||||
+bool QueryOnLineTdDataFromSev(STRemTaskArg stTaskArg, UINT32 uiStartPoint, UINT32 uiEndPoint, char *pData)
|
||||
+void QueryOnLineTdDataToCtrl(STRemTaskArg stTaskArg, std : : vector<STTaskDetailBasicData>& vtData)
|
||||
+void InitialTaskTreeCtrl(CTreeCtrl& taskTree, int iSptType)
|
||||
+void InitOnLineTaskTreeCtrl(CTreeCtrl& taskTree, int iSptType, std : : map<CString, STRemTaskTable> mapTaskList, HWND hWnd)
|
||||
+void QueryTimerTaskValiad(std : : vector<STTimerTask>& vtTimerTask, const SYSTEMTIME &sysCurTime)
|
||||
+int GetDefaultTzID()
|
||||
+bool DeleteTimerTask(const std : : vector<int>& vtTask)
|
||||
+bool DeleteTimerTask(UINT32 uiTDID)
|
||||
+void QueryTdBrowseInfo(std : : vector<STTdBrowseInfo>& vtTdBrowseInfo, bool bIsQueryTimerTd=false)
|
||||
+void QueryTdBrowseInfo(std : : vector<STTdBrowseInfo>& vtTdBrowseInfo, int iSptType, int iType, bool bIsQueryTimerTd=false)
|
||||
+bool AddTimerTask(int iTaskID, CString strTaskName, CString strTime, CString strPlcID)
|
||||
+bool InsertPlcStatusData(const STRemPlcDataInfo* pRemPlcData)
|
||||
+bool QueryPlcStatusData(std : : vector<STPlcStatusInfo>& vtPlcStatus)
|
||||
+void DeleteOldPlcStatusData()
|
||||
+bool QueryTaskPacketAttr(int& iLoopTime, int& iInterval, CString& strPlcID)
|
||||
+bool QueryTaskPacketInfo(std : : vector<STTdBrowseInfo>& vtTdBrowseInfo)
|
||||
+bool InsertTaskPacketInfo(const std : : vector<STTdBrowseInfo>& vtTdBrowseInfo, const STTaskPacketAttr& stAttr)
|
||||
+bool CreateSigTaskByAuto(const STTdBrowseInfo& stBasicTask, CString strTime, STTdBrowseInfo& stNewTask)
|
||||
+bool CreateTaskPacket(const std : : vector<STTdBrowseInfo>& vtBasicTaskPacket, CString strSysTime, std : : vector<STTdBrowseInfo>& vtNewTaskPacket)
|
||||
+int QueryARByTdID(DWORD dwTdID)
|
||||
+void AdjustParam()
|
||||
+void SetCurrentTimeRange(time_t tStartTime, time_t tEndTime)
|
||||
+unsigned int m_uiDevID
|
||||
-CGUCodeCreator m_guCodeCreator
|
||||
-_RecordsetPtr m_pRecTdData
|
||||
-BYTE m_iTdType
|
||||
-int m_iTestType
|
||||
-WORD m_wMaxChannel
|
||||
-time_t m_tStartTime
|
||||
-time_t m_tEndTime
|
||||
}
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [TaskDataOper.h](file://h/TaskDataOper.h#L1-L448)
|
||||
|
||||
### TdRecord 分析
|
||||
`TdRecord`类负责处理测试数据的记录,包括加载原始数据、显示原始数据曲线等。它通过`LoadCEOrgData`、`Load2DOrgData`、`Load3DOrgData`等方法加载不同类型的原始数据,并通过`DisplayRawDataSplines`方法显示原始数据曲线。
|
||||
|
||||
#### 类图
|
||||
```mermaid
|
||||
classDiagram
|
||||
class CTdRecord {
|
||||
+CTdRecord(_ConnectionPtr& pConnection)
|
||||
+virtual ~CTdRecord()
|
||||
+DWORD m_dwChID
|
||||
+int m_iTsn
|
||||
+int m_iN
|
||||
+float m_fK
|
||||
+float m_fI
|
||||
+float m_fV
|
||||
+float m_fR0
|
||||
+float m_fSP
|
||||
+CString m_Datetime
|
||||
+CStringArray m_saVRawData
|
||||
+CStringArray m_saIRawData
|
||||
+_ConnectionPtr m_pConnection
|
||||
+float GetMaxAbsV()
|
||||
+virtual void DisplayRawDataSplines()
|
||||
+virtual BOOL LoadOrgData()
|
||||
+virtual float ConvertVOrgData(float fVOrgData)
|
||||
-float m_fMaxAbsV
|
||||
-BOOL LoadCEOrgData()
|
||||
-BOOL Load2DOrgData()
|
||||
-BOOL Load3DOrgData()
|
||||
}
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [TdRecord.h](file://h/TdRecord.h#L1-L47)
|
||||
|
||||
### TestingData 分析
|
||||
`TestingData`类负责处理测试数据的高级功能,包括显示测试数据列表、保存数据为不同格式的文件等。它通过`ShowConList`、`ShowConListByPage`等方法显示测试数据列表,并通过`SaveTdToExcelFile`、`SaveTdToRes2DFile`等方法保存数据为不同格式的文件。
|
||||
|
||||
#### 类图
|
||||
```mermaid
|
||||
classDiagram
|
||||
class CTestingData {
|
||||
+virtual void UpdataTopography(int f_disType, int f_start, CListCtrl &f_list)
|
||||
+BOOL ExcuteSql(CString f_sql)
|
||||
+virtual void GetTimeWindowList(CListCtrl &f_list)
|
||||
+virtual BOOL ShowTimeWindow(CListCtrl &tdConList, int iTsn)
|
||||
+void GetORGCStringToArray(CString f_SrcString, CStringArray *f_array)
|
||||
+void FreeWindowsTime()
|
||||
+double GetPeriod()
|
||||
+bool GetTimeWindowInfo(std : : vector<STSigTWInfo>& vtTWInfo)
|
||||
+void CreateWindowsTime()
|
||||
+virtual bool CalculateTimeWindows(struct _WinTimeList f_winTimeList, CStringArray *v_orgData, int f_TRwave, int f_Tcycle, int f_Sample, int f_interation, int f_industrial)
|
||||
+virtual bool CalculateTWInfo(CStringArray *v_orgData, int nFrenquence)
|
||||
+virtual BOOL DisplayIpCurveGraph()
|
||||
+CDevice* m_pDevice
|
||||
+DWORD m_dwID
|
||||
+CString m_szTdName
|
||||
+CString m_szTdCN
|
||||
+CString m_szTLocation
|
||||
+CString m_szPrCN
|
||||
+CString m_szTzName
|
||||
+CString m_szTzCN
|
||||
+DWORD m_dwTzID
|
||||
+DWORD m_dwSCID
|
||||
+CString m_szSCCN
|
||||
+CString m_szSName
|
||||
+int m_iSType
|
||||
+int m_iTType
|
||||
+int m_iTMode
|
||||
+int m_iEAmount
|
||||
+int m_iTPAmount
|
||||
+int m_iCHAmount
|
||||
+int m_iN
|
||||
+int m_iTRWave
|
||||
+int m_iTRFrequency
|
||||
+int m_iIFrequency
|
||||
+int m_iSAFrequency
|
||||
+int m_iCLayout
|
||||
+float m_fESpace
|
||||
+CString m_szEDistance
|
||||
+int m_iWeather
|
||||
+int m_iWDIR
|
||||
+float m_fTemperature
|
||||
+float m_fHeight
|
||||
+float m_fHumidity
|
||||
+float m_fTRPeriod
|
||||
+CString m_szCDate
|
||||
+CString m_szCTime
|
||||
+CString m_szTDate
|
||||
+CString m_szTTime
|
||||
+int m_iRCamount
|
||||
+int m_iRDirection
|
||||
+int m_iCRtime
|
||||
+CString m_szPM
|
||||
+CString m_szOP
|
||||
+CString m_szQA
|
||||
+virtual bool ShowGrList(CListCtrl &tdGrList)
|
||||
+virtual bool ShowConList(CListCtrl &tdConList)
|
||||
+virtual bool ShowConListByPage(CListCtrl &tdConList, int iSType = 2)
|
||||
+virtual bool ShowDetailInfo(CListCtrl &tdDetailList)
|
||||
+virtual BOOL SaveTdToExcelFile(CString f_szFileName)
|
||||
+virtual BOOL SaveTdToResCEFile(CString f_szFileName)
|
||||
+virtual BOOL SaveTdToRes2DFile(CString f_szFileName)
|
||||
+virtual BOOL SaveTdToRes3DFile(CString f_szFileName)
|
||||
+virtual BOOL SaveTdToCsvFile(CString f_szFileName)
|
||||
+virtual bool ExportIP2DDataToDat(CString strFile)
|
||||
+virtual bool ExportIP3DToDatFile(CString strFile)
|
||||
+virtual BOOL ExportIPDataToTxt(CString strFileName)
|
||||
+virtual BOOL ExportResDataToTxt(CString strFileName)
|
||||
+virtual BOOL ExportSpDataToTxt(CString strFileName)
|
||||
+virtual BOOL Export2dDataToTxtBySort(CString strFileName, int iSortMethod)
|
||||
+virtual BOOL ExportDataToUrf(CString strFileName)
|
||||
+void SetCustToCrossHole(bool bFlag)
|
||||
+virtual BOOL DisplayGraph()
|
||||
+virtual BOOL DisplayTPSplinesGraph(int iTSN)
|
||||
+virtual BOOL LoadData(CLinkList<CMedium*>& m_medLinkList)
|
||||
+inline int CalcuCrossHolePoleID(int iOrgPoleID, int iHoleID, int iHoleFlag, int iMidEamount)
|
||||
+CTestingData(DWORD dwID, _ConnectionPtr& pConnection)
|
||||
+virtual ~CTestingData()
|
||||
+CPtrList m_tdChaList
|
||||
+_WaveCount *m_waveCount
|
||||
-_ConnectionPtr m_pConnection
|
||||
-CHandleProcessor m_handleProcessor
|
||||
-double GetCycle(int f_type)
|
||||
-BOOL SaveOrgDataToDB(DWORD dwTdID)
|
||||
-BOOL SaveGRDataToDB(DWORD dwTdID)
|
||||
-bool m_bIsCustomToCrossHole
|
||||
-int GetSample(int f_nindustrial, int f_type)
|
||||
-double adc_integral(int *adc_buf, int length)
|
||||
-double adc_average(int *adc_buf, int length)
|
||||
-CString GetWaveNum(int f_waveType)
|
||||
-void TransfToDouble(double* f_buff, CStringArray f_szArray)
|
||||
-double adc_calculate(double offset, double coefficient, double adc)
|
||||
}
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [TestingData.h](file://h/TestingData.h#L1-L276)
|
||||
|
||||
**章节来源**
|
||||
- [TdManager.cpp](file://cpp/Managers/TdManager.cpp#L1-L800)
|
||||
- [TaskDataOper.cpp](file://cpp/Operator/TaskDataOper.cpp#L1-L800)
|
||||
- [TdRecord.cpp](file://cpp/ProblemZone/TdRecord.cpp#L1-L325)
|
||||
- [TestingData.cpp](file://cpp/ProblemZone/TestingData.cpp#L1-L800)
|
||||
|
||||
## 依赖分析
|
||||
TdManager模块依赖于多个其他模块和库,包括`HandleProcessor`、`LinkList`、`TestingData`、`CtrlProtocolDef`等。这些依赖关系确保了模块的完整性和功能性。
|
||||
|
||||
```mermaid
|
||||
graph TD
|
||||
TdManager --> HandleProcessor
|
||||
TdManager --> LinkList
|
||||
TdManager --> TestingData
|
||||
TdManager --> CtrlProtocolDef
|
||||
TaskDataOper --> GUCodeCreator
|
||||
TaskDataOper --> CtrlProtocolDef
|
||||
TdRecord --> TestingData
|
||||
TestingData --> Device
|
||||
TestingData --> Medium
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [TdManager.h](file://h/TdManager.h#L1-L109)
|
||||
- [TaskDataOper.h](file://h/TaskDataOper.h#L1-L448)
|
||||
- [TdRecord.h](file://h/TdRecord.h#L1-L47)
|
||||
- [TestingData.h](file://h/TestingData.h#L1-L276)
|
||||
|
||||
**章节来源**
|
||||
- [TdManager.cpp](file://cpp/Managers/TdManager.cpp#L1-L800)
|
||||
- [TaskDataOper.cpp](file://cpp/Operator/TaskDataOper.cpp#L1-L800)
|
||||
- [TdRecord.cpp](file://cpp/ProblemZone/TdRecord.cpp#L1-L325)
|
||||
- [TestingData.cpp](file://cpp/ProblemZone/TestingData.cpp#L1-L800)
|
||||
|
||||
## 性能考虑
|
||||
TdManager模块在设计时考虑了性能优化,特别是在数据处理和存储方面。通过使用高效的数据库操作和数据结构,模块能够快速处理大量测试数据。此外,模块还提供了多种数据导出格式,以满足不同用户的需求。
|
||||
|
||||
## 故障排除指南
|
||||
### 数据解析错误
|
||||
当遇到数据解析错误时,可以检查以下几点:
|
||||
- 确认数据文件的格式是否正确。
|
||||
- 检查数据文件是否损坏。
|
||||
- 确认数据文件的编码是否正确。
|
||||
|
||||
### 存储失败
|
||||
当遇到存储失败时,可以检查以下几点:
|
||||
- 确认数据库连接是否正常。
|
||||
- 检查数据库是否有足够的存储空间。
|
||||
- 确认数据库表结构是否正确。
|
||||
|
||||
**章节来源**
|
||||
- [TdManager.cpp](file://cpp/Managers/TdManager.cpp#L1-L800)
|
||||
- [TaskDataOper.cpp](file://cpp/Operator/TaskDataOper.cpp#L1-L800)
|
||||
- [TdRecord.cpp](file://cpp/ProblemZone/TdRecord.cpp#L1-L325)
|
||||
- [TestingData.cpp](file://cpp/ProblemZone/TestingData.cpp#L1-L800)
|
||||
|
||||
## 结论
|
||||
TdManager模块是GeomativeStudio软件中不可或缺的一部分,负责测试数据的采集、处理和存储。通过详细的分析,我们了解了模块的职责和实现,以及其在测试数据与项目、脚本的关联机制中的作用。模块的设计考虑了性能优化和错误处理,确保了数据的完整性和一致性。希望本文档能帮助开发者更好地理解和使用TdManager模块。
|
||||
|
||||
## 附录
|
||||
### 代码示例
|
||||
以下是一个简单的代码示例,展示如何使用`TdManager`类接收和记录测试数据:
|
||||
|
||||
```cpp
|
||||
// 创建TdManager实例
|
||||
CTdManager tdManager(connection);
|
||||
|
||||
// 从设备上载1D数据
|
||||
CString prCN = _T("Project1");
|
||||
CString tzCN = _T("Zone1");
|
||||
CString tdCN = _T("Test1");
|
||||
CString subTdCN = _T("");
|
||||
CDevice* pDev = new CDevice();
|
||||
BOOL result = tdManager.UploadCETdFromDev(prCN, tzCN, tdCN, subTdCN, pDev);
|
||||
|
||||
if (result) {
|
||||
// 数据上载成功
|
||||
AfxMessageBox(_T("数据上载成功"));
|
||||
} else {
|
||||
// 数据上载失败
|
||||
AfxMessageBox(_T("数据上载失败"));
|
||||
}
|
||||
|
||||
// 清理资源
|
||||
delete pDev;
|
||||
```
|
||||
|
||||
**章节来源**
|
||||
- [TdManager.cpp](file://cpp/Managers/TdManager.cpp#L1-L800)
|
||||
- [TaskDataOper.cpp](file://cpp/Operator/TaskDataOper.cpp#L1-L800)
|
||||
- [TdRecord.cpp](file://cpp/ProblemZone/TdRecord.cpp#L1-L325)
|
||||
- [TestingData.cpp](file://cpp/ProblemZone/TestingData.cpp#L1-L800)
|
||||
Reference in New Issue
Block a user