From b54510c37886183876500ee140850c837bd9bcf9 Mon Sep 17 00:00:00 2001 From: sarahemm Date: Sun, 20 Oct 2024 09:58:28 -0400 Subject: [PATCH] PowerStatus: Fix issues with (dis)connecting batteries while running 1. Fixed stale data and invalid percent/time remaining being displayed after a battery is removed from the system. 2. Added display of a red X over damaged/missing batteries in the Battery Info view. This fixes the last point in bug #19167. Change-Id: I968829895fc814011b2c88bafe0b62a159b46d5a Reviewed-on: https://review.haiku-os.org/c/haiku/+/8496 Tested-by: Commit checker robot Reviewed-by: waddlesplash --- src/apps/powerstatus/ACPIDriverInterface.cpp | 7 +++++ src/apps/powerstatus/ExtendedInfoWindow.cpp | 2 +- src/apps/powerstatus/PowerStatusView.cpp | 32 ++++++++++++++++++-- 3 files changed, 38 insertions(+), 3 deletions(-) diff --git a/src/apps/powerstatus/ACPIDriverInterface.cpp b/src/apps/powerstatus/ACPIDriverInterface.cpp index 1036a9f2e2..e2058dc278 100644 --- a/src/apps/powerstatus/ACPIDriverInterface.cpp +++ b/src/apps/powerstatus/ACPIDriverInterface.cpp @@ -97,6 +97,13 @@ Battery::UpdateBatteryInfo() || info.capacity < 0) return B_BAD_DATA; + if ((fCachedInfo.capacity == 0 && info.capacity > 0) + || (fCachedInfo.capacity > 0 && info.capacity == 0)) { + // if capacity went from zero to non-zero or vice-versa, we likely just had a battery + // connected or disconnected from the system so refresh the full fExtendedBatteryInfo + GetExtendedBatteryInfo(&fExtendedBatteryInfo); + } + fCachedInfo = info; return B_OK; } diff --git a/src/apps/powerstatus/ExtendedInfoWindow.cpp b/src/apps/powerstatus/ExtendedInfoWindow.cpp index f05198b8f2..486cf24e3f 100644 --- a/src/apps/powerstatus/ExtendedInfoWindow.cpp +++ b/src/apps/powerstatus/ExtendedInfoWindow.cpp @@ -111,7 +111,7 @@ BatteryInfoView::_GetTextForLine(size_t line) && fBatteryExtendedInfo.oem_info[0] == '\0') string = B_TRANSLATE("Empty battery slot"); else if ((fBatteryInfo.state & BATTERY_CRITICAL_STATE) != 0) - string = B_TRANSLATE("Damaged battery"); + string = B_TRANSLATE("Damaged or missing battery"); else string = B_TRANSLATE("Battery unused"); break; diff --git a/src/apps/powerstatus/PowerStatusView.cpp b/src/apps/powerstatus/PowerStatusView.cpp index dbe2b5b842..8b8ddd86a6 100644 --- a/src/apps/powerstatus/PowerStatusView.cpp +++ b/src/apps/powerstatus/PowerStatusView.cpp @@ -317,6 +317,29 @@ PowerStatusView::_DrawBattery(BView* view, BRect rect) }; view->FillPolygon(points, 8, pauseRect); + view->SetDrawingMode(B_OP_OVER); + } else if ((fBatteryInfo.state & BATTERY_CRITICAL_STATE) != 0) { + // When a battery is damaged or missing, draw an X over it + view->SetHighColor(200, 0, 0, 96); + view->SetDrawingMode(B_OP_ALPHA); + + static const BPoint points[] = { + BPoint(1, 1), + BPoint(1, 2), + BPoint(20, 6), + BPoint(22, 6), + BPoint(22, 5), + BPoint(3, 1), + + BPoint(20, 1), + BPoint(1, 5), + BPoint(1, 6), + BPoint(3, 6), + BPoint(22, 2), + BPoint(22, 1) + }; + view->FillPolygon(points, 12, lightningRect); + view->SetDrawingMode(B_OP_OVER); } @@ -429,7 +452,7 @@ PowerStatusView::Update(bool force, bool notify) bool wasCharging = (fBatteryInfo.state & BATTERY_CHARGING); bool hadBattery = fHasBattery; _GetBatteryInfo(fBatteryID, &fBatteryInfo); - fHasBattery = fBatteryInfo.full_capacity > 0; + fHasBattery = fBatteryInfo.full_capacity > 0 && fBatteryInfo.state != BATTERY_CRITICAL_STATE; if (fBatteryInfo.full_capacity > 0 && fHasBattery) { fPercent = (double)fBatteryInfo.capacity / fBatteryInfo.full_capacity; @@ -605,7 +628,12 @@ PowerStatusView::_GetBatteryInfo(int batteryID, battery_info* batteryInfo) *batteryInfo = info; first = false; } else { - batteryInfo->state |= info.state; + if ((batteryInfo->state & BATTERY_CRITICAL_STATE) == 0) { + // don't propagate CRITICAL_STATE to the aggregate battery. + // one battery charging means "the system is charging" but one battery having + // been removed does not mean "the system has no battery" + batteryInfo->state |= info.state; + } batteryInfo->capacity += info.capacity; batteryInfo->full_capacity += info.full_capacity; batteryInfo->current_rate += info.current_rate;