@@ -37,6 +37,8 @@ void APB::WebServer::setup() {
3737 onJsonRequest (" /api/config/accessPoint" , [](AsyncWebServerRequest *request, JsonVariant &json){ WiFiManager::Instance.onConfigAccessPoint (request, json); }, HTTP_POST | HTTP_DELETE);
3838 onJsonRequest (" /api/config/station" , [](AsyncWebServerRequest *request, JsonVariant &json){ WiFiManager::Instance.onConfigStation (request, json); }, HTTP_POST | HTTP_DELETE);
3939 onJsonRequest (" /api/config/statusLedDuty" , std::bind (&WebServer::onConfigStatusLedDuty, this , _1, _2), HTTP_POST);
40+ onJsonRequest (" /api/config/fanDuty" , std::bind (&WebServer::onConfigFanDuty, this , _1, _2), HTTP_POST);
41+ onJsonRequest (" /api/config/pdVoltage" , std::bind (&WebServer::onConfigPDVoltage, this , _1, _2), HTTP_POST);
4042 onJsonRequest (" /api/config/powerSourceType" , std::bind (&WebServer::onConfigPowerSourceType, this , _1, _2), HTTP_POST);
4143 webserver.on (" /api/metrics" , HTTP_GET, std::bind (&WebServer::onGetMetrics, this , _1));
4244 webserver.on (" /api/config/write" , HTTP_POST, std::bind (&WebServer::onPostWriteConfig, this , _1));
@@ -107,13 +109,18 @@ void APB::WebServer::onGetStatus(AsyncWebServerRequest *request) {
107109 response.root ()[" has_power_monitor" ] = PowerMonitor::Instance.status ().initialised ;
108110 response.root ()[" has_ambient_sensor" ] = Ambient::Instance.isInitialised ();
109111 response.root ()[" has_serial" ] = static_cast <bool >(Serial);
112+ response.root ()[" pdVoltageRequested" ] = PDProtocol::getVoltage ();
110113}
111114
112115void APB::WebServer::onGetConfig (AsyncWebServerRequest *request) {
113116 JsonWebResponse response (request);
114117 JsonObject rootObject = response.root ().to <JsonObject>();
115118 WiFiManager::Instance.onGetConfig (rootObject);
116119 rootObject[" ledDuty" ] = Settings::Instance.statusLedDuty ();
120+ #ifdef APB_PWM_FAN_PIN
121+ rootObject[" fanDuty" ] = Settings::Instance.fanDuty ();
122+ #endif
123+ rootObject[" pdVoltage" ] = Settings::Instance.pdVoltage ();
117124 rootObject[" powerSourceType" ] = Settings::PowerSourcesNames.at (Settings::Instance.powerSource ());
118125}
119126
@@ -265,6 +272,37 @@ void APB::WebServer::onConfigStatusLedDuty(AsyncWebServerRequest *request, JsonV
265272 response.root ()[" duty" ] = StatusLed::Instance.duty ();
266273}
267274
275+ void APB::WebServer::onConfigPDVoltage (AsyncWebServerRequest *request, JsonVariant &json) {
276+ WebValidation validation{request, json};
277+ if (validation.required <PDProtocol::Voltage>(" pdVoltage" )
278+ .invalid ()) return ;
279+ bool valid_voltage = std::any_of (PDProtocol::getSupportedVoltages ().begin (), PDProtocol::getSupportedVoltages ().end (),
280+ [json](PDProtocol::Voltage v){ return v == json[" pdVoltage" ].as <PDProtocol::Voltage>(); });
281+ if (!valid_voltage) {
282+ JsonWebResponse::error (JsonWebResponse::BadRequest, " Invalid voltage" , request);
283+ return ;
284+ }
285+ Settings::Instance.setPdVoltage (json[" pdVoltage" ].as <PDProtocol::Voltage>());
286+ PDProtocol::setVoltage (Settings::Instance.pdVoltage ());
287+ JsonWebResponse response (request);
288+ response.root ()[" pdVoltage" ] = PDProtocol::getVoltage ();
289+ }
290+
291+ void APB::WebServer::onConfigFanDuty (AsyncWebServerRequest *request, JsonVariant &json) {
292+ #ifndef APB_PWM_FAN_PIN
293+ JsonWebResponse (request).error (JsonWebResponse::NotFound, " Fan control not supported on this hardware" , request);
294+ #else
295+ WebValidation validation{request, json};
296+ if (validation.required <float >(" duty" )
297+ .range (" duty" , {0 }, {1 })
298+ .invalid ()) return ;
299+ int analogValue = json[" duty" ].as <float >() * 255.0 ;
300+ analogWrite (APB_PWM_FAN_PIN, analogValue);
301+ JsonWebResponse response (request);
302+ response.root ()[" duty" ] = Settings::Instance.fanDuty ();
303+ #endif
304+ }
305+
268306void APB::WebServer::onConfigPowerSourceType (AsyncWebServerRequest *request, JsonVariant &json) {
269307 WebValidation validation{request, json};
270308 std::forward_list<String> choices;
0 commit comments