命令树优化,测试编辑区域优化

This commit is contained in:
“hsc”
2026-08-27 10:50:10 +08:00
parent 99ac3f2b8d
commit e144dc78a7
24 changed files with 1520 additions and 338 deletions
+60 -55
View File
@@ -10,6 +10,10 @@ using System.Text.Json;
using TSMaster;
namespace TSMasterCAN
{
/// <summary>
/// TSMaster CAN/CANFD 总线控制类,基于 TSMaster API 实现总线连接管理、
/// DBC 信号读写、报文发送(单次/循环)、日志记录等功能,暴露给命令树供测试步骤调用。
/// </summary>
[ACPCommand]
public class CAN
{
@@ -70,9 +74,10 @@ namespace TSMasterCAN
}
/// <summary>
/// 连接
/// 连接 TSMaster CAN 总线:建立总线连接并启动 RBS 仿真系统,
/// 成功后置位连接标志并触发 <see cref="ConnectEvent"/> 连接事件。
/// </summary>
/// <returns></returns>
/// <returns>返回代码,0 表示成功,非 0 表示失败(可用 <see cref="GetErrorDescription"/> 查询错误说明)</returns>
public static int Connect()
{
@@ -99,9 +104,9 @@ namespace TSMasterCAN
}
/// <summary>
/// 断开
/// 断开 TSMaster CAN 总线连接,成功后清除连接标志并触发 <see cref="DisConnectEvent"/> 断开事件。
/// </summary>
/// <returns></returns>
/// <returns>返回代码,0 表示成功,非 0 表示失败(可用 <see cref="GetErrorDescription"/> 查询错误说明)</returns>
public static int DisConnect()
{
var re = TsMasterApi.tsapp_disconnect();
@@ -161,19 +166,19 @@ namespace TSMasterCAN
}
/// <summary>
/// 开始记录日志
/// 开始记录总线日志,将总线上的报文数据记录到指定文件。
/// </summary>
/// <param name="filePath"></param>
/// <returns></returns>
/// <param name="filePath">日志文件保存路径(自动转换为绝对路径)</param>
/// <returns>返回代码,0 表示成功,非 0 表示失败</returns>
public static int StartLogging(string filePath)
{
return TsMasterApi.tsapp_start_logging(Path.GetFullPath(filePath));
}
/// <summary>
/// 结束记录日志
/// 结束总线日志记录。
/// </summary>
/// <returns></returns>
/// <returns>返回代码,0 表示成功,非 0 表示失败</returns>
public static int StopLogging()
{
return TsMasterApi.tsapp_stop_logging();
@@ -191,12 +196,12 @@ namespace TSMasterCAN
}
/// <summary>
/// 获取信号值
/// 获取 DBC 中定义信号的当前物理值(从总线接收报文中解析)。
/// </summary>
/// <param name="channel"></param>
/// <param name="AMsgName"></param>
/// <param name="ASgnName"></param>
/// <returns></returns>
/// <param name="channel">通道号(0 起始)</param>
/// <param name="AMsgName">DBC 中的报文名称</param>
/// <param name="ASgnName">DBC 中的信号名称</param>
/// <returns>信号物理值,获取失败时返回 <see cref="double.NaN"/></returns>
public static double GetSignalValue(byte channel, string AMsgName, string ASgnName)
{
double value = double.NaN;
@@ -237,16 +242,16 @@ namespace TSMasterCAN
}
/// <summary>
/// 设置信号值
/// 设置 DBC 中定义信号的值(按物理值编码进报文数据),可选择立即发送或周期发送。
/// </summary>
/// <param name="channel"></param>
/// <param name="AMsgName"></param>
/// <param name="ASgnName"></param>
/// <param name="AValue"></param>
/// <param name="isSend"></param>
/// <param name="sendPeriod"></param>
/// <returns></returns>
/// <exception cref="Exception"></exception>
/// <param name="channel">通道号(0 起始)</param>
/// <param name="AMsgName">DBC 中的报文名称</param>
/// <param name="ASgnName">DBC 中的信号名称</param>
/// <param name="AValue">要设置的信号物理值</param>
/// <param name="isSend">是否发送:false 仅更新数据不发送,true 则发送</param>
/// <param name="sendPeriod">发送周期(毫秒):0 = 只发送一次;&gt;0 = 按该周期循环发送</param>
/// <returns>返回代码,0 表示成功,非 0 表示失败</returns>
/// <exception cref="Exception">信号编码写入报文失败时抛出</exception>
public static int SetSignalValue(byte channel, string AMsgName, string ASgnName, double AValue, bool isSend = false, float sendPeriod = 0)
{
var find = DBCParse.MsgDatabase[channel].First(s => s.msg_name == AMsgName);
@@ -271,12 +276,12 @@ namespace TSMasterCAN
/// <summary>
/// 设置信号值
/// 按报文名称发送 DBC 中定义的报文(使用该报文在 DBC 数据库中的当前数据)。
/// </summary>
/// <param name="channel"></param>
/// <param name="AMsgName"></param>
/// <param name="sendPeriod"></param>
/// <returns></returns>
/// <param name="channel">通道号</param>
/// <param name="AMsgName">DBC 中的报文名称</param>
/// <param name="sendPeriod">发送周期(毫秒):0 = 只发送一次;&gt;0 = 按该周期循环发送</param>
/// <returns>返回代码,0 表示成功,非 0 表示失败</returns>
public static int SetSignalValue(APP_CHANNEL channel, string AMsgName, float sendPeriod = 0)
{
var find = DBCParse.MsgDatabase[(byte)channel].First(s => s.msg_name == AMsgName);
@@ -302,11 +307,11 @@ namespace TSMasterCAN
}
/// <summary>
/// 设置报文
/// 按帧 ID 更新 DBC 数据库中指定报文的数据区(仅更新内存中的数据,不发送)。
/// </summary>
/// <param name="channel">通道</param>
/// <param name="ID">DBC数据库ID</param>
/// <param name="bytes">报文数组</param>
/// <param name="channel">通道</param>
/// <param name="ID">报文帧 IDDBC 中定义的 FIdentifier</param>
/// <param name="bytes">要写入的报文数据数组,超出报文数据长度的部分会被截断</param>
public static void SetMsg(APP_CHANNEL channel, int ID, byte[] bytes)
{
var find = DBCParse.MsgDatabase[(byte)channel].FirstOrDefault(s => s.ACANFD.FIdentifier == ID);
@@ -317,20 +322,20 @@ namespace TSMasterCAN
}
/// <summary>
/// 发送自定义报文
/// 构造并发送自定义 CAN/CANFD 报文,可选择单次发送或周期发送,并可同步更新 DBC 数据库中同 ID 报文的数据。
/// </summary>
/// <param name="AIdxChn"></param>
/// <param name="AID"></param>
/// <param name="AIsTx"></param>
/// <param name="AIsExt"></param>
/// <param name="AIsRemote"></param>
/// <param name="ADLC"></param>
/// <param name="ADataArray"></param>
/// <param name="AIsFD"></param>
/// <param name="AIsBRS"></param>
/// <param name="isUpdateDBCDatabase"></param>
/// <param name="sendPeriod"></param>
/// <returns></returns>
/// <param name="AIdxChn">通道号</param>
/// <param name="AID">报文帧 ID</param>
/// <param name="AIsTx">是否为发送帧</param>
/// <param name="AIsExt">是否为扩展帧(29 位 ID</param>
/// <param name="AIsRemote">是否为远程帧</param>
/// <param name="ADLC">数据长度代码(数据字节数,最大 64</param>
/// <param name="ADataArray">报文数据数组,超过 64 字节的部分会被截断</param>
/// <param name="AIsFD">是否为 CANFD 帧,默认 true</param>
/// <param name="AIsBRS">是否切换数据段波特率(仅 CANFD 有效),默认 false</param>
/// <param name="isUpdateDBCDatabase">是否同步更新 DBC 数据库中同帧 ID 报文的数据,默认 false</param>
/// <param name="sendPeriod">发送周期(毫秒):0 = 只发送一次;&gt;0 = 按该周期循环发送</param>
/// <returns>返回代码,0 表示成功,非 0 表示失败</returns>
public static int SendMsg(APP_CHANNEL AIdxChn, int AID, bool AIsTx, bool AIsExt,
bool AIsRemote, byte ADLC, byte[] ADataArray, bool AIsFD = true, bool AIsBRS = false,
bool isUpdateDBCDatabase = false, float sendPeriod = 0)
@@ -375,12 +380,12 @@ namespace TSMasterCAN
}
/// <summary>
/// 添加循环发送报文
/// 将 DBC 中定义的报文加入循环发送列表,按指定周期持续发送。
/// </summary>
/// <param name="channel"></param>
/// <param name="AMsgName"></param>
/// <param name="sendPeriod"></param>
/// <returns></returns>
/// <param name="channel">通道号(0 起始)</param>
/// <param name="AMsgName">DBC 中的报文名称</param>
/// <param name="sendPeriod">发送周期(毫秒)</param>
/// <returns>返回代码,0 表示成功,非 0 表示失败</returns>
public static int AddCyclicMsg(byte channel, string AMsgName, float sendPeriod)
{
var find = DBCParse.MsgDatabase[channel].First(s => s.msg_name == AMsgName);
@@ -389,19 +394,19 @@ namespace TSMasterCAN
}
/// <summary>
/// 清除循环发送的报文
/// 清除所有循环发送的报文,停止全部周期发送任务。
/// </summary>
/// <returns></returns>
/// <returns>返回代码,0 表示成功,非 0 表示失败</returns>
public static int DeleteCyclicMsgs()
{
return TsMasterApi.tsapp_delete_cyclic_msgs();
}
/// <summary>
/// 获取错误提示
/// 根据错误代码获取对应的错误文字描述,用于诊断 TSMaster API 返回码。
/// </summary>
/// <param name="errorCode">错误代码</param>
/// <returns></returns>
/// <param name="errorCode">TSMaster API 返回的错误代码</param>
/// <returns>错误描述文本,未知错误代码时返回提示信息</returns>
public static string GetErrorDescription(int errorCode)
{
IntPtr ADesc = IntPtr.Zero;