This commit is contained in:
2026-05-14 15:23:03 +08:00
parent 196df6b181
commit 0fb230079b
2 changed files with 73 additions and 102 deletions

View File

@@ -26,6 +26,7 @@ namespace CapMachine.Wpf.CanDrive
{
private readonly IContainerProvider ContainerProvider;
private readonly object _dbcParserLock = new object();
private readonly object _canSendLock = new object();
private const int DbcStringBufferCapacity = 256;
/// <summary>
@@ -397,8 +398,28 @@ namespace CapMachine.Wpf.CanDrive
/// </summary>
public void SendCanMsg(List<CanCmdData> CmdData)
{
var GroupMsg = CmdData.GroupBy(x => x.MsgName);
int msgCount = GroupMsg.Count();
SendCanMessagesByDbc(CmdData);
}
private void SendCanMessagesByDbc(IEnumerable<CanCmdData> sourceCmdData)
{
var cmdDataSnapshot = sourceCmdData
.Where(x => !string.IsNullOrWhiteSpace(x.MsgName) && !string.IsNullOrWhiteSpace(x.SignalName))
.Select(x => new CanCmdData
{
ConfigName = x.ConfigName,
MsgName = x.MsgName,
SignalName = x.SignalName,
SignalCmdValue = x.SignalCmdValue
})
.ToList();
if (cmdDataSnapshot.Count == 0)
{
return;
}
var groupMsg = cmdDataSnapshot.GroupBy(x => x.MsgName).ToList();
int msgCount = groupMsg.Count;
IntPtr msgPt = IntPtr.Zero;
IntPtr sendBufferPtr = IntPtr.Zero;
@@ -408,24 +429,35 @@ namespace CapMachine.Wpf.CanDrive
msgPt = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(USB2CAN.CAN_MSG)));
sendBufferPtr = Marshal.AllocHGlobal(canMsgSize * msgCount);
byte[] frameBytes = new byte[canMsgSize];
int Index = 0;
lock (_dbcParserLock)
int index = 0;
lock (_canSendLock)
{
//循环给MSG赋值数据
foreach (var itemMsg in GroupMsg)
lock (_dbcParserLock)
{
foreach (var itemSignal in itemMsg)
//循环给MSG赋值数据
foreach (var itemMsg in groupMsg)
{
CAN_DBCParser.DBC_SetSignalValue(DBCHandle, new StringBuilder(itemMsg.Key), new StringBuilder(itemSignal.SignalName), itemSignal.SignalCmdValue);
foreach (var itemSignal in itemMsg)
{
int setResult = CAN_DBCParser.DBC_SetSignalValue(DBCHandle, new StringBuilder(itemMsg.Key), new StringBuilder(itemSignal.SignalName), itemSignal.SignalCmdValue);
if (setResult != CAN_DBCParser.DBC_PARSER_OK)
{
return;
}
}
int syncResult = CAN_DBCParser.DBC_SyncValueToCANMsg(DBCHandle, new StringBuilder(itemMsg.Key), msgPt);
if (syncResult != CAN_DBCParser.DBC_PARSER_OK)
{
return;
}
var targetPtr = IntPtr.Add(sendBufferPtr, index * canMsgSize);
Marshal.Copy(msgPt, frameBytes, 0, canMsgSize);
Marshal.Copy(frameBytes, 0, targetPtr, canMsgSize);
index++;
}
CAN_DBCParser.DBC_SyncValueToCANMsg(DBCHandle, new StringBuilder(itemMsg.Key), msgPt);
var targetPtr = IntPtr.Add(sendBufferPtr, Index * canMsgSize);
Marshal.Copy(msgPt, frameBytes, 0, canMsgSize);
Marshal.Copy(frameBytes, 0, targetPtr, canMsgSize);
Index++;
}
USB2CAN.CAN_SendMsgByPtr(DevHandle, WriteCANIndex, sendBufferPtr, (uint)msgCount);
}
USB2CAN.CAN_SendMsgByPtr(DevHandle, WriteCANIndex, sendBufferPtr, (uint)msgCount);
}
finally
{
@@ -507,47 +539,7 @@ namespace CapMachine.Wpf.CanDrive
await Task.Delay(SendCycle);
try
{
var GroupMsg = CmdData.GroupBy(x => x.MsgName);
int msgCount = GroupMsg.Count();
IntPtr msgPtSend = IntPtr.Zero;
IntPtr sendBufferPtr = IntPtr.Zero;
try
{
int canMsgSize = Marshal.SizeOf(typeof(USB2CAN.CAN_MSG));
msgPtSend = Marshal.AllocHGlobal(canMsgSize);
sendBufferPtr = Marshal.AllocHGlobal(canMsgSize * msgCount);
byte[] frameBytes = new byte[canMsgSize];
int Index = 0;
lock (_dbcParserLock)
{
//循环给MSG赋值数据
foreach (var itemMsg in GroupMsg)
{
foreach (var itemSignal in itemMsg)
{
CAN_DBCParser.DBC_SetSignalValue(DBCHandle, new StringBuilder(itemMsg.Key), new StringBuilder(itemSignal.SignalName), itemSignal.SignalCmdValue);
}
CAN_DBCParser.DBC_SyncValueToCANMsg(DBCHandle, new StringBuilder(itemMsg.Key), msgPtSend);
var targetPtr = IntPtr.Add(sendBufferPtr, Index * canMsgSize);
Marshal.Copy(msgPtSend, frameBytes, 0, canMsgSize);
Marshal.Copy(frameBytes, 0, targetPtr, canMsgSize);
Index++;
}
}
USB2CAN.CAN_SendMsgByPtr(DevHandle, WriteCANIndex, sendBufferPtr, (uint)msgCount);
}
finally
{
if (msgPtSend != IntPtr.Zero)
{
Marshal.FreeHGlobal(msgPtSend);
}
if (sendBufferPtr != IntPtr.Zero)
{
Marshal.FreeHGlobal(sendBufferPtr);
}
}
SendCanMessagesByDbc(CmdData);
}
catch (Exception ex)
{
@@ -767,49 +759,7 @@ namespace CapMachine.Wpf.CanDrive
// 执行发送CAN逻辑
{
var GroupMsg = CmdData.GroupBy(x => x.MsgName);
int msgCount = GroupMsg.Count();
IntPtr msgPtSend = IntPtr.Zero;
IntPtr sendBufferPtr = IntPtr.Zero;
try
{
int canMsgSize = Marshal.SizeOf(typeof(USB2CAN.CAN_MSG));
msgPtSend = Marshal.AllocHGlobal(canMsgSize);
sendBufferPtr = Marshal.AllocHGlobal(canMsgSize * msgCount);
byte[] frameBytes = new byte[canMsgSize];
int Index = 0;
lock (_dbcParserLock)
{
//循环给MSG赋值数据
foreach (var itemMsg in GroupMsg)
{
foreach (var itemSignal in itemMsg)
{
CAN_DBCParser.DBC_SetSignalValue(DBCHandle, new StringBuilder(itemMsg.Key), new StringBuilder(itemSignal.SignalName), itemSignal.SignalCmdValue);
}
CAN_DBCParser.DBC_SyncValueToCANMsg(DBCHandle, new StringBuilder(itemMsg.Key), msgPtSend);
var targetPtr = IntPtr.Add(sendBufferPtr, Index * canMsgSize);
Marshal.Copy(msgPtSend, frameBytes, 0, canMsgSize);
Marshal.Copy(frameBytes, 0, targetPtr, canMsgSize);
Index++;
}
}
USB2CAN.CAN_SendMsgByPtr(DevHandle, WriteCANIndex, sendBufferPtr, (uint)msgCount);
}
finally
{
if (msgPtSend != IntPtr.Zero)
{
Marshal.FreeHGlobal(msgPtSend);
}
if (sendBufferPtr != IntPtr.Zero)
{
Marshal.FreeHGlobal(sendBufferPtr);
}
}
SendCanMessagesByDbc(CmdData);
}
}

View File

@@ -102,6 +102,7 @@ namespace CapMachine.Wpf.Services
/// 在程序配置好后就确定要发送哪些数据
/// </summary>
public List<CanCmdData> CmdData { get; set; } = new List<CanCmdData>();
private readonly object _cmdDataLock = new object();
/// <summary>
/// 增加发送的指令数据
@@ -128,7 +129,10 @@ namespace CapMachine.Wpf.Services
break;
}
//添加到发送数据集合
CmdData.Add(SendCanCmdData);
lock (_cmdDataLock)
{
CmdData.Add(SendCanCmdData);
}
}
@@ -141,7 +145,10 @@ namespace CapMachine.Wpf.Services
{
if (SpeedCanCmdData != null)
{
SpeedCanCmdData.SignalCmdValue = SpeedData;
lock (_cmdDataLock)
{
SpeedCanCmdData.SignalCmdValue = SpeedData;
}
}
//if (EnableCanCmdData != null)
//{
@@ -157,7 +164,10 @@ namespace CapMachine.Wpf.Services
{
if (EnableCanCmdData != null)
{
EnableCanCmdData.SignalCmdValue = IsEnable ? 1 : 0;
lock (_cmdDataLock)
{
EnableCanCmdData.SignalCmdValue = IsEnable ? 1 : 0;
}
}
}
@@ -174,7 +184,18 @@ namespace CapMachine.Wpf.Services
//更新速度信息
UpdateSpeedCmdData(SpeedData);
ToomossCanDrive.SendCanMsg(CmdData);
List<CanCmdData> cmdDataSnapshot;
lock (_cmdDataLock)
{
cmdDataSnapshot = CmdData.Select(x => new CanCmdData
{
ConfigName = x.ConfigName,
MsgName = x.MsgName,
SignalName = x.SignalName,
SignalCmdValue = x.SignalCmdValue
}).ToList();
}
ToomossCanDrive.SendCanMsg(cmdDataSnapshot);
}
else
{