From 628a50e1bd10ce61b0a7c6e5cab74ef434b80572 Mon Sep 17 00:00:00 2001 From: Mikayla Fischler Date: Sat, 24 Feb 2024 14:35:04 -0500 Subject: [PATCH 01/44] #405 WIP themes and completed main display theme implementation --- coordinator/renderer.lua | 10 +- coordinator/ui/components/boiler.lua | 14 +-- coordinator/ui/components/imatrix.lua | 38 +++---- coordinator/ui/components/process_ctl.lua | 78 +++++++------- coordinator/ui/components/reactor.lua | 20 ++-- coordinator/ui/components/turbine.lua | 10 +- coordinator/ui/components/unit_detail.lua | 2 +- coordinator/ui/components/unit_overview.lua | 8 +- coordinator/ui/layout/flow_view.lua | 4 +- coordinator/ui/layout/main_view.lua | 11 +- coordinator/ui/style.lua | 108 ++++++++++++++++---- graphics/core.lua | 5 +- graphics/element.lua | 19 +++- 13 files changed, 209 insertions(+), 118 deletions(-) diff --git a/coordinator/renderer.lua b/coordinator/renderer.lua index a1826e4..4b8085d 100644 --- a/coordinator/renderer.lua +++ b/coordinator/renderer.lua @@ -47,8 +47,8 @@ local function _init_display(monitor) monitor.setCursorPos(1, 1) -- set overridden colors - for i = 1, #style.colors do - monitor.setPaletteColor(style.colors[i].c, style.colors[i].hex) + for i = 1, #style.theme.colors do + monitor.setPaletteColor(style.theme.colors[i].c, style.theme.colors[i].hex) end end @@ -142,9 +142,9 @@ function renderer.close_fp() engine.fp_ready = false -- restore colors - for i = 1, #style.colors do - local r, g, b = term.nativePaletteColor(style.colors[i].c) - term.setPaletteColor(style.colors[i].c, r, g, b) + for i = 1, #style.theme.colors do + local r, g, b = term.nativePaletteColor(style.theme.colors[i].c) + term.setPaletteColor(style.theme.colors[i].c, r, g, b) end -- reset terminal diff --git a/coordinator/ui/components/boiler.lua b/coordinator/ui/components/boiler.lua index ce2f1bc..e29b188 100644 --- a/coordinator/ui/components/boiler.lua +++ b/coordinator/ui/components/boiler.lua @@ -14,7 +14,7 @@ local VerticalBar = require("graphics.elements.indicators.vbar") local cpair = core.cpair local border = core.border -local text_fg_bg = style.text_colors +local text_fg = style.theme.text_fg local lu_col = style.lu_colors -- new boiler view @@ -28,17 +28,17 @@ local function new_view(root, x, y, ps) local boiler = Rectangle{parent=root,border=border(1,colors.gray,true),width=31,height=7,x=x,y=y} local status = StateIndicator{parent=boiler,x=9,y=1,states=style.boiler.states,value=1,min_width=12} - local temp = DataIndicator{parent=boiler,x=5,y=3,lu_colors=lu_col,label="Temp:",unit=db.temp_label,format="%10.2f",value=0,commas=true,width=22,fg_bg=text_fg_bg} - local boil_r = DataIndicator{parent=boiler,x=5,y=4,lu_colors=lu_col,label="Boil:",unit="mB/t",format="%10.0f",value=0,commas=true,width=22,fg_bg=text_fg_bg} + local temp = DataIndicator{parent=boiler,x=5,y=3,lu_colors=lu_col,label="Temp:",unit=db.temp_label,format="%10.2f",value=0,commas=true,width=22,fg_bg=text_fg} + local boil_r = DataIndicator{parent=boiler,x=5,y=4,lu_colors=lu_col,label="Boil:",unit="mB/t",format="%10.0f",value=0,commas=true,width=22,fg_bg=text_fg} status.register(ps, "computed_status", status.update) temp.register(ps, "temperature", function (t) temp.update(db.temp_convert(t)) end) boil_r.register(ps, "boil_rate", boil_r.update) - TextBox{parent=boiler,text="H",x=2,y=5,height=1,width=1,fg_bg=text_fg_bg} - TextBox{parent=boiler,text="W",x=3,y=5,height=1,width=1,fg_bg=text_fg_bg} - TextBox{parent=boiler,text="S",x=27,y=5,height=1,width=1,fg_bg=text_fg_bg} - TextBox{parent=boiler,text="C",x=28,y=5,height=1,width=1,fg_bg=text_fg_bg} + TextBox{parent=boiler,text="H",x=2,y=5,height=1,width=1,fg_bg=text_fg} + TextBox{parent=boiler,text="W",x=3,y=5,height=1,width=1,fg_bg=text_fg} + TextBox{parent=boiler,text="S",x=27,y=5,height=1,width=1,fg_bg=text_fg} + TextBox{parent=boiler,text="C",x=28,y=5,height=1,width=1,fg_bg=text_fg} local hcool = VerticalBar{parent=boiler,x=2,y=1,fg_bg=cpair(colors.orange,colors.gray),height=4,width=1} local water = VerticalBar{parent=boiler,x=3,y=1,fg_bg=cpair(colors.blue,colors.gray),height=4,width=1} diff --git a/coordinator/ui/components/imatrix.lua b/coordinator/ui/components/imatrix.lua index fc2e038..6d8fc38 100644 --- a/coordinator/ui/components/imatrix.lua +++ b/coordinator/ui/components/imatrix.lua @@ -18,7 +18,7 @@ local border = core.border local ALIGN = core.ALIGN -local text_fg_bg = style.text_colors +local text_fg = style.theme.text_fg local lu_col = style.lu_colors -- new induction matrix view @@ -34,22 +34,22 @@ local function new_view(root, x, y, data, ps, id) local matrix = Div{parent=root,fg_bg=style.root,width=33,height=24,x=x,y=y} - TextBox{parent=matrix,text=" ",width=33,height=1,x=1,y=1,fg_bg=style.lg_gray} - TextBox{parent=matrix,text=title,alignment=ALIGN.CENTER,width=33,height=1,x=1,y=2,fg_bg=style.lg_gray} + local cutout_fg_bg = cpair(style.theme.bg, colors.gray) + + TextBox{parent=matrix,text=" ",width=33,height=1,x=1,y=1,fg_bg=cutout_fg_bg} + TextBox{parent=matrix,text=title,alignment=ALIGN.CENTER,width=33,height=1,x=1,y=2,fg_bg=cutout_fg_bg} local rect = Rectangle{parent=matrix,border=border(1,colors.gray,true),width=33,height=22,x=1,y=3} - local label_fg_bg = cpair(colors.gray, colors.lightGray) - local status = StateIndicator{parent=rect,x=10,y=1,states=style.imatrix.states,value=1,min_width=14} - local energy = PowerIndicator{parent=rect,x=7,y=3,lu_colors=lu_col,label="Energy: ",format="%8.2f",value=0,width=26,fg_bg=text_fg_bg} - local capacity = PowerIndicator{parent=rect,x=7,y=4,lu_colors=lu_col,label="Capacity:",format="%8.2f",value=0,width=26,fg_bg=text_fg_bg} - local input = PowerIndicator{parent=rect,x=7,y=5,lu_colors=lu_col,label="Input: ",format="%8.2f",rate=true,value=0,width=26,fg_bg=text_fg_bg} - local output = PowerIndicator{parent=rect,x=7,y=6,lu_colors=lu_col,label="Output: ",format="%8.2f",rate=true,value=0,width=26,fg_bg=text_fg_bg} + local energy = PowerIndicator{parent=rect,x=7,y=3,lu_colors=lu_col,label="Energy: ",format="%8.2f",value=0,width=26,fg_bg=text_fg} + local capacity = PowerIndicator{parent=rect,x=7,y=4,lu_colors=lu_col,label="Capacity:",format="%8.2f",value=0,width=26,fg_bg=text_fg} + local input = PowerIndicator{parent=rect,x=7,y=5,lu_colors=lu_col,label="Input: ",format="%8.2f",rate=true,value=0,width=26,fg_bg=text_fg} + local output = PowerIndicator{parent=rect,x=7,y=6,lu_colors=lu_col,label="Output: ",format="%8.2f",rate=true,value=0,width=26,fg_bg=text_fg} - local avg_chg = PowerIndicator{parent=rect,x=7,y=8,lu_colors=lu_col,label="Avg. Chg:",format="%8.2f",value=0,width=26,fg_bg=text_fg_bg} - local avg_in = PowerIndicator{parent=rect,x=7,y=9,lu_colors=lu_col,label="Avg. In: ",format="%8.2f",rate=true,value=0,width=26,fg_bg=text_fg_bg} - local avg_out = PowerIndicator{parent=rect,x=7,y=10,lu_colors=lu_col,label="Avg. Out:",format="%8.2f",rate=true,value=0,width=26,fg_bg=text_fg_bg} + local avg_chg = PowerIndicator{parent=rect,x=7,y=8,lu_colors=lu_col,label="Avg. Chg:",format="%8.2f",value=0,width=26,fg_bg=text_fg} + local avg_in = PowerIndicator{parent=rect,x=7,y=9,lu_colors=lu_col,label="Avg. In: ",format="%8.2f",rate=true,value=0,width=26,fg_bg=text_fg} + local avg_out = PowerIndicator{parent=rect,x=7,y=10,lu_colors=lu_col,label="Avg. Out:",format="%8.2f",rate=true,value=0,width=26,fg_bg=text_fg} status.register(ps, "computed_status", status.update) energy.register(ps, "energy", function (val) energy.update(util.joules_to_fe(val)) end) @@ -61,13 +61,13 @@ local function new_view(root, x, y, data, ps, id) avg_in.register(ps, "avg_inflow", avg_in.update) avg_out.register(ps, "avg_outflow", avg_out.update) - local fill = DataIndicator{parent=rect,x=11,y=12,lu_colors=lu_col,label="Fill:",unit="%",format="%8.2f",value=0,width=18,fg_bg=text_fg_bg} + local fill = DataIndicator{parent=rect,x=11,y=12,lu_colors=lu_col,label="Fill:",unit="%",format="%8.2f",value=0,width=18,fg_bg=text_fg} - local cells = DataIndicator{parent=rect,x=11,y=14,lu_colors=lu_col,label="Cells: ",format="%7d",value=0,width=18,fg_bg=text_fg_bg} - local providers = DataIndicator{parent=rect,x=11,y=15,lu_colors=lu_col,label="Providers:",format="%7d",value=0,width=18,fg_bg=text_fg_bg} + local cells = DataIndicator{parent=rect,x=11,y=14,lu_colors=lu_col,label="Cells: ",format="%7d",value=0,width=18,fg_bg=text_fg} + local providers = DataIndicator{parent=rect,x=11,y=15,lu_colors=lu_col,label="Providers:",format="%7d",value=0,width=18,fg_bg=text_fg} - TextBox{parent=rect,text="Transfer Capacity",x=11,y=17,height=1,width=17,fg_bg=label_fg_bg} - local trans_cap = PowerIndicator{parent=rect,x=19,y=18,lu_colors=lu_col,label="",format="%5.2f",rate=true,value=0,width=12,fg_bg=text_fg_bg} + TextBox{parent=rect,text="Transfer Capacity",x=11,y=17,height=1,width=17,fg_bg=style.theme.label_fg} + local trans_cap = PowerIndicator{parent=rect,x=19,y=18,lu_colors=lu_col,label="",format="%5.2f",rate=true,value=0,width=12,fg_bg=text_fg} cells.register(ps, "cells", cells.update) providers.register(ps, "providers", providers.update) @@ -78,8 +78,8 @@ local function new_view(root, x, y, data, ps, id) local in_cap = VerticalBar{parent=rect,x=7,y=12,fg_bg=cpair(colors.red,colors.gray),height=7,width=1} local out_cap = VerticalBar{parent=rect,x=9,y=12,fg_bg=cpair(colors.blue,colors.gray),height=7,width=1} - TextBox{parent=rect,text="FILL",x=2,y=20,height=1,width=4,fg_bg=text_fg_bg} - TextBox{parent=rect,text="I/O",x=7,y=20,height=1,width=3,fg_bg=text_fg_bg} + TextBox{parent=rect,text="FILL",x=2,y=20,height=1,width=4,fg_bg=text_fg} + TextBox{parent=rect,text="I/O",x=7,y=20,height=1,width=3,fg_bg=text_fg} local function calc_saturation(val) if (type(data.build) == "table") and (type(data.build.transfer_cap) == "number") and (data.build.transfer_cap > 0) then diff --git a/coordinator/ui/components/process_ctl.lua b/coordinator/ui/components/process_ctl.lua index efc6eb1..6cef85e 100644 --- a/coordinator/ui/components/process_ctl.lua +++ b/coordinator/ui/components/process_ctl.lua @@ -33,7 +33,9 @@ local lu_cpair = style.lu_colors local hzd_fg_bg = style.hzd_fg_bg local dis_colors = style.dis_colors -local gry_wht = style.gray_white +local s_hi_box = style.theme.highlight_box +local s_field = style.theme.field_box +local arrow_col = cpair(style.theme.label, s_hi_box.bkg) local ind_grn = style.ind_grn local ind_yel = style.ind_yel @@ -103,11 +105,11 @@ local function new_view(root, x, y) gen_fault.register(facility.ps, "as_gen_fault", gen_fault.update) TextBox{parent=main,y=23,text="Radiation",height=1,width=13,fg_bg=style.label} - local radiation = RadIndicator{parent=main,label="",format="%9.3f",lu_colors=lu_cpair,width=13,fg_bg=bw_fg_bg} + local radiation = RadIndicator{parent=main,label="",format="%9.3f",lu_colors=lu_cpair,width=13,fg_bg=s_field} radiation.register(facility.ps, "radiation", radiation.update) TextBox{parent=main,x=15,y=23,text="Linked RTUs",height=1,width=11,fg_bg=style.label} - local rtu_count = DataIndicator{parent=main,x=15,y=24,label="",format="%11d",value=0,lu_colors=lu_cpair,width=11,fg_bg=bw_fg_bg} + local rtu_count = DataIndicator{parent=main,x=15,y=24,label="",format="%11d",value=0,lu_colors=lu_cpair,width=11,fg_bg=s_field} rtu_count.register(facility.ps, "rtu_count", rtu_count.update) --------------------- @@ -125,9 +127,9 @@ local function new_view(root, x, y) local burn_tag = Div{parent=targets,x=1,y=1,width=8,height=4,fg_bg=blk_pur} TextBox{parent=burn_tag,x=2,y=2,text="Burn Target",width=7,height=2} - local burn_target = Div{parent=targets,x=9,y=1,width=23,height=3,fg_bg=gry_wht} - local b_target = SpinboxNumeric{parent=burn_target,x=11,y=1,whole_num_precision=4,fractional_precision=1,min=0.1,arrow_fg_bg=gry_wht,fg_bg=bw_fg_bg} - TextBox{parent=burn_target,x=18,y=2,text="mB/t"} + local burn_target = Div{parent=targets,x=9,y=1,width=23,height=3,fg_bg=s_hi_box} + local b_target = SpinboxNumeric{parent=burn_target,x=11,y=1,whole_num_precision=4,fractional_precision=1,min=0.1,arrow_fg_bg=arrow_col,arrow_disable=style.theme.disabled} + TextBox{parent=burn_target,x=18,y=2,text="mB/t",fg_bg=style.theme.label_fg} local burn_sum = DataIndicator{parent=targets,x=9,y=4,label="",format="%18.1f",value=0,unit="mB/t",commas=true,lu_colors=black,width=23,fg_bg=blk_brn} b_target.register(facility.ps, "process_burn_target", b_target.set_value) @@ -136,9 +138,9 @@ local function new_view(root, x, y) local chg_tag = Div{parent=targets,x=1,y=6,width=8,height=4,fg_bg=blk_pur} TextBox{parent=chg_tag,x=2,y=2,text="Charge Target",width=7,height=2} - local chg_target = Div{parent=targets,x=9,y=6,width=23,height=3,fg_bg=gry_wht} - local c_target = SpinboxNumeric{parent=chg_target,x=2,y=1,whole_num_precision=15,fractional_precision=0,min=0,arrow_fg_bg=gry_wht,fg_bg=bw_fg_bg} - TextBox{parent=chg_target,x=18,y=2,text="MFE"} + local chg_target = Div{parent=targets,x=9,y=6,width=23,height=3,fg_bg=s_hi_box} + local c_target = SpinboxNumeric{parent=chg_target,x=2,y=1,whole_num_precision=15,fractional_precision=0,min=0,arrow_fg_bg=arrow_col,arrow_disable=style.theme.disabled} + TextBox{parent=chg_target,x=18,y=2,text="MFE",fg_bg=style.theme.label_fg} local cur_charge = DataIndicator{parent=targets,x=9,y=9,label="",format="%19d",value=0,unit="MFE",commas=true,lu_colors=black,width=23,fg_bg=blk_brn} c_target.register(facility.ps, "process_charge_target", c_target.set_value) @@ -147,9 +149,9 @@ local function new_view(root, x, y) local gen_tag = Div{parent=targets,x=1,y=11,width=8,height=4,fg_bg=blk_pur} TextBox{parent=gen_tag,x=2,y=2,text="Gen. Target",width=7,height=2} - local gen_target = Div{parent=targets,x=9,y=11,width=23,height=3,fg_bg=gry_wht} - local g_target = SpinboxNumeric{parent=gen_target,x=8,y=1,whole_num_precision=9,fractional_precision=0,min=0,arrow_fg_bg=gry_wht,fg_bg=bw_fg_bg} - TextBox{parent=gen_target,x=18,y=2,text="kFE/t"} + local gen_target = Div{parent=targets,x=9,y=11,width=23,height=3,fg_bg=s_hi_box} + local g_target = SpinboxNumeric{parent=gen_target,x=8,y=1,whole_num_precision=9,fractional_precision=0,min=0,arrow_fg_bg=arrow_col,arrow_disable=style.theme.disabled} + TextBox{parent=gen_target,x=18,y=2,text="kFE/t",fg_bg=style.theme.label_fg} local cur_gen = DataIndicator{parent=targets,x=9,y=14,label="",format="%17d",value=0,unit="kFE/t",commas=true,lu_colors=black,width=23,fg_bg=blk_brn} g_target.register(facility.ps, "process_gen_target", g_target.set_value) @@ -165,17 +167,17 @@ local function new_view(root, x, y) for i = 1, 4 do local unit - local tag_fg_bg = gry_wht - local lim_fg_bg = style.lg_white - local ctl_fg = colors.lightGray - local cur_fg_bg = style.lg_white - local cur_lu = colors.lightGray + local tag_fg_bg = cpair(style.theme.disabled, s_hi_box.bkg) + local lim_fg_bg = cpair(style.theme.disabled, s_hi_box.bkg) + local label_fg = style.theme.disabled_fg + local cur_fg_bg = cpair(style.theme.disabled, s_hi_box.bkg) + local cur_lu = style.theme.disabled if i <= facility.num_units then unit = units[i] ---@type ioctl_unit - tag_fg_bg = cpair(colors.black,colors.lightBlue) - lim_fg_bg = bw_fg_bg - ctl_fg = colors.gray + tag_fg_bg = cpair(colors.black, colors.lightBlue) + lim_fg_bg = s_hi_box + label_fg = style.theme.label_fg cur_fg_bg = blk_brn cur_lu = colors.black end @@ -185,9 +187,9 @@ local function new_view(root, x, y) local unit_tag = Div{parent=limit_div,x=1,y=_y,width=8,height=4,fg_bg=tag_fg_bg} TextBox{parent=unit_tag,x=2,y=2,text="Unit "..i.." Limit",width=7,height=2} - local lim_ctl = Div{parent=limit_div,x=9,y=_y,width=14,height=3,fg_bg=cpair(ctl_fg,colors.white)} - local lim = SpinboxNumeric{parent=lim_ctl,x=2,y=1,whole_num_precision=4,fractional_precision=1,min=0.1,arrow_fg_bg=gry_wht,fg_bg=lim_fg_bg} - TextBox{parent=lim_ctl,x=9,y=2,text="mB/t",width=4,height=1} + local lim_ctl = Div{parent=limit_div,x=9,y=_y,width=14,height=3,fg_bg=s_hi_box} + local lim = SpinboxNumeric{parent=lim_ctl,x=2,y=1,whole_num_precision=4,fractional_precision=1,min=0.1,arrow_fg_bg=arrow_col,arrow_disable=style.theme.disabled,fg_bg=lim_fg_bg} + TextBox{parent=lim_ctl,x=9,y=2,text="mB/t",width=4,height=1,fg_bg=label_fg} local cur_burn = DataIndicator{parent=limit_div,x=9,y=_y+3,label="",format="%7.1f",value=0,unit="mB/t",commas=false,lu_colors=cpair(cur_lu,cur_lu),width=14,fg_bg=cur_fg_bg} @@ -209,14 +211,14 @@ local function new_view(root, x, y) local stat_div = Div{parent=proc,width=22,height=24,x=57,y=6} for i = 1, 4 do - local tag_fg_bg = gry_wht - local ind_fg_bg = style.lg_white - local ind_off = colors.lightGray + local tag_fg_bg = cpair(style.theme.disabled, s_hi_box.bkg) + local ind_fg_bg = cpair(style.theme.disabled, s_hi_box.bkg) + local ind_off = style.theme.disabled if i <= facility.num_units then tag_fg_bg = cpair(colors.black, colors.cyan) - ind_fg_bg = bw_fg_bg - ind_off = colors.gray + ind_fg_bg = cpair(style.theme.text, s_hi_box.bkg) + ind_off = style.theme.label end local _y = ((i - 1) * 5) + 1 @@ -241,18 +243,18 @@ local function new_view(root, x, y) ------------------------- local ctl_opts = { "Monitored Max Burn", "Combined Burn Rate", "Charge Level", "Generation Rate" } - local mode = RadioButton{parent=proc,x=34,y=1,options=ctl_opts,callback=function()end,radio_colors=cpair(colors.gray,colors.white),select_color=colors.purple} + local mode = RadioButton{parent=proc,x=34,y=1,options=ctl_opts,callback=function()end,radio_colors=cpair(style.theme.accent_dark,style.theme.accent_light),select_color=colors.purple} mode.register(facility.ps, "process_mode", mode.set_value) local u_stat = Rectangle{parent=proc,border=border(1,colors.gray,true),thin=true,width=31,height=4,x=1,y=16,fg_bg=bw_fg_bg} local stat_line_1 = TextBox{parent=u_stat,x=1,y=1,text="UNKNOWN",width=31,height=1,alignment=ALIGN.CENTER,fg_bg=bw_fg_bg} - local stat_line_2 = TextBox{parent=u_stat,x=1,y=2,text="awaiting data...",width=31,height=1,alignment=ALIGN.CENTER,fg_bg=gry_wht} + local stat_line_2 = TextBox{parent=u_stat,x=1,y=2,text="awaiting data...",width=31,height=1,alignment=ALIGN.CENTER,fg_bg=cpair(colors.gray,colors.white)} stat_line_1.register(facility.ps, "status_line_1", stat_line_1.set_value) stat_line_2.register(facility.ps, "status_line_2", stat_line_2.set_value) - local auto_controls = Div{parent=proc,x=1,y=20,width=31,height=5,fg_bg=gry_wht} + local auto_controls = Div{parent=proc,x=1,y=20,width=31,height=5,fg_bg=s_hi_box} -- save the automatic process control configuration without starting local function _save_cfg() @@ -327,15 +329,17 @@ local function new_view(root, x, y) local waste_sel = Div{parent=proc,width=21,height=24,x=81,y=1} - TextBox{parent=waste_sel,text=" ",width=21,height=1,x=1,y=1,fg_bg=blk_brn} - TextBox{parent=waste_sel,text="WASTE PRODUCTION",alignment=ALIGN.CENTER,width=21,height=1,x=1,y=2,fg_bg=cpair(colors.lightGray,colors.brown)} + local cutout_fg_bg = cpair(style.theme.bg, colors.brown) + + TextBox{parent=waste_sel,text=" ",width=21,height=1,x=1,y=1,fg_bg=cutout_fg_bg} + TextBox{parent=waste_sel,text="WASTE PRODUCTION",alignment=ALIGN.CENTER,width=21,height=1,x=1,y=2,fg_bg=cutout_fg_bg} local rect = Rectangle{parent=waste_sel,border=border(1,colors.brown,true),width=21,height=22,x=1,y=3} local status = StateIndicator{parent=rect,x=2,y=1,states=style.waste.states,value=1,min_width=17} status.register(facility.ps, "current_waste_product", status.update) - local waste_prod = RadioButton{parent=rect,x=2,y=3,options=style.waste.options,callback=process.set_process_waste,radio_colors=cpair(colors.gray,colors.white),select_color=colors.brown} + local waste_prod = RadioButton{parent=rect,x=2,y=3,options=style.waste.options,callback=process.set_process_waste,radio_colors=cpair(style.theme.accent_dark,style.theme.accent_light),select_color=colors.brown} local pu_fallback = Checkbox{parent=rect,x=2,y=7,label="Pu Fallback",callback=process.set_pu_fallback,box_fg_bg=cpair(colors.green,colors.black)} waste_prod.register(facility.ps, "process_waste_product", waste_prod.set_value) @@ -346,13 +350,13 @@ local function new_view(root, x, y) fb_active.register(facility.ps, "pu_fallback_active", fb_active.update) TextBox{parent=rect,x=2,y=11,text="Plutonium Rate",height=1,width=17,fg_bg=style.label} - local pu_rate = DataIndicator{parent=rect,x=2,label="",unit="mB/t",format="%12.2f",value=0,lu_colors=lu_cpair,fg_bg=bw_fg_bg,width=17} + local pu_rate = DataIndicator{parent=rect,x=2,label="",unit="mB/t",format="%12.2f",value=0,lu_colors=lu_cpair,fg_bg=s_field,width=17} TextBox{parent=rect,x=2,y=14,text="Polonium Rate",height=1,width=17,fg_bg=style.label} - local po_rate = DataIndicator{parent=rect,x=2,label="",unit="mB/t",format="%12.2f",value=0,lu_colors=lu_cpair,fg_bg=bw_fg_bg,width=17} + local po_rate = DataIndicator{parent=rect,x=2,label="",unit="mB/t",format="%12.2f",value=0,lu_colors=lu_cpair,fg_bg=s_field,width=17} TextBox{parent=rect,x=2,y=17,text="Antimatter Rate",height=1,width=17,fg_bg=style.label} - local am_rate = DataIndicator{parent=rect,x=2,label="",unit="\xb5B/t",format="%12d",value=0,lu_colors=lu_cpair,fg_bg=bw_fg_bg,width=17} + local am_rate = DataIndicator{parent=rect,x=2,label="",unit="\xb5B/t",format="%12d",value=0,lu_colors=lu_cpair,fg_bg=s_field,width=17} pu_rate.register(facility.ps, "pu_rate", pu_rate.update) po_rate.register(facility.ps, "po_rate", po_rate.update) diff --git a/coordinator/ui/components/reactor.lua b/coordinator/ui/components/reactor.lua index 27b033e..3e2026c 100644 --- a/coordinator/ui/components/reactor.lua +++ b/coordinator/ui/components/reactor.lua @@ -16,7 +16,7 @@ local StateIndicator = require("graphics.elements.indicators.state") local cpair = core.cpair local border = core.border -local text_fg_bg = style.text_colors +local text_fg = style.theme.text_fg local lu_col = style.lu_colors -- create new reactor view @@ -27,12 +27,12 @@ local lu_col = style.lu_colors local function new_view(root, x, y, ps) local db = iocontrol.get_db() - local reactor = Rectangle{parent=root,border=border(1, colors.gray, true),width=30,height=7,x=x,y=y} + local reactor = Rectangle{parent=root,border=border(1,colors.gray,true),width=30,height=7,x=x,y=y} local status = StateIndicator{parent=reactor,x=6,y=1,states=style.reactor.states,value=1,min_width=16} - local core_temp = DataIndicator{parent=reactor,x=2,y=3,lu_colors=lu_col,label="Core Temp:",unit=db.temp_label,format="%10.2f",value=0,commas=true,width=26,fg_bg=text_fg_bg} - local burn_r = DataIndicator{parent=reactor,x=2,y=4,lu_colors=lu_col,label="Burn Rate:",unit="mB/t",format="%10.2f",value=0,width=26,fg_bg=text_fg_bg} - local heating_r = DataIndicator{parent=reactor,x=2,y=5,lu_colors=lu_col,label="Heating:",unit="mB/t",format="%12.0f",value=0,commas=true,width=26,fg_bg=text_fg_bg} + local core_temp = DataIndicator{parent=reactor,x=2,y=3,lu_colors=lu_col,label="Core Temp:",unit=db.temp_label,format="%10.2f",value=0,commas=true,width=26,fg_bg=text_fg} + local burn_r = DataIndicator{parent=reactor,x=2,y=4,lu_colors=lu_col,label="Burn Rate:",unit="mB/t",format="%10.2f",value=0,width=26,fg_bg=text_fg} + local heating_r = DataIndicator{parent=reactor,x=2,y=5,lu_colors=lu_col,label="Heating:",unit="mB/t",format="%12.0f",value=0,commas=true,width=26,fg_bg=text_fg} status.register(ps, "computed_status", status.update) core_temp.register(ps, "temp", function (t) core_temp.update(db.temp_convert(t)) end) @@ -41,12 +41,12 @@ local function new_view(root, x, y, ps) local reactor_fills = Rectangle{parent=root,border=border(1, colors.gray, true),width=24,height=7,x=(x + 29),y=y} - TextBox{parent=reactor_fills,text="FUEL",x=2,y=1,height=1,fg_bg=text_fg_bg} - TextBox{parent=reactor_fills,text="COOL",x=2,y=2,height=1,fg_bg=text_fg_bg} - TextBox{parent=reactor_fills,text="HCOOL",x=2,y=4,height=1,fg_bg=text_fg_bg} - TextBox{parent=reactor_fills,text="WASTE",x=2,y=5,height=1,fg_bg=text_fg_bg} + TextBox{parent=reactor_fills,text="FUEL",x=2,y=1,height=1,fg_bg=text_fg} + TextBox{parent=reactor_fills,text="COOL",x=2,y=2,height=1,fg_bg=text_fg} + TextBox{parent=reactor_fills,text="HCOOL",x=2,y=4,height=1,fg_bg=text_fg} + TextBox{parent=reactor_fills,text="WASTE",x=2,y=5,height=1,fg_bg=text_fg} - local fuel = HorizontalBar{parent=reactor_fills,x=8,y=1,show_percent=true,bar_fg_bg=cpair(colors.black,colors.gray),height=1,width=14} + local fuel = HorizontalBar{parent=reactor_fills,x=8,y=1,show_percent=true,bar_fg_bg=cpair(style.theme.fuel_color,colors.gray),height=1,width=14} local ccool = HorizontalBar{parent=reactor_fills,x=8,y=2,show_percent=true,bar_fg_bg=cpair(colors.blue,colors.gray),height=1,width=14} local hcool = HorizontalBar{parent=reactor_fills,x=8,y=4,show_percent=true,bar_fg_bg=cpair(colors.white,colors.gray),height=1,width=14} local waste = HorizontalBar{parent=reactor_fills,x=8,y=5,show_percent=true,bar_fg_bg=cpair(colors.brown,colors.gray),height=1,width=14} diff --git a/coordinator/ui/components/turbine.lua b/coordinator/ui/components/turbine.lua index d8b2e17..236dbbb 100644 --- a/coordinator/ui/components/turbine.lua +++ b/coordinator/ui/components/turbine.lua @@ -15,7 +15,7 @@ local VerticalBar = require("graphics.elements.indicators.vbar") local cpair = core.cpair local border = core.border -local text_fg_bg = style.text_colors +local text_fg = style.theme.text_fg local lu_col = style.lu_colors -- new turbine view @@ -27,8 +27,8 @@ local function new_view(root, x, y, ps) local turbine = Rectangle{parent=root,border=border(1,colors.gray,true),width=23,height=7,x=x,y=y} local status = StateIndicator{parent=turbine,x=7,y=1,states=style.turbine.states,value=1,min_width=12} - local prod_rate = PowerIndicator{parent=turbine,x=5,y=3,lu_colors=lu_col,label="",format="%10.2f",value=0,rate=true,width=16,fg_bg=text_fg_bg} - local flow_rate = DataIndicator{parent=turbine,x=5,y=4,lu_colors=lu_col,label="",unit="mB/t",format="%10.0f",value=0,commas=true,width=16,fg_bg=text_fg_bg} + local prod_rate = PowerIndicator{parent=turbine,x=5,y=3,lu_colors=lu_col,label="",format="%10.2f",value=0,rate=true,width=16,fg_bg=text_fg} + local flow_rate = DataIndicator{parent=turbine,x=5,y=4,lu_colors=lu_col,label="",unit="mB/t",format="%10.0f",value=0,commas=true,width=16,fg_bg=text_fg} status.register(ps, "computed_status", status.update) prod_rate.register(ps, "prod_rate", function (val) prod_rate.update(util.joules_to_fe(val)) end) @@ -37,8 +37,8 @@ local function new_view(root, x, y, ps) local steam = VerticalBar{parent=turbine,x=2,y=1,fg_bg=cpair(colors.white,colors.gray),height=4,width=1} local energy = VerticalBar{parent=turbine,x=3,y=1,fg_bg=cpair(colors.green,colors.gray),height=4,width=1} - TextBox{parent=turbine,text="S",x=2,y=5,height=1,width=1,fg_bg=text_fg_bg} - TextBox{parent=turbine,text="E",x=3,y=5,height=1,width=1,fg_bg=text_fg_bg} + TextBox{parent=turbine,text="S",x=2,y=5,height=1,width=1,fg_bg=text_fg} + TextBox{parent=turbine,text="E",x=3,y=5,height=1,width=1,fg_bg=text_fg} steam.register(ps, "steam_fill", steam.update) energy.register(ps, "energy_fill", energy.update) diff --git a/coordinator/ui/components/unit_detail.lua b/coordinator/ui/components/unit_detail.lua index 64fc1e0..dbacf85 100644 --- a/coordinator/ui/components/unit_detail.lua +++ b/coordinator/ui/components/unit_detail.lua @@ -64,7 +64,7 @@ local function init(parent, id) local b_ps = unit.boiler_ps_tbl local t_ps = unit.turbine_ps_tbl - TextBox{parent=main,text="Reactor Unit #" .. id,alignment=ALIGN.CENTER,height=1,fg_bg=style.header} + TextBox{parent=main,text="Reactor Unit #" .. id,alignment=ALIGN.CENTER,height=1,fg_bg=style.theme.header} ----------------------------- -- main stats and core map -- diff --git a/coordinator/ui/components/unit_overview.lua b/coordinator/ui/components/unit_overview.lua index 17702e5..80e99e9 100644 --- a/coordinator/ui/components/unit_overview.lua +++ b/coordinator/ui/components/unit_overview.lua @@ -44,7 +44,7 @@ local function make(parent, x, y, unit) local root = Div{parent=parent,x=x,y=y,width=80,height=height} -- unit header message - TextBox{parent=root,text="Unit #"..unit.unit_id,alignment=ALIGN.CENTER,height=1,fg_bg=style.header} + TextBox{parent=root,text="Unit #"..unit.unit_id,alignment=ALIGN.CENTER,height=1,fg_bg=style.theme.header} ------------- -- REACTOR -- @@ -66,7 +66,7 @@ local function make(parent, x, y, unit) table.insert(coolant_pipes, pipe(2, 0, 11, 11, colors.orange)) end - PipeNetwork{parent=root,x=4,y=10,pipes=coolant_pipes,bg=colors.lightGray} + PipeNetwork{parent=root,x=4,y=10,pipes=coolant_pipes,bg=style.theme.bg} end ------------- @@ -164,10 +164,10 @@ local function make(parent, x, y, unit) table.insert(steam_pipes_b, pipe(0, 18, 2, 18, colors.blue, false, true)) -- water boiler 2 to turbine 2 junction end - PipeNetwork{parent=root,x=47,y=11,pipes=steam_pipes_a,bg=colors.lightGray} + PipeNetwork{parent=root,x=47,y=11,pipes=steam_pipes_a,bg=style.theme.bg} end - PipeNetwork{parent=root,x=54,y=3,pipes=steam_pipes_b,bg=colors.lightGray} + PipeNetwork{parent=root,x=54,y=3,pipes=steam_pipes_b,bg=style.theme.bg} return root end diff --git a/coordinator/ui/layout/flow_view.lua b/coordinator/ui/layout/flow_view.lua index f19dda2..c14a057 100644 --- a/coordinator/ui/layout/flow_view.lua +++ b/coordinator/ui/layout/flow_view.lua @@ -46,9 +46,9 @@ local function init(main) local tank_list = facility.tank_list -- window header message - local header = TextBox{parent=main,y=1,text="Facility Coolant and Waste Flow Monitor",alignment=ALIGN.CENTER,height=1,fg_bg=style.header} + local header = TextBox{parent=main,y=1,text="Facility Coolant and Waste Flow Monitor",alignment=ALIGN.CENTER,height=1,fg_bg=style.theme.header} -- max length example: "01:23:45 AM - Wednesday, September 28 2022" - local datetime = TextBox{parent=main,x=(header.get_width()-42),y=1,text="",alignment=ALIGN.RIGHT,width=42,height=1,fg_bg=style.header} + local datetime = TextBox{parent=main,x=(header.get_width()-42),y=1,text="",alignment=ALIGN.RIGHT,width=42,height=1,fg_bg=style.theme.header} datetime.register(facility.ps, "date_time", datetime.set_value) diff --git a/coordinator/ui/layout/main_view.lua b/coordinator/ui/layout/main_view.lua index 64742c7..08254a0 100644 --- a/coordinator/ui/layout/main_view.lua +++ b/coordinator/ui/layout/main_view.lua @@ -12,12 +12,15 @@ local unit_overview = require("coordinator.ui.components.unit_overview") local core = require("graphics.core") +local ColorMap = require("graphics.elements.colormap") local TextBox = require("graphics.elements.textbox") local DataIndicator = require("graphics.elements.indicators.data") local ALIGN = core.ALIGN +local s_header = style.theme.header + -- create new main view ---@param main graphics_element main displaybox local function init(main) @@ -25,10 +28,10 @@ local function init(main) local units = iocontrol.get_db().units -- window header message - local header = TextBox{parent=main,y=1,text="Nuclear Generation Facility SCADA Coordinator",alignment=ALIGN.CENTER,height=1,fg_bg=style.header} - local ping = DataIndicator{parent=main,x=1,y=1,label="SVTT",format="%d",value=0,unit="ms",lu_colors=style.lg_white,width=12,fg_bg=style.header} + local header = TextBox{parent=main,y=1,text="Nuclear Generation Facility SCADA Coordinator",alignment=ALIGN.CENTER,height=1,fg_bg=s_header} + local ping = DataIndicator{parent=main,x=1,y=1,label="SVTT",format="%d",value=0,unit="ms",lu_colors=style.lg_white,width=12,fg_bg=s_header} -- max length example: "01:23:45 AM - Wednesday, September 28 2022" - local datetime = TextBox{parent=main,x=(header.get_width()-42),y=1,text="",alignment=ALIGN.RIGHT,width=42,height=1,fg_bg=style.header} + local datetime = TextBox{parent=main,x=(header.get_width()-42),y=1,text="",alignment=ALIGN.RIGHT,width=42,height=1,fg_bg=s_header} ping.register(facility.ps, "sv_ping", ping.update) datetime.register(facility.ps, "date_time", datetime.set_value) @@ -66,6 +69,8 @@ local function init(main) -- command & control + ColorMap{parent=main,y=cnc_y_start+2} + cnc_y_start = cnc_y_start -- induction matrix and process control interfaces are 24 tall + space needed for divider diff --git a/coordinator/ui/style.lua b/coordinator/ui/style.lua index d9549a5..a3228c5 100644 --- a/coordinator/ui/style.lua +++ b/coordinator/ui/style.lua @@ -4,6 +4,7 @@ local core = require("graphics.core") +---@class crd_style local style = {} local cpair = core.cpair @@ -45,36 +46,101 @@ style.fp.colors = { -- main GUI styling -style.root = cpair(colors.black, colors.lightGray) -style.header = cpair(colors.white, colors.gray) -style.label = cpair(colors.gray, colors.lightGray) +---@class theme +local deepslate = { + text = colors.white, + text_inv = colors.black, + label = colors.lightGray, + disabled = colors.gray, + bg = colors.black, + accent_light = colors.gray, + accent_dark = colors.lightGray, -style.colors = { - { c = colors.red, hex = 0xdf4949 }, - { c = colors.orange, hex = 0xffb659 }, - { c = colors.yellow, hex = 0xfffc79 }, - { c = colors.lime, hex = 0x80ff80 }, - { c = colors.green, hex = 0x4aee8a }, - { c = colors.cyan, hex = 0x34bac8 }, - { c = colors.lightBlue, hex = 0x6cc0f2 }, - { c = colors.blue, hex = 0x0096ff }, - { c = colors.purple, hex = 0xb156ee }, - { c = colors.pink, hex = 0xf26ba2 }, - { c = colors.magenta, hex = 0xf9488a }, - -- { c = colors.white, hex = 0xf0f0f0 }, - { c = colors.lightGray, hex = 0xcacaca }, - { c = colors.gray, hex = 0x575757 }, - -- { c = colors.black, hex = 0x191919 }, - -- { c = colors.brown, hex = 0x7f664c } + fuel_color = colors.lightGray, + + header = cpair(colors.white, colors.gray), + + text_fg = cpair(colors.white, colors._INHERIT), + label_fg = cpair(colors.lightGray, colors._INHERIT), + disabled_fg = cpair(colors.gray, colors._INHERIT), + + highlight_box = cpair(colors.white, colors.gray), + field_box = cpair(colors.white, colors.gray), + + colors = { + { c = colors.red, hex = 0xeb6a6c }, + { c = colors.orange, hex = 0xf2b564 }, + { c = colors.yellow, hex = 0xd9cf81 }, + { c = colors.lime, hex = 0x80ff80 }, + { c = colors.green, hex = 0x5fe492 }, + { c = colors.cyan, hex = 0x6fdbdf }, + { c = colors.lightBlue, hex = 0x75beea }, + { c = colors.blue, hex = 0x4db4ff }, + { c = colors.purple, hex = 0xc38aea }, + { c = colors.pink, hex = 0xf26ba2 }, + { c = colors.magenta, hex = 0xf9488a }, + { c = colors.white, hex = 0xd9d9d9 }, + { c = colors.lightGray, hex = 0x949494 }, + { c = colors.gray, hex = 0x575757 }, + { c = colors.black, hex = 0x262626 }, + { c = colors.brown, hex = 0xb18f6a } + } } +---@type theme +local smooth_stone = { + text = colors.black, + text_inv = colors.white, + label = colors.gray, + disabled = colors.lightGray, + bg = colors.lightGray, + accent_light = colors.white, + accent_dark = colors.gray, + + fuel_color = colors.black, + + header = cpair(colors.white, colors.gray), + + text_fg = cpair(colors.black, colors._INHERIT), + label_fg = cpair(colors.gray, colors._INHERIT), + disabled_fg = cpair(colors.lightGray, colors._INHERIT), + + highlight_box = cpair(colors.black, colors.white), + field_box = cpair(colors.black, colors.white), + + colors = { + { c = colors.red, hex = 0xdf4949 }, + { c = colors.orange, hex = 0xffb659 }, + { c = colors.yellow, hex = 0xfffc79 }, + { c = colors.lime, hex = 0x80ff80 }, + { c = colors.green, hex = 0x4aee8a }, + { c = colors.cyan, hex = 0x34bac8 }, + { c = colors.lightBlue, hex = 0x6cc0f2 }, + { c = colors.blue, hex = 0x0096ff }, + { c = colors.purple, hex = 0xb156ee }, + { c = colors.pink, hex = 0xf26ba2 }, + { c = colors.magenta, hex = 0xf9488a }, + { c = colors.white, hex = 0xf0f0f0 }, + { c = colors.lightGray, hex = 0xcacaca }, + { c = colors.gray, hex = 0x575757 }, + { c = colors.black, hex = 0x191919 }, + { c = colors.brown, hex = 0x7f664c } + } +} + +style.theme = deepslate +-- style.theme = smooth_stone + +style.root = cpair(style.theme.text, style.theme.bg) +style.label = cpair(style.theme.label, style.theme.bg) + -- COMMON COLOR PAIRS -- style.wh_gray = cpair(colors.white, colors.gray) style.bw_fg_bg = cpair(colors.black, colors.white) style.text_colors = cpair(colors.black, colors.lightGray) -style.lu_colors = cpair(colors.gray, colors.gray) +style.lu_colors = cpair(style.theme.label, style.theme.label) style.hzd_fg_bg = style.wh_gray style.dis_colors = cpair(colors.white, colors.lightGray) diff --git a/graphics/core.lua b/graphics/core.lua index 3e53b83..d601bb3 100644 --- a/graphics/core.lua +++ b/graphics/core.lua @@ -7,7 +7,7 @@ local flasher = require("graphics.flasher") local core = {} -core.version = "2.1.1" +core.version = "2.2.0" core.flasher = flasher core.events = events @@ -61,6 +61,9 @@ end ---@field blit_fgd string ---@field blit_bkg string +-- add inherited flag, 3 isn't a pure color so it wouldn't be used +colors._INHERIT = 3 + -- create a new color pair definition ---@nodiscard ---@param a color diff --git a/graphics/element.lua b/graphics/element.lua index 939efd6..5b6d70d 100644 --- a/graphics/element.lua +++ b/graphics/element.lua @@ -234,11 +234,24 @@ function element.new(args, child_offset_x, child_offset_y) -- init colors if args.fg_bg ~= nil then - protected.fg_bg = args.fg_bg - elseif args.parent ~= nil then - protected.fg_bg = args.parent.get_fg_bg() + protected.fg_bg = core.cpair(args.fg_bg.fgd, args.fg_bg.bkg) end + if args.parent ~= nil then + local p_fg_bg = args.parent.get_fg_bg() + + if args.fg_bg == nil then + protected.fg_bg = core.cpair(p_fg_bg.fgd, p_fg_bg.bkg) + else + if protected.fg_bg.fgd == colors._INHERIT then protected.fg_bg = core.cpair(p_fg_bg.fgd, protected.fg_bg.bkg) end + if protected.fg_bg.bkg == colors._INHERIT then protected.fg_bg = core.cpair(protected.fg_bg.fgd, p_fg_bg.bkg) end + end + end + + -- check colors + element.assert(protected.fg_bg.fgd ~= colors._INHERIT, "could not determine foreground color to inherit") + element.assert(protected.fg_bg.bkg ~= colors._INHERIT, "could not determine background color to inherit") + -- set colors protected.window.setBackgroundColor(protected.fg_bg.bkg) protected.window.setTextColor(protected.fg_bg.fgd) From 51f2bba4d17d89d1c894f0a7231a90e470a0dfc7 Mon Sep 17 00:00:00 2001 From: Mikayla Fischler Date: Sat, 24 Feb 2024 15:37:39 -0500 Subject: [PATCH 02/44] #405 theme implementation for unit displays --- coordinator/ui/components/process_ctl.lua | 17 +++--- coordinator/ui/components/unit_detail.lua | 72 ++++++++++++----------- coordinator/ui/style.lua | 12 +++- 3 files changed, 58 insertions(+), 43 deletions(-) diff --git a/coordinator/ui/components/process_ctl.lua b/coordinator/ui/components/process_ctl.lua index 6cef85e..572be85 100644 --- a/coordinator/ui/components/process_ctl.lua +++ b/coordinator/ui/components/process_ctl.lua @@ -28,14 +28,15 @@ local ALIGN = core.ALIGN local cpair = core.cpair local border = core.border -local bw_fg_bg = style.bw_fg_bg +local s_hi_box = style.theme.highlight_box +local s_field = style.theme.field_box + local lu_cpair = style.lu_colors local hzd_fg_bg = style.hzd_fg_bg local dis_colors = style.dis_colors +local arrow_fg_bg = cpair(style.theme.label, s_hi_box.bkg) -local s_hi_box = style.theme.highlight_box -local s_field = style.theme.field_box -local arrow_col = cpair(style.theme.label, s_hi_box.bkg) +local bw_fg_bg = style.bw_fg_bg local ind_grn = style.ind_grn local ind_yel = style.ind_yel @@ -128,7 +129,7 @@ local function new_view(root, x, y) TextBox{parent=burn_tag,x=2,y=2,text="Burn Target",width=7,height=2} local burn_target = Div{parent=targets,x=9,y=1,width=23,height=3,fg_bg=s_hi_box} - local b_target = SpinboxNumeric{parent=burn_target,x=11,y=1,whole_num_precision=4,fractional_precision=1,min=0.1,arrow_fg_bg=arrow_col,arrow_disable=style.theme.disabled} + local b_target = SpinboxNumeric{parent=burn_target,x=11,y=1,whole_num_precision=4,fractional_precision=1,min=0.1,arrow_fg_bg=arrow_fg_bg,arrow_disable=style.theme.disabled} TextBox{parent=burn_target,x=18,y=2,text="mB/t",fg_bg=style.theme.label_fg} local burn_sum = DataIndicator{parent=targets,x=9,y=4,label="",format="%18.1f",value=0,unit="mB/t",commas=true,lu_colors=black,width=23,fg_bg=blk_brn} @@ -139,7 +140,7 @@ local function new_view(root, x, y) TextBox{parent=chg_tag,x=2,y=2,text="Charge Target",width=7,height=2} local chg_target = Div{parent=targets,x=9,y=6,width=23,height=3,fg_bg=s_hi_box} - local c_target = SpinboxNumeric{parent=chg_target,x=2,y=1,whole_num_precision=15,fractional_precision=0,min=0,arrow_fg_bg=arrow_col,arrow_disable=style.theme.disabled} + local c_target = SpinboxNumeric{parent=chg_target,x=2,y=1,whole_num_precision=15,fractional_precision=0,min=0,arrow_fg_bg=arrow_fg_bg,arrow_disable=style.theme.disabled} TextBox{parent=chg_target,x=18,y=2,text="MFE",fg_bg=style.theme.label_fg} local cur_charge = DataIndicator{parent=targets,x=9,y=9,label="",format="%19d",value=0,unit="MFE",commas=true,lu_colors=black,width=23,fg_bg=blk_brn} @@ -150,7 +151,7 @@ local function new_view(root, x, y) TextBox{parent=gen_tag,x=2,y=2,text="Gen. Target",width=7,height=2} local gen_target = Div{parent=targets,x=9,y=11,width=23,height=3,fg_bg=s_hi_box} - local g_target = SpinboxNumeric{parent=gen_target,x=8,y=1,whole_num_precision=9,fractional_precision=0,min=0,arrow_fg_bg=arrow_col,arrow_disable=style.theme.disabled} + local g_target = SpinboxNumeric{parent=gen_target,x=8,y=1,whole_num_precision=9,fractional_precision=0,min=0,arrow_fg_bg=arrow_fg_bg,arrow_disable=style.theme.disabled} TextBox{parent=gen_target,x=18,y=2,text="kFE/t",fg_bg=style.theme.label_fg} local cur_gen = DataIndicator{parent=targets,x=9,y=14,label="",format="%17d",value=0,unit="kFE/t",commas=true,lu_colors=black,width=23,fg_bg=blk_brn} @@ -188,7 +189,7 @@ local function new_view(root, x, y) TextBox{parent=unit_tag,x=2,y=2,text="Unit "..i.." Limit",width=7,height=2} local lim_ctl = Div{parent=limit_div,x=9,y=_y,width=14,height=3,fg_bg=s_hi_box} - local lim = SpinboxNumeric{parent=lim_ctl,x=2,y=1,whole_num_precision=4,fractional_precision=1,min=0.1,arrow_fg_bg=arrow_col,arrow_disable=style.theme.disabled,fg_bg=lim_fg_bg} + local lim = SpinboxNumeric{parent=lim_ctl,x=2,y=1,whole_num_precision=4,fractional_precision=1,min=0.1,arrow_fg_bg=arrow_fg_bg,arrow_disable=style.theme.disabled,fg_bg=lim_fg_bg} TextBox{parent=lim_ctl,x=9,y=2,text="mB/t",width=4,height=1,fg_bg=label_fg} local cur_burn = DataIndicator{parent=limit_div,x=9,y=_y+3,label="",format="%7.1f",value=0,unit="mB/t",commas=false,lu_colors=cpair(cur_lu,cur_lu),width=14,fg_bg=cur_fg_bg} diff --git a/coordinator/ui/components/unit_detail.lua b/coordinator/ui/components/unit_detail.lua index dbacf85..3c80020 100644 --- a/coordinator/ui/components/unit_detail.lua +++ b/coordinator/ui/components/unit_detail.lua @@ -34,11 +34,17 @@ local ALIGN = core.ALIGN local cpair = core.cpair local border = core.border -local bw_fg_bg = style.bw_fg_bg +local s_hi_box = style.theme.highlight_box +local s_hi_bright = style.theme.highlight_box_bright +local s_field = style.theme.field_box + +local hc_text = style.hc_text local lu_cpair = style.lu_colors local hzd_fg_bg = style.hzd_fg_bg local dis_colors = style.dis_colors +local arrow_fg_bg = cpair(style.theme.label, s_hi_box.bkg) +local bw_fg_bg = style.bw_fg_bg local gry_wht = style.gray_white local ind_grn = style.ind_grn @@ -75,11 +81,11 @@ local function init(parent, id) core_map.register(u_ps, "size", function (s) core_map.resize(s[1], s[2]) end) TextBox{parent=main,x=12,y=22,text="Heating Rate",height=1,width=12,fg_bg=style.label} - local heating_r = DataIndicator{parent=main,x=12,label="",format="%14.0f",value=0,unit="mB/t",commas=true,lu_colors=lu_cpair,width=19,fg_bg=bw_fg_bg} + local heating_r = DataIndicator{parent=main,x=12,label="",format="%14.0f",value=0,unit="mB/t",commas=true,lu_colors=lu_cpair,width=19,fg_bg=s_field} heating_r.register(u_ps, "heating_rate", heating_r.update) TextBox{parent=main,x=12,y=25,text="Commanded Burn Rate",height=1,width=19,fg_bg=style.label} - local burn_r = DataIndicator{parent=main,x=12,label="",format="%14.2f",value=0,unit="mB/t",lu_colors=lu_cpair,width=19,fg_bg=bw_fg_bg} + local burn_r = DataIndicator{parent=main,x=12,label="",format="%14.2f",value=0,unit="mB/t",lu_colors=lu_cpair,width=19,fg_bg=s_field} burn_r.register(u_ps, "burn_rate", burn_r.update) TextBox{parent=main,text="F",x=2,y=22,width=1,height=1,fg_bg=style.label} @@ -89,7 +95,7 @@ local function init(parent, id) TextBox{parent=main,text="H",x=8,y=22,width=1,height=1,fg_bg=style.label} TextBox{parent=main,text="W",x=10,y=22,width=1,height=1,fg_bg=style.label} - local fuel = VerticalBar{parent=main,x=2,y=23,fg_bg=cpair(colors.black,colors.gray),height=4,width=1} + local fuel = VerticalBar{parent=main,x=2,y=23,fg_bg=cpair(style.theme.fuel_color,colors.gray),height=4,width=1} local ccool = VerticalBar{parent=main,x=4,y=23,fg_bg=cpair(colors.blue,colors.gray),height=4,width=1} local hcool = VerticalBar{parent=main,x=8,y=23,fg_bg=cpair(colors.white,colors.gray),height=4,width=1} local waste = VerticalBar{parent=main,x=10,y=23,fg_bg=cpair(colors.brown,colors.gray),height=4,width=1} @@ -117,19 +123,19 @@ local function init(parent, id) TextBox{parent=main,x=32,y=22,text="Core Temp",height=1,width=9,fg_bg=style.label} local fmt = util.trinary(string.len(db.temp_label) == 2, "%10.2f", "%11.2f") - local core_temp = DataIndicator{parent=main,x=32,label="",format=fmt,value=0,commas=true,unit=db.temp_label,lu_colors=lu_cpair,width=13,fg_bg=bw_fg_bg} + local core_temp = DataIndicator{parent=main,x=32,label="",format=fmt,value=0,commas=true,unit=db.temp_label,lu_colors=lu_cpair,width=13,fg_bg=s_field} core_temp.register(u_ps, "temp", function (t) core_temp.update(db.temp_convert(t)) end) TextBox{parent=main,x=32,y=25,text="Burn Rate",height=1,width=9,fg_bg=style.label} - local act_burn_r = DataIndicator{parent=main,x=32,label="",format="%8.2f",value=0,unit="mB/t",lu_colors=lu_cpair,width=13,fg_bg=bw_fg_bg} + local act_burn_r = DataIndicator{parent=main,x=32,label="",format="%8.2f",value=0,unit="mB/t",lu_colors=lu_cpair,width=13,fg_bg=s_field} act_burn_r.register(u_ps, "act_burn_rate", act_burn_r.update) TextBox{parent=main,x=32,y=28,text="Damage",height=1,width=6,fg_bg=style.label} - local damage_p = DataIndicator{parent=main,x=32,label="",format="%11.0f",value=0,unit="%",lu_colors=lu_cpair,width=13,fg_bg=bw_fg_bg} + local damage_p = DataIndicator{parent=main,x=32,label="",format="%11.0f",value=0,unit="%",lu_colors=lu_cpair,width=13,fg_bg=s_field} damage_p.register(u_ps, "damage", damage_p.update) TextBox{parent=main,x=32,y=31,text="Radiation",height=1,width=21,fg_bg=style.label} - local radiation = RadIndicator{parent=main,x=32,label="",format="%9.3f",lu_colors=lu_cpair,width=13,fg_bg=bw_fg_bg} + local radiation = RadIndicator{parent=main,x=32,label="",format="%9.3f",lu_colors=lu_cpair,width=13,fg_bg=s_field} radiation.register(u_ps, "radiation", radiation.update) ------------------- @@ -258,11 +264,11 @@ local function init(parent, id) if available_space > 0 then _add_space() end if unit.num_boilers > 0 then - TextBox{parent=rcs_tags,x=1,text="B1",width=2,height=1,fg_bg=bw_fg_bg} + TextBox{parent=rcs_tags,x=1,text="B1",width=2,height=1,fg_bg=hc_text} local b1_wll = IndicatorLight{parent=rcs_annunc,label="Water Level Low",colors=ind_red} b1_wll.register(b_ps[1], "WaterLevelLow", b1_wll.update) - TextBox{parent=rcs_tags,text="B1",width=2,height=1,fg_bg=bw_fg_bg} + TextBox{parent=rcs_tags,text="B1",width=2,height=1,fg_bg=hc_text} local b1_hr = IndicatorLight{parent=rcs_annunc,label="Heating Rate Low",colors=ind_yel} b1_hr.register(b_ps[1], "HeatingRateLow", b1_hr.update) end @@ -274,11 +280,11 @@ local function init(parent, id) _add_space() end - TextBox{parent=rcs_tags,text="B2",width=2,height=1,fg_bg=bw_fg_bg} + TextBox{parent=rcs_tags,text="B2",width=2,height=1,fg_bg=hc_text} local b2_wll = IndicatorLight{parent=rcs_annunc,label="Water Level Low",colors=ind_red} b2_wll.register(b_ps[2], "WaterLevelLow", b2_wll.update) - TextBox{parent=rcs_tags,text="B2",width=2,height=1,fg_bg=bw_fg_bg} + TextBox{parent=rcs_tags,text="B2",width=2,height=1,fg_bg=hc_text} local b2_hr = IndicatorLight{parent=rcs_annunc,label="Heating Rate Low",colors=ind_yel} b2_hr.register(b_ps[2], "HeatingRateLow", b2_hr.update) end @@ -287,19 +293,19 @@ local function init(parent, id) if available_space > 1 then _add_space() end - TextBox{parent=rcs_tags,text="T1",width=2,height=1,fg_bg=bw_fg_bg} + TextBox{parent=rcs_tags,text="T1",width=2,height=1,fg_bg=hc_text} local t1_sdo = TriIndicatorLight{parent=rcs_annunc,label="Steam Relief Valve Open",c1=colors.gray,c2=colors.yellow,c3=colors.red} t1_sdo.register(t_ps[1], "SteamDumpOpen", t1_sdo.update) - TextBox{parent=rcs_tags,text="T1",width=2,height=1,fg_bg=bw_fg_bg} + TextBox{parent=rcs_tags,text="T1",width=2,height=1,fg_bg=hc_text} local t1_tos = IndicatorLight{parent=rcs_annunc,label="Turbine Over Speed",colors=ind_red} t1_tos.register(t_ps[1], "TurbineOverSpeed", t1_tos.update) - TextBox{parent=rcs_tags,text="T1",width=2,height=1,fg_bg=bw_fg_bg} + TextBox{parent=rcs_tags,text="T1",width=2,height=1,fg_bg=hc_text} local t1_gtrp = IndicatorLight{parent=rcs_annunc,label="Generator Trip",colors=ind_yel,flash=true,period=period.BLINK_250_MS} t1_gtrp.register(t_ps[1], "GeneratorTrip", t1_gtrp.update) - TextBox{parent=rcs_tags,text="T1",width=2,height=1,fg_bg=bw_fg_bg} + TextBox{parent=rcs_tags,text="T1",width=2,height=1,fg_bg=hc_text} local t1_trp = IndicatorLight{parent=rcs_annunc,label="Turbine Trip",colors=ind_red,flash=true,period=period.BLINK_250_MS} t1_trp.register(t_ps[1], "TurbineTrip", t1_trp.update) @@ -308,19 +314,19 @@ local function init(parent, id) _add_space() end - TextBox{parent=rcs_tags,text="T2",width=2,height=1,fg_bg=bw_fg_bg} + TextBox{parent=rcs_tags,text="T2",width=2,height=1,fg_bg=hc_text} local t2_sdo = TriIndicatorLight{parent=rcs_annunc,label="Steam Relief Valve Open",c1=colors.gray,c2=colors.yellow,c3=colors.red} t2_sdo.register(t_ps[2], "SteamDumpOpen", t2_sdo.update) - TextBox{parent=rcs_tags,text="T2",width=2,height=1,fg_bg=bw_fg_bg} + TextBox{parent=rcs_tags,text="T2",width=2,height=1,fg_bg=hc_text} local t2_tos = IndicatorLight{parent=rcs_annunc,label="Turbine Over Speed",colors=ind_red} t2_tos.register(t_ps[2], "TurbineOverSpeed", t2_tos.update) - TextBox{parent=rcs_tags,text="T2",width=2,height=1,fg_bg=bw_fg_bg} + TextBox{parent=rcs_tags,text="T2",width=2,height=1,fg_bg=hc_text} local t2_gtrp = IndicatorLight{parent=rcs_annunc,label="Generator Trip",colors=ind_yel,flash=true,period=period.BLINK_250_MS} t2_gtrp.register(t_ps[2], "GeneratorTrip", t2_gtrp.update) - TextBox{parent=rcs_tags,text="T2",width=2,height=1,fg_bg=bw_fg_bg} + TextBox{parent=rcs_tags,text="T2",width=2,height=1,fg_bg=hc_text} local t2_trp = IndicatorLight{parent=rcs_annunc,label="Turbine Trip",colors=ind_red,flash=true,period=period.BLINK_250_MS} t2_trp.register(t_ps[2], "TurbineTrip", t2_trp.update) end @@ -328,19 +334,19 @@ local function init(parent, id) if unit.num_turbines > 2 then if available_space > 3 then _add_space() end - TextBox{parent=rcs_tags,text="T3",width=2,height=1,fg_bg=bw_fg_bg} + TextBox{parent=rcs_tags,text="T3",width=2,height=1,fg_bg=hc_text} local t3_sdo = TriIndicatorLight{parent=rcs_annunc,label="Steam Relief Valve Open",c1=colors.gray,c2=colors.yellow,c3=colors.red} t3_sdo.register(t_ps[3], "SteamDumpOpen", t3_sdo.update) - TextBox{parent=rcs_tags,text="T3",width=2,height=1,fg_bg=bw_fg_bg} + TextBox{parent=rcs_tags,text="T3",width=2,height=1,fg_bg=hc_text} local t3_tos = IndicatorLight{parent=rcs_annunc,label="Turbine Over Speed",colors=ind_red} t3_tos.register(t_ps[3], "TurbineOverSpeed", t3_tos.update) - TextBox{parent=rcs_tags,text="T3",width=2,height=1,fg_bg=bw_fg_bg} + TextBox{parent=rcs_tags,text="T3",width=2,height=1,fg_bg=hc_text} local t3_gtrp = IndicatorLight{parent=rcs_annunc,label="Generator Trip",colors=ind_yel,flash=true,period=period.BLINK_250_MS} t3_gtrp.register(t_ps[3], "GeneratorTrip", t3_gtrp.update) - TextBox{parent=rcs_tags,text="T3",width=2,height=1,fg_bg=bw_fg_bg} + TextBox{parent=rcs_tags,text="T3",width=2,height=1,fg_bg=hc_text} local t3_trp = IndicatorLight{parent=rcs_annunc,label="Turbine Trip",colors=ind_red,flash=true,period=period.BLINK_250_MS} t3_trp.register(t_ps[3], "TurbineTrip", t3_trp.update) end @@ -349,9 +355,9 @@ local function init(parent, id) -- reactor controls -- ---------------------- - local burn_control = Div{parent=main,x=12,y=28,width=19,height=3,fg_bg=gry_wht} - local burn_rate = SpinboxNumeric{parent=burn_control,x=2,y=1,whole_num_precision=4,fractional_precision=1,min=0.1,arrow_fg_bg=gry_wht,fg_bg=bw_fg_bg} - TextBox{parent=burn_control,x=9,y=2,text="mB/t"} + local burn_control = Div{parent=main,x=12,y=28,width=19,height=3,fg_bg=s_hi_box} + local burn_rate = SpinboxNumeric{parent=burn_control,x=2,y=1,whole_num_precision=4,fractional_precision=1,min=0.1,arrow_fg_bg=arrow_fg_bg,arrow_disable=style.theme.disabled} + TextBox{parent=burn_control,x=9,y=2,text="mB/t",fg_bg=style.theme.label_fg} local set_burn = function () unit.set_burn(burn_rate.get_value()) end local set_burn_btn = PushButton{parent=burn_control,x=14,y=2,text="SET",min_width=5,fg_bg=cpair(colors.black,colors.yellow),active_fg_bg=style.wh_gray,dis_fg_bg=dis_colors,callback=set_burn} @@ -397,7 +403,7 @@ local function init(parent, id) -- alarm management -- ---------------------- - local alarm_panel = Div{parent=main,x=2,y=36,width=29,height=16,fg_bg=bw_fg_bg} + local alarm_panel = Div{parent=main,x=2,y=36,width=29,height=16,fg_bg=s_hi_bright} local a_brc = AlarmLight{parent=alarm_panel,x=6,y=2,label="Containment Breach",c1=colors.gray,c2=colors.red,c3=colors.green,flash=true,period=period.BLINK_250_MS} local a_rad = AlarmLight{parent=alarm_panel,x=6,label="Containment Radiation",c1=colors.gray,c2=colors.red,c3=colors.green,flash=true,period=period.BLINK_250_MS} @@ -465,9 +471,9 @@ local function init(parent, id) -- color tags - TextBox{parent=alarm_panel,x=5,y=13,text="\x95",width=1,height=1,fg_bg=cpair(colors.white,colors.cyan)} - TextBox{parent=alarm_panel,x=5,text="\x95",width=1,height=1,fg_bg=cpair(colors.white,colors.blue)} - TextBox{parent=alarm_panel,x=5,text="\x95",width=1,height=1,fg_bg=cpair(colors.white,colors.blue)} + TextBox{parent=alarm_panel,x=5,y=13,text="\x95",width=1,height=1,fg_bg=cpair(s_hi_bright.bkg,colors.cyan)} + TextBox{parent=alarm_panel,x=5,text="\x95",width=1,height=1,fg_bg=cpair(s_hi_bright.bkg,colors.blue)} + TextBox{parent=alarm_panel,x=5,text="\x95",width=1,height=1,fg_bg=cpair(s_hi_bright.bkg,colors.blue)} -------------------------------- -- automatic control settings -- @@ -479,7 +485,7 @@ local function init(parent, id) local ctl_opts = { "Manual", "Primary", "Secondary", "Tertiary", "Backup" } - local group = RadioButton{parent=auto_div,options=ctl_opts,callback=function()end,radio_colors=cpair(colors.gray,colors.white),select_color=colors.purple} + local group = RadioButton{parent=auto_div,options=ctl_opts,callback=function()end,radio_colors=cpair(style.theme.accent_dark,style.theme.accent_light),select_color=colors.purple} group.register(u_ps, "auto_group_id", function (gid) group.set_value(gid + 1) end) @@ -491,7 +497,7 @@ local function init(parent, id) auto_div.line_break() TextBox{parent=auto_div,text="Prio. Group",height=1,width=11,fg_bg=style.label} - local auto_grp = TextBox{parent=auto_div,text="Manual",height=1,width=11,fg_bg=bw_fg_bg} + local auto_grp = TextBox{parent=auto_div,text="Manual",height=1,width=11,fg_bg=s_field} auto_grp.register(u_ps, "auto_group", auto_grp.set_value) diff --git a/coordinator/ui/style.lua b/coordinator/ui/style.lua index a3228c5..d2db250 100644 --- a/coordinator/ui/style.lua +++ b/coordinator/ui/style.lua @@ -65,6 +65,7 @@ local deepslate = { disabled_fg = cpair(colors.gray, colors._INHERIT), highlight_box = cpair(colors.white, colors.gray), + highlight_box_bright = cpair(colors.black, colors.lightGray), field_box = cpair(colors.white, colors.gray), colors = { @@ -106,6 +107,7 @@ local smooth_stone = { disabled_fg = cpair(colors.lightGray, colors._INHERIT), highlight_box = cpair(colors.black, colors.white), + highlight_box_bright = cpair(colors.black, colors.white), field_box = cpair(colors.black, colors.white), colors = { @@ -134,13 +136,19 @@ style.theme = deepslate style.root = cpair(style.theme.text, style.theme.bg) style.label = cpair(style.theme.label, style.theme.bg) +-- high contrast text (also tags) +style.hc_text = cpair(style.theme.text, style.theme.text_inv) +-- text on default background +style.text_colors = cpair(style.theme.text, style.theme.bg) +-- label & unit colors +style.lu_colors = cpair(style.theme.label, style.theme.label) + -- COMMON COLOR PAIRS -- style.wh_gray = cpair(colors.white, colors.gray) style.bw_fg_bg = cpair(colors.black, colors.white) -style.text_colors = cpair(colors.black, colors.lightGray) -style.lu_colors = cpair(style.theme.label, style.theme.label) + style.hzd_fg_bg = style.wh_gray style.dis_colors = cpair(colors.white, colors.lightGray) From c40aa229bf4635a93b30a2c81693a1bcb5159353 Mon Sep 17 00:00:00 2001 From: Mikayla Fischler Date: Sat, 24 Feb 2024 17:35:10 -0500 Subject: [PATCH 03/44] #405 flow monitor theme implementation --- coordinator/ui/components/unit_flow.lua | 50 +++++++++++++------------ coordinator/ui/layout/flow_view.lua | 31 ++++++++------- coordinator/ui/style.lua | 20 ++++++---- 3 files changed, 56 insertions(+), 45 deletions(-) diff --git a/coordinator/ui/components/unit_flow.lua b/coordinator/ui/components/unit_flow.lua index f3103e5..577314a 100644 --- a/coordinator/ui/components/unit_flow.lua +++ b/coordinator/ui/components/unit_flow.lua @@ -24,12 +24,16 @@ local ALIGN = core.ALIGN local sprintf = util.sprintf local border = core.border +local cpair = core.cpair local pipe = core.pipe -local wh_gray = style.wh_gray -local bw_fg_bg = style.bw_fg_bg +local s_field = style.theme.field_box + local text_c = style.text_colors local lu_c = style.lu_colors +local lu_c_d = style.lu_colors_dark + +local wh_gray = style.wh_gray local lg_gray = style.lg_gray local ind_grn = style.ind_grn @@ -99,11 +103,11 @@ local function make(parent, x, y, wide, unit) table.insert(rc_pipes, pipe(_wide(92, 78), py, _wide(104, 83), py, colors.white, true)) end - PipeNetwork{parent=root,x=20,y=1,pipes=rc_pipes,bg=colors.lightGray} + PipeNetwork{parent=root,x=20,y=1,pipes=rc_pipes,bg=style.theme.bg} if unit.num_boilers > 0 then - local cc_rate = DataIndicator{parent=root,x=_wide(25,22),y=3,lu_colors=lu_c,label="",unit="mB/t",format="%11.0f",value=0,commas=true,width=16,fg_bg=bw_fg_bg} - local hc_rate = DataIndicator{parent=root,x=_wide(25,22),y=5,lu_colors=lu_c,label="",unit="mB/t",format="%11.0f",value=0,commas=true,width=16,fg_bg=bw_fg_bg} + local cc_rate = DataIndicator{parent=root,x=_wide(25,22),y=3,lu_colors=lu_c,label="",unit="mB/t",format="%11.0f",value=0,commas=true,width=16,fg_bg=s_field} + local hc_rate = DataIndicator{parent=root,x=_wide(25,22),y=5,lu_colors=lu_c,label="",unit="mB/t",format="%11.0f",value=0,commas=true,width=16,fg_bg=s_field} cc_rate.register(unit.unit_ps, "boiler_boil_sum", function (sum) cc_rate.update(sum * 10) end) hc_rate.register(unit.unit_ps, "heating_rate", hc_rate.update) @@ -114,14 +118,14 @@ local function make(parent, x, y, wide, unit) TextBox{parent=root,x=_wide(47,40),y=2,text="\x1b \x80 \x1a",width=1,height=3,fg_bg=lg_gray} TextBox{parent=root,x=_wide(65,58),y=2,text="\x1b \x80 \x1a",width=1,height=3,fg_bg=lg_gray} - local wt_rate = DataIndicator{parent=root,x=_wide(71,61),y=3,lu_colors=lu_c,label="",unit="mB/t",format="%11.0f",value=0,commas=true,width=16,fg_bg=bw_fg_bg} - local st_rate = DataIndicator{parent=root,x=_wide(71,61),y=5,lu_colors=lu_c,label="",unit="mB/t",format="%11.0f",value=0,commas=true,width=16,fg_bg=bw_fg_bg} + local wt_rate = DataIndicator{parent=root,x=_wide(71,61),y=3,lu_colors=lu_c,label="",unit="mB/t",format="%11.0f",value=0,commas=true,width=16,fg_bg=s_field} + local st_rate = DataIndicator{parent=root,x=_wide(71,61),y=5,lu_colors=lu_c,label="",unit="mB/t",format="%11.0f",value=0,commas=true,width=16,fg_bg=s_field} wt_rate.register(unit.unit_ps, "turbine_flow_sum", wt_rate.update) st_rate.register(unit.unit_ps, "boiler_boil_sum", st_rate.update) else - local wt_rate = DataIndicator{parent=root,x=28,y=3,lu_colors=lu_c,label="",unit="mB/t",format="%11.0f",value=0,commas=true,width=16,fg_bg=bw_fg_bg} - local st_rate = DataIndicator{parent=root,x=28,y=5,lu_colors=lu_c,label="",unit="mB/t",format="%11.0f",value=0,commas=true,width=16,fg_bg=bw_fg_bg} + local wt_rate = DataIndicator{parent=root,x=28,y=3,lu_colors=lu_c,label="",unit="mB/t",format="%11.0f",value=0,commas=true,width=16,fg_bg=s_field} + local st_rate = DataIndicator{parent=root,x=28,y=5,lu_colors=lu_c,label="",unit="mB/t",format="%11.0f",value=0,commas=true,width=16,fg_bg=s_field} wt_rate.register(unit.unit_ps, "turbine_flow_sum", wt_rate.update) st_rate.register(unit.unit_ps, "heating_rate", st_rate.update) @@ -163,7 +167,7 @@ local function make(parent, x, y, wide, unit) pipe(_wide(132, 110), 6, _wide(130, 108), 6, colors.black, true, true) } - PipeNetwork{parent=waste,x=1,y=1,pipes=waste_pipes,bg=colors.lightGray} + PipeNetwork{parent=waste,x=1,y=1,pipes=waste_pipes,bg=style.theme.bg} local function _valve(vx, vy, n) TextBox{parent=waste,x=vx,y=vy,text="\x10\x11",fg_bg=text_c,width=2,height=1} @@ -175,16 +179,16 @@ local function make(parent, x, y, wide, unit) local function _machine(mx, my, name) local l = string.len(name) + 2 - TextBox{parent=waste,x=mx,y=my,text=string.rep("\x8f",l),alignment=ALIGN.CENTER,fg_bg=lg_gray,width=l,height=1} - TextBox{parent=waste,x=mx,y=my+1,text=name,alignment=ALIGN.CENTER,fg_bg=wh_gray,width=l,height=1} + TextBox{parent=waste,x=mx,y=my,text=string.rep("\x8f",l),alignment=ALIGN.CENTER,fg_bg=cpair(style.theme.bg,style.theme.header.bkg),width=l,height=1} + TextBox{parent=waste,x=mx,y=my+1,text=name,alignment=ALIGN.CENTER,fg_bg=style.theme.header,width=l,height=1} end - local waste_rate = DataIndicator{parent=waste,x=1,y=3,lu_colors=lu_c,label="",unit="mB/t",format="%7.2f",value=0,width=12,fg_bg=bw_fg_bg} - local pu_rate = DataIndicator{parent=waste,x=_wide(82,70),y=3,lu_colors=lu_c,label="",unit="mB/t",format="%7.3f",value=0,width=12,fg_bg=bw_fg_bg} - local po_rate = DataIndicator{parent=waste,x=_wide(52,45),y=6,lu_colors=lu_c,label="",unit="mB/t",format="%7.3f",value=0,width=12,fg_bg=bw_fg_bg} - local popl_rate = DataIndicator{parent=waste,x=_wide(82,70),y=6,lu_colors=lu_c,label="",unit="mB/t",format="%7.3f",value=0,width=12,fg_bg=bw_fg_bg} - local poam_rate = DataIndicator{parent=waste,x=_wide(82,70),y=10,lu_colors=lu_c,label="",unit="mB/t",format="%7.3f",value=0,width=12,fg_bg=bw_fg_bg} - local spent_rate = DataIndicator{parent=waste,x=_wide(117,99),y=3,lu_colors=lu_c,label="",unit="mB/t",format="%7.3f",value=0,width=12,fg_bg=bw_fg_bg} + local waste_rate = DataIndicator{parent=waste,x=1,y=3,lu_colors=lu_c,label="",unit="mB/t",format="%7.2f",value=0,width=12,fg_bg=s_field} + local pu_rate = DataIndicator{parent=waste,x=_wide(82,70),y=3,lu_colors=lu_c,label="",unit="mB/t",format="%7.3f",value=0,width=12,fg_bg=s_field} + local po_rate = DataIndicator{parent=waste,x=_wide(52,45),y=6,lu_colors=lu_c,label="",unit="mB/t",format="%7.3f",value=0,width=12,fg_bg=s_field} + local popl_rate = DataIndicator{parent=waste,x=_wide(82,70),y=6,lu_colors=lu_c,label="",unit="mB/t",format="%7.3f",value=0,width=12,fg_bg=s_field} + local poam_rate = DataIndicator{parent=waste,x=_wide(82,70),y=10,lu_colors=lu_c,label="",unit="mB/t",format="%7.3f",value=0,width=12,fg_bg=s_field} + local spent_rate = DataIndicator{parent=waste,x=_wide(117,99),y=3,lu_colors=lu_c,label="",unit="mB/t",format="%7.3f",value=0,width=12,fg_bg=s_field} waste_rate.register(unit.unit_ps, "act_burn_rate", waste_rate.update) pu_rate.register(unit.unit_ps, "pu_rate", pu_rate.update) @@ -204,12 +208,12 @@ local function make(parent, x, y, wide, unit) _machine(_wide(116, 94), 6, "SPENT WASTE \x1b") TextBox{parent=waste,x=_wide(30,25),y=3,text="SNAs [Po]",alignment=ALIGN.CENTER,width=19,height=1,fg_bg=wh_gray} - local sna_po = Rectangle{parent=waste,x=_wide(30,25),y=4,border=border(1,colors.gray,true),width=19,height=7,thin=true,fg_bg=bw_fg_bg} + local sna_po = Rectangle{parent=waste,x=_wide(30,25),y=4,border=border(1,colors.gray,true),width=19,height=7,thin=true,fg_bg=style.theme.highlight_box_bright} local sna_act = IndicatorLight{parent=sna_po,label="ACTIVE",colors=ind_grn} - local sna_cnt = DataIndicator{parent=sna_po,x=12,y=1,lu_colors=lu_c,label="CNT",unit="",format="%2d",value=0,width=7} - local sna_pk = DataIndicator{parent=sna_po,y=3,lu_colors=lu_c,label="PEAK",unit="mB/t",format="%7.2f",value=0,width=17} - local sna_max = DataIndicator{parent=sna_po,lu_colors=lu_c,label="MAX",unit="mB/t",format="%8.2f",value=0,width=17} - local sna_in = DataIndicator{parent=sna_po,lu_colors=lu_c,label="IN",unit="mB/t",format="%9.2f",value=0,width=17} + local sna_cnt = DataIndicator{parent=sna_po,x=12,y=1,lu_colors=lu_c_d,label="CNT",unit="",format="%2d",value=0,width=7} + local sna_pk = DataIndicator{parent=sna_po,y=3,lu_colors=lu_c_d,label="PEAK",unit="mB/t",format="%7.2f",value=0,width=17} + local sna_max = DataIndicator{parent=sna_po,lu_colors=lu_c_d,label="MAX",unit="mB/t",format="%8.2f",value=0,width=17} + local sna_in = DataIndicator{parent=sna_po,lu_colors=lu_c_d,label="IN",unit="mB/t",format="%9.2f",value=0,width=17} sna_act.register(unit.unit_ps, "po_rate", function (r) sna_act.update(r > 0) end) sna_cnt.register(unit.unit_ps, "sna_count", sna_cnt.update) diff --git a/coordinator/ui/layout/flow_view.lua b/coordinator/ui/layout/flow_view.lua index c14a057..03d14d4 100644 --- a/coordinator/ui/layout/flow_view.lua +++ b/coordinator/ui/layout/flow_view.lua @@ -31,10 +31,13 @@ local cpair = core.cpair local border = core.border local pipe = core.pipe +local s_hi_bright = style.theme.highlight_box_bright +local s_field = style.theme.field_box + local wh_gray = style.wh_gray -local bw_fg_bg = style.bw_fg_bg local text_col = style.text_colors local lu_col = style.lu_colors +local lu_c_d = style.lu_colors_dark -- create new flow view ---@param main graphics_element main displaybox @@ -240,7 +243,7 @@ local function init(main) local flow_x = 3 if #water_pipes > 0 then flow_x = 25 - PipeNetwork{parent=main,x=2,y=3,pipes=water_pipes,bg=colors.lightGray} + PipeNetwork{parent=main,x=2,y=3,pipes=water_pipes,bg=style.theme.bg} end for i = 1, facility.num_units do @@ -249,7 +252,7 @@ local function init(main) table.insert(po_pipes, pipe(0, 3 + y_offset, 4, 0, colors.cyan, true, true)) end - PipeNetwork{parent=main,x=139,y=15,pipes=po_pipes,bg=colors.lightGray} + PipeNetwork{parent=main,x=139,y=15,pipes=po_pipes,bg=style.theme.bg} ----------------- -- tank valves -- @@ -297,7 +300,7 @@ local function init(main) TextBox{parent=tank_box,x=2,y=3,text="Fill",height=1,width=10,fg_bg=style.label} local tank_pcnt = DataIndicator{parent=tank_box,x=10,y=3,label="",format="%5.2f",value=100,unit="%",lu_colors=lu_col,width=8,fg_bg=text_col} - local tank_amnt = DataIndicator{parent=tank_box,x=2,label="",format="%13d",value=0,commas=true,unit="mB",lu_colors=lu_col,width=16,fg_bg=bw_fg_bg} + local tank_amnt = DataIndicator{parent=tank_box,x=2,label="",format="%13d",value=0,commas=true,unit="mB",lu_colors=lu_col,width=16,fg_bg=s_field} TextBox{parent=tank_box,x=2,y=6,text="Water Level",height=1,width=11,fg_bg=style.label} local level = HorizontalBar{parent=tank_box,x=2,y=7,bar_fg_bg=cpair(colors.blue,colors.gray),height=1,width=16} @@ -348,12 +351,12 @@ local function init(main) status.register(facility.sps_ps_tbl[1], "computed_status", status.update) TextBox{parent=sps_box,x=2,y=3,text="Input Rate",height=1,width=10,fg_bg=style.label} - local sps_in = DataIndicator{parent=sps_box,x=2,label="",format="%15.3f",value=0,unit="mB/t",lu_colors=lu_col,width=20,fg_bg=bw_fg_bg} + local sps_in = DataIndicator{parent=sps_box,x=2,label="",format="%15.3f",value=0,unit="mB/t",lu_colors=lu_col,width=20,fg_bg=s_field} sps_in.register(facility.ps, "po_am_rate", sps_in.update) TextBox{parent=sps_box,x=2,y=6,text="Production Rate",height=1,width=15,fg_bg=style.label} - local sps_rate = DataIndicator{parent=sps_box,x=2,label="",format="%15d",value=0,unit="\xb5B/t",lu_colors=lu_col,width=20,fg_bg=bw_fg_bg} + local sps_rate = DataIndicator{parent=sps_box,x=2,label="",format="%15d",value=0,unit="\xb5B/t",lu_colors=lu_col,width=20,fg_bg=s_field} sps_rate.register(facility.sps_ps_tbl[1], "process_rate", function (r) sps_rate.update(r * 1000) end) @@ -362,24 +365,24 @@ local function init(main) ---------------- TextBox{parent=main,x=145,y=16,text="RAW WASTE",alignment=ALIGN.CENTER,width=19,height=1,fg_bg=wh_gray} - local raw_waste = Rectangle{parent=main,x=145,y=17,border=border(1,colors.gray,true),width=19,height=3,thin=true,fg_bg=bw_fg_bg} - local sum_raw_waste = DataIndicator{parent=raw_waste,lu_colors=lu_col,label="SUM",unit="mB/t",format="%8.2f",value=0,width=17} + local raw_waste = Rectangle{parent=main,x=145,y=17,border=border(1,colors.gray,true),width=19,height=3,thin=true,fg_bg=s_hi_bright} + local sum_raw_waste = DataIndicator{parent=raw_waste,lu_colors=lu_c_d,label="SUM",unit="mB/t",format="%8.2f",value=0,width=17} sum_raw_waste.register(facility.ps, "burn_sum", sum_raw_waste.update) TextBox{parent=main,x=145,y=21,text="PROC. WASTE",alignment=ALIGN.CENTER,width=19,height=1,fg_bg=wh_gray} - local pr_waste = Rectangle{parent=main,x=145,y=22,border=border(1,colors.gray,true),width=19,height=5,thin=true,fg_bg=bw_fg_bg} - local pu = DataIndicator{parent=pr_waste,lu_colors=lu_col,label="Pu",unit="mB/t",format="%9.3f",value=0,width=17} - local po = DataIndicator{parent=pr_waste,lu_colors=lu_col,label="Po",unit="mB/t",format="%9.3f",value=0,width=17} - local popl = DataIndicator{parent=pr_waste,lu_colors=lu_col,label="PoPl",unit="mB/t",format="%7.3f",value=0,width=17} + local pr_waste = Rectangle{parent=main,x=145,y=22,border=border(1,colors.gray,true),width=19,height=5,thin=true,fg_bg=s_hi_bright} + local pu = DataIndicator{parent=pr_waste,lu_colors=lu_c_d,label="Pu",unit="mB/t",format="%9.3f",value=0,width=17} + local po = DataIndicator{parent=pr_waste,lu_colors=lu_c_d,label="Po",unit="mB/t",format="%9.3f",value=0,width=17} + local popl = DataIndicator{parent=pr_waste,lu_colors=lu_c_d,label="PoPl",unit="mB/t",format="%7.3f",value=0,width=17} pu.register(facility.ps, "pu_rate", pu.update) po.register(facility.ps, "po_rate", po.update) popl.register(facility.ps, "po_pl_rate", popl.update) TextBox{parent=main,x=145,y=28,text="SPENT WASTE",alignment=ALIGN.CENTER,width=19,height=1,fg_bg=wh_gray} - local sp_waste = Rectangle{parent=main,x=145,y=29,border=border(1,colors.gray,true),width=19,height=3,thin=true,fg_bg=bw_fg_bg} - local sum_sp_waste = DataIndicator{parent=sp_waste,lu_colors=lu_col,label="SUM",unit="mB/t",format="%8.3f",value=0,width=17} + local sp_waste = Rectangle{parent=main,x=145,y=29,border=border(1,colors.gray,true),width=19,height=3,thin=true,fg_bg=s_hi_bright} + local sum_sp_waste = DataIndicator{parent=sp_waste,lu_colors=lu_c_d,label="SUM",unit="mB/t",format="%8.3f",value=0,width=17} sum_sp_waste.register(facility.ps, "spent_waste_rate", sum_sp_waste.update) end diff --git a/coordinator/ui/style.lua b/coordinator/ui/style.lua index d2db250..1703acc 100644 --- a/coordinator/ui/style.lua +++ b/coordinator/ui/style.lua @@ -51,6 +51,7 @@ local deepslate = { text = colors.white, text_inv = colors.black, label = colors.lightGray, + label_dark = colors.gray, disabled = colors.gray, bg = colors.black, accent_light = colors.gray, @@ -70,16 +71,16 @@ local deepslate = { colors = { { c = colors.red, hex = 0xeb6a6c }, - { c = colors.orange, hex = 0xf2b564 }, - { c = colors.yellow, hex = 0xd9cf81 }, + { c = colors.orange, hex = 0xffbb65 }, + { c = colors.yellow, hex = 0xeae175 }, { c = colors.lime, hex = 0x80ff80 }, - { c = colors.green, hex = 0x5fe492 }, - { c = colors.cyan, hex = 0x6fdbdf }, - { c = colors.lightBlue, hex = 0x75beea }, - { c = colors.blue, hex = 0x4db4ff }, + { c = colors.green, hex = 0x70e19b }, + { c = colors.cyan, hex = 0x7ccdd0 }, + { c = colors.lightBlue, hex = 0x99ceef }, + { c = colors.blue, hex = 0x60bcff }, { c = colors.purple, hex = 0xc38aea }, - { c = colors.pink, hex = 0xf26ba2 }, - { c = colors.magenta, hex = 0xf9488a }, + { c = colors.pink, hex = 0xff7fb8 }, + { c = colors.magenta, hex = 0xf980dd }, { c = colors.white, hex = 0xd9d9d9 }, { c = colors.lightGray, hex = 0x949494 }, { c = colors.gray, hex = 0x575757 }, @@ -93,6 +94,7 @@ local smooth_stone = { text = colors.black, text_inv = colors.white, label = colors.gray, + label_dark = colors.gray, disabled = colors.lightGray, bg = colors.lightGray, accent_light = colors.white, @@ -142,6 +144,8 @@ style.hc_text = cpair(style.theme.text, style.theme.text_inv) style.text_colors = cpair(style.theme.text, style.theme.bg) -- label & unit colors style.lu_colors = cpair(style.theme.label, style.theme.label) +-- label & unit colors (darker if set) +style.lu_colors_dark = cpair(style.theme.label_dark, style.theme.label_dark) -- COMMON COLOR PAIRS -- From 45881067dff687cffa96aac264a0e136a70e7cae Mon Sep 17 00:00:00 2001 From: Mikayla Fischler Date: Sat, 24 Feb 2024 18:01:30 -0500 Subject: [PATCH 04/44] fixed extra space in RCS indicator list --- coordinator/ui/components/unit_detail.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/coordinator/ui/components/unit_detail.lua b/coordinator/ui/components/unit_detail.lua index 3c80020..363470e 100644 --- a/coordinator/ui/components/unit_detail.lua +++ b/coordinator/ui/components/unit_detail.lua @@ -261,9 +261,9 @@ local function init(parent, id) -- boiler annunciator panel(s) - if available_space > 0 then _add_space() end - if unit.num_boilers > 0 then + if available_space > 0 then _add_space() end + TextBox{parent=rcs_tags,x=1,text="B1",width=2,height=1,fg_bg=hc_text} local b1_wll = IndicatorLight{parent=rcs_annunc,label="Water Level Low",colors=ind_red} b1_wll.register(b_ps[1], "WaterLevelLow", b1_wll.update) From a4214e8a4fb9e666205861d451b77a49e3864f06 Mon Sep 17 00:00:00 2001 From: Mikayla Fischler Date: Sat, 24 Feb 2024 19:34:43 -0500 Subject: [PATCH 05/44] #405 fixed waste line still always being black and removed colormap test --- coordinator/ui/components/unit_flow.lua | 8 +++++--- coordinator/ui/layout/main_view.lua | 5 ----- 2 files changed, 5 insertions(+), 8 deletions(-) diff --git a/coordinator/ui/components/unit_flow.lua b/coordinator/ui/components/unit_flow.lua index 577314a..e0c1519 100644 --- a/coordinator/ui/components/unit_flow.lua +++ b/coordinator/ui/components/unit_flow.lua @@ -149,6 +149,8 @@ local function make(parent, x, y, wide, unit) local waste = Div{parent=root,x=3,y=6} + local waste_c = style.theme.fuel_color + local waste_pipes = { pipe(0, 0, _wide(19, 16), 1, colors.brown, true), pipe(_wide(14, 13), 1, _wide(19, 17), 5, colors.brown, true), @@ -162,9 +164,9 @@ local function make(parent, x, y, wide, unit) pipe(_wide(74, 63), 4, _wide(95, 81), 4, colors.cyan, true), pipe(_wide(74, 63), 8, _wide(133, 111), 8, colors.cyan, true), - pipe(_wide(108, 94), 1, _wide(132, 110), 6, colors.black, true, true), - pipe(_wide(108, 94), 4, _wide(111, 95), 1, colors.black, true, true), - pipe(_wide(132, 110), 6, _wide(130, 108), 6, colors.black, true, true) + pipe(_wide(108, 94), 1, _wide(132, 110), 6, waste_c, true, true), + pipe(_wide(108, 94), 4, _wide(111, 95), 1, waste_c, true, true), + pipe(_wide(132, 110), 6, _wide(130, 108), 6, waste_c, true, true) } PipeNetwork{parent=waste,x=1,y=1,pipes=waste_pipes,bg=style.theme.bg} diff --git a/coordinator/ui/layout/main_view.lua b/coordinator/ui/layout/main_view.lua index 08254a0..9598e42 100644 --- a/coordinator/ui/layout/main_view.lua +++ b/coordinator/ui/layout/main_view.lua @@ -12,7 +12,6 @@ local unit_overview = require("coordinator.ui.components.unit_overview") local core = require("graphics.core") -local ColorMap = require("graphics.elements.colormap") local TextBox = require("graphics.elements.textbox") local DataIndicator = require("graphics.elements.indicators.data") @@ -69,10 +68,6 @@ local function init(main) -- command & control - ColorMap{parent=main,y=cnc_y_start+2} - - cnc_y_start = cnc_y_start - -- induction matrix and process control interfaces are 24 tall + space needed for divider local cnc_bottom_align_start = main.get_height() - 26 From 6ef049baa187a4cf8abc601517798ac716525c4d Mon Sep 17 00:00:00 2001 From: Mikayla Fischler Date: Sun, 25 Feb 2024 13:09:30 -0500 Subject: [PATCH 06/44] #405 reverted yellow, desaturated orange --- coordinator/ui/style.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/coordinator/ui/style.lua b/coordinator/ui/style.lua index 1703acc..1861407 100644 --- a/coordinator/ui/style.lua +++ b/coordinator/ui/style.lua @@ -71,8 +71,8 @@ local deepslate = { colors = { { c = colors.red, hex = 0xeb6a6c }, - { c = colors.orange, hex = 0xffbb65 }, - { c = colors.yellow, hex = 0xeae175 }, + { c = colors.orange, hex = 0xf2b86c }, + { c = colors.yellow, hex = 0xd9cf81 }, { c = colors.lime, hex = 0x80ff80 }, { c = colors.green, hex = 0x70e19b }, { c = colors.cyan, hex = 0x7ccdd0 }, From dbc1f41c5deeb9be3b2075d52062ff14db375748 Mon Sep 17 00:00:00 2001 From: Mikayla Fischler Date: Sun, 25 Feb 2024 15:53:14 -0500 Subject: [PATCH 07/44] #406 bounds check all controls --- graphics/core.lua | 2 +- graphics/elements/controls/hazard_button.lua | 26 +++++++++---------- graphics/elements/controls/radio_button.lua | 3 ++- .../elements/controls/spinbox_numeric.lua | 25 +++++++++--------- graphics/elements/controls/switch_button.lua | 2 +- graphics/elements/controls/tabbar.lua | 2 +- graphics/elements/form/number_field.lua | 4 +-- graphics/elements/form/text_field.lua | 4 +-- 8 files changed, 33 insertions(+), 35 deletions(-) diff --git a/graphics/core.lua b/graphics/core.lua index d601bb3..e2587fc 100644 --- a/graphics/core.lua +++ b/graphics/core.lua @@ -7,7 +7,7 @@ local flasher = require("graphics.flasher") local core = {} -core.version = "2.2.0" +core.version = "2.2.1" core.flasher = flasher core.events = events diff --git a/graphics/elements/controls/hazard_button.lua b/graphics/elements/controls/hazard_button.lua index 9a0e621..7c2306f 100644 --- a/graphics/elements/controls/hazard_button.lua +++ b/graphics/elements/controls/hazard_button.lua @@ -138,23 +138,21 @@ local function hazard_button(args) -- handle mouse interaction ---@param event mouse_interaction mouse event function e.handle_mouse(event) - if e.enabled then - if core.events.was_clicked(event.type) then - -- change text color to indicate clicked - e.w_set_fgd(args.accent) - e.w_set_cur(3, 2) - e.w_write(args.text) + if e.enabled and core.events.was_clicked(event.type) and e.in_frame_bounds(event.current.x, event.current.y) then + -- change text color to indicate clicked + e.w_set_fgd(args.accent) + e.w_set_cur(3, 2) + e.w_write(args.text) - -- abort any other callbacks - tcd.abort(on_timeout) - tcd.abort(on_success) - tcd.abort(on_failure) + -- abort any other callbacks + tcd.abort(on_timeout) + tcd.abort(on_success) + tcd.abort(on_failure) - -- 1.5 second timeout - tcd.dispatch(1.5, on_timeout) + -- 1.5 second timeout + tcd.dispatch(1.5, on_timeout) - args.callback() - end + args.callback() end end diff --git a/graphics/elements/controls/radio_button.lua b/graphics/elements/controls/radio_button.lua index aee7060..be9b1ee 100644 --- a/graphics/elements/controls/radio_button.lua +++ b/graphics/elements/controls/radio_button.lua @@ -90,7 +90,8 @@ local function radio_button(args) -- handle mouse interaction ---@param event mouse_interaction mouse event function e.handle_mouse(event) - if e.enabled and core.events.was_clicked(event.type) and (event.initial.y == event.current.y) then + if e.enabled and core.events.was_clicked(event.type) and + (event.initial.y == event.current.y) and e.in_frame_bounds(event.current.x, event.current.y) then -- determine what was pressed if args.options[event.current.y] ~= nil then e.value = event.current.y diff --git a/graphics/elements/controls/spinbox_numeric.lua b/graphics/elements/controls/spinbox_numeric.lua index 90edf18..e114c6a 100644 --- a/graphics/elements/controls/spinbox_numeric.lua +++ b/graphics/elements/controls/spinbox_numeric.lua @@ -127,20 +127,19 @@ local function spinbox(args) ---@param event mouse_interaction mouse event function e.handle_mouse(event) -- only handle if on an increment or decrement arrow - if e.enabled and core.events.was_clicked(event.type) and - (event.current.x ~= dec_point_x) and (event.current.y ~= 2) then - if event.current.x == event.initial.x and event.current.y == event.initial.y then - local idx = util.trinary(event.current.x > dec_point_x, event.current.x - 1, event.current.x) - if digits[idx] ~= nil then - if event.current.y == 1 then - digits[idx] = digits[idx] + 1 - elseif event.current.y == 3 then - digits[idx] = digits[idx] - 1 - end - - update_value() - show_num() + if e.enabled and core.events.was_clicked(event.type) and e.in_frame_bounds(event.current.x, event.current.y) and + (event.current.x ~= dec_point_x) and (event.current.y ~= 2) and + (event.current.x == event.initial.x) and (event.current.y == event.initial.y) then + local idx = util.trinary(event.current.x > dec_point_x, event.current.x - 1, event.current.x) + if digits[idx] ~= nil then + if event.current.y == 1 then + digits[idx] = digits[idx] + 1 + elseif event.current.y == 3 then + digits[idx] = digits[idx] - 1 end + + update_value() + show_num() end end end diff --git a/graphics/elements/controls/switch_button.lua b/graphics/elements/controls/switch_button.lua index f649b10..ac44ca6 100644 --- a/graphics/elements/controls/switch_button.lua +++ b/graphics/elements/controls/switch_button.lua @@ -58,7 +58,7 @@ local function switch_button(args) -- handle mouse interaction ---@param event mouse_interaction mouse event function e.handle_mouse(event) - if e.enabled and core.events.was_clicked(event.type) then + if e.enabled and core.events.was_clicked(event.type) and e.in_frame_bounds(event.current.x, event.current.y) then e.value = not e.value e.redraw() args.callback(e.value) diff --git a/graphics/elements/controls/tabbar.lua b/graphics/elements/controls/tabbar.lua index 9b604e1..c76781b 100644 --- a/graphics/elements/controls/tabbar.lua +++ b/graphics/elements/controls/tabbar.lua @@ -98,7 +98,7 @@ local function tabbar(args) ---@param event mouse_interaction mouse event function e.handle_mouse(event) -- determine what was pressed - if e.enabled and core.events.was_clicked(event.type) then + if e.enabled and core.events.was_clicked(event.type) and e.in_frame_bounds(event.current.x, event.current.y) then -- a button may have been pressed, which one was it? local tab_ini = which_tab(event.initial.x) local tab_cur = which_tab(event.current.x) diff --git a/graphics/elements/form/number_field.lua b/graphics/elements/form/number_field.lua index 66731ad..ef383ce 100644 --- a/graphics/elements/form/number_field.lua +++ b/graphics/elements/form/number_field.lua @@ -53,11 +53,11 @@ local function number_field(args) ---@param event mouse_interaction mouse event function e.handle_mouse(event) -- only handle if on an increment or decrement arrow - if e.enabled then + if e.enabled and e.in_frame_bounds(event.current.x, event.current.y) then if core.events.was_clicked(event.type) then e.take_focus() - if event.type == MOUSE_CLICK.UP and e.in_frame_bounds(event.current.x, event.current.y) then + if event.type == MOUSE_CLICK.UP then ifield.move_cursor(event.current.x) end elseif event.type == MOUSE_CLICK.DOUBLE_CLICK then diff --git a/graphics/elements/form/text_field.lua b/graphics/elements/form/text_field.lua index 843ec24..f912b9e 100644 --- a/graphics/elements/form/text_field.lua +++ b/graphics/elements/form/text_field.lua @@ -41,11 +41,11 @@ local function text_field(args) ---@param event mouse_interaction mouse event function e.handle_mouse(event) -- only handle if on an increment or decrement arrow - if e.enabled then + if e.enabled and e.in_frame_bounds(event.current.x, event.current.y) then if core.events.was_clicked(event.type) then e.take_focus() - if event.type == MOUSE_CLICK.UP and e.in_frame_bounds(event.current.x, event.current.y) then + if event.type == MOUSE_CLICK.UP then ifield.move_cursor(event.current.x) end elseif event.type == MOUSE_CLICK.DOUBLE_CLICK then From a318ffb2833ac73ebd53473610ee4c6044a4df0b Mon Sep 17 00:00:00 2001 From: Mikayla Fischler Date: Tue, 5 Mar 2024 10:51:18 -0500 Subject: [PATCH 08/44] #405 styling improvements to PLC front panel --- reactor-plc/panel/front_panel.lua | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/reactor-plc/panel/front_panel.lua b/reactor-plc/panel/front_panel.lua index 41737e8..18c9cca 100644 --- a/reactor-plc/panel/front_panel.lua +++ b/reactor-plc/panel/front_panel.lua @@ -95,8 +95,8 @@ local function init(panel) local status_trip = Div{parent=status_trip_rct,width=18,height=1,fg_bg=cpair(colors.black,colors.lightGray)} local scram = LED{parent=status_trip,width=10,label="RPS TRIP",colors=ind_red,flash=true,period=flasher.PERIOD.BLINK_250_MS} - local controls_rct = Rectangle{parent=status,width=17,height=3,x=1,border=border(1,colors.white,true),even_inner=true,fg_bg=cpair(colors.black,colors.ivory)} - local controls = Div{parent=controls_rct,width=15,height=1,fg_bg=cpair(colors.black,colors.white)} + local controls_rct = Rectangle{parent=status,width=17,height=3,x=1,border=border(1,colors.lightGray,true),even_inner=true,fg_bg=cpair(colors.black,colors.ivory)} + local controls = Div{parent=controls_rct,width=15,height=1,fg_bg=cpair(colors.black,colors.lightGray)} PushButton{parent=controls,x=1,y=1,min_width=7,text="SCRAM",callback=databus.rps_scram,fg_bg=cpair(colors.black,colors.red),active_fg_bg=cpair(colors.black,colors.red_off)} PushButton{parent=controls,x=9,y=1,min_width=7,text="RESET",callback=databus.rps_reset,fg_bg=cpair(colors.black,colors.yellow),active_fg_bg=cpair(colors.black,colors.yellow_off)} @@ -107,9 +107,9 @@ local function init(panel) -- about footer -- - local about = Rectangle{parent=panel,width=32,height=3,x=2,y=16,border=border(1,colors.ivory),thin=true,fg_bg=cpair(colors.black,colors.white)} - local fw_v = TextBox{parent=about,x=2,y=1,text="FW: v00.00.00",alignment=ALIGN.LEFT,height=1} - local comms_v = TextBox{parent=about,x=17,y=1,text="NT: v00.00.00",alignment=ALIGN.LEFT,height=1} + local about = Div{parent=panel,width=15,height=3,x=1,y=18,fg_bg=cpair(colors.lightGray,colors.ivory)} + local fw_v = TextBox{parent=about,x=1,y=1,text="FW: v00.00.00",alignment=ALIGN.LEFT,height=1} + local comms_v = TextBox{parent=about,x=1,y=2,text="NT: v00.00.00",alignment=ALIGN.LEFT,height=1} fw_v.register(databus.ps, "version", function (version) fw_v.set_value(util.c("FW: ", version)) end) comms_v.register(databus.ps, "comms_version", function (version) comms_v.set_value(util.c("NT: v", version)) end) From fc198cd9d2398b84794fb74c6a897e4e58c51a53 Mon Sep 17 00:00:00 2001 From: Mikayla Fischler Date: Wed, 6 Mar 2024 11:43:31 -0500 Subject: [PATCH 09/44] #405 supervisor and coordinator front panel themes --- coordinator/renderer.lua | 10 +- coordinator/startup.lua | 2 +- coordinator/ui/components/pkt_entry.lua | 20 ++-- coordinator/ui/layout/front_panel.lua | 14 +-- coordinator/ui/style.lua | 127 ++++++++-------------- graphics/themes.lua | 114 +++++++++++++++++++ supervisor/panel/components/pdg_entry.lua | 20 ++-- supervisor/panel/components/rtu_entry.lua | 22 ++-- supervisor/panel/front_panel.lua | 56 +++++----- supervisor/panel/style.lua | 46 +------- supervisor/renderer.lua | 12 +- supervisor/startup.lua | 2 +- 12 files changed, 249 insertions(+), 196 deletions(-) create mode 100644 graphics/themes.lua diff --git a/coordinator/renderer.lua b/coordinator/renderer.lua index c926b2e..c05afee 100644 --- a/coordinator/renderer.lua +++ b/coordinator/renderer.lua @@ -97,8 +97,8 @@ function renderer.init_displays() term.setCursorPos(1, 1) -- set overridden colors - for i = 1, #style.fp.colors do - term.setPaletteColor(style.fp.colors[i].c, style.fp.colors[i].hex) + for i = 1, #style.fp_theme.colors do + term.setPaletteColor(style.fp_theme.colors[i].c, style.fp_theme.colors[i].hex) end end @@ -152,9 +152,9 @@ function renderer.close_fp() engine.fp_ready = false -- restore colors - for i = 1, #style.theme.colors do - local r, g, b = term.nativePaletteColor(style.theme.colors[i].c) - term.setPaletteColor(style.theme.colors[i].c, r, g, b) + for i = 1, #style.fp_theme.colors do + local r, g, b = term.nativePaletteColor(style.fp_theme.colors[i].c) + term.setPaletteColor(style.fp_theme.colors[i].c, r, g, b) end -- reset terminal diff --git a/coordinator/startup.lua b/coordinator/startup.lua index 10294f8..45583b9 100644 --- a/coordinator/startup.lua +++ b/coordinator/startup.lua @@ -22,7 +22,7 @@ local sounder = require("coordinator.sounder") local apisessions = require("coordinator.session.apisessions") -local COORDINATOR_VERSION = "v1.2.11" +local COORDINATOR_VERSION = "v1.2.12" local CHUNK_LOAD_DELAY_S = 30.0 diff --git a/coordinator/ui/components/pkt_entry.lua b/coordinator/ui/components/pkt_entry.lua index d6ba4be..42f19a4 100644 --- a/coordinator/ui/components/pkt_entry.lua +++ b/coordinator/ui/components/pkt_entry.lua @@ -17,8 +17,10 @@ local ALIGN = core.ALIGN local cpair = core.cpair -local text_fg_bg = style.text_colors -local lg_wh = style.lg_white +local s_hi_box = style.fp_theme.highlight_box +local s_hi_bright = style.fp_theme.highlight_box_bright + +local label_fg = style.fp.label_fg -- create a pocket list entry ---@param parent graphics_element parent @@ -28,22 +30,22 @@ local function init(parent, id) -- root div local root = Div{parent=parent,x=2,y=2,height=4,width=parent.get_width()-2,hidden=true} - local entry = Div{parent=root,x=2,y=1,height=3,fg_bg=style.bw_fg_bg} + local entry = Div{parent=root,x=2,y=1,height=3,fg_bg=s_hi_bright} local ps_prefix = "pkt_" .. id .. "_" - TextBox{parent=entry,x=1,y=1,text="",width=8,height=1,fg_bg=text_fg_bg} - local pkt_addr = TextBox{parent=entry,x=1,y=2,text="@ C ??",alignment=ALIGN.CENTER,width=8,height=1,fg_bg=text_fg_bg,nav_active=cpair(colors.gray,colors.black)} - TextBox{parent=entry,x=1,y=3,text="",width=8,height=1,fg_bg=text_fg_bg} + TextBox{parent=entry,x=1,y=1,text="",width=8,height=1,fg_bg=s_hi_box} + local pkt_addr = TextBox{parent=entry,x=1,y=2,text="@ C ??",alignment=ALIGN.CENTER,width=8,height=1,fg_bg=s_hi_box,nav_active=cpair(colors.gray,colors.black)} + TextBox{parent=entry,x=1,y=3,text="",width=8,height=1,fg_bg=s_hi_box} pkt_addr.register(ps, ps_prefix .. "addr", pkt_addr.set_value) TextBox{parent=entry,x=10,y=2,text="FW:",width=3,height=1} - local pkt_fw_v = TextBox{parent=entry,x=14,y=2,text=" ------- ",width=20,height=1,fg_bg=lg_wh} + local pkt_fw_v = TextBox{parent=entry,x=14,y=2,text=" ------- ",width=20,height=1,fg_bg=label_fg} pkt_fw_v.register(ps, ps_prefix .. "fw", pkt_fw_v.set_value) TextBox{parent=entry,x=35,y=2,text="RTT:",width=4,height=1} - local pkt_rtt = DataIndicator{parent=entry,x=40,y=2,label="",unit="",format="%5d",value=0,width=5,fg_bg=lg_wh} - TextBox{parent=entry,x=46,y=2,text="ms",width=4,height=1,fg_bg=lg_wh} + local pkt_rtt = DataIndicator{parent=entry,x=40,y=2,label="",unit="",format="%5d",value=0,width=5,fg_bg=label_fg} + TextBox{parent=entry,x=46,y=2,text="ms",width=4,height=1,fg_bg=label_fg} pkt_rtt.register(ps, ps_prefix .. "rtt", pkt_rtt.update) pkt_rtt.register(ps, ps_prefix .. "rtt_color", pkt_rtt.recolor) diff --git a/coordinator/ui/layout/front_panel.lua b/coordinator/ui/layout/front_panel.lua index ffd2a09..d2eb8ff 100644 --- a/coordinator/ui/layout/front_panel.lua +++ b/coordinator/ui/layout/front_panel.lua @@ -36,7 +36,7 @@ local led_grn = style.led_grn local function init(panel, num_units) local ps = iocontrol.get_db().fp.ps - TextBox{parent=panel,y=1,text="SCADA COORDINATOR",alignment=ALIGN.CENTER,height=1,fg_bg=style.fp.header} + TextBox{parent=panel,y=1,text="SCADA COORDINATOR",alignment=ALIGN.CENTER,height=1,fg_bg=style.fp_theme.header} local page_div = Div{parent=panel,x=1,y=3} @@ -68,7 +68,7 @@ local function init(panel, num_units) ---@diagnostic disable-next-line: undefined-field local comp_id = util.sprintf("(%d)", os.getComputerID()) - TextBox{parent=system,x=9,y=4,width=6,height=1,text=comp_id,fg_bg=style.fp_label} + TextBox{parent=system,x=9,y=4,width=6,height=1,text=comp_id,fg_bg=style.fp.disabled_fg} local monitors = Div{parent=main_page,width=16,height=17,x=18,y=2} @@ -89,7 +89,7 @@ local function init(panel, num_units) -- about footer -- - local about = Div{parent=main_page,width=15,height=3,x=1,y=16,fg_bg=style.fp_label} + local about = Div{parent=main_page,width=15,height=3,x=1,y=16,fg_bg=style.fp.disabled_fg} local fw_v = TextBox{parent=about,x=1,y=1,text="FW: v00.00.00",alignment=ALIGN.LEFT,height=1} local comms_v = TextBox{parent=about,x=1,y=2,text="NT: v00.00.00",alignment=ALIGN.LEFT,height=1} @@ -103,7 +103,7 @@ local function init(panel, num_units) -- API page local api_page = Div{parent=page_div,x=1,y=1,hidden=true} - local api_list = ListBox{parent=api_page,x=1,y=1,height=17,width=51,scroll_height=1000,fg_bg=style.fp_text,nav_fg_bg=cpair(colors.gray,colors.lightGray),nav_active=cpair(colors.black,colors.gray)} + local api_list = ListBox{parent=api_page,x=1,y=1,height=17,width=51,scroll_height=1000,fg_bg=style.fp.text_fg,nav_fg_bg=cpair(colors.gray,colors.lightGray),nav_active=cpair(colors.black,colors.gray)} local _ = Div{parent=api_list,height=1,hidden=true} -- padding -- assemble page panes @@ -113,11 +113,11 @@ local function init(panel, num_units) local page_pane = MultiPane{parent=page_div,x=1,y=1,panes=panes} local tabs = { - { name = "CRD", color = style.fp_text }, - { name = "API", color = style.fp_text }, + { name = "CRD", color = style.fp.text }, + { name = "API", color = style.fp.text }, } - TabBar{parent=panel,y=2,tabs=tabs,min_width=9,callback=page_pane.set_value,fg_bg=style.bw_fg_bg} + TabBar{parent=panel,y=2,tabs=tabs,min_width=9,callback=page_pane.set_value,fg_bg=style.fp_theme.highlight_box_bright} -- link pocket API list management to PGI pgi.link_elements(api_list, pkt_entry) diff --git a/coordinator/ui/style.lua b/coordinator/ui/style.lua index 1861407..baad776 100644 --- a/coordinator/ui/style.lua +++ b/coordinator/ui/style.lua @@ -2,94 +2,24 @@ -- Graphics Style Options -- -local core = require("graphics.core") +local core = require("graphics.core") +local themes = require("graphics.themes") ---@class crd_style local style = {} local cpair = core.cpair --- GLOBAL -- - --- add color mappings for front panel -colors.ivory = colors.pink -colors.yellow_hc = colors.purple -colors.red_off = colors.brown -colors.yellow_off = colors.magenta -colors.green_off = colors.lime - -- front panel styling -style.fp = {} +style.fp_theme = themes.sandstone +style.fp = themes.get_fp_style(style.fp_theme) -style.fp.root = cpair(colors.black, colors.ivory) -style.fp.header = cpair(colors.black, colors.lightGray) - -style.fp.colors = { - { c = colors.red, hex = 0xdf4949 }, -- RED ON - { c = colors.orange, hex = 0xffb659 }, - { c = colors.yellow, hex = 0xf9fb53 }, -- YELLOW ON - { c = colors.lime, hex = 0x16665a }, -- GREEN OFF - { c = colors.green, hex = 0x6be551 }, -- GREEN ON - { c = colors.cyan, hex = 0x34bac8 }, - { c = colors.lightBlue, hex = 0x6cc0f2 }, - { c = colors.blue, hex = 0x0096ff }, - { c = colors.purple, hex = 0xb156ee }, -- YELLOW HIGH CONTRAST - { c = colors.pink, hex = 0xdcd9ca }, -- IVORY - { c = colors.magenta, hex = 0x85862c }, -- YELLOW OFF - -- { c = colors.white, hex = 0xdcd9ca }, - { c = colors.lightGray, hex = 0xb1b8b3 }, - { c = colors.gray, hex = 0x575757 }, - -- { c = colors.black, hex = 0x191919 }, - { c = colors.brown, hex = 0x672223 } -- RED OFF -} +style.led_grn = cpair(colors.green, colors.green_off) -- main GUI styling ---@class theme -local deepslate = { - text = colors.white, - text_inv = colors.black, - label = colors.lightGray, - label_dark = colors.gray, - disabled = colors.gray, - bg = colors.black, - accent_light = colors.gray, - accent_dark = colors.lightGray, - - fuel_color = colors.lightGray, - - header = cpair(colors.white, colors.gray), - - text_fg = cpair(colors.white, colors._INHERIT), - label_fg = cpair(colors.lightGray, colors._INHERIT), - disabled_fg = cpair(colors.gray, colors._INHERIT), - - highlight_box = cpair(colors.white, colors.gray), - highlight_box_bright = cpair(colors.black, colors.lightGray), - field_box = cpair(colors.white, colors.gray), - - colors = { - { c = colors.red, hex = 0xeb6a6c }, - { c = colors.orange, hex = 0xf2b86c }, - { c = colors.yellow, hex = 0xd9cf81 }, - { c = colors.lime, hex = 0x80ff80 }, - { c = colors.green, hex = 0x70e19b }, - { c = colors.cyan, hex = 0x7ccdd0 }, - { c = colors.lightBlue, hex = 0x99ceef }, - { c = colors.blue, hex = 0x60bcff }, - { c = colors.purple, hex = 0xc38aea }, - { c = colors.pink, hex = 0xff7fb8 }, - { c = colors.magenta, hex = 0xf980dd }, - { c = colors.white, hex = 0xd9d9d9 }, - { c = colors.lightGray, hex = 0x949494 }, - { c = colors.gray, hex = 0x575757 }, - { c = colors.black, hex = 0x262626 }, - { c = colors.brown, hex = 0xb18f6a } - } -} - ----@type theme local smooth_stone = { text = colors.black, text_inv = colors.white, @@ -132,6 +62,49 @@ local smooth_stone = { } } +---@type theme +local deepslate = { + text = colors.white, + text_inv = colors.black, + label = colors.lightGray, + label_dark = colors.gray, + disabled = colors.gray, + bg = colors.black, + accent_light = colors.gray, + accent_dark = colors.lightGray, + + fuel_color = colors.lightGray, + + header = cpair(colors.white, colors.gray), + + text_fg = cpair(colors.white, colors._INHERIT), + label_fg = cpair(colors.lightGray, colors._INHERIT), + disabled_fg = cpair(colors.gray, colors._INHERIT), + + highlight_box = cpair(colors.white, colors.gray), + highlight_box_bright = cpair(colors.black, colors.lightGray), + field_box = cpair(colors.white, colors.gray), + + colors = { + { c = colors.red, hex = 0xeb6a6c }, + { c = colors.orange, hex = 0xf2b86c }, + { c = colors.yellow, hex = 0xd9cf81 }, + { c = colors.lime, hex = 0x80ff80 }, + { c = colors.green, hex = 0x70e19b }, + { c = colors.cyan, hex = 0x7ccdd0 }, + { c = colors.lightBlue, hex = 0x99ceef }, + { c = colors.blue, hex = 0x60bcff }, + { c = colors.purple, hex = 0xc38aea }, + { c = colors.pink, hex = 0xff7fb8 }, + { c = colors.magenta, hex = 0xf980dd }, + { c = colors.white, hex = 0xd9d9d9 }, + { c = colors.lightGray, hex = 0x949494 }, + { c = colors.gray, hex = 0x575757 }, + { c = colors.black, hex = 0x262626 }, + { c = colors.brown, hex = 0xb18f6a } + } +} + style.theme = deepslate -- style.theme = smooth_stone @@ -165,10 +138,6 @@ style.ind_yel = cpair(colors.yellow, colors.gray) style.ind_red = cpair(colors.red, colors.gray) style.ind_wht = style.wh_gray -style.fp_text = cpair(colors.black, colors.ivory) -style.fp_label = cpair(colors.lightGray, colors.ivory) -style.led_grn = cpair(colors.green, colors.green_off) - -- UI COMPONENTS -- style.reactor = { diff --git a/graphics/themes.lua b/graphics/themes.lua new file mode 100644 index 0000000..f5ba50e --- /dev/null +++ b/graphics/themes.lua @@ -0,0 +1,114 @@ +-- +-- Graphics Themes +-- + +local core = require("graphics.core") + +local cpair = core.cpair + +---@class graphics_themes +local themes = {} + +-- add color mappings for front panel +colors.ivory = colors.pink +colors.yellow_hc = colors.purple +colors.red_off = colors.brown +colors.yellow_off = colors.magenta +colors.green_off = colors.lime + +---@class fp_theme +themes.sandstone = { + text = colors.black, + label = colors.lightGray, + label_dark = colors.gray, + disabled = colors.lightGray, + bg = colors.ivory, + + header = cpair(colors.black, colors.lightGray), + + highlight_box = cpair(colors.black, colors.lightGray), + highlight_box_bright = cpair(colors.black, colors.white), + + colors = { + { c = colors.red, hex = 0xdf4949 }, -- RED ON + { c = colors.orange, hex = 0xffb659 }, + { c = colors.yellow, hex = 0xf9fb53 }, -- YELLOW ON + { c = colors.lime, hex = 0x16665a }, -- GREEN OFF + { c = colors.green, hex = 0x6be551 }, -- GREEN ON + { c = colors.cyan, hex = 0x34bac8 }, + { c = colors.lightBlue, hex = 0x6cc0f2 }, + { c = colors.blue, hex = 0x0096ff }, + { c = colors.purple, hex = 0xb156ee }, -- YELLOW HIGH CONTRAST + { c = colors.pink, hex = 0xdcd9ca }, -- IVORY + { c = colors.magenta, hex = 0x85862c }, -- YELLOW OFF + { c = colors.white, hex = 0xf0f0f0 }, + { c = colors.lightGray, hex = 0xb1b8b3 }, + { c = colors.gray, hex = 0x575757 }, + { c = colors.black, hex = 0x191919 }, + { c = colors.brown, hex = 0x672223 } -- RED OFF + } +} + +---@type fp_theme +themes.basalt = { + text = colors.white, + label = colors.gray, + label_dark = colors.ivory, + disabled = colors.lightGray, + bg = colors.ivory, + + header = cpair(colors.white, colors.gray), + + highlight_box = cpair(colors.white, colors.gray), + highlight_box_bright = cpair(colors.black, colors.lightGray), + + colors = { + { c = colors.red, hex = 0xdc6466 }, -- RED ON + { c = colors.orange, hex = 0xffb659 }, + { c = colors.yellow, hex = 0xebdf75 }, -- YELLOW ON + { c = colors.lime, hex = 0x496b41 }, -- GREEN OFF + { c = colors.green, hex = 0x81db6d }, -- GREEN ON + { c = colors.cyan, hex = 0x5ec7d1 }, + { c = colors.lightBlue, hex = 0x7dc6f2 }, + { c = colors.blue, hex = 0x56aae6 }, + { c = colors.purple, hex = 0xe9cd68 }, -- YELLOW HIGH CONTRAST + { c = colors.pink, hex = 0x4d4e52 }, -- IVORY + { c = colors.magenta, hex = 0x6b6c36 }, -- YELLOW OFF + { c = colors.white, hex = 0xbfbfbf }, + { c = colors.lightGray, hex = 0x848794 }, + { c = colors.gray, hex = 0x5c5f68 }, + { c = colors.black, hex = 0x262626 }, + { c = colors.brown, hex = 0x653839 } -- RED OFF + } +} + +-- get style fields for a front panel based on the provided theme +---@param theme fp_theme +function themes.get_fp_style(theme) + ---@class fp_style + local style = { + root = cpair(theme.text, theme.bg), + + text = cpair(theme.text, theme.bg), + text_fg = cpair(theme.text, colors._INHERIT), + + label_fg = cpair(theme.label, colors._INHERIT), + label_d_fg = cpair(theme.label_dark, colors._INHERIT), + + disabled_fg = cpair(theme.disabled, colors._INHERIT) + } + + return style +end + + + + + + + + + + + +return themes diff --git a/supervisor/panel/components/pdg_entry.lua b/supervisor/panel/components/pdg_entry.lua index 6cb07f7..7156285 100644 --- a/supervisor/panel/components/pdg_entry.lua +++ b/supervisor/panel/components/pdg_entry.lua @@ -17,8 +17,10 @@ local ALIGN = core.ALIGN local cpair = core.cpair -local black_lg = style.black_lg -local lg_white = style.lg_white +local s_hi_box = style.theme.highlight_box +local s_hi_bright = style.theme.highlight_box_bright + +local label_fg = style.fp.label_fg -- create a pocket diagnostics list entry ---@param parent graphics_element parent @@ -26,22 +28,22 @@ local lg_white = style.lg_white local function init(parent, id) -- root div local root = Div{parent=parent,x=2,y=2,height=4,width=parent.get_width()-2,hidden=true} - local entry = Div{parent=root,x=2,y=1,height=3,fg_bg=style.bw_fg_bg} + local entry = Div{parent=root,x=2,y=1,height=3,fg_bg=s_hi_bright} local ps_prefix = "pdg_" .. id .. "_" - TextBox{parent=entry,x=1,y=1,text="",width=8,height=1,fg_bg=black_lg} - local pdg_addr = TextBox{parent=entry,x=1,y=2,text="@ C ??",alignment=ALIGN.CENTER,width=8,height=1,fg_bg=black_lg,nav_active=cpair(colors.gray,colors.black)} - TextBox{parent=entry,x=1,y=3,text="",width=8,height=1,fg_bg=black_lg} + TextBox{parent=entry,x=1,y=1,text="",width=8,height=1,fg_bg=s_hi_box} + local pdg_addr = TextBox{parent=entry,x=1,y=2,text="@ C ??",alignment=ALIGN.CENTER,width=8,height=1,fg_bg=s_hi_box,nav_active=cpair(colors.gray,colors.black)} + TextBox{parent=entry,x=1,y=3,text="",width=8,height=1,fg_bg=s_hi_box} pdg_addr.register(databus.ps, ps_prefix .. "addr", pdg_addr.set_value) TextBox{parent=entry,x=10,y=2,text="FW:",width=3,height=1} - local pdg_fw_v = TextBox{parent=entry,x=14,y=2,text=" ------- ",width=20,height=1,fg_bg=lg_white} + local pdg_fw_v = TextBox{parent=entry,x=14,y=2,text=" ------- ",width=20,height=1,fg_bg=label_fg} pdg_fw_v.register(databus.ps, ps_prefix .. "fw", pdg_fw_v.set_value) TextBox{parent=entry,x=35,y=2,text="RTT:",width=4,height=1} - local pdg_rtt = DataIndicator{parent=entry,x=40,y=2,label="",unit="",format="%5d",value=0,width=5,fg_bg=lg_white} - TextBox{parent=entry,x=46,y=2,text="ms",width=4,height=1,fg_bg=lg_white} + local pdg_rtt = DataIndicator{parent=entry,x=40,y=2,label="",unit="",format="%5d",value=0,width=5,fg_bg=label_fg} + TextBox{parent=entry,x=46,y=2,text="ms",width=4,height=1,fg_bg=label_fg} pdg_rtt.register(databus.ps, ps_prefix .. "rtt", pdg_rtt.update) pdg_rtt.register(databus.ps, ps_prefix .. "rtt_color", pdg_rtt.recolor) diff --git a/supervisor/panel/components/rtu_entry.lua b/supervisor/panel/components/rtu_entry.lua index 240c596..518dfe9 100644 --- a/supervisor/panel/components/rtu_entry.lua +++ b/supervisor/panel/components/rtu_entry.lua @@ -17,8 +17,10 @@ local ALIGN = core.ALIGN local cpair = core.cpair -local black_lg = style.black_lg -local lg_white = style.lg_white +local s_hi_box = style.theme.highlight_box +local s_hi_bright = style.theme.highlight_box_bright + +local label_fg = style.fp.label_fg -- create an RTU list entry ---@param parent graphics_element parent @@ -26,26 +28,26 @@ local lg_white = style.lg_white local function init(parent, id) -- root div local root = Div{parent=parent,x=2,y=2,height=4,width=parent.get_width()-2,hidden=true} - local entry = Div{parent=root,x=2,y=1,height=3,fg_bg=style.bw_fg_bg} + local entry = Div{parent=root,x=2,y=1,height=3,fg_bg=s_hi_bright} local ps_prefix = "rtu_" .. id .. "_" - TextBox{parent=entry,x=1,y=1,text="",width=8,height=1,fg_bg=black_lg} - local rtu_addr = TextBox{parent=entry,x=1,y=2,text="@ C ??",alignment=ALIGN.CENTER,width=8,height=1,fg_bg=black_lg,nav_active=cpair(colors.gray,colors.black)} - TextBox{parent=entry,x=1,y=3,text="",width=8,height=1,fg_bg=black_lg} + TextBox{parent=entry,x=1,y=1,text="",width=8,height=1,fg_bg=s_hi_box} + local rtu_addr = TextBox{parent=entry,x=1,y=2,text="@ C ??",alignment=ALIGN.CENTER,width=8,height=1,fg_bg=s_hi_box,nav_active=cpair(colors.gray,colors.black)} + TextBox{parent=entry,x=1,y=3,text="",width=8,height=1,fg_bg=s_hi_box} rtu_addr.register(databus.ps, ps_prefix .. "addr", rtu_addr.set_value) TextBox{parent=entry,x=10,y=2,text="UNITS:",width=7,height=1} - local unit_count = DataIndicator{parent=entry,x=17,y=2,label="",unit="",format="%2d",value=0,width=2,fg_bg=style.gray_white} + local unit_count = DataIndicator{parent=entry,x=17,y=2,label="",unit="",format="%2d",value=0,width=2,fg_bg=style.fp.label_d_fg} unit_count.register(databus.ps, ps_prefix .. "units", unit_count.set_value) TextBox{parent=entry,x=21,y=2,text="FW:",width=3,height=1} - local rtu_fw_v = TextBox{parent=entry,x=25,y=2,text=" ------- ",width=9,height=1,fg_bg=lg_white} + local rtu_fw_v = TextBox{parent=entry,x=25,y=2,text=" ------- ",width=9,height=1,fg_bg=label_fg} rtu_fw_v.register(databus.ps, ps_prefix .. "fw", rtu_fw_v.set_value) TextBox{parent=entry,x=36,y=2,text="RTT:",width=4,height=1} - local rtu_rtt = DataIndicator{parent=entry,x=40,y=2,label="",unit="",format="%5d",value=0,width=5,fg_bg=lg_white} - TextBox{parent=entry,x=46,y=2,text="ms",width=4,height=1,fg_bg=lg_white} + local rtu_rtt = DataIndicator{parent=entry,x=40,y=2,label="",unit="",format="%5d",value=0,width=5,fg_bg=label_fg} + TextBox{parent=entry,x=46,y=2,text="ms",width=4,height=1,fg_bg=label_fg} rtu_rtt.register(databus.ps, ps_prefix .. "rtt", rtu_rtt.update) rtu_rtt.register(databus.ps, ps_prefix .. "rtt_color", rtu_rtt.recolor) diff --git a/supervisor/panel/front_panel.lua b/supervisor/panel/front_panel.lua index 8e37400..fccb5b0 100644 --- a/supervisor/panel/front_panel.lua +++ b/supervisor/panel/front_panel.lua @@ -29,18 +29,18 @@ local ALIGN = core.ALIGN local cpair = core.cpair -local bw_fg_bg = style.bw_fg_bg +local s_hi_box = style.theme.highlight_box +local s_hi_bright = style.theme.highlight_box_bright -local black_lg = style.black_lg -local lg_white = style.lg_white -local gry_wht = style.gray_white +local label_fg = style.fp.label_fg +local label_d_fg = style.fp.label_d_fg local ind_grn = style.ind_grn -- create new front panel view ---@param panel graphics_element main displaybox local function init(panel) - TextBox{parent=panel,y=1,text="SCADA SUPERVISOR",alignment=ALIGN.CENTER,height=1,fg_bg=style.header} + TextBox{parent=panel,y=1,text="SCADA SUPERVISOR",alignment=ALIGN.CENTER,height=1,fg_bg=style.theme.header} local page_div = Div{parent=panel,x=1,y=3} @@ -66,13 +66,13 @@ local function init(panel) ---@diagnostic disable-next-line: undefined-field local comp_id = util.sprintf("(%d)", os.getComputerID()) - TextBox{parent=system,x=9,y=4,width=6,height=1,text=comp_id,fg_bg=style.fp_label} + TextBox{parent=system,x=9,y=4,width=6,height=1,text=comp_id,fg_bg=style.fp.disabled_fg} -- -- about footer -- - local about = Div{parent=main_page,width=15,height=3,x=1,y=16,fg_bg=style.fp_label} + local about = Div{parent=main_page,width=15,height=3,x=1,y=16,fg_bg=style.fp.disabled_fg} local fw_v = TextBox{parent=about,x=1,y=1,text="FW: v00.00.00",alignment=ALIGN.LEFT,height=1} local comms_v = TextBox{parent=about,x=1,y=2,text="NT: v00.00.00",alignment=ALIGN.LEFT,height=1} @@ -90,25 +90,25 @@ local function init(panel) for i = 1, supervisor.config.UnitCount do local ps_prefix = "plc_" .. i .. "_" - local plc_entry = Div{parent=plc_list,height=3,fg_bg=bw_fg_bg} + local plc_entry = Div{parent=plc_list,height=3,fg_bg=s_hi_bright} - TextBox{parent=plc_entry,x=1,y=1,text="",width=8,height=1,fg_bg=black_lg} - TextBox{parent=plc_entry,x=1,y=2,text="UNIT "..i,alignment=ALIGN.CENTER,width=8,height=1,fg_bg=black_lg} - TextBox{parent=plc_entry,x=1,y=3,text="",width=8,height=1,fg_bg=black_lg} + TextBox{parent=plc_entry,x=1,y=1,text="",width=8,height=1,fg_bg=s_hi_box} + TextBox{parent=plc_entry,x=1,y=2,text="UNIT "..i,alignment=ALIGN.CENTER,width=8,height=1,fg_bg=s_hi_box} + TextBox{parent=plc_entry,x=1,y=3,text="",width=8,height=1,fg_bg=s_hi_box} local conn = LED{parent=plc_entry,x=10,y=2,label="LINK",colors=ind_grn} conn.register(databus.ps, ps_prefix .. "conn", conn.update) - local plc_addr = TextBox{parent=plc_entry,x=17,y=2,text=" --- ",width=5,height=1,fg_bg=gry_wht} + local plc_addr = TextBox{parent=plc_entry,x=17,y=2,text=" --- ",width=5,height=1,fg_bg=label_d_fg} plc_addr.register(databus.ps, ps_prefix .. "addr", plc_addr.set_value) TextBox{parent=plc_entry,x=23,y=2,text="FW:",width=3,height=1} - local plc_fw_v = TextBox{parent=plc_entry,x=27,y=2,text=" ------- ",width=9,height=1,fg_bg=lg_white} + local plc_fw_v = TextBox{parent=plc_entry,x=27,y=2,text=" ------- ",width=9,height=1,fg_bg=label_fg} plc_fw_v.register(databus.ps, ps_prefix .. "fw", plc_fw_v.set_value) TextBox{parent=plc_entry,x=37,y=2,text="RTT:",width=4,height=1} - local plc_rtt = DataIndicator{parent=plc_entry,x=42,y=2,label="",unit="",format="%4d",value=0,width=4,fg_bg=lg_white} - TextBox{parent=plc_entry,x=47,y=2,text="ms",width=4,height=1,fg_bg=lg_white} + local plc_rtt = DataIndicator{parent=plc_entry,x=42,y=2,label="",unit="",format="%4d",value=0,width=4,fg_bg=label_fg} + TextBox{parent=plc_entry,x=47,y=2,text="ms",width=4,height=1,fg_bg=label_fg} plc_rtt.register(databus.ps, ps_prefix .. "rtt", plc_rtt.update) plc_rtt.register(databus.ps, ps_prefix .. "rtt_color", plc_rtt.recolor) @@ -124,29 +124,29 @@ local function init(panel) -- coordinator page local crd_page = Div{parent=page_div,x=1,y=1,hidden=true} - local crd_box = Div{parent=crd_page,x=2,y=2,width=49,height=4,fg_bg=bw_fg_bg} + local crd_box = Div{parent=crd_page,x=2,y=2,width=49,height=4,fg_bg=s_hi_bright} local crd_conn = LED{parent=crd_box,x=2,y=2,label="CONNECTION",colors=ind_grn} crd_conn.register(databus.ps, "crd_conn", crd_conn.update) - TextBox{parent=crd_box,x=4,y=3,text="COMPUTER",width=8,height=1,fg_bg=gry_wht} - local crd_addr = TextBox{parent=crd_box,x=13,y=3,text="---",width=5,height=1,fg_bg=gry_wht} + TextBox{parent=crd_box,x=4,y=3,text="COMPUTER",width=8,height=1,fg_bg=label_d_fg} + local crd_addr = TextBox{parent=crd_box,x=13,y=3,text="---",width=5,height=1,fg_bg=label_d_fg} crd_addr.register(databus.ps, "crd_addr", crd_addr.set_value) TextBox{parent=crd_box,x=22,y=2,text="FW:",width=3,height=1} - local crd_fw_v = TextBox{parent=crd_box,x=26,y=2,text=" ------- ",width=9,height=1,fg_bg=lg_white} + local crd_fw_v = TextBox{parent=crd_box,x=26,y=2,text=" ------- ",width=9,height=1,fg_bg=label_fg} crd_fw_v.register(databus.ps, "crd_fw", crd_fw_v.set_value) TextBox{parent=crd_box,x=36,y=2,text="RTT:",width=4,height=1} - local crd_rtt = DataIndicator{parent=crd_box,x=41,y=2,label="",unit="",format="%5d",value=0,width=5,fg_bg=lg_white} - TextBox{parent=crd_box,x=47,y=2,text="ms",width=4,height=1,fg_bg=lg_white} + local crd_rtt = DataIndicator{parent=crd_box,x=41,y=2,label="",unit="",format="%5d",value=0,width=5,fg_bg=label_fg} + TextBox{parent=crd_box,x=47,y=2,text="ms",width=4,height=1,fg_bg=label_fg} crd_rtt.register(databus.ps, "crd_rtt", crd_rtt.update) crd_rtt.register(databus.ps, "crd_rtt_color", crd_rtt.recolor) -- pocket diagnostics page local pkt_page = Div{parent=page_div,x=1,y=1,hidden=true} - local pdg_list = ListBox{parent=pkt_page,x=1,y=1,height=17,width=51,scroll_height=1000,fg_bg=cpair(colors.black,colors.ivory),nav_fg_bg=cpair(colors.gray,colors.lightGray),nav_active=cpair(colors.black,colors.gray)} + local pdg_list = ListBox{parent=pkt_page,x=1,y=1,height=17,width=51,scroll_height=1000,fg_bg=style.fp.text_fg,nav_fg_bg=cpair(colors.gray,colors.lightGray),nav_active=cpair(colors.black,colors.gray)} local _ = Div{parent=pdg_list,height=1,hidden=true} -- padding -- assemble page panes @@ -156,14 +156,14 @@ local function init(panel) local page_pane = MultiPane{parent=page_div,x=1,y=1,panes=panes} local tabs = { - { name = "SVR", color = cpair(colors.black, colors.ivory) }, - { name = "PLC", color = cpair(colors.black, colors.ivory) }, - { name = "RTU", color = cpair(colors.black, colors.ivory) }, - { name = "CRD", color = cpair(colors.black, colors.ivory) }, - { name = "PKT", color = cpair(colors.black, colors.ivory) }, + { name = "SVR", color = style.fp.text }, + { name = "PLC", color = style.fp.text }, + { name = "RTU", color = style.fp.text }, + { name = "CRD", color = style.fp.text }, + { name = "PKT", color = style.fp.text }, } - TabBar{parent=panel,y=2,tabs=tabs,min_width=9,callback=page_pane.set_value,fg_bg=bw_fg_bg} + TabBar{parent=panel,y=2,tabs=tabs,min_width=9,callback=page_pane.set_value,fg_bg=style.theme.highlight_box_bright} -- link RTU/PDG list management to PGI pgi.link_elements(rtu_list, rtu_entry, pdg_list, pdg_entry) diff --git a/supervisor/panel/style.lua b/supervisor/panel/style.lua index 49bfb4f..7237bfb 100644 --- a/supervisor/panel/style.lua +++ b/supervisor/panel/style.lua @@ -2,52 +2,16 @@ -- Graphics Style Options -- -local core = require("graphics.core") +local core = require("graphics.core") +local themes = require("graphics.themes") +---@class svr_style local style = {} local cpair = core.cpair --- GLOBAL -- - --- remap global colors -colors.ivory = colors.pink -colors.yellow_hc = colors.purple -colors.red_off = colors.brown -colors.yellow_off = colors.magenta -colors.green_off = colors.lime - -style.root = cpair(colors.black, colors.ivory) -style.header = cpair(colors.black, colors.lightGray) - -style.colors = { - { c = colors.red, hex = 0xdf4949 }, -- RED ON - { c = colors.orange, hex = 0xffb659 }, - { c = colors.yellow, hex = 0xf9fb53 }, -- YELLOW ON - { c = colors.lime, hex = 0x16665a }, -- GREEN OFF - { c = colors.green, hex = 0x6be551 }, -- GREEN ON - { c = colors.cyan, hex = 0x34bac8 }, - { c = colors.lightBlue, hex = 0x6cc0f2 }, - { c = colors.blue, hex = 0x0008fe }, -- LCD BLUE - { c = colors.purple, hex = 0xe3bc2a }, -- YELLOW HIGH CONTRAST - { c = colors.pink, hex = 0xdcd9ca }, -- IVORY - { c = colors.magenta, hex = 0x85862c }, -- YELLOW OFF - -- { c = colors.white, hex = 0xdcd9ca }, - { c = colors.lightGray, hex = 0xb1b8b3 }, - { c = colors.gray, hex = 0x575757 }, - -- { c = colors.black, hex = 0x191919 }, - { c = colors.brown, hex = 0x672223 } -- RED OFF -} - --- COMMON COLOR PAIRS -- - -style.text_fg_bg = cpair(colors.black, colors.ivory) -style.bw_fg_bg = cpair(colors.black, colors.white) -style.fp_label = cpair(colors.lightGray, colors.ivory) - -style.black_lg = cpair(colors.black, colors.lightGray) -style.lg_white = cpair(colors.lightGray, colors.white) -style.gray_white = cpair(colors.gray, colors.white) +style.theme = themes.basalt +style.fp = themes.get_fp_style(style.theme) style.ind_grn = cpair(colors.green, colors.green_off) diff --git a/supervisor/renderer.lua b/supervisor/renderer.lua index 73333d0..42fe771 100644 --- a/supervisor/renderer.lua +++ b/supervisor/renderer.lua @@ -31,13 +31,13 @@ function renderer.try_start_ui() term.setCursorPos(1, 1) -- set overridden colors - for i = 1, #style.colors do - term.setPaletteColor(style.colors[i].c, style.colors[i].hex) + for i = 1, #style.theme.colors do + term.setPaletteColor(style.theme.colors[i].c, style.theme.colors[i].hex) end -- init front panel view status, msg = pcall(function () - ui.display = DisplayBox{window=term.current(),fg_bg=style.root} + ui.display = DisplayBox{window=term.current(),fg_bg=style.fp.root} panel_view(ui.display) end) @@ -70,9 +70,9 @@ function renderer.close_ui() ui.display = nil -- restore colors - for i = 1, #style.colors do - local r, g, b = term.nativePaletteColor(style.colors[i].c) - term.setPaletteColor(style.colors[i].c, r, g, b) + for i = 1, #style.theme.colors do + local r, g, b = term.nativePaletteColor(style.theme.colors[i].c) + term.setPaletteColor(style.theme.colors[i].c, r, g, b) end -- reset terminal diff --git a/supervisor/startup.lua b/supervisor/startup.lua index 72c0c97..a35081c 100644 --- a/supervisor/startup.lua +++ b/supervisor/startup.lua @@ -21,7 +21,7 @@ local supervisor = require("supervisor.supervisor") local svsessions = require("supervisor.session.svsessions") -local SUPERVISOR_VERSION = "v1.2.11" +local SUPERVISOR_VERSION = "v1.2.12" local println = util.println local println_ts = util.println_ts From d87e3893f00e80224236578e23887390eddd64d4 Mon Sep 17 00:00:00 2001 From: Mikayla Fischler Date: Wed, 6 Mar 2024 12:18:50 -0500 Subject: [PATCH 10/44] #405 plc and rtu front panel themes --- graphics/themes.lua | 4 +++- reactor-plc/panel/front_panel.lua | 22 ++++++++++------- reactor-plc/panel/style.lua | 38 ++++------------------------- reactor-plc/renderer.lua | 12 +++++----- reactor-plc/startup.lua | 2 +- rtu/panel/front_panel.lua | 14 +++++------ rtu/panel/style.lua | 40 ++++--------------------------- rtu/renderer.lua | 12 +++++----- rtu/startup.lua | 2 +- 9 files changed, 47 insertions(+), 99 deletions(-) diff --git a/graphics/themes.lua b/graphics/themes.lua index f5ba50e..0da2037 100644 --- a/graphics/themes.lua +++ b/graphics/themes.lua @@ -28,6 +28,7 @@ themes.sandstone = { highlight_box = cpair(colors.black, colors.lightGray), highlight_box_bright = cpair(colors.black, colors.white), + field_box = cpair(colors.gray, colors.white), colors = { { c = colors.red, hex = 0xdf4949 }, -- RED ON @@ -38,7 +39,7 @@ themes.sandstone = { { c = colors.cyan, hex = 0x34bac8 }, { c = colors.lightBlue, hex = 0x6cc0f2 }, { c = colors.blue, hex = 0x0096ff }, - { c = colors.purple, hex = 0xb156ee }, -- YELLOW HIGH CONTRAST + { c = colors.purple, hex = 0xe3bc2a }, -- YELLOW HIGH CONTRAST { c = colors.pink, hex = 0xdcd9ca }, -- IVORY { c = colors.magenta, hex = 0x85862c }, -- YELLOW OFF { c = colors.white, hex = 0xf0f0f0 }, @@ -61,6 +62,7 @@ themes.basalt = { highlight_box = cpair(colors.white, colors.gray), highlight_box_bright = cpair(colors.black, colors.lightGray), + field_box = cpair(colors.white, colors.gray), colors = { { c = colors.red, hex = 0xdc6466 }, -- RED ON diff --git a/reactor-plc/panel/front_panel.lua b/reactor-plc/panel/front_panel.lua index 18c9cca..eb6b4bd 100644 --- a/reactor-plc/panel/front_panel.lua +++ b/reactor-plc/panel/front_panel.lua @@ -28,14 +28,18 @@ local ALIGN = core.ALIGN local cpair = core.cpair local border = core.border +local s_hi_box = style.theme.highlight_box + +local disabled_fg = style.fp.disabled_fg + local ind_grn = style.ind_grn local ind_red = style.ind_red -- create new front panel view ---@param panel graphics_element main displaybox local function init(panel) - local header = TextBox{parent=panel,y=1,text="REACTOR PLC - UNIT ?",alignment=ALIGN.CENTER,height=1,fg_bg=style.header} - header.register(databus.ps, "unit_id", function (id) header.set_value(util.c("REACTOR PLC - UNIT ", id)) end) + local header = TextBox{parent=panel,y=1,text="FISSION REACTOR PLC - UNIT ?",alignment=ALIGN.CENTER,height=1,fg_bg=style.theme.header} + header.register(databus.ps, "unit_id", function (id) header.set_value(util.c("FISSION REACTOR PLC - UNIT ", id)) end) -- -- system indicators @@ -75,7 +79,7 @@ local function init(panel) ---@diagnostic disable-next-line: undefined-field local comp_id = util.sprintf("(%d)", os.getComputerID()) - TextBox{parent=system,x=9,y=5,width=6,height=1,text=comp_id,fg_bg=cpair(colors.lightGray,colors.ivory)} + TextBox{parent=system,x=9,y=5,width=6,height=1,text=comp_id,fg_bg=disabled_fg} -- -- status & controls @@ -91,12 +95,12 @@ local function init(panel) emer_cool.register(databus.ps, "emer_cool", emer_cool.update) end - local status_trip_rct = Rectangle{parent=status,width=20,height=3,x=1,border=border(1,colors.lightGray,true),even_inner=true,fg_bg=cpair(colors.black,colors.ivory)} - local status_trip = Div{parent=status_trip_rct,width=18,height=1,fg_bg=cpair(colors.black,colors.lightGray)} + local status_trip_rct = Rectangle{parent=status,width=20,height=3,x=1,border=border(1,s_hi_box.bkg,true),even_inner=true} + local status_trip = Div{parent=status_trip_rct,width=18,height=1,fg_bg=s_hi_box} local scram = LED{parent=status_trip,width=10,label="RPS TRIP",colors=ind_red,flash=true,period=flasher.PERIOD.BLINK_250_MS} - local controls_rct = Rectangle{parent=status,width=17,height=3,x=1,border=border(1,colors.lightGray,true),even_inner=true,fg_bg=cpair(colors.black,colors.ivory)} - local controls = Div{parent=controls_rct,width=15,height=1,fg_bg=cpair(colors.black,colors.lightGray)} + local controls_rct = Rectangle{parent=status,width=17,height=3,x=1,border=border(1,s_hi_box.bkg,true),even_inner=true} + local controls = Div{parent=controls_rct,width=15,height=1,fg_bg=s_hi_box} PushButton{parent=controls,x=1,y=1,min_width=7,text="SCRAM",callback=databus.rps_scram,fg_bg=cpair(colors.black,colors.red),active_fg_bg=cpair(colors.black,colors.red_off)} PushButton{parent=controls,x=9,y=1,min_width=7,text="RESET",callback=databus.rps_reset,fg_bg=cpair(colors.black,colors.yellow),active_fg_bg=cpair(colors.black,colors.yellow_off)} @@ -107,7 +111,7 @@ local function init(panel) -- about footer -- - local about = Div{parent=panel,width=15,height=3,x=1,y=18,fg_bg=cpair(colors.lightGray,colors.ivory)} + local about = Div{parent=panel,width=15,height=3,x=1,y=18,fg_bg=disabled_fg} local fw_v = TextBox{parent=about,x=1,y=1,text="FW: v00.00.00",alignment=ALIGN.LEFT,height=1} local comms_v = TextBox{parent=about,x=1,y=2,text="NT: v00.00.00",alignment=ALIGN.LEFT,height=1} @@ -118,7 +122,7 @@ local function init(panel) -- rps list -- - local rps = Rectangle{parent=panel,width=16,height=16,x=36,y=3,border=border(1,colors.lightGray),thin=true,fg_bg=cpair(colors.black,colors.lightGray)} + local rps = Rectangle{parent=panel,width=16,height=16,x=36,y=3,border=border(1,s_hi_box.bkg),thin=true,fg_bg=s_hi_box} local rps_man = LED{parent=rps,label="MANUAL",colors=ind_red} local rps_auto = LED{parent=rps,label="AUTOMATIC",colors=ind_red} local rps_tmo = LED{parent=rps,label="TIMEOUT",colors=ind_red} diff --git a/reactor-plc/panel/style.lua b/reactor-plc/panel/style.lua index 1cf783c..7909ff9 100644 --- a/reactor-plc/panel/style.lua +++ b/reactor-plc/panel/style.lua @@ -2,44 +2,16 @@ -- Graphics Style Options -- -local core = require("graphics.core") +local core = require("graphics.core") +local themes = require("graphics.themes") +---@class plc_style local style = {} local cpair = core.cpair --- GLOBAL -- - --- remap global colors -colors.ivory = colors.pink -colors.yellow_hc = colors.purple -colors.red_off = colors.brown -colors.yellow_off = colors.magenta -colors.green_off = colors.lime - -style.root = cpair(colors.black, colors.ivory) -style.header = cpair(colors.black, colors.lightGray) - -style.colors = { - { c = colors.red, hex = 0xdf4949 }, -- RED ON - { c = colors.orange, hex = 0xffb659 }, - { c = colors.yellow, hex = 0xf9fb53 }, -- YELLOW ON - { c = colors.lime, hex = 0x16665a }, -- GREEN OFF - { c = colors.green, hex = 0x6be551 }, -- GREEN ON - { c = colors.cyan, hex = 0x34bac8 }, - { c = colors.lightBlue, hex = 0x6cc0f2 }, - { c = colors.blue, hex = 0x0096ff }, - { c = colors.purple, hex = 0xb156ee }, -- YELLOW HIGH CONTRAST - { c = colors.pink, hex = 0xdcd9ca }, -- IVORY - { c = colors.magenta, hex = 0x85862c }, -- YELLOW OFF - -- { c = colors.white, hex = 0xdcd9ca }, - { c = colors.lightGray, hex = 0xb1b8b3 }, - { c = colors.gray, hex = 0x575757 }, - -- { c = colors.black, hex = 0x191919 }, - { c = colors.brown, hex = 0x672223 } -- RED OFF -} - --- COMMON COLOR PAIRS -- +style.theme = themes.basalt +style.fp = themes.get_fp_style(style.theme) style.ind_grn = cpair(colors.green, colors.green_off) style.ind_red = cpair(colors.red, colors.red_off) diff --git a/reactor-plc/renderer.lua b/reactor-plc/renderer.lua index 2613600..e8db89c 100644 --- a/reactor-plc/renderer.lua +++ b/reactor-plc/renderer.lua @@ -30,13 +30,13 @@ function renderer.try_start_ui() term.setCursorPos(1, 1) -- set overridden colors - for i = 1, #style.colors do - term.setPaletteColor(style.colors[i].c, style.colors[i].hex) + for i = 1, #style.theme.colors do + term.setPaletteColor(style.theme.colors[i].c, style.theme.colors[i].hex) end -- init front panel view status, msg = pcall(function () - ui.display = DisplayBox{window=term.current(),fg_bg=style.root} + ui.display = DisplayBox{window=term.current(),fg_bg=style.fp.root} panel_view(ui.display) end) @@ -64,9 +64,9 @@ function renderer.close_ui() ui.display = nil -- restore colors - for i = 1, #style.colors do - local r, g, b = term.nativePaletteColor(style.colors[i].c) - term.setPaletteColor(style.colors[i].c, r, g, b) + for i = 1, #style.theme.colors do + local r, g, b = term.nativePaletteColor(style.theme.colors[i].c) + term.setPaletteColor(style.theme.colors[i].c, r, g, b) end -- reset terminal diff --git a/reactor-plc/startup.lua b/reactor-plc/startup.lua index 9c3d382..d67fa7b 100644 --- a/reactor-plc/startup.lua +++ b/reactor-plc/startup.lua @@ -18,7 +18,7 @@ local plc = require("reactor-plc.plc") local renderer = require("reactor-plc.renderer") local threads = require("reactor-plc.threads") -local R_PLC_VERSION = "v1.6.14" +local R_PLC_VERSION = "v1.6.15" local println = util.println local println_ts = util.println_ts diff --git a/rtu/panel/front_panel.lua b/rtu/panel/front_panel.lua index 206ea21..be81b27 100644 --- a/rtu/panel/front_panel.lua +++ b/rtu/panel/front_panel.lua @@ -22,7 +22,7 @@ local ALIGN = core.ALIGN local cpair = core.cpair -local fp_label = style.fp_label +local disabled_fg = style.fp.disabled_fg local ind_grn = style.ind_grn @@ -32,7 +32,7 @@ local UNIT_TYPE_LABELS = { "UNKNOWN", "REDSTONE", "BOILER", "TURBINE", "DYNAMIC ---@param panel graphics_element main displaybox ---@param units table unit list local function init(panel, units) - TextBox{parent=panel,y=1,text="RTU GATEWAY",alignment=ALIGN.CENTER,height=1,fg_bg=style.header} + TextBox{parent=panel,y=1,text="RTU GATEWAY",alignment=ALIGN.CENTER,height=1,fg_bg=style.theme.header} -- -- system indicators @@ -64,17 +64,17 @@ local function init(panel, units) ---@diagnostic disable-next-line: undefined-field local comp_id = util.sprintf("(%d)", os.getComputerID()) - TextBox{parent=system,x=9,y=4,width=6,height=1,text=comp_id,fg_bg=fp_label} + TextBox{parent=system,x=9,y=4,width=6,height=1,text=comp_id,fg_bg=disabled_fg} - TextBox{parent=system,x=1,y=14,text="SPEAKERS",height=1,width=8,fg_bg=style.label} - local speaker_count = DataIndicator{parent=system,x=10,y=14,label="",format="%3d",value=0,width=3,fg_bg=cpair(colors.gray,colors.white)} + TextBox{parent=system,x=1,y=14,text="SPEAKERS",height=1,width=8,fg_bg=style.fp.text_fg} + local speaker_count = DataIndicator{parent=system,x=10,y=14,label="",format="%3d",value=0,width=3,fg_bg=style.theme.field_box} speaker_count.register(databus.ps, "speaker_count", speaker_count.update) -- -- about label -- - local about = Div{parent=panel,width=15,height=3,x=1,y=18,fg_bg=fp_label} + local about = Div{parent=panel,width=15,height=3,x=1,y=18,fg_bg=disabled_fg} local fw_v = TextBox{parent=about,x=1,y=1,text="FW: v00.00.00",alignment=ALIGN.LEFT,height=1} local comms_v = TextBox{parent=about,x=1,y=2,text="NT: v00.00.00",alignment=ALIGN.LEFT,height=1} @@ -116,7 +116,7 @@ local function init(panel, units) -- assignment (unit # or facility) local for_unit = util.trinary(unit.reactor == 0, "\x1a FACIL ", "\x1a UNIT " .. unit.reactor) - TextBox{parent=unit_hw_statuses,y=i,x=19,text=for_unit,height=1,fg_bg=fp_label} + TextBox{parent=unit_hw_statuses,y=i,x=19,text=for_unit,height=1,fg_bg=disabled_fg} end end diff --git a/rtu/panel/style.lua b/rtu/panel/style.lua index bfc52cf..0b646a3 100644 --- a/rtu/panel/style.lua +++ b/rtu/panel/style.lua @@ -2,46 +2,16 @@ -- Graphics Style Options -- -local core = require("graphics.core") +local core = require("graphics.core") +local themes = require("graphics.themes") +---@class rtu_style local style = {} local cpair = core.cpair --- GLOBAL -- - --- remap global colors -colors.ivory = colors.pink -colors.yellow_hc = colors.purple -colors.red_off = colors.brown -colors.yellow_off = colors.magenta -colors.green_off = colors.lime - -style.root = cpair(colors.black, colors.ivory) -style.header = cpair(colors.black, colors.lightGray) - -style.colors = { - { c = colors.red, hex = 0xdf4949 }, -- RED ON - { c = colors.orange, hex = 0xffb659 }, - { c = colors.yellow, hex = 0xf9fb53 }, -- YELLOW ON - { c = colors.lime, hex = 0x16665a }, -- GREEN OFF - { c = colors.green, hex = 0x6be551 }, -- GREEN ON - { c = colors.cyan, hex = 0x34bac8 }, - { c = colors.lightBlue, hex = 0x6cc0f2 }, - { c = colors.blue, hex = 0x0096ff }, - { c = colors.purple, hex = 0xb156ee }, -- YELLOW HIGH CONTRAST - { c = colors.pink, hex = 0xdcd9ca }, -- IVORY - { c = colors.magenta, hex = 0x85862c }, -- YELLOW OFF - -- { c = colors.white, hex = 0xdcd9ca }, - { c = colors.lightGray, hex = 0xb1b8b3 }, - { c = colors.gray, hex = 0x575757 }, - -- { c = colors.black, hex = 0x191919 }, - { c = colors.brown, hex = 0x672223 } -- RED OFF -} - --- COMMON COLOR PAIRS -- - -style.fp_label = cpair(colors.lightGray, colors.ivory) +style.theme = themes.basalt +style.fp = themes.get_fp_style(style.theme) style.ind_grn = cpair(colors.green, colors.green_off) diff --git a/rtu/renderer.lua b/rtu/renderer.lua index a212c39..642823a 100644 --- a/rtu/renderer.lua +++ b/rtu/renderer.lua @@ -31,13 +31,13 @@ function renderer.try_start_ui(units) term.setCursorPos(1, 1) -- set overridden colors - for i = 1, #style.colors do - term.setPaletteColor(style.colors[i].c, style.colors[i].hex) + for i = 1, #style.theme.colors do + term.setPaletteColor(style.theme.colors[i].c, style.theme.colors[i].hex) end -- init front panel view status, msg = pcall(function () - ui.display = DisplayBox{window=term.current(),fg_bg=style.root} + ui.display = DisplayBox{window=term.current(),fg_bg=style.fp.root} panel_view(ui.display, units) end) @@ -65,9 +65,9 @@ function renderer.close_ui() ui.display = nil -- restore colors - for i = 1, #style.colors do - local r, g, b = term.nativePaletteColor(style.colors[i].c) - term.setPaletteColor(style.colors[i].c, r, g, b) + for i = 1, #style.theme.colors do + local r, g, b = term.nativePaletteColor(style.theme.colors[i].c) + term.setPaletteColor(style.theme.colors[i].c, r, g, b) end -- reset terminal diff --git a/rtu/startup.lua b/rtu/startup.lua index 1c5a4a2..90b81a0 100644 --- a/rtu/startup.lua +++ b/rtu/startup.lua @@ -31,7 +31,7 @@ local sna_rtu = require("rtu.dev.sna_rtu") local sps_rtu = require("rtu.dev.sps_rtu") local turbinev_rtu = require("rtu.dev.turbinev_rtu") -local RTU_VERSION = "v1.7.14" +local RTU_VERSION = "v1.7.15" local RTU_UNIT_TYPE = types.RTU_UNIT_TYPE local RTU_UNIT_HW_STATE = databus.RTU_UNIT_HW_STATE From 560061d4ad9e3888cbf8a776c8ca216e43e08c6a Mon Sep 17 00:00:00 2001 From: Mikayla Fischler Date: Wed, 6 Mar 2024 20:51:23 -0500 Subject: [PATCH 11/44] removed latest shield and added missing common version shield --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 2f727be..e8f901f 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,6 @@ Configurable ComputerCraft SCADA system for multi-reactor control of Mekanism fi ![GitHub](https://img.shields.io/github/license/MikaylaFischler/cc-mek-scada) ![GitHub release (latest by date including pre-releases)](https://img.shields.io/github/v/release/MikaylaFischler/cc-mek-scada?include_prereleases) ![GitHub Workflow Status (with branch)](https://img.shields.io/github/actions/workflow/status/MikaylaFischler/cc-mek-scada/check.yml?branch=main&label=main) -![GitHub Workflow Status (with branch)](https://img.shields.io/github/actions/workflow/status/MikaylaFischler/cc-mek-scada/check.yml?branch=latest&label=latest) ![GitHub Workflow Status (with branch)](https://img.shields.io/github/actions/workflow/status/MikaylaFischler/cc-mek-scada/check.yml?branch=devel&label=devel) ### [Join](https://discord.gg/R9NSCkhcwt) the Discord! @@ -17,6 +16,7 @@ Configurable ComputerCraft SCADA system for multi-reactor control of Mekanism fi ![Bootloader](https://img.shields.io/endpoint?url=https%3A%2F%2Fmikaylafischler.github.io%2Fcc-mek-scada%2Fbootloader.json) +![Comms](https://img.shields.io/endpoint?url=https%3A%2F%2Fmikaylafischler.github.io%2Fcc-mek-scada%2Fcommon.json) ![Comms](https://img.shields.io/endpoint?url=https%3A%2F%2Fmikaylafischler.github.io%2Fcc-mek-scada%2Fcomms.json) ![Graphics](https://img.shields.io/endpoint?url=https%3A%2F%2Fmikaylafischler.github.io%2Fcc-mek-scada%2Fgraphics.json) ![Lockbox](https://img.shields.io/endpoint?url=https%3A%2F%2Fmikaylafischler.github.io%2Fcc-mek-scada%2Flockbox.json) From 510995b04f6a3811a12a1819dc67031979fb426e Mon Sep 17 00:00:00 2001 From: Mikayla Fischler Date: Wed, 6 Mar 2024 23:35:30 -0500 Subject: [PATCH 12/44] #405 #340 coordinator configurator control of theme and color mode --- coordinator/configure.lua | 173 ++++++++++++++++++++-- coordinator/coordinator.lua | 12 +- coordinator/startup.lua | 3 + coordinator/ui/components/boiler.lua | 6 +- coordinator/ui/components/imatrix.lua | 6 +- coordinator/ui/components/pkt_entry.lua | 10 +- coordinator/ui/components/process_ctl.lua | 16 +- coordinator/ui/components/reactor.lua | 6 +- coordinator/ui/components/turbine.lua | 6 +- coordinator/ui/components/unit_detail.lua | 20 +-- coordinator/ui/components/unit_flow.lua | 12 +- coordinator/ui/layout/flow_view.lua | 12 +- coordinator/ui/layout/main_view.lua | 4 +- coordinator/ui/style.lua | 30 +++- graphics/themes.lua | 10 -- 15 files changed, 248 insertions(+), 78 deletions(-) diff --git a/coordinator/configure.lua b/coordinator/configure.lua index 7c3fe58..ed8a3df 100644 --- a/coordinator/configure.lua +++ b/coordinator/configure.lua @@ -24,6 +24,8 @@ local RadioButton = require("graphics.elements.controls.radio_button") local NumberField = require("graphics.elements.form.number_field") local TextField = require("graphics.elements.form.text_field") +local IndLight = require("graphics.elements.indicators.light") + local println = util.println local tri = util.trinary @@ -40,7 +42,8 @@ local RIGHT = core.ALIGN.RIGHT -- changes to the config data/format to let the user know local changes = { - {"v1.2.4", { "Added temperature scale options" } } + {"v1.2.4", { "Added temperature scale options" } }, + {"v1.2.12", { "Added main UI theme", "Added front panel UI theme", "Added color accessibility modes" } } } ---@class crd_configurator @@ -73,6 +76,7 @@ local nav_fg_bg = bw_fg_bg local btn_act_fg_bg = cpair(colors.white, colors.gray) local dis_fg_bg = cpair(colors.lightGray,colors.white) +---@class _crd_cfg_tool_ctl local tool_ctl = { nic = nil, ---@type nic net_listen = false, @@ -86,8 +90,12 @@ local tool_ctl = { has_config = false, viewing_config = false, importing_legacy = false, + jumped_to_color = false, view_cfg = nil, ---@type graphics_element + color_cfg = nil, ---@type graphics_element + color_next = nil, ---@type graphics_element + color_apply = nil, ---@type graphics_element settings_apply = nil, ---@type graphics_element gen_summary = nil, ---@type function @@ -136,6 +144,9 @@ local tmp_cfg = { LogMode = 0, LogPath = "", LogDebug = false, + MainTheme = 1, + FrontPanelTheme = 1, + ColorMode = 1 } ---@class crd_config @@ -162,7 +173,10 @@ local fields = { { "AuthKey", "Facility Auth Key" , ""}, { "LogMode", "Log Mode", log.MODE.APPEND }, { "LogPath", "Log Path", "/log.txt" }, - { "LogDebug","Log Debug Messages", false } + { "LogDebug","Log Debug Messages", false }, + { "MainTheme", "Main UI Theme", 1 }, + { "FrontPanelTheme", "Front Panel Theme", 1 }, + { "ColorMode", "Color Mode", 1 } } -- check if a value is an integer within a range (inclusive) @@ -313,10 +327,11 @@ local function config_view(display) local spkr_cfg = Div{parent=root_pane_div,x=1,y=1} local crd_cfg = Div{parent=root_pane_div,x=1,y=1} local log_cfg = Div{parent=root_pane_div,x=1,y=1} + local clr_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,fac_cfg,mon_cfg,spkr_cfg,crd_cfg,log_cfg,summary,changelog}} + local main_pane = MultiPane{parent=root_pane_div,x=1,y=1,panes={main_page,net_cfg,fac_cfg,mon_cfg,spkr_cfg,crd_cfg,log_cfg,clr_cfg,summary,changelog}} -- Main Page @@ -337,7 +352,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(8) + main_pane.set_value(9) end if fs.exists("/coordinator/config.lua") then @@ -348,10 +363,21 @@ local function config_view(display) PushButton{parent=main_page,x=2,y=y_start,min_width=18,text="Configure System",callback=function()main_pane.set_value(2)end,fg_bg=cpair(colors.black,colors.blue),active_fg_bg=btn_act_fg_bg} tool_ctl.view_cfg = PushButton{parent=main_page,x=2,y=y_start+2,min_width=20,text="View Configuration",callback=view_config,fg_bg=cpair(colors.black,colors.blue),active_fg_bg=btn_act_fg_bg,dis_fg_bg=dis_fg_bg} - if not tool_ctl.has_config then tool_ctl.view_cfg.disable() end + local function jump_color() + tool_ctl.jumped_to_color = true + tool_ctl.color_next.hide() + tool_ctl.color_apply.show(true) + main_pane.set_value(8) + end PushButton{parent=main_page,x=2,y=17,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=39,y=17,min_width=12,text="Change Log",callback=function()main_pane.set_value(9)end,fg_bg=nav_fg_bg,active_fg_bg=btn_act_fg_bg} + tool_ctl.color_cfg = PushButton{parent=main_page,x=23,y=17,min_width=15,text="Color Options",callback=jump_color,fg_bg=nav_fg_bg,active_fg_bg=btn_act_fg_bg} + PushButton{parent=main_page,x=39,y=17,min_width=12,text="Change Log",callback=function()main_pane.set_value(10)end,fg_bg=nav_fg_bg,active_fg_bg=btn_act_fg_bg} + + if not tool_ctl.has_config then + tool_ctl.view_cfg.disable() + tool_ctl.color_cfg.disable() + end --#region Network @@ -697,7 +723,7 @@ local function config_view(display) mon_pane.set_value(1) end - PushButton{parent=mon_c_4,x=1,y=14,text="\x1b Back",callback=back_from_legacy,fg_bg=nav_fg_bg,active_fg_bg=btn_act_fg_bg} + PushButton{parent=mon_c_4,x=44,y=14,min_width=6,text="Done",callback=back_from_legacy,fg_bg=nav_fg_bg,active_fg_bg=btn_act_fg_bg} --#endregion @@ -734,8 +760,6 @@ local function config_view(display) local crd_c_1 = Div{parent=crd_cfg,x=2,y=4,width=49} - local crd_pane = MultiPane{parent=crd_cfg,x=1,y=4,panes={crd_c_1}} - TextBox{parent=crd_cfg,x=1,y=2,height=1,text=" Coordinator UI Configuration",fg_bg=cpair(colors.black,colors.lime)} TextBox{parent=crd_c_1,x=1,y=1,height=3,text="Configure the UI interface options below if you wish to customize formats."} @@ -782,10 +806,8 @@ local function config_view(display) tmp_cfg.LogMode = mode.get_value() - 1 tmp_cfg.LogPath = path.get_value() tmp_cfg.LogDebug = en_dbg.get_value() - tool_ctl.gen_summary(tmp_cfg) - tool_ctl.viewing_config = false - tool_ctl.importing_legacy = false - tool_ctl.settings_apply.show() + tool_ctl.color_apply.hide() + tool_ctl.color_next.show(true) main_pane.set_value(8) else path_err.show() end end @@ -795,6 +817,115 @@ local function config_view(display) --#endregion + --#region Color Options + + local clr_c_1 = Div{parent=clr_cfg,x=2,y=4,width=49} + local clr_c_2 = Div{parent=clr_cfg,x=2,y=4,width=49} + local clr_c_3 = Div{parent=clr_cfg,x=2,y=4,width=49} + local clr_c_4 = Div{parent=clr_cfg,x=2,y=4,width=49} + + local clr_pane = MultiPane{parent=clr_cfg,x=1,y=4,panes={clr_c_1,clr_c_2,clr_c_3,clr_c_4}} + + TextBox{parent=clr_cfg,x=1,y=2,height=1,text=" Color Configuration",fg_bg=cpair(colors.black,colors.magenta)} + + TextBox{parent=clr_c_1,x=1,y=1,height=2,text="Here you can select the color themes for the different UI displays."} + TextBox{parent=clr_c_1,x=1,y=4,height=2,text="Click 'Accessibility' below to access color blind assistive options.",fg_bg=g_lg_fg_bg} + + TextBox{parent=clr_c_1,x=1,y=7,height=1,text="Main UI Theme"} + local main_theme = RadioButton{parent=clr_c_1,x=1,y=8,default=ini_cfg.MainTheme,options={"Smooth Stone","Deepslate"},callback=function()end,radio_colors=cpair(colors.lightGray,colors.black),select_color=colors.magenta} + + TextBox{parent=clr_c_1,x=18,y=7,height=1,text="Front Panel Theme"} + local fp_theme = RadioButton{parent=clr_c_1,x=18,y=8,default=ini_cfg.FrontPanelTheme,options={"Sandstone","Basalt"},callback=function()end,radio_colors=cpair(colors.lightGray,colors.black),select_color=colors.magenta} + + TextBox{parent=clr_c_2,x=1,y=1,height=6,text="By default, this project uses green/red heavily to distinguish ok and not, with some indicators also using multiple colors. By selecting a color blindness below, blues will be used instead of greens on indicators and multi-color indicators will be split up as space permits."} + + local function recolor(value) + if value == 1 then + for i = 1, #style.colors do term.setPaletteColor(style.colors[i].c, style.colors[i].hex) end + elseif value == 2 then + term.setPaletteColor(colors.green, 0x1081ff) + term.setPaletteColor(colors.yellow, 0xf5e633) + term.setPaletteColor(colors.red, 0xff521a) + elseif value == 3 then + term.setPaletteColor(colors.green, 0x1081ff) + term.setPaletteColor(colors.yellow, 0xf7c311) + term.setPaletteColor(colors.red, 0xfb5615) + elseif value == 4 then + term.setPaletteColor(colors.green, 0x00ecff) + term.setPaletteColor(colors.yellow, 0xffbc00) + term.setPaletteColor(colors.red, 0xff0000) + end + end + + local c_mode = RadioButton{parent=clr_c_2,x=1,y=8,default=ini_cfg.ColorMode,options={"None","Protanopia","Deuteranopia","Tritanopia"},callback=recolor,radio_colors=cpair(colors.lightGray,colors.black),select_color=colors.magenta} + + local _ = IndLight{parent=clr_c_2,x=20,y=8,label="Good",colors=cpair(colors.black,colors.green),value=true} + _ = IndLight{parent=clr_c_2,x=20,y=9,label="Warning",colors=cpair(colors.black,colors.yellow),value=true} + _ = IndLight{parent=clr_c_2,x=20,y=10,label="Bad",colors=cpair(colors.black,colors.red),value=true} + + TextBox{parent=clr_c_2,x=20,y=12,height=6,text="Exact color varies by theme.",fg_bg=g_lg_fg_bg} + + PushButton{parent=clr_c_2,x=44,y=14,min_width=6,text="Done",callback=function()clr_pane.set_value(1)end,fg_bg=nav_fg_bg,active_fg_bg=btn_act_fg_bg} + + local function back_from_colors() + main_pane.set_value(util.trinary(tool_ctl.jumped_to_color, 1, 7)) + tool_ctl.jumped_to_color = false + recolor(1) + end + + local function show_access() + clr_pane.set_value(2) + recolor(c_mode.get_value()) + end + + local function submit_colors() + tmp_cfg.MainTheme = main_theme.get_value() + tmp_cfg.FrontPanelTheme = fp_theme.get_value() + tmp_cfg.ColorMode = c_mode.get_value() + + if tool_ctl.jumped_to_color then + settings.set("MainTheme", tmp_cfg.MainTheme) + settings.set("FrontPanelTheme", tmp_cfg.FrontPanelTheme) + settings.set("ColorMode", tmp_cfg.ColorMode) + + if settings.save("/coordinator.settings") then + load_settings(settings_cfg, true) + load_settings(ini_cfg) + clr_pane.set_value(3) + else + clr_pane.set_value(4) + end + else + tool_ctl.gen_summary(tmp_cfg) + tool_ctl.viewing_config = false + tool_ctl.importing_legacy = false + tool_ctl.settings_apply.show() + main_pane.set_value(9) + end + end + + PushButton{parent=clr_c_1,x=1,y=14,text="\x1b Back",callback=back_from_colors,fg_bg=nav_fg_bg,active_fg_bg=btn_act_fg_bg} + PushButton{parent=clr_c_1,x=8,y=14,min_width=15,text="Accessibility",callback=show_access,fg_bg=nav_fg_bg,active_fg_bg=btn_act_fg_bg} + tool_ctl.color_next = PushButton{parent=clr_c_1,x=44,y=14,text="Next \x1a",callback=submit_colors,fg_bg=nav_fg_bg,active_fg_bg=btn_act_fg_bg} + tool_ctl.color_apply = PushButton{parent=clr_c_1,x=43,y=14,min_width=7,text="Apply",callback=submit_colors,fg_bg=cpair(colors.black,colors.green),active_fg_bg=btn_act_fg_bg} + + tool_ctl.color_apply.hide() + + local function c_go_home() + main_pane.set_value(1) + clr_pane.set_value(1) + end + + TextBox{parent=clr_c_3,x=1,y=1,height=1,text="Settings saved!"} + PushButton{parent=clr_c_3,x=1,y=14,min_width=6,text="Exit",callback=exit,fg_bg=cpair(colors.black,colors.red),active_fg_bg=cpair(colors.white,colors.gray)} + PushButton{parent=clr_c_3,x=44,y=14,min_width=6,text="Home",callback=c_go_home,fg_bg=nav_fg_bg,active_fg_bg=btn_act_fg_bg} + + TextBox{parent=clr_c_4,x=1,y=1,height=5,text="Failed to save the settings file.\n\nThere may not be enough space for the modification or server file permissions may be denying writes."} + PushButton{parent=clr_c_4,x=1,y=14,min_width=6,text="Exit",callback=exit,fg_bg=cpair(colors.black,colors.red),active_fg_bg=cpair(colors.white,colors.gray)} + PushButton{parent=clr_c_4,x=44,y=14,min_width=6,text="Home",callback=c_go_home,fg_bg=nav_fg_bg,active_fg_bg=btn_act_fg_bg} + + --#endregion + --#region Summary and Saving local sum_c_1 = Div{parent=summary,x=2,y=4,width=49} @@ -815,7 +946,7 @@ local function config_view(display) tool_ctl.importing_legacy = false tool_ctl.settings_apply.show() else - main_pane.set_value(7) + main_pane.set_value(8) end end @@ -846,12 +977,16 @@ local function config_view(display) try_set(mode, ini_cfg.LogMode) try_set(path, ini_cfg.LogPath) try_set(en_dbg, ini_cfg.LogDebug) + try_set(main_theme, ini_cfg.MainTheme) + try_set(fp_theme, ini_cfg.FrontPanelTheme) + try_set(c_mode, ini_cfg.ColorMode) preset_monitor_fields() tool_ctl.gen_mon_list() tool_ctl.view_cfg.enable() + tool_ctl.color_cfg.enable() if tool_ctl.importing_legacy then tool_ctl.importing_legacy = false @@ -875,7 +1010,7 @@ local function config_view(display) net_pane.set_value(1) fac_pane.set_value(1) mon_pane.set_value(1) - crd_pane.set_value(1) + clr_pane.set_value(1) sum_pane.set_value(1) end @@ -972,7 +1107,7 @@ local function config_view(display) tool_ctl.gen_summary(tmp_cfg) sum_pane.set_value(1) - main_pane.set_value(8) + main_pane.set_value(9) tool_ctl.importing_legacy = true end @@ -1196,6 +1331,12 @@ local function config_view(display) 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" else val = "Rankine" end + elseif f[1] == "MainTheme" then + if raw == 1 then val = "Smooth Stone" else val = "Deepslate" end + elseif f[1] == "FrontPanelTheme" then + if raw == 1 then val = "Sandstone" else val = "Basalt" end + elseif f[1] == "ColorMode" then + if raw == 1 then val = "Standard" elseif raw == 2 then val = "Protanopia" elseif raw == 3 then val = "Deuteranopia" else val = "Tritanopia" end elseif f[1] == "UnitDisplays" and type(cfg.UnitDisplays) == "table" then val = "" for idx = 1, #cfg.UnitDisplays do diff --git a/coordinator/coordinator.lua b/coordinator/coordinator.lua index bc97c99..61b854b 100644 --- a/coordinator/coordinator.lua +++ b/coordinator/coordinator.lua @@ -54,6 +54,10 @@ function coordinator.load_config() config.LogPath = settings.get("LogPath") config.LogDebug = settings.get("LogDebug") + config.MainTheme = settings.get("MainTheme") + config.FrontPanelTheme = settings.get("FrontPanelTheme") + config.ColorMode = settings.get("ColorMode") + local cfv = util.new_validator() cfv.assert_type_int(config.UnitCount) @@ -89,7 +93,13 @@ function coordinator.load_config() cfv.assert_type_int(config.LogMode) cfv.assert_range(config.LogMode, 0, 1) cfv.assert_type_str(config.LogPath) - cfv.assert_type_bool(config.LogDebug) + + cfv.assert_type_int(config.MainTheme) + cfv.assert_range(config.MainTheme, 1, 2) + cfv.assert_type_int(config.FrontPanelTheme) + cfv.assert_range(config.FrontPanelTheme, 1, 2) + cfv.assert_type_int(config.ColorMode) + cfv.assert_range(config.ColorMode, 1, 4) -- Monitor Setup diff --git a/coordinator/startup.lua b/coordinator/startup.lua index 45583b9..feeafd0 100644 --- a/coordinator/startup.lua +++ b/coordinator/startup.lua @@ -22,6 +22,8 @@ local sounder = require("coordinator.sounder") local apisessions = require("coordinator.session.apisessions") +local style = require("coordinator.ui.style") + local COORDINATOR_VERSION = "v1.2.12" local CHUNK_LOAD_DELAY_S = 30.0 @@ -120,6 +122,7 @@ local function main() iocontrol.init_fp(COORDINATOR_VERSION, comms.version) -- init renderer + style.set_themes(config.MainTheme, config.FrontPanelTheme) renderer.legacy_disable_flow_view(config.DisableFlowView) renderer.set_displays(monitors) renderer.init_displays() diff --git a/coordinator/ui/components/boiler.lua b/coordinator/ui/components/boiler.lua index e29b188..0b7843f 100644 --- a/coordinator/ui/components/boiler.lua +++ b/coordinator/ui/components/boiler.lua @@ -14,15 +14,15 @@ local VerticalBar = require("graphics.elements.indicators.vbar") local cpair = core.cpair local border = core.border -local text_fg = style.theme.text_fg -local lu_col = style.lu_colors - -- new boiler view ---@param root graphics_element parent ---@param x integer top left x ---@param y integer top left y ---@param ps psil ps interface local function new_view(root, x, y, ps) + local text_fg = style.theme.text_fg + local lu_col = style.lu_colors + local db = iocontrol.get_db() local boiler = Rectangle{parent=root,border=border(1,colors.gray,true),width=31,height=7,x=x,y=y} diff --git a/coordinator/ui/components/imatrix.lua b/coordinator/ui/components/imatrix.lua index 6d8fc38..078661a 100644 --- a/coordinator/ui/components/imatrix.lua +++ b/coordinator/ui/components/imatrix.lua @@ -18,9 +18,6 @@ local border = core.border local ALIGN = core.ALIGN -local text_fg = style.theme.text_fg -local lu_col = style.lu_colors - -- new induction matrix view ---@param root graphics_element parent ---@param x integer top left x @@ -29,6 +26,9 @@ local lu_col = style.lu_colors ---@param ps psil ps interface ---@param id number? matrix ID local function new_view(root, x, y, data, ps, id) + local text_fg = style.theme.text_fg + local lu_col = style.lu_colors + local title = "INDUCTION MATRIX" if type(id) == "number" then title = title .. id end diff --git a/coordinator/ui/components/pkt_entry.lua b/coordinator/ui/components/pkt_entry.lua index 42f19a4..760f406 100644 --- a/coordinator/ui/components/pkt_entry.lua +++ b/coordinator/ui/components/pkt_entry.lua @@ -17,15 +17,15 @@ local ALIGN = core.ALIGN local cpair = core.cpair -local s_hi_box = style.fp_theme.highlight_box -local s_hi_bright = style.fp_theme.highlight_box_bright - -local label_fg = style.fp.label_fg - -- create a pocket list entry ---@param parent graphics_element parent ---@param id integer PKT session ID local function init(parent, id) + local s_hi_box = style.fp_theme.highlight_box + local s_hi_bright = style.fp_theme.highlight_box_bright + + local label_fg = style.fp.label_fg + local ps = iocontrol.get_db().fp.ps -- root div diff --git a/coordinator/ui/components/process_ctl.lua b/coordinator/ui/components/process_ctl.lua index 572be85..32286c8 100644 --- a/coordinator/ui/components/process_ctl.lua +++ b/coordinator/ui/components/process_ctl.lua @@ -28,14 +28,6 @@ local ALIGN = core.ALIGN local cpair = core.cpair local border = core.border -local s_hi_box = style.theme.highlight_box -local s_field = style.theme.field_box - -local lu_cpair = style.lu_colors -local hzd_fg_bg = style.hzd_fg_bg -local dis_colors = style.dis_colors -local arrow_fg_bg = cpair(style.theme.label, s_hi_box.bkg) - local bw_fg_bg = style.bw_fg_bg local ind_grn = style.ind_grn @@ -50,6 +42,14 @@ local period = core.flasher.PERIOD ---@param x integer top left x ---@param y integer top left y local function new_view(root, x, y) + local s_hi_box = style.theme.highlight_box + local s_field = style.theme.field_box + + local lu_cpair = style.lu_colors + local hzd_fg_bg = style.hzd_fg_bg + local dis_colors = style.dis_colors + local arrow_fg_bg = cpair(style.theme.label, s_hi_box.bkg) + assert(root.get_height() >= (y + 24), "main display not of sufficient vertical resolution (add an additional row of monitors)") local black = cpair(colors.black, colors.black) diff --git a/coordinator/ui/components/reactor.lua b/coordinator/ui/components/reactor.lua index 3e2026c..8e6005d 100644 --- a/coordinator/ui/components/reactor.lua +++ b/coordinator/ui/components/reactor.lua @@ -16,15 +16,15 @@ local StateIndicator = require("graphics.elements.indicators.state") local cpair = core.cpair local border = core.border -local text_fg = style.theme.text_fg -local lu_col = style.lu_colors - -- create new reactor view ---@param root graphics_element parent ---@param x integer top left x ---@param y integer top left y ---@param ps psil ps interface local function new_view(root, x, y, ps) + local text_fg = style.theme.text_fg + local lu_col = style.lu_colors + local db = iocontrol.get_db() local reactor = Rectangle{parent=root,border=border(1,colors.gray,true),width=30,height=7,x=x,y=y} diff --git a/coordinator/ui/components/turbine.lua b/coordinator/ui/components/turbine.lua index 236dbbb..75cbabd 100644 --- a/coordinator/ui/components/turbine.lua +++ b/coordinator/ui/components/turbine.lua @@ -15,15 +15,15 @@ local VerticalBar = require("graphics.elements.indicators.vbar") local cpair = core.cpair local border = core.border -local text_fg = style.theme.text_fg -local lu_col = style.lu_colors - -- new turbine view ---@param root graphics_element parent ---@param x integer top left x ---@param y integer top left y ---@param ps psil ps interface local function new_view(root, x, y, ps) + local text_fg = style.theme.text_fg + local lu_col = style.lu_colors + local turbine = Rectangle{parent=root,border=border(1,colors.gray,true),width=23,height=7,x=x,y=y} local status = StateIndicator{parent=turbine,x=7,y=1,states=style.turbine.states,value=1,min_width=12} diff --git a/coordinator/ui/components/unit_detail.lua b/coordinator/ui/components/unit_detail.lua index 363470e..d76c9d8 100644 --- a/coordinator/ui/components/unit_detail.lua +++ b/coordinator/ui/components/unit_detail.lua @@ -34,16 +34,6 @@ local ALIGN = core.ALIGN local cpair = core.cpair local border = core.border -local s_hi_box = style.theme.highlight_box -local s_hi_bright = style.theme.highlight_box_bright -local s_field = style.theme.field_box - -local hc_text = style.hc_text -local lu_cpair = style.lu_colors -local hzd_fg_bg = style.hzd_fg_bg -local dis_colors = style.dis_colors -local arrow_fg_bg = cpair(style.theme.label, s_hi_box.bkg) - local bw_fg_bg = style.bw_fg_bg local gry_wht = style.gray_white @@ -58,6 +48,16 @@ local period = core.flasher.PERIOD ---@param parent graphics_element parent ---@param id integer local function init(parent, id) + local s_hi_box = style.theme.highlight_box + local s_hi_bright = style.theme.highlight_box_bright + local s_field = style.theme.field_box + + local hc_text = style.hc_text + local lu_cpair = style.lu_colors + local hzd_fg_bg = style.hzd_fg_bg + local dis_colors = style.dis_colors + local arrow_fg_bg = cpair(style.theme.label, s_hi_box.bkg) + local db = iocontrol.get_db() local unit = db.units[id] ---@type ioctl_unit local f_ps = db.facility.ps diff --git a/coordinator/ui/components/unit_flow.lua b/coordinator/ui/components/unit_flow.lua index 9dfd4c1..115450b 100644 --- a/coordinator/ui/components/unit_flow.lua +++ b/coordinator/ui/components/unit_flow.lua @@ -27,12 +27,6 @@ local border = core.border local cpair = core.cpair local pipe = core.pipe -local s_field = style.theme.field_box - -local text_c = style.text_colors -local lu_c = style.lu_colors -local lu_c_d = style.lu_colors_dark - local wh_gray = style.wh_gray local lg_gray = style.lg_gray @@ -46,6 +40,12 @@ local ind_wht = style.ind_wht ---@param wide boolean whether to render wide version ---@param unit ioctl_unit unit database entry local function make(parent, x, y, wide, unit) + local s_field = style.theme.field_box + + local text_c = style.text_colors + local lu_c = style.lu_colors + local lu_c_d = style.lu_colors_dark + local height = 16 local v_start = 1 + ((unit.unit_id - 1) * 5) diff --git a/coordinator/ui/layout/flow_view.lua b/coordinator/ui/layout/flow_view.lua index 39e51f8..98d16e9 100644 --- a/coordinator/ui/layout/flow_view.lua +++ b/coordinator/ui/layout/flow_view.lua @@ -31,17 +31,17 @@ local cpair = core.cpair local border = core.border local pipe = core.pipe -local s_hi_bright = style.theme.highlight_box_bright -local s_field = style.theme.field_box - local wh_gray = style.wh_gray -local text_col = style.text_colors -local lu_col = style.lu_colors -local lu_c_d = style.lu_colors_dark -- create new flow view ---@param main graphics_element main displaybox local function init(main) + local s_hi_bright = style.theme.highlight_box_bright + local s_field = style.theme.field_box + local text_col = style.text_colors + local lu_col = style.lu_colors + local lu_c_d = style.lu_colors_dark + local facility = iocontrol.get_db().facility local units = iocontrol.get_db().units diff --git a/coordinator/ui/layout/main_view.lua b/coordinator/ui/layout/main_view.lua index 9598e42..f31c200 100644 --- a/coordinator/ui/layout/main_view.lua +++ b/coordinator/ui/layout/main_view.lua @@ -18,11 +18,11 @@ local DataIndicator = require("graphics.elements.indicators.data") local ALIGN = core.ALIGN -local s_header = style.theme.header - -- create new main view ---@param main graphics_element main displaybox local function init(main) + local s_header = style.theme.header + local facility = iocontrol.get_db().facility local units = iocontrol.get_db().units diff --git a/coordinator/ui/style.lua b/coordinator/ui/style.lua index baad776..fc8a77f 100644 --- a/coordinator/ui/style.lua +++ b/coordinator/ui/style.lua @@ -105,8 +105,7 @@ local deepslate = { } } -style.theme = deepslate --- style.theme = smooth_stone +style.theme = smooth_stone style.root = cpair(style.theme.text, style.theme.bg) style.label = cpair(style.theme.label, style.theme.bg) @@ -120,6 +119,33 @@ style.lu_colors = cpair(style.theme.label, style.theme.label) -- label & unit colors (darker if set) style.lu_colors_dark = cpair(style.theme.label_dark, style.theme.label_dark) +-- set themes per configurations +---@param main integer main theme ID (1 = smooth_stone, 2 = deepslate) +---@param fp integer fp theme ID (1 = sandstone, 2 = basalt) +function style.set_themes(main, fp) + if main == 1 then + style.theme = smooth_stone + elseif main == 2 then + style.theme = deepslate + end + + style.root = cpair(style.theme.text, style.theme.bg) + style.label = cpair(style.theme.label, style.theme.bg) + + style.hc_text = cpair(style.theme.text, style.theme.text_inv) + style.text_colors = cpair(style.theme.text, style.theme.bg) + style.lu_colors = cpair(style.theme.label, style.theme.label) + style.lu_colors_dark = cpair(style.theme.label_dark, style.theme.label_dark) + + if fp == 1 then + style.fp_theme = themes.sandstone + elseif fp == 2 then + style.fp_theme = themes.basalt + end + + style.fp = themes.get_fp_style(style.fp_theme) +end + -- COMMON COLOR PAIRS -- style.wh_gray = cpair(colors.white, colors.gray) diff --git a/graphics/themes.lua b/graphics/themes.lua index 0da2037..1be7238 100644 --- a/graphics/themes.lua +++ b/graphics/themes.lua @@ -103,14 +103,4 @@ function themes.get_fp_style(theme) return style end - - - - - - - - - - return themes From 48a8eadc55fe70cacdcd04d9cfbaa0991006c560 Mon Sep 17 00:00:00 2001 From: Mikayla Fischler Date: Thu, 7 Mar 2024 18:00:33 -0500 Subject: [PATCH 13/44] #405 #340 reactor plc configurator control of theme and color mode --- coordinator/configure.lua | 12 +-- coordinator/ui/style.lua | 2 +- reactor-plc/configure.lua | 163 +++++++++++++++++++++++++++--- reactor-plc/panel/front_panel.lua | 8 +- reactor-plc/panel/style.lua | 14 ++- reactor-plc/plc.lua | 8 ++ reactor-plc/renderer.lua | 6 +- reactor-plc/startup.lua | 2 +- 8 files changed, 186 insertions(+), 29 deletions(-) diff --git a/coordinator/configure.lua b/coordinator/configure.lua index ed8a3df..a46c179 100644 --- a/coordinator/configure.lua +++ b/coordinator/configure.lua @@ -806,8 +806,8 @@ local function config_view(display) tmp_cfg.LogMode = mode.get_value() - 1 tmp_cfg.LogPath = path.get_value() tmp_cfg.LogDebug = en_dbg.get_value() - tool_ctl.color_apply.hide() - tool_ctl.color_next.show(true) + tool_ctl.color_apply.hide(true) + tool_ctl.color_next.show() main_pane.set_value(8) else path_err.show() end end @@ -1330,13 +1330,13 @@ 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" else val = "Rankine" end + 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 elseif f[1] == "MainTheme" then - if raw == 1 then val = "Smooth Stone" else val = "Deepslate" end + if raw == 1 then val = "Smooth Stone" elseif raw == 2 then val = "Deepslate" end elseif f[1] == "FrontPanelTheme" then - if raw == 1 then val = "Sandstone" else val = "Basalt" end + if raw == 1 then val = "Sandstone" elseif raw == 2 then val = "Basalt" end elseif f[1] == "ColorMode" then - if raw == 1 then val = "Standard" elseif raw == 2 then val = "Protanopia" elseif raw == 3 then val = "Deuteranopia" else val = "Tritanopia" end + if raw == 1 then val = "Standard" elseif raw == 2 then val = "Protanopia" elseif raw == 3 then val = "Deuteranopia" elseif raw == 4 then val = "Tritanopia" end elseif f[1] == "UnitDisplays" and type(cfg.UnitDisplays) == "table" then val = "" for idx = 1, #cfg.UnitDisplays do diff --git a/coordinator/ui/style.lua b/coordinator/ui/style.lua index fc8a77f..afa6b7b 100644 --- a/coordinator/ui/style.lua +++ b/coordinator/ui/style.lua @@ -121,7 +121,7 @@ style.lu_colors_dark = cpair(style.theme.label_dark, style.theme.label_dark) -- set themes per configurations ---@param main integer main theme ID (1 = smooth_stone, 2 = deepslate) ----@param fp integer fp theme ID (1 = sandstone, 2 = basalt) +---@param fp integer fp theme ID (1 = sandstone, 2 = basalt) function style.set_themes(main, fp) if main == 1 then style.theme = smooth_stone diff --git a/reactor-plc/configure.lua b/reactor-plc/configure.lua index db9162d..445f1fb 100644 --- a/reactor-plc/configure.lua +++ b/reactor-plc/configure.lua @@ -23,6 +23,8 @@ local RadioButton = require("graphics.elements.controls.radio_button") local NumberField = require("graphics.elements.form.number_field") local TextField = require("graphics.elements.form.text_field") +local IndLight = require("graphics.elements.indicators.light") + local println = util.println local tri = util.trinary @@ -35,7 +37,8 @@ local RIGHT = core.ALIGN.RIGHT -- changes to the config data/format to let the user know local changes = { {"v1.6.2", { "AuthKey minimum length is now 8 (if set)" } }, - {"v1.6.8", { "ConnTimeout can now have a fractional part" } } + {"v1.6.8", { "ConnTimeout can now have a fractional part" } }, + {"v1.2.12", { "Added front panel UI theme", "Added color accessibility modes" } } } ---@class plc_configurator @@ -72,8 +75,12 @@ local tool_ctl = { has_config = false, viewing_config = false, importing_legacy = false, + jumped_to_color = false, view_cfg = nil, ---@type graphics_element + color_cfg = nil, ---@type graphics_element + color_next = nil, ---@type graphics_element + color_apply = nil, ---@type graphics_element settings_apply = nil, ---@type graphics_element set_networked = nil, ---@type function @@ -103,6 +110,8 @@ local tmp_cfg = { LogMode = 0, LogPath = "", LogDebug = false, + FrontPanelTheme = 1, + ColorMode = 1 } ---@class plc_config @@ -124,7 +133,9 @@ local fields = { { "AuthKey", "Facility Auth Key" , ""}, { "LogMode", "Log Mode", log.MODE.APPEND }, { "LogPath", "Log Path", "/log.txt" }, - { "LogDebug","Log Debug Messages", false } + { "LogDebug","Log Debug Messages", false }, + { "FrontPanelTheme", "Front Panel Theme", 1 }, + { "ColorMode", "Color Mode", 1 } } local side_options = { "Top", "Bottom", "Left", "Right", "Front", "Back" } @@ -176,10 +187,11 @@ local function config_view(display) local plc_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 clr_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,plc_cfg,net_cfg,log_cfg,summary,changelog}} + local main_pane = MultiPane{parent=root_pane_div,x=1,y=1,panes={main_page,plc_cfg,net_cfg,log_cfg,clr_cfg,summary,changelog}} -- Main Page @@ -196,7 +208,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(5) + main_pane.set_value(6) end if fs.exists("/reactor-plc/config.lua") then @@ -207,10 +219,21 @@ local function config_view(display) PushButton{parent=main_page,x=2,y=y_start,min_width=18,text="Configure System",callback=function()main_pane.set_value(2)end,fg_bg=cpair(colors.black,colors.blue),active_fg_bg=btn_act_fg_bg} tool_ctl.view_cfg = PushButton{parent=main_page,x=2,y=y_start+2,min_width=20,text="View Configuration",callback=view_config,fg_bg=cpair(colors.black,colors.blue),active_fg_bg=btn_act_fg_bg,dis_fg_bg=cpair(colors.lightGray,colors.white)} - if not tool_ctl.has_config then tool_ctl.view_cfg.disable() end + local function jump_color() + tool_ctl.jumped_to_color = true + tool_ctl.color_next.hide() + tool_ctl.color_apply.show(true) + main_pane.set_value(5) + end PushButton{parent=main_page,x=2,y=17,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=39,y=17,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} + tool_ctl.color_cfg = PushButton{parent=main_page,x=23,y=17,min_width=15,text="Color Options",callback=jump_color,fg_bg=nav_fg_bg,active_fg_bg=btn_act_fg_bg} + PushButton{parent=main_page,x=39,y=17,min_width=12,text="Change Log",callback=function()main_pane.set_value(7)end,fg_bg=nav_fg_bg,active_fg_bg=btn_act_fg_bg} + + if not tool_ctl.has_config then + tool_ctl.view_cfg.disable() + tool_ctl.color_cfg.disable() + end --#region PLC @@ -419,10 +442,8 @@ local function config_view(display) tmp_cfg.LogMode = mode.get_value() - 1 tmp_cfg.LogPath = path.get_value() tmp_cfg.LogDebug = en_dbg.get_value() - tool_ctl.gen_summary(tmp_cfg) - tool_ctl.viewing_config = false - tool_ctl.importing_legacy = false - tool_ctl.settings_apply.show() + tool_ctl.color_apply.hide(true) + tool_ctl.color_next.show() main_pane.set_value(5) else path_err.show() end end @@ -436,6 +457,110 @@ local function config_view(display) --#endregion + --#region Color Options + + local clr_c_1 = Div{parent=clr_cfg,x=2,y=4,width=49} + local clr_c_2 = Div{parent=clr_cfg,x=2,y=4,width=49} + local clr_c_3 = Div{parent=clr_cfg,x=2,y=4,width=49} + local clr_c_4 = Div{parent=clr_cfg,x=2,y=4,width=49} + + local clr_pane = MultiPane{parent=clr_cfg,x=1,y=4,panes={clr_c_1,clr_c_2,clr_c_3,clr_c_4}} + + TextBox{parent=clr_cfg,x=1,y=2,height=1,text=" Color Configuration",fg_bg=cpair(colors.black,colors.magenta)} + + TextBox{parent=clr_c_1,x=1,y=1,height=2,text="Here you can select the color theme for the front panel."} + TextBox{parent=clr_c_1,x=1,y=4,height=2,text="Click 'Accessibility' below to access color blind assistive options.",fg_bg=g_lg_fg_bg} + + TextBox{parent=clr_c_1,x=1,y=7,height=1,text="Front Panel Theme"} + local fp_theme = RadioButton{parent=clr_c_1,x=1,y=8,default=ini_cfg.FrontPanelTheme,options={"Sandstone","Basalt"},callback=function()end,radio_colors=cpair(colors.lightGray,colors.black),select_color=colors.magenta} + + TextBox{parent=clr_c_2,x=1,y=1,height=6,text="By default, this project uses green/red heavily to distinguish ok and not, with some indicators also using multiple colors. By selecting a color blindness below, blues will be used instead of greens on indicators and multi-color indicators will be split up as space permits."} + + local function recolor(value) + if value == 1 then + for i = 1, #style.colors do term.setPaletteColor(style.colors[i].c, style.colors[i].hex) end + elseif value == 2 then + term.setPaletteColor(colors.green, 0x1081ff) + term.setPaletteColor(colors.yellow, 0xf5e633) + term.setPaletteColor(colors.red, 0xff521a) + elseif value == 3 then + term.setPaletteColor(colors.green, 0x1081ff) + term.setPaletteColor(colors.yellow, 0xf7c311) + term.setPaletteColor(colors.red, 0xfb5615) + elseif value == 4 then + term.setPaletteColor(colors.green, 0x00ecff) + term.setPaletteColor(colors.yellow, 0xffbc00) + term.setPaletteColor(colors.red, 0xff0000) + end + end + + local c_mode = RadioButton{parent=clr_c_2,x=1,y=8,default=ini_cfg.ColorMode,options={"None","Protanopia","Deuteranopia","Tritanopia"},callback=recolor,radio_colors=cpair(colors.lightGray,colors.black),select_color=colors.magenta} + + local _ = IndLight{parent=clr_c_2,x=20,y=8,label="Good",colors=cpair(colors.black,colors.green),value=true} + _ = IndLight{parent=clr_c_2,x=20,y=9,label="Warning",colors=cpair(colors.black,colors.yellow),value=true} + _ = IndLight{parent=clr_c_2,x=20,y=10,label="Bad",colors=cpair(colors.black,colors.red),value=true} + + TextBox{parent=clr_c_2,x=20,y=12,height=6,text="Exact color varies by theme.",fg_bg=g_lg_fg_bg} + + PushButton{parent=clr_c_2,x=44,y=14,min_width=6,text="Done",callback=function()clr_pane.set_value(1)end,fg_bg=nav_fg_bg,active_fg_bg=btn_act_fg_bg} + + local function back_from_colors() + main_pane.set_value(util.trinary(tool_ctl.jumped_to_color, 1, 4)) + tool_ctl.jumped_to_color = false + recolor(1) + end + + local function show_access() + clr_pane.set_value(2) + recolor(c_mode.get_value()) + end + + local function submit_colors() + tmp_cfg.FrontPanelTheme = fp_theme.get_value() + tmp_cfg.ColorMode = c_mode.get_value() + + if tool_ctl.jumped_to_color then + settings.set("FrontPanelTheme", tmp_cfg.FrontPanelTheme) + settings.set("ColorMode", tmp_cfg.ColorMode) + + if settings.save("/reactor-plc.settings") then + load_settings(settings_cfg, true) + load_settings(ini_cfg) + clr_pane.set_value(3) + else + clr_pane.set_value(4) + end + else + tool_ctl.gen_summary(tmp_cfg) + tool_ctl.viewing_config = false + tool_ctl.importing_legacy = false + tool_ctl.settings_apply.show() + main_pane.set_value(6) + end + end + + PushButton{parent=clr_c_1,x=1,y=14,text="\x1b Back",callback=back_from_colors,fg_bg=nav_fg_bg,active_fg_bg=btn_act_fg_bg} + PushButton{parent=clr_c_1,x=8,y=14,min_width=15,text="Accessibility",callback=show_access,fg_bg=nav_fg_bg,active_fg_bg=btn_act_fg_bg} + tool_ctl.color_next = PushButton{parent=clr_c_1,x=44,y=14,text="Next \x1a",callback=submit_colors,fg_bg=nav_fg_bg,active_fg_bg=btn_act_fg_bg} + tool_ctl.color_apply = PushButton{parent=clr_c_1,x=43,y=14,min_width=7,text="Apply",callback=submit_colors,fg_bg=cpair(colors.black,colors.green),active_fg_bg=btn_act_fg_bg} + + tool_ctl.color_apply.hide() + + local function c_go_home() + main_pane.set_value(1) + clr_pane.set_value(1) + end + + TextBox{parent=clr_c_3,x=1,y=1,height=1,text="Settings saved!"} + PushButton{parent=clr_c_3,x=1,y=14,min_width=6,text="Exit",callback=exit,fg_bg=cpair(colors.black,colors.red),active_fg_bg=cpair(colors.white,colors.gray)} + PushButton{parent=clr_c_3,x=44,y=14,min_width=6,text="Home",callback=c_go_home,fg_bg=nav_fg_bg,active_fg_bg=btn_act_fg_bg} + + TextBox{parent=clr_c_4,x=1,y=1,height=5,text="Failed to save the settings file.\n\nThere may not be enough space for the modification or server file permissions may be denying writes."} + PushButton{parent=clr_c_4,x=1,y=14,min_width=6,text="Exit",callback=exit,fg_bg=cpair(colors.black,colors.red),active_fg_bg=cpair(colors.white,colors.gray)} + PushButton{parent=clr_c_4,x=44,y=14,min_width=6,text="Home",callback=c_go_home,fg_bg=nav_fg_bg,active_fg_bg=btn_act_fg_bg} + + --#endregion + --#region Summary and Saving local sum_c_1 = Div{parent=summary,x=2,y=4,width=49} @@ -456,7 +581,7 @@ local function config_view(display) tool_ctl.importing_legacy = false tool_ctl.settings_apply.show() else - main_pane.set_value(4) + main_pane.set_value(5) end end @@ -487,6 +612,8 @@ local function config_view(display) try_set(mode, ini_cfg.LogMode) try_set(path, ini_cfg.LogPath) try_set(en_dbg, ini_cfg.LogDebug) + try_set(fp_theme, ini_cfg.FrontPanelTheme) + try_set(c_mode, ini_cfg.ColorMode) tool_ctl.view_cfg.enable() @@ -588,7 +715,7 @@ local function config_view(display) tool_ctl.gen_summary(tmp_cfg) sum_pane.set_value(1) - main_pane.set_value(5) + main_pane.set_value(6) tool_ctl.importing_legacy = true end @@ -617,9 +744,15 @@ 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)) end - if f[1] == "LogMode" then val = util.trinary(raw == log.MODE.APPEND, "append", "replace") end - if f[1] == "EmerCoolColor" and raw ~= nil then val = rsio.color_name(raw) 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] == "EmerCoolColor" and raw ~= nil then val = rsio.color_name(raw) + elseif f[1] == "FrontPanelTheme" then + if raw == 1 then val = "Sandstone" elseif raw == 2 then val = "Basalt" end + elseif f[1] == "ColorMode" then + if raw == 1 then val = "Standard" elseif raw == 2 then val = "Protanopia" elseif raw == 3 then val = "Deuteranopia" elseif raw == 4 then val = "Tritanopia" end + end + if val == "nil" then val = "" end local c = util.trinary(alternate, g_lg_fg_bg, cpair(colors.gray,colors.white)) diff --git a/reactor-plc/panel/front_panel.lua b/reactor-plc/panel/front_panel.lua index eb6b4bd..7c087a8 100644 --- a/reactor-plc/panel/front_panel.lua +++ b/reactor-plc/panel/front_panel.lua @@ -28,16 +28,16 @@ local ALIGN = core.ALIGN local cpair = core.cpair local border = core.border -local s_hi_box = style.theme.highlight_box - -local disabled_fg = style.fp.disabled_fg - local ind_grn = style.ind_grn local ind_red = style.ind_red -- create new front panel view ---@param panel graphics_element main displaybox local function init(panel) + local s_hi_box = style.theme.highlight_box + + local disabled_fg = style.fp.disabled_fg + local header = TextBox{parent=panel,y=1,text="FISSION REACTOR PLC - UNIT ?",alignment=ALIGN.CENTER,height=1,fg_bg=style.theme.header} header.register(databus.ps, "unit_id", function (id) header.set_value(util.c("FISSION REACTOR PLC - UNIT ", id)) end) diff --git a/reactor-plc/panel/style.lua b/reactor-plc/panel/style.lua index 7909ff9..5aca524 100644 --- a/reactor-plc/panel/style.lua +++ b/reactor-plc/panel/style.lua @@ -10,10 +10,22 @@ local style = {} local cpair = core.cpair -style.theme = themes.basalt +style.theme = themes.sandstone style.fp = themes.get_fp_style(style.theme) style.ind_grn = cpair(colors.green, colors.green_off) style.ind_red = cpair(colors.red, colors.red_off) +-- set theme per configuration +---@param fp integer fp theme ID (1 = sandstone, 2 = basalt) +function style.set_theme(fp) + if fp == 1 then + style.theme = themes.sandstone + elseif fp == 2 then + style.theme = themes.basalt + end + + style.fp = themes.get_fp_style(style.theme) +end + return style diff --git a/reactor-plc/plc.lua b/reactor-plc/plc.lua index eec1e4d..560f3ba 100644 --- a/reactor-plc/plc.lua +++ b/reactor-plc/plc.lua @@ -52,6 +52,9 @@ function plc.load_config() config.LogPath = settings.get("LogPath") config.LogDebug = settings.get("LogDebug") + config.FrontPanelTheme = settings.get("FrontPanelTheme") + config.ColorMode = settings.get("ColorMode") + local cfv = util.new_validator() cfv.assert_type_bool(config.Networked) @@ -78,6 +81,11 @@ function plc.load_config() cfv.assert_type_str(config.LogPath) cfv.assert_type_bool(config.LogDebug) + cfv.assert_type_int(config.FrontPanelTheme) + cfv.assert_range(config.FrontPanelTheme, 1, 2) + cfv.assert_type_int(config.ColorMode) + cfv.assert_range(config.ColorMode, 1, 4) + -- check emergency coolant configuration if enabled if config.EmerCoolEnable then cfv.assert_eq(rsio.is_valid_side(config.EmerCoolSide), true) diff --git a/reactor-plc/renderer.lua b/reactor-plc/renderer.lua index e8db89c..31af361 100644 --- a/reactor-plc/renderer.lua +++ b/reactor-plc/renderer.lua @@ -18,11 +18,15 @@ local ui = { } -- try to start the UI +---@param theme integer front panel theme ID (1 = sandstone, 2 = basalt) ---@return boolean success, any error_msg -function renderer.try_start_ui() +function renderer.try_start_ui(theme) local status, msg = true, nil if ui.display == nil then + -- set theme + style.set_theme(theme) + -- reset terminal term.setTextColor(colors.white) term.setBackgroundColor(colors.black) diff --git a/reactor-plc/startup.lua b/reactor-plc/startup.lua index d67fa7b..66f6d77 100644 --- a/reactor-plc/startup.lua +++ b/reactor-plc/startup.lua @@ -183,7 +183,7 @@ local function main() -- front panel time! if not renderer.ui_ready() then local message - plc_state.fp_ok, message = renderer.try_start_ui() + plc_state.fp_ok, message = renderer.try_start_ui(config.FrontPanelTheme) if not plc_state.fp_ok then println_ts(util.c("UI error: ", message)) From fc7896ebd370e093323562c054a5d600ba054a1c Mon Sep 17 00:00:00 2001 From: Mikayla Fischler Date: Thu, 7 Mar 2024 19:23:46 -0500 Subject: [PATCH 14/44] #405 #340 rtu and supervisor configurator control of theme and color mode --- coordinator/configure.lua | 4 +- reactor-plc/configure.lua | 7 +- rtu/configure.lua | 168 +++++++++++++++++++--- rtu/panel/front_panel.lua | 4 +- rtu/panel/style.lua | 14 +- rtu/renderer.lua | 6 +- rtu/rtu.lua | 10 ++ rtu/startup.lua | 2 +- supervisor/configure.lua | 166 ++++++++++++++++++--- supervisor/panel/components/pdg_entry.lua | 7 +- supervisor/panel/components/rtu_entry.lua | 7 +- supervisor/panel/front_panel.lua | 12 +- supervisor/panel/style.lua | 12 ++ supervisor/renderer.lua | 6 +- supervisor/startup.lua | 2 +- supervisor/supervisor.lua | 8 ++ 16 files changed, 373 insertions(+), 62 deletions(-) diff --git a/coordinator/configure.lua b/coordinator/configure.lua index a46c179..3afe54a 100644 --- a/coordinator/configure.lua +++ b/coordinator/configure.lua @@ -42,8 +42,8 @@ local RIGHT = core.ALIGN.RIGHT -- changes to the config data/format to let the user know local changes = { - {"v1.2.4", { "Added temperature scale options" } }, - {"v1.2.12", { "Added main UI theme", "Added front panel UI theme", "Added color accessibility modes" } } + { "v1.2.4", { "Added temperature scale options" } }, + { "v1.2.12", { "Added main UI theme", "Added front panel UI theme", "Added color accessibility modes" } } } ---@class crd_configurator diff --git a/reactor-plc/configure.lua b/reactor-plc/configure.lua index 445f1fb..80ef86c 100644 --- a/reactor-plc/configure.lua +++ b/reactor-plc/configure.lua @@ -36,9 +36,9 @@ local RIGHT = core.ALIGN.RIGHT -- changes to the config data/format to let the user know local changes = { - {"v1.6.2", { "AuthKey minimum length is now 8 (if set)" } }, - {"v1.6.8", { "ConnTimeout can now have a fractional part" } }, - {"v1.2.12", { "Added front panel UI theme", "Added color accessibility modes" } } + { "v1.6.2", { "AuthKey minimum length is now 8 (if set)" } }, + { "v1.6.8", { "ConnTimeout can now have a fractional part" } }, + { "v1.6.15", { "Added front panel UI theme", "Added color accessibility modes" } } } ---@class plc_configurator @@ -70,6 +70,7 @@ local g_lg_fg_bg = cpair(colors.gray, colors.lightGray) local nav_fg_bg = bw_fg_bg local btn_act_fg_bg = cpair(colors.white, colors.gray) +---@class _plc_cfg_tool_ctl local tool_ctl = { ask_config = false, has_config = false, diff --git a/rtu/configure.lua b/rtu/configure.lua index 131623b..cfda26d 100644 --- a/rtu/configure.lua +++ b/rtu/configure.lua @@ -24,6 +24,8 @@ local RadioButton = require("graphics.elements.controls.radio_button") local NumberField = require("graphics.elements.form.number_field") local TextField = require("graphics.elements.form.text_field") +local IndLight = require("graphics.elements.indicators.light") + local println = util.println local tri = util.trinary @@ -73,7 +75,8 @@ assert(#PORT_DSGN == rsio.NUM_PORTS) -- changes to the config data/format to let the user know local changes = { - {"v1.7.9", { "ConnTimeout can now have a fractional part" } } + { "v1.7.9", { "ConnTimeout can now have a fractional part" } }, + { "v1.7.15", { "Added front panel UI theme", "Added color accessibility modes" } } } ---@class rtu_rs_definition @@ -119,13 +122,15 @@ local g_lg_fg_bg = cpair(colors.gray, colors.lightGray) local nav_fg_bg = bw_fg_bg local btn_act_fg_bg = cpair(colors.white, colors.gray) +---@class _rtu_cfg_tool_ctl local tool_ctl = { ask_config = false, has_config = false, viewing_config = false, importing_legacy = false, importing_any_dc = false, - peri_cfg_editing = false, ---@type string|false + jumped_to_color = false, + peri_cfg_editing = false, ---@type integer|false peri_cfg_manual = false, rs_cfg_port = IO.F_SCRAM, ---@type IO_PORT rs_cfg_editing = false, ---@type integer|false @@ -133,6 +138,9 @@ local tool_ctl = { view_gw_cfg = nil, ---@type graphics_element dev_cfg = nil, ---@type graphics_element rs_cfg = nil, ---@type graphics_element + color_cfg = nil, ---@type graphics_element + color_next = nil, ---@type graphics_element + color_apply = nil, ---@type graphics_element settings_apply = nil, ---@type graphics_element settings_confirm = nil, ---@type graphics_element @@ -181,7 +189,9 @@ local tmp_cfg = { AuthKey = nil, ---@type string|nil LogMode = 0, LogPath = "", - LogDebug = false + LogDebug = false, + FrontPanelTheme = 1, + ColorMode = 1 } ---@class rtu_config @@ -198,7 +208,9 @@ local fields = { { "AuthKey", "Facility Auth Key", "" }, { "LogMode", "Log Mode", log.MODE.APPEND }, { "LogPath", "Log Path", "/log.txt" }, - { "LogDebug","Log Debug Messages", false } + { "LogDebug","Log Debug Messages", false }, + { "FrontPanelTheme", "Front Panel Theme", 1 }, + { "ColorMode", "Color Mode", 1 } } local side_options = { "Top", "Bottom", "Left", "Right", "Front", "Back" } @@ -266,12 +278,13 @@ local function config_view(display) local spkr_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 clr_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 peri_cfg = Div{parent=root_pane_div,x=1,y=1} local rs_cfg = Div{parent=root_pane_div,x=1,y=1} - local main_pane = MultiPane{parent=root_pane_div,x=1,y=1,panes={main_page,spkr_cfg,net_cfg,log_cfg,summary,changelog,peri_cfg,rs_cfg}} + local main_pane = MultiPane{parent=root_pane_div,x=1,y=1,panes={main_page,spkr_cfg,net_cfg,log_cfg,clr_cfg,summary,changelog,peri_cfg,rs_cfg}} --#region Main Page @@ -290,7 +303,7 @@ local function config_view(display) tool_ctl.gen_summary(settings_cfg) tool_ctl.settings_apply.hide(true) tool_ctl.settings_confirm.hide(true) - main_pane.set_value(5) + main_pane.set_value(6) end if fs.exists("/rtu/config.lua") then @@ -300,12 +313,12 @@ local function config_view(display) local function show_peri_conns() tool_ctl.gen_peri_summary(ini_cfg) - main_pane.set_value(7) + main_pane.set_value(8) end local function show_rs_conns() tool_ctl.gen_rs_summary(ini_cfg) - main_pane.set_value(8) + main_pane.set_value(9) end PushButton{parent=main_page,x=2,y=y_start,min_width=19,text="Configure Gateway",callback=function()main_pane.set_value(2)end,fg_bg=cpair(colors.black,colors.blue),active_fg_bg=btn_act_fg_bg} @@ -313,15 +326,24 @@ local function config_view(display) tool_ctl.dev_cfg = PushButton{parent=main_page,x=2,y=y_start+4,min_width=24,text="Peripheral Connections",callback=show_peri_conns,fg_bg=cpair(colors.black,colors.yellow),active_fg_bg=btn_act_fg_bg,dis_fg_bg=cpair(colors.lightGray,colors.white)} tool_ctl.rs_cfg = PushButton{parent=main_page,x=2,y=y_start+6,min_width=22,text="Redstone Connections",callback=show_rs_conns,fg_bg=cpair(colors.black,colors.yellow),active_fg_bg=btn_act_fg_bg,dis_fg_bg=cpair(colors.lightGray,colors.white)} + local function jump_color() + tool_ctl.jumped_to_color = true + tool_ctl.color_next.hide() + tool_ctl.color_apply.show(true) + main_pane.set_value(5) + end + + PushButton{parent=main_page,x=2,y=17,min_width=6,text="Exit",callback=exit,fg_bg=cpair(colors.black,colors.red),active_fg_bg=btn_act_fg_bg} + tool_ctl.color_cfg = PushButton{parent=main_page,x=23,y=17,min_width=15,text="Color Options",callback=jump_color,fg_bg=nav_fg_bg,active_fg_bg=btn_act_fg_bg} + PushButton{parent=main_page,x=39,y=17,min_width=12,text="Change Log",callback=function()main_pane.set_value(7)end,fg_bg=nav_fg_bg,active_fg_bg=btn_act_fg_bg} + if not tool_ctl.has_config then tool_ctl.view_gw_cfg.disable() tool_ctl.dev_cfg.disable() tool_ctl.rs_cfg.disable() + tool_ctl.color_cfg.disable() end - PushButton{parent=main_page,x=2,y=17,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=39,y=17,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} - --#endregion --#region Speakers @@ -480,11 +502,8 @@ local function config_view(display) tmp_cfg.LogMode = mode.get_value() - 1 tmp_cfg.LogPath = path.get_value() tmp_cfg.LogDebug = en_dbg.get_value() - tool_ctl.gen_summary(tmp_cfg) - tool_ctl.viewing_config = false - tool_ctl.importing_legacy = false - tool_ctl.settings_apply.show() - tool_ctl.settings_confirm.hide(true) + tool_ctl.color_apply.hide(true) + tool_ctl.color_next.show() main_pane.set_value(5) else path_err.show() end end @@ -494,6 +513,106 @@ local function config_view(display) --#endregion + --#region Color Options + + local clr_c_1 = Div{parent=clr_cfg,x=2,y=4,width=49} + local clr_c_2 = Div{parent=clr_cfg,x=2,y=4,width=49} + local clr_c_3 = Div{parent=clr_cfg,x=2,y=4,width=49} + local clr_c_4 = Div{parent=clr_cfg,x=2,y=4,width=49} + + local clr_pane = MultiPane{parent=clr_cfg,x=1,y=4,panes={clr_c_1,clr_c_2,clr_c_3,clr_c_4}} + + TextBox{parent=clr_cfg,x=1,y=2,height=1,text=" Color Configuration",fg_bg=cpair(colors.black,colors.magenta)} + + TextBox{parent=clr_c_1,x=1,y=1,height=2,text="Here you can select the color theme for the front panel."} + TextBox{parent=clr_c_1,x=1,y=4,height=2,text="Click 'Accessibility' below to access color blind assistive options.",fg_bg=g_lg_fg_bg} + + TextBox{parent=clr_c_1,x=1,y=7,height=1,text="Front Panel Theme"} + local fp_theme = RadioButton{parent=clr_c_1,x=1,y=8,default=ini_cfg.FrontPanelTheme,options={"Sandstone","Basalt"},callback=function()end,radio_colors=cpair(colors.lightGray,colors.black),select_color=colors.magenta} + + TextBox{parent=clr_c_2,x=1,y=1,height=6,text="By default, this project uses green/red heavily to distinguish ok and not, with some indicators also using multiple colors. By selecting a color blindness below, blues will be used instead of greens on indicators and multi-color indicators will be split up as space permits."} + + local function recolor(value) + if value == 1 then + for i = 1, #style.colors do term.setPaletteColor(style.colors[i].c, style.colors[i].hex) end + elseif value == 2 then + term.setPaletteColor(colors.green, 0x1081ff) + term.setPaletteColor(colors.yellow, 0xf5e633) + term.setPaletteColor(colors.red, 0xff521a) + elseif value == 3 then + term.setPaletteColor(colors.green, 0x1081ff) + term.setPaletteColor(colors.yellow, 0xf7c311) + term.setPaletteColor(colors.red, 0xfb5615) + elseif value == 4 then + term.setPaletteColor(colors.green, 0x00ecff) + term.setPaletteColor(colors.yellow, 0xffbc00) + term.setPaletteColor(colors.red, 0xff0000) + end + end + + local c_mode = RadioButton{parent=clr_c_2,x=1,y=8,default=ini_cfg.ColorMode,options={"None","Protanopia","Deuteranopia","Tritanopia"},callback=recolor,radio_colors=cpair(colors.lightGray,colors.black),select_color=colors.magenta} + + local _ = IndLight{parent=clr_c_2,x=20,y=8,label="Good",colors=cpair(colors.black,colors.green),value=true} + _ = IndLight{parent=clr_c_2,x=20,y=9,label="Warning",colors=cpair(colors.black,colors.yellow),value=true} + _ = IndLight{parent=clr_c_2,x=20,y=10,label="Bad",colors=cpair(colors.black,colors.red),value=true} + + TextBox{parent=clr_c_2,x=20,y=12,height=6,text="Exact color varies by theme.",fg_bg=g_lg_fg_bg} + + PushButton{parent=clr_c_2,x=44,y=14,min_width=6,text="Done",callback=function()clr_pane.set_value(1)end,fg_bg=nav_fg_bg,active_fg_bg=btn_act_fg_bg} + + local function back_from_colors() + main_pane.set_value(util.trinary(tool_ctl.jumped_to_color, 1, 4)) + tool_ctl.jumped_to_color = false + recolor(1) + end + + local function show_access() + clr_pane.set_value(2) + recolor(c_mode.get_value()) + end + + local function submit_colors() + tmp_cfg.FrontPanelTheme = fp_theme.get_value() + tmp_cfg.ColorMode = c_mode.get_value() + + if tool_ctl.jumped_to_color then + settings.set("FrontPanelTheme", tmp_cfg.FrontPanelTheme) + settings.set("ColorMode", tmp_cfg.ColorMode) + + if settings.save("/rtu.settings") then + load_settings(settings_cfg, true) + load_settings(ini_cfg) + clr_pane.set_value(3) + else + clr_pane.set_value(4) + end + else + tool_ctl.gen_summary(tmp_cfg) + tool_ctl.viewing_config = false + tool_ctl.importing_legacy = false + tool_ctl.settings_apply.show() + tool_ctl.settings_confirm.hide(true) + main_pane.set_value(6) + end + end + + PushButton{parent=clr_c_1,x=1,y=14,text="\x1b Back",callback=back_from_colors,fg_bg=nav_fg_bg,active_fg_bg=btn_act_fg_bg} + PushButton{parent=clr_c_1,x=8,y=14,min_width=15,text="Accessibility",callback=show_access,fg_bg=nav_fg_bg,active_fg_bg=btn_act_fg_bg} + tool_ctl.color_next = PushButton{parent=clr_c_1,x=44,y=14,text="Next \x1a",callback=submit_colors,fg_bg=nav_fg_bg,active_fg_bg=btn_act_fg_bg} + tool_ctl.color_apply = PushButton{parent=clr_c_1,x=43,y=14,min_width=7,text="Apply",callback=submit_colors,fg_bg=cpair(colors.black,colors.green),active_fg_bg=btn_act_fg_bg} + + tool_ctl.color_apply.hide() + + TextBox{parent=clr_c_3,x=1,y=1,height=1,text="Settings saved!"} + PushButton{parent=clr_c_3,x=1,y=14,min_width=6,text="Exit",callback=exit,fg_bg=cpair(colors.black,colors.red),active_fg_bg=cpair(colors.white,colors.gray)} + PushButton{parent=clr_c_3,x=44,y=14,min_width=6,text="Home",callback=function()tool_ctl.go_home()end,fg_bg=nav_fg_bg,active_fg_bg=btn_act_fg_bg} + + TextBox{parent=clr_c_4,x=1,y=1,height=5,text="Failed to save the settings file.\n\nThere may not be enough space for the modification or server file permissions may be denying writes."} + PushButton{parent=clr_c_4,x=1,y=14,min_width=6,text="Exit",callback=exit,fg_bg=cpair(colors.black,colors.red),active_fg_bg=cpair(colors.white,colors.gray)} + PushButton{parent=clr_c_4,x=44,y=14,min_width=6,text="Home",callback=function()tool_ctl.go_home()end,fg_bg=nav_fg_bg,active_fg_bg=btn_act_fg_bg} + + --#endregion + --#region Summary and Saving local sum_c_1 = Div{parent=summary,x=2,y=4,width=49} @@ -520,7 +639,7 @@ local function config_view(display) end tool_ctl.viewing_config = false - else main_pane.set_value(4) end + else main_pane.set_value(5) end end ---@param element graphics_element @@ -552,6 +671,8 @@ local function config_view(display) try_set(mode, ini_cfg.LogMode) try_set(path, ini_cfg.LogPath) try_set(en_dbg, ini_cfg.LogDebug) + try_set(fp_theme, ini_cfg.FrontPanelTheme) + try_set(c_mode, ini_cfg.ColorMode) if not exclude_conns then tmp_cfg.Peripherals = deep_copy_peri(ini_cfg.Peripherals) @@ -1257,7 +1378,7 @@ local function config_view(display) tool_ctl.gen_summary(tmp_cfg) if tool_ctl.importing_any_dc then sum_pane.set_value(7) else sum_pane.set_value(1) end - main_pane.set_value(5) + main_pane.set_value(6) tool_ctl.settings_apply.hide(true) tool_ctl.settings_confirm.show() tool_ctl.importing_legacy = true @@ -1271,6 +1392,7 @@ local function config_view(display) main_pane.set_value(1) net_pane.set_value(1) + clr_pane.set_value(1) sum_pane.set_value(1) peri_pane.set_value(1) rs_pane.set_value(1) @@ -1301,8 +1423,14 @@ 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)) end - if 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] == "FrontPanelTheme" then + if raw == 1 then val = "Sandstone" elseif raw == 2 then val = "Basalt" end + elseif f[1] == "ColorMode" then + if raw == 1 then val = "Standard" elseif raw == 2 then val = "Protanopia" elseif raw == 3 then val = "Deuteranopia" elseif raw == 4 then val = "Tritanopia" end + end + if val == "nil" then val = "" end local c = util.trinary(alternate, g_lg_fg_bg, cpair(colors.gray,colors.white)) diff --git a/rtu/panel/front_panel.lua b/rtu/panel/front_panel.lua index be81b27..9989e9a 100644 --- a/rtu/panel/front_panel.lua +++ b/rtu/panel/front_panel.lua @@ -22,8 +22,6 @@ local ALIGN = core.ALIGN local cpair = core.cpair -local disabled_fg = style.fp.disabled_fg - local ind_grn = style.ind_grn local UNIT_TYPE_LABELS = { "UNKNOWN", "REDSTONE", "BOILER", "TURBINE", "DYNAMIC TANK", "IND MATRIX", "SPS", "SNA", "ENV DETECTOR" } @@ -32,6 +30,8 @@ local UNIT_TYPE_LABELS = { "UNKNOWN", "REDSTONE", "BOILER", "TURBINE", "DYNAMIC ---@param panel graphics_element main displaybox ---@param units table unit list local function init(panel, units) + local disabled_fg = style.fp.disabled_fg + TextBox{parent=panel,y=1,text="RTU GATEWAY",alignment=ALIGN.CENTER,height=1,fg_bg=style.theme.header} -- diff --git a/rtu/panel/style.lua b/rtu/panel/style.lua index 0b646a3..36fd542 100644 --- a/rtu/panel/style.lua +++ b/rtu/panel/style.lua @@ -10,9 +10,21 @@ local style = {} local cpair = core.cpair -style.theme = themes.basalt +style.theme = themes.sandstone style.fp = themes.get_fp_style(style.theme) style.ind_grn = cpair(colors.green, colors.green_off) +-- set theme per configuration +---@param fp integer fp theme ID (1 = sandstone, 2 = basalt) +function style.set_theme(fp) + if fp == 1 then + style.theme = themes.sandstone + elseif fp == 2 then + style.theme = themes.basalt + end + + style.fp = themes.get_fp_style(style.theme) +end + return style diff --git a/rtu/renderer.lua b/rtu/renderer.lua index 642823a..2a1a235 100644 --- a/rtu/renderer.lua +++ b/rtu/renderer.lua @@ -19,11 +19,15 @@ local ui = { -- try to start the UI ---@param units table RTU units +---@param theme integer front panel theme ID (1 = sandstone, 2 = basalt) ---@return boolean success, any error_msg -function renderer.try_start_ui(units) +function renderer.try_start_ui(units, theme) local status, msg = true, nil if ui.display == nil then + -- set theme + style.set_theme(theme) + -- reset terminal term.setTextColor(colors.white) term.setBackgroundColor(colors.black) diff --git a/rtu/rtu.lua b/rtu/rtu.lua index 6c2b01f..5e49cf9 100644 --- a/rtu/rtu.lua +++ b/rtu/rtu.lua @@ -29,15 +29,20 @@ function rtu.load_config() config.Redstone = settings.get("Redstone") config.SpeakerVolume = settings.get("SpeakerVolume") + config.SVR_Channel = settings.get("SVR_Channel") config.RTU_Channel = settings.get("RTU_Channel") config.ConnTimeout = settings.get("ConnTimeout") config.TrustedRange = settings.get("TrustedRange") config.AuthKey = settings.get("AuthKey") + config.LogMode = settings.get("LogMode") config.LogPath = settings.get("LogPath") config.LogDebug = settings.get("LogDebug") + config.FrontPanelTheme = settings.get("FrontPanelTheme") + config.ColorMode = settings.get("ColorMode") + local cfv = util.new_validator() cfv.assert_type_num(config.SpeakerVolume) @@ -61,6 +66,11 @@ function rtu.load_config() cfv.assert_type_str(config.LogPath) cfv.assert_type_bool(config.LogDebug) + cfv.assert_type_int(config.FrontPanelTheme) + cfv.assert_range(config.FrontPanelTheme, 1, 2) + cfv.assert_type_int(config.ColorMode) + cfv.assert_range(config.ColorMode, 1, 4) + cfv.assert_type_table(config.Peripherals) cfv.assert_type_table(config.Redstone) diff --git a/rtu/startup.lua b/rtu/startup.lua index 90b81a0..8888d05 100644 --- a/rtu/startup.lua +++ b/rtu/startup.lua @@ -506,7 +506,7 @@ local function main() if sys_config() then -- start UI local message - rtu_state.fp_ok, message = renderer.try_start_ui(units) + rtu_state.fp_ok, message = renderer.try_start_ui(units, config.FrontPanelTheme) if not rtu_state.fp_ok then println_ts(util.c("UI error: ", message)) diff --git a/supervisor/configure.lua b/supervisor/configure.lua index 34398b6..0b63519 100644 --- a/supervisor/configure.lua +++ b/supervisor/configure.lua @@ -22,6 +22,8 @@ local RadioButton = require("graphics.elements.controls.radio_button") local NumberField = require("graphics.elements.form.number_field") local TextField = require("graphics.elements.form.text_field") +local IndLight = require("graphics.elements.indicators.light") + local println = util.println local tri = util.trinary @@ -32,7 +34,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 = { + { "v1.2.12", { "Added front panel UI theme", "Added color accessibility modes" } } +} ---@class svr_configurator local configurator = {} @@ -63,13 +67,18 @@ local g_lg_fg_bg = cpair(colors.gray, colors.lightGray) local nav_fg_bg = bw_fg_bg local btn_act_fg_bg = cpair(colors.white, colors.gray) +---@class _svr_cfg_tool_ctl local tool_ctl = { ask_config = false, has_config = false, viewing_config = false, importing_legacy = false, + jumped_to_color = false, view_cfg = nil, ---@type graphics_element + color_cfg = nil, ---@type graphics_element + color_next = nil, ---@type graphics_element + color_apply = nil, ---@type graphics_element settings_apply = nil, ---@type graphics_element gen_summary = nil, ---@type function @@ -108,6 +117,8 @@ local tmp_cfg = { LogMode = 0, LogPath = "", LogDebug = false, + FrontPanelTheme = 1, + ColorMode = 1 } ---@class svr_config @@ -134,7 +145,9 @@ local fields = { { "AuthKey", "Facility Auth Key" , ""}, { "LogMode", "Log Mode", log.MODE.APPEND }, { "LogPath", "Log Path", "/log.txt" }, - { "LogDebug","Log Debug Messages", false } + { "LogDebug","Log Debug Messages", false }, + { "FrontPanelTheme", "Front Panel Theme", 1 }, + { "ColorMode", "Color Mode", 1 } } -- load data from the settings file @@ -164,11 +177,12 @@ local function config_view(display) local svr_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 clr_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 import_err = Div{parent=root_pane_div,x=1,y=1} - local main_pane = MultiPane{parent=root_pane_div,x=1,y=1,panes={main_page,svr_cfg,net_cfg,log_cfg,summary,changelog,import_err}} + local main_pane = MultiPane{parent=root_pane_div,x=1,y=1,panes={main_page,svr_cfg,net_cfg,log_cfg,clr_cfg,summary,changelog,import_err}} -- Main Page @@ -185,7 +199,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(5) + main_pane.set_value(6) end if fs.exists("/supervisor/config.lua") then @@ -196,10 +210,21 @@ local function config_view(display) PushButton{parent=main_page,x=2,y=y_start,min_width=18,text="Configure System",callback=function()main_pane.set_value(2)end,fg_bg=cpair(colors.black,colors.blue),active_fg_bg=btn_act_fg_bg} tool_ctl.view_cfg = PushButton{parent=main_page,x=2,y=y_start+2,min_width=20,text="View Configuration",callback=view_config,fg_bg=cpair(colors.black,colors.blue),active_fg_bg=btn_act_fg_bg,dis_fg_bg=cpair(colors.lightGray,colors.white)} - if not tool_ctl.has_config then tool_ctl.view_cfg.disable() end + local function jump_color() + tool_ctl.jumped_to_color = true + tool_ctl.color_next.hide() + tool_ctl.color_apply.show(true) + main_pane.set_value(5) + end PushButton{parent=main_page,x=2,y=17,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=39,y=17,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} + tool_ctl.color_cfg = PushButton{parent=main_page,x=23,y=17,min_width=15,text="Color Options",callback=jump_color,fg_bg=nav_fg_bg,active_fg_bg=btn_act_fg_bg} + PushButton{parent=main_page,x=39,y=17,min_width=12,text="Change Log",callback=function()main_pane.set_value(7)end,fg_bg=nav_fg_bg,active_fg_bg=btn_act_fg_bg} + + if not tool_ctl.has_config then + tool_ctl.view_cfg.disable() + tool_ctl.color_cfg.disable() + end --#region Facility @@ -721,10 +746,8 @@ local function config_view(display) tmp_cfg.LogMode = mode.get_value() - 1 tmp_cfg.LogPath = path.get_value() tmp_cfg.LogDebug = en_dbg.get_value() - tool_ctl.gen_summary(tmp_cfg) - tool_ctl.viewing_config = false - tool_ctl.importing_legacy = false - tool_ctl.settings_apply.show() + tool_ctl.color_apply.hide(true) + tool_ctl.color_next.show() main_pane.set_value(5) else path_err.show() end end @@ -734,6 +757,110 @@ local function config_view(display) --#endregion + --#region Color Options + + local clr_c_1 = Div{parent=clr_cfg,x=2,y=4,width=49} + local clr_c_2 = Div{parent=clr_cfg,x=2,y=4,width=49} + local clr_c_3 = Div{parent=clr_cfg,x=2,y=4,width=49} + local clr_c_4 = Div{parent=clr_cfg,x=2,y=4,width=49} + + local clr_pane = MultiPane{parent=clr_cfg,x=1,y=4,panes={clr_c_1,clr_c_2,clr_c_3,clr_c_4}} + + TextBox{parent=clr_cfg,x=1,y=2,height=1,text=" Color Configuration",fg_bg=cpair(colors.black,colors.magenta)} + + TextBox{parent=clr_c_1,x=1,y=1,height=2,text="Here you can select the color theme for the front panel."} + TextBox{parent=clr_c_1,x=1,y=4,height=2,text="Click 'Accessibility' below to access color blind assistive options.",fg_bg=g_lg_fg_bg} + + TextBox{parent=clr_c_1,x=1,y=7,height=1,text="Front Panel Theme"} + local fp_theme = RadioButton{parent=clr_c_1,x=1,y=8,default=ini_cfg.FrontPanelTheme,options={"Sandstone","Basalt"},callback=function()end,radio_colors=cpair(colors.lightGray,colors.black),select_color=colors.magenta} + + TextBox{parent=clr_c_2,x=1,y=1,height=6,text="By default, this project uses green/red heavily to distinguish ok and not, with some indicators also using multiple colors. By selecting a color blindness below, blues will be used instead of greens on indicators and multi-color indicators will be split up as space permits."} + + local function recolor(value) + if value == 1 then + for i = 1, #style.colors do term.setPaletteColor(style.colors[i].c, style.colors[i].hex) end + elseif value == 2 then + term.setPaletteColor(colors.green, 0x1081ff) + term.setPaletteColor(colors.yellow, 0xf5e633) + term.setPaletteColor(colors.red, 0xff521a) + elseif value == 3 then + term.setPaletteColor(colors.green, 0x1081ff) + term.setPaletteColor(colors.yellow, 0xf7c311) + term.setPaletteColor(colors.red, 0xfb5615) + elseif value == 4 then + term.setPaletteColor(colors.green, 0x00ecff) + term.setPaletteColor(colors.yellow, 0xffbc00) + term.setPaletteColor(colors.red, 0xff0000) + end + end + + local c_mode = RadioButton{parent=clr_c_2,x=1,y=8,default=ini_cfg.ColorMode,options={"None","Protanopia","Deuteranopia","Tritanopia"},callback=recolor,radio_colors=cpair(colors.lightGray,colors.black),select_color=colors.magenta} + + local _ = IndLight{parent=clr_c_2,x=20,y=8,label="Good",colors=cpair(colors.black,colors.green),value=true} + _ = IndLight{parent=clr_c_2,x=20,y=9,label="Warning",colors=cpair(colors.black,colors.yellow),value=true} + _ = IndLight{parent=clr_c_2,x=20,y=10,label="Bad",colors=cpair(colors.black,colors.red),value=true} + + TextBox{parent=clr_c_2,x=20,y=12,height=6,text="Exact color varies by theme.",fg_bg=g_lg_fg_bg} + + PushButton{parent=clr_c_2,x=44,y=14,min_width=6,text="Done",callback=function()clr_pane.set_value(1)end,fg_bg=nav_fg_bg,active_fg_bg=btn_act_fg_bg} + + local function back_from_colors() + main_pane.set_value(util.trinary(tool_ctl.jumped_to_color, 1, 4)) + tool_ctl.jumped_to_color = false + recolor(1) + end + + local function show_access() + clr_pane.set_value(2) + recolor(c_mode.get_value()) + end + + local function submit_colors() + tmp_cfg.FrontPanelTheme = fp_theme.get_value() + tmp_cfg.ColorMode = c_mode.get_value() + + if tool_ctl.jumped_to_color then + settings.set("FrontPanelTheme", tmp_cfg.FrontPanelTheme) + settings.set("ColorMode", tmp_cfg.ColorMode) + + if settings.save("/supervisor.settings") then + load_settings(settings_cfg, true) + load_settings(ini_cfg) + clr_pane.set_value(3) + else + clr_pane.set_value(4) + end + else + tool_ctl.gen_summary(tmp_cfg) + tool_ctl.viewing_config = false + tool_ctl.importing_legacy = false + tool_ctl.settings_apply.show() + main_pane.set_value(6) + end + end + + PushButton{parent=clr_c_1,x=1,y=14,text="\x1b Back",callback=back_from_colors,fg_bg=nav_fg_bg,active_fg_bg=btn_act_fg_bg} + PushButton{parent=clr_c_1,x=8,y=14,min_width=15,text="Accessibility",callback=show_access,fg_bg=nav_fg_bg,active_fg_bg=btn_act_fg_bg} + tool_ctl.color_next = PushButton{parent=clr_c_1,x=44,y=14,text="Next \x1a",callback=submit_colors,fg_bg=nav_fg_bg,active_fg_bg=btn_act_fg_bg} + tool_ctl.color_apply = PushButton{parent=clr_c_1,x=43,y=14,min_width=7,text="Apply",callback=submit_colors,fg_bg=cpair(colors.black,colors.green),active_fg_bg=btn_act_fg_bg} + + tool_ctl.color_apply.hide() + + local function c_go_home() + main_pane.set_value(1) + clr_pane.set_value(1) + end + + TextBox{parent=clr_c_3,x=1,y=1,height=1,text="Settings saved!"} + PushButton{parent=clr_c_3,x=1,y=14,min_width=6,text="Exit",callback=exit,fg_bg=cpair(colors.black,colors.red),active_fg_bg=cpair(colors.white,colors.gray)} + PushButton{parent=clr_c_3,x=44,y=14,min_width=6,text="Home",callback=c_go_home,fg_bg=nav_fg_bg,active_fg_bg=btn_act_fg_bg} + + TextBox{parent=clr_c_4,x=1,y=1,height=5,text="Failed to save the settings file.\n\nThere may not be enough space for the modification or server file permissions may be denying writes."} + PushButton{parent=clr_c_4,x=1,y=14,min_width=6,text="Exit",callback=exit,fg_bg=cpair(colors.black,colors.red),active_fg_bg=cpair(colors.white,colors.gray)} + PushButton{parent=clr_c_4,x=44,y=14,min_width=6,text="Home",callback=c_go_home,fg_bg=nav_fg_bg,active_fg_bg=btn_act_fg_bg} + + --#endregion + --#region Summary and Saving local sum_c_1 = Div{parent=summary,x=2,y=4,width=49} @@ -754,7 +881,7 @@ local function config_view(display) tool_ctl.importing_legacy = false tool_ctl.settings_apply.show() else - main_pane.set_value(4) + main_pane.set_value(5) end end @@ -787,6 +914,8 @@ local function config_view(display) try_set(mode, ini_cfg.LogMode) try_set(path, ini_cfg.LogPath) try_set(en_dbg, ini_cfg.LogDebug) + try_set(fp_theme, ini_cfg.FrontPanelTheme) + try_set(c_mode, ini_cfg.ColorMode) for i = 1, #ini_cfg.CoolingConfig do local cfg, elems = ini_cfg.CoolingConfig[i], tool_ctl.cooling_elems[i] @@ -824,6 +953,7 @@ local function config_view(display) main_pane.set_value(1) svr_pane.set_value(1) net_pane.set_value(1) + clr_pane.set_value(1) sum_pane.set_value(1) end @@ -887,7 +1017,7 @@ local function config_view(display) if config.REACTOR_COOLING == nil or tmp_cfg.UnitCount ~= #config.REACTOR_COOLING then import_err_msg.set_value("Cooling configuration table length must match the number of units.") - main_pane.set_value(7) + main_pane.set_value(8) return end @@ -896,7 +1026,7 @@ local function config_view(display) if type(cfg) ~= "table" then import_err_msg.set_value("Cooling configuration for unit " .. i .. " must be a table.") - main_pane.set_value(7) + main_pane.set_value(8) return end @@ -907,14 +1037,14 @@ local function config_view(display) if not (util.is_int(tmp_cfg.FacilityTankMode) and tmp_cfg.FacilityTankMode >= 0 and tmp_cfg.FacilityTankMode <= 8) then import_err_msg.set_value("Invalid tank mode present in config. FAC_TANK_MODE must be a number 0 through 8.") - main_pane.set_value(7) + main_pane.set_value(8) return end if config.FAC_TANK_MODE > 0 then if config.FAC_TANK_DEFS == nil or tmp_cfg.UnitCount ~= #config.FAC_TANK_DEFS then import_err_msg.set_value("Facility tank definitions table length must match the number of units when using facility tanks.") - main_pane.set_value(7) + main_pane.set_value(8) return end @@ -945,7 +1075,7 @@ local function config_view(display) tool_ctl.gen_summary(tmp_cfg) sum_pane.set_value(1) - main_pane.set_value(5) + main_pane.set_value(6) tool_ctl.importing_legacy = true end @@ -976,6 +1106,10 @@ 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] == "FrontPanelTheme" then + if raw == 1 then val = "Sandstone" elseif raw == 2 then val = "Basalt" end + elseif f[1] == "ColorMode" then + if raw == 1 then val = "Standard" elseif raw == 2 then val = "Protanopia" elseif raw == 3 then val = "Deuteranopia" elseif raw == 4 then val = "Tritanopia" end elseif f[1] == "CoolingConfig" and type(cfg.CoolingConfig) == "table" then val = "" diff --git a/supervisor/panel/components/pdg_entry.lua b/supervisor/panel/components/pdg_entry.lua index 7156285..740bb37 100644 --- a/supervisor/panel/components/pdg_entry.lua +++ b/supervisor/panel/components/pdg_entry.lua @@ -17,18 +17,17 @@ local ALIGN = core.ALIGN local cpair = core.cpair -local s_hi_box = style.theme.highlight_box -local s_hi_bright = style.theme.highlight_box_bright - local label_fg = style.fp.label_fg -- create a pocket diagnostics list entry ---@param parent graphics_element parent ---@param id integer PDG session ID local function init(parent, id) + local s_hi_box = style.theme.highlight_box + -- root div local root = Div{parent=parent,x=2,y=2,height=4,width=parent.get_width()-2,hidden=true} - local entry = Div{parent=root,x=2,y=1,height=3,fg_bg=s_hi_bright} + local entry = Div{parent=root,x=2,y=1,height=3,fg_bg=style.theme.highlight_box_bright} local ps_prefix = "pdg_" .. id .. "_" diff --git a/supervisor/panel/components/rtu_entry.lua b/supervisor/panel/components/rtu_entry.lua index 518dfe9..e09a048 100644 --- a/supervisor/panel/components/rtu_entry.lua +++ b/supervisor/panel/components/rtu_entry.lua @@ -17,18 +17,17 @@ local ALIGN = core.ALIGN local cpair = core.cpair -local s_hi_box = style.theme.highlight_box -local s_hi_bright = style.theme.highlight_box_bright - local label_fg = style.fp.label_fg -- create an RTU list entry ---@param parent graphics_element parent ---@param id integer RTU session ID local function init(parent, id) + local s_hi_box = style.theme.highlight_box + -- root div local root = Div{parent=parent,x=2,y=2,height=4,width=parent.get_width()-2,hidden=true} - local entry = Div{parent=root,x=2,y=1,height=3,fg_bg=s_hi_bright} + local entry = Div{parent=root,x=2,y=1,height=3,fg_bg=style.theme.highlight_box_bright} local ps_prefix = "rtu_" .. id .. "_" diff --git a/supervisor/panel/front_panel.lua b/supervisor/panel/front_panel.lua index fccb5b0..add7fcf 100644 --- a/supervisor/panel/front_panel.lua +++ b/supervisor/panel/front_panel.lua @@ -29,17 +29,17 @@ local ALIGN = core.ALIGN local cpair = core.cpair -local s_hi_box = style.theme.highlight_box -local s_hi_bright = style.theme.highlight_box_bright - -local label_fg = style.fp.label_fg -local label_d_fg = style.fp.label_d_fg - local ind_grn = style.ind_grn -- create new front panel view ---@param panel graphics_element main displaybox local function init(panel) + local s_hi_box = style.theme.highlight_box + local s_hi_bright = style.theme.highlight_box_bright + + local label_fg = style.fp.label_fg + local label_d_fg = style.fp.label_d_fg + TextBox{parent=panel,y=1,text="SCADA SUPERVISOR",alignment=ALIGN.CENTER,height=1,fg_bg=style.theme.header} local page_div = Div{parent=panel,x=1,y=3} diff --git a/supervisor/panel/style.lua b/supervisor/panel/style.lua index 7237bfb..e3f1138 100644 --- a/supervisor/panel/style.lua +++ b/supervisor/panel/style.lua @@ -15,4 +15,16 @@ style.fp = themes.get_fp_style(style.theme) style.ind_grn = cpair(colors.green, colors.green_off) +-- set theme per configuration +---@param fp integer fp theme ID (1 = sandstone, 2 = basalt) +function style.set_theme(fp) + if fp == 1 then + style.theme = themes.sandstone + elseif fp == 2 then + style.theme = themes.basalt + end + + style.fp = themes.get_fp_style(style.theme) +end + return style diff --git a/supervisor/renderer.lua b/supervisor/renderer.lua index 42fe771..8f9389f 100644 --- a/supervisor/renderer.lua +++ b/supervisor/renderer.lua @@ -19,11 +19,15 @@ local ui = { } -- try to start the UI +---@param theme integer front panel theme ID (1 = sandstone, 2 = basalt) ---@return boolean success, any error_msg -function renderer.try_start_ui() +function renderer.try_start_ui(theme) local status, msg = true, nil if ui.display == nil then + -- set theme + style.set_theme(theme) + -- reset terminal term.setTextColor(colors.white) term.setBackgroundColor(colors.black) diff --git a/supervisor/startup.lua b/supervisor/startup.lua index a35081c..d9c2229 100644 --- a/supervisor/startup.lua +++ b/supervisor/startup.lua @@ -118,7 +118,7 @@ local function main() databus.tx_hw_modem(true) -- start UI - local fp_ok, message = renderer.try_start_ui() + local fp_ok, message = renderer.try_start_ui(config.FrontPanelTheme) if not fp_ok then println_ts(util.c("UI error: ", message)) diff --git a/supervisor/supervisor.lua b/supervisor/supervisor.lua index 27bf22c..43536c6 100644 --- a/supervisor/supervisor.lua +++ b/supervisor/supervisor.lua @@ -43,6 +43,9 @@ function supervisor.load_config() config.LogPath = settings.get("LogPath") config.LogDebug = settings.get("LogDebug") + config.FrontPanelTheme = settings.get("FrontPanelTheme") + config.ColorMode = settings.get("ColorMode") + local cfv = util.new_validator() cfv.assert_type_int(config.UnitCount) @@ -81,6 +84,11 @@ function supervisor.load_config() cfv.assert_type_str(config.LogPath) cfv.assert_type_bool(config.LogDebug) + cfv.assert_type_int(config.FrontPanelTheme) + cfv.assert_range(config.FrontPanelTheme, 1, 2) + cfv.assert_type_int(config.ColorMode) + cfv.assert_range(config.ColorMode, 1, 4) + return cfv.valid() end From 814043bf04fd98dd82e38895d88469475216ff0b Mon Sep 17 00:00:00 2001 From: Mikayla Fischler Date: Thu, 7 Mar 2024 20:46:10 -0500 Subject: [PATCH 15/44] #405 basalt theme color adjustments --- graphics/themes.lua | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/graphics/themes.lua b/graphics/themes.lua index 1be7238..e7ded0d 100644 --- a/graphics/themes.lua +++ b/graphics/themes.lua @@ -65,17 +65,17 @@ themes.basalt = { field_box = cpair(colors.white, colors.gray), colors = { - { c = colors.red, hex = 0xdc6466 }, -- RED ON + { c = colors.red, hex = 0xf18486 }, -- RED ON { c = colors.orange, hex = 0xffb659 }, - { c = colors.yellow, hex = 0xebdf75 }, -- YELLOW ON - { c = colors.lime, hex = 0x496b41 }, -- GREEN OFF - { c = colors.green, hex = 0x81db6d }, -- GREEN ON + { c = colors.yellow, hex = 0xefe37c }, -- YELLOW ON + { c = colors.lime, hex = 0x436b41 }, -- GREEN OFF + { c = colors.green, hex = 0x7ae175 }, -- GREEN ON { c = colors.cyan, hex = 0x5ec7d1 }, { c = colors.lightBlue, hex = 0x7dc6f2 }, { c = colors.blue, hex = 0x56aae6 }, { c = colors.purple, hex = 0xe9cd68 }, -- YELLOW HIGH CONTRAST { c = colors.pink, hex = 0x4d4e52 }, -- IVORY - { c = colors.magenta, hex = 0x6b6c36 }, -- YELLOW OFF + { c = colors.magenta, hex = 0x757040 }, -- YELLOW OFF { c = colors.white, hex = 0xbfbfbf }, { c = colors.lightGray, hex = 0x848794 }, { c = colors.gray, hex = 0x5c5f68 }, From 6c89b3134c31d71499430de59fc498a7ccfa351d Mon Sep 17 00:00:00 2001 From: Mikayla Fischler Date: Sat, 9 Mar 2024 12:39:37 -0500 Subject: [PATCH 16/44] #405 make pu fallback selector visible --- coordinator/ui/components/process_ctl.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/coordinator/ui/components/process_ctl.lua b/coordinator/ui/components/process_ctl.lua index 32286c8..e1c3252 100644 --- a/coordinator/ui/components/process_ctl.lua +++ b/coordinator/ui/components/process_ctl.lua @@ -341,7 +341,7 @@ local function new_view(root, x, y) status.register(facility.ps, "current_waste_product", status.update) local waste_prod = RadioButton{parent=rect,x=2,y=3,options=style.waste.options,callback=process.set_process_waste,radio_colors=cpair(style.theme.accent_dark,style.theme.accent_light),select_color=colors.brown} - local pu_fallback = Checkbox{parent=rect,x=2,y=7,label="Pu Fallback",callback=process.set_pu_fallback,box_fg_bg=cpair(colors.green,colors.black)} + local pu_fallback = Checkbox{parent=rect,x=2,y=7,label="Pu Fallback",callback=process.set_pu_fallback,box_fg_bg=cpair(colors.green,style.theme.accent_light)} waste_prod.register(facility.ps, "process_waste_product", waste_prod.set_value) pu_fallback.register(facility.ps, "process_pu_fallback", pu_fallback.set_value) From 5d760a05241ad868086e4bee36d4c60eee7a72f3 Mon Sep 17 00:00:00 2001 From: Mikayla Fischler Date: Sat, 9 Mar 2024 12:41:45 -0500 Subject: [PATCH 17/44] #405 helper functions, enums, and name tables added to themes.lua --- coordinator/configure.lua | 19 +++--- graphics/themes.lua | 140 ++++++++++++++++++++++++++++---------- 2 files changed, 113 insertions(+), 46 deletions(-) diff --git a/coordinator/configure.lua b/coordinator/configure.lua index 3afe54a..6e16757 100644 --- a/coordinator/configure.lua +++ b/coordinator/configure.lua @@ -8,6 +8,7 @@ local network = require("scada-common.network") local ppm = require("scada-common.ppm") local tcd = require("scada-common.tcd") local util = require("scada-common.util") +local themes = require("graphics.themes") local core = require("graphics.core") @@ -174,9 +175,9 @@ local fields = { { "LogMode", "Log Mode", log.MODE.APPEND }, { "LogPath", "Log Path", "/log.txt" }, { "LogDebug","Log Debug Messages", false }, - { "MainTheme", "Main UI Theme", 1 }, - { "FrontPanelTheme", "Front Panel Theme", 1 }, - { "ColorMode", "Color Mode", 1 } + { "MainTheme", "Main UI Theme", themes.UI_THEME.SMOOTH_STONE }, + { "FrontPanelTheme", "Front Panel Theme", themes.FP_THEME.SANDSTONE }, + { "ColorMode", "Color Mode", themes.COLOR_MODE.STANDARD } } -- check if a value is an integer within a range (inclusive) @@ -832,10 +833,10 @@ local function config_view(display) TextBox{parent=clr_c_1,x=1,y=4,height=2,text="Click 'Accessibility' below to access color blind assistive options.",fg_bg=g_lg_fg_bg} TextBox{parent=clr_c_1,x=1,y=7,height=1,text="Main UI Theme"} - local main_theme = RadioButton{parent=clr_c_1,x=1,y=8,default=ini_cfg.MainTheme,options={"Smooth Stone","Deepslate"},callback=function()end,radio_colors=cpair(colors.lightGray,colors.black),select_color=colors.magenta} + local main_theme = RadioButton{parent=clr_c_1,x=1,y=8,default=ini_cfg.MainTheme,options=themes.UI_THEME_NAMES,callback=function()end,radio_colors=cpair(colors.lightGray,colors.black),select_color=colors.magenta} TextBox{parent=clr_c_1,x=18,y=7,height=1,text="Front Panel Theme"} - local fp_theme = RadioButton{parent=clr_c_1,x=18,y=8,default=ini_cfg.FrontPanelTheme,options={"Sandstone","Basalt"},callback=function()end,radio_colors=cpair(colors.lightGray,colors.black),select_color=colors.magenta} + local fp_theme = RadioButton{parent=clr_c_1,x=18,y=8,default=ini_cfg.FrontPanelTheme,options=themes.FP_THEME_NAMES,callback=function()end,radio_colors=cpair(colors.lightGray,colors.black),select_color=colors.magenta} TextBox{parent=clr_c_2,x=1,y=1,height=6,text="By default, this project uses green/red heavily to distinguish ok and not, with some indicators also using multiple colors. By selecting a color blindness below, blues will be used instead of greens on indicators and multi-color indicators will be split up as space permits."} @@ -857,7 +858,7 @@ local function config_view(display) end end - local c_mode = RadioButton{parent=clr_c_2,x=1,y=8,default=ini_cfg.ColorMode,options={"None","Protanopia","Deuteranopia","Tritanopia"},callback=recolor,radio_colors=cpair(colors.lightGray,colors.black),select_color=colors.magenta} + local c_mode = RadioButton{parent=clr_c_2,x=1,y=8,default=ini_cfg.ColorMode,options=themes.COLOR_MODE_NAMES,callback=recolor,radio_colors=cpair(colors.lightGray,colors.black),select_color=colors.magenta} local _ = IndLight{parent=clr_c_2,x=20,y=8,label="Good",colors=cpair(colors.black,colors.green),value=true} _ = IndLight{parent=clr_c_2,x=20,y=9,label="Warning",colors=cpair(colors.black,colors.yellow),value=true} @@ -1332,11 +1333,11 @@ local function config_view(display) 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 elseif f[1] == "MainTheme" then - if raw == 1 then val = "Smooth Stone" elseif raw == 2 then val = "Deepslate" end + val = util.strval(themes.ui_theme_name(raw)) elseif f[1] == "FrontPanelTheme" then - if raw == 1 then val = "Sandstone" elseif raw == 2 then val = "Basalt" end + val = util.strval(themes.fp_theme_name(raw)) elseif f[1] == "ColorMode" then - if raw == 1 then val = "Standard" elseif raw == 2 then val = "Protanopia" elseif raw == 3 then val = "Deuteranopia" elseif raw == 4 then val = "Tritanopia" end + val = util.strval(themes.color_mode_name(raw)) elseif f[1] == "UnitDisplays" and type(cfg.UnitDisplays) == "table" then val = "" for idx = 1, #cfg.UnitDisplays do diff --git a/graphics/themes.lua b/graphics/themes.lua index e7ded0d..c454aab 100644 --- a/graphics/themes.lua +++ b/graphics/themes.lua @@ -9,12 +9,76 @@ local cpair = core.cpair ---@class graphics_themes local themes = {} --- add color mappings for front panel -colors.ivory = colors.pink -colors.yellow_hc = colors.purple -colors.red_off = colors.brown +-- add color mappings for front panels +colors.ivory = colors.pink +colors.yellow_hc = colors.purple +colors.red_off = colors.brown colors.yellow_off = colors.magenta -colors.green_off = colors.lime +colors.green_off = colors.lime + +--#region Types + +---@enum UI_THEME +themes.UI_THEME = { SMOOTH_STONE = 1, DEEPSLATE = 2 } +themes.UI_THEME_NAMES = { "Smooth Stone", "Deepslate" } + +-- attempts to get the string name of a main ui theme +---@nodiscard +---@param id any +---@return string|nil +function themes.ui_theme_name(id) + if id == themes.UI_THEME.SMOOTH_STONE or + id == themes.UI_THEME.DEEPSLATE then + return themes.UI_THEME_NAMES[id] + else return nil end +end + +---@enum FP_THEME +themes.FP_THEME = { SANDSTONE = 1, BASALT = 2 } +themes.FP_THEME_NAMES = { "Sandstone", "Basalt" } + +-- attempts to get the string name of a front panel theme +---@nodiscard +---@param id any +---@return string|nil +function themes.fp_theme_name(id) + if id == themes.FP_THEME.SANDSTONE or + id == themes.FP_THEME.BASALT then + return themes.FP_THEME_NAMES[id] + else return nil end +end + +---@enum COLOR_MODE +themes.COLOR_MODE = { + STANDARD = 1, + DEUTERANOPIA = 2, + PROTANOPIA = 3, + TRITANOPIA = 4 +} + +themes.COLOR_MODE_NAMES = { + "Standard", + "Deuteranopia", + "Protanopia", + "Tritanopia" +} + +-- attempts to get the string name of a color mode +---@nodiscard +---@param id any +---@return string|nil +function themes.color_mode_name(id) + if id == themes.COLOR_MODE.STANDARD or + id == themes.COLOR_MODE.DEUTERANOPIA or + id == themes.COLOR_MODE.PROTANOPIA or + id == themes.COLOR_MODE.TRITANOPIA then + return themes.COLOR_MODE_NAMES[id] + else return nil end +end + +--#endregion + +--#region Front Panel Themes ---@class fp_theme themes.sandstone = { @@ -31,22 +95,22 @@ themes.sandstone = { field_box = cpair(colors.gray, colors.white), colors = { - { c = colors.red, hex = 0xdf4949 }, -- RED ON - { c = colors.orange, hex = 0xffb659 }, - { c = colors.yellow, hex = 0xf9fb53 }, -- YELLOW ON - { c = colors.lime, hex = 0x16665a }, -- GREEN OFF - { c = colors.green, hex = 0x6be551 }, -- GREEN ON - { c = colors.cyan, hex = 0x34bac8 }, - { c = colors.lightBlue, hex = 0x6cc0f2 }, - { c = colors.blue, hex = 0x0096ff }, - { c = colors.purple, hex = 0xe3bc2a }, -- YELLOW HIGH CONTRAST - { c = colors.pink, hex = 0xdcd9ca }, -- IVORY - { c = colors.magenta, hex = 0x85862c }, -- YELLOW OFF - { c = colors.white, hex = 0xf0f0f0 }, - { c = colors.lightGray, hex = 0xb1b8b3 }, - { c = colors.gray, hex = 0x575757 }, - { c = colors.black, hex = 0x191919 }, - { c = colors.brown, hex = 0x672223 } -- RED OFF + { c = colors.red, hex = 0xdf4949 }, + { c = colors.orange, hex = 0xffb659 }, + { c = colors.yellow, hex = 0xf9fb53 }, + { c = colors.green_off, hex = 0x16665a }, + { c = colors.green, hex = 0x6be551 }, + { c = colors.cyan, hex = 0x34bac8 }, + { c = colors.lightBlue, hex = 0x6cc0f2 }, + { c = colors.blue, hex = 0x0096ff }, + { c = colors.yellow_hc, hex = 0xe3bc2a }, + { c = colors.ivory, hex = 0xdcd9ca }, + { c = colors.yellow_off, hex = 0x85862c }, + { c = colors.white, hex = 0xf0f0f0 }, + { c = colors.lightGray, hex = 0xb1b8b3 }, + { c = colors.gray, hex = 0x575757 }, + { c = colors.black, hex = 0x191919 }, + { c = colors.red_off, hex = 0x672223 } } } @@ -65,22 +129,22 @@ themes.basalt = { field_box = cpair(colors.white, colors.gray), colors = { - { c = colors.red, hex = 0xf18486 }, -- RED ON - { c = colors.orange, hex = 0xffb659 }, - { c = colors.yellow, hex = 0xefe37c }, -- YELLOW ON - { c = colors.lime, hex = 0x436b41 }, -- GREEN OFF - { c = colors.green, hex = 0x7ae175 }, -- GREEN ON - { c = colors.cyan, hex = 0x5ec7d1 }, - { c = colors.lightBlue, hex = 0x7dc6f2 }, - { c = colors.blue, hex = 0x56aae6 }, - { c = colors.purple, hex = 0xe9cd68 }, -- YELLOW HIGH CONTRAST - { c = colors.pink, hex = 0x4d4e52 }, -- IVORY - { c = colors.magenta, hex = 0x757040 }, -- YELLOW OFF - { c = colors.white, hex = 0xbfbfbf }, - { c = colors.lightGray, hex = 0x848794 }, - { c = colors.gray, hex = 0x5c5f68 }, - { c = colors.black, hex = 0x262626 }, - { c = colors.brown, hex = 0x653839 } -- RED OFF + { c = colors.red, hex = 0xf18486 }, + { c = colors.orange, hex = 0xffb659 }, + { c = colors.yellow, hex = 0xefe37c }, + { c = colors.green_off, hex = 0x436b41 }, + { c = colors.green, hex = 0x7ae175 }, + { c = colors.cyan, hex = 0x5ec7d1 }, + { c = colors.lightBlue, hex = 0x7dc6f2 }, + { c = colors.blue, hex = 0x56aae6 }, + { c = colors.yellow_hc, hex = 0xe9cd68 }, + { c = colors.ivory, hex = 0x4d4e52 }, + { c = colors.yellow_off, hex = 0x757040 }, + { c = colors.white, hex = 0xbfbfbf }, + { c = colors.lightGray, hex = 0x848794 }, + { c = colors.gray, hex = 0x5c5f68 }, + { c = colors.black, hex = 0x262626 }, + { c = colors.red_off, hex = 0x653839 } } } @@ -103,4 +167,6 @@ function themes.get_fp_style(theme) return style end +--#endregion + return themes From 79c93f1562fe84f44f72bff01dbf5cc89aa1f414 Mon Sep 17 00:00:00 2001 From: Mikayla Fischler Date: Sat, 9 Mar 2024 13:24:06 -0500 Subject: [PATCH 18/44] #445 fixed PPM undefined field logic and improved RTU unit fault handling --- rtu/dev/boilerv_rtu.lua | 2 +- rtu/dev/dynamicv_rtu.lua | 2 +- rtu/dev/envd_rtu.lua | 2 +- rtu/dev/imatrix_rtu.lua | 2 +- rtu/dev/sna_rtu.lua | 2 +- rtu/dev/sps_rtu.lua | 2 +- rtu/dev/turbinev_rtu.lua | 2 +- rtu/modbus.lua | 28 ++++--------------------- rtu/rtu.lua | 28 ++++++++++++------------- rtu/startup.lua | 2 +- scada-common/ppm.lua | 44 +++++++++++++++++++++------------------- 11 files changed, 49 insertions(+), 67 deletions(-) diff --git a/rtu/dev/boilerv_rtu.lua b/rtu/dev/boilerv_rtu.lua index 0197421..cb4f701 100644 --- a/rtu/dev/boilerv_rtu.lua +++ b/rtu/dev/boilerv_rtu.lua @@ -7,7 +7,7 @@ local boilerv_rtu = {} ---@param boiler table ---@return rtu_device interface, boolean faulted function boilerv_rtu.new(boiler) - local unit = rtu.init_unit() + local unit = rtu.init_unit(boiler) -- disable auto fault clearing boiler.__p_clear_fault() diff --git a/rtu/dev/dynamicv_rtu.lua b/rtu/dev/dynamicv_rtu.lua index 75540a3..987e366 100644 --- a/rtu/dev/dynamicv_rtu.lua +++ b/rtu/dev/dynamicv_rtu.lua @@ -7,7 +7,7 @@ local dynamicv_rtu = {} ---@param dynamic_tank table ---@return rtu_device interface, boolean faulted function dynamicv_rtu.new(dynamic_tank) - local unit = rtu.init_unit() + local unit = rtu.init_unit(dynamic_tank) -- disable auto fault clearing dynamic_tank.__p_clear_fault() diff --git a/rtu/dev/envd_rtu.lua b/rtu/dev/envd_rtu.lua index 2d576bc..f6dfa09 100644 --- a/rtu/dev/envd_rtu.lua +++ b/rtu/dev/envd_rtu.lua @@ -7,7 +7,7 @@ local envd_rtu = {} ---@param envd table ---@return rtu_device interface, boolean faulted function envd_rtu.new(envd) - local unit = rtu.init_unit() + local unit = rtu.init_unit(envd) -- disable auto fault clearing envd.__p_clear_fault() diff --git a/rtu/dev/imatrix_rtu.lua b/rtu/dev/imatrix_rtu.lua index a20d1a5..f3b7f5c 100644 --- a/rtu/dev/imatrix_rtu.lua +++ b/rtu/dev/imatrix_rtu.lua @@ -7,7 +7,7 @@ local imatrix_rtu = {} ---@param imatrix table ---@return rtu_device interface, boolean faulted function imatrix_rtu.new(imatrix) - local unit = rtu.init_unit() + local unit = rtu.init_unit(imatrix) -- disable auto fault clearing imatrix.__p_clear_fault() diff --git a/rtu/dev/sna_rtu.lua b/rtu/dev/sna_rtu.lua index a3e678e..209ebb2 100644 --- a/rtu/dev/sna_rtu.lua +++ b/rtu/dev/sna_rtu.lua @@ -7,7 +7,7 @@ local sna_rtu = {} ---@param sna table ---@return rtu_device interface, boolean faulted function sna_rtu.new(sna) - local unit = rtu.init_unit() + local unit = rtu.init_unit(sna) -- disable auto fault clearing sna.__p_clear_fault() diff --git a/rtu/dev/sps_rtu.lua b/rtu/dev/sps_rtu.lua index 428f7bb..448dc48 100644 --- a/rtu/dev/sps_rtu.lua +++ b/rtu/dev/sps_rtu.lua @@ -7,7 +7,7 @@ local sps_rtu = {} ---@param sps table ---@return rtu_device interface, boolean faulted function sps_rtu.new(sps) - local unit = rtu.init_unit() + local unit = rtu.init_unit(sps) -- disable auto fault clearing sps.__p_clear_fault() diff --git a/rtu/dev/turbinev_rtu.lua b/rtu/dev/turbinev_rtu.lua index 17e6675..4bfad81 100644 --- a/rtu/dev/turbinev_rtu.lua +++ b/rtu/dev/turbinev_rtu.lua @@ -7,7 +7,7 @@ local turbinev_rtu = {} ---@param turbine table ---@return rtu_device interface, boolean faulted function turbinev_rtu.new(turbine) - local unit = rtu.init_unit() + local unit = rtu.init_unit(turbine) -- disable auto fault clearing turbine.__p_clear_fault() diff --git a/rtu/modbus.lua b/rtu/modbus.lua index 44900a0..d55907f 100644 --- a/rtu/modbus.lua +++ b/rtu/modbus.lua @@ -37,12 +37,7 @@ function modbus.new(rtu_dev, use_parallel_read) end) else readings[i], access_fault = rtu_dev.read_coil(addr) - - if access_fault then - return_ok = false - readings = MODBUS_EXCODE.SERVER_DEVICE_FAIL - break - end + if access_fault then break end end end @@ -86,12 +81,7 @@ function modbus.new(rtu_dev, use_parallel_read) end) else readings[i], access_fault = rtu_dev.read_di(addr) - - if access_fault then - return_ok = false - readings = MODBUS_EXCODE.SERVER_DEVICE_FAIL - break - end + if access_fault then break end end end @@ -135,12 +125,7 @@ function modbus.new(rtu_dev, use_parallel_read) end) else readings[i], access_fault = rtu_dev.read_holding_reg(addr) - - if access_fault then - return_ok = false - readings = MODBUS_EXCODE.SERVER_DEVICE_FAIL - break - end + if access_fault then break end end end @@ -184,12 +169,7 @@ function modbus.new(rtu_dev, use_parallel_read) end) else readings[i], access_fault = rtu_dev.read_input_reg(addr) - - if access_fault then - return_ok = false - readings = MODBUS_EXCODE.SERVER_DEVICE_FAIL - break - end + if access_fault then break end end end diff --git a/rtu/rtu.lua b/rtu/rtu.lua index 6c2b01f..bac230f 100644 --- a/rtu/rtu.lua +++ b/rtu/rtu.lua @@ -67,9 +67,11 @@ function rtu.load_config() return cfv.valid() end --- create a new RTU unit +-- create a new RTU unit
+-- if this is for a PPM peripheral, auto fault clearing MUST stay enabled once access begins ---@nodiscard -function rtu.init_unit() +---@param device table|nil peripheral device, if applicable +function rtu.init_unit(device) local self = { discrete_inputs = {}, coils = {}, @@ -86,6 +88,10 @@ function rtu.init_unit() ---@class rtu local protected = {} + -- function to check if the peripheral (if exists) is faulted + local function _is_faulted() return false end + if device then _is_faulted = device.__p_is_faulted end + -- refresh IO count local function _count_io() self.io_count_cache = { #self.discrete_inputs, #self.coils, #self.input_regs, #self.holding_regs } @@ -112,9 +118,8 @@ function rtu.init_unit() ---@param di_addr integer ---@return any value, boolean access_fault function public.read_di(di_addr) - ppm.clear_fault() local value = self.discrete_inputs[di_addr].read() - return value, ppm.is_faulted() + return value, _is_faulted() end -- coils: single bit read-write @@ -133,9 +138,8 @@ function rtu.init_unit() ---@param coil_addr integer ---@return any value, boolean access_fault function public.read_coil(coil_addr) - ppm.clear_fault() local value = self.coils[coil_addr].read() - return value, ppm.is_faulted() + return value, _is_faulted() end -- write coil @@ -143,9 +147,8 @@ function rtu.init_unit() ---@param value any ---@return boolean access_fault function public.write_coil(coil_addr, value) - ppm.clear_fault() self.coils[coil_addr].write(value) - return ppm.is_faulted() + return _is_faulted() end -- input registers: multi-bit read-only @@ -163,9 +166,8 @@ function rtu.init_unit() ---@param reg_addr integer ---@return any value, boolean access_fault function public.read_input_reg(reg_addr) - ppm.clear_fault() local value = self.input_regs[reg_addr].read() - return value, ppm.is_faulted() + return value, _is_faulted() end -- holding registers: multi-bit read-write @@ -184,9 +186,8 @@ function rtu.init_unit() ---@param reg_addr integer ---@return any value, boolean access_fault function public.read_holding_reg(reg_addr) - ppm.clear_fault() local value = self.holding_regs[reg_addr].read() - return value, ppm.is_faulted() + return value, _is_faulted() end -- write holding register @@ -194,9 +195,8 @@ function rtu.init_unit() ---@param value any ---@return boolean access_fault function public.write_holding_reg(reg_addr, value) - ppm.clear_fault() self.holding_regs[reg_addr].write(value) - return ppm.is_faulted() + return _is_faulted() end -- public RTU device access diff --git a/rtu/startup.lua b/rtu/startup.lua index 1c5a4a2..90b81a0 100644 --- a/rtu/startup.lua +++ b/rtu/startup.lua @@ -31,7 +31,7 @@ local sna_rtu = require("rtu.dev.sna_rtu") local sps_rtu = require("rtu.dev.sps_rtu") local turbinev_rtu = require("rtu.dev.turbinev_rtu") -local RTU_VERSION = "v1.7.14" +local RTU_VERSION = "v1.7.15" local RTU_UNIT_TYPE = types.RTU_UNIT_TYPE local RTU_UNIT_HW_STATE = databus.RTU_UNIT_HW_STATE diff --git a/scada-common/ppm.lua b/scada-common/ppm.lua index fb98161..0d02663 100644 --- a/scada-common/ppm.lua +++ b/scada-common/ppm.lua @@ -131,31 +131,33 @@ local function peri_init(iface) local mt = { __index = function (_, key) - -- this will continuously be counting calls here as faults - -- unlike other functions, faults here can't be cleared as it is just not defined - if self.fault_counts[key] == nil then - self.fault_counts[key] = 0 - end - - -- function failed - self.faulted = true - self.last_fault = UNDEFINED_FIELD - - ppm_sys.faulted = true - ppm_sys.last_fault = UNDEFINED_FIELD - - if not ppm_sys.mute and (self.fault_counts[key] % REPORT_FREQUENCY == 0) then - local count_str = "" - if self.fault_counts[key] > 0 then - count_str = " [" .. self.fault_counts[key] .. " total calls]" + return (function () + -- this will continuously be counting calls here as faults + -- unlike other functions, faults here can't be cleared as it is just not defined + if self.fault_counts[key] == nil then + self.fault_counts[key] = 0 end - log.error(util.c("PPM: caught undefined function ", key, "()", count_str)) - end + -- function failed + self.faulted = true + self.last_fault = UNDEFINED_FIELD - self.fault_counts[key] = self.fault_counts[key] + 1 + ppm_sys.faulted = true + ppm_sys.last_fault = UNDEFINED_FIELD - return (function () return UNDEFINED_FIELD end) + if not ppm_sys.mute and (self.fault_counts[key] % REPORT_FREQUENCY == 0) then + local count_str = "" + if self.fault_counts[key] > 0 then + count_str = " [" .. self.fault_counts[key] .. " total calls]" + end + + log.error(util.c("PPM: caught undefined function ", key, "()", count_str)) + end + + self.fault_counts[key] = self.fault_counts[key] + 1 + + return UNDEFINED_FIELD + end) end } From ad240ae44c48c6ec877cbdae8459a1408079d3e0 Mon Sep 17 00:00:00 2001 From: Mikayla Fischler Date: Sat, 9 Mar 2024 17:54:04 -0500 Subject: [PATCH 19/44] #445 increment common version --- scada-common/util.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scada-common/util.lua b/scada-common/util.lua index c72d62e..ebca4a2 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.1.18" +util.version = "1.1.19" util.TICK_TIME_S = 0.05 util.TICK_TIME_MS = 50 From bbe7b526624e10119dee98aeee798b578716605f Mon Sep 17 00:00:00 2001 From: Mikayla Date: Mon, 11 Mar 2024 16:35:06 +0000 Subject: [PATCH 20/44] bugfixes and cleanup --- coordinator/configure.lua | 10 +++++----- coordinator/coordinator.lua | 1 + pocket/configure.lua | 2 +- reactor-plc/configure.lua | 11 ++++++----- rtu/configure.lua | 10 +++++----- supervisor/configure.lua | 10 +++++----- supervisor/panel/components/pdg_entry.lua | 4 ++-- supervisor/panel/components/rtu_entry.lua | 4 ++-- supervisor/panel/style.lua | 2 +- 9 files changed, 28 insertions(+), 26 deletions(-) diff --git a/coordinator/configure.lua b/coordinator/configure.lua index 6e16757..b2576c5 100644 --- a/coordinator/configure.lua +++ b/coordinator/configure.lua @@ -174,7 +174,7 @@ local fields = { { "AuthKey", "Facility Auth Key" , ""}, { "LogMode", "Log Mode", log.MODE.APPEND }, { "LogPath", "Log Path", "/log.txt" }, - { "LogDebug","Log Debug Messages", false }, + { "LogDebug", "Log Debug Messages", false }, { "MainTheme", "Main UI Theme", themes.UI_THEME.SMOOTH_STONE }, { "FrontPanelTheme", "Front Panel Theme", themes.FP_THEME.SANDSTONE }, { "ColorMode", "Color Mode", themes.COLOR_MODE.STANDARD } @@ -366,8 +366,8 @@ local function config_view(display) local function jump_color() tool_ctl.jumped_to_color = true - tool_ctl.color_next.hide() - tool_ctl.color_apply.show(true) + tool_ctl.color_next.hide(true) + tool_ctl.color_apply.show() main_pane.set_value(8) end @@ -830,7 +830,7 @@ local function config_view(display) TextBox{parent=clr_cfg,x=1,y=2,height=1,text=" Color Configuration",fg_bg=cpair(colors.black,colors.magenta)} TextBox{parent=clr_c_1,x=1,y=1,height=2,text="Here you can select the color themes for the different UI displays."} - TextBox{parent=clr_c_1,x=1,y=4,height=2,text="Click 'Accessibility' below to access color blind assistive options.",fg_bg=g_lg_fg_bg} + TextBox{parent=clr_c_1,x=1,y=4,height=2,text="Click 'Accessibility' below to access colorblind assistive options.",fg_bg=g_lg_fg_bg} TextBox{parent=clr_c_1,x=1,y=7,height=1,text="Main UI Theme"} local main_theme = RadioButton{parent=clr_c_1,x=1,y=8,default=ini_cfg.MainTheme,options=themes.UI_THEME_NAMES,callback=function()end,radio_colors=cpair(colors.lightGray,colors.black),select_color=colors.magenta} @@ -910,7 +910,7 @@ local function config_view(display) tool_ctl.color_next = PushButton{parent=clr_c_1,x=44,y=14,text="Next \x1a",callback=submit_colors,fg_bg=nav_fg_bg,active_fg_bg=btn_act_fg_bg} tool_ctl.color_apply = PushButton{parent=clr_c_1,x=43,y=14,min_width=7,text="Apply",callback=submit_colors,fg_bg=cpair(colors.black,colors.green),active_fg_bg=btn_act_fg_bg} - tool_ctl.color_apply.hide() + tool_ctl.color_apply.hide(true) local function c_go_home() main_pane.set_value(1) diff --git a/coordinator/coordinator.lua b/coordinator/coordinator.lua index 61b854b..85387b4 100644 --- a/coordinator/coordinator.lua +++ b/coordinator/coordinator.lua @@ -93,6 +93,7 @@ function coordinator.load_config() cfv.assert_type_int(config.LogMode) cfv.assert_range(config.LogMode, 0, 1) cfv.assert_type_str(config.LogPath) + cfv.assert_type_bool(config.LogDebug) cfv.assert_type_int(config.MainTheme) cfv.assert_range(config.MainTheme, 1, 2) diff --git a/pocket/configure.lua b/pocket/configure.lua index 6c0f728..908ea4c 100644 --- a/pocket/configure.lua +++ b/pocket/configure.lua @@ -112,7 +112,7 @@ local fields = { { "AuthKey", "Facility Auth Key" , ""}, { "LogMode", "Log Mode", log.MODE.APPEND }, { "LogPath", "Log Path", "/log.txt" }, - { "LogDebug","Log Debug Messages", false } + { "LogDebug", "Log Debug Messages", false } } -- load data from the settings file diff --git a/reactor-plc/configure.lua b/reactor-plc/configure.lua index 80ef86c..5676a91 100644 --- a/reactor-plc/configure.lua +++ b/reactor-plc/configure.lua @@ -134,7 +134,7 @@ local fields = { { "AuthKey", "Facility Auth Key" , ""}, { "LogMode", "Log Mode", log.MODE.APPEND }, { "LogPath", "Log Path", "/log.txt" }, - { "LogDebug","Log Debug Messages", false }, + { "LogDebug", "Log Debug Messages", false }, { "FrontPanelTheme", "Front Panel Theme", 1 }, { "ColorMode", "Color Mode", 1 } } @@ -222,8 +222,8 @@ local function config_view(display) local function jump_color() tool_ctl.jumped_to_color = true - tool_ctl.color_next.hide() - tool_ctl.color_apply.show(true) + tool_ctl.color_next.hide(true) + tool_ctl.color_apply.show() main_pane.set_value(5) end @@ -470,7 +470,7 @@ local function config_view(display) TextBox{parent=clr_cfg,x=1,y=2,height=1,text=" Color Configuration",fg_bg=cpair(colors.black,colors.magenta)} TextBox{parent=clr_c_1,x=1,y=1,height=2,text="Here you can select the color theme for the front panel."} - TextBox{parent=clr_c_1,x=1,y=4,height=2,text="Click 'Accessibility' below to access color blind assistive options.",fg_bg=g_lg_fg_bg} + TextBox{parent=clr_c_1,x=1,y=4,height=2,text="Click 'Accessibility' below to access colorblind assistive options.",fg_bg=g_lg_fg_bg} TextBox{parent=clr_c_1,x=1,y=7,height=1,text="Front Panel Theme"} local fp_theme = RadioButton{parent=clr_c_1,x=1,y=8,default=ini_cfg.FrontPanelTheme,options={"Sandstone","Basalt"},callback=function()end,radio_colors=cpair(colors.lightGray,colors.black),select_color=colors.magenta} @@ -545,7 +545,7 @@ local function config_view(display) tool_ctl.color_next = PushButton{parent=clr_c_1,x=44,y=14,text="Next \x1a",callback=submit_colors,fg_bg=nav_fg_bg,active_fg_bg=btn_act_fg_bg} tool_ctl.color_apply = PushButton{parent=clr_c_1,x=43,y=14,min_width=7,text="Apply",callback=submit_colors,fg_bg=cpair(colors.black,colors.green),active_fg_bg=btn_act_fg_bg} - tool_ctl.color_apply.hide() + tool_ctl.color_apply.hide(true) local function c_go_home() main_pane.set_value(1) @@ -639,6 +639,7 @@ local function config_view(display) main_pane.set_value(1) plc_pane.set_value(1) net_pane.set_value(1) + clr_pane.set_value(1) sum_pane.set_value(1) end diff --git a/rtu/configure.lua b/rtu/configure.lua index cfda26d..acc419f 100644 --- a/rtu/configure.lua +++ b/rtu/configure.lua @@ -208,7 +208,7 @@ local fields = { { "AuthKey", "Facility Auth Key", "" }, { "LogMode", "Log Mode", log.MODE.APPEND }, { "LogPath", "Log Path", "/log.txt" }, - { "LogDebug","Log Debug Messages", false }, + { "LogDebug", "Log Debug Messages", false }, { "FrontPanelTheme", "Front Panel Theme", 1 }, { "ColorMode", "Color Mode", 1 } } @@ -328,8 +328,8 @@ local function config_view(display) local function jump_color() tool_ctl.jumped_to_color = true - tool_ctl.color_next.hide() - tool_ctl.color_apply.show(true) + tool_ctl.color_next.hide(true) + tool_ctl.color_apply.show() main_pane.set_value(5) end @@ -525,7 +525,7 @@ local function config_view(display) TextBox{parent=clr_cfg,x=1,y=2,height=1,text=" Color Configuration",fg_bg=cpair(colors.black,colors.magenta)} TextBox{parent=clr_c_1,x=1,y=1,height=2,text="Here you can select the color theme for the front panel."} - TextBox{parent=clr_c_1,x=1,y=4,height=2,text="Click 'Accessibility' below to access color blind assistive options.",fg_bg=g_lg_fg_bg} + TextBox{parent=clr_c_1,x=1,y=4,height=2,text="Click 'Accessibility' below to access colorblind assistive options.",fg_bg=g_lg_fg_bg} TextBox{parent=clr_c_1,x=1,y=7,height=1,text="Front Panel Theme"} local fp_theme = RadioButton{parent=clr_c_1,x=1,y=8,default=ini_cfg.FrontPanelTheme,options={"Sandstone","Basalt"},callback=function()end,radio_colors=cpair(colors.lightGray,colors.black),select_color=colors.magenta} @@ -601,7 +601,7 @@ local function config_view(display) tool_ctl.color_next = PushButton{parent=clr_c_1,x=44,y=14,text="Next \x1a",callback=submit_colors,fg_bg=nav_fg_bg,active_fg_bg=btn_act_fg_bg} tool_ctl.color_apply = PushButton{parent=clr_c_1,x=43,y=14,min_width=7,text="Apply",callback=submit_colors,fg_bg=cpair(colors.black,colors.green),active_fg_bg=btn_act_fg_bg} - tool_ctl.color_apply.hide() + tool_ctl.color_apply.hide(true) TextBox{parent=clr_c_3,x=1,y=1,height=1,text="Settings saved!"} PushButton{parent=clr_c_3,x=1,y=14,min_width=6,text="Exit",callback=exit,fg_bg=cpair(colors.black,colors.red),active_fg_bg=cpair(colors.white,colors.gray)} diff --git a/supervisor/configure.lua b/supervisor/configure.lua index 0b63519..2f7bcd6 100644 --- a/supervisor/configure.lua +++ b/supervisor/configure.lua @@ -145,7 +145,7 @@ local fields = { { "AuthKey", "Facility Auth Key" , ""}, { "LogMode", "Log Mode", log.MODE.APPEND }, { "LogPath", "Log Path", "/log.txt" }, - { "LogDebug","Log Debug Messages", false }, + { "LogDebug", "Log Debug Messages", false }, { "FrontPanelTheme", "Front Panel Theme", 1 }, { "ColorMode", "Color Mode", 1 } } @@ -212,8 +212,8 @@ local function config_view(display) local function jump_color() tool_ctl.jumped_to_color = true - tool_ctl.color_next.hide() - tool_ctl.color_apply.show(true) + tool_ctl.color_next.hide(true) + tool_ctl.color_apply.show() main_pane.set_value(5) end @@ -769,7 +769,7 @@ local function config_view(display) TextBox{parent=clr_cfg,x=1,y=2,height=1,text=" Color Configuration",fg_bg=cpair(colors.black,colors.magenta)} TextBox{parent=clr_c_1,x=1,y=1,height=2,text="Here you can select the color theme for the front panel."} - TextBox{parent=clr_c_1,x=1,y=4,height=2,text="Click 'Accessibility' below to access color blind assistive options.",fg_bg=g_lg_fg_bg} + TextBox{parent=clr_c_1,x=1,y=4,height=2,text="Click 'Accessibility' below to access colorblind assistive options.",fg_bg=g_lg_fg_bg} TextBox{parent=clr_c_1,x=1,y=7,height=1,text="Front Panel Theme"} local fp_theme = RadioButton{parent=clr_c_1,x=1,y=8,default=ini_cfg.FrontPanelTheme,options={"Sandstone","Basalt"},callback=function()end,radio_colors=cpair(colors.lightGray,colors.black),select_color=colors.magenta} @@ -844,7 +844,7 @@ local function config_view(display) tool_ctl.color_next = PushButton{parent=clr_c_1,x=44,y=14,text="Next \x1a",callback=submit_colors,fg_bg=nav_fg_bg,active_fg_bg=btn_act_fg_bg} tool_ctl.color_apply = PushButton{parent=clr_c_1,x=43,y=14,min_width=7,text="Apply",callback=submit_colors,fg_bg=cpair(colors.black,colors.green),active_fg_bg=btn_act_fg_bg} - tool_ctl.color_apply.hide() + tool_ctl.color_apply.hide(true) local function c_go_home() main_pane.set_value(1) diff --git a/supervisor/panel/components/pdg_entry.lua b/supervisor/panel/components/pdg_entry.lua index 740bb37..5bee335 100644 --- a/supervisor/panel/components/pdg_entry.lua +++ b/supervisor/panel/components/pdg_entry.lua @@ -17,14 +17,14 @@ local ALIGN = core.ALIGN local cpair = core.cpair -local label_fg = style.fp.label_fg - -- create a pocket diagnostics list entry ---@param parent graphics_element parent ---@param id integer PDG session ID local function init(parent, id) local s_hi_box = style.theme.highlight_box + local label_fg = style.fp.label_fg + -- root div local root = Div{parent=parent,x=2,y=2,height=4,width=parent.get_width()-2,hidden=true} local entry = Div{parent=root,x=2,y=1,height=3,fg_bg=style.theme.highlight_box_bright} diff --git a/supervisor/panel/components/rtu_entry.lua b/supervisor/panel/components/rtu_entry.lua index e09a048..03c4c62 100644 --- a/supervisor/panel/components/rtu_entry.lua +++ b/supervisor/panel/components/rtu_entry.lua @@ -17,14 +17,14 @@ local ALIGN = core.ALIGN local cpair = core.cpair -local label_fg = style.fp.label_fg - -- create an RTU list entry ---@param parent graphics_element parent ---@param id integer RTU session ID local function init(parent, id) local s_hi_box = style.theme.highlight_box + local label_fg = style.fp.label_fg + -- root div local root = Div{parent=parent,x=2,y=2,height=4,width=parent.get_width()-2,hidden=true} local entry = Div{parent=root,x=2,y=1,height=3,fg_bg=style.theme.highlight_box_bright} diff --git a/supervisor/panel/style.lua b/supervisor/panel/style.lua index e3f1138..efcc9b7 100644 --- a/supervisor/panel/style.lua +++ b/supervisor/panel/style.lua @@ -10,7 +10,7 @@ local style = {} local cpair = core.cpair -style.theme = themes.basalt +style.theme = themes.sandstone style.fp = themes.get_fp_style(style.theme) style.ind_grn = cpair(colors.green, colors.green_off) From b3f29566ea2204ffbe04ffada205b3c7a1b4d9fb Mon Sep 17 00:00:00 2001 From: Mikayla Fischler Date: Mon, 11 Mar 2024 21:25:34 -0400 Subject: [PATCH 21/44] #340 colorblind modes for rtu, reactor-plc, and supervisor --- graphics/themes.lua | 73 ++++++++++++++++++++++++++++++- reactor-plc/configure.lua | 21 ++++----- reactor-plc/panel/front_panel.lua | 46 +++++++++++++++++-- reactor-plc/renderer.lua | 13 ++++-- reactor-plc/startup.lua | 4 +- rtu/configure.lua | 21 ++++----- rtu/panel/front_panel.lua | 43 ++++++++++++++++-- rtu/renderer.lua | 13 ++++-- rtu/startup.lua | 4 +- supervisor/configure.lua | 21 ++++----- supervisor/databus.lua | 8 ++-- supervisor/panel/front_panel.lua | 4 +- supervisor/renderer.lua | 11 ++++- supervisor/startup.lua | 4 +- 14 files changed, 226 insertions(+), 60 deletions(-) diff --git a/graphics/themes.lua b/graphics/themes.lua index c454aab..85928ac 100644 --- a/graphics/themes.lua +++ b/graphics/themes.lua @@ -11,6 +11,7 @@ local themes = {} -- add color mappings for front panels colors.ivory = colors.pink +colors.green_hc = colors.cyan colors.yellow_hc = colors.purple colors.red_off = colors.brown colors.yellow_off = colors.magenta @@ -100,7 +101,7 @@ themes.sandstone = { { c = colors.yellow, hex = 0xf9fb53 }, { c = colors.green_off, hex = 0x16665a }, { c = colors.green, hex = 0x6be551 }, - { c = colors.cyan, hex = 0x34bac8 }, + { c = colors.green_hc, hex = 0x6be551 }, { c = colors.lightBlue, hex = 0x6cc0f2 }, { c = colors.blue, hex = 0x0096ff }, { c = colors.yellow_hc, hex = 0xe3bc2a }, @@ -111,6 +112,39 @@ themes.sandstone = { { c = colors.gray, hex = 0x575757 }, { c = colors.black, hex = 0x191919 }, { c = colors.red_off, hex = 0x672223 } + }, + + -- color re-mappings for assistive modes + color_modes = { + -- standard + {}, + -- deuteranopia + { + { c = colors.green, hex = 0x1081ff }, + { c = colors.green_off, hex = 0x141414 }, + { c = colors.yellow, hex = 0xf7c311 }, + { c = colors.yellow_off, hex = 0x141414 }, + { c = colors.red, hex = 0xfb5615 }, + { c = colors.red_off, hex = 0x141414 } + }, + -- protanopia + { + { c = colors.green, hex = 0x1081ff }, + { c = colors.green_off, hex = 0x141414 }, + { c = colors.yellow, hex = 0xf5e633 }, + { c = colors.yellow_off, hex = 0x141414 }, + { c = colors.red, hex = 0xff521a }, + { c = colors.red_off, hex = 0x141414 } + }, + -- tritanopia + { + { c = colors.green, hex = 0x40cbd7 }, + { c = colors.green_off, hex = 0x141414 }, + { c = colors.yellow, hex = 0xffbc00 }, + { c = colors.yellow_off, hex = 0x141414 }, + { c = colors.red, hex = 0xff0000 }, + { c = colors.red_off, hex = 0x141414 } + } } } @@ -134,7 +168,7 @@ themes.basalt = { { c = colors.yellow, hex = 0xefe37c }, { c = colors.green_off, hex = 0x436b41 }, { c = colors.green, hex = 0x7ae175 }, - { c = colors.cyan, hex = 0x5ec7d1 }, + { c = colors.green_hc, hex = 0x7ae175 }, { c = colors.lightBlue, hex = 0x7dc6f2 }, { c = colors.blue, hex = 0x56aae6 }, { c = colors.yellow_hc, hex = 0xe9cd68 }, @@ -145,6 +179,41 @@ themes.basalt = { { c = colors.gray, hex = 0x5c5f68 }, { c = colors.black, hex = 0x262626 }, { c = colors.red_off, hex = 0x653839 } + }, + + color_modes = { + -- standard + {}, + -- deuteranopia + { + { c = colors.green, hex = 0x3393ff }, + { c = colors.green_hc, hex = 0x99c9ff }, + { c = colors.green_off, hex = 0x333333 }, + { c = colors.yellow, hex = 0xf7c311 }, + { c = colors.yellow_off, hex = 0x333333 }, + { c = colors.red, hex = 0xf18486 }, + { c = colors.red_off, hex = 0x333333 } + }, + -- protanopia + { + { c = colors.green, hex = 0x3393ff }, + { c = colors.green_hc, hex = 0x99c9ff }, + { c = colors.green_off, hex = 0x333333 }, + { c = colors.yellow, hex = 0xf5e633 }, + { c = colors.yellow_off, hex = 0x333333 }, + { c = colors.red, hex = 0xff8058 }, + { c = colors.red_off, hex = 0x333333 } + }, + -- tritanopia + { + { c = colors.green, hex = 0x00ecff }, + { c = colors.green_hc, hex = 0x00ecff }, + { c = colors.green_off, hex = 0x333333 }, + { c = colors.yellow, hex = 0xffbc00 }, + { c = colors.yellow_off, hex = 0x333333 }, + { c = colors.red, hex = 0xdf4949 }, + { c = colors.red_off, hex = 0x333333 } + } } } diff --git a/reactor-plc/configure.lua b/reactor-plc/configure.lua index 80ef86c..c084e7d 100644 --- a/reactor-plc/configure.lua +++ b/reactor-plc/configure.lua @@ -8,6 +8,7 @@ local tcd = require("scada-common.tcd") local util = require("scada-common.util") local core = require("graphics.core") +local themes = require("graphics.themes") local DisplayBox = require("graphics.elements.displaybox") local Div = require("graphics.elements.div") @@ -473,29 +474,29 @@ local function config_view(display) TextBox{parent=clr_c_1,x=1,y=4,height=2,text="Click 'Accessibility' below to access color blind assistive options.",fg_bg=g_lg_fg_bg} TextBox{parent=clr_c_1,x=1,y=7,height=1,text="Front Panel Theme"} - local fp_theme = RadioButton{parent=clr_c_1,x=1,y=8,default=ini_cfg.FrontPanelTheme,options={"Sandstone","Basalt"},callback=function()end,radio_colors=cpair(colors.lightGray,colors.black),select_color=colors.magenta} + local fp_theme = RadioButton{parent=clr_c_1,x=1,y=8,default=ini_cfg.FrontPanelTheme,options=themes.FP_THEME_NAMES,callback=function()end,radio_colors=cpair(colors.lightGray,colors.black),select_color=colors.magenta} TextBox{parent=clr_c_2,x=1,y=1,height=6,text="By default, this project uses green/red heavily to distinguish ok and not, with some indicators also using multiple colors. By selecting a color blindness below, blues will be used instead of greens on indicators and multi-color indicators will be split up as space permits."} local function recolor(value) if value == 1 then for i = 1, #style.colors do term.setPaletteColor(style.colors[i].c, style.colors[i].hex) end - elseif value == 2 then - term.setPaletteColor(colors.green, 0x1081ff) - term.setPaletteColor(colors.yellow, 0xf5e633) - term.setPaletteColor(colors.red, 0xff521a) - elseif value == 3 then + elseif value == themes.COLOR_MODE.DEUTERANOPIA then term.setPaletteColor(colors.green, 0x1081ff) term.setPaletteColor(colors.yellow, 0xf7c311) term.setPaletteColor(colors.red, 0xfb5615) - elseif value == 4 then + elseif value == themes.COLOR_MODE.PROTANOPIA then + term.setPaletteColor(colors.green, 0x1081ff) + term.setPaletteColor(colors.yellow, 0xf5e633) + term.setPaletteColor(colors.red, 0xff521a) + elseif value == themes.COLOR_MODE.TRITANOPIA then term.setPaletteColor(colors.green, 0x00ecff) term.setPaletteColor(colors.yellow, 0xffbc00) term.setPaletteColor(colors.red, 0xff0000) end end - local c_mode = RadioButton{parent=clr_c_2,x=1,y=8,default=ini_cfg.ColorMode,options={"None","Protanopia","Deuteranopia","Tritanopia"},callback=recolor,radio_colors=cpair(colors.lightGray,colors.black),select_color=colors.magenta} + local c_mode = RadioButton{parent=clr_c_2,x=1,y=8,default=ini_cfg.ColorMode,options=themes.COLOR_MODE_NAMES,callback=recolor,radio_colors=cpair(colors.lightGray,colors.black),select_color=colors.magenta} local _ = IndLight{parent=clr_c_2,x=20,y=8,label="Good",colors=cpair(colors.black,colors.green),value=true} _ = IndLight{parent=clr_c_2,x=20,y=9,label="Warning",colors=cpair(colors.black,colors.yellow),value=true} @@ -749,9 +750,9 @@ local function config_view(display) elseif f[1] == "LogMode" then val = util.trinary(raw == log.MODE.APPEND, "append", "replace") elseif f[1] == "EmerCoolColor" and raw ~= nil then val = rsio.color_name(raw) elseif f[1] == "FrontPanelTheme" then - if raw == 1 then val = "Sandstone" elseif raw == 2 then val = "Basalt" end + val = util.strval(themes.fp_theme_name(raw)) elseif f[1] == "ColorMode" then - if raw == 1 then val = "Standard" elseif raw == 2 then val = "Protanopia" elseif raw == 3 then val = "Deuteranopia" elseif raw == 4 then val = "Tritanopia" end + val = util.strval(themes.color_mode_name(raw)) end if val == "nil" then val = "" end diff --git a/reactor-plc/panel/front_panel.lua b/reactor-plc/panel/front_panel.lua index 7c087a8..5797c2b 100644 --- a/reactor-plc/panel/front_panel.lua +++ b/reactor-plc/panel/front_panel.lua @@ -12,6 +12,7 @@ local style = require("reactor-plc.panel.style") local core = require("graphics.core") local flasher = require("graphics.flasher") +local themes = require("graphics.themes") local Div = require("graphics.elements.div") local Rectangle = require("graphics.elements.rectangle") @@ -23,6 +24,8 @@ local LED = require("graphics.elements.indicators.led") local LEDPair = require("graphics.elements.indicators.ledpair") local RGBLED = require("graphics.elements.indicators.ledrgb") +local LINK_STATE = types.PANEL_LINK_STATE + local ALIGN = core.ALIGN local cpair = core.cpair @@ -33,7 +36,8 @@ local ind_red = style.ind_red -- create new front panel view ---@param panel graphics_element main displaybox -local function init(panel) +---@param color_mode COLOR_MODE color mode +local function init(panel, color_mode) local s_hi_box = style.theme.highlight_box local disabled_fg = style.fp.disabled_fg @@ -56,13 +60,47 @@ local function init(panel) local reactor = LEDPair{parent=system,label="REACTOR",off=colors.red,c1=colors.yellow,c2=colors.green} local modem = LED{parent=system,label="MODEM",colors=ind_grn} - local network = RGBLED{parent=system,label="NETWORK",colors={colors.green,colors.red,colors.orange,colors.yellow,colors.gray}} - network.update(types.PANEL_LINK_STATE.DISCONNECTED) + + if color_mode == themes.COLOR_MODE.STANDARD then + local network = RGBLED{parent=system,label="NETWORK",colors={colors.green,colors.red,colors.orange,colors.yellow,colors.gray}} + network.update(types.PANEL_LINK_STATE.DISCONNECTED) + network.register(databus.ps, "link_state", network.update) + else + local nt_lnk = RGBLED{parent=system,label="NT LINKED",colors={colors.red_off,colors.red,colors.green}} + local nt_ver = RGBLED{parent=system,label="NT VERSION",colors={colors.red_off,colors.red,colors.green}} + local nt_col = LED{parent=system,label="NT COLLISION",colors=ind_red} + + nt_lnk.register(databus.ps, "link_state", function (state) + local value = 2 + + if state == LINK_STATE.DISCONNECTED then + value = 1 + elseif state == LINK_STATE.LINKED then + value = 3 + end + + nt_lnk.update(value) + end) + + nt_ver.register(databus.ps, "link_state", function (state) + local value = 3 + + if state == LINK_STATE.BAD_VERSION then + value = 2 + elseif state == LINK_STATE.DISCONNECTED then + value = 1 + end + + nt_ver.update(value) + end) + + nt_col.register(databus.ps, "link_state", function (state) nt_col.update(state == LINK_STATE.COLLISION) end) + end + system.line_break() reactor.register(databus.ps, "reactor_dev_state", reactor.update) modem.register(databus.ps, "has_modem", modem.update) - network.register(databus.ps, "link_state", network.update) local rt_main = LED{parent=system,label="RT MAIN",colors=ind_grn} local rt_rps = LED{parent=system,label="RT RPS",colors=ind_grn} diff --git a/reactor-plc/renderer.lua b/reactor-plc/renderer.lua index 31af361..8748cae 100644 --- a/reactor-plc/renderer.lua +++ b/reactor-plc/renderer.lua @@ -18,9 +18,10 @@ local ui = { } -- try to start the UI ----@param theme integer front panel theme ID (1 = sandstone, 2 = basalt) +---@param theme FP_THEME front panel theme +---@param color_mode COLOR_MODE color mode ---@return boolean success, any error_msg -function renderer.try_start_ui(theme) +function renderer.try_start_ui(theme, color_mode) local status, msg = true, nil if ui.display == nil then @@ -38,10 +39,16 @@ function renderer.try_start_ui(theme) term.setPaletteColor(style.theme.colors[i].c, style.theme.colors[i].hex) end + -- apply color mode + local c_mode_overrides = style.theme.color_modes[color_mode] + for i = 1, #c_mode_overrides do + term.setPaletteColor(c_mode_overrides[i].c, c_mode_overrides[i].hex) + end + -- init front panel view status, msg = pcall(function () ui.display = DisplayBox{window=term.current(),fg_bg=style.fp.root} - panel_view(ui.display) + panel_view(ui.display, color_mode) end) if status then diff --git a/reactor-plc/startup.lua b/reactor-plc/startup.lua index 66f6d77..ea51bf6 100644 --- a/reactor-plc/startup.lua +++ b/reactor-plc/startup.lua @@ -18,7 +18,7 @@ local plc = require("reactor-plc.plc") local renderer = require("reactor-plc.renderer") local threads = require("reactor-plc.threads") -local R_PLC_VERSION = "v1.6.15" +local R_PLC_VERSION = "v1.7.0" local println = util.println local println_ts = util.println_ts @@ -183,7 +183,7 @@ local function main() -- front panel time! if not renderer.ui_ready() then local message - plc_state.fp_ok, message = renderer.try_start_ui(config.FrontPanelTheme) + plc_state.fp_ok, message = renderer.try_start_ui(config.FrontPanelTheme, config.ColorMode) if not plc_state.fp_ok then println_ts(util.c("UI error: ", message)) diff --git a/rtu/configure.lua b/rtu/configure.lua index cfda26d..e9f50eb 100644 --- a/rtu/configure.lua +++ b/rtu/configure.lua @@ -9,6 +9,7 @@ local tcd = require("scada-common.tcd") local util = require("scada-common.util") local core = require("graphics.core") +local themes = require("graphics.themes") local DisplayBox = require("graphics.elements.displaybox") local Div = require("graphics.elements.div") @@ -528,29 +529,29 @@ local function config_view(display) TextBox{parent=clr_c_1,x=1,y=4,height=2,text="Click 'Accessibility' below to access color blind assistive options.",fg_bg=g_lg_fg_bg} TextBox{parent=clr_c_1,x=1,y=7,height=1,text="Front Panel Theme"} - local fp_theme = RadioButton{parent=clr_c_1,x=1,y=8,default=ini_cfg.FrontPanelTheme,options={"Sandstone","Basalt"},callback=function()end,radio_colors=cpair(colors.lightGray,colors.black),select_color=colors.magenta} + local fp_theme = RadioButton{parent=clr_c_1,x=1,y=8,default=ini_cfg.FrontPanelTheme,options=themes.FP_THEME_NAMES,callback=function()end,radio_colors=cpair(colors.lightGray,colors.black),select_color=colors.magenta} TextBox{parent=clr_c_2,x=1,y=1,height=6,text="By default, this project uses green/red heavily to distinguish ok and not, with some indicators also using multiple colors. By selecting a color blindness below, blues will be used instead of greens on indicators and multi-color indicators will be split up as space permits."} local function recolor(value) if value == 1 then for i = 1, #style.colors do term.setPaletteColor(style.colors[i].c, style.colors[i].hex) end - elseif value == 2 then - term.setPaletteColor(colors.green, 0x1081ff) - term.setPaletteColor(colors.yellow, 0xf5e633) - term.setPaletteColor(colors.red, 0xff521a) - elseif value == 3 then + elseif value == themes.COLOR_MODE.DEUTERANOPIA then term.setPaletteColor(colors.green, 0x1081ff) term.setPaletteColor(colors.yellow, 0xf7c311) term.setPaletteColor(colors.red, 0xfb5615) - elseif value == 4 then + elseif value == themes.COLOR_MODE.PROTANOPIA then + term.setPaletteColor(colors.green, 0x1081ff) + term.setPaletteColor(colors.yellow, 0xf5e633) + term.setPaletteColor(colors.red, 0xff521a) + elseif value == themes.COLOR_MODE.TRITANOPIA then term.setPaletteColor(colors.green, 0x00ecff) term.setPaletteColor(colors.yellow, 0xffbc00) term.setPaletteColor(colors.red, 0xff0000) end end - local c_mode = RadioButton{parent=clr_c_2,x=1,y=8,default=ini_cfg.ColorMode,options={"None","Protanopia","Deuteranopia","Tritanopia"},callback=recolor,radio_colors=cpair(colors.lightGray,colors.black),select_color=colors.magenta} + local c_mode = RadioButton{parent=clr_c_2,x=1,y=8,default=ini_cfg.ColorMode,options=themes.COLOR_MODE_NAMES,callback=recolor,radio_colors=cpair(colors.lightGray,colors.black),select_color=colors.magenta} local _ = IndLight{parent=clr_c_2,x=20,y=8,label="Good",colors=cpair(colors.black,colors.green),value=true} _ = IndLight{parent=clr_c_2,x=20,y=9,label="Warning",colors=cpair(colors.black,colors.yellow),value=true} @@ -1426,9 +1427,9 @@ 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] == "FrontPanelTheme" then - if raw == 1 then val = "Sandstone" elseif raw == 2 then val = "Basalt" end + val = util.strval(themes.fp_theme_name(raw)) elseif f[1] == "ColorMode" then - if raw == 1 then val = "Standard" elseif raw == 2 then val = "Protanopia" elseif raw == 3 then val = "Deuteranopia" elseif raw == 4 then val = "Tritanopia" end + val = util.strval(themes.color_mode_name(raw)) end if val == "nil" then val = "" end diff --git a/rtu/panel/front_panel.lua b/rtu/panel/front_panel.lua index 9989e9a..36e72f4 100644 --- a/rtu/panel/front_panel.lua +++ b/rtu/panel/front_panel.lua @@ -10,6 +10,7 @@ local databus = require("rtu.databus") local style = require("rtu.panel.style") local core = require("graphics.core") +local themes = require("graphics.themes") local Div = require("graphics.elements.div") local TextBox = require("graphics.elements.textbox") @@ -18,6 +19,8 @@ local DataIndicator = require("graphics.elements.indicators.data") local LED = require("graphics.elements.indicators.led") local RGBLED = require("graphics.elements.indicators.ledrgb") +local LINK_STATE = types.PANEL_LINK_STATE + local ALIGN = core.ALIGN local cpair = core.cpair @@ -29,7 +32,8 @@ local UNIT_TYPE_LABELS = { "UNKNOWN", "REDSTONE", "BOILER", "TURBINE", "DYNAMIC -- create new front panel view ---@param panel graphics_element main displaybox ---@param units table unit list -local function init(panel, units) +---@param color_mode COLOR_MODE color mode +local function init(panel, units, color_mode) local disabled_fg = style.fp.disabled_fg TextBox{parent=panel,y=1,text="RTU GATEWAY",alignment=ALIGN.CENTER,height=1,fg_bg=style.theme.header} @@ -48,12 +52,43 @@ local function init(panel, units) heartbeat.register(databus.ps, "heartbeat", heartbeat.update) local modem = LED{parent=system,label="MODEM",colors=ind_grn} - local network = RGBLED{parent=system,label="NETWORK",colors={colors.green,colors.red,colors.orange,colors.yellow,colors.gray}} - network.update(types.PANEL_LINK_STATE.DISCONNECTED) + + if color_mode == themes.COLOR_MODE.STANDARD then + local network = RGBLED{parent=system,label="NETWORK",colors={colors.green,colors.red,colors.orange,colors.yellow,colors.gray}} + network.update(types.PANEL_LINK_STATE.DISCONNECTED) + network.register(databus.ps, "link_state", network.update) + else + local nt_lnk = RGBLED{parent=system,label="NT LINKED",colors={colors.red_off,colors.red,colors.green}} + local nt_ver = RGBLED{parent=system,label="NT VERSION",colors={colors.red_off,colors.red,colors.green}} + + nt_lnk.register(databus.ps, "link_state", function (state) + local value = 2 + + if state == LINK_STATE.DISCONNECTED then + value = 1 + elseif state == LINK_STATE.LINKED then + value = 3 + end + + nt_lnk.update(value) + end) + + nt_ver.register(databus.ps, "link_state", function (state) + local value = 3 + + if state == LINK_STATE.BAD_VERSION then + value = 2 + elseif state == LINK_STATE.DISCONNECTED then + value = 1 + end + + nt_ver.update(value) + end) + end + system.line_break() modem.register(databus.ps, "has_modem", modem.update) - network.register(databus.ps, "link_state", network.update) local rt_main = LED{parent=system,label="RT MAIN",colors=ind_grn} local rt_comm = LED{parent=system,label="RT COMMS",colors=ind_grn} diff --git a/rtu/renderer.lua b/rtu/renderer.lua index 2a1a235..8d56a40 100644 --- a/rtu/renderer.lua +++ b/rtu/renderer.lua @@ -19,9 +19,10 @@ local ui = { -- try to start the UI ---@param units table RTU units ----@param theme integer front panel theme ID (1 = sandstone, 2 = basalt) +---@param theme FP_THEME front panel theme +---@param color_mode COLOR_MODE color mode ---@return boolean success, any error_msg -function renderer.try_start_ui(units, theme) +function renderer.try_start_ui(units, theme, color_mode) local status, msg = true, nil if ui.display == nil then @@ -39,10 +40,16 @@ function renderer.try_start_ui(units, theme) term.setPaletteColor(style.theme.colors[i].c, style.theme.colors[i].hex) end + -- apply color mode + local c_mode_overrides = style.theme.color_modes[color_mode] + for i = 1, #c_mode_overrides do + term.setPaletteColor(c_mode_overrides[i].c, c_mode_overrides[i].hex) + end + -- init front panel view status, msg = pcall(function () ui.display = DisplayBox{window=term.current(),fg_bg=style.fp.root} - panel_view(ui.display, units) + panel_view(ui.display, units, color_mode) end) if status then diff --git a/rtu/startup.lua b/rtu/startup.lua index 8888d05..4b92756 100644 --- a/rtu/startup.lua +++ b/rtu/startup.lua @@ -31,7 +31,7 @@ local sna_rtu = require("rtu.dev.sna_rtu") local sps_rtu = require("rtu.dev.sps_rtu") local turbinev_rtu = require("rtu.dev.turbinev_rtu") -local RTU_VERSION = "v1.7.15" +local RTU_VERSION = "v1.8.0" local RTU_UNIT_TYPE = types.RTU_UNIT_TYPE local RTU_UNIT_HW_STATE = databus.RTU_UNIT_HW_STATE @@ -506,7 +506,7 @@ local function main() if sys_config() then -- start UI local message - rtu_state.fp_ok, message = renderer.try_start_ui(units, config.FrontPanelTheme) + rtu_state.fp_ok, message = renderer.try_start_ui(units, config.FrontPanelTheme, config.ColorMode) if not rtu_state.fp_ok then println_ts(util.c("UI error: ", message)) diff --git a/supervisor/configure.lua b/supervisor/configure.lua index 0b63519..1ea1677 100644 --- a/supervisor/configure.lua +++ b/supervisor/configure.lua @@ -7,6 +7,7 @@ local tcd = require("scada-common.tcd") local util = require("scada-common.util") local core = require("graphics.core") +local themes = require("graphics.themes") local DisplayBox = require("graphics.elements.displaybox") local Div = require("graphics.elements.div") @@ -772,29 +773,29 @@ local function config_view(display) TextBox{parent=clr_c_1,x=1,y=4,height=2,text="Click 'Accessibility' below to access color blind assistive options.",fg_bg=g_lg_fg_bg} TextBox{parent=clr_c_1,x=1,y=7,height=1,text="Front Panel Theme"} - local fp_theme = RadioButton{parent=clr_c_1,x=1,y=8,default=ini_cfg.FrontPanelTheme,options={"Sandstone","Basalt"},callback=function()end,radio_colors=cpair(colors.lightGray,colors.black),select_color=colors.magenta} + local fp_theme = RadioButton{parent=clr_c_1,x=1,y=8,default=ini_cfg.FrontPanelTheme,options=themes.FP_THEME_NAMES,callback=function()end,radio_colors=cpair(colors.lightGray,colors.black),select_color=colors.magenta} TextBox{parent=clr_c_2,x=1,y=1,height=6,text="By default, this project uses green/red heavily to distinguish ok and not, with some indicators also using multiple colors. By selecting a color blindness below, blues will be used instead of greens on indicators and multi-color indicators will be split up as space permits."} local function recolor(value) if value == 1 then for i = 1, #style.colors do term.setPaletteColor(style.colors[i].c, style.colors[i].hex) end - elseif value == 2 then - term.setPaletteColor(colors.green, 0x1081ff) - term.setPaletteColor(colors.yellow, 0xf5e633) - term.setPaletteColor(colors.red, 0xff521a) - elseif value == 3 then + elseif value == themes.COLOR_MODE.DEUTERANOPIA then term.setPaletteColor(colors.green, 0x1081ff) term.setPaletteColor(colors.yellow, 0xf7c311) term.setPaletteColor(colors.red, 0xfb5615) - elseif value == 4 then + elseif value == themes.COLOR_MODE.PROTANOPIA then + term.setPaletteColor(colors.green, 0x1081ff) + term.setPaletteColor(colors.yellow, 0xf5e633) + term.setPaletteColor(colors.red, 0xff521a) + elseif value == themes.COLOR_MODE.TRITANOPIA then term.setPaletteColor(colors.green, 0x00ecff) term.setPaletteColor(colors.yellow, 0xffbc00) term.setPaletteColor(colors.red, 0xff0000) end end - local c_mode = RadioButton{parent=clr_c_2,x=1,y=8,default=ini_cfg.ColorMode,options={"None","Protanopia","Deuteranopia","Tritanopia"},callback=recolor,radio_colors=cpair(colors.lightGray,colors.black),select_color=colors.magenta} + local c_mode = RadioButton{parent=clr_c_2,x=1,y=8,default=ini_cfg.ColorMode,options=themes.COLOR_MODE_NAMES,callback=recolor,radio_colors=cpair(colors.lightGray,colors.black),select_color=colors.magenta} local _ = IndLight{parent=clr_c_2,x=20,y=8,label="Good",colors=cpair(colors.black,colors.green),value=true} _ = IndLight{parent=clr_c_2,x=20,y=9,label="Warning",colors=cpair(colors.black,colors.yellow),value=true} @@ -1107,9 +1108,9 @@ 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] == "FrontPanelTheme" then - if raw == 1 then val = "Sandstone" elseif raw == 2 then val = "Basalt" end + val = util.strval(themes.fp_theme_name(raw)) elseif f[1] == "ColorMode" then - if raw == 1 then val = "Standard" elseif raw == 2 then val = "Protanopia" elseif raw == 3 then val = "Deuteranopia" elseif raw == 4 then val = "Tritanopia" end + val = util.strval(themes.color_mode_name(raw)) elseif f[1] == "CoolingConfig" and type(cfg.CoolingConfig) == "table" then val = "" diff --git a/supervisor/databus.lua b/supervisor/databus.lua index 00185c7..f5daefb 100644 --- a/supervisor/databus.lua +++ b/supervisor/databus.lua @@ -64,7 +64,7 @@ function databus.tx_plc_rtt(reactor_id, rtt) elseif rtt > WARN_RTT then databus.ps.publish("plc_" .. reactor_id .. "_rtt_color", colors.yellow_hc) else - databus.ps.publish("plc_" .. reactor_id .. "_rtt_color", colors.green) + databus.ps.publish("plc_" .. reactor_id .. "_rtt_color", colors.green_hc) end end @@ -95,7 +95,7 @@ function databus.tx_rtu_rtt(session_id, rtt) elseif rtt > WARN_RTT then databus.ps.publish("rtu_" .. session_id .. "_rtt_color", colors.yellow_hc) else - databus.ps.publish("rtu_" .. session_id .. "_rtt_color", colors.green) + databus.ps.publish("rtu_" .. session_id .. "_rtt_color", colors.green_hc) end end @@ -134,7 +134,7 @@ function databus.tx_crd_rtt(rtt) elseif rtt > WARN_RTT then databus.ps.publish("crd_rtt_color", colors.yellow_hc) else - databus.ps.publish("crd_rtt_color", colors.green) + databus.ps.publish("crd_rtt_color", colors.green_hc) end end @@ -165,7 +165,7 @@ function databus.tx_pdg_rtt(session_id, rtt) elseif rtt > WARN_RTT then databus.ps.publish("pdg_" .. session_id .. "_rtt_color", colors.yellow_hc) else - databus.ps.publish("pdg_" .. session_id .. "_rtt_color", colors.green) + databus.ps.publish("pdg_" .. session_id .. "_rtt_color", colors.green_hc) end end diff --git a/supervisor/panel/front_panel.lua b/supervisor/panel/front_panel.lua index add7fcf..9bf8e7b 100644 --- a/supervisor/panel/front_panel.lua +++ b/supervisor/panel/front_panel.lua @@ -96,7 +96,7 @@ local function init(panel) TextBox{parent=plc_entry,x=1,y=2,text="UNIT "..i,alignment=ALIGN.CENTER,width=8,height=1,fg_bg=s_hi_box} TextBox{parent=plc_entry,x=1,y=3,text="",width=8,height=1,fg_bg=s_hi_box} - local conn = LED{parent=plc_entry,x=10,y=2,label="LINK",colors=ind_grn} + local conn = LED{parent=plc_entry,x=10,y=2,label="LINK",colors=cpair(colors.green_hc,colors.green_off)} conn.register(databus.ps, ps_prefix .. "conn", conn.update) local plc_addr = TextBox{parent=plc_entry,x=17,y=2,text=" --- ",width=5,height=1,fg_bg=label_d_fg} @@ -126,7 +126,7 @@ local function init(panel) local crd_page = Div{parent=page_div,x=1,y=1,hidden=true} local crd_box = Div{parent=crd_page,x=2,y=2,width=49,height=4,fg_bg=s_hi_bright} - local crd_conn = LED{parent=crd_box,x=2,y=2,label="CONNECTION",colors=ind_grn} + local crd_conn = LED{parent=crd_box,x=2,y=2,label="CONNECTION",colors=cpair(colors.green_hc,colors.green_off)} crd_conn.register(databus.ps, "crd_conn", crd_conn.update) TextBox{parent=crd_box,x=4,y=3,text="COMPUTER",width=8,height=1,fg_bg=label_d_fg} diff --git a/supervisor/renderer.lua b/supervisor/renderer.lua index 8f9389f..b1c9f06 100644 --- a/supervisor/renderer.lua +++ b/supervisor/renderer.lua @@ -19,9 +19,10 @@ local ui = { } -- try to start the UI ----@param theme integer front panel theme ID (1 = sandstone, 2 = basalt) +---@param theme FP_THEME front panel theme +---@param color_mode COLOR_MODE color mode ---@return boolean success, any error_msg -function renderer.try_start_ui(theme) +function renderer.try_start_ui(theme, color_mode) local status, msg = true, nil if ui.display == nil then @@ -39,6 +40,12 @@ function renderer.try_start_ui(theme) term.setPaletteColor(style.theme.colors[i].c, style.theme.colors[i].hex) end + -- apply color mode + local c_mode_overrides = style.theme.color_modes[color_mode] + for i = 1, #c_mode_overrides do + term.setPaletteColor(c_mode_overrides[i].c, c_mode_overrides[i].hex) + end + -- init front panel view status, msg = pcall(function () ui.display = DisplayBox{window=term.current(),fg_bg=style.fp.root} diff --git a/supervisor/startup.lua b/supervisor/startup.lua index d9c2229..4eae495 100644 --- a/supervisor/startup.lua +++ b/supervisor/startup.lua @@ -21,7 +21,7 @@ local supervisor = require("supervisor.supervisor") local svsessions = require("supervisor.session.svsessions") -local SUPERVISOR_VERSION = "v1.2.12" +local SUPERVISOR_VERSION = "v1.3.0" local println = util.println local println_ts = util.println_ts @@ -118,7 +118,7 @@ local function main() databus.tx_hw_modem(true) -- start UI - local fp_ok, message = renderer.try_start_ui(config.FrontPanelTheme) + local fp_ok, message = renderer.try_start_ui(config.FrontPanelTheme, config.ColorMode) if not fp_ok then println_ts(util.c("UI error: ", message)) From 9d08b51f84d2616c8cd3879b8c3041f3bfa64211 Mon Sep 17 00:00:00 2001 From: Mikayla Fischler Date: Mon, 11 Mar 2024 21:43:11 -0400 Subject: [PATCH 22/44] #340 restored softer blue for deuteranopia/protanopia basalt theme --- graphics/themes.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/graphics/themes.lua b/graphics/themes.lua index 85928ac..a8376b2 100644 --- a/graphics/themes.lua +++ b/graphics/themes.lua @@ -186,7 +186,7 @@ themes.basalt = { {}, -- deuteranopia { - { c = colors.green, hex = 0x3393ff }, + { c = colors.green, hex = 0x65aeff }, { c = colors.green_hc, hex = 0x99c9ff }, { c = colors.green_off, hex = 0x333333 }, { c = colors.yellow, hex = 0xf7c311 }, @@ -196,7 +196,7 @@ themes.basalt = { }, -- protanopia { - { c = colors.green, hex = 0x3393ff }, + { c = colors.green, hex = 0x65aeff }, { c = colors.green_hc, hex = 0x99c9ff }, { c = colors.green_off, hex = 0x333333 }, { c = colors.yellow, hex = 0xf5e633 }, From 1f451ff92adfd82607761e5e935968c1446fef6f Mon Sep 17 00:00:00 2001 From: Mikayla Fischler Date: Mon, 11 Mar 2024 23:31:31 -0400 Subject: [PATCH 23/44] #340 coordinator colorblind support --- coordinator/configure.lua | 12 +-- coordinator/iocontrol.lua | 2 +- coordinator/renderer.lua | 27 +++++-- coordinator/startup.lua | 7 +- coordinator/ui/components/process_ctl.lua | 20 ++--- coordinator/ui/components/unit_detail.lua | 49 ++++++------ coordinator/ui/components/unit_flow.lua | 12 +-- coordinator/ui/layout/front_panel.lua | 43 +++++++++- coordinator/ui/style.lua | 95 +++++++++++++++++------ graphics/themes.lua | 3 + 10 files changed, 187 insertions(+), 83 deletions(-) diff --git a/coordinator/configure.lua b/coordinator/configure.lua index b2576c5..1480dd7 100644 --- a/coordinator/configure.lua +++ b/coordinator/configure.lua @@ -843,15 +843,15 @@ local function config_view(display) local function recolor(value) if value == 1 then for i = 1, #style.colors do term.setPaletteColor(style.colors[i].c, style.colors[i].hex) end - elseif value == 2 then - term.setPaletteColor(colors.green, 0x1081ff) - term.setPaletteColor(colors.yellow, 0xf5e633) - term.setPaletteColor(colors.red, 0xff521a) - elseif value == 3 then + elseif value == themes.COLOR_MODE.DEUTERANOPIA then term.setPaletteColor(colors.green, 0x1081ff) term.setPaletteColor(colors.yellow, 0xf7c311) term.setPaletteColor(colors.red, 0xfb5615) - elseif value == 4 then + elseif value == themes.COLOR_MODE.PROTANOPIA then + term.setPaletteColor(colors.green, 0x1081ff) + term.setPaletteColor(colors.yellow, 0xf5e633) + term.setPaletteColor(colors.red, 0xff521a) + elseif value == themes.COLOR_MODE.TRITANOPIA then term.setPaletteColor(colors.green, 0x00ecff) term.setPaletteColor(colors.yellow, 0xffbc00) term.setPaletteColor(colors.red, 0xff0000) diff --git a/coordinator/iocontrol.lua b/coordinator/iocontrol.lua index 312d194..0cb50e4 100644 --- a/coordinator/iocontrol.lua +++ b/coordinator/iocontrol.lua @@ -403,7 +403,7 @@ function iocontrol.fp_pkt_rtt(session_id, rtt) elseif rtt > WARN_RTT then io.fp.ps.publish("pkt_" .. session_id .. "_rtt_color", colors.yellow_hc) else - io.fp.ps.publish("pkt_" .. session_id .. "_rtt_color", colors.green) + io.fp.ps.publish("pkt_" .. session_id .. "_rtt_color", colors.green_hc) end end diff --git a/coordinator/renderer.lua b/coordinator/renderer.lua index c05afee..ad275dc 100644 --- a/coordinator/renderer.lua +++ b/coordinator/renderer.lua @@ -16,6 +16,7 @@ local unit_view = require("coordinator.ui.layout.unit_view") local core = require("graphics.core") local flasher = require("graphics.flasher") +local themes = require("graphics.themes") local DisplayBox = require("graphics.elements.displaybox") @@ -24,6 +25,7 @@ local renderer = {} -- render engine local engine = { + color_mode = 1, ---@type COLOR_MODE monitors = nil, ---@type monitors_struct|nil dmesg_window = nil, ---@type table|nil ui_ready = false, @@ -50,6 +52,12 @@ local function _init_display(monitor) for i = 1, #style.theme.colors do monitor.setPaletteColor(style.theme.colors[i].c, style.theme.colors[i].hex) end + + -- apply color mode + local c_mode_overrides = style.theme.color_modes[engine.color_mode] + for i = 1, #c_mode_overrides do + monitor.setPaletteColor(c_mode_overrides[i].c, c_mode_overrides[i].hex) + end end -- print out that the monitor is too small @@ -62,10 +70,13 @@ local function _print_too_small(monitor) monitor.write("monitor too small") end --- disable the flow view ----@param disable boolean -function renderer.legacy_disable_flow_view(disable) - engine.disable_flow_view = disable +-- apply renderer configurations +---@param config crd_config +function renderer.configure(config) + style.set_themes(config.MainTheme, config.FrontPanelTheme, config.ColorMode ~= themes.COLOR_MODE.STANDARD) + + engine.color_mode = config.ColorMode + engine.disable_flow_view = config.DisableFlowView end -- link to the monitor peripherals @@ -100,6 +111,12 @@ function renderer.init_displays() for i = 1, #style.fp_theme.colors do term.setPaletteColor(style.fp_theme.colors[i].c, style.fp_theme.colors[i].hex) end + + -- apply color mode + local c_mode_overrides = style.fp_theme.color_modes[engine.color_mode] + for i = 1, #c_mode_overrides do + term.setPaletteColor(c_mode_overrides[i].c, c_mode_overrides[i].hex) + end end -- initialize the dmesg output window @@ -118,7 +135,7 @@ function renderer.try_start_fp() -- show front panel view on terminal status, msg = pcall(function () engine.ui.front_panel = DisplayBox{window=term.native(),fg_bg=style.fp.root} - panel_view(engine.ui.front_panel, #engine.monitors.unit_displays) + panel_view(engine.ui.front_panel, #engine.monitors.unit_displays, engine.color_mode) end) if status then diff --git a/coordinator/startup.lua b/coordinator/startup.lua index feeafd0..5b3c46b 100644 --- a/coordinator/startup.lua +++ b/coordinator/startup.lua @@ -22,9 +22,7 @@ local sounder = require("coordinator.sounder") local apisessions = require("coordinator.session.apisessions") -local style = require("coordinator.ui.style") - -local COORDINATOR_VERSION = "v1.2.12" +local COORDINATOR_VERSION = "v1.3.0" local CHUNK_LOAD_DELAY_S = 30.0 @@ -122,8 +120,7 @@ local function main() iocontrol.init_fp(COORDINATOR_VERSION, comms.version) -- init renderer - style.set_themes(config.MainTheme, config.FrontPanelTheme) - renderer.legacy_disable_flow_view(config.DisableFlowView) + renderer.configure(config) renderer.set_displays(monitors) renderer.init_displays() renderer.init_dmesg() diff --git a/coordinator/ui/components/process_ctl.lua b/coordinator/ui/components/process_ctl.lua index e1c3252..fb0c939 100644 --- a/coordinator/ui/components/process_ctl.lua +++ b/coordinator/ui/components/process_ctl.lua @@ -30,11 +30,6 @@ local border = core.border local bw_fg_bg = style.bw_fg_bg -local ind_grn = style.ind_grn -local ind_yel = style.ind_yel -local ind_red = style.ind_red -local ind_wht = style.ind_wht - local period = core.flasher.PERIOD -- new process control view @@ -50,6 +45,11 @@ local function new_view(root, x, y) local dis_colors = style.dis_colors local arrow_fg_bg = cpair(style.theme.label, s_hi_box.bkg) + local ind_grn = style.ind_grn + local ind_yel = style.ind_yel + local ind_red = style.ind_red + local ind_wht = style.ind_wht + assert(root.get_height() >= (y + 24), "main display not of sufficient vertical resolution (add an additional row of monitors)") local black = cpair(colors.black, colors.black) @@ -68,7 +68,7 @@ local function new_view(root, x, y) facility.ack_alarms_ack = ack_a.on_response local all_ok = IndicatorLight{parent=main,y=5,label="Unit Systems Online",colors=ind_grn} - local rad_mon = TriIndicatorLight{parent=main,label="Radiation Monitor",c1=colors.gray,c2=colors.yellow,c3=colors.green} + local rad_mon = TriIndicatorLight{parent=main,label="Radiation Monitor",c1=style.ind_bkg,c2=ind_yel.fgd,c3=ind_grn.fgd} local ind_mat = IndicatorLight{parent=main,label="Induction Matrix",colors=ind_grn} local sps = IndicatorLight{parent=main,label="SPS Connected",colors=ind_grn} @@ -219,7 +219,7 @@ local function new_view(root, x, y) if i <= facility.num_units then tag_fg_bg = cpair(colors.black, colors.cyan) ind_fg_bg = cpair(style.theme.text, s_hi_box.bkg) - ind_off = style.theme.label + ind_off = style.ind_hi_box_bg end local _y = ((i - 1) * 5) + 1 @@ -228,8 +228,8 @@ local function new_view(root, x, y) TextBox{parent=unit_tag,x=2,y=2,text="Unit "..i.." Status",width=7,height=2} local lights = Div{parent=stat_div,x=9,y=_y,width=14,height=4,fg_bg=ind_fg_bg} - local ready = IndicatorLight{parent=lights,x=2,y=2,label="Ready",colors=cpair(colors.green,ind_off)} - local degraded = IndicatorLight{parent=lights,x=2,y=3,label="Degraded",colors=cpair(colors.red,ind_off),flash=true,period=period.BLINK_250_MS} + local ready = IndicatorLight{parent=lights,x=2,y=2,label="Ready",colors=cpair(ind_grn.fgd,ind_off)} + local degraded = IndicatorLight{parent=lights,x=2,y=3,label="Degraded",colors=cpair(ind_red.fgd,ind_off),flash=true,period=period.BLINK_250_MS} if i <= facility.num_units then local unit = units[i] ---@type ioctl_unit @@ -341,7 +341,7 @@ local function new_view(root, x, y) status.register(facility.ps, "current_waste_product", status.update) local waste_prod = RadioButton{parent=rect,x=2,y=3,options=style.waste.options,callback=process.set_process_waste,radio_colors=cpair(style.theme.accent_dark,style.theme.accent_light),select_color=colors.brown} - local pu_fallback = Checkbox{parent=rect,x=2,y=7,label="Pu Fallback",callback=process.set_pu_fallback,box_fg_bg=cpair(colors.green,style.theme.accent_light)} + local pu_fallback = Checkbox{parent=rect,x=2,y=7,label="Pu Fallback",callback=process.set_pu_fallback,box_fg_bg=cpair(colors.green,style.theme.checkbox_bg)} waste_prod.register(facility.ps, "process_waste_product", waste_prod.set_value) pu_fallback.register(facility.ps, "process_pu_fallback", pu_fallback.set_value) diff --git a/coordinator/ui/components/unit_detail.lua b/coordinator/ui/components/unit_detail.lua index d76c9d8..2264b00 100644 --- a/coordinator/ui/components/unit_detail.lua +++ b/coordinator/ui/components/unit_detail.lua @@ -37,11 +37,6 @@ local border = core.border local bw_fg_bg = style.bw_fg_bg local gry_wht = style.gray_white -local ind_grn = style.ind_grn -local ind_yel = style.ind_yel -local ind_red = style.ind_red -local ind_wht = style.ind_wht - local period = core.flasher.PERIOD -- create a unit view @@ -58,6 +53,12 @@ local function init(parent, id) local dis_colors = style.dis_colors local arrow_fg_bg = cpair(style.theme.label, s_hi_box.bkg) + local ind_bkg = style.ind_bkg + local ind_grn = style.ind_grn + local ind_yel = style.ind_yel + local ind_red = style.ind_red + local ind_wht = style.ind_wht + local db = iocontrol.get_db() local unit = db.units[id] ---@type ioctl_unit local f_ps = db.facility.ps @@ -158,9 +159,9 @@ local function init(parent, id) local annunciator = Div{parent=main,width=23,height=18,x=22,y=3} -- connectivity - local plc_online = IndicatorLight{parent=annunciator,label="PLC Online",colors=cpair(colors.green,colors.red)} + local plc_online = IndicatorLight{parent=annunciator,label="PLC Online",colors=cpair(ind_grn.fgd,ind_red.fgd)} local plc_hbeat = IndicatorLight{parent=annunciator,label="PLC Heartbeat",colors=ind_wht} - local rad_mon = TriIndicatorLight{parent=annunciator,label="Radiation Monitor",c1=colors.gray,c2=colors.yellow,c3=colors.green} + local rad_mon = TriIndicatorLight{parent=annunciator,label="Radiation Monitor",c1=ind_bkg,c2=ind_yel.fgd,c3=ind_grn.fgd} plc_online.register(u_ps, "PLCOnline", plc_online.update) plc_hbeat.register(u_ps, "PLCHeartbeat", plc_hbeat.update) @@ -217,7 +218,7 @@ local function init(parent, id) local rps_loc = IndicatorLight{parent=rps_annunc,label="Coolant Level Low Low",colors=ind_yel} local rps_flt = IndicatorLight{parent=rps_annunc,label="PPM Fault",colors=ind_yel,flash=true,period=period.BLINK_500_MS} local rps_tmo = IndicatorLight{parent=rps_annunc,label="Connection Timeout",colors=ind_yel,flash=true,period=period.BLINK_500_MS} - local rps_sfl = IndicatorLight{parent=rps_annunc,label="System Failure",colors=cpair(colors.orange,colors.gray),flash=true,period=period.BLINK_500_MS} + local rps_sfl = IndicatorLight{parent=rps_annunc,label="System Failure",colors=ind_red,flash=true,period=period.BLINK_500_MS} rps_trp.register(u_ps, "rps_tripped", rps_trp.update) rps_dmg.register(u_ps, "high_dmg", rps_dmg.update) @@ -238,7 +239,7 @@ local function init(parent, id) local rcs_tags = Div{parent=rcs,width=2,height=16,x=1,y=7} local c_flt = IndicatorLight{parent=rcs_annunc,label="RCS Hardware Fault",colors=ind_yel} - local c_emg = TriIndicatorLight{parent=rcs_annunc,label="Emergency Coolant",c1=colors.gray,c2=colors.white,c3=colors.green} + local c_emg = TriIndicatorLight{parent=rcs_annunc,label="Emergency Coolant",c1=ind_bkg,c2=ind_wht.fgd,c3=ind_grn.fgd} local c_cfm = IndicatorLight{parent=rcs_annunc,label="Coolant Feed Mismatch",colors=ind_yel} local c_brm = IndicatorLight{parent=rcs_annunc,label="Boil Rate Mismatch",colors=ind_yel} local c_sfm = IndicatorLight{parent=rcs_annunc,label="Steam Feed Mismatch",colors=ind_yel} @@ -294,7 +295,7 @@ local function init(parent, id) if available_space > 1 then _add_space() end TextBox{parent=rcs_tags,text="T1",width=2,height=1,fg_bg=hc_text} - local t1_sdo = TriIndicatorLight{parent=rcs_annunc,label="Steam Relief Valve Open",c1=colors.gray,c2=colors.yellow,c3=colors.red} + local t1_sdo = TriIndicatorLight{parent=rcs_annunc,label="Steam Relief Valve Open",c1=ind_bkg,c2=ind_yel.fgd,c3=ind_red.fgd} t1_sdo.register(t_ps[1], "SteamDumpOpen", t1_sdo.update) TextBox{parent=rcs_tags,text="T1",width=2,height=1,fg_bg=hc_text} @@ -315,7 +316,7 @@ local function init(parent, id) end TextBox{parent=rcs_tags,text="T2",width=2,height=1,fg_bg=hc_text} - local t2_sdo = TriIndicatorLight{parent=rcs_annunc,label="Steam Relief Valve Open",c1=colors.gray,c2=colors.yellow,c3=colors.red} + local t2_sdo = TriIndicatorLight{parent=rcs_annunc,label="Steam Relief Valve Open",c1=ind_bkg,c2=ind_yel.fgd,c3=ind_red.fgd} t2_sdo.register(t_ps[2], "SteamDumpOpen", t2_sdo.update) TextBox{parent=rcs_tags,text="T2",width=2,height=1,fg_bg=hc_text} @@ -335,7 +336,7 @@ local function init(parent, id) if available_space > 3 then _add_space() end TextBox{parent=rcs_tags,text="T3",width=2,height=1,fg_bg=hc_text} - local t3_sdo = TriIndicatorLight{parent=rcs_annunc,label="Steam Relief Valve Open",c1=colors.gray,c2=colors.yellow,c3=colors.red} + local t3_sdo = TriIndicatorLight{parent=rcs_annunc,label="Steam Relief Valve Open",c1=ind_bkg,c2=ind_yel.fgd,c3=ind_red.fgd} t3_sdo.register(t_ps[3], "SteamDumpOpen", t3_sdo.update) TextBox{parent=rcs_tags,text="T3",width=2,height=1,fg_bg=hc_text} @@ -405,20 +406,20 @@ local function init(parent, id) local alarm_panel = Div{parent=main,x=2,y=36,width=29,height=16,fg_bg=s_hi_bright} - local a_brc = AlarmLight{parent=alarm_panel,x=6,y=2,label="Containment Breach",c1=colors.gray,c2=colors.red,c3=colors.green,flash=true,period=period.BLINK_250_MS} - local a_rad = AlarmLight{parent=alarm_panel,x=6,label="Containment Radiation",c1=colors.gray,c2=colors.red,c3=colors.green,flash=true,period=period.BLINK_250_MS} - local a_dmg = AlarmLight{parent=alarm_panel,x=6,label="Critical Damage",c1=colors.gray,c2=colors.red,c3=colors.green,flash=true,period=period.BLINK_250_MS} + local a_brc = AlarmLight{parent=alarm_panel,x=6,y=2,label="Containment Breach",c1=ind_bkg,c2=ind_red.fgd,c3=ind_grn.fgd,flash=true,period=period.BLINK_250_MS} + local a_rad = AlarmLight{parent=alarm_panel,x=6,label="Containment Radiation",c1=ind_bkg,c2=ind_red.fgd,c3=ind_grn.fgd,flash=true,period=period.BLINK_250_MS} + local a_dmg = AlarmLight{parent=alarm_panel,x=6,label="Critical Damage",c1=ind_bkg,c2=ind_red.fgd,c3=ind_grn.fgd,flash=true,period=period.BLINK_250_MS} alarm_panel.line_break() - local a_rcl = AlarmLight{parent=alarm_panel,x=6,label="Reactor Lost",c1=colors.gray,c2=colors.red,c3=colors.green,flash=true,period=period.BLINK_250_MS} - local a_rcd = AlarmLight{parent=alarm_panel,x=6,label="Reactor Damage",c1=colors.gray,c2=colors.red,c3=colors.green,flash=true,period=period.BLINK_250_MS} - local a_rot = AlarmLight{parent=alarm_panel,x=6,label="Reactor Over Temp",c1=colors.gray,c2=colors.red,c3=colors.green,flash=true,period=period.BLINK_250_MS} - local a_rht = AlarmLight{parent=alarm_panel,x=6,label="Reactor High Temp",c1=colors.gray,c2=colors.yellow,c3=colors.green,flash=true,period=period.BLINK_500_MS} - local a_rwl = AlarmLight{parent=alarm_panel,x=6,label="Reactor Waste Leak",c1=colors.gray,c2=colors.red,c3=colors.green,flash=true,period=period.BLINK_250_MS} - local a_rwh = AlarmLight{parent=alarm_panel,x=6,label="Reactor Waste High",c1=colors.gray,c2=colors.yellow,c3=colors.green,flash=true,period=period.BLINK_500_MS} + local a_rcl = AlarmLight{parent=alarm_panel,x=6,label="Reactor Lost",c1=ind_bkg,c2=ind_red.fgd,c3=ind_grn.fgd,flash=true,period=period.BLINK_250_MS} + local a_rcd = AlarmLight{parent=alarm_panel,x=6,label="Reactor Damage",c1=ind_bkg,c2=ind_red.fgd,c3=ind_grn.fgd,flash=true,period=period.BLINK_250_MS} + local a_rot = AlarmLight{parent=alarm_panel,x=6,label="Reactor Over Temp",c1=ind_bkg,c2=ind_red.fgd,c3=ind_grn.fgd,flash=true,period=period.BLINK_250_MS} + local a_rht = AlarmLight{parent=alarm_panel,x=6,label="Reactor High Temp",c1=ind_bkg,c2=ind_yel.fgd,c3=ind_grn.fgd,flash=true,period=period.BLINK_500_MS} + local a_rwl = AlarmLight{parent=alarm_panel,x=6,label="Reactor Waste Leak",c1=ind_bkg,c2=ind_red.fgd,c3=ind_grn.fgd,flash=true,period=period.BLINK_250_MS} + local a_rwh = AlarmLight{parent=alarm_panel,x=6,label="Reactor Waste High",c1=ind_bkg,c2=ind_yel.fgd,c3=ind_grn.fgd,flash=true,period=period.BLINK_500_MS} alarm_panel.line_break() - local a_rps = AlarmLight{parent=alarm_panel,x=6,label="RPS Transient",c1=colors.gray,c2=colors.yellow,c3=colors.green,flash=true,period=period.BLINK_500_MS} - local a_clt = AlarmLight{parent=alarm_panel,x=6,label="RCS Transient",c1=colors.gray,c2=colors.yellow,c3=colors.green,flash=true,period=period.BLINK_500_MS} - local a_tbt = AlarmLight{parent=alarm_panel,x=6,label="Turbine Trip",c1=colors.gray,c2=colors.red,c3=colors.green,flash=true,period=period.BLINK_250_MS} + local a_rps = AlarmLight{parent=alarm_panel,x=6,label="RPS Transient",c1=ind_bkg,c2=ind_yel.fgd,c3=ind_grn.fgd,flash=true,period=period.BLINK_500_MS} + local a_clt = AlarmLight{parent=alarm_panel,x=6,label="RCS Transient",c1=ind_bkg,c2=ind_yel.fgd,c3=ind_grn.fgd,flash=true,period=period.BLINK_500_MS} + local a_tbt = AlarmLight{parent=alarm_panel,x=6,label="Turbine Trip",c1=ind_bkg,c2=ind_red.fgd,c3=ind_grn.fgd,flash=true,period=period.BLINK_250_MS} a_brc.register(u_ps, "Alarm_1", a_brc.update) a_rad.register(u_ps, "Alarm_2", a_rad.update) diff --git a/coordinator/ui/components/unit_flow.lua b/coordinator/ui/components/unit_flow.lua index 115450b..39c2c00 100644 --- a/coordinator/ui/components/unit_flow.lua +++ b/coordinator/ui/components/unit_flow.lua @@ -30,9 +30,6 @@ local pipe = core.pipe local wh_gray = style.wh_gray local lg_gray = style.lg_gray -local ind_grn = style.ind_grn -local ind_wht = style.ind_wht - -- make a new unit flow window ---@param parent graphics_element parent ---@param x integer top left x @@ -46,6 +43,9 @@ local function make(parent, x, y, wide, unit) local lu_c = style.lu_colors local lu_c_d = style.lu_colors_dark + local ind_grn = style.ind_grn + local ind_wht = style.ind_wht + local height = 16 local v_start = 1 + ((unit.unit_id - 1) * 5) @@ -112,7 +112,7 @@ local function make(parent, x, y, wide, unit) cc_rate.register(unit.unit_ps, "boiler_boil_sum", function (sum) cc_rate.update(sum * 10) end) hc_rate.register(unit.unit_ps, "heating_rate", hc_rate.update) - local boiler = Rectangle{parent=root,x=_wide(47,40),y=1,border=border(1, colors.gray, true),width=19,height=5,fg_bg=wh_gray} + local boiler = Rectangle{parent=root,x=_wide(47,40),y=1,border=border(1,colors.gray,true),width=19,height=5,fg_bg=wh_gray} TextBox{parent=boiler,y=1,text="THERMO-ELECTRIC",alignment=ALIGN.CENTER,height=1} TextBox{parent=boiler,y=3,text=util.trinary(unit.num_boilers>1,"BOILERS","BOILER"),alignment=ALIGN.CENTER,height=1} TextBox{parent=root,x=_wide(47,40),y=2,text="\x1b \x80 \x1a",width=1,height=3,fg_bg=lg_gray} @@ -131,7 +131,7 @@ local function make(parent, x, y, wide, unit) st_rate.register(unit.unit_ps, "heating_rate", st_rate.update) end - local turbine = Rectangle{parent=root,x=_wide(93,79),y=1,border=border(1, colors.gray, true),width=19,height=5,fg_bg=wh_gray} + local turbine = Rectangle{parent=root,x=_wide(93,79),y=1,border=border(1,colors.gray,true),width=19,height=5,fg_bg=wh_gray} TextBox{parent=turbine,y=1,text="STEAM TURBINE",alignment=ALIGN.CENTER,height=1} TextBox{parent=turbine,y=3,text=util.trinary(unit.num_turbines>1,"GENERATORS","GENERATOR"),alignment=ALIGN.CENTER,height=1} TextBox{parent=root,x=_wide(93,79),y=2,text="\x1b \x80 \x1a",width=1,height=3,fg_bg=lg_gray} @@ -139,7 +139,7 @@ local function make(parent, x, y, wide, unit) for i = 1, unit.num_turbines do local ry = 1 + (2 * (i - 1)) + prv_yo TextBox{parent=root,x=_wide(125,103),y=ry,text="\x10\x11\x7f",fg_bg=text_c,width=3,height=1} - local state = TriIndicatorLight{parent=root,x=_wide(129,107),y=ry,label=v_names[i+4],c1=colors.gray,c2=colors.yellow,c3=colors.red} + local state = TriIndicatorLight{parent=root,x=_wide(129,107),y=ry,label=v_names[i+4],c1=style.ind_bkg,c2=style.ind_yel.fgd,c3=style.ind_red.fgd} state.register(unit.turbine_ps_tbl[i], "SteamDumpOpen", state.update) end diff --git a/coordinator/ui/layout/front_panel.lua b/coordinator/ui/layout/front_panel.lua index d2eb8ff..459a9f0 100644 --- a/coordinator/ui/layout/front_panel.lua +++ b/coordinator/ui/layout/front_panel.lua @@ -13,6 +13,7 @@ local style = require("coordinator.ui.style") local pkt_entry = require("coordinator.ui.components.pkt_entry") local core = require("graphics.core") +local themes = require("graphics.themes") local Div = require("graphics.elements.div") local ListBox = require("graphics.elements.listbox") @@ -24,6 +25,8 @@ local TabBar = require("graphics.elements.controls.tabbar") local LED = require("graphics.elements.indicators.led") local RGBLED = require("graphics.elements.indicators.ledrgb") +local LINK_STATE = types.PANEL_LINK_STATE + local ALIGN = core.ALIGN local cpair = core.cpair @@ -33,7 +36,8 @@ local led_grn = style.led_grn -- create new front panel view ---@param panel graphics_element main displaybox ---@param num_units integer number of units (number of unit monitors) -local function init(panel, num_units) +---@param color_mode COLOR_MODE color mode +local function init(panel, num_units, color_mode) local ps = iocontrol.get_db().fp.ps TextBox{parent=panel,y=1,text="SCADA COORDINATOR",alignment=ALIGN.CENTER,height=1,fg_bg=style.fp_theme.header} @@ -56,12 +60,43 @@ local function init(panel, num_units) heartbeat.register(ps, "heartbeat", heartbeat.update) local modem = LED{parent=system,label="MODEM",colors=led_grn} - local network = RGBLED{parent=system,label="NETWORK",colors={colors.green,colors.red,colors.orange,colors.yellow,colors.gray}} - network.update(types.PANEL_LINK_STATE.DISCONNECTED) + + if color_mode == themes.COLOR_MODE.STANDARD then + local network = RGBLED{parent=system,label="NETWORK",colors={colors.green,colors.red,colors.orange,colors.yellow,colors.gray}} + network.update(types.PANEL_LINK_STATE.DISCONNECTED) + network.register(ps, "link_state", network.update) + else + local nt_lnk = RGBLED{parent=system,label="NT LINKED",colors={colors.red_off,colors.red,colors.green}} + local nt_ver = RGBLED{parent=system,label="NT VERSION",colors={colors.red_off,colors.red,colors.green}} + + nt_lnk.register(ps, "link_state", function (state) + local value = 2 + + if state == LINK_STATE.DISCONNECTED then + value = 1 + elseif state == LINK_STATE.LINKED then + value = 3 + end + + nt_lnk.update(value) + end) + + nt_ver.register(ps, "link_state", function (state) + local value = 3 + + if state == LINK_STATE.BAD_VERSION then + value = 2 + elseif state == LINK_STATE.DISCONNECTED then + value = 1 + end + + nt_ver.update(value) + end) + end + system.line_break() modem.register(ps, "has_modem", modem.update) - network.register(ps, "link_state", network.update) local speaker = LED{parent=system,label="SPEAKER",colors=led_grn} speaker.register(ps, "has_speaker", speaker.update) diff --git a/coordinator/ui/style.lua b/coordinator/ui/style.lua index afa6b7b..6c91b2c 100644 --- a/coordinator/ui/style.lua +++ b/coordinator/ui/style.lua @@ -2,6 +2,8 @@ -- Graphics Style Options -- +local util = require("scada-common.util") + local core = require("graphics.core") local themes = require("graphics.themes") @@ -27,6 +29,7 @@ local smooth_stone = { label_dark = colors.gray, disabled = colors.lightGray, bg = colors.lightGray, + checkbox_bg = colors.black, accent_light = colors.white, accent_dark = colors.gray, @@ -59,6 +62,30 @@ local smooth_stone = { { c = colors.gray, hex = 0x575757 }, { c = colors.black, hex = 0x191919 }, { c = colors.brown, hex = 0x7f664c } + }, + + -- color re-mappings for assistive modes + color_modes = { + -- standard + {}, + -- deuteranopia + { + { c = colors.blue, hex = 0x1081ff }, + { c = colors.yellow, hex = 0xf7c311 }, + { c = colors.red, hex = 0xfb5615 }, + }, + -- protanopia + { + { c = colors.blue, hex = 0x1081ff }, + { c = colors.yellow, hex = 0xf5e633 }, + { c = colors.red, hex = 0xff521a }, + }, + -- tritanopia + { + { c = colors.blue, hex = 0x40cbd7 }, + { c = colors.yellow, hex = 0xffbc00 }, + { c = colors.red, hex = 0xff0000 }, + } } } @@ -70,6 +97,7 @@ local deepslate = { label_dark = colors.gray, disabled = colors.gray, bg = colors.black, + checkbox_bg = colors.gray, accent_light = colors.gray, accent_dark = colors.lightGray, @@ -102,44 +130,72 @@ local deepslate = { { c = colors.gray, hex = 0x575757 }, { c = colors.black, hex = 0x262626 }, { c = colors.brown, hex = 0xb18f6a } + }, + + -- color re-mappings for assistive modes + color_modes = { + -- standard + {}, + -- deuteranopia + { + { c = colors.blue, hex = 0x65aeff }, + { c = colors.yellow, hex = 0xf7c311 }, + { c = colors.red, hex = 0xfb5615 }, + }, + -- protanopia + { + { c = colors.blue, hex = 0x65aeff }, + { c = colors.yellow, hex = 0xf5e633 }, + { c = colors.red, hex = 0xff8058 }, + }, + -- tritanopia + { + { c = colors.blue, hex = 0x00ecff }, + { c = colors.yellow, hex = 0xffbc00 }, + { c = colors.red, hex = 0xdf4949 }, + } } } style.theme = smooth_stone -style.root = cpair(style.theme.text, style.theme.bg) -style.label = cpair(style.theme.label, style.theme.bg) - --- high contrast text (also tags) -style.hc_text = cpair(style.theme.text, style.theme.text_inv) --- text on default background -style.text_colors = cpair(style.theme.text, style.theme.bg) --- label & unit colors -style.lu_colors = cpair(style.theme.label, style.theme.label) --- label & unit colors (darker if set) -style.lu_colors_dark = cpair(style.theme.label_dark, style.theme.label_dark) - -- set themes per configurations ---@param main integer main theme ID (1 = smooth_stone, 2 = deepslate) ---@param fp integer fp theme ID (1 = sandstone, 2 = basalt) -function style.set_themes(main, fp) - if main == 1 then +---@param colorblind boolean true if in a colorblind mode +function style.set_themes(main, fp, colorblind) + style.ind_bkg = colors.gray + + style.ind_hi_box_bg = util.trinary(colorblind, colors.black, colors.gray) + + if main == themes.UI_THEME.SMOOTH_STONE then style.theme = smooth_stone - elseif main == 2 then + style.ind_bkg = util.trinary(colorblind, colors.black, colors.gray) + elseif main == themes.UI_THEME.DEEPSLATE then style.theme = deepslate + style.ind_hi_box_bg = util.trinary(colorblind, colors.black, colors.lightGray) end style.root = cpair(style.theme.text, style.theme.bg) style.label = cpair(style.theme.label, style.theme.bg) + -- high contrast text (also tags) style.hc_text = cpair(style.theme.text, style.theme.text_inv) + -- text on default background style.text_colors = cpair(style.theme.text, style.theme.bg) + -- label & unit colors style.lu_colors = cpair(style.theme.label, style.theme.label) + -- label & unit colors (darker if set) style.lu_colors_dark = cpair(style.theme.label_dark, style.theme.label_dark) - if fp == 1 then + style.ind_grn = cpair(util.trinary(colorblind, colors.blue, colors.green), style.ind_bkg) + style.ind_yel = cpair(colors.yellow, style.ind_bkg) + style.ind_red = cpair(colors.red, style.ind_bkg) + style.ind_wht = cpair(colors.white, style.ind_bkg) + + if fp == themes.FP_THEME.SANDSTONE then style.fp_theme = themes.sandstone - elseif fp == 2 then + elseif fp == themes.FP_THEME.BASALT then style.fp_theme = themes.basalt end @@ -159,11 +215,6 @@ style.lg_gray = cpair(colors.lightGray, colors.gray) style.lg_white = cpair(colors.lightGray, colors.white) style.gray_white = cpair(colors.gray, colors.white) -style.ind_grn = cpair(colors.green, colors.gray) -style.ind_yel = cpair(colors.yellow, colors.gray) -style.ind_red = cpair(colors.red, colors.gray) -style.ind_wht = style.wh_gray - -- UI COMPONENTS -- style.reactor = { diff --git a/graphics/themes.lua b/graphics/themes.lua index a8376b2..5de1ae3 100644 --- a/graphics/themes.lua +++ b/graphics/themes.lua @@ -121,6 +121,7 @@ themes.sandstone = { -- deuteranopia { { c = colors.green, hex = 0x1081ff }, + { c = colors.green_hc, hex = 0x1081ff }, { c = colors.green_off, hex = 0x141414 }, { c = colors.yellow, hex = 0xf7c311 }, { c = colors.yellow_off, hex = 0x141414 }, @@ -130,6 +131,7 @@ themes.sandstone = { -- protanopia { { c = colors.green, hex = 0x1081ff }, + { c = colors.green_hc, hex = 0x1081ff }, { c = colors.green_off, hex = 0x141414 }, { c = colors.yellow, hex = 0xf5e633 }, { c = colors.yellow_off, hex = 0x141414 }, @@ -139,6 +141,7 @@ themes.sandstone = { -- tritanopia { { c = colors.green, hex = 0x40cbd7 }, + { c = colors.green_hc, hex = 0x40cbd7 }, { c = colors.green_off, hex = 0x141414 }, { c = colors.yellow, hex = 0xffbc00 }, { c = colors.yellow_off, hex = 0x141414 }, From 89d56d3101d07d2f55e2e181ac991a21207459c4 Mon Sep 17 00:00:00 2001 From: Mikayla Fischler Date: Mon, 11 Mar 2024 23:54:03 -0400 Subject: [PATCH 24/44] moved main UI palettes to themes.lua and set configurators to use it --- coordinator/configure.lua | 46 ++++++------------- coordinator/ui/style.lua | 84 ++-------------------------------- graphics/themes.lua | 96 +++++++++++++++++++++++++++++++++++++++ pocket/configure.lua | 17 +------ reactor-plc/configure.lua | 46 ++++++------------- rtu/configure.lua | 46 ++++++------------- supervisor/configure.lua | 46 ++++++------------- 7 files changed, 158 insertions(+), 223 deletions(-) diff --git a/coordinator/configure.lua b/coordinator/configure.lua index 1480dd7..172f5a8 100644 --- a/coordinator/configure.lua +++ b/coordinator/configure.lua @@ -55,21 +55,7 @@ local style = {} style.root = cpair(colors.black, colors.lightGray) style.header = cpair(colors.white, colors.gray) -style.colors = { - { c = colors.red, hex = 0xdf4949 }, - { c = colors.orange, hex = 0xffb659 }, - { c = colors.yellow, hex = 0xfffc79 }, - { c = colors.lime, hex = 0x80ff80 }, - { c = colors.green, hex = 0x4aee8a }, - { c = colors.cyan, hex = 0x34bac8 }, - { c = colors.lightBlue, hex = 0x6cc0f2 }, - { c = colors.blue, hex = 0x0096ff }, - { c = colors.purple, hex = 0xb156ee }, - { c = colors.pink, hex = 0xf26ba2 }, - { c = colors.magenta, hex = 0xf9488a }, - { c = colors.lightGray, hex = 0xcacaca }, - { c = colors.gray, hex = 0x575757 } -} +style.colors = themes.smooth_stone.colors local bw_fg_bg = cpair(colors.black, colors.white) local g_lg_fg_bg = cpair(colors.gray, colors.lightGray) @@ -841,30 +827,26 @@ local function config_view(display) TextBox{parent=clr_c_2,x=1,y=1,height=6,text="By default, this project uses green/red heavily to distinguish ok and not, with some indicators also using multiple colors. By selecting a color blindness below, blues will be used instead of greens on indicators and multi-color indicators will be split up as space permits."} local function recolor(value) + local c = themes.smooth_stone.color_modes[value] + if value == 1 then for i = 1, #style.colors do term.setPaletteColor(style.colors[i].c, style.colors[i].hex) end - elseif value == themes.COLOR_MODE.DEUTERANOPIA then - term.setPaletteColor(colors.green, 0x1081ff) - term.setPaletteColor(colors.yellow, 0xf7c311) - term.setPaletteColor(colors.red, 0xfb5615) - elseif value == themes.COLOR_MODE.PROTANOPIA then - term.setPaletteColor(colors.green, 0x1081ff) - term.setPaletteColor(colors.yellow, 0xf5e633) - term.setPaletteColor(colors.red, 0xff521a) - elseif value == themes.COLOR_MODE.TRITANOPIA then - term.setPaletteColor(colors.green, 0x00ecff) - term.setPaletteColor(colors.yellow, 0xffbc00) - term.setPaletteColor(colors.red, 0xff0000) + else + term.setPaletteColor(colors.green, c[1].hex) + term.setPaletteColor(colors.yellow, c[2].hex) + term.setPaletteColor(colors.red, c[3].hex) end end - local c_mode = RadioButton{parent=clr_c_2,x=1,y=8,default=ini_cfg.ColorMode,options=themes.COLOR_MODE_NAMES,callback=recolor,radio_colors=cpair(colors.lightGray,colors.black),select_color=colors.magenta} + TextBox{parent=clr_c_2,x=1,y=8,height=1,text="Color Mode"} + local c_mode = RadioButton{parent=clr_c_2,x=1,y=9,default=ini_cfg.ColorMode,options=themes.COLOR_MODE_NAMES,callback=recolor,radio_colors=cpair(colors.lightGray,colors.black),select_color=colors.magenta} - local _ = IndLight{parent=clr_c_2,x=20,y=8,label="Good",colors=cpair(colors.black,colors.green),value=true} - _ = IndLight{parent=clr_c_2,x=20,y=9,label="Warning",colors=cpair(colors.black,colors.yellow),value=true} - _ = IndLight{parent=clr_c_2,x=20,y=10,label="Bad",colors=cpair(colors.black,colors.red),value=true} + TextBox{parent=clr_c_2,x=20,y=8,height=1,text="Preview"} + local _ = IndLight{parent=clr_c_2,x=20,y=9,label="Good",colors=cpair(colors.black,colors.green),value=true} + _ = IndLight{parent=clr_c_2,x=20,y=10,label="Warning",colors=cpair(colors.black,colors.yellow),value=true} + _ = IndLight{parent=clr_c_2,x=20,y=11,label="Bad",colors=cpair(colors.black,colors.red),value=true} - TextBox{parent=clr_c_2,x=20,y=12,height=6,text="Exact color varies by theme.",fg_bg=g_lg_fg_bg} + TextBox{parent=clr_c_2,x=1,y=14,height=6,text="Note: exact color varies by theme.",fg_bg=g_lg_fg_bg} PushButton{parent=clr_c_2,x=44,y=14,min_width=6,text="Done",callback=function()clr_pane.set_value(1)end,fg_bg=nav_fg_bg,active_fg_bg=btn_act_fg_bg} diff --git a/coordinator/ui/style.lua b/coordinator/ui/style.lua index 6c91b2c..920adfe 100644 --- a/coordinator/ui/style.lua +++ b/coordinator/ui/style.lua @@ -45,48 +45,10 @@ local smooth_stone = { highlight_box_bright = cpair(colors.black, colors.white), field_box = cpair(colors.black, colors.white), - colors = { - { c = colors.red, hex = 0xdf4949 }, - { c = colors.orange, hex = 0xffb659 }, - { c = colors.yellow, hex = 0xfffc79 }, - { c = colors.lime, hex = 0x80ff80 }, - { c = colors.green, hex = 0x4aee8a }, - { c = colors.cyan, hex = 0x34bac8 }, - { c = colors.lightBlue, hex = 0x6cc0f2 }, - { c = colors.blue, hex = 0x0096ff }, - { c = colors.purple, hex = 0xb156ee }, - { c = colors.pink, hex = 0xf26ba2 }, - { c = colors.magenta, hex = 0xf9488a }, - { c = colors.white, hex = 0xf0f0f0 }, - { c = colors.lightGray, hex = 0xcacaca }, - { c = colors.gray, hex = 0x575757 }, - { c = colors.black, hex = 0x191919 }, - { c = colors.brown, hex = 0x7f664c } - }, + colors = themes.smooth_stone.colors, -- color re-mappings for assistive modes - color_modes = { - -- standard - {}, - -- deuteranopia - { - { c = colors.blue, hex = 0x1081ff }, - { c = colors.yellow, hex = 0xf7c311 }, - { c = colors.red, hex = 0xfb5615 }, - }, - -- protanopia - { - { c = colors.blue, hex = 0x1081ff }, - { c = colors.yellow, hex = 0xf5e633 }, - { c = colors.red, hex = 0xff521a }, - }, - -- tritanopia - { - { c = colors.blue, hex = 0x40cbd7 }, - { c = colors.yellow, hex = 0xffbc00 }, - { c = colors.red, hex = 0xff0000 }, - } - } + color_modes = themes.smooth_stone.color_modes } ---@type theme @@ -113,48 +75,10 @@ local deepslate = { highlight_box_bright = cpair(colors.black, colors.lightGray), field_box = cpair(colors.white, colors.gray), - colors = { - { c = colors.red, hex = 0xeb6a6c }, - { c = colors.orange, hex = 0xf2b86c }, - { c = colors.yellow, hex = 0xd9cf81 }, - { c = colors.lime, hex = 0x80ff80 }, - { c = colors.green, hex = 0x70e19b }, - { c = colors.cyan, hex = 0x7ccdd0 }, - { c = colors.lightBlue, hex = 0x99ceef }, - { c = colors.blue, hex = 0x60bcff }, - { c = colors.purple, hex = 0xc38aea }, - { c = colors.pink, hex = 0xff7fb8 }, - { c = colors.magenta, hex = 0xf980dd }, - { c = colors.white, hex = 0xd9d9d9 }, - { c = colors.lightGray, hex = 0x949494 }, - { c = colors.gray, hex = 0x575757 }, - { c = colors.black, hex = 0x262626 }, - { c = colors.brown, hex = 0xb18f6a } - }, + colors = themes.deepslate.colors, -- color re-mappings for assistive modes - color_modes = { - -- standard - {}, - -- deuteranopia - { - { c = colors.blue, hex = 0x65aeff }, - { c = colors.yellow, hex = 0xf7c311 }, - { c = colors.red, hex = 0xfb5615 }, - }, - -- protanopia - { - { c = colors.blue, hex = 0x65aeff }, - { c = colors.yellow, hex = 0xf5e633 }, - { c = colors.red, hex = 0xff8058 }, - }, - -- tritanopia - { - { c = colors.blue, hex = 0x00ecff }, - { c = colors.yellow, hex = 0xffbc00 }, - { c = colors.red, hex = 0xdf4949 }, - } - } + color_modes = themes.deepslate.color_modes } style.theme = smooth_stone diff --git a/graphics/themes.lua b/graphics/themes.lua index 5de1ae3..c0d02ed 100644 --- a/graphics/themes.lua +++ b/graphics/themes.lua @@ -241,4 +241,100 @@ end --#endregion +--#region Main UI Color Palettes + +---@class ui_palette +themes.smooth_stone = { + colors = { + { c = colors.red, hex = 0xdf4949 }, + { c = colors.orange, hex = 0xffb659 }, + { c = colors.yellow, hex = 0xfffc79 }, + { c = colors.lime, hex = 0x80ff80 }, + { c = colors.green, hex = 0x4aee8a }, + { c = colors.cyan, hex = 0x34bac8 }, + { c = colors.lightBlue, hex = 0x6cc0f2 }, + { c = colors.blue, hex = 0x0096ff }, + { c = colors.purple, hex = 0xb156ee }, + { c = colors.pink, hex = 0xf26ba2 }, + { c = colors.magenta, hex = 0xf9488a }, + { c = colors.white, hex = 0xf0f0f0 }, + { c = colors.lightGray, hex = 0xcacaca }, + { c = colors.gray, hex = 0x575757 }, + { c = colors.black, hex = 0x191919 }, + { c = colors.brown, hex = 0x7f664c } + }, + + -- color re-mappings for assistive modes + color_modes = { + -- standard + {}, + -- deuteranopia + { + { c = colors.blue, hex = 0x1081ff }, + { c = colors.yellow, hex = 0xf7c311 }, + { c = colors.red, hex = 0xfb5615 }, + }, + -- protanopia + { + { c = colors.blue, hex = 0x1081ff }, + { c = colors.yellow, hex = 0xf5e633 }, + { c = colors.red, hex = 0xff521a }, + }, + -- tritanopia + { + { c = colors.blue, hex = 0x40cbd7 }, + { c = colors.yellow, hex = 0xffbc00 }, + { c = colors.red, hex = 0xff0000 }, + } + } +} + +---@class ui_palette +themes.deepslate = { + colors = { + { c = colors.red, hex = 0xeb6a6c }, + { c = colors.orange, hex = 0xf2b86c }, + { c = colors.yellow, hex = 0xd9cf81 }, + { c = colors.lime, hex = 0x80ff80 }, + { c = colors.green, hex = 0x70e19b }, + { c = colors.cyan, hex = 0x7ccdd0 }, + { c = colors.lightBlue, hex = 0x99ceef }, + { c = colors.blue, hex = 0x60bcff }, + { c = colors.purple, hex = 0xc38aea }, + { c = colors.pink, hex = 0xff7fb8 }, + { c = colors.magenta, hex = 0xf980dd }, + { c = colors.white, hex = 0xd9d9d9 }, + { c = colors.lightGray, hex = 0x949494 }, + { c = colors.gray, hex = 0x575757 }, + { c = colors.black, hex = 0x262626 }, + { c = colors.brown, hex = 0xb18f6a } + }, + + -- color re-mappings for assistive modes + color_modes = { + -- standard + {}, + -- deuteranopia + { + { c = colors.blue, hex = 0x65aeff }, + { c = colors.yellow, hex = 0xf7c311 }, + { c = colors.red, hex = 0xfb5615 }, + }, + -- protanopia + { + { c = colors.blue, hex = 0x65aeff }, + { c = colors.yellow, hex = 0xf5e633 }, + { c = colors.red, hex = 0xff8058 }, + }, + -- tritanopia + { + { c = colors.blue, hex = 0x00ecff }, + { c = colors.yellow, hex = 0xffbc00 }, + { c = colors.red, hex = 0xdf4949 }, + } + } +} + +--#endregion + return themes diff --git a/pocket/configure.lua b/pocket/configure.lua index 908ea4c..80f91bc 100644 --- a/pocket/configure.lua +++ b/pocket/configure.lua @@ -7,6 +7,7 @@ local tcd = require("scada-common.tcd") local util = require("scada-common.util") local core = require("graphics.core") +local themes = require("graphics.themes") local DisplayBox = require("graphics.elements.displaybox") local Div = require("graphics.elements.div") @@ -41,21 +42,7 @@ local style = {} style.root = cpair(colors.black, colors.lightGray) style.header = cpair(colors.white, colors.gray) -style.colors = { - { c = colors.red, hex = 0xdf4949 }, - { c = colors.orange, hex = 0xffb659 }, - { c = colors.yellow, hex = 0xfffc79 }, - { c = colors.lime, hex = 0x80ff80 }, - { c = colors.green, hex = 0x4aee8a }, - { c = colors.cyan, hex = 0x34bac8 }, - { c = colors.lightBlue, hex = 0x6cc0f2 }, - { c = colors.blue, hex = 0x0096ff }, - { c = colors.purple, hex = 0xb156ee }, - { c = colors.pink, hex = 0xf26ba2 }, - { c = colors.magenta, hex = 0xf9488a }, - { c = colors.lightGray, hex = 0xcacaca }, - { c = colors.gray, hex = 0x575757 } -} +style.colors = themes.smooth_stone.colors local bw_fg_bg = cpair(colors.black, colors.white) local g_lg_fg_bg = cpair(colors.gray, colors.lightGray) diff --git a/reactor-plc/configure.lua b/reactor-plc/configure.lua index e67c697..ba3f380 100644 --- a/reactor-plc/configure.lua +++ b/reactor-plc/configure.lua @@ -50,21 +50,7 @@ local style = {} style.root = cpair(colors.black, colors.lightGray) style.header = cpair(colors.white, colors.gray) -style.colors = { - { c = colors.red, hex = 0xdf4949 }, - { c = colors.orange, hex = 0xffb659 }, - { c = colors.yellow, hex = 0xfffc79 }, - { c = colors.lime, hex = 0x80ff80 }, - { c = colors.green, hex = 0x4aee8a }, - { c = colors.cyan, hex = 0x34bac8 }, - { c = colors.lightBlue, hex = 0x6cc0f2 }, - { c = colors.blue, hex = 0x0096ff }, - { c = colors.purple, hex = 0xb156ee }, - { c = colors.pink, hex = 0xf26ba2 }, - { c = colors.magenta, hex = 0xf9488a }, - { c = colors.lightGray, hex = 0xcacaca }, - { c = colors.gray, hex = 0x575757 } -} +style.colors = themes.smooth_stone.colors local bw_fg_bg = cpair(colors.black, colors.white) local g_lg_fg_bg = cpair(colors.gray, colors.lightGray) @@ -479,30 +465,26 @@ local function config_view(display) TextBox{parent=clr_c_2,x=1,y=1,height=6,text="By default, this project uses green/red heavily to distinguish ok and not, with some indicators also using multiple colors. By selecting a color blindness below, blues will be used instead of greens on indicators and multi-color indicators will be split up as space permits."} local function recolor(value) + local c = themes.smooth_stone.color_modes[value] + if value == 1 then for i = 1, #style.colors do term.setPaletteColor(style.colors[i].c, style.colors[i].hex) end - elseif value == themes.COLOR_MODE.DEUTERANOPIA then - term.setPaletteColor(colors.green, 0x1081ff) - term.setPaletteColor(colors.yellow, 0xf7c311) - term.setPaletteColor(colors.red, 0xfb5615) - elseif value == themes.COLOR_MODE.PROTANOPIA then - term.setPaletteColor(colors.green, 0x1081ff) - term.setPaletteColor(colors.yellow, 0xf5e633) - term.setPaletteColor(colors.red, 0xff521a) - elseif value == themes.COLOR_MODE.TRITANOPIA then - term.setPaletteColor(colors.green, 0x00ecff) - term.setPaletteColor(colors.yellow, 0xffbc00) - term.setPaletteColor(colors.red, 0xff0000) + else + term.setPaletteColor(colors.green, c[1].hex) + term.setPaletteColor(colors.yellow, c[2].hex) + term.setPaletteColor(colors.red, c[3].hex) end end - local c_mode = RadioButton{parent=clr_c_2,x=1,y=8,default=ini_cfg.ColorMode,options=themes.COLOR_MODE_NAMES,callback=recolor,radio_colors=cpair(colors.lightGray,colors.black),select_color=colors.magenta} + TextBox{parent=clr_c_2,x=1,y=8,height=1,text="Color Mode"} + local c_mode = RadioButton{parent=clr_c_2,x=1,y=9,default=ini_cfg.ColorMode,options=themes.COLOR_MODE_NAMES,callback=recolor,radio_colors=cpair(colors.lightGray,colors.black),select_color=colors.magenta} - local _ = IndLight{parent=clr_c_2,x=20,y=8,label="Good",colors=cpair(colors.black,colors.green),value=true} - _ = IndLight{parent=clr_c_2,x=20,y=9,label="Warning",colors=cpair(colors.black,colors.yellow),value=true} - _ = IndLight{parent=clr_c_2,x=20,y=10,label="Bad",colors=cpair(colors.black,colors.red),value=true} + TextBox{parent=clr_c_2,x=20,y=8,height=1,text="Preview"} + local _ = IndLight{parent=clr_c_2,x=20,y=9,label="Good",colors=cpair(colors.black,colors.green),value=true} + _ = IndLight{parent=clr_c_2,x=20,y=10,label="Warning",colors=cpair(colors.black,colors.yellow),value=true} + _ = IndLight{parent=clr_c_2,x=20,y=11,label="Bad",colors=cpair(colors.black,colors.red),value=true} - TextBox{parent=clr_c_2,x=20,y=12,height=6,text="Exact color varies by theme.",fg_bg=g_lg_fg_bg} + TextBox{parent=clr_c_2,x=1,y=14,height=6,text="Note: exact color varies by theme.",fg_bg=g_lg_fg_bg} PushButton{parent=clr_c_2,x=44,y=14,min_width=6,text="Done",callback=function()clr_pane.set_value(1)end,fg_bg=nav_fg_bg,active_fg_bg=btn_act_fg_bg} diff --git a/rtu/configure.lua b/rtu/configure.lua index b7746bc..50bc572 100644 --- a/rtu/configure.lua +++ b/rtu/configure.lua @@ -102,21 +102,7 @@ local style = {} style.root = cpair(colors.black, colors.lightGray) style.header = cpair(colors.white, colors.gray) -style.colors = { - { c = colors.red, hex = 0xdf4949 }, - { c = colors.orange, hex = 0xffb659 }, - { c = colors.yellow, hex = 0xfffc79 }, - { c = colors.lime, hex = 0x80ff80 }, - { c = colors.green, hex = 0x4aee8a }, - { c = colors.cyan, hex = 0x34bac8 }, - { c = colors.lightBlue, hex = 0x6cc0f2 }, - { c = colors.blue, hex = 0x0096ff }, - { c = colors.purple, hex = 0xb156ee }, - { c = colors.pink, hex = 0xf26ba2 }, - { c = colors.magenta, hex = 0xf9488a }, - { c = colors.lightGray, hex = 0xcacaca }, - { c = colors.gray, hex = 0x575757 } -} +style.colors = themes.smooth_stone.colors local bw_fg_bg = cpair(colors.black, colors.white) local g_lg_fg_bg = cpair(colors.gray, colors.lightGray) @@ -534,30 +520,26 @@ local function config_view(display) TextBox{parent=clr_c_2,x=1,y=1,height=6,text="By default, this project uses green/red heavily to distinguish ok and not, with some indicators also using multiple colors. By selecting a color blindness below, blues will be used instead of greens on indicators and multi-color indicators will be split up as space permits."} local function recolor(value) + local c = themes.smooth_stone.color_modes[value] + if value == 1 then for i = 1, #style.colors do term.setPaletteColor(style.colors[i].c, style.colors[i].hex) end - elseif value == themes.COLOR_MODE.DEUTERANOPIA then - term.setPaletteColor(colors.green, 0x1081ff) - term.setPaletteColor(colors.yellow, 0xf7c311) - term.setPaletteColor(colors.red, 0xfb5615) - elseif value == themes.COLOR_MODE.PROTANOPIA then - term.setPaletteColor(colors.green, 0x1081ff) - term.setPaletteColor(colors.yellow, 0xf5e633) - term.setPaletteColor(colors.red, 0xff521a) - elseif value == themes.COLOR_MODE.TRITANOPIA then - term.setPaletteColor(colors.green, 0x00ecff) - term.setPaletteColor(colors.yellow, 0xffbc00) - term.setPaletteColor(colors.red, 0xff0000) + else + term.setPaletteColor(colors.green, c[1].hex) + term.setPaletteColor(colors.yellow, c[2].hex) + term.setPaletteColor(colors.red, c[3].hex) end end - local c_mode = RadioButton{parent=clr_c_2,x=1,y=8,default=ini_cfg.ColorMode,options=themes.COLOR_MODE_NAMES,callback=recolor,radio_colors=cpair(colors.lightGray,colors.black),select_color=colors.magenta} + TextBox{parent=clr_c_2,x=1,y=8,height=1,text="Color Mode"} + local c_mode = RadioButton{parent=clr_c_2,x=1,y=9,default=ini_cfg.ColorMode,options=themes.COLOR_MODE_NAMES,callback=recolor,radio_colors=cpair(colors.lightGray,colors.black),select_color=colors.magenta} - local _ = IndLight{parent=clr_c_2,x=20,y=8,label="Good",colors=cpair(colors.black,colors.green),value=true} - _ = IndLight{parent=clr_c_2,x=20,y=9,label="Warning",colors=cpair(colors.black,colors.yellow),value=true} - _ = IndLight{parent=clr_c_2,x=20,y=10,label="Bad",colors=cpair(colors.black,colors.red),value=true} + TextBox{parent=clr_c_2,x=20,y=8,height=1,text="Preview"} + local _ = IndLight{parent=clr_c_2,x=20,y=9,label="Good",colors=cpair(colors.black,colors.green),value=true} + _ = IndLight{parent=clr_c_2,x=20,y=10,label="Warning",colors=cpair(colors.black,colors.yellow),value=true} + _ = IndLight{parent=clr_c_2,x=20,y=11,label="Bad",colors=cpair(colors.black,colors.red),value=true} - TextBox{parent=clr_c_2,x=20,y=12,height=6,text="Exact color varies by theme.",fg_bg=g_lg_fg_bg} + TextBox{parent=clr_c_2,x=1,y=14,height=6,text="Note: exact color varies by theme.",fg_bg=g_lg_fg_bg} PushButton{parent=clr_c_2,x=44,y=14,min_width=6,text="Done",callback=function()clr_pane.set_value(1)end,fg_bg=nav_fg_bg,active_fg_bg=btn_act_fg_bg} diff --git a/supervisor/configure.lua b/supervisor/configure.lua index 53c3eb0..f5f41c4 100644 --- a/supervisor/configure.lua +++ b/supervisor/configure.lua @@ -47,21 +47,7 @@ local style = {} style.root = cpair(colors.black, colors.lightGray) style.header = cpair(colors.white, colors.gray) -style.colors = { - { c = colors.red, hex = 0xdf4949 }, - { c = colors.orange, hex = 0xffb659 }, - { c = colors.yellow, hex = 0xfffc79 }, - { c = colors.lime, hex = 0x80ff80 }, - { c = colors.green, hex = 0x4aee8a }, - { c = colors.cyan, hex = 0x34bac8 }, - { c = colors.lightBlue, hex = 0x6cc0f2 }, - { c = colors.blue, hex = 0x0096ff }, - { c = colors.purple, hex = 0xb156ee }, - { c = colors.pink, hex = 0xf26ba2 }, - { c = colors.magenta, hex = 0xf9488a }, - { c = colors.lightGray, hex = 0xcacaca }, - { c = colors.gray, hex = 0x575757 } -} +style.colors = themes.smooth_stone.colors local bw_fg_bg = cpair(colors.black, colors.white) local g_lg_fg_bg = cpair(colors.gray, colors.lightGray) @@ -778,30 +764,26 @@ local function config_view(display) TextBox{parent=clr_c_2,x=1,y=1,height=6,text="By default, this project uses green/red heavily to distinguish ok and not, with some indicators also using multiple colors. By selecting a color blindness below, blues will be used instead of greens on indicators and multi-color indicators will be split up as space permits."} local function recolor(value) + local c = themes.smooth_stone.color_modes[value] + if value == 1 then for i = 1, #style.colors do term.setPaletteColor(style.colors[i].c, style.colors[i].hex) end - elseif value == themes.COLOR_MODE.DEUTERANOPIA then - term.setPaletteColor(colors.green, 0x1081ff) - term.setPaletteColor(colors.yellow, 0xf7c311) - term.setPaletteColor(colors.red, 0xfb5615) - elseif value == themes.COLOR_MODE.PROTANOPIA then - term.setPaletteColor(colors.green, 0x1081ff) - term.setPaletteColor(colors.yellow, 0xf5e633) - term.setPaletteColor(colors.red, 0xff521a) - elseif value == themes.COLOR_MODE.TRITANOPIA then - term.setPaletteColor(colors.green, 0x00ecff) - term.setPaletteColor(colors.yellow, 0xffbc00) - term.setPaletteColor(colors.red, 0xff0000) + else + term.setPaletteColor(colors.green, c[1].hex) + term.setPaletteColor(colors.yellow, c[2].hex) + term.setPaletteColor(colors.red, c[3].hex) end end - local c_mode = RadioButton{parent=clr_c_2,x=1,y=8,default=ini_cfg.ColorMode,options=themes.COLOR_MODE_NAMES,callback=recolor,radio_colors=cpair(colors.lightGray,colors.black),select_color=colors.magenta} + TextBox{parent=clr_c_2,x=1,y=8,height=1,text="Color Mode"} + local c_mode = RadioButton{parent=clr_c_2,x=1,y=9,default=ini_cfg.ColorMode,options=themes.COLOR_MODE_NAMES,callback=recolor,radio_colors=cpair(colors.lightGray,colors.black),select_color=colors.magenta} - local _ = IndLight{parent=clr_c_2,x=20,y=8,label="Good",colors=cpair(colors.black,colors.green),value=true} - _ = IndLight{parent=clr_c_2,x=20,y=9,label="Warning",colors=cpair(colors.black,colors.yellow),value=true} - _ = IndLight{parent=clr_c_2,x=20,y=10,label="Bad",colors=cpair(colors.black,colors.red),value=true} + TextBox{parent=clr_c_2,x=20,y=8,height=1,text="Preview"} + local _ = IndLight{parent=clr_c_2,x=20,y=9,label="Good",colors=cpair(colors.black,colors.green),value=true} + _ = IndLight{parent=clr_c_2,x=20,y=10,label="Warning",colors=cpair(colors.black,colors.yellow),value=true} + _ = IndLight{parent=clr_c_2,x=20,y=11,label="Bad",colors=cpair(colors.black,colors.red),value=true} - TextBox{parent=clr_c_2,x=20,y=12,height=6,text="Exact color varies by theme.",fg_bg=g_lg_fg_bg} + TextBox{parent=clr_c_2,x=1,y=14,height=6,text="Note: exact color varies by theme.",fg_bg=g_lg_fg_bg} PushButton{parent=clr_c_2,x=44,y=14,min_width=6,text="Done",callback=function()clr_pane.set_value(1)end,fg_bg=nav_fg_bg,active_fg_bg=btn_act_fg_bg} From 8dae632b251aada18e39d0eb345fa15a125c0bbc Mon Sep 17 00:00:00 2001 From: Mikayla Date: Tue, 12 Mar 2024 16:24:32 +0000 Subject: [PATCH 25/44] simplified checks for colorblind mode --- coordinator/renderer.lua | 5 ++--- coordinator/ui/layout/front_panel.lua | 6 ++---- coordinator/ui/style.lua | 13 ++++++++----- reactor-plc/panel/front_panel.lua | 5 ++--- reactor-plc/panel/style.lua | 12 ++++++++---- reactor-plc/renderer.lua | 4 ++-- rtu/panel/front_panel.lua | 5 ++--- rtu/panel/style.lua | 12 ++++++++---- rtu/renderer.lua | 4 ++-- supervisor/panel/style.lua | 11 +++++++---- 10 files changed, 43 insertions(+), 34 deletions(-) diff --git a/coordinator/renderer.lua b/coordinator/renderer.lua index ad275dc..d9e4b58 100644 --- a/coordinator/renderer.lua +++ b/coordinator/renderer.lua @@ -16,7 +16,6 @@ local unit_view = require("coordinator.ui.layout.unit_view") local core = require("graphics.core") local flasher = require("graphics.flasher") -local themes = require("graphics.themes") local DisplayBox = require("graphics.elements.displaybox") @@ -73,7 +72,7 @@ end -- apply renderer configurations ---@param config crd_config function renderer.configure(config) - style.set_themes(config.MainTheme, config.FrontPanelTheme, config.ColorMode ~= themes.COLOR_MODE.STANDARD) + style.set_themes(config.MainTheme, config.FrontPanelTheme, config.ColorMode) engine.color_mode = config.ColorMode engine.disable_flow_view = config.DisableFlowView @@ -135,7 +134,7 @@ function renderer.try_start_fp() -- show front panel view on terminal status, msg = pcall(function () engine.ui.front_panel = DisplayBox{window=term.native(),fg_bg=style.fp.root} - panel_view(engine.ui.front_panel, #engine.monitors.unit_displays, engine.color_mode) + panel_view(engine.ui.front_panel, #engine.monitors.unit_displays) end) if status then diff --git a/coordinator/ui/layout/front_panel.lua b/coordinator/ui/layout/front_panel.lua index 459a9f0..3e400d9 100644 --- a/coordinator/ui/layout/front_panel.lua +++ b/coordinator/ui/layout/front_panel.lua @@ -13,7 +13,6 @@ local style = require("coordinator.ui.style") local pkt_entry = require("coordinator.ui.components.pkt_entry") local core = require("graphics.core") -local themes = require("graphics.themes") local Div = require("graphics.elements.div") local ListBox = require("graphics.elements.listbox") @@ -36,8 +35,7 @@ local led_grn = style.led_grn -- create new front panel view ---@param panel graphics_element main displaybox ---@param num_units integer number of units (number of unit monitors) ----@param color_mode COLOR_MODE color mode -local function init(panel, num_units, color_mode) +local function init(panel, num_units) local ps = iocontrol.get_db().fp.ps TextBox{parent=panel,y=1,text="SCADA COORDINATOR",alignment=ALIGN.CENTER,height=1,fg_bg=style.fp_theme.header} @@ -61,7 +59,7 @@ local function init(panel, num_units, color_mode) local modem = LED{parent=system,label="MODEM",colors=led_grn} - if color_mode == themes.COLOR_MODE.STANDARD then + if not style.colorblind then local network = RGBLED{parent=system,label="NETWORK",colors={colors.green,colors.red,colors.orange,colors.yellow,colors.gray}} network.update(types.PANEL_LINK_STATE.DISCONNECTED) network.register(ps, "link_state", network.update) diff --git a/coordinator/ui/style.lua b/coordinator/ui/style.lua index 920adfe..13379b7 100644 --- a/coordinator/ui/style.lua +++ b/coordinator/ui/style.lua @@ -84,12 +84,13 @@ local deepslate = { style.theme = smooth_stone -- set themes per configurations ----@param main integer main theme ID (1 = smooth_stone, 2 = deepslate) ----@param fp integer fp theme ID (1 = sandstone, 2 = basalt) ----@param colorblind boolean true if in a colorblind mode -function style.set_themes(main, fp, colorblind) - style.ind_bkg = colors.gray +---@param main UI_THEME main UI theme +---@param fp FP_THEME front panel theme +---@param color_mode COLOR_MODE the color mode to use +function style.set_themes(main, fp, color_mode) + local colorblind = color_mode ~= themes.COLOR_MODE.STANDARD + style.ind_bkg = colors.gray style.ind_hi_box_bg = util.trinary(colorblind, colors.black, colors.gray) if main == themes.UI_THEME.SMOOTH_STONE then @@ -100,6 +101,8 @@ function style.set_themes(main, fp, colorblind) style.ind_hi_box_bg = util.trinary(colorblind, colors.black, colors.lightGray) end + style.colorblind = colorblind + style.root = cpair(style.theme.text, style.theme.bg) style.label = cpair(style.theme.label, style.theme.bg) diff --git a/reactor-plc/panel/front_panel.lua b/reactor-plc/panel/front_panel.lua index 5797c2b..c4ec184 100644 --- a/reactor-plc/panel/front_panel.lua +++ b/reactor-plc/panel/front_panel.lua @@ -36,8 +36,7 @@ local ind_red = style.ind_red -- create new front panel view ---@param panel graphics_element main displaybox ----@param color_mode COLOR_MODE color mode -local function init(panel, color_mode) +local function init(panel) local s_hi_box = style.theme.highlight_box local disabled_fg = style.fp.disabled_fg @@ -61,7 +60,7 @@ local function init(panel, color_mode) local reactor = LEDPair{parent=system,label="REACTOR",off=colors.red,c1=colors.yellow,c2=colors.green} local modem = LED{parent=system,label="MODEM",colors=ind_grn} - if color_mode == themes.COLOR_MODE.STANDARD then + if not style.colorblind then local network = RGBLED{parent=system,label="NETWORK",colors={colors.green,colors.red,colors.orange,colors.yellow,colors.gray}} network.update(types.PANEL_LINK_STATE.DISCONNECTED) network.register(databus.ps, "link_state", network.update) diff --git a/reactor-plc/panel/style.lua b/reactor-plc/panel/style.lua index 5aca524..08c1192 100644 --- a/reactor-plc/panel/style.lua +++ b/reactor-plc/panel/style.lua @@ -12,20 +12,24 @@ local cpair = core.cpair style.theme = themes.sandstone style.fp = themes.get_fp_style(style.theme) +style.colorblind = false style.ind_grn = cpair(colors.green, colors.green_off) style.ind_red = cpair(colors.red, colors.red_off) -- set theme per configuration ----@param fp integer fp theme ID (1 = sandstone, 2 = basalt) -function style.set_theme(fp) - if fp == 1 then +---@param fp FP_THEME front panel theme +---@param color_mode COLOR_MODE the color mode to use +function style.set_theme(fp, color_mode) + if fp == themes.FP_THEME.SANDSTONE then style.theme = themes.sandstone - elseif fp == 2 then + elseif fp == themes.FP_THEME.BASALT then style.theme = themes.basalt end style.fp = themes.get_fp_style(style.theme) + + style.colorblind = color_mode ~= themes.COLOR_MODE.STANDARD end return style diff --git a/reactor-plc/renderer.lua b/reactor-plc/renderer.lua index 8748cae..aa62e63 100644 --- a/reactor-plc/renderer.lua +++ b/reactor-plc/renderer.lua @@ -26,7 +26,7 @@ function renderer.try_start_ui(theme, color_mode) if ui.display == nil then -- set theme - style.set_theme(theme) + style.set_theme(theme, color_mode) -- reset terminal term.setTextColor(colors.white) @@ -48,7 +48,7 @@ function renderer.try_start_ui(theme, color_mode) -- init front panel view status, msg = pcall(function () ui.display = DisplayBox{window=term.current(),fg_bg=style.fp.root} - panel_view(ui.display, color_mode) + panel_view(ui.display) end) if status then diff --git a/rtu/panel/front_panel.lua b/rtu/panel/front_panel.lua index 36e72f4..a3e6169 100644 --- a/rtu/panel/front_panel.lua +++ b/rtu/panel/front_panel.lua @@ -32,8 +32,7 @@ local UNIT_TYPE_LABELS = { "UNKNOWN", "REDSTONE", "BOILER", "TURBINE", "DYNAMIC -- create new front panel view ---@param panel graphics_element main displaybox ---@param units table unit list ----@param color_mode COLOR_MODE color mode -local function init(panel, units, color_mode) +local function init(panel, units) local disabled_fg = style.fp.disabled_fg TextBox{parent=panel,y=1,text="RTU GATEWAY",alignment=ALIGN.CENTER,height=1,fg_bg=style.theme.header} @@ -53,7 +52,7 @@ local function init(panel, units, color_mode) local modem = LED{parent=system,label="MODEM",colors=ind_grn} - if color_mode == themes.COLOR_MODE.STANDARD then + if not style.colorblind then local network = RGBLED{parent=system,label="NETWORK",colors={colors.green,colors.red,colors.orange,colors.yellow,colors.gray}} network.update(types.PANEL_LINK_STATE.DISCONNECTED) network.register(databus.ps, "link_state", network.update) diff --git a/rtu/panel/style.lua b/rtu/panel/style.lua index 36fd542..a72df2a 100644 --- a/rtu/panel/style.lua +++ b/rtu/panel/style.lua @@ -12,19 +12,23 @@ local cpair = core.cpair style.theme = themes.sandstone style.fp = themes.get_fp_style(style.theme) +style.colorblind = false style.ind_grn = cpair(colors.green, colors.green_off) -- set theme per configuration ----@param fp integer fp theme ID (1 = sandstone, 2 = basalt) -function style.set_theme(fp) - if fp == 1 then +---@param fp FP_THEME front panel theme +---@param color_mode COLOR_MODE the color mode to use +function style.set_theme(fp, color_mode) + if fp == themes.FP_THEME.SANDSTONE then style.theme = themes.sandstone - elseif fp == 2 then + elseif fp == themes.FP_THEME.BASALT then style.theme = themes.basalt end style.fp = themes.get_fp_style(style.theme) + + style.colorblind = color_mode ~= themes.COLOR_MODE.STANDARD end return style diff --git a/rtu/renderer.lua b/rtu/renderer.lua index 8d56a40..bdbc25b 100644 --- a/rtu/renderer.lua +++ b/rtu/renderer.lua @@ -27,7 +27,7 @@ function renderer.try_start_ui(units, theme, color_mode) if ui.display == nil then -- set theme - style.set_theme(theme) + style.set_theme(theme, color_mode) -- reset terminal term.setTextColor(colors.white) @@ -49,7 +49,7 @@ function renderer.try_start_ui(units, theme, color_mode) -- init front panel view status, msg = pcall(function () ui.display = DisplayBox{window=term.current(),fg_bg=style.fp.root} - panel_view(ui.display, units, color_mode) + panel_view(ui.display, units) end) if status then diff --git a/supervisor/panel/style.lua b/supervisor/panel/style.lua index efcc9b7..4fe9cb4 100644 --- a/supervisor/panel/style.lua +++ b/supervisor/panel/style.lua @@ -12,19 +12,22 @@ local cpair = core.cpair style.theme = themes.sandstone style.fp = themes.get_fp_style(style.theme) +style.colorblind = false style.ind_grn = cpair(colors.green, colors.green_off) -- set theme per configuration ----@param fp integer fp theme ID (1 = sandstone, 2 = basalt) -function style.set_theme(fp) - if fp == 1 then +---@param fp FP_THEME front panel theme +function style.set_theme(fp, color_mode) + if fp == themes.FP_THEME.SANDSTONE then style.theme = themes.sandstone - elseif fp == 2 then + elseif fp == themes.FP_THEME.BASALT then style.theme = themes.basalt end style.fp = themes.get_fp_style(style.theme) + + style.colorblind = color_mode ~= themes.COLOR_MODE.STANDARD end return style From bd88244681276892ed4161a7028ed219d4f41a7c Mon Sep 17 00:00:00 2001 From: Mikayla Fischler Date: Tue, 12 Mar 2024 12:45:47 -0400 Subject: [PATCH 26/44] #439 remind user to configure peripherals and redstone, and provide buttons to do so --- rtu/configure.lua | 13 +++++++++++++ rtu/startup.lua | 2 +- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/rtu/configure.lua b/rtu/configure.lua index acc419f..1ec2aec 100644 --- a/rtu/configure.lua +++ b/rtu/configure.lua @@ -710,7 +710,20 @@ local function config_view(display) PushButton{parent=sum_c_3,x=1,y=14,text="\x1b Back",callback=function()sum_pane.set_value(2)end,fg_bg=nav_fg_bg,active_fg_bg=btn_act_fg_bg} PushButton{parent=sum_c_3,x=43,y=14,min_width=7,text="Apply",callback=save_and_continue,fg_bg=cpair(colors.black,colors.green),active_fg_bg=btn_act_fg_bg} + local function jump_peri_conns() + tool_ctl.go_home() + show_peri_conns() + end + + local function jump_rs_conns() + tool_ctl.go_home() + show_rs_conns() + end + TextBox{parent=sum_c_4,x=1,y=1,height=1,text="Settings saved!"} + TextBox{parent=sum_c_4,x=1,y=3,height=4,text="Remember to configure any peripherals or redstone that you have connected to this RTU gateway if you have not already done so, or if you have added, removed, or modified any of them."} + PushButton{parent=sum_c_4,x=1,y=8,min_width=24,text="Peripheral Connections",callback=jump_peri_conns,fg_bg=cpair(colors.black,colors.yellow),active_fg_bg=btn_act_fg_bg} + PushButton{parent=sum_c_4,x=1,y=10,min_width=22,text="Redstone Connections",callback=jump_rs_conns,fg_bg=cpair(colors.black,colors.yellow),active_fg_bg=btn_act_fg_bg} PushButton{parent=sum_c_4,x=1,y=14,min_width=6,text="Exit",callback=exit,fg_bg=cpair(colors.black,colors.red),active_fg_bg=cpair(colors.white,colors.gray)} PushButton{parent=sum_c_4,x=44,y=14,min_width=6,text="Home",callback=function()tool_ctl.go_home()end,fg_bg=nav_fg_bg,active_fg_bg=btn_act_fg_bg} diff --git a/rtu/startup.lua b/rtu/startup.lua index 8888d05..4429c5d 100644 --- a/rtu/startup.lua +++ b/rtu/startup.lua @@ -31,7 +31,7 @@ local sna_rtu = require("rtu.dev.sna_rtu") local sps_rtu = require("rtu.dev.sps_rtu") local turbinev_rtu = require("rtu.dev.turbinev_rtu") -local RTU_VERSION = "v1.7.15" +local RTU_VERSION = "v1.7.16" local RTU_UNIT_TYPE = types.RTU_UNIT_TYPE local RTU_UNIT_HW_STATE = databus.RTU_UNIT_HW_STATE From 886bd0d5d588bc5930223c649558d5f514c65e10 Mon Sep 17 00:00:00 2001 From: Mikayla Fischler Date: Tue, 12 Mar 2024 12:49:33 -0400 Subject: [PATCH 27/44] luacheck fixes --- reactor-plc/panel/front_panel.lua | 1 - rtu/panel/front_panel.lua | 1 - 2 files changed, 2 deletions(-) diff --git a/reactor-plc/panel/front_panel.lua b/reactor-plc/panel/front_panel.lua index c4ec184..017fb55 100644 --- a/reactor-plc/panel/front_panel.lua +++ b/reactor-plc/panel/front_panel.lua @@ -12,7 +12,6 @@ local style = require("reactor-plc.panel.style") local core = require("graphics.core") local flasher = require("graphics.flasher") -local themes = require("graphics.themes") local Div = require("graphics.elements.div") local Rectangle = require("graphics.elements.rectangle") diff --git a/rtu/panel/front_panel.lua b/rtu/panel/front_panel.lua index a3e6169..c43dcb9 100644 --- a/rtu/panel/front_panel.lua +++ b/rtu/panel/front_panel.lua @@ -10,7 +10,6 @@ local databus = require("rtu.databus") local style = require("rtu.panel.style") local core = require("graphics.core") -local themes = require("graphics.themes") local Div = require("graphics.elements.div") local TextBox = require("graphics.elements.textbox") From 93936324284329bb52393c825df728cd1567b092 Mon Sep 17 00:00:00 2001 From: Mikayla Fischler Date: Tue, 12 Mar 2024 12:54:31 -0400 Subject: [PATCH 28/44] removed unused value specifiers --- coordinator/configure.lua | 6 +++--- reactor-plc/configure.lua | 6 +++--- rtu/configure.lua | 6 +++--- supervisor/configure.lua | 6 +++--- 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/coordinator/configure.lua b/coordinator/configure.lua index 172f5a8..5b223e8 100644 --- a/coordinator/configure.lua +++ b/coordinator/configure.lua @@ -842,9 +842,9 @@ local function config_view(display) local c_mode = RadioButton{parent=clr_c_2,x=1,y=9,default=ini_cfg.ColorMode,options=themes.COLOR_MODE_NAMES,callback=recolor,radio_colors=cpair(colors.lightGray,colors.black),select_color=colors.magenta} TextBox{parent=clr_c_2,x=20,y=8,height=1,text="Preview"} - local _ = IndLight{parent=clr_c_2,x=20,y=9,label="Good",colors=cpair(colors.black,colors.green),value=true} - _ = IndLight{parent=clr_c_2,x=20,y=10,label="Warning",colors=cpair(colors.black,colors.yellow),value=true} - _ = IndLight{parent=clr_c_2,x=20,y=11,label="Bad",colors=cpair(colors.black,colors.red),value=true} + local _ = IndLight{parent=clr_c_2,x=20,y=9,label="Good",colors=cpair(colors.black,colors.green)} + _ = IndLight{parent=clr_c_2,x=20,y=10,label="Warning",colors=cpair(colors.black,colors.yellow)} + _ = IndLight{parent=clr_c_2,x=20,y=11,label="Bad",colors=cpair(colors.black,colors.red)} TextBox{parent=clr_c_2,x=1,y=14,height=6,text="Note: exact color varies by theme.",fg_bg=g_lg_fg_bg} diff --git a/reactor-plc/configure.lua b/reactor-plc/configure.lua index ba3f380..a2c223c 100644 --- a/reactor-plc/configure.lua +++ b/reactor-plc/configure.lua @@ -480,9 +480,9 @@ local function config_view(display) local c_mode = RadioButton{parent=clr_c_2,x=1,y=9,default=ini_cfg.ColorMode,options=themes.COLOR_MODE_NAMES,callback=recolor,radio_colors=cpair(colors.lightGray,colors.black),select_color=colors.magenta} TextBox{parent=clr_c_2,x=20,y=8,height=1,text="Preview"} - local _ = IndLight{parent=clr_c_2,x=20,y=9,label="Good",colors=cpair(colors.black,colors.green),value=true} - _ = IndLight{parent=clr_c_2,x=20,y=10,label="Warning",colors=cpair(colors.black,colors.yellow),value=true} - _ = IndLight{parent=clr_c_2,x=20,y=11,label="Bad",colors=cpair(colors.black,colors.red),value=true} + local _ = IndLight{parent=clr_c_2,x=20,y=9,label="Good",colors=cpair(colors.black,colors.green)} + _ = IndLight{parent=clr_c_2,x=20,y=10,label="Warning",colors=cpair(colors.black,colors.yellow)} + _ = IndLight{parent=clr_c_2,x=20,y=11,label="Bad",colors=cpair(colors.black,colors.red)} TextBox{parent=clr_c_2,x=1,y=14,height=6,text="Note: exact color varies by theme.",fg_bg=g_lg_fg_bg} diff --git a/rtu/configure.lua b/rtu/configure.lua index eeb3c87..2fb8703 100644 --- a/rtu/configure.lua +++ b/rtu/configure.lua @@ -535,9 +535,9 @@ local function config_view(display) local c_mode = RadioButton{parent=clr_c_2,x=1,y=9,default=ini_cfg.ColorMode,options=themes.COLOR_MODE_NAMES,callback=recolor,radio_colors=cpair(colors.lightGray,colors.black),select_color=colors.magenta} TextBox{parent=clr_c_2,x=20,y=8,height=1,text="Preview"} - local _ = IndLight{parent=clr_c_2,x=20,y=9,label="Good",colors=cpair(colors.black,colors.green),value=true} - _ = IndLight{parent=clr_c_2,x=20,y=10,label="Warning",colors=cpair(colors.black,colors.yellow),value=true} - _ = IndLight{parent=clr_c_2,x=20,y=11,label="Bad",colors=cpair(colors.black,colors.red),value=true} + local _ = IndLight{parent=clr_c_2,x=20,y=9,label="Good",colors=cpair(colors.black,colors.green)} + _ = IndLight{parent=clr_c_2,x=20,y=10,label="Warning",colors=cpair(colors.black,colors.yellow)} + _ = IndLight{parent=clr_c_2,x=20,y=11,label="Bad",colors=cpair(colors.black,colors.red)} TextBox{parent=clr_c_2,x=1,y=14,height=6,text="Note: exact color varies by theme.",fg_bg=g_lg_fg_bg} diff --git a/supervisor/configure.lua b/supervisor/configure.lua index f5f41c4..6163bbb 100644 --- a/supervisor/configure.lua +++ b/supervisor/configure.lua @@ -779,9 +779,9 @@ local function config_view(display) local c_mode = RadioButton{parent=clr_c_2,x=1,y=9,default=ini_cfg.ColorMode,options=themes.COLOR_MODE_NAMES,callback=recolor,radio_colors=cpair(colors.lightGray,colors.black),select_color=colors.magenta} TextBox{parent=clr_c_2,x=20,y=8,height=1,text="Preview"} - local _ = IndLight{parent=clr_c_2,x=20,y=9,label="Good",colors=cpair(colors.black,colors.green),value=true} - _ = IndLight{parent=clr_c_2,x=20,y=10,label="Warning",colors=cpair(colors.black,colors.yellow),value=true} - _ = IndLight{parent=clr_c_2,x=20,y=11,label="Bad",colors=cpair(colors.black,colors.red),value=true} + local _ = IndLight{parent=clr_c_2,x=20,y=9,label="Good",colors=cpair(colors.black,colors.green)} + _ = IndLight{parent=clr_c_2,x=20,y=10,label="Warning",colors=cpair(colors.black,colors.yellow)} + _ = IndLight{parent=clr_c_2,x=20,y=11,label="Bad",colors=cpair(colors.black,colors.red)} TextBox{parent=clr_c_2,x=1,y=14,height=6,text="Note: exact color varies by theme.",fg_bg=g_lg_fg_bg} From a00a824a7f5a00cbcca2765e64d2eddf5d7fca50 Mon Sep 17 00:00:00 2001 From: Mikayla Fischler Date: Tue, 12 Mar 2024 13:15:28 -0400 Subject: [PATCH 29/44] cleanup and fixes --- graphics/core.lua | 2 +- graphics/themes.lua | 2 +- supervisor/panel/style.lua | 1 + supervisor/renderer.lua | 2 +- 4 files changed, 4 insertions(+), 3 deletions(-) diff --git a/graphics/core.lua b/graphics/core.lua index e2587fc..b931a3e 100644 --- a/graphics/core.lua +++ b/graphics/core.lua @@ -7,7 +7,7 @@ local flasher = require("graphics.flasher") local core = {} -core.version = "2.2.1" +core.version = "2.2.2" core.flasher = flasher core.events = events diff --git a/graphics/themes.lua b/graphics/themes.lua index c0d02ed..b59b504 100644 --- a/graphics/themes.lua +++ b/graphics/themes.lua @@ -289,7 +289,7 @@ themes.smooth_stone = { } } ----@class ui_palette +---@type ui_palette themes.deepslate = { colors = { { c = colors.red, hex = 0xeb6a6c }, diff --git a/supervisor/panel/style.lua b/supervisor/panel/style.lua index 4fe9cb4..a0a8bb0 100644 --- a/supervisor/panel/style.lua +++ b/supervisor/panel/style.lua @@ -18,6 +18,7 @@ style.ind_grn = cpair(colors.green, colors.green_off) -- set theme per configuration ---@param fp FP_THEME front panel theme +---@param color_mode COLOR_MODE the color mode to use function style.set_theme(fp, color_mode) if fp == themes.FP_THEME.SANDSTONE then style.theme = themes.sandstone diff --git a/supervisor/renderer.lua b/supervisor/renderer.lua index b1c9f06..fde7fc3 100644 --- a/supervisor/renderer.lua +++ b/supervisor/renderer.lua @@ -27,7 +27,7 @@ function renderer.try_start_ui(theme, color_mode) if ui.display == nil then -- set theme - style.set_theme(theme) + style.set_theme(theme, color_mode) -- reset terminal term.setTextColor(colors.white) From d6175e5cec4564d0ffb6c61aecac8ac14d6e668c Mon Sep 17 00:00:00 2001 From: Mikayla Fischler Date: Tue, 12 Mar 2024 13:23:39 -0400 Subject: [PATCH 30/44] switched to using LEDPair elements for colorblind mode network lights --- coordinator/ui/layout/front_panel.lua | 5 +++-- reactor-plc/panel/front_panel.lua | 4 ++-- rtu/panel/front_panel.lua | 5 +++-- 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/coordinator/ui/layout/front_panel.lua b/coordinator/ui/layout/front_panel.lua index 3e400d9..455e42e 100644 --- a/coordinator/ui/layout/front_panel.lua +++ b/coordinator/ui/layout/front_panel.lua @@ -22,6 +22,7 @@ local TextBox = require("graphics.elements.textbox") local TabBar = require("graphics.elements.controls.tabbar") local LED = require("graphics.elements.indicators.led") +local LEDPair = require("graphics.elements.indicators.ledpair") local RGBLED = require("graphics.elements.indicators.ledrgb") local LINK_STATE = types.PANEL_LINK_STATE @@ -64,8 +65,8 @@ local function init(panel, num_units) network.update(types.PANEL_LINK_STATE.DISCONNECTED) network.register(ps, "link_state", network.update) else - local nt_lnk = RGBLED{parent=system,label="NT LINKED",colors={colors.red_off,colors.red,colors.green}} - local nt_ver = RGBLED{parent=system,label="NT VERSION",colors={colors.red_off,colors.red,colors.green}} + local nt_lnk = LEDPair{parent=system,label="NT LINKED",off=colors.red_off,c1=colors.red,c2=colors.green} + local nt_ver = LEDPair{parent=system,label="NT VERSION",off=colors.red_off,c1=colors.red,c2=colors.green} nt_lnk.register(ps, "link_state", function (state) local value = 2 diff --git a/reactor-plc/panel/front_panel.lua b/reactor-plc/panel/front_panel.lua index 017fb55..b54cd04 100644 --- a/reactor-plc/panel/front_panel.lua +++ b/reactor-plc/panel/front_panel.lua @@ -64,8 +64,8 @@ local function init(panel) network.update(types.PANEL_LINK_STATE.DISCONNECTED) network.register(databus.ps, "link_state", network.update) else - local nt_lnk = RGBLED{parent=system,label="NT LINKED",colors={colors.red_off,colors.red,colors.green}} - local nt_ver = RGBLED{parent=system,label="NT VERSION",colors={colors.red_off,colors.red,colors.green}} + local nt_lnk = LEDPair{parent=system,label="NT LINKED",off=colors.red_off,c1=colors.red,c2=colors.green} + local nt_ver = LEDPair{parent=system,label="NT VERSION",off=colors.red_off,c1=colors.red,c2=colors.green} local nt_col = LED{parent=system,label="NT COLLISION",colors=ind_red} nt_lnk.register(databus.ps, "link_state", function (state) diff --git a/rtu/panel/front_panel.lua b/rtu/panel/front_panel.lua index c43dcb9..d479302 100644 --- a/rtu/panel/front_panel.lua +++ b/rtu/panel/front_panel.lua @@ -16,6 +16,7 @@ local TextBox = require("graphics.elements.textbox") local DataIndicator = require("graphics.elements.indicators.data") local LED = require("graphics.elements.indicators.led") +local LEDPair = require("graphics.elements.indicators.ledpair") local RGBLED = require("graphics.elements.indicators.ledrgb") local LINK_STATE = types.PANEL_LINK_STATE @@ -56,8 +57,8 @@ local function init(panel, units) network.update(types.PANEL_LINK_STATE.DISCONNECTED) network.register(databus.ps, "link_state", network.update) else - local nt_lnk = RGBLED{parent=system,label="NT LINKED",colors={colors.red_off,colors.red,colors.green}} - local nt_ver = RGBLED{parent=system,label="NT VERSION",colors={colors.red_off,colors.red,colors.green}} + local nt_lnk = LEDPair{parent=system,label="NT LINKED",off=colors.red_off,c1=colors.red,c2=colors.green} + local nt_ver = LEDPair{parent=system,label="NT VERSION",off=colors.red_off,c1=colors.red,c2=colors.green} nt_lnk.register(databus.ps, "link_state", function (state) local value = 2 From 9dc3a09f4d599b61e61912717eb12f2d123f5990 Mon Sep 17 00:00:00 2001 From: Mikayla Fischler Date: Tue, 12 Mar 2024 13:35:15 -0400 Subject: [PATCH 31/44] bumped up pocket version for configurator change --- pocket/startup.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pocket/startup.lua b/pocket/startup.lua index bbd8587..3bff062 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.7.1-alpha" +local POCKET_VERSION = "v0.7.2-alpha" local println = util.println local println_ts = util.println_ts From 1c0f61b3e0ced2a47eb4febfe781cce71a8d7396 Mon Sep 17 00:00:00 2001 From: Mikayla Fischler Date: Tue, 12 Mar 2024 21:09:37 -0400 Subject: [PATCH 32/44] changed config defaults to use theme enums --- reactor-plc/configure.lua | 4 ++-- rtu/configure.lua | 4 ++-- supervisor/configure.lua | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/reactor-plc/configure.lua b/reactor-plc/configure.lua index a2c223c..7f6dce5 100644 --- a/reactor-plc/configure.lua +++ b/reactor-plc/configure.lua @@ -122,8 +122,8 @@ local fields = { { "LogMode", "Log Mode", log.MODE.APPEND }, { "LogPath", "Log Path", "/log.txt" }, { "LogDebug", "Log Debug Messages", false }, - { "FrontPanelTheme", "Front Panel Theme", 1 }, - { "ColorMode", "Color Mode", 1 } + { "FrontPanelTheme", "Front Panel Theme", themes.FP_THEME.SANDSTONE }, + { "ColorMode", "Color Mode", themes.COLOR_MODE.STANDARD } } local side_options = { "Top", "Bottom", "Left", "Right", "Front", "Back" } diff --git a/rtu/configure.lua b/rtu/configure.lua index 2fb8703..587ffeb 100644 --- a/rtu/configure.lua +++ b/rtu/configure.lua @@ -196,8 +196,8 @@ local fields = { { "LogMode", "Log Mode", log.MODE.APPEND }, { "LogPath", "Log Path", "/log.txt" }, { "LogDebug", "Log Debug Messages", false }, - { "FrontPanelTheme", "Front Panel Theme", 1 }, - { "ColorMode", "Color Mode", 1 } + { "FrontPanelTheme", "Front Panel Theme", themes.FP_THEME.SANDSTONE }, + { "ColorMode", "Color Mode", themes.COLOR_MODE.STANDARD } } local side_options = { "Top", "Bottom", "Left", "Right", "Front", "Back" } diff --git a/supervisor/configure.lua b/supervisor/configure.lua index 6163bbb..f9bc10d 100644 --- a/supervisor/configure.lua +++ b/supervisor/configure.lua @@ -133,8 +133,8 @@ local fields = { { "LogMode", "Log Mode", log.MODE.APPEND }, { "LogPath", "Log Path", "/log.txt" }, { "LogDebug", "Log Debug Messages", false }, - { "FrontPanelTheme", "Front Panel Theme", 1 }, - { "ColorMode", "Color Mode", 1 } + { "FrontPanelTheme", "Front Panel Theme", themes.FP_THEME.SANDSTONE }, + { "ColorMode", "Color Mode", themes.COLOR_MODE.STANDARD } } -- load data from the settings file From 19869416af1739c9be57466ba71127e8ed08921b Mon Sep 17 00:00:00 2001 From: Mikayla Fischler Date: Sat, 23 Mar 2024 00:26:58 -0400 Subject: [PATCH 33/44] #434 #454 PPM improvements and undefined function overhaul --- reactor-plc/plc.lua | 6 +-- reactor-plc/startup.lua | 10 +---- rtu/dev/boilerv_rtu.lua | 67 +++++++++++++++------------------- rtu/dev/dynamicv_rtu.lua | 33 ++++++----------- rtu/dev/imatrix_rtu.lua | 41 ++++++++------------- rtu/dev/sps_rtu.lua | 51 +++++++++++--------------- rtu/dev/turbinev_rtu.lua | 65 ++++++++++++++------------------- rtu/rtu.lua | 35 +++++++++++++----- rtu/startup.lua | 15 ++++---- rtu/threads.lua | 79 +++++----------------------------------- scada-common/ppm.lua | 47 ++++++++++++++++-------- scada-common/util.lua | 2 +- 12 files changed, 186 insertions(+), 265 deletions(-) diff --git a/reactor-plc/plc.lua b/reactor-plc/plc.lua index 560f3ba..1a6b32f 100644 --- a/reactor-plc/plc.lua +++ b/reactor-plc/plc.lua @@ -144,9 +144,9 @@ function plc.rps_init(reactor, is_formed) local function _check_and_handle_ppm_call(result) if result == ppm.ACCESS_FAULT then _set_fault() - elseif result == ppm.UNDEFINED_FIELD then - _set_fault() - self.formed = false + + -- if undefined, then the reactor isn't formed + if reactor.__p_last_fault() == ppm.UNDEFINED_FIELD then self.formed = false end else return true end return false diff --git a/reactor-plc/startup.lua b/reactor-plc/startup.lua index ea51bf6..63167c7 100644 --- a/reactor-plc/startup.lua +++ b/reactor-plc/startup.lua @@ -18,7 +18,7 @@ local plc = require("reactor-plc.plc") local renderer = require("reactor-plc.renderer") local threads = require("reactor-plc.threads") -local R_PLC_VERSION = "v1.7.0" +local R_PLC_VERSION = "v1.7.1" local println = util.println local println_ts = util.println_ts @@ -144,13 +144,6 @@ local function main() println("init> fission reactor is not formed") log.warning("init> reactor logic adapter present, but reactor is not formed") - plc_state.degraded = true - plc_state.reactor_formed = false - elseif smem_dev.reactor.getStatus() == ppm.UNDEFINED_FIELD then - -- reactor formed after ppm.mount_all was called - println("init> fission reactor was not formed") - log.warning("init> reactor reported formed, but multiblock functions are not available") - plc_state.degraded = true plc_state.reactor_formed = false end @@ -185,6 +178,7 @@ local function main() local message plc_state.fp_ok, message = renderer.try_start_ui(config.FrontPanelTheme, config.ColorMode) + -- ...or not if not plc_state.fp_ok then println_ts(util.c("UI error: ", message)) println("init> running without front panel") diff --git a/rtu/dev/boilerv_rtu.lua b/rtu/dev/boilerv_rtu.lua index cb4f701..24ffff1 100644 --- a/rtu/dev/boilerv_rtu.lua +++ b/rtu/dev/boilerv_rtu.lua @@ -9,58 +9,49 @@ local boilerv_rtu = {} function boilerv_rtu.new(boiler) local unit = rtu.init_unit(boiler) - -- disable auto fault clearing - boiler.__p_clear_fault() - boiler.__p_disable_afc() - -- discrete inputs -- - unit.connect_di(boiler.isFormed) + unit.connect_di("isFormed") -- coils -- -- none -- input registers -- -- multiblock properties - unit.connect_input_reg(boiler.getLength) - unit.connect_input_reg(boiler.getWidth) - unit.connect_input_reg(boiler.getHeight) - unit.connect_input_reg(boiler.getMinPos) - unit.connect_input_reg(boiler.getMaxPos) + unit.connect_input_reg("getLength") + unit.connect_input_reg("getWidth") + unit.connect_input_reg("getHeight") + unit.connect_input_reg("getMinPos") + unit.connect_input_reg("getMaxPos") -- build properties - unit.connect_input_reg(boiler.getBoilCapacity) - unit.connect_input_reg(boiler.getSteamCapacity) - unit.connect_input_reg(boiler.getWaterCapacity) - unit.connect_input_reg(boiler.getHeatedCoolantCapacity) - unit.connect_input_reg(boiler.getCooledCoolantCapacity) - unit.connect_input_reg(boiler.getSuperheaters) - unit.connect_input_reg(boiler.getMaxBoilRate) + unit.connect_input_reg("getBoilCapacity") + unit.connect_input_reg("getSteamCapacity") + unit.connect_input_reg("getWaterCapacity") + unit.connect_input_reg("getHeatedCoolantCapacity") + unit.connect_input_reg("getCooledCoolantCapacity") + unit.connect_input_reg("getSuperheaters") + unit.connect_input_reg("getMaxBoilRate") -- current state - unit.connect_input_reg(boiler.getTemperature) - unit.connect_input_reg(boiler.getBoilRate) - unit.connect_input_reg(boiler.getEnvironmentalLoss) + unit.connect_input_reg("getTemperature") + unit.connect_input_reg("getBoilRate") + unit.connect_input_reg("getEnvironmentalLoss") -- tanks - unit.connect_input_reg(boiler.getSteam) - unit.connect_input_reg(boiler.getSteamNeeded) - unit.connect_input_reg(boiler.getSteamFilledPercentage) - unit.connect_input_reg(boiler.getWater) - unit.connect_input_reg(boiler.getWaterNeeded) - unit.connect_input_reg(boiler.getWaterFilledPercentage) - unit.connect_input_reg(boiler.getHeatedCoolant) - unit.connect_input_reg(boiler.getHeatedCoolantNeeded) - unit.connect_input_reg(boiler.getHeatedCoolantFilledPercentage) - unit.connect_input_reg(boiler.getCooledCoolant) - unit.connect_input_reg(boiler.getCooledCoolantNeeded) - unit.connect_input_reg(boiler.getCooledCoolantFilledPercentage) + unit.connect_input_reg("getSteam") + unit.connect_input_reg("getSteamNeeded") + unit.connect_input_reg("getSteamFilledPercentage") + unit.connect_input_reg("getWater") + unit.connect_input_reg("getWaterNeeded") + unit.connect_input_reg("getWaterFilledPercentage") + unit.connect_input_reg("getHeatedCoolant") + unit.connect_input_reg("getHeatedCoolantNeeded") + unit.connect_input_reg("getHeatedCoolantFilledPercentage") + unit.connect_input_reg("getCooledCoolant") + unit.connect_input_reg("getCooledCoolantNeeded") + unit.connect_input_reg("getCooledCoolantFilledPercentage") -- holding registers -- -- none - -- check if any calls faulted - local faulted = boiler.__p_is_faulted() - boiler.__p_clear_fault() - boiler.__p_enable_afc() - - return unit.interface(), faulted + return unit.interface(), false end return boilerv_rtu diff --git a/rtu/dev/dynamicv_rtu.lua b/rtu/dev/dynamicv_rtu.lua index 987e366..4ef10cb 100644 --- a/rtu/dev/dynamicv_rtu.lua +++ b/rtu/dev/dynamicv_rtu.lua @@ -9,12 +9,8 @@ local dynamicv_rtu = {} function dynamicv_rtu.new(dynamic_tank) local unit = rtu.init_unit(dynamic_tank) - -- disable auto fault clearing - dynamic_tank.__p_clear_fault() - dynamic_tank.__p_disable_afc() - -- discrete inputs -- - unit.connect_di(dynamic_tank.isFormed) + unit.connect_di("isFormed") -- coils -- unit.connect_coil(function () dynamic_tank.incrementContainerEditMode() end, function () end) @@ -22,27 +18,22 @@ function dynamicv_rtu.new(dynamic_tank) -- input registers -- -- multiblock properties - unit.connect_input_reg(dynamic_tank.getLength) - unit.connect_input_reg(dynamic_tank.getWidth) - unit.connect_input_reg(dynamic_tank.getHeight) - unit.connect_input_reg(dynamic_tank.getMinPos) - unit.connect_input_reg(dynamic_tank.getMaxPos) + unit.connect_input_reg("getLength") + unit.connect_input_reg("getWidth") + unit.connect_input_reg("getHeight") + unit.connect_input_reg("getMinPos") + unit.connect_input_reg("getMaxPos") -- build properties - unit.connect_input_reg(dynamic_tank.getTankCapacity) - unit.connect_input_reg(dynamic_tank.getChemicalTankCapacity) + unit.connect_input_reg("getTankCapacity") + unit.connect_input_reg("getChemicalTankCapacity") -- tanks/containers - unit.connect_input_reg(dynamic_tank.getStored) - unit.connect_input_reg(dynamic_tank.getFilledPercentage) + unit.connect_input_reg("getStored") + unit.connect_input_reg("getFilledPercentage") -- holding registers -- - unit.connect_holding_reg(dynamic_tank.getContainerEditMode, dynamic_tank.setContainerEditMode) + unit.connect_holding_reg("getContainerEditMode", "setContainerEditMode") - -- check if any calls faulted - local faulted = dynamic_tank.__p_is_faulted() - dynamic_tank.__p_clear_fault() - dynamic_tank.__p_enable_afc() - - return unit.interface(), faulted + return unit.interface(), false end return dynamicv_rtu diff --git a/rtu/dev/imatrix_rtu.lua b/rtu/dev/imatrix_rtu.lua index f3b7f5c..61de630 100644 --- a/rtu/dev/imatrix_rtu.lua +++ b/rtu/dev/imatrix_rtu.lua @@ -9,45 +9,36 @@ local imatrix_rtu = {} function imatrix_rtu.new(imatrix) local unit = rtu.init_unit(imatrix) - -- disable auto fault clearing - imatrix.__p_clear_fault() - imatrix.__p_disable_afc() - -- discrete inputs -- - unit.connect_di(imatrix.isFormed) + unit.connect_di("isFormed") -- coils -- -- none -- input registers -- -- multiblock properties - unit.connect_input_reg(imatrix.getLength) - unit.connect_input_reg(imatrix.getWidth) - unit.connect_input_reg(imatrix.getHeight) - unit.connect_input_reg(imatrix.getMinPos) - unit.connect_input_reg(imatrix.getMaxPos) + unit.connect_input_reg("getLength") + unit.connect_input_reg("getWidth") + unit.connect_input_reg("getHeight") + unit.connect_input_reg("getMinPos") + unit.connect_input_reg("getMaxPos") -- build properties - unit.connect_input_reg(imatrix.getMaxEnergy) - unit.connect_input_reg(imatrix.getTransferCap) - unit.connect_input_reg(imatrix.getInstalledCells) - unit.connect_input_reg(imatrix.getInstalledProviders) + unit.connect_input_reg("getMaxEnergy") + unit.connect_input_reg("getTransferCap") + unit.connect_input_reg("getInstalledCells") + unit.connect_input_reg("getInstalledProviders") -- I/O rates - unit.connect_input_reg(imatrix.getLastInput) - unit.connect_input_reg(imatrix.getLastOutput) + unit.connect_input_reg("getLastInput") + unit.connect_input_reg("getLastOutput") -- tanks - unit.connect_input_reg(imatrix.getEnergy) - unit.connect_input_reg(imatrix.getEnergyNeeded) - unit.connect_input_reg(imatrix.getEnergyFilledPercentage) + unit.connect_input_reg("getEnergy") + unit.connect_input_reg("getEnergyNeeded") + unit.connect_input_reg("getEnergyFilledPercentage") -- holding registers -- -- none - -- check if any calls faulted - local faulted = imatrix.__p_is_faulted() - imatrix.__p_clear_fault() - imatrix.__p_enable_afc() - - return unit.interface(), faulted + return unit.interface(), false end return imatrix_rtu diff --git a/rtu/dev/sps_rtu.lua b/rtu/dev/sps_rtu.lua index 448dc48..14a6e07 100644 --- a/rtu/dev/sps_rtu.lua +++ b/rtu/dev/sps_rtu.lua @@ -9,50 +9,41 @@ local sps_rtu = {} function sps_rtu.new(sps) local unit = rtu.init_unit(sps) - -- disable auto fault clearing - sps.__p_clear_fault() - sps.__p_disable_afc() - -- discrete inputs -- - unit.connect_di(sps.isFormed) + unit.connect_di("isFormed") -- coils -- -- none -- input registers -- -- multiblock properties - unit.connect_input_reg(sps.getLength) - unit.connect_input_reg(sps.getWidth) - unit.connect_input_reg(sps.getHeight) - unit.connect_input_reg(sps.getMinPos) - unit.connect_input_reg(sps.getMaxPos) + unit.connect_input_reg("getLength") + unit.connect_input_reg("getWidth") + unit.connect_input_reg("getHeight") + unit.connect_input_reg("getMinPos") + unit.connect_input_reg("getMaxPos") -- build properties - unit.connect_input_reg(sps.getCoils) - unit.connect_input_reg(sps.getInputCapacity) - unit.connect_input_reg(sps.getOutputCapacity) - unit.connect_input_reg(sps.getMaxEnergy) + unit.connect_input_reg("getCoils") + unit.connect_input_reg("getInputCapacity") + unit.connect_input_reg("getOutputCapacity") + unit.connect_input_reg("getMaxEnergy") -- current state - unit.connect_input_reg(sps.getProcessRate) + unit.connect_input_reg("getProcessRate") -- tanks - unit.connect_input_reg(sps.getInput) - unit.connect_input_reg(sps.getInputNeeded) - unit.connect_input_reg(sps.getInputFilledPercentage) - unit.connect_input_reg(sps.getOutput) - unit.connect_input_reg(sps.getOutputNeeded) - unit.connect_input_reg(sps.getOutputFilledPercentage) - unit.connect_input_reg(sps.getEnergy) - unit.connect_input_reg(sps.getEnergyNeeded) - unit.connect_input_reg(sps.getEnergyFilledPercentage) + unit.connect_input_reg("getInput") + unit.connect_input_reg("getInputNeeded") + unit.connect_input_reg("getInputFilledPercentage") + unit.connect_input_reg("getOutput") + unit.connect_input_reg("getOutputNeeded") + unit.connect_input_reg("getOutputFilledPercentage") + unit.connect_input_reg("getEnergy") + unit.connect_input_reg("getEnergyNeeded") + unit.connect_input_reg("getEnergyFilledPercentage") -- holding registers -- -- none - -- check if any calls faulted - local faulted = sps.__p_is_faulted() - sps.__p_clear_fault() - sps.__p_enable_afc() - - return unit.interface(), faulted + return unit.interface(), false end return sps_rtu diff --git a/rtu/dev/turbinev_rtu.lua b/rtu/dev/turbinev_rtu.lua index 4bfad81..5770ff2 100644 --- a/rtu/dev/turbinev_rtu.lua +++ b/rtu/dev/turbinev_rtu.lua @@ -9,12 +9,8 @@ local turbinev_rtu = {} function turbinev_rtu.new(turbine) local unit = rtu.init_unit(turbine) - -- disable auto fault clearing - turbine.__p_clear_fault() - turbine.__p_disable_afc() - -- discrete inputs -- - unit.connect_di(turbine.isFormed) + unit.connect_di("isFormed") -- coils -- unit.connect_coil(function () turbine.incrementDumpingMode() end, function () end) @@ -22,44 +18,39 @@ function turbinev_rtu.new(turbine) -- input registers -- -- multiblock properties - unit.connect_input_reg(turbine.getLength) - unit.connect_input_reg(turbine.getWidth) - unit.connect_input_reg(turbine.getHeight) - unit.connect_input_reg(turbine.getMinPos) - unit.connect_input_reg(turbine.getMaxPos) + unit.connect_input_reg("getLength") + unit.connect_input_reg("getWidth") + unit.connect_input_reg("getHeight") + unit.connect_input_reg("getMinPos") + unit.connect_input_reg("getMaxPos") -- build properties - unit.connect_input_reg(turbine.getBlades) - unit.connect_input_reg(turbine.getCoils) - unit.connect_input_reg(turbine.getVents) - unit.connect_input_reg(turbine.getDispersers) - unit.connect_input_reg(turbine.getCondensers) - unit.connect_input_reg(turbine.getSteamCapacity) - unit.connect_input_reg(turbine.getMaxEnergy) - unit.connect_input_reg(turbine.getMaxFlowRate) - unit.connect_input_reg(turbine.getMaxProduction) - unit.connect_input_reg(turbine.getMaxWaterOutput) + unit.connect_input_reg("getBlades") + unit.connect_input_reg("getCoils") + unit.connect_input_reg("getVents") + unit.connect_input_reg("getDispersers") + unit.connect_input_reg("getCondensers") + unit.connect_input_reg("getSteamCapacity") + unit.connect_input_reg("getMaxEnergy") + unit.connect_input_reg("getMaxFlowRate") + unit.connect_input_reg("getMaxProduction") + unit.connect_input_reg("getMaxWaterOutput") -- current state - unit.connect_input_reg(turbine.getFlowRate) - unit.connect_input_reg(turbine.getProductionRate) - unit.connect_input_reg(turbine.getLastSteamInputRate) - unit.connect_input_reg(turbine.getDumpingMode) + unit.connect_input_reg("getFlowRate") + unit.connect_input_reg("getProductionRate") + unit.connect_input_reg("getLastSteamInputRate") + unit.connect_input_reg("getDumpingMode") -- tanks/containers - unit.connect_input_reg(turbine.getSteam) - unit.connect_input_reg(turbine.getSteamNeeded) - unit.connect_input_reg(turbine.getSteamFilledPercentage) - unit.connect_input_reg(turbine.getEnergy) - unit.connect_input_reg(turbine.getEnergyNeeded) - unit.connect_input_reg(turbine.getEnergyFilledPercentage) + unit.connect_input_reg("getSteam") + unit.connect_input_reg("getSteamNeeded") + unit.connect_input_reg("getSteamFilledPercentage") + unit.connect_input_reg("getEnergy") + unit.connect_input_reg("getEnergyNeeded") + unit.connect_input_reg("getEnergyFilledPercentage") -- holding registers -- - unit.connect_holding_reg(turbine.getDumpingMode, turbine.setDumpingMode) + unit.connect_holding_reg("getDumpingMode", "setDumpingMode") - -- check if any calls faulted - local faulted = turbine.__p_is_faulted() - turbine.__p_clear_fault() - turbine.__p_enable_afc() - - return unit.interface(), faulted + return unit.interface(), false end return turbinev_rtu diff --git a/rtu/rtu.lua b/rtu/rtu.lua index ab13bbd..803c9aa 100644 --- a/rtu/rtu.lua +++ b/rtu/rtu.lua @@ -92,6 +92,8 @@ function rtu.init_unit(device) local insert = table.insert + local stub = function () log.warning("tried to call an RTU function stub") end + ---@class rtu_device local public = {} @@ -113,13 +115,26 @@ function rtu.init_unit(device) return self.io_count_cache[1], self.io_count_cache[2], self.io_count_cache[3], self.io_count_cache[4] end + -- pass a function through or generate one to call a function by name from the device + ---@param f function|string function or device function name + local function _as_func(f) + if type(f) == "string" then + local name = f + if device then + f = function (...) return device[name](...) end + else f = stub end + end + + return f + end + -- discrete inputs: single bit read-only -- connect discrete input - ---@param f function + ---@param f function|string function or function name ---@return integer count count of discrete inputs function protected.connect_di(f) - insert(self.discrete_inputs, { read = f }) + insert(self.discrete_inputs, { read = _as_func(f) }) _count_io() return #self.discrete_inputs end @@ -135,11 +150,11 @@ function rtu.init_unit(device) -- coils: single bit read-write -- connect coil - ---@param f_read function - ---@param f_write function + ---@param f_read function|string function or function name + ---@param f_write function|string function or function name ---@return integer count count of coils function protected.connect_coil(f_read, f_write) - insert(self.coils, { read = f_read, write = f_write }) + insert(self.coils, { read = _as_func(f_read), write = _as_func(f_write) }) _count_io() return #self.coils end @@ -164,10 +179,10 @@ function rtu.init_unit(device) -- input registers: multi-bit read-only -- connect input register - ---@param f function + ---@param f function|string function or function name ---@return integer count count of input registers function protected.connect_input_reg(f) - insert(self.input_regs, { read = f }) + insert(self.input_regs, { read = _as_func(f) }) _count_io() return #self.input_regs end @@ -183,11 +198,11 @@ function rtu.init_unit(device) -- holding registers: multi-bit read-write -- connect holding register - ---@param f_read function - ---@param f_write function + ---@param f_read function|string function or function name + ---@param f_write function|string function or function name ---@return integer count count of holding registers function protected.connect_holding_reg(f_read, f_write) - insert(self.holding_regs, { read = f_read, write = f_write }) + insert(self.holding_regs, { read = _as_func(f_read), write = _as_func(f_write) }) _count_io() return #self.holding_regs end diff --git a/rtu/startup.lua b/rtu/startup.lua index 4b92756..d16751f 100644 --- a/rtu/startup.lua +++ b/rtu/startup.lua @@ -31,7 +31,7 @@ local sna_rtu = require("rtu.dev.sna_rtu") local sps_rtu = require("rtu.dev.sps_rtu") local turbinev_rtu = require("rtu.dev.turbinev_rtu") -local RTU_VERSION = "v1.8.0" +local RTU_VERSION = "v1.9.0" local RTU_UNIT_TYPE = types.RTU_UNIT_TYPE local RTU_UNIT_HW_STATE = databus.RTU_UNIT_HW_STATE @@ -342,7 +342,7 @@ local function main() is_multiblock = true formed = device.isFormed() - if formed == ppm.UNDEFINED_FIELD or formed == ppm.ACCESS_FAULT then + if formed == ppm.ACCESS_FAULT then println_ts(util.c("sys_config> failed to check if '", name, "' is formed")) log.fatal(util.c("sys_config> failed to check if '", name, "' is a formed boiler multiblock")) return false @@ -357,7 +357,7 @@ local function main() is_multiblock = true formed = device.isFormed() - if formed == ppm.UNDEFINED_FIELD or formed == ppm.ACCESS_FAULT then + if formed == ppm.ACCESS_FAULT then println_ts(util.c("sys_config> failed to check if '", name, "' is formed")) log.fatal(util.c("sys_config> failed to check if '", name, "' is a formed turbine multiblock")) return false @@ -377,7 +377,7 @@ local function main() is_multiblock = true formed = device.isFormed() - if formed == ppm.UNDEFINED_FIELD or formed == ppm.ACCESS_FAULT then + if formed == ppm.ACCESS_FAULT then println_ts(util.c("sys_config> failed to check if '", name, "' is formed")) log.fatal(util.c("sys_config> failed to check if '", name, "' is a formed dynamic tank multiblock")) return false @@ -391,7 +391,7 @@ local function main() is_multiblock = true formed = device.isFormed() - if formed == ppm.UNDEFINED_FIELD or formed == ppm.ACCESS_FAULT then + if formed == ppm.ACCESS_FAULT then println_ts(util.c("sys_config> failed to check if '", name, "' is formed")) log.fatal(util.c("sys_config> failed to check if '", name, "' is a formed induction matrix multiblock")) return false @@ -405,7 +405,7 @@ local function main() is_multiblock = true formed = device.isFormed() - if formed == ppm.UNDEFINED_FIELD or formed == ppm.ACCESS_FAULT then + if formed == ppm.ACCESS_FAULT then println_ts(util.c("sys_config> failed to check if '", name, "' is formed")) log.fatal(util.c("sys_config> failed to check if '", name, "' is a formed SPS multiblock")) return false @@ -471,7 +471,8 @@ local function main() for_message = util.c("reactor ", for_reactor) end - log.info(util.c("sys_config> initialized RTU unit #", #units, ": ", name, " (", types.rtu_type_to_string(rtu_type), ") [", index, "] for ", for_message)) + local index_str = util.trinary(index ~= nil, util.c(" [", index, "]"), "") + log.info(util.c("sys_config> initialized RTU unit #", #units, ": ", name, " (", types.rtu_type_to_string(rtu_type), ")", index_str, " for ", for_message)) rtu_unit.uid = #units diff --git a/rtu/threads.lua b/rtu/threads.lua index f3147e7..011b617 100644 --- a/rtu/threads.lua +++ b/rtu/threads.lua @@ -517,82 +517,23 @@ function threads.thread__unit_comms(smem, unit) -- check if multiblock is still formed if this is a multiblock if unit.is_multiblock and (util.time_ms() - last_f_check > 250) then - local is_formed = unit.device.isFormed() - last_f_check = util.time_ms() + local is_formed = unit.device.isFormed() + if unit.formed == nil then unit.formed = is_formed if is_formed then unit.hw_state = UNIT_HW_STATE.OK end + elseif not unit.formed then + unit.hw_state = UNIT_HW_STATE.UNFORMED end - if not unit.formed then unit.hw_state = UNIT_HW_STATE.UNFORMED end - - if (not unit.formed) and is_formed then - -- newly re-formed - local iface = ppm.get_iface(unit.device) - if iface then - log.info(util.c("unmounting and remounting reformed RTU unit ", detail_name)) - - ppm.unmount(unit.device) - - local type, device = ppm.mount(iface) - local faulted = false - - if device ~= nil then - if type == "boilerValve" and unit.type == RTU_UNIT_TYPE.BOILER_VALVE then - -- boiler multiblock - unit.device = device - unit.rtu, faulted = boilerv_rtu.new(device) - unit.formed = device.isFormed() - unit.modbus_io = modbus.new(unit.rtu, true) - elseif type == "turbineValve" and unit.type == RTU_UNIT_TYPE.TURBINE_VALVE then - -- turbine multiblock - unit.device = device - unit.rtu, faulted = turbinev_rtu.new(device) - unit.formed = device.isFormed() - unit.modbus_io = modbus.new(unit.rtu, true) - elseif type == "dynamicValve" and unit.type == RTU_UNIT_TYPE.DYNAMIC_VALVE then - -- dynamic tank multiblock - unit.device = device - unit.rtu, faulted = dynamicv_rtu.new(device) - unit.formed = device.isFormed() - unit.modbus_io = modbus.new(unit.rtu, true) - elseif type == "inductionPort" and unit.type == RTU_UNIT_TYPE.IMATRIX then - -- induction matrix multiblock - unit.device = device - unit.rtu, faulted = imatrix_rtu.new(device) - unit.formed = device.isFormed() - unit.modbus_io = modbus.new(unit.rtu, true) - elseif type == "spsPort" and unit.type == RTU_UNIT_TYPE.SPS then - -- SPS multiblock - unit.device = device - unit.rtu, faulted = sps_rtu.new(device) - unit.formed = device.isFormed() - unit.modbus_io = modbus.new(unit.rtu, true) - else - log.error("illegal remount of non-multiblock RTU or type change attempted for " .. short_name, true) - end - - if unit.formed and faulted then - -- something is still wrong = can't mark as formed yet - unit.formed = false - unit.hw_state = UNIT_HW_STATE.UNFORMED - log.info(util.c("assuming ", unit.name, " is not formed due to PPM faults while initializing")) - else - unit.hw_state = UNIT_HW_STATE.OK - rtu_comms.send_remounted(unit.uid) - end - - local type_name = types.rtu_type_to_string(unit.type) - log.info(util.c("reconnected the ", type_name, " on interface ", unit.name)) - else - -- fully lost the peripheral now :( - log.error(util.c(unit.name, " lost (failed reconnect)")) - end - else - log.error("failed to get interface of previously connected RTU unit " .. detail_name, true) - end + if (is_formed == true) and not unit.formed then + unit.hw_state = UNIT_HW_STATE.OK + log.info(util.c(detail_name, " is now formed")) + rtu_comms.send_remounted(unit.uid) + elseif (is_formed == false) and unit.formed then + log.warning(util.c(detail_name, " is no longer formed")) end unit.formed = is_formed diff --git a/scada-common/ppm.lua b/scada-common/ppm.lua index 0d02663..34a6a60 100644 --- a/scada-common/ppm.lua +++ b/scada-common/ppm.lua @@ -51,11 +51,13 @@ local function peri_init(iface) self.device = peripheral.wrap(iface) end - -- initialization process (re-map) - - for key, func in pairs(self.device) do - self.fault_counts[key] = 0 - self.device[key] = function (...) + -- create a protected version of a peripheral function call + ---@nodiscard + ---@param key string function name + ---@param func function function + ---@return function method protected version of the function + local function protect_peri_function(key, func) + return function (...) local return_table = table.pack(pcall(func, ...)) local status = return_table[1] @@ -85,20 +87,24 @@ local function peri_init(iface) count_str = " [" .. self.fault_counts[key] .. " total faults]" end - log.error(util.c("PPM: protected ", key, "() -> ", result, count_str)) + log.error(util.c("PPM: [@", iface, "] protected ", key, "() -> ", result, count_str)) end self.fault_counts[key] = self.fault_counts[key] + 1 - if result == "Terminated" then - ppm_sys.terminate = true - end + if result == "Terminated" then ppm_sys.terminate = true end - return ACCESS_FAULT + return ACCESS_FAULT, result end end end + -- initialization process (re-map) + for key, func in pairs(self.device) do + self.fault_counts[key] = 0 + self.device[key] = protect_peri_function(key, func) + end + -- fault management & monitoring functions local function clear_fault() self.faulted = false end @@ -131,12 +137,21 @@ local function peri_init(iface) local mt = { __index = function (_, key) + -- try to find the function in case it was added (multiblock formed) + local funcs = peripheral.wrap(iface) + if (type(funcs) == "table") and (type(funcs[key]) == "function") then + -- add this function then return it + self.device[key] = protect_peri_function(key, funcs[key]) + log.info(util.c("PPM: [@", iface, "] initialized previously undefined field ", key, "()")) + + return self.device[key] + end + + -- function still missing, return an undefined function handler + -- note: code should avoid storing functions for multiblocks and instead try to index them again return (function () -- this will continuously be counting calls here as faults - -- unlike other functions, faults here can't be cleared as it is just not defined - if self.fault_counts[key] == nil then - self.fault_counts[key] = 0 - end + if self.fault_counts[key] == nil then self.fault_counts[key] = 0 end -- function failed self.faulted = true @@ -151,12 +166,12 @@ local function peri_init(iface) count_str = " [" .. self.fault_counts[key] .. " total calls]" end - log.error(util.c("PPM: caught undefined function ", key, "()", count_str)) + log.error(util.c("PPM: [@", iface, "] caught undefined function ", key, "()", count_str)) end self.fault_counts[key] = self.fault_counts[key] + 1 - return UNDEFINED_FIELD + return ACCESS_FAULT, UNDEFINED_FIELD end) end } diff --git a/scada-common/util.lua b/scada-common/util.lua index ebca4a2..395be22 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.1.19" +util.version = "1.2.0" util.TICK_TIME_S = 0.05 util.TICK_TIME_MS = 50 From 968b0a91229d0dd0af20e310b50bdb1c47e730f8 Mon Sep 17 00:00:00 2001 From: Mikayla Fischler Date: Sat, 23 Mar 2024 00:49:19 -0400 Subject: [PATCH 34/44] log environment versions when debug logs are enabled --- coordinator/startup.lua | 3 ++- pocket/startup.lua | 3 ++- reactor-plc/startup.lua | 3 ++- rtu/startup.lua | 3 ++- scada-common/crash.lua | 23 ++++++++++++++++------- supervisor/startup.lua | 3 ++- 6 files changed, 26 insertions(+), 12 deletions(-) diff --git a/coordinator/startup.lua b/coordinator/startup.lua index 5b3c46b..2f83016 100644 --- a/coordinator/startup.lua +++ b/coordinator/startup.lua @@ -22,7 +22,7 @@ local sounder = require("coordinator.sounder") local apisessions = require("coordinator.session.apisessions") -local COORDINATOR_VERSION = "v1.3.0" +local COORDINATOR_VERSION = "v1.3.1" local CHUNK_LOAD_DELAY_S = 30.0 @@ -103,6 +103,7 @@ log.info("========================================") println(">> SCADA Coordinator " .. COORDINATOR_VERSION .. " <<") crash.set_env("coordinator", COORDINATOR_VERSION) +crash.dbg_log_env() ---------------------------------------- -- main application diff --git a/pocket/startup.lua b/pocket/startup.lua index 3bff062..5b7c91f 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.7.2-alpha" +local POCKET_VERSION = "v0.7.3-alpha" local println = util.println local println_ts = util.println_ts @@ -54,6 +54,7 @@ log.info("BOOTING pocket.startup " .. POCKET_VERSION) log.info("========================================") crash.set_env("pocket", POCKET_VERSION) +crash.dbg_log_env() ---------------------------------------- -- main application diff --git a/reactor-plc/startup.lua b/reactor-plc/startup.lua index 63167c7..da79744 100644 --- a/reactor-plc/startup.lua +++ b/reactor-plc/startup.lua @@ -18,7 +18,7 @@ local plc = require("reactor-plc.plc") local renderer = require("reactor-plc.renderer") local threads = require("reactor-plc.threads") -local R_PLC_VERSION = "v1.7.1" +local R_PLC_VERSION = "v1.7.2" local println = util.println local println_ts = util.println_ts @@ -55,6 +55,7 @@ log.info("========================================") println(">> Reactor PLC " .. R_PLC_VERSION .. " <<") crash.set_env("reactor-plc", R_PLC_VERSION) +crash.dbg_log_env() ---------------------------------------- -- main application diff --git a/rtu/startup.lua b/rtu/startup.lua index d16751f..071ab40 100644 --- a/rtu/startup.lua +++ b/rtu/startup.lua @@ -31,7 +31,7 @@ local sna_rtu = require("rtu.dev.sna_rtu") local sps_rtu = require("rtu.dev.sps_rtu") local turbinev_rtu = require("rtu.dev.turbinev_rtu") -local RTU_VERSION = "v1.9.0" +local RTU_VERSION = "v1.9.1" local RTU_UNIT_TYPE = types.RTU_UNIT_TYPE local RTU_UNIT_HW_STATE = databus.RTU_UNIT_HW_STATE @@ -71,6 +71,7 @@ log.info("========================================") println(">> RTU GATEWAY " .. RTU_VERSION .. " <<") crash.set_env("rtu", RTU_VERSION) +crash.dbg_log_env() ---------------------------------------- -- main application diff --git a/scada-common/crash.lua b/scada-common/crash.lua index 1942a8d..a7e2c93 100644 --- a/scada-common/crash.lua +++ b/scada-common/crash.lua @@ -24,6 +24,21 @@ function crash.set_env(application, version) ver = version end +-- log environment versions +---@param log_msg function log function to use +local function log_versions(log_msg) + log_msg(util.c("RUNTIME: ", _HOST)) + log_msg(util.c("LUA VERSION: ", _VERSION)) + log_msg(util.c("APPLICATION: ", app)) + log_msg(util.c("FIRMWARE VERSION: ", ver)) + log_msg(util.c("COMMS VERSION: ", comms.version)) + if has_graphics then log_msg(util.c("GRAPHICS VERSION: ", core.version)) end + if has_lockbox then log_msg(util.c("LOCKBOX VERSION: ", lockbox.version)) end +end + +-- when running with debug logs, log the useful information that the crash handler knows +function crash.dbg_log_env() log_versions(log.debug) end + -- handle a crash error ---@param error string error message function crash.handler(error) @@ -31,13 +46,7 @@ function crash.handler(error) log.info("=====> FATAL SOFTWARE FAULT <=====") log.fatal(error) log.info("----------------------------------") - log.info(util.c("RUNTIME: ", _HOST)) - log.info(util.c("LUA VERSION: ", _VERSION)) - log.info(util.c("APPLICATION: ", app)) - log.info(util.c("FIRMWARE VERSION: ", ver)) - log.info(util.c("COMMS VERSION: ", comms.version)) - if has_graphics then log.info(util.c("GRAPHICS VERSION: ", core.version)) end - if has_lockbox then log.info(util.c("LOCKBOX VERSION: ", lockbox.version)) end + log_versions(log.info) log.info("----------------------------------") log.info(debug.traceback("--- begin debug trace ---", 1)) log.info("--- end debug trace ---") diff --git a/supervisor/startup.lua b/supervisor/startup.lua index 4eae495..be57a70 100644 --- a/supervisor/startup.lua +++ b/supervisor/startup.lua @@ -21,7 +21,7 @@ local supervisor = require("supervisor.supervisor") local svsessions = require("supervisor.session.svsessions") -local SUPERVISOR_VERSION = "v1.3.0" +local SUPERVISOR_VERSION = "v1.3.1" local println = util.println local println_ts = util.println_ts @@ -86,6 +86,7 @@ log.info("========================================") println(">> SCADA Supervisor " .. SUPERVISOR_VERSION .. " <<") crash.set_env("supervisor", SUPERVISOR_VERSION) +crash.dbg_log_env() ---------------------------------------- -- main application From 44c6352a8c9371952007e9b1cbe60149546e3750 Mon Sep 17 00:00:00 2001 From: Mikayla Fischler Date: Sat, 23 Mar 2024 01:15:42 -0400 Subject: [PATCH 35/44] #458 changed induction matrix title text to be white in dark mode --- coordinator/startup.lua | 2 +- coordinator/ui/components/imatrix.lua | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/coordinator/startup.lua b/coordinator/startup.lua index 2f83016..7010500 100644 --- a/coordinator/startup.lua +++ b/coordinator/startup.lua @@ -22,7 +22,7 @@ local sounder = require("coordinator.sounder") local apisessions = require("coordinator.session.apisessions") -local COORDINATOR_VERSION = "v1.3.1" +local COORDINATOR_VERSION = "v1.3.2" local CHUNK_LOAD_DELAY_S = 30.0 diff --git a/coordinator/ui/components/imatrix.lua b/coordinator/ui/components/imatrix.lua index 078661a..2b80350 100644 --- a/coordinator/ui/components/imatrix.lua +++ b/coordinator/ui/components/imatrix.lua @@ -34,7 +34,8 @@ local function new_view(root, x, y, data, ps, id) local matrix = Div{parent=root,fg_bg=style.root,width=33,height=24,x=x,y=y} - local cutout_fg_bg = cpair(style.theme.bg, colors.gray) + -- black has low contrast with dark gray, so if background is black use white instead + local cutout_fg_bg = cpair(util.trinary(style.theme.bg == colors.black, colors.white, style.theme.bg), colors.gray) TextBox{parent=matrix,text=" ",width=33,height=1,x=1,y=1,fg_bg=cutout_fg_bg} TextBox{parent=matrix,text=title,alignment=ALIGN.CENTER,width=33,height=1,x=1,y=2,fg_bg=cutout_fg_bg} From bb2c07963be360ab8623b7b4c413c4245784e20f Mon Sep 17 00:00:00 2001 From: Mikayla Fischler Date: Sun, 24 Mar 2024 12:56:51 -0400 Subject: [PATCH 36/44] #457 work on blue indicator modes --- coordinator/configure.lua | 5 +- coordinator/coordinator.lua | 4 +- coordinator/startup.lua | 2 +- coordinator/ui/layout/front_panel.lua | 4 +- coordinator/ui/style.lua | 7 ++- graphics/themes.lua | 81 +++++++++++++++++++++++---- reactor-plc/configure.lua | 5 +- reactor-plc/panel/front_panel.lua | 4 +- reactor-plc/plc.lua | 4 +- reactor-plc/startup.lua | 2 +- rtu/configure.lua | 5 +- rtu/panel/front_panel.lua | 4 +- rtu/rtu.lua | 4 +- rtu/startup.lua | 2 +- supervisor/configure.lua | 5 +- supervisor/startup.lua | 2 +- supervisor/supervisor.lua | 4 +- 17 files changed, 108 insertions(+), 36 deletions(-) diff --git a/coordinator/configure.lua b/coordinator/configure.lua index 5b223e8..0206667 100644 --- a/coordinator/configure.lua +++ b/coordinator/configure.lua @@ -44,7 +44,8 @@ local RIGHT = core.ALIGN.RIGHT -- changes to the config data/format to let the user know local changes = { { "v1.2.4", { "Added temperature scale options" } }, - { "v1.2.12", { "Added main UI theme", "Added front panel UI theme", "Added color accessibility modes" } } + { "v1.2.12", { "Added main UI theme", "Added front panel UI theme", "Added color accessibility modes" } }, + { "v1.3.3", { "Added blue indicators color mode" } } } ---@class crd_configurator @@ -846,7 +847,7 @@ local function config_view(display) _ = IndLight{parent=clr_c_2,x=20,y=10,label="Warning",colors=cpair(colors.black,colors.yellow)} _ = IndLight{parent=clr_c_2,x=20,y=11,label="Bad",colors=cpair(colors.black,colors.red)} - TextBox{parent=clr_c_2,x=1,y=14,height=6,text="Note: exact color varies by theme.",fg_bg=g_lg_fg_bg} + TextBox{parent=clr_c_2,x=20,y=13,height=2,width=23,text="Note: exact color varies by theme.",fg_bg=g_lg_fg_bg} PushButton{parent=clr_c_2,x=44,y=14,min_width=6,text="Done",callback=function()clr_pane.set_value(1)end,fg_bg=nav_fg_bg,active_fg_bg=btn_act_fg_bg} diff --git a/coordinator/coordinator.lua b/coordinator/coordinator.lua index 85387b4..a8d6e5e 100644 --- a/coordinator/coordinator.lua +++ b/coordinator/coordinator.lua @@ -4,6 +4,8 @@ local ppm = require("scada-common.ppm") local util = require("scada-common.util") local types = require("scada-common.types") +local themes = require("graphics.themes") + local iocontrol = require("coordinator.iocontrol") local process = require("coordinator.process") @@ -100,7 +102,7 @@ function coordinator.load_config() cfv.assert_type_int(config.FrontPanelTheme) cfv.assert_range(config.FrontPanelTheme, 1, 2) cfv.assert_type_int(config.ColorMode) - cfv.assert_range(config.ColorMode, 1, 4) + cfv.assert_range(config.ColorMode, 1, themes.COLOR_MODE.NUM_MODES) -- Monitor Setup diff --git a/coordinator/startup.lua b/coordinator/startup.lua index 7010500..1a660f6 100644 --- a/coordinator/startup.lua +++ b/coordinator/startup.lua @@ -22,7 +22,7 @@ local sounder = require("coordinator.sounder") local apisessions = require("coordinator.session.apisessions") -local COORDINATOR_VERSION = "v1.3.2" +local COORDINATOR_VERSION = "v1.3.3" local CHUNK_LOAD_DELAY_S = 30.0 diff --git a/coordinator/ui/layout/front_panel.lua b/coordinator/ui/layout/front_panel.lua index 455e42e..ebaba12 100644 --- a/coordinator/ui/layout/front_panel.lua +++ b/coordinator/ui/layout/front_panel.lua @@ -65,8 +65,8 @@ local function init(panel, num_units) network.update(types.PANEL_LINK_STATE.DISCONNECTED) network.register(ps, "link_state", network.update) else - local nt_lnk = LEDPair{parent=system,label="NT LINKED",off=colors.red_off,c1=colors.red,c2=colors.green} - local nt_ver = LEDPair{parent=system,label="NT VERSION",off=colors.red_off,c1=colors.red,c2=colors.green} + local nt_lnk = LEDPair{parent=system,label="NT LINKED",off=colors.black,c1=colors.red,c2=colors.green} + local nt_ver = LEDPair{parent=system,label="NT VERSION",off=colors.black,c1=colors.red,c2=colors.green} nt_lnk.register(ps, "link_state", function (state) local value = 2 diff --git a/coordinator/ui/style.lua b/coordinator/ui/style.lua index 13379b7..cec21d6 100644 --- a/coordinator/ui/style.lua +++ b/coordinator/ui/style.lua @@ -89,16 +89,17 @@ style.theme = smooth_stone ---@param color_mode COLOR_MODE the color mode to use function style.set_themes(main, fp, color_mode) local colorblind = color_mode ~= themes.COLOR_MODE.STANDARD + local black_ind_off = colorblind and (color_mode ~= themes.COLOR_MODE.BLUE_IND) style.ind_bkg = colors.gray - style.ind_hi_box_bg = util.trinary(colorblind, colors.black, colors.gray) + style.ind_hi_box_bg = util.trinary(black_ind_off, colors.black, colors.gray) if main == themes.UI_THEME.SMOOTH_STONE then style.theme = smooth_stone - style.ind_bkg = util.trinary(colorblind, colors.black, colors.gray) + style.ind_bkg = util.trinary(black_ind_off, colors.black, colors.gray) elseif main == themes.UI_THEME.DEEPSLATE then style.theme = deepslate - style.ind_hi_box_bg = util.trinary(colorblind, colors.black, colors.lightGray) + style.ind_hi_box_bg = util.trinary(black_ind_off, colors.black, colors.lightGray) end style.colorblind = colorblind diff --git a/graphics/themes.lua b/graphics/themes.lua index b59b504..e7bf00f 100644 --- a/graphics/themes.lua +++ b/graphics/themes.lua @@ -54,14 +54,19 @@ themes.COLOR_MODE = { STANDARD = 1, DEUTERANOPIA = 2, PROTANOPIA = 3, - TRITANOPIA = 4 + TRITANOPIA = 4, + BLUE_IND = 5, + BLUE_ON_BLACK = 6, + NUM_MODES = 6 } themes.COLOR_MODE_NAMES = { "Standard", "Deuteranopia", "Protanopia", - "Tritanopia" + "Tritanopia", + "Blue Standard", + "Blue + Black Off" } -- attempts to get the string name of a color mode @@ -72,7 +77,9 @@ function themes.color_mode_name(id) if id == themes.COLOR_MODE.STANDARD or id == themes.COLOR_MODE.DEUTERANOPIA or id == themes.COLOR_MODE.PROTANOPIA or - id == themes.COLOR_MODE.TRITANOPIA then + id == themes.COLOR_MODE.TRITANOPIA or + id == themes.COLOR_MODE.BLUE_IND or + id == themes.COLOR_MODE.BLUE_ON_BLACK then return themes.COLOR_MODE_NAMES[id] else return nil end end @@ -147,6 +154,20 @@ themes.sandstone = { { c = colors.yellow_off, hex = 0x141414 }, { c = colors.red, hex = 0xff0000 }, { c = colors.red_off, hex = 0x141414 } + }, + -- blue indicators + { + { c = colors.green, hex = 0x1081ff }, + { c = colors.green_hc, hex = 0x1081ff }, + { c = colors.green_off, hex = 0x053466 }, + }, + -- blue indicators, black backgrounds + { + { c = colors.green, hex = 0x1081ff }, + { c = colors.green_hc, hex = 0x1081ff }, + { c = colors.green_off, hex = 0x141414 }, + { c = colors.yellow_off, hex = 0x141414 }, + { c = colors.red_off, hex = 0x141414 } } } } @@ -180,8 +201,8 @@ themes.basalt = { { c = colors.white, hex = 0xbfbfbf }, { c = colors.lightGray, hex = 0x848794 }, { c = colors.gray, hex = 0x5c5f68 }, - { c = colors.black, hex = 0x262626 }, - { c = colors.red_off, hex = 0x653839 } + { c = colors.black, hex = 0x333333 }, + { c = colors.red_off, hex = 0x512d2d } }, color_modes = { @@ -216,6 +237,20 @@ themes.basalt = { { c = colors.yellow_off, hex = 0x333333 }, { c = colors.red, hex = 0xdf4949 }, { c = colors.red_off, hex = 0x333333 } + }, + -- blue indicators + { + { c = colors.green, hex = 0x65aeff }, + { c = colors.green_hc, hex = 0x99c9ff }, + { c = colors.green_off, hex = 0x365e8a }, + }, + -- blue indicators, black backgrounds + { + { c = colors.green, hex = 0x65aeff }, + { c = colors.green_hc, hex = 0x99c9ff }, + { c = colors.green_off, hex = 0x333333 }, + { c = colors.yellow_off, hex = 0x333333 }, + { c = colors.red_off, hex = 0x333333 } } } } @@ -272,19 +307,31 @@ themes.smooth_stone = { { { c = colors.blue, hex = 0x1081ff }, { c = colors.yellow, hex = 0xf7c311 }, - { c = colors.red, hex = 0xfb5615 }, + { c = colors.red, hex = 0xfb5615 } }, -- protanopia { { c = colors.blue, hex = 0x1081ff }, { c = colors.yellow, hex = 0xf5e633 }, - { c = colors.red, hex = 0xff521a }, + { c = colors.red, hex = 0xff521a } }, -- tritanopia { { c = colors.blue, hex = 0x40cbd7 }, { c = colors.yellow, hex = 0xffbc00 }, - { c = colors.red, hex = 0xff0000 }, + { c = colors.red, hex = 0xff0000 } + }, + -- blue indicators + { + { c = colors.blue, hex = 0x1081ff }, + { c = colors.yellow, hex = 0xfffc79 }, + { c = colors.red, hex = 0xdf4949 } + }, + -- blue indicators, black backgrounds + { + { c = colors.blue, hex = 0x1081ff }, + { c = colors.yellow, hex = 0xfffc79 }, + { c = colors.red, hex = 0xdf4949 } } } } @@ -318,19 +365,31 @@ themes.deepslate = { { { c = colors.blue, hex = 0x65aeff }, { c = colors.yellow, hex = 0xf7c311 }, - { c = colors.red, hex = 0xfb5615 }, + { c = colors.red, hex = 0xfb5615 } }, -- protanopia { { c = colors.blue, hex = 0x65aeff }, { c = colors.yellow, hex = 0xf5e633 }, - { c = colors.red, hex = 0xff8058 }, + { c = colors.red, hex = 0xff8058 } }, -- tritanopia { { c = colors.blue, hex = 0x00ecff }, { c = colors.yellow, hex = 0xffbc00 }, - { c = colors.red, hex = 0xdf4949 }, + { c = colors.red, hex = 0xdf4949 } + }, + -- blue indicators + { + { c = colors.blue, hex = 0x65aeff }, + { c = colors.yellow, hex = 0xd9cf81 }, + { c = colors.red, hex = 0xeb6a6c } + }, + -- blue indicators, black backgrounds + { + { c = colors.blue, hex = 0x65aeff }, + { c = colors.yellow, hex = 0xd9cf81 }, + { c = colors.red, hex = 0xeb6a6c } } } } diff --git a/reactor-plc/configure.lua b/reactor-plc/configure.lua index 7f6dce5..018df10 100644 --- a/reactor-plc/configure.lua +++ b/reactor-plc/configure.lua @@ -39,7 +39,8 @@ local RIGHT = core.ALIGN.RIGHT local changes = { { "v1.6.2", { "AuthKey minimum length is now 8 (if set)" } }, { "v1.6.8", { "ConnTimeout can now have a fractional part" } }, - { "v1.6.15", { "Added front panel UI theme", "Added color accessibility modes" } } + { "v1.6.15", { "Added front panel UI theme", "Added color accessibility modes" } }, + { "v1.7.3", { "Added blue indicators color mode" } } } ---@class plc_configurator @@ -484,7 +485,7 @@ local function config_view(display) _ = IndLight{parent=clr_c_2,x=20,y=10,label="Warning",colors=cpair(colors.black,colors.yellow)} _ = IndLight{parent=clr_c_2,x=20,y=11,label="Bad",colors=cpair(colors.black,colors.red)} - TextBox{parent=clr_c_2,x=1,y=14,height=6,text="Note: exact color varies by theme.",fg_bg=g_lg_fg_bg} + TextBox{parent=clr_c_2,x=20,y=13,height=2,width=23,text="Note: exact color varies by theme.",fg_bg=g_lg_fg_bg} PushButton{parent=clr_c_2,x=44,y=14,min_width=6,text="Done",callback=function()clr_pane.set_value(1)end,fg_bg=nav_fg_bg,active_fg_bg=btn_act_fg_bg} diff --git a/reactor-plc/panel/front_panel.lua b/reactor-plc/panel/front_panel.lua index b54cd04..67b886f 100644 --- a/reactor-plc/panel/front_panel.lua +++ b/reactor-plc/panel/front_panel.lua @@ -64,8 +64,8 @@ local function init(panel) network.update(types.PANEL_LINK_STATE.DISCONNECTED) network.register(databus.ps, "link_state", network.update) else - local nt_lnk = LEDPair{parent=system,label="NT LINKED",off=colors.red_off,c1=colors.red,c2=colors.green} - local nt_ver = LEDPair{parent=system,label="NT VERSION",off=colors.red_off,c1=colors.red,c2=colors.green} + local nt_lnk = LEDPair{parent=system,label="NT LINKED",off=colors.black,c1=colors.red,c2=colors.green} + local nt_ver = LEDPair{parent=system,label="NT VERSION",off=colors.black,c1=colors.red,c2=colors.green} local nt_col = LED{parent=system,label="NT COLLISION",colors=ind_red} nt_lnk.register(databus.ps, "link_state", function (state) diff --git a/reactor-plc/plc.lua b/reactor-plc/plc.lua index 1a6b32f..b5c299d 100644 --- a/reactor-plc/plc.lua +++ b/reactor-plc/plc.lua @@ -6,6 +6,8 @@ local rsio = require("scada-common.rsio") local types = require("scada-common.types") local util = require("scada-common.util") +local themes = require("graphics.themes") + local databus = require("reactor-plc.databus") local plc = {} @@ -84,7 +86,7 @@ function plc.load_config() cfv.assert_type_int(config.FrontPanelTheme) cfv.assert_range(config.FrontPanelTheme, 1, 2) cfv.assert_type_int(config.ColorMode) - cfv.assert_range(config.ColorMode, 1, 4) + cfv.assert_range(config.ColorMode, 1, themes.COLOR_MODE.NUM_MODES) -- check emergency coolant configuration if enabled if config.EmerCoolEnable then diff --git a/reactor-plc/startup.lua b/reactor-plc/startup.lua index da79744..ca5eb80 100644 --- a/reactor-plc/startup.lua +++ b/reactor-plc/startup.lua @@ -18,7 +18,7 @@ local plc = require("reactor-plc.plc") local renderer = require("reactor-plc.renderer") local threads = require("reactor-plc.threads") -local R_PLC_VERSION = "v1.7.2" +local R_PLC_VERSION = "v1.7.3" local println = util.println local println_ts = util.println_ts diff --git a/rtu/configure.lua b/rtu/configure.lua index 587ffeb..dc78fa9 100644 --- a/rtu/configure.lua +++ b/rtu/configure.lua @@ -77,7 +77,8 @@ assert(#PORT_DSGN == rsio.NUM_PORTS) -- changes to the config data/format to let the user know local changes = { { "v1.7.9", { "ConnTimeout can now have a fractional part" } }, - { "v1.7.15", { "Added front panel UI theme", "Added color accessibility modes" } } + { "v1.7.15", { "Added front panel UI theme", "Added color accessibility modes" } }, + { "v1.9.2", { "Added blue indicators color mode" } } } ---@class rtu_rs_definition @@ -539,7 +540,7 @@ local function config_view(display) _ = IndLight{parent=clr_c_2,x=20,y=10,label="Warning",colors=cpair(colors.black,colors.yellow)} _ = IndLight{parent=clr_c_2,x=20,y=11,label="Bad",colors=cpair(colors.black,colors.red)} - TextBox{parent=clr_c_2,x=1,y=14,height=6,text="Note: exact color varies by theme.",fg_bg=g_lg_fg_bg} + TextBox{parent=clr_c_2,x=20,y=13,height=2,width=23,text="Note: exact color varies by theme.",fg_bg=g_lg_fg_bg} PushButton{parent=clr_c_2,x=44,y=14,min_width=6,text="Done",callback=function()clr_pane.set_value(1)end,fg_bg=nav_fg_bg,active_fg_bg=btn_act_fg_bg} diff --git a/rtu/panel/front_panel.lua b/rtu/panel/front_panel.lua index d479302..a1a72b9 100644 --- a/rtu/panel/front_panel.lua +++ b/rtu/panel/front_panel.lua @@ -57,8 +57,8 @@ local function init(panel, units) network.update(types.PANEL_LINK_STATE.DISCONNECTED) network.register(databus.ps, "link_state", network.update) else - local nt_lnk = LEDPair{parent=system,label="NT LINKED",off=colors.red_off,c1=colors.red,c2=colors.green} - local nt_ver = LEDPair{parent=system,label="NT VERSION",off=colors.red_off,c1=colors.red,c2=colors.green} + local nt_lnk = LEDPair{parent=system,label="NT LINKED",off=colors.black,c1=colors.red,c2=colors.green} + local nt_ver = LEDPair{parent=system,label="NT VERSION",off=colors.black,c1=colors.red,c2=colors.green} nt_lnk.register(databus.ps, "link_state", function (state) local value = 2 diff --git a/rtu/rtu.lua b/rtu/rtu.lua index 803c9aa..7e00b98 100644 --- a/rtu/rtu.lua +++ b/rtu/rtu.lua @@ -5,6 +5,8 @@ local log = require("scada-common.log") local types = require("scada-common.types") local util = require("scada-common.util") +local themes = require("graphics.themes") + local databus = require("rtu.databus") local modbus = require("rtu.modbus") @@ -69,7 +71,7 @@ function rtu.load_config() cfv.assert_type_int(config.FrontPanelTheme) cfv.assert_range(config.FrontPanelTheme, 1, 2) cfv.assert_type_int(config.ColorMode) - cfv.assert_range(config.ColorMode, 1, 4) + cfv.assert_range(config.ColorMode, 1, themes.COLOR_MODE.NUM_MODES) cfv.assert_type_table(config.Peripherals) cfv.assert_type_table(config.Redstone) diff --git a/rtu/startup.lua b/rtu/startup.lua index 071ab40..81f2ef9 100644 --- a/rtu/startup.lua +++ b/rtu/startup.lua @@ -31,7 +31,7 @@ local sna_rtu = require("rtu.dev.sna_rtu") local sps_rtu = require("rtu.dev.sps_rtu") local turbinev_rtu = require("rtu.dev.turbinev_rtu") -local RTU_VERSION = "v1.9.1" +local RTU_VERSION = "v1.9.2" local RTU_UNIT_TYPE = types.RTU_UNIT_TYPE local RTU_UNIT_HW_STATE = databus.RTU_UNIT_HW_STATE diff --git a/supervisor/configure.lua b/supervisor/configure.lua index f9bc10d..130ff5c 100644 --- a/supervisor/configure.lua +++ b/supervisor/configure.lua @@ -36,7 +36,8 @@ local RIGHT = core.ALIGN.RIGHT -- changes to the config data/format to let the user know local changes = { - { "v1.2.12", { "Added front panel UI theme", "Added color accessibility modes" } } + { "v1.2.12", { "Added front panel UI theme", "Added color accessibility modes" } }, + { "v1.3.2", { "Added blue indicators color mode" } } } ---@class svr_configurator @@ -783,7 +784,7 @@ local function config_view(display) _ = IndLight{parent=clr_c_2,x=20,y=10,label="Warning",colors=cpair(colors.black,colors.yellow)} _ = IndLight{parent=clr_c_2,x=20,y=11,label="Bad",colors=cpair(colors.black,colors.red)} - TextBox{parent=clr_c_2,x=1,y=14,height=6,text="Note: exact color varies by theme.",fg_bg=g_lg_fg_bg} + TextBox{parent=clr_c_2,x=20,y=13,height=2,width=23,text="Note: exact color varies by theme.",fg_bg=g_lg_fg_bg} PushButton{parent=clr_c_2,x=44,y=14,min_width=6,text="Done",callback=function()clr_pane.set_value(1)end,fg_bg=nav_fg_bg,active_fg_bg=btn_act_fg_bg} diff --git a/supervisor/startup.lua b/supervisor/startup.lua index be57a70..cdb2110 100644 --- a/supervisor/startup.lua +++ b/supervisor/startup.lua @@ -21,7 +21,7 @@ local supervisor = require("supervisor.supervisor") local svsessions = require("supervisor.session.svsessions") -local SUPERVISOR_VERSION = "v1.3.1" +local SUPERVISOR_VERSION = "v1.3.2" local println = util.println local println_ts = util.println_ts diff --git a/supervisor/supervisor.lua b/supervisor/supervisor.lua index 43536c6..3d6d7c7 100644 --- a/supervisor/supervisor.lua +++ b/supervisor/supervisor.lua @@ -2,6 +2,8 @@ local comms = require("scada-common.comms") local log = require("scada-common.log") local util = require("scada-common.util") +local themes = require("graphics.themes") + local svsessions = require("supervisor.session.svsessions") local supervisor = {} @@ -87,7 +89,7 @@ function supervisor.load_config() cfv.assert_type_int(config.FrontPanelTheme) cfv.assert_range(config.FrontPanelTheme, 1, 2) cfv.assert_type_int(config.ColorMode) - cfv.assert_range(config.ColorMode, 1, 4) + cfv.assert_range(config.ColorMode, 1, themes.COLOR_MODE.NUM_MODES) return cfv.valid() end From 2442e7f972ca74e9e64c3636894859e0437db2b3 Mon Sep 17 00:00:00 2001 From: Mikayla Fischler Date: Sun, 24 Mar 2024 13:03:48 -0400 Subject: [PATCH 37/44] #457 added ind_bkg for front panels --- coordinator/ui/layout/front_panel.lua | 6 +++--- reactor-plc/panel/front_panel.lua | 6 +++--- reactor-plc/panel/style.lua | 4 ++++ rtu/panel/front_panel.lua | 6 +++--- rtu/panel/style.lua | 4 ++++ 5 files changed, 17 insertions(+), 9 deletions(-) diff --git a/coordinator/ui/layout/front_panel.lua b/coordinator/ui/layout/front_panel.lua index ebaba12..d23712b 100644 --- a/coordinator/ui/layout/front_panel.lua +++ b/coordinator/ui/layout/front_panel.lua @@ -61,12 +61,12 @@ local function init(panel, num_units) local modem = LED{parent=system,label="MODEM",colors=led_grn} if not style.colorblind then - local network = RGBLED{parent=system,label="NETWORK",colors={colors.green,colors.red,colors.orange,colors.yellow,colors.gray}} + local network = RGBLED{parent=system,label="NETWORK",colors={colors.green,colors.red,colors.orange,colors.yellow,style.ind_bkg}} network.update(types.PANEL_LINK_STATE.DISCONNECTED) network.register(ps, "link_state", network.update) else - local nt_lnk = LEDPair{parent=system,label="NT LINKED",off=colors.black,c1=colors.red,c2=colors.green} - local nt_ver = LEDPair{parent=system,label="NT VERSION",off=colors.black,c1=colors.red,c2=colors.green} + local nt_lnk = LEDPair{parent=system,label="NT LINKED",off=style.ind_bkg,c1=colors.red,c2=colors.green} + local nt_ver = LEDPair{parent=system,label="NT VERSION",off=style.ind_bkg,c1=colors.red,c2=colors.green} nt_lnk.register(ps, "link_state", function (state) local value = 2 diff --git a/reactor-plc/panel/front_panel.lua b/reactor-plc/panel/front_panel.lua index 67b886f..ee2f3ed 100644 --- a/reactor-plc/panel/front_panel.lua +++ b/reactor-plc/panel/front_panel.lua @@ -60,12 +60,12 @@ local function init(panel) local modem = LED{parent=system,label="MODEM",colors=ind_grn} if not style.colorblind then - local network = RGBLED{parent=system,label="NETWORK",colors={colors.green,colors.red,colors.orange,colors.yellow,colors.gray}} + local network = RGBLED{parent=system,label="NETWORK",colors={colors.green,colors.red,colors.orange,colors.yellow,style.ind_bkg}} network.update(types.PANEL_LINK_STATE.DISCONNECTED) network.register(databus.ps, "link_state", network.update) else - local nt_lnk = LEDPair{parent=system,label="NT LINKED",off=colors.black,c1=colors.red,c2=colors.green} - local nt_ver = LEDPair{parent=system,label="NT VERSION",off=colors.black,c1=colors.red,c2=colors.green} + local nt_lnk = LEDPair{parent=system,label="NT LINKED",off=style.ind_bkg,c1=colors.red,c2=colors.green} + local nt_ver = LEDPair{parent=system,label="NT VERSION",off=style.ind_bkg,c1=colors.red,c2=colors.green} local nt_col = LED{parent=system,label="NT COLLISION",colors=ind_red} nt_lnk.register(databus.ps, "link_state", function (state) diff --git a/reactor-plc/panel/style.lua b/reactor-plc/panel/style.lua index 08c1192..7f5661f 100644 --- a/reactor-plc/panel/style.lua +++ b/reactor-plc/panel/style.lua @@ -2,6 +2,8 @@ -- Graphics Style Options -- +local util = require("scada-common.util") + local core = require("graphics.core") local themes = require("graphics.themes") @@ -30,6 +32,8 @@ function style.set_theme(fp, color_mode) style.fp = themes.get_fp_style(style.theme) style.colorblind = color_mode ~= themes.COLOR_MODE.STANDARD + + style.ind_bkg = util.trinary(style.colorblind and (color_mode ~= themes.COLOR_MODE.BLUE_IND), colors.black, colors.gray) end return style diff --git a/rtu/panel/front_panel.lua b/rtu/panel/front_panel.lua index a1a72b9..738ccca 100644 --- a/rtu/panel/front_panel.lua +++ b/rtu/panel/front_panel.lua @@ -53,12 +53,12 @@ local function init(panel, units) local modem = LED{parent=system,label="MODEM",colors=ind_grn} if not style.colorblind then - local network = RGBLED{parent=system,label="NETWORK",colors={colors.green,colors.red,colors.orange,colors.yellow,colors.gray}} + local network = RGBLED{parent=system,label="NETWORK",colors={colors.green,colors.red,colors.orange,colors.yellow,style.ind_bkg}} network.update(types.PANEL_LINK_STATE.DISCONNECTED) network.register(databus.ps, "link_state", network.update) else - local nt_lnk = LEDPair{parent=system,label="NT LINKED",off=colors.black,c1=colors.red,c2=colors.green} - local nt_ver = LEDPair{parent=system,label="NT VERSION",off=colors.black,c1=colors.red,c2=colors.green} + local nt_lnk = LEDPair{parent=system,label="NT LINKED",off=style.ind_bkg,c1=colors.red,c2=colors.green} + local nt_ver = LEDPair{parent=system,label="NT VERSION",off=style.ind_bkg,c1=colors.red,c2=colors.green} nt_lnk.register(databus.ps, "link_state", function (state) local value = 2 diff --git a/rtu/panel/style.lua b/rtu/panel/style.lua index a72df2a..fd5eaf4 100644 --- a/rtu/panel/style.lua +++ b/rtu/panel/style.lua @@ -2,6 +2,8 @@ -- Graphics Style Options -- +local util = require("scada-common.util") + local core = require("graphics.core") local themes = require("graphics.themes") @@ -29,6 +31,8 @@ function style.set_theme(fp, color_mode) style.fp = themes.get_fp_style(style.theme) style.colorblind = color_mode ~= themes.COLOR_MODE.STANDARD + + style.ind_bkg = util.trinary(style.colorblind and (color_mode ~= themes.COLOR_MODE.BLUE_IND), colors.black, colors.gray) end return style From 93e4590947493431d073c2472d8b629a3a13e3e6 Mon Sep 17 00:00:00 2001 From: Mikayla Fischler Date: Sun, 24 Mar 2024 13:39:24 -0400 Subject: [PATCH 38/44] #457 added standard with black off --- coordinator/configure.lua | 30 ++++++++++++++++++++---------- coordinator/ui/style.lua | 4 ++-- graphics/themes.lua | 27 +++++++++++++++++++++++---- reactor-plc/configure.lua | 30 ++++++++++++++++++++---------- reactor-plc/panel/style.lua | 4 ++-- rtu/configure.lua | 30 ++++++++++++++++++++---------- rtu/panel/style.lua | 4 ++-- supervisor/configure.lua | 30 ++++++++++++++++++++---------- supervisor/panel/style.lua | 2 +- 9 files changed, 110 insertions(+), 51 deletions(-) diff --git a/coordinator/configure.lua b/coordinator/configure.lua index 0206667..c85346a 100644 --- a/coordinator/configure.lua +++ b/coordinator/configure.lua @@ -825,29 +825,39 @@ local function config_view(display) TextBox{parent=clr_c_1,x=18,y=7,height=1,text="Front Panel Theme"} local fp_theme = RadioButton{parent=clr_c_1,x=18,y=8,default=ini_cfg.FrontPanelTheme,options=themes.FP_THEME_NAMES,callback=function()end,radio_colors=cpair(colors.lightGray,colors.black),select_color=colors.magenta} - TextBox{parent=clr_c_2,x=1,y=1,height=6,text="By default, this project uses green/red heavily to distinguish ok and not, with some indicators also using multiple colors. By selecting a color blindness below, blues will be used instead of greens on indicators and multi-color indicators will be split up as space permits."} + TextBox{parent=clr_c_2,x=1,y=1,height=6,text="By default, this project uses green/red heavily to distinguish ok and not, with some indicators also using multiple colors. By selecting a color mode below, indicators will change as shown and multi-color ones will be split up where possible."} + + TextBox{parent=clr_c_2,x=21,y=7,height=1,text="Preview"} + local _ = IndLight{parent=clr_c_2,x=21,y=8,label="Good",colors=cpair(colors.black,colors.green)} + _ = IndLight{parent=clr_c_2,x=21,y=9,label="Warning",colors=cpair(colors.black,colors.yellow)} + _ = IndLight{parent=clr_c_2,x=21,y=10,label="Bad",colors=cpair(colors.black,colors.red)} + local b_off = IndLight{parent=clr_c_2,x=21,y=11,label="Off",colors=cpair(colors.black,colors.black),hidden=true} + local g_off = IndLight{parent=clr_c_2,x=21,y=11,label="Off",colors=cpair(colors.gray,colors.gray),hidden=true} local function recolor(value) local c = themes.smooth_stone.color_modes[value] - if value == 1 then + if value == themes.COLOR_MODE.STANDARD or value == themes.COLOR_MODE.STD_ON_BLACK then for i = 1, #style.colors do term.setPaletteColor(style.colors[i].c, style.colors[i].hex) end else term.setPaletteColor(colors.green, c[1].hex) term.setPaletteColor(colors.yellow, c[2].hex) term.setPaletteColor(colors.red, c[3].hex) end + + if value == themes.COLOR_MODE.STANDARD or value == themes.COLOR_MODE.BLUE_IND then + b_off.hide() + g_off.show() + else + g_off.hide() + b_off.show() + end end - TextBox{parent=clr_c_2,x=1,y=8,height=1,text="Color Mode"} - local c_mode = RadioButton{parent=clr_c_2,x=1,y=9,default=ini_cfg.ColorMode,options=themes.COLOR_MODE_NAMES,callback=recolor,radio_colors=cpair(colors.lightGray,colors.black),select_color=colors.magenta} + TextBox{parent=clr_c_2,x=1,y=7,height=1,width=10,text="Color Mode"} + local c_mode = RadioButton{parent=clr_c_2,x=1,y=8,default=ini_cfg.ColorMode,options=themes.COLOR_MODE_NAMES,callback=recolor,radio_colors=cpair(colors.lightGray,colors.black),select_color=colors.magenta} - TextBox{parent=clr_c_2,x=20,y=8,height=1,text="Preview"} - local _ = IndLight{parent=clr_c_2,x=20,y=9,label="Good",colors=cpair(colors.black,colors.green)} - _ = IndLight{parent=clr_c_2,x=20,y=10,label="Warning",colors=cpair(colors.black,colors.yellow)} - _ = IndLight{parent=clr_c_2,x=20,y=11,label="Bad",colors=cpair(colors.black,colors.red)} - - TextBox{parent=clr_c_2,x=20,y=13,height=2,width=23,text="Note: exact color varies by theme.",fg_bg=g_lg_fg_bg} + TextBox{parent=clr_c_2,x=21,y=13,height=2,width=18,text="Note: exact color varies by theme.",fg_bg=g_lg_fg_bg} PushButton{parent=clr_c_2,x=44,y=14,min_width=6,text="Done",callback=function()clr_pane.set_value(1)end,fg_bg=nav_fg_bg,active_fg_bg=btn_act_fg_bg} diff --git a/coordinator/ui/style.lua b/coordinator/ui/style.lua index cec21d6..1b10106 100644 --- a/coordinator/ui/style.lua +++ b/coordinator/ui/style.lua @@ -88,8 +88,8 @@ style.theme = smooth_stone ---@param fp FP_THEME front panel theme ---@param color_mode COLOR_MODE the color mode to use function style.set_themes(main, fp, color_mode) - local colorblind = color_mode ~= themes.COLOR_MODE.STANDARD - local black_ind_off = colorblind and (color_mode ~= themes.COLOR_MODE.BLUE_IND) + local colorblind = not (color_mode == themes.COLOR_MODE.STANDARD or color_mode == themes.COLOR_MODE.STD_ON_BLACK) + local black_ind_off = color_mode ~= themes.COLOR_MODE.STANDARD and color_mode ~= themes.COLOR_MODE.BLUE_IND style.ind_bkg = colors.gray style.ind_hi_box_bg = util.trinary(black_ind_off, colors.black, colors.gray) diff --git a/graphics/themes.lua b/graphics/themes.lua index e7bf00f..7d20a60 100644 --- a/graphics/themes.lua +++ b/graphics/themes.lua @@ -56,8 +56,9 @@ themes.COLOR_MODE = { PROTANOPIA = 3, TRITANOPIA = 4, BLUE_IND = 5, - BLUE_ON_BLACK = 6, - NUM_MODES = 6 + STD_ON_BLACK = 6, + BLUE_ON_BLACK = 7, + NUM_MODES = 8 } themes.COLOR_MODE_NAMES = { @@ -65,8 +66,9 @@ themes.COLOR_MODE_NAMES = { "Deuteranopia", "Protanopia", "Tritanopia", - "Blue Standard", - "Blue + Black Off" + "Blue for 'Good'", + "Standard + Black", + "Blue + Black" } -- attempts to get the string name of a color mode @@ -79,6 +81,7 @@ function themes.color_mode_name(id) id == themes.COLOR_MODE.PROTANOPIA or id == themes.COLOR_MODE.TRITANOPIA or id == themes.COLOR_MODE.BLUE_IND or + id == themes.COLOR_MODE.STD_ON_BLACK or id == themes.COLOR_MODE.BLUE_ON_BLACK then return themes.COLOR_MODE_NAMES[id] else return nil end @@ -161,6 +164,12 @@ themes.sandstone = { { c = colors.green_hc, hex = 0x1081ff }, { c = colors.green_off, hex = 0x053466 }, }, + -- standard, black backgrounds + { + { c = colors.green_off, hex = 0x141414 }, + { c = colors.yellow_off, hex = 0x141414 }, + { c = colors.red_off, hex = 0x141414 } + }, -- blue indicators, black backgrounds { { c = colors.green, hex = 0x1081ff }, @@ -244,6 +253,12 @@ themes.basalt = { { c = colors.green_hc, hex = 0x99c9ff }, { c = colors.green_off, hex = 0x365e8a }, }, + -- standard, black backgrounds + { + { c = colors.green_off, hex = 0x333333 }, + { c = colors.yellow_off, hex = 0x333333 }, + { c = colors.red_off, hex = 0x333333 } + }, -- blue indicators, black backgrounds { { c = colors.green, hex = 0x65aeff }, @@ -327,6 +342,8 @@ themes.smooth_stone = { { c = colors.yellow, hex = 0xfffc79 }, { c = colors.red, hex = 0xdf4949 } }, + -- standard, black backgrounds + {}, -- blue indicators, black backgrounds { { c = colors.blue, hex = 0x1081ff }, @@ -385,6 +402,8 @@ themes.deepslate = { { c = colors.yellow, hex = 0xd9cf81 }, { c = colors.red, hex = 0xeb6a6c } }, + -- standard, black backgrounds + {}, -- blue indicators, black backgrounds { { c = colors.blue, hex = 0x65aeff }, diff --git a/reactor-plc/configure.lua b/reactor-plc/configure.lua index 018df10..9a8ece1 100644 --- a/reactor-plc/configure.lua +++ b/reactor-plc/configure.lua @@ -463,29 +463,39 @@ local function config_view(display) TextBox{parent=clr_c_1,x=1,y=7,height=1,text="Front Panel Theme"} local fp_theme = RadioButton{parent=clr_c_1,x=1,y=8,default=ini_cfg.FrontPanelTheme,options=themes.FP_THEME_NAMES,callback=function()end,radio_colors=cpair(colors.lightGray,colors.black),select_color=colors.magenta} - TextBox{parent=clr_c_2,x=1,y=1,height=6,text="By default, this project uses green/red heavily to distinguish ok and not, with some indicators also using multiple colors. By selecting a color blindness below, blues will be used instead of greens on indicators and multi-color indicators will be split up as space permits."} + TextBox{parent=clr_c_2,x=1,y=1,height=6,text="By default, this project uses green/red heavily to distinguish ok and not, with some indicators also using multiple colors. By selecting a color mode below, indicators will change as shown and multi-color ones will be split up where possible."} + + TextBox{parent=clr_c_2,x=21,y=7,height=1,text="Preview"} + local _ = IndLight{parent=clr_c_2,x=21,y=8,label="Good",colors=cpair(colors.black,colors.green)} + _ = IndLight{parent=clr_c_2,x=21,y=9,label="Warning",colors=cpair(colors.black,colors.yellow)} + _ = IndLight{parent=clr_c_2,x=21,y=10,label="Bad",colors=cpair(colors.black,colors.red)} + local b_off = IndLight{parent=clr_c_2,x=21,y=11,label="Off",colors=cpair(colors.black,colors.black),hidden=true} + local g_off = IndLight{parent=clr_c_2,x=21,y=11,label="Off",colors=cpair(colors.gray,colors.gray),hidden=true} local function recolor(value) local c = themes.smooth_stone.color_modes[value] - if value == 1 then + if value == themes.COLOR_MODE.STANDARD or value == themes.COLOR_MODE.STD_ON_BLACK then for i = 1, #style.colors do term.setPaletteColor(style.colors[i].c, style.colors[i].hex) end else term.setPaletteColor(colors.green, c[1].hex) term.setPaletteColor(colors.yellow, c[2].hex) term.setPaletteColor(colors.red, c[3].hex) end + + if value == themes.COLOR_MODE.STANDARD or value == themes.COLOR_MODE.BLUE_IND then + b_off.hide() + g_off.show() + else + g_off.hide() + b_off.show() + end end - TextBox{parent=clr_c_2,x=1,y=8,height=1,text="Color Mode"} - local c_mode = RadioButton{parent=clr_c_2,x=1,y=9,default=ini_cfg.ColorMode,options=themes.COLOR_MODE_NAMES,callback=recolor,radio_colors=cpair(colors.lightGray,colors.black),select_color=colors.magenta} + TextBox{parent=clr_c_2,x=1,y=7,height=1,width=10,text="Color Mode"} + local c_mode = RadioButton{parent=clr_c_2,x=1,y=8,default=ini_cfg.ColorMode,options=themes.COLOR_MODE_NAMES,callback=recolor,radio_colors=cpair(colors.lightGray,colors.black),select_color=colors.magenta} - TextBox{parent=clr_c_2,x=20,y=8,height=1,text="Preview"} - local _ = IndLight{parent=clr_c_2,x=20,y=9,label="Good",colors=cpair(colors.black,colors.green)} - _ = IndLight{parent=clr_c_2,x=20,y=10,label="Warning",colors=cpair(colors.black,colors.yellow)} - _ = IndLight{parent=clr_c_2,x=20,y=11,label="Bad",colors=cpair(colors.black,colors.red)} - - TextBox{parent=clr_c_2,x=20,y=13,height=2,width=23,text="Note: exact color varies by theme.",fg_bg=g_lg_fg_bg} + TextBox{parent=clr_c_2,x=21,y=13,height=2,width=18,text="Note: exact color varies by theme.",fg_bg=g_lg_fg_bg} PushButton{parent=clr_c_2,x=44,y=14,min_width=6,text="Done",callback=function()clr_pane.set_value(1)end,fg_bg=nav_fg_bg,active_fg_bg=btn_act_fg_bg} diff --git a/reactor-plc/panel/style.lua b/reactor-plc/panel/style.lua index 7f5661f..61302ae 100644 --- a/reactor-plc/panel/style.lua +++ b/reactor-plc/panel/style.lua @@ -31,9 +31,9 @@ function style.set_theme(fp, color_mode) style.fp = themes.get_fp_style(style.theme) - style.colorblind = color_mode ~= themes.COLOR_MODE.STANDARD + style.colorblind = not (color_mode == themes.COLOR_MODE.STANDARD or color_mode == themes.COLOR_MODE.STD_ON_BLACK) - style.ind_bkg = util.trinary(style.colorblind and (color_mode ~= themes.COLOR_MODE.BLUE_IND), colors.black, colors.gray) + style.ind_bkg = util.trinary(color_mode ~= themes.COLOR_MODE.STANDARD and color_mode ~= themes.COLOR_MODE.BLUE_IND, colors.black, colors.gray) end return style diff --git a/rtu/configure.lua b/rtu/configure.lua index dc78fa9..fe02d8e 100644 --- a/rtu/configure.lua +++ b/rtu/configure.lua @@ -518,29 +518,39 @@ local function config_view(display) TextBox{parent=clr_c_1,x=1,y=7,height=1,text="Front Panel Theme"} local fp_theme = RadioButton{parent=clr_c_1,x=1,y=8,default=ini_cfg.FrontPanelTheme,options=themes.FP_THEME_NAMES,callback=function()end,radio_colors=cpair(colors.lightGray,colors.black),select_color=colors.magenta} - TextBox{parent=clr_c_2,x=1,y=1,height=6,text="By default, this project uses green/red heavily to distinguish ok and not, with some indicators also using multiple colors. By selecting a color blindness below, blues will be used instead of greens on indicators and multi-color indicators will be split up as space permits."} + TextBox{parent=clr_c_2,x=1,y=1,height=6,text="By default, this project uses green/red heavily to distinguish ok and not, with some indicators also using multiple colors. By selecting a color mode below, indicators will change as shown and multi-color ones will be split up where possible."} + + TextBox{parent=clr_c_2,x=21,y=7,height=1,text="Preview"} + local _ = IndLight{parent=clr_c_2,x=21,y=8,label="Good",colors=cpair(colors.black,colors.green)} + _ = IndLight{parent=clr_c_2,x=21,y=9,label="Warning",colors=cpair(colors.black,colors.yellow)} + _ = IndLight{parent=clr_c_2,x=21,y=10,label="Bad",colors=cpair(colors.black,colors.red)} + local b_off = IndLight{parent=clr_c_2,x=21,y=11,label="Off",colors=cpair(colors.black,colors.black),hidden=true} + local g_off = IndLight{parent=clr_c_2,x=21,y=11,label="Off",colors=cpair(colors.gray,colors.gray),hidden=true} local function recolor(value) local c = themes.smooth_stone.color_modes[value] - if value == 1 then + if value == themes.COLOR_MODE.STANDARD or value == themes.COLOR_MODE.STD_ON_BLACK then for i = 1, #style.colors do term.setPaletteColor(style.colors[i].c, style.colors[i].hex) end else term.setPaletteColor(colors.green, c[1].hex) term.setPaletteColor(colors.yellow, c[2].hex) term.setPaletteColor(colors.red, c[3].hex) end + + if value == themes.COLOR_MODE.STANDARD or value == themes.COLOR_MODE.BLUE_IND then + b_off.hide() + g_off.show() + else + g_off.hide() + b_off.show() + end end - TextBox{parent=clr_c_2,x=1,y=8,height=1,text="Color Mode"} - local c_mode = RadioButton{parent=clr_c_2,x=1,y=9,default=ini_cfg.ColorMode,options=themes.COLOR_MODE_NAMES,callback=recolor,radio_colors=cpair(colors.lightGray,colors.black),select_color=colors.magenta} + TextBox{parent=clr_c_2,x=1,y=7,height=1,width=10,text="Color Mode"} + local c_mode = RadioButton{parent=clr_c_2,x=1,y=8,default=ini_cfg.ColorMode,options=themes.COLOR_MODE_NAMES,callback=recolor,radio_colors=cpair(colors.lightGray,colors.black),select_color=colors.magenta} - TextBox{parent=clr_c_2,x=20,y=8,height=1,text="Preview"} - local _ = IndLight{parent=clr_c_2,x=20,y=9,label="Good",colors=cpair(colors.black,colors.green)} - _ = IndLight{parent=clr_c_2,x=20,y=10,label="Warning",colors=cpair(colors.black,colors.yellow)} - _ = IndLight{parent=clr_c_2,x=20,y=11,label="Bad",colors=cpair(colors.black,colors.red)} - - TextBox{parent=clr_c_2,x=20,y=13,height=2,width=23,text="Note: exact color varies by theme.",fg_bg=g_lg_fg_bg} + TextBox{parent=clr_c_2,x=21,y=13,height=2,width=18,text="Note: exact color varies by theme.",fg_bg=g_lg_fg_bg} PushButton{parent=clr_c_2,x=44,y=14,min_width=6,text="Done",callback=function()clr_pane.set_value(1)end,fg_bg=nav_fg_bg,active_fg_bg=btn_act_fg_bg} diff --git a/rtu/panel/style.lua b/rtu/panel/style.lua index fd5eaf4..a815c3e 100644 --- a/rtu/panel/style.lua +++ b/rtu/panel/style.lua @@ -30,9 +30,9 @@ function style.set_theme(fp, color_mode) style.fp = themes.get_fp_style(style.theme) - style.colorblind = color_mode ~= themes.COLOR_MODE.STANDARD + style.colorblind = not (color_mode == themes.COLOR_MODE.STANDARD or color_mode == themes.COLOR_MODE.STD_ON_BLACK) - style.ind_bkg = util.trinary(style.colorblind and (color_mode ~= themes.COLOR_MODE.BLUE_IND), colors.black, colors.gray) + style.ind_bkg = util.trinary(color_mode ~= themes.COLOR_MODE.STANDARD and color_mode ~= themes.COLOR_MODE.BLUE_IND, colors.black, colors.gray) end return style diff --git a/supervisor/configure.lua b/supervisor/configure.lua index 130ff5c..86d4805 100644 --- a/supervisor/configure.lua +++ b/supervisor/configure.lua @@ -762,29 +762,39 @@ local function config_view(display) TextBox{parent=clr_c_1,x=1,y=7,height=1,text="Front Panel Theme"} local fp_theme = RadioButton{parent=clr_c_1,x=1,y=8,default=ini_cfg.FrontPanelTheme,options=themes.FP_THEME_NAMES,callback=function()end,radio_colors=cpair(colors.lightGray,colors.black),select_color=colors.magenta} - TextBox{parent=clr_c_2,x=1,y=1,height=6,text="By default, this project uses green/red heavily to distinguish ok and not, with some indicators also using multiple colors. By selecting a color blindness below, blues will be used instead of greens on indicators and multi-color indicators will be split up as space permits."} + TextBox{parent=clr_c_2,x=1,y=1,height=6,text="By default, this project uses green/red heavily to distinguish ok and not, with some indicators also using multiple colors. By selecting a color mode below, indicators will change as shown and multi-color ones will be split up where possible."} + + TextBox{parent=clr_c_2,x=21,y=7,height=1,text="Preview"} + local _ = IndLight{parent=clr_c_2,x=21,y=8,label="Good",colors=cpair(colors.black,colors.green)} + _ = IndLight{parent=clr_c_2,x=21,y=9,label="Warning",colors=cpair(colors.black,colors.yellow)} + _ = IndLight{parent=clr_c_2,x=21,y=10,label="Bad",colors=cpair(colors.black,colors.red)} + local b_off = IndLight{parent=clr_c_2,x=21,y=11,label="Off",colors=cpair(colors.black,colors.black),hidden=true} + local g_off = IndLight{parent=clr_c_2,x=21,y=11,label="Off",colors=cpair(colors.gray,colors.gray),hidden=true} local function recolor(value) local c = themes.smooth_stone.color_modes[value] - if value == 1 then + if value == themes.COLOR_MODE.STANDARD or value == themes.COLOR_MODE.STD_ON_BLACK then for i = 1, #style.colors do term.setPaletteColor(style.colors[i].c, style.colors[i].hex) end else term.setPaletteColor(colors.green, c[1].hex) term.setPaletteColor(colors.yellow, c[2].hex) term.setPaletteColor(colors.red, c[3].hex) end + + if value == themes.COLOR_MODE.STANDARD or value == themes.COLOR_MODE.BLUE_IND then + b_off.hide() + g_off.show() + else + g_off.hide() + b_off.show() + end end - TextBox{parent=clr_c_2,x=1,y=8,height=1,text="Color Mode"} - local c_mode = RadioButton{parent=clr_c_2,x=1,y=9,default=ini_cfg.ColorMode,options=themes.COLOR_MODE_NAMES,callback=recolor,radio_colors=cpair(colors.lightGray,colors.black),select_color=colors.magenta} + TextBox{parent=clr_c_2,x=1,y=7,height=1,width=10,text="Color Mode"} + local c_mode = RadioButton{parent=clr_c_2,x=1,y=8,default=ini_cfg.ColorMode,options=themes.COLOR_MODE_NAMES,callback=recolor,radio_colors=cpair(colors.lightGray,colors.black),select_color=colors.magenta} - TextBox{parent=clr_c_2,x=20,y=8,height=1,text="Preview"} - local _ = IndLight{parent=clr_c_2,x=20,y=9,label="Good",colors=cpair(colors.black,colors.green)} - _ = IndLight{parent=clr_c_2,x=20,y=10,label="Warning",colors=cpair(colors.black,colors.yellow)} - _ = IndLight{parent=clr_c_2,x=20,y=11,label="Bad",colors=cpair(colors.black,colors.red)} - - TextBox{parent=clr_c_2,x=20,y=13,height=2,width=23,text="Note: exact color varies by theme.",fg_bg=g_lg_fg_bg} + TextBox{parent=clr_c_2,x=21,y=13,height=2,width=18,text="Note: exact color varies by theme.",fg_bg=g_lg_fg_bg} PushButton{parent=clr_c_2,x=44,y=14,min_width=6,text="Done",callback=function()clr_pane.set_value(1)end,fg_bg=nav_fg_bg,active_fg_bg=btn_act_fg_bg} diff --git a/supervisor/panel/style.lua b/supervisor/panel/style.lua index a0a8bb0..083d9ce 100644 --- a/supervisor/panel/style.lua +++ b/supervisor/panel/style.lua @@ -28,7 +28,7 @@ function style.set_theme(fp, color_mode) style.fp = themes.get_fp_style(style.theme) - style.colorblind = color_mode ~= themes.COLOR_MODE.STANDARD + style.colorblind = not (color_mode == themes.COLOR_MODE.STANDARD or color_mode == themes.COLOR_MODE.STD_ON_BLACK) end return style From e1ad76a00d032d7ba0c2ef0cb1ed43e08c20a716 Mon Sep 17 00:00:00 2001 From: Mikayla Fischler Date: Sun, 24 Mar 2024 13:56:19 -0400 Subject: [PATCH 39/44] #457 fixes and adjusted text --- coordinator/configure.lua | 18 +++++++++--------- reactor-plc/configure.lua | 18 +++++++++--------- rtu/configure.lua | 18 +++++++++--------- supervisor/configure.lua | 18 +++++++++--------- 4 files changed, 36 insertions(+), 36 deletions(-) diff --git a/coordinator/configure.lua b/coordinator/configure.lua index c85346a..6ddec1b 100644 --- a/coordinator/configure.lua +++ b/coordinator/configure.lua @@ -825,7 +825,7 @@ local function config_view(display) TextBox{parent=clr_c_1,x=18,y=7,height=1,text="Front Panel Theme"} local fp_theme = RadioButton{parent=clr_c_1,x=18,y=8,default=ini_cfg.FrontPanelTheme,options=themes.FP_THEME_NAMES,callback=function()end,radio_colors=cpair(colors.lightGray,colors.black),select_color=colors.magenta} - TextBox{parent=clr_c_2,x=1,y=1,height=6,text="By default, this project uses green/red heavily to distinguish ok and not, with some indicators also using multiple colors. By selecting a color mode below, indicators will change as shown and multi-color ones will be split up where possible."} + TextBox{parent=clr_c_2,x=1,y=1,height=6,text="This system uses color heavily to distinguish ok and not, with some indicators using many colors. By selecting a mode below, indicators will change as shown. For non-standard modes, indicators with more than two colors will be split up."} TextBox{parent=clr_c_2,x=21,y=7,height=1,text="Preview"} local _ = IndLight{parent=clr_c_2,x=21,y=8,label="Good",colors=cpair(colors.black,colors.green)} @@ -837,14 +837,6 @@ local function config_view(display) local function recolor(value) local c = themes.smooth_stone.color_modes[value] - if value == themes.COLOR_MODE.STANDARD or value == themes.COLOR_MODE.STD_ON_BLACK then - for i = 1, #style.colors do term.setPaletteColor(style.colors[i].c, style.colors[i].hex) end - else - term.setPaletteColor(colors.green, c[1].hex) - term.setPaletteColor(colors.yellow, c[2].hex) - term.setPaletteColor(colors.red, c[3].hex) - end - if value == themes.COLOR_MODE.STANDARD or value == themes.COLOR_MODE.BLUE_IND then b_off.hide() g_off.show() @@ -852,6 +844,14 @@ local function config_view(display) g_off.hide() b_off.show() end + + if #c == 0 then + for i = 1, #style.colors do term.setPaletteColor(style.colors[i].c, style.colors[i].hex) end + else + term.setPaletteColor(colors.green, c[1].hex) + term.setPaletteColor(colors.yellow, c[2].hex) + term.setPaletteColor(colors.red, c[3].hex) + end end TextBox{parent=clr_c_2,x=1,y=7,height=1,width=10,text="Color Mode"} diff --git a/reactor-plc/configure.lua b/reactor-plc/configure.lua index 9a8ece1..ac80b25 100644 --- a/reactor-plc/configure.lua +++ b/reactor-plc/configure.lua @@ -463,7 +463,7 @@ local function config_view(display) TextBox{parent=clr_c_1,x=1,y=7,height=1,text="Front Panel Theme"} local fp_theme = RadioButton{parent=clr_c_1,x=1,y=8,default=ini_cfg.FrontPanelTheme,options=themes.FP_THEME_NAMES,callback=function()end,radio_colors=cpair(colors.lightGray,colors.black),select_color=colors.magenta} - TextBox{parent=clr_c_2,x=1,y=1,height=6,text="By default, this project uses green/red heavily to distinguish ok and not, with some indicators also using multiple colors. By selecting a color mode below, indicators will change as shown and multi-color ones will be split up where possible."} + TextBox{parent=clr_c_2,x=1,y=1,height=6,text="This system uses color heavily to distinguish ok and not, with some indicators using many colors. By selecting a mode below, indicators will change as shown. For non-standard modes, indicators with more than two colors will be split up."} TextBox{parent=clr_c_2,x=21,y=7,height=1,text="Preview"} local _ = IndLight{parent=clr_c_2,x=21,y=8,label="Good",colors=cpair(colors.black,colors.green)} @@ -475,14 +475,6 @@ local function config_view(display) local function recolor(value) local c = themes.smooth_stone.color_modes[value] - if value == themes.COLOR_MODE.STANDARD or value == themes.COLOR_MODE.STD_ON_BLACK then - for i = 1, #style.colors do term.setPaletteColor(style.colors[i].c, style.colors[i].hex) end - else - term.setPaletteColor(colors.green, c[1].hex) - term.setPaletteColor(colors.yellow, c[2].hex) - term.setPaletteColor(colors.red, c[3].hex) - end - if value == themes.COLOR_MODE.STANDARD or value == themes.COLOR_MODE.BLUE_IND then b_off.hide() g_off.show() @@ -490,6 +482,14 @@ local function config_view(display) g_off.hide() b_off.show() end + + if #c == 0 then + for i = 1, #style.colors do term.setPaletteColor(style.colors[i].c, style.colors[i].hex) end + else + term.setPaletteColor(colors.green, c[1].hex) + term.setPaletteColor(colors.yellow, c[2].hex) + term.setPaletteColor(colors.red, c[3].hex) + end end TextBox{parent=clr_c_2,x=1,y=7,height=1,width=10,text="Color Mode"} diff --git a/rtu/configure.lua b/rtu/configure.lua index fe02d8e..38735c5 100644 --- a/rtu/configure.lua +++ b/rtu/configure.lua @@ -518,7 +518,7 @@ local function config_view(display) TextBox{parent=clr_c_1,x=1,y=7,height=1,text="Front Panel Theme"} local fp_theme = RadioButton{parent=clr_c_1,x=1,y=8,default=ini_cfg.FrontPanelTheme,options=themes.FP_THEME_NAMES,callback=function()end,radio_colors=cpair(colors.lightGray,colors.black),select_color=colors.magenta} - TextBox{parent=clr_c_2,x=1,y=1,height=6,text="By default, this project uses green/red heavily to distinguish ok and not, with some indicators also using multiple colors. By selecting a color mode below, indicators will change as shown and multi-color ones will be split up where possible."} + TextBox{parent=clr_c_2,x=1,y=1,height=6,text="This system uses color heavily to distinguish ok and not, with some indicators using many colors. By selecting a mode below, indicators will change as shown. For non-standard modes, indicators with more than two colors will be split up."} TextBox{parent=clr_c_2,x=21,y=7,height=1,text="Preview"} local _ = IndLight{parent=clr_c_2,x=21,y=8,label="Good",colors=cpair(colors.black,colors.green)} @@ -530,14 +530,6 @@ local function config_view(display) local function recolor(value) local c = themes.smooth_stone.color_modes[value] - if value == themes.COLOR_MODE.STANDARD or value == themes.COLOR_MODE.STD_ON_BLACK then - for i = 1, #style.colors do term.setPaletteColor(style.colors[i].c, style.colors[i].hex) end - else - term.setPaletteColor(colors.green, c[1].hex) - term.setPaletteColor(colors.yellow, c[2].hex) - term.setPaletteColor(colors.red, c[3].hex) - end - if value == themes.COLOR_MODE.STANDARD or value == themes.COLOR_MODE.BLUE_IND then b_off.hide() g_off.show() @@ -545,6 +537,14 @@ local function config_view(display) g_off.hide() b_off.show() end + + if #c == 0 then + for i = 1, #style.colors do term.setPaletteColor(style.colors[i].c, style.colors[i].hex) end + else + term.setPaletteColor(colors.green, c[1].hex) + term.setPaletteColor(colors.yellow, c[2].hex) + term.setPaletteColor(colors.red, c[3].hex) + end end TextBox{parent=clr_c_2,x=1,y=7,height=1,width=10,text="Color Mode"} diff --git a/supervisor/configure.lua b/supervisor/configure.lua index 86d4805..0b278d6 100644 --- a/supervisor/configure.lua +++ b/supervisor/configure.lua @@ -762,7 +762,7 @@ local function config_view(display) TextBox{parent=clr_c_1,x=1,y=7,height=1,text="Front Panel Theme"} local fp_theme = RadioButton{parent=clr_c_1,x=1,y=8,default=ini_cfg.FrontPanelTheme,options=themes.FP_THEME_NAMES,callback=function()end,radio_colors=cpair(colors.lightGray,colors.black),select_color=colors.magenta} - TextBox{parent=clr_c_2,x=1,y=1,height=6,text="By default, this project uses green/red heavily to distinguish ok and not, with some indicators also using multiple colors. By selecting a color mode below, indicators will change as shown and multi-color ones will be split up where possible."} + TextBox{parent=clr_c_2,x=1,y=1,height=6,text="This system uses color heavily to distinguish ok and not, with some indicators using many colors. By selecting a mode below, indicators will change as shown. For non-standard modes, indicators with more than two colors will be split up."} TextBox{parent=clr_c_2,x=21,y=7,height=1,text="Preview"} local _ = IndLight{parent=clr_c_2,x=21,y=8,label="Good",colors=cpair(colors.black,colors.green)} @@ -774,14 +774,6 @@ local function config_view(display) local function recolor(value) local c = themes.smooth_stone.color_modes[value] - if value == themes.COLOR_MODE.STANDARD or value == themes.COLOR_MODE.STD_ON_BLACK then - for i = 1, #style.colors do term.setPaletteColor(style.colors[i].c, style.colors[i].hex) end - else - term.setPaletteColor(colors.green, c[1].hex) - term.setPaletteColor(colors.yellow, c[2].hex) - term.setPaletteColor(colors.red, c[3].hex) - end - if value == themes.COLOR_MODE.STANDARD or value == themes.COLOR_MODE.BLUE_IND then b_off.hide() g_off.show() @@ -789,6 +781,14 @@ local function config_view(display) g_off.hide() b_off.show() end + + if #c == 0 then + for i = 1, #style.colors do term.setPaletteColor(style.colors[i].c, style.colors[i].hex) end + else + term.setPaletteColor(colors.green, c[1].hex) + term.setPaletteColor(colors.yellow, c[2].hex) + term.setPaletteColor(colors.red, c[3].hex) + end end TextBox{parent=clr_c_2,x=1,y=7,height=1,width=10,text="Color Mode"} From 55e4e5a68b21d24d372a2cfed3b8851364608516 Mon Sep 17 00:00:00 2001 From: Mikayla Fischler Date: Sun, 24 Mar 2024 23:05:52 -0400 Subject: [PATCH 40/44] #457 fix for indicator background --- coordinator/ui/layout/front_panel.lua | 6 +++--- coordinator/ui/style.lua | 1 + 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/coordinator/ui/layout/front_panel.lua b/coordinator/ui/layout/front_panel.lua index d23712b..7124083 100644 --- a/coordinator/ui/layout/front_panel.lua +++ b/coordinator/ui/layout/front_panel.lua @@ -61,12 +61,12 @@ local function init(panel, num_units) local modem = LED{parent=system,label="MODEM",colors=led_grn} if not style.colorblind then - local network = RGBLED{parent=system,label="NETWORK",colors={colors.green,colors.red,colors.orange,colors.yellow,style.ind_bkg}} + local network = RGBLED{parent=system,label="NETWORK",colors={colors.green,colors.red,colors.orange,colors.yellow,style.fp_ind_bkg}} network.update(types.PANEL_LINK_STATE.DISCONNECTED) network.register(ps, "link_state", network.update) else - local nt_lnk = LEDPair{parent=system,label="NT LINKED",off=style.ind_bkg,c1=colors.red,c2=colors.green} - local nt_ver = LEDPair{parent=system,label="NT VERSION",off=style.ind_bkg,c1=colors.red,c2=colors.green} + local nt_lnk = LEDPair{parent=system,label="NT LINKED",off=style.fp_ind_bkg,c1=colors.red,c2=colors.green} + local nt_ver = LEDPair{parent=system,label="NT VERSION",off=style.fp_ind_bkg,c1=colors.red,c2=colors.green} nt_lnk.register(ps, "link_state", function (state) local value = 2 diff --git a/coordinator/ui/style.lua b/coordinator/ui/style.lua index 1b10106..471f5b7 100644 --- a/coordinator/ui/style.lua +++ b/coordinator/ui/style.lua @@ -92,6 +92,7 @@ function style.set_themes(main, fp, color_mode) local black_ind_off = color_mode ~= themes.COLOR_MODE.STANDARD and color_mode ~= themes.COLOR_MODE.BLUE_IND style.ind_bkg = colors.gray + style.fp_ind_bkg = util.trinary(black_ind_off, colors.black, colors.gray) style.ind_hi_box_bg = util.trinary(black_ind_off, colors.black, colors.gray) if main == themes.UI_THEME.SMOOTH_STONE then From b94c89f4ecae212a385e699388413f58a2b010fd Mon Sep 17 00:00:00 2001 From: Mikayla Fischler Date: Mon, 25 Mar 2024 10:11:35 -0400 Subject: [PATCH 41/44] #457 cleanup --- coordinator/configure.lua | 2 +- coordinator/ui/style.lua | 12 ++++++------ reactor-plc/configure.lua | 2 +- reactor-plc/panel/style.lua | 10 ++++++---- rtu/configure.lua | 2 +- rtu/panel/style.lua | 10 ++++++---- supervisor/configure.lua | 2 +- supervisor/panel/style.lua | 2 +- 8 files changed, 23 insertions(+), 19 deletions(-) diff --git a/coordinator/configure.lua b/coordinator/configure.lua index 6ddec1b..c67e7ba 100644 --- a/coordinator/configure.lua +++ b/coordinator/configure.lua @@ -45,7 +45,7 @@ local RIGHT = core.ALIGN.RIGHT local changes = { { "v1.2.4", { "Added temperature scale options" } }, { "v1.2.12", { "Added main UI theme", "Added front panel UI theme", "Added color accessibility modes" } }, - { "v1.3.3", { "Added blue indicators color mode" } } + { "v1.3.3", { "Added standard with black off state color mode", "Added blue indicator color modes" } } } ---@class crd_configurator diff --git a/coordinator/ui/style.lua b/coordinator/ui/style.lua index 471f5b7..306fe2e 100644 --- a/coordinator/ui/style.lua +++ b/coordinator/ui/style.lua @@ -88,19 +88,19 @@ style.theme = smooth_stone ---@param fp FP_THEME front panel theme ---@param color_mode COLOR_MODE the color mode to use function style.set_themes(main, fp, color_mode) - local colorblind = not (color_mode == themes.COLOR_MODE.STANDARD or color_mode == themes.COLOR_MODE.STD_ON_BLACK) - local black_ind_off = color_mode ~= themes.COLOR_MODE.STANDARD and color_mode ~= themes.COLOR_MODE.BLUE_IND + local colorblind = color_mode ~= themes.COLOR_MODE.STANDARD and color_mode ~= themes.COLOR_MODE.STD_ON_BLACK + local gray_ind_off = color_mode == themes.COLOR_MODE.STANDARD or color_mode == themes.COLOR_MODE.BLUE_IND style.ind_bkg = colors.gray - style.fp_ind_bkg = util.trinary(black_ind_off, colors.black, colors.gray) - style.ind_hi_box_bg = util.trinary(black_ind_off, colors.black, colors.gray) + style.fp_ind_bkg = util.trinary(gray_ind_off, colors.gray, colors.black) + style.ind_hi_box_bg = util.trinary(gray_ind_off, colors.gray, colors.black) if main == themes.UI_THEME.SMOOTH_STONE then style.theme = smooth_stone - style.ind_bkg = util.trinary(black_ind_off, colors.black, colors.gray) + style.ind_bkg = util.trinary(gray_ind_off, colors.gray, colors.black) elseif main == themes.UI_THEME.DEEPSLATE then style.theme = deepslate - style.ind_hi_box_bg = util.trinary(black_ind_off, colors.black, colors.lightGray) + style.ind_hi_box_bg = util.trinary(gray_ind_off, colors.lightGray, colors.black) end style.colorblind = colorblind diff --git a/reactor-plc/configure.lua b/reactor-plc/configure.lua index ac80b25..ea9036c 100644 --- a/reactor-plc/configure.lua +++ b/reactor-plc/configure.lua @@ -40,7 +40,7 @@ local changes = { { "v1.6.2", { "AuthKey minimum length is now 8 (if set)" } }, { "v1.6.8", { "ConnTimeout can now have a fractional part" } }, { "v1.6.15", { "Added front panel UI theme", "Added color accessibility modes" } }, - { "v1.7.3", { "Added blue indicators color mode" } } + { "v1.7.3", { "Added standard with black off state color mode", "Added blue indicator color modes" } } } ---@class plc_configurator diff --git a/reactor-plc/panel/style.lua b/reactor-plc/panel/style.lua index 61302ae..c170d67 100644 --- a/reactor-plc/panel/style.lua +++ b/reactor-plc/panel/style.lua @@ -2,8 +2,6 @@ -- Graphics Style Options -- -local util = require("scada-common.util") - local core = require("graphics.core") local themes = require("graphics.themes") @@ -31,9 +29,13 @@ function style.set_theme(fp, color_mode) style.fp = themes.get_fp_style(style.theme) - style.colorblind = not (color_mode == themes.COLOR_MODE.STANDARD or color_mode == themes.COLOR_MODE.STD_ON_BLACK) + style.colorblind = color_mode ~= themes.COLOR_MODE.STANDARD and color_mode ~= themes.COLOR_MODE.STD_ON_BLACK - style.ind_bkg = util.trinary(color_mode ~= themes.COLOR_MODE.STANDARD and color_mode ~= themes.COLOR_MODE.BLUE_IND, colors.black, colors.gray) + if color_mode == themes.COLOR_MODE.STANDARD or color_mode == themes.COLOR_MODE.BLUE_IND then + style.ind_bkg = colors.gray + else + style.ind_bkg = colors.black + end end return style diff --git a/rtu/configure.lua b/rtu/configure.lua index 38735c5..84ce37b 100644 --- a/rtu/configure.lua +++ b/rtu/configure.lua @@ -78,7 +78,7 @@ assert(#PORT_DSGN == rsio.NUM_PORTS) local changes = { { "v1.7.9", { "ConnTimeout can now have a fractional part" } }, { "v1.7.15", { "Added front panel UI theme", "Added color accessibility modes" } }, - { "v1.9.2", { "Added blue indicators color mode" } } + { "v1.9.2", { "Added standard with black off state color mode", "Added blue indicator color modes" } } } ---@class rtu_rs_definition diff --git a/rtu/panel/style.lua b/rtu/panel/style.lua index a815c3e..89dc302 100644 --- a/rtu/panel/style.lua +++ b/rtu/panel/style.lua @@ -2,8 +2,6 @@ -- Graphics Style Options -- -local util = require("scada-common.util") - local core = require("graphics.core") local themes = require("graphics.themes") @@ -30,9 +28,13 @@ function style.set_theme(fp, color_mode) style.fp = themes.get_fp_style(style.theme) - style.colorblind = not (color_mode == themes.COLOR_MODE.STANDARD or color_mode == themes.COLOR_MODE.STD_ON_BLACK) + style.colorblind = color_mode ~= themes.COLOR_MODE.STANDARD and color_mode ~= themes.COLOR_MODE.STD_ON_BLACK - style.ind_bkg = util.trinary(color_mode ~= themes.COLOR_MODE.STANDARD and color_mode ~= themes.COLOR_MODE.BLUE_IND, colors.black, colors.gray) + if color_mode == themes.COLOR_MODE.STANDARD or color_mode == themes.COLOR_MODE.BLUE_IND then + style.ind_bkg = colors.gray + else + style.ind_bkg = colors.black + end end return style diff --git a/supervisor/configure.lua b/supervisor/configure.lua index 0b278d6..94866fb 100644 --- a/supervisor/configure.lua +++ b/supervisor/configure.lua @@ -37,7 +37,7 @@ local RIGHT = core.ALIGN.RIGHT -- changes to the config data/format to let the user know local changes = { { "v1.2.12", { "Added front panel UI theme", "Added color accessibility modes" } }, - { "v1.3.2", { "Added blue indicators color mode" } } + { "v1.3.2", { "Added standard with black off state color mode", "Added blue indicator color modes" } } } ---@class svr_configurator diff --git a/supervisor/panel/style.lua b/supervisor/panel/style.lua index 083d9ce..f8c9311 100644 --- a/supervisor/panel/style.lua +++ b/supervisor/panel/style.lua @@ -28,7 +28,7 @@ function style.set_theme(fp, color_mode) style.fp = themes.get_fp_style(style.theme) - style.colorblind = not (color_mode == themes.COLOR_MODE.STANDARD or color_mode == themes.COLOR_MODE.STD_ON_BLACK) + style.colorblind = color_mode ~= themes.COLOR_MODE.STANDARD and color_mode ~= themes.COLOR_MODE.STD_ON_BLACK end return style From 03d2b3f0870c067fe0add29afa9f1e49b29bb1e4 Mon Sep 17 00:00:00 2001 From: Mikayla Fischler Date: Fri, 29 Mar 2024 18:31:17 -0400 Subject: [PATCH 42/44] #452 enable emergency coolant on boiler water level low when reactor can't cool --- supervisor/startup.lua | 2 +- supervisor/unitlogic.lua | 57 +++++++++++++++++++++++++--------------- 2 files changed, 37 insertions(+), 22 deletions(-) diff --git a/supervisor/startup.lua b/supervisor/startup.lua index cdb2110..960bb61 100644 --- a/supervisor/startup.lua +++ b/supervisor/startup.lua @@ -21,7 +21,7 @@ local supervisor = require("supervisor.supervisor") local svsessions = require("supervisor.session.svsessions") -local SUPERVISOR_VERSION = "v1.3.2" +local SUPERVISOR_VERSION = "v1.3.3" local println = util.println local println_ts = util.println_ts diff --git a/supervisor/unitlogic.lua b/supervisor/unitlogic.lua index f43ff03..134652c 100644 --- a/supervisor/unitlogic.lua +++ b/supervisor/unitlogic.lua @@ -730,6 +730,8 @@ end function logic.handle_redstone(self) local AISTATE = self.types.AISTATE local annunc = self.db.annunciator + local cache = self.plc_cache + local rps = cache.rps_status -- check if an alarm is active (tripped or ack'd) ---@nodiscard @@ -741,18 +743,18 @@ function logic.handle_redstone(self) -- reactor controls if self.plc_s ~= nil then - if (not self.plc_cache.rps_status.manual) and self.io_ctl.digital_read(IO.R_SCRAM) then + if (not rps.manual) and self.io_ctl.digital_read(IO.R_SCRAM) then -- reactor SCRAM requested but not yet done; perform it self.plc_s.in_queue.push_command(PLC_S_CMDS.SCRAM) end - if self.plc_cache.rps_trip and self.io_ctl.digital_read(IO.R_RESET) then + if cache.rps_trip and self.io_ctl.digital_read(IO.R_RESET) then -- reactor RPS reset requested but not yet done; perform it self.plc_s.in_queue.push_command(PLC_S_CMDS.RPS_RESET) end - if (not self.auto_engaged) and (not self.plc_cache.active) and - (not self.plc_cache.rps_trip) and self.io_ctl.digital_read(IO.R_ENABLE) then + if (not self.auto_engaged) and (not cache.active) and + (not cache.rps_trip) and self.io_ctl.digital_read(IO.R_ENABLE) then -- reactor enable requested and allowable, but not yet done; perform it self.plc_s.in_queue.push_command(PLC_S_CMDS.ENABLE) end @@ -761,25 +763,23 @@ function logic.handle_redstone(self) -- check for request to ack all alarms if self.io_ctl.digital_read(IO.U_ACK) then for i = 1, #self.db.alarm_states do - if self.db.alarm_states[i] == ALARM_STATE.TRIPPED then - self.db.alarm_states[i] = ALARM_STATE.ACKED - end + if self.db.alarm_states[i] == ALARM_STATE.TRIPPED then self.db.alarm_states[i] = ALARM_STATE.ACKED end end end -- write reactor status outputs - self.io_ctl.digital_write(IO.R_ACTIVE, self.plc_cache.active) + self.io_ctl.digital_write(IO.R_ACTIVE, cache.active) self.io_ctl.digital_write(IO.R_AUTO_CTRL, self.auto_engaged) - self.io_ctl.digital_write(IO.R_SCRAMMED, self.plc_cache.rps_trip) - self.io_ctl.digital_write(IO.R_AUTO_SCRAM, self.plc_cache.rps_status.automatic) - self.io_ctl.digital_write(IO.R_HIGH_DMG, self.plc_cache.rps_status.high_dmg) - self.io_ctl.digital_write(IO.R_HIGH_TEMP, self.plc_cache.rps_status.high_temp) - self.io_ctl.digital_write(IO.R_LOW_COOLANT, self.plc_cache.rps_status.low_cool) - self.io_ctl.digital_write(IO.R_EXCESS_HC, self.plc_cache.rps_status.ex_hcool) - self.io_ctl.digital_write(IO.R_EXCESS_WS, self.plc_cache.rps_status.ex_waste) - self.io_ctl.digital_write(IO.R_INSUFF_FUEL, self.plc_cache.rps_status.no_fuel) - self.io_ctl.digital_write(IO.R_PLC_FAULT, self.plc_cache.rps_status.fault) - self.io_ctl.digital_write(IO.R_PLC_TIMEOUT, self.plc_cache.rps_status.timeout) + self.io_ctl.digital_write(IO.R_SCRAMMED, cache.rps_trip) + self.io_ctl.digital_write(IO.R_AUTO_SCRAM, rps.automatic) + self.io_ctl.digital_write(IO.R_HIGH_DMG, rps.high_dmg) + self.io_ctl.digital_write(IO.R_HIGH_TEMP, rps.high_temp) + self.io_ctl.digital_write(IO.R_LOW_COOLANT, rps.low_cool) + self.io_ctl.digital_write(IO.R_EXCESS_HC, rps.ex_hcool) + self.io_ctl.digital_write(IO.R_EXCESS_WS, rps.ex_waste) + self.io_ctl.digital_write(IO.R_INSUFF_FUEL, rps.no_fuel) + self.io_ctl.digital_write(IO.R_PLC_FAULT, rps.fault) + self.io_ctl.digital_write(IO.R_PLC_TIMEOUT, rps.timeout) -- write unit outputs @@ -797,13 +797,28 @@ function logic.handle_redstone(self) -- Emergency Coolant -- ----------------------- - local enable_emer_cool = self.plc_cache.rps_status.low_cool or - (self.auto_engaged and annunc.CoolantLevelLow and is_active(self.alarms.ReactorOverTemp)) + local boiler_water_low = false + for i = 1, #annunc.WaterLevelLow do boiler_water_low = boiler_water_low or annunc.WaterLevelLow[i] end + + local enable_emer_cool = rps.low_cool or + (self.auto_engaged and + (annunc.CoolantLevelLow or (boiler_water_low and rps.ex_hcool)) and + is_active(self.alarms.ReactorOverTemp)) + + if enable_emer_cool and not self.emcool_opened then + log.debug(util.c(">> Emergency Coolant Enable Detail Report (Unit ", self.r_id, ") <<")) + log.debug(util.c("| CoolantLevelLow[", annunc.CoolantLevelLow, "] CoolantLevelLowLow[", rps.low_cool, "] ExcessHeatedCoolant[", rps.ex_hcool, "]")) + log.debug(util.c("| ReactorOverTemp[", AISTATE_NAMES[self.alarms.ReactorOverTemp.state], "]")) + + for i = 1, #annunc.WaterLevelLow do + log.debug(util.c("| WaterLevelLow(", i, ")[", annunc.WaterLevelLow[i], "]")) + end + end -- don't turn off emergency coolant on sufficient coolant level since it might drop again -- turn off once system is OK again -- if auto control is engaged, alarm check will SCRAM on reactor over temp so that's covered - if not self.plc_cache.rps_trip then + if not cache.rps_trip then -- set turbines to not dump steam for i = 1, #self.turbines do local session = self.turbines[i] ---@type unit_session From 659644865ad918201e9ca87a4c2f1344922b86a2 Mon Sep 17 00:00:00 2001 From: Mikayla Fischler Date: Sat, 30 Mar 2024 12:46:01 -0400 Subject: [PATCH 43/44] #449 include disconnected configured monitors in monitor list --- coordinator/configure.lua | 32 ++++++++++++++++++++++++++++++++ coordinator/startup.lua | 2 +- 2 files changed, 33 insertions(+), 1 deletion(-) diff --git a/coordinator/configure.lua b/coordinator/configure.lua index c67e7ba..32cd8c0 100644 --- a/coordinator/configure.lua +++ b/coordinator/configure.lua @@ -1246,6 +1246,10 @@ local function config_view(display) function tool_ctl.gen_mon_list() mon_list.remove_all() + local missing = { main = tmp_cfg.MainDisplay ~= nil, flow = tmp_cfg.FlowDisplay ~= nil, unit = {} } + for i = 1, tmp_cfg.UnitCount do missing.unit[i] = tmp_cfg.UnitDisplays[i] ~= nil end + + -- list connected monitors local monitors = ppm.get_monitor_list() for iface, device in pairs(monitors) do local dev = device.dev @@ -1265,11 +1269,14 @@ local function config_view(display) if tmp_cfg.MainDisplay == iface then assignment = "Main" + missing.main = false elseif tmp_cfg.FlowDisplay == iface then assignment = "Flow" + missing.flow = false else for i = 1, tmp_cfg.UnitCount do if tmp_cfg.UnitDisplays[i] == iface then + missing.unit[i] = false assignment = "Unit " .. i break end @@ -1294,6 +1301,31 @@ local function config_view(display) if assignment == "Unused" then unset.disable() end end + + local dc_list = {} -- disconnected monitor list + + if missing.main then table.insert(dc_list, { "Main", tmp_cfg.MainDisplay }) end + if missing.flow then table.insert(dc_list, { "Flow", tmp_cfg.FlowDisplay }) end + for i = 1, tmp_cfg.UnitCount do + if missing.unit[i] then table.insert(dc_list, { "Unit " .. i, tmp_cfg.UnitDisplays[i] }) end + end + + -- add monitors that are assigned but not connected + for i = 1, #dc_list do + local line = Div{parent=mon_list,x=1,y=1,height=1} + + TextBox{parent=line,x=1,y=1,width=6,height=1,text=dc_list[i][1],fg_bg=cpair(colors.blue,colors.white)} + TextBox{parent=line,x=8,y=1,height=1,text="disconnected",fg_bg=cpair(colors.red,colors.white)} + + local function unset_mon() + purge_assignments(dc_list[i][2]) + tool_ctl.gen_mon_list() + end + + TextBox{parent=line,x=33,y=1,width=4,height=1,text="?x?",fg_bg=cpair(colors.black,colors.white)} + PushButton{parent=line,x=37,y=1,min_width=5,height=1,text="SET",callback=function()end,dis_fg_bg=cpair(colors.black,colors.gray)}.disable() + PushButton{parent=line,x=42,y=1,min_width=7,height=1,text="UNSET",callback=unset_mon,fg_bg=cpair(colors.black,colors.red),active_fg_bg=btn_act_fg_bg,dis_fg_bg=cpair(colors.black,colors.gray)} + end end -- expose the auth key on the summary page diff --git a/coordinator/startup.lua b/coordinator/startup.lua index 1a660f6..bd924c2 100644 --- a/coordinator/startup.lua +++ b/coordinator/startup.lua @@ -22,7 +22,7 @@ local sounder = require("coordinator.sounder") local apisessions = require("coordinator.session.apisessions") -local COORDINATOR_VERSION = "v1.3.3" +local COORDINATOR_VERSION = "v1.3.4" local CHUNK_LOAD_DELAY_S = 30.0 From 4629e1ba2acb50ff4ee621393e9a2ac9a16c3777 Mon Sep 17 00:00:00 2001 From: Mikayla Fischler Date: Sun, 31 Mar 2024 00:03:28 -0400 Subject: [PATCH 44/44] #464 fixed color options button not appearing disabled when disabled --- coordinator/configure.lua | 2 +- coordinator/startup.lua | 2 +- reactor-plc/configure.lua | 2 +- reactor-plc/startup.lua | 2 +- rtu/configure.lua | 2 +- rtu/startup.lua | 2 +- supervisor/configure.lua | 2 +- supervisor/startup.lua | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) diff --git a/coordinator/configure.lua b/coordinator/configure.lua index 32cd8c0..54fb854 100644 --- a/coordinator/configure.lua +++ b/coordinator/configure.lua @@ -359,7 +359,7 @@ local function config_view(display) end PushButton{parent=main_page,x=2,y=17,min_width=6,text="Exit",callback=exit,fg_bg=cpair(colors.black,colors.red),active_fg_bg=btn_act_fg_bg} - tool_ctl.color_cfg = PushButton{parent=main_page,x=23,y=17,min_width=15,text="Color Options",callback=jump_color,fg_bg=nav_fg_bg,active_fg_bg=btn_act_fg_bg} + tool_ctl.color_cfg = PushButton{parent=main_page,x=23,y=17,min_width=15,text="Color Options",callback=jump_color,fg_bg=nav_fg_bg,active_fg_bg=btn_act_fg_bg,dis_fg_bg=cpair(colors.lightGray,colors.white)} PushButton{parent=main_page,x=39,y=17,min_width=12,text="Change Log",callback=function()main_pane.set_value(10)end,fg_bg=nav_fg_bg,active_fg_bg=btn_act_fg_bg} if not tool_ctl.has_config then diff --git a/coordinator/startup.lua b/coordinator/startup.lua index bd924c2..152d37b 100644 --- a/coordinator/startup.lua +++ b/coordinator/startup.lua @@ -22,7 +22,7 @@ local sounder = require("coordinator.sounder") local apisessions = require("coordinator.session.apisessions") -local COORDINATOR_VERSION = "v1.3.4" +local COORDINATOR_VERSION = "v1.3.5" local CHUNK_LOAD_DELAY_S = 30.0 diff --git a/reactor-plc/configure.lua b/reactor-plc/configure.lua index ea9036c..43db0a9 100644 --- a/reactor-plc/configure.lua +++ b/reactor-plc/configure.lua @@ -216,7 +216,7 @@ local function config_view(display) end PushButton{parent=main_page,x=2,y=17,min_width=6,text="Exit",callback=exit,fg_bg=cpair(colors.black,colors.red),active_fg_bg=btn_act_fg_bg} - tool_ctl.color_cfg = PushButton{parent=main_page,x=23,y=17,min_width=15,text="Color Options",callback=jump_color,fg_bg=nav_fg_bg,active_fg_bg=btn_act_fg_bg} + tool_ctl.color_cfg = PushButton{parent=main_page,x=23,y=17,min_width=15,text="Color Options",callback=jump_color,fg_bg=nav_fg_bg,active_fg_bg=btn_act_fg_bg,dis_fg_bg=cpair(colors.lightGray,colors.white)} PushButton{parent=main_page,x=39,y=17,min_width=12,text="Change Log",callback=function()main_pane.set_value(7)end,fg_bg=nav_fg_bg,active_fg_bg=btn_act_fg_bg} if not tool_ctl.has_config then diff --git a/reactor-plc/startup.lua b/reactor-plc/startup.lua index ca5eb80..6ad612b 100644 --- a/reactor-plc/startup.lua +++ b/reactor-plc/startup.lua @@ -18,7 +18,7 @@ local plc = require("reactor-plc.plc") local renderer = require("reactor-plc.renderer") local threads = require("reactor-plc.threads") -local R_PLC_VERSION = "v1.7.3" +local R_PLC_VERSION = "v1.7.4" local println = util.println local println_ts = util.println_ts diff --git a/rtu/configure.lua b/rtu/configure.lua index 84ce37b..7758dc2 100644 --- a/rtu/configure.lua +++ b/rtu/configure.lua @@ -322,7 +322,7 @@ local function config_view(display) end PushButton{parent=main_page,x=2,y=17,min_width=6,text="Exit",callback=exit,fg_bg=cpair(colors.black,colors.red),active_fg_bg=btn_act_fg_bg} - tool_ctl.color_cfg = PushButton{parent=main_page,x=23,y=17,min_width=15,text="Color Options",callback=jump_color,fg_bg=nav_fg_bg,active_fg_bg=btn_act_fg_bg} + tool_ctl.color_cfg = PushButton{parent=main_page,x=23,y=17,min_width=15,text="Color Options",callback=jump_color,fg_bg=nav_fg_bg,active_fg_bg=btn_act_fg_bg,dis_fg_bg=cpair(colors.lightGray,colors.white)} PushButton{parent=main_page,x=39,y=17,min_width=12,text="Change Log",callback=function()main_pane.set_value(7)end,fg_bg=nav_fg_bg,active_fg_bg=btn_act_fg_bg} if not tool_ctl.has_config then diff --git a/rtu/startup.lua b/rtu/startup.lua index 81f2ef9..4d7ecbd 100644 --- a/rtu/startup.lua +++ b/rtu/startup.lua @@ -31,7 +31,7 @@ local sna_rtu = require("rtu.dev.sna_rtu") local sps_rtu = require("rtu.dev.sps_rtu") local turbinev_rtu = require("rtu.dev.turbinev_rtu") -local RTU_VERSION = "v1.9.2" +local RTU_VERSION = "v1.9.3" local RTU_UNIT_TYPE = types.RTU_UNIT_TYPE local RTU_UNIT_HW_STATE = databus.RTU_UNIT_HW_STATE diff --git a/supervisor/configure.lua b/supervisor/configure.lua index 94866fb..cd790e7 100644 --- a/supervisor/configure.lua +++ b/supervisor/configure.lua @@ -206,7 +206,7 @@ local function config_view(display) end PushButton{parent=main_page,x=2,y=17,min_width=6,text="Exit",callback=exit,fg_bg=cpair(colors.black,colors.red),active_fg_bg=btn_act_fg_bg} - tool_ctl.color_cfg = PushButton{parent=main_page,x=23,y=17,min_width=15,text="Color Options",callback=jump_color,fg_bg=nav_fg_bg,active_fg_bg=btn_act_fg_bg} + tool_ctl.color_cfg = PushButton{parent=main_page,x=23,y=17,min_width=15,text="Color Options",callback=jump_color,fg_bg=nav_fg_bg,active_fg_bg=btn_act_fg_bg,dis_fg_bg=cpair(colors.lightGray,colors.white)} PushButton{parent=main_page,x=39,y=17,min_width=12,text="Change Log",callback=function()main_pane.set_value(7)end,fg_bg=nav_fg_bg,active_fg_bg=btn_act_fg_bg} if not tool_ctl.has_config then diff --git a/supervisor/startup.lua b/supervisor/startup.lua index 960bb61..806f7b0 100644 --- a/supervisor/startup.lua +++ b/supervisor/startup.lua @@ -21,7 +21,7 @@ local supervisor = require("supervisor.supervisor") local svsessions = require("supervisor.session.svsessions") -local SUPERVISOR_VERSION = "v1.3.3" +local SUPERVISOR_VERSION = "v1.3.4" local println = util.println local println_ts = util.println_ts