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

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