Files
coco df489d5640 a
2026-07-03 16:05:30 +08:00

130 lines
9.2 KiB
Markdown

# 核心功能
<cite>
**本文档引用的文件**
- [DevManager.cpp](file://cpp/Managers/DevManager.cpp)
- [DevManager.h](file://h/DevManager.h)
- [ProManager.cpp](file://cpp/Managers/ProManager.cpp)
- [ProManager.h](file://h/ProManager.h)
- [SptManager.cpp](file://cpp/Managers/SptManager.cpp)
- [SptManager.h](file://h/SptManager.h)
- [TdManager.cpp](file://cpp/Managers/TdManager.cpp)
- [TdManager.h](file://h/TdManager.h)
- [IOManager.cpp](file://cpp/Managers/IOManager.cpp)
- [IOManager.h](file://h/IOManager.h)
- [Device.cpp](file://cpp/ProblemZone/Device.cpp)
- [Project.cpp](file://cpp/ProblemZone/Project.cpp)
- [Scriptor3D.cpp](file://cpp/ProblemZone/Scriptor3D.cpp)
- [scriptor.c](file://cpp/Tools/scriptor.c)
- [TestingData.cpp](file://cpp/ProblemZone/TestingData.cpp)
- [DataOperator.cpp](file://cpp/Operator/DataOperator.cpp)
</cite>
## 目录
1. [设备管理器 (DevManager)](#设备管理器-devmanager)
2. [项目管理器 (ProManager)](#项目管理器-promanager)
3. [脚本管理器 (SptManager)](#脚本管理器-sptmanager)
4. [测试数据管理器 (TdManager)](#测试数据管理器-tdmanager)
5. [IO管理器 (IOManager)](#io管理器-iomanager)
## 设备管理器 (DevManager)
设备管理器(DevManager)是系统与物理设备交互的核心组件,负责设备的连接、状态监控和固件升级。它通过`CDevice`类的实例来管理每个设备,并使用链表`m_devLinkList`在内存中维护所有设备对象。
设备管理器通过`InitialDevLinkList()`方法从数据库初始化设备列表。该方法查询`device`表,为每个设备创建`CDevice`对象,并将其添加到链表中。设备的唯一标识符是其序列号(SN),并使用`m_handleProcessor`生成唯一的句柄(Handle)进行内存管理。
当设备通过串口或网络连接到计算机时,系统会检测到新设备。设备管理器通过`GetRegisterDevice()`方法在内存链表中查找具有匹配序列号的设备。如果找到,则建立连接;如果未找到,则调用`AddOfflineObjInMem()`创建一个离线设备对象。设备的在线状态由`m_uState`属性表示,其值可以是`PZ_STATE_OFFLINE``PZ_STATE_ONLINE``PZ_STATE_NEW`
对于固件升级,设备管理器本身不直接执行升级操作,而是作为协调者。当用户请求升级时,系统会通过`CDevice`对象与设备通信,发送升级命令和固件文件。设备管理器通过`UpdateDevInfo()`方法接收来自设备的更新信息(如硬件版本HWV、软件版本SWV、电池电压等),并将其同步到数据库中,确保本地信息与设备状态一致。
**Section sources**
- [DevManager.cpp](file://cpp/Managers/DevManager.cpp#L1-L661)
- [DevManager.h](file://h/DevManager.h#L1-L69)
- [Device.cpp](file://cpp/ProblemZone/Device.cpp#L90-L2662)
## 项目管理器 (ProManager)
项目管理器(ProManager)负责管理项目的整个生命周期,包括创建、配置测区和与设备同步。它使用`CLinkList<CDataMngStruct*>`链表`m_dmsLinkList`来管理项目(Project)和测区(TestingZone)对象。
项目管理器通过`CreateProjectInDB()`方法在数据库中创建新项目。该方法首先显示一个对话框(`COpCreateProjectDlg`)供用户输入项目信息(如项目名称、描述、位置等)。为确保项目名称的唯一性,它会查询数据库进行检查。创建成功后,系统会自动调用`InsertDefaultTzToProject()`为该项目创建一个默认测区。
项目与设备的同步是通过文件传输实现的。`CreateProjectInDev()`方法负责将项目从数据库同步到设备。它首先查询数据库获取项目信息,然后使用`CMarkup`类生成一个名为`project.xml`的XML配置文件。此文件被写入本地缓存目录(`CACHE\projects\<ProjectCN>\`),最后通过`CDevice::SendFile()`方法将文件传输到设备的SD卡指定路径(`/SD/projects/<ProjectCN>/`)。
测区的管理与项目类似。`CreateTzInDev()`方法创建测区配置文件`testzone.xml`,并将其同步到设备。该文件包含了测区的类型、位置、描述等元数据。当用户在设备上完成测量后,可以通过`LoadProjectFromDev()``LoadTzFromDev()`方法将数据从设备上载回计算机,实现数据的双向同步。
**Section sources**
- [ProManager.cpp](file://cpp/Managers/ProManager.cpp#L1-L800)
- [ProManager.h](file://h/ProManager.h#L1-L77)
- [Project.cpp](file://cpp/ProblemZone/Project.cpp#L1-L36)
## 脚本管理器 (SptManager)
脚本管理器(SptManager)负责生成2D/3D测量脚本。它通过`CLinkList<CScript*>`链表`m_sptLinkList`管理脚本对象,并利用`m_medLinkList`管理各种测量装置(Medium)。
脚本的创建过程始于用户选择测量类型(如温纳、施伦贝谢等)。`Create2DSConInDB()`方法处理2D脚本的创建。它首先显示一个对话框(`COpCreateSptDlg`)供用户配置参数。脚本的核心是测点(Test Point)的生成,这由底层的`scriptor`库完成。`scriptor.c`文件中的`scr_generate()`函数根据用户定义的装置类型和区域边界,计算出所有电极的排列组合(A, B, M, N)和对应的几何因子(K)。
对于3D脚本,系统使用`Scriptor3D`类。该类封装了`scriptor`库的3D功能,通过`SetRect()`定义测量区域,并通过`generate()`方法生成脚本。生成的脚本数据被持久化到数据库的`scon``channel``script2d`表中。
脚本管理器还负责脚本的导出和导入。`PutScriptToDev()`方法将数据库中的脚本转换为设备可识别的格式(如`.scr`文件),并通过`CDevice::SendFile()`传输到设备。`LoadScriptFromDev()`则执行相反的操作,将设备上的脚本文件解析并导入到数据库中。
```mermaid
flowchart TD
A[用户选择测量类型] --> B[显示配置对话框]
B --> C[调用底层scriptor库]
C --> D[生成测点序列]
D --> E[保存到数据库]
E --> F[生成.scr文件]
F --> G[传输到设备]
```
**Diagram sources **
- [SptManager.cpp](file://cpp/Managers/SptManager.cpp#L1-L800)
- [SptManager.h](file://h/SptManager.h#L1-L88)
- [Scriptor3D.cpp](file://cpp/ProblemZone/Scriptor3D.cpp#L1-L69)
- [scriptor.c](file://cpp/Tools/scriptor.c#L1-L70)
**Section sources**
- [SptManager.cpp](file://cpp/Managers/SptManager.cpp#L1-L800)
- [SptManager.h](file://h/SptManager.h#L1-L88)
## 测试数据管理器 (TdManager)
测试数据管理器(TdManager)负责处理测量数据的采集和存储。它使用`CLinkList<CTestingData*>`链表`m_tdLinkList`来管理所有测试数据对象。
数据采集流程始于用户在设备上启动测量任务。任务完成后,用户通过`Upload2DTdFromDev()`等方法将数据从设备上载到计算机。此过程首先调用`ImportTdHeadToDB()`将任务的元数据(如任务名称、设备序列号、测量参数等)从`*.xml`文件导入数据库的`td`表,创建一个新的测试数据记录。
随后,`Import2DTdOrgToDB()``Import2DTdConToDB()`方法分别处理原始数据(`*.org`文件)和计算结果数据(`*.dat`文件)的导入。原始数据包含未经处理的电压、电流读数,而计算结果数据包含已计算出的电阻率(Ro)、视极化率(SP)等。这些数据被解析并存入`rspcon``ipspcon`等专用数据表中。
数据的展示通过`ShowTdListByTz()`等方法实现。这些方法查询数据库,将数据填充到列表控件(`CListCtrl`)中,供用户查看。此外,`Convert2DTo3D()`方法提供了一个高级功能,允许用户将多个2D剖面数据合并转换为3D数据集,以便进行三维可视化分析。
**Section sources**
- [TdManager.cpp](file://cpp/Managers/TdManager.cpp#L1-L800)
- [TdManager.h](file://h/TdManager.h#L1-L109)
- [TestingData.cpp](file://cpp/ProblemZone/TestingData.cpp#L228-L290)
## IO管理器 (IOManager)
IO管理器(IOManager)实现了数据的导入和导出功能,主要用于与其他系统或用户进行数据交换。其核心功能是`Export()``Import()`方法。
`Export()`方法允许用户将项目、测区、脚本和测试数据导出为一个独立的`.accdb`(Access数据库)文件。该过程首先通过`CreateExpDatabase()`创建一个新的空数据库,并使用`ADOX`库定义其表结构(如`project``tz``td`等)。然后,`ExportDataToAccdbFile()`遍历一个树形控件(`CTreeCtrl`),根据用户的选择,将数据从主数据库复制到新创建的`.accdb`文件中。
`Import()`方法执行相反的操作。它首先验证用户选择的`.accdb`文件是否为有效的导出文件(通过检查`dbversion`表)。验证通过后,`ImportProjectToDB()``ImportTzToDB()`等方法会将文件中的数据逐项导入到主数据库中。这个过程确保了数据的完整性和一致性,支持跨设备或跨版本的数据迁移。
```mermaid
flowchart LR
A[用户选择导出] --> B[创建空.accdb文件]
B --> C[定义表结构]
C --> D[从主数据库复制数据]
D --> E[生成最终文件]
E --> F[用户选择导入]
F --> G[验证文件]
G --> H[将数据导入主数据库]
```
**Diagram sources **
- [IOManager.cpp](file://cpp/Managers/IOManager.cpp#L800-L1200)
- [IOManager.h](file://h/IOManager.h#L1-L52)
**Section sources**
- [IOManager.cpp](file://cpp/Managers/IOManager.cpp#L1-L2064)
- [IOManager.h](file://h/IOManager.h#L1-L52)