diff --git a/ESP/lib/src/data/utilities/network_utilities.cpp b/ESP/lib/src/data/utilities/network_utilities.cpp index aca862a..2672014 100644 --- a/ESP/lib/src/data/utilities/network_utilities.cpp +++ b/ESP/lib/src/data/utilities/network_utilities.cpp @@ -1,76 +1,70 @@ #include "network_utilities.hpp" -void Network_Utilities::SetupWifiScan() -{ - // Set WiFi to station mode and disconnect from an AP if it was previously connected - WiFi.mode(WIFI_STA); - WiFi.disconnect(); // Disconnect from the access point if connected before - my_delay(0.1); - Serial.println("Setup done"); +void Network_Utilities::SetupWifiScan() { + // Set WiFi to station mode and disconnect from an AP if it was previously + // connected + WiFi.mode(WIFI_STA); + WiFi.disconnect(); // Disconnect from the access point if connected before + my_delay(0.1); + Serial.println("Setup done"); } -bool Network_Utilities::LoopWifiScan() -{ - // WiFi.scanNetworks will return the number of networks found - log_i("[INFO]: Beginning WiFi Scanner"); - int networks = WiFi.scanNetworks(true, true); - log_i("[INFO]: scan done"); - log_i("%d networks found", networks); - for (int i = networks; i--;) - { - // Print SSID and RSSI for each network found - //! TODO: Add method here to interface with the API and forward the scanned networks to the API - log_i("%d: %s (%d) %s\n", i - 1, WiFi.SSID(i), WiFi.RSSI(i), (WiFi.encryptionType(i) == WIFI_AUTH_OPEN) ? " " : "*"); - my_delay(0.02); // delay 20ms - } - return (networks > 0); +bool Network_Utilities::LoopWifiScan() { + // WiFi.scanNetworks will return the number of networks found + log_i("[INFO]: Beginning WiFi Scanner"); + int networks = WiFi.scanNetworks(true, true); + log_i("[INFO]: scan done"); + log_i("%d networks found", networks); + for (int i = networks; i--;) { + // Print SSID and RSSI for each network found + //! TODO: Add method here to interface with the API and forward the scanned + //! networks to the API + log_i("%d: %s (%d) %s\n", i - 1, WiFi.SSID(i), WiFi.RSSI(i), + (WiFi.encryptionType(i) == WIFI_AUTH_OPEN) ? " " : "*"); + my_delay(0.02); // delay 20ms + } + return (networks > 0); } // Take measurements of the Wi-Fi strength and return the average result. -int Network_Utilities::getStrength(int points) // TODO: add to JSON doc -{ - int32_t rssi = 0, averageRSSI = 0; - for (int i = 0; i < points; i++) - { - rssi += WiFi.RSSI(); - my_delay(0.02); - } - averageRSSI = rssi / points; - return averageRSSI; +int Network_Utilities::getStrength(int points) { + int32_t rssi = 0, averageRSSI = 0; + for (int i = 0; i < points; i++) { + rssi += WiFi.RSSI(); + my_delay(0.02); + } + averageRSSI = rssi / points; + return averageRSSI; } -void Network_Utilities::my_delay(volatile long delay_time) -{ - delay_time = delay_time * 1e6L; - for (volatile long count = delay_time; count > 0; count--) - ; +void Network_Utilities::my_delay(volatile long delay_time) { + delay_time = delay_time * 1e6L; + for (volatile long count = delay_time; count > 0; count--) + ; } -std::string shaEncoder(const std::string &data) -{ - const char *data_c = data.c_str(); - int size = 64; - uint8_t hash[size]; - mbedtls_md_context_t ctx; - mbedtls_md_type_t md_type = MBEDTLS_MD_SHA512; +std::string shaEncoder(const std::string& data) { + const char* data_c = data.c_str(); + int size = 64; + uint8_t hash[size]; + mbedtls_md_context_t ctx; + mbedtls_md_type_t md_type = MBEDTLS_MD_SHA512; - const size_t len = strlen(data_c); - mbedtls_md_init(&ctx); - mbedtls_md_setup(&ctx, mbedtls_md_info_from_type(md_type), 0); - mbedtls_md_starts(&ctx); - mbedtls_md_update(&ctx, (const unsigned char *)data_c, len); - mbedtls_md_finish(&ctx, hash); - mbedtls_md_free(&ctx); + const size_t len = strlen(data_c); + mbedtls_md_init(&ctx); + mbedtls_md_setup(&ctx, mbedtls_md_info_from_type(md_type), 0); + mbedtls_md_starts(&ctx); + mbedtls_md_update(&ctx, (const unsigned char*)data_c, len); + mbedtls_md_finish(&ctx, hash); + mbedtls_md_free(&ctx); - std::string hash_string = ""; - for (uint16_t i = 0; i < size; i++) - { - std::string hex = String(hash[i], HEX).c_str(); - if (hex.length() < 2) - { - hex = "0" + hex; - } - hash_string += hex; + std::string hash_string = ""; + for (uint16_t i = 0; i < size; i++) { + std::string hex = String(hash[i], HEX).c_str(); + if (hex.length() < 2) { + hex = "0" + hex; } - return hash_string; -} \ No newline at end of file + hash_string += hex; + } + return hash_string; +} diff --git a/ESP/lib/src/network/api/baseAPI/baseAPI.cpp b/ESP/lib/src/network/api/baseAPI/baseAPI.cpp index e828965..637569a 100644 --- a/ESP/lib/src/network/api/baseAPI/baseAPI.cpp +++ b/ESP/lib/src/network/api/baseAPI/baseAPI.cpp @@ -1,374 +1,334 @@ #include "baseAPI.hpp" -//! These have to be called before the constructor of the class because they are static -//! C++ 11 does not have inline variables, sadly. So we have to do this. +//! These have to be called before the constructor of the class because they are +//! static C++ 11 does not have inline variables, sadly. So we have to do this. // const char *BaseAPI::MIMETYPE_HTML{"text/html"}; // const char *BaseAPI::MIMETYPE_CSS{"text/css"}; // const char *BaseAPI::MIMETYPE_JS{"application/javascript"}; // const char *BaseAPI::MIMETYPE_PNG{"image/png"}; // const char *BaseAPI::MIMETYPE_JPG{"image/jpeg"}; // const char *BaseAPI::MIMETYPE_ICO{"image/x-icon"}; -const char *BaseAPI::MIMETYPE_JSON{"application/json"}; +const char* BaseAPI::MIMETYPE_JSON{"application/json"}; BaseAPI::BaseAPI(int CONTROL_PORT, - ProjectConfig *projectConfig, - CameraHandler *camera, - StateManager *WiFiStateManager, - const std::string &api_url) : server(CONTROL_PORT), - projectConfig(projectConfig), - camera(camera), - wiFiStateManager(wiFiStateManager), - api_url(api_url) {} + ProjectConfig* projectConfig, + CameraHandler* camera, + StateManager* WiFiStateManager, + const std::string& api_url) + : server(CONTROL_PORT), + projectConfig(projectConfig), + camera(camera), + wiFiStateManager(wiFiStateManager), + api_url(api_url) {} BaseAPI::~BaseAPI() {} -void BaseAPI::begin() -{ - //! i have changed this to use lambdas instead of std::bind to avoid the overhead. Lambdas are always more preferable. - server.on("/", 0b00000001, [&](AsyncWebServerRequest *request) - { request->send(200); }); +void BaseAPI::begin() { + //! i have changed this to use lambdas instead of std::bind to avoid the + //! overhead. Lambdas are always more preferable. + server.on("/", 0b00000001, + [&](AsyncWebServerRequest* request) { request->send(200); }); - // preflight cors check - server.on("/", 0b01000000, [&](AsyncWebServerRequest *request) - { - AsyncWebServerResponse* response = request->beginResponse(204); - response->addHeader("Access-Control-Allow-Methods", "PUT,POST,GET,OPTIONS"); - response->addHeader("Access-Control-Allow-Headers", "Accept, Content-Type, Authorization"); - response->addHeader("Access-Control-Allow-Credentials", "true"); - request->send(response); }); + // preflight cors check + server.on("/", 0b01000000, [&](AsyncWebServerRequest* request) { + AsyncWebServerResponse* response = request->beginResponse(204); + response->addHeader("Access-Control-Allow-Methods", "PUT,POST,GET,OPTIONS"); + response->addHeader("Access-Control-Allow-Headers", + "Accept, Content-Type, Authorization"); + response->addHeader("Access-Control-Allow-Credentials", "true"); + request->send(response); + }); - DefaultHeaders::Instance().addHeader("Access-Control-Allow-Origin", "*"); + DefaultHeaders::Instance().addHeader("Access-Control-Allow-Origin", "*"); - // std::bind(&BaseAPI::notFound, &std::placeholders::_1); - server.onNotFound([&](AsyncWebServerRequest *request) - { notFound(request); }); + // std::bind(&BaseAPI::notFound, &std::placeholders::_1); + server.onNotFound([&](AsyncWebServerRequest* request) { notFound(request); }); } -void BaseAPI::notFound(AsyncWebServerRequest *request) const -{ - if (_networkMethodsMap.find(request->method()) != _networkMethodsMap.end()) - { - log_i("%s: http://%s%s/\n", _networkMethodsMap.at(request->method()).c_str(), request->host().c_str(), request->url().c_str()); - char buffer[100]; - snprintf(buffer, sizeof(buffer), "Request %s Not found: %s", _networkMethodsMap.at(request->method()).c_str(), request->url().c_str()); - request->send(404, "text/plain", buffer); - } - else - { - request->send(404, "text/plain", "Request Not found using unknown method"); - } +void BaseAPI::notFound(AsyncWebServerRequest* request) const { + if (_networkMethodsMap.find(request->method()) != _networkMethodsMap.end()) { + log_i("%s: http://%s%s/\n", + _networkMethodsMap.at(request->method()).c_str(), + request->host().c_str(), request->url().c_str()); + char buffer[100]; + snprintf(buffer, sizeof(buffer), "Request %s Not found: %s", + _networkMethodsMap.at(request->method()).c_str(), + request->url().c_str()); + request->send(404, "text/plain", buffer); + } else { + request->send(404, "text/plain", "Request Not found using unknown method"); + } } //********************************************************************************************* //! Command Functions //********************************************************************************************* -void BaseAPI::setWiFi(AsyncWebServerRequest *request) -{ - switch (_networkMethodsMap_enum[request->method()]) - { - case POST: - { - int params = request->params(); - std::string networkName; - std::string ssid; - std::string password; - uint8_t channel = 0; - uint8_t power = 0; - uint8_t adhoc = 0; +void BaseAPI::setWiFi(AsyncWebServerRequest* request) { + switch (_networkMethodsMap_enum[request->method()]) { + case POST: { + int params = request->params(); + std::string networkName; + std::string ssid; + std::string password; + uint8_t channel = 0; + uint8_t power = 0; + uint8_t adhoc = 0; - log_d("Number of Params: %d", params); - for (int i = 0; i < params; i++) - { - AsyncWebParameter *param = request->getParam(i); - if (param->name() == "networkName") - { - networkName = param->value().c_str(); - } - else if (param->name() == "ssid") - { - ssid = param->value().c_str(); - } - else if (param->name() == "password") - { - password = param->value().c_str(); - } - else if (param->name() == "channel") - { - channel = (uint8_t)atoi(param->value().c_str()); - } - else if (param->name() == "power") - { - power = (uint8_t)atoi(param->value().c_str()); - } - else if (param->name() == "adhoc") - { - adhoc = (uint8_t)atoi(param->value().c_str()); - } + log_d("Number of Params: %d", params); + for (int i = 0; i < params; i++) { + AsyncWebParameter* param = request->getParam(i); + if (param->name() == "networkName") { + networkName = param->value().c_str(); + } else if (param->name() == "ssid") { + ssid = param->value().c_str(); + } else if (param->name() == "password") { + password = param->value().c_str(); + } else if (param->name() == "channel") { + channel = (uint8_t)atoi(param->value().c_str()); + } else if (param->name() == "power") { + power = (uint8_t)atoi(param->value().c_str()); + } else if (param->name() == "adhoc") { + adhoc = (uint8_t)atoi(param->value().c_str()); + } - log_i("%s[%s]: %s\n", _networkMethodsMap[request->method()].c_str(), param->name().c_str(), param->value().c_str()); - } - // note: We're passing empty params by design, this is done to reset specific fields - projectConfig->setWifiConfig(networkName, ssid, password, &channel, &power, adhoc, true); + log_i("%s[%s]: %s\n", _networkMethodsMap[request->method()].c_str(), + param->name().c_str(), param->value().c_str()); + } + // note: We're passing empty params by design, this is done to reset + // specific fields + projectConfig->setWifiConfig(networkName, ssid, password, &channel, + &power, adhoc, true); - /* if (WiFiStateManager->getCurrentState() == WiFiState_e::WiFiState_ADHOC) - { - projectConfig->setAPWifiConfig(ssid, password, &channel, adhoc, true); - } - else - { + /* if (WiFiStateManager->getCurrentState() == + WiFiState_e::WiFiState_ADHOC) + { + projectConfig->setAPWifiConfig(ssid, password, &channel, adhoc, + true); + } + else + { - } */ + } */ - request->send(200, MIMETYPE_JSON, "{\"msg\":\"Done. Wifi Creds have been set.\"}"); - break; - } - default: - { - request->send(400, MIMETYPE_JSON, "{\"msg\":\"Invalid Request\"}"); - request->redirect("/"); - break; - } - } + request->send(200, MIMETYPE_JSON, + "{\"msg\":\"Done. Wifi Creds have been set.\"}"); + break; + } + default: { + request->send(400, MIMETYPE_JSON, "{\"msg\":\"Invalid Request\"}"); + request->redirect("/"); + break; + } + } } -void BaseAPI::getJsonConfig(AsyncWebServerRequest *request) -{ - // returns the current stored config in case it get's deleted on the PC. - switch (_networkMethodsMap_enum[request->method()]) - { - case GET: - { - std::string wifiConfigSerialized = "\"wifi_config\": ["; - auto networksConfigs = projectConfig->getWifiConfigs(); - for (auto networkIterator = networksConfigs->begin(); networkIterator != networksConfigs->end(); networkIterator++) - { - wifiConfigSerialized += networkIterator->toRepresentation() + (std::next(networkIterator) != networksConfigs->end() ? "," : ""); - } - wifiConfigSerialized += "]"; +void BaseAPI::getJsonConfig(AsyncWebServerRequest* request) { + // returns the current stored config in case it get's deleted on the PC. + switch (_networkMethodsMap_enum[request->method()]) { + case GET: { + std::string wifiConfigSerialized = "\"wifi_config\": ["; + auto networksConfigs = projectConfig->getWifiConfigs(); + for (auto networkIterator = networksConfigs->begin(); + networkIterator != networksConfigs->end(); networkIterator++) { + wifiConfigSerialized += + networkIterator->toRepresentation() + + (std::next(networkIterator) != networksConfigs->end() ? "," : ""); + } + wifiConfigSerialized += "]"; - std::string json = Helpers::format_string( - "{%s, %s, %s, %s, %s}", - projectConfig->getDeviceConfig()->toRepresentation().c_str(), - projectConfig->getCameraConfig()->toRepresentation().c_str(), - wifiConfigSerialized.c_str(), - projectConfig->getMDNSConfig()->toRepresentation().c_str(), - projectConfig->getAPWifiConfig()->toRepresentation().c_str()); - request->send(200, MIMETYPE_JSON, json.c_str()); - break; - } - default: - { - request->send(400, MIMETYPE_JSON, "{\"msg\":\"Invalid Request\"}"); - break; - } - } + std::string json = Helpers::format_string( + "{%s, %s, %s, %s, %s}", + projectConfig->getDeviceConfig()->toRepresentation().c_str(), + projectConfig->getCameraConfig()->toRepresentation().c_str(), + wifiConfigSerialized.c_str(), + projectConfig->getMDNSConfig()->toRepresentation().c_str(), + projectConfig->getAPWifiConfig()->toRepresentation().c_str()); + request->send(200, MIMETYPE_JSON, json.c_str()); + break; + } + default: { + request->send(400, MIMETYPE_JSON, "{\"msg\":\"Invalid Request\"}"); + break; + } + } } -void BaseAPI::setDeviceConfig(AsyncWebServerRequest *request) -{ - switch (_networkMethodsMap_enum[request->method()]) - { - case GET: - { - request->send(400, MIMETYPE_JSON, "{\"msg\":\"Invalid Request\"}"); - break; - } - case POST: - { - int params = request->params(); +void BaseAPI::setDeviceConfig(AsyncWebServerRequest* request) { + switch (_networkMethodsMap_enum[request->method()]) { + case GET: { + request->send(400, MIMETYPE_JSON, "{\"msg\":\"Invalid Request\"}"); + break; + } + case POST: { + int params = request->params(); - std::string hostname; - std::string service; - std::string ota_password; - std::string firmware_name; - int ota_port; + std::string hostname; + std::string service; + std::string ota_password; + std::string firmware_name; + int ota_port; - for (int i = 0; i < params; i++) - { - AsyncWebParameter *param = request->getParam(i); - if (param->name() == "hostname") - { - hostname.assign(param->value().c_str()); - } - else if (param->name() == "service") - { - service.assign(param->value().c_str()); - } - else if (param->name() == "ota_port") - { - ota_port = atoi(param->value().c_str()); - } - else if (param->name() == "ota_password") - { - ota_password.assign(param->value().c_str()); - } - else if (param->name() == "firmware_name") - { - firmware_name.assign(param->value().c_str()); - } - } - // note: We're passing empty params by design, this is done to reset specific fields - projectConfig->setDeviceConfig(ota_password, ota_port, firmware_name, true); - projectConfig->setMDNSConfig(hostname, service, true); - request->send(200, MIMETYPE_JSON, "{\"msg\":\"Done. Device Config has been set.\"}"); - } - } + for (int i = 0; i < params; i++) { + AsyncWebParameter* param = request->getParam(i); + if (param->name() == "hostname") { + hostname.assign(param->value().c_str()); + } else if (param->name() == "service") { + service.assign(param->value().c_str()); + } else if (param->name() == "ota_port") { + ota_port = atoi(param->value().c_str()); + } else if (param->name() == "ota_password") { + ota_password.assign(param->value().c_str()); + } else if (param->name() == "firmware_name") { + firmware_name.assign(param->value().c_str()); + } + } + // note: We're passing empty params by design, this is done to reset + // specific fields + projectConfig->setDeviceConfig(ota_password, ota_port, firmware_name, + true); + projectConfig->setMDNSConfig(hostname, service, true); + request->send(200, MIMETYPE_JSON, + "{\"msg\":\"Done. Device Config has been set.\"}"); + } + } } -void BaseAPI::setWiFiTXPower(AsyncWebServerRequest *request) -{ - switch (_networkMethodsMap_enum[request->method()]) - { - case GET: - { - int params = request->params(); +void BaseAPI::setWiFiTXPower(AsyncWebServerRequest* request) { + switch (_networkMethodsMap_enum[request->method()]) { + case GET: { + int params = request->params(); - uint8_t txPower = 0; + uint8_t txPower = 0; - for (int i = 0; i < params; i++) - { - AsyncWebParameter *param = request->getParam(i); - if (param->name() == "txPower") - { - txPower = atoi(param->value().c_str()); - } - } - projectConfig->setWiFiTxPower(&txPower, true); - projectConfig->wifiTxPowerConfigSave(); - request->send(200, MIMETYPE_JSON, "{\"msg\":\"Done. TX Power has been set.\"}"); - break; - } - case POST: - { - int params = request->params(); + for (int i = 0; i < params; i++) { + AsyncWebParameter* param = request->getParam(i); + if (param->name() == "txPower") { + txPower = atoi(param->value().c_str()); + } + } + projectConfig->setWiFiTxPower(&txPower, true); + projectConfig->wifiTxPowerConfigSave(); + request->send(200, MIMETYPE_JSON, + "{\"msg\":\"Done. TX Power has been set.\"}"); + break; + } + case POST: { + int params = request->params(); - uint8_t txPower = 0; + uint8_t txPower = 0; - for (int i = 0; i < params; i++) - { - AsyncWebParameter *param = request->getParam(i); - if (param->name() == "txPower") - { - txPower = atoi(param->value().c_str()); - } - } - projectConfig->setWiFiTxPower(&txPower, true); - projectConfig->wifiTxPowerConfigSave(); - request->send(200, MIMETYPE_JSON, "{\"msg\":\"Done. TX Power has been set.\"}"); - } - } + for (int i = 0; i < params; i++) { + AsyncWebParameter* param = request->getParam(i); + if (param->name() == "txPower") { + txPower = atoi(param->value().c_str()); + } + } + projectConfig->setWiFiTxPower(&txPower, true); + projectConfig->wifiTxPowerConfigSave(); + request->send(200, MIMETYPE_JSON, + "{\"msg\":\"Done. TX Power has been set.\"}"); + } + } } -void BaseAPI::rebootDevice(AsyncWebServerRequest *request) -{ - switch (_networkMethodsMap_enum[request->method()]) - { - case GET: - { - request->send(200, MIMETYPE_JSON, "{\"msg\":\"Rebooting Device\"}"); - OpenIrisTasks::ScheduleRestart(2000); - } - default: - { - request->send(400, MIMETYPE_JSON, "{\"msg\":\"Invalid Request\"}"); - break; - } - } +void BaseAPI::rebootDevice(AsyncWebServerRequest* request) { + switch (_networkMethodsMap_enum[request->method()]) { + case GET: { + request->send(200, MIMETYPE_JSON, "{\"msg\":\"Rebooting Device\"}"); + OpenIrisTasks::ScheduleRestart(2000); + } + default: { + request->send(400, MIMETYPE_JSON, "{\"msg\":\"Invalid Request\"}"); + break; + } + } } -void BaseAPI::factoryReset(AsyncWebServerRequest *request) -{ - switch (_networkMethodsMap_enum[request->method()]) - { - case GET: - { - log_d("Factory Reset"); - projectConfig->reset(); - request->send(200, MIMETYPE_JSON, "{\"msg\":\"Factory Reset\"}"); - } - default: - { - request->send(400, MIMETYPE_JSON, "{\"msg\":\"Invalid Request\"}"); - break; - } - } +void BaseAPI::factoryReset(AsyncWebServerRequest* request) { + switch (_networkMethodsMap_enum[request->method()]) { + case GET: { + log_d("Factory Reset"); + projectConfig->reset(); + request->send(200, MIMETYPE_JSON, "{\"msg\":\"Factory Reset\"}"); + } + default: { + request->send(400, MIMETYPE_JSON, "{\"msg\":\"Invalid Request\"}"); + break; + } + } } - //********************************************************************************************* //! Camera Command Functions //********************************************************************************************* -void BaseAPI::setCamera(AsyncWebServerRequest *request) -{ - switch (_networkMethodsMap_enum[request->method()]) - { - case GET: - { - // create temporary variables to store the values - uint8_t temp_camera_framesize = 0; - uint8_t temp_camera_vflip = 0; - uint8_t temp_camera_hflip = 0; - uint8_t temp_camera_quality = 0; - uint8_t temp_camera_brightness = 0; +void BaseAPI::setCamera(AsyncWebServerRequest* request) { + switch (_networkMethodsMap_enum[request->method()]) { + case GET: { + // create temporary variables to store the values + uint8_t temp_camera_framesize = 0; + uint8_t temp_camera_vflip = 0; + uint8_t temp_camera_hflip = 0; + uint8_t temp_camera_quality = 0; + uint8_t temp_camera_brightness = 0; - int params = request->params(); - //! Using the else if statements to ensure that the values do not need to be set in a specific order - //! This means the order of the URL params does not matter - for (int i = 0; i < params; i++) - { - AsyncWebParameter *param = request->getParam(i); - if (param->name() == "framesize") - { - temp_camera_framesize = (uint8_t)param->value().toInt(); - } - else if (param->name() == "vflip") - { - temp_camera_vflip = (uint8_t)param->value().toInt(); - } - else if (param->name() == "hflip") - { - temp_camera_hflip = (uint8_t)param->value().toInt(); - } - else if (param->name() == "quality") - { - temp_camera_quality = (uint8_t)param->value().toInt(); - } - else if (param->name() == "brightness") - { - temp_camera_brightness = (uint8_t)param->value().toInt(); - } - } - // note: We're passing empty params by design, this is done to reset specific fields - projectConfig->setCameraConfig(&temp_camera_vflip, &temp_camera_framesize, &temp_camera_hflip, &temp_camera_quality, &temp_camera_brightness, true); + int params = request->params(); + //! Using the else if statements to ensure that the values do not need to + //! be set in a specific order This means the order of the URL params does + //! not matter + for (int i = 0; i < params; i++) { + AsyncWebParameter* param = request->getParam(i); + if (param->name() == "framesize") { + temp_camera_framesize = (uint8_t)param->value().toInt(); + } else if (param->name() == "vflip") { + temp_camera_vflip = (uint8_t)param->value().toInt(); + } else if (param->name() == "hflip") { + temp_camera_hflip = (uint8_t)param->value().toInt(); + } else if (param->name() == "quality") { + temp_camera_quality = (uint8_t)param->value().toInt(); + } else if (param->name() == "brightness") { + temp_camera_brightness = (uint8_t)param->value().toInt(); + } + } + // note: We're passing empty params by design, this is done to reset + // specific fields + projectConfig->setCameraConfig(&temp_camera_vflip, &temp_camera_framesize, + &temp_camera_hflip, &temp_camera_quality, + &temp_camera_brightness, true); - request->send(200, MIMETYPE_JSON, "{\"msg\":\"Done. Camera Settings have been set.\"}"); - break; - } - default: - { - request->send(400, MIMETYPE_JSON, "{\"msg\":\"Invalid Request\"}"); - request->redirect("/"); - break; - } - } + request->send(200, MIMETYPE_JSON, + "{\"msg\":\"Done. Camera Settings have been set.\"}"); + break; + } + default: { + request->send(400, MIMETYPE_JSON, "{\"msg\":\"Invalid Request\"}"); + request->redirect("/"); + break; + } + } } -void BaseAPI::restartCamera(AsyncWebServerRequest *request) -{ - bool mode = (bool)atoi(request->arg("mode").c_str()); - camera->resetCamera(mode); +void BaseAPI::restartCamera(AsyncWebServerRequest* request) { + bool mode = (bool)atoi(request->arg("mode").c_str()); + camera->resetCamera(mode); - request->send(200, MIMETYPE_JSON, "{\"msg\":\"Done. Camera had been restarted.\"}"); + request->send(200, MIMETYPE_JSON, + "{\"msg\":\"Done. Camera had been restarted.\"}"); } -void BaseAPI::ping(AsyncWebServerRequest *request) -{ - request->send(200, MIMETYPE_JSON, "{\"msg\": \"ok\" }"); +void BaseAPI::ping(AsyncWebServerRequest* request) { + request->send(200, MIMETYPE_JSON, "{\"msg\": \"ok\" }"); } -void BaseAPI::save(AsyncWebServerRequest *request) -{ - projectConfig->save(); - request->send(200, MIMETYPE_JSON, "{\"msg\": \"ok\" }"); +void BaseAPI::save(AsyncWebServerRequest* request) { + projectConfig->save(); + request->send(200, MIMETYPE_JSON, "{\"msg\": \"ok\" }"); +} + +void BaseAPI::rssi(AsyncWebServerRequest* request) { + int rssi = Network_Utilities::getStrength( + request->getParam("points")->value().toInt()); + char _rssiBuffer[20]; + snprintf(_rssiBuffer, sizeof(_rssiBuffer), "{\"rssi\": %d }", rssi); + request->send(200, MIMETYPE_JSON, _rssiBuffer); } diff --git a/ESP/lib/src/network/api/baseAPI/baseAPI.hpp b/ESP/lib/src/network/api/baseAPI/baseAPI.hpp index d870ad3..473f8bc 100644 --- a/ESP/lib/src/network/api/baseAPI/baseAPI.hpp +++ b/ESP/lib/src/network/api/baseAPI/baseAPI.hpp @@ -51,6 +51,7 @@ protected: void rebootDevice(AsyncWebServerRequest *request); void ping(AsyncWebServerRequest *request); void save(AsyncWebServerRequest *request); + void rssi(AsyncWebServerRequest *request); /* Camera Handlers */ void setCamera(AsyncWebServerRequest *request); diff --git a/ESP/lib/src/network/api/webserverHandler.cpp b/ESP/lib/src/network/api/webserverHandler.cpp index 97e477a..4bab62c 100644 --- a/ESP/lib/src/network/api/webserverHandler.cpp +++ b/ESP/lib/src/network/api/webserverHandler.cpp @@ -5,56 +5,57 @@ //********************************************************************************************* APIServer::APIServer(int CONTROL_PORT, - ProjectConfig *projectConfig, - CameraHandler *camera, - StateManager *wiFiStateManager, - const std::string &api_url) : BaseAPI(CONTROL_PORT, - projectConfig, - camera, - wiFiStateManager, - api_url) {} + ProjectConfig* projectConfig, + CameraHandler* camera, + StateManager* wiFiStateManager, + const std::string& api_url) + : BaseAPI(CONTROL_PORT, projectConfig, camera, wiFiStateManager, api_url) {} APIServer::~APIServer() {} -void APIServer::begin() -{ - log_d("Initializing REST API Server"); - this->setupServer(); - BaseAPI::begin(); +void APIServer::begin() { + log_d("Initializing REST API Server"); + this->setupServer(); + BaseAPI::begin(); - char buffer[1000]; - snprintf(buffer, sizeof(buffer), "^\\%s\\/([a-zA-Z0-9]+)\\/command\\/([a-zA-Z0-9]+)$", this->api_url.c_str()); - log_d("API URL: %s", buffer); - server.on(buffer, 0b01111111, [&](AsyncWebServerRequest *request) - { handleRequest(request); }); - server.begin(); + char buffer[1000]; + snprintf(buffer, sizeof(buffer), + "^\\%s\\/([a-zA-Z0-9]+)\\/command\\/([a-zA-Z0-9]+)$", + this->api_url.c_str()); + log_d("API URL: %s", buffer); + server.on(buffer, 0b01111111, + [&](AsyncWebServerRequest* request) { handleRequest(request); }); + server.begin(); } -void APIServer::setupServer() -{ - routes.emplace("wifi", &APIServer::setWiFi); - routes.emplace("resetConfig", &APIServer::factoryReset); - routes.emplace("setDevice", &APIServer::setDeviceConfig); - routes.emplace("rebootDevice", &APIServer::rebootDevice); - routes.emplace("getStoredConfig", &APIServer::getJsonConfig); - routes.emplace("setTxPower", &APIServer::setWiFiTXPower); - // Camera Routes - routes.emplace("setCamera", &APIServer::setCamera); - routes.emplace("restartCamera", &APIServer::restartCamera); - routes.emplace("ping", &APIServer::ping); - routes.emplace("save", &APIServer::save); +void APIServer::setupServer() { + routes.emplace("wifi", &APIServer::setWiFi); + routes.emplace("resetConfig", &APIServer::factoryReset); + routes.emplace("setDevice", &APIServer::setDeviceConfig); + routes.emplace("rebootDevice", &APIServer::rebootDevice); + routes.emplace("getStoredConfig", &APIServer::getJsonConfig); + routes.emplace("setTxPower", &APIServer::setWiFiTXPower); + // Camera Routes + routes.emplace("setCamera", &APIServer::setCamera); + routes.emplace("restartCamera", &APIServer::restartCamera); + routes.emplace("ping", &APIServer::ping); + routes.emplace("save", &APIServer::save); + routes.emplace("wifiStrength", &APIServer::rssi); - //! reserve enough memory for all routes - must be called after adding routes and before adding routes to route_map - indexes.reserve(routes.size()); // this is done to avoid reallocation of memory and copying of data - addRouteMap("builtin", routes, indexes); // add new route map to the route_map + //! reserve enough memory for all routes - must be called after adding routes + //! and before adding routes to route_map + indexes.reserve(routes.size()); // this is done to avoid reallocation of + // memory and copying of data + addRouteMap("builtin", routes, + indexes); // add new route map to the route_map } -void APIServer::findParam(AsyncWebServerRequest *request, const char *param, std::string &value) -{ - if (request->hasParam(param)) - { - value = request->getParam(param)->value().c_str(); - } +void APIServer::findParam(AsyncWebServerRequest* request, + const char* param, + std::string& value) { + if (request->hasParam(param)) { + value = request->getParam(param)->value().c_str(); + } } /** @@ -62,56 +63,48 @@ void APIServer::findParam(AsyncWebServerRequest *request, const char *param, std * * @param index * @param funct - * @param indexes \c std::vector a list of the routes of the command handlers + * @param indexes \c std::vector a list of the routes of the + * command handlers * * @return void * */ -void APIServer::addRouteMap(const std::string &index, route_t route, std::vector &indexes) -{ - route_map.emplace(index, route); +void APIServer::addRouteMap(const std::string& index, + route_t route, + std::vector& indexes) { + route_map.emplace(index, route); - for (const auto &key : route) - { - indexes.emplace_back(key.first); // add the route to the list of routes - use emplace_back to avoid copying - } + for (const auto& key : route) { + indexes.emplace_back(key.first); // add the route to the list of routes - + // use emplace_back to avoid copying + } } -void APIServer::handleRequest(AsyncWebServerRequest *request) -{ - try - { - // Get the route - log_i("Request URL: %s", request->url().c_str()); - log_i("Request: %s", request->pathArg(0).c_str()); - log_i("Request: %s", request->pathArg(1).c_str()); +void APIServer::handleRequest(AsyncWebServerRequest* request) { + try { + // Get the route + log_i("Request URL: %s", request->url().c_str()); + log_i("Request: %s", request->pathArg(0).c_str()); + log_i("Request: %s", request->pathArg(1).c_str()); - auto it_map = route_map.find(request->pathArg(0).c_str()); - auto it_method = it_map->second.find(request->pathArg(1).c_str()); + auto it_map = route_map.find(request->pathArg(0).c_str()); + auto it_method = it_map->second.find(request->pathArg(1).c_str()); - if (it_map != route_map.end()) - { - if (it_method != it_map->second.end()) - { - log_d("We are trying to execute the function"); - (*this.*(it_method->second))(request); - } - else - { - log_e("Invalid Command"); - request->send(400, MIMETYPE_JSON, "{\"msg\":\"Invalid Command\"}"); - return; - } - } - else - { - log_e("Invalid Map Index"); - request->send(400, MIMETYPE_JSON, "{\"msg\":\"Invalid Map Index\"}"); - return; - } - } - catch (...) - { - log_e("Error handling request"); - } + if (it_map != route_map.end()) { + if (it_method != it_map->second.end()) { + log_d("We are trying to execute the function"); + (*this.*(it_method->second))(request); + } else { + log_e("Invalid Command"); + request->send(400, MIMETYPE_JSON, "{\"msg\":\"Invalid Command\"}"); + return; + } + } else { + log_e("Invalid Map Index"); + request->send(400, MIMETYPE_JSON, "{\"msg\":\"Invalid Map Index\"}"); + return; + } + } catch (...) { + log_e("Error handling request"); + } }