From 49605e5966c03f14a1568a75849e1acd3702116b Mon Sep 17 00:00:00 2001 From: Mikayla Fischler Date: Wed, 7 Sep 2022 10:39:51 -0400 Subject: [PATCH] added tri-state indicator light --- graphics/elements/indicators/light.lua | 2 - graphics/elements/indicators/trilight.lua | 65 +++++++++++++++++++++++ 2 files changed, 65 insertions(+), 2 deletions(-) create mode 100644 graphics/elements/indicators/trilight.lua diff --git a/graphics/elements/indicators/light.lua b/graphics/elements/indicators/light.lua index e16a68a..411982d 100644 --- a/graphics/elements/indicators/light.lua +++ b/graphics/elements/indicators/light.lua @@ -1,7 +1,5 @@ -- Indicator Light Graphics Element -local util = require("scada-common.util") - local element = require("graphics.element") ---@class indicator_light_args diff --git a/graphics/elements/indicators/trilight.lua b/graphics/elements/indicators/trilight.lua new file mode 100644 index 0000000..d73516f --- /dev/null +++ b/graphics/elements/indicators/trilight.lua @@ -0,0 +1,65 @@ +-- Tri-State Indicator Light Graphics Element + +local element = require("graphics.element") + +---@class tristate_indicator_light_args +---@field label string indicator label +---@field c_off color color for off +---@field c1 color color for state 1 +---@field c2 color color for state 2 +---@field c3 color color for state 3 +---@field min_label_width? integer label length if omitted +---@field parent graphics_element +---@field id? string element id +---@field x? integer 1 if omitted +---@field y? integer 1 if omitted +---@field fg_bg? cpair foreground/background colors + +-- new indicator light +---@param args tristate_indicator_light_args +---@return graphics_element element, element_id id +local function tristate_indicator_light(args) + assert(type(args.label) == "string", "graphics.elements.indicators.trilight: label is a required field") + assert(type(args.c_off) == "integer", "graphics.elements.indicators.trilight: c_off is a required field") + assert(type(args.c1) == "integer", "graphics.elements.indicators.trilight: c1 is a required field") + assert(type(args.c2) == "integer", "graphics.elements.indicators.trilight: c2 is a required field") + assert(type(args.c3) == "integer", "graphics.elements.indicators.trilight: c3 is a required field") + + -- single line + args.height = 1 + + -- determine width + args.width = math.max(args.min_label_width or 1, string.len(args.label)) + 2 + + -- blit translations + local c_off colors.toBlit(args.c_off) + local c1 colors.toBlit(args.c1) + local c2 colors.toBlit(args.c2) + local c3 colors.toBlit(args.c3) + + -- create new graphics element base object + local e = element.new(args) + + -- on state change + ---@param new_state integer indicator state + function e.on_update(new_state) + e.window.setCursorPos(1, 1) + if new_state == 1 then + e.window.blit(" \x95", "0" .. c1, c1 .. e.fg_bg.blit_bkg) + elseif new_state == 2 then + e.window.blit(" \x95", "0" .. c2, c2 .. e.fg_bg.blit_bkg) + elseif new_state == 3 then + e.window.blit(" \x95", "0" .. c3, c3 .. e.fg_bg.blit_bkg) + else + e.window.blit(" \x95", "0" ..c_off, c_off .. e.fg_bg.blit_bkg) + end + end + + -- write label and initial indicator light + e.on_update(0) + e.window.write(args.label) + + return e.get() +end + +return tristate_indicator_light