using IvfTl.Control.Entity;
using ivf_tl_SerialHelper.Util;
using Xunit;
namespace ivf_tl_SerialHelper.Tests
{
///
/// 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 读写验证。
///
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;
}
/// 0x12 写E方回包帧长必须=12(真机实证:舱8/舱9 写排气阀回包均 12 字节,回包[3]=0x0C 自证)。
[Fact]
public void 写E方0x12_回包帧长应为12_真机实证()
{
Assert.Equal(12, LenOf(0x12));
}
/// 0x10 获取IO/读门回包帧长必须=7(真机实证:舱8/舱9 读门回包均 7 字节,回包[3]=0x07 自证)。
[Fact]
public void 获取IO0x10_回包帧长应为7_真机实证()
{
Assert.Equal(7, LenOf(0x10));
}
/// 0x08 读传感器AD回包帧长必须=9(operate基线+autofocustool 一致)。
[Fact]
public void 读传感器AD0x08_回包帧长应为9_对齐基线()
{
Assert.Equal(9, LenOf(0x08));
}
///
/// 整张帧长表必须与合并前 operate 黄金真值逐项一致(回归护栏)。
/// 期望值 = operate ivf_tl_Entity/ComEntitys/Commander.cs CustomProtocolLength(真机已用)。
///
[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));
}
/// 未知命令码回退默认 6(与基线一致)。
[Fact]
public void 未知命令码_回退默认6()
{
Assert.Equal(6, LenOf(0x7F));
}
}
}