uavcan.equipment.gnss.Fix.h 8.7 KB

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