os.loadAPI("JsonSaveLoad"); os.loadAPI("Receive"); os.loadAPI("Limits"); os.loadAPI("AEIntegration"); local SettingsFile = "Settings.json"; local Settings = {}; local SlaveConfiguration = {}; local AEnetwork = nil; local function ReceiveLoop() Receive.ReceiveLoop(Settings.ReceiveProtocol); end local function SendToSlave(slaveId,conf,limit,networkItemCount) local signalToSend = nil; if (limit.Mode == "GreaterThan" and networkItemCount > limit.Count) or (limit.Mode == "LesserThan" and networkItemCount < limit.Count) then signalToSend = limit.Signal; else signalToSend = not limit.Signal; end if conf.CurrentState ~= signalToSend then conf.CurrentState = signalToSend; print("Sending signal " .. tostring(conf.CurrentState) .. " to "..slaveId) rednet.send(slaveId,{Task="UpdateOutputState",Data= {NewState= signalToSend,Fingerprint = conf.ItemDetail.Fingerprint}},Settings.SendProtocol); end end local function ProcessCommunication() local recievedTasks = Receive.GetReceivedData(); for i=1,#recievedTasks do local recievedTask = recievedTasks[i]; local message = recievedTask.Message; local sender = recievedTask.Sender; if message.Task == "SendingConfiguration" then SlaveConfiguration[sender] = message.Data; print("Recieved broadcasted configuration from "..sender); end end end local function ExecuteMasterData() Limits.RefreshLimits() print("Scanning for updates") for slaveId,confs in pairs(SlaveConfiguration) do for i=1,#confs do local conf = confs[i]; local conffingerprint = conf.ItemDetail.Fingerprint; local limit = Limits.GetLimitForItem(conffingerprint); if limit then local networkItemCount = 0; local details = AEnetwork.GetItemDetails(conffingerprint); if details then networkItemCount = details.qty; end SendToSlave(slaveId,conf,limit,networkItemCount); end end end end local function MainLoop() while true do ProcessCommunication() ExecuteMasterData() local timeout = 20+math.random(0,20); local timerId = os.startTimer(timeout); repeat local type,sender,data,protocol = os.pullEvent() until type == "timer" or (type == "rednet_message" and protocol == Settings.ReceiveProtocol) os.cancelTimer(timerId); end end --Configuration = JsonSaveLoad.Load(ConfigurationFile); print("Loading settings file: "..SettingsFile); Settings = JsonSaveLoad.Load(SettingsFile); AEnetwork = AEIntegration.InitalizeAEIntegration(Settings.AEPeripheral); rednet.open(Settings.ModemDirection); rednet.broadcast({Task = "RequestConfiguration"},Settings.SendProtocol); parallel.waitForAll(ReceiveLoop,MainLoop);