5 #include <sys/sysctl.h>
6 #include <sys/sensors.h>
9 #include "e_mod_main.h"
11 static Eina_Bool _battery_openbsd_battery_update_poll(void *data);
12 static void _battery_openbsd_battery_update();
14 extern Eina_List *device_batteries;
15 extern Eina_List *device_ac_adapters;
16 extern double init_time;
22 _battery_openbsd_start(void)
25 int mib[] = {CTL_HW, HW_SENSORS, 0, 0 ,0};
27 struct sensordev snsrdev;
28 size_t sdlen = sizeof(struct sensordev);
30 size_t slen = sizeof(struct sensor);
32 for (devn = 0 ; ; devn++) {
34 if (sysctl(mib, 3, &snsrdev, &sdlen, NULL, 0) == -1) {
41 if (!strcmp("acpibat0", snsrdev.xname)) {
42 if (!(bat = E_NEW(Battery, 1)))
44 bat->udi = eina_stringshare_add("acpibat0"),
45 bat->mib = malloc(sizeof(int) * 5);
49 bat->technology = eina_stringshare_add("Unknow");
50 bat->model = eina_stringshare_add("Unknow");
51 bat->vendor = eina_stringshare_add("Unknow");
52 bat->last_update = ecore_time_get();
53 bat->poll = ecore_poller_add(ECORE_POLLER_CORE,
54 battery_config->poll_interval,
55 _battery_openbsd_battery_update_poll, NULL);
56 device_batteries = eina_list_append(device_batteries, bat);
58 else if (!strcmp("acpiac0", snsrdev.xname)) {
59 if (!(ac = E_NEW(Ac_Adapter, 1)))
61 ac->udi = eina_stringshare_add("acpiac0");
62 ac->mib = malloc(sizeof(int) * 5);
66 device_ac_adapters = eina_list_append(device_ac_adapters, ac);
70 _battery_openbsd_battery_update();
72 init_time = ecore_time_get();
77 _battery_openbsd_stop(void)
82 eina_stringshare_del(bat->udi);
83 eina_stringshare_del(bat->technology);
84 eina_stringshare_del(bat->model);
85 eina_stringshare_del(bat->vendor);
86 ecore_poller_del(bat->poll);
93 _battery_openbsd_battery_update_poll(void *data)
95 _battery_openbsd_battery_update();
100 _battery_openbsd_battery_update()
104 size_t slen = sizeof(struct sensor);
106 /* update the poller interval */
107 ecore_poller_poller_interval_set(bat->poll,
108 battery_config->poll_interval);
110 /* last full capacity */
113 if (sysctl(bat->mib, 5, &s, &slen, NULL, 0) != -1) {
114 bat->last_full_charge = (double)s.value;
117 /* remaining capcity */
120 if (sysctl(bat->mib, 5, &s, &slen, NULL, 0) != -1) {
121 charge = (double)s.value;
124 time = ecore_time_get();
125 if ((bat->got_prop) && (charge != bat->current_charge))
126 bat->charge_rate = ((charge - bat->current_charge) / (time - bat->last_update));
127 bat->last_update = time;
128 bat->current_charge = charge;
129 bat->percent = 100 * (bat->current_charge / bat->last_full_charge);
132 if (bat->charge_rate > 0)
134 if (battery_config->fuzzy && (++battery_config->fuzzcount <= 10) && (bat->time_full > 0))
135 bat->time_full = (((bat->last_full_charge - bat->current_charge) / bat->charge_rate) + bat->time_full) / 2;
137 bat->time_full = (bat->last_full_charge - bat->current_charge) / bat->charge_rate;
142 if (battery_config->fuzzy && (battery_config->fuzzcount <= 10) && (bat->time_left > 0))
143 bat->time_left = (((0 - bat->current_charge) / bat->charge_rate) + bat->time_left) / 2;
145 bat->time_left = (0 - bat->current_charge) / bat->charge_rate;
155 /* battery state 1: discharge, 2: charge */
158 if (sysctl(bat->mib, 5, &s, &slen, NULL, 0) == -1) {
168 if (sysctl(ac->mib, 5, &s, &slen, NULL, 0) == -1) {
178 _battery_device_update();