Hiranus icon

NetColorSlave

Hiranus | PRO | 06/17/19 01:25:32 PM UTC | 0 ⭐ | 444 👁️ | Never ⏰ | []
Lua |

2.73 KB

|

None

|

0 👍

/

0 👎

os.loadAPI("ColorManagement");
os.loadAPI("JsonSaveLoad");
os.loadAPI("Receive");
 
 
local ConfigurationFile = "Configuration.json";
local SettingsFile = "Settings.json";
local Configuration = {};
local Settings = {};
local ColorManager = nil;
 
local function SendConfiguration(masterId)
  rednet.send(masterId,{Task = "SendingConfiguration",Data = Configuration},Settings.SendProtocol);
end
 
local function ReceiveLoop()
  Receive.ReceiveLoop(Settings.ReceiveProtocol);
end
 
local function FindMatchingConfigurations(fingerprint)
  local tmptab = {};
  for i=1,#Configuration do
    local configFingerprint = Configuration[i].ItemDetail.Fingerprint;
    if configFingerprint.id == fingerprint.id and configFingerprint.dmg == fingerprint.dmg and configFingerprint.nbt_hash == fingerprint.nbt_hash then
      tmptab[#tmptab + 1] = Configuration[i];
    end
  end
  return tmptab;
end
 
function ExecuteMasterData()
  while true do
    local recievedTasks = Receive.GetReceivedData();
    print("Processing requests");
    for i=1,#recievedTasks do
      local recievedTask = recievedTasks[i];
      local message = recievedTask.Message;
      local sender = recievedTask.Sender;
 
      if message.Task == "RequestConfiguration" then
        print("Sending configuration to "..sender);
        SendConfiguration(sender)
      elseif message.Task == "UpdateOutputState" then
        print("Updating output state");
        local mathcingConfigurations = FindMatchingConfigurations(message.Data.Fingerprint)
        for i=1,#mathcingConfigurations do
          local newState= message.Data.NewState;
          print("Recieved new state for color "..mathcingConfigurations[i].ColorId..": ".. tostring(newState));
          if mathcingConfigurations[i].InvertSignal then
            print("Inverting recieved signal, as requested by configuration");
            newState = not newState;
          end
          print("New state of color "..mathcingConfigurations[i].ColorId.." is ".. tostring(newState));
          if newState then
            ColorManager.AddColor(mathcingConfigurations[i].ColorId);
          else
            ColorManager.RemoveColor(mathcingConfigurations[i].ColorId);
          end
        end
      end
    end
    repeat
      local type,sender,data,protocol = os.pullEvent("rednet_message")
    until protocol == Settings.ReceiveProtocol
  end
end
 
 
Configuration = JsonSaveLoad.Load(ConfigurationFile);
Settings = JsonSaveLoad.Load(SettingsFile);
rednet.open(Settings.ModemDirection);
rednet.broadcast({Task = "SendingConfiguration",Data = Configuration},Settings.SendProtocol);
ColorManager = ColorManagement.InitalizeColors(Settings.BundledColorCable);
parallel.waitForAll(ReceiveLoop,ExecuteMasterData);

Comments

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

    0 B

    |

    👍

    /

    👎