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 @@ + +
@@ -100,8 +102,10 @@
- + + +
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 );