Advertisement
Jo__2001__Bo

CC Tweaked Reactor Control Wireless Server

Dec 13th, 2020 (edited)
1,000
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 3.33 KB | None | 0 0
  1. local modems = {}
  2. local reactors = {}
  3. local min = 0
  4. local max = 100
  5. local started = false
  6.  
  7. function getModems()
  8.     modems = {peripheral.find("modem")}
  9. end
  10.  
  11. function getReactors()
  12.     reactors = {peripheral.find("BigReactors-Reactor")}
  13. end
  14.  
  15. function checkState()
  16.     local reactor = reactors[1]
  17.     started = reactor.getActive()
  18. end
  19.  
  20. function startReactor()
  21.     print("starting...")
  22.     local reactor = reactors[1]
  23.     reactor.setActive(true)
  24.     started = true
  25. end
  26.  
  27. function stopReactor()
  28.     print("stopping...")
  29.     local reactor = reactors[1]
  30.     reactor.setActive(false)
  31.     started = false
  32. end
  33.  
  34. function transmitData()
  35.     print("transmitting...")
  36.     local modem = modems[1]
  37.  
  38.     local stats = getReactorStats()
  39.  
  40.     feStored = stats["energyStored"]
  41.     fePerTick = stats["fePerTick"]
  42.     rodLevel = stats["rodLevel"]
  43.     fuelPerTick = stats["fuelPerTick"]
  44.     energyCapacity = stats["energyCapacity"]
  45.  
  46.     modem.transmit(1, 3, {feStored, fePerTick, rodLevel, fuelPerTick, energyCapacity})
  47. end
  48.  
  49. function getReactorStats()
  50.     local stats = {}
  51.     local reactor = reactors[1]
  52.    
  53.     stats["energyStored"] = reactor.getEnergyStored()
  54.     stats["fePerTick"] = math.floor(reactor.getEnergyProducedLastTick())
  55.     stats["rodLevel"] = math.floor(reactor.getControlRodLevel(0))
  56.     stats["fuelPerTick"] = reactor.getFuelConsumedLastTick()
  57.     stats["energyCapacity"] = reactor.getEnergyCapacity()
  58.  
  59.     return stats
  60. end
  61.  
  62. function calculateAndAdjust()
  63.     local reactor = reactors[1]
  64.     local allStats = getReactorStats()
  65.     local feMax = allStats["energyCapacity"]
  66.  
  67.     local energyStored = allStats["energyStored"]
  68.     local rodLevel = allStats["rodLevel"]
  69.  
  70.     if (energyStored/feMax * 100) < min then
  71.         reactor.setAllControlRodLevels(0)
  72.     end
  73.  
  74.     if (energyStored/feMax * 100) > max then
  75.         reactor.setAllControlRodLevels(100)
  76.     end
  77.  
  78.     if max > (energyStored/feMax * 100) and (energyStored/feMax * 100) > min then
  79.         input_max = (feMax/100) * max
  80.         input_min = (feMax/100) * min
  81.  
  82.         rodLevel = math.ceil((100/(input_max - input_min)) * (energyStored - input_min))
  83.  
  84.         if rodLevel > 100 then
  85.             rodLevel = 100
  86.         end
  87.  
  88.         reactor.setAllControlRodLevels(rodLevel)
  89.     end
  90.     transmitData()
  91. end
  92.  
  93. function receiveMessage()
  94.     local modem = modems[1]
  95.     modem.open(3)
  96.     local refresh = true
  97.     while refresh do
  98.         print("receiving...")
  99.  
  100.         local event, modemSide, senderChannel, replyChannel, message, senderDistance = os.pullEvent("modem_message")
  101.        
  102.         print("message received:")
  103.         print(message[1])
  104.         print(message[2])
  105.         print(message[3])
  106.  
  107.         if message[1] == "stop" then
  108.             if started then
  109.                 stopReactor()
  110.             end
  111.         end
  112.  
  113.         if message[1] == "start" then
  114.             if not started then
  115.                 startReactor()
  116.             end
  117.         end
  118.  
  119.         if message[1] == "limit" then
  120.             min = tonumber(message[2])
  121.             max = tonumber(message[3])
  122.         end
  123.  
  124.         os.sleep(1)
  125.     end
  126. end
  127.  
  128. function refresh()
  129.     local condition = true
  130.     while condition do
  131.         calculateAndAdjust()
  132.         os.sleep(1)
  133.     end
  134. end
  135.  
  136. getModems()
  137. getReactors()
  138. checkState()
  139. parallel.waitForAny(refresh, receiveMessage)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement