diff --git a/drawing/graphics.lua b/drawing/graphics.lua index 097e0c3..ddb423a 100644 --- a/drawing/graphics.lua +++ b/drawing/graphics.lua @@ -10,13 +10,71 @@ return function(update_freq, config, common, width, point) local __string_match = string.match local __tonumber = tonumber + ----------------------------------------------------------------------------- + -- nvidia state + + -- vars to process the nv settings glob + -- + -- glob will be of the form: + -- + -- + -- + -- , + -- graphics=, memory=, video=, PCIe= + local NV_QUERY = 'nvidia-settings -t'.. + ' -q UsedDedicatedGPUmemory'.. + ' -q TotalDedicatedGPUmemory'.. + ' -q ThermalSensorReading'.. + ' -q [gpu:0]/GPUCurrentClockFreqs'.. + ' -q [gpu:0]/GPUutilization' + + local NV_REGEX = '(%d+)\n'.. + '(%d+)\n'.. + '(%d+)\n'.. + '(%d+),(%d+)\n'.. + 'graphics=(%d+), memory=%d+, video=(%d+), PCIe=%d+\n' + + local GPU_BUS_CTRL = '/sys/bus/pci/devices/0000:01:00.0/power/control' + + local mod_state = { + error = false, + used_memory = 0, + total_memory = 0, + temp_reading = 0, + gpu_frequency = 0, + memory_frequency = 0, + gpu_utilization = 0, + vid_utilization = 0 + } + + local update_state = function() + if i_o.read_file(GPU_BUS_CTRL, nil, '*l') == 'on' then + local nvidia_settings_glob = i_o.execute_cmd(NV_QUERY) + if nvidia_settings_glob == '' then + mod_state.error = 'Error' + else + mod_state.used_memory, + mod_state.total_memory, + mod_state.temp_reading, + mod_state.gpu_frequency, + mod_state.memory_frequency, + mod_state.gpu_utilization, + mod_state.vid_utilization + = __string_match(nvidia_settings_glob, NV_REGEX) + mod_state.error = false + end + else + mod_state.error = 'Off' + end + end + ----------------------------------------------------------------------------- -- helper functions - local _from_state = function(def, f, set) - return function(s) - if s.error == false then - set(f(s)) + local _from_state = function(def, get, set) + return function() + if mod_state.error == false then + set(get(mod_state)) else set(def) end @@ -59,11 +117,11 @@ return function(update_freq, config, common, width, point) width, 'Status' ) - local update = function(s) - if s.error == false then + local update = function() + if mod_state.error == false then common.text_row_set(obj, 'On') else - common.text_row_set(obj, s.error) + common.text_row_set(obj, mod_state.error) end end local static = pure.partial(common.text_row_draw_static, obj) @@ -106,10 +164,10 @@ return function(update_freq, config, common, width, point) TEXT_SPACING, {'GPU Clock Speed', 'memory Clock Speed'} ) - local update = function(s) - if s.error == false then - common.text_rows_set(obj, 1, s.gpu_frequency..' Mhz') - common.text_rows_set(obj, 2, s.memory_frequency..' Mhz') + local update = function() + if mod_state.error == false then + common.text_rows_set(obj, 1, mod_state.gpu_frequency..' Mhz') + common.text_rows_set(obj, 2, mod_state.memory_frequency..' Mhz') else common.text_rows_set(obj, 1, NA) common.text_rows_set(obj, 2, NA) @@ -147,65 +205,6 @@ return function(update_freq, config, common, width, point) function(s) return s.vid_utilization end ) - ----------------------------------------------------------------------------- - -- nvidia state - - -- vars to process the nv settings glob - -- - -- glob will be of the form: - -- - -- - -- - -- , - -- graphics=, memory=, video=, PCIe= - local NV_QUERY = 'nvidia-settings -t'.. - ' -q UsedDedicatedGPUmemory'.. - ' -q TotalDedicatedGPUmemory'.. - ' -q ThermalSensorReading'.. - ' -q [gpu:0]/GPUCurrentClockFreqs'.. - ' -q [gpu:0]/GPUutilization' - - local NV_REGEX = '(%d+)\n'.. - '(%d+)\n'.. - '(%d+)\n'.. - '(%d+),(%d+)\n'.. - 'graphics=(%d+), memory=%d+, video=(%d+), PCIe=%d+\n' - - local GPU_BUS_CTRL = '/sys/bus/pci/devices/0000:01:00.0/power/control' - - local state = { - error = false, - used_memory = 0, - total_memory = 0, - temp_reading = 0, - gpu_frequency = 0, - memory_frequency = 0, - gpu_utilization = 0, - vid_utilization = 0 - } - - local update_state = function() - if i_o.read_file(GPU_BUS_CTRL, nil, '*l') == 'on' then - local nvidia_settings_glob = i_o.execute_cmd(NV_QUERY) - if nvidia_settings_glob == '' then - state.error = 'Error' - else - state.used_memory, - state.total_memory, - state.temp_reading, - state.gpu_frequency, - state.memory_frequency, - state.gpu_utilization, - state.vid_utilization - = __string_match(nvidia_settings_glob, NV_REGEX) - state.error = false - end - else - state.error = 'Off' - end - return state - end - ----------------------------------------------------------------------------- -- main drawing functions @@ -213,7 +212,7 @@ return function(update_freq, config, common, width, point) header = 'NVIDIA GRAPHICS', point = point, width = width, - update_wrapper = function(f) return function(_) f(update_state()) end end, + update_wrapper = function(f) return function(_) update_state() f() end end, top = {{mk_status, true, SEPARATOR_SPACING}}, common.mk_section( SEPARATOR_SPACING, diff --git a/drawing/memory.lua b/drawing/memory.lua index d1276d2..8099814 100644 --- a/drawing/memory.lua +++ b/drawing/memory.lua @@ -18,6 +18,43 @@ return function(update_freq, config, common, width, point) local __string_match = string.match local __math_floor = math.floor + ----------------------------------------------------------------------------- + -- state + + local MEMINFO_REGEX = '\nMemFree:%s+(%d+).+'.. + '\nBuffers:%s+(%d+).+'.. + '\nCached:%s+(%d+).+'.. + '\nSwapFree:%s+(%d+).+'.. + '\nShmem:%s+(%d+).+'.. + '\nSReclaimable:%s+(%d+)' + + local get_meminfo_field = function(field) + return tonumber(i_o.read_file('/proc/meminfo', field..':%s+(%d+)')) + end + + local mod_state = { + mem = {total = get_meminfo_field('MemTotal')}, + swap = {total = get_meminfo_field('SwapTotal')} + } + local read_state = function() + local m = mod_state.mem + -- see manpage for free command for formulas + m.memfree, + m.buffers, + m.cached, + mod_state.swap.free, + m.shmem, + m.sreclaimable + = __string_match(i_o.read_file('/proc/meminfo'), MEMINFO_REGEX) + m.used_percent = + (m.total - + m.memfree - + m.cached - + m.buffers - + m.sreclaimable) / m.total + end + + ----------------------------------------------------------------------------- -- mem stats (dial + text) @@ -56,9 +93,9 @@ return function(update_freq, config, common, width, point) {'Page Cache', 'Buffers', 'Shared', 'Kernel Slab'}, '%.1f%%' ) - local update = function(s) - local m = s.mem - local w = s.swap + local update = function() + local m = mod_state.mem + local w = mod_state.swap common.dial_set(mem, m.used_percent * 100) common.dial_set(swap, (w.total - w.free) / w.total * 100) @@ -94,7 +131,7 @@ return function(update_freq, config, common, width, point) return common.mk_acc( width, PLOT_HEIGHT, - function(s) timeseries.update(obj, s.mem.used_percent) end, + function() timeseries.update(obj, mod_state.mem.used_percent) end, pure.partial(timeseries.draw_static, obj), pure.partial(timeseries.draw_dynamic, obj) ) @@ -122,7 +159,7 @@ return function(update_freq, config, common, width, point) NUM_ROWS, 'Mem (%)' ) - local update = function(_) + local update = function() for r = 1, NUM_ROWS do text_table.set(obj, 1, r, i_o.conky(TABLE_CONKY[r].comm, '(%S+)')) text_table.set(obj, 2, r, i_o.conky(TABLE_CONKY[r].pid)) @@ -138,43 +175,6 @@ return function(update_freq, config, common, width, point) ) end - ----------------------------------------------------------------------------- - -- state - - local MEMINFO_REGEX = '\nMemFree:%s+(%d+).+'.. - '\nBuffers:%s+(%d+).+'.. - '\nCached:%s+(%d+).+'.. - '\nSwapFree:%s+(%d+).+'.. - '\nShmem:%s+(%d+).+'.. - '\nSReclaimable:%s+(%d+)' - - local get_meminfo_field = function(field) - return tonumber(i_o.read_file('/proc/meminfo', field..':%s+(%d+)')) - end - - local state = { - mem = {total = get_meminfo_field('MemTotal')}, - swap = {total = get_meminfo_field('SwapTotal')} - } - local read_state = function() - local m = state.mem - -- see manpage for free command for formulas - m.memfree, - m.buffers, - m.cached, - state.swap.free, - m.shmem, - m.sreclaimable - = __string_match(i_o.read_file('/proc/meminfo'), MEMINFO_REGEX) - m.used_percent = - (m.total - - m.memfree - - m.cached - - m.buffers - - m.sreclaimable) / m.total - return state - end - ----------------------------------------------------------------------------- -- main functions @@ -182,7 +182,7 @@ return function(update_freq, config, common, width, point) header = 'MEMORY', point = point, width = width, - update_wrapper = function(f) return function(_) f(read_state()) end end, + update_wrapper = function(f) return function(_) read_state() f() end end, top = { {mk_stats, config.show_stats, PLOT_SECTION_BREAK}, {mk_plot, config.show_plot, TABLE_SECTION_BREAK}, diff --git a/drawing/network.lua b/drawing/network.lua index 38092b5..3712ccf 100644 --- a/drawing/network.lua +++ b/drawing/network.lua @@ -12,17 +12,16 @@ return function(update_freq, common, width, point) return i_o.read_file(path, nil, '*n') * 8 end - local state = {rx_bits = 0, tx_bits = 0} + local mod_state = {rx_bits = 0, tx_bits = 0} local read_interfaces = function() - state.rx_bits = 0 - state.tx_bits = 0 + mod_state.rx_bits = 0 + mod_state.tx_bits = 0 for i = 1, #INTERFACE_PATHS do local p = INTERFACE_PATHS[i] - state.rx_bits = state.rx_bits + get_bits(p.rx) - state.tx_bits = state.tx_bits + get_bits(p.tx) + mod_state.rx_bits = mod_state.rx_bits + get_bits(p.rx) + mod_state.tx_bits = mod_state.tx_bits + get_bits(p.tx) end - return state end -- prime initial state @@ -48,12 +47,12 @@ return function(update_freq, common, width, point) label, 2, update_freq, - state[key] + mod_state[key] ) return common.mk_acc( width, PLOT_HEIGHT + PLOT_SEC_BREAK, - function(s) common.update_rate_timeseries(obj, s[key]) end, + function() common.update_rate_timeseries(obj, mod_state[key]) end, pure.partial(common.tagged_scaled_timeseries_draw_static, obj), pure.partial(common.tagged_scaled_timeseries_draw_dynamic, obj) ) @@ -69,7 +68,7 @@ return function(update_freq, common, width, point) header = 'NETWORK', point = point, width = width, - update_wrapper = function(f) return function(_) f(read_interfaces()) end end, + update_wrapper = function(f) return function(_) read_interfaces() f() end end, top = { {mk_rx, true, PLOT_SEC_BREAK}, {mk_tx, true, 0},