1
0
Fork 0
mirror of https://github.com/betaflight/betaflight.git synced 2025-07-19 22:35:23 +03:00

Merge pull request #11843 from jonmahoney15/watt-hours-consumed-osd-element

Watt Hours Drawn OSD Element and Post Flight Stat
This commit is contained in:
haslinghuis 2022-09-24 03:24:10 +02:00 committed by GitHub
commit fba7ccfcd0
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
8 changed files with 58 additions and 2 deletions

View file

@ -1360,6 +1360,7 @@ const clivalue_t valueTable[] = {
{ "osd_ah_pos", VAR_UINT16 | MASTER_VALUE, .config.minmaxUnsigned = { 0, OSD_POSCFG_MAX }, PG_OSD_ELEMENT_CONFIG, offsetof(osdElementConfig_t, item_pos[OSD_ARTIFICIAL_HORIZON]) }, { "osd_ah_pos", VAR_UINT16 | MASTER_VALUE, .config.minmaxUnsigned = { 0, OSD_POSCFG_MAX }, PG_OSD_ELEMENT_CONFIG, offsetof(osdElementConfig_t, item_pos[OSD_ARTIFICIAL_HORIZON]) },
{ "osd_current_pos", VAR_UINT16 | MASTER_VALUE, .config.minmaxUnsigned = { 0, OSD_POSCFG_MAX }, PG_OSD_ELEMENT_CONFIG, offsetof(osdElementConfig_t, item_pos[OSD_CURRENT_DRAW]) }, { "osd_current_pos", VAR_UINT16 | MASTER_VALUE, .config.minmaxUnsigned = { 0, OSD_POSCFG_MAX }, PG_OSD_ELEMENT_CONFIG, offsetof(osdElementConfig_t, item_pos[OSD_CURRENT_DRAW]) },
{ "osd_mah_drawn_pos", VAR_UINT16 | MASTER_VALUE, .config.minmaxUnsigned = { 0, OSD_POSCFG_MAX }, PG_OSD_ELEMENT_CONFIG, offsetof(osdElementConfig_t, item_pos[OSD_MAH_DRAWN]) }, { "osd_mah_drawn_pos", VAR_UINT16 | MASTER_VALUE, .config.minmaxUnsigned = { 0, OSD_POSCFG_MAX }, PG_OSD_ELEMENT_CONFIG, offsetof(osdElementConfig_t, item_pos[OSD_MAH_DRAWN]) },
{ "osd_wh_drawn_pos", VAR_UINT16 | MASTER_VALUE, .config.minmaxUnsigned = { 0, OSD_POSCFG_MAX }, PG_OSD_ELEMENT_CONFIG, offsetof(osdElementConfig_t, item_pos[OSD_WATT_HOURS_DRAWN]) },
{ "osd_motor_diag_pos", VAR_UINT16 | MASTER_VALUE, .config.minmaxUnsigned = { 0, OSD_POSCFG_MAX }, PG_OSD_ELEMENT_CONFIG, offsetof(osdElementConfig_t, item_pos[OSD_MOTOR_DIAG]) }, { "osd_motor_diag_pos", VAR_UINT16 | MASTER_VALUE, .config.minmaxUnsigned = { 0, OSD_POSCFG_MAX }, PG_OSD_ELEMENT_CONFIG, offsetof(osdElementConfig_t, item_pos[OSD_MOTOR_DIAG]) },
{ "osd_craft_name_pos", VAR_UINT16 | MASTER_VALUE, .config.minmaxUnsigned = { 0, OSD_POSCFG_MAX }, PG_OSD_ELEMENT_CONFIG, offsetof(osdElementConfig_t, item_pos[OSD_CRAFT_NAME]) }, { "osd_craft_name_pos", VAR_UINT16 | MASTER_VALUE, .config.minmaxUnsigned = { 0, OSD_POSCFG_MAX }, PG_OSD_ELEMENT_CONFIG, offsetof(osdElementConfig_t, item_pos[OSD_CRAFT_NAME]) },
{ "osd_display_name_pos", VAR_UINT16 | MASTER_VALUE, .config.minmaxUnsigned = { 0, OSD_POSCFG_MAX }, PG_OSD_ELEMENT_CONFIG, offsetof(osdElementConfig_t, item_pos[OSD_DISPLAY_NAME]) }, { "osd_display_name_pos", VAR_UINT16 | MASTER_VALUE, .config.minmaxUnsigned = { 0, OSD_POSCFG_MAX }, PG_OSD_ELEMENT_CONFIG, offsetof(osdElementConfig_t, item_pos[OSD_DISPLAY_NAME]) },

View file

@ -187,6 +187,7 @@ const osd_stats_e osdStatsDisplayOrder[OSD_STAT_COUNT] = {
OSD_STAT_TOTAL_FLIGHTS, OSD_STAT_TOTAL_FLIGHTS,
OSD_STAT_TOTAL_TIME, OSD_STAT_TOTAL_TIME,
OSD_STAT_TOTAL_DIST, OSD_STAT_TOTAL_DIST,
OSD_STAT_WATT_HOURS_DRAWN,
}; };
// Group elements in a number of groups to reduce task scheduling overhead // Group elements in a number of groups to reduce task scheduling overhead
@ -781,6 +782,14 @@ static bool osdDisplayStat(int statistic, uint8_t displayRow)
} }
break; break;
case OSD_STAT_WATT_HOURS_DRAWN:
if (batteryConfig()->currentMeterSource != CURRENT_METER_NONE) {
osdPrintFloat(buff, SYM_NONE, getWhDrawn(), "", 2, true, SYM_NONE);
osdDisplayStatisticLabel(displayRow, "USED WATT HOURS", buff);
return true;
}
break;
#ifdef USE_BLACKBOX #ifdef USE_BLACKBOX
case OSD_STAT_BLACKBOX: case OSD_STAT_BLACKBOX:
if (blackboxConfig()->device && blackboxConfig()->device != BLACKBOX_DEVICE_SERIAL) { if (blackboxConfig()->device && blackboxConfig()->device != BLACKBOX_DEVICE_SERIAL) {

View file

@ -161,6 +161,7 @@ typedef enum {
OSD_TOTAL_FLIGHTS, OSD_TOTAL_FLIGHTS,
OSD_UP_DOWN_REFERENCE, OSD_UP_DOWN_REFERENCE,
OSD_TX_UPLINK_POWER, OSD_TX_UPLINK_POWER,
OSD_WATT_HOURS_DRAWN,
OSD_ITEM_COUNT // MUST BE LAST OSD_ITEM_COUNT // MUST BE LAST
} osd_items_e; } osd_items_e;
@ -200,6 +201,7 @@ typedef enum {
OSD_STAT_TOTAL_TIME, OSD_STAT_TOTAL_TIME,
OSD_STAT_TOTAL_DIST, OSD_STAT_TOTAL_DIST,
OSD_STAT_MIN_RSSI_DBM, OSD_STAT_MIN_RSSI_DBM,
OSD_STAT_WATT_HOURS_DRAWN,
OSD_STAT_COUNT // MUST BE LAST OSD_STAT_COUNT // MUST BE LAST
} osd_stats_e; } osd_stats_e;

View file

@ -1166,6 +1166,20 @@ static void osdElementMahDrawn(osdElementParms_t *element)
tfp_sprintf(element->buff, "%4d%c", getMAhDrawn(), SYM_MAH); tfp_sprintf(element->buff, "%4d%c", getMAhDrawn(), SYM_MAH);
} }
static void osdElementWattHoursDrawn(osdElementParms_t *element)
{
const float wattHoursDrawn = getWhDrawn();
if (wattHoursDrawn < 1.0f) {
tfp_sprintf(element->buff, "%3dMWH", lrintf(wattHoursDrawn * 1000));
} else {
int wattHourWholeNumber = (int)wattHoursDrawn;
int wattHourDecimalValue = (int)((wattHoursDrawn - wattHourWholeNumber) * 100);
tfp_sprintf(element->buff, wattHourDecimalValue >= 10 ? "%3d.%2dWH" : "%3d.0%1dWH", wattHourWholeNumber, wattHourDecimalValue);
}
}
static void osdElementMainBatteryUsage(osdElementParms_t *element) static void osdElementMainBatteryUsage(osdElementParms_t *element)
{ {
// Set length of indicator bar // Set length of indicator bar
@ -1524,6 +1538,7 @@ static const uint8_t osdElementDisplayOrder[] = {
OSD_VTX_CHANNEL, OSD_VTX_CHANNEL,
OSD_CURRENT_DRAW, OSD_CURRENT_DRAW,
OSD_MAH_DRAWN, OSD_MAH_DRAWN,
OSD_WATT_HOURS_DRAWN,
OSD_CRAFT_NAME, OSD_CRAFT_NAME,
OSD_ALTITUDE, OSD_ALTITUDE,
OSD_ROLL_PIDS, OSD_ROLL_PIDS,
@ -1610,6 +1625,7 @@ const osdElementDrawFn osdElementDrawFunction[OSD_ITEM_COUNT] = {
#endif #endif
[OSD_CURRENT_DRAW] = osdElementCurrentDraw, [OSD_CURRENT_DRAW] = osdElementCurrentDraw,
[OSD_MAH_DRAWN] = osdElementMahDrawn, [OSD_MAH_DRAWN] = osdElementMahDrawn,
[OSD_WATT_HOURS_DRAWN] = osdElementWattHoursDrawn,
#ifdef USE_GPS #ifdef USE_GPS
[OSD_GPS_SPEED] = osdElementGpsSpeed, [OSD_GPS_SPEED] = osdElementGpsSpeed,
[OSD_GPS_SATS] = osdElementGpsSats, [OSD_GPS_SATS] = osdElementGpsSats,

View file

@ -75,13 +75,14 @@ static uint16_t batteryCriticalVoltage;
static uint16_t batteryWarningHysteresisVoltage; static uint16_t batteryWarningHysteresisVoltage;
static uint16_t batteryCriticalHysteresisVoltage; static uint16_t batteryCriticalHysteresisVoltage;
static lowVoltageCutoff_t lowVoltageCutoff; static lowVoltageCutoff_t lowVoltageCutoff;
//
static currentMeter_t currentMeter; static currentMeter_t currentMeter;
static voltageMeter_t voltageMeter; static voltageMeter_t voltageMeter;
static batteryState_e batteryState; static batteryState_e batteryState;
static batteryState_e voltageState; static batteryState_e voltageState;
static batteryState_e consumptionState; static batteryState_e consumptionState;
static float wattHoursDrawn;
#ifndef DEFAULT_CURRENT_METER_SOURCE #ifndef DEFAULT_CURRENT_METER_SOURCE
#ifdef USE_VIRTUAL_CURRENT_METER #ifdef USE_VIRTUAL_CURRENT_METER
@ -197,7 +198,6 @@ static bool isVoltageFromBat(void)
void batteryUpdatePresence(void) void batteryUpdatePresence(void)
{ {
if ((voltageState == BATTERY_NOT_PRESENT || voltageState == BATTERY_INIT) && isVoltageFromBat() && isVoltageStable()) { if ((voltageState == BATTERY_NOT_PRESENT || voltageState == BATTERY_INIT) && isVoltageFromBat() && isVoltageStable()) {
// Battery has just been connected - calculate cells, warning voltages and reset state // Battery has just been connected - calculate cells, warning voltages and reset state
@ -232,9 +232,18 @@ void batteryUpdatePresence(void)
batteryCriticalVoltage = 0; batteryCriticalVoltage = 0;
batteryWarningHysteresisVoltage = 0; batteryWarningHysteresisVoltage = 0;
batteryCriticalHysteresisVoltage = 0; batteryCriticalHysteresisVoltage = 0;
wattHoursDrawn = 0.0;
} }
} }
void batteryUpdateWhDrawn(void)
{
static int32_t mAhDrawnPrev = 0;
const int32_t mAhDrawnCurrent = getMAhDrawn();
wattHoursDrawn += voltageMeter.displayFiltered * (mAhDrawnCurrent - mAhDrawnPrev) / 100000.0f;
mAhDrawnPrev = mAhDrawnCurrent;
}
static void batteryUpdateVoltageState(void) static void batteryUpdateVoltageState(void)
{ {
// alerts are currently used by beeper, osd and other subsystems // alerts are currently used by beeper, osd and other subsystems
@ -317,6 +326,7 @@ void batteryUpdateStates(timeUs_t currentTimeUs)
batteryUpdateConsumptionState(); batteryUpdateConsumptionState();
batteryUpdateLVC(currentTimeUs); batteryUpdateLVC(currentTimeUs);
batteryState = MAX(voltageState, consumptionState); batteryState = MAX(voltageState, consumptionState);
batteryUpdateWhDrawn();
} }
const lowVoltageCutoff_t *getLowVoltageCutoff(void) const lowVoltageCutoff_t *getLowVoltageCutoff(void)
@ -354,6 +364,11 @@ void batteryInit(void)
batteryState = BATTERY_INIT; batteryState = BATTERY_INIT;
batteryCellCount = 0; batteryCellCount = 0;
//
// Consumption
//
wattHoursDrawn = 0;
// //
// voltage // voltage
// //
@ -565,3 +580,8 @@ void setMAhDrawn(uint32_t mAhDrawn)
currentMeter.mAhDrawnOffset = mAhDrawn; currentMeter.mAhDrawnOffset = mAhDrawn;
} }
#endif #endif
float getWhDrawn(void)
{
return wattHoursDrawn;
}

View file

@ -120,6 +120,7 @@ bool isAmperageConfigured(void);
int32_t getAmperage(void); int32_t getAmperage(void);
int32_t getAmperageLatest(void); int32_t getAmperageLatest(void);
int32_t getMAhDrawn(void); int32_t getMAhDrawn(void);
float getWhDrawn(void);
#ifdef USE_BATTERY_CONTINUE #ifdef USE_BATTERY_CONTINUE
bool hasUsedMAh(); bool hasUsedMAh();
void setMAhDrawn(uint32_t mAhDrawn); void setMAhDrawn(uint32_t mAhDrawn);

View file

@ -479,6 +479,7 @@ extern "C" {
uint16_t getBatteryAverageCellVoltage() { return 420; } uint16_t getBatteryAverageCellVoltage() { return 420; }
int32_t getAmperage() { return 0; } int32_t getAmperage() { return 0; }
int32_t getMAhDrawn() { return 0; } int32_t getMAhDrawn() { return 0; }
float getWhDrawn() { return 0.0; }
int32_t getEstimatedAltitudeCm() { return 0; } int32_t getEstimatedAltitudeCm() { return 0; }
int32_t getEstimatedVario() { return 0; } int32_t getEstimatedVario() { return 0; }
int32_t blackboxGetLogNumber() { return 0; } int32_t blackboxGetLogNumber() { return 0; }

View file

@ -100,6 +100,7 @@ extern "C" {
uint16_t simulationBatteryVoltage; uint16_t simulationBatteryVoltage;
uint32_t simulationBatteryAmperage; uint32_t simulationBatteryAmperage;
uint32_t simulationMahDrawn; uint32_t simulationMahDrawn;
float simulationWhDrawn;
int32_t simulationAltitude; int32_t simulationAltitude;
int32_t simulationVerticalSpeed; int32_t simulationVerticalSpeed;
uint16_t simulationCoreTemperature; uint16_t simulationCoreTemperature;
@ -128,6 +129,7 @@ void setDefaultSimulationState()
simulationBatteryVoltage = 1680; simulationBatteryVoltage = 1680;
simulationBatteryAmperage = 0; simulationBatteryAmperage = 0;
simulationMahDrawn = 0; simulationMahDrawn = 0;
simulationWhDrawn = 0;
simulationAltitude = 0; simulationAltitude = 0;
simulationVerticalSpeed = 0; simulationVerticalSpeed = 0;
simulationCoreTemperature = 0; simulationCoreTemperature = 0;
@ -1324,6 +1326,10 @@ extern "C" {
return simulationMahDrawn; return simulationMahDrawn;
} }
float getWhDrawn() {
return simulationWhDrawn;
}
int32_t getEstimatedAltitudeCm() { int32_t getEstimatedAltitudeCm() {
return simulationAltitude; return simulationAltitude;
} }