private void OnTelemetryInfoChanged(TelemetryInfoChangedEventArgs e) => TelemetryInfoChanged?.Invoke(this, e);
private void Loop(CancellationToken cancellationToken) { int lastUpdate = -1; bool hasConnected = false; while (!cancellationToken.IsCancellationRequested) { // Check if we can find the sim if (sdk.IsConnected()) { if (!IsConnected) { // If this is the first time, raise the Connected event RaiseEvent(OnStarted, EventArgs.Empty); connectionSource.TrySetResult(); } hasConnected = true; IsConnected = true; readMutex.WaitOne(8); // Update telemetry info TelemetryData = new TelemetryData(sdk); // Update session info int newUpdate = sdk.Header.SessionInfoUpdate; if (newUpdate != lastUpdate) { RawSessionData = sdk.GetSessionInfo(); SessionData = deserializer.Deserialize <SessionData>(RawSessionData); var args = new SessionInfoChangedEventArgs(SessionData, (double)sdk.GetData("SessionTime")); RaiseEvent(OnSessionInfoChanged, args); if (lastUpdate == -1) { firstDataSource.TrySetResult(); } lastUpdate = newUpdate; } // Send telemetry event now to make sure both data is updated when either event is thrown var telArgs = new TelemetryInfoChangedEventArgs(TelemetryData, (double)sdk.GetData("SessionTime")); RaiseEvent(OnTelemetryInfoChanged, telArgs); } else if (hasConnected) { // We have already been initialized before, so the sim is closing RaiseEvent(OnStopped, EventArgs.Empty); SessionData = null; TelemetryData = null; sdk.Shutdown(); lastUpdate = -1; IsConnected = false; hasConnected = false; } else { // Have not been initialized before and there is no connection. Try to find the sim. IsConnected = false; hasConnected = false; sdk.Startup(); } // Sleep for a short amount of time until the next update is available if (IsConnected) { if (waitTime <= 0 || waitTime > 1000) { waitTime = 15; } Thread.Sleep(waitTime); } else { // Not connected yet, no need to check every 16 ms, let's try again in some time Thread.Sleep(ConnectSleepTime); } } sdk.Shutdown(); IsConnected = false; }