head 1.5; access; symbols pkgsrc-2026Q1:1.5.0.178 pkgsrc-2026Q1-base:1.5 pkgsrc-2025Q4:1.5.0.176 pkgsrc-2025Q4-base:1.5 pkgsrc-2025Q3:1.5.0.174 pkgsrc-2025Q3-base:1.5 pkgsrc-2025Q2:1.5.0.172 pkgsrc-2025Q2-base:1.5 pkgsrc-2025Q1:1.5.0.170 pkgsrc-2025Q1-base:1.5 pkgsrc-2024Q4:1.5.0.168 pkgsrc-2024Q4-base:1.5 pkgsrc-2024Q3:1.5.0.166 pkgsrc-2024Q3-base:1.5 pkgsrc-2024Q2:1.5.0.164 pkgsrc-2024Q2-base:1.5 pkgsrc-2024Q1:1.5.0.162 pkgsrc-2024Q1-base:1.5 pkgsrc-2023Q4:1.5.0.160 pkgsrc-2023Q4-base:1.5 pkgsrc-2023Q3:1.5.0.158 pkgsrc-2023Q3-base:1.5 pkgsrc-2023Q2:1.5.0.156 pkgsrc-2023Q2-base:1.5 pkgsrc-2023Q1:1.5.0.154 pkgsrc-2023Q1-base:1.5 pkgsrc-2022Q4:1.5.0.152 pkgsrc-2022Q4-base:1.5 pkgsrc-2022Q3:1.5.0.150 pkgsrc-2022Q3-base:1.5 pkgsrc-2022Q2:1.5.0.148 pkgsrc-2022Q2-base:1.5 pkgsrc-2022Q1:1.5.0.146 pkgsrc-2022Q1-base:1.5 pkgsrc-2021Q4:1.5.0.144 pkgsrc-2021Q4-base:1.5 pkgsrc-2021Q3:1.5.0.142 pkgsrc-2021Q3-base:1.5 pkgsrc-2021Q2:1.5.0.140 pkgsrc-2021Q2-base:1.5 pkgsrc-2021Q1:1.5.0.138 pkgsrc-2021Q1-base:1.5 pkgsrc-2020Q4:1.5.0.136 pkgsrc-2020Q4-base:1.5 pkgsrc-2020Q3:1.5.0.134 pkgsrc-2020Q3-base:1.5 pkgsrc-2020Q2:1.5.0.130 pkgsrc-2020Q2-base:1.5 pkgsrc-2020Q1:1.5.0.110 pkgsrc-2020Q1-base:1.5 pkgsrc-2019Q4:1.5.0.132 pkgsrc-2019Q4-base:1.5 pkgsrc-2019Q3:1.5.0.128 pkgsrc-2019Q3-base:1.5 pkgsrc-2019Q2:1.5.0.126 pkgsrc-2019Q2-base:1.5 pkgsrc-2019Q1:1.5.0.124 pkgsrc-2019Q1-base:1.5 pkgsrc-2018Q4:1.5.0.122 pkgsrc-2018Q4-base:1.5 pkgsrc-2018Q3:1.5.0.120 pkgsrc-2018Q3-base:1.5 pkgsrc-2018Q2:1.5.0.118 pkgsrc-2018Q2-base:1.5 pkgsrc-2018Q1:1.5.0.116 pkgsrc-2018Q1-base:1.5 pkgsrc-2017Q4:1.5.0.114 pkgsrc-2017Q4-base:1.5 pkgsrc-2017Q3:1.5.0.112 pkgsrc-2017Q3-base:1.5 pkgsrc-2017Q2:1.5.0.108 pkgsrc-2017Q2-base:1.5 pkgsrc-2017Q1:1.5.0.106 pkgsrc-2017Q1-base:1.5 pkgsrc-2016Q4:1.5.0.104 pkgsrc-2016Q4-base:1.5 pkgsrc-2016Q3:1.5.0.102 pkgsrc-2016Q3-base:1.5 pkgsrc-2016Q2:1.5.0.100 pkgsrc-2016Q2-base:1.5 pkgsrc-2016Q1:1.5.0.98 pkgsrc-2016Q1-base:1.5 pkgsrc-2015Q4:1.5.0.96 pkgsrc-2015Q4-base:1.5 pkgsrc-2015Q3:1.5.0.94 pkgsrc-2015Q3-base:1.5 pkgsrc-2015Q2:1.5.0.92 pkgsrc-2015Q2-base:1.5 pkgsrc-2015Q1:1.5.0.90 pkgsrc-2015Q1-base:1.5 pkgsrc-2014Q4:1.5.0.88 pkgsrc-2014Q4-base:1.5 pkgsrc-2014Q3:1.5.0.86 pkgsrc-2014Q3-base:1.5 pkgsrc-2014Q2:1.5.0.84 pkgsrc-2014Q2-base:1.5 pkgsrc-2014Q1:1.5.0.82 pkgsrc-2014Q1-base:1.5 pkgsrc-2013Q4:1.5.0.80 pkgsrc-2013Q4-base:1.5 pkgsrc-2013Q3:1.5.0.78 pkgsrc-2013Q3-base:1.5 pkgsrc-2013Q2:1.5.0.76 pkgsrc-2013Q2-base:1.5 pkgsrc-2013Q1:1.5.0.74 pkgsrc-2013Q1-base:1.5 pkgsrc-2012Q4:1.5.0.72 pkgsrc-2012Q4-base:1.5 pkgsrc-2012Q3:1.5.0.70 pkgsrc-2012Q3-base:1.5 pkgsrc-2012Q2:1.5.0.68 pkgsrc-2012Q2-base:1.5 pkgsrc-2012Q1:1.5.0.66 pkgsrc-2012Q1-base:1.5 pkgsrc-2011Q4:1.5.0.64 pkgsrc-2011Q4-base:1.5 pkgsrc-2011Q3:1.5.0.62 pkgsrc-2011Q3-base:1.5 pkgsrc-2011Q2:1.5.0.60 pkgsrc-2011Q2-base:1.5 pkgsrc-2011Q1:1.5.0.58 pkgsrc-2011Q1-base:1.5 pkgsrc-2010Q4:1.5.0.56 pkgsrc-2010Q4-base:1.5 pkgsrc-2010Q3:1.5.0.54 pkgsrc-2010Q3-base:1.5 pkgsrc-2010Q2:1.5.0.52 pkgsrc-2010Q2-base:1.5 pkgsrc-2010Q1:1.5.0.50 pkgsrc-2010Q1-base:1.5 pkgsrc-2009Q4:1.5.0.48 pkgsrc-2009Q4-base:1.5 pkgsrc-2009Q3:1.5.0.46 pkgsrc-2009Q3-base:1.5 pkgsrc-2009Q2:1.5.0.44 pkgsrc-2009Q2-base:1.5 pkgsrc-2009Q1:1.5.0.42 pkgsrc-2009Q1-base:1.5 pkgsrc-2008Q4:1.5.0.40 pkgsrc-2008Q4-base:1.5 pkgsrc-2008Q3:1.5.0.38 pkgsrc-2008Q3-base:1.5 cube-native-xorg:1.5.0.36 cube-native-xorg-base:1.5 pkgsrc-2008Q2:1.5.0.34 pkgsrc-2008Q2-base:1.5 cwrapper:1.5.0.32 pkgsrc-2008Q1:1.5.0.30 pkgsrc-2008Q1-base:1.5 pkgsrc-2007Q4:1.5.0.28 pkgsrc-2007Q4-base:1.5 pkgsrc-2007Q3:1.5.0.26 pkgsrc-2007Q3-base:1.5 pkgsrc-2007Q2:1.5.0.24 pkgsrc-2007Q2-base:1.5 pkgsrc-2007Q1:1.5.0.22 pkgsrc-2007Q1-base:1.5 pkgsrc-2006Q4:1.5.0.20 pkgsrc-2006Q4-base:1.5 pkgsrc-2006Q3:1.5.0.18 pkgsrc-2006Q3-base:1.5 pkgsrc-2006Q2:1.5.0.16 pkgsrc-2006Q2-base:1.5 pkgsrc-2006Q1:1.5.0.14 pkgsrc-2006Q1-base:1.5 pkgsrc-2005Q4:1.5.0.12 pkgsrc-2005Q4-base:1.5 pkgsrc-2005Q3:1.5.0.10 pkgsrc-2005Q3-base:1.5 pkgsrc-2005Q2:1.5.0.8 pkgsrc-2005Q2-base:1.5 pkgsrc-2005Q1:1.5.0.6 pkgsrc-2005Q1-base:1.5 pkgsrc-2004Q4:1.5.0.4 pkgsrc-2004Q4-base:1.5 pkgsrc-2004Q3:1.5.0.2 pkgsrc-2004Q3-base:1.5 pkgsrc-2004Q2:1.3.0.2 pkgsrc-2004Q2-base:1.3; locks; strict; comment @# @; 1.5 date 2004.07.26.23.25.19; author wiz; state Exp; branches; next 1.4; 1.4 date 2004.06.30.14.22.49; author kivinen; state Exp; branches; next 1.3; 1.3 date 2004.06.09.22.22.09; author kivinen; state Exp; branches; next 1.2; 1.2 date 2004.06.09.22.15.41; author kivinen; state Exp; branches; next 1.1; 1.1 date 2004.06.09.21.00.05; author kivinen; state Exp; branches; next ; desc @@ 1.5 log @Add patch from Michael Eriksson in PR 26438: The patches for asapm to try sysmon if APM fails, only support battery info in units of Watts and Watt hours. However, some machines like my Compaq Presario X1007EA laptop uses units of Amperes and Ampere hours. Bump PKGREVISION. @ text @$NetBSD: patch-af,v 1.4 2004/06/30 14:22:49 kivinen Exp $ --- apm_read.c.orig 2001-11-23 23:07:19.000000000 +0200 +++ apm_read.c @@@@ -31,6 +31,7 @@@@ /* file -> APM device */ extern char apm_device_file[]; +extern char sysmon_device_file[]; #include "state.h" extern struct apm_state state; @@@@ -136,18 +137,185 @@@@ state.time_left = info.ai_batt_time / 60; } #elif defined(__NetBSD__)||defined(__OpenBSD__) + +#include + +/* We cannot use ifdef ENVSYS_SWATTHOUR etc as it is enum. The + ENVSYS_FFRACVALID was added at the same time as WATTHOUR and INDICATOR, so + we use it to see if we have the support for those. */ +#ifdef ENVSYS_FFRACVALID +#define HAVE_ENVSYS_SWATTHOUR +#define HAVE_ENVSYS_INDICATOR +#endif /* ENVSYS_FFRACVALID */ + +int match_end(const char *str, const char *end_part) +{ + int len1, len2; + len1 = strlen(str); + len2 = strlen(end_part); + if (len1 < len2) + return 0; + return strcmp(str + len1 - len2, end_part) == 0; +} + +void TrySysmonDevice( ) +{ + int fd; + int count = 0; + envsys_basic_info_t ebis; + envsys_tre_data_t etds; + int32_t design, charge, warn_cap, low_cap, discharge_rate, charge_rate; + int connected, charging, percent, time_units, battery_status; + + if ((fd = open(sysmon_device_file, O_RDONLY)) == -1) { + error_handle(1, ""); + return; + } + + design = 0; + charge = 0; + warn_cap = 0; + low_cap = 0; + charge_rate = 0; + discharge_rate = 0; + connected = 0; + charging = 0; + percent = 0; + time_units = 0; + + for(etds.sensor = 0; ; etds.sensor++) { + if (ioctl(fd, ENVSYS_GTREDATA, &etds) == -1) { + error_handle(4, ""); + close(fd); + return; + } + if (!(etds.validflags & ENVSYS_FVALID)) + break; + + ebis.sensor = etds.sensor; + if (ioctl(fd, ENVSYS_GTREINFO, &ebis) == -1) { + error_handle(4, ""); + close(fd); + return; + } + + if (etds.units != ebis.units) { + error_handle(6, "units does not match"); + } + + if (!(etds.validflags & ENVSYS_FCURVALID)) + continue; + +#ifdef HAVE_ENVSYS_SWATTHOUR + if (etds.units == ENVSYS_SWATTHOUR || + etds.units == ENVSYS_SAMPHOUR) { + /* Watt or amp hours, this must be battery cap info. */ + if (match_end(ebis.desc, " design cap")) { + design += etds.cur.data_s; + } else if (match_end(ebis.desc, " charge")) { + charge += etds.cur.data_s; + } else if (match_end(ebis.desc, " warn cap")) { + warn_cap += etds.cur.data_s; + } else if (match_end(ebis.desc, " low cap")) { + low_cap += etds.cur.data_s; + } + } +#endif /* HAVE_ENVSYS_SWATTHOUR */ +#ifdef HAVE_ENVSYS_INDICATOR + if (etds.units == ENVSYS_INDICATOR) { + /* Indicator of something, check for connected. */ + if (match_end(ebis.desc, " connected")) { + connected = etds.cur.data_us; + } else if (match_end(ebis.desc, " charging")) { + charging = etds.cur.data_us; + } + + } +#endif /* HAVE_ENVSYS_INDICATOR */ + if (etds.units == ENVSYS_SWATTS || + etds.units == ENVSYS_SAMPS) { + /* Watts or apms, this must discharge rate. */ + if (match_end(ebis.desc, " discharge rate")) { + discharge_rate += etds.cur.data_s; + } else if (match_end(ebis.desc, " charge rate")) { + charge_rate += etds.cur.data_s; + } + + } + } + + if (state.ac_line_status != connected) { + state.ac_line_status = connected ? AC_ONLINE : AC_BATTERY; + ++state.update; + if ( state.ac_line_status == AC_ONLINE ) + state.flags |= CHANGE_AC_ON; + else + state.flags |= CHANGE_AC_OFF; + } + if (charging) { + battery_status = BATTERY_CHARGING; + } else { + if (charge > warn_cap) { + battery_status = BATTERY_HIGH; + } else if (charge > low_cap) { + battery_status = BATTERY_LOW; + } else { + battery_status = BATTERY_CRITICAL; + } + } + + if (state.battery_status != battery_status) { + state.battery_status = battery_status; + ++state.update; + } + + if (design != 0) { + percent = charge / (design / 100); + if (percent > 100) { + percent = 100; + } + else if (percent < 0) { + percent = 0; + } + } + if (state.percent != percent) { + if ( state.percent < percent ) + state.flags |= CHANGE_POWER_UP; + else + state.flags |= CHANGE_POWER_DOWN; + state.percent = percent; + ++state.update; + } + + if (discharge_rate > 0) { + time_units = charge / (discharge_rate / 60); + } else if (charge_rate > 0 && design > 0 && charging) { + time_units = (design - charge) / (charge_rate / 60); + } + + /* we can display maximum 99:59 */ + if ( time_units > 5999 ) + time_units = 5999; + if (state.time_left != time_units) { + state.time_left = time_units; + ++state.update; + } + close(fd); + return; +} + void ReadAPMDevice( ) /* NetBSD version */ { int fd; struct apm_power_info info; memset(&info, 0, sizeof(info)); if ((fd = open(apm_device_file, O_RDONLY)) == -1) { - error_handle(1, ""); + TrySysmonDevice(); return; } if (ioctl(fd, APM_IOC_GETPOWER, &info) == -1) { - error_handle(4, ""); close(fd); + TrySysmonDevice(); return; } close(fd); @ 1.4 log @ Fixed to work in NetBSD 1.6.* also. Tested on NetBSD 2.0 BETA and NetBSD 1.6. Updated PKGREVISION and DESCR and MESSAGE texts. @ text @d1 1 a1 1 $NetBSD$ d13 1 a13 1 @@@@ -136,18 +137,183 @@@@ void ReadAPMDevice( ) /* FreeBSD versio d87 3 a89 2 + if (etds.units == ENVSYS_SWATTHOUR) { + /* Watt hours, this must be battery capacity info. */ d112 3 a114 2 + if (etds.units == ENVSYS_SWATTS) { + /* Watts, this must discharge rate. */ @ 1.3 log @ Fixed state of the ac online, it was reversed. @ text @d13 1 a13 1 @@@@ -136,18 +137,163 @@@@ void ReadAPMDevice( ) /* FreeBSD versio d20 8 d44 1 a44 1 + int32_t design, charge, warn_cap, low_cap, rate; d56 2 a57 1 + rate = 0; d86 1 d98 4 a101 1 + } else if (etds.units == ENVSYS_INDICATOR) { d109 3 a111 1 + } else if (etds.units == ENVSYS_SWATTS) { d114 3 a116 1 + rate += etds.cur.data_s; d118 1 d165 4 a168 2 + if (rate > 0) { + time_units = charge / (rate / 60); @ 1.2 log @ Fixed the charging status checking, and do not give out time estimate if discharge rate is negative. @ text @d105 1 a105 1 + state.ac_line_status = connected ? AC_BATTERY : AC_ONLINE; @ 1.1 log @ Implemented support for envsys to get battery etc information from acpi. Only tested on one laptop, I do not know whether the envsys names for the acpi devices are stable enough to be used, but I didn't find any other way to distinguish different things. As this laptop does not support apm, I hope it still works after these modifications. @ text @d37 1 a37 1 + int connected, percent, time_units, battery_status; d50 1 d79 1 a79 1 + if (match_end(ebis.desc, "design cap")) { d81 1 a81 1 + } else if (match_end(ebis.desc, "charge")) { d83 1 a83 1 + } else if (match_end(ebis.desc, "warn cap")) { d85 1 a85 1 + } else if (match_end(ebis.desc, "low cap")) { d92 2 d95 1 d98 1 a98 1 + if (match_end(ebis.desc, "discharge rate")) { d112 2 a113 6 + if (connected) { + if (charge > design) { + battery_status = BATTERY_HIGH; + } else { + battery_status = BATTERY_CHARGING; + } d147 1 a147 1 + if (rate != 0) { @