改动6
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user