Use ifdef to pack structs differently depending on compiler

windowz
PgSocks 6 months ago
parent c0f2b11db5
commit 58cf57669d

@ -3,14 +3,20 @@
#include <stdbool.h> #include <stdbool.h>
#include <stdint.h> #include <stdint.h>
#define PACKED __attribute__((__packed__)) #if defined(_MSC_VER) // Check if compiling with Microsoft Visual Studio
#define PACKED(__DECL__) __pragma(pack(push, 1)) __DECL__ __pragma(pack(pop))
#elif defined(__GNUC__) // Check if compiling with GCC or any compiler defining __GNUC__, including Clang
#define PACKED(__DECL__) __DECL__ __attribute__((packed))
#else
#error "Unsupported compiler"
#endif
static const uint8_t CLIENT_HOST = 9; static const uint8_t CLIENT_HOST = 9;
static const uint8_t CLIENT_INDEX = 6; static const uint8_t CLIENT_INDEX = 6;
static const uint8_t PREAMBLE = 0x55; static const uint8_t PREAMBLE = 0x55;
struct PACKED Header { PACKED( struct Header {
// The preamble marks the start of a message and is always 0x55 // The preamble marks the start of a message and is always 0x55
uint8_t preamble; uint8_t preamble;
@ -53,13 +59,13 @@ struct PACKED Header {
}; };
}; };
}; });
struct PACKED Footer { PACKED( struct Footer {
uint16_t crc; uint16_t crc;
}; });
struct PACKED SetSystemLedReq { PACKED( struct SetSystemLedReq {
struct Header header; struct Header header;
@ -88,87 +94,87 @@ struct PACKED SetSystemLedReq {
struct Footer footer; struct Footer footer;
}; });
struct PACKED SetSystemLedResp { PACKED( struct SetSystemLedResp {
struct Header header; struct Header header;
uint8_t retcode; uint8_t retcode;
struct Footer footer; struct Footer footer;
}; });
struct PACKED SubscribeAddNodeReq PACKED( struct SubscribeAddNodeReq
{ {
struct Header header; struct Header header;
uint8_t hostbyte; uint8_t hostbyte;
uint32_t sub_vision; // always 0x03000000 uint32_t sub_vision; // always 0x03000000
struct Footer footer; struct Footer footer;
}; });
struct PACKED SubscribeAddNodeResp PACKED( struct SubscribeAddNodeResp
{ {
struct Header header; struct Header header;
uint8_t retcode; // 0x00 or 0x50 are acceptable here uint8_t retcode; // 0x00 or 0x50 are acceptable here
uint8_t hostbyte; uint8_t hostbyte;
struct Footer footer; struct Footer footer;
}; });
struct PACKED SubNodeResetReq PACKED( struct SubNodeResetReq
{ {
struct Header header; struct Header header;
uint8_t hostbyte; uint8_t hostbyte;
struct Footer footer; struct Footer footer;
}; });
struct PACKED SubNodeResetResp PACKED( struct SubNodeResetResp
{ {
struct Header header; struct Header header;
uint8_t retcode; uint8_t retcode;
struct Footer footer; struct Footer footer;
}; });
struct PACKED SetRobotModeReq PACKED( struct SetRobotModeReq
{ {
struct Header header; struct Header header;
uint8_t mode; uint8_t mode;
struct Footer footer; struct Footer footer;
}; });
struct PACKED SetRobotModeResp PACKED( struct SetRobotModeResp
{ {
struct Header header; struct Header header;
uint8_t retcode; uint8_t retcode;
struct Footer footer; struct Footer footer;
}; });
struct PACKED ChassisSpeedModeReq PACKED( struct ChassisSpeedModeReq
{ {
struct Header header; struct Header header;
float speed[3]; float speed[3];
struct Footer footer; struct Footer footer;
}; });
struct PACKED ChassisSpeedModeResp PACKED( struct ChassisSpeedModeResp
{ {
struct Header header; struct Header header;
int8_t retcode; int8_t retcode;
struct Footer footer; struct Footer footer;
}; });
struct PACKED SetChassisWheelSpeedReq PACKED( struct SetChassisWheelSpeedReq
{ {
struct Header header; struct Header header;
int8_t wheel_speed[4]; int8_t wheel_speed[4];
struct Footer footer; struct Footer footer;
}; });
struct PACKED SetChassisWheelSpeedResp PACKED( struct SetChassisWheelSpeedResp
{ {
struct Header header; struct Header header;
int8_t retcode; int8_t retcode;
struct Footer footer; struct Footer footer;
}; });
struct PACKED GimbalCtrlSpeedReq PACKED( struct GimbalCtrlSpeedReq
{ {
struct Header header; struct Header header;
// Values between -360 and 360 // Values between -360 and 360
@ -183,53 +189,53 @@ struct PACKED GimbalCtrlSpeedReq
// Always 0xDC // Always 0xDC
uint8_t ctrl; uint8_t ctrl;
struct Footer footer; struct Footer footer;
}; });
struct PACKED GimbalCtrlSpeedResp PACKED( struct GimbalCtrlSpeedResp
{ {
struct Header header; struct Header header;
int8_t retcode; int8_t retcode;
struct Footer footer; struct Footer footer;
}; });
struct PACKED SetWheelSpeedReq PACKED( struct SetWheelSpeedReq
{ {
struct Header header; struct Header header;
int16_t wheel_speed[4]; int16_t wheel_speed[4];
struct Footer footer; struct Footer footer;
}; });
struct PACKED SetWheelSpeedResp PACKED( struct SetWheelSpeedResp
{ {
struct Header header; struct Header header;
int8_t retcode; int8_t retcode;
struct Footer footer; struct Footer footer;
}; });
struct PACKED SdkHeartbeatReq { PACKED( struct SdkHeartbeatReq {
struct Header header; struct Header header;
struct Footer footer; struct Footer footer;
}; });
struct PACKED SdkHeartbeatResp { PACKED( struct SdkHeartbeatResp {
struct Header header; struct Header header;
uint8_t retcode; uint8_t retcode;
struct Footer footer; struct Footer footer;
}; });
struct PACKED SetSdkModeReq { PACKED( struct SetSdkModeReq {
struct Header header; struct Header header;
uint8_t enable; uint8_t enable;
struct Footer footer; struct Footer footer;
}; });
struct PACKED SetSdkModeResp { PACKED( struct SetSdkModeResp {
struct Header header; struct Header header;
uint8_t retcode; uint8_t retcode;
struct Footer footer; struct Footer footer;
}; });
struct PACKED SetSdkConnectionReq { PACKED( struct SetSdkConnectionReq {
struct Header header; struct Header header;
uint8_t control; uint8_t control;
uint8_t host; uint8_t host;
@ -238,32 +244,32 @@ struct PACKED SetSdkConnectionReq {
uint32_t ip_address; uint32_t ip_address;
uint16_t port; uint16_t port;
struct Footer footer; struct Footer footer;
}; });
struct PACKED SetSdkConnectionResp { PACKED( struct SetSdkConnectionResp {
struct Header header; struct Header header;
uint8_t retcode; uint8_t retcode;
uint8_t state; uint8_t state;
uint32_t config_ip; uint32_t config_ip;
struct Footer footer; struct Footer footer;
}; });
struct PACKED BlasterFireReq { PACKED( struct BlasterFireReq {
struct Header header; struct Header header;
struct { struct {
uint8_t type : 4; uint8_t type : 4;
uint8_t times : 4; uint8_t times : 4;
}; };
struct Footer footer; struct Footer footer;
}; });
struct PACKED BlasterFireResp { PACKED( struct BlasterFireResp {
struct Header header; struct Header header;
uint8_t retcode; uint8_t retcode;
struct Footer footer; struct Footer footer;
}; });
struct PACKED StreamCtrlReq { PACKED( struct StreamCtrlReq {
struct Header header; struct Header header;
uint8_t ctrl; uint8_t ctrl;
struct { struct {
@ -272,15 +278,15 @@ struct PACKED StreamCtrlReq {
}; };
uint8_t resolution; uint8_t resolution;
struct Footer footer; struct Footer footer;
}; });
struct PACKED StreamCtrlResp { PACKED( struct StreamCtrlResp {
struct Header header; struct Header header;
uint8_t retcode; uint8_t retcode;
struct Footer footer; struct Footer footer;
}; });
struct PACKED AddSubMsgReq { PACKED( struct AddSubMsgReq {
struct Header header; struct Header header;
uint8_t node_id; uint8_t node_id;
uint8_t msg_id; uint8_t msg_id;
@ -290,9 +296,9 @@ struct PACKED AddSubMsgReq {
uint64_t subject_uuid; uint64_t subject_uuid;
uint16_t freq; uint16_t freq;
struct Footer footer; struct Footer footer;
}; });
struct PACKED AddSubMsgResp { PACKED( struct AddSubMsgResp {
struct Header header; struct Header header;
uint8_t retcode; uint8_t retcode;
uint8_t pub_node_id; uint8_t pub_node_id;
@ -300,9 +306,9 @@ struct PACKED AddSubMsgResp {
uint8_t ack_msg_id; uint8_t ack_msg_id;
uint16_t ack_err_uid_data; uint16_t ack_err_uid_data;
struct Footer footer; struct Footer footer;
}; });
struct PACKED PushPeriodMsg { PACKED( struct PushPeriodMsg {
struct Header header; struct Header header;
uint8_t sub_mode; uint8_t sub_mode;
uint8_t msg_id; uint8_t msg_id;
@ -324,7 +330,7 @@ struct PACKED PushPeriodMsg {
} gimbal; } gimbal;
}; };
struct Footer footer; struct Footer footer;
}; });
union Request { union Request {
struct Header header; struct Header header;

Loading…
Cancel
Save