summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--batteryarc-widget/batteryarc.lua182
1 files changed, 79 insertions, 103 deletions
diff --git a/batteryarc-widget/batteryarc.lua b/batteryarc-widget/batteryarc.lua
index f01ee65..a15151f 100644
--- a/batteryarc-widget/batteryarc.lua
+++ b/batteryarc-widget/batteryarc.lua
@@ -20,7 +20,7 @@ local text = wibox.widget {
id = "txt",
font = "Play 6",
align = 'center', -- align the text
- valign = 'center',
+ valign = 'center',
widget = wibox.widget.textbox
}
@@ -45,118 +45,94 @@ local batteryarc = wibox.widget {
local last_battery_check = os.time()
watch("acpi -i", 10,
- function(widget, stdout)
- local batteryType
-
- local battery_info = {}
- local capacities = {}
-
- -- Change the logic of processing battery information from 'acpi -i'
- for s in stdout:gmatch("[^\r\n]+") do
- local status, charge_str = string.match(s, '.+: (%a+), (%d?%d?%d)%%,?.*')
- if charge_str ~= nil then
- table.insert(battery_info, {status = status, charge = tonumber(charge_str)})
- else
- local cap_str = string.match(s, '.+:.+last full capacity (%d+)')
- if cap_str ~= nil then
+ function(widget, stdout)
+ local batteryType
+
+ local battery_info = {}
+ local capacities = {}
+ for s in stdout:gmatch("[^\r\n]+") do
+ local status, charge_str, time = string.match(s, '.+: (%a+), (%d?%d?%d)%%,?.*')
+ if string.match(s, 'rate information') then
+ -- ignore such line
+ elseif status ~= nil then
+ table.insert(battery_info, {status = status, charge = tonumber(charge_str)})
+ else
+ local cap_str = string.match(s, '.+:.+last full capacity (%d+)')
table.insert(capacities, tonumber(cap_str))
end
end
-
- end
-
- -- total battery capacity
- local total_capacity = 0
- for i, cap in ipairs(capacities) do
- total_capacity = total_capacity + cap
- end
-
- -- capacity charged into all batteries
- local charge_cap = 0
- -- battery charge percentage 0~100
- local charge_perc = 0
-
- for i, batt in ipairs(battery_info) do
- -- BUG: batt.charge ranges from 0 to 100, should be divided by 100
- charge_cap = charge_cap + batt.charge/100 * capacities[i]
- end
-
-
- local status
-
- -- new logic to determine status
- status = 'Full'
- for i, batt in ipairs(battery_info) do
- if batt.status == 'Charging' then
- status = 'Charging'
- break
+
+ local capacity = 0
+ for i, cap in ipairs(capacities) do
+ capacity = capacity + cap
+ end
+
+ local charge = 0
+ local status
+ for i, batt in ipairs(battery_info) do
+ if batt.charge >= charge then
+ -- use most charged battery status. This is arbitrary, and maybe another metric should be used
+ status = batt.status
+ end
+
+ charge = charge + batt.charge * capacities[i]
end
- if batt.status == 'Discharging' then
- status = 'Discharging'
- break
- end
- end
-
-
- if total_capacity > 0 then
- charge_perc = charge_cap / total_capacity * 100
- end
-
- -- when widget.value is < 0.04, the widget shows a full circle (as widget.value=1)
- -- so the charge_perc value is checked first
- if charge_perc >= 5 then
- widget.value = charge_perc / 100
- else
- widget.value = 0.05
- end
-
-
- if status == 'Charging' then
- text_with_background.bg = beautiful.widget_green
- text_with_background.fg = beautiful.widget_black
- else
- text_with_background.bg = beautiful.widget_transparent
- text_with_background.fg = beautiful.widget_main_color
- end
-
- text.text = string.format('%d', charge_perc)
-
- -- add variables to make it easy to change settings
- local bat_high = 75
- local bat_low = 30
-
--- if charge_perc <= bat_low then
- if charge_perc <= bat_low then
- batteryarc.colors = { beautiful.widget_red }
- if status ~= 'Charging' and os.difftime(os.time(), last_battery_check) > 300 then
- -- if 5 minutes have elapsed since the last warning
- last_battery_check = os.time()
-
- show_battery_warning()
+
+ local charge_percentage
+ if capacity > 5 then
+ charge = charge / capacity
+ charge_percentage = charge / 100
+ else
+ -- when widget.value is < 0.04, the widget shows a full circle (as widget.value=1)
+ charge_percentage = 0.05
end
- elseif charge_perc > bat_low and charge_perc < bat_high then
- batteryarc.colors = { beautiful.widget_yellow }
- else
- batteryarc.colors = { beautiful.widget_main_color }
- end
- end,
- batteryarc)
+
+ widget.value = charge / 100
+
+ if status == 'Charging' then
+ text_with_background.bg = beautiful.widget_green
+ text_with_background.fg = beautiful.widget_black
+ else
+ text_with_background.bg = beautiful.widget_transparent
+ text_with_background.fg = beautiful.widget_main_color
+ end
+
+ --- if battery is fully charged (100) there is not enough place for three digits, so we don't show any text
+ text.text = charge == 100
+ and ''
+ or string.format('%d', charge)
+
+ if charge < 15 then
+ batteryarc.colors = { beautiful.widget_red }
+ if status ~= 'Charging' and os.difftime(os.time(), last_battery_check) > 300 then
+ -- if 5 minutes have elapsed since the last warning
+ last_battery_check = os.time()
+
+ show_battery_warning()
+ end
+ elseif charge > 15 and charge < 40 then
+ batteryarc.colors = { beautiful.widget_yellow }
+ else
+ batteryarc.colors = { beautiful.widget_main_color }
+ end
+ end,
+ batteryarc)
-- Popup with battery info
-- One way of creating a pop-up notification - naughty.notify
local notification
function show_battery_status()
awful.spawn.easy_async([[bash -c 'acpi']],
- function(stdout, _, _, _)
- naughty.destroy(notification)
- notification = naughty.notify {
- text = stdout,
- title = "Battery status",
- timeout = 5,
- hover_timeout = 0.5,
- width = 200,
- }
- end)
+ function(stdout, _, _, _)
+ naughty.destroy(notification)
+ notification = naughty.notify {
+ text = stdout,
+ title = "Battery status",
+ timeout = 5,
+ hover_timeout = 0.5,
+ width = 200,
+ }
+ end)
end
batteryarc:connect_signal("mouse::enter", function() show_battery_status() end)
@@ -176,7 +152,7 @@ function show_battery_warning()
naughty.notify {
icon = HOME .. "/.config/awesome/awesome-wm-widgets/batteryarc-widget/spaceman.jpg",
icon_size = 100,
- text = "Battery is dying", -- switch text and title
+ text = "Battery is dying", -- switch text and title
title = "Huston, we have a problem",
timeout = 25, -- show the warning for a longer time
hover_timeout = 0.5,