* -------------------------------- Arctic Core ------------------------------*/\r
\r
\r
-\r
-\r
-\r
#include <string.h>\r
+#include <assert.h>\r
\r
#include "Com_Arc_Types.h"\r
#include "Com.h"\r
\r
// Pointer to a byte of the source and dest respectively.\r
uint8 *signalDataBytes = (uint8 *)signalData;\r
+ uint8 signalDataBytesArray[8];\r
const uint8 *pduBufferBytes = (const uint8 *)pduBuffer;\r
uint8 startBitOffset = 0;\r
\r
- if (signalEndianess != CPU_ENDIANESS) {\r
+ if (signalEndianess == COM_LITTLE_ENDIAN) {\r
// Swap source bytes before reading\r
// TODO: Must adapt to larger PDUs!\r
uint8 pduBufferBytes_swap[8];\r
startBitOffset = intelBitNrToPduOffset(bitPosition, bitSize, 64);\r
//lint -save -esym(960,12.5) PC-Lint Exception: OK. PC-Lint Wrong interpretation of MISRA rule 12.5.\r
Com_ReadDataSegment(\r
- signalDataBytes, pduBufferBytes_swap, destSize,\r
+ signalDataBytesArray, pduBufferBytes_swap, destSize,\r
startBitOffset, bitSize,\r
SignalTypeSignedness(signalType));\r
//lint -restore\r
} else {\r
startBitOffset = motorolaBitNrToPduOffset(bitPosition);\r
Com_ReadDataSegment(\r
- signalDataBytes, pduBufferBytes, destSize,\r
+ signalDataBytesArray, pduBufferBytes, destSize,\r
startBitOffset, bitSize,\r
SignalTypeSignedness(signalType));\r
}\r
+\r
+ if (Com_SystemEndianness == COM_BIG_ENDIAN) {\r
+ // Straight copy\r
+ int i;\r
+ for (i = 0; i < destSize; i++) {\r
+ signalDataBytes[i] = signalDataBytesArray[i];\r
+ }\r
+\r
+ } else if (Com_SystemEndianness == COM_LITTLE_ENDIAN) {\r
+ // Data copy algorithm creates big-endian output data so we swap\r
+ int i;\r
+ for (i = 0; i < destSize; i++) {\r
+ signalDataBytes[destSize - 1 - i] = signalDataBytesArray[i];\r
+ }\r
+ }\r
+\r
}\r
\r
\r
const void *signalData) {\r
\r
// Get PDU\r
- const ComSignal_type * Signal = GET_Signal(signalId);\r
- Com_Arc_Signal_type * Arc_Signal = GET_ArcSignal(Signal->ComHandleId);\r
- Com_Arc_IPdu_type *Arc_IPdu = GET_ArcIPdu(Arc_Signal->ComIPduHandleId);\r
+ const ComSignal_type *Signal = GET_Signal(signalId);\r
+ Com_Arc_Signal_type *Arc_Signal = GET_ArcSignal(Signal->ComHandleId);\r
+ Com_Arc_IPdu_type *Arc_IPdu = GET_ArcIPdu(Arc_Signal->ComIPduHandleId);\r
+ const ComIPdu_type *IPdu = GET_IPdu(Arc_Signal->ComIPduHandleId);\r
\r
// Get data\r
Com_WriteSignalDataToPduBuffer(\r
signalId,\r
FALSE,\r
signalData,\r
- Arc_IPdu->ComIPduDataPtr);\r
+ Arc_IPdu->ComIPduDataPtr,\r
+ IPdu->ComIPduSize);\r
}\r
\r
void Com_WriteGroupSignalDataToPdu(\r
const void *signalData) {\r
\r
// Get PDU\r
- const ComSignal_type * Signal = GET_Signal(parentSignalId);\r
- Com_Arc_Signal_type * Arc_Signal = GET_ArcSignal(Signal->ComHandleId);\r
- Com_Arc_IPdu_type *Arc_IPdu = GET_ArcIPdu(Arc_Signal->ComIPduHandleId);\r
+ const ComSignal_type *Signal = GET_Signal(parentSignalId);\r
+ Com_Arc_Signal_type *Arc_Signal = GET_ArcSignal(Signal->ComHandleId);\r
+ Com_Arc_IPdu_type *Arc_IPdu = GET_ArcIPdu(Arc_Signal->ComIPduHandleId);\r
+ const ComIPdu_type *IPdu = GET_IPdu(Arc_Signal->ComIPduHandleId);\r
\r
// Get data\r
Com_WriteSignalDataToPduBuffer(\r
groupSignalId,\r
TRUE,\r
signalData,\r
- Arc_IPdu->ComIPduDataPtr);\r
+ Arc_IPdu->ComIPduDataPtr,\r
+ IPdu->ComIPduSize);\r
}\r
\r
\r
const uint16 signalId,\r
const boolean isGroupSignal,\r
const void *signalData,\r
- void *pduBuffer) {\r
+ void *pduBuffer,\r
+ const uint8 pduSize) {\r
// TODO: Implement writing little-endian signals\r
\r
Com_SignalType signalType;\r
uint8 signalLength;\r
uint8 bitPosition;\r
uint8 bitSize;\r
+ ComSignalEndianess_type endian;\r
\r
if (!isGroupSignal) {\r
const ComSignal_type * Signal = GET_Signal(signalId);\r
signalLength = Signal->ComBitSize / 8;\r
bitPosition = Signal->ComBitPosition;\r
bitSize = Signal->ComBitSize;\r
+ endian = Signal->ComSignalEndianess;\r
} else {\r
const ComGroupSignal_type *GroupSignal = GET_GroupSignal(signalId);\r
signalType = GroupSignal->ComSignalType;\r
signalLength = GroupSignal->ComBitSize / 8;\r
bitPosition = GroupSignal->ComBitPosition;\r
bitSize = GroupSignal->ComBitSize;\r
+ endian = GroupSignal->ComSignalEndianess;\r
}\r
\r
+ uint8 signalBufferSize = SignalTypeToSize(signalType, signalLength);\r
+ uint8 pduSignalMask[8] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};\r
\r
+ uint8 signalDataBytesArray[8] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};\r
const uint8 *signalDataBytes = (const uint8 *)signalData;\r
- uint8 *pduBufferBytes = (uint8 *)pduBuffer;\r
- uint8 startBitOffset = motorolaBitNrToPduOffset(bitPosition);\r
- uint8 signalBufferSize = SignalTypeToSize(signalType, signalLength);\r
+ if (Com_SystemEndianness == COM_BIG_ENDIAN) {\r
+ // Straight copy\r
+ int i;\r
+ for (i = 0; i < signalBufferSize; i++) {\r
+ signalDataBytesArray[i] = signalDataBytes[i];\r
+ }\r
+\r
+ } else if (Com_SystemEndianness == COM_LITTLE_ENDIAN) {\r
+ // Data copy algorithm assumes big-endian input data so we swap\r
+ int i;\r
+ for (i = 0; i < signalBufferSize; i++) {\r
+ signalDataBytesArray[signalBufferSize - 1 - i] = signalDataBytes[i];\r
+ }\r
+ }\r
+\r
+ if (endian == COM_BIG_ENDIAN) {\r
+ uint8 *pduBufferBytes = (uint8 *)pduBuffer;\r
+ uint8 startBitOffset = motorolaBitNrToPduOffset(bitPosition);\r
+\r
+ Com_WriteDataSegment(pduBufferBytes, pduSignalMask,\r
+ signalDataBytesArray, signalBufferSize, startBitOffset, bitSize);\r
\r
- Com_WriteDataSegment(pduBufferBytes, signalDataBytes, signalBufferSize, startBitOffset, bitSize);\r
+ } else {\r
+ uint8 startBitOffset = intelBitNrToPduOffset(bitPosition, bitSize, pduSize * 8);\r
+ uint8 pduBufferBytesSwapped[8] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};\r
+\r
+ Com_WriteDataSegment(pduBufferBytesSwapped, pduSignalMask,\r
+ signalDataBytesArray, signalBufferSize, startBitOffset, bitSize);\r
+\r
+ uint8 *pduBufferBytes = (uint8 *)pduBuffer;\r
+ uint8 i;\r
+ for (i = 0; i < pduSize; i++) {\r
+ pduBufferBytes[ i ] &= ~( pduSignalMask[ (pduSize - 1) - i ] );\r
+ pduBufferBytes[ i ] |= pduBufferBytesSwapped[ (pduSize - 1) - i ];\r
+ }\r
+ }\r
}\r
\r
\r
* Copies the <segmentBitLength> least significant bits from <signal> into <pdu>.\r
* The bit segment is placed in <pdu> so that the most significant bit ends up\r
* at <segmentStartBitOffset> from the msb of <pdu>.\r
+ * <pduSignalMask> is cleared and written to contain a mask with 1´s where the\r
+ * signal is located in the <pdu>.\r
*/\r
-void Com_WriteDataSegment(uint8 *pdu, const uint8 *signalDataPtr, uint8 destByteLength,\r
+void Com_WriteDataSegment(uint8 *pdu, uint8 *pduSignalMask, const uint8 *signalDataPtr, uint8 destByteLength,\r
uint8 segmentStartBitOffset, uint8 segmentBitLength) {\r
uint8 pduEndBitOffset = segmentStartBitOffset + segmentBitLength - 1;\r
uint8 pduStartByte = segmentStartBitOffset / 8;\r
uint16 shiftReg = 0;\r
uint16 clearReg = 0;\r
\r
+ // clear pduSignalMask all the way from 0\r
+ memset(pduSignalMask, 0x00, pduEndByte);\r
+\r
// setup to point to end (LSB) of buffers\r
- pdu += pduEndByte;\r
+ pdu += pduEndByte;\r
+ pduSignalMask += pduEndByte;\r
+\r
signalDataPtr += destByteLength - 1;\r
\r
// splits and writes one source byte on each iteration\r
shiftReg &= pduStartByteMask;\r
clearReg &= pduStartByteMask;\r
}\r
- *(pdu - pduByteNr) &= (uint16)~(clearReg & 0x00FFu);\r
- *(pdu - pduByteNr) |= shiftReg & 0x00FFu;\r
+ *(pdu - pduByteNr) &= (uint16)~(clearReg & 0x00FFu);\r
+ *(pduSignalMask - pduByteNr) |= (uint16) (clearReg & 0x00FFu);\r
+ *(pdu - pduByteNr) |= shiftReg & 0x00FFu;\r
\r
pduByteNr++;\r
if ( (pduAlignmentShift != 0)\r
shiftReg &= pduStartByteMask;\r
clearReg &= pduStartByteMask;\r
}\r
- *(pdu - pduByteNr) &= (uint16)~(clearReg & 0x00FFu);\r
- *(pdu - pduByteNr) |= shiftReg & 0x00FFu;\r
+ *(pdu - pduByteNr) &= (uint16)~(clearReg & 0x00FFu);\r
+ *(pduSignalMask - pduByteNr) |= (uint16) (clearReg & 0x00FFu);\r
+ *(pdu - pduByteNr) |= shiftReg & 0x00FFu;\r
}\r
signalByteNr++;\r
} while (signalByteNr < segmentByteLength);\r