|
| 1 | +/**************************************************************************** |
| 2 | + * Copyright (c) 2025 PX4 Development Team. |
| 3 | + * SPDX-License-Identifier: BSD-3-Clause |
| 4 | + ****************************************************************************/ |
| 5 | +#pragma once |
| 6 | + |
| 7 | +// Translate BatteryStatus v0 <--> v1 |
| 8 | +#include <px4_msgs_old/msg/battery_status_v0.hpp> |
| 9 | +#include <px4_msgs/msg/battery_status.hpp> |
| 10 | + |
| 11 | +class BatteryStatusV1Translation { |
| 12 | +public: |
| 13 | + using MessageOlder = px4_msgs_old::msg::BatteryStatusV0; |
| 14 | + static_assert(MessageOlder::MESSAGE_VERSION == 0); |
| 15 | + |
| 16 | + using MessageNewer = px4_msgs::msg::BatteryStatus; |
| 17 | + static_assert(MessageNewer::MESSAGE_VERSION == 1); |
| 18 | + |
| 19 | + static constexpr const char* kTopic = "fmu/out/battery_status"; |
| 20 | + |
| 21 | + static void fromOlder(const MessageOlder &msg_older, MessageNewer &msg_newer) { |
| 22 | + msg_newer.timestamp = msg_older.timestamp; |
| 23 | + msg_newer.connected = msg_older.connected; |
| 24 | + msg_newer.voltage_v = msg_older.voltage_v; |
| 25 | + msg_newer.current_a = msg_older.current_a; |
| 26 | + msg_newer.current_average_a = msg_older.current_average_a; |
| 27 | + msg_newer.discharged_mah = msg_older.discharged_mah; |
| 28 | + msg_newer.remaining = msg_older.remaining; |
| 29 | + msg_newer.scale = msg_older.scale; |
| 30 | + msg_newer.time_remaining_s = msg_older.time_remaining_s; |
| 31 | + msg_newer.temperature = msg_older.temperature; |
| 32 | + msg_newer.cell_count = msg_older.cell_count; |
| 33 | + msg_newer.source = msg_older.source; |
| 34 | + msg_newer.priority = msg_older.priority; |
| 35 | + msg_newer.capacity = msg_older.capacity; |
| 36 | + msg_newer.cycle_count = msg_older.cycle_count; |
| 37 | + msg_newer.average_time_to_empty = msg_older.average_time_to_empty; |
| 38 | + // The serial number moved to the battery_info message and is char[32] instead of uint16 |
| 39 | + msg_newer.manufacture_date = msg_older.manufacture_date; |
| 40 | + msg_newer.state_of_health = msg_older.state_of_health; |
| 41 | + msg_newer.max_error = msg_older.max_error; |
| 42 | + msg_newer.id = msg_older.id; |
| 43 | + msg_newer.interface_error = msg_older.interface_error; |
| 44 | + |
| 45 | + for (int i = 0; i < 14; ++i) { |
| 46 | + msg_newer.voltage_cell_v[i] = msg_older.voltage_cell_v[i]; |
| 47 | + } |
| 48 | + |
| 49 | + msg_newer.max_cell_voltage_delta = msg_older.max_cell_voltage_delta; |
| 50 | + msg_newer.is_powering_off = msg_older.is_powering_off; |
| 51 | + msg_newer.is_required = msg_older.is_required; |
| 52 | + msg_newer.warning = msg_older.warning; |
| 53 | + msg_newer.faults = msg_older.faults; |
| 54 | + msg_newer.full_charge_capacity_wh = msg_older.full_charge_capacity_wh; |
| 55 | + msg_newer.remaining_capacity_wh = msg_older.remaining_capacity_wh; |
| 56 | + msg_newer.over_discharge_count = msg_older.over_discharge_count; |
| 57 | + msg_newer.nominal_voltage = msg_older.nominal_voltage; |
| 58 | + msg_newer.internal_resistance_estimate = msg_older.internal_resistance_estimate; |
| 59 | + msg_newer.ocv_estimate = msg_older.ocv_estimate; |
| 60 | + msg_newer.ocv_estimate_filtered = msg_older.ocv_estimate_filtered; |
| 61 | + msg_newer.volt_based_soc_estimate = msg_older.volt_based_soc_estimate; |
| 62 | + msg_newer.voltage_prediction = msg_older.voltage_prediction; |
| 63 | + msg_newer.prediction_error = msg_older.prediction_error; |
| 64 | + msg_newer.estimation_covariance_norm = msg_older.estimation_covariance_norm; |
| 65 | + } |
| 66 | + |
| 67 | + static void toOlder(const MessageNewer &msg_newer, MessageOlder &msg_older) { |
| 68 | + msg_older.timestamp = msg_newer.timestamp; |
| 69 | + msg_older.connected = msg_newer.connected; |
| 70 | + msg_older.voltage_v = msg_newer.voltage_v; |
| 71 | + msg_older.current_a = msg_newer.current_a; |
| 72 | + msg_older.current_average_a = msg_newer.current_average_a; |
| 73 | + msg_older.discharged_mah = msg_newer.discharged_mah; |
| 74 | + msg_older.remaining = msg_newer.remaining; |
| 75 | + msg_older.scale = msg_newer.scale; |
| 76 | + msg_older.time_remaining_s = msg_newer.time_remaining_s; |
| 77 | + msg_older.temperature = msg_newer.temperature; |
| 78 | + msg_older.cell_count = msg_newer.cell_count; |
| 79 | + msg_older.source = msg_newer.source; |
| 80 | + msg_older.priority = msg_newer.priority; |
| 81 | + msg_older.capacity = msg_newer.capacity; |
| 82 | + msg_older.cycle_count = msg_newer.cycle_count; |
| 83 | + msg_older.average_time_to_empty = msg_newer.average_time_to_empty; |
| 84 | + msg_older.serial_number = 0; // The serial number moved to the battery_info message and is char[32] instead of uint16 |
| 85 | + msg_older.manufacture_date = msg_newer.manufacture_date; |
| 86 | + msg_older.state_of_health = msg_newer.state_of_health; |
| 87 | + msg_older.max_error = msg_newer.max_error; |
| 88 | + msg_older.id = msg_newer.id; |
| 89 | + msg_older.interface_error = msg_newer.interface_error; |
| 90 | + |
| 91 | + for (int i = 0; i < 14; ++i) { |
| 92 | + msg_older.voltage_cell_v[i] = msg_newer.voltage_cell_v[i]; |
| 93 | + } |
| 94 | + |
| 95 | + msg_older.max_cell_voltage_delta = msg_newer.max_cell_voltage_delta; |
| 96 | + msg_older.is_powering_off = msg_newer.is_powering_off; |
| 97 | + msg_older.is_required = msg_newer.is_required; |
| 98 | + msg_older.warning = msg_newer.warning; |
| 99 | + msg_older.faults = msg_newer.faults; |
| 100 | + msg_older.full_charge_capacity_wh = msg_newer.full_charge_capacity_wh; |
| 101 | + msg_older.remaining_capacity_wh = msg_newer.remaining_capacity_wh; |
| 102 | + msg_older.over_discharge_count = msg_newer.over_discharge_count; |
| 103 | + msg_older.nominal_voltage = msg_newer.nominal_voltage; |
| 104 | + msg_older.internal_resistance_estimate = msg_newer.internal_resistance_estimate; |
| 105 | + msg_older.ocv_estimate = msg_newer.ocv_estimate; |
| 106 | + msg_older.ocv_estimate_filtered = msg_newer.ocv_estimate_filtered; |
| 107 | + msg_older.volt_based_soc_estimate = msg_newer.volt_based_soc_estimate; |
| 108 | + msg_older.voltage_prediction = msg_newer.voltage_prediction; |
| 109 | + msg_older.prediction_error = msg_newer.prediction_error; |
| 110 | + msg_older.estimation_covariance_norm = msg_newer.estimation_covariance_norm; |
| 111 | + } |
| 112 | +}; |
| 113 | + |
| 114 | +REGISTER_TOPIC_TRANSLATION_DIRECT(BatteryStatusV1Translation); |
0 commit comments