diff --git a/sys/dev/acpi/acpi_bat.c b/sys/dev/acpi/acpi_bat.c index e3d34c722ad0..10d2ed0d89d1 100644 --- a/sys/dev/acpi/acpi_bat.c +++ b/sys/dev/acpi/acpi_bat.c @@ -1,4 +1,4 @@ -/* $NetBSD: acpi_bat.c,v 1.60 2007/11/02 19:21:29 plunky Exp $ */ +/* $NetBSD: acpi_bat.c,v 1.61 2007/11/03 23:05:22 xtraeme Exp $ */ /*- * Copyright (c) 2003 The NetBSD Foundation, Inc. @@ -86,7 +86,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: acpi_bat.c,v 1.60 2007/11/02 19:21:29 plunky Exp $"); +__KERNEL_RCSID(0, "$NetBSD: acpi_bat.c,v 1.61 2007/11/03 23:05:22 xtraeme Exp $"); #include #include @@ -469,7 +469,7 @@ acpibat_get_status(device_t dv) } sc->sc_data[ACPIBAT_CHARGE_STATE].value_cur = - ENVSYS_BATTERY_STATE_NORMAL; + ENVSYS_BATTERY_CAPACITY_NORMAL; sc->sc_data[ACPIBAT_CAPACITY].value_cur = p2[2].Integer.Value * 1000; sc->sc_data[ACPIBAT_CAPACITY].state = ENVSYS_SVALID; @@ -482,20 +482,20 @@ acpibat_get_status(device_t dv) sc->sc_data[ACPIBAT_WCAPACITY].value_cur) { sc->sc_data[ACPIBAT_CAPACITY].state = ENVSYS_SWARNUNDER; sc->sc_data[ACPIBAT_CHARGE_STATE].value_cur = - ENVSYS_BATTERY_STATE_WARNING; + ENVSYS_BATTERY_CAPACITY_WARNING; } if (sc->sc_data[ACPIBAT_CAPACITY].value_cur < sc->sc_data[ACPIBAT_LCAPACITY].value_cur) { sc->sc_data[ACPIBAT_CAPACITY].state = ENVSYS_SCRITUNDER; sc->sc_data[ACPIBAT_CHARGE_STATE].value_cur = - ENVSYS_BATTERY_STATE_LOW; + ENVSYS_BATTERY_CAPACITY_LOW; } if (status & ACPIBAT_ST_CRITICAL) { sc->sc_data[ACPIBAT_CAPACITY].state = ENVSYS_SCRITICAL; sc->sc_data[ACPIBAT_CHARGE_STATE].value_cur = - ENVSYS_BATTERY_STATE_CRITICAL; + ENVSYS_BATTERY_CAPACITY_CRITICAL; } mutex_exit(&sc->sc_mtx); @@ -706,8 +706,8 @@ acpibat_init_envsys(device_t dv) INITDATA(ACPIBAT_CHARGERATE, rateunit, "charge rate"); INITDATA(ACPIBAT_DISCHARGERATE, rateunit, "discharge rate"); INITDATA(ACPIBAT_CAPACITY, capunit, "charge"); - INITDATA(ACPIBAT_CHARGING, ENVSYS_INDICATOR, "charging"); - INITDATA(ACPIBAT_CHARGE_STATE, ENVSYS_BATTERY_STATE, "charge state"); + INITDATA(ACPIBAT_CHARGING, ENVSYS_BATTERY_CHARGE, "charging"); + INITDATA(ACPIBAT_CHARGE_STATE, ENVSYS_BATTERY_CAPACITY, "charge state"); #undef INITDATA diff --git a/sys/dev/sysmon/sysmon_envsys.c b/sys/dev/sysmon/sysmon_envsys.c index f8ae7623ac5b..316f54301166 100644 --- a/sys/dev/sysmon/sysmon_envsys.c +++ b/sys/dev/sysmon/sysmon_envsys.c @@ -1,4 +1,4 @@ -/* $NetBSD: sysmon_envsys.c,v 1.70 2007/11/02 19:21:29 plunky Exp $ */ +/* $NetBSD: sysmon_envsys.c,v 1.71 2007/11/03 23:05:21 xtraeme Exp $ */ /*- * Copyright (c) 2007 Juan Romero Pardines. @@ -64,7 +64,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: sysmon_envsys.c,v 1.70 2007/11/02 19:21:29 plunky Exp $"); +__KERNEL_RCSID(0, "$NetBSD: sysmon_envsys.c,v 1.71 2007/11/03 23:05:21 xtraeme Exp $"); #include #include @@ -382,6 +382,9 @@ sysmonioctl_envsys(dev_t dev, u_long cmd, void *data, int flag, struct lwp *l) tred->min.data_s = edata->value_min; tred->avg.data_us = edata->value_avg; tred->avg.data_s = edata->value_avg; + if (edata->units == ENVSYS_BATTERY_CHARGE) + tred->units = ENVSYS_INDICATOR; + else tred->units = edata->units; tred->validflags |= ENVSYS_FVALID; @@ -429,6 +432,9 @@ sysmonioctl_envsys(dev_t dev, u_long cmd, void *data, int flag, struct lwp *l) binfo->validflags |= ENVSYS_FVALID; if (binfo->sensor < sme->sme_nsensors) { + if (edata->units == ENVSYS_BATTERY_CHARGE) + binfo->units = ENVSYS_INDICATOR; + else binfo->units = edata->units; /* @@ -1000,14 +1006,15 @@ sme_add_sensor_dictionary(struct sysmon_envsys *sme, prop_array_t array, * * ... * - * always false on Battery state, Drive and Indicator types. + * always false on Battery {capacity,charge}, Drive and Indicator types. * They cannot be monitored. * */ if ((edata->flags & ENVSYS_FMONNOTSUPP) || (edata->units == ENVSYS_INDICATOR) || (edata->units == ENVSYS_DRIVE) || - (edata->units == ENVSYS_BATTERY_STATE)) { + (edata->units == ENVSYS_BATTERY_CAPACITY) || + (edata->units == ENVSYS_BATTERY_CHARGE)) { if (sme_sensor_upbool(dict, "monitoring-supported", false)) goto out; } else { @@ -1050,20 +1057,20 @@ sme_add_sensor_dictionary(struct sysmon_envsys *sme, prop_array_t array, /* - * Add the battery-state object for battery state sensors: + * Add the object for battery capacity sensors: * * ... - * battery-state + * battery-capacity * NORMAL * ... */ - if (edata->units == ENVSYS_BATTERY_STATE) { - sdt = sme_get_description_table(SME_DESC_BATTERY_STATES); + if (edata->units == ENVSYS_BATTERY_CAPACITY) { + sdt = sme_get_description_table(SME_DESC_BATTERY_CAPACITY); for (j = 0; sdt[j].type != -1; j++) if (sdt[j].type == edata->value_cur) break; - if (sme_sensor_upstring(dict, "battery-state", sdt[j].desc)) + if (sme_sensor_upstring(dict, "battery-capacity", sdt[j].desc)) goto out; } @@ -1271,11 +1278,12 @@ sme_update_dictionary(struct sysmon_envsys *sme) break; /* - * Integer and Indicator types do not the following - * values, so skip them. + * Battery charge, Integer and Indicator types do not + * need the following objects, so skip them. */ if (edata->units == ENVSYS_INTEGER || - edata->units == ENVSYS_INDICATOR) + edata->units == ENVSYS_INDICATOR || + edata->units == ENVSYS_BATTERY_CHARGE) continue; /* update sensor flags */ @@ -1344,16 +1352,16 @@ sme_update_dictionary(struct sysmon_envsys *sme) break; } - /* update 'battery-state' only in ENVSYS_BATTERY_STATE. */ - if (edata->units == ENVSYS_BATTERY_STATE) { + /* update 'battery-capacity' only in ENVSYS_BATTERY_CAPACITY. */ + if (edata->units == ENVSYS_BATTERY_CAPACITY) { sdt = - sme_get_description_table(SME_DESC_BATTERY_STATES); + sme_get_description_table(SME_DESC_BATTERY_CAPACITY); for (j = 0; sdt[j].type != -1; j++) if (sdt[j].type == edata->value_cur) break; error = sme_sensor_upstring(dict, - "battery-state", + "battery-capacity", sdt[j].desc); if (error) break; diff --git a/sys/dev/sysmon/sysmon_envsys_events.c b/sys/dev/sysmon/sysmon_envsys_events.c index e9aede046aa9..f10de5f9955f 100644 --- a/sys/dev/sysmon/sysmon_envsys_events.c +++ b/sys/dev/sysmon/sysmon_envsys_events.c @@ -1,4 +1,4 @@ -/* $NetBSD: sysmon_envsys_events.c,v 1.43 2007/10/23 21:36:03 xtraeme Exp $ */ +/* $NetBSD: sysmon_envsys_events.c,v 1.44 2007/11/03 23:05:21 xtraeme Exp $ */ /*- * Copyright (c) 2007 Juan Romero Pardines. @@ -30,7 +30,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: sysmon_envsys_events.c,v 1.43 2007/10/23 21:36:03 xtraeme Exp $"); +__KERNEL_RCSID(0, "$NetBSD: sysmon_envsys_events.c,v 1.44 2007/11/03 23:05:21 xtraeme Exp $"); #include #include @@ -75,7 +75,8 @@ static int sme_events_timeout = 10; static int sme_events_timeout_sysctl(SYSCTLFN_PROTO); #define SME_EVTIMO (sme_events_timeout * hz) -static int sme_event_check_low_power(void); +static bool sme_event_check_low_power(void); +static bool sme_battery_critical(envsys_data_t *); /* * sysctl(9) stuff to handle the refresh value in the callout @@ -598,10 +599,10 @@ do { \ sdt = sme_get_description_table(SME_DESC_DRIVE_STATES); state = ENVSYS_DRIVE_ONLINE; break; - case ENVSYS_BATTERY_STATE: + case ENVSYS_BATTERY_CAPACITY: sdt = - sme_get_description_table(SME_DESC_BATTERY_STATES); - state = ENVSYS_BATTERY_STATE_NORMAL; + sme_get_description_table(SME_DESC_BATTERY_CAPACITY); + state = ENVSYS_BATTERY_CAPACITY_NORMAL; break; default: panic("%s: invalid units for ENVSYS_FMONSTCHANGED", @@ -649,19 +650,18 @@ out: mutex_exit(&sme_mtx); } -static int +static bool sme_event_check_low_power(void) { struct sysmon_envsys *sme; envsys_data_t *edata; - int i, batteries_cnt, batteries_discharged; - bool acadapter_on, acadapter_sensor_found; - - acadapter_on = acadapter_sensor_found = false; - batteries_cnt = batteries_discharged = 0; + int i; + bool battery, batterycap, batterycharge; KASSERT(mutex_owned(&sme_mtx)); + battery = batterycap = batterycharge = false; + LIST_FOREACH(sme, &sysmon_envsys_list, sme_list) if (sme->sme_class == SME_CLASS_ACADAPTER) break; @@ -670,50 +670,59 @@ sme_event_check_low_power(void) * No AC Adapter devices were found, do nothing. */ if (!sme) - return 0; + return false; + /* + * If there's an AC Adapter connected, there's no need + * to continue... + */ for (i = 0; i < sme->sme_nsensors; i++) { edata = &sme->sme_sensor_data[i]; if (edata->units == ENVSYS_INDICATOR) { - acadapter_sensor_found = true; - if (edata->value_cur) { - acadapter_on = true; - break; - } + if (edata->value_cur) + return false; } } + /* - * There's an AC Adapter device connected or there wasn't - * any sensor capable of returning its state. + * Check for battery devices and its state. */ - if (acadapter_on || !acadapter_sensor_found) - return 0; - -#define IS_BATTERY_DISCHARGED() \ -do { \ - if (((edata->units == ENVSYS_BATTERY_STATE) && \ - ((edata->value_cur == ENVSYS_BATTERY_STATE_CRITICAL) || \ - (edata->value_cur == ENVSYS_BATTERY_STATE_LOW)))) { \ - batteries_discharged++; \ - break; \ - } \ -} while (/* CONSTCOND */ 0) - LIST_FOREACH(sme, &sysmon_envsys_list, sme_list) { - if (sme->sme_class == SME_CLASS_BATTERY) { - batteries_cnt++; - for (i = 0; i < sme->sme_nsensors; i++) { - edata = &sme->sme_sensor_data[i]; - IS_BATTERY_DISCHARGED(); + if (sme->sme_class != SME_CLASS_BATTERY) + continue; + + /* + * We've found a battery device... + */ + battery = true; + for (i = 0; i < sme->sme_nsensors; i++) { + edata = &sme->sme_sensor_data[i]; + if (edata->units == ENVSYS_BATTERY_CAPACITY) { + batterycap = true; + if (!sme_battery_critical(edata)) + return false; + } else if (edata->units == ENVSYS_BATTERY_CHARGE) { + batterycharge = true; + if (edata->value_cur) + return false; } } } + if (!battery || !batterycap || !batterycharge) + return false; /* - * All batteries are discharged? + * All batteries in low/critical capacity and discharging. */ - if (batteries_cnt == batteries_discharged) - return 1; - - return 0; + return true; +} + +static bool +sme_battery_critical(envsys_data_t *edata) +{ + if (edata->value_cur == ENVSYS_BATTERY_CAPACITY_CRITICAL || + edata->value_cur == ENVSYS_BATTERY_CAPACITY_LOW) + return true; + + return false; } diff --git a/sys/dev/sysmon/sysmon_envsys_tables.c b/sys/dev/sysmon/sysmon_envsys_tables.c index a217bfe3190b..63dc07ab131e 100644 --- a/sys/dev/sysmon/sysmon_envsys_tables.c +++ b/sys/dev/sysmon/sysmon_envsys_tables.c @@ -1,4 +1,4 @@ -/* $NetBSD: sysmon_envsys_tables.c,v 1.2 2007/10/07 04:11:15 xtraeme Exp $ */ +/* $NetBSD: sysmon_envsys_tables.c,v 1.3 2007/11/03 23:05:21 xtraeme Exp $ */ /*- * Copyright (c) 2007 Juan Romero Pardines. @@ -26,7 +26,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: sysmon_envsys_tables.c,v 1.2 2007/10/07 04:11:15 xtraeme Exp $"); +__KERNEL_RCSID(0, "$NetBSD: sysmon_envsys_tables.c,v 1.3 2007/11/03 23:05:21 xtraeme Exp $"); #include @@ -49,7 +49,8 @@ static const struct sme_description_table sme_units_description[] = { { ENVSYS_INDICATOR, PENVSYS_TYPE_INDICATOR, "Indicator" }, { ENVSYS_INTEGER, PENVSYS_TYPE_INDICATOR, "Integer" }, { ENVSYS_DRIVE, PENVSYS_TYPE_DRIVE, "Drive" }, - { ENVSYS_BATTERY_STATE, PENVSYS_TYPE_BATTERY, "Battery state" }, + { ENVSYS_BATTERY_CAPACITY, PENVSYS_TYPE_BATTERY,"Battery capacity" }, + { ENVSYS_BATTERY_CHARGE, -1, "Battery charge" }, { -1, -1, "unknown" } }; @@ -85,13 +86,13 @@ static const struct sme_description_table sme_drivestate_description[] = { }; /* - * Available battery state descriptions. + * Available battery capacity descriptions. */ -static const struct sme_description_table sme_batterystate_description[] = { - { ENVSYS_BATTERY_STATE_NORMAL, -1, "NORMAL" }, - { ENVSYS_BATTERY_STATE_WARNING, -1, "WARNING" }, - { ENVSYS_BATTERY_STATE_CRITICAL, -1, "CRITICAL" }, - { ENVSYS_BATTERY_STATE_LOW, -1, "LOW" }, +static const struct sme_description_table sme_batterycap_description[] = { + { ENVSYS_BATTERY_CAPACITY_NORMAL, -1, "NORMAL" }, + { ENVSYS_BATTERY_CAPACITY_WARNING, -1, "WARNING" }, + { ENVSYS_BATTERY_CAPACITY_CRITICAL, -1, "CRITICAL" }, + { ENVSYS_BATTERY_CAPACITY_LOW, -1, "LOW" }, { -1, -1, "UNKNOWN" } }; @@ -104,8 +105,7 @@ sme_get_description_table(int type) const struct sme_description_table *ud = sme_units_description; const struct sme_description_table *sd = sme_state_description; const struct sme_description_table *dd = sme_drivestate_description; - const struct sme_description_table *bd = sme_batterystate_description; - + const struct sme_description_table *bd = sme_batterycap_description; switch (type) { case SME_DESC_UNITS: return ud; @@ -113,7 +113,7 @@ sme_get_description_table(int type) return sd; case SME_DESC_DRIVE_STATES: return dd; - case SME_DESC_BATTERY_STATES: + case SME_DESC_BATTERY_CAPACITY: return bd; default: return NULL; diff --git a/sys/dev/sysmon/sysmon_envsysvar.h b/sys/dev/sysmon/sysmon_envsysvar.h index 6c45b77f9e3a..da5c42822e57 100644 --- a/sys/dev/sysmon/sysmon_envsysvar.h +++ b/sys/dev/sysmon/sysmon_envsysvar.h @@ -1,4 +1,4 @@ -/* $NetBSD: sysmon_envsysvar.h,v 1.22 2007/10/23 21:36:03 xtraeme Exp $ */ +/* $NetBSD: sysmon_envsysvar.h,v 1.23 2007/11/03 23:05:22 xtraeme Exp $ */ /*- * Copyright (c) 2007 Juan Romero Pardines. @@ -44,7 +44,7 @@ enum sme_description_types { SME_DESC_UNITS = 1, SME_DESC_STATES, SME_DESC_DRIVE_STATES, - SME_DESC_BATTERY_STATES + SME_DESC_BATTERY_CAPACITY }; #ifdef ENVSYS_DEBUG @@ -114,6 +114,7 @@ int sme_update_dictionary(struct sysmon_envsys *); int sme_userset_dictionary(struct sysmon_envsys *, prop_dictionary_t, prop_array_t); prop_dictionary_t sme_sensor_dictionary_get(prop_array_t, const char *); +struct sysmon_envsys *sysmon_envsys_find(const char *); /* functions to handle sysmon envsys events */ int sme_event_register(prop_dictionary_t, envsys_data_t *, const char *, diff --git a/sys/sys/envsys.h b/sys/sys/envsys.h index 1ecf126ae1f1..6aeeeb923529 100644 --- a/sys/sys/envsys.h +++ b/sys/sys/envsys.h @@ -1,4 +1,4 @@ -/* $NetBSD: envsys.h,v 1.17 2007/10/07 04:11:15 xtraeme Exp $ */ +/* $NetBSD: envsys.h,v 1.18 2007/11/03 23:05:21 xtraeme Exp $ */ /*- * Copyright (c) 1999, 2007 The NetBSD Foundation, Inc. @@ -53,7 +53,7 @@ #define ENVSYS_MAXSENSORS 512 #define ENVSYS_DESCLEN 32 -/* struct used by a device sensor */ +/* struct used by a sensor */ struct envsys_data { uint32_t sensor; /* sensor number */ uint32_t units; /* type of sensor */ @@ -86,7 +86,8 @@ enum envsys_units { ENVSYS_INDICATOR, /* Indicator */ ENVSYS_INTEGER, /* Integer */ ENVSYS_DRIVE, /* Drive */ - ENVSYS_BATTERY_STATE, /* Battery state */ + ENVSYS_BATTERY_CAPACITY, /* Battery capacity */ + ENVSYS_BATTERY_CHARGE, /* Battery charging/discharging */ ENVSYS_NSENSORS }; @@ -115,12 +116,12 @@ enum envsys_drive_states { ENVSYS_DRIVE_PFAIL /* drive is degraded */ }; -/* sensor battery states */ -enum envsys_battery_states { - ENVSYS_BATTERY_STATE_NORMAL = 1, /* normal cap in battery */ - ENVSYS_BATTERY_STATE_WARNING, /* warning cap in battery */ - ENVSYS_BATTERY_STATE_CRITICAL, /* critical cap in battery */ - ENVSYS_BATTERY_STATE_LOW /* low cap in battery */ +/* sensor battery capacity states */ +enum envsys_battery_capacity_states { + ENVSYS_BATTERY_CAPACITY_NORMAL = 1, /* normal cap in battery */ + ENVSYS_BATTERY_CAPACITY_WARNING, /* warning cap in battery */ + ENVSYS_BATTERY_CAPACITY_CRITICAL, /* critical cap in battery */ + ENVSYS_BATTERY_CAPACITY_LOW /* low cap in battery */ }; /* sensor flags */ @@ -140,9 +141,9 @@ enum envsys_battery_states { #define ENVSYS_FMONNOTSUPP 0x00000800 /* monitoring not supported */ #define ENVSYS_FNOTVALID 0x00001000 /* sensor is invalid */ -#define ENVSYS_GETDICTIONARY _IOWR('E', 0, struct plistref) -#define ENVSYS_SETDICTIONARY _IOWR('E', 1, struct plistref) -#define ENVSYS_REMOVEPROPS _IOWR('E', 2, struct plistref) +#define ENVSYS_GETDICTIONARY _IOWR('E', 0, struct plistref) +#define ENVSYS_SETDICTIONARY _IOWR('E', 1, struct plistref) +#define ENVSYS_REMOVEPROPS _IOWR('E', 2, struct plistref) /* * Compatibility with old interface. Only ENVSYS_GTREDATA diff --git a/usr.sbin/envstat/envstat.c b/usr.sbin/envstat/envstat.c index 75a0ffcbc90b..b177f0d25d0c 100644 --- a/usr.sbin/envstat/envstat.c +++ b/usr.sbin/envstat/envstat.c @@ -1,4 +1,4 @@ -/* $NetBSD: envstat.c,v 1.56 2007/10/07 04:16:48 xtraeme Exp $ */ +/* $NetBSD: envstat.c,v 1.57 2007/11/03 23:05:22 xtraeme Exp $ */ /*- * Copyright (c) 2007 Juan Romero Pardines. @@ -34,7 +34,7 @@ #include #ifndef lint -__RCSID("$NetBSD: envstat.c,v 1.56 2007/10/07 04:16:48 xtraeme Exp $"); +__RCSID("$NetBSD: envstat.c,v 1.57 2007/11/03 23:05:22 xtraeme Exp $"); #endif /* not lint */ #include @@ -74,7 +74,7 @@ struct envsys_sensor { char desc[ENVSYS_DESCLEN]; char type[ENVSYS_DESCLEN]; char drvstate[ENVSYS_DESCLEN]; - char battstate[ENVSYS_DESCLEN]; + char battcap[ENVSYS_DESCLEN]; char dvname[ENVSYS_DESCLEN]; }; @@ -431,12 +431,12 @@ find_sensors(prop_array_t array, const char *dvname) prop_string_cstring_nocopy(obj1), sizeof(gesen[gnelems].drvstate)); - /* get current battery state string */ - obj1 = prop_dictionary_get(obj, "battery-state"); + /* get current battery capacity string */ + obj1 = prop_dictionary_get(obj, "battery-capacity"); if (obj1) - (void)strlcpy(gesen[gnelems].battstate, + (void)strlcpy(gesen[gnelems].battcap, prop_string_cstring_nocopy(obj1), - sizeof(gesen[gnelems].battstate)); + sizeof(gesen[gnelems].battcap)); /* get current value */ obj1 = prop_dictionary_get(obj, "cur-value"); @@ -602,7 +602,11 @@ print_sensors(struct envsys_sensor *es, size_t nelems, const char *dvname) continue; } - if (strcmp(es[i].type, "Indicator") == 0) { + /* + * Indicator and Battery charge sensors. + */ + if ((strcmp(es[i].type, "Indicator") == 0) || + (strcmp(es[i].type, "Battery charge") == 0)) { (void)printf(": %10s", es[i].cur_value ? "ON" : "OFF"); @@ -664,10 +668,10 @@ do { \ (void)printf(": %10s", es[i].drvstate); - /* Battery state */ - } else if (strcmp(es[i].type, "Battery state") == 0) { + /* Battery capacity */ + } else if (strcmp(es[i].type, "Battery capacity") == 0) { - (void)printf(": %10s", es[i].battstate); + (void)printf(": %10s", es[i].battcap); /* everything else */ } else {