NucuCar/NucuCar.Sensors/EnvironmentSensor/Bme680Worker.cs

69 lines
2.4 KiB
C#
Raw Normal View History

2019-11-09 13:34:49 +00:00
using System.Threading;
using System.Threading.Tasks;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;
using NucuCar.Domain.Telemetry;
2019-11-14 14:45:32 +00:00
using NucuCar.Sensors.Telemetry;
using NucuCarSensorsProto;
2019-11-09 13:34:49 +00:00
namespace NucuCar.Sensors.EnvironmentSensor
2019-11-09 13:34:49 +00:00
{
2019-11-24 13:12:12 +00:00
/// <summary>
/// EnvironmentSensor's background service worker.
/// It does periodic reads from the sensors and publishes telemetry data if the option is enabled.
/// </summary>
public class Bme680Worker : BackgroundService
2019-11-09 13:34:49 +00:00
{
2019-11-11 15:58:46 +00:00
private readonly bool _telemetryEnabled;
private readonly bool _serviceEnabled;
private readonly int _measurementInterval;
private readonly ILogger<Bme680Worker> _logger;
private readonly TelemetryPublisher _telemetryPublisher;
2019-11-30 15:44:54 +00:00
private readonly ISensor<Bme680Sensor> _bme680Sensor;
2019-11-09 13:34:49 +00:00
2019-11-09 14:54:06 +00:00
public Bme680Worker(ILogger<Bme680Worker> logger, IOptions<Bme680Config> options,
2019-11-30 15:44:54 +00:00
SensorTelemetry sensorTelemetry, ISensor<Bme680Sensor> sensor)
2019-11-09 13:34:49 +00:00
{
_logger = logger;
_telemetryEnabled = options.Value.TelemetryEnabled;
_serviceEnabled = options.Value.ServiceEnabled;
_measurementInterval = options.Value.MeasurementInterval;
_telemetryPublisher = sensorTelemetry.Publisher;
2019-11-30 15:44:54 +00:00
_bme680Sensor = sensor;
2019-11-09 13:34:49 +00:00
}
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
2019-11-30 16:55:55 +00:00
if (!_serviceEnabled)
{
return;
}
2019-11-14 14:45:32 +00:00
if (_telemetryEnabled)
{
2019-11-30 15:44:54 +00:00
_telemetryPublisher?.RegisterTelemeter(_bme680Sensor.Object);
2019-11-14 14:45:32 +00:00
}
2019-11-09 13:34:49 +00:00
while (!stoppingToken.IsCancellationRequested)
{
/* If sensor is ok attempt to read. */
2019-11-30 15:44:54 +00:00
if (_bme680Sensor.Object.GetState() == SensorStateEnum.Initialized)
2019-11-09 14:54:06 +00:00
{
_logger.LogInformation("Taking measurement!");
2019-11-30 15:44:54 +00:00
await _bme680Sensor.Object.TakeMeasurement();
2019-11-09 14:54:06 +00:00
}
/* Else attempt to re-initialize. */
2019-11-09 14:54:06 +00:00
else
{
await Task.Delay(10000, stoppingToken);
2019-11-30 15:44:54 +00:00
_bme680Sensor.Object.InitializeSensor();
2019-11-09 14:54:06 +00:00
}
await Task.Delay(_measurementInterval, stoppingToken);
2019-11-09 13:34:49 +00:00
}
2019-11-24 13:12:12 +00:00
2019-11-30 15:44:54 +00:00
_telemetryPublisher?.UnRegisterTelemeter(_bme680Sensor.Object);
2019-11-09 13:34:49 +00:00
}
}
}