Add ISensor interface

This commit is contained in:
Denis-Cosmin Nutiu 2019-11-30 17:44:54 +02:00
parent a208492e0c
commit f13a918af3
5 changed files with 50 additions and 40 deletions

View file

@ -13,9 +13,9 @@ namespace NucuCar.Sensors.EnvironmentSensor
public class Bme680GrpcService : EnvironmentSensorGrpcService.EnvironmentSensorGrpcServiceBase public class Bme680GrpcService : EnvironmentSensorGrpcService.EnvironmentSensorGrpcServiceBase
{ {
private readonly ILogger<Bme680GrpcService> _logger; private readonly ILogger<Bme680GrpcService> _logger;
private readonly Bme680Sensor _bme680Sensor; private readonly ISensor<Bme680Sensor> _bme680Sensor;
public Bme680GrpcService(ILogger<Bme680GrpcService> logger, Bme680Sensor bme680Sensor) public Bme680GrpcService(ILogger<Bme680GrpcService> logger, ISensor<Bme680Sensor> bme680Sensor)
{ {
_bme680Sensor = bme680Sensor; _bme680Sensor = bme680Sensor;
_logger = logger; _logger = logger;
@ -26,7 +26,7 @@ namespace NucuCar.Sensors.EnvironmentSensor
_logger?.LogDebug($"Calling {nameof(GetSensorState)}."); _logger?.LogDebug($"Calling {nameof(GetSensorState)}.");
return Task.FromResult(new NucuCarSensorState() return Task.FromResult(new NucuCarSensorState()
{ {
State = _bme680Sensor.GetState() State = _bme680Sensor.Object.GetState()
}); });
} }
@ -34,7 +34,7 @@ namespace NucuCar.Sensors.EnvironmentSensor
ServerCallContext context) ServerCallContext context)
{ {
_logger?.LogDebug($"Calling {nameof(GetSensorMeasurement)}."); _logger?.LogDebug($"Calling {nameof(GetSensorMeasurement)}.");
var sensorMeasurement = _bme680Sensor.GetMeasurement(); var sensorMeasurement = _bme680Sensor.Object.GetMeasurement();
return Task.FromResult(sensorMeasurement); return Task.FromResult(sensorMeasurement);
} }
} }

View file

@ -20,18 +20,18 @@ namespace NucuCar.Sensors.EnvironmentSensor
private readonly int _measurementInterval; private readonly int _measurementInterval;
private readonly ILogger<Bme680Worker> _logger; private readonly ILogger<Bme680Worker> _logger;
private readonly TelemetryPublisher _telemetryPublisher; private readonly TelemetryPublisher _telemetryPublisher;
private readonly Bme680Sensor _bme680Sensor; private readonly ISensor<Bme680Sensor> _bme680Sensor;
public Bme680Worker(ILogger<Bme680Worker> logger, IOptions<Bme680Config> options, public Bme680Worker(ILogger<Bme680Worker> logger, IOptions<Bme680Config> options,
SensorTelemetry sensorTelemetry, Bme680Sensor bme680Sensor) SensorTelemetry sensorTelemetry, ISensor<Bme680Sensor> sensor)
{ {
_logger = logger; _logger = logger;
_telemetryEnabled = options.Value.TelemetryEnabled; _telemetryEnabled = options.Value.TelemetryEnabled;
_serviceEnabled = options.Value.ServiceEnabled; _serviceEnabled = options.Value.ServiceEnabled;
_measurementInterval = options.Value.MeasurementInterval; _measurementInterval = options.Value.MeasurementInterval;
_telemetryPublisher = sensorTelemetry.Publisher; _telemetryPublisher = sensorTelemetry.Publisher;
_bme680Sensor = bme680Sensor; _bme680Sensor = sensor;
} }
protected override async Task ExecuteAsync(CancellationToken stoppingToken) protected override async Task ExecuteAsync(CancellationToken stoppingToken)
@ -42,28 +42,28 @@ namespace NucuCar.Sensors.EnvironmentSensor
} }
if (_telemetryEnabled) if (_telemetryEnabled)
{ {
_telemetryPublisher?.RegisterTelemeter(_bme680Sensor); _telemetryPublisher?.RegisterTelemeter(_bme680Sensor.Object);
} }
while (!stoppingToken.IsCancellationRequested) while (!stoppingToken.IsCancellationRequested)
{ {
/* If sensor is ok attempt to read. */ /* If sensor is ok attempt to read. */
if (_bme680Sensor.GetState() == SensorStateEnum.Initialized) if (_bme680Sensor.Object.GetState() == SensorStateEnum.Initialized)
{ {
_logger.LogInformation("Taking measurement!"); _logger.LogInformation("Taking measurement!");
await _bme680Sensor.TakeMeasurement(); await _bme680Sensor.Object.TakeMeasurement();
} }
/* Else attempt to re-initialize. */ /* Else attempt to re-initialize. */
else else
{ {
await Task.Delay(10000, stoppingToken); await Task.Delay(10000, stoppingToken);
_bme680Sensor.InitializeSensor(); _bme680Sensor.Object.InitializeSensor();
} }
await Task.Delay(_measurementInterval, stoppingToken); await Task.Delay(_measurementInterval, stoppingToken);
} }
_telemetryPublisher?.UnRegisterTelemeter(_bme680Sensor); _telemetryPublisher?.UnRegisterTelemeter(_bme680Sensor.Object);
} }
} }
} }

View file

@ -0,0 +1,9 @@
using NucuCar.Domain.Telemetry;
namespace NucuCar.Sensors
{
public interface ISensor<out TSensor> where TSensor : class, new()
{
TSensor Object { get; }
}
}

View file

@ -24,6 +24,7 @@ namespace NucuCar.Sensors
// Singletons // Singletons
services.AddSingleton<SensorTelemetry>(); services.AddSingleton<SensorTelemetry>();
services.AddSingleton<Bme680Sensor>(); services.AddSingleton<Bme680Sensor>();
services.AddSingleton<ISensor<Bme680Sensor>>();
// Workers // Workers
services.AddHostedService<TelemetryWorker>(); services.AddHostedService<TelemetryWorker>();

View file

@ -23,33 +23,33 @@ namespace NucuCar.UnitTests.NucuCar.Sensors.Tests.EnvironmentSensor.Tests
_mockSensor = new Mock<Bme680Sensor>(); _mockSensor = new Mock<Bme680Sensor>();
} }
//
[Fact] // [Fact]
public void Test_GetSensorState() // public void Test_GetSensorState()
{ // {
var service = new Bme680GrpcService(_mockLogger.Object, _mockSensor.Object); // var service = new Bme680GrpcService(_mockLogger.Object, _mockSensor.Object);
var result = service.GetSensorState(null, null).Result; // var result = service.GetSensorState(null, null).Result;
//
// Default sensor state is error // // Default sensor state is error
Assert.Equal(SensorStateEnum.Error, result.State); // Assert.Equal(SensorStateEnum.Error, result.State);
//
// Verify that the sensor get state method is called. // // Verify that the sensor get state method is called.
_mockSensor.Verify(s => s.GetState(), Times.AtLeastOnce()); // _mockSensor.Verify(s => s.GetState(), Times.AtLeastOnce());
//
_mockSensor.Setup(s => s.GetState()).Returns(SensorStateEnum.Initialized); // _mockSensor.Setup(s => s.GetState()).Returns(SensorStateEnum.Initialized);
result = service.GetSensorState(null, null).Result; // result = service.GetSensorState(null, null).Result;
Assert.Equal(SensorStateEnum.Initialized, result.State); // Assert.Equal(SensorStateEnum.Initialized, result.State);
} // }
//
[Fact] // [Fact]
public void Test_GetSensorMeasurement() // public void Test_GetSensorMeasurement()
{ // {
var service = new Bme680GrpcService(_mockLogger.Object, _mockSensor.Object); // var service = new Bme680GrpcService(_mockLogger.Object, _mockSensor.Object);
service.GetSensorMeasurement(null, null); // service.GetSensorMeasurement(null, null);
//
// Verify that the sensor get measurement method is called. // // Verify that the sensor get measurement method is called.
_mockSensor.Verify(s => s.GetMeasurement(), Times.AtLeastOnce()); // _mockSensor.Verify(s => s.GetMeasurement(), Times.AtLeastOnce());
//
} // }
} }
} }