2022-06-16 15:24:35 +00:00
--
-- Main SCADA Coordinator GUI
--
2022-09-07 02:38:27 +00:00
local iocontrol = require ( " coordinator.iocontrol " )
2022-12-04 18:59:10 +00:00
local sounder = require ( " coordinator.sounder " )
2022-12-05 21:17:09 +00:00
local util = require ( " scada-common.util " )
2022-07-10 20:15:30 +00:00
2022-09-05 20:04:32 +00:00
local style = require ( " coordinator.ui.style " )
2022-06-16 15:24:35 +00:00
local unit_overview = require ( " coordinator.ui.components.unit_overview " )
2022-12-10 20:44:11 +00:00
local imatrix = require ( " coordinator.ui.components.imatrix " )
2022-06-16 15:24:35 +00:00
2022-09-05 20:04:32 +00:00
local core = require ( " graphics.core " )
2022-12-04 18:59:10 +00:00
local ColorMap = require ( " graphics.elements.colormap " )
2022-09-05 20:04:32 +00:00
local DisplayBox = require ( " graphics.elements.displaybox " )
local TextBox = require ( " graphics.elements.textbox " )
2022-12-04 18:59:10 +00:00
local PushButton = require ( " graphics.elements.controls.push_button " )
local SwitchButton = require ( " graphics.elements.controls.switch_button " )
2022-12-06 16:40:13 +00:00
local DataIndicator = require ( " graphics.elements.indicators.data " )
2022-06-16 15:24:35 +00:00
local TEXT_ALIGN = core.graphics . TEXT_ALIGN
2022-12-04 18:59:10 +00:00
local cpair = core.graphics . cpair
2022-09-07 02:38:27 +00:00
-- create new main view
---@param monitor table main viewscreen
2022-06-16 15:24:35 +00:00
local function init ( monitor )
2022-12-06 16:40:13 +00:00
local facility = iocontrol.get_db ( ) . facility
local units = iocontrol.get_db ( ) . units
2022-06-16 15:24:35 +00:00
local main = DisplayBox { window = monitor , fg_bg = style.root }
-- window header message
2022-12-06 16:40:13 +00:00
local header = TextBox { parent = main , y = 1 , text = " Nuclear Generation Facility SCADA Coordinator " , alignment = TEXT_ALIGN.CENTER , height = 1 , fg_bg = style.header }
local ping = DataIndicator { parent = main , x = 1 , y = 1 , label = " SVTT " , format = " %d " , value = 0 , unit = " ms " , lu_colors = cpair ( colors.lightGray , colors.white ) , width = 12 , fg_bg = style.header }
-- max length example: "01:23:45 AM - Wednesday, September 28 2022"
local datetime = TextBox { parent = main , x = ( header.width ( ) - 42 ) , y = 1 , text = " " , alignment = TEXT_ALIGN.RIGHT , width = 42 , height = 1 , fg_bg = style.header }
2022-06-16 15:24:35 +00:00
2022-12-06 16:40:13 +00:00
facility.ps . subscribe ( " sv_ping " , ping.update )
facility.ps . subscribe ( " date_time " , datetime.set_value )
2022-07-10 20:15:30 +00:00
2022-07-14 17:47:39 +00:00
local uo_1 , uo_2 , uo_3 , uo_4 ---@type graphics_element
2022-12-05 21:17:09 +00:00
local cnc_y_start = 3
2022-06-16 15:24:35 +00:00
-- unit overviews
2022-12-06 16:40:13 +00:00
if facility.num_units >= 1 then
uo_1 = unit_overview ( main , 2 , 3 , units [ 1 ] )
2022-12-05 21:17:09 +00:00
cnc_y_start = cnc_y_start + uo_1.height ( ) + 1
end
2022-12-06 16:40:13 +00:00
if facility.num_units >= 2 then
uo_2 = unit_overview ( main , 84 , 3 , units [ 2 ] )
2022-12-05 21:17:09 +00:00
end
2022-07-14 17:47:39 +00:00
2022-12-06 16:40:13 +00:00
if facility.num_units >= 3 then
2022-07-14 17:47:39 +00:00
-- base offset 3, spacing 1, max height of units 1 and 2
local row_2_offset = 3 + 1 + math.max ( uo_1.height ( ) , uo_2.height ( ) )
2022-12-06 16:40:13 +00:00
uo_3 = unit_overview ( main , 2 , row_2_offset , units [ 3 ] )
2022-12-05 21:17:09 +00:00
cnc_y_start = cnc_y_start + uo_3.height ( ) + 1
2022-12-06 16:40:13 +00:00
if facility.num_units == 4 then
uo_4 = unit_overview ( main , 84 , row_2_offset , units [ 4 ] )
2022-12-05 21:17:09 +00:00
end
2022-07-14 17:47:39 +00:00
end
-- command & control
2022-06-16 15:24:35 +00:00
2022-12-06 16:40:13 +00:00
TextBox { parent = main , y = cnc_y_start , text = util.strrep ( " \x8c " , header.width ( ) ) , alignment = TEXT_ALIGN.CENTER , height = 1 , fg_bg = cpair ( colors.lightGray , colors.gray ) }
2022-12-05 21:17:09 +00:00
2022-12-10 20:44:11 +00:00
cnc_y_start = cnc_y_start + 2
2022-12-04 18:59:10 +00:00
-- testing
---@fixme remove test code
ColorMap { parent = main , x = 2 , y = ( main.height ( ) - 1 ) }
2022-12-10 20:44:11 +00:00
PushButton { parent = main , x = 2 , y = cnc_y_start , text = " TEST 1 " , min_width = 8 , fg_bg = cpair ( colors.black , colors.yellow ) , active_fg_bg = cpair ( colors.white , colors.gray ) , callback = sounder.test_1 }
2022-12-04 18:59:10 +00:00
PushButton { parent = main , x = 2 , text = " TEST 2 " , min_width = 8 , fg_bg = cpair ( colors.black , colors.yellow ) , active_fg_bg = cpair ( colors.white , colors.gray ) , callback = sounder.test_2 }
PushButton { parent = main , x = 2 , text = " TEST 3 " , min_width = 8 , fg_bg = cpair ( colors.black , colors.yellow ) , active_fg_bg = cpair ( colors.white , colors.gray ) , callback = sounder.test_3 }
PushButton { parent = main , x = 2 , text = " TEST 4 " , min_width = 8 , fg_bg = cpair ( colors.black , colors.yellow ) , active_fg_bg = cpair ( colors.white , colors.gray ) , callback = sounder.test_4 }
PushButton { parent = main , x = 2 , text = " TEST 5 " , min_width = 8 , fg_bg = cpair ( colors.black , colors.yellow ) , active_fg_bg = cpair ( colors.white , colors.gray ) , callback = sounder.test_5 }
PushButton { parent = main , x = 2 , text = " TEST 6 " , min_width = 8 , fg_bg = cpair ( colors.black , colors.yellow ) , active_fg_bg = cpair ( colors.white , colors.gray ) , callback = sounder.test_6 }
PushButton { parent = main , x = 2 , text = " TEST 7 " , min_width = 8 , fg_bg = cpair ( colors.black , colors.yellow ) , active_fg_bg = cpair ( colors.white , colors.gray ) , callback = sounder.test_7 }
PushButton { parent = main , x = 2 , text = " TEST 8 " , min_width = 8 , fg_bg = cpair ( colors.black , colors.yellow ) , active_fg_bg = cpair ( colors.white , colors.gray ) , callback = sounder.test_8 }
PushButton { parent = main , x = 2 , text = " STOP " , min_width = 8 , fg_bg = cpair ( colors.black , colors.red ) , active_fg_bg = cpair ( colors.white , colors.gray ) , callback = sounder.stop }
PushButton { parent = main , x = 2 , text = " PSCALE " , min_width = 8 , fg_bg = cpair ( colors.black , colors.blue ) , active_fg_bg = cpair ( colors.white , colors.gray ) , callback = sounder.test_power_scale }
2022-12-10 20:44:11 +00:00
SwitchButton { parent = main , x = 12 , y = cnc_y_start , text = " CONTAINMENT BREACH " , min_width = 23 , fg_bg = cpair ( colors.black , colors.yellow ) , active_fg_bg = cpair ( colors.white , colors.gray ) , callback = sounder.test_breach }
2022-12-04 18:59:10 +00:00
SwitchButton { parent = main , x = 12 , text = " CONTAINMENT RADIATION " , min_width = 23 , fg_bg = cpair ( colors.black , colors.yellow ) , active_fg_bg = cpair ( colors.white , colors.gray ) , callback = sounder.test_rad }
SwitchButton { parent = main , x = 12 , text = " REACTOR LOST " , min_width = 23 , fg_bg = cpair ( colors.black , colors.yellow ) , active_fg_bg = cpair ( colors.white , colors.gray ) , callback = sounder.test_lost }
SwitchButton { parent = main , x = 12 , text = " CRITICAL DAMAGE " , min_width = 23 , fg_bg = cpair ( colors.black , colors.yellow ) , active_fg_bg = cpair ( colors.white , colors.gray ) , callback = sounder.test_crit }
SwitchButton { parent = main , x = 12 , text = " REACTOR DAMAGE " , min_width = 23 , fg_bg = cpair ( colors.black , colors.yellow ) , active_fg_bg = cpair ( colors.white , colors.gray ) , callback = sounder.test_dmg }
SwitchButton { parent = main , x = 12 , text = " REACTOR OVER TEMP " , min_width = 23 , fg_bg = cpair ( colors.black , colors.yellow ) , active_fg_bg = cpair ( colors.white , colors.gray ) , callback = sounder.test_overtemp }
SwitchButton { parent = main , x = 12 , text = " REACTOR HIGH TEMP " , min_width = 23 , fg_bg = cpair ( colors.black , colors.yellow ) , active_fg_bg = cpair ( colors.white , colors.gray ) , callback = sounder.test_hightemp }
SwitchButton { parent = main , x = 12 , text = " REACTOR WASTE LEAK " , min_width = 23 , fg_bg = cpair ( colors.black , colors.yellow ) , active_fg_bg = cpair ( colors.white , colors.gray ) , callback = sounder.test_wasteleak }
SwitchButton { parent = main , x = 12 , text = " REACTOR WASTE HIGH " , min_width = 23 , fg_bg = cpair ( colors.black , colors.yellow ) , active_fg_bg = cpair ( colors.white , colors.gray ) , callback = sounder.test_highwaste }
SwitchButton { parent = main , x = 12 , text = " RPS TRANSIENT " , min_width = 23 , fg_bg = cpair ( colors.black , colors.yellow ) , active_fg_bg = cpair ( colors.white , colors.gray ) , callback = sounder.test_rps }
SwitchButton { parent = main , x = 12 , text = " RCS TRANSIENT " , min_width = 23 , fg_bg = cpair ( colors.black , colors.yellow ) , active_fg_bg = cpair ( colors.white , colors.gray ) , callback = sounder.test_rcs }
SwitchButton { parent = main , x = 12 , text = " TURBINE TRIP " , min_width = 23 , fg_bg = cpair ( colors.black , colors.yellow ) , active_fg_bg = cpair ( colors.white , colors.gray ) , callback = sounder.test_turbinet }
2022-12-10 20:44:11 +00:00
local imatrix_1 = imatrix ( main , 131 , cnc_y_start , facility.induction_data_tbl [ 1 ] , facility.induction_ps_tbl [ 1 ] )
2022-06-16 15:24:35 +00:00
return main
end
return init