/ firmware / src / services / http / api / sensors / co2.cpp
co2.cpp
 1  #include "routes.h"
 2  #include "sensors/carbon_dioxide.h"
 3  #include <manager.h>
 4  
 5  #include <ESPAsyncWebServer.h>
 6  #include <AsyncJson.h>
 7  #include <ArduinoJson.h>
 8  
 9  namespace {
10  
11  void handle_config_get(AsyncWebServerRequest *request) {
12    Co2Config config = {};
13    ::sensors::carbon_dioxide::accessConfig(&config);
14  
15    AsyncJsonResponse *response = new AsyncJsonResponse();
16    JsonObject root = response->getRoot().to<JsonObject>();
17    root["ok"] = ::sensors::carbon_dioxide::isAvailable();
18    JsonObject data = root["data"].to<JsonObject>();
19    data["model"] = config.model;
20    data["measuring"] = config.measuring;
21    data["measurement_interval_seconds"] = config.measurement_interval_seconds;
22    data["auto_calibration_enabled"] = config.auto_calibration_enabled;
23    data["temperature_offset_celsius"] = config.temperature_offset_celsius;
24    data["altitude_meters"] = config.altitude_meters;
25    response->setLength();
26    request->send(response);
27  }
28  
29  void handle_start(AsyncWebServerRequest *request) {
30    bool ok = ::sensors::carbon_dioxide::enable();
31    AsyncJsonResponse *response = new AsyncJsonResponse();
32    JsonObject root = response->getRoot().to<JsonObject>();
33    root["ok"] = ok;
34    response->setLength();
35    request->send(response);
36  }
37  
38  void handle_stop(AsyncWebServerRequest *request) {
39    bool ok = ::sensors::carbon_dioxide::disable();
40    AsyncJsonResponse *response = new AsyncJsonResponse();
41    JsonObject root = response->getRoot().to<JsonObject>();
42    root["ok"] = ok;
43    response->setLength();
44    request->send(response);
45  }
46  
47  }
48  
49  void services::http::api::sensors::co2::registerRoutes(AsyncWebServer &server) {
50    server.on("/api/co2/config", HTTP_GET, handle_config_get);
51    server.on("/api/co2/start", HTTP_POST, handle_start);
52    server.on("/api/co2/stop", HTTP_POST, handle_stop);
53  
54    AsyncCallbackJsonWebHandler &config_handler =
55        server.on("/api/co2/config", HTTP_POST,
56            [](AsyncWebServerRequest *request, JsonVariant &json) {
57      JsonObject body = json.as<JsonObject>();
58      if (!body["measurement_interval_seconds"].isNull())
59        ::sensors::carbon_dioxide::configureInterval(body["measurement_interval_seconds"]);
60      if (!body["auto_calibration_enabled"].isNull())
61        ::sensors::carbon_dioxide::configureAutoCalibration(body["auto_calibration_enabled"]);
62      if (!body["temperature_offset_celsius"].isNull())
63        ::sensors::carbon_dioxide::configureTemperatureOffset(body["temperature_offset_celsius"]);
64      if (!body["altitude_meters"].isNull())
65        ::sensors::carbon_dioxide::configureAltitude(body["altitude_meters"]);
66      if (!body["forced_recalibration_ppm"].isNull())
67        ::sensors::carbon_dioxide::configureRecalibration(body["forced_recalibration_ppm"]);
68  
69      Co2Config config = {};
70      ::sensors::carbon_dioxide::accessConfig(&config);
71      AsyncJsonResponse *response = new AsyncJsonResponse();
72      JsonObject root = response->getRoot().to<JsonObject>();
73      root["ok"] = ::sensors::carbon_dioxide::isAvailable();
74      JsonObject data = root["data"].to<JsonObject>();
75      data["model"] = config.model;
76      data["measuring"] = config.measuring;
77      data["measurement_interval_seconds"] = config.measurement_interval_seconds;
78      data["auto_calibration_enabled"] = config.auto_calibration_enabled;
79      data["temperature_offset_celsius"] = config.temperature_offset_celsius;
80      data["altitude_meters"] = config.altitude_meters;
81      response->setLength();
82      request->send(response);
83    });
84    config_handler.setMaxContentLength(512);
85  }