uavcan.equipment.gnss.Fix2.h 9.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268
  1. #pragma once
  2. #include <stdbool.h>
  3. #include <stdint.h>
  4. #include <canard.h>
  5. #include <uavcan.Timestamp.h>
  6. #include <uavcan.equipment.gnss.ECEFPositionVelocity.h>
  7. #define UAVCAN_EQUIPMENT_GNSS_FIX2_MAX_SIZE 222
  8. #define UAVCAN_EQUIPMENT_GNSS_FIX2_SIGNATURE (0xCA41E7000F37435FULL)
  9. #define UAVCAN_EQUIPMENT_GNSS_FIX2_ID 1063
  10. #define UAVCAN_EQUIPMENT_GNSS_FIX2_GNSS_TIME_STANDARD_NONE 0
  11. #define UAVCAN_EQUIPMENT_GNSS_FIX2_GNSS_TIME_STANDARD_TAI 1
  12. #define UAVCAN_EQUIPMENT_GNSS_FIX2_GNSS_TIME_STANDARD_UTC 2
  13. #define UAVCAN_EQUIPMENT_GNSS_FIX2_GNSS_TIME_STANDARD_GPS 3
  14. #define UAVCAN_EQUIPMENT_GNSS_FIX2_NUM_LEAP_SECONDS_UNKNOWN 0
  15. #define UAVCAN_EQUIPMENT_GNSS_FIX2_STATUS_NO_FIX 0
  16. #define UAVCAN_EQUIPMENT_GNSS_FIX2_STATUS_TIME_ONLY 1
  17. #define UAVCAN_EQUIPMENT_GNSS_FIX2_STATUS_2D_FIX 2
  18. #define UAVCAN_EQUIPMENT_GNSS_FIX2_STATUS_3D_FIX 3
  19. #define UAVCAN_EQUIPMENT_GNSS_FIX2_MODE_SINGLE 0
  20. #define UAVCAN_EQUIPMENT_GNSS_FIX2_MODE_DGPS 1
  21. #define UAVCAN_EQUIPMENT_GNSS_FIX2_MODE_RTK 2
  22. #define UAVCAN_EQUIPMENT_GNSS_FIX2_MODE_PPP 3
  23. #define UAVCAN_EQUIPMENT_GNSS_FIX2_SUB_MODE_DGPS_OTHER 0
  24. #define UAVCAN_EQUIPMENT_GNSS_FIX2_SUB_MODE_DGPS_SBAS 1
  25. #define UAVCAN_EQUIPMENT_GNSS_FIX2_SUB_MODE_RTK_FLOAT 0
  26. #define UAVCAN_EQUIPMENT_GNSS_FIX2_SUB_MODE_RTK_FIXED 1
  27. #if defined(__cplusplus) && defined(DRONECAN_CXX_WRAPPERS)
  28. class uavcan_equipment_gnss_Fix2_cxx_iface;
  29. #endif
  30. struct uavcan_equipment_gnss_Fix2 {
  31. #if defined(__cplusplus) && defined(DRONECAN_CXX_WRAPPERS)
  32. using cxx_iface = uavcan_equipment_gnss_Fix2_cxx_iface;
  33. #endif
  34. struct uavcan_Timestamp timestamp;
  35. struct uavcan_Timestamp gnss_timestamp;
  36. uint8_t gnss_time_standard;
  37. uint8_t num_leap_seconds;
  38. int64_t longitude_deg_1e8;
  39. int64_t latitude_deg_1e8;
  40. int32_t height_ellipsoid_mm;
  41. int32_t height_msl_mm;
  42. float ned_velocity[3];
  43. uint8_t sats_used;
  44. uint8_t status;
  45. uint8_t mode;
  46. uint8_t sub_mode;
  47. struct { uint8_t len; float data[36]; }covariance;
  48. float pdop;
  49. struct { uint8_t len; struct uavcan_equipment_gnss_ECEFPositionVelocity data[1]; }ecef_position_velocity;
  50. };
  51. #ifdef __cplusplus
  52. extern "C"
  53. {
  54. #endif
  55. uint32_t _uavcan_equipment_gnss_Fix2_encode(struct uavcan_equipment_gnss_Fix2* msg, uint8_t* buffer
  56. #if CANARD_ENABLE_TAO_OPTION
  57. , bool tao
  58. #endif
  59. );
  60. bool _uavcan_equipment_gnss_Fix2_decode(const CanardRxTransfer* transfer, struct uavcan_equipment_gnss_Fix2* msg);
  61. static inline uint32_t uavcan_equipment_gnss_Fix2_encode(struct uavcan_equipment_gnss_Fix2* msg, uint8_t* buffer
  62. #if CANARD_ENABLE_TAO_OPTION
  63. , bool tao
  64. #endif
  65. ) {
  66. return _uavcan_equipment_gnss_Fix2_encode(msg, buffer
  67. #if CANARD_ENABLE_TAO_OPTION
  68. , tao
  69. #endif
  70. );
  71. }
  72. static inline bool uavcan_equipment_gnss_Fix2_decode(const CanardRxTransfer* transfer, struct uavcan_equipment_gnss_Fix2* msg) {
  73. return _uavcan_equipment_gnss_Fix2_decode(transfer, msg);
  74. }
  75. #if defined(CANARD_DSDLC_INTERNAL)
  76. static inline void __uavcan_equipment_gnss_Fix2_encode(uint8_t* buffer, uint32_t* bit_ofs, struct uavcan_equipment_gnss_Fix2* msg, bool tao);
  77. static inline bool __uavcan_equipment_gnss_Fix2_decode(const CanardRxTransfer* transfer, uint32_t* bit_ofs, struct uavcan_equipment_gnss_Fix2* msg, bool tao);
  78. void __uavcan_equipment_gnss_Fix2_encode(uint8_t* buffer, uint32_t* bit_ofs, struct uavcan_equipment_gnss_Fix2* msg, bool tao) {
  79. (void)buffer;
  80. (void)bit_ofs;
  81. (void)msg;
  82. (void)tao;
  83. __uavcan_Timestamp_encode(buffer, bit_ofs, &msg->timestamp, false);
  84. __uavcan_Timestamp_encode(buffer, bit_ofs, &msg->gnss_timestamp, false);
  85. canardEncodeScalar(buffer, *bit_ofs, 3, &msg->gnss_time_standard);
  86. *bit_ofs += 3;
  87. *bit_ofs += 13;
  88. canardEncodeScalar(buffer, *bit_ofs, 8, &msg->num_leap_seconds);
  89. *bit_ofs += 8;
  90. canardEncodeScalar(buffer, *bit_ofs, 37, &msg->longitude_deg_1e8);
  91. *bit_ofs += 37;
  92. canardEncodeScalar(buffer, *bit_ofs, 37, &msg->latitude_deg_1e8);
  93. *bit_ofs += 37;
  94. canardEncodeScalar(buffer, *bit_ofs, 27, &msg->height_ellipsoid_mm);
  95. *bit_ofs += 27;
  96. canardEncodeScalar(buffer, *bit_ofs, 27, &msg->height_msl_mm);
  97. *bit_ofs += 27;
  98. for (size_t i=0; i < 3; i++) {
  99. canardEncodeScalar(buffer, *bit_ofs, 32, &msg->ned_velocity[i]);
  100. *bit_ofs += 32;
  101. }
  102. canardEncodeScalar(buffer, *bit_ofs, 6, &msg->sats_used);
  103. *bit_ofs += 6;
  104. canardEncodeScalar(buffer, *bit_ofs, 2, &msg->status);
  105. *bit_ofs += 2;
  106. canardEncodeScalar(buffer, *bit_ofs, 4, &msg->mode);
  107. *bit_ofs += 4;
  108. canardEncodeScalar(buffer, *bit_ofs, 6, &msg->sub_mode);
  109. *bit_ofs += 6;
  110. #pragma GCC diagnostic push
  111. #pragma GCC diagnostic ignored "-Wtype-limits"
  112. const uint8_t covariance_len = msg->covariance.len > 36 ? 36 : msg->covariance.len;
  113. #pragma GCC diagnostic pop
  114. canardEncodeScalar(buffer, *bit_ofs, 6, &covariance_len);
  115. *bit_ofs += 6;
  116. for (size_t i=0; i < covariance_len; i++) {
  117. {
  118. uint16_t float16_val = canardConvertNativeFloatToFloat16(msg->covariance.data[i]);
  119. canardEncodeScalar(buffer, *bit_ofs, 16, &float16_val);
  120. }
  121. *bit_ofs += 16;
  122. }
  123. {
  124. uint16_t float16_val = canardConvertNativeFloatToFloat16(msg->pdop);
  125. canardEncodeScalar(buffer, *bit_ofs, 16, &float16_val);
  126. }
  127. *bit_ofs += 16;
  128. #pragma GCC diagnostic push
  129. #pragma GCC diagnostic ignored "-Wtype-limits"
  130. const uint8_t ecef_position_velocity_len = msg->ecef_position_velocity.len > 1 ? 1 : msg->ecef_position_velocity.len;
  131. #pragma GCC diagnostic pop
  132. if (!tao) {
  133. canardEncodeScalar(buffer, *bit_ofs, 1, &ecef_position_velocity_len);
  134. *bit_ofs += 1;
  135. }
  136. for (size_t i=0; i < ecef_position_velocity_len; i++) {
  137. __uavcan_equipment_gnss_ECEFPositionVelocity_encode(buffer, bit_ofs, &msg->ecef_position_velocity.data[i], false);
  138. }
  139. }
  140. /*
  141. decode uavcan_equipment_gnss_Fix2, return true on failure, false on success
  142. */
  143. bool __uavcan_equipment_gnss_Fix2_decode(const CanardRxTransfer* transfer, uint32_t* bit_ofs, struct uavcan_equipment_gnss_Fix2* msg, bool tao) {
  144. (void)transfer;
  145. (void)bit_ofs;
  146. (void)msg;
  147. (void)tao;
  148. if (__uavcan_Timestamp_decode(transfer, bit_ofs, &msg->timestamp, false)) {return true;}
  149. if (__uavcan_Timestamp_decode(transfer, bit_ofs, &msg->gnss_timestamp, false)) {return true;}
  150. canardDecodeScalar(transfer, *bit_ofs, 3, false, &msg->gnss_time_standard);
  151. *bit_ofs += 3;
  152. *bit_ofs += 13;
  153. canardDecodeScalar(transfer, *bit_ofs, 8, false, &msg->num_leap_seconds);
  154. *bit_ofs += 8;
  155. canardDecodeScalar(transfer, *bit_ofs, 37, true, &msg->longitude_deg_1e8);
  156. *bit_ofs += 37;
  157. canardDecodeScalar(transfer, *bit_ofs, 37, true, &msg->latitude_deg_1e8);
  158. *bit_ofs += 37;
  159. canardDecodeScalar(transfer, *bit_ofs, 27, true, &msg->height_ellipsoid_mm);
  160. *bit_ofs += 27;
  161. canardDecodeScalar(transfer, *bit_ofs, 27, true, &msg->height_msl_mm);
  162. *bit_ofs += 27;
  163. for (size_t i=0; i < 3; i++) {
  164. canardDecodeScalar(transfer, *bit_ofs, 32, true, &msg->ned_velocity[i]);
  165. *bit_ofs += 32;
  166. }
  167. canardDecodeScalar(transfer, *bit_ofs, 6, false, &msg->sats_used);
  168. *bit_ofs += 6;
  169. canardDecodeScalar(transfer, *bit_ofs, 2, false, &msg->status);
  170. *bit_ofs += 2;
  171. canardDecodeScalar(transfer, *bit_ofs, 4, false, &msg->mode);
  172. *bit_ofs += 4;
  173. canardDecodeScalar(transfer, *bit_ofs, 6, false, &msg->sub_mode);
  174. *bit_ofs += 6;
  175. canardDecodeScalar(transfer, *bit_ofs, 6, false, &msg->covariance.len);
  176. *bit_ofs += 6;
  177. #pragma GCC diagnostic push
  178. #pragma GCC diagnostic ignored "-Wtype-limits"
  179. if (msg->covariance.len > 36) {
  180. return true; /* invalid value */
  181. }
  182. #pragma GCC diagnostic pop
  183. for (size_t i=0; i < msg->covariance.len; i++) {
  184. {
  185. uint16_t float16_val;
  186. canardDecodeScalar(transfer, *bit_ofs, 16, true, &float16_val);
  187. msg->covariance.data[i] = canardConvertFloat16ToNativeFloat(float16_val);
  188. }
  189. *bit_ofs += 16;
  190. }
  191. {
  192. uint16_t float16_val;
  193. canardDecodeScalar(transfer, *bit_ofs, 16, true, &float16_val);
  194. msg->pdop = canardConvertFloat16ToNativeFloat(float16_val);
  195. }
  196. *bit_ofs += 16;
  197. if (!tao) {
  198. canardDecodeScalar(transfer, *bit_ofs, 1, false, &msg->ecef_position_velocity.len);
  199. *bit_ofs += 1;
  200. }
  201. if (tao) {
  202. msg->ecef_position_velocity.len = 0;
  203. size_t max_len = 1;
  204. uint32_t max_bits = (transfer->payload_len*8)-7; // TAO elements must be >= 8 bits
  205. while (max_bits > *bit_ofs) {
  206. if (!max_len-- || __uavcan_equipment_gnss_ECEFPositionVelocity_decode(transfer, bit_ofs, &msg->ecef_position_velocity.data[msg->ecef_position_velocity.len], false)) {return true;}
  207. msg->ecef_position_velocity.len++;
  208. }
  209. } else {
  210. #pragma GCC diagnostic push
  211. #pragma GCC diagnostic ignored "-Wtype-limits"
  212. if (msg->ecef_position_velocity.len > 1) {
  213. return true; /* invalid value */
  214. }
  215. #pragma GCC diagnostic pop
  216. for (size_t i=0; i < msg->ecef_position_velocity.len; i++) {
  217. if (__uavcan_equipment_gnss_ECEFPositionVelocity_decode(transfer, bit_ofs, &msg->ecef_position_velocity.data[i], false)) {return true;}
  218. }
  219. }
  220. return false; /* success */
  221. }
  222. #endif
  223. #ifdef CANARD_DSDLC_TEST_BUILD
  224. struct uavcan_equipment_gnss_Fix2 sample_uavcan_equipment_gnss_Fix2_msg(void);
  225. #endif
  226. #ifdef __cplusplus
  227. } // extern "C"
  228. #ifdef DRONECAN_CXX_WRAPPERS
  229. #include <canard/cxx_wrappers.h>
  230. BROADCAST_MESSAGE_CXX_IFACE(uavcan_equipment_gnss_Fix2, UAVCAN_EQUIPMENT_GNSS_FIX2_ID, UAVCAN_EQUIPMENT_GNSS_FIX2_SIGNATURE, UAVCAN_EQUIPMENT_GNSS_FIX2_MAX_SIZE);
  231. #endif
  232. #endif