private async void ExecuteRequest(Request request, bool isDependency) { switch (request.Command) { case Request.Commands.GENERATE: PlanGenerator.GeneratePlan(this, request as PlanRequest); break; case Request.Commands.EXECUTE: PlanExecuter.ExecutePlan(this, request as PlanRequest); break; case Request.Commands.HEARTBEAT: Heartbeat.RespondToHeartbeat(this, request); break; case Request.Commands.PING: Ping.RespondToPing(this, request); break; case Request.Commands.DETECTFAILURE: FailureDetection.DetectFailure(this, request as DetectFailureRequest); break; case Request.Commands.DISCOVER: await Discovery.DiscoverAsync(this, request as DiscoveryRequest); break; case Request.Commands.POSITION: PositionResponse response = new PositionResponse(Id, request.SourceID, Response.ResponseCodes.OK, request.MessageIdentifer, Position); CommsModule.Send(request.SourceID, response); break; case Request.Commands.ADDITION: List <uint?> neighbours = CommsModule.Discover(); AdditionRequest addition = (request as AdditionRequest).DeepCopy(); List <ConstellationPlanField> fields = new List <ConstellationPlanField> { new ConstellationPlanField("DeltaV", 0, (x, y) => x.CompareTo(y)) }; addition.plan.Entries.Add(new ConstellationPlanEntry(Id, Position, fields, (x, y) => 1)); ActivePlan = addition.plan; Router.UpdateNetworkMap(addition.plan); NodeAdditionResponse additionResponse = new NodeAdditionResponse(Id, request.SourceID, Response.ResponseCodes.OK, request.MessageIdentifer, Position, neighbours); CommsModule.Send(request.SourceID, additionResponse); break; case Request.Commands.UPDATENETWORKMAP: NetworkUpdateRequest updateRequest = request as NetworkUpdateRequest; //Remove any dead nodes from the networkmap Router.NetworkMap.Entries.RemoveAll(entry => updateRequest.DeadNodes.Contains(entry.ID)); //Remove any dead nodes from neighbour lists foreach (NetworkMapEntry entry in Router.NetworkMap.Entries) { foreach (uint?deadNode in updateRequest.DeadNodes) { entry.Neighbours.Remove(deadNode); } } break; default: throw new NotImplementedException(request.Command.ToString() + " was not implemented."); } }