Advertisement
Guest User

orectrl.lua

a guest
Jun 2nd, 2018
110
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 5.94 KB | None | 0 0
  1. local computer = require("computer")            
  2. local component = require("component")          
  3. local event = require("event")                                        
  4. local sides = require("sides")                  
  5. local database = component.database              
  6. local mei = component.me_interface;              
  7. local rs = component.redstone;                  
  8. local transposer = component.transposer;        
  9. local orectrl = {                                
  10.     mTimerId = nil,                              
  11.     mWashers = {                                
  12.         {                                        
  13.             side    =  sides.east,              
  14.             address = component.me_exportbus.address,                                    
  15.             state   = 'notinitalized',          
  16.             lastState = 'n/a',                  
  17.             name    = 'left2'                    
  18.         }                                      
  19.         --{                                        
  20.         --    side    = sides.west,                
  21.         --    address = "8331c9e0-8685-4ef2-91a9-31fe0d722ef3",                                    
  22.         --    state   = 'notinitialized',          
  23.         --    lastState = 'n/a',                  
  24.         --    name    = 'right2'                  
  25.         --}                                        
  26.     },                                          
  27.     mDBInitialized = false,                      
  28.     mOres = {},                                  
  29.     mValidOres = {},                            
  30.     mOreMinSize = -1,                            
  31.     mStats = {                                  
  32.         tickLast = 0,                            
  33.         timeDiff = 0                            
  34.     }                                            
  35. }                                                
  36. function orectrl.updateStats()                  
  37.     local now = computer.uptime() * 20          
  38.     local timediff = now - orectrl.mStats.tickLast                                                
  39.     -- Did we advance at least one tick?  
  40.     if timediff <= 0 then
  41.         -- We've already been called this tick. No need to do anything.
  42.         -- This it NOT an optimization. Stuff will break if we continue.
  43.         print("timediff to small");
  44.         return false
  45.     end
  46.     if(orectrl.mDBInitialized == false) then
  47.         for i=1,81 do
  48.             local item = database.get(i);
  49.             if(item ~= nil) then
  50.                 table.insert(orectrl.mOres, {
  51.                     dbItem= item,
  52.                     meSize = -1,
  53.                     minSize = -1,
  54.                     valid = false,
  55.                     dbSlot = i
  56.                 });
  57.             end
  58.         end
  59.         orectrl.mDBInitialized = true
  60.         computer.pushSignal("orectrl_ore_added")
  61.     end
  62.     for _, washer in pairs(orectrl.mWashers) do
  63.         local itemChest = transposer.getStackInSlot(washer.side, 1);
  64.         if(washer["state"] == nil) then
  65.             washer["state"] = 'notinitialized'
  66.         end
  67.         if (itemChest == nil and not (washer["state"] == 'empty' or string.find(washer["state"], 'invalid'))) then
  68.             washer["state"] = "empty"
  69.         elseif(itemChest ~= nil) then
  70.             washer["state"] = itemChest.label
  71.         end
  72.     end
  73.     orectrl.mOreMinSize = 5 --32+((#orectrl.mWashers)*64)
  74.     orectrl.mValidOres = {}
  75.     for _, ore in pairs(orectrl.mOres) do
  76.         local meItem = mei.getItemsInNetwork({label=ore.dbItem.label});
  77.                                                                        
  78.         ore.minSize = orectrl.mOreMinSize
  79.         if meItem[1] ~= nil then
  80.             ore.meItem = meItem[1]
  81.             ore.meSize = meItem[1].size
  82.             if meItem[1].size >= orectrl.mOreMinSize then
  83.                 ore.valid = true
  84.                 table.insert(orectrl.mValidOres, ore)
  85.             else
  86.                 ore.valid = false
  87.             end
  88.         else
  89.             ore.valid = false
  90.         end
  91.     end
  92.     orectrl.mStats.tickLast = now
  93.     orectrl.mStats.timeDiff = timediff
  94.     -- Fail for the first time so nobody can accidentally run the state machine and crash.
  95.     return (timediff ~= now)
  96. end
  97.  
  98. function orectrl.getWashers()
  99.     return orectrl.mWashers
  100. end
  101.  
  102. function orectrl.getOres()
  103.     return orectrl.mOres
  104. end
  105.  
  106. function orectrl.findValudOre()
  107. end
  108.  
  109. function orectrl.runOnce()
  110.     if not orectrl.updateStats() then
  111.         print("stats update successfull");
  112.         return
  113.     end
  114.     if #orectrl.mValidOres < 1 then
  115.         return
  116.     end
  117.  
  118.    for _, washer in pairs(orectrl.mWashers) do
  119.         if(washer["state"] == 'empty' or string.match(washer["state"], 'invalid')) then
  120.             local slot = math.random(1, #orectrl.mValidOres);
  121.             local item = orectrl.mValidOres[slot];
  122.             washer.lastState = washer.state
  123.             if item ~= nil then
  124.                 component.proxy(washer.address).setExportConfiguration(sides.east, database.address, item.dbSlot);
  125.                 rs.setOutput(washer.side, 15);
  126.                 rs.setOutput(washer.side, 0);
  127.                 component.proxy(washer.address).setExportConfiguration(sides.east);
  128.                 washer.state = item.label;
  129.             end
  130.         end
  131.     end
  132. end
  133.  
  134. -- Service functions
  135. function orectrl.start()
  136.     if orectrl.mTimerId ~= nil then
  137.         return false
  138.     else
  139.         orectrl.mTimerId = event.timer(1, orectrl.asyncTimerHandler, math.huge)
  140.         return true
  141.     end
  142. end
  143.  
  144. function orectrl.stop()
  145.     if orectrl.mTimerId == nil then
  146.         return false
  147.     else
  148.         --event.ignore("component_added", grid_controller.asyncComponentAddedHandler)
  149.         --event.ignore("component_removed", grid_controller.asyncComponentRemovedHandler)
  150.         event.cancel(orectrl.mTimerId)
  151.         orectrl.mTimerId = nil
  152.         return true
  153.     end
  154. end
  155.  
  156. function orectrl.isRunning()
  157.     return orectrl.mTimerId ~= nil
  158. end
  159.  
  160. function orectrl.asyncTimerHandler()
  161.     xpcall(orectrl.runOnce, function(...) io.stderr:write(debug.traceback(...) .. "\n") end)
  162. end
  163.  
  164. return orectrl
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement