diff --git a/include/message.h b/include/message.h index 8e42ee3..5b0a23a 100644 --- a/include/message.h +++ b/include/message.h @@ -3,14 +3,20 @@ #include #include -#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_INDEX = 6; static const uint8_t PREAMBLE = 0x55; -struct PACKED Header { +PACKED( struct Header { // The preamble marks the start of a message and is always 0x55 uint8_t preamble; @@ -53,13 +59,13 @@ struct PACKED Header { }; }; -}; +}); -struct PACKED Footer { +PACKED( struct Footer { uint16_t crc; -}; +}); -struct PACKED SetSystemLedReq { +PACKED( struct SetSystemLedReq { struct Header header; @@ -88,87 +94,87 @@ struct PACKED SetSystemLedReq { struct Footer footer; -}; +}); -struct PACKED SetSystemLedResp { +PACKED( struct SetSystemLedResp { struct Header header; uint8_t retcode; struct Footer footer; -}; +}); -struct PACKED SubscribeAddNodeReq +PACKED( struct SubscribeAddNodeReq { struct Header header; uint8_t hostbyte; uint32_t sub_vision; // always 0x03000000 struct Footer footer; -}; +}); -struct PACKED SubscribeAddNodeResp +PACKED( struct SubscribeAddNodeResp { struct Header header; uint8_t retcode; // 0x00 or 0x50 are acceptable here uint8_t hostbyte; struct Footer footer; -}; +}); -struct PACKED SubNodeResetReq +PACKED( struct SubNodeResetReq { struct Header header; uint8_t hostbyte; struct Footer footer; -}; +}); -struct PACKED SubNodeResetResp +PACKED( struct SubNodeResetResp { struct Header header; uint8_t retcode; struct Footer footer; -}; +}); -struct PACKED SetRobotModeReq +PACKED( struct SetRobotModeReq { struct Header header; uint8_t mode; struct Footer footer; -}; +}); -struct PACKED SetRobotModeResp +PACKED( struct SetRobotModeResp { struct Header header; uint8_t retcode; struct Footer footer; -}; +}); -struct PACKED ChassisSpeedModeReq +PACKED( struct ChassisSpeedModeReq { struct Header header; float speed[3]; struct Footer footer; -}; +}); -struct PACKED ChassisSpeedModeResp +PACKED( struct ChassisSpeedModeResp { struct Header header; int8_t retcode; struct Footer footer; -}; +}); -struct PACKED SetChassisWheelSpeedReq +PACKED( struct SetChassisWheelSpeedReq { struct Header header; int8_t wheel_speed[4]; struct Footer footer; -}; +}); -struct PACKED SetChassisWheelSpeedResp +PACKED( struct SetChassisWheelSpeedResp { struct Header header; int8_t retcode; struct Footer footer; -}; +}); -struct PACKED GimbalCtrlSpeedReq +PACKED( struct GimbalCtrlSpeedReq { struct Header header; // Values between -360 and 360 @@ -183,53 +189,53 @@ struct PACKED GimbalCtrlSpeedReq // Always 0xDC uint8_t ctrl; struct Footer footer; -}; +}); -struct PACKED GimbalCtrlSpeedResp +PACKED( struct GimbalCtrlSpeedResp { struct Header header; int8_t retcode; struct Footer footer; -}; +}); -struct PACKED SetWheelSpeedReq +PACKED( struct SetWheelSpeedReq { struct Header header; int16_t wheel_speed[4]; struct Footer footer; -}; +}); -struct PACKED SetWheelSpeedResp +PACKED( struct SetWheelSpeedResp { struct Header header; int8_t retcode; struct Footer footer; -}; +}); -struct PACKED SdkHeartbeatReq { +PACKED( struct SdkHeartbeatReq { struct Header header; struct Footer footer; -}; +}); -struct PACKED SdkHeartbeatResp { +PACKED( struct SdkHeartbeatResp { struct Header header; uint8_t retcode; struct Footer footer; -}; +}); -struct PACKED SetSdkModeReq { +PACKED( struct SetSdkModeReq { struct Header header; uint8_t enable; struct Footer footer; -}; +}); -struct PACKED SetSdkModeResp { +PACKED( struct SetSdkModeResp { struct Header header; uint8_t retcode; struct Footer footer; -}; +}); -struct PACKED SetSdkConnectionReq { +PACKED( struct SetSdkConnectionReq { struct Header header; uint8_t control; uint8_t host; @@ -238,32 +244,32 @@ struct PACKED SetSdkConnectionReq { uint32_t ip_address; uint16_t port; struct Footer footer; -}; +}); -struct PACKED SetSdkConnectionResp { +PACKED( struct SetSdkConnectionResp { struct Header header; uint8_t retcode; uint8_t state; uint32_t config_ip; struct Footer footer; -}; +}); -struct PACKED BlasterFireReq { +PACKED( struct BlasterFireReq { struct Header header; struct { uint8_t type : 4; uint8_t times : 4; }; struct Footer footer; -}; +}); -struct PACKED BlasterFireResp { +PACKED( struct BlasterFireResp { struct Header header; uint8_t retcode; struct Footer footer; -}; +}); -struct PACKED StreamCtrlReq { +PACKED( struct StreamCtrlReq { struct Header header; uint8_t ctrl; struct { @@ -272,15 +278,15 @@ struct PACKED StreamCtrlReq { }; uint8_t resolution; struct Footer footer; -}; +}); -struct PACKED StreamCtrlResp { +PACKED( struct StreamCtrlResp { struct Header header; uint8_t retcode; struct Footer footer; -}; +}); -struct PACKED AddSubMsgReq { +PACKED( struct AddSubMsgReq { struct Header header; uint8_t node_id; uint8_t msg_id; @@ -290,9 +296,9 @@ struct PACKED AddSubMsgReq { uint64_t subject_uuid; uint16_t freq; struct Footer footer; -}; +}); -struct PACKED AddSubMsgResp { +PACKED( struct AddSubMsgResp { struct Header header; uint8_t retcode; uint8_t pub_node_id; @@ -300,9 +306,9 @@ struct PACKED AddSubMsgResp { uint8_t ack_msg_id; uint16_t ack_err_uid_data; struct Footer footer; -}; +}); -struct PACKED PushPeriodMsg { +PACKED( struct PushPeriodMsg { struct Header header; uint8_t sub_mode; uint8_t msg_id; @@ -324,7 +330,7 @@ struct PACKED PushPeriodMsg { } gimbal; }; struct Footer footer; -}; +}); union Request { struct Header header;