From 9f3c4ffdf2948f88e95f50a63b868dea45bf5a53 Mon Sep 17 00:00:00 2001 From: Rune Harlyk Date: Fri, 1 Nov 2024 13:41:24 +0100 Subject: [PATCH] =?UTF-8?q?=F0=9F=8E=9B=EF=B8=8F=20Adds=20system=20service?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/statusbar/SleepButton.svelte | 2 +- .../routes/system/status/SystemStatus.svelte | 6 +- esp32/factory_settings.ini | 6 +- esp32/lib/ESP32-sveltekit/ESP32SvelteKit.cpp | 13 +- esp32/lib/ESP32-sveltekit/ESP32SvelteKit.h | 16 -- .../ESP32-sveltekit/FactoryResetService.cpp | 45 ------ .../lib/ESP32-sveltekit/FactoryResetService.h | 41 ----- esp32/lib/ESP32-sveltekit/RestartService.cpp | 29 ---- esp32/lib/ESP32-sveltekit/RestartService.h | 41 ----- esp32/lib/ESP32-sveltekit/SleepService.cpp | 64 -------- esp32/lib/ESP32-sveltekit/SleepService.h | 47 ------ esp32/lib/ESP32-sveltekit/SystemStatus.cpp | 75 --------- esp32/lib/ESP32-sveltekit/SystemStatus.h | 71 --------- .../ESP32-sveltekit/UploadFirmwareService.cpp | 2 +- .../ESP32-sveltekit/UploadFirmwareService.h | 2 +- esp32/lib/ESP32-sveltekit/global.h | 49 ++++++ esp32/lib/ESP32-sveltekit/system_service.cpp | 145 ++++++++++++++++++ esp32/lib/ESP32-sveltekit/system_service.h | 25 +++ 18 files changed, 237 insertions(+), 442 deletions(-) delete mode 100644 esp32/lib/ESP32-sveltekit/FactoryResetService.cpp delete mode 100644 esp32/lib/ESP32-sveltekit/FactoryResetService.h delete mode 100644 esp32/lib/ESP32-sveltekit/RestartService.cpp delete mode 100644 esp32/lib/ESP32-sveltekit/RestartService.h delete mode 100644 esp32/lib/ESP32-sveltekit/SleepService.cpp delete mode 100644 esp32/lib/ESP32-sveltekit/SleepService.h delete mode 100644 esp32/lib/ESP32-sveltekit/SystemStatus.cpp delete mode 100644 esp32/lib/ESP32-sveltekit/SystemStatus.h create mode 100644 esp32/lib/ESP32-sveltekit/global.h create mode 100644 esp32/lib/ESP32-sveltekit/system_service.cpp create mode 100644 esp32/lib/ESP32-sveltekit/system_service.h diff --git a/app/src/lib/components/statusbar/SleepButton.svelte b/app/src/lib/components/statusbar/SleepButton.svelte index 53c6015..bbca04b 100644 --- a/app/src/lib/components/statusbar/SleepButton.svelte +++ b/app/src/lib/components/statusbar/SleepButton.svelte @@ -7,7 +7,7 @@ const features = useFeatureFlags(); - const postSleep = async () => await api.post('/api/sleep'); + const postSleep = async () => await api.post('/api/system/sleep'); const confirmSleep = () => { openModal(ConfirmDialog, { diff --git a/app/src/routes/system/status/SystemStatus.svelte b/app/src/routes/system/status/SystemStatus.svelte index 10c022f..c893712 100644 --- a/app/src/routes/system/status/SystemStatus.svelte +++ b/app/src/routes/system/status/SystemStatus.svelte @@ -37,7 +37,7 @@ let systemInformation: SystemInformation; async function getSystemStatus() { - const result = await api.get('/api/systemStatus'); + const result = await api.get('/api/system/status'); if (result.isErr()) { console.error('Error:', result.inner); return; @@ -46,7 +46,7 @@ return systemInformation; } - const postFactoryReset = async () => await api.post('/api/factoryReset'); + const postFactoryReset = async () => await api.post('/api/system/reset'); const postSleep = async () => await api.post('api/sleep'); @@ -57,7 +57,7 @@ const handleSystemData = (data: Analytics) => (systemInformation = { ...systemInformation, ...data }); - const postRestart = async () => await api.post('/api/restart'); + const postRestart = async () => await api.post('/api/system/restart'); function confirmRestart() { openModal(ConfirmDialog, { diff --git a/esp32/factory_settings.ini b/esp32/factory_settings.ini index 5ac0e5d..003a359 100644 --- a/esp32/factory_settings.ini +++ b/esp32/factory_settings.ini @@ -43,4 +43,8 @@ build_flags = -D FACTORY_SERVO_NUM=12 -D FACTORY_SERVO_OSCILLATOR_FREQUENCY=27000000 -D FACTORY_SERVO_PWM_FREQUENCY=50 - -D FACTORY_SERVO_CENTER_ANGLE=90 \ No newline at end of file + -D FACTORY_SERVO_CENTER_ANGLE=90 + + ; Deep Sleep Configuration + -D WAKEUP_PIN_NUMBER=38 ; pin number to wake up the ESP + -D WAKEUP_SIGNAL=0 ; 1 for wakeup on HIGH, 0 for wakeup on LOW \ No newline at end of file diff --git a/esp32/lib/ESP32-sveltekit/ESP32SvelteKit.cpp b/esp32/lib/ESP32-sveltekit/ESP32SvelteKit.cpp index a4a02ed..dd4e308 100644 --- a/esp32/lib/ESP32-sveltekit/ESP32SvelteKit.cpp +++ b/esp32/lib/ESP32-sveltekit/ESP32SvelteKit.cpp @@ -44,9 +44,6 @@ ESP32SvelteKit::ESP32SvelteKit(PsychicHttpServer *server, unsigned int numberEnd _cameraService(server, &_taskManager), _cameraSettingsService(server, &ESPFS, &_socket), #endif - _restartService(server), - _factoryResetService(server, &ESPFS), - _systemStatus(server), _fileExplorer(server), _servoController(server, &ESPFS, &_peripherals, &_socket), #if FT_ENABLED(USE_MOTION) @@ -100,6 +97,13 @@ void ESP32SvelteKit::setupServer() { return _apService.endpoint.handleStateUpdate(request, json); }); + // SYSTEM + _server->on("/api/system/reset", HTTP_POST, system_service::handleReset); + _server->on("/api/system/restart", HTTP_POST, system_service::handleRestart); + _server->on("/api/system/sleep", HTTP_POST, system_service::handleSleep); + _server->on("/api/system/status", HTTP_GET, system_service::getStatus); + _server->on("/api/system/metrics", HTTP_GET, system_service::getMetrics); + // servo _server->on("/api/servo/config", HTTP_GET, [this](PsychicRequest *request) { return _servoController.endpoint.getState(request); }); @@ -169,10 +173,7 @@ void ESP32SvelteKit::setupMDNS() { void ESP32SvelteKit::startServices() { _apService.begin(); _socket.begin(); - _factoryResetService.begin(); _featureService.begin(); - _restartService.begin(); - _systemStatus.begin(); #if FT_ENABLED(USE_UPLOAD_FIRMWARE) _uploadFirmwareService.begin(); diff --git a/esp32/lib/ESP32-sveltekit/ESP32SvelteKit.h b/esp32/lib/ESP32-sveltekit/ESP32SvelteKit.h index 0724699..dabea77 100644 --- a/esp32/lib/ESP32-sveltekit/ESP32SvelteKit.h +++ b/esp32/lib/ESP32-sveltekit/ESP32SvelteKit.h @@ -28,7 +28,6 @@ #include #include #include -#include #include #include #include @@ -36,9 +35,6 @@ #include #include #include -#include -#include -#include #include #include #include @@ -82,10 +78,6 @@ class ESP32SvelteKit { StatefulService *getNTPSettingsService() { return &_ntpSettingsService; } #endif -#if FT_ENABLED(USE_SLEEP) - SleepService *getSleepService() { return &_sleepService; } -#endif - #if FT_ENABLED(USE_BATTERY) BatteryService *getBatteryService() { return &_batteryService; } #endif @@ -111,8 +103,6 @@ class ESP32SvelteKit { ServoController *getServoController() { return &_servoController; } #endif - void factoryReset() { _factoryResetService.factoryReset(); } - void setMDNSAppName(String name) { _appName = name; } void recoveryMode() { _apService.recoveryMode(); } @@ -136,18 +126,12 @@ class ESP32SvelteKit { #if FT_ENABLED(USE_DOWNLOAD_FIRMWARE) DownloadFirmwareService _downloadFirmwareService; #endif -#if FT_ENABLED(USE_SLEEP) - SleepService _sleepService; -#endif #if FT_ENABLED(USE_BATTERY) BatteryService _batteryService; #endif #if FT_ENABLED(USE_ANALYTICS) AnalyticsService _analyticsService; #endif - RestartService _restartService; - FactoryResetService _factoryResetService; - SystemStatus _systemStatus; TaskManager _taskManager; FileExplorer _fileExplorer; #if FT_ENABLED(USE_MOTION) diff --git a/esp32/lib/ESP32-sveltekit/FactoryResetService.cpp b/esp32/lib/ESP32-sveltekit/FactoryResetService.cpp deleted file mode 100644 index b30feb9..0000000 --- a/esp32/lib/ESP32-sveltekit/FactoryResetService.cpp +++ /dev/null @@ -1,45 +0,0 @@ -/** - * ESP32 SvelteKit - * - * A simple, secure and extensible framework for IoT projects for ESP32 platforms - * with responsive Sveltekit front-end built with TailwindCSS and DaisyUI. - * https://github.com/theelims/ESP32-sveltekit - * - * Copyright (C) 2018 - 2023 rjwats - * Copyright (C) 2023 theelims - * - * All Rights Reserved. This software may be modified and distributed under - * the terms of the LGPL v3 license. See the LICENSE file for details. - **/ - -#include - -FactoryResetService::FactoryResetService(PsychicHttpServer *server, FS *fs) : _server(server), fs(fs) {} - -void FactoryResetService::begin() { - _server->on(FACTORY_RESET_SERVICE_PATH, HTTP_POST, - [this](PsychicRequest *request) { return handleRequest(request); }); - - ESP_LOGV("FactoryResetService", "Registered POST endpoint: %s", FACTORY_RESET_SERVICE_PATH); -} - -esp_err_t FactoryResetService::handleRequest(PsychicRequest *request) { - request->reply(200); - factoryReset(); - - return ESP_OK; -} - -/** - * Delete function assumes that all files are stored flat, within the config directory. - */ -void FactoryResetService::factoryReset() { - File root = fs->open(FS_CONFIG_DIRECTORY); - File file; - while (file = root.openNextFile()) { - String path = file.path(); - file.close(); - fs->remove(path); - } - RestartService::restartNow(); -} diff --git a/esp32/lib/ESP32-sveltekit/FactoryResetService.h b/esp32/lib/ESP32-sveltekit/FactoryResetService.h deleted file mode 100644 index 18a9f1f..0000000 --- a/esp32/lib/ESP32-sveltekit/FactoryResetService.h +++ /dev/null @@ -1,41 +0,0 @@ -#ifndef FactoryResetService_h -#define FactoryResetService_h - -/** - * ESP32 SvelteKit - * - * A simple, secure and extensible framework for IoT projects for ESP32 platforms - * with responsive Sveltekit front-end built with TailwindCSS and DaisyUI. - * https://github.com/theelims/ESP32-sveltekit - * - * Copyright (C) 2018 - 2023 rjwats - * Copyright (C) 2023 theelims - * - * All Rights Reserved. This software may be modified and distributed under - * the terms of the LGPL v3 license. See the LICENSE file for details. - **/ - -#include - -#include -#include -#include -#include - -#define FACTORY_RESET_SERVICE_PATH "/api/factoryReset" - -class FactoryResetService { - FS *fs; - - public: - FactoryResetService(PsychicHttpServer *server, FS *fs); - - void begin(); - void factoryReset(); - - private: - PsychicHttpServer *_server; - esp_err_t handleRequest(PsychicRequest *request); -}; - -#endif // end FactoryResetService_h diff --git a/esp32/lib/ESP32-sveltekit/RestartService.cpp b/esp32/lib/ESP32-sveltekit/RestartService.cpp deleted file mode 100644 index 2233287..0000000 --- a/esp32/lib/ESP32-sveltekit/RestartService.cpp +++ /dev/null @@ -1,29 +0,0 @@ -/** - * ESP32 SvelteKit - * - * A simple, secure and extensible framework for IoT projects for ESP32 platforms - * with responsive Sveltekit front-end built with TailwindCSS and DaisyUI. - * https://github.com/theelims/ESP32-sveltekit - * - * Copyright (C) 2018 - 2023 rjwats - * Copyright (C) 2023 theelims - * - * All Rights Reserved. This software may be modified and distributed under - * the terms of the LGPL v3 license. See the LICENSE file for details. - **/ - -#include - -RestartService::RestartService(PsychicHttpServer *server) : _server(server) {} - -void RestartService::begin() { - _server->on(RESTART_SERVICE_PATH, HTTP_POST, [this](PsychicRequest *request) { return restart(request); }); - - ESP_LOGV("RestartService", "Registered POST endpoint: %s", RESTART_SERVICE_PATH); -} - -esp_err_t RestartService::restart(PsychicRequest *request) { - request->reply(200); - restartNow(); - return ESP_OK; -} diff --git a/esp32/lib/ESP32-sveltekit/RestartService.h b/esp32/lib/ESP32-sveltekit/RestartService.h deleted file mode 100644 index 72d9dce..0000000 --- a/esp32/lib/ESP32-sveltekit/RestartService.h +++ /dev/null @@ -1,41 +0,0 @@ -#ifndef RestartService_h -#define RestartService_h - -/** - * ESP32 SvelteKit - * - * A simple, secure and extensible framework for IoT projects for ESP32 platforms - * with responsive Sveltekit front-end built with TailwindCSS and DaisyUI. - * https://github.com/theelims/ESP32-sveltekit - * - * Copyright (C) 2018 - 2023 rjwats - * Copyright (C) 2023 theelims - * - * All Rights Reserved. This software may be modified and distributed under - * the terms of the LGPL v3 license. See the LICENSE file for details. - **/ - -#include - -#include - -#define RESTART_SERVICE_PATH "/api/restart" - -class RestartService { - public: - RestartService(PsychicHttpServer *server); - - void begin(); - - static void restartNow() { - WiFi.disconnect(true); - delay(500); - ESP.restart(); - } - - private: - PsychicHttpServer *_server; - esp_err_t restart(PsychicRequest *request); -}; - -#endif // end RestartService_h diff --git a/esp32/lib/ESP32-sveltekit/SleepService.cpp b/esp32/lib/ESP32-sveltekit/SleepService.cpp deleted file mode 100644 index 829bfd9..0000000 --- a/esp32/lib/ESP32-sveltekit/SleepService.cpp +++ /dev/null @@ -1,64 +0,0 @@ -/** - * ESP32 SvelteKit - * - * A simple, secure and extensible framework for IoT projects for ESP32 platforms - * with responsive Sveltekit front-end built with TailwindCSS and DaisyUI. - * https://github.com/theelims/ESP32-sveltekit - * - * Copyright (C) 2023 theelims - * - * All Rights Reserved. This software may be modified and distributed under - * the terms of the LGPL v3 license. See the LICENSE file for details. - **/ - -#include - -// Definition of static member variable -void (*SleepService::_callbackSleep)() = nullptr; - -SleepService::SleepService(PsychicHttpServer *server) : _server(server) {} - -void SleepService::begin() { - _server->on(SLEEP_SERVICE_PATH, HTTP_POST, [this](PsychicRequest *request) { return sleep(request); }); - - ESP_LOGV("SleepService", "Registered POST endpoint: %s", SLEEP_SERVICE_PATH); -} - -esp_err_t SleepService::sleep(PsychicRequest *request) { - request->reply(200); - sleepNow(); - - return ESP_OK; -} - -void SleepService::sleepNow() { - ESP_LOGI("SleepService", "Going into deep sleep now"); - // Callback for main code sleep preparation - if (_callbackSleep != nullptr) { - _callbackSleep(); - } - delay(100); - - MDNS.end(); - delay(100); - - WiFi.disconnect(true); - delay(500); - - // Prepare ESP for sleep - uint64_t bitmask = (uint64_t)1 << (WAKEUP_PIN_NUMBER); - -// special treatment for ESP32-C3 because of the RISC-V architecture -#ifdef CONFIG_IDF_TARGET_ESP32C3 - esp_deep_sleep_enable_gpio_wakeup(bitmask, (esp_deepsleep_gpio_wake_up_mode_t)WAKEUP_SIGNAL); -#else - esp_sleep_enable_ext1_wakeup(bitmask, (esp_sleep_ext1_wakeup_mode_t)WAKEUP_SIGNAL); - esp_sleep_pd_config(ESP_PD_DOMAIN_RTC_PERIPH, ESP_PD_OPTION_OFF); -#endif - - // Just to be sure - delay(100); - - // Hibernate - esp_deep_sleep_start(); -} diff --git a/esp32/lib/ESP32-sveltekit/SleepService.h b/esp32/lib/ESP32-sveltekit/SleepService.h deleted file mode 100644 index 718760e..0000000 --- a/esp32/lib/ESP32-sveltekit/SleepService.h +++ /dev/null @@ -1,47 +0,0 @@ -#pragma once - -/** - * ESP32 SvelteKit - * - * A simple, secure and extensible framework for IoT projects for ESP32 platforms - * with responsive Sveltekit front-end built with TailwindCSS and DaisyUI. - * https://github.com/theelims/ESP32-sveltekit - * - * Copyright (C) 2023 theelims - * - * All Rights Reserved. This software may be modified and distributed under - * the terms of the LGPL v3 license. See the LICENSE file for details. - **/ - -#include -#include - -#include - -#define SLEEP_SERVICE_PATH "/api/sleep" - -#ifndef WAKEUP_PIN_NUMBER -#define WAKEUP_PIN_NUMBER 0 -#endif - -#ifndef WAKEUP_SIGNAL -#define WAKEUP_SIGNAL 0 -#endif - -class SleepService { - public: - SleepService(PsychicHttpServer *server); - - void begin(); - - static void sleepNow(); - - void attachOnSleepCallback(void (*callbackSleep)()) { _callbackSleep = callbackSleep; } - - private: - PsychicHttpServer *_server; - esp_err_t sleep(PsychicRequest *request); - - protected: - static void (*_callbackSleep)(); -}; diff --git a/esp32/lib/ESP32-sveltekit/SystemStatus.cpp b/esp32/lib/ESP32-sveltekit/SystemStatus.cpp deleted file mode 100644 index 7190453..0000000 --- a/esp32/lib/ESP32-sveltekit/SystemStatus.cpp +++ /dev/null @@ -1,75 +0,0 @@ -/** - * ESP32 SvelteKit - * - * A simple, secure and extensible framework for IoT projects for ESP32 platforms - * with responsive Sveltekit front-end built with TailwindCSS and DaisyUI. - * https://github.com/theelims/ESP32-sveltekit - * - * Copyright (C) 2018 - 2023 rjwats - * Copyright (C) 2023 theelims - * - * All Rights Reserved. This software may be modified and distributed under - * the terms of the LGPL v3 license. See the LICENSE file for details. - **/ - -#include - -String verbosePrintResetReason(int reason) { - switch (reason) { - case 1: return ("Vbat power on reset"); break; - case 3: return ("Software reset digital core"); break; - case 4: return ("Legacy watch dog reset digital core"); break; - case 5: return ("Deep Sleep reset digital core"); break; - case 6: return ("Reset by SLC module, reset digital core"); break; - case 7: return ("Timer Group0 Watch dog reset digital core"); break; - case 8: return ("Timer Group1 Watch dog reset digital core"); break; - case 9: return ("RTC Watch dog Reset digital core"); break; - case 10: return ("Intrusion tested to reset CPU"); break; - case 11: return ("Time Group reset CPU"); break; - case 12: return ("Software reset CPU"); break; - case 13: return ("RTC Watch dog Reset CPU"); break; - case 14: return ("for APP CPU, reseted by PRO CPU"); break; - case 15: return ("Reset when the vdd voltage is not stable"); break; - case 16: return ("RTC Watch dog reset digital core and rtc module"); break; - default: return ("NO_MEAN"); - } -} - -SystemStatus::SystemStatus(PsychicHttpServer *server) : _server(server) {} - -void SystemStatus::begin() { - _server->on(SYSTEM_STATUS_SERVICE_PATH, HTTP_GET, - [this](PsychicRequest *request) { return SystemStatus::systemStatus(request); }); - - ESP_LOGV("SystemStatus", "Registered GET endpoint: %s", SYSTEM_STATUS_SERVICE_PATH); -} - -esp_err_t SystemStatus::systemStatus(PsychicRequest *request) { - PsychicJsonResponse response = PsychicJsonResponse(request, false); - JsonObject root = response.getRoot(); - - root["esp_platform"] = ESP_PLATFORM; - root["firmware_version"] = APP_VERSION; - root["max_alloc_heap"] = ESP.getMaxAllocHeap(); - root["psram_size"] = ESP.getPsramSize(); - root["free_psram"] = ESP.getFreePsram(); - root["cpu_freq_mhz"] = ESP.getCpuFreqMHz(); - root["cpu_type"] = ESP.getChipModel(); - root["cpu_rev"] = ESP.getChipRevision(); - root["cpu_cores"] = ESP.getChipCores(); - root["free_heap"] = ESP.getFreeHeap(); - root["min_free_heap"] = ESP.getMinFreeHeap(); - root["sketch_size"] = ESP.getSketchSize(); - root["free_sketch_space"] = ESP.getFreeSketchSpace(); - root["sdk_version"] = ESP.getSdkVersion(); - root["arduino_version"] = ARDUINO_VERSION; - root["flash_chip_size"] = ESP.getFlashChipSize(); - root["flash_chip_speed"] = ESP.getFlashChipSpeed(); - root["fs_total"] = ESPFS.totalBytes(); - root["fs_used"] = ESPFS.usedBytes(); - root["core_temp"] = temperatureRead(); - root["cpu_reset_reason"] = verbosePrintResetReason(rtc_get_reset_reason(0)); - root["uptime"] = millis() / 1000; - - return response.send(); -} diff --git a/esp32/lib/ESP32-sveltekit/SystemStatus.h b/esp32/lib/ESP32-sveltekit/SystemStatus.h deleted file mode 100644 index f16b3da..0000000 --- a/esp32/lib/ESP32-sveltekit/SystemStatus.h +++ /dev/null @@ -1,71 +0,0 @@ -#ifndef SystemStatus_h -#define SystemStatus_h - -/** - * ESP32 SvelteKit - * - * A simple, secure and extensible framework for IoT projects for ESP32 platforms - * with responsive Sveltekit front-end built with TailwindCSS and DaisyUI. - * https://github.com/theelims/ESP32-sveltekit - * - * Copyright (C) 2018 - 2023 rjwats - * Copyright (C) 2023 theelims - * - * All Rights Reserved. This software may be modified and distributed under - * the terms of the LGPL v3 license. See the LICENSE file for details. - **/ - -#include - -#include -#include -#include -#include - -#if CONFIG_IDF_TARGET_ESP32 // ESP32/PICO-D4 -#include "esp32/rom/rtc.h" -#ifndef ESP_PLATFORM -#define ESP_PLATFORM "ESP32" -#endif -#elif CONFIG_IDF_TARGET_ESP32S2 -#include "esp32/rom/rtc.h" -#ifndef ESP_PLATFORM -#define ESP_PLATFORM "ESP32-S2" -#endif -#elif CONFIG_IDF_TARGET_ESP32C3 -#include "esp32c3/rom/rtc.h" -#ifndef ESP_PLATFORM -#define ESP_PLATFORM "ESP32-C3" -#endif -#elif CONFIG_IDF_TARGET_ESP32S3 -#include "esp32s3/rom/rtc.h" -#ifndef ESP_PLATFORM -#define ESP_PLATFORM "ESP32-S3" -#endif -#else -#error Target CONFIG_IDF_TARGET is not supported -#endif - -#ifndef ARDUINO_VERSION -#ifndef STRINGIZE -#define STRINGIZE(s) #s -#endif -#define ARDUINO_VERSION_STR(major, minor, patch) "v" STRINGIZE(major) "." STRINGIZE(minor) "." STRINGIZE(patch) -#define ARDUINO_VERSION \ - ARDUINO_VERSION_STR(ESP_ARDUINO_VERSION_MAJOR, ESP_ARDUINO_VERSION_MINOR, ESP_ARDUINO_VERSION_PATCH) -#endif - -#define SYSTEM_STATUS_SERVICE_PATH "/api/systemStatus" - -class SystemStatus { - public: - SystemStatus(PsychicHttpServer *server); - - void begin(); - - private: - PsychicHttpServer *_server; - esp_err_t systemStatus(PsychicRequest *request); -}; - -#endif // end SystemStatus_h diff --git a/esp32/lib/ESP32-sveltekit/UploadFirmwareService.cpp b/esp32/lib/ESP32-sveltekit/UploadFirmwareService.cpp index 6b1734f..a201735 100644 --- a/esp32/lib/ESP32-sveltekit/UploadFirmwareService.cpp +++ b/esp32/lib/ESP32-sveltekit/UploadFirmwareService.cpp @@ -125,7 +125,7 @@ esp_err_t UploadFirmwareService::uploadComplete(PsychicRequest *request) { // if no error, send the success response if (!request->_tempObject) { request->reply(200); - RestartService::restartNow(); + system_service::restart(); return ESP_OK; } diff --git a/esp32/lib/ESP32-sveltekit/UploadFirmwareService.h b/esp32/lib/ESP32-sveltekit/UploadFirmwareService.h index c460626..0705b73 100644 --- a/esp32/lib/ESP32-sveltekit/UploadFirmwareService.h +++ b/esp32/lib/ESP32-sveltekit/UploadFirmwareService.h @@ -21,7 +21,7 @@ #include #include -#include +#include #define UPLOAD_FIRMWARE_PATH "/api/uploadFirmware" diff --git a/esp32/lib/ESP32-sveltekit/global.h b/esp32/lib/ESP32-sveltekit/global.h new file mode 100644 index 0000000..1521963 --- /dev/null +++ b/esp32/lib/ESP32-sveltekit/global.h @@ -0,0 +1,49 @@ +#pragma once + +#include + +#if CONFIG_IDF_TARGET_ESP32 // ESP32/PICO-D4 +#include "esp32/rom/rtc.h" +#ifndef ESP_PLATFORM +#define ESP_PLATFORM "ESP32" +#endif +#elif CONFIG_IDF_TARGET_ESP32S2 +#include "esp32/rom/rtc.h" +#ifndef ESP_PLATFORM +#define ESP_PLATFORM "ESP32-S2" +#endif +#elif CONFIG_IDF_TARGET_ESP32C3 +#include "esp32c3/rom/rtc.h" +#ifndef ESP_PLATFORM +#define ESP_PLATFORM "ESP32-C3" +#endif +#elif CONFIG_IDF_TARGET_ESP32S3 +#include "esp32s3/rom/rtc.h" +#ifndef ESP_PLATFORM +#define ESP_PLATFORM "ESP32-S3" +#endif +#else +#error Target CONFIG_IDF_TARGET is not supported +#endif + +#ifndef ARDUINO_VERSION +#ifndef STRINGIFY +#define STRINGIFY(s) #s +#endif +#define ARDUINO_VERSION_STR(major, minor, patch) "v" STRINGIFY(major) "." STRINGIFY(minor) "." STRINGIFY(patch) +#define ARDUINO_VERSION \ + ARDUINO_VERSION_STR(ESP_ARDUINO_VERSION_MAJOR, ESP_ARDUINO_VERSION_MINOR, ESP_ARDUINO_VERSION_PATCH) +#endif + +/* + * I2C software connection + */ +#ifndef SDA_PIN +#define SDA_PIN SDA +#endif +#ifndef SCL_PIN +#define SCL_PIN SCL +#endif +#ifndef I2C_FREQUENCY +#define I2C_FREQUENCY 100000UL +#endif \ No newline at end of file diff --git a/esp32/lib/ESP32-sveltekit/system_service.cpp b/esp32/lib/ESP32-sveltekit/system_service.cpp new file mode 100644 index 0000000..ea44a75 --- /dev/null +++ b/esp32/lib/ESP32-sveltekit/system_service.cpp @@ -0,0 +1,145 @@ +#include "system_service.h" + +namespace system_service { + +static const char *TAG = "SystemService"; + +esp_err_t handleReset(PsychicRequest *request) { + reset(); + return request->reply(200); +} + +esp_err_t handleRestart(PsychicRequest *request) { + restart(); + return request->reply(200); +} + +esp_err_t handleSleep(PsychicRequest *request) { + sleep(); + return request->reply(200); +} + +esp_err_t getStatus(PsychicRequest *request) { + PsychicJsonResponse response = PsychicJsonResponse(request, false); + JsonObject root = response.getRoot(); + status(root); + return response.send(); +} + +esp_err_t getMetrics(PsychicRequest *request) { + PsychicJsonResponse response = PsychicJsonResponse(request, false); + JsonObject root = response.getRoot(); + metrics(root); + return response.send(); +} + +void reset() { + ESP_LOGI(TAG, "Resetting device"); + File root = ESPFS.open(FS_CONFIG_DIRECTORY); + File file; + while (file = root.openNextFile()) { + String path = file.path(); + file.close(); + ESPFS.remove(path); + } + restart(); +} + +void restart() { + xTaskCreate( + [](void *pvParameters) { + for (;;) { + delay(250); + MDNS.end(); + delay(100); + WiFi.disconnect(true); + delay(500); + ESP.restart(); + } + }, + "Restart task", 4096, nullptr, 10, nullptr); +} + +void sleep() { + xTaskCreate( + [](void *pvParameters) { + for (;;) { + delay(250); + MDNS.end(); + delay(100); + WiFi.disconnect(true); + delay(500); + + uint64_t bitmask = (uint64_t)1 << (WAKEUP_PIN_NUMBER); + +#ifdef CONFIG_IDF_TARGET_ESP32C3 + esp_deep_sleep_enable_gpio_wakeup(bitmask, (esp_deepsleep_gpio_wake_up_mode_t)WAKEUP_SIGNAL); +#else + esp_sleep_enable_ext1_wakeup(bitmask, (esp_sleep_ext1_wakeup_mode_t)WAKEUP_SIGNAL); + esp_sleep_pd_config(ESP_PD_DOMAIN_RTC_PERIPH, ESP_PD_OPTION_OFF); +#endif + esp_deep_sleep_start(); + } + }, + "Sleep task", 4096, nullptr, 10, nullptr); + ESP_LOGI(TAG, "Setting device to sleep"); +} + +void status(JsonObject &root) { + root["esp_platform"] = ESP_PLATFORM; + root["firmware_version"] = APP_VERSION; + root["max_alloc_heap"] = ESP.getMaxAllocHeap(); + root["psram_size"] = ESP.getPsramSize(); + root["free_psram"] = ESP.getFreePsram(); + root["cpu_freq_mhz"] = ESP.getCpuFreqMHz(); + root["cpu_type"] = ESP.getChipModel(); + root["cpu_rev"] = ESP.getChipRevision(); + root["cpu_cores"] = ESP.getChipCores(); + root["free_heap"] = ESP.getFreeHeap(); + root["min_free_heap"] = ESP.getMinFreeHeap(); + root["sketch_size"] = ESP.getSketchSize(); + root["free_sketch_space"] = ESP.getFreeSketchSpace(); + root["sdk_version"] = ESP.getSdkVersion(); + root["arduino_version"] = ARDUINO_VERSION; + root["flash_chip_size"] = ESP.getFlashChipSize(); + root["flash_chip_speed"] = ESP.getFlashChipSpeed(); + root["fs_total"] = ESPFS.totalBytes(); + root["fs_used"] = ESPFS.usedBytes(); + root["core_temp"] = temperatureRead(); + root["cpu_reset_reason"] = resetReason(rtc_get_reset_reason(0)); + root["uptime"] = millis() / 1000; +} + +void metrics(JsonObject &root) { + root["uptime"] = millis() / 1000; + root["free_heap"] = ESP.getFreeHeap(); + root["total_heap"] = ESP.getHeapSize(); + root["min_free_heap"] = ESP.getMinFreeHeap(); + root["max_alloc_heap"] = ESP.getMaxAllocHeap(); + root["fs_used"] = ESPFS.usedBytes(); + root["fs_total"] = ESPFS.totalBytes(); + root["core_temp"] = temperatureRead(); +} + +const char *resetReason(int reason) { + switch (reason) { + case 1: return "Vbat power on reset"; + case 3: return "Software reset digital core"; + case 4: return "Legacy watch dog reset digital core"; + case 5: return "Deep Sleep reset digital core"; + case 6: return "Reset by SLC module, reset digital core"; + case 7: return "Timer Group0 Watch dog reset digital core"; + case 8: return "Timer Group1 Watch dog reset digital core"; + case 9: return "RTC Watch dog Reset digital core"; + case 10: return "Intrusion tested to reset CPU"; + case 11: return "Time Group reset CPU"; + case 12: return "Software reset CPU"; + case 13: return "RTC Watch dog Reset CPU"; + case 14: return "for APP CPU, reset by PRO CPU"; + case 15: return "Reset when the vdd voltage is not stable"; + case 16: return "RTC Watch dog reset digital core and rtc module"; + default: return "NO_MEAN"; + } +} + +} // namespace system_service \ No newline at end of file diff --git a/esp32/lib/ESP32-sveltekit/system_service.h b/esp32/lib/ESP32-sveltekit/system_service.h new file mode 100644 index 0000000..3ca8265 --- /dev/null +++ b/esp32/lib/ESP32-sveltekit/system_service.h @@ -0,0 +1,25 @@ +#ifndef SYSTEM_SERVICE_H +#define SYSTEM_SERVICE_H + +#include +#include +#include +#include +#include + +namespace system_service { +esp_err_t handleReset(PsychicRequest *request); +esp_err_t handleRestart(PsychicRequest *request); +esp_err_t handleSleep(PsychicRequest *request); +esp_err_t getStatus(PsychicRequest *request); +esp_err_t getMetrics(PsychicRequest *request); + +void reset(); +void restart(); +void sleep(); +void status(JsonObject &root); +void metrics(JsonObject &root); +const char *resetReason(int reason); +} // namespace system_service + +#endif \ No newline at end of file