using System.Threading; using System.Threading.Tasks; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; using NucuCar.Sensors.Telemetry; using NucuCarSensorsProto; namespace NucuCar.Sensors.EnvironmentSensor { public class BackgroundWorker : BackgroundService { private readonly bool _serviceEnabled; private readonly bool _telemetryEnabled; private readonly int _measurementDelay; private readonly ILogger _logger; public BackgroundWorker(ILogger logger, IConfiguration config) { _logger = logger; var configSection = config.GetSection("EnvironmentSensor"); _serviceEnabled = configSection.GetValue("Enabled"); _telemetryEnabled = configSection.GetValue("Telemetry"); _measurementDelay = configSection.GetValue("MeasurementInterval"); } protected override async Task ExecuteAsync(CancellationToken stoppingToken) { if (!_serviceEnabled) { return; } using var sensor = Sensor.Instance; sensor.SetLogger(_logger); sensor.InitializeSensor(); if (_telemetryEnabled) { TelemetryPublisher.Instance.RegisterTelemeter(sensor); } while (!stoppingToken.IsCancellationRequested) { if (sensor.GetState() == SensorStateEnum.Initialized) { await sensor.TakeMeasurement(); } else { await Task.Delay(10000, stoppingToken); /* Attempt to reinitialize the sensor. */ sensor.InitializeSensor(); } await Task.Delay(_measurementDelay, stoppingToken); } TelemetryPublisher.Instance.UnRegisterTelemeter(sensor); } } }