2022-08-01 16:05:39 +00:00
|
|
|
-- Reactor Core View Graphics Element
|
|
|
|
|
|
|
|
local util = require("scada-common.util")
|
|
|
|
|
|
|
|
local core = require("graphics.core")
|
|
|
|
local element = require("graphics.element")
|
|
|
|
|
|
|
|
---@class core_map_args
|
2022-08-02 14:46:21 +00:00
|
|
|
---@field reactor_l integer reactor length
|
|
|
|
---@field reactor_w integer reactor width
|
2022-08-01 16:05:39 +00:00
|
|
|
---@field parent graphics_element
|
|
|
|
---@field id? string element id
|
|
|
|
---@field x? integer 1 if omitted
|
|
|
|
---@field y? integer 1 if omitted
|
|
|
|
|
|
|
|
-- new core map box
|
|
|
|
---@param args core_map_args
|
|
|
|
---@return graphics_element element, element_id id
|
|
|
|
local function core_map(args)
|
2022-08-02 14:46:21 +00:00
|
|
|
assert(util.is_int(args.reactor_l), "graphics.elements.indicators.coremap: reactor_l is a required field")
|
|
|
|
assert(util.is_int(args.reactor_w), "graphics.elements.indicators.coremap: reactor_w is a required field")
|
2022-08-01 16:05:39 +00:00
|
|
|
|
2022-08-02 14:46:21 +00:00
|
|
|
args.width = args.reactor_l
|
|
|
|
args.height = args.reactor_w
|
|
|
|
|
|
|
|
-- inherit only foreground color
|
|
|
|
args.fg_bg = core.graphics.cpair(args.parent.get_fg_bg().fgd, colors.gray)
|
2022-08-01 16:05:39 +00:00
|
|
|
|
|
|
|
-- create new graphics element base object
|
|
|
|
local e = element.new(args)
|
|
|
|
|
|
|
|
local start_x = 2
|
|
|
|
local start_y = 2
|
|
|
|
|
2022-08-02 14:46:21 +00:00
|
|
|
local inner_width = e.frame.w - 2
|
2022-08-01 16:05:39 +00:00
|
|
|
local inner_height = e.frame.h - 2
|
|
|
|
local alternator = true
|
|
|
|
|
|
|
|
-- check dimensions
|
|
|
|
assert(inner_width > 0, "graphics.elements.indicators.coremap: inner_width <= 0")
|
|
|
|
assert(inner_height > 0, "graphics.elements.indicators.coremap: inner_height <= 0")
|
|
|
|
assert(start_x <= inner_width, "graphics.elements.indicators.coremap: start_x > inner_width")
|
|
|
|
assert(start_y <= inner_height, "graphics.elements.indicators.coremap: start_y > inner_height")
|
|
|
|
|
2022-08-02 14:46:21 +00:00
|
|
|
-- label coordinates
|
|
|
|
|
|
|
|
e.window.setTextColor(colors.white)
|
|
|
|
|
|
|
|
for x = 0, (inner_width - 1) do
|
|
|
|
e.window.setCursorPos(x + start_x, 1)
|
|
|
|
e.window.write(util.sprintf("%X", x))
|
|
|
|
end
|
|
|
|
|
|
|
|
for y = 0, (inner_height - 1) do
|
|
|
|
e.window.setCursorPos(1, y + start_y)
|
|
|
|
e.window.write(util.sprintf("%X", y))
|
|
|
|
end
|
|
|
|
|
|
|
|
-- even out bottom edge
|
|
|
|
e.window.setTextColor(e.fg_bg.bkg)
|
|
|
|
e.window.setBackgroundColor(args.parent.get_fg_bg().bkg)
|
|
|
|
e.window.setCursorPos(1, e.frame.h)
|
|
|
|
e.window.write(util.strrep("\x8f", e.frame.w))
|
|
|
|
e.window.setTextColor(e.fg_bg.fgd)
|
|
|
|
e.window.setBackgroundColor(e.fg_bg.bkg)
|
|
|
|
|
2022-08-01 16:05:39 +00:00
|
|
|
-- draw the core
|
2022-08-02 14:46:21 +00:00
|
|
|
---@param t number temperature in K
|
2022-08-01 16:05:39 +00:00
|
|
|
local function draw(t)
|
|
|
|
local i = 1
|
2022-08-02 14:46:21 +00:00
|
|
|
local back_c = "F"
|
|
|
|
local text_c = "8"
|
2022-08-01 16:05:39 +00:00
|
|
|
|
|
|
|
-- determine fuel assembly coloring
|
|
|
|
if t <= 300 then
|
|
|
|
-- gray
|
2022-08-02 14:46:21 +00:00
|
|
|
text_c = "8"
|
2022-08-01 16:05:39 +00:00
|
|
|
elseif t <= 350 then
|
|
|
|
-- blue
|
2022-08-02 14:46:21 +00:00
|
|
|
text_c = "3"
|
2022-08-01 16:05:39 +00:00
|
|
|
elseif t < 600 then
|
|
|
|
-- green
|
2022-08-02 14:46:21 +00:00
|
|
|
text_c = "D"
|
2022-08-01 16:05:39 +00:00
|
|
|
elseif t < 1000 then
|
|
|
|
-- yellow
|
2022-08-02 14:46:21 +00:00
|
|
|
text_c = "4"
|
|
|
|
-- back_c = "8"
|
2022-08-01 16:05:39 +00:00
|
|
|
elseif t < 1200 then
|
|
|
|
-- orange
|
2022-08-02 14:46:21 +00:00
|
|
|
text_c = "1"
|
2022-08-01 16:05:39 +00:00
|
|
|
elseif t < 1300 then
|
|
|
|
-- red
|
2022-08-02 14:46:21 +00:00
|
|
|
text_c = "E"
|
2022-08-01 16:05:39 +00:00
|
|
|
else
|
|
|
|
-- pink
|
2022-08-02 14:46:21 +00:00
|
|
|
text_c = "2"
|
2022-08-01 16:05:39 +00:00
|
|
|
end
|
|
|
|
|
|
|
|
-- draw pattern
|
|
|
|
for y = start_y, inner_height + (start_y - 1) do
|
|
|
|
e.window.setCursorPos(start_x, y)
|
|
|
|
for x = 1, inner_width do
|
|
|
|
local str = util.sprintf("%02X", i)
|
|
|
|
|
|
|
|
if alternator then
|
|
|
|
i = i + 1
|
2022-08-02 14:46:21 +00:00
|
|
|
e.window.blit("\x07", text_c, back_c)
|
2022-08-01 16:05:39 +00:00
|
|
|
else
|
2022-08-02 14:46:21 +00:00
|
|
|
e.window.blit("\x07", "7", "8")
|
2022-08-01 16:05:39 +00:00
|
|
|
end
|
|
|
|
|
|
|
|
alternator = not alternator
|
|
|
|
end
|
|
|
|
|
|
|
|
if inner_width % 2 == 0 then alternator = not alternator end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
-- on state change
|
2022-08-02 14:46:21 +00:00
|
|
|
---@param temperature number temperature in Kelvin
|
2022-08-01 16:05:39 +00:00
|
|
|
function e.on_update(temperature)
|
2022-09-12 16:59:28 +00:00
|
|
|
e.value = temperature
|
2022-08-01 16:05:39 +00:00
|
|
|
draw(temperature)
|
|
|
|
end
|
|
|
|
|
2022-09-12 16:59:28 +00:00
|
|
|
function e.set_value(val) e.on_update(val) end
|
|
|
|
|
|
|
|
-- initial draw at base temp
|
|
|
|
e.on_update(300)
|
|
|
|
|
2022-08-01 16:05:39 +00:00
|
|
|
return e.get()
|
|
|
|
end
|
|
|
|
|
|
|
|
return core_map
|