local configPath = "config" -- ========= TROVA PERIFERICHE ========= local function findPeripheral(t) for _, side in ipairs(rs.getSides()) do if peripheral.isPresent(side) and peripheral.getType(side) == t then return peripheral.wrap(side), side end end return nil end -- ========= CONFIGURAZIONE ========= local function loadConfig() if not fs.exists(configPath) then return nil end local f = fs.open(configPath,"r") local data=f.readAll() f.close() local func=loadstring(data) if func then return func() else error("Errore nel config") end end term.setTextColor(colors.yellow) print("Avvio centrale di controllo...") sleep(0.3) local config = loadConfig() if not config then term.setTextColor(colors.white) print("Configurazione non trovata. Creazione guidata...\n") local validColors = {} for k, v in pairs(colors) do validColors[k] = v end local reactors = {} while true do local id local color write("Nome reattore: ") local name = read() repeat write("ID rednet: ") id = tonumber(read()) until id repeat write("Colore asseganto al reattore(white,blue ...): \n") color = read() until validColors[color] table.insert(reactors,{name=name,id=id,color = color}) if table.maxn(reactors) == 8 then break end write("Altro reattore? (s/n): ") if read():lower()~="s" then break end end config = {reactors=reactors, update_interval=2} local f = fs.open(configPath,"w") f.write("return " .. textutils.serialize(config)) f.close() end if type(config.update_interval)~="number" then config.update_interval=2 end term.setTextColor(colors.cyan) print("\n[ Inizializzazione periferiche ]") sleep(0.3) local modem, modemSide = findPeripheral("modem") if not modem then error("Nessun modem trovato!") end rednet.open(modemSide) term.setTextColor(colors.lime) print("Modem su "..modemSide) sleep(0.2) local mon, monSide = findPeripheral("monitor") if not mon then error("Nessun monitor trovato!") end mon.setBackgroundColor(colors.black) mon.setTextColor(colors.white) mon.clear() local monitorSizeX, monitorSizeY = mon.getSize() term.setTextColor(colors.lime) print("Monitor su "..monSide) sleep(0.5) term.setTextColor(colors.yellow) print("Inizializzazione completata.") sleep(1) term.clear() term.setCursorPos(1,1) -- ========= VARIABILI ========= local reactors = {} -- ========= UTILITY ========= local function colorByTemp(p) if p < 60 then return colors.green elseif p < 85 then return colors.orange else return colors.red end end local function drawBar(x,y,w,perc,color) local filled = math.floor(w*perc/100) mon.setCursorPos(x,y) mon.setBackgroundColor(colors.gray) mon.write(string.rep(" ",w)) mon.setCursorPos(x,y) mon.setBackgroundColor(color) mon.write(string.rep(" ",filled)) mon.setBackgroundColor(colors.black) end local function getReactorsInfo(config) local reactors = {} for _,r in ipairs(config.reactors) do term.setTextColor(colors.lightBlue) print("Invio richiesta a "..r.name.." (ID "..r.id..")...") local command = textutils.serialize({command = "reactor_info"}) rednet.send(r.id, command) local start=os.clock() local sender,msg repeat sender,msgTmp=rednet.receive(5) if msgTmp then msg = textutils.unserialize(msgTmp) end until sender==r.id or os.clock()-start>5 if sender==r.id and type(msg)=="table" and msg.type=="info" then term.setTextColor(colors.lime) print("Dati ricevuti da "..r.name) reactors[r.id]=msg.data else term.setTextColor(colors.red) print("Nessuna risposta da "..r.name) reactors[r.id]=nil end end return reactors end local function drawUI() mon.setBackgroundColor(colors.black) mon.setTextColor(colors.white) mon.clear() mon.setCursorPos((monitorSizeX/2)-12,1) mon.write("=== CENTRALE NUCLEARE ===") mon.setCursorPos((monitorSizeX/2)-9,2) mon.write("Aggiornato: " .. textutils.formatTime(os.time(), true)) local y=4 local x=2 local reactorCount = 0 local reactorPerPage = math.floor(((monitorSizeY-3)/6)+0.5) for _,r in ipairs(config.reactors) do reactorCount = reactorCount+1 local info = reactors[r.id] mon.setCursorPos(x,y) mon.setTextColor(colors.cyan) mon.write(r.name) y=y+1 if info and type(info) == "table" then mon.setCursorPos(x+15,y-1) local perc = math.floor((info.temp/info.maxHeat)*100) if perc >= 80 then mon.setTextColor(colors.red) mon.write("STATO: SCRAM") elseif info.active then mon.setTextColor(colors.lime) mon.write("STATO: ATTIVO") else mon.setTextColor(colors.red) mon.write("STATO: SPENTO") end mon.setTextColor(colors.yellow) mon.setCursorPos(x+2,y) mon.write(string.format("MaxOut: %d/t | Output: %d/t", info.maxOutput, info.effectiveOutput)) y=y+1 mon.setCursorPos(x+2,y) mon.write(string.format("MaxTemp: %d C | Temp: %d%%", info.maxHeat, perc)) y=y+1 drawBar(x+2,y,22,perc+30,colorByTemp(perc)) y=y+1 mon.setCursorPos(x+2,y) else mon.setTextColor(colors.red) mon.write(" Nessuna risposta") y=y+1 end y=y+2 if reactorCount% reactorPerPage == 0 then for i = 4, monitorSizeY, 1 do mon.setCursorPos(monitorSizeX/2,i) mon.write("|") end x= x+(monitorSizeX/2) y = 4 end end end local previousStates = {} local function checkInput() local activeColors = rs.getBundledInput("right") term.setTextColor(colors.yellow) print("---------------------------------\nCheck Inputs...") for _, r in ipairs(config.reactors) do local isActive = colors.test(activeColors, colors[r.color]) if isActive then term.setTextColor(colors.lime) print(r.name .. " ATTIVO") else term.setTextColor(colors.red) print(r.name .. " SPENTO") end if previousStates[r.id] ~= isActive then local command if isActive then command = textutils.serialize({command = "reactor_control", newState = true}) else command = textutils.serialize({command = "reactor_control", newState = false}) end rednet.send(r.id, command) local start=os.clock() local sender,msg repeat sender,msgTmp=rednet.receive(5) if msgTmp then msg = textutils.unserialize(msgTmp) end until sender==r.id or os.clock()-start>5 if msg and msg.success then term.setTextColor(colors.lime) print(r.name .. " Impostato al nuovo stato") previousStates[r.id] = isActive else term.setTextColor(colors.red) print("Nessuna risposta da "..r.name) end end end term.setTextColor(colors.yellow) print("---------------------------------") end local function checkSCRAM() term.setTextColor(colors.yellow) print("---------------------------------\nCheck SCRAM...") for _,r in ipairs(config.reactors) do local info = reactors[r.id] if info and type(info) == "table" then local perc = math.floor((info.temp/info.maxHeat)*100) local activeColors = rs.getBundledOutput("back") if perc >= 80 then term.setTextColor(colors.red) print(r.name .. " in SCRAM!!") if not colors.test(activeColors,colors[r.color]) then rs.setBundledOutput("back", activeColors + colors[r.color]) end else term.setTextColor(colors.lime) print(r.name .. " ok") if colors.test(activeColors,colors[r.color]) then rs.setBundledOutput("back", activeColors - colors[r.color]) end end end end term.setTextColor(colors.yellow) print("---------------------------------") end -- ========= CICLO DI POLLING ========= while true do reactors = getReactorsInfo(config) sleep(0.5) checkInput() checkSCRAM() drawUI() term.setTextColor(colors.gray) print("Aggiornamento completato.\n") sleep(config.update_interval) end