NUC-32: Improve Pms5003 sensor implementation & register
This commit is contained in:
parent
7bf36ed53a
commit
62064f33b7
9 changed files with 62 additions and 11 deletions
|
@ -9,7 +9,6 @@ enum SensorStateEnum {
|
||||||
Uninitialized = 1;
|
Uninitialized = 1;
|
||||||
Initialized = 2;
|
Initialized = 2;
|
||||||
Disabled = 3;
|
Disabled = 3;
|
||||||
GrpcDisabled = 4;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Environment Sensor
|
// Environment Sensor
|
||||||
|
@ -22,6 +21,11 @@ service HealthSensorGrpcService {
|
||||||
rpc GetCpuTemperature(google.protobuf.Empty) returns (NucuCarSensorResponse) {}
|
rpc GetCpuTemperature(google.protobuf.Empty) returns (NucuCarSensorResponse) {}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Pms5003 Sensor
|
||||||
|
service Pms5003SensorGrpcService {
|
||||||
|
rpc GetMeasurement(google.protobuf.Empty) returns (NucuCarSensorResponse) {}
|
||||||
|
}
|
||||||
|
|
||||||
// Responses
|
// Responses
|
||||||
message NucuCarSensorResponse {
|
message NucuCarSensorResponse {
|
||||||
SensorStateEnum State = 1;
|
SensorStateEnum State = 1;
|
||||||
|
|
|
@ -5,6 +5,7 @@ using Microsoft.Extensions.DependencyInjection;
|
||||||
using Microsoft.Extensions.Hosting;
|
using Microsoft.Extensions.Hosting;
|
||||||
using NucuCar.Sensors.Modules.Environment;
|
using NucuCar.Sensors.Modules.Environment;
|
||||||
using NucuCar.Sensors.Modules.Health;
|
using NucuCar.Sensors.Modules.Health;
|
||||||
|
using NucuCar.Sensors.Modules.PMS5003;
|
||||||
|
|
||||||
namespace NucuCar.Sensors.Grpc
|
namespace NucuCar.Sensors.Grpc
|
||||||
{
|
{
|
||||||
|
@ -32,6 +33,7 @@ namespace NucuCar.Sensors.Grpc
|
||||||
// Add the gRPC services here.
|
// Add the gRPC services here.
|
||||||
endpoints.MapGrpcService<Bme680GrpcService>();
|
endpoints.MapGrpcService<Bme680GrpcService>();
|
||||||
endpoints.MapGrpcService<CpuTempGrpcService>();
|
endpoints.MapGrpcService<CpuTempGrpcService>();
|
||||||
|
endpoints.MapGrpcService<Pms5003GrpcService>();
|
||||||
|
|
||||||
endpoints.MapGet("/",
|
endpoints.MapGet("/",
|
||||||
async context =>
|
async context =>
|
||||||
|
|
|
@ -6,7 +6,7 @@ namespace NucuCar.Sensors.Grpc
|
||||||
{
|
{
|
||||||
public static NucuCarSensorResponse GrpcIsDisabledResponse = new NucuCarSensorResponse()
|
public static NucuCarSensorResponse GrpcIsDisabledResponse = new NucuCarSensorResponse()
|
||||||
{
|
{
|
||||||
State = SensorStateEnum.GrpcDisabled,
|
State = SensorStateEnum.Disabled,
|
||||||
JsonData = "{}"
|
JsonData = "{}"
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,6 +2,6 @@
|
||||||
{
|
{
|
||||||
public class HeartbeatConfig : BaseSensorConfig
|
public class HeartbeatConfig : BaseSensorConfig
|
||||||
{
|
{
|
||||||
public bool Grpc { get; } = false;
|
public new bool Grpc { get; } = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -1,7 +1,36 @@
|
||||||
namespace NucuCar.Sensors.Modules.PMS5003
|
using System.Threading.Tasks;
|
||||||
{
|
using Google.Protobuf.WellKnownTypes;
|
||||||
public class Pms5003GrpcService
|
using Grpc.Core;
|
||||||
{
|
using Microsoft.Extensions.Logging;
|
||||||
|
using Microsoft.Extensions.Options;
|
||||||
|
using NucuCar.Sensors.Abstractions;
|
||||||
|
using NucuCar.Sensors.Grpc;
|
||||||
|
using NucuCarSensorsProto;
|
||||||
|
|
||||||
|
namespace NucuCar.Sensors.Modules.PMS5003
|
||||||
|
{
|
||||||
|
public class Pms5003GrpcService : Pms5003SensorGrpcService.Pms5003SensorGrpcServiceBase
|
||||||
|
{
|
||||||
|
private readonly ILogger<Pms5003GrpcService> _logger;
|
||||||
|
private readonly IOptions<Pms5003Config> _options;
|
||||||
|
private readonly ISensor<Pms5003Sensor> _pms5003Sensor;
|
||||||
|
|
||||||
|
public Pms5003GrpcService(ILogger<Pms5003GrpcService> logger, ISensor<Pms5003Sensor> pms5003Sensor, IOptions<Pms5003Config> options)
|
||||||
|
{
|
||||||
|
_pms5003Sensor = pms5003Sensor;
|
||||||
|
_logger = logger;
|
||||||
|
_options = options;
|
||||||
|
}
|
||||||
|
|
||||||
|
public override async Task<NucuCarSensorResponse> GetMeasurement(Empty request, ServerCallContext context)
|
||||||
|
{
|
||||||
|
_logger?.LogDebug($"Calling {nameof(GetMeasurement)}.");
|
||||||
|
if (_options.Value.Grpc)
|
||||||
|
{
|
||||||
|
return await Task.FromResult(_pms5003Sensor.Object.GetMeasurement());
|
||||||
|
}
|
||||||
|
|
||||||
|
return await Task.FromResult(Responses.GrpcIsDisabledResponse);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -36,17 +36,26 @@ namespace NucuCar.Sensors.Modules.PMS5003
|
||||||
public override void Initialize()
|
public override void Initialize()
|
||||||
{
|
{
|
||||||
_pms5003 = new Pms5003(23, 24);
|
_pms5003 = new Pms5003(23, 24);
|
||||||
|
CurrentState = SensorStateEnum.Initialized;
|
||||||
}
|
}
|
||||||
|
|
||||||
public override Task TakeMeasurementAsync()
|
public override Task TakeMeasurementAsync()
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
_pms5003.WakeUp();
|
||||||
_pms5003Data = _pms5003.ReadData();
|
_pms5003Data = _pms5003.ReadData();
|
||||||
|
CurrentState = SensorStateEnum.Initialized;
|
||||||
}
|
}
|
||||||
catch (ReadFailedException e)
|
catch (ReadFailedException e)
|
||||||
{
|
{
|
||||||
Logger?.LogError("{message}", e.Message);
|
Logger?.LogError("{Message}", e.Message);
|
||||||
|
CurrentState = SensorStateEnum.Error;
|
||||||
|
_pms5003.Reset();
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
_pms5003.Sleep();
|
||||||
}
|
}
|
||||||
|
|
||||||
return Task.CompletedTask;
|
return Task.CompletedTask;
|
||||||
|
@ -54,9 +63,7 @@ namespace NucuCar.Sensors.Modules.PMS5003
|
||||||
|
|
||||||
public override NucuCarSensorResponse GetMeasurement()
|
public override NucuCarSensorResponse GetMeasurement()
|
||||||
{
|
{
|
||||||
string jsonResponse = null;
|
var jsonResponse = _pms5003Data != null ? JsonConvert.SerializeObject(_pms5003Data) : "{}";
|
||||||
jsonResponse = _pms5003Data != null ? JsonConvert.SerializeObject(_pms5003Data) : "{}";
|
|
||||||
|
|
||||||
return new NucuCarSensorResponse()
|
return new NucuCarSensorResponse()
|
||||||
{
|
{
|
||||||
State = GetState(),
|
State = GetState(),
|
||||||
|
|
|
@ -6,6 +6,7 @@ using NucuCar.Sensors.Grpc;
|
||||||
using NucuCar.Sensors.Modules.Environment;
|
using NucuCar.Sensors.Modules.Environment;
|
||||||
using NucuCar.Sensors.Modules.Health;
|
using NucuCar.Sensors.Modules.Health;
|
||||||
using NucuCar.Sensors.Modules.Heartbeat;
|
using NucuCar.Sensors.Modules.Heartbeat;
|
||||||
|
using NucuCar.Sensors.Modules.PMS5003;
|
||||||
using NucuCar.Telemetry;
|
using NucuCar.Telemetry;
|
||||||
|
|
||||||
namespace NucuCar.Sensors
|
namespace NucuCar.Sensors
|
||||||
|
@ -25,12 +26,14 @@ namespace NucuCar.Sensors
|
||||||
services.Configure<Bme680Config>(hostContext.Configuration.GetSection("EnvironmentSensor"));
|
services.Configure<Bme680Config>(hostContext.Configuration.GetSection("EnvironmentSensor"));
|
||||||
services.Configure<CpuTempConfig>(hostContext.Configuration.GetSection("HealthSensor"));
|
services.Configure<CpuTempConfig>(hostContext.Configuration.GetSection("HealthSensor"));
|
||||||
services.Configure<HeartbeatConfig>(hostContext.Configuration.GetSection("HeartbeatSensor"));
|
services.Configure<HeartbeatConfig>(hostContext.Configuration.GetSection("HeartbeatSensor"));
|
||||||
|
services.Configure<Pms5003Config>(hostContext.Configuration.GetSection("Pms5003Sensor"));
|
||||||
|
|
||||||
// Singletons
|
// Singletons
|
||||||
services.AddSingleton<Telemetry.Telemetry>();
|
services.AddSingleton<Telemetry.Telemetry>();
|
||||||
services.AddSingleton<ISensor<Bme680Sensor>, Bme680Sensor>();
|
services.AddSingleton<ISensor<Bme680Sensor>, Bme680Sensor>();
|
||||||
services.AddSingleton<ISensor<CpuTempSensor>, CpuTempSensor>();
|
services.AddSingleton<ISensor<CpuTempSensor>, CpuTempSensor>();
|
||||||
services.AddSingleton<ISensor<HeartbeatSensor>, HeartbeatSensor>();
|
services.AddSingleton<ISensor<HeartbeatSensor>, HeartbeatSensor>();
|
||||||
|
services.AddSingleton<ISensor<Pms5003Sensor>, Pms5003Sensor>();
|
||||||
|
|
||||||
// Workers
|
// Workers
|
||||||
// Telemetry
|
// Telemetry
|
||||||
|
@ -39,6 +42,7 @@ namespace NucuCar.Sensors
|
||||||
services.AddHostedService<Bme680Worker>();
|
services.AddHostedService<Bme680Worker>();
|
||||||
services.AddHostedService<CpuTempWorker>();
|
services.AddHostedService<CpuTempWorker>();
|
||||||
services.AddHostedService<HeartbeatWorker>();
|
services.AddHostedService<HeartbeatWorker>();
|
||||||
|
services.AddHostedService<Pms5003Worker>();
|
||||||
})
|
})
|
||||||
.ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup<GrpcStartup>(); });
|
.ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup<GrpcStartup>(); });
|
||||||
}
|
}
|
||||||
|
|
|
@ -20,6 +20,11 @@
|
||||||
"Telemetry": true,
|
"Telemetry": true,
|
||||||
"Grpc": false
|
"Grpc": false
|
||||||
},
|
},
|
||||||
|
"Pms5003Sensor": {
|
||||||
|
"Enabled": false,
|
||||||
|
"Telemetry": true,
|
||||||
|
"Grpc": true
|
||||||
|
},
|
||||||
"Logging": {
|
"Logging": {
|
||||||
"LogLevel": {
|
"LogLevel": {
|
||||||
"Default": "Information",
|
"Default": "Information",
|
||||||
|
|
|
@ -60,7 +60,7 @@ namespace NucuCar.UnitTests.NucuCar.Sensors.Tests.EnvironmentSensor
|
||||||
|
|
||||||
// Verify that the sensor get measurement method is not called.
|
// Verify that the sensor get measurement method is not called.
|
||||||
_mockSensor.Verify(s => s.Object.GetMeasurement(), Times.Never());
|
_mockSensor.Verify(s => s.Object.GetMeasurement(), Times.Never());
|
||||||
Assert.Equal(SensorStateEnum.GrpcDisabled, result.Result.State);
|
Assert.Equal(SensorStateEnum.Disabled, result.Result.State);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
Loading…
Reference in a new issue