Advertisement
nitrojector

Untitled

Sep 8th, 2024 (edited)
209
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.91 KB | None | 0 0
  1. -- Basic reactor monitor script for Computercraft
  2.  
  3. energyInputAddr = "flow_gate_4" -- Address of injection flux gate
  4. energyOutputAddr = "flow_gate_3" -- Address of output flux gate
  5.  
  6. -- Control
  7. fieldTarget = 40
  8. fieldOverfillLimit = 5
  9. fieldIncreaseMultiplier = 17000
  10. fieldDecreaseAbsolute = 10000
  11. injectionRate = 1000000
  12.  
  13. column2 = 9
  14. column3 = 26
  15.  
  16. -- !!! DO NOT ALTER BELOW THIS LINE !!! --
  17.  
  18. function getPeripheral(type)
  19. local periNames = peripheral.getNames()
  20. for i, val in ipairs(periNames) do
  21. if peripheral.getType(val) == type then
  22. return peripheral.wrap(val)
  23. end
  24. end
  25. end
  26.  
  27. function updateRates()
  28. i = reac.getReactorInfo()
  29.  
  30. fieldDeltaT = i.fieldStrength / i.maxFieldStrength * 100 - currentField
  31. tempDeltaT = i.temperature - currentTemp
  32. satDeltaT = i.energySaturation / i.maxEnergySaturation * 100 - currentSat
  33. fuelDeltaT = (i.maxFuelConversion - i.fuelConversion) / i.maxFuelConversion * 100 - currentFuel
  34.  
  35. currentField = i.fieldStrength / i.maxFieldStrength * 100
  36. currentTemp = i.temperature
  37. currentSat = i.energySaturation / i.maxEnergySaturation * 100
  38. currentFuel = (i.maxFuelConversion - i.fuelConversion) / i.maxFuelConversion * 100
  39. end
  40.  
  41. function perTickWrapper()
  42. while true do
  43. updateRates()
  44. updateInjectionRate()
  45. sleep(0.05)
  46. end
  47. end
  48.  
  49. function fmtVal(val)
  50. valStr = string.format("%.4f", val)
  51. if string.sub(valStr, 1, 1) == "-" then
  52. return valStr
  53. else
  54. return "+" .. valStr
  55. end
  56. end
  57.  
  58. function writeEmtpyLine(idx)
  59. mon.setCursorPos(1, idx)
  60. mon.write(string.rep(" ", monX))
  61. end
  62.  
  63. function writeInfoWRate(idx, label, val, valRate, unit)
  64. useSeconds = true
  65. writeEmtpyLine(idx)
  66. mon.setCursorPos(1, idx)
  67. mon.write(label)
  68. mon.setCursorPos(column2, idx)
  69. mon.write(fmtVal(val) .. " " .. unit)
  70. mon.setCursorPos(column3, idx)
  71. if useSeconds then
  72. valRate = valRate * 20
  73. end
  74. mon.write("-> " .. fmtVal(valRate) .. " " .. unit .. "/" .. (useSeconds and "s" or "t"))
  75. end
  76.  
  77. function writeInfo(idx, label, val, unit)
  78. writeEmtpyLine(idx)
  79. mon.setCursorPos(1, idx)
  80. mon.write(label)
  81. mon.setCursorPos(column2, idx)
  82. mon.write(fmtVal(val) .. " " .. unit .. "/t")
  83. end
  84.  
  85. function updateInjectionRate()
  86. -- TODO: !!! Rewrite using i.fieldDrainRate !!!
  87. if currentField < fieldTarget then
  88. if fieldDeltaT < 0 then
  89. injectionRate = injectionRate + math.abs(fieldDeltaT) * fieldIncreaseMultiplier
  90. elseif fieldTarget - currentField > 10 then
  91. injectionRate = injectionRate + 2500
  92. -- elseif fieldDeltaT > 0 and fieldDeltaT < 0.02 then
  93. -- injectionRate = injectionRate + 100
  94. end
  95. elseif currentField - fieldTarget > fieldOverfillLimit then
  96. if fieldDeltaT > -0.02 then
  97. injectionRate = injectionRate - fieldDecreaseAbsolute
  98. end
  99. end
  100.  
  101. gin.setFlowOverride(injectionRate)
  102. end
  103.  
  104. function CLI()
  105. while true do
  106. uIn = string.lower(io.read())
  107. cmd = string.sub(uIn, 1, 1)
  108. num = tonumber(string.sub(uIn, 2))
  109.  
  110. if cmd == "q" then
  111. return
  112. elseif cmd == "h" then
  113. print("Commands:\nq - Quit\nh - Help\nf - Set Field Target\ni - Set Injection Rate\nm - Set Field Increase Multiplier")
  114. elseif cmd == "i" then
  115. if num ~= nil then
  116. injectionRate = num
  117. gin.setFlowOverride(injectionRate)
  118. else
  119. print("Current Injection Rate:\n" .. injectionRate)
  120. end
  121. elseif cmd == "f" then
  122. if num ~= nil then
  123. fieldTarget = num
  124. else
  125. print("Current Field Target:\n" .. fieldTarget)
  126. end
  127. elseif cmd == "m" then
  128. if num ~= nil then
  129. fieldIncreaseMultiplier = num
  130. else
  131. print("Current Field Increase Multiplier:\n" .. fieldIncreaseMultiplier)
  132. end
  133. end
  134. end
  135. end
  136.  
  137.  
  138. function main()
  139. while true do
  140. -- Monitor Exhibit
  141. idx = 1
  142.  
  143. writeInfoWRate(idx, "TEMP", currentTemp, tempDeltaT, "C")
  144. idx = idx + 1
  145.  
  146. writeInfoWRate(idx, "SAT", currentSat, satDeltaT, "%")
  147. idx = idx + 1
  148.  
  149. writeInfoWRate(idx, "FIELD", currentField, fieldDeltaT, "%")
  150. idx = idx + 1
  151.  
  152. writeInfoWRate(idx, "FUEL", currentFuel, fuelDeltaT, "%")
  153. idx = idx + 1
  154.  
  155. writeInfo(idx, "GEN", reac.getReactorInfo().generationRate, "RF")
  156. idx = idx + 1
  157. idx = idx + 1
  158.  
  159. writeInfo(idx, "IN", gin.getFlow(), "RF")
  160. idx = idx + 1
  161.  
  162. writeInfo(idx, "OUT", gout.getFlow(), "RF")
  163. idx = idx + 1
  164.  
  165. writeInfo(idx, "GAIN", gout.getFlow() - gin.getFlow(), "RF")
  166. idx = idx + 1
  167.  
  168. -- writeInfo(idx, "F-CONV", reac.getReactorInfo().fuelConversionRate, "mB")
  169. -- idx = idx + 1
  170. end
  171. end
  172.  
  173. reac = getPeripheral('draconic_reactor')
  174. mon = getPeripheral('monitor')
  175. gin = peripheral.wrap(energyInputAddr)
  176. gout = peripheral.wrap(energyOutputAddr)
  177.  
  178. if gin.getFlow() ~= nil and gin.getFlow() ~= 0 then
  179. injectionRate = gin.getFlow()
  180. end
  181.  
  182. -- For computer controlled input
  183. gin.setOverrideEnabled(true)
  184.  
  185. monX, monY = mon.getSize()
  186.  
  187. -- State
  188. fieldDeltaT = 0
  189. tempDeltaT = 0
  190. satDeltaT = 0
  191. fuelDeltaT = 0
  192.  
  193. currentField = 0
  194. currentTemp = 0
  195. currentSat = 0
  196. currentFuel = 0
  197.  
  198.  
  199. parallel.waitForAny(main, perTickWrapper, CLI)
  200.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement