--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
Comments