SHOW:
|
|
- or go back to the newest paste.
| 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 |