From 9fe34648c2393dec4a151cfde43655e434e30d3a Mon Sep 17 00:00:00 2001 From: Mikayla Fischler Date: Sat, 13 Apr 2024 16:18:27 -0400 Subject: [PATCH] added system information/about app --- pocket/iocontrol.lua | 25 ++++++--- pocket/startup.lua | 3 + pocket/ui/apps/sys_apps.lua | 102 ++++++++++++++++++++++++++++++++++ pocket/ui/main.lua | 2 + pocket/ui/pages/home_page.lua | 10 ++-- 5 files changed, 130 insertions(+), 12 deletions(-) create mode 100644 pocket/ui/apps/sys_apps.lua diff --git a/pocket/iocontrol.lua b/pocket/iocontrol.lua index 1da4fc6..491ef05 100644 --- a/pocket/iocontrol.lua +++ b/pocket/iocontrol.lua @@ -2,9 +2,8 @@ -- I/O Control for Pocket Integration with Supervisor & Coordinator -- -local psil = require("scada-common.psil") -local log = require("scada-common.log") - +local log = require("scada-common.log") +local psil = require("scada-common.psil") local types = require("scada-common.types") local ALARM = types.ALARM @@ -28,16 +27,21 @@ iocontrol.LINK_STATE = LINK_STATE ---@enum POCKET_APP_ID local APP_ID = { ROOT = 1, + -- main app page UNITS = 2, - ALARMS = 3, - DUMMY = 4, - NUM_APPS = 4 + ABOUT = 3, + -- diag app page + ALARMS = 4, + -- other + DUMMY = 5, + NUM_APPS = 5 } iocontrol.APP_ID = APP_ID ---@class pocket_ioctl local io = { + version = "unknown", ps = psil.create() } @@ -77,9 +81,16 @@ function iocontrol.alloc_nav() local app = { root = { _p = nil, _c = {}, nav_to = function () end, tasks = {} }, ---@type nav_tree_page cur_page = nil, ---@type nav_tree_page + pane = pane, paned_pages = {} } + -- delayed set of the pane if it wasn't ready at the start + ---@param root_pane graphics_element multipane + function app.set_root_pane(root_pane) + app.pane = root_pane + end + -- if a pane was provided, this will switch between numbered pages ---@param idx integer page index function app.switcher(idx) @@ -106,7 +117,7 @@ function iocontrol.alloc_nav() function page.nav_to() app.cur_page = page - if pane then pane.set_value(nav_to) end + if app.pane then app.pane.set_value(nav_to) end end else function page.nav_to() diff --git a/pocket/startup.lua b/pocket/startup.lua index 622ee78..3f1d8c3 100644 --- a/pocket/startup.lua +++ b/pocket/startup.lua @@ -68,6 +68,9 @@ local function main() -- mount connected devices ppm.mount_all() + -- record version for GUI + iocontrol.get_db().version = POCKET_VERSION + ---------------------------------------- -- setup communications & clocks ---------------------------------------- diff --git a/pocket/ui/apps/sys_apps.lua b/pocket/ui/apps/sys_apps.lua new file mode 100644 index 0000000..a48f85f --- /dev/null +++ b/pocket/ui/apps/sys_apps.lua @@ -0,0 +1,102 @@ +-- +-- System Apps +-- + +local comms = require("scada-common.comms") +local lockbox = require("lockbox") +local util = require("scada-common.util") + +local iocontrol = require("pocket.iocontrol") + +local core = require("graphics.core") + +local Div = require("graphics.elements.div") +local ListBox = require("graphics.elements.listbox") +local MultiPane = require("graphics.elements.multipane") +local TextBox = require("graphics.elements.textbox") + +local PushButton = require("graphics.elements.controls.push_button") + +local cpair = core.cpair + +local ALIGN = core.ALIGN + +-- create system app pages +---@param root graphics_element parent +local function create_pages(root) + local db = iocontrol.get_db() + + ---------------- + -- About Page -- + ---------------- + + local about_root = Div{parent=root,x=1,y=1} + + local about_app = db.nav.register_app(iocontrol.APP_ID.ABOUT, about_root) + + local about_page = about_app.new_page(nil, 1) + local fw_page = about_app.new_page(about_page, 2) + local hw_page = about_app.new_page(about_page, 3) + + local about = Div{parent=about_root,x=1,y=2} + + TextBox{parent=about,y=1,text="System Information",height=1,alignment=ALIGN.CENTER} + + local btn_fg_bg = cpair(colors.lightBlue, colors.black) + local btn_active = cpair(colors.white, colors.black) + local label = cpair(colors.lightGray, colors.black) + + PushButton{parent=about,x=2,y=3,text="Firmware >",fg_bg=btn_fg_bg,active_fg_bg=btn_active,callback=fw_page.nav_to} + PushButton{parent=about,x=2,y=4,text="Host Details >",fg_bg=btn_fg_bg,active_fg_bg=btn_active,callback=hw_page.nav_to} + + local fw_div = Div{parent=about_root,x=1,y=2} + TextBox{parent=fw_div,y=1,text="Firmware Versions",height=1,alignment=ALIGN.CENTER} + + PushButton{parent=fw_div,x=2,y=1,text="<",fg_bg=btn_fg_bg,active_fg_bg=btn_active,callback=about_page.nav_to} + + local fw_list_box = ListBox{parent=fw_div,x=1,y=3,scroll_height=100,nav_fg_bg=cpair(colors.lightGray,colors.gray),nav_active=cpair(colors.white,colors.gray)} + + local fw_list = Div{parent=fw_list_box,x=1,y=2,height=18} + + TextBox{parent=fw_list,x=2,text="Pocket Version",height=1,alignment=ALIGN.LEFT,fg_bg=label} + TextBox{parent=fw_list,x=2,text=db.version,height=1,alignment=ALIGN.LEFT} + + fw_list.line_break() + TextBox{parent=fw_list,x=2,text="Comms Version",height=1,alignment=ALIGN.LEFT,fg_bg=label} + TextBox{parent=fw_list,x=2,text=comms.version,height=1,alignment=ALIGN.LEFT} + + fw_list.line_break() + TextBox{parent=fw_list,x=2,text="API Version",height=1,alignment=ALIGN.LEFT,fg_bg=label} + TextBox{parent=fw_list,x=2,text=comms.api_version,height=1,alignment=ALIGN.LEFT} + + fw_list.line_break() + TextBox{parent=fw_list,x=2,text="Common Lib Version",height=1,alignment=ALIGN.LEFT,fg_bg=label} + TextBox{parent=fw_list,x=2,text=util.version,height=1,alignment=ALIGN.LEFT} + + fw_list.line_break() + TextBox{parent=fw_list,x=2,text="Graphics Version",height=1,alignment=ALIGN.LEFT,fg_bg=label} + TextBox{parent=fw_list,x=2,text=core.version,height=1,alignment=ALIGN.LEFT} + + fw_list.line_break() + TextBox{parent=fw_list,x=2,text="Lockbox Version",height=1,alignment=ALIGN.LEFT,fg_bg=label} + TextBox{parent=fw_list,x=2,text=lockbox.version,height=1,alignment=ALIGN.LEFT} + + local hw_div = Div{parent=about_root,x=1,y=2} + TextBox{parent=hw_div,y=1,text="Host Versions",height=1,alignment=ALIGN.CENTER} + + PushButton{parent=hw_div,x=2,y=1,text="<",fg_bg=btn_fg_bg,active_fg_bg=btn_active,callback=about_page.nav_to} + + hw_div.line_break() + TextBox{parent=hw_div,x=2,text="Lua Version",height=1,alignment=ALIGN.LEFT,fg_bg=label} + TextBox{parent=hw_div,x=2,text=_VERSION,height=1,alignment=ALIGN.LEFT} + + hw_div.line_break() + TextBox{parent=hw_div,x=2,text="Environment",height=1,alignment=ALIGN.LEFT,fg_bg=label} + TextBox{parent=hw_div,x=2,text=_HOST,height=6,alignment=ALIGN.LEFT} + + local root_pane = MultiPane{parent=about_root,x=1,y=1,panes={about,fw_div,hw_div}} + + about_app.set_root_pane(root_pane) +end + +return create_pages diff --git a/pocket/ui/main.lua b/pocket/ui/main.lua index 1667693..6bd2479 100644 --- a/pocket/ui/main.lua +++ b/pocket/ui/main.lua @@ -6,6 +6,7 @@ local iocontrol = require("pocket.iocontrol") local diag_apps = require("pocket.ui.apps.diag_apps") local dummy_app = require("pocket.ui.apps.dummy_app") +local sys_apps = require("pocket.ui.apps.sys_apps") local conn_waiting = require("pocket.ui.components.conn_waiting") @@ -78,6 +79,7 @@ local function init(main) unit_page(page_div) diag_apps(page_div) + sys_apps(page_div) dummy_app(page_div) assert(#db.nav.get_containers() == iocontrol.APP_ID.NUM_APPS, "app IDs were not sequential or some apps weren't registered") diff --git a/pocket/ui/pages/home_page.lua b/pocket/ui/pages/home_page.lua index 677be18..0ea7c3f 100644 --- a/pocket/ui/pages/home_page.lua +++ b/pocket/ui/pages/home_page.lua @@ -25,17 +25,16 @@ local function new_view(root) local main = Div{parent=root,x=1,y=1,height=19} + local app = db.nav.register_app(iocontrol.APP_ID.ROOT, main) + local apps_1 = Div{parent=main,x=1,y=1,height=15} local apps_2 = Div{parent=main,x=1,y=1,height=15} local panes = { apps_1, apps_2 } - local f_ref = {} - local app_pane = AppMultiPane{parent=main,x=1,y=1,height=18,panes=panes,active_color=colors.lightGray,nav_colors=cpair(colors.lightGray,colors.gray),scroll_nav=true,drag_nav=true,callback=function(v)f_ref.callback(v)end} - - local app = db.nav.register_app(iocontrol.APP_ID.ROOT, main, app_pane) - f_ref.callback = app.switcher + local app_pane = AppMultiPane{parent=main,x=1,y=1,height=18,panes=panes,active_color=colors.lightGray,nav_colors=cpair(colors.lightGray,colors.gray),scroll_nav=true,drag_nav=true,callback=app.switcher} + app.set_root_pane(app_pane) app.new_page(app.new_page(nil, 1), 2) local function open(id) db.nav.open_app(id) end @@ -48,6 +47,7 @@ local function new_view(root) App{parent=apps_1,x=3,y=7,text="\x08",title="DEV",callback=function()open(APP_ID.DUMMY)end,app_fg_bg=cpair(colors.black,colors.lightGray),active_fg_bg=active_fg_bg} App{parent=apps_1,x=10,y=7,text="\x7f",title="Waste",callback=function()open(APP_ID.DUMMY)end,app_fg_bg=cpair(colors.black,colors.brown),active_fg_bg=active_fg_bg} App{parent=apps_1,x=17,y=7,text="\xb6",title="Guide",callback=function()open(APP_ID.DUMMY)end,app_fg_bg=cpair(colors.black,colors.cyan),active_fg_bg=active_fg_bg} + App{parent=apps_1,x=3,y=12,text="?",title="About",callback=function()open(APP_ID.ABOUT)end,app_fg_bg=cpair(colors.black,colors.white),active_fg_bg=active_fg_bg} TextBox{parent=apps_2,text="Diagnostic Apps",x=1,y=2,height=1,alignment=ALIGN.CENTER}