7#ifndef SENSOR_COMPENSATION_SERVICE_H
8#define SENSOR_COMPENSATION_SERVICE_H
12#include "../../include/business/ISensorCompensationService.h"
13#include "../../include/sensor_types.h"
14#include "../../include/validation_utils.h"
18constexpr float UNIVERSAL_GAS_CONSTANT = 8.314F;
19constexpr float FARADAY_CONSTANT = 96485.0F;
20constexpr float STANDARD_TEMP_K = 298.15F;
21constexpr float DEFAULT_POROSITY = 0.45F;
22constexpr float DEFAULT_CEMENTATION = 1.5F;
23constexpr float DEFAULT_SATURATION = 2.0F;
24constexpr float DEFAULT_EPSILON_N = 0.01F;
25constexpr float DEFAULT_EPSILON_P = 0.008F;
26constexpr float DEFAULT_EPSILON_K = 0.012F;
27constexpr float DEFAULT_DELTA_N = 0.0041F;
28constexpr float DEFAULT_DELTA_P = 0.0053F;
29constexpr float DEFAULT_DELTA_K = 0.0032F;
30constexpr float NPK_SAND_EPSILON_N = 0.011F;
31constexpr float NPK_SAND_EPSILON_P = 0.009F;
32constexpr float NPK_SAND_EPSILON_K = 0.013F;
33constexpr float NPK_LOAM_DELTA_N = 0.0039F;
34constexpr float NPK_LOAM_DELTA_P = 0.0050F;
35constexpr float NPK_LOAM_DELTA_K = 0.0030F;
36constexpr float NPK_LOAM_EPSILON_N = 0.010F;
37constexpr float NPK_LOAM_EPSILON_P = 0.008F;
38constexpr float NPK_LOAM_EPSILON_K = 0.012F;
39constexpr float NPK_CLAY_DELTA_N = 0.0033F;
40constexpr float NPK_CLAY_DELTA_P = 0.0043F;
41constexpr float NPK_CLAY_DELTA_K = 0.0025F;
42constexpr float NPK_CLAY_EPSILON_N = 0.009F;
43constexpr float NPK_CLAY_EPSILON_P = 0.007F;
44constexpr float NPK_CLAY_EPSILON_K = 0.011F;
45constexpr float NPK_PEAT_DELTA_N = 0.0029F;
46constexpr float NPK_PEAT_DELTA_P = 0.0036F;
47constexpr float NPK_PEAT_DELTA_K = 0.0019F;
48constexpr float NPK_PEAT_EPSILON_N = 0.013F;
49constexpr float NPK_PEAT_EPSILON_P = 0.010F;
50constexpr float NPK_PEAT_EPSILON_K = 0.016F;
51constexpr float NPK_SANDPEAT_DELTA_N = 0.0041F;
52constexpr float NPK_SANDPEAT_DELTA_P = 0.0052F;
53constexpr float NPK_SANDPEAT_DELTA_K = 0.0032F;
54constexpr float NPK_SANDPEAT_EPSILON_N = 0.011F;
55constexpr float NPK_SANDPEAT_EPSILON_P = 0.009F;
56constexpr float NPK_SANDPEAT_EPSILON_K = 0.013F;
64struct ArchieCoefficients
70 ArchieCoefficients() : m(DEFAULT_CEMENTATION), n(DEFAULT_SATURATION), a(DEFAULT_POROSITY) {}
71 ArchieCoefficients(
float cementation,
float saturation,
float porosity) : m(cementation), n(saturation), a(porosity)
130 std::map<SoilType, SoilParameters> soilParameters;
133 std::map<SoilType, NPKCoefficients> npkCoefficients;
136 static constexpr float R = UNIVERSAL_GAS_CONSTANT;
137 static constexpr float F = FARADAY_CONSTANT;
138 static constexpr float T0 = STANDARD_TEMP_K;
141 void initializeSoilTypeCoefficients();
144 void initializeSoilParameters();
147 void initializeNPKCoefficients();
150 static float temperatureToKelvin(
float celsius);
195 float correctPH(
float temperature,
float phRaw)
override;
Интерфейс для сервиса компенсации датчиков
Definition ISensorCompensationService.h:21
Сервис компенсации датчиков
Definition sensor_compensation_service.h:127
SensorCompensationService()
Конструктор
Definition sensor_compensation_service.cpp:21
bool validateCompensationInputs(SoilType soilType, float humidity, float temperature) const override
Проверяет валидность входных данных для компенсации
Definition sensor_compensation_service.cpp:168
float correctEC(float ec25, SoilType soilType, float temperature) override
Компенсирует EC по модели Арчи
Definition sensor_compensation_service.cpp:46
void applyCompensation(SensorData &data, SoilType soilType) override
Применяет компенсацию к данным датчика
Definition sensor_compensation_service.cpp:28
SoilParameters getSoilParameters(SoilType soilType) const
Получает параметры почвы для типа
Definition sensor_compensation_service.cpp:295
virtual ~SensorCompensationService()=default
Деструктор
float getPorosity(SoilType soilType) const override
Получает пористость для типа почвы
Definition sensor_compensation_service.cpp:158
float correctPH(float temperature, float phRaw) override
Компенсирует pH по уравнению Нернста
Definition sensor_compensation_service.cpp:89
NPKCoefficients getNPKCoefficients(SoilType soilType) const
Получает коэффициенты NPK для типа почвы
Definition sensor_compensation_service.cpp:307
void correctNPK(float temperature, float humidity, SoilType soilType, NPKReferences &npk) override
Компенсирует NPK по алгоритму Delgado et al. (2020)
Definition sensor_compensation_service.cpp:113
Definition fake_sensor.cpp:26
SoilType
Типы почвы
Definition sensor_types.h:16
Коэффициенты NPK для разных типов почвы
Definition sensor_compensation_service.h:104
NPKCoefficients(float dN, float dP, float dK, float eN, float eP, float eK)
Definition sensor_compensation_service.h:112
float epsilon_K
Definition sensor_compensation_service.h:106
float delta_P
Definition sensor_compensation_service.h:105
NPKCoefficients()
Definition sensor_compensation_service.h:108
float epsilon_P
Definition sensor_compensation_service.h:106
float epsilon_N
Definition sensor_compensation_service.h:106
float delta_K
Definition sensor_compensation_service.h:105
float delta_N
Definition sensor_compensation_service.h:105
NPK значения
Definition sensor_types.h:101
Данные датчика
Definition sensor_types.h:77
Параметры почвы
Definition sensor_compensation_service.h:85
SoilParameters(float por, float density, float capacity)
Definition sensor_compensation_service.h:91
float bulkDensity
Definition sensor_compensation_service.h:87
float fieldCapacity
Definition sensor_compensation_service.h:88
SoilParameters()
Definition sensor_compensation_service.h:90
float porosity
Definition sensor_compensation_service.h:86