diff --git a/conf/airframes/holiday50.xml b/conf/airframes/holiday50.xml
index bc0ba3414e..d623c5d11a 100644
--- a/conf/airframes/holiday50.xml
+++ b/conf/airframes/holiday50.xml
@@ -57,6 +57,8 @@
+
+
diff --git a/conf/airframes/microjet5.xml b/conf/airframes/microjet5.xml
index b1b5c71a97..5e02cdb86c 100644
--- a/conf/airframes/microjet5.xml
+++ b/conf/airframes/microjet5.xml
@@ -74,7 +74,7 @@
diff --git a/conf/messages.xml b/conf/messages.xml
index a3ace5470e..aa2cfcb891 100644
--- a/conf/messages.xml
+++ b/conf/messages.xml
@@ -314,6 +314,7 @@
+
diff --git a/sw/airborne/fbw_downlink.h b/sw/airborne/fbw_downlink.h
index 18a0938267..424f3cfaf0 100644
--- a/sw/airborne/fbw_downlink.h
+++ b/sw/airborne/fbw_downlink.h
@@ -53,7 +53,7 @@
#define PERIODIC_SEND_COMMANDS() DOWNLINK_SEND_COMMANDS(COMMANDS_NB, commands)
#ifdef RADIO_CONTROL
-#define PERIODIC_SEND_FBW_STATUS() DOWNLINK_SEND_FBW_STATUS(&rc_status, &fbw_mode, &fbw_vsupply_decivolt)
+#define PERIODIC_SEND_FBW_STATUS() DOWNLINK_SEND_FBW_STATUS(&rc_status, &fbw_mode, &fbw_vsupply_decivolt, &fbw_current_milliamp)
#define PERIODIC_SEND_PPM() DOWNLINK_SEND_PPM(&last_ppm_cpt, PPM_NB_PULSES, ppm_pulses)
#define PERIODIC_SEND_RC() DOWNLINK_SEND_RC(PPM_NB_PULSES, rc_values)
#else // RADIO_CONTROL
diff --git a/sw/airborne/inter_mcu.h b/sw/airborne/inter_mcu.h
index 1631ac1d81..0f26719912 100644
--- a/sw/airborne/inter_mcu.h
+++ b/sw/airborne/inter_mcu.h
@@ -55,7 +55,8 @@ struct fbw_state {
#endif
uint8_t status;
uint8_t nb_err;
- uint8_t vsupply; /* 1e-1 V */
+ uint8_t vsupply; /* 1e-1 V */
+ uint16_t current; /* milliAmps */
};
struct ap_state {
@@ -121,6 +122,7 @@ static inline void inter_mcu_fill_fbw_state (void) {
#endif // RADIO_CONTROL
fbw_state->vsupply = fbw_vsupply_decivolt;
+ fbw_state->current = fbw_current_milliamp;
}
/** Prepares date for next comm with AP. Set ::ap_ok to TRUE */
diff --git a/sw/airborne/main_ap.c b/sw/airborne/main_ap.c
index 2648b07c36..41510eed5f 100644
--- a/sw/airborne/main_ap.c
+++ b/sw/airborne/main_ap.c
@@ -144,10 +144,6 @@
#define LOW_BATTERY_DECIVOLT (CATASTROPHIC_BAT_LEVEL*10)
-#ifndef MILLIAMP_PER_PERCENT
-#define MILLIAMP_PER_PERCENT 0
-#endif
-
#ifdef USE_MODULES
#include "modules.h"
#endif
@@ -165,8 +161,6 @@ static const uint16_t version = 1;
uint8_t pprz_mode = PPRZ_MODE_AUTO2;
uint8_t lateral_mode = LATERAL_MODE_MANUAL;
-uint8_t vsupply;
-
static uint8_t mcu1_status;
#if defined RADIO_CONTROL || defined RADIO_CONTROL_AUTO1
@@ -179,7 +173,10 @@ float slider_1_val, slider_2_val;
bool_t launch = FALSE;
-float energy; /** Fuel consumption */
+uint8_t vsupply; // deciVolt
+uint16_t current; // milliAmpere
+
+float energy; // Fuel consumption (mAh)
bool_t gps_lost = FALSE;
@@ -312,6 +309,7 @@ inline void telecommand_task( void ) {
vsupply = fbw_state->vsupply;
+ current = fbw_state->current;
#ifdef RADIO_CONTROL
if (!estimator_flight_time) {
@@ -402,8 +400,8 @@ static void navigation_task( void ) {
Bound(h_ctl_pitch_setpoint, H_CTL_PITCH_MIN_SETPOINT, H_CTL_PITCH_MAX_SETPOINT);
if (kill_throttle || (!estimator_flight_time && !launch))
v_ctl_throttle_setpoint = 0;
- }
- energy += (float)v_ctl_throttle_setpoint * (MILLIAMP_PER_PERCENT / MAX_PPRZ * 0.25);
+ }
+ energy += ((float)current) / 3600.0f * 0.25f; // mAh = mA * dt (4Hz -> hours)
}
@@ -577,7 +575,6 @@ void periodic_task_ap( void ) {
}
#endif
-
#if CONTROL_RATE == 20
if (!_20Hz)
#endif
diff --git a/sw/airborne/main_fbw.c b/sw/airborne/main_fbw.c
index a3ba7bf353..e6c2ff1d9d 100644
--- a/sw/airborne/main_fbw.c
+++ b/sw/airborne/main_fbw.c
@@ -58,14 +58,25 @@
#include "link_mcu.h"
#endif
+#ifndef MILLIAMP_AT_FULL_THROTTLE
+#define MILLIAMP_AT_FULL_THROTTLE 0
+#endif
+
#ifdef ADC
struct adc_buf vsupply_adc_buf;
#ifndef VoltageOfAdc
#define VoltageOfAdc(adc) DefaultVoltageOfAdc(adc)
#endif
+#ifdef ADC_CHANNEL_CURRENT
+struct adc_buf current_adc_buf;
+#ifndef MilliAmpereOfAdc
+#define MilliAmpereOfAdc(adc) DefaultMilliAmpereOfAdc(adc)
+#endif
+#endif
#endif
uint8_t fbw_vsupply_decivolt;
+uint16_t fbw_current_milliamp;
uint8_t fbw_mode;
@@ -87,6 +98,9 @@ void init_fbw( void ) {
#ifdef ADC
adc_init();
adc_buf_channel(ADC_CHANNEL_VSUPPLY, &vsupply_adc_buf, DEFAULT_AV_NB_SAMPLE);
+# ifdef ADC_CHANNEL_CURRENT
+ adc_buf_channel(ADC_CHANNEL_CURRENT, ¤t_adc_buf, DEFAULT_AV_NB_SAMPLE);
+# endif
#endif
#ifdef ACTUATORS
actuators_init();
@@ -147,6 +161,7 @@ void event_task_fbw( void) {
}
#endif /* MCU_SPI_LINK */
+
if (inter_mcu_received_ap) {
inter_mcu_received_ap = FALSE;
inter_mcu_event_task();
@@ -202,11 +217,23 @@ void periodic_task_fbw( void ) {
fbw_downlink_periodic_task();
#endif
-#ifdef ADC
if (!_10Hz)
- fbw_vsupply_decivolt = VoltageOfAdc((10*(vsupply_adc_buf.sum/vsupply_adc_buf.av_nb_sample)));
+ {
+#ifdef ADC
+ fbw_vsupply_decivolt = VoltageOfAdc((10*(vsupply_adc_buf.sum/vsupply_adc_buf.av_nb_sample)));
+# ifdef ADC_CHANNEL_CURRENT
+ fbw_current_milliamp = MilliAmpereOfAdc((current_adc_buf.sum/current_adc_buf.av_nb_sample));
+# endif
#endif
+#ifndef ADC_CHANNEL_CURRENT
+# ifdef MILLIAMP_PER_PERCENT
+# warning "deprecated MILLIAMP_PER_PERCENT --> Please use MILLIAMP_AT_FULL_THROTTLE
+# endif
+ fbw_current_milliamp = Min(((float)commands[COMMAND_THROTTLE]) * ((float)MILLIAMP_AT_FULL_THROTTLE) / ((float)MAX_PPRZ), 65000);
+# endif
+ }
+
#ifdef ACTUATORS
SetActuatorsFromCommands(commands);
#endif
diff --git a/sw/airborne/main_fbw.h b/sw/airborne/main_fbw.h
index 8b3705c1a6..1cb1052168 100644
--- a/sw/airborne/main_fbw.h
+++ b/sw/airborne/main_fbw.h
@@ -41,8 +41,8 @@
extern uint8_t fbw_mode;
extern uint8_t fbw_vsupply_decivolt;
+extern uint16_t fbw_current_milliamp;
extern bool_t failsafe_mode;
-extern struct adc_buf vsupply_adc_buf;
void init_fbw( void );
void periodic_task_fbw( void );