From: Landry Breuil Subject: Re: qcpas: generate apm events upon ac state changes To: tech@openbsd.org, patrick@openbsd.org, jca@openbsd.org Date: Fri, 8 Nov 2024 19:31:08 +0100 Le Fri, Nov 08, 2024 at 07:24:38PM +0100, Jeremie Courreges-Anglas a écrit : > On Fri, Nov 08, 2024 at 07:06:44PM +0100, Landry Breuil wrote: > > hi, > > > > small diff that allows qcpas to send apm events when the ac is plugged > > in/unplugged, thanks jca@ for the pointer. > > > > in userland, that's used by sysutils/upower that gives me the fancy battery/ac > > status via xfce4-power-manager on the x13s, before that it never got events on > > ac state changes, only the battery levels. > > > > i don't know if events should be sent upon battery level changes, > > That would be nice for people using apmd -z/-Z. Probably using the > same trick but with info->battery_life. Untested diff below if you > want to give it a try. well, i actually needed it too so that the apm device "wokes" upowerd so that it queries the sensors, otherwise it only reacted to ac events and not the battery levels changing.. so i ended up with more or less the same diff, except using uint32_t instead of u_char; not sold on it :) with that, upowerd properly updates the battery levels upon events. Index: qcpas.c =================================================================== RCS file: /cvs/src/sys/dev/fdt/qcpas.c,v diff -u -p -r1.7 qcpas.c --- qcpas.c 1 Sep 2024 03:14:48 -0000 1.7 +++ qcpas.c 8 Nov 2024 18:28:41 -0000 @@ -1460,7 +1460,7 @@ qcpas_pmic_rtr_bat_status(struct qcpas_s #if NAPM > 0 extern int hw_power; struct apm_power_info *info = &qcpas_pmic_rtr_apm_power_info; - uint32_t delta; + uint32_t delta, nblife; #endif #ifndef SMALL_KERNEL @@ -1509,8 +1509,10 @@ qcpas_pmic_rtr_bat_status(struct qcpas_s return; } - info->battery_life = - ((bat->capacity * 100) / sc->sc_last_full_capacity); + nblife = ((bat->capacity * 100) / sc->sc_last_full_capacity); + if (info->battery_life != nblife) + apm_record_event(APM_POWER_CHANGE); + info->battery_life = nblife; if (info->battery_life > 50) info->battery_state = APM_BATT_HIGH; else if (info->battery_life > 25) @@ -1532,9 +1534,13 @@ qcpas_pmic_rtr_bat_status(struct qcpas_s info->minutes_left = (60 * delta) / abs(bat->rate); if (bat->power_state & BATTMGR_PWR_STATE_AC_ON) { + if (info->ac_state != APM_AC_ON) + apm_record_event(APM_POWER_CHANGE); info->ac_state = APM_AC_ON; hw_power = 1; } else { + if (info->ac_state != APM_AC_OFF) + apm_record_event(APM_POWER_CHANGE); info->ac_state = APM_AC_OFF; hw_power = 0; }