X-Git-Url: https://git.madduck.net/etc/awesome.git/blobdiff_plain/4cd75de2ed52f4bc39ad52eee7d5155c6036ce0e..192543618537de4a4dab3adc14ad4bd6d696304e:/widgets/bat.lua

diff --git a/widgets/bat.lua b/widgets/bat.lua
index ba1fa58..572d099 100644
--- a/widgets/bat.lua
+++ b/widgets/bat.lua
@@ -15,6 +15,7 @@ local wibox        = require("wibox")
 
 local math         = { floor  = math.floor }
 local string       = { format = string.format }
+local tonumber     = tonumber
 
 local setmetatable = setmetatable
 
@@ -26,39 +27,58 @@ local function worker(args)
     local args = args or {}
     local timeout = args.timeout or 30
     local battery = args.battery or "BAT0"
+    local notify = args.notify or "on"
     local settings = args.settings or function() end
 
     bat.widget = wibox.widget.textbox('')
 
-    function bat.update()
+    bat_notification_low_preset = {
+        title = "Battery low",
+        text = "Plug the cable!",
+        timeout = 15,
+        fg = "#202020",
+        bg = "#CDCDCD"
+    }
+
+    bat_notification_critical_preset = {
+        title = "Battery exhausted",
+        text = "Shutdown imminent",
+        timeout = 15,
+        fg = "#000000",
+        bg = "#FFFFFF"
+    }
+
+    function update()
         bat_now = {
-            status = "not present",
+            status = "Not present",
             perc   = "N/A",
             time   = "N/A",
             watt   = "N/A"
         }
 
-        local present = first_line("/sys/class/power_supply/"
-                                   .. battery
-                                   .. "/present")
+        local bstr  = "/sys/class/power_supply/" .. battery
+
+        local present = first_line(bstr .. "/present")
 
         if present == "1"
         then
-            local rate = first_line("/sys/class/power_supply/"
-                                    .. battery ..
-                                    "/power_now")
-            local ratev = first_line("/sys/class/power_supply/"
-                                    .. battery ..
-                                     "/voltage_now")
-            local rem = first_line("/sys/class/power_supply/"
-                                    .. battery ..
-                                   "/energy_now")
-            local tot = first_line("/sys/class/power_supply/"
-                                    .. battery ..
-                                   "/energy_full")
-            bat_now.status = first_line("/sys/class/power_supply/"
-                                    .. battery ..
-                                   "/status")
+            local rate  = first_line(bstr .. "/power_now") or
+                          first_line(bstr .. "/current_now")
+
+            local ratev = first_line(bstr .. "/voltage_now")
+
+            local rem   = first_line(bstr .. "/energy_now") or
+                          first_line(bstr .. "/charge_now")
+
+            local tot   = first_line(bstr .. "/energy_full") or
+                          first_line(bstr .. "/charge_full")
+
+            bat_now.status = first_line(bstr .. "/status") or "N/A"
+
+            rate  = tonumber(rate) or 1
+            ratev = tonumber(ratev)
+            rem   = tonumber(rem)
+            tot   = tonumber(tot)
 
             local time_rat = 0
             if bat_now.status == "Charging"
@@ -70,47 +90,58 @@ local function worker(args)
             end
 
             local hrs = math.floor(time_rat)
-            local min = (time_rat - hrs) * 60
+            if hrs < 0 then hrs = 0 elseif hrs > 23 then hrs = 23 end
+
+            local min = math.floor((time_rat - hrs) * 60)
+            if min < 0 then min = 0 elseif min > 59 then min = 59 end
 
             bat_now.time = string.format("%02d:%02d", hrs, min)
-            bat_now.perc = (rem / tot) * 100
-            bat_now.watt = string.format("%.2fW", (rate * ratev) / 1e12)
 
-            -- notifications for low and critical states
-            if bat_now.perc <= 5
+            bat_now.perc = first_line(bstr .. "/capacity")
+
+            if not bat_now.perc then
+                local perc = (rem / tot) * 100
+                if perc <= 100 then
+                    bat_now.perc = string.format("%d", perc)
+                elseif perc > 100 then
+                    bat_now.perc = "100"
+                elseif perc < 0 then
+                    bat_now.perc = "0"
+                end
+            end
+
+            if rate ~= nil and ratev ~= nil then
+                bat_now.watt = string.format("%.2fW", (rate * ratev) / 1e12)
+            else
+                bat_now.watt = "N/A"
+            end
+
+        end
+
+        widget = bat.widget
+        settings()
+
+        -- notifications for low and critical states
+        if bat_now.status == "Discharging" and notify == "on" and bat_now.perc ~= nil
+        then
+            local nperc = tonumber(bat_now.perc) or 100
+            if nperc <= 5
             then
                 bat.id = naughty.notify({
-                    text = "shutdown imminent",
-                    title = "battery nearly exhausted",
-                    position = "top_right",
-                    timeout = 15,
-                    fg="#000000",
-                    bg="#ffffff",
-                    ontop = true,
-                    replaces_id = bat.id
+                    preset = bat_notification_critical_preset,
+                    replaces_id = bat.id,
                 }).id
-            elseif bat.perc <= 15
+            elseif nperc <= 15
             then
                 bat.id = naughty.notify({
-                    text = "plug the cable",
-                    title = "battery low",
-                    position = "top_right",
-                    timeout = 15,
-                    fg="#202020",
-                    bg="#cdcdcd",
-                    ontop = true,
-                    replaces_id = bat.id
+                    preset = bat_notification_low_preset,
+                    replaces_id = bat.id,
                 }).id
             end
-
-            bat_now.perc = string.format("%d", bat_now.perc)
         end
-
-        widget = bat.widget
-        settings()
     end
 
-    newtimer("bat", timeout, bat.update)
+    newtimer("bat", timeout, update)
 
     return bat.widget
 end