9.2 KiB
核心功能
**本文档引用的文件** - [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)目录
设备管理器 (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
项目管理器 (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
脚本管理器 (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()则执行相反的操作,将设备上的脚本文件解析并导入到数据库中。
flowchart TD
A[用户选择测量类型] --> B[显示配置对话框]
B --> C[调用底层scriptor库]
C --> D[生成测点序列]
D --> E[保存到数据库]
E --> F[生成.scr文件]
F --> G[传输到设备]
**Diagram sources **
Section sources
测试数据管理器 (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
IO管理器 (IOManager)
IO管理器(IOManager)实现了数据的导入和导出功能,主要用于与其他系统或用户进行数据交换。其核心功能是Export()和Import()方法。
Export()方法允许用户将项目、测区、脚本和测试数据导出为一个独立的.accdb(Access数据库)文件。该过程首先通过CreateExpDatabase()创建一个新的空数据库,并使用ADOX库定义其表结构(如project、tz、td等)。然后,ExportDataToAccdbFile()遍历一个树形控件(CTreeCtrl),根据用户的选择,将数据从主数据库复制到新创建的.accdb文件中。
Import()方法执行相反的操作。它首先验证用户选择的.accdb文件是否为有效的导出文件(通过检查dbversion表)。验证通过后,ImportProjectToDB()、ImportTzToDB()等方法会将文件中的数据逐项导入到主数据库中。这个过程确保了数据的完整性和一致性,支持跨设备或跨版本的数据迁移。
flowchart LR
A[用户选择导出] --> B[创建空.accdb文件]
B --> C[定义表结构]
C --> D[从主数据库复制数据]
D --> E[生成最终文件]
E --> F[用户选择导入]
F --> G[验证文件]
G --> H[将数据导入主数据库]
**Diagram sources **
Section sources