From 7fa168a925502ee114efb0d4e1ed5672dd6e2d44 Mon Sep 17 00:00:00 2001 From: petrucci4prez Date: Sat, 15 Jul 2017 20:08:39 -0400 Subject: [PATCH] update for clevo n855hj --- .conkyrc | 4 +- interface/Panel.lua | 27 ++-- main.lua | 52 ++++--- module/FileSystem.lua | 65 ++++---- module/Graphics.lua | 328 +++++++++++++++++++++++++++++++++++++++++ module/Memory.lua | 10 +- module/Network.lua | 23 ++- module/Pacman.lua | 4 +- module/Power.lua | 210 ++++++++++++++++++++++++++ module/Processor.lua | 255 ++++++++++++++++---------------- module/ReadWrite.lua | 23 ++- module/System.lua | 4 +- module/Weather.lua | 157 +++++++++++--------- scripts/get_weather.sh | 8 +- 14 files changed, 869 insertions(+), 301 deletions(-) create mode 100644 module/Graphics.lua create mode 100644 module/Power.lua diff --git a/.conkyrc b/.conkyrc index 7c80692..83048c5 100644 --- a/.conkyrc +++ b/.conkyrc @@ -13,8 +13,8 @@ conky.config = { own_window_hints = 'undecorated,below,sticky,skip_taskbar,skip_pager', double_buffer = true, - minimum_width = 1377, - minimum_height = 778, + minimum_width = 1920, + minimum_height = 1080, draw_shades = false, draw_outline = false, diff --git a/interface/Panel.lua b/interface/Panel.lua index 00f7d06..5b6c63b 100644 --- a/interface/Panel.lua +++ b/interface/Panel.lua @@ -1,26 +1,23 @@ local Widget = require 'Widget' local FillRect = require 'FillRect' -local PAD_X = 20 -local PAD_Y = 10 - local left = Widget.Panel{ - x = CONSTRUCTION_GLOBAL.LEFT_X - PAD_X, - y = CONSTRUCTION_GLOBAL.TOP_Y - PAD_Y, - width = CONSTRUCTION_GLOBAL.SIDE_WIDTH + PAD_X * 2, - height = CONSTRUCTION_GLOBAL.SIDE_HEIGHT + PAD_Y * 2, + x = CONSTRUCTION_GLOBAL.LEFT_X - CONSTRUCTION_GLOBAL.PANEL_MARGIN_X, + y = CONSTRUCTION_GLOBAL.TOP_Y - CONSTRUCTION_GLOBAL.PANEL_MARGIN_Y, + width = CONSTRUCTION_GLOBAL.SECTION_WIDTH + CONSTRUCTION_GLOBAL.PANEL_MARGIN_X * 2, + height = CONSTRUCTION_GLOBAL.SIDE_HEIGHT + CONSTRUCTION_GLOBAL.PANEL_MARGIN_Y * 2, } local center = Widget.Panel{ - x = CONSTRUCTION_GLOBAL.CENTER_X - PAD_X, - y = CONSTRUCTION_GLOBAL.TOP_Y - PAD_Y, - width = CONSTRUCTION_GLOBAL.CENTER_WIDTH + PAD_X * 2, - height = CONSTRUCTION_GLOBAL.CENTER_HEIGHT + PAD_Y * 2, + x = CONSTRUCTION_GLOBAL.CENTER_LEFT_X - CONSTRUCTION_GLOBAL.PANEL_MARGIN_X, + y = CONSTRUCTION_GLOBAL.TOP_Y - CONSTRUCTION_GLOBAL.PANEL_MARGIN_Y, + width = CONSTRUCTION_GLOBAL.CENTER_WIDTH + CONSTRUCTION_GLOBAL.PANEL_MARGIN_Y * 2 + CONSTRUCTION_GLOBAL.CENTER_PAD, + height = CONSTRUCTION_GLOBAL.CENTER_HEIGHT + CONSTRUCTION_GLOBAL.PANEL_MARGIN_Y * 2, } local right = Widget.Panel{ - x = CONSTRUCTION_GLOBAL.RIGHT_X - PAD_X, - y = CONSTRUCTION_GLOBAL.TOP_Y - PAD_Y, - width = CONSTRUCTION_GLOBAL.SIDE_WIDTH + PAD_X * 2, - height = CONSTRUCTION_GLOBAL.SIDE_HEIGHT + PAD_Y * 2, + x = CONSTRUCTION_GLOBAL.RIGHT_X - CONSTRUCTION_GLOBAL.PANEL_MARGIN_X, + y = CONSTRUCTION_GLOBAL.TOP_Y - CONSTRUCTION_GLOBAL.PANEL_MARGIN_Y, + width = CONSTRUCTION_GLOBAL.SECTION_WIDTH + CONSTRUCTION_GLOBAL.PANEL_MARGIN_X * 2, + height = CONSTRUCTION_GLOBAL.SIDE_HEIGHT + CONSTRUCTION_GLOBAL.PANEL_MARGIN_Y * 2, } Widget = nil diff --git a/main.lua b/main.lua index 45e625b..afb7b5f 100644 --- a/main.lua +++ b/main.lua @@ -20,18 +20,27 @@ package.path = ABS_PATH..'/?.lua;'.. local UPDATE_FREQUENCY = 1 --Hz CONSTRUCTION_GLOBAL = { - UPDATE_INTERVAL = 1 / UPDATE_FREQUENCY, - LEFT_X = 30, - CENTER_X = 376, - RIGHT_X = 1045, - TOP_Y = 21, - SIDE_WIDTH = 300, - SIDE_HEIGHT = 709, - CENTER_WIDTH = 623, - CENTER_HEIGHT = 154, - ABS_PATH = ABS_PATH + UPDATE_INTERVAL = 1 / UPDATE_FREQUENCY, + + LEFT_X = 32, + SECTION_WIDTH = 436, + CENTER_PAD = 20, + PANEL_HORZ_SPACING = 10, + PANEL_MARGIN_X = 20, + PANEL_MARGIN_Y = 10, + + TOP_Y = 21, + SIDE_HEIGHT = 1020, + CENTER_HEIGHT = 220, + + ABS_PATH = ABS_PATH } +CONSTRUCTION_GLOBAL.CENTER_LEFT_X = CONSTRUCTION_GLOBAL.LEFT_X + CONSTRUCTION_GLOBAL.SECTION_WIDTH + CONSTRUCTION_GLOBAL.PANEL_MARGIN_X * 2 + CONSTRUCTION_GLOBAL.PANEL_HORZ_SPACING +CONSTRUCTION_GLOBAL.CENTER_RIGHT_X = CONSTRUCTION_GLOBAL.CENTER_LEFT_X + CONSTRUCTION_GLOBAL.SECTION_WIDTH + CONSTRUCTION_GLOBAL.CENTER_PAD +CONSTRUCTION_GLOBAL.CENTER_WIDTH = CONSTRUCTION_GLOBAL.SECTION_WIDTH * 2 + CONSTRUCTION_GLOBAL.CENTER_PAD +CONSTRUCTION_GLOBAL.RIGHT_X = CONSTRUCTION_GLOBAL.CENTER_LEFT_X + CONSTRUCTION_GLOBAL.CENTER_WIDTH + CONSTRUCTION_GLOBAL.PANEL_MARGIN_X * 2 + CONSTRUCTION_GLOBAL.PANEL_HORZ_SPACING + ABS_PATH = nil conky_set_update_interval(CONSTRUCTION_GLOBAL.UPDATE_INTERVAL) @@ -46,7 +55,9 @@ local Network = require 'Network' local Processor = require 'Processor' local FileSystem = require 'FileSystem' local Pacman = require 'Pacman' +local Power = require 'Power' local ReadWrite = require 'ReadWrite' +local Graphics = require 'Graphics' local Memory = require 'Memory' local Weather = require 'Weather' @@ -106,7 +117,7 @@ function conky_main() local cw = conky_window if not cw then return end --~ print(cw.width, cw.height) ###USE THIS TO GET WIDTH AND HEIGHT OF WINDOW - local cs = _CAIRO_XLIB_SURFACE_CREATE(cw.display, cw.drawable, cw.visual, 1377, 778) + local cs = _CAIRO_XLIB_SURFACE_CREATE(cw.display, cw.drawable, cw.visual, 1920, 1080) local cr = _CAIRO_CREATE(cs) updates = updates + 1 @@ -114,7 +125,8 @@ function conky_main() local t1 = updates % (UPDATE_FREQUENCY * 10) local t2 - if using_ac() then + local ac = using_ac() + if ac then t2 = updates % (UPDATE_FREQUENCY * 60) else t2 = updates % (UPDATE_FREQUENCY * 300) @@ -128,16 +140,16 @@ function conky_main() --interface 0 System(cr, current_interface, log_changed) - Network(cr, current_interface, UPDATE_FREQUENCY) + Graphics(cr, current_interface) Processor(cr, current_interface) - FileSystem(cr, current_interface, t1) - Pacman(cr, current_interface, log_changed) - ReadWrite(cr, current_interface, UPDATE_FREQUENCY) - Memory(cr, current_interface) - --interface 1 - --~ USB(cr, current_interface) - --~ Remote(cr, current_interface, t1) + ReadWrite(cr, current_interface, UPDATE_FREQUENCY) + Network(cr, current_interface, UPDATE_FREQUENCY) + + Pacman(cr, current_interface, log_changed) + FileSystem(cr, current_interface, t1) + Power(cr, current_interface, UPDATE_FREQUENCY, ac) + Memory(cr, current_interface) --interface 1 Weather(cr, current_interface, interface_changed) diff --git a/module/FileSystem.lua b/module/FileSystem.lua index d397498..cd2349d 100644 --- a/module/FileSystem.lua +++ b/module/FileSystem.lua @@ -16,21 +16,22 @@ local FS_NUM = #FS_PATHS local FS_REGEX = '^([%d%p]-)(%a+)' --construction params +local MODULE_Y = 165 local SPACING = 20 -local TEXT_WIDTH = 200 -local BAR_PAD = 20 +--~ local TEXT_WIDTH = 220 +local BAR_PAD = 100 local header = Widget.Header{ - x = CONSTRUCTION_GLOBAL.CENTER_X, - y = CONSTRUCTION_GLOBAL.TOP_Y, - width = CONSTRUCTION_GLOBAL.CENTER_WIDTH, - header = "FILE SYSTEMS" + x = CONSTRUCTION_GLOBAL.RIGHT_X, + y = MODULE_Y, + width = CONSTRUCTION_GLOBAL.SECTION_WIDTH, + header = 'FILE SYSTEMS' } local HEADER_BOTTOM_Y = header.bottom_y local labels = Widget.TextColumn{ - x = CONSTRUCTION_GLOBAL.CENTER_X, + x = CONSTRUCTION_GLOBAL.RIGHT_X, y = HEADER_BOTTOM_Y, spacing = SPACING, 'root', @@ -41,33 +42,35 @@ local labels = Widget.TextColumn{ 'lopt' } -local totals = {} +--~ local totals = {} -for i = 1, FS_NUM do - totals[i] = Widget.CriticalText{ - x = CONSTRUCTION_GLOBAL.CENTER_X + TEXT_WIDTH, - y = HEADER_BOTTOM_Y + (i - 1) * SPACING, - x_align = 'right', - text_color = schema.blue, - } -end +--~ for i = 1, FS_NUM do + --~ totals[i] = Widget.CriticalText{ + --~ x = CONSTRUCTION_GLOBAL.RIGHT_X + TEXT_WIDTH, + --~ y = HEADER_BOTTOM_Y + (i - 1) * SPACING, + --~ x_align = 'right', + --~ text_color = schema.blue, + --~ } +--~ end -local units = {} -local conky_used = {} +--~ local units = {} +--~ local conky_used = {} local conky_used_perc = {} for i, v in _PAIRS(FS_PATHS) do - local size, unit = _STRING_MATCH(util.conky('${fs_size '..v..'}'), FS_REGEX) - totals[i].append_end = ' / '..size..' ('..unit..')' - units[i] = unit - conky_used[i] = '${fs_used '..v..'}' + --~ local size, unit = _STRING_MATCH(util.conky('${fs_size '..v..'}'), FS_REGEX) + --~ totals[i].append_end = ' / '..size..' ('..unit..')' + --~ units[i] = unit + --~ conky_used[i] = '${fs_used '..v..'}' conky_used_perc[i] = '${fs_used_perc '..v..'}' end local bars = Widget.CompoundBar{ - x = CONSTRUCTION_GLOBAL.CENTER_X + TEXT_WIDTH + BAR_PAD, + --~ x = CONSTRUCTION_GLOBAL.RIGHT_X + TEXT_WIDTH + BAR_PAD, + x = CONSTRUCTION_GLOBAL.RIGHT_X + BAR_PAD, y = HEADER_BOTTOM_Y, - length = CONSTRUCTION_GLOBAL.CENTER_WIDTH - (TEXT_WIDTH + BAR_PAD), + --~ length = CONSTRUCTION_GLOBAL.SECTION_WIDTH - (TEXT_WIDTH + BAR_PAD), + length = CONSTRUCTION_GLOBAL.SECTION_WIDTH - BAR_PAD, spacing = SPACING, num_bars = FS_NUM, critical_limit = '>0.8' @@ -85,11 +88,11 @@ HEADER_BOTTOM_Y = nil local __update = function(cr) for i = 1, FS_NUM do - local value, unit = _STRING_MATCH(util.conky(conky_used[i]), FS_REGEX) + --~ local value, unit = _STRING_MATCH(util.conky(conky_used[i]), FS_REGEX) local percent = util.conky_numeric(conky_used_perc[i]) - local force = 1 - if percent > 80 then force = 0 end - CriticalText.set(totals[i], cr, util.precision_convert_bytes(value, unit, units[i], 3), force) + --~ local force = 1 + --~ if percent > 80 then force = 0 end + --~ CriticalText.set(totals[i], cr, util.precision_convert_bytes(value, unit, units[i], 3), force) CompoundBar.set(bars, i, percent * 0.01) end end @@ -105,9 +108,9 @@ local draw = function(cr, current_interface, trigger) Text.draw(header.text, cr) Line.draw(header.underline, cr) TextColumn.draw(labels, cr) - for i = 1, FS_NUM do - CriticalText.draw(totals[i], cr) - end + --~ for i = 1, FS_NUM do + --~ CriticalText.draw(totals[i], cr) + --~ end CompoundBar.draw(bars, cr) end end diff --git a/module/Graphics.lua b/module/Graphics.lua new file mode 100644 index 0000000..4810a24 --- /dev/null +++ b/module/Graphics.lua @@ -0,0 +1,328 @@ +local Widget = require 'Widget' +local CriticalText = require 'CriticalText' +local Text = require 'Text' +local TextColumn = require 'TextColumn' +local Line = require 'Line' +local LabelPlot = require 'LabelPlot' +local util = require 'util' +local schema = require 'default_patterns' + +local _TONUMBER = tonumber + +--construction params +local MODULE_Y = 145 +local SEPARATOR_SPACING = 20 +local TEXT_SPACING = 20 +local PLOT_SEC_BREAK = 20 +local PLOT_HEIGHT = 56 + +local header = Widget.Header{ + x = CONSTRUCTION_GLOBAL.LEFT_X, + y = MODULE_Y, + width = CONSTRUCTION_GLOBAL.SECTION_WIDTH, + header = 'NVIDIA GRAPHICS' +} + +local RIGHT_X = CONSTRUCTION_GLOBAL.LEFT_X + CONSTRUCTION_GLOBAL.SECTION_WIDTH + +local status = { + label = Widget.Text{ + x = CONSTRUCTION_GLOBAL.LEFT_X, + y = header.bottom_y, + text = 'Status' + }, + value = Widget.Text{ + x = RIGHT_X, + y = header.bottom_y, + x_align = 'right', + text_color = schema.blue, + text = '' + } +} + +local SEP_Y_1 = header.bottom_y + SEPARATOR_SPACING + +local separator1 = Widget.Line{ + p1 = {x = CONSTRUCTION_GLOBAL.LEFT_X, y = SEP_Y_1}, + p2 = {x = RIGHT_X, y = SEP_Y_1} +} + +local INTERNAL_TEMP_Y = SEP_Y_1 + SEPARATOR_SPACING + +local internal_temp = { + label = Widget.Text{ + x = CONSTRUCTION_GLOBAL.LEFT_X, + y = INTERNAL_TEMP_Y, + text = 'Internal Temperature' + }, + value = Widget.CriticalText{ + x = RIGHT_X, + y = INTERNAL_TEMP_Y, + x_align = 'right', + text_color = schema.blue, + text = '' + } +} + +local PCI_UTIL_Y = INTERNAL_TEMP_Y + TEXT_SPACING + +local pci_util = { + label = Widget.Text{ + x = CONSTRUCTION_GLOBAL.LEFT_X, + y = PCI_UTIL_Y, + text = 'PCI Utilization' + }, + value = Widget.Text{ + x = RIGHT_X, + y = PCI_UTIL_Y, + x_align = 'right', + text_color = schema.blue, + text = '' + } +} + +local SEP_Y_2 = PCI_UTIL_Y + SEPARATOR_SPACING + +local separator2 = Widget.Line{ + p1 = {x = CONSTRUCTION_GLOBAL.LEFT_X, y = SEP_Y_2}, + p2 = {x = RIGHT_X, y = SEP_Y_2} +} + +local CLOCK_SPEED_Y = SEP_Y_2 + SEPARATOR_SPACING + +local clock_speed = { + labels = Widget.TextColumn{ + x = CONSTRUCTION_GLOBAL.LEFT_X, + y = CLOCK_SPEED_Y, + spacing = TEXT_SPACING, + 'GPU Clock Speed', + 'Memory Clock Speed' + }, + values = Widget.TextColumn{ + x = CONSTRUCTION_GLOBAL.LEFT_X + CONSTRUCTION_GLOBAL.SECTION_WIDTH, + y = CLOCK_SPEED_Y, + spacing = TEXT_SPACING, + x_align = 'right', + text_color = schema.blue, + num_rows = 2 + } +} + +local SEP_Y_3 = CLOCK_SPEED_Y + TEXT_SPACING * 2 + +local separator3 = Widget.Line{ + p1 = {x = CONSTRUCTION_GLOBAL.LEFT_X, y = SEP_Y_3}, + p2 = {x = RIGHT_X, y = SEP_Y_3} +} + +local GPU_UTIL_Y = SEP_Y_3 + SEPARATOR_SPACING +local GPU_UTIL_PLOT_Y = GPU_UTIL_Y + PLOT_SEC_BREAK + +local gpu_util = { + label = Widget.Text{ + x = CONSTRUCTION_GLOBAL.LEFT_X, + y = GPU_UTIL_Y, + text = 'GPU Utilization' + }, + value = Widget.Text{ + x = RIGHT_X, + y = GPU_UTIL_Y, + x_align = 'right', + text_color = schema.blue, + text = '' + }, + plot = Widget.LabelPlot{ + x = CONSTRUCTION_GLOBAL.LEFT_X, + y = GPU_UTIL_PLOT_Y, + width = CONSTRUCTION_GLOBAL.SECTION_WIDTH, + height = PLOT_HEIGHT + } +} + +local MEM_UTIL_Y = GPU_UTIL_PLOT_Y + PLOT_HEIGHT + PLOT_SEC_BREAK +local MEM_UTIL_PLOT_Y = MEM_UTIL_Y + PLOT_SEC_BREAK + +local mem_util = { + label = Widget.Text{ + x = CONSTRUCTION_GLOBAL.LEFT_X, + y = MEM_UTIL_Y, + text = 'Memory Utilization' + }, + value = Widget.Text{ + x = RIGHT_X, + y = MEM_UTIL_Y, + x_align = 'right', + text_color = schema.blue, + text = '' + }, + plot = Widget.LabelPlot{ + x = CONSTRUCTION_GLOBAL.LEFT_X, + y = MEM_UTIL_PLOT_Y, + width = CONSTRUCTION_GLOBAL.SECTION_WIDTH, + height = PLOT_HEIGHT + } +} + +local VID_UTIL_Y = MEM_UTIL_PLOT_Y + PLOT_HEIGHT + PLOT_SEC_BREAK +local VID_UTIL_PLOT_Y = VID_UTIL_Y + PLOT_SEC_BREAK + +local vid_util = { + label = Widget.Text{ + x = CONSTRUCTION_GLOBAL.LEFT_X, + y = VID_UTIL_Y, + text = 'Video Utilization' + }, + value = Widget.Text{ + x = RIGHT_X, + y = VID_UTIL_Y, + x_align = 'right', + text_color = schema.blue, + text = '' + }, + plot = Widget.LabelPlot{ + x = CONSTRUCTION_GLOBAL.LEFT_X, + y = VID_UTIL_PLOT_Y, + width = CONSTRUCTION_GLOBAL.SECTION_WIDTH, + height = PLOT_HEIGHT + } +} + +--[[ +vars to process the nv settings glob + +glob will be of the form: + + + + , + graphics=, memory=, video=, PCIe= +--]] +local NV_QUERY = 'optirun nvidia-settings -c :8 -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 __nvidia_off = function(cr) + CriticalText.set(internal_temp.value, cr, 'N/A', 1) + Text.set(pci_util.value, cr, 'N/A') + + TextColumn.set(clock_speed.values, cr, 1, 'N/A') + TextColumn.set(clock_speed.values, cr, 2, 'N/A') + + Text.set(gpu_util.value, cr, 'N/A') + Text.set(mem_util.value, cr, 'N/A') + Text.set(vid_util.value, cr, 'N/A') + + LabelPlot.update(gpu_util.plot, 0) + LabelPlot.update(mem_util.plot, 0) + LabelPlot.update(vid_util.plot, 0) +end + +local __update = function(cr) + if util.read_file('/proc/acpi/bbswitch', '.+%s+(%u+)') == 'ON' then + if string.find(util.execute_cmd('ps -A -o comm'), 'optirun') == nil then + Text.set(status.value, cr, 'Mixed') + __nvidia_off(cr) + else + Text.set(status.value, cr, 'On') + local nvidia_settings_glob = util.execute_cmd(NV_QUERY) + + local used_memory, total_memory, temp_reading, gpu_frequency, + memory_frequency, gpu_utilization, vid_utilization, + pci_utilization = string.match(nvidia_settings_glob, NV_REGEX) + + local force = 1 + if _TONUMBER(temp_reading) > 80 then force = 0 end + + CriticalText.set(internal_temp.value, cr, temp_reading..'°C', force) + Text.set(pci_util.value, cr, pci_utilization..'%') + + TextColumn.set(clock_speed.values, cr, 1, gpu_frequency..' Mhz') + TextColumn.set(clock_speed.values, cr, 2, memory_frequency..' Mhz') + + local percent_used_memory = used_memory / total_memory + + Text.set(gpu_util.value, cr, gpu_utilization..'%') + Text.set(mem_util.value, cr, util.round(percent_used_memory * 100)..'%') + Text.set(vid_util.value, cr, vid_utilization..'%') + + LabelPlot.update(gpu_util.plot, gpu_utilization * 0.01) + LabelPlot.update(mem_util.plot, percent_used_memory) + LabelPlot.update(vid_util.plot, vid_utilization * 0.01) + end + else + Text.set(status.value, cr, 'Off') + __nvidia_off(cr) + end +end + +Widget = nil +schema = nil +MODULE_Y = nil +SEPARATOR_SPACING = nil +TEXT_SPACING = nil +PLOT_SECTION_BREAK = nil +PLOT_HEIGHT = nil +RIGHT_X = nil +SEP_Y_1 = nil +SEP_Y_2 = nil +SEP_Y_3 = nil +INTERNAL_TEMP_Y = nil +PCI_UTIL_Y = nil +CLOCK_SPEED_Y = nil +GPU_UTIL_Y = nil +GPU_UTIL_PLOT_Y = nil +MEM_UTIL_Y = nil +MEM_UTIL_PLOT_Y = nil +VID_UTIL_Y = nil +VID_UTIL_PLOT_Y = nil + +local draw = function(cr, current_interface) + __update(cr) + + if current_interface == 0 then + Text.draw(header.text, cr) + Line.draw(header.underline, cr) + + Text.draw(status.label, cr) + Text.draw(status.value, cr) + + Line.draw(separator1, cr) + + Text.draw(internal_temp.label, cr) + Text.draw(internal_temp.value, cr) + + Text.draw(pci_util.label, cr) + Text.draw(pci_util.value, cr) + + Line.draw(separator2, cr) + + TextColumn.draw(clock_speed.labels, cr) + TextColumn.draw(clock_speed.values, cr) + + Line.draw(separator3, cr) + + Text.draw(gpu_util.label, cr) + Text.draw(gpu_util.value, cr) + LabelPlot.draw(gpu_util.plot, cr) + + Text.draw(mem_util.label, cr) + Text.draw(mem_util.value, cr) + LabelPlot.draw(mem_util.plot, cr) + + Text.draw(vid_util.label, cr) + Text.draw(vid_util.value, cr) + LabelPlot.draw(vid_util.plot, cr) + end +end + +return draw + diff --git a/module/Memory.lua b/module/Memory.lua index 88e6e2c..dd549f5 100644 --- a/module/Memory.lua +++ b/module/Memory.lua @@ -15,7 +15,7 @@ local _MATH_RAD = math.rad local _CAIRO_PATH_DESTROY = cairo_path_destroy -local MODULE_Y = 397 +local MODULE_Y = 712 local MEM_TOTAL = tonumber(util.read_file('/proc/meminfo', 'MemTotal:%s+(%d+)')) --in kB @@ -44,7 +44,7 @@ local TABLE_HEIGHT = 114 local header = Widget.Header{ x = CONSTRUCTION_GLOBAL.RIGHT_X, y = MODULE_Y, - width = CONSTRUCTION_GLOBAL.SIDE_WIDTH, + width = CONSTRUCTION_GLOBAL.SECTION_WIDTH, header = "MEMORY" } @@ -86,7 +86,7 @@ local inner_ring = Widget.Arc{ local LINE_1_Y = HEADER_BOTTOM_Y + TEXT_Y_OFFSET local TEXT_LEFT_X = CONSTRUCTION_GLOBAL.RIGHT_X + DIAL_RADIUS * 2 + TEXT_LEFT_X_OFFSET -local RIGHT_X = CONSTRUCTION_GLOBAL.RIGHT_X + CONSTRUCTION_GLOBAL.SIDE_WIDTH +local RIGHT_X = CONSTRUCTION_GLOBAL.RIGHT_X + CONSTRUCTION_GLOBAL.SECTION_WIDTH local swap= { label = Widget.Text{ @@ -129,7 +129,7 @@ local PLOT_Y = PLOT_SECTION_BREAK + HEADER_BOTTOM_Y + DIAL_RADIUS * 2 local plot = Widget.LabelPlot{ x = CONSTRUCTION_GLOBAL.RIGHT_X, y = PLOT_Y, - width = CONSTRUCTION_GLOBAL.SIDE_WIDTH, + width = CONSTRUCTION_GLOBAL.SECTION_WIDTH, height = PLOT_HEIGHT } @@ -138,7 +138,7 @@ local TABLE_Y = PLOT_Y + PLOT_HEIGHT + TABLE_SECTION_BREAK local tbl = Widget.Table{ x = CONSTRUCTION_GLOBAL.RIGHT_X, y = TABLE_Y, - width = CONSTRUCTION_GLOBAL.SIDE_WIDTH, + width = CONSTRUCTION_GLOBAL.SECTION_WIDTH, height = TABLE_HEIGHT, 'Name', 'PID', diff --git a/module/Network.lua b/module/Network.lua index 629f130..2079456 100644 --- a/module/Network.lua +++ b/module/Network.lua @@ -8,8 +8,6 @@ local schema = require 'default_patterns' local _STRING_GMATCH = string.gmatch local _IO_POPEN = io.popen -local MODULE_Y = 145 - --construction params local PLOT_SEC_BREAK = 20 local PLOT_HEIGHT = 56 @@ -29,18 +27,18 @@ local __network_label_function = function(bytes) end local header = Widget.Header{ - x = CONSTRUCTION_GLOBAL.LEFT_X, - y = MODULE_Y, - width = CONSTRUCTION_GLOBAL.SIDE_WIDTH, + x = CONSTRUCTION_GLOBAL.CENTER_RIGHT_X, + y = CONSTRUCTION_GLOBAL.TOP_Y, + width = CONSTRUCTION_GLOBAL.SECTION_WIDTH, header = "NETWORK" } -local RIGHT_X = CONSTRUCTION_GLOBAL.LEFT_X + CONSTRUCTION_GLOBAL.SIDE_WIDTH +local RIGHT_X = CONSTRUCTION_GLOBAL.CENTER_RIGHT_X + CONSTRUCTION_GLOBAL.SECTION_WIDTH local DOWNLOAD_PLOT_Y = header.bottom_y + PLOT_SEC_BREAK local dnload = { label = Widget.Text{ - x = CONSTRUCTION_GLOBAL.LEFT_X, + x = CONSTRUCTION_GLOBAL.CENTER_RIGHT_X, y = header.bottom_y, text = 'Download', }, @@ -51,9 +49,9 @@ local dnload = { text_color = schema.blue }, plot = Widget.ScalePlot{ - x = CONSTRUCTION_GLOBAL.LEFT_X, + x = CONSTRUCTION_GLOBAL.CENTER_RIGHT_X, y = DOWNLOAD_PLOT_Y, - width = CONSTRUCTION_GLOBAL.SIDE_WIDTH, + width = CONSTRUCTION_GLOBAL.SECTION_WIDTH, height = PLOT_HEIGHT, y_label_func = __network_label_function } @@ -64,7 +62,7 @@ local UPLOAD_PLOT_Y = UPLOAD_Y + PLOT_SEC_BREAK local upload = { label = Widget.Text{ - x = CONSTRUCTION_GLOBAL.LEFT_X, + x = CONSTRUCTION_GLOBAL.CENTER_RIGHT_X, y = UPLOAD_Y, text = 'Upload', }, @@ -75,9 +73,9 @@ local upload = { text_color = schema.blue }, plot = Widget.ScalePlot{ - x = CONSTRUCTION_GLOBAL.LEFT_X, + x = CONSTRUCTION_GLOBAL.CENTER_RIGHT_X, y = UPLOAD_PLOT_Y, - width = CONSTRUCTION_GLOBAL.SIDE_WIDTH, + width = CONSTRUCTION_GLOBAL.SECTION_WIDTH, height = PLOT_HEIGHT, y_label_func = __network_label_function } @@ -149,7 +147,6 @@ end Widget = nil schema = nil -MODULE_Y = nil PLOT_SEC_BREAK = nil PLOT_HEIGHT = nil RIGHT_X = nil diff --git a/module/Pacman.lua b/module/Pacman.lua index 431f02e..219b9ee 100644 --- a/module/Pacman.lua +++ b/module/Pacman.lua @@ -12,7 +12,7 @@ local TEXT_SPACING = 20 local header = Widget.Header{ x = CONSTRUCTION_GLOBAL.RIGHT_X, y = CONSTRUCTION_GLOBAL.TOP_Y, - width = CONSTRUCTION_GLOBAL.SIDE_WIDTH, + width = CONSTRUCTION_GLOBAL.SECTION_WIDTH, header = "PACMAN" } @@ -27,7 +27,7 @@ local labels = Widget.TextColumn{ 'Local' } local info = Widget.TextColumn{ - x = CONSTRUCTION_GLOBAL.RIGHT_X + CONSTRUCTION_GLOBAL.SIDE_WIDTH, + x = CONSTRUCTION_GLOBAL.RIGHT_X + CONSTRUCTION_GLOBAL.SECTION_WIDTH, y = header.bottom_y, spacing = TEXT_SPACING, x_align = 'right', diff --git a/module/Power.lua b/module/Power.lua new file mode 100644 index 0000000..7806b5f --- /dev/null +++ b/module/Power.lua @@ -0,0 +1,210 @@ +local Widget = require 'Widget' +local Text = require 'Text' +local TextColumn = require 'TextColumn' +local Line = require 'Line' +local ScalePlot = require 'ScalePlot' +local util = require 'util' +local schema = require 'default_patterns' + +local _STRING_MATCH = string.match +local _MATH_RAD = math.rad + +--construction params +local MODULE_Y = 328 +local SEPARATOR_SPACING = 20 +local TEXT_SPACING = 20 +local PLOT_SEC_BREAK = 20 +local PLOT_HEIGHT = 56 + +local __power_label_function = function(watts) + return watts..' W' +end + +local __calculate_power = function(cr, prev_cnt, cnt, update_frequency) + return cnt > prev_cnt and (cnt - prev_cnt) * update_frequency * 0.000001 or 0 +end + +local header = Widget.Header{ + x = CONSTRUCTION_GLOBAL.RIGHT_X, + y = MODULE_Y, + width = CONSTRUCTION_GLOBAL.SECTION_WIDTH, + header = 'POWER' +} + +local RIGHT_X = CONSTRUCTION_GLOBAL.RIGHT_X + CONSTRUCTION_GLOBAL.SECTION_WIDTH + +local pp01 = { + labels = Widget.TextColumn{ + x = CONSTRUCTION_GLOBAL.RIGHT_X, + y = header.bottom_y, + spacing = TEXT_SPACING, + 'Core', + 'iGPU' + }, + values = Widget.TextColumn{ + x = RIGHT_X, + y = header.bottom_y, + spacing = TEXT_SPACING, + x_align = 'right', + text_color = schema.blue, + append_end = ' W', + num_rows = 2 + } +} + +local SEP_Y = header.bottom_y + TEXT_SPACING + SEPARATOR_SPACING + +local separator = Widget.Line{ + p1 = {x = CONSTRUCTION_GLOBAL.RIGHT_X, y = SEP_Y}, + p2 = {x = RIGHT_X, y = SEP_Y} +} + +local PKG0_Y = SEP_Y + SEPARATOR_SPACING + +local pkg0 = { + label = Widget.Text{ + x = CONSTRUCTION_GLOBAL.RIGHT_X, + y = PKG0_Y, + text = 'PKG 0' + }, + value = Widget.Text{ + x = RIGHT_X, + y = PKG0_Y, + x_align = 'right', + text_color = schema.blue, + text = '', + append_end = ' W' + }, + plot = Widget.ScalePlot{ + x = CONSTRUCTION_GLOBAL.RIGHT_X, + y = PKG0_Y + PLOT_SEC_BREAK, + width = CONSTRUCTION_GLOBAL.SECTION_WIDTH, + height = PLOT_HEIGHT, + y_label_func = __power_label_function, + } +} + +local DRAM_Y = PKG0_Y + PLOT_SEC_BREAK * 2 + PLOT_HEIGHT + +local dram = { + label = Widget.Text{ + x = CONSTRUCTION_GLOBAL.RIGHT_X, + y = DRAM_Y, + text = 'DRAM' + }, + value = Widget.Text{ + x = RIGHT_X, + y = DRAM_Y, + x_align = 'right', + text_color = schema.blue, + text = '', + append_end = ' W' + }, + plot = Widget.ScalePlot{ + x = CONSTRUCTION_GLOBAL.RIGHT_X, + y = DRAM_Y + PLOT_SEC_BREAK, + width = CONSTRUCTION_GLOBAL.SECTION_WIDTH, + height = PLOT_HEIGHT, + y_label_func = __power_label_function, + } +} + +local BATTERY_DRAW_Y = DRAM_Y + PLOT_SEC_BREAK * 2 + PLOT_HEIGHT + +local battery_draw = { + label = Widget.Text{ + x = CONSTRUCTION_GLOBAL.RIGHT_X, + y = BATTERY_DRAW_Y, + spacing = TEXT_SPACING, + text = 'Battery Draw' + }, + value = Widget.CriticalText{ + x = RIGHT_X, + y = BATTERY_DRAW_Y, + x_align = 'right', + }, + plot = Widget.ScalePlot{ + x = CONSTRUCTION_GLOBAL.RIGHT_X, + y = BATTERY_DRAW_Y + PLOT_SEC_BREAK, + width = CONSTRUCTION_GLOBAL.SECTION_WIDTH, + height = PLOT_HEIGHT, + y_label_func = __power_label_function, + } +} + +local PKG0_PATH = '/sys/class/powercap/intel-rapl:0/energy_uj' +local CORE_PATH = '/sys/class/powercap/intel-rapl:0:0/energy_uj' +local IGPU_PATH = '/sys/class/powercap/intel-rapl:0:1/energy_uj' +local DRAM_PATH = '/sys/class/powercap/intel-rapl:0:2/energy_uj' + +local PKG0_PREV_CNT = util.read_file(PKG0_PATH, nil, '*n') +local CORE_PREV_CNT = util.read_file(CORE_PATH, nil, '*n') +local IGPU_PREV_CNT = util.read_file(IGPU_PATH, nil, '*n') +local DRAM_PREV_CNT = util.read_file(DRAM_PATH, nil, '*n') + +local __update = function(cr, update_frequency, ac_active) + local pkg0_cnt = util.read_file(PKG0_PATH, nil, '*n') + local core_cnt = util.read_file(CORE_PATH, nil, '*n') + local igpu_cnt = util.read_file(IGPU_PATH, nil, '*n') + local dram_cnt = util.read_file(DRAM_PATH, nil, '*n') + + TextColumn.set(pp01.values, cr, 1, util.precision_round_to_string( + __calculate_power(cr, CORE_PREV_CNT, core_cnt, update_frequency), 3)) + + TextColumn.set(pp01.values, cr, 2, util.precision_round_to_string( + __calculate_power(cr, IGPU_PREV_CNT, igpu_cnt, update_frequency), 3)) + + local pkg0_power = __calculate_power(cr, PKG0_PREV_CNT, pkg0_cnt, update_frequency) + local dram_power = __calculate_power(cr, DRAM_PREV_CNT, dram_cnt, update_frequency) + + Text.set(pkg0.value, cr, util.precision_round_to_string(pkg0_power, 3)) + ScalePlot.update(pkg0.plot, cr, pkg0_power) + + Text.set(dram.value, cr, util.precision_round_to_string(dram_power, 3)) + ScalePlot.update(dram.plot, cr, dram_power) + + PKG0_PREV_CNT = pkg0_cnt + CORE_PREV_CNT = core_cnt + IGPU_PREV_CNT = igpu_cnt + DRAM_PREV_CNT = dram_cnt + + if ac_active then + Text.set(battery_draw.value, cr, 'A / C') + ScalePlot.update(battery_draw.plot, cr, 0) + else + local current = util.read_file('/sys/class/power_supply/BAT0/current_now', nil, '*n') + local voltage = util.read_file('/sys/class/power_supply/BAT0/voltage_now', nil, '*n') + local power = current * voltage * 0.000000000001 + + Text.set(battery_draw.value, cr, util.precision_round_to_string(power, 3)..' W') + ScalePlot.update(battery_draw.plot, cr, power) + end +end + +local draw = function(cr, current_interface, update_frequency, ac_active) + __update(cr, update_frequency, ac_active) + + if current_interface == 0 then + Text.draw(header.text, cr) + Line.draw(header.underline, cr) + + TextColumn.draw(pp01.labels, cr) + TextColumn.draw(pp01.values, cr) + + Line.draw(separator, cr) + + Text.draw(pkg0.label, cr) + Text.draw(pkg0.value, cr) + ScalePlot.draw(pkg0.plot, cr) + + Text.draw(dram.label, cr) + Text.draw(dram.value, cr) + ScalePlot.draw(dram.plot, cr) + + Text.draw(battery_draw.label, cr) + Text.draw(battery_draw.value, cr) + ScalePlot.draw(battery_draw.plot, cr) + end +end + +return draw diff --git a/module/Processor.lua b/module/Processor.lua index 87d8d46..26d703d 100644 --- a/module/Processor.lua +++ b/module/Processor.lua @@ -2,7 +2,6 @@ local Widget = require 'Widget' local Arc = require 'Arc' local CompoundDial = require 'CompoundDial' local CriticalText = require 'CriticalText' -local TextColumn = require 'TextColumn' local Text = require 'Text' local Line = require 'Line' local LabelPlot = require 'LabelPlot' @@ -10,146 +9,155 @@ local Table = require 'Table' local util = require 'util' local schema = require 'default_patterns' -local MODULE_Y = 375 +local CORETEMP_PATH = '/sys/devices/platform/coretemp.0/hwmon/hwmon%i/%s' -local CPU_CONKY = { - '${cpu cpu1}', - '${cpu cpu2}', - '${cpu cpu3}', - '${cpu cpu4}', -} +local MODULE_Y = 636 +local NUM_PHYSICAL_CORES = 4 +local NUM_PHYSICAL_CORE_THREADS = 2 + +local NUM_ROWS = 5 local TABLE_CONKY = {{}, {}, {}} -for r = 1, 5 do +for r = 1, NUM_ROWS do TABLE_CONKY[1][r] = '${top name '..r..'}' TABLE_CONKY[2][r] = '${top pid '..r..'}' TABLE_CONKY[3][r] = '${top cpu '..r..'}' end --construction params -local DIAL_INNER_RADIUS = 28 -local DIAL_OUTER_RADIUS = 48 +local DIAL_INNER_RADIUS = 30 +local DIAL_OUTER_RADIUS = 42 local DIAL_SPACING = 1 local TEXT_Y_OFFSET = 15 -local TEXT_LEFT_X_OFFSET = 25 -local TEXT_SPACING = 20 -local SEPARATOR_SPACING = 15 -local PLOT_SECTION_BREAK = 20 +local SEPARATOR_SPACING = 20 +local PLOT_SECTION_BREAK = 23 local PLOT_HEIGHT = 56 local TABLE_SECTION_BREAK = 20 local TABLE_HEIGHT = 114 +local CREATE_CORE = function(cores, id, x, y) + local conky_threads = {} + + for c = 0, NUM_PHYSICAL_CORES * NUM_PHYSICAL_CORE_THREADS - 1 do + if util.read_file('/sys/devices/system/cpu/cpu'..c..'/topology/core_id', nil, '*n') == id then + table.insert(conky_threads, '${cpu cpu'..c..'}') + end + end + + local hwmon_index = -1 + while util.read_file(string.format(CORETEMP_PATH, hwmon_index, 'name'), nil, '*l') ~= 'coretemp' do + hwmon_index = hwmon_index + 1 + end + + cores[id +1] = { + dials = Widget.CompoundDial{ + x = x, + y = y, + inner_radius = DIAL_INNER_RADIUS, + outer_radius = DIAL_OUTER_RADIUS, + spacing = DIAL_SPACING, + num_dials = NUM_PHYSICAL_CORE_THREADS, + critical_limit = '>0.8' + }, + inner_ring = Widget.Arc{ + x = x, + y = y, + radius = DIAL_INNER_RADIUS - 2, + theta0 = 0, + theta1 = 360 + }, + coretemp_text = Widget.CriticalText{ + x = x, + y = y, + x_align = 'center', + y_align = 'center', + append_end = '°C', + critical_limit = '>90' + }, + coretemp_path = string.format(CORETEMP_PATH, hwmon_index, 'temp'..(id + 2)..'_input'), + conky_threads = conky_threads + } +end + local header = Widget.Header{ x = CONSTRUCTION_GLOBAL.LEFT_X, y = MODULE_Y, - width = CONSTRUCTION_GLOBAL.SIDE_WIDTH, + width = CONSTRUCTION_GLOBAL.SECTION_WIDTH, header = "PROCESSOR" } local HEADER_BOTTOM_Y = header.bottom_y -local DIAL_X = CONSTRUCTION_GLOBAL.LEFT_X + DIAL_OUTER_RADIUS -local DIAL_Y = HEADER_BOTTOM_Y + DIAL_OUTER_RADIUS +--we assume that this cpu has 4 physical cores with 2 logical each +local cores = {} -local dials = Widget.CompoundDial{ - x = DIAL_X, - y = DIAL_Y, - inner_radius = DIAL_INNER_RADIUS, - outer_radius = DIAL_OUTER_RADIUS, - spacing = DIAL_SPACING, - num_dials = 4, - critical_limit = '>0.8' -} -local total_load = Widget.CriticalText{ - x = DIAL_X, - y = DIAL_Y, - x_align = 'center', - y_align = 'center', - append_end = '%' -} +for c = 0, NUM_PHYSICAL_CORES - 1 do + local dial_x = CONSTRUCTION_GLOBAL.LEFT_X + DIAL_OUTER_RADIUS + (CONSTRUCTION_GLOBAL.SECTION_WIDTH - 2 * DIAL_OUTER_RADIUS) * c / 3 + CREATE_CORE(cores, c, dial_x, HEADER_BOTTOM_Y + DIAL_OUTER_RADIUS) +end -local inner_ring = Widget.Arc{ - x = DIAL_X, - y = DIAL_Y, - radius = DIAL_INNER_RADIUS - 2, - theta0 = 0, - theta1 = 360 -} +local RIGHT_X = CONSTRUCTION_GLOBAL.LEFT_X + CONSTRUCTION_GLOBAL.SECTION_WIDTH -local LINE_1_Y = HEADER_BOTTOM_Y + TEXT_Y_OFFSET -local TEXT_LEFT_X = CONSTRUCTION_GLOBAL.LEFT_X + dials.width + TEXT_LEFT_X_OFFSET -local RIGHT_X = CONSTRUCTION_GLOBAL.LEFT_X + CONSTRUCTION_GLOBAL.SIDE_WIDTH +local PROCESS_Y = HEADER_BOTTOM_Y + DIAL_OUTER_RADIUS * 2 + PLOT_SECTION_BREAK -local core = { - labels = Widget.TextColumn{ - x = TEXT_LEFT_X, - y = LINE_1_Y, - spacing = TEXT_SPACING, - 'Core 0', - 'Core 1' +local process = { + labels = Widget.Text{ + x = CONSTRUCTION_GLOBAL.LEFT_X, + y = PROCESS_Y, + text = 'R | S | D | T | Z' }, - temp1 = Widget.CriticalText{ - x = RIGHT_X, - y = LINE_1_Y, - x_align = 'right', - append_end = '°C', - critical_limit = '>86' - }, - temp2 = Widget.CriticalText{ + values = Widget.Text{ x = RIGHT_X, - y = LINE_1_Y + TEXT_SPACING, + y = PROCESS_Y, x_align = 'right', - append_end = '°C', - critical_limit = '>86' + text_color = schema.blue, + text = '' } } -local SEP_Y = LINE_1_Y + TEXT_SPACING + SEPARATOR_SPACING +local SEP_Y = PROCESS_Y + SEPARATOR_SPACING local separator = Widget.Line{ - p1 = {x = TEXT_LEFT_X, y = SEP_Y}, + p1 = {x = CONSTRUCTION_GLOBAL.LEFT_X, y = SEP_Y}, p2 = {x = RIGHT_X, y = SEP_Y} } -local PROCESS_Y = SEP_Y + SEPARATOR_SPACING +local LOAD_Y = SEP_Y + SEPARATOR_SPACING -local process = { - labels = Widget.TextColumn{ - x = TEXT_LEFT_X, - y = PROCESS_Y, - spacing = TEXT_SPACING, - 'R / S', - 'D / T / Z' +local total_load = { + label = Widget.Text{ + x = CONSTRUCTION_GLOBAL.LEFT_X, + y = LOAD_Y, + text = 'Total Load' }, - totals = Widget.TextColumn{ - x = RIGHT_X, - y = PROCESS_Y, - spacing = TEXT_SPACING, - x_align = 'right', - text_color = schema.blue, - '', - '' - } + value = Widget.CriticalText{ + x = RIGHT_X, + y = LOAD_Y, + x_align = 'right', + append_end = '%', + critical_limit = '>80' + } } -local PLOT_Y = PLOT_SECTION_BREAK + HEADER_BOTTOM_Y + dials.height +local PLOT_Y = LOAD_Y + PLOT_SECTION_BREAK local plot = Widget.LabelPlot{ x = CONSTRUCTION_GLOBAL.LEFT_X, y = PLOT_Y, - width = CONSTRUCTION_GLOBAL.SIDE_WIDTH, + width = CONSTRUCTION_GLOBAL.SECTION_WIDTH, height = PLOT_HEIGHT } local TABLE_Y = PLOT_Y + PLOT_HEIGHT + TABLE_SECTION_BREAK local tbl = Widget.Table{ - x = CONSTRUCTION_GLOBAL.LEFT_X, - y = TABLE_Y, - width = CONSTRUCTION_GLOBAL.SIDE_WIDTH, - height = TABLE_HEIGHT, + x = CONSTRUCTION_GLOBAL.LEFT_X, + y = TABLE_Y, + width = CONSTRUCTION_GLOBAL.SECTION_WIDTH, + height = TABLE_HEIGHT, + num_rows = NUM_ROWS, 'Name', 'PID', 'CPU (%)' @@ -160,40 +168,36 @@ local __update = function(cr) local char_count = util.char_count local sum = 0 - for i = 1, #CPU_CONKY do - local percent = util.conky_numeric(CPU_CONKY[i]) * 0.01 - CompoundDial.set(dials, i, percent) - sum = sum + percent + for c = 1, NUM_PHYSICAL_CORES do + local core = cores[c] + + local conky_threads = core.conky_threads + for t = 1, NUM_PHYSICAL_CORE_THREADS do + local percent = util.conky_numeric(conky_threads[t]) * 0.01 + CompoundDial.set(core.dials, t, percent) + sum = sum + percent + end + + CriticalText.set(core.coretemp_text, cr, util.round(0.001 * util.read_file(core.coretemp_path, nil, '*n'))) end - local load_percent = util.round(sum * 0.25, 2) - CriticalText.set(total_load, cr, load_percent * 100) - - CriticalText.set(core.temp1, cr, util.round(0.001 * util.read_file( - '/sys/class/thermal/thermal_zone0/temp', nil, '*n'))) - CriticalText.set(core.temp2, cr, util.round(0.001 * util.read_file( - '/sys/class/thermal/thermal_zone1/temp', nil, '*n'))) - local process_glob = util.execute_cmd('ps -A -o s') - local running = char_count(process_glob, 'R') - local uninterrupted_sleep = char_count(process_glob, 'D') - local interrupted_sleep = char_count(process_glob, 'S') - local stopped = char_count(process_glob, 'T') - local zombie = char_count(process_glob, 'Z') + --subtract one from running b/c ps will always be "running" + Text.set(process.values, cr, (char_count(process_glob, 'R') - 1)..' | '.. + char_count(process_glob, 'S')..' | '.. + char_count(process_glob, 'D')..' | '.. + char_count(process_glob, 'T')..' | '.. + char_count(process_glob, 'Z')) - --subtract one b/c ps will always be "running" - running = running - 1 - - local totals = process.totals - TextColumn.set(totals, cr, 1, running..' / '..interrupted_sleep) - TextColumn.set(totals, cr, 2, uninterrupted_sleep..' / '..stopped..' / '..zombie) + local load_percent = util.round(sum / NUM_PHYSICAL_CORES / NUM_PHYSICAL_CORE_THREADS, 2) + CriticalText.set(total_load.value, cr, load_percent * 100) LabelPlot.update(plot, load_percent) for c = 1, 3 do local column = TABLE_CONKY[c] - for r = 1, 5 do + for r = 1, NUM_ROWS do Table.set(tbl, cr, c, r, conky(column[r], '(%S+)')) end end @@ -206,18 +210,14 @@ DIAL_INNER_RADIUS = nil DIAL_OUTER_RADIUS = nil DIAL_SPACING = nil TEXT_Y_OFFSET = nil -TEXT_LEFT_X_OFFSET = nil -TEXT_SPACING = nil SEPARATOR_SPACING = nil PLOT_SECTION_BREAK = nil PLOT_HEIGHT = nil TABLE_SECTION_BREAK = nil TABLE_HEIGHT = nil +CREATE_CORE = nil HEADER_BOTTOM_Y = nil -DIAL_X = nil -DIAL_Y = nil -LINE_1_Y = nil -TEXT_LEFT_X = nil +LOAD_Y = nil RIGHT_X = nil SEP_Y = nil PROCESS_Y = nil @@ -230,18 +230,21 @@ local draw = function(cr, current_interface) if current_interface == 0 then Text.draw(header.text, cr) Line.draw(header.underline, cr) - CompoundDial.draw(dials, cr) - Arc.draw(inner_ring, cr) - CriticalText.draw(total_load, cr) + + for c = 1, NUM_PHYSICAL_CORES do + local core = cores[c] + CompoundDial.draw(core.dials, cr) + Arc.draw(core.inner_ring, cr) + CriticalText.draw(core.coretemp_text, cr) + end - TextColumn.draw(core.labels, cr) - CriticalText.draw(core.temp1, cr) - CriticalText.draw(core.temp2, cr) + Text.draw(process.labels, cr) + Text.draw(process.values, cr) Line.draw(separator, cr) - - TextColumn.draw(process.labels, cr) - TextColumn.draw(process.totals, cr) + + Text.draw(total_load.label, cr) + CriticalText.draw(total_load.value, cr) LabelPlot.draw(plot, cr) diff --git a/module/ReadWrite.lua b/module/ReadWrite.lua index fbe986c..99c271d 100644 --- a/module/ReadWrite.lua +++ b/module/ReadWrite.lua @@ -5,8 +5,6 @@ local ScalePlot = require 'ScalePlot' local util = require 'util' local schema = require 'default_patterns' -local MODULE_Y = 165 - local _TONUMBER = tonumber local _STRING_MATCH = string.match @@ -47,19 +45,19 @@ local __io_label_function = function(bytes) end local header = Widget.Header{ - x = CONSTRUCTION_GLOBAL.RIGHT_X, - y = MODULE_Y, - width = CONSTRUCTION_GLOBAL.SIDE_WIDTH, + x = CONSTRUCTION_GLOBAL.CENTER_LEFT_X, + y = CONSTRUCTION_GLOBAL.TOP_Y, + width = CONSTRUCTION_GLOBAL.SECTION_WIDTH, header = "INPUT / OUTPUT" } local HEADER_BOTTOM_Y = header.bottom_y -local RIGHT_X = CONSTRUCTION_GLOBAL.RIGHT_X + CONSTRUCTION_GLOBAL.SIDE_WIDTH +local RIGHT_X = CONSTRUCTION_GLOBAL.CENTER_LEFT_X + CONSTRUCTION_GLOBAL.SECTION_WIDTH local READS_PLOT_Y = header.bottom_y + PLOT_SEC_BREAK local reads = { label = Widget.Text{ - x = CONSTRUCTION_GLOBAL.RIGHT_X, + x = CONSTRUCTION_GLOBAL.CENTER_LEFT_X, y = HEADER_BOTTOM_Y, text = 'Reads', }, @@ -71,9 +69,9 @@ local reads = { text_color = schema.blue }, plot = Widget.ScalePlot{ - x = CONSTRUCTION_GLOBAL.RIGHT_X, + x = CONSTRUCTION_GLOBAL.CENTER_LEFT_X, y = READS_PLOT_Y, - width = CONSTRUCTION_GLOBAL.SIDE_WIDTH, + width = CONSTRUCTION_GLOBAL.SECTION_WIDTH, height = PLOT_HEIGHT, y_label_func = __io_label_function, } @@ -84,7 +82,7 @@ local WRITES_PLOT_Y = WRITE_Y + PLOT_SEC_BREAK local writes = { label = Widget.Text{ - x = CONSTRUCTION_GLOBAL.RIGHT_X, + x = CONSTRUCTION_GLOBAL.CENTER_LEFT_X, y = WRITE_Y, text = 'Writes', }, @@ -96,9 +94,9 @@ local writes = { text_color = schema.blue }, plot = Widget.ScalePlot{ - x = CONSTRUCTION_GLOBAL.RIGHT_X, + x = CONSTRUCTION_GLOBAL.CENTER_LEFT_X, y = WRITES_PLOT_Y, - width = CONSTRUCTION_GLOBAL.SIDE_WIDTH, + width = CONSTRUCTION_GLOBAL.SECTION_WIDTH, height = PLOT_HEIGHT, y_label_func = __io_label_function, } @@ -106,7 +104,6 @@ local writes = { Widget = nil schema = nil -MODULE_Y = nil PLOT_SEC_BREAK = nil PLOT_HEIGHT = nil HEADER_BOTTOM_Y = nil diff --git a/module/System.lua b/module/System.lua index ea22931..26b1533 100644 --- a/module/System.lua +++ b/module/System.lua @@ -19,7 +19,7 @@ local TEXT_SPACING = 20 local header = Widget.Header{ x = CONSTRUCTION_GLOBAL.LEFT_X, y = CONSTRUCTION_GLOBAL.TOP_Y, - width = CONSTRUCTION_GLOBAL.SIDE_WIDTH, + width = CONSTRUCTION_GLOBAL.SECTION_WIDTH, header = "SYSTEM" } @@ -33,7 +33,7 @@ local labels = Widget.TextColumn{ 'Last Sync' } local info = Widget.TextColumn{ - x = CONSTRUCTION_GLOBAL.LEFT_X + CONSTRUCTION_GLOBAL.SIDE_WIDTH, + x = CONSTRUCTION_GLOBAL.LEFT_X + CONSTRUCTION_GLOBAL.SECTION_WIDTH, y = header.bottom_y, spacing = TEXT_SPACING, x_align = 'right', diff --git a/module/Weather.lua b/module/Weather.lua index 3ee7189..44a4c0c 100644 --- a/module/Weather.lua +++ b/module/Weather.lua @@ -16,21 +16,21 @@ local _OS_EXECUTE = os.execute local TIME_FORMAT = '%-I:%M %p' local DATE_FORMAT = '%A' -local SECTIONS = 6 +local SECTIONS = 8 local WEATHER_UPDATE_INTERVAL = 900 local WEATHER_PATH = '/tmp/weather.json' local ICON_PATH = CONSTRUCTION_GLOBAL.ABS_PATH .. '/images/weather/' local RECENTLY_UPDATED_PATH = '/tmp/weather_recently_updated' -local NA = "N/A" +local NA = 'N/A' local NA_IMAGE_PATH = ICON_PATH .. 'na.png' --construction params local SPACING = 20 local HEADER_PAD = 20 local ICON_PAD = 20 -local ICON_SIDE_LENGTH = 65 -local TEMP_SECTION_WIDTH = 140 +local ICON_SIDE_LENGTH = 75 +local TEMP_SECTION_WIDTH = 220 local SECTION_HEIGHT = HEADER_PAD + ICON_SIDE_LENGTH + 30 local __create_side_section = function(x_offset, y_offset, section_table) @@ -46,17 +46,17 @@ local __create_side_section = function(x_offset, y_offset, section_table) } current_widget.period = Widget.Text{ - x = x_offset + CONSTRUCTION_GLOBAL.SIDE_WIDTH, - y = current_y, - x_align = 'right', - text_color = schema.blue + x = x_offset + CONSTRUCTION_GLOBAL.SECTION_WIDTH, + y = current_y, + x_align = 'right', + text_color = schema.blue } current_widget.icon = Widget.ScaledImage{ - x = x_offset, - y = current_y + HEADER_PAD, - width = ICON_SIDE_LENGTH, - height = ICON_SIDE_LENGTH + x = x_offset, + y = current_y + HEADER_PAD, + width = ICON_SIDE_LENGTH, + height = ICON_SIDE_LENGTH } current_widget.temp1 = Widget.Text{ @@ -64,7 +64,7 @@ local __create_side_section = function(x_offset, y_offset, section_table) y = current_y + HEADER_PAD + 20, x_align = 'center', font_size = 28, - text_color = schema.blue + text_color = schema.blue } current_widget.temp2 = Widget.Text{ @@ -84,7 +84,7 @@ local __create_side_section = function(x_offset, y_offset, section_table) } current_widget.info_column = Widget.TextColumn{ - x = x_offset + CONSTRUCTION_GLOBAL.SIDE_WIDTH, + x = x_offset + CONSTRUCTION_GLOBAL.SECTION_WIDTH, y = current_y + HEADER_PAD + 10, spacing = SPACING, x_align = 'right', @@ -99,7 +99,7 @@ local __create_side_section = function(x_offset, y_offset, section_table) y = current_y + SECTION_HEIGHT - 18 }, p2 = { - x = x_offset + CONSTRUCTION_GLOBAL.SIDE_WIDTH, + x = x_offset + CONSTRUCTION_GLOBAL.SECTION_WIDTH, y = current_y + SECTION_HEIGHT - 18 }, line_pattern = schema.mid_grey @@ -113,8 +113,8 @@ local left = { header = Widget.Header{ x = CONSTRUCTION_GLOBAL.LEFT_X, y = CONSTRUCTION_GLOBAL.TOP_Y, - width = CONSTRUCTION_GLOBAL.SIDE_WIDTH, - header = "HOURLY FORECAST" + width = CONSTRUCTION_GLOBAL.SECTION_WIDTH, + header = 'HOURLY FORECAST' }, hours = {} } @@ -125,96 +125,104 @@ __create_side_section(CONSTRUCTION_GLOBAL.LEFT_X, left.header.bottom_y, left.hou local center = {} center.header = Widget.Header{ - x = CONSTRUCTION_GLOBAL.CENTER_X, + x = CONSTRUCTION_GLOBAL.CENTER_LEFT_X, y = CONSTRUCTION_GLOBAL.TOP_Y, width = CONSTRUCTION_GLOBAL.CENTER_WIDTH, - header = "CURRENT CONDITIONS" + header = 'CURRENT CONDITIONS' } center.current_desc = Widget.Text{ - x = CONSTRUCTION_GLOBAL.CENTER_X, - y = center.header.bottom_y, - text_color = schema.blue + x = CONSTRUCTION_GLOBAL.CENTER_LEFT_X, + y = center.header.bottom_y + 8, + text_color = schema.blue, + font_size = 24 } -local CENTER_SPACING = SPACING + 5 -local INFO_Y = center.header.bottom_y + CENTER_SPACING +local CENTER_X_1 = CONSTRUCTION_GLOBAL.CENTER_LEFT_X + CONSTRUCTION_GLOBAL.SECTION_WIDTH * 0.25 +local CENTER_ICON_WIDTH = 120 +local CENTER_ICON_Y = center.header.bottom_y + 105 - CENTER_ICON_WIDTH / 2 center.icon = Widget.ScaledImage{ - x = CONSTRUCTION_GLOBAL.CENTER_X, - y = INFO_Y, - width = ICON_SIDE_LENGTH, - height = ICON_SIDE_LENGTH + x = CENTER_X_1 - CENTER_ICON_WIDTH / 2, + y = CENTER_ICON_Y, + width = CENTER_ICON_WIDTH, + height = CENTER_ICON_WIDTH } -local TEXT_1_PAD = 80 -local TEXT_1_X = CONSTRUCTION_GLOBAL.CENTER_X + ICON_SIDE_LENGTH + TEXT_1_PAD +local CENTER_X_2 = CONSTRUCTION_GLOBAL.CENTER_LEFT_X + CONSTRUCTION_GLOBAL.SECTION_WIDTH * 0.70 +local INFO_Y = center.header.bottom_y + 70 center.current_temp = Widget.Text{ - x = TEXT_1_X, - y = INFO_Y + 11, + x = CENTER_X_2, + y = INFO_Y, x_align = 'center', - font_size = 32, + font_size = 48, text_color = schema.blue } center.obs_time = Widget.Text{ - x = TEXT_1_X, - y = INFO_Y + 39, - x_align = 'center', - font_size = 11, + x = CENTER_X_2, + y = INFO_Y + 42, + x_align = 'center', + font_size = 12, } center.place = Widget.Text{ - x = TEXT_1_X, - y = INFO_Y + 57, - x_align = 'center', - font_size = 11, + x = CENTER_X_2, + y = INFO_Y + 66, + x_align = 'center', + font_size = 12, } -local COLUMN_WIDTH = 189 -local LABEL_COLUMN_1_X = TEXT_1_X + TEXT_1_PAD +local COLUMN_PADDING = 15 +local CENTER_SPACING = SPACING + 7 center.label_column_1 = Widget.TextColumn{ - x = LABEL_COLUMN_1_X, - y = center.header.bottom_y, - spacing = CENTER_SPACING, + x = CONSTRUCTION_GLOBAL.CENTER_RIGHT_X, + y = center.header.bottom_y, + spacing = CENTER_SPACING, + font_size = 14, 'Feels Like', 'Dewpoint', - 'Sky Coverage', 'Humidity', + 'Sky Coverage', + 'Visibility', + 'Ceiling', 'Precipitation' } center.info_column_1 = Widget.TextColumn{ - x = LABEL_COLUMN_1_X + COLUMN_WIDTH, + x = CONSTRUCTION_GLOBAL.CENTER_RIGHT_X + (CONSTRUCTION_GLOBAL.SECTION_WIDTH - COLUMN_PADDING) / 2, y = center.header.bottom_y, x_align = 'right', text_color = schema.blue, spacing = CENTER_SPACING, - num_rows = 5 + font_size = 14, + num_rows = 7 } -local LABEL_COLUMN_2_X = LABEL_COLUMN_1_X + COLUMN_WIDTH + 20 - center.label_column_2 = Widget.TextColumn{ - x = LABEL_COLUMN_2_X, - y = center.header.bottom_y, + x = CONSTRUCTION_GLOBAL.CENTER_RIGHT_X + (CONSTRUCTION_GLOBAL.SECTION_WIDTH + COLUMN_PADDING) / 2, + y = center.header.bottom_y, spacing = CENTER_SPACING, + font_size = 14, 'WindSpd', + 'WindGust', 'WindDir', 'Pressure', 'Sunrise', - 'Sunset' + 'Sunset', + 'Light Rate' } center.info_column_2 = Widget.TextColumn{ - x = LABEL_COLUMN_2_X + COLUMN_WIDTH, + x = CONSTRUCTION_GLOBAL.CENTER_RIGHT_X + CONSTRUCTION_GLOBAL.SECTION_WIDTH, y = center.header.bottom_y, x_align = 'right', text_color = schema.blue, spacing = CENTER_SPACING, - num_rows = 5 + font_size = 14, + num_rows = 7 } --RIGHT @@ -223,8 +231,8 @@ local right = { header = Widget.Header{ x = CONSTRUCTION_GLOBAL.RIGHT_X, y = CONSTRUCTION_GLOBAL.TOP_Y, - width = CONSTRUCTION_GLOBAL.SIDE_WIDTH, - header = "6 DAY FORECAST" + width = CONSTRUCTION_GLOBAL.SECTION_WIDTH, + header = '8 DAY FORECAST' }, days = {} } @@ -263,8 +271,9 @@ local __populate_section = function(current_section, cr, desc, period, icon_path TextColumn.set(current_section.info_column, cr, 3, wind or NA) end -local __populate_center = function(center_section, cr, desc, icon_path, temp, obs_time, place, feels_like, - dewpoint, coverage, humidity, precip, wind, pressure, visibility, sunrise, sunset) +local __populate_center = function(center_section, cr, desc, icon_path, temp, + obs_time, place, feels_like, dewpoint, humidity, coverage, visibility, ceiling, + precip, wind_spd, wind_gust_spd, wind_dir, pressure, sunrise, sunset, light) if desc then Text.set(center_section.current_desc, cr, Text.trim_to_length(desc, 20)) @@ -282,17 +291,21 @@ local __populate_center = function(center_section, cr, desc, icon_path, temp, ob TextColumn.set(info_column_1, cr, 1, feels_like or NA) TextColumn.set(info_column_1, cr, 2, dewpoint or NA) - TextColumn.set(info_column_1, cr, 3, coverage or NA) - TextColumn.set(info_column_1, cr, 4, humidity or NA) - TextColumn.set(info_column_1, cr, 5, precip or NA) + TextColumn.set(info_column_1, cr, 3, humidity or NA) + TextColumn.set(info_column_1, cr, 4, coverage or NA) + TextColumn.set(info_column_1, cr, 5, visibility or NA) + TextColumn.set(info_column_1, cr, 6, ceiling or NA) + TextColumn.set(info_column_1, cr, 7, precip or NA) local info_column_2 = center_section.info_column_2 - TextColumn.set(info_column_2, cr, 1, wind or NA) - TextColumn.set(info_column_2, cr, 2, pressure or NA) - TextColumn.set(info_column_2, cr, 3, visibility or NA) - TextColumn.set(info_column_2, cr, 4, sunrise or NA) - TextColumn.set(info_column_2, cr, 5, sunset or NA) + TextColumn.set(info_column_2, cr, 1, wind_spd or NA) + TextColumn.set(info_column_2, cr, 2, wind_gust_spd or NA) + TextColumn.set(info_column_2, cr, 3, wind_dir or NA) + TextColumn.set(info_column_2, cr, 4, pressure or NA) + TextColumn.set(info_column_2, cr, 5, sunrise or NA) + TextColumn.set(info_column_2, cr, 6, sunset or NA) + TextColumn.set(info_column_2, cr, 7, light or NA) end local __update_interface = function(cr) @@ -359,14 +372,18 @@ local __update_interface = function(cr) place, ob.feelslikeF and ob.feelslikeF..'°F', ob.dewpointF and ob.dewpointF..'°F', - ob.sky and ob.sky..' %', ob.humidity and ob.humidity..' %', + ob.sky and ob.sky..' %', + ob.visibilityMI and ob.visibilityMI..' mi', + ob.ceilingFT and ob.ceilingFT..' ft', ob.precipIN and ob.precipIN..' in', ob.windSpeedMPH and ob.windSpeedMPH..' mph', + ob.windGustMPH and ob.windGustMPH..' mph', ob.windDirDEG and ob.windDirDEG..' deg', ob.pressureMB and ob.pressureMB..' mbar', ob.sunrise and util.convert_unix_time(ob.sunrise, TIME_FORMAT), - ob.sunset and util.convert_unix_time(ob.sunset, TIME_FORMAT) + ob.sunset and util.convert_unix_time(ob.sunset, TIME_FORMAT), + ob.light and ob.light..' %' ) --RIGHT diff --git a/scripts/get_weather.sh b/scripts/get_weather.sh index 78002ba..6e49e92 100755 --- a/scripts/get_weather.sh +++ b/scripts/get_weather.sh @@ -14,15 +14,19 @@ ob.timestamp,\ ob.tempF,\ ob.dewpointF,\ ob.sky,\ +ob.visibilityMI,\ +ob.ceilingFT,\ ob.humidity,\ ob.pressureMB,\ ob.windSpeedMPH,\ +ob.windGustMPH,\ ob.windDirDEG,\ ob.weather,\ ob.feelslikeF,\ ob.icon,\ ob.sunrise,\ ob.sunset,\ +ob.light,\ ob.precipIN" observations="/observations%3F$o_fields" @@ -37,7 +41,7 @@ periods.windSpeedMPH,\ periods.icon,\ periods.weatherPrimary" -hourly="/forecasts%3Ffilter=4hr%26limit=6%26$h_fields" +hourly="/forecasts%3Ffilter=4hr%26limit=8%26$h_fields" d_fields="fields=\ periods.timestamp,\ @@ -50,7 +54,7 @@ periods.icon,\ periods.windSpeedMPH,\ periods.weatherPrimary" -daily="/forecasts%3Ffrom=tomorrow%26limit=6%26$d_fields" +daily="/forecasts%3Ffrom=tomorrow%26limit=8%26$d_fields" alerts="/alerts"