]> git.madduck.net Git - etc/awesome.git/blob - widgets/bat.lua

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:

bat: fix issue #17
[etc/awesome.git] / widgets / bat.lua
1
2 --[[
3                                                   
4      Licensed under GNU General Public License v2 
5       * (c) 2013,      Luke Bonham                
6       * (c) 2010-2012, Peter Hofmann              
7                                                   
8 --]]
9
10 local newtimer     = require("lain.helpers").newtimer
11 local first_line   = require("lain.helpers").first_line
12
13 local naughty      = require("naughty")
14 local wibox        = require("wibox")
15
16 local math         = { floor  = math.floor }
17 local string       = { format = string.format }
18 local tonumber     = tonumber
19
20 local setmetatable = setmetatable
21
22 -- Battery infos
23 -- lain.widgets.bat
24 local bat = {}
25
26 local function worker(args)
27     local args = args or {}
28     local timeout = args.timeout or 30
29     local battery = args.battery or "BAT0"
30     local settings = args.settings or function() end
31
32     bat.widget = wibox.widget.textbox('')
33
34     function update()
35         bat_now = {
36             status = "Not present",
37             perc   = "N/A",
38             time   = "N/A",
39             watt   = "N/A"
40         }
41
42         local bstr  = "/sys/class/power_supply/" .. battery
43
44         local present = first_line(bstr .. "/present")
45
46         if present == "1"
47         then
48             local rate  = first_line(bstr .. "/power_now") or
49                           first_line(bstr .. "/current_now")
50
51             local ratev = first_line(bstr .. "/voltage_now")
52
53             local rem   = first_line(bstr .. "/energy_now") or
54                           first_line(bstr .. "/charge_now")
55
56             local tot   = first_line(bstr .. "/energy_full") or
57                           first_line(bstr .. "/charge_full")
58
59             bat_now.status = first_line(bstr .. "/status") or "N/A"
60
61             rate  = tonumber(rate)
62             ratev = tonumber(ratev)
63             rem   = tonumber(rem)
64             tot   = tonumber(tot)
65
66             local time_rat = 0
67             if bat_now.status == "Charging"
68             then
69                 time_rat = (tot - rem) / rate
70             elseif bat_now.status == "Discharging"
71             then
72                 time_rat = rem / rate
73             end
74
75             local hrs = math.floor(time_rat)
76             if hrs < 0 then hrs = 0 elseif hrs > 23 then hrs = 23 end
77
78             local min = math.floor((time_rat - hrs) * 60)
79             if min < 0 then min = 0 elseif min > 59 then min = 59 end
80
81             bat_now.time = string.format("%02d:%02d", hrs, min)
82
83             local perc = (rem / tot) * 100
84             if perc <= 100 then
85                 bat_now.perc = string.format("%d", perc)
86             elseif perc > 100 then
87                 bat_now.perc = "100"
88             elseif perc < 0 then
89                 bat_now.perc = "0"
90             end
91
92             if rate ~= nil and ratev ~= nil then
93                 bat_now.watt = string.format("%.2fW", (rate * ratev) / 1e12)
94             else
95                 bat_not.watt = "N/A"
96             end
97
98             -- notifications for low and critical states
99             if bat_now.status == "Discharging"
100             then
101                 if tonumber(bat_now.perc) <= 5
102                 then
103                     bat.id = naughty.notify({
104                         text = "shutdown imminent",
105                         title = "battery nearly exhausted",
106                         position = "top_right",
107                         timeout = 15,
108                         fg="#000000",
109                         bg="#ffffff",
110                         ontop = true,
111                         replaces_id = bat.id
112                     }).id
113                 elseif tonumber(bat_now.perc) <= 15
114                 then
115                     bat.id = naughty.notify({
116                         text = "plug the cable",
117                         title = "battery low",
118                         position = "top_right",
119                         timeout = 15,
120                         fg="#202020",
121                         bg="#cdcdcd",
122                         ontop = true,
123                         replaces_id = bat.id
124                     }).id
125                 end
126             end
127         end
128
129         widget = bat.widget
130         settings()
131     end
132
133     newtimer("bat", timeout, update)
134
135     return bat.widget
136 end
137
138 return setmetatable(bat, { __call = function(_, ...) return worker(...) end })