/ firmware / src / sensors / manager.cpp
manager.cpp
  1  #include "manager.h"
  2  #include "registry.h"
  3  
  4  #include <i2c.h>
  5  #include "../networking/modbus.h"
  6  
  7  #include <Arduino.h>
  8  #include <freertos/timers.h>
  9  
 10  namespace {
 11  
 12  constexpr uint32_t SENSOR_POLL_MS = 5000;
 13  TimerHandle_t poll_timer = nullptr;
 14  
 15  void poll_timer_callback(TimerHandle_t) {
 16    sensors::registry::pollAll();
 17  }
 18  
 19  }
 20  
 21  void sensors::manager::initialize() {
 22    hardware::i2c::runDiscovery();
 23  
 24    sensors::temperature_and_humidity::initialize();
 25    sensors::voltage::initialize();
 26    sensors::current::initialize();
 27    sensors::carbon_dioxide::initialize();
 28    networking::modbus::initialize();
 29    sensors::wind_speed::initialize();
 30    if (sensors::wind_speed::isAvailable()) delay(config::wind::SENSOR_DELAY_MS);
 31    sensors::wind_direction::initialize();
 32    sensors::solar_radiation::initialize();
 33    sensors::barometric_pressure::initialize();
 34    sensors::soil::initialize();
 35  
 36    sensors::registry::pollAll();
 37  
 38    poll_timer = xTimerCreate("sensor-poll", pdMS_TO_TICKS(SENSOR_POLL_MS),
 39                              pdTRUE, nullptr, poll_timer_callback);
 40    xTimerStart(poll_timer, 0);
 41  }
 42  
 43  bool sensors::manager::accessInventory(SensorInventorySnapshot *snapshot) {
 44    if (!snapshot) return false;
 45    snapshot->temperature_humidity_count =
 46        sensors::registry::instanceCount(SensorKind::TemperatureHumidity);
 47    snapshot->soil_probe_count =
 48        sensors::registry::instanceCount(SensorKind::Soil);
 49    snapshot->voltage_available =
 50        sensors::registry::isAvailable(SensorKind::Voltage);
 51    snapshot->current_available =
 52        sensors::registry::isAvailable(SensorKind::Current);
 53    snapshot->carbon_dioxide_available =
 54        sensors::registry::isAvailable(SensorKind::CarbonDioxide);
 55    snapshot->wind_speed_available =
 56        sensors::registry::isAvailable(SensorKind::WindSpeed);
 57    snapshot->wind_direction_available =
 58        sensors::registry::isAvailable(SensorKind::WindDirection);
 59    snapshot->solar_radiation_available =
 60        sensors::registry::isAvailable(SensorKind::SolarRadiation);
 61    snapshot->barometric_pressure_available =
 62        sensors::registry::isAvailable(SensorKind::BarometricPressure);
 63    return true;
 64  }
 65  
 66  bool sensors::manager::accessCO2(CO2SensorData *out) {
 67    if (!out) return false;
 68    auto *src = static_cast<const CO2SensorData *>(
 69        sensors::registry::latest(SensorKind::CarbonDioxide));
 70    if (!src) return false;
 71    *out = *src;
 72    return sensors::registry::valid(SensorKind::CarbonDioxide);
 73  }
 74  
 75  bool sensors::manager::accessVoltage(VoltageSensorData *out) {
 76    if (!out) return false;
 77    auto *src = static_cast<const VoltageSensorData *>(
 78        sensors::registry::latest(SensorKind::Voltage));
 79    if (!src) return false;
 80    *out = *src;
 81    return sensors::registry::valid(SensorKind::Voltage);
 82  }
 83  
 84  bool sensors::manager::accessCurrent(CurrentSensorData *out) {
 85    if (!out) return false;
 86    auto *src = static_cast<const CurrentSensorData *>(
 87        sensors::registry::latest(SensorKind::Current));
 88    if (!src) return false;
 89    *out = *src;
 90    return sensors::registry::valid(SensorKind::Current);
 91  }
 92  
 93  bool sensors::manager::accessWindSpeed(WindSpeedSensorData *out) {
 94    if (!out) return false;
 95    auto *src = static_cast<const WindSpeedSensorData *>(
 96        sensors::registry::latest(SensorKind::WindSpeed));
 97    if (!src) return false;
 98    *out = *src;
 99    return sensors::registry::valid(SensorKind::WindSpeed);
100  }
101  
102  bool sensors::manager::accessWindDirection(WindDirectionSensorData *out) {
103    if (!out) return false;
104    auto *src = static_cast<const WindDirectionSensorData *>(
105        sensors::registry::latest(SensorKind::WindDirection));
106    if (!src) return false;
107    *out = *src;
108    return sensors::registry::valid(SensorKind::WindDirection);
109  }
110  
111  bool sensors::manager::accessSolarRadiation(SolarRadiationSensorData *out) {
112    if (!out) return false;
113    auto *src = static_cast<const SolarRadiationSensorData *>(
114        sensors::registry::latest(SensorKind::SolarRadiation));
115    if (!src) return false;
116    *out = *src;
117    return sensors::registry::valid(SensorKind::SolarRadiation);
118  }
119  
120  bool sensors::manager::accessBarometricPressure(BarometricPressureSensorData *out) {
121    if (!out) return false;
122    auto *src = static_cast<const BarometricPressureSensorData *>(
123        sensors::registry::latest(SensorKind::BarometricPressure));
124    if (!src) return false;
125    *out = *src;
126    return sensors::registry::valid(SensorKind::BarometricPressure);
127  }
128  
129  bool sensors::manager::accessTemperatureHumidity(uint8_t index,
130                                                    TemperatureHumiditySensorData *out) {
131    if (!out) return false;
132    auto *src = static_cast<const TemperatureHumiditySensorData *>(
133        sensors::registry::latest(SensorKind::TemperatureHumidity, index));
134    if (!src) return false;
135    *out = *src;
136    return sensors::registry::valid(SensorKind::TemperatureHumidity, index);
137  }
138  
139  bool sensors::manager::accessSoil(uint8_t index, SoilSensorData *out) {
140    if (!out) return false;
141    auto *src = static_cast<const SoilSensorData *>(
142        sensors::registry::latest(SensorKind::Soil, index));
143    if (!src) return false;
144    *out = *src;
145    return sensors::registry::valid(SensorKind::Soil, index);
146  }