bat: widget rewritten for sysfs

This also means that it replaces batsys, and we are left with only
one, universal, battery widget.
This commit is contained in:
Adrian C. (anrxc) 2009-11-11 03:50:25 +01:00
parent a99c1cf118
commit 7be560b70c
4 changed files with 32 additions and 132 deletions

9
README
View File

@ -165,15 +165,6 @@ vicious.widgets.uptime
vicious.widgets.bat vicious.widgets.bat
- provides state, charge, and remaining time for a requested battery - provides state, charge, and remaining time for a requested battery
using procfs
- takes battery ID as an argument, i.e. "BAT0"
- returns 1st value as state of requested battery, 2nd as charge
level in percent and 3rd as remaining (charging or discharging)
time
vicious.widgets.batsys
- provides state, charge, and remaining time for a requested battery
using sysfs
- takes battery ID as an argument, i.e. "BAT0" - takes battery ID as an argument, i.e. "BAT0"
- returns 1st value as state of requested battery, 2nd as charge - returns 1st value as state of requested battery, 2nd as charge
level in percent and 3rd as remaining (charging or discharging) level in percent and 3rd as remaining (charging or discharging)

67
bat.lua
View File

@ -5,67 +5,64 @@
-- {{{ Grab environment -- {{{ Grab environment
local tonumber = tonumber local tonumber = tonumber
local io = { open = io.open }
local setmetatable = setmetatable local setmetatable = setmetatable
local string = { format = string.format }
local helpers = require("vicious.helpers")
local math = { local math = {
min = math.min, min = math.min,
floor = math.floor floor = math.floor
} }
local string = {
find = string.find,
match = string.match,
format = string.format
}
-- }}} -- }}}
-- Bat: provides state, charge, and remaining time for a requested battery using procfs -- Batsys: provides state, charge, and remaining time for a requested battery
module("vicious.bat") module("vicious.bat")
-- {{{ Battery widget type -- {{{ Battery widget type
local function worker(format, batid) local function worker(format, batid)
local battery = setmetatable(
{ _path = "/sys/class/power_supply/" .. batid },
helpers.pathtotable
)
local battery_state = { local battery_state = {
["full"] = "", ["Full\n"] = "",
["unknown"] = "", ["Unknown\n"] = "",
["charged"] = "", ["Charged\n"] = "",
["charging"] = "+", ["Charging\n"] = "+",
["discharging"] = "-" ["Discharging\n"] = "-"
} }
-- Get /proc/acpi/battery info
local f = io.open("/proc/acpi/battery/"..batid.."/info")
-- Handler for incompetent users
if not f then return {battery_state["unknown"], 0, "N/A"} end
local infofile = f:read("*all")
f:close()
-- Check if the battery is present -- Check if the battery is present
if infofile == nil or string.find(infofile, "present:[%s]+no") then if not battery.present == "1\n" then
return {battery_state["unknown"], 0, "N/A"} return {battery_state["Unknown\n"], 0, "N/A"}
end end
-- Get capacity information
local capacity = string.match(infofile, "last full capacity:[%s]+([%d]+).*")
-- Get /proc/acpi/battery state
local f = io.open("/proc/acpi/battery/"..batid.."/state")
local statefile = f:read("*all")
f:close()
-- Get state information -- Get state information
local state = string.match(statefile, "charging state:[%s]+([%a]+).*") local state = battery_state[battery.status] or battery_state["Unknown\n"]
local state = battery_state[state] or battery_state["unknown"]
-- Get charge information
local rate = string.match(statefile, "present rate:[%s]+([%d]+).*")
local remaining = string.match(statefile, "remaining capacity:[%s]+([%d]+).*")
-- Get capacity information
if battery.charge_now then
remaining, capacity = battery.charge_now, battery.charge_full
elseif battery.energy_now then
remaining, capacity = battery.energy_now, battery.energy_full
else
return {battery_state["Unknown\n"], 0, "N/A"}
end
-- Calculate percentage (but work around broken BAT/ACPI implementations) -- Calculate percentage (but work around broken BAT/ACPI implementations)
local percent = math.min(math.floor(remaining / capacity * 100), 100) local percent = math.min(math.floor(remaining / capacity * 100), 100)
-- Get charge information
if battery.current_now then
rate = battery.current_now
else -- Todo: other rate sources, as with capacity?
return {state, percent, "N/A"}
end
-- Calculate remaining (charging or discharging) time -- Calculate remaining (charging or discharging) time
if state == "+" then if state == "+" then
timeleft = (tonumber(capacity) - tonumber(remaining)) / tonumber(rate) timeleft = (tonumber(capacity) - tonumber(remaining)) / tonumber(rate)

View File

@ -1,87 +0,0 @@
---------------------------------------------------
-- Licensed under the GNU General Public License v2
-- * (c) 2009, Adrian C. <anrxc@sysphere.org>
-- * (c) 2009, Benedikt Sauer <filmor@gmail.com>
---------------------------------------------------
-- {{{ Grab environment
local tonumber = tonumber
local io = { open = io.open }
local setmetatable = setmetatable
local string = { format = string.format }
local math = {
min = math.min,
floor = math.floor
}
-- }}}
-- Batsys: provides state, charge, and remaining time for a requested battery using sysfs
module("vicious.batsys")
-- {{{ Battery widget type
local function worker(format, batid)
local battery = setmetatable({}, {__index = function(table, name)
local f = io.open("/sys/class/power_supply/"..batid.."/"..name)
if f then
local s = f:read("*all")
f:close()
return s
end
end})
local battery_state = {
["Full\n"] = "",
["Unknown\n"] = "",
["Charged\n"] = "",
["Charging\n"] = "+",
["Discharging\n"] = "-"
}
-- Check if the battery is present
if not battery.present == "1\n" then
return {battery_state["Unknown\n"], 0, "N/A"}
end
-- Get state information
local state = battery_state[battery.status] or battery_state["Unknown\n"]
-- Get capacity information
if battery.charge_now then
remaining, capacity = battery.charge_now, battery.charge_full
elseif battery.energy_now then
remaining, capacity = battery.energy_now, battery.energy_full
else
return {battery_state["Unknown\n"], 0, "N/A"}
end
-- Calculate percentage (but work around broken BAT/ACPI implementations)
local percent = math.min(math.floor(remaining / capacity * 100), 100)
-- Get charge information
if battery.current_now then
rate = battery.current_now
else -- Todo: other rate sources, as with capacity?
return {state, percent, "N/A"}
end
-- Calculate remaining (charging or discharging) time
if state == "+" then
timeleft = (tonumber(capacity) - tonumber(remaining)) / tonumber(rate)
elseif state == "-" then
timeleft = tonumber(remaining) / tonumber(rate)
else
return {state, percent, "N/A"}
end
local hoursleft = math.floor(timeleft)
local minutesleft = math.floor((timeleft - hoursleft) * 60 )
local time = string.format("%02d:%02d", hoursleft, minutesleft)
return {state, percent, time}
end
-- }}}
setmetatable(_M, { __call = function(_, ...) return worker(...) end })

View File

@ -28,7 +28,6 @@ require("vicious.thermal")
require("vicious.load") require("vicious.load")
require("vicious.uptime") require("vicious.uptime")
require("vicious.bat") require("vicious.bat")
require("vicious.batsys")
require("vicious.mem") require("vicious.mem")
require("vicious.fs") require("vicious.fs")
require("vicious.dio") require("vicious.dio")