/// <summary> /// generate data packet from this vechile to the TargetVehicle. /// </summary> /// <param name="DestinationVehicle"></param> public void GeneratePacket(VehicleUi DestinationVehicle) { Dispatcher.Invoke((Action) delegate { Packet packet = new Packet(); packet.Type = PacketType.Data; PublicStatistics.GeneratedPacketsCount += 1; packet.PID = PublicStatistics.GeneratedPacketsCount; packet.PacketLength = PublicParamerters.DataPacketLength; packet.TravelledRoadSegmentString += CurrentLane.MyRoadSegment.RID; // add the first rs. packet.VehiclesString += VID; // start by current sender. packet.SRID = CurrentLane.MyRoadSegment.RID; // set source and distination: packet.SourceVehicle = this; packet.DestinationVehicle = DestinationVehicle; packet.Direction = DestinationVehicle.CurrentLane.LaneDirection; packet.CurrentRoadSegment = CurrentLane.MyRoadSegment; // the segment of the vechile. packet.EuclideanDistance = Computations.Distance(InstanceLocation, DestinationVehicle.InstanceLocation); // the intial distance packet.RoutingDistance = packet.EuclideanDistance; packet.SVID = VID; packet.DVID = DestinationVehicle.VID; this.SetNotationSign(NotationsSign.HasPacket); DestinationVehicle.SetNotationSign(NotationsSign.Destination); DestinationVehicle.WaitingPacketsIDsList.Add(packet.PID); // flage // start count the delay. PacketQueue.Enqueue(packet); // add the packet to the queue. PacketQueueTimer.Interval = TimeSpan.FromSeconds(PublicParamerters.PacketQueueTimerInterval); // retry after... PacketQueueTimer.Start(); // start the timer. }); }
/// <summary> /// forward the packet to the NEXT /// </summary> /// <param name="packet"></param> /// <param name="next"></param> public void RelayPacket(Packet packet, VehicleUi next) { Dispatcher.Invoke((Action) delegate { packet.PathWaitingTimes += packet.HopWaitingTimes; // save the path waiting time and clear the hop. packet.HopWaitingTimes = 0; // re-intilize the hop-waiting. packet.PropagationAndTransmissionDelay += DelayModel.Delay(this, next); packet.HopsVehicles += 1; packet.RoutingDistance += Computations.Distance(InstanceLocation, next.InstanceLocation); packet.VehiclesString += "-" + next.VID; next.RecievePacket(packet); PacketQueueTimer.Interval = TimeSpan.FromSeconds(PublicParamerters.PacketQueueTimerInterval); // retry after... next.SetNotationSign(NotationsSign.HasPacket); SetNotationSign(NotationsSign.HasNoPacket); }); }