summaryrefslogtreecommitdiff
path: root/lain/widgets/contrib/tpbat/init.lua
blob: 782bf353deafc00c5d0c39f0edb5cc17c162b6a1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170

--[[
                                                               
     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 debug        = { getinfo = debug.getinfo }
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 string       = { format = string.format }
local math         = { floor = math.floor }
local tostring     = tostring
local setmetatable = setmetatable

package.path       = debug.getinfo(1,"S").source:match[[^@?(.*[\/])[^\/]-$]] .. "?.lua;" .. package.path
local smapi        = require("smapi")

-- ThinkPad SMAPI-enabled battery info widget
-- lain.widgets.contrib.tpbat
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
    local t_out = t_out or 0

    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)
                .. 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,
        screen = client.focus and client.focus.screen or 1
    })
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('')

    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"
    }

    if bat:get('state') == nil
    then
        local n = naughty.notify({
            preset = bat_notification_low_preset,
            title = "SMAPI Battery Warning: Unable to read battery state!",
            text = "This widget is intended for ThinkPads. Is tp_smapi installed? Check your configs & paths.",
            screen = client.focus and client.focus.screen or 1
        })
    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() or "N/A"
            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 (when discharging)
            if bat_now.status == "discharging"
            then
                if bat_now.perc <= 5
                then
                    tpbat.id = naughty.notify({
                        preset = bat_notification_critical_preset,
                        replaces_id = tpbat.id,
                        screen = client.focus and client.focus.screen or 1
                    }).id
                elseif bat_now.perc <= 15
                then
                    tpbat.id = naughty.notify({
                        preset = bat_notification_low_preset,
                        replaces_id = tpbat.id,
                        screen = client.focus and client.focus.screen or 1
                    }).id
                end
            end

            bat_now.perc = tostring(bat_now.perc)
        end

        widget = tpbat.widget
        settings()
    end

    newtimer("tpbat", timeout, update)

    widget:connect_signal('mouse::enter', function () tpbat:show() end)
    widget:connect_signal('mouse::leave', function () tpbat:hide() end)

    return tpbat.widget
end

return setmetatable(tpbat, { __call = function(_, ...) return tpbat.register(...) end })