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 }