# MEMS_AUTO_TEST **Repository Path**: ARG1024/MEMS_AUTO_TEST ## Basic Information - **Project Name**: MEMS_AUTO_TEST - **Description**: MEMS自动化测试软件,软件规格、使用方法、软件结构等请见\document\《MEMS自动化测试软件》使用文档-V1.0-20200619-吴天.doc - **Primary Language**: C++ - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 4 - **Created**: 2025-09-14 - **Last Updated**: 2025-09-14 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ## MEMS_AUTO_TEST MEMS自动测试软件版本库 2020年2月22日:初始版本为2020年1月4日前的自动测试软件的版本,目前已知的信息: 操作系统:windows7/windows10 编程语言:C++ 框架:Qt 开发平台:VS2019 文件夹用途: ./code/ 源代码 ./communicationProtocol/ 下位机通讯协议 ./document/ 相关文档 ./exe/ 应用程序 二次开发注意事项: 1、需要掌握C++编程技术。 2、需要掌握Qt框架的使用方法。 3、推荐使用VS+Qt框架插件的方式开发,如果开发环境不一致,请拷贝*.h(C++头文件)、*.cpp(C++源文件)、*.ui(QtUI界面文件)到开发环境下,其余文件大多是vs文件不用复制。 2019年12月3日: 首次上传,目前已实现功能: 1、远程控制转台,理论上可以控制所有遵守转台通讯协议的系统。 2、打开数据监听,自动保存采集的数据,数据需要遵守车规级IMU通信协议。 3、脚本自动化控制转台与数据采集(目前刚从定时模式转化为反应模式,还未测试)。 4、脚本自定义对话框可以打开(但无任何功能实现,暂时禁止使用)。 2019年12月3日: 将指令队列扩展为适应多循环的二维结构QVector> 将参数队列从固定的三个参数提升为参数队列,同时与指令队列的改变相对应参数队列需要扩展为三维结构QVector>> 用于记录当前指令、下一指令、当前循环等也扩展为一维结构QVector 对指令执行函数做出对应的重构,以适应队列和状态位的变化 2019年12月10日: 添加了自定义脚本模块,将不必要的.cpp文件中的内容添加到对应的.h文件中,将脚本参数队列与命令队列合并,对整体代码做了优化,包括命名规范和代码逻辑等,但还需要继续优化,尚未测试 2019年12月11日: 对2019年12月10日更新中新添加的模块和功能进行了测试,在修复了部分BUG后,新模块和功能通过了测试。 2019年12月17日 1、新添加温箱控制模块(未测试) 2、新添加主页面脚本预览 3、重构了自定义脚本模块 4、对脚本运行中的BUG进行了修复 5、对自定义脚本对话框做出了优化 6、对数据采集做出了优化 7、对主界面消息框做出了优化 8、打开新对话框部分,由固定对象更改为动态对象 2019年12月26日 1、添加了单温度处理和多温度处理功能 2、添加了自定义保存路径的功能 3、对数据采集控制逻辑做了优化 4、添加了多组数据情况下的文件保存和数据处理功能,纠正了原有对多组数据处理不正确的问题 5、对数据采集到数据保存的整体结构做了优化 2020年3月16日 **当前版本不可运行,禁止用于测试环节。** 改动分为总体上的改动和各模块的改动,总体上的改动代表每个模块改动中总体上相似的部分,各模块的改动代表各模块特定的改动。 总体上的改动有: 1、为各模块的成员变量添加了geter()、getPointer()和seter()函数。getPointer()主要是为了脚本管理器的状态监视功能而添加,作用是返回目标成员的引用。 2、将大部分槽函数转变为普通函数,规范了函数名。删除了大部分无用函数,剩余无用函数暂时没有发现,在以后的更新中再逐渐优化。提高了代码可读性。 3、各模块的信号槽连接工作将由各模块自己负责,不再由对象管理器负责。 4、不应使用信号槽的地方改为正常函数调用,根据不同模块的依赖关系使用反向注入来注入对象引用。 5、将枚举类统一到每个状态位所属的类中,并添加对应名称方便使用枚举类型。所有枚举类状态位将类型从int改为对应的枚举类型,可以在编译时进行类型检查避免错误状态。 6、将if-else模式更改为switch-case模式,将QTimerEvent计时模式更改为QTimer计时模式。 7、将各个模块的状态位按照职能划分到各个模块。 以上改动在介绍各模块的改动时不再重复。 各模块的改动: 1、数据读取器编码解码器(DataReaderCodec): 1.1、建立数据缓冲区(QByteArray dataBuffer),用于存储未处理的QByteArray类型数据。 1.2、添加数据包大小设置位(int dataPackageSize),该值决定每次处理的数据量。 1.3、在解码逻辑上添加了纠错功能,在数据包出错时能正确找到下一数据包的头部。 2、转台编码解码器(TurnTableCodec): 2.1、做出了与1.1、1.2、1.3中大致相似的改动。 2.2、将发送转台出错信号的形式从每种错误对应一种信号更改为一个带参数的信号,使用不同的参数区分不同的错误。 2.3、对于转台位置模式和速率模式添加了参数限制,不符合限制的命令不会被发送到转台。 3、数据文件管理器(DataFileManager): 3.1、将QVector类型(类似数组列表)更改为QHash类型(类似散列键值对),更符合程序逻辑。 4、数据读取器(DataReader): 4.1、与3.1中的改动类似。 5、对象管理器(ObjectManager): 5.1、移除模块间信号槽连接的代码逻辑。 5.2、添加对象注入的代码逻辑。 5.3、将数据读取器编码解码器(DataReaderCodec)、转台编码解码器(TurnTableCodec)、数据读取器(DataReader)、脚本管理器(ScriptManager)从子线程中移动到主线程,目前子线程中只剩下具有IO工作的对象。 6、脚本管理器(ScriptManager): 6.1、添加了模板类以便在状态判断时使用泛型,但Qt的宏命令不支持模板类,需要进一步更改。 7、串口管理器(SerialPortManager): 7.1、移除了按照数据包大小状态位分割数据包并发送的逻辑。 7.2、移除了丢弃参数指定的数据包长度的函数。 7.3、将串口设置函数从每个设置位对应一个函数的形式更改为带参数的函数。 新增的类: 1、转台状态管理器(TurnTableStateManager): 该类是新添加的类,作用是管理转台的大部分运行状态,为其他模块提供转台状态记录和查询功能。不在此类中的状态位被按照不同的职能划分到不同的模块中了。该类主要包含若干枚举类、状态位、计时器、geter函数、seter函数。 2、MEMS自动测试软件主界面(MemsAutoTestSoftware): 新的软件主界面,将旧界面的普通按钮全部替换为菜单按钮。目前还未添加新的功能,但新界面的界面布局相比于旧界面更为紧凑,为未来新功能留下了空间。 3、设置转台和温箱界面(SetTurnTableAndThermostatDialog): 新的转台设置界面,因为转台和温箱在实际逻辑上的紧密性,所以该类整合了转台和温箱的设置功能,包括串口、负载、运行、温度等。 2020年3月24日 **当前版本不可运行,禁止用于测试环节。** 1、将转台状态管理器分(TurnTableStateManager)为转台连接状态管理器(TurnTableConnectionStateManager)和转台运行状态管理器(TurnTableRunningStateManager),转台连接状态管理器负责管理转台和温箱的连接状态,以及管理各个转台状态查询用的计时器。和转台运行状态管理器则负责原有类功能中剩余的状态存取记录功能。 2、新加入参数控制台(ParameterConsole)UI界面,用于提供更改软件内部参数的用户接口。目前可更改的参数有:数据读取器的数据保存精度、数据保存间隔,脚本管理器的脚本运行间隔,转台编码解码器的指令发送间隔、转台位置上限、转台位置下限、转台速率上限、转台速率下限、转台加速度上限、转台加速度下限,转台连接管理器的转台超时时间、转台当前状态检查间隔、转台运行状态检查间隔、温箱当前温度检查间隔,主界面的数据显示精度。 3、新加入配置文件管理器(ConfigFileManager),用于保存参数控制台中修改的参数到配置文件中以及加载配置文件中的参数到各个参数所在类。该配置文件管理器使用QT的是json文件类,而不是脚本管理器中的xml文件类。 2020年3月30日 **当前版本不可运行,禁止用于测试环节。** 1、将脚本文件格式从xml格式转变为json格式。 2、新增脚本文件管理器(ScriptFileManager),将脚本文件的加载和保存功能从脚本管理器移动到脚本文件管理器,但接口还是使用原来的接口。 3、新增转台连接器(TurnTableConnecter),将主界面中的连接转台的复杂逻辑移动到转台连接器中。 4、删除主界面中的一些无用代码和复杂逻辑代码,主界面功能更加偏向交互接口而不是逻辑处理。 2020年4月7日 **当前版本不可运行,禁止用于测试环节。** 1、添加日志管理器的日志类型,目前有debug、information、warning、critical四种类型。可以分别通过enable()和disable()函数独立开关对应的日志记录,并有对应的信号发送要记录的日志内容,其他模块可以通过监听该信号来获取当前日志信息。 2、添加脚本管理器的每个脚本指令对应的类,它们都继承自ScriptInstruction类,在使用时调用run函数即可运行,不必判断指令编号。 3、优化了部分代码。 2020年4月29日 **当前版本不可运行,禁止用于测试环节。** 1、由于C++编译机制的问题,将全部代码重新更改为头文件加源文件的形式。 2、规范了代码风格,见/document/头文件与源文件代码规范.codc 3、对脚本管理器的自动监视状态函数从输入标志位指针改为输入标志位的getter()函数入口,避免标志位指针直接暴露。 4、将脚本管理器头文件中的自动监视状态类StateChecker独立出来为StateChecker.h和StateChecker.cpp。 5、优化了各个头文件的引用关系。 6、增加脚本指令工厂类(ScriptInstructionFactory),方便脚本在UI层文本显示格式、脚本管理器运行格式和脚本文件存储格式之间的相互转换。 7、实装了之间脚本指令类的包装,目前脚本运行存储类型从QVector>>更改为QVector>。 2020年5月6日 **当前版本不可运行,禁止用于测试环节。** 1、将IO层的LogFileManager、DataFileManager、ScriptFileManager、ConfigFileManager类中的读写文件功能剥离出来集中到IO层的新建类FileReader和FileWriter中。 2、将IO层的LogFileManager、DataFileManager、ScriptFileManager、ConfigFileManager类的名字更改为LogSaver、DataSaver、ScriptSaveLoader、ConfigSaveLoader,并将这四个类转移到功能层。 3、IO层的新建类FileReader和FileWriter能够从线程池中自动申请子线程,不需要在ObjectManager中手动移动到子线程,只需要创建QThreadPool即可。 4、LogSaver类中的四个日志等级的信号重构为一个函数void signal_log(QString msg, LogFlag logFlag),槽函数也重构为一个函数void slot_log(QString msg, LogFlag logFlag)。 2020年5月12日 **当前版本不可运行,禁止用于测试环节。** 1、将各个模块中的日志信号更改为与日志模块槽函数匹配的类型。 2、在各个指令类中添加getDataForSaving函数,用于提取脚本用于文件保存的数据类型,方便脚本格式工厂类的格式转换。 3、在脚本格式工厂类中新添加从脚本运行格式到显示格式和存储格式转换的转换函数scriptToFloat和scriptToQString。 4、标准化了部分类中成员的命名。 2020年5月19日 **当前版本不可运行,禁止用于测试环节。** 1、同过友元类的方式使FileDataUser中的槽函数slot_receiveFileData(QString filePath,QByteArray data)的访问权限在更改为private的情况下仍可以正常工作做,避免对该函数在实现类中的误调用。 2、将显示脚本内容的UI组件ScriptList_TreeWidget从自身负责脚本格式转换更改为使用脚本格式工厂进行格式转换,并在算法上做了优化。 2020年5月27日 **当前版本不可运行,禁止用于测试环节。** 1、将脚本格式工厂中的中间格式从QVector>更改为QVector>>。 2、脚本格式工厂去除了QVector>有关的格式转函数,现在脚本将会被直接转换为QVector,使用时直接调用QTreeWidget::addTopLevelItems即可,获得代表循环的 QVector使用 ScriptInstructionFactory::getParentTreeWidgetItemList即可。 3、将ScriptList_TreeWidget按照功能拆分为TreeWidget_DisplayScriptList和TreeWidget_EditScriptList,分别用于主界面脚本进度显示和脚本编写界面脚本预览。 4、将TurnTableConnectionStateManager和TurnTableRunningStateManager中的枚举类进行了整合,并集中到TurnTableCodec。 5、将TurnTableCodec中的用于转台通信的信号槽进行了整合,发送指令的槽函数整合为slot_sendInstruction,错误反馈整合为signal_turnTableError,指令回显整合为signal_instructionEcho,状态更新函数整合为signal_turnTableConnectionState、signal_turnTableCurrentState、signal_turnTableSearchZeroState、signal_turnTableTargetPositionState、signal_turnTableTargetRateState、signal_turnTableTargetStop、signal_turnTableIsPowerState、signal_turnTableCircuitState、signal_turnTableAmplifierState、signal_turnTableRunningState、signal_turnTableRunningMode、signal_currentThermostatTemperature,分别用于更新转台连接状态、转台当前状态、转台寻零状态、转台目标位置状态、转台目标速率状态、转台目标停止状态、转台电源状态、转台电路状态、转台功放状态、转台运行状态、转台运行模式、温箱当前温度。 6、优化了脚本运行逻辑,将检查脚本是否可运行中添加了对空循环的检查逻辑,并将原有的两个检查函数之间的循环调用更改为主要检查函数的递归调用。 7、校准了部分命名,对部分代码进行了小方面的修补。 2020年6月7日 **当前版本不可运行,禁止用于测试环节。** 1、添加UI界面ParameterConsole,用于设置软件运行所需要的相关参数,包括MEMS数据显示精度、MEMS数据保存精度、MEMS数据采集间隔、脚本转台操作超时时间、转台位置上限(绝对值)、转台位置下限(绝对值)、转台速率上限(绝对值)、转台速率下限(绝对值)、转台加速度上限和转台加速度下限。新设置的参数必须重新启动软件才能起效。 2、添加工具类DataLimit,用于ParameterConsole和读取配置文件时的数据合法化,避免超限数据被设置入软件。 3、将FileReader、FileWriter和LogSaver中对外开放的函数更改为静态函数,不需要具体对象即可使用文件读取保存以及记录日志消息的功能。 4、重新实装了日志功能,现在日志消息将会被记录在根目录下MemsAutoTestSoftware_Log.log中,配置文件名更改为MemsAutoTestSoftware.conf。 5、对软件部分内容进行了优化。 6、目前全部信号槽的连接工作和对象的注入工作等运行前准备已全部完成,并在电脑上的开发环境中进行了基础试运行和debug,目前暂无发现的bug,下一步需要实际生产环境进行全面测试。 2020年6月7日 1、在生产环境下的软件测试已基本完成,测试过程遇到的BUG已基本解决,目前版本可以正常使用。但若发现新的BUG,则需要在配置文件中打开Debug级日志进行程序逻辑检查。 2、写文件模块的效率无法满足日志模块的需求,目前采用减少日志消息的方式暂时解决了该问题,但日后还是应该采用其他更优的方法来修复该问题,如建立写入缓冲区等。 3、目前的MEMS数据预处理模块的滤波算法已经能够避免计算时的数据溢出,前提是单个MEMS数据本身的数值不能超过float的范围。 4、配置文件中新添加日志等级选项,详情参考软件使用文档。 5、主界面新添加转台状态曲线,但还未经过生产环境测试。 6、完成部分UI界面的组件化,可以进行复用。 7、已编译完成的可执行文件已经添加到该版本库exe文件夹下。 2020年12月7日 1、将原有VS2019平台的代码从/code/下移动到/code/VS2019/下。 2、添加QtCreator4.11.1平台代码到/code/QtCreator4.11.1+MSVC201764bit/下。 2021年7月26日 1、对code/VS2019文件夹下的代码进行了大幅度的更新,并将更新后的代码存放于code/VS2015中,主要更新部分有: 1.1、更新ObjectManager类: 1.1.1、以QHash的形式管理创建的对象; 1.1.2、支持对象自动注入功能; 1.1.3、将对象创建、对象注入、对象初始化阶段分开管理。 1.2、重写IO层逻辑,去掉多余的多线程逻辑,简化代码: 1.2.1、串口通信更改为单线程读写(原为多线程读写); 1.2.2、文件读取更改为单线程读取(原为多线程读取); 1.2.3、文件写入添加单线程写入功能; 1.2.4、文件多线程写入功能由基于QSemaphore的高效队列保证线程安全(原由QMutex保证)。 1.3、更新LogSaver类: 1.3.1、使用静态函数获得LogSaver类对象指针(原为由ObjectManager注入); 1.3.2、修改日志记录接口,提高使用体验。 1.4、添加配置文件功能(基于宏定义); 1.5、更改源代码文件存放路径,更改头文件路径(目前头文件路径是从项目根目录开始的相对路径); 1.6、添加基于QSemaphore的DataQueue类,用于高效且线程安全的队列读写操作; 1.7、删除了不必要的日志记录; 1.8、TurnTableCodec类现在使用函数地址映射来解析转台指令(原由switch-case模式解析)。 2、该版本只经过简单代码走读,未在工作环境下进行系统测试。