### 一、程序功能

自动化测试数据处理工具，减少人工处理时长，提高测试数据处理的效率和准确度：

1. 制动数据，单轴数据处理 3min 以内
2. 电机电流数据，全部轴数据处理 1min 以内
3. ISO 激光数据整理，1min 以内
4. wavelogger 波形处理，几乎不花费时间

---

### 二、使用方法

点击可执行程序 AIO.exe，然后选择功能，根据提示填写必要参数，红色标签提示是必填项，蓝色标签提示是可选项，然后点击运行即可

> 需要注意的是，可选项填写的不合适，有可能导致数据错误，或者无法运行！！

---

### 三、第三方库

```text
参考 requirements.txt
```

---

### 四、打包方法

```
pyinstaller.exe -F --version-file file_version_info.txt -i .\icon.ico .\aio.py -p .\brake.py -p .\current.py
pyinstaller --noconfirm --onedir --windowed --add-data "C:/Users/Administrator/AppData/Local/Programs/Python/Python312/Lib/site-packages/customtkinter;customtkinter/" --version-file ..\assets\file_version_info.txt -i ..\assets\icon.ico ..\code\aio.py -p ..\code\data_process\brake.py -p ..\code\data_process\iso.py -p ..\code\data_process\current.py -p ..\code\data_process\wavelogger.py
```

---

### 五、注意事项

#### 1) 制动数据

```text
1. 数据文件存储存储规则
数据文件，就是我们拍急停的时候，采集到的 .data 文件，根据规则选择某个方向拍三次急停，会采集到三个 .data 文件，存储在同一个文件夹内，即每组（三个 .data 文件）文件必须存储在同一个文件夹内，数据文件的命名无要求
	
2. 文件夹命名规则
对采集到的 .data 文件没有命名要求，但是对于其存储的文件夹的命名是有要求的，必须是如下格式：
	reachXX_loadXX_speedXX
	XX代表不同条件下的测试数值，比如：
	reach100_load66_speed33，指的是，臂展100%，负载66%，速度33%

3. 结果文件命名规则
所谓结果文件，就是处理数据的那个 excle 文件，该文件名字的前缀必须是 reachXX_XXXXXXXXX.xlsx，比如：
	reach33_自研_制动性能测试.xlsx
	reach66_自研_制动性能测试.xlsx
	reach100_自研_制动性能测试.xlsx
	
！！结果文件可以是没有数据的，也可以是之前有数据的，只要保证输入参数的正确性即可
	
4. 数据存储的组织结
	..../j1/reach100_load66_speed33
	..../j1/reach100_load66_speed66
	....
	..../j1/reach100_load33_speed33
	..../j1/reach100_load100_speed33/2024_05_16_09_18_52.data
	..../j1/reach100_load100_speed33/2024_05_16_09_19_52.data
	..../j1/reach100_load100_speed33/2024_05_16_09_20_52.data
	..../j1/reach33_自研_制动性能测试.xlsx
	..../j1/reach66_自研_制动性能测试.xlsx
	..../j1/reach100_自研_制动性能测试.xlsx
	
5. 文件的打开与关闭
	a. 在执行程序之前，需要关闭所有相关 excle 文件
	b. 在执行程序之中，不允许打开相关 excle 文件
	c. 在执行程序之后，需要逐个打开结果文件，并保存一次
	
6. 数据准确性检查
执行完程序之后，可以在日志输出框中看到全部文件的处理过程，对于有问题的文件，会用特殊颜色进行标识，需要注意观察

7. 其他
程序运行主要的耗时集中在打开，保存和关闭结果文件，第一次打开的时候会比较慢，另外还需要注意采集的数据长度和结果文件中预设的数据长度是否一致，若采集的数据长度大于预设的数据长度，则需要补齐数据
```

#### 2) 电机电流

1. 单独使用 max/avg 功能时，要求文件命名以 "jx_" 开头，例如 j1_2024_06_18_09_09_11.data，只允许有 .data 或者 .csv 文件，可同时处理所有轴的数据
2. cycle 功能支持处理单轴数据以及场景电机电流的数据，可以批量处理所有轴，但要确保遵守如下规则：
 - 包含电机电流结果汇总文件（excel）
 - 单轴文件：jx_xxxxx.data/csv
 - 保持电流：jx_hold_xxxx.data/csv
 - 场景文件：factory_53.8_2024_06_18_09_01_26.data（需手动拆分）
 - 所有文件放在同一个文件夹即可
 - 界面输入rc参数时，需要输入所有轴的数据，即使只处理个别轴的数据

> 程序运行主要的耗时集中在打开，保存和关闭结果文件
> 需要注意采集的数据长度和结果文件中预设的数据长度是否一致，若采集的数据长度大于预设的数据长度，则需要补齐数据
> 和制动数据统一，后续将仅支持对hw_joint_vel_feedback的解析和处理，不再支持device_servo_vel_feedback

#### 3) iso 数据

所有文件放在同一个文件夹即可，命名规则如下：
	a. ISO.pdf
	b. ISO-V1000.pdf
	c. ISO-V100.pdf
	d. iso-results.xlsx

> 目前仅能处理 6 轴数据

#### 4) wavelogger 波形数据

1. 需要提前将 .xdt 波形数据转换成 .csv 文件
2. 组织目录下只允许有 .csv 文件，对文件夹无要求
3. 运行结束后，会生成 result.xlsx 文件，结果按照 .csv 文件名存放
4. 采集数据时，不同轮次数据时间间隔最好大于 2 倍的周期时间，否则会出现采集的轮数不正确的情况，但数据是完整的
	
#### 其他
customtkinter的tabview组件不支持修改字体大小，可以参考 [Changing Font of a Tabview](https://github.com/TomSchimansky/CustomTkinter/issues/2296) 进行手动修改源码实现：
	a. 运行 `pip show customtkinter`，获取到库的路径
	b. 修改.../windows/widgets/ctk_tabview.py
	c. 增加 from .font.ctk_font import CTkFont
	d. 在大概 78 行的位置，增加 font=CTkFont(family="Consolas", size=18, weight='bold')

---

RELEASE CHANGES


已知问题：
1. office套件下运行好像有问题，WPS无问题，集中在just_open函数的实现上

v0.0.1(2024/05/18)
Draft

v0.0.2(2024/05/20)
1. 功能模块化，为后面其他功能奠定一个基本的框架
2. 使用了多线程提高效率
3. 优化了准备工作中的细节
4. 运行初始化时自动删除 raw_data_dir 中的 .xlsx 文件
5. 优化了输出格式
6. 使用 pyinstaller 库进行代码冻结并调试成功

v0.0.3(2024/05/21)
1. just_open函数打开失败的信息中，添加文件名
2. 删除global变量，函数全部通过传参实现
3. configuration.xlsx配置文件增加AXIS常量，表示那个轴，取值为 j1/j2/j3/j4/j5/j6/j7
4. [bugfix] 增加get_threshold_step函数，用来获取在计算row_start时合适的阈值和步长，主要是解决了二轴最差工况下，最大速度是个尖端的问题：
	a. load100_speed100_reachxxx 二轴 threshold = 50 step = 20
	b. 其他 threshold = 50 step = 100
	如上是一个比较保守的设定，因为设定的step比较小，找到点之后要往后延200最好
5. 在find_row_start_dp函数中新增一个参数data_file，方便后续调试

v0.0.4(2024/05/22)
1. 重新标定了get_threshold_step函数，让处理更加准确
2. 新定义了now_doing_msg函数，实时输出处理信息
3. 修改了find_row_start和find_row_start_dp函数，增加的部分相同，处理数据的时候，先判断是否是空值，或者是0，此时可以加快步进
4. 修改了just_open函数，不在做重试

v0.0.5(2024/05/23)
1. 完善了函数注释
2. 调整了阈值和步长
3. 删除了just_open函数，以及对应的win32com库（Thank GOD!终于可以不用这个库了）
4. 重写了获取开始点位的代码，直接使用speed来判断，而不用角度，所以find_row_start_dp以及copy_data_to_excel_file函数也被一并删除
5. 修改了配置文件configs.xlsx的初始参数顺序及结构，使程序通用性更强
6. 将initialazation中的预定义变量赋值调整到try...except...之外，更方便排查问题
7. 修改结束时间的格式，精确到秒

v0.0.6(2024/05/23)
1. 为了调整多功能框架，aio.py文件将会作为入口程序存在，不实现具体功能，功能的实现将由具体的功能脚本实现，aio.py只负责条件调用
2. 新增了自动化处理电流数据（电机/过载）的功能

v0.1.0(2024/05/29)
1. 修改为customtkinter图形化界面
2. 支持工业机器人制动数据处理（理论上支持，测试数据有问题，待验证）
3. 删除configs.xlsx配置表格，直接在界面配置，新增layout.xlsx文件，存储customtkinter布局
4. 电流尚未支持

v0.1.1(2024/05/30)
1. 增加版本检测功能
2. 修改了无效数据下的动作
3. textbox只在开始和结束时改变状态，而不是每次写入都更改
4. 调整了brake的结构
5. 重新在write2textbox中添加exitcode参数，并补齐相关逻辑和修改brake中的调用方式
6. 修复参数检查无效的情况
7. 屏蔽电流相关的功能

v0.1.2(2024/06/01)
1. 增加iso数据处理功能
2. 重新修改了README.md
3. 单独将rokae拉出来，作为一个独立的repo进行维护，与scripts分离

v0.1.3(2024/06/01)
1. 完成电流处理的基本功能
2. 修复了一些已知bugs

v0.1.4(2024/06/06)
1. AV/RR支持小数
2. 可处理电机电流单轴以及多轴数据，可根据需要进行参数设定处理不同轴的数据
3. 界面初始位置修改，以及删除所有entry的长度设定，因为设定无效
4. 修改了layout.xlsx布局，增加了duration/trqH/STO字段，以及额外的RC行，整体扩展了区域
5. 更改label/entry/optionmenu等控件的生成方式，使用循环实现，更加简洁和容易维护（暂未实现）
6. 支持工业/协作两条产品线的电机电流数据处理，包括单轴，场景，max/avg计算

v0.1.5(2024/06/12)
1. [aio.py] 主界面切换不同功能时保持placehold一致
2. [brake.py] 由于制动采集模板和内容的更改，适配了新的数据，更新了算法
3. [aio.py] 新增tabview组件，区分数据处理和自动化测试功能
4. [aio.py] 重新调整界面配色
5. [aio.py] 修改了write2textbox函数，定制化显示每一行的颜色，针对每一行可自定义输出内容颜色
6. [brake.py/iso.py/current.py] 由于第 5 点的更改，同时修改了其他文件相关引用的部分
7. [aio.py] 更改label/entry/optionmenu等控件的生成方式，使用循环实现，更加简洁和容易维护
8. [aio.py] 修改customtkinter库中C:\Users\Administrator\AppData\Local\Programs\Python\Python312\Lib\site-packages\customtkinter\windows\widgets\ctk_tabview.py文件，参考https://github.com/TomSchimansky/CustomTkinter/issues/2296，实现修改tabview组件的字体大小
9. [aio.py] 修改menu_main->menu_main_dp，menu_sub->menu_sub_dp，为后续其他tab功能按钮做扩展，是针对第三点做出的相应调整
10. [layout.xlsx] 添加了各个功能的流程图

v0.1.5.1(2024/06/12)
1. [current.py] 修改cycle功能中，数据清理范围为70000行，并将threshold从2调整为5
2. [current.py] 修改位置超限提示，使更清楚了解问题原因
3. [current.py] 修改find_point函数中错误提示，增加定位信息
4. [README.md] 精简打包命令
5. [requirements.txt] 新增必要库配置文件

v0.1.5.2(2024/06/13)
1. [brake.py/aio.py]: 将sto修改为estop
2. [brake.py] 修改了速度计算逻辑，新版本的vel列数据遵循如下规则，av = vel * 180 / pi，根据av再计算speed
3. [brake.py] 将threshold修改为常量50
4. [brake.py] 提高了输出提示语的明确性，删除了不必要的省略号
5. [brake.py] 更正了之前的数据copy错误，重新优化了estop处是否达到指定百分比的判定逻辑

v0.1.5.3(2024/06/14)
1. [aio.py] 修改w_param为84，适配14寸电脑屏幕
2. [brake.py] 将判定合规逻辑修改为角速度超过指定角速度的95%
3. [README.md] 稍作修改，包括打包方式，功能特性等

v0.1.6.0(2024/06/15)
1. [aio.py] 新增wavelogger处理界面
2. [wavelogger.py] 新增精度数据处理模块

v0.1.6.1(2024/06/16)
1. [wavelogger.py] bugfix single_file_proc函数中，修改_start起始点的计算逻辑
2. [wavelogger.py] bugfix find_point函数中，当判断条件为临界值 2.0 的时候，针对forward和backward两种情况，对row_target做与判断逻辑相同的处理，目的是避免形成死循环

v0.1.6.2(2024/06/16)
1. [current.py] 修改了max/avg相关功能中对于返回值的处理逻辑，并在输出框以行的形式打印出来

v0.1.6.3(2024/06/18)
1. [current.py] 适配电机电流中速度使用hw_joint_vel_feedback的数据，取消对device_servo_vel_feedback的支持，后续所有涉及到速度相关的数据均已前者为准，现已完成对单轴和场景的适配

> ！！WARNING：目前版本的电机电流程序还支持DriverMaster采集的数据处理，等明确后，将不再支持，也即所有的电机电流数据（工业+协作），都是用诊断曲线来采集

v0.1.7.0(2024/06/29)
1. [openapi.py] 初步搭建起框架，完成了新老协议的封包/解包/异步采集日志的操作（未充分测试，但基本无问题）
2. [openapi.py] 修改了封包的规则，使之更加明晰，封包操作没有实现分包功能，目前看实际场景用不到
3. [openapi.py] 定义 MAX_FRAME_SIZE 常量（1024），替换socket接收以及响应数据处理相关部分
4. [openapi.py] 使用 int.to_bytes 和 int.from_bytes 替换 binascii 模块的功能
5. [aio.py] 修改了Data Process中初始化的动作，使得初始化时的状态统一成程序刚启动时的样子
6. [aio.py] 增加了tabview的点击行为函数，每次点击tab都会初始化
7. [aio.py] 增加了Automatic Test界面元素，包括如下，并完成了功能框架的搭建
   - 标签：文件/角速度/减速比
   - 按钮：急停及恢复
   - 输入框：文件路径/角速度/减速比
   - OptionMenu：负载
   - 进度条
8. [openapi.py] 增加心跳检测函数，并开启线程执行；取消在该文件中生成实例
9. [aio.py] 完成detect_network，并在main函数开启线程
10. 将templates文件夹移动到assets内

> **关于HMI接口**
> - 封包解包顺序：帧长度二字节/包长度四字节/协议二字节/预留二字节，\x04\x00:\x00\x00\tR:\x02:\x00
> - 帧长度和包长度没有必然关系，单帧的时候是帧长度减去包长度等于6，包长度指的是所有内容的长度
> - HMI内部每次发送1024个字节，进行分包，内容长度规则是：第一帧1024-6=1018(帧大小减去包头长度)，第二帧（包含）及之后的帧，帧长度即是数据长度
