jille_Jr icon

CC: Nuclear Generator Relay

jille_Jr | PRO | 09/07/13 11:03:17 PM UTC | 0 ⭐ | 361 👁️ | Never ⏰ | []
Lua |

4.9 KB

|

None

|

0 👍

/

0 👎

 
 
--[[--
message form = {
    from = sender name,
    to = reciver name,
    subject = operation,
    info = additional information,
}
--]]--
 
--(( Variables ))--
 
local running = true
 
local controllerid = -1
local controllername = "controller"
local relayid = os.getComputerID()
local relayname = "relay"
 
local wireless = "bottom" -- side
local channel = 61234
 
local refreshrate = .2 -- seconds
 
local loading = {"|","/","-","\\"}
local subs = {
    getid = "get id",
    gotid = "got id",
    gotidack = "got id, acknowledge",
    setnuke = "set nuke state",
    getoutput = "get nuke output",
    gotoutput = "got nuke output",
    getnukestate = "get nuke state",
    gotnukestate = "got nuke state",
}
 
local modem = peripheral.wrap(wireless) or error("Unable to wrap wireless modem!",0)
if not modem.isWireless() then error("Wireless modem is required! ("..wireless.." side)",0) end
 
-- computer
local w,h = term.getSize()
 
-- nuke
local nukeside = "top"
local nuke = peripheral.wrap(nukeside) or error("Unable to wrap nuclear reactor!",0)
local nukestate = false
local nukeoutput = 0 -- EU/t
 
 
--(( Functions ))--
 
local function setColor(fg,bg)
    if term.isColor then
        if term.isColor() then
            if type(fg) == "number" then
                term.setTextColor(fg)
            end if type(bg) == "number" then
                term.setBackground(bg)
            end
        end
    end
end
 
local function sendMsg(from,to,subject,info)
    info = info or ""
    local message = {
        from = from,
        to = to,
        subject = subject,
        info = info,
    }
    message = textutils.serialize(message)
    modem.transmit(channel,channel,message)
end
 
local function init()
    modem.open(channel)
    
    local timeout = 10 -- seconds
    local timeouttimer = os.startTimer(timeout)
    local refreshtimer = os.startTimer(refreshrate)
    local refreshcount = 0
    
    local x,y = term.getCursorPos()
    local controllerknows = false
    
    repeat
        local ev,p1,p2,p3,p4,p5 = os.pullEvent()
        
        -- Loading message
        term.setCursorPos(x,y)
        setColor(colors.yellow)
        term.write("Initializing ")
        setColor(colors.orange)
        term.write(loading[(refreshcount%#loading)+1])
        
        -- Event handling
        if ev == "modem_message" then
            -- Message handling
            local msg = textutils.unserialize(p4)
            if type(msg) == "table" then
                if msg.from == controllername
                and msg.to == relayname then
                    if msg.subject == subs.getid then
                        -- Reply with id
                        sendMsg(relayname,controllername,subs.gotid,relayid)
                    elseif msg.subject == subs.gotid then
                        if controllerid == -1 then
                            -- Save id (into variable)
                            if type(msg.info) == "number" then
                                controllerid = msg.info
                                -- Reply with acknowledge confirm
                                sendMsg(relayname,controllername,subs.gotidack)
                            end
                        end
                    elseif msg.subject == subs.gotidack then
                        -- Controller got my id
                        controllerknows = true
                    end
                end
            end
        elseif ev == "timer" then
            -- Timer handling
            local timer = p1
            if timer == refreshtimer then
                -- Loading count
                refreshtimer = os.startTimer(refreshrate)
                refreshcount = refreshcount + 1
                -- Ask for id
                if controllerid == -1 then
                    sendMsg(relayname,controllername,subs.getid)
                end
            elseif timer == timeouttimer then
                -- Timeout
                term.setCursorPos(x,y)
                setColor(colors.yellow)
                term.write("Initializing ")
                setColor(colors.orange)
                term.write("X")
                print()
                setColor(colors.red)
                error("Operation timed out.",0)
            end
        end
    until controllerid ~= -1 and controllerknows
    
    term.setCursorPos(x,y)
    setColor(colors.yellow)
    term.write("Initializing ")
    setColor(colors.orange)
    term.write("X")
    setColor(colors.lime)
    term.write(" Done!")
    print()
end
 
local function updateNuke()
    -- Nuke on/off
    rs.setOutput(nukeside,nukestate)
    
    -- Nuke output
    nukeoutput = nuke.getOutput()
end
 
--(( Main program ))--
 
init()
setColor(colors.yellow)
print("Initiating complete!")
 
local refreshtimer = os.startTimer(refreshrate)
local refreshcount = 0
 
while running do
    local ev,p1,p2,p3,p4,p5 = os.pullEvent()
    
    if ev == "modem_message" then
        -- Message handling
        local msg = textutils.unserialize(p4)
        if type(msg) == "table" then
            if msg.to == relayname then
                if msg.from == controllername then
                    -- Get nuke state
                    if msg.subject == subs.getnukestate then
                        sendMsg(relayname,controllername,subs.gotnukestate,nukestate)
                    end
                    -- Set nuke state
                    if msg.subject == subs.setnuke then
                        if type(msg.info) == "boolean" then
                            nukestate = msg.info
                        end
                    end
                    -- Get nuke output
                    if msg.subject == subs.getoutput then
                        sendMsg(relayname,controllername,subs.gotoutput,nukeoutput)
                    end
                end
            end
        end
    elseif ev == "timer" then
        if p1 == refreshtimer then
            refreshtimer = os.startTimer(refreshrate)
            refreshcount = refreshcount + 1
            updateNuke()
        end
    end
end
--(( EOF ))--

Comments