]> 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:

pull #19 satisfaction
[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 notify = args.notify or true
31     local settings = args.settings or function() end
32
33     bat.widget = wibox.widget.textbox('')
34
35     function update()
36         bat_now = {
37             status = "Not present",
38             perc   = "N/A",
39             time   = "N/A",
40             watt   = "N/A"
41         }
42
43         local bstr  = "/sys/class/power_supply/" .. battery
44
45         local present = first_line(bstr .. "/present")
46
47         if present == "1"
48         then
49             local rate  = first_line(bstr .. "/power_now") or
50                           first_line(bstr .. "/current_now")
51
52             local ratev = first_line(bstr .. "/voltage_now")
53
54             local rem   = first_line(bstr .. "/energy_now") or
55                           first_line(bstr .. "/charge_now")
56
57             local tot   = first_line(bstr .. "/energy_full") or
58                           first_line(bstr .. "/charge_full")
59
60             bat_now.status = first_line(bstr .. "/status") or "N/A"
61
62             rate  = tonumber(rate)
63             ratev = tonumber(ratev)
64             rem   = tonumber(rem)
65             tot   = tonumber(tot)
66
67             local time_rat = 0
68             if bat_now.status == "Charging"
69             then
70                 time_rat = (tot - rem) / rate
71             elseif bat_now.status == "Discharging"
72             then
73                 time_rat = rem / rate
74             end
75
76             local hrs = math.floor(time_rat)
77             if hrs < 0 then hrs = 0 elseif hrs > 23 then hrs = 23 end
78
79             local min = math.floor((time_rat - hrs) * 60)
80             if min < 0 then min = 0 elseif min > 59 then min = 59 end
81
82             bat_now.time = string.format("%02d:%02d", hrs, min)
83
84             local perc = (rem / tot) * 100
85             if perc <= 100 then
86                 bat_now.perc = string.format("%d", perc)
87             elseif perc > 100 then
88                 bat_now.perc = "100"
89             elseif perc < 0 then
90                 bat_now.perc = "0"
91             end
92
93             if rate ~= nil and ratev ~= nil then
94                 bat_now.watt = string.format("%.2fW", (rate * ratev) / 1e12)
95             else
96                 bat_now.watt = "N/A"
97             end
98
99             -- notifications for low and critical states
100             if bat_now.status == "Discharging" and notify
101             then
102                 if tonumber(bat_now.perc) <= 5
103                 then
104                     bat.id = naughty.notify({
105                         text = "shutdown imminent",
106                         title = "battery nearly exhausted",
107                         position = "top_right",
108                         timeout = 15,
109                         fg="#000000",
110                         bg="#ffffff",
111                         ontop = true,
112                         replaces_id = bat.id
113                     }).id
114                 elseif tonumber(bat_now.perc) <= 15
115                 then
116                     bat.id = naughty.notify({
117                         text = "plug the cable",
118                         title = "battery low",
119                         position = "top_right",
120                         timeout = 15,
121                         fg="#202020",
122                         bg="#cdcdcd",
123                         ontop = true,
124                         replaces_id = bat.id
125                     }).id
126                 end
127             end
128         end
129
130         widget = bat.widget
131         settings()
132     end
133
134     newtimer("bat", timeout, update)
135
136     return bat.widget
137 end
138
139 return setmetatable(bat, { __call = function(_, ...) return worker(...) end })