diff --git a/Unity/Thing.cs b/Unity/Thing.cs index ebacc63..c1597ab 100644 --- a/Unity/Thing.cs +++ b/Unity/Thing.cs @@ -128,7 +128,7 @@ namespace RoboidControl.Unity { this.gameObject.name = core.name; break; case ModelUrlMsg.Id: - Debug.Log("{this.id} Handle Model URL"); + Debug.Log($"{this.core.id} Handle Model URL"); string extension = core.modelUrl[core.modelUrl.LastIndexOf(".")..]; if (extension == ".jpg" || extension == ".png") StartCoroutine(LoadJPG()); diff --git a/src/Participant.cs b/src/Participant.cs index b1071b3..079c70c 100644 --- a/src/Participant.cs +++ b/src/Participant.cs @@ -244,6 +244,7 @@ namespace RoboidControl { /// The added participant public static Participant AddParticipant(string ipAddress, int port, Participant localParticipant = null) { Console.WriteLine($"New Participant {ipAddress}:{port}"); + // This code is only valid for site, because those can distribute networkIds..... Participant participant = new(ipAddress, port, localParticipant) { networkId = (byte)(Participant.participants.Count + 1) }; diff --git a/src/Participants/ParticipantUDP.cs b/src/Participants/ParticipantUDP.cs index 40b81b5..5640756 100644 --- a/src/Participants/ParticipantUDP.cs +++ b/src/Participants/ParticipantUDP.cs @@ -97,7 +97,7 @@ namespace RoboidControl { /// /// Isolated participants do not communicate with other participants public bool isIsolated = false; - + /// /// The remote site when this participant is connected to a site /// @@ -379,6 +379,16 @@ namespace RoboidControl { this.networkId = msg.networkId; foreach (Thing thing in this.things) //Thing.GetAllThings()) sender.SendThingInfo(thing); + + // HACK to get the networkId for sites corrected to 0. + // This is needed because AddParticipant assigns a networkId for non-sites + sender.networkId = 0; + UpdateEvent e = new() { + messageId = NetworkIdMsg.Id, + participant = sender + }; + this.updateQueue.Enqueue(e); + } } @@ -392,6 +402,29 @@ namespace RoboidControl { #if DEBUG Console.WriteLine($"{this.name}: Process ThingMsg [{msg.networkId}/{msg.thingId}] {msg.thingType} {msg.parentId}"); #endif + Thing thing = sender.Get(msg.thingId); + thing ??= ProcessNewThing(sender, msg); + + if (msg.parentId != 0) { + thing.parent = sender.Get(msg.parentId); + if (thing.parent == null) + Console.WriteLine($"Could not find parent [{msg.networkId}/{msg.parentId}]"); + } + else { + // Console.Write($"Dropped {thing.id}"); + thing.parent = null; + } + } + + protected virtual Thing ProcessNewThing(Participant sender, ThingMsg msg) { + Thing newThing = msg.thingType switch { + Thing.Type.TouchSensor => new TouchSensor(sender.root), + Thing.Type.DifferentialDrive => new DifferentialDrive(sender.root), + _ => new Thing(sender.root) + }; + newThing.id = msg.thingId; + newThing.type = msg.thingType; + return newThing; } protected virtual void Process(Participant sender, NameMsg msg) { diff --git a/src/Participants/SiteServer.cs b/src/Participants/SiteServer.cs index 2fc6e2a..71922cf 100644 --- a/src/Participants/SiteServer.cs +++ b/src/Participants/SiteServer.cs @@ -76,16 +76,11 @@ namespace RoboidControl { if (this.isIsolated == false) { // Send to all other participants - //foreach (Participant participant in Participant.participants) { for (int participantIx = 0; participantIx < Participant.participants.Count; participantIx++) { Participant participant = Participant.participants[participantIx]; if (participant == null || participant == this) continue; - // PoseMsg poseMsg = new(thing.owner.networkId, thing); - // this.Send(participant, poseMsg); - // BinaryMsg binaryMsg = new(thing.owner.networkId, thing); - // this.Send(participant, binaryMsg); participant.Send(new PoseMsg(thing.owner.networkId, thing)); participant.Send(new BinaryMsg(thing.owner.networkId, thing)); } @@ -101,7 +96,6 @@ namespace RoboidControl { base.Process(sender, msg); if (msg.networkId != sender.networkId) { //Console.WriteLine($"{this.name} received New Participant -> {sender.networkId}"); - // this.Send(sender, new NetworkIdMsg(sender.networkId)); sender.Send(new NetworkIdMsg(sender.networkId)); UpdateEvent e = new() { messageId = ParticipantMsg.Id, @@ -113,34 +107,6 @@ namespace RoboidControl { protected override void Process(Participant sender, NetworkIdMsg msg) { } - protected override void Process(Participant sender, ThingMsg msg) { - Console.WriteLine($"{this.name}: Process thing [{msg.networkId}/{msg.thingId}] {msg.thingType} {msg.parentId} "); - - Thing thing = sender.Get(msg.thingId); - thing ??= ProcessNewThing(sender, msg); - - if (msg.parentId != 0) { - thing.parent = sender.Get(msg.parentId); - if (thing.parent == null) - Console.WriteLine($"Could not find parent [{msg.networkId}/{msg.parentId}]"); - } - else { - // Console.Write($"Dropped {thing.id}"); - thing.parent = null; - } - } - - protected virtual Thing ProcessNewThing(Participant sender, ThingMsg msg) { - Thing newThing = msg.thingType switch { - Thing.Type.TouchSensor => new TouchSensor(sender.root), - Thing.Type.DifferentialDrive => new DifferentialDrive(sender.root), - _ => new Thing(sender.root) - }; - newThing.id = msg.thingId; - newThing.type = msg.thingType; - return newThing; - } - #endregion Receive }