Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- 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);
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement