From e6d6353d059ea7548c429969006fd36c9ccfcd79 Mon Sep 17 00:00:00 2001 From: Mikayla Fischler Date: Mon, 27 May 2024 19:31:24 -0400 Subject: [PATCH] added temperature units to pocket and to common types --- coordinator/configure.lua | 5 +-- coordinator/iocontrol.lua | 15 +++++---- coordinator/startup.lua | 2 +- pocket/configure.lua | 61 ++++++++++++++++++++++++++--------- pocket/iocontrol.lua | 15 +++++---- pocket/pocket.lua | 8 +++-- pocket/startup.lua | 2 +- pocket/ui/pages/unit_page.lua | 4 +-- scada-common/types.lua | 22 +++++++++++++ scada-common/util.lua | 2 +- 10 files changed, 97 insertions(+), 39 deletions(-) diff --git a/coordinator/configure.lua b/coordinator/configure.lua index e763a27..f57f11e 100644 --- a/coordinator/configure.lua +++ b/coordinator/configure.lua @@ -7,6 +7,7 @@ local log = require("scada-common.log") local network = require("scada-common.network") local ppm = require("scada-common.ppm") local tcd = require("scada-common.tcd") +local types = require("scada-common.types") local util = require("scada-common.util") local themes = require("graphics.themes") @@ -756,7 +757,7 @@ local function config_view(display) local clock_fmt = RadioButton{parent=crd_c_1,x=1,y=5,default=util.trinary(ini_cfg.Time24Hour,1,2),options={"24-Hour","12-Hour"},callback=function()end,radio_colors=cpair(colors.lightGray,colors.black),select_color=colors.lime} TextBox{parent=crd_c_1,x=1,y=8,height=1,text="Temperature Scale"} - local temp_scale = RadioButton{parent=crd_c_1,x=1,y=9,default=ini_cfg.TempScale,options={"Kelvin","Celsius","Fahrenheit","Rankine"},callback=function()end,radio_colors=cpair(colors.lightGray,colors.black),select_color=colors.lime} + local temp_scale = RadioButton{parent=crd_c_1,x=1,y=9,default=ini_cfg.TempScale,options=types.TEMP_SCALE_NAMES,callback=function()end,radio_colors=cpair(colors.lightGray,colors.black),select_color=colors.lime} local function submit_ui_opts() tmp_cfg.Time24Hour = clock_fmt.get_value() == 1 @@ -1356,7 +1357,7 @@ local function config_view(display) if f[1] == "AuthKey" then val = string.rep("*", string.len(val)) elseif f[1] == "LogMode" then val = util.trinary(raw == log.MODE.APPEND, "append", "replace") elseif f[1] == "TempScale" then - if raw == 1 then val = "Kelvin" elseif raw == 2 then val = "Celsius" elseif raw == 3 then val = "Fahrenheit" elseif raw == 4 then val = "Rankine" end + val = types.TEMP_SCALE_NAMES[raw] elseif f[1] == "MainTheme" then val = util.strval(themes.ui_theme_name(raw)) elseif f[1] == "FrontPanelTheme" then diff --git a/coordinator/iocontrol.lua b/coordinator/iocontrol.lua index 08fad13..5d8428f 100644 --- a/coordinator/iocontrol.lua +++ b/coordinator/iocontrol.lua @@ -14,6 +14,8 @@ local pgi = require("coordinator.ui.pgi") local ALARM_STATE = types.ALARM_STATE local PROCESS = types.PROCESS +local TEMP_SCALE = types.TEMP_SCALE +local TEMP_UNITS = types.TEMP_SCALE_UNITS -- nominal RTT is ping (0ms to 10ms usually) + 500ms for CRD main loop tick local WARN_RTT = 1000 -- 2x as long as expected w/ 0 ping @@ -47,17 +49,16 @@ end -- initialize the coordinator IO controller ---@param conf facility_conf configuration ---@param comms coord_comms comms reference ----@param temp_scale integer temperature unit (1 = K, 2 = C, 3 = F, 4 = R) +---@param temp_scale TEMP_SCALE temperature unit function iocontrol.init(conf, comms, temp_scale) + io.temp_label = TEMP_UNITS[temp_scale] + -- temperature unit label and conversion function (from Kelvin) - if temp_scale == 2 then - io.temp_label = "\xb0C" + if temp_scale == TEMP_SCALE.CELSIUS then io.temp_convert = function (t) return t - 273.15 end - elseif temp_scale == 3 then - io.temp_label = "\xb0F" + elseif temp_scale == TEMP_SCALE.FAHRENHEIT then io.temp_convert = function (t) return (1.8 * (t - 273.15)) + 32 end - elseif temp_scale == 4 then - io.temp_label = "\xb0R" + elseif temp_scale == TEMP_SCALE.RANKINE then io.temp_convert = function (t) return 1.8 * t end else io.temp_label = "K" diff --git a/coordinator/startup.lua b/coordinator/startup.lua index 0b8a06c..f152bc8 100644 --- a/coordinator/startup.lua +++ b/coordinator/startup.lua @@ -19,7 +19,7 @@ local renderer = require("coordinator.renderer") local sounder = require("coordinator.sounder") local threads = require("coordinator.threads") -local COORDINATOR_VERSION = "v1.4.6" +local COORDINATOR_VERSION = "v1.4.7" local CHUNK_LOAD_DELAY_S = 30.0 diff --git a/pocket/configure.lua b/pocket/configure.lua index 80f91bc..d16309c 100644 --- a/pocket/configure.lua +++ b/pocket/configure.lua @@ -3,7 +3,7 @@ -- local log = require("scada-common.log") -local tcd = require("scada-common.tcd") +local types = require("scada-common.types") local util = require("scada-common.util") local core = require("graphics.core") @@ -32,7 +32,9 @@ local CENTER = core.ALIGN.CENTER local RIGHT = core.ALIGN.RIGHT -- changes to the config data/format to let the user know -local changes = {} +local changes = { + { "v0.9.2", { "Added temperature scale options" } } +} ---@class pkt_configurator local configurator = {} @@ -73,6 +75,7 @@ local tool_ctl = { ---@class pkt_config local tmp_cfg = { + TempScale = 1, SVR_Channel = nil, ---@type integer CRD_Channel = nil, ---@type integer PKT_Channel = nil, ---@type integer @@ -91,6 +94,7 @@ local settings_cfg = {} -- all settings fields, their nice names, and their default values local fields = { + { "TempScale", "Temperature Scale", 1 }, { "SVR_Channel", "SVR Channel", 16240 }, { "CRD_Channel", "CRD Channel", 16243 }, { "PKT_Channel", "PKT Channel", 16244 }, @@ -126,12 +130,13 @@ local function config_view(display) local root_pane_div = Div{parent=display,x=1,y=2} local main_page = Div{parent=root_pane_div,x=1,y=1} + local ui_cfg = Div{parent=root_pane_div,x=1,y=1} local net_cfg = Div{parent=root_pane_div,x=1,y=1} local log_cfg = Div{parent=root_pane_div,x=1,y=1} local summary = Div{parent=root_pane_div,x=1,y=1} local changelog = Div{parent=root_pane_div,x=1,y=1} - local main_pane = MultiPane{parent=root_pane_div,x=1,y=1,panes={main_page,net_cfg,log_cfg,summary,changelog}} + local main_pane = MultiPane{parent=root_pane_div,x=1,y=1,panes={main_page,ui_cfg,net_cfg,log_cfg,summary,changelog}} -- Main Page @@ -148,7 +153,7 @@ local function config_view(display) tool_ctl.viewing_config = true tool_ctl.gen_summary(settings_cfg) tool_ctl.settings_apply.hide(true) - main_pane.set_value(4) + main_pane.set_value(5) end if fs.exists("/pocket/config.lua") then @@ -162,7 +167,28 @@ local function config_view(display) if not tool_ctl.has_config then tool_ctl.view_cfg.disable() end PushButton{parent=main_page,x=2,y=18,min_width=6,text="Exit",callback=exit,fg_bg=cpair(colors.black,colors.red),active_fg_bg=btn_act_fg_bg} - PushButton{parent=main_page,x=14,y=18,min_width=12,text="Change Log",callback=function()main_pane.set_value(5)end,fg_bg=nav_fg_bg,active_fg_bg=btn_act_fg_bg} + PushButton{parent=main_page,x=14,y=18,min_width=12,text="Change Log",callback=function()main_pane.set_value(6)end,fg_bg=nav_fg_bg,active_fg_bg=btn_act_fg_bg} + + --#region Pocket UI + + local ui_c_1 = Div{parent=ui_cfg,x=2,y=4,width=24} + + TextBox{parent=ui_cfg,x=1,y=2,height=1,text=" Pocket UI",fg_bg=cpair(colors.black,colors.lime)} + + TextBox{parent=ui_c_1,x=1,y=1,height=3,text="You may use the options below to customize formats."} + + TextBox{parent=ui_c_1,x=1,y=5,height=1,text="Temperature Scale"} + local temp_scale = RadioButton{parent=ui_c_1,x=1,y=6,default=ini_cfg.TempScale,options=types.TEMP_SCALE_NAMES,callback=function()end,radio_colors=cpair(colors.lightGray,colors.black),select_color=colors.lime} + + local function submit_ui_opts() + tmp_cfg.TempScale = temp_scale.get_value() + main_pane.set_value(3) + end + + PushButton{parent=ui_c_1,x=1,y=15,text="\x1b Back",callback=function()main_pane.set_value(1)end,fg_bg=nav_fg_bg,active_fg_bg=btn_act_fg_bg} + PushButton{parent=ui_c_1,x=19,y=15,text="Next \x1a",callback=submit_ui_opts,fg_bg=nav_fg_bg,active_fg_bg=btn_act_fg_bg} + + --#endregion --#region Network @@ -201,7 +227,7 @@ local function config_view(display) else chan_err.show() end end - PushButton{parent=net_c_1,x=1,y=15,text="\x1b Back",callback=function()main_pane.set_value(1)end,fg_bg=nav_fg_bg,active_fg_bg=btn_act_fg_bg} + PushButton{parent=net_c_1,x=1,y=15,text="\x1b Back",callback=function()main_pane.set_value(2)end,fg_bg=nav_fg_bg,active_fg_bg=btn_act_fg_bg} PushButton{parent=net_c_1,x=19,y=15,text="Next \x1a",callback=submit_channels,fg_bg=nav_fg_bg,active_fg_bg=btn_act_fg_bg} TextBox{parent=net_c_2,x=1,y=1,height=1,text="Set connection timeout."} @@ -268,7 +294,7 @@ local function config_view(display) local v = key.get_value() if string.len(v) == 0 or string.len(v) >= 8 then tmp_cfg.AuthKey = key.get_value() - main_pane.set_value(3) + main_pane.set_value(4) key_err.hide(true) else key_err.show() end end @@ -306,11 +332,11 @@ local function config_view(display) tool_ctl.viewing_config = false tool_ctl.importing_legacy = false tool_ctl.settings_apply.show() - main_pane.set_value(4) + main_pane.set_value(5) else path_err.show() end end - PushButton{parent=log_c_1,x=1,y=15,text="\x1b Back",callback=function()main_pane.set_value(2)end,fg_bg=nav_fg_bg,active_fg_bg=btn_act_fg_bg} + PushButton{parent=log_c_1,x=1,y=15,text="\x1b Back",callback=function()main_pane.set_value(3)end,fg_bg=nav_fg_bg,active_fg_bg=btn_act_fg_bg} PushButton{parent=log_c_1,x=19,y=15,text="Next \x1a",callback=submit_log,fg_bg=nav_fg_bg,active_fg_bg=btn_act_fg_bg} --#endregion @@ -335,7 +361,7 @@ local function config_view(display) tool_ctl.importing_legacy = false tool_ctl.settings_apply.show() else - main_pane.set_value(3) + main_pane.set_value(4) end end @@ -444,7 +470,7 @@ local function config_view(display) tool_ctl.gen_summary(tmp_cfg) sum_pane.set_value(1) - main_pane.set_value(4) + main_pane.set_value(5) tool_ctl.importing_legacy = true end @@ -473,8 +499,13 @@ local function config_view(display) local raw = cfg[f[1]] local val = util.strval(raw) - if f[1] == "AuthKey" then val = string.rep("*", string.len(val)) - elseif f[1] == "LogMode" then val = util.trinary(raw == log.MODE.APPEND, "append", "replace") end + if f[1] == "AuthKey" then + val = string.rep("*", string.len(val)) + elseif f[1] == "LogMode" then + val = util.trinary(raw == log.MODE.APPEND, "append", "replace") + elseif f[1] == "TempScale" then + val = types.TEMP_SCALE_NAMES[raw] + end if val == "nil" then val = "" end @@ -532,9 +563,7 @@ function configurator.configure(ask_config) local event, param1, param2, param3 = util.pull_event() -- handle event - if event == "timer" then - tcd.handle(param1) - elseif event == "mouse_click" or event == "mouse_up" or event == "mouse_drag" or event == "mouse_scroll" or event == "double_click" then + if event == "mouse_click" or event == "mouse_up" or event == "mouse_drag" or event == "mouse_scroll" or event == "double_click" then local m_e = core.events.new_mouse_event(event, param1, param2, param3) if m_e then display.handle_mouse(m_e) end elseif event == "char" or event == "key" or event == "key_up" then diff --git a/pocket/iocontrol.lua b/pocket/iocontrol.lua index 485628f..331a863 100644 --- a/pocket/iocontrol.lua +++ b/pocket/iocontrol.lua @@ -10,6 +10,8 @@ local util = require("scada-common.util") local ALARM = types.ALARM local ALARM_STATE = types.ALARM_STATE +local TEMP_SCALE = types.TEMP_SCALE +local TEMP_UNITS = types.TEMP_SCALE_UNITS ---@todo nominal trip time is ping (0ms to 10ms usually) local WARN_TT = 40 @@ -268,17 +270,16 @@ end -- initialize facility-dependent components of pocket iocontrol ---@param conf facility_conf configuration ----@param temp_scale 1|2|3|4 temperature unit (1 = K, 2 = C, 3 = F, 4 = R) +---@param temp_scale TEMP_SCALE temperature unit function iocontrol.init_fac(conf, temp_scale) + io.temp_label = TEMP_UNITS[temp_scale] + -- temperature unit label and conversion function (from Kelvin) - if temp_scale == 2 then - io.temp_label = "\xb0C" + if temp_scale == TEMP_SCALE.CELSIUS then io.temp_convert = function (t) return t - 273.15 end - elseif temp_scale == 3 then - io.temp_label = "\xb0F" + elseif temp_scale == TEMP_SCALE.FAHRENHEIT then io.temp_convert = function (t) return (1.8 * (t - 273.15)) + 32 end - elseif temp_scale == 4 then - io.temp_label = "\xb0R" + elseif temp_scale == TEMP_SCALE.RANKINE then io.temp_convert = function (t) return 1.8 * t end else io.temp_label = "K" diff --git a/pocket/pocket.lua b/pocket/pocket.lua index f330ab2..88aafb3 100644 --- a/pocket/pocket.lua +++ b/pocket/pocket.lua @@ -23,6 +23,8 @@ pocket.config = config function pocket.load_config() if not settings.load("/pocket.settings") then return false end + config.TempScale = settings.get("TempScale") + config.SVR_Channel = settings.get("SVR_Channel") config.CRD_Channel = settings.get("CRD_Channel") config.PKT_Channel = settings.get("PKT_Channel") @@ -36,6 +38,9 @@ function pocket.load_config() local cfv = util.new_validator() + cfv.assert_type_int(config.TempScale) + cfv.assert_range(config.TempScale, 1, 4) + cfv.assert_channel(config.SVR_Channel) cfv.assert_channel(config.CRD_Channel) cfv.assert_channel(config.PKT_Channel) @@ -371,8 +376,7 @@ function pocket.comms(version, nic, sv_watchdog, api_watchdog) -- get configuration local conf = { num_units = fac_config[1], cooling = fac_config[2] } - ---@todo unit options - iocontrol.init_fac(conf, 1) + iocontrol.init_fac(conf, config.TempScale) log.info("coordinator connection established") self.establish_delay_counter = 0 diff --git a/pocket/startup.lua b/pocket/startup.lua index 8ba8d3e..c9f8c8d 100644 --- a/pocket/startup.lua +++ b/pocket/startup.lua @@ -18,7 +18,7 @@ local iocontrol = require("pocket.iocontrol") local pocket = require("pocket.pocket") local renderer = require("pocket.renderer") -local POCKET_VERSION = "v0.9.1-alpha" +local POCKET_VERSION = "v0.9.2-alpha" local println = util.println local println_ts = util.println_ts diff --git a/pocket/ui/pages/unit_page.lua b/pocket/ui/pages/unit_page.lua index f6ad149..222d18a 100644 --- a/pocket/ui/pages/unit_page.lua +++ b/pocket/ui/pages/unit_page.lua @@ -155,12 +155,12 @@ local function new_view(root) local text_fg = cpair(colors.white, colors._INHERIT) local rate = DataIndicator{parent=u_div,y=5,lu_colors=lu_col,label="Rate",unit="mB/t",format="%10.2f",value=0,commas=true,width=26,fg_bg=text_fg} - local temp = DataIndicator{parent=u_div,lu_colors=lu_col,label="Temp",unit="K",format="%10.2f",value=0,commas=true,width=26,fg_bg=text_fg} + local temp = DataIndicator{parent=u_div,lu_colors=lu_col,label="Temp",unit=db.temp_label,format="%10.2f",value=0,commas=true,width=26,fg_bg=text_fg} local ctrl = IconIndicator{parent=u_div,x=1,y=8,label="Control State",states=mode_states} rate.register(u_ps, "act_burn_rate", rate.update) - temp.register(u_ps, "temp", temp.update) + temp.register(u_ps, "temp", function (t) temp.update(db.temp_convert(t)) end) ctrl.register(u_ps, "U_ControlStatus", ctrl.update) u_div.line_break() diff --git a/scada-common/types.lua b/scada-common/types.lua index d6fc7af..aeeca16 100644 --- a/scada-common/types.lua +++ b/scada-common/types.lua @@ -74,6 +74,28 @@ function types.new_zero_coordinate() return { x = 0, y = 0, z = 0 } end -- ENUMERATION TYPES -- --#region +---@enum TEMP_SCALE +types.TEMP_SCALE = { + KELVIN = 1, + CELSIUS = 2, + FAHRENHEIT = 3, + RANKINE = 4 +} + +types.TEMP_SCALE_NAMES = { + "Kelvin", + "Celsius", + "Fahrenheit", + "Rankine" +} + +types.TEMP_SCALE_UNITS = { + "K", + "\xb0C", + "\xb0F", + "\xb0R" +} + ---@enum PANEL_LINK_STATE types.PANEL_LINK_STATE = { LINKED = 1, diff --git a/scada-common/util.lua b/scada-common/util.lua index 0fe636d..d29a85e 100644 --- a/scada-common/util.lua +++ b/scada-common/util.lua @@ -22,7 +22,7 @@ local t_pack = table.pack local util = {} -- scada-common version -util.version = "1.3.0" +util.version = "1.3.1" util.TICK_TIME_S = 0.05 util.TICK_TIME_MS = 50