Advertisement
cc-editor

reactor.lua

Oct 2nd, 2024 (edited)
57
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 7.41 KB | None | 0 0
  1. settings.load()
  2.  
  3. -- #region Setup
  4. local fuel_type = settings.get("reactor.fuelType")
  5. local me_interface = peripheral.wrap(settings.get("reactor.meInterface"))
  6. local battery_threshold = settings.get("reactor.batteryThreshold")
  7.  
  8. local rods = {}
  9. for i=1, 4 do
  10.     rods[i] = {
  11.         timer = nil,
  12.         refuel_count = 0,
  13.         defective = false,
  14.         control = peripheral.wrap(settings.get("reactor.rod"..i..".rodControl")),
  15.         redRouter = peripheral.wrap(settings.get("reactor.rod"..i..".redRouter")),
  16.         clutch_side = settings.get("reactor.rod"..i..".clutchSide"),
  17.         repairArm_side = settings.get("reactor.rod"..i..".repairArmSide"),
  18.         boiler = peripheral.wrap(settings.get("reactor.rod"..i..".boiler")),
  19.         battery = peripheral.wrap(settings.get("reactor.rod"..i..".battery")),
  20.     }
  21. end
  22. -- #endregion
  23.  
  24. local function is_powered(rod_number)
  25.     if string.find(rods[rod_number].boiler.getLine(1), "Max") then
  26.         return true
  27.     end
  28.     return false
  29. end
  30.  
  31. local function generates_energy(rod_number)
  32.     if string.find(rods[rod_number].boiler.getLine(6), "0 RPM") then
  33.         return false
  34.     elseif string.find(rods[rod_number].boiler.getLine(6), "236 RPM") then
  35.         return true
  36.     end
  37.     print("Unknown state for generator "..rod_number)
  38.     -- TODO: Send alert
  39.     return false
  40. end
  41.  
  42. local function is_battery_level_ok(rod_number)
  43.     if rods[rod_number].battery.getEnergy() > battery_threshold then
  44.         return true
  45.     end
  46.     return false
  47. end
  48.  
  49. local function try_starting_generator(rod_number)
  50.     print("Starting generator for rod "..rod_number)
  51.     local consecutive_max_power = 0
  52.     for i = 1, 30 do
  53.         if is_powered(rod_number) then
  54.             consecutive_max_power = consecutive_max_power + 1
  55.         else
  56.             consecutive_max_power = 0
  57.         end
  58.  
  59.         if consecutive_max_power >= 4 then
  60.             print("Boiler for rod "..rod_number.." is active")
  61.             rods[rod_number].redRouter.setOutput(rods[rod_number].clutch_side, false)
  62.             for j = 1, 8 do
  63.                 if generates_energy(rod_number) then
  64.                     print("Generator for Rod "..rod_number.." is active")
  65.                     return true
  66.                 end
  67.                 sleep(1)
  68.             end
  69.  
  70.             print("Generator for Rod "..rod_number.." is not rotating")
  71.             -- TODO: Send alert
  72.             return false
  73.         end
  74.         sleep(1)
  75.     end
  76.  
  77.     print("Boiler for rod "..rod_number.." cannot be started")
  78.     -- TODO: Send alert
  79.     return false
  80. end
  81.  
  82. local function try_repairing_generator(rod_number)
  83.     print("Try repairing shafts for rod "..rod_number)
  84.     rods[rod_number].redRouter.setOutput(rods[rod_number].clutch_side, true)
  85.     print ("   moving arm up...")
  86.     rods[rod_number].redRouter.setOutput(rods[rod_number].repairArm_side, true)
  87.     sleep(10)
  88.     print ("   moving arm down...")
  89.     rods[rod_number].redRouter.setOutput(rods[rod_number].repairArm_side, false)
  90.     sleep(5)
  91.     print("Repair procedure for rod "..rod_number.." finished")
  92. end
  93.  
  94. local function power_rod(rod_number, fuel_count)
  95.     print("Activiating rod "..rod_number)
  96.  
  97.     local me_slot = me_interface.getItemDetail(1)
  98.     if me_slot == nil or me_slot.count < fuel_count then
  99.         print("Not enough fuel to power rod "..rod_number)
  100.         -- TODO: Send alert
  101.         return false
  102.     end
  103.     if me_slot.name ~= fuel_type then
  104.         print("Wrong fuel type in ME interface")
  105.         -- TODO: Send alert
  106.         return false
  107.     end
  108.  
  109.     print("Disable output for boiler "..rod_number)
  110.     rods[rod_number].redRouter.setOutput(rods[rod_number].clutch_side, true)
  111.  
  112.     print("Powering rod "..rod_number.." with fuel")
  113.     rods[rod_number].control.pullItems(peripheral.getName(me_interface), 1, fuel_count)
  114.     rods[rod_number].timer = os.startTimer(288 * fuel_count - 6)
  115.     print("Refuel-Timer "..rods[rod_number].timer.." for rod "..rod_number.." started")
  116.  
  117.     return try_starting_generator(rod_number)
  118. end
  119.  
  120. local function refuel_rod(rod_number, fuel_count)
  121.     rods[rod_number].refuel_count = rods[rod_number].refuel_count + 1
  122.     print("Refueling rod "..rod_number.." for "..rods[rod_number].refuel_count..". time")
  123.  
  124.     local me_slot = me_interface.getItemDetail(1)
  125.     if me_slot == nil or me_slot.count < fuel_count then
  126.         print("Not enough fuel to power rod "..rod_number)
  127.         -- TODO: Send alert
  128.         return false
  129.     end
  130.     if me_slot.name ~= fuel_type then
  131.         print("Wrong fuel type in ME interface")
  132.         -- TODO: Send alert
  133.         return false
  134.     end
  135.  
  136.     if not is_powered(rod_number) then
  137.         print("Cannot refuel rod "..rod_number.." because boiler is not active")
  138.         -- TODO: Send alert
  139.         return false
  140.     end
  141.  
  142.     print("Powering rod "..rod_number.." with fuel")
  143.     rods[rod_number].control.pullItems(peripheral.getName(me_interface), 1, fuel_count)
  144.     rods[rod_number].timer = os.startTimer(288 * fuel_count - 6)
  145.     print("Refuel-Timer "..rods[rod_number].timer.." for rod "..rod_number.." started")
  146.     print("Refueled rod "..rod_number)
  147. end
  148.  
  149. local function check_rods()
  150.     while true do
  151.         print("Checking rods")
  152.         for i = 1, 4 do
  153.             if rods[i].defective then
  154.                 print("Rod "..i.." is defective and disabled")
  155.             elseif is_powered(i) then
  156.                 if generates_energy(i) then
  157.                     print("Rod "..i.." is active")
  158.                 else
  159.                     print("Rod "..i.." is active but generator is not rotating")
  160.                     try_repairing_generator(i)
  161.                     local started = try_starting_generator(i)
  162.                     if not started then                        
  163.                         print("Repair not successfull. Rod "..i.." will be deactivated")
  164.                         rods[i].defective = true
  165.                         if rods[i].timer ~= nil then
  166.                             os.cancelTimer(rods[i].timer)
  167.                             rods[i].timer = nil
  168.                         end
  169.                     end
  170.                 end
  171.             elseif not is_battery_level_ok(i) then
  172.                 print("Rod "..i.." is inactive and battery level is below threshold")
  173.                 if rods[i].timer ~= nil then
  174.                     os.cancelTimer(rods[i].timer)
  175.                     rods[i].timer = nil
  176.                 end
  177.                 rods[i].refuel_count = 0
  178.                 power_rod(i, 2)
  179.             else
  180.                 print("Rod "..i.." is inactive and battery level is ok")
  181.             end
  182.         end
  183.         print("Checks completed")
  184.         sleep(10)
  185.     end
  186. end
  187.  
  188. local function check_timer()
  189.     while true do
  190.         local _, timer_id = os.pullEvent("timer")
  191.         for i = 1, 4 do
  192.             if timer_id == rods[i].timer then
  193.                 print("Refuel-Timer for rod "..i.." expired")
  194.                 if is_powered(i)
  195.                 and generates_energy(i)
  196.                 and rods[i].defective == false
  197.                 and rods[i].battery.getEnergy() < rods[i].battery.getEnergyCapacity() - 8000
  198.                 and rods[i].refuel_count < 6 then
  199.                     refuel_rod(i, 1)
  200.                 else
  201.                     print("but refuel conditions are not met")
  202.                 end
  203.                 break
  204.             end
  205.         end
  206.     end
  207. end
  208.  
  209. print("Starting reactor control")
  210. parallel.waitForAll(check_rods, check_timer)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement