uavcan.navigation.GlobalNavigationSolution.h 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255
  1. #pragma once
  2. #include <stdbool.h>
  3. #include <stdint.h>
  4. #include <canard.h>
  5. #include <uavcan.Timestamp.h>
  6. #define UAVCAN_NAVIGATION_GLOBALNAVIGATIONSOLUTION_MAX_SIZE 233
  7. #define UAVCAN_NAVIGATION_GLOBALNAVIGATIONSOLUTION_SIGNATURE (0x463B10CCCBE51C3DULL)
  8. #define UAVCAN_NAVIGATION_GLOBALNAVIGATIONSOLUTION_ID 2000
  9. #if defined(__cplusplus) && defined(DRONECAN_CXX_WRAPPERS)
  10. class uavcan_navigation_GlobalNavigationSolution_cxx_iface;
  11. #endif
  12. struct uavcan_navigation_GlobalNavigationSolution {
  13. #if defined(__cplusplus) && defined(DRONECAN_CXX_WRAPPERS)
  14. using cxx_iface = uavcan_navigation_GlobalNavigationSolution_cxx_iface;
  15. #endif
  16. struct uavcan_Timestamp timestamp;
  17. double longitude;
  18. double latitude;
  19. float height_ellipsoid;
  20. float height_msl;
  21. float height_agl;
  22. float height_baro;
  23. float qnh_hpa;
  24. float orientation_xyzw[4];
  25. struct { uint8_t len; float data[36]; }pose_covariance;
  26. float linear_velocity_body[3];
  27. float angular_velocity_body[3];
  28. float linear_acceleration_body[3];
  29. struct { uint8_t len; float data[36]; }velocity_covariance;
  30. };
  31. #ifdef __cplusplus
  32. extern "C"
  33. {
  34. #endif
  35. uint32_t _uavcan_navigation_GlobalNavigationSolution_encode(struct uavcan_navigation_GlobalNavigationSolution* msg, uint8_t* buffer
  36. #if CANARD_ENABLE_TAO_OPTION
  37. , bool tao
  38. #endif
  39. );
  40. bool _uavcan_navigation_GlobalNavigationSolution_decode(const CanardRxTransfer* transfer, struct uavcan_navigation_GlobalNavigationSolution* msg);
  41. static inline uint32_t uavcan_navigation_GlobalNavigationSolution_encode(struct uavcan_navigation_GlobalNavigationSolution* msg, uint8_t* buffer
  42. #if CANARD_ENABLE_TAO_OPTION
  43. , bool tao
  44. #endif
  45. ) {
  46. return _uavcan_navigation_GlobalNavigationSolution_encode(msg, buffer
  47. #if CANARD_ENABLE_TAO_OPTION
  48. , tao
  49. #endif
  50. );
  51. }
  52. static inline bool uavcan_navigation_GlobalNavigationSolution_decode(const CanardRxTransfer* transfer, struct uavcan_navigation_GlobalNavigationSolution* msg) {
  53. return _uavcan_navigation_GlobalNavigationSolution_decode(transfer, msg);
  54. }
  55. #if defined(CANARD_DSDLC_INTERNAL)
  56. static inline void __uavcan_navigation_GlobalNavigationSolution_encode(uint8_t* buffer, uint32_t* bit_ofs, struct uavcan_navigation_GlobalNavigationSolution* msg, bool tao);
  57. static inline bool __uavcan_navigation_GlobalNavigationSolution_decode(const CanardRxTransfer* transfer, uint32_t* bit_ofs, struct uavcan_navigation_GlobalNavigationSolution* msg, bool tao);
  58. void __uavcan_navigation_GlobalNavigationSolution_encode(uint8_t* buffer, uint32_t* bit_ofs, struct uavcan_navigation_GlobalNavigationSolution* msg, bool tao) {
  59. (void)buffer;
  60. (void)bit_ofs;
  61. (void)msg;
  62. (void)tao;
  63. __uavcan_Timestamp_encode(buffer, bit_ofs, &msg->timestamp, false);
  64. canardEncodeScalar(buffer, *bit_ofs, 64, &msg->longitude);
  65. *bit_ofs += 64;
  66. canardEncodeScalar(buffer, *bit_ofs, 64, &msg->latitude);
  67. *bit_ofs += 64;
  68. canardEncodeScalar(buffer, *bit_ofs, 32, &msg->height_ellipsoid);
  69. *bit_ofs += 32;
  70. canardEncodeScalar(buffer, *bit_ofs, 32, &msg->height_msl);
  71. *bit_ofs += 32;
  72. canardEncodeScalar(buffer, *bit_ofs, 32, &msg->height_agl);
  73. *bit_ofs += 32;
  74. canardEncodeScalar(buffer, *bit_ofs, 32, &msg->height_baro);
  75. *bit_ofs += 32;
  76. {
  77. uint16_t float16_val = canardConvertNativeFloatToFloat16(msg->qnh_hpa);
  78. canardEncodeScalar(buffer, *bit_ofs, 16, &float16_val);
  79. }
  80. *bit_ofs += 16;
  81. for (size_t i=0; i < 4; i++) {
  82. canardEncodeScalar(buffer, *bit_ofs, 32, &msg->orientation_xyzw[i]);
  83. *bit_ofs += 32;
  84. }
  85. #pragma GCC diagnostic push
  86. #pragma GCC diagnostic ignored "-Wtype-limits"
  87. const uint8_t pose_covariance_len = msg->pose_covariance.len > 36 ? 36 : msg->pose_covariance.len;
  88. #pragma GCC diagnostic pop
  89. canardEncodeScalar(buffer, *bit_ofs, 6, &pose_covariance_len);
  90. *bit_ofs += 6;
  91. for (size_t i=0; i < pose_covariance_len; i++) {
  92. {
  93. uint16_t float16_val = canardConvertNativeFloatToFloat16(msg->pose_covariance.data[i]);
  94. canardEncodeScalar(buffer, *bit_ofs, 16, &float16_val);
  95. }
  96. *bit_ofs += 16;
  97. }
  98. for (size_t i=0; i < 3; i++) {
  99. canardEncodeScalar(buffer, *bit_ofs, 32, &msg->linear_velocity_body[i]);
  100. *bit_ofs += 32;
  101. }
  102. for (size_t i=0; i < 3; i++) {
  103. canardEncodeScalar(buffer, *bit_ofs, 32, &msg->angular_velocity_body[i]);
  104. *bit_ofs += 32;
  105. }
  106. for (size_t i=0; i < 3; i++) {
  107. {
  108. uint16_t float16_val = canardConvertNativeFloatToFloat16(msg->linear_acceleration_body[i]);
  109. canardEncodeScalar(buffer, *bit_ofs, 16, &float16_val);
  110. }
  111. *bit_ofs += 16;
  112. }
  113. #pragma GCC diagnostic push
  114. #pragma GCC diagnostic ignored "-Wtype-limits"
  115. const uint8_t velocity_covariance_len = msg->velocity_covariance.len > 36 ? 36 : msg->velocity_covariance.len;
  116. #pragma GCC diagnostic pop
  117. if (!tao) {
  118. canardEncodeScalar(buffer, *bit_ofs, 6, &velocity_covariance_len);
  119. *bit_ofs += 6;
  120. }
  121. for (size_t i=0; i < velocity_covariance_len; i++) {
  122. {
  123. uint16_t float16_val = canardConvertNativeFloatToFloat16(msg->velocity_covariance.data[i]);
  124. canardEncodeScalar(buffer, *bit_ofs, 16, &float16_val);
  125. }
  126. *bit_ofs += 16;
  127. }
  128. }
  129. /*
  130. decode uavcan_navigation_GlobalNavigationSolution, return true on failure, false on success
  131. */
  132. bool __uavcan_navigation_GlobalNavigationSolution_decode(const CanardRxTransfer* transfer, uint32_t* bit_ofs, struct uavcan_navigation_GlobalNavigationSolution* msg, bool tao) {
  133. (void)transfer;
  134. (void)bit_ofs;
  135. (void)msg;
  136. (void)tao;
  137. if (__uavcan_Timestamp_decode(transfer, bit_ofs, &msg->timestamp, false)) {return true;}
  138. canardDecodeScalar(transfer, *bit_ofs, 64, true, &msg->longitude);
  139. *bit_ofs += 64;
  140. canardDecodeScalar(transfer, *bit_ofs, 64, true, &msg->latitude);
  141. *bit_ofs += 64;
  142. canardDecodeScalar(transfer, *bit_ofs, 32, true, &msg->height_ellipsoid);
  143. *bit_ofs += 32;
  144. canardDecodeScalar(transfer, *bit_ofs, 32, true, &msg->height_msl);
  145. *bit_ofs += 32;
  146. canardDecodeScalar(transfer, *bit_ofs, 32, true, &msg->height_agl);
  147. *bit_ofs += 32;
  148. canardDecodeScalar(transfer, *bit_ofs, 32, true, &msg->height_baro);
  149. *bit_ofs += 32;
  150. {
  151. uint16_t float16_val;
  152. canardDecodeScalar(transfer, *bit_ofs, 16, true, &float16_val);
  153. msg->qnh_hpa = canardConvertFloat16ToNativeFloat(float16_val);
  154. }
  155. *bit_ofs += 16;
  156. for (size_t i=0; i < 4; i++) {
  157. canardDecodeScalar(transfer, *bit_ofs, 32, true, &msg->orientation_xyzw[i]);
  158. *bit_ofs += 32;
  159. }
  160. canardDecodeScalar(transfer, *bit_ofs, 6, false, &msg->pose_covariance.len);
  161. *bit_ofs += 6;
  162. #pragma GCC diagnostic push
  163. #pragma GCC diagnostic ignored "-Wtype-limits"
  164. if (msg->pose_covariance.len > 36) {
  165. return true; /* invalid value */
  166. }
  167. #pragma GCC diagnostic pop
  168. for (size_t i=0; i < msg->pose_covariance.len; i++) {
  169. {
  170. uint16_t float16_val;
  171. canardDecodeScalar(transfer, *bit_ofs, 16, true, &float16_val);
  172. msg->pose_covariance.data[i] = canardConvertFloat16ToNativeFloat(float16_val);
  173. }
  174. *bit_ofs += 16;
  175. }
  176. for (size_t i=0; i < 3; i++) {
  177. canardDecodeScalar(transfer, *bit_ofs, 32, true, &msg->linear_velocity_body[i]);
  178. *bit_ofs += 32;
  179. }
  180. for (size_t i=0; i < 3; i++) {
  181. canardDecodeScalar(transfer, *bit_ofs, 32, true, &msg->angular_velocity_body[i]);
  182. *bit_ofs += 32;
  183. }
  184. for (size_t i=0; i < 3; i++) {
  185. {
  186. uint16_t float16_val;
  187. canardDecodeScalar(transfer, *bit_ofs, 16, true, &float16_val);
  188. msg->linear_acceleration_body[i] = canardConvertFloat16ToNativeFloat(float16_val);
  189. }
  190. *bit_ofs += 16;
  191. }
  192. if (!tao) {
  193. canardDecodeScalar(transfer, *bit_ofs, 6, false, &msg->velocity_covariance.len);
  194. *bit_ofs += 6;
  195. } else {
  196. msg->velocity_covariance.len = ((transfer->payload_len*8)-*bit_ofs)/16;
  197. }
  198. #pragma GCC diagnostic push
  199. #pragma GCC diagnostic ignored "-Wtype-limits"
  200. if (msg->velocity_covariance.len > 36) {
  201. return true; /* invalid value */
  202. }
  203. #pragma GCC diagnostic pop
  204. for (size_t i=0; i < msg->velocity_covariance.len; i++) {
  205. {
  206. uint16_t float16_val;
  207. canardDecodeScalar(transfer, *bit_ofs, 16, true, &float16_val);
  208. msg->velocity_covariance.data[i] = canardConvertFloat16ToNativeFloat(float16_val);
  209. }
  210. *bit_ofs += 16;
  211. }
  212. return false; /* success */
  213. }
  214. #endif
  215. #ifdef CANARD_DSDLC_TEST_BUILD
  216. struct uavcan_navigation_GlobalNavigationSolution sample_uavcan_navigation_GlobalNavigationSolution_msg(void);
  217. #endif
  218. #ifdef __cplusplus
  219. } // extern "C"
  220. #ifdef DRONECAN_CXX_WRAPPERS
  221. #include <canard/cxx_wrappers.h>
  222. BROADCAST_MESSAGE_CXX_IFACE(uavcan_navigation_GlobalNavigationSolution, UAVCAN_NAVIGATION_GLOBALNAVIGATIONSOLUTION_ID, UAVCAN_NAVIGATION_GLOBALNAVIGATIONSOLUTION_SIGNATURE, UAVCAN_NAVIGATION_GLOBALNAVIGATIONSOLUTION_MAX_SIZE);
  223. #endif
  224. #endif