aboutsummaryrefslogtreecommitdiff
path: root/cpufreq.lua
blob: 436e48b8dbae97eeb57ba1274194c16825d4ba86 (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
---------------------------------------------------
-- Licensed under the GNU General Public License v2
--  * (c) 2009, Adrian C. <anrxc.sysphere.org>
---------------------------------------------------

-- {{{ Grab environment
local tonumber = tonumber
local io = { open = io.open }
local setmetatable = setmetatable
local string = {
    find = string.find,
    match = string.match
}
-- }}}


-- Cpufreq: provides freq, voltage and governor info for a requested CPU
module("vicious.cpufreq")


-- {{{ CPU frequency widget type
local function worker(format, cpuid)
    --local governor_state = {
    --    ["ondemand"] = "↯",
    --    ["powersave"] = "⌁",
    --    ["userspace"] = "°",
    --    ["performance"] = "⚡",
    --    ["conservative"] = "↯"
    --}

    -- Default voltage values
    local voltage = { v  = "N/A", mv = "N/A" }


    -- Get the current frequency
    local f = io.open("/sys/devices/system/cpu/"..cpuid.."/cpufreq/scaling_cur_freq")
    local freq = f:read("*line")
    f:close()

    -- Calculate MHz and GHz
    local freqmhz = freq / 1000
    local freqghz = freqmhz / 1000


    -- Get the current voltage
    local f = io.open("/sys/devices/system/cpu/"..cpuid.."/cpufreq/scaling_voltages")
    if f then for line in f:lines() do
        if string.find(line, "^"..freq) then
            voltage.mv = tonumber(string.match(line, "[%d]+[%s]([%d]+)"))
            break
        end
      end
      f:close()

      -- Calculate voltage from mV
      voltage.v = voltage.mv / 1000
    end


    -- Get the current governor
    local f = io.open("/sys/devices/system/cpu/"..cpuid.."/cpufreq/scaling_governor")
    local governor = f:read("*line")
    f:close()

    -- Represent the governor as a symbol
    --local governor = governor_state[governor] or governor

    return {freqmhz, freqghz, voltage.mv, voltage.v, governor}
end
-- }}}

setmetatable(_M, { __call = function(_, ...) return worker(...) end })