https://git.reactos.org/?p=reactos.git;a=commitdiff;h=a97fcf19ecd2d73def84f…
commit a97fcf19ecd2d73def84fc60d206372883599631
Author: George Bișoc <george.bisoc(a)reactos.org>
AuthorDate: Fri Jan 10 22:23:23 2025 +0100
Commit: George Bișoc <george.bisoc(a)reactos.org>
CommitDate: Sun Jan 12 20:00:14 2025 +0100
[CMBATT] Minor improvements to estimated battery time code
- Declare CMBATT_DISCHARGE_TIME and CMBATT_CAPACITY_BOGUS constructs
- Determine if the battery was already discharging and if not, update the time when
it's being discharged
- Fix the condition where it checks if the battery has been discharging for quite some
time
- Default the time to BATTERY_UNKNOWN_TIME if querying the estimated battery time
request fails or if the battery has just started discharging not over 15 seconds
CORE-18969
CORE-19452
---
drivers/bus/acpi/cmbatt/cmbatt.c | 21 ++++++++++++++++-----
drivers/bus/acpi/cmbatt/cmbatt.h | 12 ++++++++++++
2 files changed, 28 insertions(+), 5 deletions(-)
diff --git a/drivers/bus/acpi/cmbatt/cmbatt.c b/drivers/bus/acpi/cmbatt/cmbatt.c
index 407fa149572..dd01f8b22be 100644
--- a/drivers/bus/acpi/cmbatt/cmbatt.c
+++ b/drivers/bus/acpi/cmbatt/cmbatt.c
@@ -1085,6 +1085,7 @@ CmBattGetBatteryStatus(IN PCMBATT_DEVICE_EXTENSION
DeviceExtension,
{
ULONG PsrData = 0;
NTSTATUS Status;
+ BOOLEAN WasDischarging;
ULONG BstState;
ULONG PowerUnit;
ULONG DesignVoltage, PresentRate, RemainingCapacity;
@@ -1113,6 +1114,9 @@ CmBattGetBatteryStatus(IN PCMBATT_DEVICE_EXTENSION
DeviceExtension,
return Status;
}
+ /* Remember if the battery was discharging at the time of querying new status */
+ WasDischarging = !!(DeviceExtension->State & BATTERY_DISCHARGING);
+
/* Clear current BST information */
DeviceExtension->State = 0;
DeviceExtension->RemainingCapacity = 0;
@@ -1135,9 +1139,9 @@ CmBattGetBatteryStatus(IN PCMBATT_DEVICE_EXTENSION
DeviceExtension,
{
/* Set power state and check if it just started discharging now */
DeviceExtension->State |= BATTERY_DISCHARGING;
- if (!(DeviceExtension->State & ACPI_BATT_STAT_DISCHARG))
+ if (!WasDischarging)
{
- /* Remember the time when the state changed */
+ /* The battery is discharging now and not before, remember the time when the
state changed */
DeviceExtension->InterruptTime = KeQueryInterruptTime();
}
}
@@ -1363,8 +1367,8 @@ CmBattQueryInformation(IN PCMBATT_DEVICE_EXTENSION FdoExtension,
case BatteryEstimatedTime:
- /* Check if it's been more than 2 1/2 minutes since the last change */
- if ((KeQueryInterruptTime() - 150000000) >
(FdoExtension->InterruptTime))
+ /* Check if it's been more than 15 seconds since the last change */
+ if (KeQueryInterruptTime() > (FdoExtension->InterruptTime +
CMBATT_DISCHARGE_TIME))
{
/* Get new battery status */
CmBattGetBatteryStatus(FdoExtension, FdoExtension->Tag);
@@ -1379,6 +1383,9 @@ CmBattQueryInformation(IN PCMBATT_DEVICE_EXTENSION FdoExtension,
/* Grab the remaining capacity */
RemainingCapacity = FdoExtension->RemainingCapacity;
+ /* Default time to unknown if we fail the request later */
+ RemainingTime = BATTERY_UNKNOWN_TIME;
+
/* See if we don't know one or the other */
if ((Rate == BATTERY_UNKNOWN_RATE) ||
(RemainingCapacity == BATTERY_UNKNOWN_CAPACITY))
@@ -1410,7 +1417,7 @@ CmBattQueryInformation(IN PCMBATT_DEVICE_EXTENSION FdoExtension,
else
{
/* We have data, but is it valid? */
- if (RemainingCapacity > 0x123456)
+ if (RemainingCapacity > CMBATT_CAPACITY_BOGUS)
{
/* The capacity seems bogus, so don't use it */
if (CmBattDebug & CMBATT_ACPI_WARNING)
@@ -1423,6 +1430,10 @@ CmBattQueryInformation(IN PCMBATT_DEVICE_EXTENSION FdoExtension,
}
}
}
+ else
+ {
+ RemainingTime = BATTERY_UNKNOWN_TIME;
+ }
/* Return the remaining time */
QueryData = &RemainingTime;
diff --git a/drivers/bus/acpi/cmbatt/cmbatt.h b/drivers/bus/acpi/cmbatt/cmbatt.h
index e6ab5f029bd..4a2ec81acd3 100644
--- a/drivers/bus/acpi/cmbatt/cmbatt.h
+++ b/drivers/bus/acpi/cmbatt/cmbatt.h
@@ -42,6 +42,18 @@
#define CMBATT_PNP_ENTRY_EXIT 0x200
#define CMBATT_ACPI_ASSERT 0x400
+//
+// Constant used to determine if the battery was discharging
+// for over 15 seconds since last time the AC adapter got unplugged.
+//
+#define CMBATT_DISCHARGE_TIME 150000000
+
+//
+// Bogus constant used to determine if the remaining battery capacity
+// overflows which is returned by the hardware.
+//
+#define CMBATT_CAPACITY_BOGUS 0x100000
+
typedef enum _CMBATT_EXTENSION_TYPE
{
CmBattAcAdapter,