2 #include "e_mod_main.h"
4 static void _battery_udev_event_battery(const char *syspath, Eeze_Udev_Event event, void *data, Eeze_Udev_Watch *watch);
5 static void _battery_udev_event_ac(const char *syspath, Eeze_Udev_Event event, void *data, Eeze_Udev_Watch *watch);
6 static void _battery_udev_battery_add(const char *syspath);
7 static void _battery_udev_ac_add(const char *syspath);
8 static void _battery_udev_battery_del(const char *syspath);
9 static void _battery_udev_ac_del(const char *syspath);
10 static Eina_Bool _battery_udev_battery_update_poll(void *data);
11 static void _battery_udev_battery_update(const char *syspath, Battery *bat);
12 static void _battery_udev_ac_update(const char *syspath, Ac_Adapter *ac);
14 extern Eina_List *device_batteries;
15 extern Eina_List *device_ac_adapters;
16 extern double init_time;
19 _battery_udev_start(void)
24 devices = eeze_udev_find_by_type(EEZE_UDEV_TYPE_POWER_BAT, NULL);
25 EINA_LIST_FREE(devices, dev)
26 _battery_udev_battery_add(dev);
28 devices = eeze_udev_find_by_type(EEZE_UDEV_TYPE_POWER_AC, NULL);
29 EINA_LIST_FREE(devices, dev)
30 _battery_udev_ac_add(dev);
32 if (!battery_config->batwatch)
33 battery_config->batwatch = eeze_udev_watch_add(EEZE_UDEV_TYPE_POWER_BAT, EEZE_UDEV_EVENT_NONE, _battery_udev_event_battery, NULL);
34 if (!battery_config->acwatch)
35 battery_config->acwatch = eeze_udev_watch_add(EEZE_UDEV_TYPE_POWER_AC, EEZE_UDEV_EVENT_NONE, _battery_udev_event_ac, NULL);
37 init_time = ecore_time_get();
42 _battery_udev_stop(void)
47 if (battery_config->batwatch)
48 eeze_udev_watch_del(battery_config->batwatch);
49 if (battery_config->acwatch)
50 eeze_udev_watch_del(battery_config->acwatch);
52 EINA_LIST_FREE(device_ac_adapters, ac)
56 EINA_LIST_FREE(device_batteries, bat)
58 eina_stringshare_del(bat->udi);
59 eina_stringshare_del(bat->technology);
60 eina_stringshare_del(bat->model);
61 eina_stringshare_del(bat->vendor);
62 ecore_poller_del(bat->poll);
69 _battery_udev_event_battery(const char *syspath, Eeze_Udev_Event event, void *data, Eeze_Udev_Watch *watch __UNUSED__)
71 if ((event & EEZE_UDEV_EVENT_ADD) ||
72 (event & EEZE_UDEV_EVENT_ONLINE))
73 _battery_udev_battery_add(syspath);
74 else if ((event & EEZE_UDEV_EVENT_REMOVE) ||
75 (event & EEZE_UDEV_EVENT_OFFLINE))
76 _battery_udev_battery_del(syspath);
77 else /* must be change */
78 _battery_udev_battery_update(syspath, data);
82 _battery_udev_event_ac(const char *syspath, Eeze_Udev_Event event, void *data, Eeze_Udev_Watch *watch __UNUSED__)
84 if ((event & EEZE_UDEV_EVENT_ADD) ||
85 (event & EEZE_UDEV_EVENT_ONLINE))
86 _battery_udev_ac_add(syspath);
87 else if ((event & EEZE_UDEV_EVENT_REMOVE) ||
88 (event & EEZE_UDEV_EVENT_OFFLINE))
89 _battery_udev_ac_del(syspath);
90 else /* must be change */
91 _battery_udev_ac_update(syspath, data);
95 _battery_udev_battery_add(const char *syspath)
99 if ((bat = _battery_battery_find(syspath)))
101 eina_stringshare_del(syspath);
102 _battery_udev_battery_update(NULL, bat);
106 if (!(bat = E_NEW(Battery, 1)))
108 eina_stringshare_del(syspath);
111 bat->last_update = ecore_time_get();
112 bat->udi = eina_stringshare_add(syspath);
113 bat->poll = ecore_poller_add(ECORE_POLLER_CORE,
114 battery_config->poll_interval,
115 _battery_udev_battery_update_poll, bat);
116 device_batteries = eina_list_append(device_batteries, bat);
117 _battery_udev_battery_update(syspath, bat);
121 _battery_udev_ac_add(const char *syspath)
125 if ((ac = _battery_ac_adapter_find(syspath)))
127 eina_stringshare_del(syspath);
128 _battery_udev_ac_update(NULL, ac);
132 if (!(ac = E_NEW(Ac_Adapter, 1)))
134 eina_stringshare_del(syspath);
137 ac->udi = eina_stringshare_add(syspath);
138 device_ac_adapters = eina_list_append(device_ac_adapters, ac);
139 _battery_udev_ac_update(syspath, ac);
143 _battery_udev_battery_del(const char *syspath)
147 if (!(bat = _battery_battery_find(syspath)))
149 eina_stringshare_del(syspath);
150 _battery_device_update();
154 device_batteries = eina_list_remove(device_batteries, bat);
155 eina_stringshare_del(bat->udi);
156 eina_stringshare_del(bat->technology);
157 eina_stringshare_del(bat->model);
158 eina_stringshare_del(bat->vendor);
159 ecore_poller_del(bat->poll);
164 _battery_udev_ac_del(const char *syspath)
168 if (!(ac = _battery_ac_adapter_find(syspath)))
170 eina_stringshare_del(syspath);
171 _battery_device_update();
175 device_ac_adapters = eina_list_remove(device_ac_adapters, ac);
176 eina_stringshare_del(ac->udi);
181 _battery_udev_battery_update_poll(void *data)
183 _battery_udev_battery_update(NULL, data);
188 #define GET_NUM(TYPE, VALUE, PROP) test = eeze_udev_syspath_get_property(TYPE->udi, #PROP); \
192 TYPE->VALUE = strtod(test, NULL); \
196 #define GET_STR(TYPE, VALUE, PROP) TYPE->VALUE = eeze_udev_syspath_get_property(TYPE->udi, #PROP)
199 _battery_udev_battery_update(const char *syspath, Battery *bat)
206 if (!(bat = _battery_battery_find(syspath)))
207 return _battery_udev_battery_add(syspath);
209 /* update the poller interval */
210 ecore_poller_poller_interval_set(bat->poll, battery_config->poll_interval);
212 GET_NUM(bat, present, POWER_SUPPLY_PRESENT);
214 {/* only need to get these once */
215 GET_STR(bat, technology, POWER_SUPPLY_TECHNOLOGY);
216 GET_STR(bat, model, POWER_SUPPLY_MODEL_NAME);
217 GET_STR(bat, vendor, POWER_SUPPLY_MANUFACTURER);
218 GET_NUM(bat, design_charge, POWER_SUPPLY_ENERGY_FULL_DESIGN);
219 if (!bat->design_charge)
220 GET_NUM(bat, design_charge, POWER_SUPPLY_CHARGE_FULL_DESIGN);
222 GET_NUM(bat, last_full_charge, POWER_SUPPLY_ENERGY_FULL);
223 if (!bat->last_full_charge)
224 GET_NUM(bat, last_full_charge, POWER_SUPPLY_CHARGE_FULL);
225 test = eeze_udev_syspath_get_property(bat->udi, "POWER_SUPPLY_ENERGY_NOW");
228 eina_stringshare_del(test);
229 test = eeze_udev_syspath_get_property(bat->udi, "POWER_SUPPLY_CHARGE_NOW");
234 charge = strtod(test, NULL);
235 eina_stringshare_del(test);
236 time = ecore_time_get();
237 if ((bat->got_prop) && (charge != bat->current_charge))
238 bat->charge_rate = ((charge - bat->current_charge) / (time - bat->last_update));
239 bat->last_update = time;
240 bat->current_charge = charge;
241 bat->percent = 100 * (bat->current_charge / bat->last_full_charge);
244 if (bat->charge_rate > 0)
246 if (battery_config->fuzzy && (++battery_config->fuzzcount <= 10) && (bat->time_full > 0))
247 bat->time_full = (((bat->last_full_charge - bat->current_charge) / bat->charge_rate) + bat->time_full) / 2;
249 bat->time_full = (bat->last_full_charge - bat->current_charge) / bat->charge_rate;
254 if (battery_config->fuzzy && (battery_config->fuzzcount <= 10) && (bat->time_left > 0))
255 bat->time_left = (((0 - bat->current_charge) / bat->charge_rate) + bat->time_left) / 2;
257 bat->time_left = (0 - bat->current_charge) / bat->charge_rate;
267 if (battery_config->fuzzcount > 10) battery_config->fuzzcount = 0;
268 test = eeze_udev_syspath_get_property(bat->udi, "POWER_SUPPLY_STATUS");
271 if (!strcmp(test, "Charging"))
273 else if ((!strcmp(test, "Unknown")) && (bat->charge_rate >= 0))
277 eina_stringshare_del(test);
282 _battery_device_update();
287 _battery_udev_ac_update(const char *syspath, Ac_Adapter *ac)
293 if (!(ac = _battery_ac_adapter_find(syspath)))
294 return _battery_udev_ac_add(syspath);
297 GET_NUM(ac, present, POWER_SUPPLY_ONLINE);
298 /* yes, it's really that simple. */
300 _battery_device_update();