Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- local modems = {}
- local reactors = {}
- local min = 0
- local max = 100
- local started = false
- function getModems()
- modems = {peripheral.find("modem")}
- end
- function getReactors()
- reactors = {peripheral.find("BigReactors-Reactor")}
- end
- function checkState()
- local reactor = reactors[1]
- started = reactor.getActive()
- end
- function startReactor()
- print("starting...")
- local reactor = reactors[1]
- reactor.setActive(true)
- started = true
- end
- function stopReactor()
- print("stopping...")
- local reactor = reactors[1]
- reactor.setActive(false)
- started = false
- end
- function transmitData()
- print("transmitting...")
- local modem = modems[1]
- local stats = getReactorStats()
- feStored = stats["energyStored"]
- fePerTick = stats["fePerTick"]
- rodLevel = stats["rodLevel"]
- fuelPerTick = stats["fuelPerTick"]
- energyCapacity = stats["energyCapacity"]
- modem.transmit(1, 3, {feStored, fePerTick, rodLevel, fuelPerTick, energyCapacity})
- end
- function getReactorStats()
- local stats = {}
- local reactor = reactors[1]
- stats["energyStored"] = reactor.getEnergyStored()
- stats["fePerTick"] = math.floor(reactor.getEnergyProducedLastTick())
- stats["rodLevel"] = math.floor(reactor.getControlRodLevel(0))
- stats["fuelPerTick"] = reactor.getFuelConsumedLastTick()
- stats["energyCapacity"] = reactor.getEnergyCapacity()
- return stats
- end
- function calculateAndAdjust()
- local reactor = reactors[1]
- local allStats = getReactorStats()
- local feMax = allStats["energyCapacity"]
- local energyStored = allStats["energyStored"]
- local rodLevel = allStats["rodLevel"]
- if (energyStored/feMax * 100) < min then
- reactor.setAllControlRodLevels(0)
- end
- if (energyStored/feMax * 100) > max then
- reactor.setAllControlRodLevels(100)
- end
- if max > (energyStored/feMax * 100) and (energyStored/feMax * 100) > min then
- input_max = (feMax/100) * max
- input_min = (feMax/100) * min
- rodLevel = math.ceil((100/(input_max - input_min)) * (energyStored - input_min))
- if rodLevel > 100 then
- rodLevel = 100
- end
- reactor.setAllControlRodLevels(rodLevel)
- end
- transmitData()
- end
- function receiveMessage()
- local modem = modems[1]
- modem.open(3)
- local refresh = true
- while refresh do
- print("receiving...")
- local event, modemSide, senderChannel, replyChannel, message, senderDistance = os.pullEvent("modem_message")
- print("message received:")
- print(message[1])
- print(message[2])
- print(message[3])
- if message[1] == "stop" then
- if started then
- stopReactor()
- end
- end
- if message[1] == "start" then
- if not started then
- startReactor()
- end
- end
- if message[1] == "limit" then
- min = tonumber(message[2])
- max = tonumber(message[3])
- end
- os.sleep(1)
- end
- end
- function refresh()
- local condition = true
- while condition do
- calculateAndAdjust()
- os.sleep(1)
- end
- end
- getModems()
- getReactors()
- checkState()
- parallel.waitForAny(refresh, receiveMessage)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement