Skip to content

Commit

Permalink
Created MessageHeaderType to hide internal header parts
Browse files Browse the repository at this point in the history
  • Loading branch information
Patrik Lönnberg committed Aug 14, 2023
1 parent 52b84af commit f837bed
Show file tree
Hide file tree
Showing 17 changed files with 116 additions and 159 deletions.
8 changes: 3 additions & 5 deletions include/header.h
Original file line number Diff line number Diff line change
Expand Up @@ -9,23 +9,21 @@ extern "C" {

#pragma pack(push,1) // Ensure sizeof() is useable for (most) network byte lengths
/*! ISO message header */
struct ISOHeaderType {
typedef struct {
uint16_t syncWord;
uint32_t messageLength;
uint8_t ackReqProtVer;
uint32_t transmitterID;
uint32_t receiverID;
uint8_t messageCounter;
uint16_t messageID;
};
} HeaderType;;
#pragma pack(pop)

typedef struct ISOHeaderType HeaderType;

enum ISOMessageReturnValue decodeISOHeader(const char *MessageBuffer, const size_t length,
HeaderType * HeaderData, const char debug);

HeaderType buildISOHeader(const HeaderType *input, const char debug);
HeaderType buildISOHeader(enum ISOMessageID id, const MessageHeaderType *input, uint32_t messageLength, const char debug);

#ifdef __cplusplus
}
Expand Down
126 changes: 47 additions & 79 deletions iso22133.c

Large diffs are not rendered by default.

55 changes: 30 additions & 25 deletions iso22133.h
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,13 @@ typedef enum {
TEST_MODE_UNAVAILABLE = 255
} TestModeType;

/*! Message Header for building/encoding headers */
typedef struct {
uint32_t transmitterID;
uint32_t receiverID;
uint8_t messageCounter;
} MessageHeaderType;

/*! OSEM settings */
//Extracted to be swig compatible
typedef struct {
Expand Down Expand Up @@ -506,54 +513,52 @@ typedef struct {
enum DreqStatusType requestStatus;
} TestObjectDiscoveryRequestType;

typedef struct ISOHeaderType HeaderType;

ssize_t encodeMONRMessage(HeaderType *inputHeader, const struct timeval* objectTime, const CartesianPosition position, const SpeedType speed, const AccelerationType acceleration, const unsigned char driveDirection, const unsigned char objectState, const unsigned char readyToArm, const unsigned char objectErrorState, const unsigned short errorCode, char * monrDataBuffer, const size_t bufferLength, const char debug);
ssize_t encodeMONRMessage(MessageHeaderType *inputHeader, const struct timeval* objectTime, const CartesianPosition position, const SpeedType speed, const AccelerationType acceleration, const unsigned char driveDirection, const unsigned char objectState, const unsigned char readyToArm, const unsigned char objectErrorState, const unsigned short errorCode, char * monrDataBuffer, const size_t bufferLength, const char debug);
ssize_t decodeMONRMessage(const char * monrDataBuffer, const size_t bufferLength, const struct timeval currentTime, ObjectMonitorType * MonitorData, const char debug);
ssize_t encodeTRAJMessageHeader(HeaderType *inputHeader, const uint16_t trajectoryID, const TrajectoryInfoType trajectoryInfo, const char* trajectoryName, const size_t nameLength, const uint32_t numberOfPointsInTraj, char *trajDataBuffer, const size_t bufferLength, const char debug);
ssize_t encodeTRAJMessageHeader(MessageHeaderType *inputHeader, const uint16_t trajectoryID, const TrajectoryInfoType trajectoryInfo, const char* trajectoryName, const size_t nameLength, const uint32_t numberOfPointsInTraj, char *trajDataBuffer, const size_t bufferLength, const char debug);
ssize_t encodeTRAJMessagePoint(const struct timeval * pointTimeFromStart, const CartesianPosition position, const SpeedType speed, const AccelerationType acceleration, const float curvature, char * trajDataBufferPointer, const size_t remainingBufferLength, const char debug);
ssize_t decodeTRAJMessagePoint(TrajectoryWaypointType* wayPoints, const char* trajDataBuffer, const char debug);
ssize_t encodeTRAJMessageFooter(char * trajDataBuffer, const size_t bufferLength, const char debug);
ssize_t decodeTRAJMessageHeader(TrajectoryHeaderType* trajHeader, const char* trajDataBuffer, const size_t bufferLength, const char debug);
ssize_t encodeSTRTMessage(HeaderType *inputHeader, const StartMessageType* startData, char * strtDataBuffer, const size_t bufferLength, const char debug);
ssize_t encodeSTRTMessage(MessageHeaderType *inputHeader, const StartMessageType* startData, char * strtDataBuffer, const size_t bufferLength, const char debug);
ssize_t decodeSTRTMessage(const char *strtDataBuffer, const size_t bufferLength, const struct timeval* currentTime, StartMessageType * startData, const char debug) ;
ssize_t encodeOSEMMessage(HeaderType *inputHeader, const ObjectSettingsType* objectSettingsData, char * osemDataBuffer, const size_t bufferLength, const char debug);
ssize_t encodeOSEMMessage(MessageHeaderType *inputHeader, const ObjectSettingsType* objectSettingsData, char * osemDataBuffer, const size_t bufferLength, const char debug);
ssize_t decodeOSEMMessage(ObjectSettingsType *objectSettingsData, const char * osemDataBuffer, const size_t bufferLength, const char debug);
ssize_t encodeOSTMMessage(HeaderType *inputHeader, const enum ObjectCommandType command, char * ostmDataBuffer, const size_t bufferLength, const char debug);
ssize_t encodeOSTMMessage(MessageHeaderType *inputHeader, const enum ObjectCommandType command, char * ostmDataBuffer, const size_t bufferLength, const char debug);
ssize_t decodeOSTMMessage(const char* ostmDataBuffer, const size_t bufferLength, enum ObjectCommandType* command, const char debug);
ssize_t encodeHEABMessage(HeaderType *inputHeader, const struct timeval* heabTime, const enum ControlCenterStatusType status, char * heabDataBuffer, const size_t bufferLength, const char debug);
ssize_t encodeHEABMessage(MessageHeaderType *inputHeader, const struct timeval* heabTime, const enum ControlCenterStatusType status, char * heabDataBuffer, const size_t bufferLength, const char debug);
ssize_t decodeHEABMessage(const char *heabDataBuffer, const size_t bufferLength, const struct timeval currentTime, HeabMessageDataType* heabData, const char debug);
ssize_t encodeSYPMMessage(HeaderType *inputHeader, const struct timeval synchronizationTime, const struct timeval freezeTime, char * sypmDataBuffer, const size_t bufferLength, const char debug);
ssize_t encodeMTSPMessage(HeaderType *inputHeader, const struct timeval * estSyncPointTime, char * mtspDataBuffer, const size_t bufferLength, const char debug);
ssize_t encodeTRCMMessage(HeaderType *inputHeader, const uint16_t* triggerID, const enum TriggerType_t* triggerType, const enum TriggerTypeParameter_t* param1, const enum TriggerTypeParameter_t* param2, const enum TriggerTypeParameter_t* param3, char * trcmDataBuffer, const size_t bufferLength, const char debug);
ssize_t encodeACCMMessage(HeaderType *inputHeader, const uint16_t* actionID, const enum ActionType_t* actionType, const enum ActionTypeParameter_t* param1, const enum ActionTypeParameter_t* param2, const enum ActionTypeParameter_t* param3, char * accmDataBuffer, const size_t bufferLength, const char debug);
ssize_t encodeEXACMessage(HeaderType *inputHeader, const uint16_t* actionID, const struct timeval * executionTime, char * exacDataBuffer, const size_t bufferLength, const char debug);
ssize_t encodeSYPMMessage(MessageHeaderType *inputHeader, const struct timeval synchronizationTime, const struct timeval freezeTime, char * sypmDataBuffer, const size_t bufferLength, const char debug);
ssize_t encodeMTSPMessage(MessageHeaderType *inputHeader, const struct timeval * estSyncPointTime, char * mtspDataBuffer, const size_t bufferLength, const char debug);
ssize_t encodeTRCMMessage(MessageHeaderType *inputHeader, const uint16_t* triggerID, const enum TriggerType_t* triggerType, const enum TriggerTypeParameter_t* param1, const enum TriggerTypeParameter_t* param2, const enum TriggerTypeParameter_t* param3, char * trcmDataBuffer, const size_t bufferLength, const char debug);
ssize_t encodeACCMMessage(MessageHeaderType *inputHeader, const uint16_t* actionID, const enum ActionType_t* actionType, const enum ActionTypeParameter_t* param1, const enum ActionTypeParameter_t* param2, const enum ActionTypeParameter_t* param3, char * accmDataBuffer, const size_t bufferLength, const char debug);
ssize_t encodeEXACMessage(MessageHeaderType *inputHeader, const uint16_t* actionID, const struct timeval * executionTime, char * exacDataBuffer, const size_t bufferLength, const char debug);
ssize_t decodeRCMMMessage(const char *rcmmDataBuffer, const size_t bufferLength, RemoteControlManoeuvreMessageType* rcmmData, const char debug);
ssize_t encodeRCMMMessage(HeaderType *inputHeader, const RemoteControlManoeuvreMessageType* rcmmObjectData, char* rcmmDataBuffer, const size_t bufferLength, const char debug);
ssize_t encodeRCMMMessage(MessageHeaderType *inputHeader, const RemoteControlManoeuvreMessageType* rcmmObjectData, char* rcmmDataBuffer, const size_t bufferLength, const char debug);
ssize_t decodeGREMMessage(const char *gremDataBuffer, const size_t bufferLength, GeneralResponseMessageType* gremData, const char debug);
ssize_t encodeGREMMessage(HeaderType *inputHeader, const GeneralResponseMessageType* gremObjectData, char* gremDataBuffer, const size_t bufferLength, const char debug);
ssize_t encodeDRESMessage(HeaderType *inputHeader, const TestObjectDiscoveryType *testObjectDiscoveryData, char *dresDataBuffer, const size_t bufferLength, const char debug);
ssize_t encodeGREMMessage(MessageHeaderType *inputHeader, const GeneralResponseMessageType* gremObjectData, char* gremDataBuffer, const size_t bufferLength, const char debug);
ssize_t encodeDRESMessage(MessageHeaderType *inputHeader, const TestObjectDiscoveryType *testObjectDiscoveryData, char *dresDataBuffer, const size_t bufferLength, const char debug);
ssize_t decodeDRESMessage(const char* dresDataBuffer, const size_t bufferLength, TestObjectDiscoveryType *testObjectDiscoveryData, const char debug);
ssize_t encodeDREQMessage(HeaderType *inputHeader, char *dreqDataBuffer, const size_t bufferLength, const char debug);
ssize_t encodeDREQMessage(MessageHeaderType *inputHeader, char *dreqDataBuffer, const size_t bufferLength, const char debug);
ssize_t decodeDREQMessage(const char* dreqDataBuffer, const size_t bufferLength, TestObjectDiscoveryRequestType *testObjectDiscoveryRequestData, const char debug);
ssize_t encodeINSUPMessage(HeaderType *inputHeader, const enum SupervisorCommandType, char * insupDataBuffer, const size_t bufferLength, const char debug);
ssize_t encodeDCTIMessage(HeaderType *inputHeader, const DctiMessageDataType *dctiData, char *dctiDataBuffer, const size_t bufferLength, const char debug);
ssize_t encodeINSUPMessage(MessageHeaderType *inputHeader, const enum SupervisorCommandType, char * insupDataBuffer, const size_t bufferLength, const char debug);
ssize_t encodeDCTIMessage(MessageHeaderType *inputHeader, const DctiMessageDataType *dctiData, char *dctiDataBuffer, const size_t bufferLength, const char debug);
enum ISOMessageReturnValue decodeDCTIMessage(const char *dctiDataBuffer, const size_t bufferLength, DctiMessageDataType* dctiData, const char debug);
enum ISOMessageID getISOMessageType(const char * messageData, const size_t length, const char debug);
void setISOCRCVerification(const int8_t enabled);

/* AstaZero vendor specific messages - TODO move to a separate repository */
ssize_t encodePODIMessage(HeaderType *inputHeader, const PeerObjectInjectionType* peerObjectData, char* podiDataBuffer, const size_t bufferLength, const char debug);
ssize_t encodePODIMessage(MessageHeaderType *inputHeader, const PeerObjectInjectionType* peerObjectData, char* podiDataBuffer, const size_t bufferLength, const char debug);
ssize_t decodePODIMessage(const char *podiDataBuffer, const size_t bufferLength, const struct timeval currentTime, PeerObjectInjectionType* peerData, const char debug);
ssize_t encodeOPROMessage(HeaderType *inputHeader, const ObjectPropertiesType *objectPropertiesData, char * oproDataBuffer, const size_t bufferLength, const char debug);
ssize_t encodeOPROMessage(MessageHeaderType *inputHeader, const ObjectPropertiesType *objectPropertiesData, char * oproDataBuffer, const size_t bufferLength, const char debug);
ssize_t decodeOPROMessage(ObjectPropertiesType *objectPropertiesData, const char * oproDataBuffer, const size_t bufferLength, const char debug);
ssize_t encodeFOPRMessage(HeaderType *inputHeader, const ForeignObjectPropertiesType* foreignObjectPropertiesData, char *foprDataBuffer, const size_t bufferLength, const char debug);
ssize_t encodeFOPRMessage(MessageHeaderType *inputHeader, const ForeignObjectPropertiesType* foreignObjectPropertiesData, char *foprDataBuffer, const size_t bufferLength, const char debug);
ssize_t decodeFOPRMessage(ForeignObjectPropertiesType * foreignObjectPropertiesData, const char *foprDataBuffer, const size_t bufferLength, const char debug);
ssize_t encodeRDCAMessage(HeaderType *inputHeader, const RequestControlActionType* requestControlActionData, char *rdcaDataBuffer, const size_t bufferLength, const char debug);
ssize_t encodeRDCAMessage(MessageHeaderType *inputHeader, const RequestControlActionType* requestControlActionData, char *rdcaDataBuffer, const size_t bufferLength, const char debug);
ssize_t decodeRDCAMessage(const char *rdcaDataBuffer, RequestControlActionType* requestControlActionData, const size_t bufferLength, const struct timeval currentTime, const char debug);
ssize_t encodeGDRMMessage(HeaderType *inputHeader, const GdrmMessageDataType *gdrmData, char *gdrmDataBuffer, const size_t bufferLength, const char debug);
ssize_t encodeGDRMMessage(MessageHeaderType *inputHeader, const GdrmMessageDataType *gdrmData, char *gdrmDataBuffer, const size_t bufferLength, const char debug);
enum ISOMessageReturnValue decodeGDRMMessage(const char *gdrmDataBuffer, const size_t bufferLength, GdrmMessageDataType* gdrmData, const char debug);
ssize_t encodeDCMMMessage(HeaderType *inputHeader, const RemoteControlManoeuvreMessageType* command, char* dcmmDataBuffer, const size_t bufferLength, const char debug);
ssize_t encodeDCMMMessage(MessageHeaderType *inputHeader, const RemoteControlManoeuvreMessageType* command, char* dcmmDataBuffer, const size_t bufferLength, const char debug);
ssize_t decodeDCMMMessage(const char * dcmmDataBuffer, const size_t bufferLenght, RemoteControlManoeuvreMessageType* dcmmData, const char debug);
#ifdef __cplusplus
}
Expand Down
8 changes: 3 additions & 5 deletions src/dreq.c
Original file line number Diff line number Diff line change
Expand Up @@ -8,13 +8,13 @@

/*!
* \brief encodeDREQMessage Constructs an ISO DREQ message based on specified command (DREQ contains no message data)
* \param inputHeader data to create header with - Only use transmitterID, receiverID and messageCounter
* \param inputHeader data to create header
* \param dreqDataBuffer Data buffer to which DREQ is to be written
* \param bufferLength Length of data buffer to which DREQ is to be written
* \param debug Flag for enabling debugging
* \return Number of bytes written to buffer, or -1 in case of error
*/
ssize_t encodeDREQMessage(HeaderType *inputHeader,
ssize_t encodeDREQMessage(MessageHeaderType *inputHeader,
char *dreqDataBuffer,
const size_t bufferLength,
const char debug)
Expand All @@ -29,9 +29,7 @@ ssize_t encodeDREQMessage(HeaderType *inputHeader,
}

// Construct header
inputHeader->messageID = MESSAGE_ID_DREQ;
inputHeader->messageLength = sizeof (DREQData);
DREQData.header = buildISOHeader(inputHeader, debug);
DREQData.header = buildISOHeader(MESSAGE_ID_DREQ, inputHeader, sizeof (DREQData), debug);

if (debug) {
printf("DREQ data: No data in DREQ message, just header and footer\n");
Expand Down
8 changes: 3 additions & 5 deletions src/dres.c
Original file line number Diff line number Diff line change
Expand Up @@ -8,15 +8,15 @@

/*!
* \brief encodeDRESMessage Constructs an ISO DRES message based on specified command
* \param inputHeader data to create header with - Only use transmitterID, receiverID and messageCounter
* \param inputHeader data to create header with
* \param testObjectDiscoveryData Test object discovery data
* \param dresDataBuffer Data buffer to which DRES is to be written
* \param bufferLength Length of data buffer to which DRES is to be written
* \param debug Flag for enabling debugging
* \return Number of bytes written to buffer, or -1 in case of error
*/
ssize_t encodeDRESMessage(
HeaderType *inputHeader,
MessageHeaderType *inputHeader,
const TestObjectDiscoveryType *testObjectDiscoveryData,
char *dresDataBuffer,
const size_t bufferLength,
Expand All @@ -34,9 +34,7 @@ ssize_t encodeDRESMessage(
}

// Construct header
inputHeader->messageID = MESSAGE_ID_DRES;
inputHeader->messageLength = sizeof (DRESData);
DRESData.header = buildISOHeader(inputHeader, debug);
DRESData.header = buildISOHeader(MESSAGE_ID_DRES, inputHeader, sizeof (DRESData), debug);

// Fill contents
DRESData.vendorNameValueID = VALUE_ID_VENDOR_NAME;
Expand Down
8 changes: 3 additions & 5 deletions src/grem.c
Original file line number Diff line number Diff line change
Expand Up @@ -172,15 +172,15 @@ enum ISOMessageReturnValue convertGREMoHostRepresentation(GREMType* GREMdata,
/*!
* \brief encodeGREMMessage Fills a GREM struct with relevant data fields,
* and corresponding value IDs and content lengths
* \param inputHeader data to create header with - Only use transmitterID, receiverID and messageCounter
* \param inputHeader data to create header with
* \param gremObjectData Struct containing relevant GREM data
* \param gremDataBuffer Data buffer to which message is to be printed
* \param bufferLength Available memory in data buffer
* \param debug Flag for enabling debugging
* \return Number of bytes written to buffer, or -1 in case of error
*/
ssize_t encodeGREMMessage(
HeaderType *inputHeader,
MessageHeaderType *inputHeader,
const GeneralResponseMessageType* gremObjectData,
char* gremDataBuffer,
const size_t bufferLength,
Expand All @@ -205,9 +205,7 @@ ssize_t encodeGREMMessage(
}

// Construct header
inputHeader->messageID = MESSAGE_ID_GREM;
inputHeader->messageLength = sizeof (GREMData);
GREMData.header = buildISOHeader(inputHeader, debug);
GREMData.header = buildISOHeader(MESSAGE_ID_GREM, inputHeader, sizeof (GREMData), debug);
memcpy(p, &GREMData.header, sizeof (GREMData.header));
p += sizeof (GREMData.header);
remainingBytes -= sizeof (GREMData.header);
Expand Down
8 changes: 4 additions & 4 deletions src/header.c
Original file line number Diff line number Diff line change
Expand Up @@ -14,17 +14,17 @@
* \param debug Flag for enabling debugging
* \return A struct containing ISO header data
*/
HeaderType buildISOHeader(const HeaderType *input, const char debug) {
HeaderType buildISOHeader(enum ISOMessageID id, const MessageHeaderType *input, uint32_t messageLength, const char debug) {
HeaderType header;

header.syncWord = ISO_SYNC_WORD;
header.transmitterID = input->transmitterID;
header.receiverID = input->receiverID;
header.messageCounter = input->messageCounter;
header.ackReqProtVer = ACK_REQ | ISO_PROTOCOL_VERSION;
if (input->messageLength >= sizeof (HeaderType) + sizeof (FooterType)) {
header.messageID = (uint16_t) input->messageID;
header.messageLength = input->messageLength - sizeof (HeaderType) - sizeof (FooterType);
if (messageLength >= sizeof (HeaderType) + sizeof (FooterType)) {
header.messageID = (uint16_t) id;
header.messageLength = messageLength - sizeof (HeaderType) - sizeof (FooterType);
}
else {
fprintf(stderr, "Supplied message length too small to hold header and footer\n");
Expand Down
8 changes: 3 additions & 5 deletions src/monr.c
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@

/*!
* \brief encodeMONRMessage Constructs an ISO MONR message based on object dynamics data from trajectory file or data generated in a simulator
* \param inputHeader data to create header with - Only use transmitterID, receiverID and messageCounter
* \param inputHeader data to create header
* \param objectTime Time of the object
* \param position Position of the object in relation to test origin (includes heading/yaw)
* \param speed Speed of the object (longitudinal and lateral)
Expand All @@ -21,7 +21,7 @@
* \param debug Flag for enabling of debugging
* \return Value according to ::ISOMessageReturnValue
*/
ssize_t encodeMONRMessage(HeaderType *inputHeader,
ssize_t encodeMONRMessage(MessageHeaderType *inputHeader,
const struct timeval *objectTime, const CartesianPosition position,
const SpeedType speed, const AccelerationType acceleration,
const unsigned char driveDirection, const unsigned char objectState,
Expand All @@ -44,9 +44,7 @@ ssize_t encodeMONRMessage(HeaderType *inputHeader,
}

// Constuct the header
inputHeader->messageID = MESSAGE_ID_MONR;
inputHeader->messageLength = sizeof (MONRData);
MONRData.header = buildISOHeader(inputHeader, debug);
MONRData.header = buildISOHeader(MESSAGE_ID_MONR, inputHeader, sizeof (MONRData), debug);

// Fill contents
MONRData.monrStructValueID = VALUE_ID_MONR_STRUCT;
Expand Down
Loading

0 comments on commit f837bed

Please sign in to comment.