diff --git a/CapMachine.Wpf/CanDrive/ToomossCan.cs b/CapMachine.Wpf/CanDrive/ToomossCan.cs
index 2b7bbe7..5345df7 100644
--- a/CapMachine.Wpf/CanDrive/ToomossCan.cs
+++ b/CapMachine.Wpf/CanDrive/ToomossCan.cs
@@ -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;
///
@@ -397,8 +398,28 @@ namespace CapMachine.Wpf.CanDrive
///
public void SendCanMsg(List CmdData)
{
- var GroupMsg = CmdData.GroupBy(x => x.MsgName);
- int msgCount = GroupMsg.Count();
+ SendCanMessagesByDbc(CmdData);
+ }
+
+ private void SendCanMessagesByDbc(IEnumerable 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);
}
}
diff --git a/CapMachine.Wpf/Services/CanDriveService.cs b/CapMachine.Wpf/Services/CanDriveService.cs
index b31524e..bc0a154 100644
--- a/CapMachine.Wpf/Services/CanDriveService.cs
+++ b/CapMachine.Wpf/Services/CanDriveService.cs
@@ -102,6 +102,7 @@ namespace CapMachine.Wpf.Services
/// 在程序配置好后就确定要发送哪些数据
///
public List CmdData { get; set; } = new List();
+ private readonly object _cmdDataLock = new object();
///
/// 增加发送的指令数据
@@ -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 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
{