summaryrefslogtreecommitdiff
path: root/battery.lua
diff options
context:
space:
mode:
Diffstat (limited to 'battery.lua')
-rw-r--r--battery.lua114
1 files changed, 114 insertions, 0 deletions
diff --git a/battery.lua b/battery.lua
new file mode 100644
index 0000000..abaf86d
--- /dev/null
+++ b/battery.lua
@@ -0,0 +1,114 @@
+local gio = require("lgi").Gio
+
+local object = require("gears.object")
+
+local utils = require("utils")
+
+local Battery = {}
+Battery.__index = Battery
+
+setmetatable(Battery, {
+ __call = function (cls, ...) return cls.new(...) end,
+})
+
+Battery.STATUS = {
+ UNKNOWN = 'Unknown',
+ DISCHARGING = 'Discharging',
+ CHARGING = 'Charging',
+ ['NOT CHARGING'] = 'Not charging',
+ FULL = 'Full',
+}
+
+function Battery:_readfile(name)
+ local file = gio.File.new_for_path(self._path .. name)
+ local contents = file:load_contents(nil)
+
+ -- remove trailing newline
+ if contents then
+ contents = string.gsub(contents, "%s$", "")
+ return string.len(contents) > 0 and contents or nil
+ end
+
+ return nil
+end
+
+function Battery:_readnum(name)
+ local val = self:_readfile(name)
+ return tonumber(val)
+end
+
+function Battery:update()
+ local status = string.upper(self:_readfile('status') or '')
+ self.status = self.STATUS[status]
+ if self.status == nil then
+ utils.log('Battery/' .. self.name, 'Error updating status: %s', tostring(status))
+ return false
+ end
+
+ self.capacity = self:_readnum('capacity')
+ self.capacity_level = self:_readfile('capacity_level')
+
+ local energy = self:_readnum('energy_now')
+ local energy_full = self:_readnum('energy_full')
+ local power = self:_readnum('power_now')
+
+ -- try to compute remaining seconds to charge/discharge,
+ -- if we have the information
+ self.remaining_seconds = nil
+
+ if self.status == self.STATUS.DISCHARGING then
+ if energy and power then
+ self.remaining_seconds = 3600 * energy / power
+ end
+ elseif self.status == self.STATUS.CHARGING then
+ if energy and energy_full and power then
+ self.remaining_seconds = 3600 * (energy_full - energy) / power
+ end
+ end
+
+ if power ~= nil then
+ self.power = power / 1e6
+ end
+
+ self:emit_signal('updated')
+
+ return true
+end
+
+function Battery.new(name)
+ local self = object({class = Battery})
+
+ self.name = name
+ self._path = '/sys/class/power_supply/' .. name .. '/'
+
+ -- skip non-battery power supplies, we don't handle them
+ local type = self:_readfile('type')
+ if type ~= 'Battery' then
+ return nil
+ end
+
+ -- build description string
+ local desc = nil
+
+ -- first try manufacturer+model
+ local manufacturer = self:_readfile('manufacturer')
+ local model = self:_readfile('model_name')
+ if manufacturer or model then
+ desc = (manufacturer or '') .. (manufacturer and ' ' or '') .. (model or '')
+ end
+
+ if not desc then
+ local technology = self:_readfile('technology')
+ desc = (technology or '') .. (technology and ' ' or '') .. type
+ end
+
+ self.desc = desc
+
+ if not self:update() then
+ return nil
+ end
+
+ return self
+end
+
+return Battery