]> git.madduck.net Git - etc/awesome.git/commitdiff

madduck's git repository

Every one of the projects in this repository is available at the canonical URL git://git.madduck.net/madduck/pub/<projectpath> — see each project's metadata for the exact URL.

All patches and comments are welcome. Please squash your changes to logical commits before using git-format-patch and git-send-email to patches@git.madduck.net. If you'd read over the Git project's submission guidelines and adhered to them, I'd be especially grateful.

SSH access, as well as push access can be individually arranged.

If you use my repositories frequently, consider adding the following snippet to ~/.gitconfig and using the third clone URL listed for each project:

[url "git://git.madduck.net/madduck/"]
  insteadOf = madduck:

Merge pull request #5 from cahna/tp-bat-contrib
authorLuke Bonham <copycat-killer@users.noreply.github.com>
Thu, 26 Sep 2013 09:18:17 +0000 (02:18 -0700)
committerLuke Bonham <copycat-killer@users.noreply.github.com>
Thu, 26 Sep 2013 09:18:17 +0000 (02:18 -0700)
ThinkPad Battery Widget added

widgets/contrib/tpbat/init.lua [new file with mode: 0644]
widgets/contrib/tpbat/smapi.lua [new file with mode: 0644]

diff --git a/widgets/contrib/tpbat/init.lua b/widgets/contrib/tpbat/init.lua
new file mode 100644 (file)
index 0000000..1bb6a9b
--- /dev/null
@@ -0,0 +1,156 @@
+--[[
+     tpbat.lua
+     Battery status widget for ThinkPad laptops that use SMAPI
+     lain.widgets.contrib.tpbat
+
+     More on tp_smapi: http://www.thinkwiki.org/wiki/Tp_smapi
+
+     Licensed under GNU General Public License v2 
+      * (c) 2013,      Conor Heine
+      * (c) 2013,      Luke Bonham                
+      * (c) 2010-2012, Peter Hofmann              
+                                                  
+--]]
+
+local newtimer     = require("lain.helpers").newtimer
+local first_line   = require("lain.helpers").first_line
+local beautiful    = require("beautiful")
+local naughty      = require("naughty")
+local wibox        = require("wibox")
+local smapi        = require("lain.widgets.contrib.tpbat.smapi") -- Ugly :(
+
+local string       = { format = string.format }
+local math         = { floor = math.floor }
+local tostring     = tostring
+local setmetatable = setmetatable
+
+-- ThinkPad SMAPI-enabled battery info widget
+local tpbat = { }
+
+local tpbat_notification = nil
+
+function tpbat:hide()
+    if tpbat_notification ~= nil 
+    then
+        naughty.destroy(tpbat_notification)
+        tpbat_notification = nil
+    end
+end
+
+function tpbat:show(t_out)
+    tpbat:hide()
+    
+    local bat = self.bat
+    if bat == nil or not bat:installed() then return end
+
+    local mfgr   = bat:get('manufacturer') or "no_mfgr"
+    local model  = bat:get('model') or "no_model"
+    local chem   = bat:get('chemistry') or "no_chem"
+    local status = bat:get('state') or "nil"
+    local time   = bat:remaining_time()
+    local msg    = "\t"
+
+    if status ~= "idle" and status ~= "nil" 
+    then
+        if time == "N/A" 
+        then
+            msg = "...Calculating time remaining..."
+        else
+            msg = time .. (status == "charging" and " until charged" or " remaining")
+        end
+    else
+        msg = "On AC Power"
+    end
+
+    local str = string.format("%s : %s %s (%s)\n", bat.name, mfgr, model, chem)
+    str = str .. string.format("\n%s \t\t\t %s", status:upper(), msg)
+
+    tpbat_notification = naughty.notify({
+        preset = { fg = beautiful.fg_normal },
+        text = str,
+        timeout = t_out
+    })
+end
+
+function tpbat.register(args)
+    local args = args or {}
+    local timeout = args.timeout or 30
+    local battery = args.battery or "BAT0"
+    local settings = args.settings or function() end
+
+    tpbat.bat = smapi:battery(battery) -- Create a new battery
+    local bat = tpbat.bat
+    
+    tpbat.widget = wibox.widget.textbox('')
+
+    if bat:get('state') == nil 
+    then
+        local n = naughty.notify({
+            title = "SMAPI Battery Warning: Unable to read battery state!",
+            text = "This widget is intended for ThinkPads. Is tp_smapi installed? Check your configs & paths.",
+            position = "top_right",
+            timeout = 15,
+            fg="#202020",
+            bg="#cdcdcd",
+            ontop = true
+        })
+    end
+
+    function update()
+        bat_now = {
+            status = "Not present",
+            perc   = "N/A",
+            time   = "N/A",
+            watt   = "N/A"
+        }
+
+        if bat:installed()
+        then
+            bat_now.status = bat:status()
+            bat_now.perc   = bat:percent()
+            bat_now.time   = bat:remaining_time()
+            -- bat_now.watt = string.format("%.2fW", (VOLTS * AMPS) / 1e12)
+
+            -- notifications for low and critical states
+            if bat_now.perc <= 5
+            then
+                tpbat.id = naughty.notify({
+                    text = "shutdown imminent",
+                    title = "battery nearly exhausted",
+                    position = "top_right",
+                    timeout = 15,
+                    fg="#000000",
+                    bg="#ffffff",
+                    ontop = true,
+                    replaces_id = tpbat.id
+                }).id
+            elseif bat_now.perc <= 15
+            then
+                tpbat.id = naughty.notify({
+                    text = "plug the cable",
+                    title = "battery low",
+                    position = "top_right",
+                    timeout = 15,
+                    fg="#202020",
+                    bg="#cdcdcd",
+                    ontop = true,
+                    replaces_id = tpbat.id
+                }).id
+            end
+
+            bat_now.perc = tostring(bat_now.perc)
+        end
+
+        widget = tpbat.widget -- 'widget' needed in rc.lua (following convention)
+        settings()
+    end
+
+    newtimer("tpbat", timeout, update)
+
+    widget:connect_signal('mouse::enter', function () tpbat:show(0) end)
+    widget:connect_signal('mouse::leave', function () tpbat:hide() end)
+
+    return tpbat.widget
+end
+
+return setmetatable(tpbat, { __call = function(_, ...) return tpbat.register(...) end })
diff --git a/widgets/contrib/tpbat/smapi.lua b/widgets/contrib/tpbat/smapi.lua
new file mode 100644 (file)
index 0000000..59b916b
--- /dev/null
@@ -0,0 +1,100 @@
+--[[
+     smapi.lua
+     Interface with thinkpad battery information
+
+     Licensed under GNU General Public License v2 
+      * (c) 2013,      Conor Heine           
+                                                  
+--]]
+
+local first_line   = require("lain.helpers").first_line
+
+local string       = { format = string.format }
+local tonumber     = tonumber
+local setmetatable = setmetatable
+
+local smapi = {}
+
+local apipath = "/sys/devices/platform/smapi"
+
+-- Most are readable values, but some can be written to (not implemented, yet?)
+local readable = {
+    barcoding = true,
+    charging_max_current = true,
+    charging_max_voltage = true,
+    chemistry = true,
+    current_avg = true,
+    current_now = true,
+    cycle_count = true,
+    design_capacity = true,
+    design_voltage = true,
+    dump = true,
+    first_use_date = true,
+    force_discharge = false,
+    group0_voltage = true,
+    group1_voltage = true,
+    group2_voltage = true,
+    group3_voltage = true,
+    inhibit_charge_minutes = false,
+    installed = true,
+    last_full_capacity = true,
+    manufacture_date = true,
+    manufacturer = true,
+    model = true,
+    power_avg = true,
+    power_now = true,
+    remaining_capacity = true,
+    remaining_charging_time = true,
+    remaining_percent = true,
+    remaining_percent_error = true,
+    remaining_running_time = true,
+    remaining_running_time_now = true,
+    serial = true,
+    start_charge_thresh = false,
+    state = true,
+    stop_charge_thresh = false,
+    temperature = true,
+    voltage = true,
+}
+
+function smapi:battery(name)
+    local bat = {}
+
+    bat.name = name
+    bat.path = apipath .. "/" .. name
+    
+    function bat:get(item)
+        return self.path ~= nil and readable[item] and first_line(self.path .. "/" .. item) or nil
+    end
+
+    function bat:installed()
+        return self:get("installed") == "1"
+    end
+
+    function bat:status()
+        return self:get('state')
+    end
+
+    -- Remaining time can either be time until battery dies or time until charging completes
+    function bat:remaining_time()
+        local time_val = bat_now.status == 'discharging' and 'remaining_running_time' or 'remaining_charging_time'
+        local mins_left = self:get(time_val)
+
+        if mins_left:find("^%d+") == nil 
+        then 
+            return "N/A" 
+        end
+        
+        local hrs = mins_left / 60
+        local min = mins_left % 60
+        return string.format("%02d:%02d", hrs, min)
+    end
+
+    function bat:percent()
+        return tonumber(self:get("remaining_percent"))
+    end
+
+    return setmetatable(bat, {__metatable = false, __newindex = false})
+end
+
+return smapi
\ No newline at end of file