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); }
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); }
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}"); } }