Merge branch 'devel' into pocket-alpha-dev
This commit is contained in:
commit
86dc92f09a
@ -234,19 +234,23 @@ function hmi.create(tool_ctl, main_pane, cfg_sys, divs, style)
|
|||||||
|
|
||||||
TextBox{parent=crd_cfg,x=1,y=2,text=" Coordinator UI Configuration",fg_bg=cpair(colors.black,colors.lime)}
|
TextBox{parent=crd_cfg,x=1,y=2,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."}
|
TextBox{parent=crd_c_1,x=1,y=1,height=2,text="You can customize the UI with the interface options below."}
|
||||||
|
|
||||||
TextBox{parent=crd_c_1,x=1,y=4,text="Clock Time Format"}
|
TextBox{parent=crd_c_1,x=1,y=4,text="Clock Time Format"}
|
||||||
tool_ctl.clock_fmt = RadioButton{parent=crd_c_1,x=1,y=5,default=util.trinary(ini_cfg.Time24Hour,1,2),options={"24-Hour","12-Hour"},callback=function()end,radio_colors=cpair(colors.lightGray,colors.black),select_color=colors.lime}
|
tool_ctl.clock_fmt = RadioButton{parent=crd_c_1,x=1,y=5,default=util.trinary(ini_cfg.Time24Hour,1,2),options={"24-Hour","12-Hour"},callback=function()end,radio_colors=cpair(colors.lightGray,colors.black),select_color=colors.lime}
|
||||||
|
|
||||||
|
TextBox{parent=crd_c_1,x=20,y=4,text="Po/Pu Pellet Color"}
|
||||||
|
tool_ctl.pellet_color = RadioButton{parent=crd_c_1,x=20,y=5,default=util.trinary(ini_cfg.GreenPuPellet,1,2),options={"Green Pu/Cyan Po","Cyan Pu/Green Po (Mek 10.4+)"},callback=function()end,radio_colors=cpair(colors.lightGray,colors.black),select_color=colors.lime}
|
||||||
|
|
||||||
TextBox{parent=crd_c_1,x=1,y=8,text="Temperature Scale"}
|
TextBox{parent=crd_c_1,x=1,y=8,text="Temperature Scale"}
|
||||||
tool_ctl.temp_scale = RadioButton{parent=crd_c_1,x=1,y=9,default=ini_cfg.TempScale,options=types.TEMP_SCALE_NAMES,callback=function()end,radio_colors=cpair(colors.lightGray,colors.black),select_color=colors.lime}
|
tool_ctl.temp_scale = RadioButton{parent=crd_c_1,x=1,y=9,default=ini_cfg.TempScale,options=types.TEMP_SCALE_NAMES,callback=function()end,radio_colors=cpair(colors.lightGray,colors.black),select_color=colors.lime}
|
||||||
|
|
||||||
TextBox{parent=crd_c_1,x=24,y=8,text="Energy Scale"}
|
TextBox{parent=crd_c_1,x=20,y=8,text="Energy Scale"}
|
||||||
tool_ctl.energy_scale = RadioButton{parent=crd_c_1,x=24,y=9,default=ini_cfg.EnergyScale,options=types.ENERGY_SCALE_NAMES,callback=function()end,radio_colors=cpair(colors.lightGray,colors.black),select_color=colors.lime}
|
tool_ctl.energy_scale = RadioButton{parent=crd_c_1,x=20,y=9,default=ini_cfg.EnergyScale,options=types.ENERGY_SCALE_NAMES,callback=function()end,radio_colors=cpair(colors.lightGray,colors.black),select_color=colors.lime}
|
||||||
|
|
||||||
local function submit_ui_opts()
|
local function submit_ui_opts()
|
||||||
tmp_cfg.Time24Hour = tool_ctl.clock_fmt.get_value() == 1
|
tmp_cfg.Time24Hour = tool_ctl.clock_fmt.get_value() == 1
|
||||||
|
tmp_cfg.GreenPuPellet = tool_ctl.pellet_color.get_value() == 1
|
||||||
tmp_cfg.TempScale = tool_ctl.temp_scale.get_value()
|
tmp_cfg.TempScale = tool_ctl.temp_scale.get_value()
|
||||||
tmp_cfg.EnergyScale = tool_ctl.energy_scale.get_value()
|
tmp_cfg.EnergyScale = tool_ctl.energy_scale.get_value()
|
||||||
main_pane.set_value(7)
|
main_pane.set_value(7)
|
||||||
|
|||||||
@ -380,6 +380,7 @@ function system.create(tool_ctl, main_pane, cfg_sys, divs, ext, style)
|
|||||||
try_set(tool_ctl.num_units, ini_cfg.UnitCount)
|
try_set(tool_ctl.num_units, ini_cfg.UnitCount)
|
||||||
try_set(tool_ctl.dis_flow_view, ini_cfg.DisableFlowView)
|
try_set(tool_ctl.dis_flow_view, ini_cfg.DisableFlowView)
|
||||||
try_set(tool_ctl.s_vol, ini_cfg.SpeakerVolume)
|
try_set(tool_ctl.s_vol, ini_cfg.SpeakerVolume)
|
||||||
|
try_set(tool_ctl.pellet_color, ini_cfg.GreenPuPellet)
|
||||||
try_set(tool_ctl.clock_fmt, tri(ini_cfg.Time24Hour, 1, 2))
|
try_set(tool_ctl.clock_fmt, tri(ini_cfg.Time24Hour, 1, 2))
|
||||||
try_set(tool_ctl.temp_scale, ini_cfg.TempScale)
|
try_set(tool_ctl.temp_scale, ini_cfg.TempScale)
|
||||||
try_set(tool_ctl.energy_scale, ini_cfg.EnergyScale)
|
try_set(tool_ctl.energy_scale, ini_cfg.EnergyScale)
|
||||||
@ -528,6 +529,8 @@ function system.create(tool_ctl, main_pane, cfg_sys, divs, ext, style)
|
|||||||
|
|
||||||
if f[1] == "AuthKey" then val = string.rep("*", string.len(val))
|
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] == "LogMode" then val = util.trinary(raw == log.MODE.APPEND, "append", "replace")
|
||||||
|
elseif f[1] == "GreenPuPellet" then
|
||||||
|
val = tri(raw, "Green Pu/Cyan Po", "Cyan Pu/Green Po")
|
||||||
elseif f[1] == "TempScale" then
|
elseif f[1] == "TempScale" then
|
||||||
val = util.strval(types.TEMP_SCALE_NAMES[raw])
|
val = util.strval(types.TEMP_SCALE_NAMES[raw])
|
||||||
elseif f[1] == "EnergyScale" then
|
elseif f[1] == "EnergyScale" then
|
||||||
|
|||||||
@ -35,7 +35,8 @@ 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" } },
|
{ "v1.3.3", { "Added standard with black off state color mode", "Added blue indicator color modes" } },
|
||||||
{ "v1.5.1", { "Added energy scale options" } }
|
{ "v1.5.1", { "Added energy scale options" } },
|
||||||
|
{ "v1.6.13", { "Added option for Po/Pu pellet green/cyan pairing" } }
|
||||||
}
|
}
|
||||||
|
|
||||||
---@class crd_configurator
|
---@class crd_configurator
|
||||||
@ -77,6 +78,7 @@ local tool_ctl = {
|
|||||||
-- settings elements from hmi
|
-- settings elements from hmi
|
||||||
dis_flow_view = nil, ---@type Checkbox
|
dis_flow_view = nil, ---@type Checkbox
|
||||||
s_vol = nil, ---@type NumberField
|
s_vol = nil, ---@type NumberField
|
||||||
|
pellet_color = nil, ---@type RadioButton
|
||||||
clock_fmt = nil, ---@type RadioButton
|
clock_fmt = nil, ---@type RadioButton
|
||||||
temp_scale = nil, ---@type RadioButton
|
temp_scale = nil, ---@type RadioButton
|
||||||
energy_scale = nil, ---@type RadioButton
|
energy_scale = nil, ---@type RadioButton
|
||||||
@ -95,6 +97,7 @@ local tmp_cfg = {
|
|||||||
UnitCount = 1,
|
UnitCount = 1,
|
||||||
SpeakerVolume = 1.0,
|
SpeakerVolume = 1.0,
|
||||||
Time24Hour = true,
|
Time24Hour = true,
|
||||||
|
GreenPuPellet = false,
|
||||||
TempScale = 1, ---@type TEMP_SCALE
|
TempScale = 1, ---@type TEMP_SCALE
|
||||||
EnergyScale = 1, ---@type ENERGY_SCALE
|
EnergyScale = 1, ---@type ENERGY_SCALE
|
||||||
DisableFlowView = false,
|
DisableFlowView = false,
|
||||||
@ -129,6 +132,7 @@ local fields = {
|
|||||||
{ "UnitDisplays", "Unit Monitors", {} },
|
{ "UnitDisplays", "Unit Monitors", {} },
|
||||||
{ "SpeakerVolume", "Speaker Volume", 1.0 },
|
{ "SpeakerVolume", "Speaker Volume", 1.0 },
|
||||||
{ "Time24Hour", "Use 24-hour Time Format", true },
|
{ "Time24Hour", "Use 24-hour Time Format", true },
|
||||||
|
{ "GreenPuPellet", "Pellet Colors", false },
|
||||||
{ "TempScale", "Temperature Scale", types.TEMP_SCALE.KELVIN },
|
{ "TempScale", "Temperature Scale", types.TEMP_SCALE.KELVIN },
|
||||||
{ "EnergyScale", "Energy Scale", types.ENERGY_SCALE.FE },
|
{ "EnergyScale", "Energy Scale", types.ENERGY_SCALE.FE },
|
||||||
{ "DisableFlowView", "Disable Flow Monitor (legacy, discouraged)", false },
|
{ "DisableFlowView", "Disable Flow Monitor (legacy, discouraged)", false },
|
||||||
|
|||||||
@ -38,6 +38,7 @@ function coordinator.load_config()
|
|||||||
config.UnitCount = settings.get("UnitCount")
|
config.UnitCount = settings.get("UnitCount")
|
||||||
config.SpeakerVolume = settings.get("SpeakerVolume")
|
config.SpeakerVolume = settings.get("SpeakerVolume")
|
||||||
config.Time24Hour = settings.get("Time24Hour")
|
config.Time24Hour = settings.get("Time24Hour")
|
||||||
|
config.GreenPuPellet = settings.get("GreenPuPellet")
|
||||||
config.TempScale = settings.get("TempScale")
|
config.TempScale = settings.get("TempScale")
|
||||||
config.EnergyScale = settings.get("EnergyScale")
|
config.EnergyScale = settings.get("EnergyScale")
|
||||||
|
|
||||||
@ -67,6 +68,7 @@ function coordinator.load_config()
|
|||||||
cfv.assert_type_int(config.UnitCount)
|
cfv.assert_type_int(config.UnitCount)
|
||||||
cfv.assert_range(config.UnitCount, 1, 4)
|
cfv.assert_range(config.UnitCount, 1, 4)
|
||||||
cfv.assert_type_bool(config.Time24Hour)
|
cfv.assert_type_bool(config.Time24Hour)
|
||||||
|
cfv.assert_type_bool(config.GreenPuPellet)
|
||||||
cfv.assert_type_int(config.TempScale)
|
cfv.assert_type_int(config.TempScale)
|
||||||
cfv.assert_range(config.TempScale, 1, 4)
|
cfv.assert_range(config.TempScale, 1, 4)
|
||||||
cfv.assert_type_int(config.EnergyScale)
|
cfv.assert_type_int(config.EnergyScale)
|
||||||
|
|||||||
@ -19,7 +19,7 @@ local renderer = require("coordinator.renderer")
|
|||||||
local sounder = require("coordinator.sounder")
|
local sounder = require("coordinator.sounder")
|
||||||
local threads = require("coordinator.threads")
|
local threads = require("coordinator.threads")
|
||||||
|
|
||||||
local COORDINATOR_VERSION = "v1.6.11"
|
local COORDINATOR_VERSION = "v1.6.14"
|
||||||
|
|
||||||
local CHUNK_LOAD_DELAY_S = 30.0
|
local CHUNK_LOAD_DELAY_S = 30.0
|
||||||
|
|
||||||
|
|||||||
@ -325,7 +325,7 @@ local function new_view(root, x, y)
|
|||||||
|
|
||||||
TextBox{parent=waste_status,y=i,text="U"..i.." Waste",width=8}
|
TextBox{parent=waste_status,y=i,text="U"..i.." Waste",width=8}
|
||||||
local a_waste = IndicatorLight{parent=waste_status,x=10,y=i,label="Auto",colors=ind_wht}
|
local a_waste = IndicatorLight{parent=waste_status,x=10,y=i,label="Auto",colors=ind_wht}
|
||||||
local waste_m = StateIndicator{parent=waste_status,x=17,y=i,states=style.waste.states_abbrv,value=1,min_width=6}
|
local waste_m = StateIndicator{parent=waste_status,x=17,y=i,states=style.get_waste().states_abbrv,value=1,min_width=6}
|
||||||
|
|
||||||
a_waste.register(unit.unit_ps, "U_AutoWaste", a_waste.update)
|
a_waste.register(unit.unit_ps, "U_AutoWaste", a_waste.update)
|
||||||
waste_m.register(unit.unit_ps, "U_WasteProduct", waste_m.update)
|
waste_m.register(unit.unit_ps, "U_WasteProduct", waste_m.update)
|
||||||
@ -339,11 +339,11 @@ local function new_view(root, x, y)
|
|||||||
TextBox{parent=waste_sel,text="WASTE PRODUCTION",alignment=ALIGN.CENTER,width=21,x=1,y=2,fg_bg=cutout_fg_bg}
|
TextBox{parent=waste_sel,text="WASTE PRODUCTION",alignment=ALIGN.CENTER,width=21,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 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}
|
local status = StateIndicator{parent=rect,x=2,y=1,states=style.get_waste().states,value=1,min_width=17}
|
||||||
|
|
||||||
status.register(facility.ps, "current_waste_product", status.update)
|
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 waste_prod = RadioButton{parent=rect,x=2,y=3,options=style.get_waste().options,callback=process.set_process_waste,radio_colors=cpair(style.theme.accent_dark,style.theme.accent_light),select_color=colors.brown}
|
||||||
|
|
||||||
waste_prod.register(facility.ps, "process_waste_product", waste_prod.set_value)
|
waste_prod.register(facility.ps, "process_waste_product", waste_prod.set_value)
|
||||||
|
|
||||||
|
|||||||
@ -398,7 +398,7 @@ local function init(parent, id)
|
|||||||
local waste_proc = Rectangle{parent=main,border=border(1,colors.brown,true),thin=true,width=33,height=3,x=46,y=49}
|
local waste_proc = Rectangle{parent=main,border=border(1,colors.brown,true),thin=true,width=33,height=3,x=46,y=49}
|
||||||
local waste_div = Div{parent=waste_proc,x=2,y=1,width=31,height=1}
|
local waste_div = Div{parent=waste_proc,x=2,y=1,width=31,height=1}
|
||||||
|
|
||||||
local waste_mode = MultiButton{parent=waste_div,x=1,y=1,options=style.waste.unit_opts,callback=unit.set_waste,min_width=6}
|
local waste_mode = MultiButton{parent=waste_div,x=1,y=1,options=style.get_waste().unit_opts,callback=unit.set_waste,min_width=6}
|
||||||
|
|
||||||
waste_mode.register(u_ps, "U_WasteMode", waste_mode.set_value)
|
waste_mode.register(u_ps, "U_WasteMode", waste_mode.set_value)
|
||||||
|
|
||||||
|
|||||||
@ -179,12 +179,12 @@ local function make(parent, x, y, wide, unit_id)
|
|||||||
pipe(_wide(22, 19), 1, _wide(49, 45), 1, colors.brown, true),
|
pipe(_wide(22, 19), 1, _wide(49, 45), 1, colors.brown, true),
|
||||||
pipe(_wide(22, 19), 5, _wide(28, 24), 5, colors.brown, true),
|
pipe(_wide(22, 19), 5, _wide(28, 24), 5, colors.brown, true),
|
||||||
|
|
||||||
pipe(_wide(64, 53), 1, _wide(95, 81), 1, colors.green, true),
|
pipe(_wide(64, 53), 1, _wide(95, 81), 1, colors.cyan, true),
|
||||||
|
|
||||||
pipe(_wide(48, 43), 4, _wide(71, 61), 4, colors.cyan, true),
|
pipe(_wide(48, 43), 4, _wide(71, 61), 4, colors.green, true),
|
||||||
pipe(_wide(66, 57), 4, _wide(71, 61), 8, colors.cyan, true),
|
pipe(_wide(66, 57), 4, _wide(71, 61), 8, colors.green, true),
|
||||||
pipe(_wide(74, 63), 4, _wide(95, 81), 4, colors.cyan, true),
|
pipe(_wide(74, 63), 4, _wide(95, 81), 4, colors.green, true),
|
||||||
pipe(_wide(74, 63), 8, _wide(133, 111), 8, colors.cyan, true),
|
pipe(_wide(74, 63), 8, _wide(133, 111), 8, colors.green, true),
|
||||||
|
|
||||||
pipe(_wide(108, 94), 1, _wide(132, 110), 6, waste_c, 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(108, 94), 4, _wide(111, 95), 1, waste_c, true, true),
|
||||||
|
|||||||
@ -268,7 +268,7 @@ local function init(main)
|
|||||||
for i = 1, facility.num_units do
|
for i = 1, facility.num_units do
|
||||||
local y_offset = y_ofs(i)
|
local y_offset = y_ofs(i)
|
||||||
unit_flow(main, flow_x, 5 + y_offset, #emcool_pipes == 0, i)
|
unit_flow(main, flow_x, 5 + y_offset, #emcool_pipes == 0, i)
|
||||||
table.insert(po_pipes, pipe(0, 3 + y_offset, 4, 0, colors.cyan, true, true))
|
table.insert(po_pipes, pipe(0, 3 + y_offset, 4, 0, colors.green, true, true))
|
||||||
util.nop()
|
util.nop()
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
@ -2,16 +2,20 @@
|
|||||||
-- Graphics Style Options
|
-- Graphics Style Options
|
||||||
--
|
--
|
||||||
|
|
||||||
local util = require("scada-common.util")
|
local util = require("scada-common.util")
|
||||||
|
|
||||||
local core = require("graphics.core")
|
local core = require("graphics.core")
|
||||||
local themes = require("graphics.themes")
|
local themes = require("graphics.themes")
|
||||||
|
|
||||||
|
local coordinator = require("coordinator.coordinator")
|
||||||
|
|
||||||
---@class crd_style
|
---@class crd_style
|
||||||
local style = {}
|
local style = {}
|
||||||
|
|
||||||
local cpair = core.cpair
|
local cpair = core.cpair
|
||||||
|
|
||||||
|
local config = coordinator.config
|
||||||
|
|
||||||
-- front panel styling
|
-- front panel styling
|
||||||
|
|
||||||
style.fp_theme = themes.sandstone
|
style.fp_theme = themes.sandstone
|
||||||
@ -223,27 +227,34 @@ style.sps = {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
style.waste = {
|
-- get waste styling, which depends on the configuration
|
||||||
-- auto waste processing states
|
---@return { states: { color: color, text: string }, states_abbrv: { color: color, text: string }, options: string[], unit_opts: { text: string, fg_bg: cpair, active_fg_bg:cpair } }
|
||||||
states = {
|
function style.get_waste()
|
||||||
{ color = cpair(colors.black, colors.green), text = "PLUTONIUM" },
|
local pu_color = util.trinary(config.GreenPuPellet, colors.green, colors.cyan)
|
||||||
{ color = cpair(colors.black, colors.cyan), text = "POLONIUM" },
|
local po_color = util.trinary(config.GreenPuPellet, colors.cyan, colors.green)
|
||||||
{ color = cpair(colors.black, colors.purple), text = "ANTI MATTER" }
|
|
||||||
},
|
return {
|
||||||
states_abbrv = {
|
-- auto waste processing states
|
||||||
{ color = cpair(colors.black, colors.green), text = "Pu" },
|
states = {
|
||||||
{ color = cpair(colors.black, colors.cyan), text = "Po" },
|
{ color = cpair(colors.black, pu_color), text = "PLUTONIUM" },
|
||||||
{ color = cpair(colors.black, colors.purple), text = "AM" }
|
{ color = cpair(colors.black, po_color), text = "POLONIUM" },
|
||||||
},
|
{ color = cpair(colors.black, colors.purple), text = "ANTI MATTER" }
|
||||||
-- process radio button options
|
},
|
||||||
options = { "Plutonium", "Polonium", "Antimatter" },
|
states_abbrv = {
|
||||||
-- unit waste selection
|
{ color = cpair(colors.black, pu_color), text = "Pu" },
|
||||||
unit_opts = {
|
{ color = cpair(colors.black, po_color), text = "Po" },
|
||||||
{ text = "Auto", fg_bg = cpair(colors.black, colors.lightGray), active_fg_bg = cpair(colors.white, colors.gray) },
|
{ color = cpair(colors.black, colors.purple), text = "AM" }
|
||||||
{ text = "Pu", fg_bg = cpair(colors.black, colors.lightGray), active_fg_bg = cpair(colors.black, colors.green) },
|
},
|
||||||
{ text = "Po", fg_bg = cpair(colors.black, colors.lightGray), active_fg_bg = cpair(colors.black, colors.cyan) },
|
-- process radio button options
|
||||||
{ text = "AM", fg_bg = cpair(colors.black, colors.lightGray), active_fg_bg = cpair(colors.black, colors.purple) }
|
options = { "Plutonium", "Polonium", "Antimatter" },
|
||||||
|
-- unit waste selection
|
||||||
|
unit_opts = {
|
||||||
|
{ text = "Auto", fg_bg = cpair(colors.black, colors.lightGray), active_fg_bg = cpair(colors.white, colors.gray) },
|
||||||
|
{ text = "Pu", fg_bg = cpair(colors.black, colors.lightGray), active_fg_bg = cpair(colors.black, pu_color) },
|
||||||
|
{ text = "Po", fg_bg = cpair(colors.black, colors.lightGray), active_fg_bg = cpair(colors.black, po_color) },
|
||||||
|
{ text = "AM", fg_bg = cpair(colors.black, colors.lightGray), active_fg_bg = cpair(colors.black, colors.purple) }
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
end
|
||||||
|
|
||||||
return style
|
return style
|
||||||
|
|||||||
@ -53,25 +53,43 @@ function system.create(tool_ctl, main_pane, cfg_sys, divs, style, exit)
|
|||||||
--#region Pocket UI
|
--#region Pocket UI
|
||||||
|
|
||||||
local ui_c_1 = Div{parent=ui_cfg,x=2,y=4,width=24}
|
local ui_c_1 = Div{parent=ui_cfg,x=2,y=4,width=24}
|
||||||
|
local ui_c_2 = Div{parent=ui_cfg,x=2,y=4,width=24}
|
||||||
|
|
||||||
|
local ui_pane = MultiPane{parent=net_cfg,x=1,y=4,panes={ui_c_1,ui_c_2}}
|
||||||
|
|
||||||
TextBox{parent=ui_cfg,x=1,y=2,text=" Pocket UI",fg_bg=cpair(colors.black,colors.lime)}
|
TextBox{parent=ui_cfg,x=1,y=2,text=" Pocket UI",fg_bg=cpair(colors.black,colors.lime)}
|
||||||
|
|
||||||
TextBox{parent=ui_c_1,x=1,y=1,height=3,text="You may customize units below."}
|
TextBox{parent=ui_c_1,x=1,y=1,height=3,text="You may customize UI options below."}
|
||||||
|
|
||||||
TextBox{parent=ui_c_1,x=1,y=4,text="Temperature Scale"}
|
TextBox{parent=ui_c_1,y=4,text="Po/Pu Pellet Color"}
|
||||||
local temp_scale = RadioButton{parent=ui_c_1,x=1,y=5,default=ini_cfg.TempScale,options=types.TEMP_SCALE_NAMES,callback=function()end,radio_colors=cpair(colors.lightGray,colors.black),select_color=colors.lime}
|
local pellet_color = RadioButton{parent=ui_c_1,y=5,default=util.trinary(ini_cfg.GreenPuPellet,1,2),options={"Green Pu/Cyan Po","Cyan Pu/Green Po"},callback=function()end,radio_colors=cpair(colors.lightGray,colors.black),select_color=colors.lime}
|
||||||
|
|
||||||
TextBox{parent=ui_c_1,x=1,y=10,text="Energy Scale"}
|
TextBox{parent=ui_c_1,y=8,height=4,text="In Mekanism 10.4 and later, pellet colors now match gas colors (Cyan Pu/Green Po).",fg_bg=g_lg_fg_bg}
|
||||||
local energy_scale = RadioButton{parent=ui_c_1,x=1,y=11,default=ini_cfg.EnergyScale,options=types.ENERGY_SCALE_NAMES,callback=function()end,radio_colors=cpair(colors.lightGray,colors.black),select_color=colors.lime}
|
|
||||||
|
|
||||||
local function submit_ui_opts()
|
local function submit_ui_opts()
|
||||||
|
tmp_cfg.GreenPuPellet = pellet_color.get_value() == 1
|
||||||
|
ui_pane.set_value(2)
|
||||||
|
end
|
||||||
|
|
||||||
|
PushButton{parent=ui_c_1,x=1,y=15,text="\x1b Back",callback=function()main_pane.set_value(1)end,fg_bg=nav_fg_bg,active_fg_bg=btn_act_fg_bg}
|
||||||
|
PushButton{parent=ui_c_1,x=19,y=15,text="Next \x1a",callback=submit_ui_opts,fg_bg=nav_fg_bg,active_fg_bg=btn_act_fg_bg}
|
||||||
|
|
||||||
|
TextBox{parent=ui_c_2,x=1,y=1,height=3,text="You may customize units below."}
|
||||||
|
|
||||||
|
TextBox{parent=ui_c_2,x=1,y=4,text="Temperature Scale"}
|
||||||
|
local temp_scale = RadioButton{parent=ui_c_2,x=1,y=5,default=ini_cfg.TempScale,options=types.TEMP_SCALE_NAMES,callback=function()end,radio_colors=cpair(colors.lightGray,colors.black),select_color=colors.lime}
|
||||||
|
|
||||||
|
TextBox{parent=ui_c_2,x=1,y=10,text="Energy Scale"}
|
||||||
|
local energy_scale = RadioButton{parent=ui_c_2,x=1,y=11,default=ini_cfg.EnergyScale,options=types.ENERGY_SCALE_NAMES,callback=function()end,radio_colors=cpair(colors.lightGray,colors.black),select_color=colors.lime}
|
||||||
|
|
||||||
|
local function submit_ui_units()
|
||||||
tmp_cfg.TempScale = temp_scale.get_value()
|
tmp_cfg.TempScale = temp_scale.get_value()
|
||||||
tmp_cfg.EnergyScale = energy_scale.get_value()
|
tmp_cfg.EnergyScale = energy_scale.get_value()
|
||||||
main_pane.set_value(3)
|
main_pane.set_value(3)
|
||||||
end
|
end
|
||||||
|
|
||||||
PushButton{parent=ui_c_1,x=1,y=15,text="\x1b Back",callback=function()main_pane.set_value(1)end,fg_bg=nav_fg_bg,active_fg_bg=btn_act_fg_bg}
|
PushButton{parent=ui_c_2,x=1,y=15,text="\x1b Back",callback=function()ui_pane.set_value(1)end,fg_bg=nav_fg_bg,active_fg_bg=btn_act_fg_bg}
|
||||||
PushButton{parent=ui_c_1,x=19,y=15,text="Next \x1a",callback=submit_ui_opts,fg_bg=nav_fg_bg,active_fg_bg=btn_act_fg_bg}
|
PushButton{parent=ui_c_2,x=19,y=15,text="Next \x1a",callback=submit_ui_units,fg_bg=nav_fg_bg,active_fg_bg=btn_act_fg_bg}
|
||||||
|
|
||||||
--#endregion
|
--#endregion
|
||||||
|
|
||||||
@ -266,6 +284,7 @@ function system.create(tool_ctl, main_pane, cfg_sys, divs, style, exit)
|
|||||||
load_settings(settings_cfg, true)
|
load_settings(settings_cfg, true)
|
||||||
load_settings(ini_cfg)
|
load_settings(ini_cfg)
|
||||||
|
|
||||||
|
try_set(pellet_color, ini_cfg.GreenPuPellet)
|
||||||
try_set(temp_scale, ini_cfg.TempScale)
|
try_set(temp_scale, ini_cfg.TempScale)
|
||||||
try_set(energy_scale, ini_cfg.EnergyScale)
|
try_set(energy_scale, ini_cfg.EnergyScale)
|
||||||
try_set(svr_chan, ini_cfg.SVR_Channel)
|
try_set(svr_chan, ini_cfg.SVR_Channel)
|
||||||
@ -374,6 +393,8 @@ function system.create(tool_ctl, main_pane, cfg_sys, divs, style, exit)
|
|||||||
val = string.rep("*", string.len(val))
|
val = string.rep("*", string.len(val))
|
||||||
elseif f[1] == "LogMode" then
|
elseif f[1] == "LogMode" then
|
||||||
val = tri(raw == log.MODE.APPEND, "append", "replace")
|
val = tri(raw == log.MODE.APPEND, "append", "replace")
|
||||||
|
elseif f[1] == "GreenPuPellet" then
|
||||||
|
val = tri(raw, "Green Pu/Cyan Po", "Cyan Pu/Green Po")
|
||||||
elseif f[1] == "TempScale" then
|
elseif f[1] == "TempScale" then
|
||||||
val = util.strval(types.TEMP_SCALE_NAMES[raw])
|
val = util.strval(types.TEMP_SCALE_NAMES[raw])
|
||||||
elseif f[1] == "EnergyScale" then
|
elseif f[1] == "EnergyScale" then
|
||||||
|
|||||||
@ -29,7 +29,8 @@ local CENTER = core.ALIGN.CENTER
|
|||||||
-- 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 = {
|
||||||
{ "v0.9.2", { "Added temperature scale options" } },
|
{ "v0.9.2", { "Added temperature scale options" } },
|
||||||
{ "v0.11.3", { "Added energy scale options" } }
|
{ "v0.11.3", { "Added energy scale options" } },
|
||||||
|
{ "v0.13.2", { "Added option for Po/Pu pellet green/cyan pairing" } }
|
||||||
}
|
}
|
||||||
|
|
||||||
---@class pkt_configurator
|
---@class pkt_configurator
|
||||||
@ -64,6 +65,7 @@ local tool_ctl = {
|
|||||||
|
|
||||||
---@class pkt_config
|
---@class pkt_config
|
||||||
local tmp_cfg = {
|
local tmp_cfg = {
|
||||||
|
GreenPuPellet = false,
|
||||||
TempScale = 1, ---@type TEMP_SCALE
|
TempScale = 1, ---@type TEMP_SCALE
|
||||||
EnergyScale = 1, ---@type ENERGY_SCALE
|
EnergyScale = 1, ---@type ENERGY_SCALE
|
||||||
SVR_Channel = nil, ---@type integer
|
SVR_Channel = nil, ---@type integer
|
||||||
@ -84,6 +86,7 @@ local settings_cfg = {}
|
|||||||
|
|
||||||
-- all settings fields, their nice names, and their default values
|
-- all settings fields, their nice names, and their default values
|
||||||
local fields = {
|
local fields = {
|
||||||
|
{ "GreenPuPellet", "Pellet Colors", false },
|
||||||
{ "TempScale", "Temperature Scale", types.TEMP_SCALE.KELVIN },
|
{ "TempScale", "Temperature Scale", types.TEMP_SCALE.KELVIN },
|
||||||
{ "EnergyScale", "Energy Scale", types.ENERGY_SCALE.FE },
|
{ "EnergyScale", "Energy Scale", types.ENERGY_SCALE.FE },
|
||||||
{ "SVR_Channel", "SVR Channel", 16240 },
|
{ "SVR_Channel", "SVR Channel", 16240 },
|
||||||
|
|||||||
@ -38,6 +38,7 @@ pocket.config = config
|
|||||||
function pocket.load_config()
|
function pocket.load_config()
|
||||||
if not settings.load("/pocket.settings") then return false end
|
if not settings.load("/pocket.settings") then return false end
|
||||||
|
|
||||||
|
config.GreenPuPellet = settings.get("GreenPuPellet")
|
||||||
config.TempScale = settings.get("TempScale")
|
config.TempScale = settings.get("TempScale")
|
||||||
config.EnergyScale = settings.get("EnergyScale")
|
config.EnergyScale = settings.get("EnergyScale")
|
||||||
|
|
||||||
@ -54,6 +55,7 @@ function pocket.load_config()
|
|||||||
|
|
||||||
local cfv = util.new_validator()
|
local cfv = util.new_validator()
|
||||||
|
|
||||||
|
cfv.assert_type_bool(config.GreenPuPellet)
|
||||||
cfv.assert_type_int(config.TempScale)
|
cfv.assert_type_int(config.TempScale)
|
||||||
cfv.assert_range(config.TempScale, 1, 4)
|
cfv.assert_range(config.TempScale, 1, 4)
|
||||||
cfv.assert_type_int(config.EnergyScale)
|
cfv.assert_type_int(config.EnergyScale)
|
||||||
|
|||||||
@ -2,8 +2,10 @@
|
|||||||
-- SCADA System Access on a Pocket Computer
|
-- SCADA System Access on a Pocket Computer
|
||||||
--
|
--
|
||||||
|
|
||||||
---@diagnostic disable-next-line: undefined-global
|
---@diagnostic disable-next-line: lowercase-global
|
||||||
local _is_pocket_env = pocket or periphemu -- luacheck: ignore pocket
|
pocket = pocket or periphemu -- luacheck: ignore pocket
|
||||||
|
|
||||||
|
local _is_pocket_env = pocket -- luacheck: ignore pocket
|
||||||
|
|
||||||
require("/initenv").init_env()
|
require("/initenv").init_env()
|
||||||
|
|
||||||
@ -20,7 +22,7 @@ local pocket = require("pocket.pocket")
|
|||||||
local renderer = require("pocket.renderer")
|
local renderer = require("pocket.renderer")
|
||||||
local threads = require("pocket.threads")
|
local threads = require("pocket.threads")
|
||||||
|
|
||||||
local POCKET_VERSION = "v0.13.1-beta"
|
local POCKET_VERSION = "v0.13.2-beta"
|
||||||
|
|
||||||
local println = util.println
|
local println = util.println
|
||||||
local println_ts = util.println_ts
|
local println_ts = util.println_ts
|
||||||
|
|||||||
@ -95,8 +95,8 @@ local function new_view(root)
|
|||||||
|
|
||||||
local function set_waste(mode) process.set_unit_waste(i, mode) end
|
local function set_waste(mode) process.set_unit_waste(i, mode) end
|
||||||
|
|
||||||
local waste_prod = StateIndicator{parent=u_div,x=16,y=3,states=style.waste.states_abbrv,value=1,min_width=6}
|
local waste_prod = StateIndicator{parent=u_div,x=16,y=3,states=style.get_waste().states_abbrv,value=1,min_width=6}
|
||||||
local waste_mode = RadioButton{parent=u_div,y=3,options=style.waste.unit_opts,callback=set_waste,radio_colors=cpair(colors.lightGray,colors.gray),select_color=colors.white}
|
local waste_mode = RadioButton{parent=u_div,y=3,options=style.get_waste().unit_opts,callback=set_waste,radio_colors=cpair(colors.lightGray,colors.gray),select_color=colors.white}
|
||||||
|
|
||||||
waste_prod.register(u_ps, "U_WasteProduct", waste_prod.update)
|
waste_prod.register(u_ps, "U_WasteProduct", waste_prod.update)
|
||||||
waste_mode.register(u_ps, "U_WasteMode", waste_mode.set_value)
|
waste_mode.register(u_ps, "U_WasteMode", waste_mode.set_value)
|
||||||
@ -159,8 +159,8 @@ local function new_view(root)
|
|||||||
|
|
||||||
TextBox{parent=c_div,y=1,text="Waste Control",alignment=ALIGN.CENTER}
|
TextBox{parent=c_div,y=1,text="Waste Control",alignment=ALIGN.CENTER}
|
||||||
|
|
||||||
local status = StateIndicator{parent=c_div,x=3,y=3,states=style.waste.states,value=1,min_width=17}
|
local status = StateIndicator{parent=c_div,x=3,y=3,states=style.get_waste().states,value=1,min_width=17}
|
||||||
local waste_prod = RadioButton{parent=c_div,y=5,options=style.waste.options,callback=process.set_process_waste,radio_colors=cpair(colors.lightGray,colors.gray),select_color=colors.white}
|
local waste_prod = RadioButton{parent=c_div,y=5,options=style.get_waste().options,callback=process.set_process_waste,radio_colors=cpair(colors.lightGray,colors.gray),select_color=colors.white}
|
||||||
|
|
||||||
status.register(f_ps, "current_waste_product", status.update)
|
status.register(f_ps, "current_waste_product", status.update)
|
||||||
waste_prod.register(f_ps, "process_waste_product", waste_prod.set_value)
|
waste_prod.register(f_ps, "process_waste_product", waste_prod.set_value)
|
||||||
|
|||||||
@ -2,12 +2,18 @@
|
|||||||
-- Graphics Style Options
|
-- Graphics Style Options
|
||||||
--
|
--
|
||||||
|
|
||||||
local core = require("graphics.core")
|
local util = require("scada-common.util")
|
||||||
|
|
||||||
|
local core = require("graphics.core")
|
||||||
|
|
||||||
|
local pocket = require("pocket.pocket")
|
||||||
|
|
||||||
local style = {}
|
local style = {}
|
||||||
|
|
||||||
local cpair = core.cpair
|
local cpair = core.cpair
|
||||||
|
|
||||||
|
local config = pocket.config
|
||||||
|
|
||||||
-- GLOBAL --
|
-- GLOBAL --
|
||||||
|
|
||||||
style.root = cpair(colors.white, colors.black)
|
style.root = cpair(colors.white, colors.black)
|
||||||
@ -171,22 +177,29 @@ style.sps = {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
style.waste = {
|
-- get waste styling, which depends on the configuration
|
||||||
-- auto waste processing states
|
---@return { states: { color: color, text: string }, states_abbrv: { color: color, text: string }, options: string[], unit_opts: string[] }
|
||||||
states = {
|
function style.get_waste()
|
||||||
{ color = cpair(colors.black, colors.green), text = "PLUTONIUM" },
|
local pu_color = util.trinary(config.GreenPuPellet, colors.green, colors.cyan)
|
||||||
{ color = cpair(colors.black, colors.cyan), text = "POLONIUM" },
|
local po_color = util.trinary(config.GreenPuPellet, colors.cyan, colors.green)
|
||||||
{ color = cpair(colors.black, colors.purple), text = "ANTI MATTER" }
|
|
||||||
},
|
return {
|
||||||
states_abbrv = {
|
-- auto waste processing states
|
||||||
{ color = cpair(colors.black, colors.green), text = "Pu" },
|
states = {
|
||||||
{ color = cpair(colors.black, colors.cyan), text = "Po" },
|
{ color = cpair(colors.black, pu_color), text = "PLUTONIUM" },
|
||||||
{ color = cpair(colors.black, colors.purple), text = "AM" }
|
{ color = cpair(colors.black, po_color), text = "POLONIUM" },
|
||||||
},
|
{ color = cpair(colors.black, colors.purple), text = "ANTI MATTER" }
|
||||||
-- process radio button options
|
},
|
||||||
options = { "Plutonium", "Polonium", "Antimatter" },
|
states_abbrv = {
|
||||||
-- unit waste selection
|
{ color = cpair(colors.black, pu_color), text = "Pu" },
|
||||||
unit_opts = { "Auto", "Plutonium", "Polonium", "Antimatter" }
|
{ color = cpair(colors.black, po_color), text = "Po" },
|
||||||
}
|
{ color = cpair(colors.black, colors.purple), text = "AM" }
|
||||||
|
},
|
||||||
|
-- process radio button options
|
||||||
|
options = { "Plutonium", "Polonium", "Antimatter" },
|
||||||
|
-- unit waste selection
|
||||||
|
unit_opts = { "Auto", "Plutonium", "Polonium", "Antimatter" }
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
return style
|
return style
|
||||||
|
|||||||
@ -20,6 +20,7 @@ local NumberField = require("graphics.elements.form.NumberField")
|
|||||||
---@field port IO_PORT
|
---@field port IO_PORT
|
||||||
---@field side side
|
---@field side side
|
||||||
---@field color color|nil
|
---@field color color|nil
|
||||||
|
---@field invert true|nil
|
||||||
|
|
||||||
local tri = util.trinary
|
local tri = util.trinary
|
||||||
|
|
||||||
@ -41,7 +42,9 @@ local self = {
|
|||||||
rs_cfg_side_l = nil, ---@type TextBox
|
rs_cfg_side_l = nil, ---@type TextBox
|
||||||
rs_cfg_bundled = nil, ---@type Checkbox
|
rs_cfg_bundled = nil, ---@type Checkbox
|
||||||
rs_cfg_color = nil, ---@type Radio2D
|
rs_cfg_color = nil, ---@type Radio2D
|
||||||
rs_cfg_shortcut = nil ---@type TextBox
|
rs_cfg_inverted = nil, ---@type Checkbox
|
||||||
|
rs_cfg_shortcut = nil, ---@type TextBox
|
||||||
|
rs_cfg_advanced = nil ---@type PushButton
|
||||||
}
|
}
|
||||||
|
|
||||||
-- rsio port descriptions
|
-- rsio port descriptions
|
||||||
@ -141,8 +144,9 @@ function redstone.create(tool_ctl, main_pane, cfg_sys, rs_cfg, style)
|
|||||||
local rs_c_5 = Div{parent=rs_cfg,x=2,y=4,width=49}
|
local rs_c_5 = Div{parent=rs_cfg,x=2,y=4,width=49}
|
||||||
local rs_c_6 = Div{parent=rs_cfg,x=2,y=4,width=49}
|
local rs_c_6 = Div{parent=rs_cfg,x=2,y=4,width=49}
|
||||||
local rs_c_7 = Div{parent=rs_cfg,x=2,y=4,width=49}
|
local rs_c_7 = Div{parent=rs_cfg,x=2,y=4,width=49}
|
||||||
|
local rs_c_8 = Div{parent=rs_cfg,x=2,y=4,width=49}
|
||||||
|
|
||||||
local rs_pane = MultiPane{parent=rs_cfg,x=1,y=4,panes={rs_c_1,rs_c_2,rs_c_3,rs_c_4,rs_c_5,rs_c_6,rs_c_7}}
|
local rs_pane = MultiPane{parent=rs_cfg,x=1,y=4,panes={rs_c_1,rs_c_2,rs_c_3,rs_c_4,rs_c_5,rs_c_6,rs_c_7,rs_c_8}}
|
||||||
|
|
||||||
TextBox{parent=rs_cfg,x=1,y=2,text=" Redstone Connections",fg_bg=cpair(colors.black,colors.red)}
|
TextBox{parent=rs_cfg,x=1,y=2,text=" Redstone Connections",fg_bg=cpair(colors.black,colors.red)}
|
||||||
|
|
||||||
@ -175,9 +179,6 @@ function redstone.create(tool_ctl, main_pane, cfg_sys, rs_cfg, style)
|
|||||||
PushButton{parent=rs_c_1,x=35,y=14,min_width=7,text="New +",callback=function()rs_pane.set_value(2)end,fg_bg=cpair(colors.black,colors.blue),active_fg_bg=btn_act_fg_bg}
|
PushButton{parent=rs_c_1,x=35,y=14,min_width=7,text="New +",callback=function()rs_pane.set_value(2)end,fg_bg=cpair(colors.black,colors.blue),active_fg_bg=btn_act_fg_bg}
|
||||||
local rs_apply_btn = PushButton{parent=rs_c_1,x=43,y=14,min_width=7,text="Apply",callback=rs_apply,fg_bg=cpair(colors.black,colors.green),active_fg_bg=btn_act_fg_bg,dis_fg_bg=btn_dis_fg_bg}
|
local rs_apply_btn = PushButton{parent=rs_c_1,x=43,y=14,min_width=7,text="Apply",callback=rs_apply,fg_bg=cpair(colors.black,colors.green),active_fg_bg=btn_act_fg_bg,dis_fg_bg=btn_dis_fg_bg}
|
||||||
|
|
||||||
TextBox{parent=rs_c_6,x=1,y=1,height=5,text="You already configured this input. There can only be one entry for each input.\n\nPlease select a different port."}
|
|
||||||
PushButton{parent=rs_c_6,x=1,y=14,text="\x1b Back",callback=function()rs_pane.set_value(2)end,fg_bg=nav_fg_bg,active_fg_bg=btn_act_fg_bg}
|
|
||||||
|
|
||||||
TextBox{parent=rs_c_2,x=1,y=1,text="Select one of the below ports to use."}
|
TextBox{parent=rs_c_2,x=1,y=1,text="Select one of the below ports to use."}
|
||||||
|
|
||||||
local rs_ports = ListBox{parent=rs_c_2,x=1,y=3,height=10,width=49,scroll_height=200,fg_bg=bw_fg_bg,nav_fg_bg=g_lg_fg_bg,nav_active=cpair(colors.black,colors.gray)}
|
local rs_ports = ListBox{parent=rs_c_2,x=1,y=3,height=10,width=49,scroll_height=200,fg_bg=bw_fg_bg,nav_fg_bg=g_lg_fg_bg,nav_active=cpair(colors.black,colors.gray)}
|
||||||
@ -200,6 +201,8 @@ function redstone.create(tool_ctl, main_pane, cfg_sys, rs_cfg, style)
|
|||||||
self.rs_cfg_color.hide(true)
|
self.rs_cfg_color.hide(true)
|
||||||
self.rs_cfg_shortcut.show()
|
self.rs_cfg_shortcut.show()
|
||||||
self.rs_cfg_side_l.set_value("Output Side")
|
self.rs_cfg_side_l.set_value("Output Side")
|
||||||
|
self.rs_cfg_bundled.enable()
|
||||||
|
self.rs_cfg_advanced.disable()
|
||||||
text = "You selected the ALL_WASTE shortcut."
|
text = "You selected the ALL_WASTE shortcut."
|
||||||
else
|
else
|
||||||
self.rs_cfg_shortcut.hide(true)
|
self.rs_cfg_shortcut.hide(true)
|
||||||
@ -214,9 +217,13 @@ function redstone.create(tool_ctl, main_pane, cfg_sys, rs_cfg, style)
|
|||||||
self.rs_cfg_bundled.set_value(false)
|
self.rs_cfg_bundled.set_value(false)
|
||||||
self.rs_cfg_bundled.disable()
|
self.rs_cfg_bundled.disable()
|
||||||
self.rs_cfg_color.disable()
|
self.rs_cfg_color.disable()
|
||||||
|
self.rs_cfg_inverted.set_value(false)
|
||||||
|
self.rs_cfg_advanced.disable()
|
||||||
else
|
else
|
||||||
self.rs_cfg_bundled.enable()
|
self.rs_cfg_bundled.enable()
|
||||||
if self.rs_cfg_bundled.get_value() then self.rs_cfg_color.enable() else self.rs_cfg_color.disable() end
|
if self.rs_cfg_bundled.get_value() then self.rs_cfg_color.enable() else self.rs_cfg_color.disable() end
|
||||||
|
self.rs_cfg_inverted.set_value(false)
|
||||||
|
self.rs_cfg_advanced.enable()
|
||||||
end
|
end
|
||||||
|
|
||||||
if io_mode == IO_MODE.DIGITAL_IN then
|
if io_mode == IO_MODE.DIGITAL_IN then
|
||||||
@ -269,11 +276,6 @@ function redstone.create(tool_ctl, main_pane, cfg_sys, rs_cfg, style)
|
|||||||
|
|
||||||
PushButton{parent=rs_c_3,x=36,y=3,text="What's that?",min_width=14,callback=function()rs_pane.set_value(7)end,fg_bg=nav_fg_bg,active_fg_bg=btn_act_fg_bg}
|
PushButton{parent=rs_c_3,x=36,y=3,text="What's that?",min_width=14,callback=function()rs_pane.set_value(7)end,fg_bg=nav_fg_bg,active_fg_bg=btn_act_fg_bg}
|
||||||
|
|
||||||
TextBox{parent=rs_c_7,x=1,y=1,height=4,text="(Normal) Digital Input: On if there is a redstone signal, off otherwise\nInverted Digital Input: On without a redstone signal, off otherwise"}
|
|
||||||
TextBox{parent=rs_c_7,x=1,y=6,height=4,text="(Normal) Digital Output: Redstone signal to 'turn it on', none to 'turn it off'\nInverted Digital Output: No redstone signal to 'turn it on', redstone signal to 'turn it off'"}
|
|
||||||
TextBox{parent=rs_c_7,x=1,y=11,height=2,text="Analog Input: 0-15 redstone power level input\nAnalog Output: 0-15 scaled redstone power level output"}
|
|
||||||
PushButton{parent=rs_c_7,x=1,y=14,text="\x1b Back",callback=function()rs_pane.set_value(3)end,fg_bg=nav_fg_bg,active_fg_bg=btn_act_fg_bg}
|
|
||||||
|
|
||||||
self.rs_cfg_side_l = TextBox{parent=rs_c_3,x=1,y=4,width=11,text="Output Side"}
|
self.rs_cfg_side_l = TextBox{parent=rs_c_3,x=1,y=4,width=11,text="Output Side"}
|
||||||
local side = Radio2D{parent=rs_c_3,x=1,y=5,rows=1,columns=6,default=1,options=side_options,radio_colors=cpair(colors.lightGray,colors.black),select_color=colors.red}
|
local side = Radio2D{parent=rs_c_3,x=1,y=5,rows=1,columns=6,default=1,options=side_options,radio_colors=cpair(colors.lightGray,colors.black),select_color=colors.red}
|
||||||
|
|
||||||
@ -312,7 +314,8 @@ function redstone.create(tool_ctl, main_pane, cfg_sys, rs_cfg, style)
|
|||||||
unit = tri(PORT_DSGN[port] == 1, u, nil),
|
unit = tri(PORT_DSGN[port] == 1, u, nil),
|
||||||
port = port,
|
port = port,
|
||||||
side = side_options_map[side.get_value()],
|
side = side_options_map[side.get_value()],
|
||||||
color = tri(self.rs_cfg_bundled.get_value() and rsio.is_digital(port), color_options_map[self.rs_cfg_color.get_value()], nil)
|
color = tri(self.rs_cfg_bundled.get_value() and rsio.is_digital(port), color_options_map[self.rs_cfg_color.get_value()], nil),
|
||||||
|
invert = self.rs_cfg_inverted.get_value() or nil
|
||||||
}
|
}
|
||||||
|
|
||||||
if self.rs_cfg_editing == false then
|
if self.rs_cfg_editing == false then
|
||||||
@ -341,10 +344,13 @@ function redstone.create(tool_ctl, main_pane, cfg_sys, rs_cfg, style)
|
|||||||
self.rs_cfg_bundled.set_value(false)
|
self.rs_cfg_bundled.set_value(false)
|
||||||
self.rs_cfg_color.set_value(1)
|
self.rs_cfg_color.set_value(1)
|
||||||
self.rs_cfg_color.disable()
|
self.rs_cfg_color.disable()
|
||||||
|
self.rs_cfg_inverted.set_value(false)
|
||||||
|
self.rs_cfg_advanced.disable()
|
||||||
else rs_err.show() end
|
else rs_err.show() end
|
||||||
end
|
end
|
||||||
|
|
||||||
PushButton{parent=rs_c_3,x=1,y=14,text="\x1b Back",callback=back_from_rs_opts,fg_bg=nav_fg_bg,active_fg_bg=btn_act_fg_bg}
|
PushButton{parent=rs_c_3,x=1,y=14,text="\x1b Back",callback=back_from_rs_opts,fg_bg=nav_fg_bg,active_fg_bg=btn_act_fg_bg}
|
||||||
|
self.rs_cfg_advanced = PushButton{parent=rs_c_3,x=30,y=14,min_width=10,text="Advanced",callback=function()rs_pane.set_value(8)end,fg_bg=cpair(colors.black,colors.yellow),active_fg_bg=btn_act_fg_bg,dis_fg_bg=btn_dis_fg_bg}
|
||||||
PushButton{parent=rs_c_3,x=41,y=14,min_width=9,text="Confirm",callback=save_rs_entry,fg_bg=cpair(colors.black,colors.blue),active_fg_bg=btn_act_fg_bg}
|
PushButton{parent=rs_c_3,x=41,y=14,min_width=9,text="Confirm",callback=save_rs_entry,fg_bg=cpair(colors.black,colors.blue),active_fg_bg=btn_act_fg_bg}
|
||||||
|
|
||||||
TextBox{parent=rs_c_4,x=1,y=1,text="Settings saved!"}
|
TextBox{parent=rs_c_4,x=1,y=1,text="Settings saved!"}
|
||||||
@ -355,6 +361,19 @@ function redstone.create(tool_ctl, main_pane, cfg_sys, rs_cfg, style)
|
|||||||
PushButton{parent=rs_c_5,x=1,y=14,text="\x1b Back",callback=function()rs_pane.set_value(1)end,fg_bg=nav_fg_bg,active_fg_bg=btn_act_fg_bg}
|
PushButton{parent=rs_c_5,x=1,y=14,text="\x1b Back",callback=function()rs_pane.set_value(1)end,fg_bg=nav_fg_bg,active_fg_bg=btn_act_fg_bg}
|
||||||
PushButton{parent=rs_c_5,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}
|
PushButton{parent=rs_c_5,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=rs_c_6,x=1,y=1,height=5,text="You already configured this input. There can only be one entry for each input.\n\nPlease select a different port."}
|
||||||
|
PushButton{parent=rs_c_6,x=1,y=14,text="\x1b Back",callback=function()rs_pane.set_value(2)end,fg_bg=nav_fg_bg,active_fg_bg=btn_act_fg_bg}
|
||||||
|
|
||||||
|
TextBox{parent=rs_c_7,x=1,y=1,height=4,text="(Normal) Digital Input: On if there is a redstone signal, off otherwise\nInverted Digital Input: On without a redstone signal, off otherwise"}
|
||||||
|
TextBox{parent=rs_c_7,x=1,y=6,height=4,text="(Normal) Digital Output: Redstone signal to 'turn it on', none to 'turn it off'\nInverted Digital Output: No redstone signal to 'turn it on', redstone signal to 'turn it off'"}
|
||||||
|
TextBox{parent=rs_c_7,x=1,y=11,height=2,text="Analog Input: 0-15 redstone power level input\nAnalog Output: 0-15 scaled redstone power level output"}
|
||||||
|
PushButton{parent=rs_c_7,x=1,y=14,text="\x1b Back",callback=function()rs_pane.set_value(3)end,fg_bg=nav_fg_bg,active_fg_bg=btn_act_fg_bg}
|
||||||
|
|
||||||
|
TextBox{parent=rs_c_8,x=1,y=1,height=5,text="Advanced Options"}
|
||||||
|
self.rs_cfg_inverted = Checkbox{parent=rs_c_8,x=1,y=3,label="Invert",default=false,box_fg_bg=cpair(colors.red,colors.black),callback=function()end,disable_fg_bg=g_lg_fg_bg}
|
||||||
|
TextBox{parent=rs_c_8,x=3,y=4,height=4,text="Digital I/O is already inverted (or not) based on intended use. If you have a non-standard setup, you can use this option to avoid needing a redstone inverter.",fg_bg=cpair(colors.gray,colors.lightGray)}
|
||||||
|
PushButton{parent=rs_c_8,x=1,y=14,text="\x1b Back",callback=function()rs_pane.set_value(3)end,fg_bg=nav_fg_bg,active_fg_bg=btn_act_fg_bg}
|
||||||
|
|
||||||
--#endregion
|
--#endregion
|
||||||
|
|
||||||
--#region Tool Functions
|
--#region Tool Functions
|
||||||
@ -383,9 +402,11 @@ function redstone.create(tool_ctl, main_pane, cfg_sys, rs_cfg, style)
|
|||||||
if rsio.is_analog(def.port) then
|
if rsio.is_analog(def.port) then
|
||||||
self.rs_cfg_bundled.set_value(false)
|
self.rs_cfg_bundled.set_value(false)
|
||||||
self.rs_cfg_bundled.disable()
|
self.rs_cfg_bundled.disable()
|
||||||
|
self.rs_cfg_advanced.disable()
|
||||||
else
|
else
|
||||||
self.rs_cfg_bundled.enable()
|
self.rs_cfg_bundled.enable()
|
||||||
self.rs_cfg_bundled.set_value(def.color ~= nil)
|
self.rs_cfg_bundled.set_value(def.color ~= nil)
|
||||||
|
self.rs_cfg_advanced.enable()
|
||||||
end
|
end
|
||||||
|
|
||||||
local value = 1
|
local value = 1
|
||||||
@ -400,6 +421,7 @@ function redstone.create(tool_ctl, main_pane, cfg_sys, rs_cfg, style)
|
|||||||
self.rs_cfg_side_l.set_value(tri(rsio.get_io_dir(def.port) == rsio.IO_DIR.IN, "Input Side", "Output Side"))
|
self.rs_cfg_side_l.set_value(tri(rsio.get_io_dir(def.port) == rsio.IO_DIR.IN, "Input Side", "Output Side"))
|
||||||
side.set_value(side_to_idx(def.side))
|
side.set_value(side_to_idx(def.side))
|
||||||
self.rs_cfg_color.set_value(value)
|
self.rs_cfg_color.set_value(value)
|
||||||
|
self.rs_cfg_inverted.set_value(def.invert or false)
|
||||||
rs_pane.set_value(3)
|
rs_pane.set_value(3)
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -418,14 +440,15 @@ function redstone.create(tool_ctl, main_pane, cfg_sys, rs_cfg, style)
|
|||||||
local def = tmp_cfg.Redstone[i]
|
local def = tmp_cfg.Redstone[i]
|
||||||
|
|
||||||
local name = rsio.to_string(def.port)
|
local name = rsio.to_string(def.port)
|
||||||
local io_dir = tri(rsio.get_io_mode(def.port) == rsio.IO_DIR.IN, "\x1a", "\x1b")
|
local io_dir = tri(rsio.get_io_dir(def.port) == rsio.IO_DIR.IN, "\x1a", "\x1b")
|
||||||
|
local io_c = tri(rsio.is_digital(def.port), colors.blue, colors.purple)
|
||||||
local conn = def.side
|
local conn = def.side
|
||||||
local unit = util.strval(def.unit or "F")
|
local unit = util.strval(def.unit or "F")
|
||||||
|
|
||||||
if def.color ~= nil then conn = def.side .. "/" .. rsio.color_name(def.color) end
|
if def.color ~= nil then conn = def.side .. "/" .. rsio.color_name(def.color) end
|
||||||
|
|
||||||
local entry = Div{parent=rs_list,height=1}
|
local entry = Div{parent=rs_list,height=1}
|
||||||
TextBox{parent=entry,x=1,y=1,width=1,text=io_dir,fg_bg=cpair(colors.lightGray,colors.white)}
|
TextBox{parent=entry,x=1,y=1,width=1,text=io_dir,fg_bg=cpair(tri(def.invert,colors.orange,io_c),colors.white)}
|
||||||
TextBox{parent=entry,x=2,y=1,width=14,text=name}
|
TextBox{parent=entry,x=2,y=1,width=14,text=name}
|
||||||
TextBox{parent=entry,x=16,y=1,width=string.len(conn),text=conn,fg_bg=cpair(colors.gray,colors.white)}
|
TextBox{parent=entry,x=16,y=1,width=string.len(conn),text=conn,fg_bg=cpair(colors.gray,colors.white)}
|
||||||
TextBox{parent=entry,x=33,y=1,width=1,text=unit,fg_bg=cpair(colors.gray,colors.white)}
|
TextBox{parent=entry,x=33,y=1,width=1,text=unit,fg_bg=cpair(colors.gray,colors.white)}
|
||||||
@ -436,7 +459,7 @@ function redstone.create(tool_ctl, main_pane, cfg_sys, rs_cfg, style)
|
|||||||
local a = ini_cfg.Redstone[i]
|
local a = ini_cfg.Redstone[i]
|
||||||
local b = tmp_cfg.Redstone[i]
|
local b = tmp_cfg.Redstone[i]
|
||||||
|
|
||||||
modified = (a.unit ~= b.unit) or (a.port ~= b.port) or (a.side ~= b.side) or (a.color ~= b.color)
|
modified = (a.unit ~= b.unit) or (a.port ~= b.port) or (a.side ~= b.side) or (a.color ~= b.color) or (a.invert ~= b.invert)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
@ -35,7 +35,8 @@ 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" } },
|
{ "v1.9.2", { "Added standard with black off state color mode", "Added blue indicator color modes" } },
|
||||||
{ "v1.10.2", { "Re-organized peripheral configuration UI, resulting in some input fields being re-ordered" } }
|
{ "v1.10.2", { "Re-organized peripheral configuration UI, resulting in some input fields being re-ordered" } },
|
||||||
|
{ "v1.11.8", { "Added advanced option to invert digital redstone signals" } }
|
||||||
}
|
}
|
||||||
|
|
||||||
---@class rtu_configurator
|
---@class rtu_configurator
|
||||||
@ -116,6 +117,7 @@ local fields = {
|
|||||||
}
|
}
|
||||||
|
|
||||||
-- deep copy peripherals defs
|
-- deep copy peripherals defs
|
||||||
|
---@param data rtu_peri_definition[]
|
||||||
function tool_ctl.deep_copy_peri(data)
|
function tool_ctl.deep_copy_peri(data)
|
||||||
local array = {}
|
local array = {}
|
||||||
for _, d in ipairs(data) do table.insert(array, { unit = d.unit, index = d.index, name = d.name }) end
|
for _, d in ipairs(data) do table.insert(array, { unit = d.unit, index = d.index, name = d.name }) end
|
||||||
@ -123,9 +125,10 @@ function tool_ctl.deep_copy_peri(data)
|
|||||||
end
|
end
|
||||||
|
|
||||||
-- deep copy redstone defs
|
-- deep copy redstone defs
|
||||||
|
---@param data rtu_rs_definition[]
|
||||||
function tool_ctl.deep_copy_rs(data)
|
function tool_ctl.deep_copy_rs(data)
|
||||||
local array = {}
|
local array = {}
|
||||||
for _, d in ipairs(data) do table.insert(array, { unit = d.unit, port = d.port, side = d.side, color = d.color }) end
|
for _, d in ipairs(data) do table.insert(array, { unit = d.unit, port = d.port, side = d.side, color = d.color, invert = d.invert }) end
|
||||||
return array
|
return array
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
@ -33,16 +33,21 @@ function redstone_rtu.new()
|
|||||||
-- link digital input
|
-- link digital input
|
||||||
---@param side string
|
---@param side string
|
||||||
---@param color integer
|
---@param color integer
|
||||||
function public.link_di(side, color)
|
---@param invert boolean|nil
|
||||||
|
function public.link_di(side, color, invert)
|
||||||
local f_read ---@type function
|
local f_read ---@type function
|
||||||
|
|
||||||
if color then
|
if color then
|
||||||
f_read = function ()
|
if invert then
|
||||||
return digital_read(rs.testBundledInput(side, color))
|
f_read = function () return digital_read(not rs.testBundledInput(side, color)) end
|
||||||
|
else
|
||||||
|
f_read = function () return digital_read(rs.testBundledInput(side, color)) end
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
f_read = function ()
|
if invert then
|
||||||
return digital_read(rs.getInput(side))
|
f_read = function () return digital_read(not rs.getInput(side)) end
|
||||||
|
else
|
||||||
|
f_read = function () return digital_read(rs.getInput(side)) end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -52,36 +57,58 @@ function redstone_rtu.new()
|
|||||||
-- link digital output
|
-- link digital output
|
||||||
---@param side string
|
---@param side string
|
||||||
---@param color integer
|
---@param color integer
|
||||||
function public.link_do(side, color)
|
---@param invert boolean|nil
|
||||||
|
function public.link_do(side, color, invert)
|
||||||
local f_read ---@type function
|
local f_read ---@type function
|
||||||
local f_write ---@type function
|
local f_write ---@type function
|
||||||
|
|
||||||
if color then
|
if color then
|
||||||
f_read = function ()
|
if invert then
|
||||||
return digital_read(colors.test(rs.getBundledOutput(side), color))
|
f_read = function () return digital_read(not colors.test(rs.getBundledOutput(side), color)) end
|
||||||
end
|
|
||||||
|
|
||||||
f_write = function (level)
|
f_write = function (level)
|
||||||
if level ~= IO_LVL.FLOATING and level ~= IO_LVL.DISCONNECT then
|
if level ~= IO_LVL.FLOATING and level ~= IO_LVL.DISCONNECT then
|
||||||
local output = rs.getBundledOutput(side)
|
local output = rs.getBundledOutput(side)
|
||||||
|
|
||||||
if digital_write(level) then
|
-- inverted conditions
|
||||||
output = colors.combine(output, color)
|
if digital_write(level) then
|
||||||
else
|
output = colors.subtract(output, color)
|
||||||
output = colors.subtract(output, color)
|
else output = colors.combine(output, color) end
|
||||||
|
|
||||||
|
rs.setBundledOutput(side, output)
|
||||||
end
|
end
|
||||||
|
end
|
||||||
|
else
|
||||||
|
f_read = function () return digital_read(colors.test(rs.getBundledOutput(side), color)) end
|
||||||
|
|
||||||
rs.setBundledOutput(side, output)
|
f_write = function (level)
|
||||||
|
if level ~= IO_LVL.FLOATING and level ~= IO_LVL.DISCONNECT then
|
||||||
|
local output = rs.getBundledOutput(side)
|
||||||
|
|
||||||
|
if digital_write(level) then
|
||||||
|
output = colors.combine(output, color)
|
||||||
|
else output = colors.subtract(output, color) end
|
||||||
|
|
||||||
|
rs.setBundledOutput(side, output)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
f_read = function ()
|
if invert then
|
||||||
return digital_read(rs.getOutput(side))
|
f_read = function () return digital_read(not rs.getOutput(side)) end
|
||||||
end
|
|
||||||
|
|
||||||
f_write = function (level)
|
f_write = function (level)
|
||||||
if level ~= IO_LVL.FLOATING and level ~= IO_LVL.DISCONNECT then
|
if level ~= IO_LVL.FLOATING and level ~= IO_LVL.DISCONNECT then
|
||||||
rs.setOutput(side, digital_write(level))
|
rs.setOutput(side, not digital_write(level))
|
||||||
|
end
|
||||||
|
end
|
||||||
|
else
|
||||||
|
f_read = function () return digital_read(rs.getOutput(side)) end
|
||||||
|
|
||||||
|
f_write = function (level)
|
||||||
|
if level ~= IO_LVL.FLOATING and level ~= IO_LVL.DISCONNECT then
|
||||||
|
rs.setOutput(side, digital_write(level))
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@ -92,23 +119,15 @@ function redstone_rtu.new()
|
|||||||
-- link analog input
|
-- link analog input
|
||||||
---@param side string
|
---@param side string
|
||||||
function public.link_ai(side)
|
function public.link_ai(side)
|
||||||
unit.connect_input_reg(
|
unit.connect_input_reg(function () return rs.getAnalogInput(side) end)
|
||||||
function ()
|
|
||||||
return rs.getAnalogInput(side)
|
|
||||||
end
|
|
||||||
)
|
|
||||||
end
|
end
|
||||||
|
|
||||||
-- link analog output
|
-- link analog output
|
||||||
---@param side string
|
---@param side string
|
||||||
function public.link_ao(side)
|
function public.link_ao(side)
|
||||||
unit.connect_holding_reg(
|
unit.connect_holding_reg(
|
||||||
function ()
|
function () return rs.getAnalogOutput(side) end,
|
||||||
return rs.getAnalogOutput(side)
|
function (value) rs.setAnalogOutput(side, value) end
|
||||||
end,
|
|
||||||
function (value)
|
|
||||||
rs.setAnalogOutput(side, value)
|
|
||||||
end
|
|
||||||
)
|
)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
@ -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.11.7"
|
local RTU_VERSION = "v1.11.8"
|
||||||
|
|
||||||
local RTU_UNIT_TYPE = types.RTU_UNIT_TYPE
|
local RTU_UNIT_TYPE = types.RTU_UNIT_TYPE
|
||||||
local RTU_HW_STATE = databus.RTU_HW_STATE
|
local RTU_HW_STATE = databus.RTU_HW_STATE
|
||||||
@ -197,10 +197,10 @@ local function main()
|
|||||||
println(message)
|
println(message)
|
||||||
log.warning(message)
|
log.warning(message)
|
||||||
else
|
else
|
||||||
rs_rtu.link_di(entry.side, entry.color)
|
rs_rtu.link_di(entry.side, entry.color, entry.invert)
|
||||||
end
|
end
|
||||||
elseif mode == rsio.IO_MODE.DIGITAL_OUT then
|
elseif mode == rsio.IO_MODE.DIGITAL_OUT then
|
||||||
rs_rtu.link_do(entry.side, entry.color)
|
rs_rtu.link_do(entry.side, entry.color, entry.invert)
|
||||||
elseif mode == rsio.IO_MODE.ANALOG_IN then
|
elseif mode == rsio.IO_MODE.ANALOG_IN then
|
||||||
-- can't have duplicate inputs
|
-- can't have duplicate inputs
|
||||||
if util.table_contains(capabilities, entry.port) then
|
if util.table_contains(capabilities, entry.port) then
|
||||||
|
|||||||
@ -2,6 +2,9 @@
|
|||||||
-- Crash Handler
|
-- Crash Handler
|
||||||
--
|
--
|
||||||
|
|
||||||
|
---@diagnostic disable-next-line: undefined-global
|
||||||
|
local _is_pocket_env = pocket -- luacheck: ignore pocket
|
||||||
|
|
||||||
local comms = require("scada-common.comms")
|
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")
|
||||||
@ -36,6 +39,74 @@ local function log_versions(log_msg)
|
|||||||
if has_lockbox then log_msg(util.c("LOCKBOX VERSION: ", lockbox.version)) end
|
if has_lockbox then log_msg(util.c("LOCKBOX VERSION: ", lockbox.version)) end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
-- render the standard computer crash screen
|
||||||
|
---@param exit function callback on exit button press
|
||||||
|
---@return DisplayBox display
|
||||||
|
local function draw_computer_crash(exit)
|
||||||
|
local DisplayBox = require("graphics.elements.DisplayBox")
|
||||||
|
local Div = require("graphics.elements.Div")
|
||||||
|
local Rectangle = require("graphics.elements.Rectangle")
|
||||||
|
local TextBox = require("graphics.elements.TextBox")
|
||||||
|
local PushButton = require("graphics.elements.controls.PushButton")
|
||||||
|
|
||||||
|
local display = DisplayBox{window=term.current(),fg_bg=core.cpair(colors.white,colors.lightGray)}
|
||||||
|
|
||||||
|
local warning = Div{parent=display,x=2,y=2}
|
||||||
|
TextBox{parent=warning,x=7,text="\x90\n \x90\n \x90\n \x90\n \x90",fg_bg=core.cpair(colors.yellow,colors.lightGray)}
|
||||||
|
TextBox{parent=warning,x=5,y=1,text="\x9f ",width=2,fg_bg=core.cpair(colors.lightGray,colors.yellow)}
|
||||||
|
TextBox{parent=warning,x=4,text="\x9f ",width=4,fg_bg=core.cpair(colors.lightGray,colors.yellow)}
|
||||||
|
TextBox{parent=warning,x=3,text="\x9f ",width=6,fg_bg=core.cpair(colors.lightGray,colors.yellow)}
|
||||||
|
TextBox{parent=warning,x=2,text="\x9f ",width=8,fg_bg=core.cpair(colors.lightGray,colors.yellow)}
|
||||||
|
TextBox{parent=warning,text="\x9f ",width=10,fg_bg=core.cpair(colors.lightGray,colors.yellow)}
|
||||||
|
TextBox{parent=warning,text="\x8f\x8f\x8f\x8f\x8f\x8f\x8f\x8f\x8f\x8f\x8f",width=11,fg_bg=core.cpair(colors.yellow,colors.lightGray)}
|
||||||
|
TextBox{parent=warning,x=6,y=3,text=" \n \x83",width=1,fg_bg=core.cpair(colors.yellow,colors.white)}
|
||||||
|
|
||||||
|
TextBox{parent=display,x=13,y=2,text="Critical Software Fault Encountered",alignment=core.ALIGN.CENTER,fg_bg=core.cpair(colors.yellow,colors._INHERIT)}
|
||||||
|
TextBox{parent=display,x=15,y=4,text="Please consider reporting this on the cc-mek-scada Discord or GitHub.",width=36,alignment=core.ALIGN.CENTER}
|
||||||
|
TextBox{parent=display,x=14,y=7,text="refer to the log file for more info",alignment=core.ALIGN.CENTER,fg_bg=core.cpair(colors.gray,colors._INHERIT)}
|
||||||
|
|
||||||
|
local box = Rectangle{parent=display,x=2,y=9,width=display.get_width()-2,height=8,border=core.border(1,colors.gray,true),thin=true,fg_bg=core.cpair(colors.black,colors.white)}
|
||||||
|
TextBox{parent=box,text=err}
|
||||||
|
|
||||||
|
PushButton{parent=display,x=23,y=18,text=" Exit ",callback=exit,active_fg_bg=core.cpair(colors.white,colors.gray),fg_bg=core.cpair(colors.black,colors.red)}
|
||||||
|
|
||||||
|
return display
|
||||||
|
end
|
||||||
|
|
||||||
|
-- render the pocket crash screen
|
||||||
|
---@param exit function callback on exit button press
|
||||||
|
---@return DisplayBox display
|
||||||
|
local function draw_pocket_crash(exit)
|
||||||
|
local DisplayBox = require("graphics.elements.DisplayBox")
|
||||||
|
local Div = require("graphics.elements.Div")
|
||||||
|
local Rectangle = require("graphics.elements.Rectangle")
|
||||||
|
local TextBox = require("graphics.elements.TextBox")
|
||||||
|
local PushButton = require("graphics.elements.controls.PushButton")
|
||||||
|
|
||||||
|
local display = DisplayBox{window=term.current(),fg_bg=core.cpair(colors.white,colors.lightGray)}
|
||||||
|
|
||||||
|
local warning = Div{parent=display,x=2,y=1}
|
||||||
|
TextBox{parent=warning,x=4,y=1,text="\x90",width=1,fg_bg=core.cpair(colors.yellow,colors.lightGray)}
|
||||||
|
TextBox{parent=warning,x=3,text="\x81 ",width=2,fg_bg=core.cpair(colors.lightGray,colors.yellow)}
|
||||||
|
TextBox{parent=warning,x=5,y=2,text="\x94",width=1,fg_bg=core.cpair(colors.yellow,colors.lightGray)}
|
||||||
|
TextBox{parent=warning,x=2,text="\x81 ",width=4,fg_bg=core.cpair(colors.lightGray,colors.yellow)}
|
||||||
|
TextBox{parent=warning,x=6,y=3,text="\x94",width=1,fg_bg=core.cpair(colors.yellow,colors.lightGray)}
|
||||||
|
TextBox{parent=warning,text="\x8e\x8f\x8f\x8e\x8f\x8f\x84",width=7,fg_bg=core.cpair(colors.yellow,colors.lightGray)}
|
||||||
|
TextBox{parent=warning,x=4,y=2,text="\x90",width=1,fg_bg=core.cpair(colors.lightGray,colors.yellow)}
|
||||||
|
TextBox{parent=warning,x=4,y=3,text="\x85",width=1,fg_bg=core.cpair(colors.lightGray,colors.yellow)}
|
||||||
|
|
||||||
|
TextBox{parent=display,x=10,y=2,text=" Critical Software Fault",width=16,alignment=core.ALIGN.CENTER,fg_bg=core.cpair(colors.yellow,colors._INHERIT)}
|
||||||
|
TextBox{parent=display,x=2,y=5,text="Consider reporting this on the cc-mek-scada Discord or GitHub.",width=36,alignment=core.ALIGN.CENTER}
|
||||||
|
|
||||||
|
local box = Rectangle{parent=display,y=9,width=display.get_width(),height=8,fg_bg=core.cpair(colors.black,colors.white)}
|
||||||
|
TextBox{parent=box,text=err}
|
||||||
|
|
||||||
|
PushButton{parent=display,x=11,y=18,text=" Exit ",callback=exit,active_fg_bg=core.cpair(colors.white,colors.gray),fg_bg=core.cpair(colors.black,colors.red)}
|
||||||
|
TextBox{parent=display,x=2,y=20,text="see logs for details",width=24,alignment=core.ALIGN.CENTER,fg_bg=core.cpair(colors.gray,colors._INHERIT)}
|
||||||
|
|
||||||
|
return display
|
||||||
|
end
|
||||||
|
|
||||||
-- when running with debug logs, log the useful information that the crash handler knows
|
-- when running with debug logs, log the useful information that the crash handler knows
|
||||||
function crash.dbg_log_env() log_versions(log.debug) end
|
function crash.dbg_log_env() log_versions(log.debug) end
|
||||||
|
|
||||||
@ -54,9 +125,41 @@ end
|
|||||||
|
|
||||||
-- final error print on failed xpcall, app exits here
|
-- final error print on failed xpcall, app exits here
|
||||||
function crash.exit()
|
function crash.exit()
|
||||||
|
local handled, run = false, true
|
||||||
|
local display ---@type DisplayBox
|
||||||
|
|
||||||
|
-- special graphical crash screen
|
||||||
|
if has_graphics then
|
||||||
|
handled, display = pcall(util.trinary(_is_pocket_env, draw_pocket_crash, draw_computer_crash), function () run = false end)
|
||||||
|
|
||||||
|
-- event loop
|
||||||
|
while display and run do
|
||||||
|
local event, param1, param2, param3 = util.pull_event()
|
||||||
|
|
||||||
|
-- handle event
|
||||||
|
if event == "mouse_click" or event == "mouse_up" or event == "double_click" then
|
||||||
|
local mouse = core.events.new_mouse_event(event, param1, param2, param3)
|
||||||
|
if mouse then display.handle_mouse(mouse) end
|
||||||
|
elseif event == "terminate" then
|
||||||
|
break
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
display.delete()
|
||||||
|
|
||||||
|
term.setCursorPos(1, 1)
|
||||||
|
term.setTextColor(colors.white)
|
||||||
|
term.setBackgroundColor(colors.black)
|
||||||
|
term.clear()
|
||||||
|
end
|
||||||
|
|
||||||
log.close()
|
log.close()
|
||||||
util.println("fatal error occured in main application:")
|
|
||||||
error(err, 0)
|
-- default text failure message
|
||||||
|
if not handled then
|
||||||
|
util.println("fatal error occured in main application:")
|
||||||
|
error(err, 0)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
return crash
|
return crash
|
||||||
|
|||||||
@ -24,7 +24,7 @@ local t_pack = table.pack
|
|||||||
local util = {}
|
local util = {}
|
||||||
|
|
||||||
-- scada-common version
|
-- scada-common version
|
||||||
util.version = "1.4.12"
|
util.version = "1.5.1"
|
||||||
|
|
||||||
util.TICK_TIME_S = 0.05
|
util.TICK_TIME_S = 0.05
|
||||||
util.TICK_TIME_MS = 50
|
util.TICK_TIME_MS = 50
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user