summaryrefslogtreecommitdiff
path: root/lib/battery/device.vala
diff options
context:
space:
mode:
Diffstat (limited to 'lib/battery/device.vala')
-rw-r--r--lib/battery/device.vala296
1 files changed, 296 insertions, 0 deletions
diff --git a/lib/battery/device.vala b/lib/battery/device.vala
new file mode 100644
index 0000000..eab3770
--- /dev/null
+++ b/lib/battery/device.vala
@@ -0,0 +1,296 @@
+namespace AstalBattery {
+public Device get_default() {
+ return Device.get_default();
+}
+
+public class Device : Object {
+ private static Device display_device;
+ public static Device? get_default() {
+ if (display_device != null)
+ return display_device;
+
+ try {
+ display_device = new Device("/org/freedesktop/UPower/devices/DisplayDevice");
+
+ return display_device;
+ } catch (Error error) {
+ critical(error.message);
+ }
+ return null;
+ }
+
+ private IUPowerDevice proxy;
+
+ public Device(string path) throws Error {
+ proxy = Bus.get_proxy_sync(BusType.SYSTEM, "org.freedesktop.UPower", path);
+ proxy.g_properties_changed.connect(sync);
+ sync();
+ }
+
+ public Type device_type { get; private set; }
+ public string native_path { owned get; private set; }
+ public string vendor { owned get; private set; }
+ public string model { owned get; private set; }
+ public string serial { owned get; private set; }
+ public uint64 update_time { get; private set; }
+ public bool power_supply { get; private set; }
+ public bool has_history { get; private set; }
+ public bool has_statistics { get; private set; }
+ public bool online { get; private set; }
+ public double energy { get; private set; }
+ public double energy_empty { get; private set; }
+ public double energy_full { get; private set; }
+ public double energy_full_design { get; private set; }
+ public double energy_rate { get; private set; }
+ public double voltage { get; private set; }
+ public int charge_cycles { get; private set; }
+ public double luminosity { get; private set; }
+ public int64 time_to_empty { get; private set; }
+ public int64 time_to_full { get; private set;}
+ public double percentage { get; private set; }
+ public double temperature { get; private set; }
+ public bool is_present { get; private set; }
+ public State state { get; private set; }
+ public bool is_rechargable { get; private set; }
+ public double capacity { get; private set; }
+ public Technology technology { get; private set; }
+ public WarningLevel warning_level { get; private set; }
+ public BatteryLevel battery_level { get; private set; }
+ public string icon_name { owned get; private set; }
+
+ public bool charging { get; private set; }
+ public bool is_battery { get; private set; }
+ public string battery_icon_name { get; private set; }
+ public string device_type_name { get; private set; }
+ public string device_type_icon { get; private set; }
+
+ private unowned string get_battery_icon() {
+ if (percentage <= 0)
+ return "battery-good";
+
+ if (percentage < 0.10)
+ return "battery-empty";
+
+ if (percentage < 0.37)
+ return "battery-caution";
+
+ if (percentage < 0.62)
+ return "battery-low";
+
+ if (percentage < 0.87)
+ return "battery-good";
+
+ return "battery-full";
+ }
+
+
+ public void sync() {
+ device_type = (Type)proxy.Type;
+ native_path = proxy.native_path;
+ vendor = proxy.vendor;
+ model = proxy.model;
+ serial = proxy.serial;
+ update_time = proxy.update_time;
+ power_supply = proxy.power_supply;
+ has_history = proxy.has_history;
+ has_statistics = proxy.has_statistics;
+ online = proxy.online;
+ energy = proxy.energy;
+ energy_empty = proxy.energy_empty;
+ energy_full = proxy.energy_full;
+ energy_full_design = proxy.energy_full_design;
+ energy_rate = proxy.energy_rate;
+ voltage = proxy.voltage;
+ charge_cycles = proxy.charge_cycles;
+ luminosity = proxy.luminosity;
+ time_to_empty = proxy.time_to_empty;
+ time_to_full = proxy.time_to_full;
+ percentage = proxy.percentage / 100;
+ temperature = proxy.temperature;
+ is_present = proxy.is_present;
+ state = (State)proxy.state;
+ is_rechargable = proxy.is_rechargable;
+ capacity = proxy.capacity;
+ technology = (Technology)proxy.technology;
+ warning_level = (WarningLevel)proxy.warning_level;
+ battery_level = (BatteryLevel)proxy.battery_level;
+ icon_name = proxy.icon_name;
+
+ charging = state == State.FULLY_CHARGED || state == State.CHARGING;
+ is_battery = device_type != Type.UNKNOWN && device_type != Type.LINE_POWER;
+
+ if (!is_battery)
+ battery_icon_name = "preferences-system-power";
+ else if (percentage == 1.0 && charging)
+ battery_icon_name = "battery-full-charged";
+ else
+ battery_icon_name = charging ? get_battery_icon() + "-charging" : get_battery_icon();
+
+ device_type_name = device_type.get_name();
+ device_type_icon = device_type.get_icon_name();
+ }
+}
+
+[CCode (type_signature = "u")]
+public enum State {
+ UNKNOWN = 0,
+ CHARGING,
+ DISCHARGING,
+ EMPTY,
+ FULLY_CHARGED,
+ PENDING_CHARGE,
+ PENDING_DISCHARGE,
+}
+
+[CCode (type_signature = "u")]
+public enum Technology {
+ UNKNOWN = 0,
+ LITHIUM_ION,
+ LITHIUM_POLYMER,
+ LITHIUM_IRON_PHOSPHATE,
+ LEAD_ACID,
+ NICKEL_CADMIUM,
+ NICKEL_METAL_HYDRIDE,
+}
+
+[CCode (type_signature = "u")]
+public enum WarningLevel {
+ UNKNOWN = 0,
+ NONE,
+ DISCHARGING,
+ LOW,
+ CRITICIAL,
+ ACTION,
+}
+
+[CCode (type_signature = "u")]
+public enum BatteryLevel {
+ UNKNOWN = 0,
+ NONE,
+ LOW,
+ CRITICIAL,
+ NORMAL,
+ HIGH,
+ FULL,
+}
+
+[CCode (type_signature = "u")]
+public enum Type {
+ UNKNOWN = 0,
+ LINE_POWER,
+ BATTERY,
+ UPS,
+ MONITOR,
+ MOUSE,
+ KEYBOARD,
+ PDA,
+ PHONE,
+ MEDIA_PLAYER,
+ TABLET,
+ COMPUTER,
+ GAMING_INPUT,
+ PEN,
+ TOUCHPAD,
+ MODEM,
+ NETWORK,
+ HEADSET,
+ SPEAKERS,
+ HEADPHONES,
+ VIDEO,
+ OTHER_AUDIO,
+ REMOVE_CONTROL,
+ PRINTER,
+ SCANNER,
+ CAMERA,
+ WEARABLE,
+ TOY,
+ BLUETOOTH_GENERIC;
+
+ // TODO: add more icon names
+ public string? get_icon_name () {
+ switch (this) {
+ case UPS:
+ return "uninterruptible-power-supply";
+ case MOUSE:
+ return "input-mouse";
+ case KEYBOARD:
+ return "input-keyboard";
+ case PDA:
+ case PHONE:
+ return "phone";
+ case MEDIA_PLAYER:
+ return "multimedia-player";
+ case TABLET:
+ case PEN:
+ return "input-tablet";
+ case GAMING_INPUT:
+ return "input-gaming";
+ default:
+ return null;
+ }
+ }
+
+ public unowned string? get_name () {
+ switch (this) {
+ case LINE_POWER:
+ return "Plugged In";
+ case BATTERY:
+ return "Battery";
+ case UPS:
+ return "UPS";
+ case MONITOR:
+ return "Display";
+ case MOUSE:
+ return "Mouse";
+ case KEYBOARD:
+ return "Keyboard";
+ case PDA:
+ return "PDA";
+ case PHONE:
+ return "Phone";
+ case MEDIA_PLAYER:
+ return "Media Player";
+ case TABLET:
+ return "Tablet";
+ case COMPUTER:
+ return "Computer";
+ case GAMING_INPUT:
+ return "Controller";
+ case PEN:
+ return "Pen";
+ case TOUCHPAD:
+ return "Touchpad";
+ case MODEM:
+ return "Modem";
+ case NETWORK:
+ return "Network";
+ case HEADSET:
+ return "Headset";
+ case SPEAKERS:
+ return "Speakers";
+ case HEADPHONES:
+ return "Headphones";
+ case VIDEO:
+ return "Video";
+ case OTHER_AUDIO:
+ return "Other Audio";
+ case REMOVE_CONTROL:
+ return "Remove Control";
+ case PRINTER:
+ return "Printer";
+ case SCANNER:
+ return "Scanner";
+ case CAMERA:
+ return "Camera";
+ case WEARABLE:
+ return "Wearable";
+ case TOY:
+ return "Toy";
+ case BLUETOOTH_GENERIC:
+ return "Bluetooth Generic";
+ default:
+ return "Unknown";
+ }
+ }
+}
+}