public AccDataAggregator(string password = "******", int port = 9000, TimeSpan?updateInterval = null, string host = "localhost") { _accDataConnection = new AccDataConnection(host, port, password, updateInterval); _accDataConnection.ConnectionLost += (_, args) => Reconnect(); _accDataConnection.ConnectionEstablished += (_, __) => Connected(); }
static void Main() { Logger.CurrentLevel = DefaultLogLevel; _accClient = new AccDataAggregator(host: "office-pc"); _connection = _accClient.Start(); _sessionManager = new SessionManager(); _sessionManager.TimedPhaseStarted += (sender, args) => { }; _sessionManager.SessionStarted += (sender, args) => { _connection.Send(new TrackDataRequest()); }; _connection.MessageReceived += (sender, message) => { if (message is RealTimeUpdateResponse realtimeUpdate) { _sessionManager.UpdateSessionBasics(realtimeUpdate.SessionType, realtimeUpdate.Phase); _sessionManager.UpdateSessionDetails(realtimeUpdate); } if (message is RealTimeCarUpdateResponse realtimeCarUpdate) { _sessionManager.UpdateCarDetails( realtimeCarUpdate.CarIndex, realtimeCarUpdate.Position, realtimeCarUpdate.CarLocation, realtimeCarUpdate.Laps, realtimeCarUpdate.CurrentLap, realtimeCarUpdate.LastLap, realtimeCarUpdate.Delta ); } if (message is TrackDataResponse trackResponse) { _sessionManager.SetTrack(trackResponse.TrackName); // Invert this so the SessionManager indicates it is ready for the entry list _connection.Send(new EntryListRequest()); } if (message is EntryListCarResponse carResponse) { _sessionManager.SetCar( carResponse.CarId, carResponse.CarModel, ( carResponse.Drivers.First().FirstName, carResponse.Drivers.First().LastName ) ); } if (message is BroadcastingEventResponse broadcastingEvent) { if (broadcastingEvent.MessageType == BroadcastingEventType.LapCompleted) { //TODO: Ask session manager to update car //_sessionManager.SendDetails(); } } if (message is EntryListResponse entryListResponse) { _sessionManager.VerifyCarList(entryListResponse.CarIndices.Select(Convert.ToInt32).ToArray()); } }; _connection.ConnectionLost += (sender, args) => { _sessionManager.AbandonSession(); Logger.Log("Session abandoned"); }; // Entry list is polled to check for disconnections var entryListUpdateTimer = new System.Timers.Timer(5000); entryListUpdateTimer.Elapsed += (args, sender) => { if (_connection.Connected) { _connection.Send(new EntryListRequest()); } }; entryListUpdateTimer.Start(); while (true) { var key = Console.ReadKey().Key; if (key == ConsoleKey.Q) { break; } if (key == ConsoleKey.Delete) { Console.Clear(); } if (key == ConsoleKey.C) { foreach (var carDetails in _sessionManager.GetAllCars().OrderBy(c => c.Disconnected).ThenBy(c => c.Position)) { var position = carDetails.Disconnected ? "DIS" : carDetails.Position.Value.ToString(); Logger.Log($"{position}. [{carDetails.Location.GetDescription()}] {carDetails.CarModel.GetDescription()} {carDetails.CurrentDriver} {carDetails.LapCount} Laps {carDetails.Delta}"); } } if (key == ConsoleKey.T) { _connection.Send(new TrackDataRequest()); } if (key == ConsoleKey.E) { _connection.Send(new EntryListRequest()); } if (key == ConsoleKey.V) { Logger.CurrentLevel = Logger.CurrentLevel == DefaultLogLevel ? LogLevel.Verbose : DefaultLogLevel; } } _connection.Stop(); }