|
|
@@ -0,0 +1,79 @@
|
|
|
+using IvfTl.Control.Entity;
|
|
|
+using ivf_tl_SerialHelper.Util;
|
|
|
+using Xunit;
|
|
|
+
|
|
|
+namespace ivf_tl_SerialHelper.Tests
|
|
|
+{
|
|
|
+ /// <summary>
|
|
|
+ /// M-05 合并回归:control 端 Commander.CustomProtocolLength(决定每条指令【回包帧长】)与
|
|
|
+ /// 合并前 operate 黄金真值(临时文件/ivf_tl_operate_2.0/ivf_tl_Entity/ComEntitys/Commander.cs)分歧——
|
|
|
+ /// · 0x12 写E方:operate=12,control=6 ← 真机实证回包确为 12(回包[3]=0x0C 自证,舱8/舱9 一致)
|
|
|
+ /// · 0x10 获取IO/读门:operate=7,control 缺→默认6 ← 真机实证读门回包确为 7([3]=0x07,舱8/舱9 一致)
|
|
|
+ /// · 0x08 读传感器AD:operate=9,control 缺→默认6 ← operate基线+autofocustool 一致;control 不发该命令(死路径,对齐基线)
|
|
|
+ /// control 帧长过短 → 只读前 N 字节、把数据字节误当状态字(非0→误判失败)、ORC 错位,
|
|
|
+ /// 并残留尾字节污染紧接的下一次读(=M-01/02/03 验证时"写后读垃圾值"现象的根因)。
|
|
|
+ /// 帧长表是纯逻辑,这里 red→green;消除帧错位的真机回环走 EEPROM 读写验证。
|
|
|
+ /// </summary>
|
|
|
+ public class CustomProtocolLengthTests
|
|
|
+ {
|
|
|
+ // 构造一条以 cmd 为命令码[1]的最小帧,跑 CustomProtocolLength,返回判定出的回包帧长。
|
|
|
+ private static int LenOf(byte cmd)
|
|
|
+ {
|
|
|
+ var custom = new CustomProtocol { sendBuffer = new byte[] { 0x5E, cmd, 0x00, 0x06, 0x00, 0x00 } };
|
|
|
+ Commander.CustomProtocolLength(custom);
|
|
|
+ return custom.lenght;
|
|
|
+ }
|
|
|
+
|
|
|
+ /// <summary>0x12 写E方回包帧长必须=12(真机实证:舱8/舱9 写排气阀回包均 12 字节,回包[3]=0x0C 自证)。</summary>
|
|
|
+ [Fact]
|
|
|
+ public void 写E方0x12_回包帧长应为12_真机实证()
|
|
|
+ {
|
|
|
+ Assert.Equal(12, LenOf(0x12));
|
|
|
+ }
|
|
|
+
|
|
|
+ /// <summary>0x10 获取IO/读门回包帧长必须=7(真机实证:舱8/舱9 读门回包均 7 字节,回包[3]=0x07 自证)。</summary>
|
|
|
+ [Fact]
|
|
|
+ public void 获取IO0x10_回包帧长应为7_真机实证()
|
|
|
+ {
|
|
|
+ Assert.Equal(7, LenOf(0x10));
|
|
|
+ }
|
|
|
+
|
|
|
+ /// <summary>0x08 读传感器AD回包帧长必须=9(operate基线+autofocustool 一致)。</summary>
|
|
|
+ [Fact]
|
|
|
+ public void 读传感器AD0x08_回包帧长应为9_对齐基线()
|
|
|
+ {
|
|
|
+ Assert.Equal(9, LenOf(0x08));
|
|
|
+ }
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// 整张帧长表必须与合并前 operate 黄金真值逐项一致(回归护栏)。
|
|
|
+ /// 期望值 = operate ivf_tl_Entity/ComEntitys/Commander.cs CustomProtocolLength(真机已用)。
|
|
|
+ /// </summary>
|
|
|
+ [Theory]
|
|
|
+ [InlineData(0x01, 6)] // 握手
|
|
|
+ [InlineData(0x02, 6)] // 自检
|
|
|
+ [InlineData(0x04, 7)] // 设目标温度
|
|
|
+ [InlineData(0x05, 6)] // 电机控制
|
|
|
+ [InlineData(0x06, 9)] // 读传感器信号
|
|
|
+ [InlineData(0x08, 9)] // 读传感器AD ← control 原缺
|
|
|
+ [InlineData(0x09, 6)] // 设IO
|
|
|
+ [InlineData(0x10, 7)] // 获取IO/读门 ← control 原缺
|
|
|
+ [InlineData(0x11, 10)] // 读E方
|
|
|
+ [InlineData(0x12, 12)] // 写E方 ← control 原为 6
|
|
|
+ [InlineData(0x16, 6)] // 自动换气 ← control 原缺(值与默认同)
|
|
|
+ [InlineData(0x18, 10)] // 读电机位置
|
|
|
+ [InlineData(0x19, 6)] // 缓冲瓶补气
|
|
|
+ [InlineData(0x20, 12)] // 读缓冲瓶数据
|
|
|
+ public void 帧长表逐项对齐operate基线(byte cmd, int expectedLen)
|
|
|
+ {
|
|
|
+ Assert.Equal(expectedLen, LenOf(cmd));
|
|
|
+ }
|
|
|
+
|
|
|
+ /// <summary>未知命令码回退默认 6(与基线一致)。</summary>
|
|
|
+ [Fact]
|
|
|
+ public void 未知命令码_回退默认6()
|
|
|
+ {
|
|
|
+ Assert.Equal(6, LenOf(0x7F));
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|