From e889ce25192fe68ce2415018895bf53150bccdb2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Axel=20D=C3=B6rfler?= Date: Thu, 8 Jan 2015 15:27:29 +0100 Subject: [PATCH] PowerStatus: fixed how the info is retrieved. * The state was usually 0 once there was more than one battery slot. * We now ignore missing batteries completely, instead of taking eventually bogus data into account. * Fixed how to determine fOnline, and fHasBattery, and when to ignore probes. * Made it more strict when to show the notification, ie. it's now only shown when actually discharging. * This fixes all spurious notifications for me. --- src/apps/powerstatus/PowerStatusView.cpp | 31 ++++++++++++++---------- src/apps/powerstatus/PowerStatusView.h | 4 +-- 2 files changed, 20 insertions(+), 15 deletions(-) diff --git a/src/apps/powerstatus/PowerStatusView.cpp b/src/apps/powerstatus/PowerStatusView.cpp index 216bf78287..bb566120dd 100644 --- a/src/apps/powerstatus/PowerStatusView.cpp +++ b/src/apps/powerstatus/PowerStatusView.cpp @@ -106,7 +106,7 @@ PowerStatusView::_Init() fShowTime = false; fShowStatusIcon = true; - fPercent = -1; + fPercent = 100; fOnline = true; fTimeLeft = 0; } @@ -338,13 +338,12 @@ PowerStatusView::Update(bool force) bool wasOnline = fOnline; bool hadBattery = fHasBattery; - _GetBatteryInfo(&fBatteryInfo, fBatteryID); - - fHasBattery = (fBatteryInfo.state & BATTERY_CRITICAL_STATE) == 0; + _GetBatteryInfo(fBatteryID, &fBatteryInfo); + fHasBattery = fBatteryInfo.full_capacity > 0; if (fBatteryInfo.full_capacity > 0 && fHasBattery) { fPercent = (100 * fBatteryInfo.capacity) / fBatteryInfo.full_capacity; - fOnline = (fBatteryInfo.state & BATTERY_CHARGING) != 0; + fOnline = (fBatteryInfo.state & BATTERY_DISCHARGING) == 0; fTimeLeft = fBatteryInfo.time_left; } else { fPercent = 0; @@ -352,7 +351,7 @@ PowerStatusView::Update(bool force) fTimeLeft = -1; } - if (fOnline && (fPercent <= 0 || fPercent > 100)) { + if (fHasBattery && (fPercent <= 0 || fPercent > 100)) { // Just ignore this probe -- it obviously returned invalid values fPercent = previousPercent; fTimeLeft = previousTimeLeft; @@ -417,9 +416,8 @@ PowerStatusView::Update(bool force) Invalidate(); } - if ((hadBattery && !fHasBattery) - || (previousPercent > kLowBatteryPercentage - && fPercent <= kLowBatteryPercentage)) { + if (!fOnline && fHasBattery && previousPercent > kLowBatteryPercentage + && fPercent <= kLowBatteryPercentage) { _NotifyLowBattery(); } } @@ -462,19 +460,26 @@ PowerStatusView::ToMessage(BMessage* archive) const void -PowerStatusView::_GetBatteryInfo(battery_info* batteryInfo, int batteryID) +PowerStatusView::_GetBatteryInfo(int batteryID, battery_info* batteryInfo) { if (batteryID >= 0) { fDriverInterface->GetBatteryInfo(batteryID, batteryInfo); } else { + bool first = true; + memset(batteryInfo, 0, sizeof(battery_info)); + for (int i = 0; i < fDriverInterface->GetBatteryCount(); i++) { battery_info info; fDriverInterface->GetBatteryInfo(i, &info); - if (i == 0) + if (info.full_capacity <= 0) + continue; + + if (first) { *batteryInfo = info; - else { - batteryInfo->state &= info.state; + first = false; + } else { + batteryInfo->state |= info.state; batteryInfo->capacity += info.capacity; batteryInfo->full_capacity += info.full_capacity; batteryInfo->time_left += info.time_left; diff --git a/src/apps/powerstatus/PowerStatusView.h b/src/apps/powerstatus/PowerStatusView.h index 2dfd2c6221..ca0d62eed7 100644 --- a/src/apps/powerstatus/PowerStatusView.h +++ b/src/apps/powerstatus/PowerStatusView.h @@ -1,5 +1,5 @@ /* - * Copyright 2006-2014, Haiku, Inc. All Rights Reserved. + * Copyright 2006-2015, Haiku, Inc. All Rights Reserved. * Distributed under the terms of the MIT License. * * Authors: @@ -45,7 +45,7 @@ protected: status_t ToMessage(BMessage* message) const; private: - void _GetBatteryInfo(battery_info* info, int batteryID); + void _GetBatteryInfo(int batteryID, battery_info* info); void _Init(); void _SetLabel(char* buffer, size_t bufferLength); void _DrawBattery(BRect rect);