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:
commit
fba7ccfcd0
8 changed files with 58 additions and 2 deletions
|
@ -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]) },
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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;
|
||||||
|
}
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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; }
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue