diff --git a/conf/airframes/examples/quadrotor_lisa_m_2_pwm_spektrum.xml b/conf/airframes/examples/quadrotor_lisa_m_2_pwm_spektrum.xml
index 253ba6a66d..85cc9eb08b 100644
--- a/conf/airframes/examples/quadrotor_lisa_m_2_pwm_spektrum.xml
+++ b/conf/airframes/examples/quadrotor_lisa_m_2_pwm_spektrum.xml
@@ -216,6 +216,7 @@
+
diff --git a/conf/telemetry/default_rotorcraft.xml b/conf/telemetry/default_rotorcraft.xml
index 0d6b1979df..4fe4699ec6 100644
--- a/conf/telemetry/default_rotorcraft.xml
+++ b/conf/telemetry/default_rotorcraft.xml
@@ -19,6 +19,7 @@
+
diff --git a/sw/airborne/firmwares/fixedwing/autopilot.h b/sw/airborne/firmwares/fixedwing/autopilot.h
index c5b651f7b9..035755af5d 100644
--- a/sw/airborne/firmwares/fixedwing/autopilot.h
+++ b/sw/airborne/firmwares/fixedwing/autopilot.h
@@ -93,8 +93,8 @@ extern uint16_t vsupply;
*/
extern int32_t current; // milliAmpere
-/** Fuel consumption (mAh)
- * TODO: move to electrical subsystem
+/** Energy consumption (mAh)
+ * This is the ap copy of the measurement from fbw
*/
extern float energy;
diff --git a/sw/airborne/firmwares/fixedwing/main_ap.c b/sw/airborne/firmwares/fixedwing/main_ap.c
index 60b0c2d776..fc79f5ee11 100644
--- a/sw/airborne/firmwares/fixedwing/main_ap.c
+++ b/sw/airborne/firmwares/fixedwing/main_ap.c
@@ -420,6 +420,7 @@ static inline void telecommand_task( void ) {
vsupply = fbw_state->vsupply;
current = fbw_state->current;
+ energy = fbw_state->energy;
#ifdef RADIO_CONTROL
if (!autopilot_flight_time) {
@@ -517,7 +518,6 @@ void navigation_task( void ) {
// climb_loop(); //4Hz
}
- energy += ((float)current) / 3600.0f * 0.25f; // mAh = mA * dt (4Hz -> hours)
}
diff --git a/sw/airborne/firmwares/rotorcraft/autopilot.c b/sw/airborne/firmwares/rotorcraft/autopilot.c
index 82f2bd050b..2672c82fb2 100644
--- a/sw/airborne/firmwares/rotorcraft/autopilot.c
+++ b/sw/airborne/firmwares/rotorcraft/autopilot.c
@@ -132,6 +132,14 @@ static void send_status(void) {
&electrical.vsupply, &time_sec);
}
+static void send_energy(void) {
+ const int16_t e = electrical.energy;
+ const float vsup = ((float)electrical.vsupply) / 10.0f;
+ const float curs = ((float)electrical.current) / 1000.0f;
+ const float power = vsup * curs;
+ DOWNLINK_SEND_ENERGY(DefaultChannel, DefaultDevice, &vsup, &curs, &e, &power);
+}
+
static void send_fp(void) {
int32_t carrot_up = -guidance_v_z_sp;
DOWNLINK_SEND_ROTORCRAFT_FP(DefaultChannel, DefaultDevice,
@@ -222,6 +230,7 @@ void autopilot_init(void) {
register_periodic_telemetry(DefaultPeriodic, "ALIVE", send_alive);
register_periodic_telemetry(DefaultPeriodic, "ROTORCRAFT_STATUS", send_status);
+ register_periodic_telemetry(DefaultPeriodic, "ENERGY", send_energy);
register_periodic_telemetry(DefaultPeriodic, "ROTORCRAFT_FP", send_fp);
register_periodic_telemetry(DefaultPeriodic, "ROTORCRAFT_CMD", send_rotorcraft_cmd);
register_periodic_telemetry(DefaultPeriodic, "DL_VALUE", send_dl_value);
diff --git a/sw/airborne/inter_mcu.h b/sw/airborne/inter_mcu.h
index 789bb4dfba..f8f2eb0452 100644
--- a/sw/airborne/inter_mcu.h
+++ b/sw/airborne/inter_mcu.h
@@ -60,6 +60,7 @@ struct fbw_state {
uint8_t nb_err;
uint16_t vsupply; ///< 1e-1 V
int32_t current; ///< milliAmps
+ float energy; ///< mAh
};
struct ap_state {
@@ -123,6 +124,7 @@ static inline void inter_mcu_fill_fbw_state (void) {
fbw_state->vsupply = electrical.vsupply;
fbw_state->current = electrical.current;
+ fbw_state->energy = electrical.energy;
#if defined SINGLE_MCU
/**Directly set the flag indicating to AP that shared buffer is available*/
inter_mcu_received_fbw = TRUE;
diff --git a/sw/airborne/subsystems/electrical.c b/sw/airborne/subsystems/electrical.c
index e7103e8075..20b9552518 100644
--- a/sw/airborne/subsystems/electrical.c
+++ b/sw/airborne/subsystems/electrical.c
@@ -85,6 +85,7 @@ static struct {
void electrical_init(void) {
electrical.vsupply = 0;
electrical.current = 0;
+ electrical.energy = 0;
electrical.bat_low = FALSE;
electrical.bat_critical = FALSE;
@@ -135,6 +136,8 @@ void electrical_periodic(void) {
electrical.current = b - pow((pow(b,electrical_priv.nonlin_factor)-pow((b*x),electrical_priv.nonlin_factor)), (1./electrical_priv.nonlin_factor));
#endif /* ADC_CHANNEL_CURRENT */
+ // mAh = mA * dt (10Hz -> hours)
+ electrical.energy += ((float)electrical.current) / 3600.0f / ELECTRICAL_PERIODIC_FREQ;
if (electrical.vsupply < LOW_BAT_LEVEL * 10) {
if (bat_low_counter > 0)
diff --git a/sw/airborne/subsystems/electrical.h b/sw/airborne/subsystems/electrical.h
index 81d70fbda2..b805949fb8 100644
--- a/sw/airborne/subsystems/electrical.h
+++ b/sw/airborne/subsystems/electrical.h
@@ -48,6 +48,7 @@ struct Electrical {
uint16_t vsupply; ///< supply voltage in decivolts
int32_t current; ///< current in milliamps
int32_t consumed; ///< consumption in mAh
+ float energy; ///< consumed energy in mAh
bool_t bat_low; ///< battery low status
bool_t bat_critical; ///< battery critical status