Fixed memory utilization issue. Utilized F() macro for moving strings from RAM to PROGMEM.

pull/21/head
Miroslav Pivovarsky 2024-05-10 23:29:55 +02:00
parent ef935c1fac
commit 449bb07b58
14 changed files with 388 additions and 395 deletions

View File

@ -4,7 +4,7 @@
It's neccesary install support for ESP32 board to the arduino IDE. In the board manager we need add next link It's neccesary install support for ESP32 board to the arduino IDE. In the board manager we need add next link
https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json
Then we can install "ESP32 by Espressif Systems" board in the board manager. Then we can install "ESP32 by Espressif Systems" board in the board manager.
ESP32 lib version: 2.0.15 (ESP-IDF v4.4.7) by Espressif Systems ESP32 lib version: 2.0.16 (ESP-IDF v4.4.7) by Espressif Systems
This project uses other libraries. It is necessary to install them in the arduino IDE. This project uses other libraries. It is necessary to install them in the arduino IDE.
- Library - License - Version - Link - Library - License - Version - Link
@ -12,7 +12,7 @@
- AsyncTCP - LGPL 3.0 - 1.1.4 - https://github.com/dvarrel/ESPAsyncTCP - AsyncTCP - LGPL 3.0 - 1.1.4 - https://github.com/dvarrel/ESPAsyncTCP
- ArduinoJson - MIT - 7.0.4 - https://github.com/bblanchon/ArduinoJson - ArduinoJson - MIT - 7.0.4 - https://github.com/bblanchon/ArduinoJson
- ArduinoUniqueID - MIT - 1.3.0 - https://github.com/ricaun/ArduinoUniqueID - ArduinoUniqueID - MIT - 1.3.0 - https://github.com/ricaun/ArduinoUniqueID
- ESP32 - LGPL 2.1 - 2.0.15 - https://github.com/espressif/arduino-esp32 - ESP32 - LGPL 2.1 - 2.0.16 - https://github.com/espressif/arduino-esp32
Board configuration in the arduino IDE 2.3.2 Board configuration in the arduino IDE 2.3.2
Tools -> Board -> ESP32 Arduino -> AI Thinker ESP32 Tools -> Board -> ESP32 Arduino -> AI Thinker ESP32
@ -64,12 +64,12 @@
void setup() { void setup() {
/* Serial port for debugging purposes */ /* Serial port for debugging purposes */
Serial.begin(SERIAL_PORT_SPEED); Serial.begin(SERIAL_PORT_SPEED);
Serial.println("----------------------------------------------------------------"); Serial.println(F("----------------------------------------------------------------"));
Serial.println("Start MCU!"); Serial.println(F("Start MCU!"));
Serial.println("Prusa ESP32-cam https://prusa3d.cz"); Serial.println(F("Prusa ESP32-cam https://prusa3d.cz"));
Serial.print("SW Version: "); Serial.print(F("SW Version: "));
Serial.println(SW_VERSION); Serial.println(SW_VERSION);
Serial.print("Build: "); Serial.print(F("Build: "));
Serial.println(SW_BUILD); Serial.println(SW_BUILD);
#if (CONSOLE_VERBOSE_DEBUG == true) #if (CONSOLE_VERBOSE_DEBUG == true)
Serial.setDebugOutput(true); Serial.setDebugOutput(true);
@ -111,18 +111,18 @@ void setup() {
Connect.Init(); Connect.Init();
/* init tasks */ /* init tasks */
SystemLog.AddEvent(LogLevel_Info, "Start tasks"); SystemLog.AddEvent(LogLevel_Info, F("Start tasks"));
xTaskCreatePinnedToCore(System_TaskMain, "SystemNtpOtaUpdate", 8000, NULL, 1, &Task_SystemMain, 0); /*function, description, stack size, parameters, priority, task handle, core*/ xTaskCreatePinnedToCore(System_TaskMain, "SystemNtpOtaUpdate", 8000, NULL, 1, &Task_SystemMain, 0); /*function, description, stack size, parameters, priority, task handle, core*/
xTaskCreatePinnedToCore(System_TaskCaptureAndSendPhoto, "CaptureAndSendPhoto", 10000, NULL, 2, &Task_CapturePhotoAndSend, 0); /*function, description, stack size, parameters, priority, task handle, core*/ xTaskCreatePinnedToCore(System_TaskCaptureAndSendPhoto, "CaptureAndSendPhoto", 6000, NULL, 2, &Task_CapturePhotoAndSend, 0); /*function, description, stack size, parameters, priority, task handle, core*/
xTaskCreatePinnedToCore(System_TaskWifiManagement, "WiFiManagement", 6000, NULL, 3, &Task_WiFiManagement, 0); /*function, description, stack size, parameters, priority, task handle, core*/ xTaskCreatePinnedToCore(System_TaskWifiManagement, "WiFiManagement", 2500, NULL, 3, &Task_WiFiManagement, 0); /*function, description, stack size, parameters, priority, task handle, core*/
xTaskCreatePinnedToCore(System_TaskSdCardCheck, "CheckMicroSdCard", 5000, NULL, 4, &Task_SdCardCheck, 0); /*function, description, stack size, parameters, priority, task handle, core*/ xTaskCreatePinnedToCore(System_TaskSdCardCheck, "CheckMicroSdCard", 2200, NULL, 4, &Task_SdCardCheck, 0); /*function, description, stack size, parameters, priority, task handle, core*/
xTaskCreatePinnedToCore(System_TaskSerialCfg, "CheckSerialConfiguration", 3000, NULL, 5, &Task_SerialCfg, 0); /*function, description, stack size, parameters, priority, task handle, core*/ xTaskCreatePinnedToCore(System_TaskSerialCfg, "CheckSerialConfiguration", 2500, NULL, 5, &Task_SerialCfg, 0); /*function, description, stack size, parameters, priority, task handle, core*/
xTaskCreatePinnedToCore(System_TaskStreamTelemetry, "PrintStreamTelemetry", 3000, NULL, 6, &Task_StreamTelemetry, 0); /*function, description, stack size, parameters, priority, task handle, core*/ xTaskCreatePinnedToCore(System_TaskStreamTelemetry, "PrintStreamTelemetry", 2500, NULL, 6, &Task_StreamTelemetry, 0); /*function, description, stack size, parameters, priority, task handle, core*/
xTaskCreatePinnedToCore(System_TaskSysLed, "SystemLed", 3000, NULL, 7, &Task_SysLed, 0); /*function, description, stack size, parameters, priority, task handle, core*/ xTaskCreatePinnedToCore(System_TaskSysLed, "SystemLed", 2000, NULL, 7, &Task_SysLed, 0); /*function, description, stack size, parameters, priority, task handle, core*/
xTaskCreatePinnedToCore(System_TaskWiFiWatchdog, "WiFiWatchdog", 3000, NULL, 8, &Task_WiFiWatchdog, 0); /*function, description, stack size, parameters, priority, task handle, core*/ xTaskCreatePinnedToCore(System_TaskWiFiWatchdog, "WiFiWatchdog", 2200, NULL, 8, &Task_WiFiWatchdog, 0); /*function, description, stack size, parameters, priority, task handle, core*/
/* init wdg */ /* init wdg */
SystemLog.AddEvent(LogLevel_Info, "Init WDG"); SystemLog.AddEvent(LogLevel_Info, F("Init WDG"));
esp_task_wdt_init(WDG_TIMEOUT, true); /* enable panic so ESP32 restarts */ esp_task_wdt_init(WDG_TIMEOUT, true); /* enable panic so ESP32 restarts */
esp_task_wdt_add(NULL); /* add current thread to WDT watch */ esp_task_wdt_add(NULL); /* add current thread to WDT watch */
esp_task_wdt_add(Task_CapturePhotoAndSend); esp_task_wdt_add(Task_CapturePhotoAndSend);
@ -135,7 +135,7 @@ void setup() {
esp_task_wdt_add(Task_WiFiWatchdog); esp_task_wdt_add(Task_WiFiWatchdog);
esp_task_wdt_reset(); /* reset wdg */ esp_task_wdt_reset(); /* reset wdg */
SystemLog.AddEvent(LogLevel_Info, "MCU configuration done"); SystemLog.AddEvent(LogLevel_Info, F("MCU configuration done"));
} }
void loop() { void loop() {

View File

@ -33,9 +33,9 @@ Camera::Camera(Configuration* i_conf, Logs* i_log, uint8_t i_FlashPin) {
@return none @return none
*/ */
void Camera::Init() { void Camera::Init() {
log->AddEvent(LogLevel_Info, "Init camera lib"); log->AddEvent(LogLevel_Info, F("Init camera lib"));
log->AddEvent(LogLevel_Info, "Init GPIO"); log->AddEvent(LogLevel_Info, F("Init GPIO"));
ledcSetup(FLASH_PWM_CHANNEL, FLASH_PWM_FREQ, FLASH_PWM_RESOLUTION); ledcSetup(FLASH_PWM_CHANNEL, FLASH_PWM_FREQ, FLASH_PWM_RESOLUTION);
ledcAttachPin(FLASH_GPIO_NUM, FLASH_PWM_CHANNEL); ledcAttachPin(FLASH_GPIO_NUM, FLASH_PWM_CHANNEL);
ledcWrite(FLASH_PWM_CHANNEL, FLASH_OFF_STATUS); ledcWrite(FLASH_PWM_CHANNEL, FLASH_OFF_STATUS);
@ -50,7 +50,7 @@ void Camera::Init() {
@return none @return none
*/ */
void Camera::InitCameraModule() { void Camera::InitCameraModule() {
log->AddEvent(LogLevel_Info, "Init camera module"); log->AddEvent(LogLevel_Info, F("Init camera module"));
/* Turn-off the 'brownout detector' */ /* Turn-off the 'brownout detector' */
WRITE_PERI_REG(RTC_CNTL_BROWN_OUT_REG, 0); WRITE_PERI_REG(RTC_CNTL_BROWN_OUT_REG, 0);
esp_err_t err; esp_err_t err;
@ -92,18 +92,18 @@ void Camera::InitCameraModule() {
CameraConfig.grab_mode = CAMERA_GRAB_LATEST; /* CAMERA_GRAB_WHEN_EMPTY or CAMERA_GRAB_LATEST */ CameraConfig.grab_mode = CAMERA_GRAB_LATEST; /* CAMERA_GRAB_WHEN_EMPTY or CAMERA_GRAB_LATEST */
if (CameraConfig.fb_location == CAMERA_FB_IN_DRAM) { if (CameraConfig.fb_location == CAMERA_FB_IN_DRAM) {
log->AddEvent(LogLevel_Verbose, "Camera frame buffer location: DRAM"); log->AddEvent(LogLevel_Verbose, F("Camera frame buffer location: DRAM"));
} else if (CameraConfig.fb_location == CAMERA_FB_IN_PSRAM) { } else if (CameraConfig.fb_location == CAMERA_FB_IN_PSRAM) {
log->AddEvent(LogLevel_Verbose, "Camera frame buffer location: PSRAM"); log->AddEvent(LogLevel_Verbose, F("Camera frame buffer location: PSRAM"));
} else { } else {
log->AddEvent(LogLevel_Verbose, "Camera frame buffer location: Unknown"); log->AddEvent(LogLevel_Verbose, F("Camera frame buffer location: Unknown"));
} }
/* Camera init */ /* Camera init */
err = esp_camera_init(&CameraConfig); err = esp_camera_init(&CameraConfig);
if (err != ESP_OK) { if (err != ESP_OK) {
log->AddEvent(LogLevel_Warning, "Camera init failed. Error: " + String(err, HEX)); log->AddEvent(LogLevel_Warning, "Camera init failed. Error: " + String(err, HEX));
log->AddEvent(LogLevel_Warning, "Reset ESP32-cam!"); log->AddEvent(LogLevel_Warning, F("Reset ESP32-cam!"));
ESP.restart(); ESP.restart();
} }
} }
@ -114,7 +114,7 @@ void Camera::InitCameraModule() {
@return none @return none
*/ */
void Camera::LoadCameraCfgFromEeprom() { void Camera::LoadCameraCfgFromEeprom() {
log->AddEvent(LogLevel_Info, "Load camera CFG from EEPROM"); log->AddEvent(LogLevel_Info, F("Load camera CFG from EEPROM"));
PhotoQuality = config->LoadPhotoQuality(); PhotoQuality = config->LoadPhotoQuality();
FrameSize = config->LoadFrameSize(); FrameSize = config->LoadFrameSize();
TFrameSize = TransformFrameSizeDataType(config->LoadFrameSize()); TFrameSize = TransformFrameSizeDataType(config->LoadFrameSize());
@ -212,7 +212,7 @@ bool Camera::GetFlashStatus() {
@return none @return none
*/ */
void Camera::ApplyCameraCfg() { void Camera::ApplyCameraCfg() {
log->AddEvent(LogLevel_Info, "Set camera CFG"); log->AddEvent(LogLevel_Info, F("Set camera CFG"));
/* sensor configuration */ /* sensor configuration */
sensor_t* sensor = esp_camera_sensor_get(); sensor_t* sensor = esp_camera_sensor_get();
@ -274,12 +274,12 @@ void Camera::CapturePhoto() {
esp_camera_fb_return(FrameBuffer); esp_camera_fb_return(FrameBuffer);
do { do {
log->AddEvent(LogLevel_Info, "Taking photo..."); log->AddEvent(LogLevel_Info, F("Taking photo..."));
/* capture final photo */ /* capture final photo */
FrameBuffer = esp_camera_fb_get(); FrameBuffer = esp_camera_fb_get();
if (!FrameBuffer) { if (!FrameBuffer) {
log->AddEvent(LogLevel_Error, "Camera capture failed! photo"); log->AddEvent(LogLevel_Error, F("Camera capture failed! photo"));
return; return;
} else { } else {
@ -325,7 +325,7 @@ void Camera::CaptureStream(camera_fb_t* i_buf) {
/* capture final photo */ /* capture final photo */
FrameBuffer = esp_camera_fb_get(); FrameBuffer = esp_camera_fb_get();
if (!FrameBuffer) { if (!FrameBuffer) {
log->AddEvent(LogLevel_Error, "Camera capture failed! stream"); log->AddEvent(LogLevel_Error, F("Camera capture failed! stream"));
i_buf = NULL; i_buf = NULL;
return; return;
} }

View File

@ -34,7 +34,7 @@ void Configuration::Init() {
/* check, when it is first MCU start. If yes, then set default CFG */ /* check, when it is first MCU start. If yes, then set default CFG */
if (CheckFirstMcuStart() == true) { if (CheckFirstMcuStart() == true) {
Log->AddEvent(LogLevel_Warning, "First MCU start! Set factory cfg"); Log->AddEvent(LogLevel_Warning, F("First MCU start! Set factory cfg"));
DefaultCfg(); DefaultCfg();
SaveFirstMcuStartFlag(CFG_FIRST_MCU_START_NAK); SaveFirstMcuStartFlag(CFG_FIRST_MCU_START_NAK);
Log->SetLogLevel(LoadLogLevel()); Log->SetLogLevel(LoadLogLevel());
@ -50,7 +50,7 @@ void Configuration::Init() {
@return none @return none
*/ */
void Configuration::ReadCfg() { void Configuration::ReadCfg() {
Log->AddEvent(LogLevel_Info, "Load CFG from EEPROM"); Log->AddEvent(LogLevel_Info, F("Load CFG from EEPROM"));
LoadRefreshInterval(); LoadRefreshInterval();
LoadToken(); LoadToken();
LoadFingerprint(); LoadFingerprint();
@ -84,7 +84,7 @@ void Configuration::ReadCfg() {
LoadAgcGain(); LoadAgcGain();
LoadPrusaConnectHostname(); LoadPrusaConnectHostname();
Log->AddEvent(LogLevel_Info, "Active WiFi client cfg: " + String(CheckActifeWifiCfgFlag() ? "true" : "false")); Log->AddEvent(LogLevel_Info, "Active WiFi client cfg: " + String(CheckActifeWifiCfgFlag() ? "true" : "false"));
Log->AddEvent(LogLevel_Info, "Load CFG from EEPROM done"); Log->AddEvent(LogLevel_Info, F("Load CFG from EEPROM done"));
} }
/** /**
@ -93,7 +93,7 @@ void Configuration::ReadCfg() {
@return bool - status @return bool - status
*/ */
bool Configuration::CheckFirstMcuStart() { bool Configuration::CheckFirstMcuStart() {
Log->AddEvent(LogLevel_Info, "Read FirstMcuStart: "); Log->AddEvent(LogLevel_Info, F("Read FirstMcuStart: "));
uint8_t flag = EEPROM.read(EEPROM_ADDR_FIRST_MCU_START_FLAG_START); uint8_t flag = EEPROM.read(EEPROM_ADDR_FIRST_MCU_START_FLAG_START);
if (CFG_FIRST_MCU_START_NAK == flag) { if (CFG_FIRST_MCU_START_NAK == flag) {
@ -123,8 +123,8 @@ void Configuration::SaveFirstMcuStartFlag(uint8_t i_data) {
@return none @return none
*/ */
void Configuration::DefaultCfg() { void Configuration::DefaultCfg() {
Log->AddEvent(LogLevel_Warning, "+++++++++++++++++++++++++++"); Log->AddEvent(LogLevel_Warning, F("+++++++++++++++++++++++++++"));
Log->AddEvent(LogLevel_Warning, "Start set factory cfg!"); Log->AddEvent(LogLevel_Warning, F("Start set factory cfg!"));
SaveRefreshInterval(FACTORY_CFG_PHOTO_REFRESH_INTERVAL); SaveRefreshInterval(FACTORY_CFG_PHOTO_REFRESH_INTERVAL);
SaveToken(""); SaveToken("");
@ -160,7 +160,7 @@ void Configuration::DefaultCfg() {
SaveAgcGain(FACTORY_CFG_AGC_GAIN); SaveAgcGain(FACTORY_CFG_AGC_GAIN);
SaveLogLevel(LogLevel_Info); SaveLogLevel(LogLevel_Info);
SavePrusaConnectHostname(FACTORY_CFG_HOSTNAME); SavePrusaConnectHostname(FACTORY_CFG_HOSTNAME);
Log->AddEvent(LogLevel_Warning, "+++++++++++++++++++++++++++"); Log->AddEvent(LogLevel_Warning, F("+++++++++++++++++++++++++++"));
} }
/** /**
@ -187,7 +187,7 @@ bool Configuration::CheckActifeWifiCfgFlag() {
@return none @return none
*/ */
void Configuration::CheckResetCfg() { void Configuration::CheckResetCfg() {
Log->AddEvent(LogLevel_Verbose, "Check reset MCU cfg"); Log->AddEvent(LogLevel_Verbose, F("Check reset MCU cfg"));
bool ResetPinStatus = digitalRead(CFG_RESET_PIN); bool ResetPinStatus = digitalRead(CFG_RESET_PIN);
/* wait 10s to pressed reset pin */ /* wait 10s to pressed reset pin */
@ -204,7 +204,7 @@ void Configuration::CheckResetCfg() {
/* check if is reset pin grounded more at 10s */ /* check if is reset pin grounded more at 10s */
if (i == (CFG_RESET_TIME_WAIT / CFG_RESET_LOOP_DELAY)) { if (i == (CFG_RESET_TIME_WAIT / CFG_RESET_LOOP_DELAY)) {
Log->AddEvent(LogLevel_Warning, "Reset MCU to factory CFG!"); Log->AddEvent(LogLevel_Warning, F("Reset MCU to factory CFG!"));
/* wait for ungrounded reset pin, and binking led */ /* wait for ungrounded reset pin, and binking led */
while (digitalRead(CFG_RESET_PIN) == LOW) { while (digitalRead(CFG_RESET_PIN) == LOW) {
@ -220,7 +220,7 @@ void Configuration::CheckResetCfg() {
ESP.restart(); ESP.restart();
} else { } else {
Log->AddEvent(LogLevel_Verbose, "Reset MCU cfg false"); Log->AddEvent(LogLevel_Verbose, F("Reset MCU cfg false"));
} }
} }
@ -306,9 +306,9 @@ void Configuration::SaveString(uint16_t address, uint16_t max_length, String dat
EEPROM.write(i, data.charAt(j)); EEPROM.write(i, data.charAt(j));
} }
EEPROM.commit(); EEPROM.commit();
Log->AddEvent(LogLevel_Verbose, "Write string done"); Log->AddEvent(LogLevel_Verbose, F("Write string done"));
} else { } else {
Log->AddEvent(LogLevel_Verbose, "Skip write string"); Log->AddEvent(LogLevel_Verbose, F("Skip write string"));
} }
} }
/** /**

View File

@ -35,7 +35,7 @@ PrusaConnect::PrusaConnect(Configuration *i_conf, Logs *i_log, Camera *i_camera)
* @return none * @return none
*/ */
void PrusaConnect::Init() { void PrusaConnect::Init() {
log->AddEvent(LogLevel_Info, "Init PrusaConnect lib"); log->AddEvent(LogLevel_Info, F("Init PrusaConnect lib"));
TakePicture(); TakePicture();
} }
@ -46,7 +46,7 @@ void PrusaConnect::Init() {
* @return none * @return none
*/ */
void PrusaConnect::LoadCfgFromEeprom() { void PrusaConnect::LoadCfgFromEeprom() {
log->AddEvent(LogLevel_Info, "Load PrusaConnect CFG from EEPROM"); log->AddEvent(LogLevel_Info, F("Load PrusaConnect CFG from EEPROM"));
Token = config->LoadToken(); Token = config->LoadToken();
Fingerprint = config->LoadFingerprint(); Fingerprint = config->LoadFingerprint();
RefreshInterval = config->LoadRefreshInterval(); RefreshInterval = config->LoadRefreshInterval();
@ -74,9 +74,8 @@ void PrusaConnect::TakePicture() {
* @return true - if data was sent successfully * @return true - if data was sent successfully
* @return false - if data was not sent successfully * @return false - if data was not sent successfully
*/ */
bool PrusaConnect::SendDataToBackend(String *i_data, int i_data_length, String i_content_type, String i_type, String i_url_path, SendDataToBackendType i_data_type) { bool PrusaConnect::SendDataToBackend(String *i_data, int i_data_length, String i_content_type, String i_type, String i_url_path, SendDataToBackendType i_data_type) {
WiFiClientSecure client; WiFiClientSecure client;
Server_pause();
BackendReceivedStatus = ""; BackendReceivedStatus = "";
bool ret = false; bool ret = false;
log->AddEvent(LogLevel_Info, "Sending " + i_type + " to PrusaConnect"); log->AddEvent(LogLevel_Info, "Sending " + i_type + " to PrusaConnect");
@ -85,7 +84,7 @@ bool PrusaConnect::SendDataToBackend(String *i_data, int i_data_length, String i
if ((Fingerprint.length() > 0) && (Token.length() > 0)) { if ((Fingerprint.length() > 0) && (Token.length() > 0)) {
client.setCACert(root_CAs); client.setCACert(root_CAs);
client.setTimeout(1000); client.setTimeout(1000);
log->AddEvent(LogLevel_Verbose, "Connecting to server..."); log->AddEvent(LogLevel_Verbose, F("Connecting to server..."));
/* connecting to server */ /* connecting to server */
if (!client.connect(PrusaConnectHostname.c_str(), 443)) { if (!client.connect(PrusaConnectHostname.c_str(), 443)) {
@ -102,7 +101,7 @@ bool PrusaConnect::SendDataToBackend(String *i_data, int i_data_length, String i
} else { } else {
/* send data to server */ /* send data to server */
log->AddEvent(LogLevel_Verbose, "Connected to server!"); log->AddEvent(LogLevel_Verbose, F("Connected to server!"));
client.println("PUT https://" + PrusaConnectHostname + i_url_path + " HTTP/1.0"); client.println("PUT https://" + PrusaConnectHostname + i_url_path + " HTTP/1.0");
client.println("Host: " + PrusaConnectHostname); client.println("Host: " + PrusaConnectHostname);
client.println("User-Agent: ESP32-CAM"); client.println("User-Agent: ESP32-CAM");
@ -111,14 +110,14 @@ bool PrusaConnect::SendDataToBackend(String *i_data, int i_data_length, String i
client.println("Content-Type: " + i_content_type); client.println("Content-Type: " + i_content_type);
client.println("fingerprint: " + Fingerprint); client.println("fingerprint: " + Fingerprint);
client.println("token: " + Token); client.println("token: " + Token);
client.print("Content-Length: "); client.println("Content-Length: " + String(i_data_length));
client.println(i_data_length);
client.println(); client.println();
esp_task_wdt_reset(); esp_task_wdt_reset();
/* sending photo */
if (SendPhoto == i_data_type) { if (SendPhoto == i_data_type) {
log->AddEvent(LogLevel_Verbose, "Send data photo"); log->AddEvent(LogLevel_Verbose, F("Send data photo"));
int index; int index = 0;
/* send data in fragments */ /* send data in fragments */
for (index = 0; index < i_data_length; index = index + PHOTO_FRAGMENT_SIZE) { for (index = 0; index < i_data_length; index = index + PHOTO_FRAGMENT_SIZE) {
camera->CopyPhoto(i_data, index, index + PHOTO_FRAGMENT_SIZE); camera->CopyPhoto(i_data, index, index + PHOTO_FRAGMENT_SIZE);
@ -128,14 +127,15 @@ bool PrusaConnect::SendDataToBackend(String *i_data, int i_data_length, String i
/* send rest of data */ /* send rest of data */
index -= PHOTO_FRAGMENT_SIZE; index -= PHOTO_FRAGMENT_SIZE;
if((i_data_length > index) && ((i_data_length - index) > 0)) { if ((i_data_length > index) && ((i_data_length - index) > 0)) {
camera->CopyPhoto(i_data, index, i_data_length); camera->CopyPhoto(i_data, index, i_data_length);
client.print(*i_data); client.print(*i_data);
log->AddEvent(LogLevel_Verbose, String(i_data_length) + "/" + String(i_data_length)); log->AddEvent(LogLevel_Verbose, String(i_data_length) + "/" + String(i_data_length));
} }
/* sending device information */
} else if (SendInfo == i_data_type) { } else if (SendInfo == i_data_type) {
log->AddEvent(LogLevel_Verbose, "Send data info"); log->AddEvent(LogLevel_Verbose, F("Send data info"));
client.print(*i_data); client.print(*i_data);
} }
@ -163,26 +163,25 @@ bool PrusaConnect::SendDataToBackend(String *i_data, int i_data_length, String i
} }
} }
} }
log->AddEvent(LogLevel_Verbose, "Full response: " + fullResponse); log->AddEvent(LogLevel_Verbose, "Full response: " + fullResponse);
BackendAvailability = BackendAvailable; BackendAvailability = BackendAvailable;
client.stop(); client.stop();
} }
} else { } else {
/* err message */ /* err message */
log->AddEvent(LogLevel_Verbose, "ERROR SEND DATA TO SERVER! INVALID DATA!"); log->AddEvent(LogLevel_Verbose, F("ERROR SEND DATA TO SERVER! INVALID DATA!"));
log->AddEvent(LogLevel_Verbose, "Fingerprint: " + Fingerprint); log->AddEvent(LogLevel_Verbose, "Fingerprint: " + Fingerprint);
log->AddEvent(LogLevel_Verbose, "Token: " + Token); log->AddEvent(LogLevel_Verbose, "Token: " + Token);
if (Fingerprint.length() == 0) { if (Fingerprint.length() == 0) {
BackendReceivedStatus = "Missing fingerprint"; BackendReceivedStatus = F("Missing fingerprint");
} else if (Token.length() == 0) { } else if (Token.length() == 0) {
BackendReceivedStatus = "Missing token"; BackendReceivedStatus = F("Missing token");
} }
} }
log->AddEvent(LogLevel_Info, "Upload done. Response code: " + BackendReceivedStatus + " ,BA:" + CovertBackendAvailabilitStatusToString(BackendAvailability)); log->AddEvent(LogLevel_Info, "Upload done. Response code: " + BackendReceivedStatus + " ,BA:" + CovertBackendAvailabilitStatusToString(BackendAvailability));
Server_resume();
return ret; return ret;
} }
@ -193,7 +192,8 @@ bool PrusaConnect::SendDataToBackend(String *i_data, int i_data_length, String i
* @return none * @return none
*/ */
void PrusaConnect::SendPhotoToBackend() { void PrusaConnect::SendPhotoToBackend() {
log->AddEvent(LogLevel_Info, "Start sending photo to prusaconnect"); log->AddEvent(LogLevel_Info, F("Start sending photo to prusaconnect"));
String Photo = "";
SendDataToBackend(&Photo, camera->GetPhotoSize(), "image/jpg", "Photo", HOST_URL_CAM_PATH, SendPhoto); SendDataToBackend(&Photo, camera->GetPhotoSize(), "image/jpg", "Photo", HOST_URL_CAM_PATH, SendPhoto);
SystemLog.AddEvent(LogLevel_Info, "Free RAM: " + String(ESP.getFreeHeap()) + " bytes"); SystemLog.AddEvent(LogLevel_Info, "Free RAM: " + String(ESP.getFreeHeap()) + " bytes");
} }
@ -207,7 +207,7 @@ void PrusaConnect::SendInfoToBackend() {
return; return;
} else { } else {
log->AddEvent(LogLevel_Info, "Start sending device information to prusaconnect"); log->AddEvent(LogLevel_Info, F("Start sending device information to prusaconnect"));
JsonDocument json_data; JsonDocument json_data;
String json_string = ""; String json_string = "";
@ -253,40 +253,40 @@ void PrusaConnect::TakePictureAndSendToBackend() {
String PrusaConnect::ProcessHttpResponseCode(int code) { String PrusaConnect::ProcessHttpResponseCode(int code) {
String ret = ""; String ret = "";
switch (code) { switch (code) {
case 200: case 200:
ret = "200 - OK"; ret = F("200 - OK");
break; break;
case 201: case 201:
ret = "201 - OK entry created"; ret = F("201 - OK entry created");
break; break;
case 204: case 204:
ret = "204 - Upload OK"; ret = F("204 - Upload OK");
break; break;
case 304: case 304:
ret = "304 - Response has not been modified"; ret = F("304 - Response has not been modified");
break; break;
case 400: case 400:
ret = "400 - Some data received is not valid"; ret = F("400 - Some data received is not valid");
break; break;
case 401: case 401:
ret = "401 - Missing security toker or it is not valid"; ret = F("401 - Missing security toker or it is not valid");
break; break;
case 403: case 403:
ret = "403 - Security toke is not valid or is outdated"; ret = F("403 - Security toke is not valid or is outdated");
break; break;
case 404: case 404:
ret = "404 - Entity not found or invalid auth token"; ret = F("404 - Entity not found or invalid auth token");
break; break;
case 409: case 409:
ret = "409 - Conflict with the state of target resource (user error)"; ret = F("409 - Conflict with the state of target resource (user error)");
break; break;
case 503: case 503:
ret += "503 - Service is unavailable at this moment. Try again later"; ret += F("503 - Service is unavailable at this moment. Try again later");
break; break;
default: default:
ret = String(code); ret = String(code);
ret += " - unknown error code"; ret += F(" - unknown error code");
break; break;
} }
return ret; return ret;
@ -301,39 +301,39 @@ String PrusaConnect::ProcessHttpResponseCode(int code) {
bool PrusaConnect::ProcessHttpResponseCodeBool(int code) { bool PrusaConnect::ProcessHttpResponseCodeBool(int code) {
bool ret = false; bool ret = false;
switch (code) { switch (code) {
case 200: case 200:
ret = true; ret = true;
break; break;
case 201: case 201:
ret = true; ret = true;
break; break;
case 204: case 204:
ret = true; ret = true;
break; break;
case 304: case 304:
ret = false; ret = false;
break; break;
case 400: case 400:
ret = false; ret = false;
break; break;
case 401: case 401:
ret = false; ret = false;
break; break;
case 403: case 403:
ret = false; ret = false;
break; break;
case 404: case 404:
ret = false; ret = false;
break; break;
case 409: case 409:
ret = false; ret = false;
break; break;
case 503: case 503:
ret = false; ret = false;
break; break;
default: default:
ret = false; ret = false;
break; break;
} }
return ret; return ret;
@ -458,18 +458,18 @@ BackendAvailabilitStatus PrusaConnect::GetBackendAvailabilitStatus() {
String PrusaConnect::CovertBackendAvailabilitStatusToString(BackendAvailabilitStatus i_data) { String PrusaConnect::CovertBackendAvailabilitStatusToString(BackendAvailabilitStatus i_data) {
String ret = ""; String ret = "";
switch (i_data) { switch (i_data) {
case WaitForFirstConnection: case WaitForFirstConnection:
ret = "Wait for first connection"; ret = F("Wait for first connection");
break; break;
case BackendAvailable: case BackendAvailable:
ret = "Backend available"; ret = F("Backend available");
break; break;
case BackendUnavailable: case BackendUnavailable:
ret = "Backend unavailable"; ret = F("Backend unavailable");
break; break;
default: default:
ret = "Unknown"; ret = F("Unknown");
break; break;
} }
return ret; return ret;
@ -491,7 +491,7 @@ void PrusaConnect::IncreaseSendingIntervalCounter() {
* @param uint8_t i_data - counter * @param uint8_t i_data - counter
* @return none * @return none
*/ */
void PrusaConnect::SetSendingIntervalCounter(uint8_t i_data) { void PrusaConnect::SetSendingIntervalCounter(uint8_t i_data) {
SendingIntervalCounter = i_data; SendingIntervalCounter = i_data;
} }

View File

@ -51,12 +51,11 @@ private:
uint8_t RefreshInterval; ///< interval for sending photo to backend uint8_t RefreshInterval; ///< interval for sending photo to backend
String BackendReceivedStatus; ///< status of backend response String BackendReceivedStatus; ///< status of backend response
BackendAvailabilitStatus BackendAvailability; ///< status of backend availability BackendAvailabilitStatus BackendAvailability; ///< status of backend availability
bool SendDeviceInformationToBackend; ///< flag for sending device information to backend bool SendDeviceInformationToBackend; ///< flag for sending device information to backend
uint8_t SendingIntervalCounter; ///< counter for sending interval, represents seconds uint8_t SendingIntervalCounter; ///< counter for sending interval, represents seconds
String Token; ///< token for backend communication String Token; ///< token for backend communication
String Fingerprint; ///< fingerprint for backend communication String Fingerprint; ///< fingerprint for backend communication
String Photo; ///< photo for sending to backend
String PrusaConnectHostname; ///< hostname of prusa connect backend String PrusaConnectHostname; ///< hostname of prusa connect backend
Configuration *config; ///< pointer to configuration object Configuration *config; ///< pointer to configuration object

View File

@ -93,8 +93,8 @@ Logs::Logs(LogLevel_enum i_LogLevel, String i_FilePath, String i_FileName, uint1
@return none @return none
*/ */
void Logs::Init() { void Logs::Init() {
Serial.println("----------------------------------------------------------------"); Serial.println(F("----------------------------------------------------------------"));
Serial.println("Init Logs library"); Serial.println(F("Init Logs library"));
/* init micro SD card */ /* init micro SD card */
InitSdCard(); InitSdCard();
@ -110,22 +110,22 @@ void Logs::Init() {
} }
/* added first message to log file after start MCU */ /* added first message to log file after start MCU */
String msg = "----------------------------------------------------------------\n"; String msg = F("----------------------------------------------------------------\n");
msg += "Start MCU!\nSW Version: "; msg += F("Start MCU!\nSW Version: ");
msg += String(SW_VERSION); msg += String(SW_VERSION);
msg += " ,Build: "; msg += F(" ,Build: ");
msg += String(SW_BUILD); msg += String(SW_BUILD);
msg += "\n"; msg += "\n";
msg += "Verbose mode: "; msg += F("Verbose mode: ");
msg += (true == CONSOLE_VERBOSE_DEBUG) ? "true" : "false"; msg += (true == CONSOLE_VERBOSE_DEBUG) ? "true" : "false";
msg += "\n"; msg += "\n";
msg += "Log level: "; msg += F("Log level: ");
msg += String(LogLevel); msg += String(LogLevel);
msg += "\n"; msg += "\n";
AppendFile(SD_MMC, FilePath + FileName, msg); AppendFile(SD_MMC, FilePath + FileName, msg);
} else { } else {
Serial.println("Micro-SD card not found! Disable logs"); Serial.println(F("Micro-SD card not found! Disable logs"));
} }
} }

View File

@ -14,7 +14,7 @@
#define _MCU_CFG_H_ #define _MCU_CFG_H_
/* ---------------- BASIC MCU CFG --------------*/ /* ---------------- BASIC MCU CFG --------------*/
#define SW_VERSION "1.0.1" ///< SW version #define SW_VERSION "1.0.2-beta" ///< SW version
#define SW_BUILD __DATE__ " " __TIME__ ///< build number #define SW_BUILD __DATE__ " " __TIME__ ///< build number
#define CONSOLE_VERBOSE_DEBUG false ///< enable/disable verbose debug log level for console #define CONSOLE_VERBOSE_DEBUG false ///< enable/disable verbose debug log level for console
#define DEVICE_HOSTNAME "Prusa-ESP32cam" ///< device hostname #define DEVICE_HOSTNAME "Prusa-ESP32cam" ///< device hostname
@ -22,7 +22,7 @@
/* ------------ PRUSA BACKEND CFG --------------*/ /* ------------ PRUSA BACKEND CFG --------------*/
#define HOST_URL_CAM_PATH "/c/snapshot" ///< path for sending photo to prusa connect #define HOST_URL_CAM_PATH "/c/snapshot" ///< path for sending photo to prusa connect
#define HOST_URL_INFO_PATH "/c/info" ///< path for sending info to prusa connect #define HOST_URL_INFO_PATH "/c/info" ///< path for sending info to prusa connect
#define REFRESH_INTERVAL_MIN 5 ///< minimum refresh interval for sending photo to prusa connect [s] #define REFRESH_INTERVAL_MIN 10 ///< minimum refresh interval for sending photo to prusa connect [s]
#define REFRESH_INTERVAL_MAX 240 ///< maximum refresh interval for sending photo to prusa connect [s] #define REFRESH_INTERVAL_MAX 240 ///< maximum refresh interval for sending photo to prusa connect [s]
/* --------------- FLASH LED CFG ---------------*/ /* --------------- FLASH LED CFG ---------------*/
@ -90,6 +90,12 @@
/* ----------------- WiFi CFG -------------------*/ /* ----------------- WiFi CFG -------------------*/
#define WIFI_STA_WDG_TIMEOUT 60000 ///< STA watchdog timeout [ms] #define WIFI_STA_WDG_TIMEOUT 60000 ///< STA watchdog timeout [ms]
/* ----------------- NTP CFG --------------------*/
#define NTP_SERVER_1 "pool.ntp.org" ///< NTP server
#define NTP_SERVER_2 "time.nist.gov" ///< NTP server
#define NTP_GTM_OFFSET_SEC 0 ///< GMT offset in seconds. 0 = UTC. 3600 = GMT+1
#define NTP_DAYLIGHT_OFFSET_SEC 0 ///< daylight offset in seconds. 0 = no daylight saving time. 3600 = +1 hour
/* ---------------- FACTORY CFG ----------------*/ /* ---------------- FACTORY CFG ----------------*/
#define FACTORY_CFG_PHOTO_REFRESH_INTERVAL 30 ///< in the second #define FACTORY_CFG_PHOTO_REFRESH_INTERVAL 30 ///< in the second
#define FACTORY_CFG_PHOTO_QUALITY 10 ///< 10-63, lower is better #define FACTORY_CFG_PHOTO_QUALITY 10 ///< 10-63, lower is better

View File

@ -28,11 +28,11 @@ MicroSd::MicroSd() {
@return none @return none
*/ */
void MicroSd::ReinitCard() { void MicroSd::ReinitCard() {
Serial.println("Reinit micro SD card!"); Serial.println(F("Reinit micro SD card!"));
Serial.println("Deinit micro SD card"); Serial.println(F("Deinit micro SD card"));
SD_MMC.end(); SD_MMC.end();
delay(50); delay(50);
Serial.println("Init micro SD card"); Serial.println(F("Init micro SD card"));
InitSdCard(); InitSdCard();
} }
@ -43,12 +43,12 @@ void MicroSd::ReinitCard() {
*/ */
void MicroSd::InitSdCard() { void MicroSd::InitSdCard() {
/* Start INIT Micro SD card */ /* Start INIT Micro SD card */
Serial.println("Start init micro-SD Card"); Serial.println(F("Start init micro-SD Card"));
/* set SD card to 1-line/1-bit mode. GPIO 4 is used for LED and for microSD card. But communication is slower. */ /* set SD card to 1-line/1-bit mode. GPIO 4 is used for LED and for microSD card. But communication is slower. */
/* https://github.com/espressif/arduino-esp32/blob/master/libraries/SD_MMC/src/SD_MMC.h */ /* https://github.com/espressif/arduino-esp32/blob/master/libraries/SD_MMC/src/SD_MMC.h */
if (!SD_MMC.begin("/sdcard", true)) { if (!SD_MMC.begin("/sdcard", true)) {
Serial.println("SD Card Mount Failed"); Serial.println(F("SD Card Mount Failed"));
CardDetected = false; CardDetected = false;
CardSize = 0; CardSize = 0;
//DetectAfterBoot = false; //DetectAfterBoot = false;
@ -58,7 +58,7 @@ void MicroSd::InitSdCard() {
/* check microSD card and card type */ /* check microSD card and card type */
uint8_t cardType = SD_MMC.cardType(); uint8_t cardType = SD_MMC.cardType();
if (cardType == CARD_NONE) { if (cardType == CARD_NONE) {
Serial.println("No SD_MMC card attached"); Serial.println(F("No SD_MMC card attached"));
CardDetected = false; CardDetected = false;
CardSize = 0; CardSize = 0;
//DetectAfterBoot = false; //DetectAfterBoot = false;
@ -66,15 +66,15 @@ void MicroSd::InitSdCard() {
} }
/* print card type */ /* print card type */
Serial.print("Found card. Card Type: "); Serial.print(F("Found card. Card Type: "));
if (cardType == CARD_MMC) { if (cardType == CARD_MMC) {
Serial.print("MMC"); Serial.print(F("MMC"));
} else if (cardType == CARD_SD) { } else if (cardType == CARD_SD) {
Serial.print("SDSC"); Serial.print(F("SDSC"));
} else if (cardType == CARD_SDHC) { } else if (cardType == CARD_SDHC) {
Serial.print("SDHC"); Serial.print(F("SDHC"));
} else { } else {
Serial.print("UNKNOWN"); Serial.print(F("UNKNOWN"));
} }
/* calculation card size */ /* calculation card size */
@ -97,26 +97,26 @@ void MicroSd::ListDir(fs::FS &fs, String DirName, uint8_t levels) {
File root = fs.open(DirName.c_str()); File root = fs.open(DirName.c_str());
if (!root) { if (!root) {
Serial.println("Failed to open directory"); Serial.println(F("Failed to open directory"));
return; return;
} }
if (!root.isDirectory()) { if (!root.isDirectory()) {
Serial.println("Not a directory"); Serial.println(F("Not a directory"));
return; return;
} }
File file = root.openNextFile(); File file = root.openNextFile();
while (file) { while (file) {
if (file.isDirectory()) { if (file.isDirectory()) {
Serial.print(" DIR : "); Serial.print(F(" DIR : "));
Serial.println(file.name()); Serial.println(file.name());
if (levels) { if (levels) {
ListDir(fs, file.path(), levels - 1); ListDir(fs, file.path(), levels - 1);
} }
} else { } else {
Serial.print(" FILE: "); Serial.print(F(" FILE: "));
Serial.print(file.name()); Serial.print(file.name());
Serial.print(" SIZE: "); Serial.print(F(" SIZE: "));
Serial.println(file.size()); Serial.println(file.size());
} }
file = root.openNextFile(); file = root.openNextFile();
@ -184,11 +184,11 @@ void MicroSd::ReadFileConsole(fs::FS &fs, String path) {
File file = fs.open(path.c_str()); File file = fs.open(path.c_str());
if (!file) { if (!file) {
Serial.println("Failed to open file for reading"); Serial.println(F("Failed to open file for reading"));
return; return;
} }
Serial.print("Read from file: "); Serial.print(F("Read from file: "));
while (file.available()) { while (file.available()) {
Serial.write(file.read()); Serial.write(file.read());
} }
@ -355,11 +355,11 @@ uint16_t MicroSd::FileCount(fs::FS &fs, String DirName, String FileName) {
File root = fs.open(DirName.c_str()); File root = fs.open(DirName.c_str());
if (!root) { if (!root) {
Serial.println("Failed to open directory"); Serial.println(F("Failed to open directory"));
return 0; return 0;
} }
if (!root.isDirectory()) { if (!root.isDirectory()) {
Serial.println("Not a directory"); Serial.println(F("Not a directory"));
return 0; return 0;
} }

View File

@ -90,27 +90,27 @@ String lastTwoChars = command.substring(command.length() - 2);
connect->SetToken(auth_token); connect->SetToken(auth_token);
} else if (command.startsWith("wificonnect") && command.endsWith(";")) { } else if (command.startsWith("wificonnect") && command.endsWith(";")) {
log->AddEvent(LogLevel_Info, "--> Console connecting to wifi..."); log->AddEvent(LogLevel_Info, F("--> Console connecting to wifi..."));
wifim->ConnectToSta(); wifim->ConnectToSta();
} else if (command.startsWith("getwifimode") && command.endsWith(";")) { } else if (command.startsWith("getwifimode") && command.endsWith(";")) {
log->AddEvent(LogLevel_Info, "--> Console print WiFi mode..."); log->AddEvent(LogLevel_Info, F("--> Console print WiFi mode..."));
Serial.print("wifimode:" + wifim->GetWiFiMode() + ";"); Serial.print("wifimode:" + wifim->GetWiFiMode() + ";");
} else if (command.startsWith("getwifistastatus") && command.endsWith(";")) { } else if (command.startsWith("getwifistastatus") && command.endsWith(";")) {
log->AddEvent(LogLevel_Info, "--> Console print STA status..."); log->AddEvent(LogLevel_Info, F("--> Console print STA status..."));
Serial.print("wifistastatus:" + wifim->GetStaStatus() + ";"); Serial.print("wifistastatus:" + wifim->GetStaStatus() + ";");
} else if (command.startsWith("getwifistaip") && command.endsWith(";")) { } else if (command.startsWith("getwifistaip") && command.endsWith(";")) {
log->AddEvent(LogLevel_Info, "--> Console print STA IP..."); log->AddEvent(LogLevel_Info, F("--> Console print STA IP..."));
Serial.print("wifistaip:" + wifim->GetStaIp() + ";"); Serial.print("wifistaip:" + wifim->GetStaIp() + ";");
} else if (command.startsWith("getserviceapssid") && command.endsWith(";")) { } else if (command.startsWith("getserviceapssid") && command.endsWith(";")) {
log->AddEvent(LogLevel_Info, "--> Console print service WiFi AP SSID..."); log->AddEvent(LogLevel_Info, F("--> Console print service WiFi AP SSID..."));
Serial.print("getserviceapssid:" + wifim->GetServiceApSsid() + ";"); Serial.print("getserviceapssid:" + wifim->GetServiceApSsid() + ";");
} else if (command.startsWith("mcureboot") && command.endsWith(";")) { } else if (command.startsWith("mcureboot") && command.endsWith(";")) {
log->AddEvent(LogLevel_Warning, "--> Reboot MCU!"); log->AddEvent(LogLevel_Warning, F("--> Reboot MCU!"));
ESP.restart(); ESP.restart();
} else if (command.startsWith("commandslist") && command.endsWith(";")) { } else if (command.startsWith("commandslist") && command.endsWith(";")) {
@ -130,17 +130,17 @@ String lastTwoChars = command.substring(command.length() - 2);
@return none @return none
*/ */
void SerialCfg::PrintAvailableCommands() { void SerialCfg::PrintAvailableCommands() {
Serial.println("Available commands: "); Serial.println(F("Available commands: "));
Serial.println("setwifissid:SSID; - set WiFi SSID"); Serial.println(F("setwifissid:SSID; - set WiFi SSID"));
Serial.println("setwifipass:PASS; - set WiFi password"); Serial.println(F("setwifipass:PASS; - set WiFi password"));
Serial.println("setauthtoken:TOKEN; - set auth TOKEN for backend"); Serial.println(F("setauthtoken:TOKEN; - set auth TOKEN for backend"));
Serial.println("wificonnect; - connect to WiFi network"); Serial.println(F("wificonnect; - connect to WiFi network"));
Serial.println("getwifimode; - get WiFi mode (AP/STA)"); Serial.println(F("getwifimode; - get WiFi mode (AP/STA)"));
Serial.println("getwifistastatus; - get STA status (connected/disconnected)"); Serial.println(F("getwifistastatus; - get STA status (connected/disconnected)"));
Serial.println("getwifistaip; - get STA IP address"); Serial.println(F("getwifistaip; - get STA IP address"));
Serial.println("getserviceapssid;- get service WiFi AP SSID"); Serial.println(F("getserviceapssid;- get service WiFi AP SSID"));
Serial.println("mcureboot; - reboot MCU"); Serial.println(F("mcureboot; - reboot MCU"));
Serial.println("commandslist; - print available commands"); Serial.println(F("commandslist; - print available commands"));
} }
/* EOF */ /* EOF */

View File

@ -32,11 +32,11 @@ void Server_LoadCfg() {
@return none @return none
*/ */
void Server_InitWebServer() { void Server_InitWebServer() {
SystemLog.AddEvent(LogLevel_Info, "Starting init WEB server"); SystemLog.AddEvent(LogLevel_Info, F("Starting init WEB server"));
/* route for get last capture photo */ /* route for get last capture photo */
server.on("/saved-photo.jpg", HTTP_GET, [](AsyncWebServerRequest* request) { server.on("/saved-photo.jpg", HTTP_GET, [](AsyncWebServerRequest* request) {
SystemLog.AddEvent(LogLevel_Verbose, "WEB server: get photo"); SystemLog.AddEvent(LogLevel_Verbose, F("WEB server: get photo"));
if (Server_CheckBasicAuth(request) == false) if (Server_CheckBasicAuth(request) == false)
return; return;
@ -45,7 +45,7 @@ void Server_InitWebServer() {
/* route to jquery */ /* route to jquery */
server.on("/jquery-3.7.0.min.js", HTTP_GET, [](AsyncWebServerRequest* request) { server.on("/jquery-3.7.0.min.js", HTTP_GET, [](AsyncWebServerRequest* request) {
SystemLog.AddEvent(LogLevel_Verbose, "WEB server: Get jquery-3.7.0.min.js"); SystemLog.AddEvent(LogLevel_Verbose, F("WEB server: Get jquery-3.7.0.min.js"));
if (Server_CheckBasicAuth(request) == false) if (Server_CheckBasicAuth(request) == false)
return; return;
@ -75,7 +75,7 @@ void Server_InitWebServer() {
void Server_InitWebServer_JsonData() { void Server_InitWebServer_JsonData() {
/* route for json with cfg parameters */ /* route for json with cfg parameters */
server.on("/json_input", HTTP_GET, [](AsyncWebServerRequest* request) { server.on("/json_input", HTTP_GET, [](AsyncWebServerRequest* request) {
SystemLog.AddEvent(LogLevel_Verbose, "WEB server: get json_input"); SystemLog.AddEvent(LogLevel_Verbose, F("WEB server: get json_input"));
if (Server_CheckBasicAuth(request) == false) if (Server_CheckBasicAuth(request) == false)
return; return;
request->send_P(200, F("text/plain"), Server_GetJsonData().c_str()); request->send_P(200, F("text/plain"), Server_GetJsonData().c_str());
@ -83,7 +83,7 @@ void Server_InitWebServer_JsonData() {
/* route for json with wifi networks */ /* route for json with wifi networks */
server.on("/json_wifi", HTTP_GET, [](AsyncWebServerRequest* request) { server.on("/json_wifi", HTTP_GET, [](AsyncWebServerRequest* request) {
SystemLog.AddEvent(LogLevel_Verbose, "WEB server: get json_wifi"); SystemLog.AddEvent(LogLevel_Verbose, F("WEB server: get json_wifi"));
if (Server_CheckBasicAuth(request) == false) if (Server_CheckBasicAuth(request) == false)
return; return;
request->send_P(200, F("text/plain"), SystemWifiMngt.GetAvailableWifiNetworks().c_str()); request->send_P(200, F("text/plain"), SystemWifiMngt.GetAvailableWifiNetworks().c_str());
@ -91,7 +91,7 @@ void Server_InitWebServer_JsonData() {
/* route for san wi-fi networks */ /* route for san wi-fi networks */
server.on("/wifi_scan", HTTP_GET, [](AsyncWebServerRequest* request) { server.on("/wifi_scan", HTTP_GET, [](AsyncWebServerRequest* request) {
SystemLog.AddEvent(LogLevel_Verbose, "WEB server: scan WI-FI networks"); SystemLog.AddEvent(LogLevel_Verbose, F("WEB server: scan WI-FI networks"));
if (Server_CheckBasicAuth(request) == false) if (Server_CheckBasicAuth(request) == false)
return; return;
request->send_P(200, F("text/html"), MSG_SCANNING); request->send_P(200, F("text/html"), MSG_SCANNING);
@ -123,7 +123,7 @@ void Server_InitWebServer_JsonData() {
void Server_InitWebServer_WebPages() { void Server_InitWebServer_WebPages() {
/* Route for root / web page */ /* Route for root / web page */
server.on("/", HTTP_GET, [](AsyncWebServerRequest* request) { server.on("/", HTTP_GET, [](AsyncWebServerRequest* request) {
SystemLog.AddEvent(LogLevel_Verbose, "WEB server: Get index.html"); SystemLog.AddEvent(LogLevel_Verbose, F("WEB server: Get index.html"));
if (Server_CheckBasicAuth(request) == false) if (Server_CheckBasicAuth(request) == false)
return; return;
@ -132,7 +132,7 @@ void Server_InitWebServer_WebPages() {
/* Route for styles */ /* Route for styles */
server.on("/styles.css", HTTP_GET, [](AsyncWebServerRequest* request) { server.on("/styles.css", HTTP_GET, [](AsyncWebServerRequest* request) {
SystemLog.AddEvent(LogLevel_Verbose, "WEB server: Get styles.css"); SystemLog.AddEvent(LogLevel_Verbose, F("WEB server: Get styles.css"));
if (Server_CheckBasicAuth(request) == false) if (Server_CheckBasicAuth(request) == false)
return; return;
@ -141,7 +141,7 @@ void Server_InitWebServer_WebPages() {
/* Route for java scripts */ /* Route for java scripts */
server.on("/scripts.js", HTTP_GET, [](AsyncWebServerRequest* request) { server.on("/scripts.js", HTTP_GET, [](AsyncWebServerRequest* request) {
SystemLog.AddEvent(LogLevel_Verbose, "WEB server: Get scripts.js"); SystemLog.AddEvent(LogLevel_Verbose, F("WEB server: Get scripts.js"));
if (Server_CheckBasicAuth(request) == false) if (Server_CheckBasicAuth(request) == false)
return; return;
request->send_P(200, "application/javascript", scripts_js); request->send_P(200, "application/javascript", scripts_js);
@ -150,7 +150,7 @@ void Server_InitWebServer_WebPages() {
/* Route for config web page */ /* Route for config web page */
server.on("/page_config.html", HTTP_GET, [](AsyncWebServerRequest* request) { server.on("/page_config.html", HTTP_GET, [](AsyncWebServerRequest* request) {
SystemLog.AddEvent(LogLevel_Verbose, "WEB server: Get page_config.html"); SystemLog.AddEvent(LogLevel_Verbose, F("WEB server: Get page_config.html"));
if (Server_CheckBasicAuth(request) == false) if (Server_CheckBasicAuth(request) == false)
return; return;
@ -159,7 +159,7 @@ void Server_InitWebServer_WebPages() {
/* Route for wifi web page */ /* Route for wifi web page */
server.on("/page_wifi.html", HTTP_GET, [](AsyncWebServerRequest* request) { server.on("/page_wifi.html", HTTP_GET, [](AsyncWebServerRequest* request) {
SystemLog.AddEvent(LogLevel_Verbose, "WEB server: Get page_wifi.html"); SystemLog.AddEvent(LogLevel_Verbose, F("WEB server: Get page_wifi.html"));
if (Server_CheckBasicAuth(request) == false) if (Server_CheckBasicAuth(request) == false)
return; return;
@ -168,7 +168,7 @@ void Server_InitWebServer_WebPages() {
/* Route for auth web page */ /* Route for auth web page */
server.on("/page_auth.html", HTTP_GET, [](AsyncWebServerRequest* request) { server.on("/page_auth.html", HTTP_GET, [](AsyncWebServerRequest* request) {
SystemLog.AddEvent(LogLevel_Verbose, "WEB server: Get page_auth.html"); SystemLog.AddEvent(LogLevel_Verbose, F("WEB server: Get page_auth.html"));
if (Server_CheckBasicAuth(request) == false) if (Server_CheckBasicAuth(request) == false)
return; return;
@ -177,7 +177,7 @@ void Server_InitWebServer_WebPages() {
/* Route for system web page */ /* Route for system web page */
server.on("/page_system.html", HTTP_GET, [](AsyncWebServerRequest* request) { server.on("/page_system.html", HTTP_GET, [](AsyncWebServerRequest* request) {
SystemLog.AddEvent(LogLevel_Verbose, "WEB server: Get page_system.html"); SystemLog.AddEvent(LogLevel_Verbose, F("WEB server: Get page_system.html"));
if (Server_CheckBasicAuth(request) == false) if (Server_CheckBasicAuth(request) == false)
return; return;
@ -186,7 +186,7 @@ void Server_InitWebServer_WebPages() {
/* route to license page */ /* route to license page */
server.on("/license.html", HTTP_GET, [](AsyncWebServerRequest* request) { server.on("/license.html", HTTP_GET, [](AsyncWebServerRequest* request) {
SystemLog.AddEvent(LogLevel_Verbose, "WEB server: Get license.html"); SystemLog.AddEvent(LogLevel_Verbose, F("WEB server: Get license.html"));
if (Server_CheckBasicAuth(request) == false) if (Server_CheckBasicAuth(request) == false)
return; return;
@ -195,7 +195,7 @@ void Server_InitWebServer_WebPages() {
/* route to gtac page */ /* route to gtac page */
server.on("/gtac.html", HTTP_GET, [](AsyncWebServerRequest* request) { server.on("/gtac.html", HTTP_GET, [](AsyncWebServerRequest* request) {
SystemLog.AddEvent(LogLevel_Verbose, "WEB server: Get gtac.html"); SystemLog.AddEvent(LogLevel_Verbose, F("WEB server: Get gtac.html"));
if (Server_CheckBasicAuth(request) == false) if (Server_CheckBasicAuth(request) == false)
return; return;
@ -204,7 +204,7 @@ void Server_InitWebServer_WebPages() {
/* route to privacy policy page */ /* route to privacy policy page */
server.on("/privacypolicy.html", HTTP_GET, [](AsyncWebServerRequest* request) { server.on("/privacypolicy.html", HTTP_GET, [](AsyncWebServerRequest* request) {
SystemLog.AddEvent(LogLevel_Verbose, "WEB server: Get privacypolicy.html"); SystemLog.AddEvent(LogLevel_Verbose, F("WEB server: Get privacypolicy.html"));
if (Server_CheckBasicAuth(request) == false) if (Server_CheckBasicAuth(request) == false)
return; return;
@ -213,7 +213,7 @@ void Server_InitWebServer_WebPages() {
/* route to cookie page */ /* route to cookie page */
server.on("/cookie.html", HTTP_GET, [](AsyncWebServerRequest* request) { server.on("/cookie.html", HTTP_GET, [](AsyncWebServerRequest* request) {
SystemLog.AddEvent(LogLevel_Verbose, "WEB server: Get cookie.html"); SystemLog.AddEvent(LogLevel_Verbose, F("WEB server: Get cookie.html"));
if (Server_CheckBasicAuth(request) == false) if (Server_CheckBasicAuth(request) == false)
return; return;
@ -222,7 +222,7 @@ void Server_InitWebServer_WebPages() {
/* route to logs page */ /* route to logs page */
server.on("/get_logs", HTTP_GET, [](AsyncWebServerRequest* request) { server.on("/get_logs", HTTP_GET, [](AsyncWebServerRequest* request) {
SystemLog.AddEvent(LogLevel_Verbose, "WEB server: Get get_logs.html"); SystemLog.AddEvent(LogLevel_Verbose, F("WEB server: Get get_logs.html"));
if (Server_CheckBasicAuth(request) == false) if (Server_CheckBasicAuth(request) == false)
return; return;
@ -242,7 +242,7 @@ void Server_InitWebServer_WebPages() {
void Server_InitWebServer_Icons() { void Server_InitWebServer_Icons() {
/* route to logo */ /* route to logo */
server.on("/esp32_cam.svg", HTTP_GET, [](AsyncWebServerRequest* request) { server.on("/esp32_cam.svg", HTTP_GET, [](AsyncWebServerRequest* request) {
SystemLog.AddEvent(LogLevel_Verbose, "WEB server: Get esp32_cam.svg"); SystemLog.AddEvent(LogLevel_Verbose, F("WEB server: Get esp32_cam.svg"));
if (Server_CheckBasicAuth(request) == false) if (Server_CheckBasicAuth(request) == false)
return; return;
@ -251,7 +251,7 @@ void Server_InitWebServer_Icons() {
/* route to github icon */ /* route to github icon */
server.on("/github-icon.svg", HTTP_GET, [](AsyncWebServerRequest* request) { server.on("/github-icon.svg", HTTP_GET, [](AsyncWebServerRequest* request) {
SystemLog.AddEvent(LogLevel_Verbose, "WEB server: Get github-icon.svg"); SystemLog.AddEvent(LogLevel_Verbose, F("WEB server: Get github-icon.svg"));
if (Server_CheckBasicAuth(request) == false) if (Server_CheckBasicAuth(request) == false)
return; return;
@ -260,7 +260,7 @@ void Server_InitWebServer_Icons() {
/* route to light on icon */ /* route to light on icon */
server.on("/light-on-icon.svg", HTTP_GET, [](AsyncWebServerRequest* request) { server.on("/light-on-icon.svg", HTTP_GET, [](AsyncWebServerRequest* request) {
SystemLog.AddEvent(LogLevel_Verbose, "WEB server: Get light-icon.svg"); SystemLog.AddEvent(LogLevel_Verbose, F("WEB server: Get light-icon.svg"));
if (Server_CheckBasicAuth(request) == false) if (Server_CheckBasicAuth(request) == false)
return; return;
@ -269,7 +269,7 @@ void Server_InitWebServer_Icons() {
/* route to light off icon */ /* route to light off icon */
server.on("/light-off-icon.svg", HTTP_GET, [](AsyncWebServerRequest* request) { server.on("/light-off-icon.svg", HTTP_GET, [](AsyncWebServerRequest* request) {
SystemLog.AddEvent(LogLevel_Verbose, "WEB server: Get light-icon.svg"); SystemLog.AddEvent(LogLevel_Verbose, F("WEB server: Get light-icon.svg"));
if (Server_CheckBasicAuth(request) == false) if (Server_CheckBasicAuth(request) == false)
return; return;
@ -278,7 +278,7 @@ void Server_InitWebServer_Icons() {
/* route to refresh icon */ /* route to refresh icon */
server.on("/refresh-icon.svg", HTTP_GET, [](AsyncWebServerRequest* request) { server.on("/refresh-icon.svg", HTTP_GET, [](AsyncWebServerRequest* request) {
SystemLog.AddEvent(LogLevel_Verbose, "WEB server: Get refresh-icon.svg"); SystemLog.AddEvent(LogLevel_Verbose, F("WEB server: Get refresh-icon.svg"));
if (Server_CheckBasicAuth(request) == false) if (Server_CheckBasicAuth(request) == false)
return; return;
@ -287,7 +287,7 @@ void Server_InitWebServer_Icons() {
/* route to reboot icon */ /* route to reboot icon */
server.on("/reboot-icon.svg", HTTP_GET, [](AsyncWebServerRequest* request) { server.on("/reboot-icon.svg", HTTP_GET, [](AsyncWebServerRequest* request) {
SystemLog.AddEvent(LogLevel_Verbose, "WEB server: Get reboot-icon.svg"); SystemLog.AddEvent(LogLevel_Verbose, F("WEB server: Get reboot-icon.svg"));
if (Server_CheckBasicAuth(request) == false) if (Server_CheckBasicAuth(request) == false)
return; return;
@ -296,7 +296,7 @@ void Server_InitWebServer_Icons() {
/* route to wifi icon */ /* route to wifi icon */
server.on("/wifi-icon-1.svg", HTTP_GET, [](AsyncWebServerRequest* request) { server.on("/wifi-icon-1.svg", HTTP_GET, [](AsyncWebServerRequest* request) {
SystemLog.AddEvent(LogLevel_Verbose, "WEB server: Get wifi-icon-1.svg"); SystemLog.AddEvent(LogLevel_Verbose, F("WEB server: Get wifi-icon-1.svg"));
if (Server_CheckBasicAuth(request) == false) if (Server_CheckBasicAuth(request) == false)
return; return;
@ -305,7 +305,7 @@ void Server_InitWebServer_Icons() {
/* route to wifi icon */ /* route to wifi icon */
server.on("/wifi-icon-2.svg", HTTP_GET, [](AsyncWebServerRequest* request) { server.on("/wifi-icon-2.svg", HTTP_GET, [](AsyncWebServerRequest* request) {
SystemLog.AddEvent(LogLevel_Verbose, "WEB server: Get wifi-icon-2.svg"); SystemLog.AddEvent(LogLevel_Verbose, F("WEB server: Get wifi-icon-2.svg"));
if (Server_CheckBasicAuth(request) == false) if (Server_CheckBasicAuth(request) == false)
return; return;
@ -314,7 +314,7 @@ void Server_InitWebServer_Icons() {
/* route to wifi icon */ /* route to wifi icon */
server.on("/wifi-icon-3.svg", HTTP_GET, [](AsyncWebServerRequest* request) { server.on("/wifi-icon-3.svg", HTTP_GET, [](AsyncWebServerRequest* request) {
SystemLog.AddEvent(LogLevel_Verbose, "WEB server: Get wifi-icon-3.svg"); SystemLog.AddEvent(LogLevel_Verbose, F("WEB server: Get wifi-icon-3.svg"));
if (Server_CheckBasicAuth(request) == false) if (Server_CheckBasicAuth(request) == false)
return; return;
@ -323,7 +323,7 @@ void Server_InitWebServer_Icons() {
/* route to wifi icon */ /* route to wifi icon */
server.on("/wifi-icon-4.svg", HTTP_GET, [](AsyncWebServerRequest* request) { server.on("/wifi-icon-4.svg", HTTP_GET, [](AsyncWebServerRequest* request) {
SystemLog.AddEvent(LogLevel_Verbose, "WEB server: Get wifi-icon-4.svg"); SystemLog.AddEvent(LogLevel_Verbose, F("WEB server: Get wifi-icon-4.svg"));
if (Server_CheckBasicAuth(request) == false) if (Server_CheckBasicAuth(request) == false)
return; return;
@ -332,7 +332,7 @@ void Server_InitWebServer_Icons() {
/* route to wifi icon */ /* route to wifi icon */
server.on("/wifi-icon-0.svg", HTTP_GET, [](AsyncWebServerRequest* request) { server.on("/wifi-icon-0.svg", HTTP_GET, [](AsyncWebServerRequest* request) {
SystemLog.AddEvent(LogLevel_Verbose, "WEB server: Get wifi-icon-0.svg"); SystemLog.AddEvent(LogLevel_Verbose, F("WEB server: Get wifi-icon-0.svg"));
if (Server_CheckBasicAuth(request) == false) if (Server_CheckBasicAuth(request) == false)
return; return;
@ -341,7 +341,7 @@ void Server_InitWebServer_Icons() {
/* route to eye icon */ /* route to eye icon */
server.on("/eye.svg", HTTP_GET, [](AsyncWebServerRequest* request) { server.on("/eye.svg", HTTP_GET, [](AsyncWebServerRequest* request) {
SystemLog.AddEvent(LogLevel_Verbose, "WEB server: Get eye.svg"); SystemLog.AddEvent(LogLevel_Verbose, F("WEB server: Get eye.svg"));
if (Server_CheckBasicAuth(request) == false) if (Server_CheckBasicAuth(request) == false)
return; return;
@ -350,7 +350,7 @@ void Server_InitWebServer_Icons() {
/* route to eye-slash icon */ /* route to eye-slash icon */
server.on("/eye-slash.svg", HTTP_GET, [](AsyncWebServerRequest* request) { server.on("/eye-slash.svg", HTTP_GET, [](AsyncWebServerRequest* request) {
SystemLog.AddEvent(LogLevel_Verbose, "WEB server: Get eye-slash.svg"); SystemLog.AddEvent(LogLevel_Verbose, F("WEB server: Get eye-slash.svg"));
if (Server_CheckBasicAuth(request) == false) if (Server_CheckBasicAuth(request) == false)
return; return;
@ -359,7 +359,7 @@ void Server_InitWebServer_Icons() {
/* route to favicon */ /* route to favicon */
server.on("/favicon.svg", HTTP_GET, [](AsyncWebServerRequest* request) { server.on("/favicon.svg", HTTP_GET, [](AsyncWebServerRequest* request) {
SystemLog.AddEvent(LogLevel_Verbose, "WEB server: Get favicon.svg"); SystemLog.AddEvent(LogLevel_Verbose, F("WEB server: Get favicon.svg"));
if (Server_CheckBasicAuth(request) == false) if (Server_CheckBasicAuth(request) == false)
return; return;
@ -375,7 +375,7 @@ void Server_InitWebServer_Icons() {
void Server_InitWebServer_Actions() { void Server_InitWebServer_Actions() {
/*route for capture photo */ /*route for capture photo */
server.on("/action_capture", HTTP_GET, [](AsyncWebServerRequest* request) { server.on("/action_capture", HTTP_GET, [](AsyncWebServerRequest* request) {
SystemLog.AddEvent(LogLevel_Verbose, "WEB server: /action_capture Take photo"); SystemLog.AddEvent(LogLevel_Verbose, F("WEB server: /action_capture Take photo"));
if (Server_CheckBasicAuth(request) == false) if (Server_CheckBasicAuth(request) == false)
return; return;
SystemCamera.CapturePhoto(); SystemCamera.CapturePhoto();
@ -384,7 +384,7 @@ void Server_InitWebServer_Actions() {
/* route for send photo to prusa backend */ /* route for send photo to prusa backend */
server.on("/action_send", HTTP_GET, [](AsyncWebServerRequest* request) { server.on("/action_send", HTTP_GET, [](AsyncWebServerRequest* request) {
SystemLog.AddEvent(LogLevel_Verbose, "WEB server: /action_send send photo to cloud"); SystemLog.AddEvent(LogLevel_Verbose, F("WEB server: /action_send send photo to cloud"));
if (Server_CheckBasicAuth(request) == false) if (Server_CheckBasicAuth(request) == false)
return; return;
Connect.SetSendingIntervalExpired(); Connect.SetSendingIntervalExpired();
@ -393,7 +393,7 @@ void Server_InitWebServer_Actions() {
/* route for change LED status */ /* route for change LED status */
server.on("/action_led", HTTP_GET, [](AsyncWebServerRequest* request) { server.on("/action_led", HTTP_GET, [](AsyncWebServerRequest* request) {
SystemLog.AddEvent(LogLevel_Verbose, "WEB server: /action_led Change LED status"); SystemLog.AddEvent(LogLevel_Verbose, F("WEB server: /action_led Change LED status"));
if (Server_CheckBasicAuth(request) == false) if (Server_CheckBasicAuth(request) == false)
return; return;
@ -405,7 +405,7 @@ void Server_InitWebServer_Actions() {
/* reboot MCU */ /* reboot MCU */
server.on("/action_reboot", HTTP_GET, [](AsyncWebServerRequest* request) { server.on("/action_reboot", HTTP_GET, [](AsyncWebServerRequest* request) {
SystemLog.AddEvent(LogLevel_Verbose, "WEB server: /action_reboo reboot MCU!"); SystemLog.AddEvent(LogLevel_Verbose, F("WEB server: /action_reboo reboot MCU!"));
if (Server_CheckBasicAuth(request) == false) if (Server_CheckBasicAuth(request) == false)
return; return;
request->send_P(200, F("text/html"), MSG_REBOOT_MCU); request->send_P(200, F("text/html"), MSG_REBOOT_MCU);
@ -422,7 +422,7 @@ void Server_InitWebServer_Actions() {
void Server_InitWebServer_Sets() { void Server_InitWebServer_Sets() {
/* route to set integer value */ /* route to set integer value */
server.on("/set_int", HTTP_GET, [](AsyncWebServerRequest* request) { server.on("/set_int", HTTP_GET, [](AsyncWebServerRequest* request) {
SystemLog.AddEvent(LogLevel_Verbose, "WEB server: /set_int"); SystemLog.AddEvent(LogLevel_Verbose, F("WEB server: /set_int"));
if (Server_CheckBasicAuth(request) == false) if (Server_CheckBasicAuth(request) == false)
return; return;
@ -431,24 +431,20 @@ void Server_InitWebServer_Sets() {
/* set refresh interval */ /* set refresh interval */
if (request->hasParam("refresh")) { if (request->hasParam("refresh")) {
SystemLog.AddEvent(LogLevel_Verbose, "Set refresh interval"); SystemLog.AddEvent(LogLevel_Verbose, F("Set refresh interval"));
uint8_t value = request->getParam("refresh")->value().toInt(); uint8_t value = request->getParam("refresh")->value().toInt();
if ((value >= REFRESH_INTERVAL_MIN) && (value <= REFRESH_INTERVAL_MAX)) { if ((value >= REFRESH_INTERVAL_MIN) && (value <= REFRESH_INTERVAL_MAX)) {
Connect.SetRefreshInterval(value); Connect.SetRefreshInterval(value);
response_msg = MSG_SAVE_OK; response_msg = MSG_SAVE_OK;
} else { } else {
response_msg = "ERROR! Bad value. Minimum is "; response_msg = "ERROR! Bad value. Minimum is " + String(REFRESH_INTERVAL_MIN) + ", maximum " + String(REFRESH_INTERVAL_MAX) + " second";
response_msg += String(REFRESH_INTERVAL_MIN);
response_msg += ", maximum ";
response_msg += String(REFRESH_INTERVAL_MAX);
response_msg += " second";
} }
response = true; response = true;
} }
/* set saturation */ /* set saturation */
if (request->hasParam("saturation")) { if (request->hasParam("saturation")) {
SystemLog.AddEvent(LogLevel_Verbose, "set saturation"); SystemLog.AddEvent(LogLevel_Verbose, F("Set saturation"));
SystemCamera.SetSaturation(request->getParam("saturation")->value().toInt()); SystemCamera.SetSaturation(request->getParam("saturation")->value().toInt());
response_msg = MSG_SAVE_OK; response_msg = MSG_SAVE_OK;
response = true; response = true;
@ -456,7 +452,7 @@ void Server_InitWebServer_Sets() {
/* set contrast */ /* set contrast */
if (request->hasParam("contrast")) { if (request->hasParam("contrast")) {
SystemLog.AddEvent(LogLevel_Verbose, "set contrast"); SystemLog.AddEvent(LogLevel_Verbose, F("Set contrast"));
SystemCamera.SetContrast(request->getParam("contrast")->value().toInt()); SystemCamera.SetContrast(request->getParam("contrast")->value().toInt());
response_msg = MSG_SAVE_OK; response_msg = MSG_SAVE_OK;
response = true; response = true;
@ -464,7 +460,7 @@ void Server_InitWebServer_Sets() {
/* set brightness */ /* set brightness */
if (request->hasParam("brightness")) { if (request->hasParam("brightness")) {
SystemLog.AddEvent(LogLevel_Verbose, "Set brightness"); SystemLog.AddEvent(LogLevel_Verbose, F("Set brightness"));
SystemCamera.SetBrightness(request->getParam("brightness")->value().toInt()); SystemCamera.SetBrightness(request->getParam("brightness")->value().toInt());
response_msg = MSG_SAVE_OK; response_msg = MSG_SAVE_OK;
response = true; response = true;
@ -472,7 +468,7 @@ void Server_InitWebServer_Sets() {
/* set frame size */ /* set frame size */
if (request->hasParam("framesize")) { if (request->hasParam("framesize")) {
SystemLog.AddEvent(LogLevel_Verbose, "Set framesize"); SystemLog.AddEvent(LogLevel_Verbose, F("Set framesize"));
SystemCamera.SetFrameSize(request->getParam("framesize")->value().toInt()); SystemCamera.SetFrameSize(request->getParam("framesize")->value().toInt());
response_msg = MSG_SAVE_OK; response_msg = MSG_SAVE_OK;
response = true; response = true;
@ -480,7 +476,7 @@ void Server_InitWebServer_Sets() {
/* set photo quality */ /* set photo quality */
if (request->hasParam("photo_quality")) { if (request->hasParam("photo_quality")) {
SystemLog.AddEvent(LogLevel_Verbose, "Set photo_quality"); SystemLog.AddEvent(LogLevel_Verbose, F("Set photo_quality"));
SystemCamera.SetPhotoQuality(73 - request->getParam("photo_quality")->value().toInt()); SystemCamera.SetPhotoQuality(73 - request->getParam("photo_quality")->value().toInt());
response_msg = MSG_SAVE_OK; response_msg = MSG_SAVE_OK;
response = true; response = true;
@ -488,7 +484,7 @@ void Server_InitWebServer_Sets() {
/* set flash time */ /* set flash time */
if (request->hasParam("flash_time")) { if (request->hasParam("flash_time")) {
SystemLog.AddEvent(LogLevel_Verbose, "Set flash_time"); SystemLog.AddEvent(LogLevel_Verbose, F("Set flash_time"));
SystemCamera.SetCameraFlashTime(request->getParam("flash_time")->value().toInt()); SystemCamera.SetCameraFlashTime(request->getParam("flash_time")->value().toInt());
response_msg = MSG_SAVE_OK; response_msg = MSG_SAVE_OK;
response = true; response = true;
@ -496,7 +492,7 @@ void Server_InitWebServer_Sets() {
/* set white balancing mode */ /* set white balancing mode */
if (request->hasParam("wb_mode")) { if (request->hasParam("wb_mode")) {
SystemLog.AddEvent(LogLevel_Verbose, "Set wb_mode"); SystemLog.AddEvent(LogLevel_Verbose, F("Set wb_mode"));
SystemCamera.SetAwbMode(request->getParam("wb_mode")->value().toInt()); SystemCamera.SetAwbMode(request->getParam("wb_mode")->value().toInt());
response_msg = MSG_SAVE_OK; response_msg = MSG_SAVE_OK;
response = true; response = true;
@ -504,7 +500,7 @@ void Server_InitWebServer_Sets() {
/* set auto exposition level */ /* set auto exposition level */
if (request->hasParam("ae_level")) { if (request->hasParam("ae_level")) {
SystemLog.AddEvent(LogLevel_Verbose, "Set ae_level"); SystemLog.AddEvent(LogLevel_Verbose, F("Set ae_level"));
SystemCamera.SetAeLevel(request->getParam("ae_level")->value().toInt()); SystemCamera.SetAeLevel(request->getParam("ae_level")->value().toInt());
response_msg = MSG_SAVE_OK; response_msg = MSG_SAVE_OK;
response = true; response = true;
@ -512,7 +508,7 @@ void Server_InitWebServer_Sets() {
/* set auto exposition controll value */ /* set auto exposition controll value */
if (request->hasParam("aec_value")) { if (request->hasParam("aec_value")) {
SystemLog.AddEvent(LogLevel_Verbose, "Set aec_value"); SystemLog.AddEvent(LogLevel_Verbose, F("Set aec_value"));
SystemCamera.SetAecValue(request->getParam("aec_value")->value().toInt()); SystemCamera.SetAecValue(request->getParam("aec_value")->value().toInt());
response_msg = MSG_SAVE_OK; response_msg = MSG_SAVE_OK;
response = true; response = true;
@ -520,7 +516,7 @@ void Server_InitWebServer_Sets() {
/* set auto gain correction value */ /* set auto gain correction value */
if (request->hasParam("agc_gain")) { if (request->hasParam("agc_gain")) {
SystemLog.AddEvent(LogLevel_Verbose, "Set agc_gain"); SystemLog.AddEvent(LogLevel_Verbose, F("Set agc_gain"));
SystemCamera.SetAgcGain(request->getParam("agc_gain")->value().toInt()); SystemCamera.SetAgcGain(request->getParam("agc_gain")->value().toInt());
response_msg = MSG_SAVE_OK; response_msg = MSG_SAVE_OK;
response = true; response = true;
@ -528,7 +524,7 @@ void Server_InitWebServer_Sets() {
/* set log level /set_int?log_level=2 */ /* set log level /set_int?log_level=2 */
if (request->hasParam("log_level")) { if (request->hasParam("log_level")) {
SystemLog.AddEvent(LogLevel_Verbose, "Set log_level"); SystemLog.AddEvent(LogLevel_Verbose, F("Set log_level"));
LogLevel_enum level = (LogLevel_enum)request->getParam("log_level")->value().toInt(); LogLevel_enum level = (LogLevel_enum)request->getParam("log_level")->value().toInt();
if ((level >= LogLevel_Error) && (level <= LogLevel_Verbose)) { if ((level >= LogLevel_Error) && (level <= LogLevel_Verbose)) {
SystemConfig.SaveLogLevel(level); SystemConfig.SaveLogLevel(level);
@ -548,7 +544,7 @@ void Server_InitWebServer_Sets() {
/* route to set bool value */ /* route to set bool value */
server.on("/set_bool", HTTP_GET, [](AsyncWebServerRequest* request) { server.on("/set_bool", HTTP_GET, [](AsyncWebServerRequest* request) {
SystemLog.AddEvent(LogLevel_Verbose, "WEB server: /set_bool"); SystemLog.AddEvent(LogLevel_Verbose, F("WEB server: /set_bool"));
if (Server_CheckBasicAuth(request) == false) if (Server_CheckBasicAuth(request) == false)
return; return;
@ -556,84 +552,84 @@ void Server_InitWebServer_Sets() {
/* check cfg for hmirror */ /* check cfg for hmirror */
if (request->hasParam("hmirror")) { if (request->hasParam("hmirror")) {
SystemLog.AddEvent(LogLevel_Verbose, "Set hmirror"); SystemLog.AddEvent(LogLevel_Verbose, F("Set hmirror"));
SystemCamera.SetHMirror(Server_TransfeStringToBool(request->getParam("hmirror")->value())); SystemCamera.SetHMirror(Server_TransfeStringToBool(request->getParam("hmirror")->value()));
response = true; response = true;
} }
/* set vertical flip */ /* set vertical flip */
if (request->hasParam("vflip")) { if (request->hasParam("vflip")) {
SystemLog.AddEvent(LogLevel_Verbose, "Set hmirror"); SystemLog.AddEvent(LogLevel_Verbose, F("Set hmirror"));
SystemCamera.SetVFlip(Server_TransfeStringToBool(request->getParam("vflip")->value())); SystemCamera.SetVFlip(Server_TransfeStringToBool(request->getParam("vflip")->value()));
response = true; response = true;
} }
/* set lens correction */ /* set lens correction */
if (request->hasParam("lenc")) { if (request->hasParam("lenc")) {
SystemLog.AddEvent(LogLevel_Verbose, "Set lensc"); SystemLog.AddEvent(LogLevel_Verbose, F("Set lensc"));
SystemCamera.SetLensC(Server_TransfeStringToBool(request->getParam("lenc")->value())); SystemCamera.SetLensC(Server_TransfeStringToBool(request->getParam("lenc")->value()));
response = true; response = true;
} }
/* set exposure controll */ /* set exposure controll */
if (request->hasParam("exposure_ctrl")) { if (request->hasParam("exposure_ctrl")) {
SystemLog.AddEvent(LogLevel_Verbose, "Set exposure ctrl"); SystemLog.AddEvent(LogLevel_Verbose, F("Set exposure ctrl"));
SystemCamera.SetExposureCtrl(Server_TransfeStringToBool(request->getParam("exposure_ctrl")->value())); SystemCamera.SetExposureCtrl(Server_TransfeStringToBool(request->getParam("exposure_ctrl")->value()));
response = true; response = true;
} }
/* set auto white balancing */ /* set auto white balancing */
if (request->hasParam("awb")) { if (request->hasParam("awb")) {
SystemLog.AddEvent(LogLevel_Verbose, "Set awb"); SystemLog.AddEvent(LogLevel_Verbose, F("Set awb"));
SystemCamera.SetAwb(Server_TransfeStringToBool(request->getParam("awb")->value())); SystemCamera.SetAwb(Server_TransfeStringToBool(request->getParam("awb")->value()));
response = true; response = true;
} }
/* set auto white balancing gain */ /* set auto white balancing gain */
if (request->hasParam("awb_gain")) { if (request->hasParam("awb_gain")) {
SystemLog.AddEvent(LogLevel_Verbose, "Set awb_gain"); SystemLog.AddEvent(LogLevel_Verbose, F("Set awb_gain"));
SystemCamera.SetAwbGain(Server_TransfeStringToBool(request->getParam("awb_gain")->value())); SystemCamera.SetAwbGain(Server_TransfeStringToBool(request->getParam("awb_gain")->value()));
response = true; response = true;
} }
/* set bad pixel correction */ /* set bad pixel correction */
if (request->hasParam("bpc")) { if (request->hasParam("bpc")) {
SystemLog.AddEvent(LogLevel_Verbose, "Set bpc"); SystemLog.AddEvent(LogLevel_Verbose, F("Set bpc"));
SystemCamera.SetBpc(Server_TransfeStringToBool(request->getParam("bpc")->value())); SystemCamera.SetBpc(Server_TransfeStringToBool(request->getParam("bpc")->value()));
response = true; response = true;
} }
/* set white pixel correction */ /* set white pixel correction */
if (request->hasParam("wpc")) { if (request->hasParam("wpc")) {
SystemLog.AddEvent(LogLevel_Verbose, "Set wpc"); SystemLog.AddEvent(LogLevel_Verbose, F("Set wpc"));
SystemCamera.SetWpc(Server_TransfeStringToBool(request->getParam("wpc")->value())); SystemCamera.SetWpc(Server_TransfeStringToBool(request->getParam("wpc")->value()));
response = true; response = true;
} }
/* set raw gama correction */ /* set raw gama correction */
if (request->hasParam("raw_gama")) { if (request->hasParam("raw_gama")) {
SystemLog.AddEvent(LogLevel_Verbose, "Set raw_gama"); SystemLog.AddEvent(LogLevel_Verbose, F("Set raw_gama"));
SystemCamera.SetRawGama(Server_TransfeStringToBool(request->getParam("raw_gama")->value())); SystemCamera.SetRawGama(Server_TransfeStringToBool(request->getParam("raw_gama")->value()));
response = true; response = true;
} }
/* set automatic exposure correction */ /* set automatic exposure correction */
if (request->hasParam("aec2")) { if (request->hasParam("aec2")) {
SystemLog.AddEvent(LogLevel_Verbose, "Set aec2"); SystemLog.AddEvent(LogLevel_Verbose, F("Set aec2"));
SystemCamera.SetAec2(Server_TransfeStringToBool(request->getParam("aec2")->value())); SystemCamera.SetAec2(Server_TransfeStringToBool(request->getParam("aec2")->value()));
response = true; response = true;
} }
/* set gain controll */ /* set gain controll */
if (request->hasParam("gain_ctrl")) { if (request->hasParam("gain_ctrl")) {
SystemLog.AddEvent(LogLevel_Verbose, "Set gain_ctrl"); SystemLog.AddEvent(LogLevel_Verbose, F("Set gain_ctrl"));
SystemCamera.SetGainCtrl(Server_TransfeStringToBool(request->getParam("gain_ctrl")->value())); SystemCamera.SetGainCtrl(Server_TransfeStringToBool(request->getParam("gain_ctrl")->value()));
response = true; response = true;
} }
/* set flash */ /* set flash */
if (request->hasParam("flash")) { if (request->hasParam("flash")) {
SystemLog.AddEvent(LogLevel_Verbose, "Set flash"); SystemLog.AddEvent(LogLevel_Verbose, F("Set flash"));
SystemCamera.SetCameraFlashEnable(Server_TransfeStringToBool(request->getParam("flash")->value())); SystemCamera.SetCameraFlashEnable(Server_TransfeStringToBool(request->getParam("flash")->value()));
SystemCamera.SetFlashStatus(false); SystemCamera.SetFlashStatus(false);
response = true; response = true;
@ -646,7 +642,7 @@ void Server_InitWebServer_Sets() {
/* route for set token for authentification to prusa backend*/ /* route for set token for authentification to prusa backend*/
server.on("/set_token", HTTP_GET, [](AsyncWebServerRequest* request) { server.on("/set_token", HTTP_GET, [](AsyncWebServerRequest* request) {
SystemLog.AddEvent(LogLevel_Verbose, "WEB server: /set_token"); SystemLog.AddEvent(LogLevel_Verbose, F("WEB server: /set_token"));
if (Server_CheckBasicAuth(request) == false) if (Server_CheckBasicAuth(request) == false)
return; return;
request->send_P(200, F("text/html"), MSG_SAVE_OK); request->send_P(200, F("text/html"), MSG_SAVE_OK);
@ -658,7 +654,7 @@ void Server_InitWebServer_Sets() {
/* route for set prusa connect hostname */ /* route for set prusa connect hostname */
server.on("/set_hostname", HTTP_GET, [](AsyncWebServerRequest* request) { server.on("/set_hostname", HTTP_GET, [](AsyncWebServerRequest* request) {
SystemLog.AddEvent(LogLevel_Verbose, "WEB server: /set_hostname"); SystemLog.AddEvent(LogLevel_Verbose, F("WEB server: /set_hostname"));
if (Server_CheckBasicAuth(request) == false) if (Server_CheckBasicAuth(request) == false)
return; return;
request->send_P(200, F("text/html"), MSG_SAVE_OK); request->send_P(200, F("text/html"), MSG_SAVE_OK);
@ -670,7 +666,7 @@ void Server_InitWebServer_Sets() {
/* route for set WI-FI credentials */ /* route for set WI-FI credentials */
server.on("/wifi_cfg", HTTP_GET, [](AsyncWebServerRequest* request) { server.on("/wifi_cfg", HTTP_GET, [](AsyncWebServerRequest* request) {
SystemLog.AddEvent(LogLevel_Verbose, "WEB server: set WI-FI credentials"); SystemLog.AddEvent(LogLevel_Verbose, F("WEB server: set WI-FI credentials"));
if (Server_CheckBasicAuth(request) == false) if (Server_CheckBasicAuth(request) == false)
return; return;
@ -702,7 +698,7 @@ void Server_InitWebServer_Sets() {
/* route for set basic auth */ /* route for set basic auth */
server.on("/basicauth_cfg", HTTP_GET, [](AsyncWebServerRequest* request) { server.on("/basicauth_cfg", HTTP_GET, [](AsyncWebServerRequest* request) {
SystemLog.AddEvent(LogLevel_Verbose, "WEB server: set basic auth user name and password"); SystemLog.AddEvent(LogLevel_Verbose, F("WEB server: set basic auth user name and password"));
bool ret = false; bool ret = false;
String ret_msg = ""; String ret_msg = "";
@ -719,8 +715,7 @@ void Server_InitWebServer_Sets() {
ret = true; ret = true;
} else { } else {
ret = false; ret = false;
ret_msg = "Maximum username length: "; ret_msg = "Maximum username length: " + String(EEPROM_ADDR_BASIC_AUTH_USERNAME_LENGTH);
ret_msg += String(EEPROM_ADDR_BASIC_AUTH_USERNAME_LENGTH);
} }
} }
@ -734,8 +729,7 @@ void Server_InitWebServer_Sets() {
ret = true; ret = true;
} else { } else {
ret = false; ret = false;
ret_msg = "Maximum password length: "; ret_msg = "Maximum password length: " + String(EEPROM_ADDR_BASIC_AUTH_PASSWORD_LENGTH);
ret_msg += String(EEPROM_ADDR_BASIC_AUTH_PASSWORD_LENGTH);
} }
} }
@ -752,15 +746,14 @@ void Server_InitWebServer_Sets() {
} else { } else {
String msg = MSG_SAVE_NOTOK; String msg = MSG_SAVE_NOTOK;
msg += " "; msg += " " + ret_msg;
msg += ret_msg;
request->send_P(200, F("text/html"), msg.c_str()); request->send_P(200, F("text/html"), msg.c_str());
} }
}); });
/* route for set firmware size */ /* route for set firmware size */
server.on("/set_firmware_size", HTTP_GET, [](AsyncWebServerRequest* request) { server.on("/set_firmware_size", HTTP_GET, [](AsyncWebServerRequest* request) {
SystemLog.AddEvent(LogLevel_Info, "WEB server: /set_firmware_size"); SystemLog.AddEvent(LogLevel_Info, F("WEB server: /set_firmware_size"));
if (Server_CheckBasicAuth(request) == false) if (Server_CheckBasicAuth(request) == false)
return; return;
request->send_P(200, F("text/html"), MSG_SAVE_OK); request->send_P(200, F("text/html"), MSG_SAVE_OK);
@ -774,7 +767,7 @@ void Server_InitWebServer_Sets() {
/* route for set firmware size */ /* route for set firmware size */
server.on("/set_mdns", HTTP_GET, [](AsyncWebServerRequest* request) { server.on("/set_mdns", HTTP_GET, [](AsyncWebServerRequest* request) {
SystemLog.AddEvent(LogLevel_Verbose, "WEB server: /set_mdns"); SystemLog.AddEvent(LogLevel_Verbose, F("WEB server: /set_mdns"));
if (Server_CheckBasicAuth(request) == false) if (Server_CheckBasicAuth(request) == false)
return; return;
@ -843,7 +836,7 @@ void Server_InitWebServer_Update() {
FirmwareUpdate.Processing = false; FirmwareUpdate.Processing = false;
if (Update.end(true)) { if (Update.end(true)) {
FirmwareUpdate.UpdatingStatus = String(SYSTEM_MSG_UPDATE_DONE); FirmwareUpdate.UpdatingStatus = String(SYSTEM_MSG_UPDATE_DONE);
SystemLog.AddEvent(LogLevel_Info, "Update FW from file done. Reboot MCU"); SystemLog.AddEvent(LogLevel_Info, F("Update FW from file done. Reboot MCU"));
} else { } else {
Update.printError(Serial); Update.printError(Serial);
SystemLog.AddEvent(LogLevel_Error, String(SYSTEM_MSG_UPDATE_FAIL)); SystemLog.AddEvent(LogLevel_Error, String(SYSTEM_MSG_UPDATE_FAIL));
@ -854,7 +847,7 @@ void Server_InitWebServer_Update() {
/* route for start web OTA update from server */ /* route for start web OTA update from server */
server.on("/web_ota_update", HTTP_GET, [](AsyncWebServerRequest* request) { server.on("/web_ota_update", HTTP_GET, [](AsyncWebServerRequest* request) {
SystemLog.AddEvent(LogLevel_Info, "WEB server: /web_ota_update"); SystemLog.AddEvent(LogLevel_Info, F("WEB server: /web_ota_update"));
if (Server_CheckBasicAuth(request) == false) if (Server_CheckBasicAuth(request) == false)
return; return;
request->send_P(200, F("text/html"), MSG_UPDATE_START); request->send_P(200, F("text/html"), MSG_UPDATE_START);
@ -873,7 +866,7 @@ void Server_InitWebServer_Update() {
/* get OTA FW version on the server */ /* get OTA FW version on the server */
server.on("/check_web_ota_update", HTTP_GET, [](AsyncWebServerRequest* request) { server.on("/check_web_ota_update", HTTP_GET, [](AsyncWebServerRequest* request) {
SystemLog.AddEvent(LogLevel_Verbose, "WEB server: /check_web_ota_update"); SystemLog.AddEvent(LogLevel_Verbose, F("WEB server: /check_web_ota_update"));
if (Server_CheckBasicAuth(request) == false) if (Server_CheckBasicAuth(request) == false)
return; return;
@ -898,7 +891,7 @@ void Server_InitWebServer_Stream() {
*/ */
void Server_pause() { void Server_pause() {
server.end(); server.end();
SystemLog.AddEvent(LogLevel_Verbose, "WEB server: pause"); SystemLog.AddEvent(LogLevel_Verbose, F("WEB server: pause"));
} }
/** /**
@ -908,7 +901,7 @@ void Server_pause() {
*/ */
void Server_resume() { void Server_resume() {
server.begin(); server.begin();
SystemLog.AddEvent(LogLevel_Verbose, "WEB server: resume"); SystemLog.AddEvent(LogLevel_Verbose, F("WEB server: resume"));
} }
/** /**
@ -932,13 +925,9 @@ void Server_handleCacheRequest(AsyncWebServerRequest* request, const char* conte
void Server_handleNotFound(AsyncWebServerRequest* request) { void Server_handleNotFound(AsyncWebServerRequest* request) {
String message = "URL not Found\n\n"; String message = "URL not Found\n\n";
message += "URI: "; message += "URI: " + request->url() + "\nMethod: ";
message += request->url();
message += "\nMethod: ";
message += (request->method() == HTTP_GET) ? "GET" : "POST"; message += (request->method() == HTTP_GET) ? "GET" : "POST";
message += "\nArguments: "; message += "\nArguments: " + String(request->args()) + "\n";
message += request->args();
message += "\n";
for (uint8_t i = 0; i < request->args(); i++) { for (uint8_t i = 0; i < request->args(); i++) {
message += " " + request->argName(i) + ": " + request->arg(i) + "\n"; message += " " + request->argName(i) + ": " + request->arg(i) + "\n";
@ -1017,7 +1006,7 @@ String Server_GetJsonData() {
*/ */
bool Server_CheckBasicAuth(AsyncWebServerRequest* request) { bool Server_CheckBasicAuth(AsyncWebServerRequest* request) {
if ((!request->authenticate(WebBasicAuth.UserName.c_str(), WebBasicAuth.Password.c_str())) && (true == WebBasicAuth.EnableAuth)) { if ((!request->authenticate(WebBasicAuth.UserName.c_str(), WebBasicAuth.Password.c_str())) && (true == WebBasicAuth.EnableAuth)) {
SystemLog.AddEvent(LogLevel_Verbose, "Unauthorized! Sending longin request"); SystemLog.AddEvent(LogLevel_Verbose, F("Unauthorized! Sending longin request"));
request->requestAuthentication(); request->requestAuthentication();
return false; return false;
} }

View File

@ -236,7 +236,7 @@ size_t AsyncJpegStreamResponse::_content(uint8_t *buffer, size_t maxLen, size_t
/* check space for headers */ /* check space for headers */
if (maxLen < (strlen(STREAM_BOUNDARY) + strlen(STREAM_PART) + strlen(JPG_CONTENT_TYPE) + 8)) { if (maxLen < (strlen(STREAM_BOUNDARY) + strlen(STREAM_PART) + strlen(JPG_CONTENT_TYPE) + 8)) {
log->AddEvent(LogLevel_Error, "Stream Not space for headers"); log->AddEvent(LogLevel_Error, F("Stream Not space for headers"));
return RESPONSE_TRY_AGAIN; return RESPONSE_TRY_AGAIN;
} }
@ -246,7 +246,7 @@ size_t AsyncJpegStreamResponse::_content(uint8_t *buffer, size_t maxLen, size_t
_frame.fb = &_dframe; _frame.fb = &_dframe;
if (_frame.fb == NULL) { if (_frame.fb == NULL) {
log->AddEvent(LogLevel_Error, "Stream capture frame failed"); log->AddEvent(LogLevel_Error, F("Stream capture frame failed"));
return 0; return 0;
} }

View File

@ -17,7 +17,7 @@
@return none @return none
*/ */
void System_Init() { void System_Init() {
SystemLog.AddEvent(LogLevel_Info, "Init system lib"); SystemLog.AddEvent(LogLevel_Info, F("Init system lib"));
/* show last reset status */ /* show last reset status */
String reason_simple = System_printMcuResetReasonSimple(); String reason_simple = System_printMcuResetReasonSimple();
SystemLog.AddEvent(LogLevel_Warning, "CPU reset reason: " + reason_simple); SystemLog.AddEvent(LogLevel_Warning, "CPU reset reason: " + reason_simple);
@ -51,21 +51,21 @@ void System_LoadCfg() {
*/ */
void System_CheckIfPsramIsUsed() { void System_CheckIfPsramIsUsed() {
if (psramFound()) { if (psramFound()) {
SystemLog.AddEvent(LogLevel_Info, "PSRAM is used."); SystemLog.AddEvent(LogLevel_Info, F("PSRAM is used."));
void *ptr = malloc(100); void *ptr = malloc(100);
if (ptr != NULL) { if (ptr != NULL) {
if (esp_ptr_external_ram(ptr)) { if (esp_ptr_external_ram(ptr)) {
SystemLog.AddEvent(LogLevel_Info, "malloc/new is using SPIRAM"); SystemLog.AddEvent(LogLevel_Info, F("malloc/new is using SPIRAM"));
} else { } else {
SystemLog.AddEvent(LogLevel_Info, "malloc/new is not using SPIRAM"); SystemLog.AddEvent(LogLevel_Info, F("malloc/new is not using SPIRAM"));
} }
free(ptr); free(ptr);
} else { } else {
SystemLog.AddEvent(LogLevel_Info, "Failed to allocate memory"); SystemLog.AddEvent(LogLevel_Info, F("Failed to allocate memory"));
} }
} else { } else {
SystemLog.AddEvent(LogLevel_Info, "PSRAM is not used."); SystemLog.AddEvent(LogLevel_Info, F("PSRAM is not used."));
} }
} }
@ -95,9 +95,7 @@ void System_UpdateInit() {
void System_Main() { void System_Main() {
/* check new FW version */ /* check new FW version */
if (false == FirmwareUpdate.CheckNewVersionAfterBoot) { if (false == FirmwareUpdate.CheckNewVersionAfterBoot) {
Server_pause();
System_CheckNewVersion(); System_CheckNewVersion();
Server_resume();
} }
/* task for download and flash FW from server */ /* task for download and flash FW from server */
@ -114,7 +112,7 @@ void System_Main() {
*/ */
void System_CheckNewVersion() { void System_CheckNewVersion() {
if (WL_CONNECTED == WiFi.status()) { if (WL_CONNECTED == WiFi.status()) {
SystemLog.AddEvent(LogLevel_Info, "Check new FW version from OTA"); SystemLog.AddEvent(LogLevel_Info, F("Check new FW version from OTA"));
FirmwareUpdate.CheckNewVersionAfterBoot = true; FirmwareUpdate.CheckNewVersionAfterBoot = true;
WiFiClientSecure client; WiFiClientSecure client;
client.setCACert(root_CAs_ota); client.setCACert(root_CAs_ota);
@ -130,7 +128,7 @@ void System_CheckNewVersion() {
SystemLog.AddEvent(LogLevel_Info, FirmwareUpdate.CheckNewVersionFwStatus); SystemLog.AddEvent(LogLevel_Info, FirmwareUpdate.CheckNewVersionFwStatus);
} else { } else {
SystemLog.AddEvent(LogLevel_Verbose, "Connected to server!"); SystemLog.AddEvent(LogLevel_Verbose, F("Connected to server!"));
client.println("GET https://" + String(OTA_UPDATE_API_SERVER) + String(OTA_UPDATE_API_URL) + " HTTP/1.0"); client.println("GET https://" + String(OTA_UPDATE_API_SERVER) + String(OTA_UPDATE_API_URL) + " HTTP/1.0");
client.println("Host: " + String(OTA_UPDATE_API_SERVER)); client.println("Host: " + String(OTA_UPDATE_API_SERVER));
client.println("User-Agent: " + String(DEVICE_HOSTNAME)); client.println("User-Agent: " + String(DEVICE_HOSTNAME));
@ -162,14 +160,14 @@ void System_CheckNewVersion() {
DeserializationError error = deserializeJson(jsonDoc, Data); DeserializationError error = deserializeJson(jsonDoc, Data);
if (error) { if (error) {
FirmwareUpdate.CheckNewVersionFwStatus = "Failed to parse JSON from OTA server!"; FirmwareUpdate.CheckNewVersionFwStatus = F("Failed to parse JSON from OTA server!");
SystemLog.AddEvent(LogLevel_Warning, FirmwareUpdate.CheckNewVersionFwStatus); SystemLog.AddEvent(LogLevel_Warning, FirmwareUpdate.CheckNewVersionFwStatus);
SystemLog.AddEvent(LogLevel_Warning, Data); SystemLog.AddEvent(LogLevel_Warning, Data);
} else { } else {
const char *firmwareVersion = jsonDoc["tag_name"]; const char *firmwareVersion = jsonDoc["tag_name"];
if (firmwareVersion) { if (firmwareVersion) {
FirmwareUpdate.CheckNewVersionFwStatus = "Download successful"; FirmwareUpdate.CheckNewVersionFwStatus = F("Download successful");
FirmwareUpdate.NewVersionFw = firmwareVersion; FirmwareUpdate.NewVersionFw = firmwareVersion;
SystemLog.AddEvent(LogLevel_Info, "Available OTA firmware: " + FirmwareUpdate.NewVersionFw); SystemLog.AddEvent(LogLevel_Info, "Available OTA firmware: " + FirmwareUpdate.NewVersionFw);
@ -192,7 +190,7 @@ void System_CheckNewVersion() {
} }
} }
} else { } else {
FirmwareUpdate.CheckNewVersionFwStatus = "JSON key 'tag_name' from OTA server not found!"; FirmwareUpdate.CheckNewVersionFwStatus = F("JSON key 'tag_name' from OTA server not found!");
SystemLog.AddEvent(LogLevel_Warning, FirmwareUpdate.CheckNewVersionFwStatus); SystemLog.AddEvent(LogLevel_Warning, FirmwareUpdate.CheckNewVersionFwStatus);
} }
} }
@ -209,9 +207,9 @@ void System_OtaCloudUpdate() {
if (true == FirmwareUpdate.StartOtaUpdate) { if (true == FirmwareUpdate.StartOtaUpdate) {
FirmwareUpdate.Processing = true; FirmwareUpdate.Processing = true;
FirmwareUpdate.StartOtaUpdate = false; FirmwareUpdate.StartOtaUpdate = false;
FirmwareUpdate.UpdatingStatus = "Sync NTP time..."; FirmwareUpdate.UpdatingStatus = F("Sync NTP time...");
SystemWifiMngt.SyncNtpTime(); SystemWifiMngt.SyncNtpTime();
FirmwareUpdate.UpdatingStatus = "Start updating"; FirmwareUpdate.UpdatingStatus = F("Start updating");
System_OtaUpdateStart(); System_OtaUpdateStart();
} }
} }
@ -269,7 +267,7 @@ bool System_OtaUpdateStart() {
break; break;
case HTTP_UPDATE_NO_UPDATES: case HTTP_UPDATE_NO_UPDATES:
FirmwareUpdate.UpdatingStatus = "No updates"; FirmwareUpdate.UpdatingStatus = F("No updates");
break; break;
case HTTP_UPDATE_OK: case HTTP_UPDATE_OK:
@ -303,7 +301,7 @@ void System_OtaUpdateProgressCB(int cur, int total) {
@return none @return none
*/ */
void System_OtaUpdateStartCB() { void System_OtaUpdateStartCB() {
SystemLog.AddEvent(LogLevel_Info, "Start OTA update"); SystemLog.AddEvent(LogLevel_Info, F("Start OTA update"));
} }
/** /**
@ -312,7 +310,7 @@ void System_OtaUpdateStartCB() {
@return none @return none
*/ */
void System_OtaUpdateEndCB() { void System_OtaUpdateEndCB() {
SystemLog.AddEvent(LogLevel_Info, "OTA update done"); SystemLog.AddEvent(LogLevel_Info, F("OTA update done"));
} }
/** /**
@ -333,52 +331,52 @@ String System_PrintMcuResetReason(int reason) {
String ret = ""; String ret = "";
switch (reason) { switch (reason) {
case 1: /**<1, Vbat power on reset*/ case 1: /**<1, Vbat power on reset*/
ret = "POWERON_RESET"; ret = F("POWERON_RESET");
break; break;
case 3: /**<3, Software reset digital core*/ case 3: /**<3, Software reset digital core*/
ret = "SW_RESET"; ret = F("SW_RESET");
break; break;
case 4: /**<4, Legacy watch dog reset digital core*/ case 4: /**<4, Legacy watch dog reset digital core*/
ret = "OWDT_RESET"; ret = F("OWDT_RESET");
break; break;
case 5: /**<5, Deep Sleep reset digital core*/ case 5: /**<5, Deep Sleep reset digital core*/
ret = "DEEPSLEEP_RESET"; ret = F("DEEPSLEEP_RESET");
break; break;
case 6: /**<6, Reset by SLC module, reset digital core*/ case 6: /**<6, Reset by SLC module, reset digital core*/
ret = "SDIO_RESET"; ret = F("SDIO_RESET");
break; break;
case 7: /**<7, Timer Group0 Watch dog reset digital core*/ case 7: /**<7, Timer Group0 Watch dog reset digital core*/
ret = "TG0WDT_SYS_RESET"; ret = F("TG0WDT_SYS_RESET");
break; break;
case 8: /**<8, Timer Group1 Watch dog reset digital core*/ case 8: /**<8, Timer Group1 Watch dog reset digital core*/
ret = "TG1WDT_SYS_RESET"; ret = F("TG1WDT_SYS_RESET");
break; break;
case 9: /**<9, RTC Watch dog Reset digital core*/ case 9: /**<9, RTC Watch dog Reset digital core*/
ret = "RTCWDT_SYS_RESET"; ret = F("RTCWDT_SYS_RESET");
break; break;
case 10: /**<10, Instrusion tested to reset CPU*/ case 10: /**<10, Instrusion tested to reset CPU*/
ret = "INTRUSION_RESET"; ret = F("INTRUSION_RESET");
break; break;
case 11: /**<11, Time Group reset CPU*/ case 11: /**<11, Time Group reset CPU*/
ret = "TGWDT_CPU_RESET"; ret = F("TGWDT_CPU_RESET");
break; break;
case 12: /**<12, Software reset CPU*/ case 12: /**<12, Software reset CPU*/
ret = "SW_CPU_RESET"; ret = F("SW_CPU_RESET");
break; break;
case 13: /**<13, RTC Watch dog Reset CPU*/ case 13: /**<13, RTC Watch dog Reset CPU*/
ret = "RTCWDT_CPU_RESET"; ret = F("RTCWDT_CPU_RESET");
break; break;
case 14: /**<14, for APP CPU, reseted by PRO CPU*/ case 14: /**<14, for APP CPU, reseted by PRO CPU*/
ret = "EXT_CPU_RESET"; ret = F("EXT_CPU_RESET");
break; break;
case 15: /**<15, Reset when the vdd voltage is not stable*/ case 15: /**<15, Reset when the vdd voltage is not stable*/
ret = "RTCWDT_BROWN_OUT_RESET"; ret = F("RTCWDT_BROWN_OUT_RESET");
break; break;
case 16: /**<16, RTC Watch dog reset digital core and rtc module*/ case 16: /**<16, RTC Watch dog reset digital core and rtc module*/
ret = "RTCWDT_RTC_RESET"; ret = F("RTCWDT_RTC_RESET");
break; break;
default: default:
ret = "NO_MEAN"; ret = F("NO_MEAN");
} }
return ret; return ret;
@ -395,40 +393,40 @@ String System_printMcuResetReasonSimple() {
switch (reason) { switch (reason) {
case ESP_RST_UNKNOWN: case ESP_RST_UNKNOWN:
ret = "Reset reason can not be determined"; ret = F("Reset reason can not be determined");
break; break;
case ESP_RST_POWERON: case ESP_RST_POWERON:
ret = "Reset due to power-on event"; ret = F("Reset due to power-on event");
break; break;
case ESP_RST_EXT: case ESP_RST_EXT:
ret = "Reset by external pin (not applicable for ESP32)"; ret = F("Reset by external pin (not applicable for ESP32)");
break; break;
case ESP_RST_SW: case ESP_RST_SW:
ret = "Software reset via esp_restart"; ret = F("Software reset via esp_restart");
break; break;
case ESP_RST_PANIC: case ESP_RST_PANIC:
ret = "Software reset due to exception/panic"; ret = F("Software reset due to exception/panic");
break; break;
case ESP_RST_INT_WDT: case ESP_RST_INT_WDT:
ret = "Reset (software or hardware) due to interrupt watchdog"; ret = F("Reset (software or hardware) due to interrupt watchdog");
break; break;
case ESP_RST_TASK_WDT: case ESP_RST_TASK_WDT:
ret = "Reset due to task watchdog"; ret = F("Reset due to task watchdog");
break; break;
case ESP_RST_WDT: case ESP_RST_WDT:
ret = "Reset due to other watchdogs"; ret = F("Reset due to other watchdogs");
break; break;
case ESP_RST_DEEPSLEEP: case ESP_RST_DEEPSLEEP:
ret = "Reset after exiting deep sleep mode"; ret = F("Reset after exiting deep sleep mode");
break; break;
case ESP_RST_BROWNOUT: case ESP_RST_BROWNOUT:
ret = "Brownout reset (software or hardware)"; ret = F("Brownout reset (software or hardware)");
break; break;
case ESP_RST_SDIO: case ESP_RST_SDIO:
ret = "Reset over SDIO"; ret = F("Reset over SDIO");
break; break;
default: default:
ret = "N/A"; ret = F("N/A");
break; break;
} }
@ -451,9 +449,6 @@ void System_TaskWifiManagement(void *pvParameters) {
/* wifi reconnect after signal lost */ /* wifi reconnect after signal lost */
SystemWifiMngt.WiFiReconnect(); SystemWifiMngt.WiFiReconnect();
SystemLog.AddEvent(LogLevel_Info, "Free RAM: " + String(ESP.getFreeHeap()) + " bytes");
SystemLog.AddEvent(LogLevel_Info, "Free SPIRAM: " + String(ESP.getFreePsram()) + " bytes");
SystemLog.AddEvent(LogLevel_Info, "Temperature: " + String(temperatureRead()) + " *C");
SystemLog.AddEvent(LogLevel_Verbose, "WiFiManagement task. Stack free size: " + String(uxTaskGetStackHighWaterMark(NULL)) + " bytes"); SystemLog.AddEvent(LogLevel_Verbose, "WiFiManagement task. Stack free size: " + String(uxTaskGetStackHighWaterMark(NULL)) + " bytes");
/* reset wdg */ /* reset wdg */
@ -478,6 +473,9 @@ void System_TaskMain(void *pvParameters) {
/* for ota update */ /* for ota update */
esp_task_wdt_reset(); esp_task_wdt_reset();
System_Main(); System_Main();
SystemLog.AddEvent(LogLevel_Info, "Free RAM: " + String(ESP.getFreeHeap()) + " bytes");
SystemLog.AddEvent(LogLevel_Info, "Free SPIRAM: " + String(ESP.getFreePsram()) + " bytes");
SystemLog.AddEvent(LogLevel_Info, "Temperature: " + String(temperatureRead()) + " *C");
SystemLog.AddEvent(LogLevel_Verbose, "System task. Stack free size: " + String(uxTaskGetStackHighWaterMark(NULL)) + " bytes"); SystemLog.AddEvent(LogLevel_Verbose, "System task. Stack free size: " + String(uxTaskGetStackHighWaterMark(NULL)) + " bytes");
/* reset wdg */ /* reset wdg */
@ -543,7 +541,7 @@ void System_TaskSdCardCheck(void *pvParameters) {
/* check micro SD card */ /* check micro SD card */
if ((true == SystemLog.GetCardDetectAfterBoot()) && (false == SystemLog.GetCardDetectedStatus())) { if ((true == SystemLog.GetCardDetectAfterBoot()) && (false == SystemLog.GetCardDetectedStatus())) {
SystemLog.ReinitCard(); SystemLog.ReinitCard();
SystemLog.AddEvent(LogLevel_Warning, "Reinit micro SD card done!"); SystemLog.AddEvent(LogLevel_Warning, F("Reinit micro SD card done!"));
} }
SystemLog.AddEvent(LogLevel_Verbose, "MicroSdCard task. Stack free size: " + String(uxTaskGetStackHighWaterMark(NULL)) + " bytes"); SystemLog.AddEvent(LogLevel_Verbose, "MicroSdCard task. Stack free size: " + String(uxTaskGetStackHighWaterMark(NULL)) + " bytes");
@ -620,6 +618,7 @@ void System_TaskSysLed(void *pvParameters) {
system_led.toggle(); system_led.toggle();
/* reset wdg */ /* reset wdg */
esp_task_wdt_reset(); esp_task_wdt_reset();
SystemLog.AddEvent(LogLevel_Verbose, "SystemLed task. Stack free size: " + String(uxTaskGetStackHighWaterMark(NULL)) + " bytes");
/* next start task */ /* next start task */
vTaskDelayUntil(&xLastWakeTime, system_led.getTimer() / portTICK_PERIOD_MS); vTaskDelayUntil(&xLastWakeTime, system_led.getTimer() / portTICK_PERIOD_MS);

View File

@ -59,7 +59,7 @@ void WiFiMngt::Init() {
/* Set Wi-Fi networks */ /* Set Wi-Fi networks */
SetWifiEvents(); SetWifiEvents();
CreateApSsid(); CreateApSsid();
log->AddEvent(LogLevel_Warning, "Set WiFi AP mode"); log->AddEvent(LogLevel_Warning, F("Set WiFi AP mode"));
WiFi.mode(WIFI_AP_STA); WiFi.mode(WIFI_AP_STA);
esp_wifi_set_ps(WIFI_PS_NONE); esp_wifi_set_ps(WIFI_PS_NONE);
WiFi.softAPConfig(Service_LocalIp, Service_Gateway, Service_Subnet); WiFi.softAPConfig(Service_LocalIp, Service_Gateway, Service_Subnet);
@ -96,9 +96,9 @@ void WiFiMngt::Init() {
/* Init MDNS record */ /* Init MDNS record */
log->AddEvent(LogLevel_Info, "Starting mDNS record: http://" + mDNS_record + ".local"); log->AddEvent(LogLevel_Info, "Starting mDNS record: http://" + mDNS_record + ".local");
if (!MDNS.begin(mDNS_record)) { if (!MDNS.begin(mDNS_record)) {
log->AddEvent(LogLevel_Error, "Error starting mDNS"); log->AddEvent(LogLevel_Error, F("Error starting mDNS"));
} else { } else {
log->AddEvent(LogLevel_Info, "Starting mDNS OK"); log->AddEvent(LogLevel_Info, F("Starting mDNS OK"));
} }
MDNS.addService("http", "tcp", 80); MDNS.addService("http", "tcp", 80);
} }
@ -116,7 +116,7 @@ void WiFiMngt::WifiManagement() {
if ((true == config->CheckActifeWifiCfgFlag()) && (true == ServiceMode) && (WL_CONNECTED == WiFi.status()) if ((true == config->CheckActifeWifiCfgFlag()) && (true == ServiceMode) && (WL_CONNECTED == WiFi.status())
&& (false == FirmwareUpdate.Processing) && (false == cam->GetStreamStatus())) { && (false == FirmwareUpdate.Processing) && (false == cam->GetStreamStatus())) {
if (WiFi.softAPgetStationNum() == 0) { if (WiFi.softAPgetStationNum() == 0) {
log->AddEvent(LogLevel_Info, "Disable service AP mode"); log->AddEvent(LogLevel_Info, F("Disable service AP mode"));
WiFi.mode(WIFI_STA); WiFi.mode(WIFI_STA);
esp_wifi_set_ps(WIFI_PS_NONE); esp_wifi_set_ps(WIFI_PS_NONE);
WiFiStaConnect(); WiFiStaConnect();
@ -151,11 +151,11 @@ void WiFiMngt::WifiManagement() {
*/ */
void WiFiMngt::WiFiReconnect() { void WiFiMngt::WiFiReconnect() {
if ((WiFi.status() != WL_CONNECTED) && (FirstConnected == true)) { if ((WiFi.status() != WL_CONNECTED) && (FirstConnected == true)) {
log->AddEvent(LogLevel_Warning, "Reconnecting to WiFi. STA"); log->AddEvent(LogLevel_Warning, F("Reconnecting to WiFi. STA"));
WiFi.disconnect(); WiFi.disconnect();
log->AddEvent(LogLevel_Warning, "Disconnect from WiFi"); log->AddEvent(LogLevel_Warning, F("Disconnect from WiFi"));
WiFi.reconnect(); WiFi.reconnect();
log->AddEvent(LogLevel_Warning, "Reconnecting to WiFi. STA"); log->AddEvent(LogLevel_Warning, F("Reconnecting to WiFi. STA"));
} else if (WiFi.status() == WL_CONNECTED) { } else if (WiFi.status() == WL_CONNECTED) {
char cstr[150]; char cstr[150];
sprintf(cstr, "Wifi connected. SSID: %s, BSSID: %s, RSSI: %d dBm, IP: %s, TX power: %s", WiFi.SSID().c_str(), WiFi.BSSIDstr().c_str(), WiFi.RSSI(), WiFi.localIP().toString().c_str(), TranslateTxPower(WiFi.getTxPower()).c_str()); //print 3 digits sprintf(cstr, "Wifi connected. SSID: %s, BSSID: %s, RSSI: %d dBm, IP: %s, TX power: %s", WiFi.SSID().c_str(), WiFi.BSSIDstr().c_str(), WiFi.RSSI(), WiFi.localIP().toString().c_str(), TranslateTxPower(WiFi.getTxPower()).c_str()); //print 3 digits
@ -163,7 +163,7 @@ void WiFiMngt::WiFiReconnect() {
} }
if (Connect.GetBackendAvailabilitStatus() == BackendUnavailable) { if (Connect.GetBackendAvailabilitStatus() == BackendUnavailable) {
log->AddEvent(LogLevel_Warning, "Reconnecting to WiFi. STA. Problem with connecting to backend!"); log->AddEvent(LogLevel_Warning, F("Reconnecting to WiFi. STA. Problem with connecting to backend!"));
WiFi.disconnect(); WiFi.disconnect();
WiFi.reconnect(); WiFi.reconnect();
Connect.SetBackendAvailabilitStatus(WaitForFirstConnection); Connect.SetBackendAvailabilitStatus(WaitForFirstConnection);
@ -202,10 +202,10 @@ void WiFiMngt::WiFiStaConnect() {
system_led.setTimer(STATUS_LED_STA_CONNECTING); system_led.setTimer(STATUS_LED_STA_CONNECTING);
if (false == WiFiStaMultipleNetwork) { if (false == WiFiStaMultipleNetwork) {
WiFi.begin(WifiSsid, WifiPassword); WiFi.begin(WifiSsid, WifiPassword);
log->AddEvent(LogLevel_Info, "Connecting to STA SSID"); log->AddEvent(LogLevel_Info, F("Connecting to STA SSID"));
} else if (true == WiFiStaMultipleNetwork) { } else if (true == WiFiStaMultipleNetwork) {
WiFi.begin(WifiSsid, WifiPassword, 0, WiFiStaNetworkBssid); WiFi.begin(WifiSsid, WifiPassword, 0, WiFiStaNetworkBssid);
log->AddEvent(LogLevel_Info, "Connecting to STA BSSID"); log->AddEvent(LogLevel_Info, F("Connecting to STA BSSID"));
} }
WiFi.setAutoReconnect(true); WiFi.setAutoReconnect(true);
} }
@ -219,8 +219,8 @@ void WiFiMngt::WiFiStaConnect() {
void WiFiMngt::SyncNtpTime() { void WiFiMngt::SyncNtpTime() {
if (WL_CONNECTED == WiFi.status()) { if (WL_CONNECTED == WiFi.status()) {
/* configure NTP server and timezone to UTC */ /* configure NTP server and timezone to UTC */
configTime(0, 0, "pool.ntp.org", "time.nist.gov"); // UTC configTime(NTP_GTM_OFFSET_SEC, NTP_DAYLIGHT_OFFSET_SEC, NTP_SERVER_1, NTP_SERVER_2); // UTC
log->AddEvent(LogLevel_Info, "Waiting for NTP time sync: "); log->AddEvent(LogLevel_Info, F("Waiting for NTP time sync: "));
log->SetNtpTimeSynced(false); log->SetNtpTimeSynced(false);
/* wait maximum 10s for time sync */ /* wait maximum 10s for time sync */
@ -237,10 +237,10 @@ void WiFiMngt::SyncNtpTime() {
/* report sync status */ /* report sync status */
if (true == log->GetNtpTimeSynced()) { if (true == log->GetNtpTimeSynced()) {
log->AddEvent(LogLevel_Info, "Sync NTP time done. Set UTC timezone"); log->AddEvent(LogLevel_Info, F("Sync NTP time done. Set UTC timezone"));
NtpFirstSync = true; NtpFirstSync = true;
} else { } else {
log->AddEvent(LogLevel_Info, "Sync NTP time fail"); log->AddEvent(LogLevel_Info, F("Sync NTP time fail"));
} }
} }
} }
@ -260,7 +260,7 @@ void WiFiMngt::ScanWiFiNetwork() {
@return uint8_t - count of found wifi networks with same SSID @return uint8_t - count of found wifi networks with same SSID
*/ */
uint8_t WiFiMngt::ScanWifiNetwork(String ssid) { uint8_t WiFiMngt::ScanWifiNetwork(String ssid) {
log->AddEvent(LogLevel_Info, "Scan WI-FI networks"); log->AddEvent(LogLevel_Info, F("Scan WI-FI networks"));
log->AddEvent(LogLevel_Info, "Check available WI-FI network: " + ssid); log->AddEvent(LogLevel_Info, "Check available WI-FI network: " + ssid);
uint8_t ret = 0; ///< total wifi network count uint8_t ret = 0; ///< total wifi network count
int bestSignal = -100; ///< wifi network with best signal (when is available multiple networks with same SSID) int bestSignal = -100; ///< wifi network with best signal (when is available multiple networks with same SSID)
@ -268,17 +268,17 @@ uint8_t WiFiMngt::ScanWifiNetwork(String ssid) {
/* scan WI-FI networks */ /* scan WI-FI networks */
int n = WiFi.scanNetworks(); int n = WiFi.scanNetworks();
log->AddEvent(LogLevel_Verbose, "Scan done"); log->AddEvent(LogLevel_Verbose, F("Scan done"));
JsonDocument doc_json; JsonDocument doc_json;
JsonArray wifiArray = doc_json.to<JsonArray>(); JsonArray wifiArray = doc_json.to<JsonArray>();
WifiScanJson = ""; WifiScanJson = "";
/* make json with each found WI-FI networks */ /* make json with each found WI-FI networks */
if (n == 0) { if (n == 0) {
log->AddEvent(LogLevel_Info, "No networks found!"); log->AddEvent(LogLevel_Info, F("No networks found!"));
} else { } else {
log->AddEvent(LogLevel_Info, String(n) + " networks found"); log->AddEvent(LogLevel_Info, String(n) + " networks found");
log->AddEvent(LogLevel_Info, "Nr | SSID | RSSI | CH | BSSID | Encryption"); log->AddEvent(LogLevel_Info, F("Nr | SSID | RSSI | CH | BSSID | Encryption"));
for (int i = 0; i < n; ++i) { for (int i = 0; i < n; ++i) {
/* check available wifi network */ /* check available wifi network */
@ -375,24 +375,24 @@ void WiFiMngt::WiFiWatchdog() {
/* when is enabled wifi configuration, and is not connected to wifi network, and is available at least one wifi network */ /* when is enabled wifi configuration, and is not connected to wifi network, and is available at least one wifi network */
if ((true == config->CheckActifeWifiCfgFlag()) && (WL_CONNECTED != WiFi.status()) && (true == GetFirstConnection())) { if ((true == config->CheckActifeWifiCfgFlag()) && (WL_CONNECTED != WiFi.status()) && (true == GetFirstConnection())) {
log->AddEvent(LogLevel_Warning, "WiFi WDG. STA connection lost."); log->AddEvent(LogLevel_Warning, F("WiFi WDG. STA connection lost."));
unsigned long currentMillis = millis(); unsigned long currentMillis = millis();
if (false == StartStaWdg) { if (false == StartStaWdg) {
if (ScanWifiNetwork(WifiSsid) >= 1) { if (ScanWifiNetwork(WifiSsid) >= 1) {
StartStaWdg = true; StartStaWdg = true;
TaskWdg_previousMillis = currentMillis; TaskWdg_previousMillis = currentMillis;
log->AddEvent(LogLevel_Warning, "WiFi STA connection lost. Start watchdog timer!"); log->AddEvent(LogLevel_Warning, F("WiFi STA connection lost. Start watchdog timer!"));
} }
} }
if ((true == StartStaWdg) && (currentMillis - TaskWdg_previousMillis >= WIFI_STA_WDG_TIMEOUT)) { if ((true == StartStaWdg) && (currentMillis - TaskWdg_previousMillis >= WIFI_STA_WDG_TIMEOUT)) {
log->AddEvent(LogLevel_Warning, "WiFi STA connection lost. WDG timer expired. Restart MCU!"); log->AddEvent(LogLevel_Warning, F("WiFi STA connection lost. WDG timer expired. Restart MCU!"));
/* restart MCU, or disconnect and connect to WiFi again ? From my point of view, and testing, restart MCU is better */ /* restart MCU, or disconnect and connect to WiFi again ? From my point of view, and testing, restart MCU is better */
ESP.restart(); ESP.restart();
} }
} else if (true == StartStaWdg) { } else if (true == StartStaWdg) {
log->AddEvent(LogLevel_Info, "WiFi STA connection OK. Stop watchdog timer!"); log->AddEvent(LogLevel_Info, F("WiFi STA connection OK. Stop watchdog timer!"));
StartStaWdg = false; StartStaWdg = false;
TaskWdg_previousMillis = millis(); TaskWdg_previousMillis = millis();
} }
@ -427,40 +427,40 @@ String WiFiMngt::TranslateTxPower(wifi_power_t data) {
String ret = ""; String ret = "";
switch (data) { switch (data) {
case WIFI_POWER_MINUS_1dBm: case WIFI_POWER_MINUS_1dBm:
ret = "-1dBm"; ret = F("-1dBm");
break; break;
case WIFI_POWER_2dBm: case WIFI_POWER_2dBm:
ret = "2dBm"; ret = F("2dBm");
break; break;
case WIFI_POWER_5dBm: case WIFI_POWER_5dBm:
ret = "5dBm"; ret = F("5dBm");
break; break;
case WIFI_POWER_7dBm: case WIFI_POWER_7dBm:
ret = "7dBm"; ret = F("7dBm");
break; break;
case WIFI_POWER_8_5dBm: case WIFI_POWER_8_5dBm:
ret = "8.5dBm"; ret = F("8.5dBm");
break; break;
case WIFI_POWER_11dBm: case WIFI_POWER_11dBm:
ret = "11dBm"; ret = F("11dBm");
break; break;
case WIFI_POWER_13dBm: case WIFI_POWER_13dBm:
ret = "13dBm"; ret = F("13dBm");
break; break;
case WIFI_POWER_15dBm: case WIFI_POWER_15dBm:
ret = "15dBm"; ret = F("15dBm");
break; break;
case WIFI_POWER_17dBm: case WIFI_POWER_17dBm:
ret = "17dBm"; ret = F("17dBm");
break; break;
case WIFI_POWER_18_5dBm: case WIFI_POWER_18_5dBm:
ret = "18.5dBm"; ret = F("18.5dBm");
break; break;
case WIFI_POWER_19dBm: case WIFI_POWER_19dBm:
ret = "19dBm"; ret = F("19dBm");
break; break;
case WIFI_POWER_19_5dBm: case WIFI_POWER_19_5dBm:
ret = "19.5dBm"; ret = F("19.5dBm");
break; break;
} }
@ -477,31 +477,31 @@ String WiFiMngt::TranslateWiFiStatus(wl_status_t i_wifi_status) {
String ret = ""; String ret = "";
switch (i_wifi_status) { switch (i_wifi_status) {
case WL_IDLE_STATUS: case WL_IDLE_STATUS:
ret = "Idle"; ret = F("Idle");
break; break;
case WL_NO_SSID_AVAIL: case WL_NO_SSID_AVAIL:
ret = "No SSID available"; ret = F("No SSID available");
break; break;
case WL_SCAN_COMPLETED: case WL_SCAN_COMPLETED:
ret = "Scan completed"; ret = F("Scan completed");
break; break;
case WL_CONNECTED: case WL_CONNECTED:
ret = "Connected"; ret = F("Connected");
break; break;
case WL_CONNECT_FAILED: case WL_CONNECT_FAILED:
ret = "Connect failed"; ret = F("Connect failed");
break; break;
case WL_CONNECTION_LOST: case WL_CONNECTION_LOST:
ret = "Connection lost"; ret = F("Connection lost");
break; break;
case WL_DISCONNECTED: case WL_DISCONNECTED:
ret = "Disconnected"; ret = F("Disconnected");
break; break;
case WL_NO_SHIELD: case WL_NO_SHIELD:
ret = "No WiFi shield"; ret = F("No WiFi shield");
break; break;
default: default:
ret = "Unkcnown status"; ret = F("Unkcnown status");
ret += String(i_wifi_status); ret += String(i_wifi_status);
} }
return ret; return ret;
@ -516,34 +516,34 @@ String WiFiMngt::TranslateWiFiEncrypion(wifi_auth_mode_t i_data) {
String ret = ""; String ret = "";
switch (i_data) { switch (i_data) {
case WIFI_AUTH_OPEN: case WIFI_AUTH_OPEN:
ret = "open"; ret = F("open");
break; break;
case WIFI_AUTH_WEP: case WIFI_AUTH_WEP:
ret = "WEP"; ret = F("WEP");
break; break;
case WIFI_AUTH_WPA_PSK: case WIFI_AUTH_WPA_PSK:
ret = "WPA"; ret = F("WPA");
break; break;
case WIFI_AUTH_WPA2_PSK: case WIFI_AUTH_WPA2_PSK:
ret = "WPA2"; ret = F("WPA2");
break; break;
case WIFI_AUTH_WPA_WPA2_PSK: case WIFI_AUTH_WPA_WPA2_PSK:
ret = "WPA+WPA2"; ret = F("WPA+WPA2");
break; break;
case WIFI_AUTH_WPA2_ENTERPRISE: case WIFI_AUTH_WPA2_ENTERPRISE:
ret = "WPA2-EAP"; ret = F("WPA2-EAP");
break; break;
case WIFI_AUTH_WPA3_PSK: case WIFI_AUTH_WPA3_PSK:
ret = "WPA3"; ret = F("WPA3");
break; break;
case WIFI_AUTH_WPA2_WPA3_PSK: case WIFI_AUTH_WPA2_WPA3_PSK:
ret = "WPA2+WPA3"; ret = F("WPA2+WPA3");
break; break;
case WIFI_AUTH_WAPI_PSK: case WIFI_AUTH_WAPI_PSK:
ret = "WAPI"; ret = F("WAPI");
break; break;
default: default:
ret = "unknown"; ret = F("unknown");
} }
return ret; return ret;
@ -739,7 +739,7 @@ void WiFiMngt::SetFirstConnection(bool i_data) {
@return none @return none
*/ */
void WiFiMngt_WiFiEventScanDone(WiFiEvent_t event, WiFiEventInfo_t info) { void WiFiMngt_WiFiEventScanDone(WiFiEvent_t event, WiFiEventInfo_t info) {
SystemLog.AddEvent(LogLevel_Info, "WiFi networks scan done"); SystemLog.AddEvent(LogLevel_Info, F("WiFi networks scan done"));
} }
/** /**
@ -749,7 +749,7 @@ void WiFiMngt_WiFiEventScanDone(WiFiEvent_t event, WiFiEventInfo_t info) {
@return none @return none
*/ */
void WiFiMngt_WiFiEventStationStart(WiFiEvent_t event, WiFiEventInfo_t info) { void WiFiMngt_WiFiEventStationStart(WiFiEvent_t event, WiFiEventInfo_t info) {
SystemLog.AddEvent(LogLevel_Info, "WiFi STA start"); SystemLog.AddEvent(LogLevel_Info, F("WiFi STA start"));
} }
/** /**
@ -759,7 +759,7 @@ void WiFiMngt_WiFiEventStationStart(WiFiEvent_t event, WiFiEventInfo_t info) {
@return none @return none
*/ */
void WiFiMngt_WiFiEventStationStop(WiFiEvent_t event, WiFiEventInfo_t info) { void WiFiMngt_WiFiEventStationStop(WiFiEvent_t event, WiFiEventInfo_t info) {
SystemLog.AddEvent(LogLevel_Info, "WiFi STA stop"); SystemLog.AddEvent(LogLevel_Info, F("WiFi STA stop"));
} }
/** /**
@ -769,7 +769,7 @@ void WiFiMngt_WiFiEventStationStop(WiFiEvent_t event, WiFiEventInfo_t info) {
@return none @return none
*/ */
void WiFiMngt_WiFiEventStationConnected(WiFiEvent_t event, WiFiEventInfo_t info) { void WiFiMngt_WiFiEventStationConnected(WiFiEvent_t event, WiFiEventInfo_t info) {
SystemLog.AddEvent(LogLevel_Info, "WiFi connected to STA"); SystemLog.AddEvent(LogLevel_Info, F("WiFi connected to STA"));
} }
/** /**
@ -803,7 +803,7 @@ void WiFiMngt_WiFiEventGotIP(WiFiEvent_t event, WiFiEventInfo_t info) {
@return none @return none
*/ */
void WiFiMngt_WiFiEventLostIP(WiFiEvent_t event, WiFiEventInfo_t info) { void WiFiMngt_WiFiEventLostIP(WiFiEvent_t event, WiFiEventInfo_t info) {
SystemLog.AddEvent(LogLevel_Info, "WiFi lost IP address"); SystemLog.AddEvent(LogLevel_Info, F("WiFi lost IP address"));
} }
/** /**
@ -855,7 +855,7 @@ void WiFiMngt_WiFiEventStationDisconnected(WiFiEvent_t event, WiFiEventInfo_t in
@return none @return none
*/ */
void WiFiMngt_WiFiEventApStart(WiFiEvent_t event, WiFiEventInfo_t info) { void WiFiMngt_WiFiEventApStart(WiFiEvent_t event, WiFiEventInfo_t info) {
SystemLog.AddEvent(LogLevel_Info, "WiFi AP start"); SystemLog.AddEvent(LogLevel_Info, F("WiFi AP start"));
} }
/** /**
@ -865,7 +865,7 @@ void WiFiMngt_WiFiEventApStart(WiFiEvent_t event, WiFiEventInfo_t info) {
@return none @return none
*/ */
void WiFiMngt_WiFiEventApStop(WiFiEvent_t event, WiFiEventInfo_t info) { void WiFiMngt_WiFiEventApStop(WiFiEvent_t event, WiFiEventInfo_t info) {
SystemLog.AddEvent(LogLevel_Info, "WiFi AP stop"); SystemLog.AddEvent(LogLevel_Info, F("WiFi AP stop"));
} }
/** /**
@ -915,7 +915,7 @@ void WiFiMngt_WiFiEventApStaIpAssigned(WiFiEvent_t event, WiFiEventInfo_t info)
@return none @return none
*/ */
void WiFiMngt_WiFiEventApStaProbeReqRecved(WiFiEvent_t event, WiFiEventInfo_t info) { void WiFiMngt_WiFiEventApStaProbeReqRecved(WiFiEvent_t event, WiFiEventInfo_t info) {
SystemLog.AddEvent(LogLevel_Info, "WiFi AP STA receive probe request packet in soft-AP interface"); SystemLog.AddEvent(LogLevel_Info, F("WiFi AP STA receive probe request packet in soft-AP interface"));
} }
/* EOF */ /* EOF */

View File

@ -4,7 +4,7 @@ This repository includes source code and firmware releases for the ESP32-cam mod
This project uses other libraries. It is necessary to install them in the Arduino IDE. This project uses other libraries. It is necessary to install them in the Arduino IDE.
- App [Arduino IDE 2.3.2](https://www.arduino.cc/en/software) - App [Arduino IDE 2.3.2](https://www.arduino.cc/en/software)
- MCU support [ESP32 2.0.15](https://github.com/espressif/arduino-esp32) - MCU support [ESP32 2.0.16](https://github.com/espressif/arduino-esp32)
- Library [ESPAsyncWebSrv 1.2.7](https://github.com/dvarrel/ESPAsyncWebSrv) - Library [ESPAsyncWebSrv 1.2.7](https://github.com/dvarrel/ESPAsyncWebSrv)
- Library [AsyncTCP 1.1.4](https://github.com/dvarrel/AsyncTCP) - Library [AsyncTCP 1.1.4](https://github.com/dvarrel/AsyncTCP)
- Library [ArduinoJson 7.0.4](https://github.com/bblanchon/ArduinoJson) - Library [ArduinoJson 7.0.4](https://github.com/bblanchon/ArduinoJson)