Advertisement
Guest User

Untitled

a guest
May 29th, 2017
55
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.53 KB | None | 0 0
  1. --Top: list, click reactor
  2. --Needed info:
  3. --Poweron
  4. --Energy
  5. --Millibuckets per sec
  6. --Total rf
  7. --RF per reactor
  8. --RF per millibucket
  9.  
  10. --Functionality:
  11. --shutdown button
  12. --automatic toggle
  13.  
  14. function update_reactors()
  15. local reactor_names = modem.getNamesRemote()
  16. assert(#reactor_names ~= 0, "No reactors found!")
  17. return reactor_names
  18. end
  19.  
  20. function get_reactor_values(reactor_name)
  21. local stuff = {}
  22. local function call(f)
  23. return modem.callRemote(reactor_name, f)
  24. end
  25.  
  26. -- camelCase because lua's string matching is weird with words, so it thinks snake_case is snake case and not it's own word
  27. stuff["on"] = call("getActive")
  28. stuff["energy"] = call("getEnergyStored")
  29. stuff["energyPercentage"] = (stuff["energy"] / max_energy_total) * 100
  30. stuff["fuel"] = call("getFuelAmount")
  31. stuff["fuel_max"] = call("getFuelAmountMax")
  32. stuff["fuelPercentage"] = (stuff["fuel"] / stuff["fuel_max"]) * 100
  33. return stuff
  34. end
  35.  
  36. function draw_column_names()
  37. monitor.clear()
  38. monitor.setCursorPos(1,1)
  39. monitor.write("ID State Energy Fuel")
  40. end
  41.  
  42. function draw_reactor_status(index, reactor_data)
  43. monitor.setCursorPos(1, index + 1)
  44. monitor.write(tostring(index))
  45. monitor.setCursorPos(4, index + 1)
  46. if reactor_data["on"] then
  47. monitor.write("On")
  48. else
  49. monitor.write("Off")
  50. end
  51.  
  52. local function truncate(val, len)
  53. local str = tostring(val)
  54. if str:len() > len then
  55. str = str:sub(1, len)
  56. end
  57. return str
  58. end
  59. monitor.setCursorPos(10, index + 1)
  60. monitor.write(truncate(reactor_data["energyPercentage"], 4) .. "%")
  61. monitor.setCursorPos(17, index + 1)
  62. monitor.write(truncate(reactor_data["fuelPercentage"], 4) .. "%")
  63. end
  64.  
  65. function handle_control_request()
  66. local function split_string(str)
  67. local result = {}
  68. for word in string.gmatch(str, "%w+") do
  69. table.insert(result, word)
  70. end
  71. return result
  72. end
  73.  
  74. local function contains_key(tab, k)
  75. return tab[k] ~= nil
  76. end
  77.  
  78. while true do
  79. local event, modem_side, sender_channel, reply_channel, msg, distance = os.pullEvent("modem_message")
  80. if event == "modem_message" and modem_side == "left" then
  81. local output = ""
  82. local split = split_string(msg)
  83. print("Recieved message: " .. msg)
  84. if split[1] == "get" then
  85. if #split < 3 then
  86. wireless.transmit(reply_channel, 1, "ERROR: at least 3 Arguments needed")
  87. elseif not contains_key(reactors, tonumber(split[2])) then
  88. output = "ERROR: No such reactor: " .. split[2]
  89. else
  90. local reactor_values = get_reactor_values(reactors[tonumber(split[2])])
  91.  
  92. for i = 3, #split do
  93. if not contains_key(reactor_values, split[i]) then
  94. output = "ERROR: No such entry: " .. split[i]
  95. else
  96. output = output .. split[i] .. ": " .. tostring(reactor_values[split[i]]) .. "\n"
  97. end
  98. end
  99. end
  100. else
  101. output = "ERROR: Unknown command: " .. msg
  102. end
  103. wireless.transmit(reply_channel, 1, output)
  104. end
  105. sleep(1)
  106. end
  107. end
  108.  
  109. function main_loop()
  110. while true do
  111. reactors = update_reactors()
  112. draw_column_names()
  113. for i = 1, #reactors do
  114. local info = get_reactor_values(reactors[i])
  115. local percentage = info["energyPercentage"]
  116. local active = modem.callRemote(reactors[i], "getActive")
  117. if percentage < min_energyPercentage and not active then
  118. modem.callRemote(reactors[i], "setActive", true)
  119. print("Powered on reactor " .. i .. " at " .. os.time() .. " " .. os.day())
  120. elseif percentage >= max_energyPercentage and active then
  121. modem.callRemote(reactors[i], "setActive", false)
  122. print("Shut down reactor " .. i .. " at " .. os.time() .. " " .. os.day())
  123. end
  124. --Might have changed
  125. info["on"] = modem.callRemote(reactors[i], "getActive")
  126. draw_reactor_status(i, info)
  127. end
  128. sleep(1) --Don't crash server
  129. end
  130. end
  131.  
  132. -- Init stuff
  133. modem = assert(peripheral.wrap("back"), "Modem not connected")
  134. wireless = assert(peripheral.wrap("left"), "Wireless not connected")
  135. assert(wireless.isWireless(), "Left modem not wireless")
  136. monitor = assert(peripheral.wrap("top"), "Monitor not connected")
  137.  
  138. -- Settings
  139. max_energy_total = 10000000
  140. max_energyPercentage = 99.9 -- Power doesn't always go up to 100% due to drain
  141. min_energyPercentage = 90
  142.  
  143. modem.open(0)
  144. wireless.open(1)
  145. monitor.clear()
  146. reactors = update_reactors()
  147.  
  148. parallel.waitForAny(main_loop, handle_control_request)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement