jille_Jr icon

CC: Nuclear Generator Controller

jille_Jr | PRO | 09/13/13 04:12:34 PM UTC | 0 ⭐ | 366 👁️ | Never ⏰ | []
Lua |

6.29 KB

|

None

|

0 👍

/

0 👎

 
--[[--
    
    Wireless modem: back
    Wired modem: front
    
    Relay id: 131
    Monitor name: monitor_1
    MFE name: batbox_1
    Self name: computer_4
    
    Controller nickname: controller
    Relay nickname: relay
    
--]]--
 
--(( Variables ))--
 
local running = true
 
local controllerid = os.getComputerID()
local controllername = "controller"
local relayid = -1
local relayname = "relay"
 
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 wireless = "back" -- side
local cable = "front" -- side
local channel = 61234
 
local refreshrate = .2 -- seconds
 
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
 
local wired = peripheral.wrap(cable) or error("Unable to wrap wired modem!",0)
if wired.isWireless() then error("Wired modem is required! ("..cable.." side)",0) end
 
-- nuke
local nukestate = false -- false=off, true=on
local nukeoutput = 0 -- EU/t
 
-- mfe
local mfepowerstored = 0 -- EU
local mfepowermax = 0 -- EU
local mfeoutput = 0 -- EU/t
local mfemaxoutput = 0 -- EU
local mfeside = "batbox_1"
local mfe = peripheral.wrap(mfeside) or error("Unable to wrap storage device!",0)
 
-- monitor
local monitorside = "monitor_1"
local monitor = peripheral.wrap(monitorside) or error("Unable to wrap monitor display!",0)
local monitorw,monitorh = monitor.getSize()
 
-- computer
local w,h = term.getSize()
 
--(( Functions ))--
 
local function setColor(fg,bg,obj)
    local obj = obj or term
    if obj.isColor then
        if obj.isColor() then
            if type(fg) == "number" then
                obj.setTextColor(fg)
            end if type(bg) == "number" then
                obj.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 relayknows = 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 == relayname
                and msg.to == controllername then
                    if msg.subject == subs.getid then
                        -- Reply with id
                        sendMsg(controllername,relayname,subs.gotid,controllerid)
                    elseif msg.subject == subs.gotid then
                        if relayid == -1 then
                            -- Save id (into variable)
                            if type(msg.info) == "number" then
                                relayid = msg.info
                                -- Reply with acknowledge confirm
                                sendMsg(controllername,relayname,subs.gotidack)
                            end
                        end
                    elseif msg.subject == subs.gotidack then
                        -- Relay got my id
                        relayknows = 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 relayid == -1 then
                    sendMsg(controllername,relayname,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 relayid ~= -1 and relayknows
    
    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 setNuke(state)
    sendMsg(controllername,relayname,subs.setnuke,state)
end
local function getNukeOutput()
    sendMsg(controllername,relayname,subs.getoutput)
end
 
local function updateMFE()
    -- output
    mfeoutput = mfe.getOutput()
    mfemaxoutput = mfe.getMaxEnergyOutput()
    
    -- storage
    mfepowerstored = mfe.getStored()
    mfepowermax = mfe.getCapacity()
end
 
local function drawMonitor()
    -- for debugging, raw info
    local info = {
        mfeoutput = tostring(mfeoutput) .. "/" .. tostring(mfemaxoutput),
        mfepower = tostring(mfepowerstored) .. "/" .. tostring(mfepowermax),
        nukeoutput = tostring(nukeoutput),
    }
    if nukestate then
        info.nukestate = "ON"
    else
        info.nukestate = "OFF"
    end
    
    local count = 0
    for index,value in pairs(info) do
        monitor.setCursorPos(2,1+count)
        setColor(colors.orange,_,monitor)
        monitor.write(index)
        setColor(colors.red,_,monitor)
        monitor.write(" = ")
        setColor(colors.yellow,_,monitor)
        monitor.write(tostring(value))
        count = count + 1
    end
end
 
--(( Main program ))--
 
init()
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 == controllername then
                if msg.from == relayname then
                    -- Receive nuke state
                    if msg.subject == subs.gotnukestate then
                        if type(msg.info) == "boolean" then
                            nukestate = msg.info
                        end
                    end
                    -- Receive nuke output
                    if msg.subject == subs.gotoutput then
                        if type(msg.info) == "number" then
                            nukeoutput = msg.info
                        end
                    end
                end
            end
        end
    elseif ev == "timer" then
        if p1 == refreshtimer then
            refreshtimer = os.startTimer(refreshrate)
            refreshcount = refreshcount + 1
            setNuke(nukestate)
            getNukeOutput()
            updateMFE()
            drawMonitor()
        end
    end
end
 
--(( EOF ))--

Comments