Skip to content

Commit df2dd70

Browse files
KyllianAubryGitHub Enterprise
authored andcommitted
SKA-1049: update CAN frame casting (#210)
1 parent 387fce8 commit df2dd70

1 file changed

Lines changed: 26 additions & 11 deletions

File tree

FmuImporter/FmuImporter/DataConverter.cs

Lines changed: 26 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -579,21 +579,42 @@ private static ushort CalculateDlc(ushort dataFieldSize)
579579

580580
public CanFrame LsCanTransmitOperationToSilKitCanFrame(byte[] LSCanFrame, ILogger Logger)
581581
{
582-
int size = Marshal.SizeOf(typeof(CanTransmitOperation));
583-
IntPtr ptr = Marshal.AllocHGlobal(size);
584-
Marshal.Copy(LSCanFrame, 0, ptr, LSCanFrame.Length);
582+
// copy only the fixed header
583+
int headerSize = Marshal.SizeOf(typeof(CanTransmitOperation)) - IntPtr.Size;
584+
585+
if (LSCanFrame.Length < headerSize)
586+
{
587+
Logger.Log(LogLevel.Error, $"CAN frame too short ({LSCanFrame.Length} bytes). Expected at least {headerSize} bytes.");
588+
return new CanFrame();
589+
}
590+
591+
IntPtr ptr = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(CanTransmitOperation)));
592+
Marshal.Copy(LSCanFrame, 0, ptr, headerSize);
585593
var ptrToStruct = Marshal.PtrToStructure(ptr, typeof(CanTransmitOperation));
586594
Marshal.FreeHGlobal(ptr);
587595

588596
if (ptrToStruct == null)
589597
{
590-
Logger.Log(LogLevel.Error, $"Error while casting CAN transmit operation to SIL Kit CAN frame. Retreived bytes:" +
598+
Logger.Log(LogLevel.Error, $"Error while casting CAN transmit operation to SIL Kit CAN frame. Retrieved bytes:" +
591599
$"{LSCanFrame}");
592600
return new CanFrame();
593601
}
594602

595603
CanTransmitOperation canTransmitOp = (CanTransmitOperation)ptrToStruct;
596604

605+
// populate the Data field from the remaining bytes
606+
var dataLength = canTransmitOp.GetDataLength();
607+
608+
if (LSCanFrame.Length < headerSize + dataLength)
609+
{
610+
Logger.Log(LogLevel.Error, $"CAN frame size mismatch. Header indicates {dataLength} data bytes, " +
611+
$"but only {LSCanFrame.Length - headerSize} are available.");
612+
return new CanFrame();
613+
}
614+
615+
canTransmitOp.Data = Marshal.AllocHGlobal(dataLength);
616+
Marshal.Copy(LSCanFrame, headerSize, canTransmitOp.Data, dataLength);
617+
597618
CanFrame silkitCanFrame = new CanFrame();
598619

599620
silkitCanFrame.id = canTransmitOp.GetID();
@@ -605,7 +626,6 @@ public CanFrame LsCanTransmitOperationToSilKitCanFrame(byte[] LSCanFrame, ILogge
605626
{
606627
silkitCanFrame.flags |= (UInt32)SilKitCanFrameFlag.Rtr;
607628
}
608-
var dataLength = canTransmitOp.GetDataLength();
609629
silkitCanFrame.dlc = CalculateDlc(dataLength);
610630
if ( silkitCanFrame.dlc == 0xFFFF)
611631
{
@@ -618,14 +638,9 @@ public CanFrame LsCanTransmitOperationToSilKitCanFrame(byte[] LSCanFrame, ILogge
618638
silkitCanFrame.vcid = 0;
619639
silkitCanFrame.af = 0;
620640

621-
// handle data field. Starts from the 17th byte
622-
var bytes = LSCanFrame.AsSpan(16, dataLength);
623-
var dataptr = Marshal.AllocHGlobal(dataLength);
624-
Marshal.Copy(bytes.ToArray(), 0, dataptr, dataLength);
625-
626641
silkitCanFrame.data = new ByteVector
627642
{
628-
data = dataptr,
643+
data = canTransmitOp.Data,
629644
size = (IntPtr)dataLength
630645
};
631646

0 commit comments

Comments
 (0)