summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGiampaolo Rodola <g.rodola@gmail.com>2017-01-27 01:33:15 +0100
committerGiampaolo Rodola <g.rodola@gmail.com>2017-01-27 01:33:15 +0100
commitbfc5e528574e14485d61ddad7e9a57850b9fb93e (patch)
treebfbc897ca69439d97caa58f81f76d1ada6ea24e7
parent90b261aef4c94e364596f07711565ea250f3a10e (diff)
downloadpsutil-bfc5e528574e14485d61ddad7e9a57850b9fb93e.tar.gz
#955: freebsd / battery: implement power_plugged field
-rw-r--r--psutil/_psbsd.py9
-rw-r--r--psutil/arch/bsd/freebsd.c6
-rwxr-xr-xpsutil/tests/test_bsd.py18
3 files changed, 27 insertions, 6 deletions
diff --git a/psutil/_psbsd.py b/psutil/_psbsd.py
index 20f9cbcb..ea16fc61 100644
--- a/psutil/_psbsd.py
+++ b/psutil/_psbsd.py
@@ -401,12 +401,15 @@ def net_connections(kind):
def sensors_battery():
- percent, minsleft = cext.sensors_battery()
- if minsleft == -1:
+ percent, minsleft, power_plugged = cext.sensors_battery()
+ power_plugged = power_plugged == 1
+ if power_plugged:
secsleft = _common.POWER_TIME_UNLIMITED
+ elif minsleft == -1:
+ secsleft = _common.POWER_TIME_UNKNOWN
else:
secsleft = minsleft * 60
- return _common.sbattery(percent, secsleft)
+ return _common.sbattery(percent, secsleft, power_plugged)
# =====================================================================
diff --git a/psutil/arch/bsd/freebsd.c b/psutil/arch/bsd/freebsd.c
index c0286c86..0bec81d8 100644
--- a/psutil/arch/bsd/freebsd.c
+++ b/psutil/arch/bsd/freebsd.c
@@ -1003,14 +1003,16 @@ PyObject *
psutil_sensors_battery(PyObject *self, PyObject *args) {
int percent;
int minsleft;
+ int power_plugged;
size_t size = sizeof(percent);
if (sysctlbyname("hw.acpi.battery.life", &percent, &size, NULL, 0))
goto error;
- // -1 if power is connected
if (sysctlbyname("hw.acpi.battery.time", &minsleft, &size, NULL, 0))
goto error;
- return Py_BuildValue("ii", percent, minsleft);
+ if (sysctlbyname("hw.acpi.acline", &power_plugged, &size, NULL, 0))
+ goto error;
+ return Py_BuildValue("iii", percent, minsleft, power_plugged);
error:
PyErr_SetFromErrno(PyExc_OSError);
diff --git a/psutil/tests/test_bsd.py b/psutil/tests/test_bsd.py
index 479237e5..ff46ab33 100755
--- a/psutil/tests/test_bsd.py
+++ b/psutil/tests/test_bsd.py
@@ -357,6 +357,8 @@ class FreeBSDSpecificTestCase(unittest.TestCase):
btime = int(s)
self.assertEqual(btime, psutil.boot_time())
+ # --- sensors_battery
+
@unittest.skipUnless(psutil.sensors_battery(), "no battery")
def test_sensors_battery(self):
def secs2hours(secs):
@@ -371,7 +373,21 @@ class FreeBSDSpecificTestCase(unittest.TestCase):
percent = int(fields['Remaining capacity:'].replace('%', ''))
remaining_time = fields['Remaining time:']
self.assertEqual(metrics.percent, percent)
- self.assertEqual(secs2hours(metrics.secsleft), remaining_time)
+ if remaining_time == 'unknown':
+ self.assertEqual(metrics.secsleft, psutil.POWER_TIME_UNLIMITED)
+ else:
+ self.assertEqual(secs2hours(metrics.secsleft), remaining_time)
+
+ def test_sensors_battery_against_sysctl(self):
+ self.assertEqual(psutil.sensors_battery().percent,
+ sysctl("hw.acpi.battery.life"))
+ self.assertEqual(psutil.sensors_battery().power_plugged,
+ sysctl("hw.acpi.acline") == 1)
+ secsleft = psutil.sensors_battery().secsleft
+ if secsleft < 0:
+ self.assertEqual(sysctl("hw.acpi.battery.time"), -1)
+ else:
+ self.assertEqual(secsleft, sysctl("hw.acpi.battery.time") * 60)
# =====================================================================