diff --git a/apis/chestAdapter18.lua b/apis/chestAdapter18.lua index d749ecf..7e76a57 100644 --- a/apis/chestAdapter18.lua +++ b/apis/chestAdapter18.lua @@ -146,12 +146,12 @@ function ChestAdapter:provide(item, qty, slot, direction) return total, m end -function ChestAdapter:extract(slot, qty, toSlot) - return self.pushItems(self.direction, slot, qty, toSlot) +function ChestAdapter:extract(slot, qty, toSlot, direction) + return self.pushItems(direction or self.direction, slot, qty, toSlot) end -function ChestAdapter:insert(slot, qty, toSlot) - return self.pullItems(self.direction, slot, qty, toSlot) +function ChestAdapter:insert(slot, qty, toSlot, direction) + return self.pullItems(direction or self.direction, slot, qty, toSlot) end return ChestAdapter diff --git a/inventoryManager/apis/networkedAdapter18.lua b/inventoryManager/apis/networkedAdapter18.lua index bd7a538..936ca08 100644 --- a/inventoryManager/apis/networkedAdapter18.lua +++ b/inventoryManager/apis/networkedAdapter18.lua @@ -11,6 +11,7 @@ function NetworkedAdapter:init(args) remotes = { }, remoteDefaults = { }, dirty = true, +listCount = 0, } Util.merge(self, defaults) Util.merge(self, args) @@ -63,15 +64,16 @@ function NetworkedAdapter:listItems(throttle) if not self.dirty then return self.items end - +self.listCount = self.listCount + 1 +debug(self.listCount) local cache = { } local items = { } throttle = throttle or Util.throttle() for _, remote in pairs(self.remotes) do if not remote:listItems(throttle) then - debug('no List') - error('Listing failed: ', remote.name) + debug('no List: ' .. remote.name) + --error('Listing failed: ' .. remote.name) end local rcache = remote.cache or { } @@ -145,7 +147,7 @@ debug('extract %d slot:%d', qty, slot) return total end -function NetworkedAdapter:insert(slot, qty, toSlot, item) +function NetworkedAdapter:insert(slot, qty, toSlot, item, source) local total = 0 -- toSlot is not really valid with this adapter @@ -159,12 +161,10 @@ function NetworkedAdapter:insert(slot, qty, toSlot, item) self:listItems() end -debug('attempting to insert ' .. item.name) - local function insert(remote) -debug('slot %d -> %s: %s', slot, remote.side, qty) - local amount = remote:insert(slot, qty, toSlot) + local amount = remote:insert(slot, qty, toSlot, source or self.direction) if amount > 0 then +debug('%s(%d) -> %s: %d', source or self.direction, slot, remote.side, amount) self.dirty = true remote.dirty = true end diff --git a/inventoryManager/inventoryManager.lua b/inventoryManager/inventoryManager.lua index d751fe8..8abadd0 100644 --- a/inventoryManager/inventoryManager.lua +++ b/inventoryManager/inventoryManager.lua @@ -71,7 +71,6 @@ local fs = _G.fs local multishell = _ENV.multishell local shell = _ENV.shell - if multishell then multishell.setTitle(multishell.getCurrent(), 'Resource Manager') end diff --git a/inventoryManager/plugins/exportTask.lua b/inventoryManager/plugins/exportTask.lua new file mode 100644 index 0000000..6e26330 --- /dev/null +++ b/inventoryManager/plugins/exportTask.lua @@ -0,0 +1,30 @@ +local itemDB = require('itemDB') +local Lora = require('lora/lora') + +local device = _G.device + +local ExportTask = { + priority = 5, +} + +function ExportTask:cycle(context) + for target, v in pairs(context.config.remoteDefaults) do + if v.exports then + local machine = device[target] + if machine and machine.getItemMeta then + for slotNo, item in pairs(v.exports) do + local slot = machine.getItemMeta(slotNo) or { count = 0 } + local maxCount = slot.maxCount or itemDB:getMaxCount(item) + local count = maxCount - slot.count + if count > 0 then + context.inventoryAdapter:provide(itemDB:splitKey(item), count, slotNo, target) + end + end + else + debug('Invalid export target: ' .. target) + end + end + end +end + +Lora:registerTask(ExportTask) diff --git a/inventoryManager/plugins/importTask.lua b/inventoryManager/plugins/importTask.lua new file mode 100644 index 0000000..165790b --- /dev/null +++ b/inventoryManager/plugins/importTask.lua @@ -0,0 +1,27 @@ +local Lora = require('lora/lora') + +local device = _G.device + +local ImportTask = { + priority = 3, +} + +function ImportTask:cycle(context) + for source, v in pairs(context.config.remoteDefaults) do + if v.exports then + local machine = device[source] + if machine and machine.getItemMeta then + for slotNo in pairs(v.imports) do + local slot = machine.getItemMeta(slotNo) + if slot then + context.inventoryAdapter:insert(slotNo, slot.count, nil, slot, source) + end + end + else + debug('Invalid import source: ' .. source) + end + end + end +end + +Lora:registerTask(ImportTask) diff --git a/inventoryManager/plugins/inputChestTask.lua b/inventoryManager/plugins/inputChestTask.lua index 516ea81..6589275 100644 --- a/inventoryManager/plugins/inputChestTask.lua +++ b/inventoryManager/plugins/inputChestTask.lua @@ -1,5 +1,5 @@ -local InventoryAdapter = require('inventoryAdapter') -local Lora = require('lora/lora') +local InventoryAdapter = require('inventoryAdapter') +local Lora = require('lora/lora') local device = _G.device local modem = device.wired_modem @@ -21,6 +21,7 @@ function InputChest:init(context) end -- TODO: clear grid +-- TODO: extract directly to target function InputChest:cycle(context) for _, adapter in pairs(self.adapters) do diff --git a/inventoryManager/plugins/listing.lua b/inventoryManager/plugins/listing.lua index 3ac7031..652e885 100644 --- a/inventoryManager/plugins/listing.lua +++ b/inventoryManager/plugins/listing.lua @@ -1,8 +1,8 @@ local Craft = require('turtle.craft') local itemDB = require('itemDB') -local Lora = require('lora/lora') -local UI = require('ui') -local Util = require('util') +local Lora = require('lora/lora') +local UI = require('ui') +local Util = require('util') local colors = _G.colors local os = _G.os