public void SendData() { // Create socket udpClient = new UdpClient(); int lastTime = messagesToSend[0].Timestamp; for (int index = 0; index < messagesToSend.Count; index++) { RacerStatus msg = messagesToSend[index]; int deltaTime = Math.Max(0, msg.Timestamp - lastTime) / 300; // Console.WriteLine("Sleep {0} ms and then send msg: Bib #={1}, Sensor Id={2}, Time={3}", deltaTime, msg.RacerBibNumber, msg.SensorId, msg.Timestamp); Thread.Sleep(Convert.ToInt32(deltaTime)); byte[] messageByte = msg.Encode(); udpClient.Send(messageByte, messageByte.Length, ServerEndPoint); lastTime = msg.Timestamp; } }
static void ReceiveData() { while (true) // This is not a good loop termination condiation, but this is Dummy Server! { IPEndPoint ep = new IPEndPoint(IPAddress.Any, 0); byte[] messageByes = updClient.Receive(ref ep); if (messageByes != null) { RacerStatus statusMessage = RacerStatus.Decode(messageByes); if (statusMessage != null) { Console.WriteLine("Race Bib #={0}, Sensor={1}, Time={2}", statusMessage.RacerBibNumber, statusMessage.SensorId, statusMessage.Timestamp); // A non-dummy server would do something intelligent with the message, // like lookup the racer and update the last sensor and time } } } }
private IEnumerator AfterStart() { yield return(null); playerProcess = DataHolder.GetCurrentPlayer().GetRacerStatus(); }
public void AddRacer(RacerStatus racer) => racers.Add(racer);
public void Setup() { // Note: This method has poor cohesion. Without changing functionality, we will refactor this method in class to improve cohesion SetupDefaults(); SetupSensors(); CreateRaceGroups(); // Setup race groups foreach (RaceGroup group in groups) { group.Setup(); } // Setup a 1 cheater in each group for (int raceGroupA = 0; raceGroupA < groups.Count - 1; raceGroupA++) { int raceGroupB = raceGroupA + 1; int cheaterIndex1 = RandomChooser.ChooseInt(0, groups[raceGroupA].Count); Racer cheater1 = groups[raceGroupA][cheaterIndex1]; int cheaterIndex2 = RandomChooser.ChooseInt(0, groups[raceGroupB].Count); Racer cheater2 = groups[raceGroupB][cheaterIndex2]; cheater1.WillTryToCheatWith = cheater2; cheater2.WillTryToCheatWith = cheater1; } // Compute race times messagesToSend = new List <RacerStatus>(); double previousMilageMarker = 0; for (int sensorIndex = 0; sensorIndex < sensors.Count; sensorIndex++) { Sensor sensor = sensors[sensorIndex]; double deltaMilage = sensor.MileMarker - previousMilageMarker; foreach (RaceGroup group in groups) { for (int i = 0; i < group.Count; i++) { Racer racer = group[i]; if (racer.Time == 0) { racer.Time = group.StartTime; } double speed = racer.RelativeSpeed + group.AverageSpeed; racer.Time += Convert.ToInt32(60 * 60 * 1000 * deltaMilage / speed); } } // Converge cheaters foreach (RaceGroup group in groups) { foreach (Racer racer in group) { if (racer.WillTryToCheatWith != null) { int averageTime = (racer.Time + racer.WillTryToCheatWith.Time) / 2; int delta = averageTime - racer.Time; racer.Time += delta / 2; } } } // Create race status object foreach (RaceGroup group in groups) { foreach (Racer racer in group) { RacerStatus status = new RacerStatus() { SensorId = sensor.Id, RacerBibNumber = racer.RaceBibNumber, Timestamp = racer.Time }; sensor.RacerTimes.Add(status); messagesToSend.Add(status); } } previousMilageMarker = sensor.MileMarker; } messagesToSend.Sort(delegate(RacerStatus x, RacerStatus y) { if (x.Timestamp < y.Timestamp) { return(-1); } else if (x.Timestamp > y.Timestamp) { return(1); } return(0); }); }