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);
Comments
0 B
|👍
/👎