uavcan.equipment.air_data.RawAirData.h 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198
  1. #pragma once
  2. #include <stdbool.h>
  3. #include <stdint.h>
  4. #include <canard.h>
  5. #define UAVCAN_EQUIPMENT_AIR_DATA_RAWAIRDATA_MAX_SIZE 50
  6. #define UAVCAN_EQUIPMENT_AIR_DATA_RAWAIRDATA_SIGNATURE (0xC77DF38BA122F5DAULL)
  7. #define UAVCAN_EQUIPMENT_AIR_DATA_RAWAIRDATA_ID 1027
  8. #define UAVCAN_EQUIPMENT_AIR_DATA_RAWAIRDATA_FLAG_HEATER_AVAILABLE 1
  9. #define UAVCAN_EQUIPMENT_AIR_DATA_RAWAIRDATA_FLAG_HEATER_WORKING 2
  10. #define UAVCAN_EQUIPMENT_AIR_DATA_RAWAIRDATA_FLAG_HEATER_OVERCURRENT 4
  11. #define UAVCAN_EQUIPMENT_AIR_DATA_RAWAIRDATA_FLAG_HEATER_OPENCIRCUIT 8
  12. #if defined(__cplusplus) && defined(DRONECAN_CXX_WRAPPERS)
  13. class uavcan_equipment_air_data_RawAirData_cxx_iface;
  14. #endif
  15. struct uavcan_equipment_air_data_RawAirData {
  16. #if defined(__cplusplus) && defined(DRONECAN_CXX_WRAPPERS)
  17. using cxx_iface = uavcan_equipment_air_data_RawAirData_cxx_iface;
  18. #endif
  19. uint8_t flags;
  20. float static_pressure;
  21. float differential_pressure;
  22. float static_pressure_sensor_temperature;
  23. float differential_pressure_sensor_temperature;
  24. float static_air_temperature;
  25. float pitot_temperature;
  26. struct { uint8_t len; float data[16]; }covariance;
  27. };
  28. #ifdef __cplusplus
  29. extern "C"
  30. {
  31. #endif
  32. uint32_t _uavcan_equipment_air_data_RawAirData_encode(struct uavcan_equipment_air_data_RawAirData* msg, uint8_t* buffer
  33. #if CANARD_ENABLE_TAO_OPTION
  34. , bool tao
  35. #endif
  36. );
  37. bool _uavcan_equipment_air_data_RawAirData_decode(const CanardRxTransfer* transfer, struct uavcan_equipment_air_data_RawAirData* msg);
  38. static inline uint32_t uavcan_equipment_air_data_RawAirData_encode(struct uavcan_equipment_air_data_RawAirData* msg, uint8_t* buffer
  39. #if CANARD_ENABLE_TAO_OPTION
  40. , bool tao
  41. #endif
  42. ) {
  43. return _uavcan_equipment_air_data_RawAirData_encode(msg, buffer
  44. #if CANARD_ENABLE_TAO_OPTION
  45. , tao
  46. #endif
  47. );
  48. }
  49. static inline bool uavcan_equipment_air_data_RawAirData_decode(const CanardRxTransfer* transfer, struct uavcan_equipment_air_data_RawAirData* msg) {
  50. return _uavcan_equipment_air_data_RawAirData_decode(transfer, msg);
  51. }
  52. #if defined(CANARD_DSDLC_INTERNAL)
  53. static inline void __uavcan_equipment_air_data_RawAirData_encode(uint8_t* buffer, uint32_t* bit_ofs, struct uavcan_equipment_air_data_RawAirData* msg, bool tao);
  54. static inline bool __uavcan_equipment_air_data_RawAirData_decode(const CanardRxTransfer* transfer, uint32_t* bit_ofs, struct uavcan_equipment_air_data_RawAirData* msg, bool tao);
  55. void __uavcan_equipment_air_data_RawAirData_encode(uint8_t* buffer, uint32_t* bit_ofs, struct uavcan_equipment_air_data_RawAirData* msg, bool tao) {
  56. (void)buffer;
  57. (void)bit_ofs;
  58. (void)msg;
  59. (void)tao;
  60. canardEncodeScalar(buffer, *bit_ofs, 8, &msg->flags);
  61. *bit_ofs += 8;
  62. canardEncodeScalar(buffer, *bit_ofs, 32, &msg->static_pressure);
  63. *bit_ofs += 32;
  64. canardEncodeScalar(buffer, *bit_ofs, 32, &msg->differential_pressure);
  65. *bit_ofs += 32;
  66. {
  67. uint16_t float16_val = canardConvertNativeFloatToFloat16(msg->static_pressure_sensor_temperature);
  68. canardEncodeScalar(buffer, *bit_ofs, 16, &float16_val);
  69. }
  70. *bit_ofs += 16;
  71. {
  72. uint16_t float16_val = canardConvertNativeFloatToFloat16(msg->differential_pressure_sensor_temperature);
  73. canardEncodeScalar(buffer, *bit_ofs, 16, &float16_val);
  74. }
  75. *bit_ofs += 16;
  76. {
  77. uint16_t float16_val = canardConvertNativeFloatToFloat16(msg->static_air_temperature);
  78. canardEncodeScalar(buffer, *bit_ofs, 16, &float16_val);
  79. }
  80. *bit_ofs += 16;
  81. {
  82. uint16_t float16_val = canardConvertNativeFloatToFloat16(msg->pitot_temperature);
  83. canardEncodeScalar(buffer, *bit_ofs, 16, &float16_val);
  84. }
  85. *bit_ofs += 16;
  86. #pragma GCC diagnostic push
  87. #pragma GCC diagnostic ignored "-Wtype-limits"
  88. const uint8_t covariance_len = msg->covariance.len > 16 ? 16 : msg->covariance.len;
  89. #pragma GCC diagnostic pop
  90. if (!tao) {
  91. canardEncodeScalar(buffer, *bit_ofs, 5, &covariance_len);
  92. *bit_ofs += 5;
  93. }
  94. for (size_t i=0; i < covariance_len; i++) {
  95. {
  96. uint16_t float16_val = canardConvertNativeFloatToFloat16(msg->covariance.data[i]);
  97. canardEncodeScalar(buffer, *bit_ofs, 16, &float16_val);
  98. }
  99. *bit_ofs += 16;
  100. }
  101. }
  102. /*
  103. decode uavcan_equipment_air_data_RawAirData, return true on failure, false on success
  104. */
  105. bool __uavcan_equipment_air_data_RawAirData_decode(const CanardRxTransfer* transfer, uint32_t* bit_ofs, struct uavcan_equipment_air_data_RawAirData* msg, bool tao) {
  106. (void)transfer;
  107. (void)bit_ofs;
  108. (void)msg;
  109. (void)tao;
  110. canardDecodeScalar(transfer, *bit_ofs, 8, false, &msg->flags);
  111. *bit_ofs += 8;
  112. canardDecodeScalar(transfer, *bit_ofs, 32, true, &msg->static_pressure);
  113. *bit_ofs += 32;
  114. canardDecodeScalar(transfer, *bit_ofs, 32, true, &msg->differential_pressure);
  115. *bit_ofs += 32;
  116. {
  117. uint16_t float16_val;
  118. canardDecodeScalar(transfer, *bit_ofs, 16, true, &float16_val);
  119. msg->static_pressure_sensor_temperature = canardConvertFloat16ToNativeFloat(float16_val);
  120. }
  121. *bit_ofs += 16;
  122. {
  123. uint16_t float16_val;
  124. canardDecodeScalar(transfer, *bit_ofs, 16, true, &float16_val);
  125. msg->differential_pressure_sensor_temperature = canardConvertFloat16ToNativeFloat(float16_val);
  126. }
  127. *bit_ofs += 16;
  128. {
  129. uint16_t float16_val;
  130. canardDecodeScalar(transfer, *bit_ofs, 16, true, &float16_val);
  131. msg->static_air_temperature = canardConvertFloat16ToNativeFloat(float16_val);
  132. }
  133. *bit_ofs += 16;
  134. {
  135. uint16_t float16_val;
  136. canardDecodeScalar(transfer, *bit_ofs, 16, true, &float16_val);
  137. msg->pitot_temperature = canardConvertFloat16ToNativeFloat(float16_val);
  138. }
  139. *bit_ofs += 16;
  140. if (!tao) {
  141. canardDecodeScalar(transfer, *bit_ofs, 5, false, &msg->covariance.len);
  142. *bit_ofs += 5;
  143. } else {
  144. msg->covariance.len = ((transfer->payload_len*8)-*bit_ofs)/16;
  145. }
  146. #pragma GCC diagnostic push
  147. #pragma GCC diagnostic ignored "-Wtype-limits"
  148. if (msg->covariance.len > 16) {
  149. return true; /* invalid value */
  150. }
  151. #pragma GCC diagnostic pop
  152. for (size_t i=0; i < msg->covariance.len; i++) {
  153. {
  154. uint16_t float16_val;
  155. canardDecodeScalar(transfer, *bit_ofs, 16, true, &float16_val);
  156. msg->covariance.data[i] = canardConvertFloat16ToNativeFloat(float16_val);
  157. }
  158. *bit_ofs += 16;
  159. }
  160. return false; /* success */
  161. }
  162. #endif
  163. #ifdef CANARD_DSDLC_TEST_BUILD
  164. struct uavcan_equipment_air_data_RawAirData sample_uavcan_equipment_air_data_RawAirData_msg(void);
  165. #endif
  166. #ifdef __cplusplus
  167. } // extern "C"
  168. #ifdef DRONECAN_CXX_WRAPPERS
  169. #include <canard/cxx_wrappers.h>
  170. BROADCAST_MESSAGE_CXX_IFACE(uavcan_equipment_air_data_RawAirData, UAVCAN_EQUIPMENT_AIR_DATA_RAWAIRDATA_ID, UAVCAN_EQUIPMENT_AIR_DATA_RAWAIRDATA_SIGNATURE, UAVCAN_EQUIPMENT_AIR_DATA_RAWAIRDATA_MAX_SIZE);
  171. #endif
  172. #endif