dronecan.remoteid.Location.c 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. #define CANARD_DSDLC_INTERNAL
  2. #include <dronecan.remoteid.Location.h>
  3. #include <string.h>
  4. #ifdef CANARD_DSDLC_TEST_BUILD
  5. #include <test_helpers.h>
  6. #endif
  7. uint32_t dronecan_remoteid_Location_encode(struct dronecan_remoteid_Location* msg, uint8_t* buffer
  8. #if CANARD_ENABLE_TAO_OPTION
  9. , bool tao
  10. #endif
  11. ) {
  12. uint32_t bit_ofs = 0;
  13. memset(buffer, 0, DRONECAN_REMOTEID_LOCATION_MAX_SIZE);
  14. _dronecan_remoteid_Location_encode(buffer, &bit_ofs, msg,
  15. #if CANARD_ENABLE_TAO_OPTION
  16. tao
  17. #else
  18. true
  19. #endif
  20. );
  21. return ((bit_ofs+7)/8);
  22. }
  23. /*
  24. return true if the decode is invalid
  25. */
  26. bool dronecan_remoteid_Location_decode(const CanardRxTransfer* transfer, struct dronecan_remoteid_Location* msg) {
  27. #if CANARD_ENABLE_TAO_OPTION
  28. if (transfer->tao && (transfer->payload_len > DRONECAN_REMOTEID_LOCATION_MAX_SIZE)) {
  29. return true; /* invalid payload length */
  30. }
  31. #endif
  32. uint32_t bit_ofs = 0;
  33. if (_dronecan_remoteid_Location_decode(transfer, &bit_ofs, msg,
  34. #if CANARD_ENABLE_TAO_OPTION
  35. transfer->tao
  36. #else
  37. true
  38. #endif
  39. )) {
  40. return true; /* invalid payload */
  41. }
  42. const uint32_t byte_len = (bit_ofs+7U)/8U;
  43. #if CANARD_ENABLE_TAO_OPTION
  44. // if this could be CANFD then the dlc could indicating more bytes than
  45. // we actually have
  46. if (!transfer->tao) {
  47. return byte_len > transfer->payload_len;
  48. }
  49. #endif
  50. return byte_len != transfer->payload_len;
  51. }
  52. #ifdef CANARD_DSDLC_TEST_BUILD
  53. struct dronecan_remoteid_Location sample_dronecan_remoteid_Location_msg(void) {
  54. struct dronecan_remoteid_Location msg;
  55. msg.id_or_mac.len = (uint8_t)random_range_unsigned_val(0, 20);
  56. for (size_t i=0; i < msg.id_or_mac.len; i++) {
  57. msg.id_or_mac.data[i] = (uint8_t)random_bitlen_unsigned_val(8);
  58. }
  59. msg.status = (uint8_t)random_bitlen_unsigned_val(8);
  60. msg.direction = (uint16_t)random_bitlen_unsigned_val(16);
  61. msg.speed_horizontal = (uint16_t)random_bitlen_unsigned_val(16);
  62. msg.speed_vertical = (int16_t)random_bitlen_signed_val(16);
  63. msg.latitude = (int32_t)random_bitlen_signed_val(32);
  64. msg.longitude = (int32_t)random_bitlen_signed_val(32);
  65. msg.altitude_barometric = random_float_val();
  66. msg.altitude_geodetic = random_float_val();
  67. msg.height_reference = (uint8_t)random_bitlen_unsigned_val(8);
  68. msg.height = random_float_val();
  69. msg.horizontal_accuracy = (uint8_t)random_bitlen_unsigned_val(8);
  70. msg.vertical_accuracy = (uint8_t)random_bitlen_unsigned_val(8);
  71. msg.barometer_accuracy = (uint8_t)random_bitlen_unsigned_val(8);
  72. msg.speed_accuracy = (uint8_t)random_bitlen_unsigned_val(8);
  73. msg.timestamp = random_float_val();
  74. msg.timestamp_accuracy = (uint8_t)random_bitlen_unsigned_val(8);
  75. return msg;
  76. }
  77. #endif