X-Git-Url: https://git.toastfreeware.priv.at/gregoa/zavai.git/blobdiff_plain/6c19eb27e8edc8eefd89b86929861e95ea1a7c95..ec503392ddba6000fac8ac18dea94a0e2ba860c1:/src/power.vala diff --git a/src/power.vala b/src/power.vala index c70fd9b..5571117 100644 --- a/src/power.vala +++ b/src/power.vala @@ -23,7 +23,7 @@ using GLib; namespace zavai { namespace power { -class Power : Service +public class Power : Service { public enum State { @@ -41,7 +41,9 @@ class Power : Service public Power() { - battery_device = ""; + battery_device = "/sys/class/power_supply/battery/"; + if (Posix.access(battery_device, Posix.R_OK) != 0) + battery_device = null; timeout = 0; state = State.UNKNOWN; percentage = 0; @@ -55,19 +57,30 @@ class Power : Service uint poll_time; if (uevent.uevent != null) { + zavai.log.info("We have uevent: poll rarely"); uevent.uevent.event += on_uevent; uevent.uevent.request("zavai.power"); // If we can get plug/unplug notifications, it's ok to just poll // every 5 minutes poll_time = 300 * 1000; } else { - // Else poll every 30 seconds to be somehow reactive to plug/unplug - // events - poll_time = 30 * 1000; + if (battery_device == null) + { + zavai.log.warning("No battery device found that I know how to read: try building with devkit-power"); + poll_time = 0; + } else { + zavai.log.info("Polling battery device only"); + // Else poll every 30 seconds to be somehow reactive to plug/unplug + // events + poll_time = 30 * 1000; + } } + poll(); + // Poll battery every minute - timeout = Timeout.add(poll_time, on_timeout); + if (poll_time != 0) + timeout = Timeout.add(poll_time, on_timeout); base.start(); } @@ -78,7 +91,8 @@ class Power : Service if (!started) return; // Stop polling - Source.remove(timeout); + if (timeout != 0) + Source.remove(timeout); if (uevent.uevent != null) { @@ -89,13 +103,43 @@ class Power : Service base.stop(); } - bool on_timeout() + protected void poll() + { + if (battery_device == null) + return; + + char buf[200]; + State new_state = State.UNKNOWN; + int new_percentage = 0; + + FileStream state_fd = FileStream.open(battery_device + "/status", "r"); + string val = state_fd.gets(buf); + if (val == "Charging") + new_state = State.CHARGING; + else if (val == "Discharging") + new_state = State.DISCHARGING; + else if (val == "Not charging") + new_state = State.FULLY_CHARGED; + + FileStream cap_fd = FileStream.open(battery_device + "/capacity", "r"); + val = cap_fd.gets(buf); + new_percentage = val.to_int(); + + if (new_state != state || new_percentage != percentage) + { + state = new_state; + percentage = new_percentage; + changed(); + } + } + + protected bool on_timeout() { - changed(); + poll(); return true; } - void on_uevent() + protected void on_uevent() { /* if (uevent.uevent.event_data.buffer.has_prefix("change@/class/power_supply/ac")) { @@ -137,7 +181,7 @@ class Power : Service } } -Power power; +public Power power; public void init() {