Example #1
0
        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;
            }
        }
Example #2
0
        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
                    }
                }
            }
        }
Example #3
0
    private IEnumerator AfterStart()
    {
        yield return(null);

        playerProcess = DataHolder.GetCurrentPlayer().GetRacerStatus();
    }
Example #4
0
 public void              AddRacer(RacerStatus racer) => racers.Add(racer);
Example #5
0
        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);
            });
        }