Hiranus icon

NetColorMaster

Hiranus | PRO | 06/17/19 11:42:16 AM UTC | 0 ⭐ | 403 👁️ | Never ⏰ | []
Lua |

2.76 KB

|

None

|

0 👍

/

0 👎

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

  •  icon
    01/01/70 12:00:00 AM UTC
    Plain Text |

    0 B

    |

    👍

    /

    👎