require "common.globals" require "common.class" require "common.filereader" local Dim = require "common.dimensions" local Version = require "common.version" local PageManager = require "api.page.pagemanager" local Page = require "api.page.page" local CheckUpdatePage = require "titlescreen.pages.boot.checkupdatepage" local ServiceField = require "api.page.servicefield" local ListField = require "titlescreen.components.listfield" local SelfTestField = require "titlescreen.components.selftestfield" ---@class BootPage: Page local BootPage = { __name = "BootPage", } ---Create a new BootPage instance ---@param params? BootPage # initial parameters ---@return BootPage function BootPage.new(params) params = params or {} local self = CreateInstance(BootPage, params, Page) local pageManager = PageManager.get() self._networkResult = {} pageManager:getPage(CheckUpdatePage).onInvalidation = function (page_self, reason) self:onInvalidation(reason) end self:addField(ServiceField.new{posX = 32, posY = 32, label = Version.getLongVersion(), value = ""}) self:addField(ServiceField.new{posX = 64, posY = 64, label = "UNNAMED SDVX CLONE STARTUP...", value = ""}) local valueOffX = 220 self._mainIoTestField = SelfTestField.new{label = "MAIN I/O", VALUE_OFFSETX = valueOffX} self._mainIoTestField.checkTask = function(obj) return SelfTestStatus.OK end self._mainIoTestField.onStatusChange = function(_, status) if status == SelfTestStatus.OK then self._skinConfigTestField:activate() end end self._skinConfigTestField = SelfTestField.new{label = "SKIN CONFIG", VALUE_OFFSETX = valueOffX} self._skinConfigTestField.checkTask = function(obj) local crewpath = "skins/" .. game.GetSkin() .. "/textures/crew/anim/" .. game.GetSkinSetting("single_idol") if not IsDir(crewpath) then return SelfTestStatus.ERROR end return SelfTestStatus.OK end self._skinConfigTestField.onStatusChange = function(_, status) if status == SelfTestStatus.OK then self._networkTestField:activate() end end self._networkTestField = SelfTestField.new{label = "NETWORK", VALUE_OFFSETX = valueOffX} -- set up async network check self._networkTestField.checkTask = function(obj) local status = SelfTestStatus.INPROGRESS if not IRData.Active then return SelfTestStatus.PASS end while status == SelfTestStatus.INPROGRESS do if self._networkResult.statusCode == IRData.States.Success then status = SelfTestStatus.OK elseif self._networkResult.statusCode then status = SelfTestStatus.ERROR -- there's a response, but it's not success end coroutine.yield(status) end return status end self._networkTestField.onStatusChange = function(_, status) if status == SelfTestStatus.INPROGRESS then IR.Heartbeat(function(res) self._networkResult = res end) -- IR doesn't like being called in a coroutine elseif status == SelfTestStatus.PASS or status == SelfTestStatus.OK then if self.viewHandler then self.viewHandler:navigate(pageManager:getPage(CheckUpdatePage)) self.viewHandler:get():init() end end end self._mainIoTestField:init() self._skinConfigTestField:init() self._networkTestField:init() local list = ListField.new{posX = 64, posY = 96} list:addField(self._mainIoTestField) list:addField(self._skinConfigTestField) list:addField(self._networkTestField) self:addField(list) return self end function BootPage:init() self._mainIoTestField:activate() end ---@param deltaTime number # frametime in seconds function BootPage:drawBackground(deltaTime) gfx.BeginPath() gfx.FillColor(0, 0, 0) gfx.Rect(0, 0, Dim.design.width, Dim.design.height) gfx.Fill() end return BootPage