Merge pull request #1678 from mikeller/unify_battery_percentage_checks
Unified 'calculateBatteryPercentage' and 'calculateBatteryCapacityRemainingPercentage'.
This commit is contained in:
commit
bbe3d2d9cb
|
@ -473,7 +473,7 @@ void showBatteryPage(void)
|
||||||
i2c_OLED_set_line(rowIndex++);
|
i2c_OLED_set_line(rowIndex++);
|
||||||
i2c_OLED_send_string(lineBuffer);
|
i2c_OLED_send_string(lineBuffer);
|
||||||
|
|
||||||
uint8_t capacityPercentage = calculateBatteryCapacityRemainingPercentage();
|
uint8_t capacityPercentage = calculateBatteryPercentage();
|
||||||
i2c_OLED_set_line(rowIndex++);
|
i2c_OLED_set_line(rowIndex++);
|
||||||
drawHorizonalPercentageBar(SCREEN_CHARACTER_COLUMN_COUNT, capacityPercentage);
|
drawHorizonalPercentageBar(SCREEN_CHARACTER_COLUMN_COUNT, capacityPercentage);
|
||||||
}
|
}
|
||||||
|
|
|
@ -480,7 +480,7 @@ static void applyLedFixedLayers()
|
||||||
|
|
||||||
case LED_FUNCTION_BATTERY:
|
case LED_FUNCTION_BATTERY:
|
||||||
color = HSV(RED);
|
color = HSV(RED);
|
||||||
hOffset += scaleRange(calculateBatteryCapacityRemainingPercentage(), 0, 100, -30, 120);
|
hOffset += scaleRange(calculateBatteryPercentage(), 0, 100, -30, 120);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case LED_FUNCTION_RSSI:
|
case LED_FUNCTION_RSSI:
|
||||||
|
|
|
@ -235,18 +235,33 @@ static void updateBatteryCurrent(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
uint16_t iBatSample = adcGetChannel(ADC_CURRENT);
|
uint16_t iBatSample = adcGetChannel(ADC_CURRENT);
|
||||||
amperage = currentSensorToCentiamps(biquadFilterApply(&iBatFilter, iBatSample));
|
|
||||||
amperageLatest = currentSensorToCentiamps(iBatSample);
|
amperageLatest = currentSensorToCentiamps(iBatSample);
|
||||||
|
amperage = currentSensorToCentiamps(biquadFilterApply(&iBatFilter, iBatSample));
|
||||||
}
|
}
|
||||||
|
|
||||||
static void updateCurrentDrawn(int32_t lastUpdateAt)
|
static void updateCurrentDrawn(int32_t lastUpdateAt)
|
||||||
{
|
{
|
||||||
static float mAhDrawnF = 0.0f; // used to get good enough resolution
|
static float mAhDrawnF = 0.0f; // used to get good enough resolution
|
||||||
|
|
||||||
mAhDrawnF = mAhDrawnF + (amperage * lastUpdateAt / (100.0f * 1000 * 3600));
|
mAhDrawnF = mAhDrawnF + (amperageLatest * lastUpdateAt / (100.0f * 1000 * 3600));
|
||||||
mAhDrawn = mAhDrawnF;
|
mAhDrawn = mAhDrawnF;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void updateConsumptionWarning(void)
|
||||||
|
{
|
||||||
|
if (batteryConfig->useConsumptionAlerts && batteryConfig->batteryCapacity > 0 && getBatteryState() != BATTERY_NOT_PRESENT) {
|
||||||
|
if (calculateBatteryPercentage() == 0) {
|
||||||
|
vBatState = BATTERY_CRITICAL;
|
||||||
|
} else if (calculateBatteryPercentage() <= batteryConfig->consumptionWarningPercentage) {
|
||||||
|
consumptionState = BATTERY_WARNING;
|
||||||
|
} else {
|
||||||
|
consumptionState = BATTERY_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
updateBatteryAlert();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void updateCurrentMeter(int32_t lastUpdateAt, rxConfig_t *rxConfig, uint16_t deadband3d_throttle)
|
void updateCurrentMeter(int32_t lastUpdateAt, rxConfig_t *rxConfig, uint16_t deadband3d_throttle)
|
||||||
{
|
{
|
||||||
switch(batteryConfig->currentMeterType) {
|
switch(batteryConfig->currentMeterType) {
|
||||||
|
@ -255,9 +270,11 @@ void updateCurrentMeter(int32_t lastUpdateAt, rxConfig_t *rxConfig, uint16_t dea
|
||||||
|
|
||||||
updateCurrentDrawn(lastUpdateAt);
|
updateCurrentDrawn(lastUpdateAt);
|
||||||
|
|
||||||
|
updateConsumptionWarning();
|
||||||
|
|
||||||
break;
|
break;
|
||||||
case CURRENT_SENSOR_VIRTUAL:
|
case CURRENT_SENSOR_VIRTUAL:
|
||||||
amperage = (int32_t)batteryConfig->currentMeterOffset;
|
amperageLatest = (int32_t)batteryConfig->currentMeterOffset;
|
||||||
if (ARMING_FLAG(ARMED)) {
|
if (ARMING_FLAG(ARMED)) {
|
||||||
throttleStatus_e throttleStatus = calculateThrottleStatus(rxConfig, deadband3d_throttle);
|
throttleStatus_e throttleStatus = calculateThrottleStatus(rxConfig, deadband3d_throttle);
|
||||||
int throttleOffset = (int32_t)rcCommand[THROTTLE] - 1000;
|
int throttleOffset = (int32_t)rcCommand[THROTTLE] - 1000;
|
||||||
|
@ -265,48 +282,33 @@ void updateCurrentMeter(int32_t lastUpdateAt, rxConfig_t *rxConfig, uint16_t dea
|
||||||
throttleOffset = 0;
|
throttleOffset = 0;
|
||||||
}
|
}
|
||||||
int throttleFactor = throttleOffset + (throttleOffset * throttleOffset / 50);
|
int throttleFactor = throttleOffset + (throttleOffset * throttleOffset / 50);
|
||||||
amperage += throttleFactor * (int32_t)batteryConfig->currentMeterScale / 1000;
|
amperageLatest += throttleFactor * (int32_t)batteryConfig->currentMeterScale / 1000;
|
||||||
}
|
}
|
||||||
|
amperage = amperageLatest;
|
||||||
|
|
||||||
updateCurrentDrawn(lastUpdateAt);
|
updateCurrentDrawn(lastUpdateAt);
|
||||||
|
|
||||||
|
updateConsumptionWarning();
|
||||||
|
|
||||||
break;
|
break;
|
||||||
case CURRENT_SENSOR_ESC:
|
case CURRENT_SENSOR_ESC:
|
||||||
#ifdef USE_ESC_TELEMETRY
|
#ifdef USE_ESC_TELEMETRY
|
||||||
if (isEscTelemetryActive()) {
|
if (isEscTelemetryActive()) {
|
||||||
amperage = getEscTelemetryCurrent();
|
amperageLatest = getEscTelemetryCurrent();
|
||||||
|
amperage = amperageLatest;
|
||||||
mAhDrawn = getEscTelemetryConsumption();
|
mAhDrawn = getEscTelemetryConsumption();
|
||||||
|
|
||||||
|
updateConsumptionWarning();
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
case CURRENT_SENSOR_NONE:
|
case CURRENT_SENSOR_NONE:
|
||||||
amperage = 0;
|
amperage = 0;
|
||||||
|
amperageLatest = 0;
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (batteryConfig->useConsumptionAlerts) {
|
|
||||||
switch(consumptionState) {
|
|
||||||
case BATTERY_OK:
|
|
||||||
if (calculateBatteryCapacityRemainingPercentage() <= batteryConfig->consumptionWarningPercentage) {
|
|
||||||
consumptionState = BATTERY_WARNING;
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
|
||||||
case BATTERY_WARNING:
|
|
||||||
if (calculateBatteryCapacityRemainingPercentage() == 0) {
|
|
||||||
consumptionState = BATTERY_CRITICAL;
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
|
||||||
case BATTERY_CRITICAL:
|
|
||||||
case BATTERY_NOT_PRESENT:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
updateBatteryAlert();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
float calculateVbatPidCompensation(void) {
|
float calculateVbatPidCompensation(void) {
|
||||||
|
@ -320,12 +322,15 @@ float calculateVbatPidCompensation(void) {
|
||||||
|
|
||||||
uint8_t calculateBatteryPercentage(void)
|
uint8_t calculateBatteryPercentage(void)
|
||||||
{
|
{
|
||||||
return batteryCellCount > 0 ? constrain((((uint32_t)vbat - (batteryConfig->vbatmincellvoltage * batteryCellCount)) * 100) / ((batteryConfig->vbatmaxcellvoltage - batteryConfig->vbatmincellvoltage) * batteryCellCount), 0, 100) : 0;
|
uint8_t batteryPercentage = 0;
|
||||||
}
|
if (batteryCellCount > 0) {
|
||||||
|
uint16_t batteryCapacity = batteryConfig->batteryCapacity;
|
||||||
|
if (batteryCapacity > 0) {
|
||||||
|
batteryPercentage = constrain(((float)batteryCapacity - mAhDrawn) * 100 / batteryCapacity, 0, 100);
|
||||||
|
} else {
|
||||||
|
batteryPercentage = constrain((((uint32_t)vbat - (batteryConfig->vbatmincellvoltage * batteryCellCount)) * 100) / ((batteryConfig->vbatmaxcellvoltage - batteryConfig->vbatmincellvoltage) * batteryCellCount), 0, 100);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
uint8_t calculateBatteryCapacityRemainingPercentage(void)
|
return batteryPercentage;
|
||||||
{
|
|
||||||
uint16_t batteryCapacity = batteryConfig->batteryCapacity;
|
|
||||||
|
|
||||||
return constrain((batteryCapacity - constrain(mAhDrawn, 0, 0xFFFF)) * 100.0f / batteryCapacity , 0, 100);
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -93,4 +93,3 @@ int32_t currentMeterToCentiamps(uint16_t src);
|
||||||
|
|
||||||
float calculateVbatPidCompensation(void);
|
float calculateVbatPidCompensation(void);
|
||||||
uint8_t calculateBatteryPercentage(void);
|
uint8_t calculateBatteryPercentage(void);
|
||||||
uint8_t calculateBatteryCapacityRemainingPercentage(void);
|
|
||||||
|
|
|
@ -185,7 +185,7 @@ void crsfFrameBatterySensor(sbuf_t *dst)
|
||||||
#else
|
#else
|
||||||
crsfSerialize16(dst, amperage / 10);
|
crsfSerialize16(dst, amperage / 10);
|
||||||
const uint32_t batteryCapacity = batteryConfig->batteryCapacity;
|
const uint32_t batteryCapacity = batteryConfig->batteryCapacity;
|
||||||
const uint8_t batteryRemainingPercentage = calculateBatteryCapacityRemainingPercentage();
|
const uint8_t batteryRemainingPercentage = calculateBatteryPercentage();
|
||||||
#endif
|
#endif
|
||||||
crsfSerialize8(dst, (batteryCapacity >> 16));
|
crsfSerialize8(dst, (batteryCapacity >> 16));
|
||||||
crsfSerialize8(dst, (batteryCapacity >> 8));
|
crsfSerialize8(dst, (batteryCapacity >> 8));
|
||||||
|
|
|
@ -428,7 +428,7 @@ static void sendFuelLevel(void)
|
||||||
sendDataHead(ID_FUEL_LEVEL);
|
sendDataHead(ID_FUEL_LEVEL);
|
||||||
|
|
||||||
if (batteryConfig->batteryCapacity > 0) {
|
if (batteryConfig->batteryCapacity > 0) {
|
||||||
serialize16((uint16_t)calculateBatteryCapacityRemainingPercentage());
|
serialize16((uint16_t)calculateBatteryPercentage());
|
||||||
} else {
|
} else {
|
||||||
serialize16((uint16_t)constrain(mAhDrawn, 0, 0xFFFF));
|
serialize16((uint16_t)constrain(mAhDrawn, 0, 0xFFFF));
|
||||||
}
|
}
|
||||||
|
|
|
@ -311,6 +311,7 @@ portSharing_e determinePortSharing(serialPortConfig_t *, serialPortFunction_e) {
|
||||||
|
|
||||||
uint8_t batteryCapacityRemainingPercentage(void) {return 67;}
|
uint8_t batteryCapacityRemainingPercentage(void) {return 67;}
|
||||||
uint8_t calculateBatteryCapacityRemainingPercentage(void) {return 67;}
|
uint8_t calculateBatteryCapacityRemainingPercentage(void) {return 67;}
|
||||||
|
uint8_t calculateBatteryPercentage(void) {return 67;}
|
||||||
batteryState_e getBatteryState(void) {return BATTERY_OK;}
|
batteryState_e getBatteryState(void) {return BATTERY_OK;}
|
||||||
bool isAirmodeActive(void) {return airMode;}
|
bool isAirmodeActive(void) {return airMode;}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue