diff --git a/src/main/resources/assets/warpdrive/lua.ComputerCraft/common/warpdriveCommons b/src/main/resources/assets/warpdrive/lua.ComputerCraft/common/warpdriveCommons index 46b2c819..9bea9ad4 100644 --- a/src/main/resources/assets/warpdrive/lua.ComputerCraft/common/warpdriveCommons +++ b/src/main/resources/assets/warpdrive/lua.ComputerCraft/common/warpdriveCommons @@ -4,7 +4,6 @@ w = {} -- properties local data = { } -local data_shouldUpdateName = true local data_name = nil local data_handlers = { } @@ -23,8 +22,6 @@ local page_callbackKey local event_refreshPeriod_s = 3.0 local event_refreshTimerId = -1 -local ship = nil - local styles = { normal = { front = colors.black , back = colors.lightGray }, good = { front = colors.lime , back = colors.lightGray }, @@ -386,10 +383,10 @@ local function format_string(value, nbchar) str = "" .. value end if nbchar ~= nil then - if #str > nbchar then - str = string.sub(str, 1, nbchar - 1) .. "~" + if #str > math.abs(nbchar) then + str = string.sub(str, 1, math.abs(nbchar) - 1) .. "~" else - str = string.sub(str .. " ", 1, nbchar) + str = string.sub(str .. " ", 1, nbchar) end end return str @@ -521,10 +518,12 @@ local function input_readText(currentValue) term.setCursorBlink(true) repeat w.status_tick() + -- update display clearing extra characters w.setColorNormal() w.setCursorPos(x, y) - w.write(input .. " ") - input = string.sub(input, -30) + w.write(w.format_string(input, 37)) + -- truncate input and set caret position + input = string.sub(input, -36) w.setCursorPos(x + #input, y) local params = { os.pullEventRaw() } @@ -865,7 +864,7 @@ local function data_inspect(key, value) end local function data_read() - w.data_updateName() + w.data_shouldUpdateName() data = { } if fs.exists("shipdata.txt") then @@ -914,40 +913,59 @@ local function data_getName() end local function data_setName() - if ship ~= nil then - w.page_begin("<==== Set ship name ====>") - w.writeLn("") - w.write("Enter ship name: ") - else - w.page_begin("<==== Set name ====>") - w.writeLn("") - w.write("Enter computer name: ") + -- check if any named component is connected + local component = "computer" + for name, handlers in pairs(data_handlers) do + if handlers.name ~= nil then + component = name + end end + -- ask for a new name + w.page_begin("<==== Set " .. component .. " name ====>") + w.writeLn("") + w.write("Enter " .. component .. " name: ") data_name = w.input_readText(data_name) + + -- update computer name os.setComputerLabel(data_name) - if ship ~= nil then - ship.shipName(data_name) + + -- update connected components + for name, handlers in pairs(data_handlers) do + if handlers.name ~= nil then + handlers.name(data_name) + end end + -- w.reboot() -- not needed end -local function data_updateName() - data_shouldUpdateName = false +local function data_shouldUpdateName() + local shouldUpdateName = false + + -- check computer name data_name = os.getComputerLabel() if data_name == nil then - data_shouldUpdateName = true + shouldUpdateName = true data_name = "" .. os.getComputerID() end - if ship ~= nil then - local shipName = ship.shipName() - if shipName == "default" then - data_shouldUpdateName = true - elseif data_name ~= shipName then - data_shouldUpdateName = true - data_name = shipName + + -- check connected components names + for name, handlers in pairs(data_handlers) do + if handlers.name ~= nil then + local componentName = handlers.name() + if componentName == "default" or componentName == "" then + shouldUpdateName = true + elseif shouldUpdateName then + data_name = componentName + elseif data_name ~= componentName then + shouldUpdateName = true + data_name = componentName + end end end + + return shouldUpdateName end local function data_splitString(source, sep) @@ -958,14 +976,18 @@ local function data_splitString(source, sep) return fields end -local function data_register(name, callbackRead, callbackSave) +local function data_register(name, callbackRead, callbackSave, callbackName) + -- read/save callbacks are always defined if callbackRead == nil then callbackRead = function() end end if callbackSave == nil then callbackSave = function() end end - data_handlers[name] = { read = callbackRead, save = callbackSave } + + -- name callback is nill when not defined + + data_handlers[name] = { read = callbackRead, save = callbackSave, name = callbackName } end ----------- Devices @@ -1023,15 +1045,12 @@ local function boot() end end - if deviceType == "warpdriveShipController" then - ship = w.device_get(address) - end w.writeLn("") end - -- update with ship name if available - w.data_updateName() - if data_shouldUpdateName then + -- synchronize computer and connected components names + local shouldUpdateName = w.data_shouldUpdateName() + if shouldUpdateName then w.data_setName() end @@ -1229,7 +1248,7 @@ w = { data_save = data_save, data_getName = data_getName, data_setName = data_setName, - data_updateName = data_updateName, + data_shouldUpdateName = data_shouldUpdateName, data_splitString = data_splitString, data_register = data_register, device_get = device_get, diff --git a/src/main/resources/assets/warpdrive/lua.ComputerCraft/warpdriveEnanReactorCore/startup b/src/main/resources/assets/warpdrive/lua.ComputerCraft/warpdriveEnanReactorCore/startup index 56f30554..7f0085e6 100644 --- a/src/main/resources/assets/warpdrive/lua.ComputerCraft/warpdriveEnanReactorCore/startup +++ b/src/main/resources/assets/warpdrive/lua.ComputerCraft/warpdriveEnanReactorCore/startup @@ -358,7 +358,7 @@ function reactor_register() w.event_register("reactorPulse" , function(eventName, param) reactor_pulse(param) return false end ) w.event_register("reactorDeactivation", function( ) w.status_showWarning("Reactor deactivated") return false end ) w.event_register("reactorActivation" , function( ) w.status_showWarning("Reactor activated") return false end ) - w.data_register("reactor", reactor_read, nil) + w.data_register("reactor", reactor_read, nil, nil) end ----------- connections status diff --git a/src/main/resources/assets/warpdrive/lua.ComputerCraft/warpdriveMainframe/startup b/src/main/resources/assets/warpdrive/lua.ComputerCraft/warpdriveMainframe/startup index 3709359b..d9bea402 100644 --- a/src/main/resources/assets/warpdrive/lua.ComputerCraft/warpdriveMainframe/startup +++ b/src/main/resources/assets/warpdrive/lua.ComputerCraft/warpdriveMainframe/startup @@ -761,7 +761,7 @@ core_movement = { 0, 0, 0 } core_rotationSteps = 0 function core_boot() - if ship == nil then + if ship == nil or ship.interfaced() == nil then return end diff --git a/src/main/resources/assets/warpdrive/lua.ComputerCraft/warpdriveShipController/startup b/src/main/resources/assets/warpdrive/lua.ComputerCraft/warpdriveShipController/startup index b3578e7b..56894950 100644 --- a/src/main/resources/assets/warpdrive/lua.ComputerCraft/warpdriveShipController/startup +++ b/src/main/resources/assets/warpdrive/lua.ComputerCraft/warpdriveShipController/startup @@ -31,8 +31,15 @@ function ship_read(parData) if data.ship_summon == nil then data.ship_summon = false end end +function ship_name(parName) + if ship == nil or ship.interfaced() == nil then + return '' + end + return ship.shipName(parName) +end + function ship_boot() - if ship == nil then + if ship == nil or ship.interfaced() == nil then return end @@ -411,7 +418,7 @@ end function ship_page_controls() w.page_begin(w.data_getName() .. " - Ship controls") - if ship == nil then + if ship == nil or ship.interfaced() == nil then w.status_showWarning("No ship controller detected") else local isValid, message = ship.isAssemblyValid() @@ -522,7 +529,7 @@ end function ship_page_crew() w.page_begin(w.data_getName() .. " - Ship crew") - if ship == nil then + if ship == nil or ship.interfaced() == nil then w.status_showWarning("No ship controller detected") else local isValid, message = ship.isAssemblyValid() @@ -580,7 +587,7 @@ end function ship_page_navigation() w.page_begin(w.data_getName() .. " - Ship navigation") - if ship == nil then + if ship == nil or ship.interfaced() == nil then w.status_showWarning("No ship controller detected") else local isValid, message = ship.isAssemblyValid() @@ -635,7 +642,7 @@ function ship_register() function(deviceType, address, wrap) ship = wrap end, function() end) w.event_register("shipCoreCooldownDone" , function() w.status_showWarning("Ship core cooldown done") return false end ) - w.data_register("ship", ship_read, nil) + w.data_register("ship", ship_read, nil, ship_name) end ----------- connections status diff --git a/src/main/resources/assets/warpdrive/lua.ComputerCraft/warpdriveWeaponController/startup b/src/main/resources/assets/warpdrive/lua.ComputerCraft/warpdriveWeaponController/startup index 3c9e3273..c48ba16f 100644 --- a/src/main/resources/assets/warpdrive/lua.ComputerCraft/warpdriveWeaponController/startup +++ b/src/main/resources/assets/warpdrive/lua.ComputerCraft/warpdriveWeaponController/startup @@ -527,7 +527,7 @@ function laser_station_page() w.write("Laser batteries:") for key, battery in pairs(laserstation.batteries) do w.setCursorPos(1, 5 + key) - laserbattery = laser_battery_getByName(battery.name) + local laserbattery = laser_battery_getByName(battery.name) if battery.enabled then w.setColorSuccess() else @@ -610,7 +610,7 @@ function laser_station_config() w.setCursorPos(1, 11) w.write("Battery enabling: ") for key, battery in pairs(laserstation.batteries) do - laserbattery = laser_battery_getByName(battery.name) + local laserbattery = laser_battery_getByName(battery.name) local msg = laser_battery_getDescription(laserbattery) w.setCursorPos(1, 11 + (key % 5)) @@ -824,7 +824,7 @@ function laser_register() function() end) w.event_register("laserScanning", function() laser_sendEvent() return false end ) w.event_register("laserSend" , function() return false end ) - w.data_register("laser", laser_read, laser_save) + w.data_register("laser", laser_read, laser_save, nil) end ----------- connections status diff --git a/src/main/resources/assets/warpdrive/lua.OpenComputers/common/usr/lib/warpdriveCommons.lua b/src/main/resources/assets/warpdrive/lua.OpenComputers/common/usr/lib/warpdriveCommons.lua index 9578fbd1..ba5dabc0 100644 --- a/src/main/resources/assets/warpdrive/lua.OpenComputers/common/usr/lib/warpdriveCommons.lua +++ b/src/main/resources/assets/warpdrive/lua.OpenComputers/common/usr/lib/warpdriveCommons.lua @@ -28,7 +28,6 @@ local colors = {-- loosely based on CC colors -- properties local data = { } -local data_shouldUpdateName = true local data_name = nil local data_handlers = { } @@ -51,8 +50,6 @@ local page_callbackKey local event_refreshPeriod_s = 5.0 local event_refreshTimerId = -1 -local ship = nil - local styles = { normal = { front = colors.black , back = colors.lightGray }, good = { front = colors.lime , back = colors.lightGray }, @@ -392,10 +389,10 @@ local function format_string(value, nbchar) str = "" .. value end if nbchar ~= nil then - if #str > nbchar then - str = string.sub(str, 1, nbchar - 1) .. "~" + if #str > math.abs(nbchar) then + str = string.sub(str, 1, math.abs(nbchar) - 1) .. "~" else - str = string.sub(str .. " ", 1, nbchar) + str = string.sub(str .. " ", 1, nbchar) end end return str @@ -528,10 +525,12 @@ local function input_readText(currentValue) term.setCursorBlink(true) repeat w.status_tick() + -- update display clearing extra characters w.setColorNormal() w.setCursorPos(x, y) - w.write(input .. " ") - input = string.sub(input, -30) + w.write(w.format_string(input, 37)) + -- truncate input and set caret position + input = string.sub(input, -36) w.setCursorPos(x + #input, y) local params = { event.pull() } @@ -801,6 +800,11 @@ local function event_handler(eventName, param) elseif eventName == "component_removed" then elseif eventName == "component_available" then elseif eventName == "component_unavailable" then + elseif eventName == "gpu_bound" then-- OpenOS internal event? + elseif eventName == "term_available" then + needRedraw = true + elseif eventName == "term_unavailable" then + needRedraw = true -- not supported: task_complete, rednet_message, modem_message elseif event_handlers[eventName] ~= nil then needRedraw = event_handlers[eventName](eventName, param) @@ -841,7 +845,7 @@ local function data_inspect(key, value) end local function data_read() - w.data_updateName() + w.data_shouldUpdateName() data = { } if fs.exists("/etc/shipdata.txt") then @@ -890,39 +894,55 @@ local function data_getName() end local function data_setName() - if ship ~= nil then - w.page_begin("<==== Set ship name ====>") - w.writeLn("") - w.write("Enter ship name: ") - else - w.page_begin("<==== Set name ====>") - w.writeLn("") - w.write("Enter computer name: ") + -- check if any named component is connected + local component = "computer" + for name, handlers in pairs(data_handlers) do + if handlers.name ~= nil then + component = name + end end + -- ask for a new name + w.page_begin("<==== Set " .. component .. " name ====>") + w.writeLn("") + w.write("Enter " .. component .. " name: ") data_name = w.input_readText(data_name) + -- OpenComputers only allows to label filesystems => out - if ship ~= nil then - ship.shipName(data_name) + + -- update connected components + for name, handlers in pairs(data_handlers) do + if handlers.name ~= nil then + handlers.name(data_name) + end end + -- w.reboot() -- not needed end -local function data_updateName() - data_shouldUpdateName = false +local function data_shouldUpdateName() + local shouldUpdateName = false + + -- check computer name data_name = "" .. computer.address() - if data_name == nil then - data_shouldUpdateName = true - data_name = "" .. computer.address() - end - if ship ~= nil then - local shipName = ship.shipName() - if shipName == "default" then - data_shouldUpdateName = true - else - data_name = shipName + local nameDefault = data_name + + -- check connected components names + for name, handlers in pairs(data_handlers) do + if handlers.name ~= nil then + local componentName = handlers.name() + if componentName == "default" or componentName == "" then + shouldUpdateName = true + elseif shouldUpdateName then + data_name = componentName + elseif data_name ~= componentName then + shouldUpdateName = data_name ~= nameDefault + data_name = componentName + end end end + + return shouldUpdateName end local function data_splitString(source, sep) @@ -933,14 +953,18 @@ local function data_splitString(source, sep) return fields end -local function data_register(name, callbackRead, callbackSave) +local function data_register(name, callbackRead, callbackSave, callbackName) + -- read/save callbacks are always defined if callbackRead == nil then callbackRead = function() end end if callbackSave == nil then callbackSave = function() end end - data_handlers[name] = { read = callbackRead, save = callbackSave } + + -- name callback is nill when not defined + + data_handlers[name] = { read = callbackRead, save = callbackSave, name = callbackName } end ----------- Devices @@ -966,7 +990,8 @@ local function boot() os.exit() end if component.gpu.getDepth() < 4 then - print("Tier 2 GPU required") + print("A tier 2 or higher GPU required") + print("A tier 2 or higher screen required") os.exit() end print("loading...") @@ -993,15 +1018,12 @@ local function boot() handlers.register(deviceType, address, w.device_get(address)) end - if deviceType == "warpdriveShipController" then - ship = w.device_get(address) - end w.writeLn("") end - -- update with ship name if available - w.data_updateName() - if data_shouldUpdateName then + -- synchronize computer and connected components names + local shouldUpdateName = w.data_shouldUpdateName() + if shouldUpdateName then w.data_setName() end @@ -1197,7 +1219,7 @@ w = { data_save = data_save, data_getName = data_getName, data_setName = data_setName, - data_updateName = data_updateName, + data_shouldUpdateName = data_shouldUpdateName, data_splitString = data_splitString, data_register = data_register, device_get = device_get, diff --git a/src/main/resources/assets/warpdrive/lua.OpenComputers/warpdriveEnanReactorCore/startup b/src/main/resources/assets/warpdrive/lua.OpenComputers/warpdriveEnanReactorCore/startup index 8e754602..0599b02e 100644 --- a/src/main/resources/assets/warpdrive/lua.OpenComputers/warpdriveEnanReactorCore/startup +++ b/src/main/resources/assets/warpdrive/lua.OpenComputers/warpdriveEnanReactorCore/startup @@ -363,7 +363,7 @@ function reactor_register() w.event_register("reactorPulse" , function(eventName, param) reactor_pulse(param) return false end ) w.event_register("reactorDeactivation", function( ) w.status_showWarning("Reactor deactivated") return false end ) w.event_register("reactorActivation" , function( ) w.status_showWarning("Reactor activated") return false end ) - w.data_register("reactor", reactor_read, nil) + w.data_register("reactor", reactor_read, nil, nil) end ----------- connections status diff --git a/src/main/resources/assets/warpdrive/lua.OpenComputers/warpdriveShipController/startup b/src/main/resources/assets/warpdrive/lua.OpenComputers/warpdriveShipController/startup index eb1a1ba2..a0de12b6 100644 --- a/src/main/resources/assets/warpdrive/lua.OpenComputers/warpdriveShipController/startup +++ b/src/main/resources/assets/warpdrive/lua.OpenComputers/warpdriveShipController/startup @@ -32,8 +32,15 @@ function ship_read(parData) if data.ship_summon == nil then data.ship_summon = false end end +function ship_name(parName) + if ship == nil or ship.interfaced() == nil then + return '' + end + return ship.shipName(parName) +end + function ship_boot() - if ship == nil then + if ship == nil or ship.interfaced() == nil then return end @@ -415,7 +422,7 @@ end function ship_page_controls() w.page_begin(w.data_getName() .. " - Ship controls") - if ship == nil then + if ship == nil or ship.interfaced() == nil then w.status_showWarning("No ship controller detected") else local isValid, message = ship.isAssemblyValid() @@ -526,7 +533,7 @@ end function ship_page_crew() w.page_begin(w.data_getName() .. " - Ship crew") - if ship == nil then + if ship == nil or ship.interfaced() == nil then w.status_showWarning("No ship controller detected") else local isValid, message = ship.isAssemblyValid() @@ -584,7 +591,7 @@ end function ship_page_navigation() w.page_begin(w.data_getName() .. " - Ship navigation") - if ship == nil then + if ship == nil or ship.interfaced() == nil then w.status_showWarning("No ship controller detected") else local isValid, message = ship.isAssemblyValid() @@ -639,7 +646,7 @@ function ship_register() function(deviceType, address, wrap) ship = wrap end, function() end) w.event_register("shipCoreCooldownDone" , function() w.status_showWarning("Ship core cooldown done") return false end ) - w.data_register("ship", ship_read, nil) + w.data_register("ship", ship_read, nil, ship_name) end ----------- connections status diff --git a/src/main/resources/assets/warpdrive/lua.OpenComputers/warpdriveWeaponController/startup b/src/main/resources/assets/warpdrive/lua.OpenComputers/warpdriveWeaponController/startup index 302dcf3f..51b21248 100644 --- a/src/main/resources/assets/warpdrive/lua.OpenComputers/warpdriveWeaponController/startup +++ b/src/main/resources/assets/warpdrive/lua.OpenComputers/warpdriveWeaponController/startup @@ -526,7 +526,7 @@ function laser_station_page() w.write("Laser batteries:") for key, battery in pairs(laserstation.batteries) do w.setCursorPos(1, 5 + key) - laserbattery = laser_battery_getByName(battery.name) + local laserbattery = laser_battery_getByName(battery.name) if battery.enabled then w.setColorSuccess() else @@ -609,7 +609,7 @@ function laser_station_config() w.setCursorPos(1, 11) w.write("Battery enabling: ") for key, battery in pairs(laserstation.batteries) do - laserbattery = laser_battery_getByName(battery.name) + local laserbattery = laser_battery_getByName(battery.name) local msg = laser_battery_getDescription(laserbattery) w.setCursorPos(1, 11 + (key % 5)) @@ -823,7 +823,7 @@ function laser_register() function() end) w.event_register("laserScanning", function() laser_sendEvent() return false end ) w.event_register("laserSend" , function() return false end ) - w.data_register("laser", laser_read, laser_save) + w.data_register("laser", laser_read, laser_save, nil) end ----------- connections status