Exemplo n.º 1
0
        public async Task SendStatus(Models.Track trackInstance)
        {
            if (!_isConnected)
            {
                return;
            }

            var json = JsonConvert.SerializeObject(trackInstance, Formatting.None);

            // Send the json string to the clients
            await _hubConnection.InvokeAsync("status", json);
        }
Exemplo n.º 2
0
        private void HandleJson(string json)
        {
            // If you are debugging and want to see every message in the console... :)
            //Console.Clear();
            //Console.WriteLine("Remember; close this window by pressing any key ...\n");
            //var formattedJson = JValue.Parse(json).ToString(Formatting.Indented);
            //Console.WriteLine(formattedJson);

            var trackState = JsonConvert.DeserializeObject <Json.TrackState>(json);

            if (_track == null)
            {
                _track = new Models.Track();
            }

            // Map the new track state. We can always map and override the current object, it won't clean the vehicle collection :)
            _mapper.MapTrack(_track, trackState);
            //if (_track == null)
            //{
            //    _track = _mapper.Map<Models.Track>(trackState);
            //}

            // Then handle all the vehicle states
            foreach (var vehicle in trackState.vehicles)
            {
                HandleNextVehicleState(_track, vehicle);

                // ######################
                // Experimental DB stuff
                // ######################

                //var foundDriver = await _driverRepository.GetByName(jsonVehicle.driverName);
                //if (foundDriver != null)
                //{
                //    // Do not add the driver, it already exists
                //    continue;
                //}

                //await _driverRepository.Create(new Driver
                //{
                //    Name = jsonVehicle.driverName
                //});

                // ######################
            }

            _hub.SendStatus(_track);
        }
Exemplo n.º 3
0
        public void HandleNextVehicleState(Models.Track track, Json.VehicleState jsonVehicle)
        {
            var vehicle = track.Vehicles.FirstOrDefault(v => v.Id == jsonVehicle.id);

            if (vehicle == null)
            {
                Console.WriteLine($"{jsonVehicle.driverName} joined the server");
                vehicle = new Models.Vehicle();
                _mapper.MapVehicle(vehicle, jsonVehicle);
                track.Vehicles.Add(vehicle);
            }
            else
            {
                // Update vehicle
                vehicle.PreviousPosition = vehicle.Position;
                vehicle.PreviousSector   = vehicle.Sector;
                vehicle.PreviousStatus   = vehicle.Status;
                vehicle.PreviousVelocity = vehicle.Velocity;
                _mapper.MapVehicle(vehicle, jsonVehicle);
            }

            // Get the current lap
            var lapNumber = jsonVehicle.totalLaps + 1;

            if (!vehicle.Laps.Exists(l => l.Number == lapNumber))
            {
                Console.WriteLine($"{vehicle.DriverName}: started new lap");
                vehicle.Laps.Add(new Models.Lap {
                    Number = lapNumber
                });
            }
            var currentLap = vehicle.Laps.FirstOrDefault(l => l.Number == lapNumber);

            // Update current lap time and path
            currentLap.Time = jsonVehicle.last;
            if (!currentLap.Path.ContainsKey((int)jsonVehicle.lapDist) && currentLap.Time != null)
            {
                // Add the vehicle position to it's path
                currentLap.Path.Add((int)jsonVehicle.lapDist, jsonVehicle.Pos);
            }

            // Calculate the top speed
            vehicle.TopVelocity = vehicle.Velocity > vehicle.TopVelocity ? vehicle.Velocity : vehicle.TopVelocity;

            // Watch the sectors and determine where the vehicle is
            if (vehicle.PreviousSector == Models.Sector.Sector3 &&
                vehicle.Sector == Models.Sector.Sector1 &&
                vehicle.NewLap == false)
            {
                if (jsonVehicle.inPits == 1 && vehicle.Status != Models.Status.Pit)
                {
                    Console.WriteLine($"{vehicle.DriverName}: entered the pits");
                    vehicle.Status = Models.Status.Pit;
                }
                else
                {
                    vehicle.NewLap = true;
                    Console.WriteLine($"{vehicle.DriverName}: crossed start/finish");

                    // Finish the current lap
                    Console.WriteLine($"{vehicle.DriverName}: Lap {currentLap.Number}: {currentLap.TimeString}");

                    // Create a new lap
                    vehicle.Laps.Add(new Models.Lap {
                        Number = lapNumber
                    });
                }
            }
            else if (vehicle.PreviousSector == Models.Sector.Sector1 &&
                     vehicle.Sector == Models.Sector.Sector2 &&
                     vehicle.NewLap == true)
            {
                vehicle.NewLap = false;
                Console.WriteLine($"{vehicle.DriverName}: sector 1: {currentLap.Sector1}");
            }
            else if (vehicle.PreviousSector == Models.Sector.Sector2 &&
                     vehicle.Sector == Models.Sector.Sector3 &&
                     vehicle.NewLap == false)
            {
                Console.WriteLine($"{vehicle.DriverName}: sector 2: {currentLap.Sector2}");
            }
        }