Savage_Me55iah

monitor v1.6 beta

May 9th, 2014
272
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. --Script by Savage_Me55iah of CraftAU.com.au--
  2. --Version 1.6--
  3. --Needs corresponding "Savage Client v1.6" script @ http://pastebin.com/vbdYtpra--
  4. --type "monitor client" to auto download--
  5.  
  6. --INSTRUCTIONS ON USE--
  7. --save this program as startup or monitor and type in startup: shell.run("monitor")--
  8. --example client computer: id-5 label-power
  9. --to add example client type "montior add 5 power"
  10. --to remove example client type "monitor remove 5 power"
  11. --to show settings of buttons type "monitor settings"
  12. --to adjust the settings of script type "edit settings", changing them here won't work once this program has been run once
  13. --to reset everything type "monitor reset"
  14. --buttons will not work without the online button on, turning the online button will shut off all other buttons
  15. --connect the monitors using network cables and wired modems
  16.  
  17.  
  18. local tArgs = { ... }
  19. local command = tostring(tArgs[1]) or false
  20. local name1 = tostring(tArgs[3]) or false
  21. local id = tonumber(tArgs[2]) or false
  22. local name2 = tostring(tArgs[5]) or false
  23. local id2 = tonumber(tArgs[4]) or false
  24.  
  25. --TABLES--
  26. print("tables")
  27.  
  28. names = {}
  29. ids = {}
  30. status = {}
  31.  
  32. function add_button(command, id, on_off)
  33.   num = table.maxn(names) + 1
  34.   names[num] = command
  35.   ids[num] = id
  36.   status[num] = on_off
  37. end
  38.  
  39. add_button("online", 0, true)
  40.  
  41. local load_save_loc = {
  42.   ["load_save_loc"] = "load_save_loc",
  43.   ["settings"] = "settings",
  44.   ["names"] = "names",
  45.   ["ids"] = "ids",
  46.   ["status"] = "status",
  47.   ["eu"] = "eu",
  48.   ["mj"] = "mj",
  49. }
  50.  
  51. local settings = {
  52.   ["mon_side"] = "top",
  53.   ["wireless_side"] = "left",
  54.   ["remote_modem"] = "right",
  55.   ["heading color"] = colors.yellow,
  56.   ["heading background"] = colors.black,
  57.   ["heading"] = "Savage Monitor v1.4",
  58.   ["active color"] = colors.green,
  59.   ["inactive color"] = colors.red,
  60.   ["id"] = os.getComputerID(),
  61.   ["label"] = "Server",
  62.   ["refresh_rate"] = 10,
  63.   ["text_scale"] = 1,
  64.   ["button_width"] = 5,
  65.   ["energy_stats"] = false,
  66.   ["open_peripherals"] = false,
  67.   ["direct_power"] = false,
  68.   ["energy_room"] = 0,
  69.   ["eu_id"] = 1000,
  70.   ["mj_id"] = 1001,
  71.   ["screen_saver"] = true,
  72.   ["timeout"] = 50,
  73.   ["image_x"] = 27,
  74.   ["image_y"] = 9,
  75.   ["client"] = "vbdYtpra"
  76. }
  77.  
  78. local button_x1 = {
  79.   [1] = 2
  80. }
  81.  
  82. local button_x2 = {
  83.   [1] = 12
  84. }
  85.  
  86. local button_y1 = {
  87.   [1] = 4
  88. }
  89.  
  90. local eu = {
  91.   ["max"] = 0,
  92.   ["current"] = 0,
  93.   ["percent"] = 0
  94. }
  95.  
  96. local mj = {
  97.   ["max"] = 0,
  98.   ["current"] = 0,
  99.   ["percent"] = 0
  100. }
  101.  
  102. if not fs.exists("settings") then print("Enter computer label: ") os.setComputerLabel(read() or settings["label"]) settings["label"] = os.getComputerLabel() end
  103.  
  104. --LOAD & SAVE FUNCTIONS--
  105.  
  106. function load()
  107.   print("Loading...")
  108.   local fileHandle = fs.open (load_save_loc["load_save_loc"], 'r')
  109.   load_save_loc = textutils.unserialize (fileHandle.readAll())
  110.   fileHandle.close()
  111.  
  112.   local fileHandle = fs.open (load_save_loc["settings"], 'r')
  113.   settings = textutils.unserialize (fileHandle.readAll())
  114.   fileHandle.close()
  115.  
  116.   local fileHandle = fs.open (load_save_loc["names"], 'r')
  117.   names = textutils.unserialize (fileHandle.readAll())
  118.   fileHandle.close()
  119.  
  120.   local fileHandle = fs.open (load_save_loc["ids"], 'r')
  121.   ids = textutils.unserialize (fileHandle.readAll())
  122.   fileHandle.close()
  123.  
  124.   local fileHandle = fs.open (load_save_loc["status"], 'r')
  125.   status = textutils.unserialize (fileHandle.readAll())
  126.   fileHandle.close()
  127.  
  128.   local fileHandle = fs.open (load_save_loc["eu"], 'r')
  129.   eu = textutils.unserialize (fileHandle.readAll())
  130.   fileHandle.close()
  131.  
  132.   local fileHandle = fs.open (load_save_loc["mj"], 'r')
  133.   mj = textutils.unserialize (fileHandle.readAll())
  134.   fileHandle.close()
  135. end
  136.  
  137. function save()
  138.   print("Saving...")
  139.   local fileHandle = fs.open (load_save_loc["load_save_loc"], 'w')
  140.   fileHandle.write (textutils.serialize (load_save_loc))
  141.   fileHandle.close()
  142.  
  143.   local fileHandle = fs.open (load_save_loc["settings"], 'w')
  144.   fileHandle.write (textutils.serialize (settings))
  145.   fileHandle.close()
  146.  
  147.   local fileHandle = fs.open (load_save_loc["names"], 'w')
  148.   fileHandle.write (textutils.serialize (names))
  149.   fileHandle.close()
  150.  
  151.   local fileHandle = fs.open (load_save_loc["ids"], 'w')
  152.   fileHandle.write (textutils.serialize (ids))
  153.   fileHandle.close()
  154.  
  155.   local fileHandle = fs.open (load_save_loc["status"], 'w')
  156.   fileHandle.write (textutils.serialize (status))
  157.   fileHandle.close()
  158.  
  159.   local fileHandle = fs.open (load_save_loc["eu"], 'w')
  160.   fileHandle.write (textutils.serialize (eu))
  161.   fileHandle.close()
  162.  
  163.   local fileHandle = fs.open (load_save_loc["mj"], 'w')
  164.   fileHandle.write (textutils.serialize (mj))
  165.   fileHandle.close()
  166. end
  167.  
  168.  
  169. --PERLIMINARY WORKINGS--
  170.  
  171. function imagewrite(code)
  172.   outputFile:write("/n")
  173.   outputFile:write(code)
  174. end
  175.  
  176. image_table = {[1] = "eeeeeeeeeeeeeeeeeeeeeeeeeee",
  177.   [2] = "eeeeeffffffffeefffffefffffe",
  178.   [3] = "eeeeff0000f0feef000ffff00fe",
  179.   [4] = "eeeef0fffffffeef0f00f00f0fe",
  180.   [5] = "eeeeff00ffeeeeef0ff000ff0fe",
  181.   [6] = "efffffff0feeeeefffff0fffffe",
  182.   [7] = "ef0f0000ffeeeeef0fefffef0fe",
  183.   [8] = "efffffffffeeeeefffeeeeefffe",
  184.   [9] = "eeeeeeeeeeeeeeeeeeeeeeeeeee"
  185. }
  186.  
  187. if not fs.exists("image") then
  188.   save()
  189.  
  190. --  fs.delete("startup")
  191. --  outputFile = io.open("startup", "a")
  192. --  text = tostring(shell.getRunningProgram())
  193. --  outputFile:write("shell.run(" .. text .. ")")
  194. --  outputFile:close()
  195.  
  196.   fs.delete("image")
  197.   outputFile = io.open("image", "w")
  198.  
  199.  outputFile:write(image_table[1])
  200.   for num = 2,table.maxn(image_table) do
  201.     imagewrite(image_table[num])
  202.   end
  203.   num = nil
  204.   outputFile:close()
  205. else
  206.   load()
  207. end
  208.  
  209. function freespace()
  210.   a = "locating free space..."
  211.   print(a)
  212.   freespace = table.maxn(names) + 1
  213.   a = "free space located at: "
  214.   print(a .. freespace)
  215. end
  216.  
  217. function target()
  218.   a = "locating target..."
  219.   print(a)
  220.   x = 1
  221.   repeat
  222.     x = x + 1
  223.   until names[x] == name1 or names[x] == nil
  224.   if names[x] == name1 then
  225.     target = x
  226.     a = "target located at: "
  227.     print(a .. target)
  228.   else
  229.     print("target button not found")
  230.     target = "not found"
  231.   end
  232. end
  233.  
  234. function add_button()
  235.   a = "adding..."
  236.   print(a)
  237.   freespace()
  238.   names[freespace] = name1
  239.   ids[freespace] = id
  240.   status[freespace] = false
  241.   a = "add successful"
  242.   print(a)
  243. end
  244.  
  245. function remove_button()
  246.   a = "removing..."
  247.   print(a)
  248.   target()
  249.   if target ~= "not found" then
  250.     freespace()
  251.     source = freespace - 1
  252.     names[target] = names[source]
  253.     ids[target] = ids[source]
  254.     status[target] = status[source]
  255.     names[source] = nil
  256.     ids[source] = nil
  257.     status[source] = nil
  258.     a = "removal successful"
  259.     print(a)
  260.   end
  261. end
  262.  
  263. function change_button()
  264.   print("changing " .. name1 .. id .. " to " .. name2 .. id2)
  265.   remove_button()
  266.   name1 = name2
  267.   id = id2
  268.   add_button()
  269.   print("change successful")
  270. end
  271.  
  272. function show_settings()
  273.   x = 2
  274.   while names[x] ~= nil do
  275.     print(x .. ": " .. names[x] .. " " .. ids[x])
  276.     x = x + 1
  277.   end
  278.   os.pullEvent()
  279. end
  280.  
  281. function save2()
  282.   print("confirm save? Y/N : ")
  283.   saving = read()
  284.   saving = tostring(saving)
  285.   if saving == "y" then
  286.     save()
  287.   end
  288. end
  289.  
  290. if command == "add" then
  291.   add_button()
  292.   save2()
  293. elseif command == "remove" then
  294.   remove_button()
  295.   save2()
  296. --elseif command == "change" then
  297. --  change_button()
  298. --  save2()
  299. elseif command == "settings" then
  300.   show_settings()
  301. elseif command == "client" then
  302.   shell.run("pastebin get " .. variables["client"] .. " client")
  303. end
  304.  
  305. function find_peripheral(t, e)
  306.   e = e or nil
  307.   sides = {[1] = "front", [2] = "back", [3] = "left", [4] = "right", [5] = "top", [6] = "bottom"}
  308.   peripheral_found = false
  309.   for num=1, 6 do
  310.     type = peripheral.getType(sides[num])
  311.     if type == t then
  312.       if e == "wireless" then
  313.         if peripheral.call(sides[num], "isWireless") then
  314.           return sides[num]
  315.         end
  316.       elseif e == "remote" then
  317.         if not peripheral.call(sides[num], "isWireless") then
  318.           return sides[num]
  319.         end
  320.       elseif e == nil then
  321.         return sides[num]
  322.       end
  323.     end
  324.   end
  325.   if peripheral_found ~= true then
  326.     error("No " .. t .. " attached to the computer", 0)
  327.   end
  328. end
  329.  
  330. -- MODEM REMOTE CONNECTIONS --
  331.  
  332. mod = peripheral.wrap(find_peripheral("modem", "remote"))
  333. local remote_peripherals = mod.getNamesRemote()
  334. remote_types = {}
  335. remote_monitors = {[1] = peripheral.wrap(find_peripheral("monitor"))}
  336. remote_rec = {}
  337. remote_eu = {}
  338. a = 1
  339. if remote_monitors[1] == nil then b = 1 else b = 2 end
  340. c = 1
  341. d = 1
  342. while remote_peripherals[a] ~= nil do
  343.   remote_types[a] = mod.getTypeRemote(remote_peripherals[a])
  344.   if remote_types[a] == "monitor" then
  345.     remote_monitors[b] = peripheral.wrap(remote_peripherals[a])
  346.     b = b + 1
  347.   end
  348.   if settings["open_peripherals"] and settings["energy_stats"] and settings["direct_power"] then
  349.     if remote_types[a] == "cofh_thermalexpansion_energycell" then
  350.       remote_rec[c] = peripheral.wrap(remote_peripherals[a])
  351.       c = c + 1
  352.     end
  353.     if remote_types[a] == "mfsu" then
  354.       remote_eu[d] = peripheral.wrap(remote_peripherals[a])
  355.       d = d + 1
  356.     end
  357.   end
  358.   a = a + 1
  359. end
  360.  
  361. rednet.open(find_peripheral("modem", "wireless"))
  362. mon = remote_monitors[1]
  363. mon.setTextScale(settings["text_scale"])
  364. oa_x, oa_y = mon.getSize()
  365.  
  366. if settings["energy_stats"] and settings["open_peripherals"] then
  367.   oa_x = oa_x - 10
  368. end
  369.  
  370. reps_x = math.floor(oa_x / (settings["button_width"] + 1))
  371. reps_y = math.floor((oa_y / 2) - 1)
  372. total_buttons = reps_x * reps_y
  373. print(oa_x .. "," .. oa_y .. " - " .. reps_x .. " x " .. reps_y .. " - " .. total_buttons)
  374.  
  375. --FUNCTIONS DRAWING MONITOR SCREEN--
  376.  
  377. print("Drawing mon screen")
  378.  
  379. function reset_text()
  380.   print("Reset text")
  381.   mon.setTextColor(colors.white)
  382.   mon.setBackgroundColor(colors.black)
  383. end
  384.  
  385. function heading()
  386.   print("heading")
  387.   mon.setCursorPos(2,2)
  388.   mon.setTextColor(settings["heading color"])
  389.   mon.setBackgroundColor(settings["heading background"])
  390.   mon.write(settings["heading"])
  391.   reset_text()
  392. end
  393.  
  394.  
  395. function button_draw(number, xpos, ypos)
  396.   mon.setCursorPos(xpos, ypos)
  397.   button_x1[number], button_y1[number] = mon.getCursorPos()
  398.   if names[number] ~= nil then
  399.     if status[number] then
  400.       mon.setBackgroundColor(settings["active color"])
  401.     else
  402.       mon.setBackgroundColor(settings["inactive color"])
  403.     end
  404.     text = names[number]:upper()
  405.     text_length = string.len(text) + 2
  406.     if text_length > settings["button_width"] then
  407.       settings["button_width"] = text_length
  408.     end
  409.     mon.write(" " .. text .. " ")
  410.     currpos_x, currpos_y = mon.getCursorPos()
  411.     while currpos_x ~= (settings["button_width"] + xpos) do
  412.       mon.write(" ")
  413.       currpos_x, currpos_y = mon.getCursorPos()
  414.     end
  415.     button_x2[z], y = mon.getCursorPos()
  416.  
  417.     reset_text()
  418.     print("Writing button " .. number .. ": " .. names[number] .. ": " .. tostring(status[number]))
  419.   end
  420. end
  421.  
  422. -- ENERGY FUNCTIONS --
  423.  
  424. function box(color, left, top, right, bot)
  425.   term.redirect(mon)
  426.   paintutils.drawLine(right, top, left, top, color)
  427.   paintutils.drawLine(left, top, left, bot, color)
  428.   paintutils.drawLine(right, bot, left, bot, color)
  429.   paintutils.drawLine(right, top, right, bot, color)
  430.   term.restore()
  431. end
  432.  
  433. function decimal(number)
  434.   text = nil
  435.   num = nil
  436.   if number > 999 then
  437. num = number / 1000
  438. text = "K"
  439.     if num > 999 then
  440. num = num / 1000
  441. text = "M"
  442.       if num > 999 then num = num / 1000
  443. text = "B"
  444.       end
  445.     end
  446.   num = math.floor(num)
  447.   end
  448.   a = num or 0
  449.   text = text or 0
  450.   text = a .. text
  451.   return text
  452. end
  453.  
  454. function energy_compile()
  455.   local a = 1
  456.   mj["max"] = 0
  457. mj["current"] = 0
  458. mj["percent"] = 0
  459.   while remote_rec[a] ~= nil do
  460.     mj["max"] = mj["max"] + remote_rec[a].getMaxEnergyStored("north")
  461.     mj["current"] = mj["current"] + remote_rec[a].getEnergyStored("north")
  462.     a = a + 1
  463.   end
  464.  
  465.   local a = 1
  466.   eu["max"] = 0
  467.   eu["current"] = 0
  468.   eu["percent"] = 0
  469.   while remote_eu[a] ~= nil do
  470.     eu["max"] = eu["max"] + remote_eu[a].getCapacity()
  471.     eu["current"] = eu["current"] + remote_eu[a].getStored()
  472.     a = a + 1
  473.   end
  474. end
  475.  
  476.  
  477. function percentage(type)
  478.   if type == "mj" then
  479.     mj["percent"] = mj["current"] / mj["max"] * 100
  480.     return math.floor(mj["percent"])
  481.   elseif type == "eu" then
  482.     eu["percent"] = eu["current"] / eu["max"] * 100
  483.     return math.floor(eu["percent"])
  484.   end
  485. end
  486.  
  487. function greaterx()
  488.   currx = mon.getCursorPos()
  489.   if currx > endx then
  490.     endx = currx
  491.   end
  492. end
  493.  
  494. function energy_stats(startx, starty)
  495.   if settings["direct_power"] then
  496.     energy_compile()
  497.   end
  498.  
  499.   x = startx + 2
  500.   y = starty + 2
  501.  
  502.   mon.setTextColor(colors.white)
  503.  
  504.   mon.setCursorPos(x,y)
  505.   mon.write("EU: " .. decimal(eu["current"]))
  506.   endx = mon.getCursorPos()
  507.   y = y + 1
  508.  
  509.   mon.setCursorPos(x,y)
  510.   mon.write("EU: " .. decimal(eu["max"]))
  511.   greaterx()
  512.   y = y + 1
  513.  
  514.  
  515.   mon.setCursorPos(x,y)
  516.   mon.write("EU: " .. percentage("eu") .. "%")
  517.   greaterx()
  518.   y = y + 2
  519.  
  520.  
  521.   mon.setCursorPos(x,y)
  522.   mon.write("MJ: " .. decimal(mj["current"]) )
  523.   greaterx()
  524.   y = y + 1
  525.  
  526.   mon.setCursorPos(x,y)
  527.   mon.write("MJ: " .. decimal(mj["max"]) )
  528.   greaterx()
  529.   y = y + 1
  530.  
  531.  
  532.   mon.setCursorPos(x,y)
  533.   mon.write("MJ: " .. percentage("mj") .. "%")
  534.   greaterx()
  535.   endy = y + 2
  536.   endx = endx + 1
  537.   box(colors.white, startx, starty, endx, endy)
  538. end
  539.  
  540. -- MONITOR SCREEN PROGRAM --
  541.  
  542. function mon_screen()
  543.  
  544.   screen = 1
  545.   while remote_monitors[screen] ~= nil do
  546.     mon = remote_monitors[screen]
  547.  
  548.     print("drawing monitor")
  549.  
  550.     mon.clear()
  551.  
  552.     heading()
  553.  
  554.     x = 2
  555.     y = 4
  556.  
  557.     if settings["energy_stats"] then
  558.       energy_stats(x, y)
  559.       settings["energy_room"] = endx
  560.       x = endx + 1
  561.     end
  562.  
  563.     z = 1
  564.  
  565.     for num=1,reps_x do
  566.       y = 4
  567.  
  568.       for num=1,reps_y do
  569.         button_draw(z, x, y)
  570.         y = y + 2
  571.         z = z + 1
  572.       end
  573.  
  574.       x = x + settings["button_width"] + 1
  575.     end
  576.     save()
  577.     screen = screen + 1
  578.   end
  579. end
  580.  
  581. --FUNCTION BUTTON DETECT--
  582.  
  583. function select_button()
  584.   z = 1
  585.   button_pressed = nil
  586.  
  587.   repeat
  588.     if names[z] ~= nil then
  589.       if x > button_x1[z] and x < button_x2[z] and y == button_y1[z] then
  590.         return z
  591.       end
  592.     end
  593.     z = z + 1
  594.   until z > total_buttons
  595. end
  596.  
  597. function message_send()
  598.   if status[button_pressed] then
  599.     text = "deactivate"
  600.     status[button_pressed] = not status[button_pressed]
  601.   else
  602.     text = "activate"
  603.     status[button_pressed] = not status[button_pressed]
  604.   end
  605.  
  606.   rednet.send(ids[button_pressed], text)
  607.   print(names[button_pressed] .. " " .. ids[button_pressed] .. " " .. text)
  608.  
  609.   mon_screen()
  610. end
  611.  
  612. function offline()
  613.   status[1] = false
  614.   a = 2
  615.   while names[a] ~= nil do
  616.     if status[a] then
  617.       status[a] = false
  618.       text = "deactivate"
  619.       rednet.send(ids[a], text)
  620.     end
  621.     a = a + 1
  622.   end
  623.   mon_screen()
  624. end
  625.  
  626. -- SCREEN SAVER --
  627.  
  628. function image_draw()
  629.   screen = 1
  630.   image = {}
  631.   image = paintutils.loadImage("image")
  632.   while remote_monitors[screen] ~= nil do
  633.     print("image: " .. screen)
  634.     mon = remote_monitors[screen]
  635.     mon.clear()
  636.     oa_x, oa_y = mon.getSize()
  637.     term.redirect(mon)
  638.     x = (oa_x / 2) - settings["image_x"]
  639.     y = (oa_y / 2) - settings["image_y"]
  640.     paintutils.drawImage(image, x, y)
  641.     term.restore()
  642.     reset_text()
  643.     screen = screen + 1
  644.   end
  645. end
  646.  
  647.  
  648. function screen_saver()
  649.   print("screen Saver")
  650.  
  651.   image_draw()
  652.   os.pullEvent("monitor_touch")
  653. end
  654.  
  655. -- PROGRAM --
  656.  
  657. mon_screen()
  658. while true do
  659.   if settings["direct_power"] or settings["screen_saver"] then
  660.     os.startTimer(settings["refresh_rate"])
  661.   end
  662.  
  663.   event, id, x, y  = os.pullEvent()
  664.  
  665.   if event == "monitor_touch" then
  666.     button_pressed = select_button()
  667.     e = 1
  668.     if names[button_pressed] ~= nil then
  669.       if button_pressed ~= 1 then
  670.         if status[1] then
  671.           message_send()
  672.         end
  673.       else
  674.  
  675.         if status[1] then
  676.           offline()
  677.         else
  678.           status[1] = true
  679. --          startup_buttons
  680.         end
  681.       end
  682.     end
  683.  
  684.     mon_screen()
  685.  
  686.   elseif event == "rednet_message" then
  687.  
  688.     if id == settings["eu_id"] then
  689.       eu = textutils.unserialize (x)
  690.     elseif id == settings["mj_id"] then
  691.       mj = textutils.unserialize (x)
  692.     end
  693.  
  694.     mon_screen()
  695.  
  696.   elseif event == "timer" then
  697.     print("timer")
  698.     if settings["screen_saver"] then
  699.       e = e + 1
  700.       print("Timeout: " .. e)
  701.       if e == settings["timeout"] then
  702.         screen_saver()
  703.         e = 1
  704.       end
  705.     end
  706.     mon_screen()
  707.   end
  708. end
Advertisement
Add Comment
Please, Sign In to add comment