namespace zavai {
namespace power {
-class Power : Service
+public class Power : Service
{
public enum State
{
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;
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");
+ 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();
}
if (!started) return;
// Stop polling
- Source.remove(timeout);
+ if (timeout != 0)
+ Source.remove(timeout);
if (uevent.uevent != null)
{
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"))
{
}
}
-Power power;
+public Power power;
public void init()
{