From cef569b6f17cb18bf11b453dcf1887ff81fe0974 Mon Sep 17 00:00:00 2001 From: "Adrian C. (anrxc)" Date: Mon, 3 Aug 2009 04:40:55 +0200 Subject: [PATCH] CPU frequency widget included. The cpufreq widget supplements the cpu widget. It returns the current CPU scaling frequency (in MHz and GHz), voltage (in mV and V) and governor information for a requested CPU. If supported by the processor and correct kernel modules are loaded. --- README | 4 ++++ cpufreq.lua | 67 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 71 insertions(+) create mode 100644 cpufreq.lua diff --git a/README b/README index 1206353..4a0fa3d 100644 --- a/README +++ b/README @@ -83,6 +83,10 @@ in the format string. vicious.widgets.cpu - provides CPU usage for all available CPUs/cores +vicious.widgets.cpufreq + - provides freq, voltage and governor info for a requested CPU + - takes the CPU ID as an argument, i.e. "cpu0" + vicious.widgets.thermal - provides temperature levels of ACPI thermal zones - takes the thermal zone as an argument, i.e. "TZS0" diff --git a/cpufreq.lua b/cpufreq.lua new file mode 100644 index 0000000..550bba3 --- /dev/null +++ b/cpufreq.lua @@ -0,0 +1,67 @@ +---------------------------------------------------------- +-- Licensed under the GNU General Public License version 2 +-- * Copyright (C) 2009 Adrian C. +---------------------------------------------------------- + +-- {{{ Grab environment +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 +function worker(format, cpuid) + -- Initialise tables + --local governor_state = { + -- ["ondemand"] = "↯", + -- ["powersave"] = "⌁", + -- ["userspace"] = "°", + -- ["performance"] = "⚡", + -- ["conservative"] = "↯" + --} + + -- Get the current frequency + local ffreq = io.open("/sys/devices/system/cpu/"..cpuid.."/cpufreq/scaling_cur_freq") + local freq = ffreq:read("*line") + ffreq:close() + + -- Calculate MHz and GHz + local freqmhz = freq / 1000 + local freqghz = freqmhz / 1000 + + + -- Get the current voltage + local fvolt = io.open("/sys/devices/system/cpu/"..cpuid.."/cpufreq/scaling_voltages") + for line in fvolt:lines() do + if line:find("^"..freq) then + voltagemv = line:match("[%d]+[%s]([%d]+)") + break + end + end + fvolt:close() + + -- Calculate voltage from mV + local voltagev = voltagemv / 1000 + + + -- Get the current governor + local fgov = io.open("/sys/devices/system/cpu/"..cpuid.."/cpufreq/scaling_governor") + local governor = fgov:read("*line") + fgov:close() + + -- Represent the governor as a symbol + --local governor = governor_state[governor] or governor + + return {freqmhz, freqghz, voltagemv, voltagev, governor} +end +-- }}} + +setmetatable(_M, { __call = function(_, ...) return worker(...) end })