battery: FreeBSD multiple batteries.

model/vendor/tech support. Some indentation to make the BSD
support easier to read and distinguish. Pleas test.
This commit is contained in:
Alastair Poole 2021-03-07 16:23:50 +00:00
parent a4630c0679
commit 945697ba0a
3 changed files with 142 additions and 173 deletions

View File

@ -520,7 +520,7 @@ _battery_config_updated(void)
{
#ifdef HAVE_EEZE
ok = _battery_udev_start();
#elif defined __OpenBSD__ || defined __DragonFly__ || defined __FreeBSD__ || defined __NetBSD__
#elif defined(__OpenBSD__) || defined(__DragonFly__) || defined(__FreeBSD__)
ok = _battery_sysctl_start();
#else
ok = _battery_upower_start();
@ -892,7 +892,7 @@ e_modapi_init(E_Module *m)
E_CONFIG_VAL(D, T, alert_timeout, INT);
E_CONFIG_VAL(D, T, suspend_below, INT);
E_CONFIG_VAL(D, T, force_mode, INT);
#if defined HAVE_EEZE || defined __OpenBSD__ || defined __NetBSD__
#if defined HAVE_EEZE || defined(__OpenBSD__)
E_CONFIG_VAL(D, T, fuzzy, INT);
#endif
E_CONFIG_VAL(D, T, desktop_notifications, INT);
@ -907,7 +907,7 @@ e_modapi_init(E_Module *m)
battery_config->alert_timeout = 0;
battery_config->suspend_below = 0;
battery_config->force_mode = 0;
#if defined HAVE_EEZE || defined __OpenBSD__ || defined __NetBSD__
#if defined HAVE_EEZE || defined(__OpenBSD__)
battery_config->fuzzy = 0;
#endif
battery_config->desktop_notifications = 0;
@ -980,7 +980,7 @@ e_modapi_shutdown(E_Module *m EINA_UNUSED)
#ifdef HAVE_EEZE
_battery_udev_stop();
#elif defined (__OpenBSD__) || defined (__DragonFly__) || defined (__FreeBSD__) || defined (__NetBSD__)
#elif defined(__OpenBSD__) || defined(__DragonFly__) || defined(__FreeBSD__)
_battery_sysctl_stop();
#else
_battery_upower_stop();

View File

@ -7,38 +7,37 @@
# include <Eldbus.h>
#endif
typedef struct _Config Config;
#define CHECK_NONE 0
#define CHECK_ACPI 1
#define CHECK_APM 2
#define CHECK_PMU 3
#define CHECK_SYS_ACPI 4
#define UNKNOWN 0
#define NOSUBSYSTEM 1
#define SUBSYSTEM 2
#define UNKNOWN 0
#define NOSUBSYSTEM 1
#define SUBSYSTEM 2
#define SUSPEND 0
#define HIBERNATE 1
#define SHUTDOWN 2
#define SUSPEND 0
#define HIBERNATE 1
#define SHUTDOWN 2
#define POPUP_DEBOUNCE_CYCLES 2
typedef struct _Config Config;
struct _Config
{
/* saved * loaded config values */
int poll_interval;
int alert; /* Alert on minutes remaining */
int alert_p; /* Alert on percentage remaining */
int alert_timeout; /* Popup dismissal timeout */
int suspend_below; /* Suspend if battery drops below this level */
int suspend_method; /* Method used to suspend the machine */
int force_mode; /* force use of batget or hal */
/* saved / loaded config values */
int poll_interval;
int alert; /* Alert on minutes remaining */
int alert_p; /* Alert on percentage remaining */
int alert_timeout; /* Popup dismissal timeout */
int suspend_below; /* Suspend if battery drops below this level */
int suspend_method; /* Method used to suspend the machine */
int force_mode; /* force use of batget or hal */
/* just config state */
E_Module *module;
E_Config_Dialog *config_dialog;
Eina_List *instances;
E_Module *module;
E_Config_Dialog *config_dialog;
Eina_List *instances;
Ecore_Exe *batget_exe;
Ecore_Event_Handler *batget_data_handler;
Ecore_Event_Handler *batget_del_handler;
@ -49,7 +48,7 @@ struct _Config
int have_battery;
int have_power;
Eina_Bool charging;
int desktop_notifications;
int desktop_notifications;
#ifdef HAVE_EEZE
Eeze_Udev_Watch *acwatch;
Eeze_Udev_Watch *batwatch;
@ -65,73 +64,74 @@ typedef struct _Ac_Adapter Ac_Adapter;
struct _Battery
{
const char *udi;
const char *udi;
#if defined HAVE_EEZE || defined __OpenBSD__ || defined __DragonFly__ || defined __FreeBSD__ || defined __NetBSD__
Ecore_Poller *poll;
#endif
Eina_Bool present E_BITFIELD;
Eina_Bool charging E_BITFIELD;
#if defined HAVE_EEZE || defined __OpenBSD__ || defined __DragonFly__ || defined __FreeBSD__ || defined __NetBSD__
double last_update;
double percent;
double current_charge;
double design_charge;
double last_full_charge;
double charge_rate;
double time_full;
double time_left;
Eina_Bool present E_BITFIELD;
Eina_Bool charging E_BITFIELD;
double last_update;
double percent;
double current_charge;
double design_charge;
double last_full_charge;
double charge_rate;
double time_full;
double time_left;
#else
int percent;
int current_charge;
int design_charge;
int last_full_charge;
int charge_rate;
int time_full;
int time_left;
const char *type;
const char *charge_units;
int percent;
int current_charge;
int design_charge;
int last_full_charge;
int charge_rate;
int time_full;
int time_left;
const char *type;
const char *charge_units;
#endif
const char *technology;
const char *model;
const char *vendor;
Eina_Bool got_prop E_BITFIELD;
const char *technology;
const char *model;
const char *vendor;
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;
#if defined __FreeBSD__ || defined __DragonFly__
int unit;
int batteries;
int time_min;
#endif
#if defined __OpenBSD__
int *mib;
#endif
};
struct _Ac_Adapter
{
const char *udi;
Eina_Bool present E_BITFIELD;
const char *product;
const char *udi;
Eina_Bool present E_BITFIELD;
const char *product;
Eldbus_Proxy *proxy;
int * mib;
#if defined __OpenBSD__
int *mib;
#endif
};
Battery *_battery_battery_find(const char *udi);
Battery *_battery_battery_find(const char *udi);
Ac_Adapter *_battery_ac_adapter_find(const char *udi);
void _battery_device_update(void);
void _battery_device_update(void);
#ifdef HAVE_EEZE
/* in e_mod_udev.c */
int _battery_udev_start(void);
void _battery_udev_stop(void);
int _battery_udev_start(void);
void _battery_udev_stop(void);
/* end e_mod_udev.c */
#elif !defined __OpenBSD__ && !defined __DragonFly__ && !defined __FreeBSD__ && !defined __NetBSD__
/* in e_mod_dbus.c */
int _battery_upower_start(void);
void _battery_upower_stop(void);
int _battery_upower_start(void);
void _battery_upower_stop(void);
/* end e_mod_dbus.c */
#else
/* in e_mod_sysctl.c */
int _battery_sysctl_start(void);
void _battery_sysctl_stop(void);
int _battery_sysctl_start(void);
void _battery_sysctl_stop(void);
/* end e_mod_sysctl.c */
#endif
@ -142,20 +142,7 @@ E_API int e_modapi_shutdown (E_Module *m);
E_API int e_modapi_save (E_Module *m);
E_Config_Dialog *e_int_config_battery_module(Evas_Object *parent, const char *params EINA_UNUSED);
void _battery_config_updated(void);
extern Config *battery_config;
/**
* @addtogroup Optional_Gadgets
* @{
*
* @defgroup Module_Battery Battery
*
* Shows battery level and current status, may do actions given some
* thresholds.
*
* @}
*/
extern Config *battery_config;
void _battery_config_updated(void);
#endif

View File

@ -1,12 +1,17 @@
#include "e.h"
#include "e_mod_main.h"
#if defined(__OpenBSD__) || defined(__NetBSD__) || defined(__FreeBSD__) || defined(__DragonFly__)
#if defined(__OpenBSD__) || defined(__FreeBSD__) || defined(__DragonFly__)
# include <err.h>
# include <sys/types.h>
# include <sys/sysctl.h>
#if defined(__OpenBSD__) || defined(__NetBSD__)
#if defined(__FreeBSD__) || defined(__DragonFly__)
# include <sys/ioctl.h>
# include <dev/acpica/acpiio.h>
#endif
#if defined(__OpenBSD__)
# include <sys/param.h>
# include <sys/sensors.h>
#endif
@ -24,17 +29,14 @@ static Battery *bat = NULL;
int
_battery_sysctl_start(void)
{
# if defined(__OpenBSD__) || defined(__NetBSD__)
# if defined(__OpenBSD__)
int mib[] = {CTL_HW, HW_SENSORS, 0, 0, 0};
int devn;
struct sensordev snsrdev;
size_t sdlen = sizeof(struct sensordev);
# elif defined(__FreeBSD__) || defined(__DragonFly__)
size_t len;
# endif
# if defined(__OpenBSD__) || defined(__NetBSD__)
for (devn = 0;; devn++) {
for (devn = 0;; devn++)
{
mib[2] = devn;
if (sysctl(mib, 3, &snsrdev, &sdlen, NULL, 0) == -1)
{
@ -76,53 +78,48 @@ _battery_sysctl_start(void)
}
}
# elif defined(__FreeBSD__) || defined(__DragonFly__)
if ((sysctlbyname("hw.acpi.battery.life", NULL, &len, NULL, 0)) != -1)
{
if (!(bat = E_NEW(Battery, 1)))
return 0;
int fd, n_units, val;
union acpi_battery_ioctl_arg battio;
char buf[128];
bat->mib = malloc(sizeof(int) * 4);
if (!bat->mib) return 0;
sysctlnametomib("hw.acpi.battery.life", bat->mib, &len);
if ((fd = open("/dev/acpi", O_RDONLY)) == -1) return 0;
bat->mib_state = malloc(sizeof(int) * 4);
if (!bat->mib_state) return 0;
sysctlnametomib("hw.acpi.battery.state", bat->mib_state, &len);
if (ioctl(fd, ACPIIO_BATT_GET_UNITS, &n_units) == -1) return 0;
bat->mib_time = malloc(sizeof(int) * 4);
if (!bat->mib_time) return 0;
sysctlnametomib("hw.acpi.battery.time", bat->mib_time, &len);
for (int i = 0; i < n_units; i++)
{
battio.unit = i;
if (ioctl(fd, ACPIIO_BATT_GET_BIX, &battio) != -1)
{
if (battio.bst.state == ACPI_BATT_STAT_NOT_PRESENT)
continue;
bat->mib_units = malloc(sizeof(int) * 4);
if(!bat->mib_units) return 0;
sysctlnametomib("hw.acpi.battery.units", bat->mib_units, &len);
if (!(bat = E_NEW(Battery, 1)))
return 0;
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");
snprintf(buf, sizeof(buf), "hw.acpi.battery.%i", i);
bat->udi = eina_stringshare_add(buf);
bat->technology = eina_stringshare_add(battio.bix.type);
bat->vendor = eina_stringshare_add(battio.bix.oeminfo);
bat->model = eina_stringshare_add(battio.bix.model);
bat->poll = ecore_poller_add(ECORE_POLLER_CORE,
battery_config->poll_interval,
_battery_sysctl_battery_update_poll, NULL);
bat->unit = i;
device_batteries = eina_list_append(device_batteries, bat);
}
}
bat->poll = ecore_poller_add(ECORE_POLLER_CORE,
battery_config->poll_interval,
_battery_sysctl_battery_update_poll, NULL);
if (ioctl(fd, ACPIIO_ACAD_GET_STATUS, &val) != -1)
{
if (!(ac = E_NEW(Ac_Adapter, 1)))
return 0;
device_batteries = eina_list_append(device_batteries, bat);
ac->udi = eina_stringshare_add("hw.acpi.acline");
ac->present = val;
device_ac_adapters = eina_list_append(device_ac_adapters, ac);
}
if ((sysctlbyname("hw.acpi.acline", NULL, &len, NULL, 0)) != -1)
{
if (!(ac = E_NEW(Ac_Adapter, 1)))
return 0;
ac->mib = malloc(sizeof(int) * 3);
if (!ac->mib) return 0;
len = sizeof(ac->mib);
sysctlnametomib("hw.acpi.acline", ac->mib, &len);
ac->udi = eina_stringshare_add("hw.acpi.acline");
device_ac_adapters = eina_list_append(device_ac_adapters, ac);
}
close(fd);
# endif
_battery_sysctl_battery_update();
@ -138,7 +135,9 @@ _battery_sysctl_stop(void)
if (ac)
{
eina_stringshare_del(ac->udi);
#if defined(__OpenBSD__)
E_FREE(ac->mib);
#endif
E_FREE(ac);
}
@ -149,12 +148,9 @@ _battery_sysctl_stop(void)
eina_stringshare_del(bat->model);
eina_stringshare_del(bat->vendor);
ecore_poller_del(bat->poll);
# if defined(__FreeBSD__) || defined(__DragonFly__)
E_FREE(bat->mib_state);
E_FREE(bat->mib_time);
E_FREE(bat->mib_units);
# endif
#if defined(__OpenBSD__)
E_FREE(bat->mib);
#endif
E_FREE(bat);
}
}
@ -170,13 +166,13 @@ static int
_battery_sysctl_battery_update()
{
double _time;
# if defined(__OpenBSD__) || defined(__NetBSD__)
# if defined(__OpenBSD__)
double charge;
struct sensor s;
size_t slen = sizeof(struct sensor);
# elif defined(__FreeBSD__) || defined(__DragonFly__)
int value;
size_t len;
int fd, val;
union acpi_battery_ioctl_arg battio;
# endif
if (bat)
@ -184,7 +180,7 @@ _battery_sysctl_battery_update()
/* update the poller interval */
ecore_poller_poller_interval_set(bat->poll,
battery_config->poll_interval);
# if defined(__OpenBSD__) || defined(__NetBSD__)
# if defined(__OpenBSD__)
charge = 0;
/* last full capacity */
@ -270,49 +266,32 @@ _battery_sysctl_battery_update()
}
# 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 0;
battio.unit = bat->unit;
if (ioctl(fd, ACPIIO_BATT_GET_BATTINFO, &battio) == -1)
{
return 0;
if (fd != -1)
close(fd);
return 0;
}
bat->got_prop = 1;
bat->percent = value;
bat->percent = battio.battinfo.cap;
_time = ecore_time_get();
bat->last_update = _time;
len = sizeof(value);
if ((sysctl(bat->mib_state, 4, &value, &len, NULL, 0)) == -1)
{
return 0;
}
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;
}
bat->charging = (battio.battinfo.state == ACPI_BATT_STAT_CHARGING) ? 1 : 0;
bat->time_min = battio.battinfo.min;
if (bat->time_min >= 0) bat->time_left = bat->time_min * 60;
if (bat->batteries == 1) bat->time_left = -1;
close(fd);
# endif
}
if (ac)
{
# if defined(__OpenBSD__) || defined(__NetBSD__)
# if defined(__OpenBSD__)
/* AC State */
ac->mib[3] = 9;
ac->mib[4] = 0;
@ -324,11 +303,14 @@ _battery_sysctl_battery_update()
ac->present = 0;
}
# elif defined(__FreeBSD__) || defined(__DragonFly__)
len = sizeof(value);
if ((sysctl(ac->mib, 3, &value, &len, NULL, 0)) != -1)
if ((fd = open("/dev/acpi", O_RDONLY)) == -1) return 0;
if (ioctl(fd, ACPIIO_ACAD_GET_STATUS, &val) == -1)
{
ac->present = value;
close(fd);
return 0;
}
ac->present = val;
close(fd);
# endif
}