uavcan.equipment.power.BatteryInfo.h 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257
  1. #pragma once
  2. #include <stdbool.h>
  3. #include <stdint.h>
  4. #include <canard.h>
  5. #define UAVCAN_EQUIPMENT_POWER_BATTERYINFO_MAX_SIZE 55
  6. #define UAVCAN_EQUIPMENT_POWER_BATTERYINFO_SIGNATURE (0x249C26548A711966ULL)
  7. #define UAVCAN_EQUIPMENT_POWER_BATTERYINFO_ID 1092
  8. #define UAVCAN_EQUIPMENT_POWER_BATTERYINFO_STATUS_FLAG_IN_USE 1
  9. #define UAVCAN_EQUIPMENT_POWER_BATTERYINFO_STATUS_FLAG_CHARGING 2
  10. #define UAVCAN_EQUIPMENT_POWER_BATTERYINFO_STATUS_FLAG_CHARGED 4
  11. #define UAVCAN_EQUIPMENT_POWER_BATTERYINFO_STATUS_FLAG_TEMP_HOT 8
  12. #define UAVCAN_EQUIPMENT_POWER_BATTERYINFO_STATUS_FLAG_TEMP_COLD 16
  13. #define UAVCAN_EQUIPMENT_POWER_BATTERYINFO_STATUS_FLAG_OVERLOAD 32
  14. #define UAVCAN_EQUIPMENT_POWER_BATTERYINFO_STATUS_FLAG_BAD_BATTERY 64
  15. #define UAVCAN_EQUIPMENT_POWER_BATTERYINFO_STATUS_FLAG_NEED_SERVICE 128
  16. #define UAVCAN_EQUIPMENT_POWER_BATTERYINFO_STATUS_FLAG_BMS_ERROR 256
  17. #define UAVCAN_EQUIPMENT_POWER_BATTERYINFO_STATUS_FLAG_RESERVED_A 512
  18. #define UAVCAN_EQUIPMENT_POWER_BATTERYINFO_STATUS_FLAG_RESERVED_B 1024
  19. #define UAVCAN_EQUIPMENT_POWER_BATTERYINFO_STATE_OF_HEALTH_UNKNOWN 127
  20. #define UAVCAN_EQUIPMENT_POWER_BATTERYINFO_STATE_OF_CHARGE_UNKNOWN 127
  21. #if defined(__cplusplus) && defined(DRONECAN_CXX_WRAPPERS)
  22. class uavcan_equipment_power_BatteryInfo_cxx_iface;
  23. #endif
  24. struct uavcan_equipment_power_BatteryInfo {
  25. #if defined(__cplusplus) && defined(DRONECAN_CXX_WRAPPERS)
  26. using cxx_iface = uavcan_equipment_power_BatteryInfo_cxx_iface;
  27. #endif
  28. float temperature;
  29. float voltage;
  30. float current;
  31. float average_power_10sec;
  32. float remaining_capacity_wh;
  33. float full_charge_capacity_wh;
  34. float hours_to_full_charge;
  35. uint16_t status_flags;
  36. uint8_t state_of_health_pct;
  37. uint8_t state_of_charge_pct;
  38. uint8_t state_of_charge_pct_stdev;
  39. uint8_t battery_id;
  40. uint32_t model_instance_id;
  41. struct { uint8_t len; uint8_t data[31]; }model_name;
  42. };
  43. #ifdef __cplusplus
  44. extern "C"
  45. {
  46. #endif
  47. uint32_t _uavcan_equipment_power_BatteryInfo_encode(struct uavcan_equipment_power_BatteryInfo* msg, uint8_t* buffer
  48. #if CANARD_ENABLE_TAO_OPTION
  49. , bool tao
  50. #endif
  51. );
  52. bool _uavcan_equipment_power_BatteryInfo_decode(const CanardRxTransfer* transfer, struct uavcan_equipment_power_BatteryInfo* msg);
  53. static inline uint32_t uavcan_equipment_power_BatteryInfo_encode(struct uavcan_equipment_power_BatteryInfo* msg, uint8_t* buffer
  54. #if CANARD_ENABLE_TAO_OPTION
  55. , bool tao
  56. #endif
  57. ) {
  58. return _uavcan_equipment_power_BatteryInfo_encode(msg, buffer
  59. #if CANARD_ENABLE_TAO_OPTION
  60. , tao
  61. #endif
  62. );
  63. }
  64. static inline bool uavcan_equipment_power_BatteryInfo_decode(const CanardRxTransfer* transfer, struct uavcan_equipment_power_BatteryInfo* msg) {
  65. return _uavcan_equipment_power_BatteryInfo_decode(transfer, msg);
  66. }
  67. #if defined(CANARD_DSDLC_INTERNAL)
  68. static inline void __uavcan_equipment_power_BatteryInfo_encode(uint8_t* buffer, uint32_t* bit_ofs, struct uavcan_equipment_power_BatteryInfo* msg, bool tao);
  69. static inline bool __uavcan_equipment_power_BatteryInfo_decode(const CanardRxTransfer* transfer, uint32_t* bit_ofs, struct uavcan_equipment_power_BatteryInfo* msg, bool tao);
  70. void __uavcan_equipment_power_BatteryInfo_encode(uint8_t* buffer, uint32_t* bit_ofs, struct uavcan_equipment_power_BatteryInfo* msg, bool tao) {
  71. (void)buffer;
  72. (void)bit_ofs;
  73. (void)msg;
  74. (void)tao;
  75. {
  76. uint16_t float16_val = canardConvertNativeFloatToFloat16(msg->temperature);
  77. canardEncodeScalar(buffer, *bit_ofs, 16, &float16_val);
  78. }
  79. *bit_ofs += 16;
  80. {
  81. uint16_t float16_val = canardConvertNativeFloatToFloat16(msg->voltage);
  82. canardEncodeScalar(buffer, *bit_ofs, 16, &float16_val);
  83. }
  84. *bit_ofs += 16;
  85. {
  86. uint16_t float16_val = canardConvertNativeFloatToFloat16(msg->current);
  87. canardEncodeScalar(buffer, *bit_ofs, 16, &float16_val);
  88. }
  89. *bit_ofs += 16;
  90. {
  91. uint16_t float16_val = canardConvertNativeFloatToFloat16(msg->average_power_10sec);
  92. canardEncodeScalar(buffer, *bit_ofs, 16, &float16_val);
  93. }
  94. *bit_ofs += 16;
  95. {
  96. uint16_t float16_val = canardConvertNativeFloatToFloat16(msg->remaining_capacity_wh);
  97. canardEncodeScalar(buffer, *bit_ofs, 16, &float16_val);
  98. }
  99. *bit_ofs += 16;
  100. {
  101. uint16_t float16_val = canardConvertNativeFloatToFloat16(msg->full_charge_capacity_wh);
  102. canardEncodeScalar(buffer, *bit_ofs, 16, &float16_val);
  103. }
  104. *bit_ofs += 16;
  105. {
  106. uint16_t float16_val = canardConvertNativeFloatToFloat16(msg->hours_to_full_charge);
  107. canardEncodeScalar(buffer, *bit_ofs, 16, &float16_val);
  108. }
  109. *bit_ofs += 16;
  110. canardEncodeScalar(buffer, *bit_ofs, 11, &msg->status_flags);
  111. *bit_ofs += 11;
  112. canardEncodeScalar(buffer, *bit_ofs, 7, &msg->state_of_health_pct);
  113. *bit_ofs += 7;
  114. canardEncodeScalar(buffer, *bit_ofs, 7, &msg->state_of_charge_pct);
  115. *bit_ofs += 7;
  116. canardEncodeScalar(buffer, *bit_ofs, 7, &msg->state_of_charge_pct_stdev);
  117. *bit_ofs += 7;
  118. canardEncodeScalar(buffer, *bit_ofs, 8, &msg->battery_id);
  119. *bit_ofs += 8;
  120. canardEncodeScalar(buffer, *bit_ofs, 32, &msg->model_instance_id);
  121. *bit_ofs += 32;
  122. #pragma GCC diagnostic push
  123. #pragma GCC diagnostic ignored "-Wtype-limits"
  124. const uint8_t model_name_len = msg->model_name.len > 31 ? 31 : msg->model_name.len;
  125. #pragma GCC diagnostic pop
  126. if (!tao) {
  127. canardEncodeScalar(buffer, *bit_ofs, 5, &model_name_len);
  128. *bit_ofs += 5;
  129. }
  130. for (size_t i=0; i < model_name_len; i++) {
  131. canardEncodeScalar(buffer, *bit_ofs, 8, &msg->model_name.data[i]);
  132. *bit_ofs += 8;
  133. }
  134. }
  135. /*
  136. decode uavcan_equipment_power_BatteryInfo, return true on failure, false on success
  137. */
  138. bool __uavcan_equipment_power_BatteryInfo_decode(const CanardRxTransfer* transfer, uint32_t* bit_ofs, struct uavcan_equipment_power_BatteryInfo* msg, bool tao) {
  139. (void)transfer;
  140. (void)bit_ofs;
  141. (void)msg;
  142. (void)tao;
  143. {
  144. uint16_t float16_val;
  145. canardDecodeScalar(transfer, *bit_ofs, 16, true, &float16_val);
  146. msg->temperature = canardConvertFloat16ToNativeFloat(float16_val);
  147. }
  148. *bit_ofs += 16;
  149. {
  150. uint16_t float16_val;
  151. canardDecodeScalar(transfer, *bit_ofs, 16, true, &float16_val);
  152. msg->voltage = canardConvertFloat16ToNativeFloat(float16_val);
  153. }
  154. *bit_ofs += 16;
  155. {
  156. uint16_t float16_val;
  157. canardDecodeScalar(transfer, *bit_ofs, 16, true, &float16_val);
  158. msg->current = canardConvertFloat16ToNativeFloat(float16_val);
  159. }
  160. *bit_ofs += 16;
  161. {
  162. uint16_t float16_val;
  163. canardDecodeScalar(transfer, *bit_ofs, 16, true, &float16_val);
  164. msg->average_power_10sec = canardConvertFloat16ToNativeFloat(float16_val);
  165. }
  166. *bit_ofs += 16;
  167. {
  168. uint16_t float16_val;
  169. canardDecodeScalar(transfer, *bit_ofs, 16, true, &float16_val);
  170. msg->remaining_capacity_wh = canardConvertFloat16ToNativeFloat(float16_val);
  171. }
  172. *bit_ofs += 16;
  173. {
  174. uint16_t float16_val;
  175. canardDecodeScalar(transfer, *bit_ofs, 16, true, &float16_val);
  176. msg->full_charge_capacity_wh = canardConvertFloat16ToNativeFloat(float16_val);
  177. }
  178. *bit_ofs += 16;
  179. {
  180. uint16_t float16_val;
  181. canardDecodeScalar(transfer, *bit_ofs, 16, true, &float16_val);
  182. msg->hours_to_full_charge = canardConvertFloat16ToNativeFloat(float16_val);
  183. }
  184. *bit_ofs += 16;
  185. canardDecodeScalar(transfer, *bit_ofs, 11, false, &msg->status_flags);
  186. *bit_ofs += 11;
  187. canardDecodeScalar(transfer, *bit_ofs, 7, false, &msg->state_of_health_pct);
  188. *bit_ofs += 7;
  189. canardDecodeScalar(transfer, *bit_ofs, 7, false, &msg->state_of_charge_pct);
  190. *bit_ofs += 7;
  191. canardDecodeScalar(transfer, *bit_ofs, 7, false, &msg->state_of_charge_pct_stdev);
  192. *bit_ofs += 7;
  193. canardDecodeScalar(transfer, *bit_ofs, 8, false, &msg->battery_id);
  194. *bit_ofs += 8;
  195. canardDecodeScalar(transfer, *bit_ofs, 32, false, &msg->model_instance_id);
  196. *bit_ofs += 32;
  197. if (!tao) {
  198. canardDecodeScalar(transfer, *bit_ofs, 5, false, &msg->model_name.len);
  199. *bit_ofs += 5;
  200. } else {
  201. msg->model_name.len = ((transfer->payload_len*8)-*bit_ofs)/8;
  202. }
  203. #pragma GCC diagnostic push
  204. #pragma GCC diagnostic ignored "-Wtype-limits"
  205. if (msg->model_name.len > 31) {
  206. return true; /* invalid value */
  207. }
  208. #pragma GCC diagnostic pop
  209. for (size_t i=0; i < msg->model_name.len; i++) {
  210. canardDecodeScalar(transfer, *bit_ofs, 8, false, &msg->model_name.data[i]);
  211. *bit_ofs += 8;
  212. }
  213. return false; /* success */
  214. }
  215. #endif
  216. #ifdef CANARD_DSDLC_TEST_BUILD
  217. struct uavcan_equipment_power_BatteryInfo sample_uavcan_equipment_power_BatteryInfo_msg(void);
  218. #endif
  219. #ifdef __cplusplus
  220. } // extern "C"
  221. #ifdef DRONECAN_CXX_WRAPPERS
  222. #include <canard/cxx_wrappers.h>
  223. BROADCAST_MESSAGE_CXX_IFACE(uavcan_equipment_power_BatteryInfo, UAVCAN_EQUIPMENT_POWER_BATTERYINFO_ID, UAVCAN_EQUIPMENT_POWER_BATTERYINFO_SIGNATURE, UAVCAN_EQUIPMENT_POWER_BATTERYINFO_MAX_SIZE);
  224. #endif
  225. #endif