--Mekanism Fission Reactor Remote Status Monitor --v0.91 by SemlerPDX Aug27 2021 --Reactor Control & Monitor Scripts -- Control PC: https://pastebin.com/2VrXwGNH -- and -- Emergency Monitor PC: https://pastebin.com/uxE2jE2B -- and -- Remote Status Monitor PC (this script): https://pastebin.com/59EWW86J -- -- example image of setup: https://imgur.com/a/nrKeBcH --Peripheral Sides monitorSide = "back" modemSide = "left" --id of rednet protocols protocol = "PowerSys" protocolCMD = "PowerCMD" controlPC = 20 --id of reactor control PC remotePC = 21 --id of (this) remote display status monitor PC hazardPC = 22 --id of critical shutdown monitor PC --Remote Command Keywords msgOpenComms = "opencomms" msgConfirmed = "copycopy" commandON = "on" commandOFF = "off" remoteClear = "clear" sysOnline = "Systems Online" sysOffline = "Systems Offline" --Remote Command Receive Timeout (in seconds) timeout = 5 --Init online = false monitor = peripheral.wrap(monitorSide) modem = peripheral.wrap(modemSide) rednet.open(modemSide) local function fSet() term.clear() monitor.clear() term.setCursorPos(1,1) monitor.setCursorPos(1,1) y = 1 end local function fWrite(msg) y = y + 1 term.write(msg) monitor.write(msg) term.setCursorPos(1,y) monitor.setCursorPos(1,y) end local function fToggleTxt(state) monitor.setCursorPos(1,5) monitor.write(" ") monitor.setCursorPos(1,5) if state == commandON then monitor.write(" -Tap to Disable- ") online = true elseif state == commandOFF then monitor.write(" -Tap to Enable- ") online = false end monitor.setCursorPos(1,y) end --Rednet Recieve Requested Message local function fRcv(msg) id,message = rednet.receive(protocolCMD,timeout) if message ~= nil then if msg == message then return true else return false end end end --Rednet Send with Receipt Confirmation local function fSend(toID,msg,rcv,ccode) rednet.send(toID,msg,protocolCMD) if rcv then returnReceipt = fRcv(ccode) if returnReceipt then return true else return false end end end --Rednet Send Remote Toggle Command and Return Confirmation local function fRemoteToggle(state) while true do commsOpen = fSend(controlPC,msgOpenComms,true,msgConfirmed) if commsOpen then commsOut = fSend(controlPC,state,true,msgConfirmed) return commsOut end sleep(1) end end --MAIN LOOP while true do --Rednet Remote System Status Update local function fReactorStatus() while true do id,message = rednet.receive(protocol) if stateNew and stateChange then fToggleTxt(stateNew) stateChange = nil end if id == controlPC then if message == remoteClear then fSet() else if message == commandON then online = true fToggleTxt(commandON) elseif message == commandOFF then online = false fToggleTxt(commandOFF) else fWrite(message) end end end end end --Touchscreen Systems Online Toggle local function fTouch() while true do sleep(6) event,side,xPos,yPos = os.pullEvent("monitor_touch") if not online then stateNew = commandON elseif online then stateNew = commandOFF end stateChange = fRemoteToggle(stateNew) end end --Main Function should loop indefinitely monitorStatus = parallel.waitForAny(fReactorStatus,fTouch) end