[MC/OpenComputers] ME Test (listed) 23.09.2019 23:51:19 (236 lines) [Edit] [Raw] [View]

--rm metest.lua ; wget https://files.rurido.de/raw/136 metest.lua

local sides = require("sides");

--configuration

local cfg = { pullStackSize = 1000000, --min size of stacks to pull from me, 0 to disable exportSide = sides.top, --export bus side -> top, bottom, front, back, left, right, unknown meResponseTime = 5 --time in sec to wait for me to push items };

--program routine

local c = require("component"); local p = require("process"); local event = require("event"); local thread = require("thread");

local db = nil; local me = nil; local ex = nil; local im = nil;

function main()

if not c.isAvailable("database") then
    print("Missing component: Database");
    return;
end
db = c.database;

if not c.isAvailable("me_controller") then
   print("Missing component: ME Controller");
   return;
end
me = c.me_controller; --primary

if not c.isAvailable("me_exportbus") then
    print("Missing component: ME Exportbus") ;
    return;
end
ex = c.me_exportbus --primaryff8484ff8484

--[[
if not c.isAvailable("me_importbus") then
    print("Missing component: ME Importbus");
    return;
end
im = c.me_importbus --primary
--]]

--init done

print("ME Network (Connected to ME Network #" .. me.address .. ")");
print("├──ME Controller");
print("│  ├──CPUs: " .. #me.getCpus());
print("│  ├──Energy: " .. me.getEnergyStored() .. " / " .. me.getMaxEnergyStored());
print("│  ├──Power:");
print("│  │  ├──Str/Max: " .. me.getStoredPower() .. " / " .. me.getMaxStoredPower());
print("│  │  ├──In/Out: +" .. me.getAvgPowerInjection() .. " / -" .. me.getAvgPowerUsage());
print("│  │  └──Idle Use: -" .. me.getIdlePowerUsage());
print("│  ├──Items: " .. #me.getItemsInNetwork());
print("│  ├──Fluids: " .. #me.getFluidsInNetwork());
print("│  ├──Gases: " .. #me.getGasesInNetwork());
print("│  └──Recipes: " .. #me.getCraftables());
--print("├──ME Import Bus");
print("└──ME Export Bus");
print();
--[[
print(" . . . ");
print("TODO");

print("DEBUG-ME-MEMBERS");
for key,value in pairs(me) do
    if type(value) == "function" then
        print(" " .. key .. " -> " .. debug.getinfo(value));
    else
        print(" " .. key .. " -> " .. tostring(value));
    end

end
--]]

print("PullStackSize: " .. cfg.pullStackSize);

--[[local cleanupThread = thread.create(function()
    event.pull("interrupted");
    print("cleaning up resources");
end);


local workerThread = thread.create(function()--]]
    print("Worker started");
    print("Stop with [CTRL]+[ALT]+[C] (Hard Interrupt)");
    local lastItem = nil;
    while true do
        local foundItem = false;

        for key,item in pairs(me.getItemsInNetwork()) do
            os.sleep(0);

            if type(item) == "table" and item.size >= cfg.pullStackSize then 

                print("Next Item: " .. item.label .. " (x" .. item.size .. ")");

                --printDebug(item);

                foundItem = true;

                if trimItem(lastItem) ~= trimItem(item) then
                    ex.setExportConfiguration(cfg.exportSide);
                    print("Cleared Export-Bus configuration");

                    stored = storeInDb(item);

                else
                    print("Last item == current");
                    stored = true;
                end

                if not stored then --db.get(1) == nil then
                    print("Failed to store Item Info to DB");
                else
                    print("Stored Item Info to DB: " .. db.get(1).label);

                    ex.setExportConfiguration(cfg.exportSide, 1, db.address, 1);
                    print("Set Export-Bus configuration: " .. ex.getExportConfiguration(cfg.exportSide, 1).label);

                    ex.exportIntoSlot(cfg.exportSide, 1);
                    print("Triggered Export");

                    lastItem = item;

                    os.sleep(cfg.meResponseTime);

                end

            end
        end

        if foundItem == false then

            print("No Item found using configured properties");

            ex.setExportConfiguration(cfg.exportSide);
            print("Cleared Export-Bus configuration");

        end

    end
--[[end)

thread.waitForAny({cleanupThread, workerThread});--]]
os.exit(0); -- closes all remaining threads

end

function storeInDb(item) for i = 0, 10, 1 do db.clear(1); local dbItem = trimItem(item); me.store(dbItem, db.address, 1, 1); if db.get(1) ~= nil then print("Stored after " .. i+1 .. " attempt(s)"); return true; else os.sleep(0);--NOP --os.execute("sleep 1"); end end

return false;

end

function trimItem(item)

if item == nil then
   return nil; 
end

return {
    label = item.label,
    name = item.name,
    damage = item.damage
};

end

function pause() print(); term.write("Press any key to continue "); term.read(); print();
end

function printDebug(val, spaces)

if spaces == nil then
   spaces = ""; 
end

if string.len(spaces) >= 16 then
    print(spaces .. "RECURSION_LIMIT");
    return; 
end

if val == nil then
    print(spaces .. "NIL");
    return;
end

print(spaces .. tostring(val));
if type(val) == "table" then
    for key,value in pairs(val) do
        print(spaces .. tostring(key) .. " -> " .. tostring(value));
        if type(value) == "function" or type(value) == "table" then
            printDebug(value, "  " .. spaces);
        end
    end
end

end

p.info().data.signal = function(...) print("Caught hard interrupt, terminating...");

ex.setExportConfiguration(cfg.exportSide);
print("Cleared Export-Bus configuration");

os.exit();

end

main();