Example #1
0
 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();
 }
Example #2
0
        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();
        }