Merge pull request #459 from MikaylaFischler/457-colorblind-independent-color-accessibility-modifiers

457 colorblind independent color accessibility modifiers
This commit is contained in:
Mikayla 2024-03-25 10:13:15 -04:00 committed by GitHub
commit bea7b91ff1
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
20 changed files with 223 additions and 79 deletions

View File

@ -44,7 +44,8 @@ local RIGHT = core.ALIGN.RIGHT
-- changes to the config data/format to let the user know -- changes to the config data/format to let the user know
local changes = { 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" } } { "v1.2.12", { "Added main UI theme", "Added front panel UI theme", "Added color accessibility modes" } },
{ "v1.3.3", { "Added standard with black off state color mode", "Added blue indicator color modes" } }
} }
---@class crd_configurator ---@class crd_configurator
@ -824,12 +825,27 @@ local function config_view(display)
TextBox{parent=clr_c_1,x=18,y=7,height=1,text="Front Panel Theme"} 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} 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="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)}
_ = 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 function recolor(value)
local c = themes.smooth_stone.color_modes[value] local c = themes.smooth_stone.color_modes[value]
if value == 1 then 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
if #c == 0 then
for i = 1, #style.colors do term.setPaletteColor(style.colors[i].c, style.colors[i].hex) end for i = 1, #style.colors do term.setPaletteColor(style.colors[i].c, style.colors[i].hex) end
else else
term.setPaletteColor(colors.green, c[1].hex) term.setPaletteColor(colors.green, c[1].hex)
@ -838,15 +854,10 @@ local function config_view(display)
end end
end end
TextBox{parent=clr_c_2,x=1,y=8,height=1,text="Color Mode"} 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=9,default=ini_cfg.ColorMode,options=themes.COLOR_MODE_NAMES,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}
TextBox{parent=clr_c_2,x=20,y=8,height=1,text="Preview"} 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}
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}
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} 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}

View File

@ -4,6 +4,8 @@ local ppm = require("scada-common.ppm")
local util = require("scada-common.util") local util = require("scada-common.util")
local types = require("scada-common.types") local types = require("scada-common.types")
local themes = require("graphics.themes")
local iocontrol = require("coordinator.iocontrol") local iocontrol = require("coordinator.iocontrol")
local process = require("coordinator.process") local process = require("coordinator.process")
@ -100,7 +102,7 @@ function coordinator.load_config()
cfv.assert_type_int(config.FrontPanelTheme) cfv.assert_type_int(config.FrontPanelTheme)
cfv.assert_range(config.FrontPanelTheme, 1, 2) cfv.assert_range(config.FrontPanelTheme, 1, 2)
cfv.assert_type_int(config.ColorMode) 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 -- Monitor Setup

View File

@ -22,7 +22,7 @@ local sounder = require("coordinator.sounder")
local apisessions = require("coordinator.session.apisessions") 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 local CHUNK_LOAD_DELAY_S = 30.0

View File

@ -61,12 +61,12 @@ local function init(panel, num_units)
local modem = LED{parent=system,label="MODEM",colors=led_grn} local modem = LED{parent=system,label="MODEM",colors=led_grn}
if not style.colorblind then 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.fp_ind_bkg}}
network.update(types.PANEL_LINK_STATE.DISCONNECTED) network.update(types.PANEL_LINK_STATE.DISCONNECTED)
network.register(ps, "link_state", network.update) network.register(ps, "link_state", network.update)
else else
local nt_lnk = LEDPair{parent=system,label="NT LINKED",off=colors.red_off,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=colors.red_off,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) nt_lnk.register(ps, "link_state", function (state)
local value = 2 local value = 2

View File

@ -88,17 +88,19 @@ style.theme = smooth_stone
---@param fp FP_THEME front panel theme ---@param fp FP_THEME front panel theme
---@param color_mode COLOR_MODE the color mode to use ---@param color_mode COLOR_MODE the color mode to use
function style.set_themes(main, fp, color_mode) function style.set_themes(main, fp, color_mode)
local colorblind = color_mode ~= themes.COLOR_MODE.STANDARD 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.ind_bkg = colors.gray
style.ind_hi_box_bg = util.trinary(colorblind, 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 if main == themes.UI_THEME.SMOOTH_STONE then
style.theme = smooth_stone style.theme = smooth_stone
style.ind_bkg = util.trinary(colorblind, colors.black, colors.gray) style.ind_bkg = util.trinary(gray_ind_off, colors.gray, colors.black)
elseif main == themes.UI_THEME.DEEPSLATE then elseif main == themes.UI_THEME.DEEPSLATE then
style.theme = deepslate style.theme = deepslate
style.ind_hi_box_bg = util.trinary(colorblind, colors.black, colors.lightGray) style.ind_hi_box_bg = util.trinary(gray_ind_off, colors.lightGray, colors.black)
end end
style.colorblind = colorblind style.colorblind = colorblind

View File

@ -54,14 +54,21 @@ themes.COLOR_MODE = {
STANDARD = 1, STANDARD = 1,
DEUTERANOPIA = 2, DEUTERANOPIA = 2,
PROTANOPIA = 3, PROTANOPIA = 3,
TRITANOPIA = 4 TRITANOPIA = 4,
BLUE_IND = 5,
STD_ON_BLACK = 6,
BLUE_ON_BLACK = 7,
NUM_MODES = 8
} }
themes.COLOR_MODE_NAMES = { themes.COLOR_MODE_NAMES = {
"Standard", "Standard",
"Deuteranopia", "Deuteranopia",
"Protanopia", "Protanopia",
"Tritanopia" "Tritanopia",
"Blue for 'Good'",
"Standard + Black",
"Blue + Black"
} }
-- attempts to get the string name of a color mode -- attempts to get the string name of a color mode
@ -72,7 +79,10 @@ function themes.color_mode_name(id)
if id == themes.COLOR_MODE.STANDARD or if id == themes.COLOR_MODE.STANDARD or
id == themes.COLOR_MODE.DEUTERANOPIA or id == themes.COLOR_MODE.DEUTERANOPIA or
id == themes.COLOR_MODE.PROTANOPIA 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.STD_ON_BLACK or
id == themes.COLOR_MODE.BLUE_ON_BLACK then
return themes.COLOR_MODE_NAMES[id] return themes.COLOR_MODE_NAMES[id]
else return nil end else return nil end
end end
@ -147,6 +157,26 @@ themes.sandstone = {
{ c = colors.yellow_off, hex = 0x141414 }, { c = colors.yellow_off, hex = 0x141414 },
{ c = colors.red, hex = 0xff0000 }, { c = colors.red, hex = 0xff0000 },
{ c = colors.red_off, hex = 0x141414 } { 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 },
},
-- 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 },
{ 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 +210,8 @@ themes.basalt = {
{ c = colors.white, hex = 0xbfbfbf }, { c = colors.white, hex = 0xbfbfbf },
{ c = colors.lightGray, hex = 0x848794 }, { c = colors.lightGray, hex = 0x848794 },
{ c = colors.gray, hex = 0x5c5f68 }, { c = colors.gray, hex = 0x5c5f68 },
{ c = colors.black, hex = 0x262626 }, { c = colors.black, hex = 0x333333 },
{ c = colors.red_off, hex = 0x653839 } { c = colors.red_off, hex = 0x512d2d }
}, },
color_modes = { color_modes = {
@ -216,6 +246,26 @@ themes.basalt = {
{ c = colors.yellow_off, hex = 0x333333 }, { c = colors.yellow_off, hex = 0x333333 },
{ c = colors.red, hex = 0xdf4949 }, { c = colors.red, hex = 0xdf4949 },
{ c = colors.red_off, hex = 0x333333 } { 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 },
},
-- 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 },
{ 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 +322,33 @@ themes.smooth_stone = {
{ {
{ c = colors.blue, hex = 0x1081ff }, { c = colors.blue, hex = 0x1081ff },
{ c = colors.yellow, hex = 0xf7c311 }, { c = colors.yellow, hex = 0xf7c311 },
{ c = colors.red, hex = 0xfb5615 }, { c = colors.red, hex = 0xfb5615 }
}, },
-- protanopia -- protanopia
{ {
{ c = colors.blue, hex = 0x1081ff }, { c = colors.blue, hex = 0x1081ff },
{ c = colors.yellow, hex = 0xf5e633 }, { c = colors.yellow, hex = 0xf5e633 },
{ c = colors.red, hex = 0xff521a }, { c = colors.red, hex = 0xff521a }
}, },
-- tritanopia -- tritanopia
{ {
{ c = colors.blue, hex = 0x40cbd7 }, { c = colors.blue, hex = 0x40cbd7 },
{ c = colors.yellow, hex = 0xffbc00 }, { 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 }
},
-- standard, black backgrounds
{},
-- blue indicators, black backgrounds
{
{ c = colors.blue, hex = 0x1081ff },
{ c = colors.yellow, hex = 0xfffc79 },
{ c = colors.red, hex = 0xdf4949 }
} }
} }
} }
@ -318,19 +382,33 @@ themes.deepslate = {
{ {
{ c = colors.blue, hex = 0x65aeff }, { c = colors.blue, hex = 0x65aeff },
{ c = colors.yellow, hex = 0xf7c311 }, { c = colors.yellow, hex = 0xf7c311 },
{ c = colors.red, hex = 0xfb5615 }, { c = colors.red, hex = 0xfb5615 }
}, },
-- protanopia -- protanopia
{ {
{ c = colors.blue, hex = 0x65aeff }, { c = colors.blue, hex = 0x65aeff },
{ c = colors.yellow, hex = 0xf5e633 }, { c = colors.yellow, hex = 0xf5e633 },
{ c = colors.red, hex = 0xff8058 }, { c = colors.red, hex = 0xff8058 }
}, },
-- tritanopia -- tritanopia
{ {
{ c = colors.blue, hex = 0x00ecff }, { c = colors.blue, hex = 0x00ecff },
{ c = colors.yellow, hex = 0xffbc00 }, { 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 }
},
-- standard, black backgrounds
{},
-- blue indicators, black backgrounds
{
{ c = colors.blue, hex = 0x65aeff },
{ c = colors.yellow, hex = 0xd9cf81 },
{ c = colors.red, hex = 0xeb6a6c }
} }
} }
} }

View File

@ -39,7 +39,8 @@ local RIGHT = core.ALIGN.RIGHT
local changes = { local changes = {
{ "v1.6.2", { "AuthKey minimum length is now 8 (if set)" } }, { "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.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 standard with black off state color mode", "Added blue indicator color modes" } }
} }
---@class plc_configurator ---@class plc_configurator
@ -462,12 +463,27 @@ local function config_view(display)
TextBox{parent=clr_c_1,x=1,y=7,height=1,text="Front Panel Theme"} 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} 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="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)}
_ = 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 function recolor(value)
local c = themes.smooth_stone.color_modes[value] local c = themes.smooth_stone.color_modes[value]
if value == 1 then 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
if #c == 0 then
for i = 1, #style.colors do term.setPaletteColor(style.colors[i].c, style.colors[i].hex) end for i = 1, #style.colors do term.setPaletteColor(style.colors[i].c, style.colors[i].hex) end
else else
term.setPaletteColor(colors.green, c[1].hex) term.setPaletteColor(colors.green, c[1].hex)
@ -476,15 +492,10 @@ local function config_view(display)
end end
end end
TextBox{parent=clr_c_2,x=1,y=8,height=1,text="Color Mode"} 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=9,default=ini_cfg.ColorMode,options=themes.COLOR_MODE_NAMES,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}
TextBox{parent=clr_c_2,x=20,y=8,height=1,text="Preview"} 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}
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}
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} 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}

View File

@ -60,12 +60,12 @@ local function init(panel)
local modem = LED{parent=system,label="MODEM",colors=ind_grn} local modem = LED{parent=system,label="MODEM",colors=ind_grn}
if not style.colorblind then 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.update(types.PANEL_LINK_STATE.DISCONNECTED)
network.register(databus.ps, "link_state", network.update) network.register(databus.ps, "link_state", network.update)
else else
local nt_lnk = LEDPair{parent=system,label="NT LINKED",off=colors.red_off,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=colors.red_off,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} local nt_col = LED{parent=system,label="NT COLLISION",colors=ind_red}
nt_lnk.register(databus.ps, "link_state", function (state) nt_lnk.register(databus.ps, "link_state", function (state)

View File

@ -29,7 +29,13 @@ function style.set_theme(fp, color_mode)
style.fp = themes.get_fp_style(style.theme) style.fp = themes.get_fp_style(style.theme)
style.colorblind = color_mode ~= themes.COLOR_MODE.STANDARD style.colorblind = color_mode ~= themes.COLOR_MODE.STANDARD and color_mode ~= themes.COLOR_MODE.STD_ON_BLACK
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 end
return style return style

View File

@ -6,6 +6,8 @@ local rsio = require("scada-common.rsio")
local types = require("scada-common.types") local types = require("scada-common.types")
local util = require("scada-common.util") local util = require("scada-common.util")
local themes = require("graphics.themes")
local databus = require("reactor-plc.databus") local databus = require("reactor-plc.databus")
local plc = {} local plc = {}
@ -84,7 +86,7 @@ function plc.load_config()
cfv.assert_type_int(config.FrontPanelTheme) cfv.assert_type_int(config.FrontPanelTheme)
cfv.assert_range(config.FrontPanelTheme, 1, 2) cfv.assert_range(config.FrontPanelTheme, 1, 2)
cfv.assert_type_int(config.ColorMode) 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 -- check emergency coolant configuration if enabled
if config.EmerCoolEnable then if config.EmerCoolEnable then

View File

@ -18,7 +18,7 @@ local plc = require("reactor-plc.plc")
local renderer = require("reactor-plc.renderer") local renderer = require("reactor-plc.renderer")
local threads = require("reactor-plc.threads") 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 = util.println
local println_ts = util.println_ts local println_ts = util.println_ts

View File

@ -77,7 +77,8 @@ assert(#PORT_DSGN == rsio.NUM_PORTS)
-- changes to the config data/format to let the user know -- changes to the config data/format to let the user know
local changes = { 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" } } { "v1.7.15", { "Added front panel UI theme", "Added color accessibility modes" } },
{ "v1.9.2", { "Added standard with black off state color mode", "Added blue indicator color modes" } }
} }
---@class rtu_rs_definition ---@class rtu_rs_definition
@ -517,12 +518,27 @@ local function config_view(display)
TextBox{parent=clr_c_1,x=1,y=7,height=1,text="Front Panel Theme"} 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} 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="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)}
_ = 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 function recolor(value)
local c = themes.smooth_stone.color_modes[value] local c = themes.smooth_stone.color_modes[value]
if value == 1 then 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
if #c == 0 then
for i = 1, #style.colors do term.setPaletteColor(style.colors[i].c, style.colors[i].hex) end for i = 1, #style.colors do term.setPaletteColor(style.colors[i].c, style.colors[i].hex) end
else else
term.setPaletteColor(colors.green, c[1].hex) term.setPaletteColor(colors.green, c[1].hex)
@ -531,15 +547,10 @@ local function config_view(display)
end end
end end
TextBox{parent=clr_c_2,x=1,y=8,height=1,text="Color Mode"} 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=9,default=ini_cfg.ColorMode,options=themes.COLOR_MODE_NAMES,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}
TextBox{parent=clr_c_2,x=20,y=8,height=1,text="Preview"} 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}
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}
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} 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}

View File

@ -53,12 +53,12 @@ local function init(panel, units)
local modem = LED{parent=system,label="MODEM",colors=ind_grn} local modem = LED{parent=system,label="MODEM",colors=ind_grn}
if not style.colorblind then 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.update(types.PANEL_LINK_STATE.DISCONNECTED)
network.register(databus.ps, "link_state", network.update) network.register(databus.ps, "link_state", network.update)
else else
local nt_lnk = LEDPair{parent=system,label="NT LINKED",off=colors.red_off,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=colors.red_off,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) nt_lnk.register(databus.ps, "link_state", function (state)
local value = 2 local value = 2

View File

@ -28,7 +28,13 @@ function style.set_theme(fp, color_mode)
style.fp = themes.get_fp_style(style.theme) style.fp = themes.get_fp_style(style.theme)
style.colorblind = color_mode ~= themes.COLOR_MODE.STANDARD style.colorblind = color_mode ~= themes.COLOR_MODE.STANDARD and color_mode ~= themes.COLOR_MODE.STD_ON_BLACK
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 end
return style return style

View File

@ -5,6 +5,8 @@ local log = require("scada-common.log")
local types = require("scada-common.types") local types = require("scada-common.types")
local util = require("scada-common.util") local util = require("scada-common.util")
local themes = require("graphics.themes")
local databus = require("rtu.databus") local databus = require("rtu.databus")
local modbus = require("rtu.modbus") local modbus = require("rtu.modbus")
@ -69,7 +71,7 @@ function rtu.load_config()
cfv.assert_type_int(config.FrontPanelTheme) cfv.assert_type_int(config.FrontPanelTheme)
cfv.assert_range(config.FrontPanelTheme, 1, 2) cfv.assert_range(config.FrontPanelTheme, 1, 2)
cfv.assert_type_int(config.ColorMode) 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.Peripherals)
cfv.assert_type_table(config.Redstone) cfv.assert_type_table(config.Redstone)

View File

@ -31,7 +31,7 @@ local sna_rtu = require("rtu.dev.sna_rtu")
local sps_rtu = require("rtu.dev.sps_rtu") local sps_rtu = require("rtu.dev.sps_rtu")
local turbinev_rtu = require("rtu.dev.turbinev_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_TYPE = types.RTU_UNIT_TYPE
local RTU_UNIT_HW_STATE = databus.RTU_UNIT_HW_STATE local RTU_UNIT_HW_STATE = databus.RTU_UNIT_HW_STATE

View File

@ -36,7 +36,8 @@ local RIGHT = core.ALIGN.RIGHT
-- changes to the config data/format to let the user know -- 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" } } { "v1.2.12", { "Added front panel UI theme", "Added color accessibility modes" } },
{ "v1.3.2", { "Added standard with black off state color mode", "Added blue indicator color modes" } }
} }
---@class svr_configurator ---@class svr_configurator
@ -761,12 +762,27 @@ local function config_view(display)
TextBox{parent=clr_c_1,x=1,y=7,height=1,text="Front Panel Theme"} 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} 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="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)}
_ = 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 function recolor(value)
local c = themes.smooth_stone.color_modes[value] local c = themes.smooth_stone.color_modes[value]
if value == 1 then 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
if #c == 0 then
for i = 1, #style.colors do term.setPaletteColor(style.colors[i].c, style.colors[i].hex) end for i = 1, #style.colors do term.setPaletteColor(style.colors[i].c, style.colors[i].hex) end
else else
term.setPaletteColor(colors.green, c[1].hex) term.setPaletteColor(colors.green, c[1].hex)
@ -775,15 +791,10 @@ local function config_view(display)
end end
end end
TextBox{parent=clr_c_2,x=1,y=8,height=1,text="Color Mode"} 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=9,default=ini_cfg.ColorMode,options=themes.COLOR_MODE_NAMES,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}
TextBox{parent=clr_c_2,x=20,y=8,height=1,text="Preview"} 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}
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}
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} 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}

View File

@ -28,7 +28,7 @@ function style.set_theme(fp, color_mode)
style.fp = themes.get_fp_style(style.theme) style.fp = themes.get_fp_style(style.theme)
style.colorblind = color_mode ~= themes.COLOR_MODE.STANDARD style.colorblind = color_mode ~= themes.COLOR_MODE.STANDARD and color_mode ~= themes.COLOR_MODE.STD_ON_BLACK
end end
return style return style

View File

@ -21,7 +21,7 @@ local supervisor = require("supervisor.supervisor")
local svsessions = require("supervisor.session.svsessions") local svsessions = require("supervisor.session.svsessions")
local SUPERVISOR_VERSION = "v1.3.1" local SUPERVISOR_VERSION = "v1.3.2"
local println = util.println local println = util.println
local println_ts = util.println_ts local println_ts = util.println_ts

View File

@ -2,6 +2,8 @@ local comms = require("scada-common.comms")
local log = require("scada-common.log") local log = require("scada-common.log")
local util = require("scada-common.util") local util = require("scada-common.util")
local themes = require("graphics.themes")
local svsessions = require("supervisor.session.svsessions") local svsessions = require("supervisor.session.svsessions")
local supervisor = {} local supervisor = {}
@ -87,7 +89,7 @@ function supervisor.load_config()
cfv.assert_type_int(config.FrontPanelTheme) cfv.assert_type_int(config.FrontPanelTheme)
cfv.assert_range(config.FrontPanelTheme, 1, 2) cfv.assert_range(config.FrontPanelTheme, 1, 2)
cfv.assert_type_int(config.ColorMode) 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() return cfv.valid()
end end