From 0e29dba043ae4c1e7f00d437def630dcffc3c337 Mon Sep 17 00:00:00 2001 From: Rune Harlyk Date: Tue, 9 Jul 2024 20:09:22 +0200 Subject: [PATCH] =?UTF-8?q?=F0=9F=AA=84=20Formats=20ESP32SvelteKit?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- esp32/lib/ESP32-sveltekit/ESP32SvelteKit.cpp | 63 +++++------ esp32/lib/ESP32-sveltekit/ESP32SvelteKit.h | 110 ++++--------------- esp32/lib/ESP32-sveltekit/ServoController.h | 91 +++++++-------- 3 files changed, 86 insertions(+), 178 deletions(-) diff --git a/esp32/lib/ESP32-sveltekit/ESP32SvelteKit.cpp b/esp32/lib/ESP32-sveltekit/ESP32SvelteKit.cpp index 8efd938..46353b8 100644 --- a/esp32/lib/ESP32-sveltekit/ESP32SvelteKit.cpp +++ b/esp32/lib/ESP32-sveltekit/ESP32SvelteKit.cpp @@ -15,8 +15,7 @@ #include -ESP32SvelteKit::ESP32SvelteKit(PsychicHttpServer *server, - unsigned int numberEndpoints) +ESP32SvelteKit::ESP32SvelteKit(PsychicHttpServer *server, unsigned int numberEndpoints) : _server(server), _numberEndpoints(numberEndpoints), _taskManager(), @@ -27,8 +26,7 @@ ESP32SvelteKit::ESP32SvelteKit(PsychicHttpServer *server, _wifiStatus(server, &_securitySettingsService), _apSettingsService(server, &ESPFS, &_securitySettingsService), _apStatus(server, &_securitySettingsService, &_apSettingsService), - _socket(server, &_securitySettingsService, - AuthenticationPredicates::IS_AUTHENTICATED), + _socket(server, &_securitySettingsService, AuthenticationPredicates::IS_AUTHENTICATED), #if FT_ENABLED(FT_NTP) _ntpSettingsService(server, &ESPFS, &_securitySettingsService), _ntpStatus(server, &_securitySettingsService), @@ -37,8 +35,7 @@ ESP32SvelteKit::ESP32SvelteKit(PsychicHttpServer *server, _uploadFirmwareService(server, &_securitySettingsService), #endif #if FT_ENABLED(FT_DOWNLOAD_FIRMWARE) - _downloadFirmwareService(server, &_securitySettingsService, &_socket, - &_taskManager), + _downloadFirmwareService(server, &_securitySettingsService, &_socket, &_taskManager), #endif #if FT_ENABLED(FT_SECURITY) _authenticationService(server, &_securitySettingsService), @@ -61,16 +58,16 @@ ESP32SvelteKit::ESP32SvelteKit(PsychicHttpServer *server, _systemStatus(server, &_securitySettingsService), _fileExplorer(server, &_securitySettingsService), #if FT_ENABLED(FT_MOTION) - _motionService(_server, &_socket, &_securitySettingsService,&_taskManager), + _motionService(_server, &_socket, &_securitySettingsService, &_taskManager), #endif #if FT_ENABLED(FT_WS2812) - _ledService(&_taskManager), + _ledService(&_taskManager), #endif #if FT_ENABLED(FT_SERVO) _servoController(server, &ESPFS, &_securitySettingsService, &_socket), #endif - _peripherals(server, &ESPFS, &_securitySettingsService, &_socket) -{ } + _peripherals(server, &ESPFS, &_securitySettingsService, &_socket) { +} void ESP32SvelteKit::begin() { ESP_LOGV("ESP32SvelteKit", "Loading settings from files system"); @@ -86,8 +83,7 @@ void ESP32SvelteKit::begin() { startServices(); ESP_LOGV("ESP32SvelteKit", "Starting loop task"); - _taskManager.createTask(this->_loopImpl, "Spot main", 4096, this, - (tskIDLE_PRIORITY + 1), NULL, + _taskManager.createTask(this->_loopImpl, "Spot main", 4096, this, (tskIDLE_PRIORITY + 1), NULL, ESP32SVELTEKIT_RUNNING_CORE); } @@ -96,21 +92,17 @@ void ESP32SvelteKit::setupServer() { _server->listen(80); #ifdef EMBED_WWW - ESP_LOGV("ESP32SvelteKit", - "Registering routes from PROGMEM static resources"); - WWWData::registerRoutes([&](const String &uri, const String &contentType, - const uint8_t *content, size_t len) { - PsychicHttpRequestCallback requestHandler = - [contentType, content, len](PsychicRequest *request) { - PsychicResponse response(request); - response.setCode(200); - response.setContentType(contentType.c_str()); - response.addHeader("Content-Encoding", "gzip"); - response.addHeader("Cache-Control", - "public, immutable, max-age=31536000"); - response.setContent(content, len); - return response.send(); - }; + ESP_LOGV("ESP32SvelteKit", "Registering routes from PROGMEM static resources"); + WWWData::registerRoutes([&](const String &uri, const String &contentType, const uint8_t *content, size_t len) { + PsychicHttpRequestCallback requestHandler = [contentType, content, len](PsychicRequest *request) { + PsychicResponse response(request); + response.setCode(200); + response.setContentType(contentType.c_str()); + response.addHeader("Content-Encoding", "gzip"); + response.addHeader("Cache-Control", "public, immutable, max-age=31536000"); + response.setContent(content, len); + return response.send(); + }; PsychicWebHandler *handler = new PsychicWebHandler(); handler->onRequest(requestHandler); _server->on(uri.c_str(), HTTP_GET, handler); @@ -123,15 +115,13 @@ void ESP32SvelteKit::setupServer() { }); #else // Serve static resources from /www/ - ESP_LOGV("ESP32SvelteKit", - "Registering routes from FS /www/ static resources"); + ESP_LOGV("ESP32SvelteKit", "Registering routes from FS /www/ static resources"); _server->serveStatic("/_app/", ESPFS, "/www/_app/"); _server->serveStatic("/favicon.png", ESPFS, "/www/favicon.png"); // Serving all other get requests with "/www/index.htm" _server->onNotFound([](PsychicRequest *request) { if (request->method() == HTTP_GET) { - PsychicFileResponse response(request, ESPFS, "/www/index.html", - "text/html"); + PsychicFileResponse response(request, ESPFS, "/www/index.html", "text/html"); return response.send(); // String url = "http://" + request->host() + "/index.html"; // request->redirect(url.c_str()); @@ -144,12 +134,9 @@ void ESP32SvelteKit::setupServer() { #if defined(ENABLE_CORS) ESP_LOGV("ESP32SvelteKit", "Enabling CORS headers"); - DefaultHeaders::Instance().addHeader("Access-Control-Allow-Origin", - CORS_ORIGIN); - DefaultHeaders::Instance().addHeader("Access-Control-Allow-Headers", - "Accept, Content-Type, Authorization"); - DefaultHeaders::Instance().addHeader("Access-Control-Allow-Credentials", - "true"); + DefaultHeaders::Instance().addHeader("Access-Control-Allow-Origin", CORS_ORIGIN); + DefaultHeaders::Instance().addHeader("Access-Control-Allow-Headers", "Accept, Content-Type, Authorization"); + DefaultHeaders::Instance().addHeader("Access-Control-Allow-Credentials", "true"); #endif DefaultHeaders::Instance().addHeader("Server", _appName); } @@ -236,7 +223,7 @@ void IRAM_ATTR ESP32SvelteKit::_loop() { #if FT_ENABLED(FT_WS2812) _ledService.loop(); #endif - _peripherals.loop(); + _peripherals.loop(); delay(20); } } diff --git a/esp32/lib/ESP32-sveltekit/ESP32SvelteKit.h b/esp32/lib/ESP32-sveltekit/ESP32SvelteKit.h index 7676636..14fe482 100644 --- a/esp32/lib/ESP32-sveltekit/ESP32SvelteKit.h +++ b/esp32/lib/ESP32-sveltekit/ESP32SvelteKit.h @@ -71,126 +71,64 @@ #define ESP32SVELTEKIT_RUNNING_CORE -1 #endif -class ESP32SvelteKit -{ -public: +class ESP32SvelteKit { + public: ESP32SvelteKit(PsychicHttpServer *server, unsigned int numberEndpoints = 115); void begin(); - FS *getFS() - { - return &ESPFS; - } + FS *getFS() { return &ESPFS; } - PsychicHttpServer *getServer() - { - return _server; - } + PsychicHttpServer *getServer() { return _server; } - SecurityManager *getSecurityManager() - { - return &_securitySettingsService; - } + SecurityManager *getSecurityManager() { return &_securitySettingsService; } - EventSocket *getSocket() - { - return &_socket; - } + EventSocket *getSocket() { return &_socket; } - StatefulService *getWiFiSettingsService() - { - return &_wifiSettingsService; - } + StatefulService *getWiFiSettingsService() { return &_wifiSettingsService; } - StatefulService *getAPSettingsService() - { - return &_apSettingsService; - } + StatefulService *getAPSettingsService() { return &_apSettingsService; } #if FT_ENABLED(FT_NTP) - StatefulService *getNTPSettingsService() - { - return &_ntpSettingsService; - } + StatefulService *getNTPSettingsService() { return &_ntpSettingsService; } #endif #if FT_ENABLED(FT_SLEEP) - SleepService *getSleepService() - { - return &_sleepService; - } + SleepService *getSleepService() { return &_sleepService; } #endif #if FT_ENABLED(FT_BATTERY) - BatteryService *getBatteryService() - { - return &_batteryService; - } + BatteryService *getBatteryService() { return &_batteryService; } #endif - FeaturesService *getFeatureService() - { - return &_featureService; - } + FeaturesService *getFeatureService() { return &_featureService; } - TaskManager *getTaskManager() - { - return &_taskManager; - } + TaskManager *getTaskManager() { return &_taskManager; } - FileExplorer *getFileExplorer() - { - return &_fileExplorer; - } + FileExplorer *getFileExplorer() { return &_fileExplorer; } #if FT_ENABLED(FT_MOTION) - MotionService *getMotionService() - { - return &_motionService; - } + MotionService *getMotionService() { return &_motionService; } #endif #if FT_ENABLED(FT_CAMERA) - CameraService *getCameraService() - { - return &_cameraService; - } - - CameraSettingsService *getCameraSettingsService() - { - return &_cameraSettingsService; - } + CameraService *getCameraService() { return &_cameraService; } + CameraSettingsService *getCameraSettingsService() { return &_cameraSettingsService; } #endif - Peripherals *getPeripherals() - { - return &_peripherals; - } + Peripherals *getPeripherals() { return &_peripherals; } #if FT_ENABLED(FT_SERVO) - ServoController *getServoController() - { - return &_servoController; - } + ServoController *getServoController() { return &_servoController; } #endif - void factoryReset() - { - _factoryResetService.factoryReset(); - } + void factoryReset() { _factoryResetService.factoryReset(); } - void setMDNSAppName(String name) - { - _appName = name; - } + void setMDNSAppName(String name) { _appName = name; } - void recoveryMode() - { - _apSettingsService.recoveryMode(); - } + void recoveryMode() { _apSettingsService.recoveryMode(); } -private: + private: PsychicHttpServer *_server; unsigned int _numberEndpoints; FeaturesService _featureService; @@ -245,7 +183,7 @@ private: String _appName = APP_NAME; -protected: + protected: static void _loopImpl(void *_this) { static_cast(_this)->_loop(); } void _loop(); void setupServer(); diff --git a/esp32/lib/ESP32-sveltekit/ServoController.h b/esp32/lib/ESP32-sveltekit/ServoController.h index f797e58..d2f5b72 100644 --- a/esp32/lib/ESP32-sveltekit/ServoController.h +++ b/esp32/lib/ESP32-sveltekit/ServoController.h @@ -25,9 +25,9 @@ #define FACTORY_SERVO_CENTER_ANGLE 90 #endif -#define SERVO_STATE_SPEED_MS 20 -#define SERVO_MIN 150 // This is the 'minimum' pulse length count (out of 4096) -#define SERVO_MAX 650 // This is the 'maximum' pulse length count (out of 4096) +#define SERVO_STATE_SPEED_MS 20 +#define SERVO_MIN 150 // This is the 'minimum' pulse length count (out of 4096) +#define SERVO_MAX 650 // This is the 'maximum' pulse length count (out of 4096) enum SERVO_STATE { SERVO_STATE_ACTIVE, SERVO_STATE_SWEEPING_FORWARD, SERVO_STATE_SWEEPING_BACKWARD }; @@ -41,18 +41,17 @@ struct servo_t { }; class ServoConfiguration { - public: - int32_t servo_oscillator_frequency{FACTORY_SERVO_OSCILLATOR_FREQUENCY}; - int32_t servo_pwm_frequency{FACTORY_SERVO_PWM_FREQUENCY}; + public: + int32_t servo_oscillator_frequency {FACTORY_SERVO_OSCILLATOR_FREQUENCY}; + int32_t servo_pwm_frequency {FACTORY_SERVO_PWM_FREQUENCY}; std::vector servos_config; - bool is_active{true}; + bool is_active {true}; const int8_t servo_invert[12] = {-1, 1, 1, -1, -1, -1, 1, 1, 1, 1, -1, -1}; static void read(ServoConfiguration &settings, JsonObject &root) { root["is_active"] = settings.is_active; root["servo_pwm_frequency"] = settings.servo_pwm_frequency; - root["servo_oscillator_frequency"] = - settings.servo_oscillator_frequency; + root["servo_oscillator_frequency"] = settings.servo_oscillator_frequency; JsonArray servos = root["servos"].to(); @@ -68,14 +67,10 @@ class ServoConfiguration { } } - static StateUpdateResult update(JsonObject &root, - ServoConfiguration &settings) { + static StateUpdateResult update(JsonObject &root, ServoConfiguration &settings) { settings.is_active = root["is_active"] | settings.is_active; - settings.servo_pwm_frequency = - root["servo_pwm_frequency"] | settings.servo_pwm_frequency; - settings.servo_oscillator_frequency = - root["servo_oscillator_frequency"] | - settings.servo_oscillator_frequency; + settings.servo_pwm_frequency = root["servo_pwm_frequency"] | settings.servo_pwm_frequency; + settings.servo_oscillator_frequency = root["servo_oscillator_frequency"] | settings.servo_oscillator_frequency; JsonArray servos = root["servos"]; @@ -83,15 +78,15 @@ class ServoConfiguration { ESP_LOGI("ControllerSettings", "No servos found, adding default servos"); for (int8_t i = 0; i < FACTORY_SERVO_NUM; i++) { ESP_LOGI("ControllerSettings", "Adding servo %d", i); - settings.servos_config.push_back( - servo_t{.name = "Servo " + String(i), - .channel = i, - .inverted = 1, - .angle = 0, - .center_angle = FACTORY_SERVO_CENTER_ANGLE - // , - // .state = SERVO_STATE_ACTIVE - }); + settings.servos_config.push_back(servo_t { + .name = "Servo " + String(i), + .channel = i, + .inverted = 1, + .angle = 0, + .center_angle = FACTORY_SERVO_CENTER_ANGLE + // , + // .state = SERVO_STATE_ACTIVE + }); } return StateUpdateResult::CHANGED; } @@ -99,22 +94,18 @@ class ServoConfiguration { for (auto new_servo_json : servos) { JsonObject servo_config = new_servo_json.as(); int8_t channel = servo_config["channel"] | -1; - servo_t *servo = - get_servo_by_channel(settings.servos_config, channel); + servo_t *servo = get_servo_by_channel(settings.servos_config, channel); if (servo != nullptr) { servo->name = servo_config["name"].as() || servo->name; - if (servo_config["inverted"]) - servo->inverted = servo_config["inverted"]; + if (servo_config["inverted"]) servo->inverted = servo_config["inverted"]; if (servo_config["angle"].is()) { servo->angle = servo_config["angle"].as(); servo->state = SERVO_STATE_ACTIVE; } if (servo_config["center_angle"].is()) - servo->center_angle = - servo_config["center_angle"].as(); - if (servo_config["sweep"]) - servo->state = SERVO_STATE_SWEEPING_FORWARD; + servo->center_angle = servo_config["center_angle"].as(); + if (servo_config["sweep"]) servo->state = SERVO_STATE_SWEEPING_FORWARD; continue; } @@ -131,8 +122,7 @@ class ServoConfiguration { return StateUpdateResult::CHANGED; }; - static servo_t *get_servo_by_channel(std::vector &servos_config, - int8_t channel_id) { + static servo_t *get_servo_by_channel(std::vector &servos_config, int8_t channel_id) { for (auto &servo : servos_config) { if (servo.channel == channel_id) { return &servo; @@ -142,20 +132,16 @@ class ServoConfiguration { } }; -class ServoController : public Adafruit_PWMServoDriver, - public StatefulService { - public: - ServoController(PsychicHttpServer *server, FS *fs, - SecurityManager *securityManager, EventSocket *socket) +class ServoController : public Adafruit_PWMServoDriver, public StatefulService { + public: + ServoController(PsychicHttpServer *server, FS *fs, SecurityManager *securityManager, EventSocket *socket) : Adafruit_PWMServoDriver(), _server(server), _securityManager(securityManager), - _eventEndpoint(ServoConfiguration::read, ServoConfiguration::update, - this, socket, EVENT_CONFIGURATION_SETTINGS), - _fsPersistence(ServoConfiguration::read, ServoConfiguration::update, - this, fs, SERVO_CONFIG_FILE) { - addUpdateHandler([&](const String &originId) { updateServos(); }, - false); + _eventEndpoint(ServoConfiguration::read, ServoConfiguration::update, this, socket, + EVENT_CONFIGURATION_SETTINGS), + _fsPersistence(ServoConfiguration::read, ServoConfiguration::update, this, fs, SERVO_CONFIG_FILE) { + addUpdateHandler([&](const String &originId) { updateServos(); }, false); } void configure() { @@ -164,8 +150,7 @@ class ServoController : public Adafruit_PWMServoDriver, setOscillatorFrequency(_state.servo_oscillator_frequency); setPWMFreq(_state.servo_pwm_frequency); deactivate(); - ESP_LOGI("ServoController", - "Configured with oscillator frequency %d and PWM frequency %d", + ESP_LOGI("ServoController", "Configured with oscillator frequency %d and PWM frequency %d", _state.servo_oscillator_frequency, _state.servo_pwm_frequency); } @@ -195,7 +180,7 @@ class ServoController : public Adafruit_PWMServoDriver, } } - void setAngle(servo_t* servo) { + void setAngle(servo_t *servo) { int8_t channel = servo->channel; bool invert = servo->inverted; int16_t angle = invert ? 180 - servo->angle : servo->angle; @@ -203,9 +188,7 @@ class ServoController : public Adafruit_PWMServoDriver, setPWM(channel, 0, angleToPwm(angle)); } - uint16_t angleToPwm(int angle) { - return map(angle, 0, 180, SERVO_MIN, SERVO_MAX); - } + uint16_t angleToPwm(int angle) { return map(angle, 0, 180, SERVO_MIN, SERVO_MAX); } void updateServoState() { for (auto &servo : _state.servos_config) { @@ -233,13 +216,13 @@ class ServoController : public Adafruit_PWMServoDriver, } } - private: + private: PsychicHttpServer *_server; SecurityManager *_securityManager; EventEndpoint _eventEndpoint; FSPersistence _fsPersistence; - bool is_active{true}; + bool is_active {true}; unsigned long _lastUpdate; constexpr static int ServoInterval = 2; };