ExperimentalGear/scripts/titlescreen/pages/boot/bootpage.lua

112 lines
3.7 KiB
Lua

require("common.class")
require("common.filereader")
local Dim = require("common.dimensions")
local Version = require("common.version")
local Page = require("components.pager.page")
local CheckUpdatePage = require("titlescreen.pages.boot.checkupdatepage")
local ServiceField = require("titlescreen.fields.service.servicefield")
local ListField = require("titlescreen.fields.service.listfield")
local SelfTestField = require("titlescreen.fields.boot.selftestfield")
---@class BootPage: Page
local BootPage = {
__tostring = function() return "BootPage" end,
}
---Create a new BootPage instance
---@param o? table # initial parameters
---@return BootPage
function BootPage:new(o)
o = o or {}
local this = Inherit(self, o, Page)
this._networkResult = {}
this:addField(ServiceField:new{posX = 32, posY = 32, label = Version.getLongVersion(), value = ""})
this:addField(ServiceField:new{posX = 64, posY = 64, label = "UNNAMED SDVX CLONE STARTUP...", value = ""})
local valueOffX = 220
this._mainIoTestField = SelfTestField:new{label = "MAIN I/O", VALUE_OFFSETX = valueOffX}
this._mainIoTestField.checkTask = function(obj)
return SelfTestStatusEnum.OK
end
this._mainIoTestField.onStatusChange = function(status)
if status == SelfTestStatusEnum.OK then
this._skinConfigTestField:activate()
end
end
this._skinConfigTestField = SelfTestField:new{label = "SKIN CONFIG", VALUE_OFFSETX = valueOffX}
this._skinConfigTestField.checkTask = function(obj)
local crewpath = "skins/" .. game.GetSkin() .. "/textures/crew/anim/" .. game.GetSkinSetting("single_idol")
if not IsDir(crewpath) then
return SelfTestStatusEnum.ERROR
end
return SelfTestStatusEnum.OK
end
this._skinConfigTestField.onStatusChange = function(status)
if status == SelfTestStatusEnum.OK then
this._networkTestField:activate()
end
end
this._networkTestField = SelfTestField:new{label = "NETWORK", VALUE_OFFSETX = valueOffX}
-- set up async network check
this._networkTestField.checkTask = function(obj)
local status = SelfTestStatusEnum.INPROGRESS
if not IRData.Active then
return SelfTestStatusEnum.PASS
end
while status == SelfTestStatusEnum.INPROGRESS do
if this._networkResult.statusCode == IRData.States.Success then
status = SelfTestStatusEnum.OK
elseif this._networkResult.statusCode then
status = SelfTestStatusEnum.ERROR -- there's a response, but it's not success
end
coroutine.yield(status)
end
return status
end
this._networkTestField.onStatusChange = function(status)
if status == SelfTestStatusEnum.INPROGRESS then
IR.Heartbeat(function(res) this._networkResult = res end) -- IR doesn't like being called in a coroutine
elseif status == SelfTestStatusEnum.PASS or status == SelfTestStatusEnum.OK then
if this.viewHandler then
this.viewHandler:navigate(CheckUpdatePage:new())
end
end
end
local list = ListField:new{posX = 64, posY = 96}
list:addField(this._mainIoTestField)
list:addField(this._skinConfigTestField)
list:addField(this._networkTestField)
this:addField(list)
return this
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
local first = true
function BootPage:render(deltaTime)
if first then
self._mainIoTestField:activate()
first = false
end
Page.render(self, deltaTime)
end
return BootPage