karelvysinka

Base monitor - This script allows you to monitor caches....

Nov 15th, 2015
203
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. --[[
  2.     Base Monitor 1.0
  3.     This script allows you to monitor caches, tanks, barrels and chests
  4.     Monitoring chests requires an open peripheral proxy, the same goes for
  5.     buildcraft tanks.
  6.     You can build one of more computers and set one of them as the main server by
  7.     setting isMain to true. This will let it receive information from other computers.
  8.     For the main server to receive info from other computers you need to attach a
  9.     wireless modem to each computer.
  10.     Peripherals can be attached to any side you like, the script will automatically
  11.     work out where the peripherals are.
  12.     http://youtu.be/KT-2hKjUpGA
  13. --]]
  14. -- Below are values you can change
  15. local isMain = false;
  16. --local id = os.computerID();
  17. local id = "The Base";
  18.  
  19. local titleTextColor = colors.blue;
  20. local titleBackColor = colors.white;
  21. local tankTextColor = colors.black;
  22. local tankBackColor = colors.lime;
  23. local chestTextColor = colors.white;
  24. local chestBackColor = colors.purple;
  25. local cacheTextColor = colors.white;
  26. local cacheBackColor = colors.cyan;
  27. local powerTextColor = colors.black;
  28. local powerBackColor = colors.orange;
  29.  
  30. local NameLen = 21;
  31. local mainChannel = 2;
  32.  
  33. -- Above are values you can change
  34.  
  35. local peripherals = peripheral.getNames();
  36. local mon;
  37. local wmod;
  38. local x,y;
  39. local CurColumn = 0;
  40. local MaxColumn;
  41. local ColumnWidth;
  42. local CurLine = 2;
  43. local ContentData = {};
  44.  
  45. function padString (sText, iLen)
  46.     local iTextLen = string.len(sText);
  47.     -- Too short, pad
  48.     if (iTextLen < iLen) then
  49.         local iDiff = iLen - iTextLen;
  50.         return(sText..string.rep(" ",iDiff));
  51.     end
  52.     -- Too long, trim
  53.     if (iTextLen > iLen) then
  54.         return(string.sub(sText,1,iLen));
  55.     end
  56.     -- Exact length
  57.     return(sText);
  58. end
  59.  
  60. function prepmonitor(objectmon)
  61.     mon = peripheral.wrap(objectmon);
  62.     if (mon.isColor() == false) then
  63.         titleTextColor = colors.black;
  64.         titleBackColor = colors.white;
  65.         tankTextColor = colors.black;
  66.         tankBackColor = colors.white;
  67.         chestTextColor = colors.black;
  68.         chestBackColor = colors.white;
  69.         cacheTextColor = colors.black;
  70.         cacheBackColor = colors.white;
  71.         powerTextColor = colors.black;
  72.         powerBackColor = colors.white;
  73.     end
  74. end
  75.  
  76. function updateTable(strSource,strName,strAmount,strMax,strLegend)
  77.     ContentData[strSource] = {};
  78.     ContentData[strSource]["displayname"] = strName;
  79.     ContentData[strSource]["count"] = strAmount;
  80.     ContentData[strSource]["max"] = strMax;
  81.     ContentData[strSource]["legend"] = strLegend;
  82. end
  83.  
  84. function printmon(strName,strAmount,strMax,strLegend)
  85.     local textColor;
  86.     local backColor;
  87.     if (strLegend == "#") then
  88.         textColor = chestTextColor;
  89.         backColor = chestBackColor;
  90.         strLegend = "";
  91.     end
  92.     if (strLegend == "+") then
  93.         textColor = tankTextColor;
  94.         backColor = tankBackColor;
  95.         strLegend = "";
  96.     end
  97.     if (strLegend == "*") then
  98.         textColor = powerTextColor;
  99.         backColor = powerBackColor;
  100.         strLegend = "";
  101.     end
  102.     if (strLegend == "$") then
  103.         textColor = cacheTextColor;
  104.         backColor = cacheBackColor;
  105.         strLegend = "";
  106.     end
  107.     local line = string.format("%s  %3i%s",padString(strName,NameLen+1),strAmount,padString(strLegend,1));
  108.     if (strAmount >= 1000000) then
  109.         line = string.format("%s  %3iM%s",padString(strName,NameLen),math.floor(strAmount/1000000),padString(strLegend,1));
  110.     elseif (strAmount >= 1000) then
  111.         line = string.format("%s  %3iK%s",padString(strName,NameLen),math.floor(strAmount/1000),padString(strLegend,1));
  112.     end
  113.  
  114.     local ColPadding = 0;
  115.     if (CurColumn > 0) then
  116.         ColPadding = 1;
  117.     end
  118.     local CurX = math.floor((CurColumn*ColumnWidth))+math.floor(CurColumn*ColPadding)+1;
  119.     --print("CurX:"..CurX);
  120.     mon.setCursorPos(CurX,CurLine);
  121.     local percent = strAmount / strMax * 100;
  122.     mon.setBackgroundColor(backColor);
  123.     if (strMax == 0) then
  124.         percent = 0;
  125.     end
  126.     local barlength = math.floor(percent / 100 * (string.len(line)-1));
  127.  
  128.     if (string.len(line) > barlength) then
  129.         local msg = string.sub(line,1,barlength);
  130.         mon.setTextColor(textColor);
  131.         mon.write(msg);
  132.         --[[if (percent == 0) then
  133.             mon.setBackgroundColor();
  134.         else
  135.             mon.setBackgroundColor(colors.black);
  136.         end--]]
  137.         mon.setBackgroundColor(colors.black);
  138.         mon.setTextColor(backColor);
  139.         mon.write(string.sub(line,barlength+1,-2))
  140.     else
  141.         local spaces = barlength - string.len(line);
  142.         mon.write(line);
  143.         mon.write(string.rep(" ",spaces));
  144.     end
  145.  
  146.     mon.setTextColor(colors.white);
  147.     CurColumn = CurColumn + 1;
  148.     if (CurColumn > MaxColumn) then
  149.         CurColumn = 0;
  150.         CurLine = CurLine + 1;
  151.     end
  152.     return true;
  153. end
  154.  
  155. -- Find a monitor
  156. function findMonitor()
  157.     for i,name in pairs(peripherals) do
  158.         for j,method in pairs(peripheral.getMethods(name)) do
  159.             if (method == 'getCursorPos') then
  160.                 prepmonitor(name);
  161.             end
  162.         end
  163.     end
  164. end
  165.  
  166. -- Find a wireless modem
  167. function findWirelessModem()
  168.     local foundWireless = false;
  169.     for i,name in pairs(peripherals) do
  170.         for j,method in pairs(peripheral.getMethods(name)) do
  171.             if (method == 'isWireless') then
  172.                 wmod = peripheral.wrap(name);
  173.                 if (wmod.isWireless()) then
  174.                     wmod.closeAll();
  175.                     foundWireless = true;
  176.                     break;
  177.                 else
  178.                     wmod = {};
  179.                 end
  180.             end
  181.         end
  182.         if (foundWireless) then
  183.             break;
  184.         end
  185.     end
  186. end
  187.  
  188. function collectLocalInfo()
  189.     for i,name in pairs(peripherals) do
  190.         local isTank = false;
  191.         local isCache = false;
  192.         local isChest = false;
  193.         local isCell = false;
  194.         for j,method in pairs(peripheral.getMethods(name)) do
  195.             if (method == 'getTankInfo') then  
  196.                 isTank = true;
  197.                 break;
  198.             end
  199.             if (method == 'getStoredItems') then
  200.                 isCache = true;
  201.                 isChest = false;
  202.                 break;
  203.             end
  204.             if (method == 'getMaxEnergyStored') then
  205.                 isCell = true;
  206.                 isChest = false;
  207.                 if (string.match(peripheral.call(name,"getInventoryName"),"cache") == "cache") then
  208.                     isCell = false;
  209.                     isChest = false;
  210.                     isCache = true;
  211.                 end
  212.                 break;
  213.             end
  214.             if ((method == 'getStackInSlot') and (not isCache)) then
  215.                 isChest = true;
  216.             end
  217.         end
  218.         if (isTank) then
  219.             local p = peripheral.wrap(name);
  220.             local iteminfo = p.getTankInfo();
  221.             local maxItems = iteminfo[1].capacity;
  222.             maxItems = math.floor(maxItems/1000);
  223.             local displayname = "Empty";
  224.             local amount = 0;
  225.             if (iteminfo[1].contents) then
  226.                 displayname = iteminfo[1].contents.rawName;
  227.                 amount = iteminfo[1].contents.amount;
  228.                 amount = math.floor(amount/1000);
  229.             end
  230.             --printmon(displayname,amount,maxItems,"+");
  231.             updateTable(id.."-"..name,displayname,amount,maxItems,"+");
  232.         end
  233.         if (isCache) then
  234.             local p = peripheral.wrap(name);
  235.             local iteminfo = p.getStoredItems();
  236.             if (iteminfo) then
  237.                 local maxItems = p.getMaxStoredItems();
  238.                 local displayname = iteminfo.display_name;
  239.                 --print(name..",".."cache,"..displayname..","..iteminfo.qty..","..maxItems);
  240.                 --printmon(displayname,iteminfo.qty,maxItems,"#");
  241.                 updateTable(id.."-"..name,displayname,iteminfo.qty,maxItems,"$");
  242.             end
  243.         end
  244.         if (isCell) then
  245.             local p = peripheral.wrap(name);
  246.             local energy = p.getEnergyStored();
  247.             local maxEnergy = p.getMaxEnergyStored();
  248.             local percent = (energy/maxEnergy*100);
  249.             --printmon("Power Cell",energy,maxEnergy,"*");
  250.             updateTable(id.."-"..name,"Power Cell",energy,maxEnergy,"*");
  251.         end
  252.         if (isChest) then
  253.             --print("is a Chest");
  254.             local p = peripheral.wrap(name);
  255.             local chestSize = p.getInventorySize();
  256.             local items = {};
  257.             for j=1,chestSize,1 do
  258.                 local iteminfo = p.getStackInSlot(j);
  259.                 if (iteminfo) then
  260.                     displayname = iteminfo.display_name;
  261.                     if (displayname) then
  262.                         if (not items[displayname]) then
  263.                             items[displayname] = iteminfo.qty;
  264.                         else
  265.                             items[displayname] = items[displayname] + iteminfo.qty;
  266.                         end
  267.                     end
  268.                 end
  269.             end
  270.             local k = 0;
  271.             for key,val in pairs(items) do
  272.                 k = k + 1;
  273.                 --printmon(key,val,0,"#");
  274.                 updateTable(id.."-"..name.."_"..k,key,val,0,"#");
  275.             end
  276.         end
  277.     end
  278. end
  279.  
  280. function updateMonitor()
  281.     x,y = mon.getSize();
  282.     ColumnWidth = NameLen + 7;
  283.     MaxColumn = math.floor(x / (ColumnWidth))-1;
  284.     mon.setBackgroundColor(colors.black);
  285.     mon.clear();
  286.     CurColumn = 0;
  287.     CurLine = 1;
  288.     mon.setCursorPos(1,1);
  289.     mon.setTextColor(colors.white);
  290.     mon.setTextScale(0.5);
  291.     mon.write("Base Monitor 1.0");
  292.     local sorted = {};
  293.     for n in pairs(ContentData) do
  294.         table.insert(sorted, n);
  295.     end
  296.     table.sort(sorted);
  297.     local name = "";
  298.     for i,source in ipairs(sorted) do
  299.         local curname = string.sub(string.match(source,"^.*-"),1,-2);
  300.         if (name ~= curname) then
  301.             name = curname;
  302.             CurColumn = 0;
  303.             mon.setTextColor(titleTextColor);
  304.             mon.setBackgroundColor(titleBackColor);
  305.             mon.setCursorPos(1,CurLine+1);
  306.             mon.write(padString("Contents for "..name,x-1));
  307.             CurLine = CurLine + 2;
  308.         end
  309.         displayname = ContentData[source]["displayname"];
  310.         count = ContentData[source]["count"];
  311.         max = ContentData[source]["max"];
  312.         legend = ContentData[source]["legend"];
  313.         printmon(displayname,count,max,legend);
  314.     end
  315. end
  316. -- This is the main section of the script
  317.  
  318. findMonitor();
  319. findWirelessModem();
  320.  
  321. if (isMain == true) then
  322.     if (wmod) then
  323.         wmod.open(mainChannel);
  324.     else
  325.         print("You don't have a wireless modem, and this is set as the main computer");
  326.     end
  327. end
  328.  
  329. ContentData = {};
  330.  
  331. local timerUpdate = os.startTimer(10);
  332. local updateCount = 0;
  333. local wirelessEventCount = 0;
  334. -- Perform Initial Collection and Update the Monitor
  335. collectLocalInfo();
  336. updateMonitor();
  337.  
  338. while true do  
  339.     local event, param1, param2, param3, param4, param5 = os.pullEvent();
  340.     print("Received event:"..event);
  341.     if (event == "timer") then
  342.         if (param1 == timerUpdate) then
  343.             updateCount = updateCount + 1;
  344.             if (updateCount >= 3) then
  345.                 updateCount = 0;
  346.                 ContentData = {};
  347.             end
  348.             collectLocalInfo();
  349.             if (wmod) then
  350.                 if (isMain == false) then
  351.                     wmod.transmit(mainChannel,1,ContentData);
  352.                 end
  353.             end
  354.             if (updateCount == 2) then
  355.                 updateMonitor();
  356.             end
  357.             wirelessEventCount = 0;
  358.             timerUpdate = os.startTimer(5);
  359.         end
  360.     end
  361.     if (event == "modem_message") then
  362.         if (isMain == true) then
  363.             wirelessEventCount = wirelessEventCount + 1;
  364.             for source,data in pairs(param4) do
  365.                 ContentData[source] = {};
  366.                 ContentData[source]["displayname"] = param4[source]["displayname"];
  367.                 ContentData[source]["count"] = param4[source]["count"];
  368.                 ContentData[source]["max"] = param4[source]["max"];
  369.                 ContentData[source]["legend"] = param4[source]["legend"];
  370.             end
  371.             if (wirelessEventCount >= 10) then
  372.                 timerUpdate = os.startTimer(1);
  373.             end
  374.         end
  375.     end
  376.     if (event == "monitor_touch") or (event == "monitor_resize") then
  377.         print("Updating the Monitor");
  378.         updateMonitor();
  379.     end
  380.     if (event == "peripheral") or (event == "peripheral_detach") then
  381.         print("Updating the peripheral list");
  382.         peripherals = peripheral.getNames();
  383.     end
  384. end
Add Comment
Please, Sign In to add comment