/* * UAVCAN data structure definition for libcanard. * * Autogenerated, do not edit. * * Source file: /home/benjamin/Nextcloud/Dokument/ARM/STM_Eclipse/BLDC_4_ChibiOS/libcanard/dsdl/definitions/vesc/20601.RTData.uavcan */ #include "vesc/RTData.h" #include "canard.h" #ifndef CANARD_INTERNAL_SATURATE #define CANARD_INTERNAL_SATURATE(x, max) ( ((x) > max) ? max : ( (-(x) > max) ? (-max) : (x) ) ); #endif #ifndef CANARD_INTERNAL_SATURATE_UNSIGNED #define CANARD_INTERNAL_SATURATE_UNSIGNED(x, max) ( ((x) >= max) ? max : (x) ); #endif #if defined(__GNUC__) # define CANARD_MAYBE_UNUSED(x) x __attribute__((unused)) #else # define CANARD_MAYBE_UNUSED(x) x #endif /** * @brief vesc_RTData_encode_internal * @param source : pointer to source data struct * @param msg_buf: pointer to msg storage * @param offset: bit offset to msg storage * @param root_item: for detecting if TAO should be used * @retval returns offset */ uint32_t vesc_RTData_encode_internal(vesc_RTData* source, void* msg_buf, uint32_t offset, uint8_t CANARD_MAYBE_UNUSED(root_item), bool tao_enabled) { (void)tao_enabled; #ifndef CANARD_USE_FLOAT16_CAST uint16_t tmp_float = 0; #else CANARD_USE_FLOAT16_CAST tmp_float = 0; #endif // float16 special handling #ifndef CANARD_USE_FLOAT16_CAST tmp_float = canardConvertNativeFloatToFloat16(source->volt_in); #else tmp_float = (CANARD_USE_FLOAT16_CAST)source->volt_in; #endif canardEncodeScalar(msg_buf, offset, 16, (void*)&tmp_float); // 32767 offset += 16; // float16 special handling #ifndef CANARD_USE_FLOAT16_CAST tmp_float = canardConvertNativeFloatToFloat16(source->volt_d); #else tmp_float = (CANARD_USE_FLOAT16_CAST)source->volt_d; #endif canardEncodeScalar(msg_buf, offset, 16, (void*)&tmp_float); // 32767 offset += 16; // float16 special handling #ifndef CANARD_USE_FLOAT16_CAST tmp_float = canardConvertNativeFloatToFloat16(source->volt_q); #else tmp_float = (CANARD_USE_FLOAT16_CAST)source->volt_q; #endif canardEncodeScalar(msg_buf, offset, 16, (void*)&tmp_float); // 32767 offset += 16; // float16 special handling #ifndef CANARD_USE_FLOAT16_CAST tmp_float = canardConvertNativeFloatToFloat16(source->temp_mos_max); #else tmp_float = (CANARD_USE_FLOAT16_CAST)source->temp_mos_max; #endif canardEncodeScalar(msg_buf, offset, 16, (void*)&tmp_float); // 32767 offset += 16; // float16 special handling #ifndef CANARD_USE_FLOAT16_CAST tmp_float = canardConvertNativeFloatToFloat16(source->temp_mos_1); #else tmp_float = (CANARD_USE_FLOAT16_CAST)source->temp_mos_1; #endif canardEncodeScalar(msg_buf, offset, 16, (void*)&tmp_float); // 32767 offset += 16; // float16 special handling #ifndef CANARD_USE_FLOAT16_CAST tmp_float = canardConvertNativeFloatToFloat16(source->temp_mos_2); #else tmp_float = (CANARD_USE_FLOAT16_CAST)source->temp_mos_2; #endif canardEncodeScalar(msg_buf, offset, 16, (void*)&tmp_float); // 32767 offset += 16; // float16 special handling #ifndef CANARD_USE_FLOAT16_CAST tmp_float = canardConvertNativeFloatToFloat16(source->temp_mos_3); #else tmp_float = (CANARD_USE_FLOAT16_CAST)source->temp_mos_3; #endif canardEncodeScalar(msg_buf, offset, 16, (void*)&tmp_float); // 32767 offset += 16; // float16 special handling #ifndef CANARD_USE_FLOAT16_CAST tmp_float = canardConvertNativeFloatToFloat16(source->temp_motor_max); #else tmp_float = (CANARD_USE_FLOAT16_CAST)source->temp_motor_max; #endif canardEncodeScalar(msg_buf, offset, 16, (void*)&tmp_float); // 32767 offset += 16; // float16 special handling #ifndef CANARD_USE_FLOAT16_CAST tmp_float = canardConvertNativeFloatToFloat16(source->temp_motor_1); #else tmp_float = (CANARD_USE_FLOAT16_CAST)source->temp_motor_1; #endif canardEncodeScalar(msg_buf, offset, 16, (void*)&tmp_float); // 32767 offset += 16; // float16 special handling #ifndef CANARD_USE_FLOAT16_CAST tmp_float = canardConvertNativeFloatToFloat16(source->temp_motor_2); #else tmp_float = (CANARD_USE_FLOAT16_CAST)source->temp_motor_2; #endif canardEncodeScalar(msg_buf, offset, 16, (void*)&tmp_float); // 32767 offset += 16; // float16 special handling #ifndef CANARD_USE_FLOAT16_CAST tmp_float = canardConvertNativeFloatToFloat16(source->curr_motor); #else tmp_float = (CANARD_USE_FLOAT16_CAST)source->curr_motor; #endif canardEncodeScalar(msg_buf, offset, 16, (void*)&tmp_float); // 32767 offset += 16; // float16 special handling #ifndef CANARD_USE_FLOAT16_CAST tmp_float = canardConvertNativeFloatToFloat16(source->curr_in); #else tmp_float = (CANARD_USE_FLOAT16_CAST)source->curr_in; #endif canardEncodeScalar(msg_buf, offset, 16, (void*)&tmp_float); // 32767 offset += 16; // float16 special handling #ifndef CANARD_USE_FLOAT16_CAST tmp_float = canardConvertNativeFloatToFloat16(source->curr_d); #else tmp_float = (CANARD_USE_FLOAT16_CAST)source->curr_d; #endif canardEncodeScalar(msg_buf, offset, 16, (void*)&tmp_float); // 32767 offset += 16; // float16 special handling #ifndef CANARD_USE_FLOAT16_CAST tmp_float = canardConvertNativeFloatToFloat16(source->curr_q); #else tmp_float = (CANARD_USE_FLOAT16_CAST)source->curr_q; #endif canardEncodeScalar(msg_buf, offset, 16, (void*)&tmp_float); // 32767 offset += 16; // float16 special handling #ifndef CANARD_USE_FLOAT16_CAST tmp_float = canardConvertNativeFloatToFloat16(source->roll); #else tmp_float = (CANARD_USE_FLOAT16_CAST)source->roll; #endif canardEncodeScalar(msg_buf, offset, 16, (void*)&tmp_float); // 32767 offset += 16; // float16 special handling #ifndef CANARD_USE_FLOAT16_CAST tmp_float = canardConvertNativeFloatToFloat16(source->pitch); #else tmp_float = (CANARD_USE_FLOAT16_CAST)source->pitch; #endif canardEncodeScalar(msg_buf, offset, 16, (void*)&tmp_float); // 32767 offset += 16; // float16 special handling #ifndef CANARD_USE_FLOAT16_CAST tmp_float = canardConvertNativeFloatToFloat16(source->yaw); #else tmp_float = (CANARD_USE_FLOAT16_CAST)source->yaw; #endif canardEncodeScalar(msg_buf, offset, 16, (void*)&tmp_float); // 32767 offset += 16; // float16 special handling #ifndef CANARD_USE_FLOAT16_CAST tmp_float = canardConvertNativeFloatToFloat16(source->acc_x); #else tmp_float = (CANARD_USE_FLOAT16_CAST)source->acc_x; #endif canardEncodeScalar(msg_buf, offset, 16, (void*)&tmp_float); // 32767 offset += 16; // float16 special handling #ifndef CANARD_USE_FLOAT16_CAST tmp_float = canardConvertNativeFloatToFloat16(source->acc_y); #else tmp_float = (CANARD_USE_FLOAT16_CAST)source->acc_y; #endif canardEncodeScalar(msg_buf, offset, 16, (void*)&tmp_float); // 32767 offset += 16; // float16 special handling #ifndef CANARD_USE_FLOAT16_CAST tmp_float = canardConvertNativeFloatToFloat16(source->acc_z); #else tmp_float = (CANARD_USE_FLOAT16_CAST)source->acc_z; #endif canardEncodeScalar(msg_buf, offset, 16, (void*)&tmp_float); // 32767 offset += 16; // float16 special handling #ifndef CANARD_USE_FLOAT16_CAST tmp_float = canardConvertNativeFloatToFloat16(source->gyro_x); #else tmp_float = (CANARD_USE_FLOAT16_CAST)source->gyro_x; #endif canardEncodeScalar(msg_buf, offset, 16, (void*)&tmp_float); // 32767 offset += 16; // float16 special handling #ifndef CANARD_USE_FLOAT16_CAST tmp_float = canardConvertNativeFloatToFloat16(source->gyro_y); #else tmp_float = (CANARD_USE_FLOAT16_CAST)source->gyro_y; #endif canardEncodeScalar(msg_buf, offset, 16, (void*)&tmp_float); // 32767 offset += 16; // float16 special handling #ifndef CANARD_USE_FLOAT16_CAST tmp_float = canardConvertNativeFloatToFloat16(source->gyro_z); #else tmp_float = (CANARD_USE_FLOAT16_CAST)source->gyro_z; #endif canardEncodeScalar(msg_buf, offset, 16, (void*)&tmp_float); // 32767 offset += 16; // float16 special handling #ifndef CANARD_USE_FLOAT16_CAST tmp_float = canardConvertNativeFloatToFloat16(source->erpm); #else tmp_float = (CANARD_USE_FLOAT16_CAST)source->erpm; #endif canardEncodeScalar(msg_buf, offset, 16, (void*)&tmp_float); // 32767 offset += 16; // float16 special handling #ifndef CANARD_USE_FLOAT16_CAST tmp_float = canardConvertNativeFloatToFloat16(source->rpm); #else tmp_float = (CANARD_USE_FLOAT16_CAST)source->rpm; #endif canardEncodeScalar(msg_buf, offset, 16, (void*)&tmp_float); // 32767 offset += 16; // float16 special handling #ifndef CANARD_USE_FLOAT16_CAST tmp_float = canardConvertNativeFloatToFloat16(source->duty); #else tmp_float = (CANARD_USE_FLOAT16_CAST)source->duty; #endif canardEncodeScalar(msg_buf, offset, 16, (void*)&tmp_float); // 32767 offset += 16; // float16 special handling #ifndef CANARD_USE_FLOAT16_CAST tmp_float = canardConvertNativeFloatToFloat16(source->ah_used); #else tmp_float = (CANARD_USE_FLOAT16_CAST)source->ah_used; #endif canardEncodeScalar(msg_buf, offset, 16, (void*)&tmp_float); // 32767 offset += 16; // float16 special handling #ifndef CANARD_USE_FLOAT16_CAST tmp_float = canardConvertNativeFloatToFloat16(source->ah_charged); #else tmp_float = (CANARD_USE_FLOAT16_CAST)source->ah_charged; #endif canardEncodeScalar(msg_buf, offset, 16, (void*)&tmp_float); // 32767 offset += 16; // float16 special handling #ifndef CANARD_USE_FLOAT16_CAST tmp_float = canardConvertNativeFloatToFloat16(source->wh_used); #else tmp_float = (CANARD_USE_FLOAT16_CAST)source->wh_used; #endif canardEncodeScalar(msg_buf, offset, 16, (void*)&tmp_float); // 32767 offset += 16; // float16 special handling #ifndef CANARD_USE_FLOAT16_CAST tmp_float = canardConvertNativeFloatToFloat16(source->wh_charged); #else tmp_float = (CANARD_USE_FLOAT16_CAST)source->wh_charged; #endif canardEncodeScalar(msg_buf, offset, 16, (void*)&tmp_float); // 32767 offset += 16; // float16 special handling #ifndef CANARD_USE_FLOAT16_CAST tmp_float = canardConvertNativeFloatToFloat16(source->encoder_pos); #else tmp_float = (CANARD_USE_FLOAT16_CAST)source->encoder_pos; #endif canardEncodeScalar(msg_buf, offset, 16, (void*)&tmp_float); // 32767 offset += 16; // float16 special handling #ifndef CANARD_USE_FLOAT16_CAST tmp_float = canardConvertNativeFloatToFloat16(source->battery_level); #else tmp_float = (CANARD_USE_FLOAT16_CAST)source->battery_level; #endif canardEncodeScalar(msg_buf, offset, 16, (void*)&tmp_float); // 32767 offset += 16; // float16 special handling #ifndef CANARD_USE_FLOAT16_CAST tmp_float = canardConvertNativeFloatToFloat16(source->battery_wh_tot); #else tmp_float = (CANARD_USE_FLOAT16_CAST)source->battery_wh_tot; #endif canardEncodeScalar(msg_buf, offset, 16, (void*)&tmp_float); // 32767 offset += 16; canardEncodeScalar(msg_buf, offset, 8, (void*)&source->fault_code); // 255 offset += 8; canardEncodeScalar(msg_buf, offset, 8, (void*)&source->vesc_id); // 255 offset += 8; return offset; } /** * @brief vesc_RTData_encode * @param source : Pointer to source data struct * @param msg_buf: Pointer to msg storage * @retval returns message length as bytes */ uint32_t vesc_RTData_encode(vesc_RTData* source, void* msg_buf, bool tao_enabled) { uint32_t offset = 0; offset = vesc_RTData_encode_internal(source, msg_buf, offset, 1, tao_enabled); return (offset + 7 ) / 8; } /** * @brief vesc_RTData_decode_internal * @param transfer: Pointer to CanardRxTransfer transfer * @param payload_len: Payload message length * @param dest: Pointer to destination struct * @param dyn_arr_buf: NULL or Pointer to memory storage to be used for dynamic arrays * vesc_RTData dyn memory will point to dyn_arr_buf memory. * NULL will ignore dynamic arrays decoding. * @param offset: Call with 0, bit offset to msg storage * @retval offset or ERROR value if < 0 */ int32_t vesc_RTData_decode_internal( const CanardRxTransfer* transfer, uint16_t CANARD_MAYBE_UNUSED(payload_len), vesc_RTData* dest, uint8_t** CANARD_MAYBE_UNUSED(dyn_arr_buf), int32_t offset, bool tao_enabled) { (void)tao_enabled; int32_t ret = 0; #ifndef CANARD_USE_FLOAT16_CAST uint16_t tmp_float = 0; #else CANARD_USE_FLOAT16_CAST tmp_float = 0; #endif // float16 special handling ret = canardDecodeScalar(transfer, (uint32_t)offset, 16, false, (void*)&tmp_float); if (ret != 16) { goto vesc_RTData_error_exit; } #ifndef CANARD_USE_FLOAT16_CAST dest->volt_in = canardConvertFloat16ToNativeFloat(tmp_float); #else dest->volt_in = (float)tmp_float; #endif offset += 16; // float16 special handling ret = canardDecodeScalar(transfer, (uint32_t)offset, 16, false, (void*)&tmp_float); if (ret != 16) { goto vesc_RTData_error_exit; } #ifndef CANARD_USE_FLOAT16_CAST dest->volt_d = canardConvertFloat16ToNativeFloat(tmp_float); #else dest->volt_d = (float)tmp_float; #endif offset += 16; // float16 special handling ret = canardDecodeScalar(transfer, (uint32_t)offset, 16, false, (void*)&tmp_float); if (ret != 16) { goto vesc_RTData_error_exit; } #ifndef CANARD_USE_FLOAT16_CAST dest->volt_q = canardConvertFloat16ToNativeFloat(tmp_float); #else dest->volt_q = (float)tmp_float; #endif offset += 16; // float16 special handling ret = canardDecodeScalar(transfer, (uint32_t)offset, 16, false, (void*)&tmp_float); if (ret != 16) { goto vesc_RTData_error_exit; } #ifndef CANARD_USE_FLOAT16_CAST dest->temp_mos_max = canardConvertFloat16ToNativeFloat(tmp_float); #else dest->temp_mos_max = (float)tmp_float; #endif offset += 16; // float16 special handling ret = canardDecodeScalar(transfer, (uint32_t)offset, 16, false, (void*)&tmp_float); if (ret != 16) { goto vesc_RTData_error_exit; } #ifndef CANARD_USE_FLOAT16_CAST dest->temp_mos_1 = canardConvertFloat16ToNativeFloat(tmp_float); #else dest->temp_mos_1 = (float)tmp_float; #endif offset += 16; // float16 special handling ret = canardDecodeScalar(transfer, (uint32_t)offset, 16, false, (void*)&tmp_float); if (ret != 16) { goto vesc_RTData_error_exit; } #ifndef CANARD_USE_FLOAT16_CAST dest->temp_mos_2 = canardConvertFloat16ToNativeFloat(tmp_float); #else dest->temp_mos_2 = (float)tmp_float; #endif offset += 16; // float16 special handling ret = canardDecodeScalar(transfer, (uint32_t)offset, 16, false, (void*)&tmp_float); if (ret != 16) { goto vesc_RTData_error_exit; } #ifndef CANARD_USE_FLOAT16_CAST dest->temp_mos_3 = canardConvertFloat16ToNativeFloat(tmp_float); #else dest->temp_mos_3 = (float)tmp_float; #endif offset += 16; // float16 special handling ret = canardDecodeScalar(transfer, (uint32_t)offset, 16, false, (void*)&tmp_float); if (ret != 16) { goto vesc_RTData_error_exit; } #ifndef CANARD_USE_FLOAT16_CAST dest->temp_motor_max = canardConvertFloat16ToNativeFloat(tmp_float); #else dest->temp_motor_max = (float)tmp_float; #endif offset += 16; // float16 special handling ret = canardDecodeScalar(transfer, (uint32_t)offset, 16, false, (void*)&tmp_float); if (ret != 16) { goto vesc_RTData_error_exit; } #ifndef CANARD_USE_FLOAT16_CAST dest->temp_motor_1 = canardConvertFloat16ToNativeFloat(tmp_float); #else dest->temp_motor_1 = (float)tmp_float; #endif offset += 16; // float16 special handling ret = canardDecodeScalar(transfer, (uint32_t)offset, 16, false, (void*)&tmp_float); if (ret != 16) { goto vesc_RTData_error_exit; } #ifndef CANARD_USE_FLOAT16_CAST dest->temp_motor_2 = canardConvertFloat16ToNativeFloat(tmp_float); #else dest->temp_motor_2 = (float)tmp_float; #endif offset += 16; // float16 special handling ret = canardDecodeScalar(transfer, (uint32_t)offset, 16, false, (void*)&tmp_float); if (ret != 16) { goto vesc_RTData_error_exit; } #ifndef CANARD_USE_FLOAT16_CAST dest->curr_motor = canardConvertFloat16ToNativeFloat(tmp_float); #else dest->curr_motor = (float)tmp_float; #endif offset += 16; // float16 special handling ret = canardDecodeScalar(transfer, (uint32_t)offset, 16, false, (void*)&tmp_float); if (ret != 16) { goto vesc_RTData_error_exit; } #ifndef CANARD_USE_FLOAT16_CAST dest->curr_in = canardConvertFloat16ToNativeFloat(tmp_float); #else dest->curr_in = (float)tmp_float; #endif offset += 16; // float16 special handling ret = canardDecodeScalar(transfer, (uint32_t)offset, 16, false, (void*)&tmp_float); if (ret != 16) { goto vesc_RTData_error_exit; } #ifndef CANARD_USE_FLOAT16_CAST dest->curr_d = canardConvertFloat16ToNativeFloat(tmp_float); #else dest->curr_d = (float)tmp_float; #endif offset += 16; // float16 special handling ret = canardDecodeScalar(transfer, (uint32_t)offset, 16, false, (void*)&tmp_float); if (ret != 16) { goto vesc_RTData_error_exit; } #ifndef CANARD_USE_FLOAT16_CAST dest->curr_q = canardConvertFloat16ToNativeFloat(tmp_float); #else dest->curr_q = (float)tmp_float; #endif offset += 16; // float16 special handling ret = canardDecodeScalar(transfer, (uint32_t)offset, 16, false, (void*)&tmp_float); if (ret != 16) { goto vesc_RTData_error_exit; } #ifndef CANARD_USE_FLOAT16_CAST dest->roll = canardConvertFloat16ToNativeFloat(tmp_float); #else dest->roll = (float)tmp_float; #endif offset += 16; // float16 special handling ret = canardDecodeScalar(transfer, (uint32_t)offset, 16, false, (void*)&tmp_float); if (ret != 16) { goto vesc_RTData_error_exit; } #ifndef CANARD_USE_FLOAT16_CAST dest->pitch = canardConvertFloat16ToNativeFloat(tmp_float); #else dest->pitch = (float)tmp_float; #endif offset += 16; // float16 special handling ret = canardDecodeScalar(transfer, (uint32_t)offset, 16, false, (void*)&tmp_float); if (ret != 16) { goto vesc_RTData_error_exit; } #ifndef CANARD_USE_FLOAT16_CAST dest->yaw = canardConvertFloat16ToNativeFloat(tmp_float); #else dest->yaw = (float)tmp_float; #endif offset += 16; // float16 special handling ret = canardDecodeScalar(transfer, (uint32_t)offset, 16, false, (void*)&tmp_float); if (ret != 16) { goto vesc_RTData_error_exit; } #ifndef CANARD_USE_FLOAT16_CAST dest->acc_x = canardConvertFloat16ToNativeFloat(tmp_float); #else dest->acc_x = (float)tmp_float; #endif offset += 16; // float16 special handling ret = canardDecodeScalar(transfer, (uint32_t)offset, 16, false, (void*)&tmp_float); if (ret != 16) { goto vesc_RTData_error_exit; } #ifndef CANARD_USE_FLOAT16_CAST dest->acc_y = canardConvertFloat16ToNativeFloat(tmp_float); #else dest->acc_y = (float)tmp_float; #endif offset += 16; // float16 special handling ret = canardDecodeScalar(transfer, (uint32_t)offset, 16, false, (void*)&tmp_float); if (ret != 16) { goto vesc_RTData_error_exit; } #ifndef CANARD_USE_FLOAT16_CAST dest->acc_z = canardConvertFloat16ToNativeFloat(tmp_float); #else dest->acc_z = (float)tmp_float; #endif offset += 16; // float16 special handling ret = canardDecodeScalar(transfer, (uint32_t)offset, 16, false, (void*)&tmp_float); if (ret != 16) { goto vesc_RTData_error_exit; } #ifndef CANARD_USE_FLOAT16_CAST dest->gyro_x = canardConvertFloat16ToNativeFloat(tmp_float); #else dest->gyro_x = (float)tmp_float; #endif offset += 16; // float16 special handling ret = canardDecodeScalar(transfer, (uint32_t)offset, 16, false, (void*)&tmp_float); if (ret != 16) { goto vesc_RTData_error_exit; } #ifndef CANARD_USE_FLOAT16_CAST dest->gyro_y = canardConvertFloat16ToNativeFloat(tmp_float); #else dest->gyro_y = (float)tmp_float; #endif offset += 16; // float16 special handling ret = canardDecodeScalar(transfer, (uint32_t)offset, 16, false, (void*)&tmp_float); if (ret != 16) { goto vesc_RTData_error_exit; } #ifndef CANARD_USE_FLOAT16_CAST dest->gyro_z = canardConvertFloat16ToNativeFloat(tmp_float); #else dest->gyro_z = (float)tmp_float; #endif offset += 16; // float16 special handling ret = canardDecodeScalar(transfer, (uint32_t)offset, 16, false, (void*)&tmp_float); if (ret != 16) { goto vesc_RTData_error_exit; } #ifndef CANARD_USE_FLOAT16_CAST dest->erpm = canardConvertFloat16ToNativeFloat(tmp_float); #else dest->erpm = (float)tmp_float; #endif offset += 16; // float16 special handling ret = canardDecodeScalar(transfer, (uint32_t)offset, 16, false, (void*)&tmp_float); if (ret != 16) { goto vesc_RTData_error_exit; } #ifndef CANARD_USE_FLOAT16_CAST dest->rpm = canardConvertFloat16ToNativeFloat(tmp_float); #else dest->rpm = (float)tmp_float; #endif offset += 16; // float16 special handling ret = canardDecodeScalar(transfer, (uint32_t)offset, 16, false, (void*)&tmp_float); if (ret != 16) { goto vesc_RTData_error_exit; } #ifndef CANARD_USE_FLOAT16_CAST dest->duty = canardConvertFloat16ToNativeFloat(tmp_float); #else dest->duty = (float)tmp_float; #endif offset += 16; // float16 special handling ret = canardDecodeScalar(transfer, (uint32_t)offset, 16, false, (void*)&tmp_float); if (ret != 16) { goto vesc_RTData_error_exit; } #ifndef CANARD_USE_FLOAT16_CAST dest->ah_used = canardConvertFloat16ToNativeFloat(tmp_float); #else dest->ah_used = (float)tmp_float; #endif offset += 16; // float16 special handling ret = canardDecodeScalar(transfer, (uint32_t)offset, 16, false, (void*)&tmp_float); if (ret != 16) { goto vesc_RTData_error_exit; } #ifndef CANARD_USE_FLOAT16_CAST dest->ah_charged = canardConvertFloat16ToNativeFloat(tmp_float); #else dest->ah_charged = (float)tmp_float; #endif offset += 16; // float16 special handling ret = canardDecodeScalar(transfer, (uint32_t)offset, 16, false, (void*)&tmp_float); if (ret != 16) { goto vesc_RTData_error_exit; } #ifndef CANARD_USE_FLOAT16_CAST dest->wh_used = canardConvertFloat16ToNativeFloat(tmp_float); #else dest->wh_used = (float)tmp_float; #endif offset += 16; // float16 special handling ret = canardDecodeScalar(transfer, (uint32_t)offset, 16, false, (void*)&tmp_float); if (ret != 16) { goto vesc_RTData_error_exit; } #ifndef CANARD_USE_FLOAT16_CAST dest->wh_charged = canardConvertFloat16ToNativeFloat(tmp_float); #else dest->wh_charged = (float)tmp_float; #endif offset += 16; // float16 special handling ret = canardDecodeScalar(transfer, (uint32_t)offset, 16, false, (void*)&tmp_float); if (ret != 16) { goto vesc_RTData_error_exit; } #ifndef CANARD_USE_FLOAT16_CAST dest->encoder_pos = canardConvertFloat16ToNativeFloat(tmp_float); #else dest->encoder_pos = (float)tmp_float; #endif offset += 16; // float16 special handling ret = canardDecodeScalar(transfer, (uint32_t)offset, 16, false, (void*)&tmp_float); if (ret != 16) { goto vesc_RTData_error_exit; } #ifndef CANARD_USE_FLOAT16_CAST dest->battery_level = canardConvertFloat16ToNativeFloat(tmp_float); #else dest->battery_level = (float)tmp_float; #endif offset += 16; // float16 special handling ret = canardDecodeScalar(transfer, (uint32_t)offset, 16, false, (void*)&tmp_float); if (ret != 16) { goto vesc_RTData_error_exit; } #ifndef CANARD_USE_FLOAT16_CAST dest->battery_wh_tot = canardConvertFloat16ToNativeFloat(tmp_float); #else dest->battery_wh_tot = (float)tmp_float; #endif offset += 16; ret = canardDecodeScalar(transfer, (uint32_t)offset, 8, false, (void*)&dest->fault_code); if (ret != 8) { goto vesc_RTData_error_exit; } offset += 8; ret = canardDecodeScalar(transfer, (uint32_t)offset, 8, false, (void*)&dest->vesc_id); if (ret != 8) { goto vesc_RTData_error_exit; } offset += 8; return offset; vesc_RTData_error_exit: if (ret < 0) { return ret; } else { return -CANARD_ERROR_INTERNAL; } } /** * @brief vesc_RTData_decode * @param transfer: Pointer to CanardRxTransfer transfer * @param payload_len: Payload message length * @param dest: Pointer to destination struct * @param dyn_arr_buf: NULL or Pointer to memory storage to be used for dynamic arrays * vesc_RTData dyn memory will point to dyn_arr_buf memory. * NULL will ignore dynamic arrays decoding. * @retval offset or ERROR value if < 0 */ int32_t vesc_RTData_decode(const CanardRxTransfer* transfer, uint16_t payload_len, vesc_RTData* dest, uint8_t** dyn_arr_buf, bool tao_enabled) { const int32_t offset = 0; int32_t ret = 0; // Clear the destination struct for (uint32_t c = 0; c < sizeof(vesc_RTData); c++) { ((uint8_t*)dest)[c] = 0x00; } ret = vesc_RTData_decode_internal(transfer, payload_len, dest, dyn_arr_buf, offset, tao_enabled); return ret; }