battery/batman: Various Improvements.

This adds support for multiple batteries on FreeBSD in line with
Linux and OpenBSD. Also display the vendor and model where
applicable. There are also fixes specific to the sysctl interface.
Fixes a potential crash and let's us have 100 batman gadgets if
wanted.
This commit is contained in:
Alastair Poole 2019-11-30 20:46:09 +00:00
parent 2c5c243b9e
commit 6b70114c6d
4 changed files with 99 additions and 86 deletions

View File

@ -126,7 +126,8 @@ _battery_sysctl_start(void)
# endif
_battery_sysctl_battery_update();
bat->last_update = ecore_time_get();
if (bat)
bat->last_update = ecore_time_get();
return 1;
}
@ -184,6 +185,8 @@ _battery_sysctl_battery_update()
ecore_poller_poller_interval_set(bat->poll,
battery_config->poll_interval);
# if defined(__OpenBSD__) || defined(__NetBSD__)
charge = 0;
/* last full capacity */
bat->mib[3] = 7;
bat->mib[4] = 0;

View File

@ -98,7 +98,9 @@ _batman_popup_create(Instance *inst)
elm_box_pack_end(box, label);
evas_object_show(label);
if (inst->cfg->batman.have_power && (inst->cfg->batman.full < 99))
if (eina_list_count(batman_device_batteries) == 0)
snprintf(buf, sizeof(buf), _("No Battery Found"));
else if (inst->cfg->batman.have_power && (inst->cfg->batman.full < 99))
snprintf(buf, sizeof(buf), _("Battery Charging"));
else if (inst->cfg->batman.full >= 99)
snprintf(buf, sizeof(buf), _("Battery Fully Charged"));
@ -112,6 +114,16 @@ _batman_popup_create(Instance *inst)
if (!eina_list_count(udis) || !eina_list_data_find(udis, bat->udi))
{
udis = eina_list_append(udis, bat->udi);
if (bat->vendor && bat->vendor[0] && bat->model && bat->model[0])
{
label = elm_label_add(box);
E_EXPAND(label); E_ALIGN(label, 0.5, 0.5);
snprintf(buf, sizeof(buf), "%s (%s)", bat->vendor, bat->model);
elm_object_text_set(label, buf);
elm_box_pack_end(box, label);
evas_object_show(label);
}
pbar = elm_progressbar_add(box);
E_EXPAND(pbar); E_FILL(pbar);
elm_progressbar_span_size_set(pbar, 200 * e_scale);

View File

@ -58,13 +58,6 @@ struct _Battery
Eina_Bool got_prop E_BITFIELD;
Eldbus_Proxy *proxy;
int * mib;
#if defined(__FreeBSD__) || defined(__DragonFly__)
int * mib_state;
int * mib_units;
int * mib_time;
int batteries;
int time_min;
#endif
};
struct _Ac_Adapter

View File

@ -3,6 +3,11 @@
#include <sys/types.h>
#include <sys/sysctl.h>
#if defined(__FreeBSD__) || defined(__DragonFly__)
# include <dev/acpica/acpiio.h>
# include <sys/ioctl.h>
#endif
#if defined(__OpenBSD__) || defined(__NetBSD__)
# include <sys/param.h>
# include <sys/sensors.h>
@ -25,10 +30,13 @@ _batman_sysctl_start(Instance *inst)
struct sensordev snsrdev;
size_t sdlen = sizeof(struct sensordev);
char name[256];
#elif defined(__FreeBSD__) || defined(__DragonFly__)
size_t len;
#endif
#if defined(__OpenBSD__) || defined(__NetBSD__)
if (eina_list_count(batman_device_batteries) != 0)
{
_batman_sysctl_battery_update(inst);
return 1;
}
for (devn = 0;; devn++)
{
mib[2] = devn;
@ -79,41 +87,49 @@ _batman_sysctl_start(Instance *inst)
}
}
#elif defined(__FreeBSD__) || defined(__DragonFly__)
if ((sysctlbyname("hw.acpi.battery.life", NULL, &len, NULL, 0)) != -1)
size_t len;
int i, count, fd;
union acpi_battery_ioctl_arg battio;
if (eina_list_count(batman_device_batteries) != 0)
{
Battery *bat = E_NEW(Battery, 1);
if (!bat)
return 0;
bat->inst = inst;
bat->mib = malloc(sizeof(int) * 4);
if (!bat->mib) return 0;
sysctlnametomib("hw.acpi.battery.life", bat->mib, &len);
bat->mib_state = malloc(sizeof(int) * 4);
if (!bat->mib_state) return 0;
sysctlnametomib("hw.acpi.battery.state", bat->mib_state, &len);
bat->mib_time = malloc(sizeof(int) * 4);
if (!bat->mib_time) return 0;
sysctlnametomib("hw.acpi.battery.time", bat->mib_time, &len);
bat->mib_units = malloc(sizeof(int) * 4);
if (!bat->mib_units) return 0;
sysctlnametomib("hw.acpi.battery.units", bat->mib_units, &len);
bat->last_update = ecore_time_get();
bat->udi = eina_stringshare_add("hw.acpi.battery");
bat->technology = eina_stringshare_add("Unknown");
bat->model = eina_stringshare_add("Unknown");
bat->vendor = eina_stringshare_add("Unknown");
bat->poll = ecore_poller_add(ECORE_POLLER_CORE,
inst->cfg->batman.poll_interval,
_batman_sysctl_battery_update_poll, inst);
batman_device_batteries = eina_list_append(batman_device_batteries, bat);
_batman_sysctl_battery_update(inst);
return 1;
}
if ((fd = open("/dev/acpi", O_RDONLY)) == -1)
return 0;
if (ioctl(fd, ACPIIO_BATT_GET_UNITS, &count) == -1)
{
close(fd);
return 0;
}
for (i = 0; i < count; i++)
{
battio.unit = i;
if (ioctl(fd, ACPIIO_BATT_GET_BIF, &battio) != -1)
{
Battery *bat = E_NEW(Battery, 1);
if (!bat) return 0;
bat->inst = inst;
bat->last_update = ecore_time_get();
bat->last_full_charge = battio.bif.lfcap;
bat->model = eina_stringshare_add(battio.bif.model);
bat->vendor = eina_stringshare_add(battio.bif.oeminfo);
bat->technology = eina_stringshare_add(battio.bif.type);
bat->poll = ecore_poller_add(ECORE_POLLER_CORE,
inst->cfg->batman.poll_interval,
_batman_sysctl_battery_update_poll, inst);
batman_device_batteries = eina_list_append(batman_device_batteries, bat);
}
}
close(fd);
if ((sysctlbyname("hw.acpi.acline", NULL, &len, NULL, 0)) != -1)
{
Ac_Adapter *ac = E_NEW(Ac_Adapter, 1);
@ -155,11 +171,6 @@ _batman_sysctl_stop(void)
E_FREE_FUNC(bat->model, eina_stringshare_del);
E_FREE_FUNC(bat->vendor, eina_stringshare_del);
E_FREE_FUNC(bat->poll, ecore_poller_del);
#if defined(__FreeBSD__) || defined(__DragonFly__)
E_FREE(bat->mib_state);
E_FREE(bat->mib_time);
E_FREE(bat->mib_units);
#endif
E_FREE(bat->mib);
E_FREE(bat);
}
@ -189,9 +200,9 @@ _batman_sysctl_battery_update(Instance *inst)
struct sensor s;
size_t slen = sizeof(struct sensor);
#elif defined(__FreeBSD__) || defined(__DragonFly__)
double _time;
int value;
union acpi_battery_ioctl_arg battio;
size_t len;
int value, fd, i = 0;
#endif
EINA_LIST_FOREACH(batman_device_batteries, l, bat)
{
@ -284,44 +295,38 @@ _batman_sysctl_battery_update(Instance *inst)
}
_batman_device_update(bat->inst);
#elif defined(__FreeBSD__) || defined(__DragonFly__)
len = sizeof(value);
if ((sysctl(bat->mib, 4, &value, &len, NULL, 0)) == -1)
if ((fd = open("/dev/acpi", O_RDONLY)) != -1)
{
return EINA_FALSE;
battio.unit = i;
if (ioctl(fd, ACPIIO_BATT_GET_BATTINFO, &battio) != -1)
{
bat->got_prop = 1;
bat->percent = battio.battinfo.cap;
if (battio.battinfo.state & ACPI_BATT_STAT_CHARGING)
bat->charging = EINA_TRUE;
else
bat->charging = EINA_FALSE;
bat->time_left = battio.battinfo.min * 60;
if (bat->charge_rate > 0)
{
bat->time_full = (bat->last_full_charge - bat->current_charge) / bat->charge_rate;
}
}
else
{
bat->time_full = bat->time_left = -1;
}
close(fd);
}
bat->percent = value;
_time = ecore_time_get();
bat->last_update = _time;
len = sizeof(value);
if ((sysctl(bat->mib_state, 4, &value, &len, NULL, 0)) == -1)
{
return EINA_FALSE;
}
bat->charging = !value;
bat->got_prop = 1;
bat->time_full = -1;
bat->time_left = -1;
len = sizeof(bat->time_min);
if ((sysctl(bat->mib_time, 4, &bat->time_min, &len, NULL, 0)) == -1)
{
bat->time_min = -1;
}
len = sizeof(bat->batteries);
if ((sysctl(bat->mib_units, 4, &bat->batteries, &len, NULL, 0)) == -1)
{
bat->batteries = 1;
}
if (bat->time_min >= 0) bat->time_left = bat->time_min * 60;
if (bat->batteries == 1) bat->time_left = -1;
_batman_device_update(inst);
i++;
#endif
}