You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

114 lines
5.3 KiB

/****************************************************************************
* Copyright (c) 2025 PX4 Development Team.
* SPDX-License-Identifier: BSD-3-Clause
****************************************************************************/
#pragma once
// Translate BatteryStatus v0 <--> v1
#include <px4_msgs_old/msg/battery_status_v0.hpp>
#include <px4_msgs/msg/battery_status.hpp>
class BatteryStatusV1Translation {
public:
using MessageOlder = px4_msgs_old::msg::BatteryStatusV0;
static_assert(MessageOlder::MESSAGE_VERSION == 0);
using MessageNewer = px4_msgs::msg::BatteryStatus;
static_assert(MessageNewer::MESSAGE_VERSION == 1);
static constexpr const char* kTopic = "fmu/out/battery_status";
static void fromOlder(const MessageOlder &msg_older, MessageNewer &msg_newer) {
msg_newer.timestamp = msg_older.timestamp;
msg_newer.connected = msg_older.connected;
msg_newer.voltage_v = msg_older.voltage_v;
msg_newer.current_a = msg_older.current_a;
msg_newer.current_average_a = msg_older.current_average_a;
msg_newer.discharged_mah = msg_older.discharged_mah;
msg_newer.remaining = msg_older.remaining;
msg_newer.scale = msg_older.scale;
msg_newer.time_remaining_s = msg_older.time_remaining_s;
msg_newer.temperature = msg_older.temperature;
msg_newer.cell_count = msg_older.cell_count;
msg_newer.source = msg_older.source;
msg_newer.priority = msg_older.priority;
msg_newer.capacity = msg_older.capacity;
msg_newer.cycle_count = msg_older.cycle_count;
msg_newer.average_time_to_empty = msg_older.average_time_to_empty;
// The serial number moved to the battery_info message and is char[32] instead of uint16
msg_newer.manufacture_date = msg_older.manufacture_date;
msg_newer.state_of_health = msg_older.state_of_health;
msg_newer.max_error = msg_older.max_error;
msg_newer.id = msg_older.id;
msg_newer.interface_error = msg_older.interface_error;
for (int i = 0; i < 14; ++i) {
msg_newer.voltage_cell_v[i] = msg_older.voltage_cell_v[i];
}
msg_newer.max_cell_voltage_delta = msg_older.max_cell_voltage_delta;
msg_newer.is_powering_off = msg_older.is_powering_off;
msg_newer.is_required = msg_older.is_required;
msg_newer.warning = msg_older.warning;
msg_newer.faults = msg_older.faults;
msg_newer.full_charge_capacity_wh = msg_older.full_charge_capacity_wh;
msg_newer.remaining_capacity_wh = msg_older.remaining_capacity_wh;
msg_newer.over_discharge_count = msg_older.over_discharge_count;
msg_newer.nominal_voltage = msg_older.nominal_voltage;
msg_newer.internal_resistance_estimate = msg_older.internal_resistance_estimate;
msg_newer.ocv_estimate = msg_older.ocv_estimate;
msg_newer.ocv_estimate_filtered = msg_older.ocv_estimate_filtered;
msg_newer.volt_based_soc_estimate = msg_older.volt_based_soc_estimate;
msg_newer.voltage_prediction = msg_older.voltage_prediction;
msg_newer.prediction_error = msg_older.prediction_error;
msg_newer.estimation_covariance_norm = msg_older.estimation_covariance_norm;
}
static void toOlder(const MessageNewer &msg_newer, MessageOlder &msg_older) {
msg_older.timestamp = msg_newer.timestamp;
msg_older.connected = msg_newer.connected;
msg_older.voltage_v = msg_newer.voltage_v;
msg_older.current_a = msg_newer.current_a;
msg_older.current_average_a = msg_newer.current_average_a;
msg_older.discharged_mah = msg_newer.discharged_mah;
msg_older.remaining = msg_newer.remaining;
msg_older.scale = msg_newer.scale;
msg_older.time_remaining_s = msg_newer.time_remaining_s;
msg_older.temperature = msg_newer.temperature;
msg_older.cell_count = msg_newer.cell_count;
msg_older.source = msg_newer.source;
msg_older.priority = msg_newer.priority;
msg_older.capacity = msg_newer.capacity;
msg_older.cycle_count = msg_newer.cycle_count;
msg_older.average_time_to_empty = msg_newer.average_time_to_empty;
msg_older.serial_number = 0; // The serial number moved to the battery_info message and is char[32] instead of uint16
msg_older.manufacture_date = msg_newer.manufacture_date;
msg_older.state_of_health = msg_newer.state_of_health;
msg_older.max_error = msg_newer.max_error;
msg_older.id = msg_newer.id;
msg_older.interface_error = msg_newer.interface_error;
for (int i = 0; i < 14; ++i) {
msg_older.voltage_cell_v[i] = msg_newer.voltage_cell_v[i];
}
msg_older.max_cell_voltage_delta = msg_newer.max_cell_voltage_delta;
msg_older.is_powering_off = msg_newer.is_powering_off;
msg_older.is_required = msg_newer.is_required;
msg_older.warning = msg_newer.warning;
msg_older.faults = msg_newer.faults;
msg_older.full_charge_capacity_wh = msg_newer.full_charge_capacity_wh;
msg_older.remaining_capacity_wh = msg_newer.remaining_capacity_wh;
msg_older.over_discharge_count = msg_newer.over_discharge_count;
msg_older.nominal_voltage = msg_newer.nominal_voltage;
msg_older.internal_resistance_estimate = msg_newer.internal_resistance_estimate;
msg_older.ocv_estimate = msg_newer.ocv_estimate;
msg_older.ocv_estimate_filtered = msg_newer.ocv_estimate_filtered;
msg_older.volt_based_soc_estimate = msg_newer.volt_based_soc_estimate;
msg_older.voltage_prediction = msg_newer.voltage_prediction;
msg_older.prediction_error = msg_newer.prediction_error;
msg_older.estimation_covariance_norm = msg_newer.estimation_covariance_norm;
}
};
REGISTER_TOPIC_TRANSLATION_DIRECT(BatteryStatusV1Translation);