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
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.
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.
- Library - License - Version - Link
@ -12,7 +12,7 @@
- AsyncTCP - LGPL 3.0 - 1.1.4 - https://github.com/dvarrel/ESPAsyncTCP
- ArduinoJson - MIT - 7.0.4 - https://github.com/bblanchon/ArduinoJson
- 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
Tools -> Board -> ESP32 Arduino -> AI Thinker ESP32
@ -64,12 +64,12 @@
void setup() {
/* Serial port for debugging purposes */
Serial.begin(SERIAL_PORT_SPEED);
Serial.println("----------------------------------------------------------------");
Serial.println("Start MCU!");
Serial.println("Prusa ESP32-cam https://prusa3d.cz");
Serial.print("SW Version: ");
Serial.println(F("----------------------------------------------------------------"));
Serial.println(F("Start MCU!"));
Serial.println(F("Prusa ESP32-cam https://prusa3d.cz"));
Serial.print(F("SW Version: "));
Serial.println(SW_VERSION);
Serial.print("Build: ");
Serial.print(F("Build: "));
Serial.println(SW_BUILD);
#if (CONSOLE_VERBOSE_DEBUG == true)
Serial.setDebugOutput(true);
@ -111,18 +111,18 @@ void setup() {
Connect.Init();
/* 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_TaskCaptureAndSendPhoto, "CaptureAndSendPhoto", 10000, 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_TaskSdCardCheck, "CheckMicroSdCard", 5000, 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_TaskStreamTelemetry, "PrintStreamTelemetry", 3000, 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_TaskWiFiWatchdog, "WiFiWatchdog", 3000, NULL, 8, &Task_WiFiWatchdog, 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", 2500, NULL, 3, &Task_WiFiManagement, 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", 2500, NULL, 5, &Task_SerialCfg, 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", 2000, NULL, 7, &Task_SysLed, 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 */
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_add(NULL); /* add current thread to WDT watch */
esp_task_wdt_add(Task_CapturePhotoAndSend);
@ -135,7 +135,7 @@ void setup() {
esp_task_wdt_add(Task_WiFiWatchdog);
esp_task_wdt_reset(); /* reset wdg */
SystemLog.AddEvent(LogLevel_Info, "MCU configuration done");
SystemLog.AddEvent(LogLevel_Info, F("MCU configuration done"));
}
void loop() {

View File

@ -33,9 +33,9 @@ Camera::Camera(Configuration* i_conf, Logs* i_log, uint8_t i_FlashPin) {
@return none
*/
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);
ledcAttachPin(FLASH_GPIO_NUM, FLASH_PWM_CHANNEL);
ledcWrite(FLASH_PWM_CHANNEL, FLASH_OFF_STATUS);
@ -50,7 +50,7 @@ void Camera::Init() {
@return none
*/
void Camera::InitCameraModule() {
log->AddEvent(LogLevel_Info, "Init camera module");
log->AddEvent(LogLevel_Info, F("Init camera module"));
/* Turn-off the 'brownout detector' */
WRITE_PERI_REG(RTC_CNTL_BROWN_OUT_REG, 0);
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 */
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) {
log->AddEvent(LogLevel_Verbose, "Camera frame buffer location: PSRAM");
log->AddEvent(LogLevel_Verbose, F("Camera frame buffer location: PSRAM"));
} else {
log->AddEvent(LogLevel_Verbose, "Camera frame buffer location: Unknown");
log->AddEvent(LogLevel_Verbose, F("Camera frame buffer location: Unknown"));
}
/* Camera init */
err = esp_camera_init(&CameraConfig);
if (err != ESP_OK) {
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();
}
}
@ -114,7 +114,7 @@ void Camera::InitCameraModule() {
@return none
*/
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();
FrameSize = config->LoadFrameSize();
TFrameSize = TransformFrameSizeDataType(config->LoadFrameSize());
@ -212,7 +212,7 @@ bool Camera::GetFlashStatus() {
@return none
*/
void Camera::ApplyCameraCfg() {
log->AddEvent(LogLevel_Info, "Set camera CFG");
log->AddEvent(LogLevel_Info, F("Set camera CFG"));
/* sensor configuration */
sensor_t* sensor = esp_camera_sensor_get();
@ -274,12 +274,12 @@ void Camera::CapturePhoto() {
esp_camera_fb_return(FrameBuffer);
do {
log->AddEvent(LogLevel_Info, "Taking photo...");
log->AddEvent(LogLevel_Info, F("Taking photo..."));
/* capture final photo */
FrameBuffer = esp_camera_fb_get();
if (!FrameBuffer) {
log->AddEvent(LogLevel_Error, "Camera capture failed! photo");
log->AddEvent(LogLevel_Error, F("Camera capture failed! photo"));
return;
} else {
@ -325,7 +325,7 @@ void Camera::CaptureStream(camera_fb_t* i_buf) {
/* capture final photo */
FrameBuffer = esp_camera_fb_get();
if (!FrameBuffer) {
log->AddEvent(LogLevel_Error, "Camera capture failed! stream");
log->AddEvent(LogLevel_Error, F("Camera capture failed! stream"));
i_buf = NULL;
return;
}

View File

@ -34,7 +34,7 @@ void Configuration::Init() {
/* check, when it is first MCU start. If yes, then set default CFG */
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();
SaveFirstMcuStartFlag(CFG_FIRST_MCU_START_NAK);
Log->SetLogLevel(LoadLogLevel());
@ -50,7 +50,7 @@ void Configuration::Init() {
@return none
*/
void Configuration::ReadCfg() {
Log->AddEvent(LogLevel_Info, "Load CFG from EEPROM");
Log->AddEvent(LogLevel_Info, F("Load CFG from EEPROM"));
LoadRefreshInterval();
LoadToken();
LoadFingerprint();
@ -84,7 +84,7 @@ void Configuration::ReadCfg() {
LoadAgcGain();
LoadPrusaConnectHostname();
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
*/
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);
if (CFG_FIRST_MCU_START_NAK == flag) {
@ -123,8 +123,8 @@ void Configuration::SaveFirstMcuStartFlag(uint8_t i_data) {
@return none
*/
void Configuration::DefaultCfg() {
Log->AddEvent(LogLevel_Warning, "+++++++++++++++++++++++++++");
Log->AddEvent(LogLevel_Warning, "Start set factory cfg!");
Log->AddEvent(LogLevel_Warning, F("+++++++++++++++++++++++++++"));
Log->AddEvent(LogLevel_Warning, F("Start set factory cfg!"));
SaveRefreshInterval(FACTORY_CFG_PHOTO_REFRESH_INTERVAL);
SaveToken("");
@ -160,7 +160,7 @@ void Configuration::DefaultCfg() {
SaveAgcGain(FACTORY_CFG_AGC_GAIN);
SaveLogLevel(LogLevel_Info);
SavePrusaConnectHostname(FACTORY_CFG_HOSTNAME);
Log->AddEvent(LogLevel_Warning, "+++++++++++++++++++++++++++");
Log->AddEvent(LogLevel_Warning, F("+++++++++++++++++++++++++++"));
}
/**
@ -187,7 +187,7 @@ bool Configuration::CheckActifeWifiCfgFlag() {
@return none
*/
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);
/* wait 10s to pressed reset pin */
@ -204,7 +204,7 @@ void Configuration::CheckResetCfg() {
/* check if is reset pin grounded more at 10s */
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 */
while (digitalRead(CFG_RESET_PIN) == LOW) {
@ -220,7 +220,7 @@ void Configuration::CheckResetCfg() {
ESP.restart();
} 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.commit();
Log->AddEvent(LogLevel_Verbose, "Write string done");
Log->AddEvent(LogLevel_Verbose, F("Write string done"));
} 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
*/
void PrusaConnect::Init() {
log->AddEvent(LogLevel_Info, "Init PrusaConnect lib");
log->AddEvent(LogLevel_Info, F("Init PrusaConnect lib"));
TakePicture();
}
@ -46,7 +46,7 @@ void PrusaConnect::Init() {
* @return none
*/
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();
Fingerprint = config->LoadFingerprint();
RefreshInterval = config->LoadRefreshInterval();
@ -76,7 +76,6 @@ void PrusaConnect::TakePicture() {
*/
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;
Server_pause();
BackendReceivedStatus = "";
bool ret = false;
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)) {
client.setCACert(root_CAs);
client.setTimeout(1000);
log->AddEvent(LogLevel_Verbose, "Connecting to server...");
log->AddEvent(LogLevel_Verbose, F("Connecting to server..."));
/* connecting to server */
if (!client.connect(PrusaConnectHostname.c_str(), 443)) {
@ -102,7 +101,7 @@ bool PrusaConnect::SendDataToBackend(String *i_data, int i_data_length, String i
} else {
/* 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("Host: " + PrusaConnectHostname);
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("fingerprint: " + Fingerprint);
client.println("token: " + Token);
client.print("Content-Length: ");
client.println(i_data_length);
client.println("Content-Length: " + String(i_data_length));
client.println();
esp_task_wdt_reset();
/* sending photo */
if (SendPhoto == i_data_type) {
log->AddEvent(LogLevel_Verbose, "Send data photo");
int index;
log->AddEvent(LogLevel_Verbose, F("Send data photo"));
int index = 0;
/* send data in fragments */
for (index = 0; index < i_data_length; 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 */
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);
client.print(*i_data);
log->AddEvent(LogLevel_Verbose, String(i_data_length) + "/" + String(i_data_length));
}
/* sending device information */
} 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);
}
@ -170,19 +170,18 @@ bool PrusaConnect::SendDataToBackend(String *i_data, int i_data_length, String i
}
} else {
/* 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, "Token: " + Token);
if (Fingerprint.length() == 0) {
BackendReceivedStatus = "Missing fingerprint";
BackendReceivedStatus = F("Missing fingerprint");
} else if (Token.length() == 0) {
BackendReceivedStatus = "Missing token";
BackendReceivedStatus = F("Missing token");
}
}
log->AddEvent(LogLevel_Info, "Upload done. Response code: " + BackendReceivedStatus + " ,BA:" + CovertBackendAvailabilitStatusToString(BackendAvailability));
Server_resume();
return ret;
}
@ -193,7 +192,8 @@ bool PrusaConnect::SendDataToBackend(String *i_data, int i_data_length, String i
* @return none
*/
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);
SystemLog.AddEvent(LogLevel_Info, "Free RAM: " + String(ESP.getFreeHeap()) + " bytes");
}
@ -207,7 +207,7 @@ void PrusaConnect::SendInfoToBackend() {
return;
} 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;
String json_string = "";
@ -253,40 +253,40 @@ void PrusaConnect::TakePictureAndSendToBackend() {
String PrusaConnect::ProcessHttpResponseCode(int code) {
String ret = "";
switch (code) {
case 200:
ret = "200 - OK";
break;
case 201:
ret = "201 - OK entry created";
break;
case 204:
ret = "204 - Upload OK";
break;
case 304:
ret = "304 - Response has not been modified";
break;
case 400:
ret = "400 - Some data received is not valid";
break;
case 401:
ret = "401 - Missing security toker or it is not valid";
break;
case 403:
ret = "403 - Security toke is not valid or is outdated";
break;
case 404:
ret = "404 - Entity not found or invalid auth token";
break;
case 409:
ret = "409 - Conflict with the state of target resource (user error)";
break;
case 503:
ret += "503 - Service is unavailable at this moment. Try again later";
break;
default:
ret = String(code);
ret += " - unknown error code";
break;
case 200:
ret = F("200 - OK");
break;
case 201:
ret = F("201 - OK entry created");
break;
case 204:
ret = F("204 - Upload OK");
break;
case 304:
ret = F("304 - Response has not been modified");
break;
case 400:
ret = F("400 - Some data received is not valid");
break;
case 401:
ret = F("401 - Missing security toker or it is not valid");
break;
case 403:
ret = F("403 - Security toke is not valid or is outdated");
break;
case 404:
ret = F("404 - Entity not found or invalid auth token");
break;
case 409:
ret = F("409 - Conflict with the state of target resource (user error)");
break;
case 503:
ret += F("503 - Service is unavailable at this moment. Try again later");
break;
default:
ret = String(code);
ret += F(" - unknown error code");
break;
}
return ret;
@ -301,39 +301,39 @@ String PrusaConnect::ProcessHttpResponseCode(int code) {
bool PrusaConnect::ProcessHttpResponseCodeBool(int code) {
bool ret = false;
switch (code) {
case 200:
ret = true;
break;
case 201:
ret = true;
break;
case 204:
ret = true;
break;
case 304:
ret = false;
break;
case 400:
ret = false;
break;
case 401:
ret = false;
break;
case 403:
ret = false;
break;
case 404:
ret = false;
break;
case 409:
ret = false;
break;
case 503:
ret = false;
break;
default:
ret = false;
break;
case 200:
ret = true;
break;
case 201:
ret = true;
break;
case 204:
ret = true;
break;
case 304:
ret = false;
break;
case 400:
ret = false;
break;
case 401:
ret = false;
break;
case 403:
ret = false;
break;
case 404:
ret = false;
break;
case 409:
ret = false;
break;
case 503:
ret = false;
break;
default:
ret = false;
break;
}
return ret;
@ -458,18 +458,18 @@ BackendAvailabilitStatus PrusaConnect::GetBackendAvailabilitStatus() {
String PrusaConnect::CovertBackendAvailabilitStatusToString(BackendAvailabilitStatus i_data) {
String ret = "";
switch (i_data) {
case WaitForFirstConnection:
ret = "Wait for first connection";
break;
case BackendAvailable:
ret = "Backend available";
break;
case BackendUnavailable:
ret = "Backend unavailable";
break;
default:
ret = "Unknown";
break;
case WaitForFirstConnection:
ret = F("Wait for first connection");
break;
case BackendAvailable:
ret = F("Backend available");
break;
case BackendUnavailable:
ret = F("Backend unavailable");
break;
default:
ret = F("Unknown");
break;
}
return ret;

View File

@ -51,12 +51,11 @@ private:
uint8_t RefreshInterval; ///< interval for sending photo to backend
String BackendReceivedStatus; ///< status of backend response
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
String Token; ///< token for backend communication
String Fingerprint; ///< fingerprint for backend communication
String Photo; ///< photo for sending to backend
String PrusaConnectHostname; ///< hostname of prusa connect backend
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
*/
void Logs::Init() {
Serial.println("----------------------------------------------------------------");
Serial.println("Init Logs library");
Serial.println(F("----------------------------------------------------------------"));
Serial.println(F("Init Logs library"));
/* init micro SD card */
InitSdCard();
@ -110,22 +110,22 @@ void Logs::Init() {
}
/* added first message to log file after start MCU */
String msg = "----------------------------------------------------------------\n";
msg += "Start MCU!\nSW Version: ";
String msg = F("----------------------------------------------------------------\n");
msg += F("Start MCU!\nSW Version: ");
msg += String(SW_VERSION);
msg += " ,Build: ";
msg += F(" ,Build: ");
msg += String(SW_BUILD);
msg += "\n";
msg += "Verbose mode: ";
msg += F("Verbose mode: ");
msg += (true == CONSOLE_VERBOSE_DEBUG) ? "true" : "false";
msg += "\n";
msg += "Log level: ";
msg += F("Log level: ");
msg += String(LogLevel);
msg += "\n";
AppendFile(SD_MMC, FilePath + FileName, msg);
} 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_
/* ---------------- 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 CONSOLE_VERBOSE_DEBUG false ///< enable/disable verbose debug log level for console
#define DEVICE_HOSTNAME "Prusa-ESP32cam" ///< device hostname
@ -22,7 +22,7 @@
/* ------------ PRUSA BACKEND CFG --------------*/
#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 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]
/* --------------- FLASH LED CFG ---------------*/
@ -90,6 +90,12 @@
/* ----------------- WiFi CFG -------------------*/
#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 ----------------*/
#define FACTORY_CFG_PHOTO_REFRESH_INTERVAL 30 ///< in the second
#define FACTORY_CFG_PHOTO_QUALITY 10 ///< 10-63, lower is better

View File

@ -28,11 +28,11 @@ MicroSd::MicroSd() {
@return none
*/
void MicroSd::ReinitCard() {
Serial.println("Reinit micro SD card!");
Serial.println("Deinit micro SD card");
Serial.println(F("Reinit micro SD card!"));
Serial.println(F("Deinit micro SD card"));
SD_MMC.end();
delay(50);
Serial.println("Init micro SD card");
Serial.println(F("Init micro SD card"));
InitSdCard();
}
@ -43,12 +43,12 @@ void MicroSd::ReinitCard() {
*/
void MicroSd::InitSdCard() {
/* 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. */
/* https://github.com/espressif/arduino-esp32/blob/master/libraries/SD_MMC/src/SD_MMC.h */
if (!SD_MMC.begin("/sdcard", true)) {
Serial.println("SD Card Mount Failed");
Serial.println(F("SD Card Mount Failed"));
CardDetected = false;
CardSize = 0;
//DetectAfterBoot = false;
@ -58,7 +58,7 @@ void MicroSd::InitSdCard() {
/* check microSD card and card type */
uint8_t cardType = SD_MMC.cardType();
if (cardType == CARD_NONE) {
Serial.println("No SD_MMC card attached");
Serial.println(F("No SD_MMC card attached"));
CardDetected = false;
CardSize = 0;
//DetectAfterBoot = false;
@ -66,15 +66,15 @@ void MicroSd::InitSdCard() {
}
/* print card type */
Serial.print("Found card. Card Type: ");
Serial.print(F("Found card. Card Type: "));
if (cardType == CARD_MMC) {
Serial.print("MMC");
Serial.print(F("MMC"));
} else if (cardType == CARD_SD) {
Serial.print("SDSC");
Serial.print(F("SDSC"));
} else if (cardType == CARD_SDHC) {
Serial.print("SDHC");
Serial.print(F("SDHC"));
} else {
Serial.print("UNKNOWN");
Serial.print(F("UNKNOWN"));
}
/* 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());
if (!root) {
Serial.println("Failed to open directory");
Serial.println(F("Failed to open directory"));
return;
}
if (!root.isDirectory()) {
Serial.println("Not a directory");
Serial.println(F("Not a directory"));
return;
}
File file = root.openNextFile();
while (file) {
if (file.isDirectory()) {
Serial.print(" DIR : ");
Serial.print(F(" DIR : "));
Serial.println(file.name());
if (levels) {
ListDir(fs, file.path(), levels - 1);
}
} else {
Serial.print(" FILE: ");
Serial.print(F(" FILE: "));
Serial.print(file.name());
Serial.print(" SIZE: ");
Serial.print(F(" SIZE: "));
Serial.println(file.size());
}
file = root.openNextFile();
@ -184,11 +184,11 @@ void MicroSd::ReadFileConsole(fs::FS &fs, String path) {
File file = fs.open(path.c_str());
if (!file) {
Serial.println("Failed to open file for reading");
Serial.println(F("Failed to open file for reading"));
return;
}
Serial.print("Read from file: ");
Serial.print(F("Read from file: "));
while (file.available()) {
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());
if (!root) {
Serial.println("Failed to open directory");
Serial.println(F("Failed to open directory"));
return 0;
}
if (!root.isDirectory()) {
Serial.println("Not a directory");
Serial.println(F("Not a directory"));
return 0;
}

View File

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

View File

@ -32,11 +32,11 @@ void Server_LoadCfg() {
@return none
*/
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 */
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)
return;
@ -45,7 +45,7 @@ void Server_InitWebServer() {
/* route to jquery */
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)
return;
@ -75,7 +75,7 @@ void Server_InitWebServer() {
void Server_InitWebServer_JsonData() {
/* route for json with cfg parameters */
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)
return;
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 */
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)
return;
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 */
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)
return;
request->send_P(200, F("text/html"), MSG_SCANNING);
@ -123,7 +123,7 @@ void Server_InitWebServer_JsonData() {
void Server_InitWebServer_WebPages() {
/* Route for root / web page */
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)
return;
@ -132,7 +132,7 @@ void Server_InitWebServer_WebPages() {
/* Route for styles */
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)
return;
@ -141,7 +141,7 @@ void Server_InitWebServer_WebPages() {
/* Route for java scripts */
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)
return;
request->send_P(200, "application/javascript", scripts_js);
@ -150,7 +150,7 @@ void Server_InitWebServer_WebPages() {
/* Route for config web page */
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)
return;
@ -159,7 +159,7 @@ void Server_InitWebServer_WebPages() {
/* Route for wifi web page */
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)
return;
@ -168,7 +168,7 @@ void Server_InitWebServer_WebPages() {
/* Route for auth web page */
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)
return;
@ -177,7 +177,7 @@ void Server_InitWebServer_WebPages() {
/* Route for system web page */
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)
return;
@ -186,7 +186,7 @@ void Server_InitWebServer_WebPages() {
/* route to license page */
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)
return;
@ -195,7 +195,7 @@ void Server_InitWebServer_WebPages() {
/* route to gtac page */
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)
return;
@ -204,7 +204,7 @@ void Server_InitWebServer_WebPages() {
/* route to privacy policy page */
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)
return;
@ -213,7 +213,7 @@ void Server_InitWebServer_WebPages() {
/* route to cookie page */
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)
return;
@ -222,7 +222,7 @@ void Server_InitWebServer_WebPages() {
/* route to logs page */
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)
return;
@ -242,7 +242,7 @@ void Server_InitWebServer_WebPages() {
void Server_InitWebServer_Icons() {
/* route to logo */
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)
return;
@ -251,7 +251,7 @@ void Server_InitWebServer_Icons() {
/* route to github icon */
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)
return;
@ -260,7 +260,7 @@ void Server_InitWebServer_Icons() {
/* route to light on icon */
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)
return;
@ -269,7 +269,7 @@ void Server_InitWebServer_Icons() {
/* route to light off icon */
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)
return;
@ -278,7 +278,7 @@ void Server_InitWebServer_Icons() {
/* route to refresh icon */
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)
return;
@ -287,7 +287,7 @@ void Server_InitWebServer_Icons() {
/* route to reboot icon */
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)
return;
@ -296,7 +296,7 @@ void Server_InitWebServer_Icons() {
/* route to wifi icon */
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)
return;
@ -305,7 +305,7 @@ void Server_InitWebServer_Icons() {
/* route to wifi icon */
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)
return;
@ -314,7 +314,7 @@ void Server_InitWebServer_Icons() {
/* route to wifi icon */
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)
return;
@ -323,7 +323,7 @@ void Server_InitWebServer_Icons() {
/* route to wifi icon */
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)
return;
@ -332,7 +332,7 @@ void Server_InitWebServer_Icons() {
/* route to wifi icon */
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)
return;
@ -341,7 +341,7 @@ void Server_InitWebServer_Icons() {
/* route to eye icon */
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)
return;
@ -350,7 +350,7 @@ void Server_InitWebServer_Icons() {
/* route to eye-slash icon */
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)
return;
@ -359,7 +359,7 @@ void Server_InitWebServer_Icons() {
/* route to favicon */
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)
return;
@ -375,7 +375,7 @@ void Server_InitWebServer_Icons() {
void Server_InitWebServer_Actions() {
/*route for capture photo */
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)
return;
SystemCamera.CapturePhoto();
@ -384,7 +384,7 @@ void Server_InitWebServer_Actions() {
/* route for send photo to prusa backend */
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)
return;
Connect.SetSendingIntervalExpired();
@ -393,7 +393,7 @@ void Server_InitWebServer_Actions() {
/* route for change LED status */
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)
return;
@ -405,7 +405,7 @@ void Server_InitWebServer_Actions() {
/* reboot MCU */
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)
return;
request->send_P(200, F("text/html"), MSG_REBOOT_MCU);
@ -422,7 +422,7 @@ void Server_InitWebServer_Actions() {
void Server_InitWebServer_Sets() {
/* route to set integer value */
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)
return;
@ -431,24 +431,20 @@ void Server_InitWebServer_Sets() {
/* set refresh interval */
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();
if ((value >= REFRESH_INTERVAL_MIN) && (value <= REFRESH_INTERVAL_MAX)) {
Connect.SetRefreshInterval(value);
response_msg = MSG_SAVE_OK;
} else {
response_msg = "ERROR! Bad value. Minimum is ";
response_msg += String(REFRESH_INTERVAL_MIN);
response_msg += ", maximum ";
response_msg += String(REFRESH_INTERVAL_MAX);
response_msg += " second";
response_msg = "ERROR! Bad value. Minimum is " + String(REFRESH_INTERVAL_MIN) + ", maximum " + String(REFRESH_INTERVAL_MAX) + " second";
}
response = true;
}
/* set 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());
response_msg = MSG_SAVE_OK;
response = true;
@ -456,7 +452,7 @@ void Server_InitWebServer_Sets() {
/* set 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());
response_msg = MSG_SAVE_OK;
response = true;
@ -464,7 +460,7 @@ void Server_InitWebServer_Sets() {
/* set 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());
response_msg = MSG_SAVE_OK;
response = true;
@ -472,7 +468,7 @@ void Server_InitWebServer_Sets() {
/* set frame size */
if (request->hasParam("framesize")) {
SystemLog.AddEvent(LogLevel_Verbose, "Set framesize");
SystemLog.AddEvent(LogLevel_Verbose, F("Set framesize"));
SystemCamera.SetFrameSize(request->getParam("framesize")->value().toInt());
response_msg = MSG_SAVE_OK;
response = true;
@ -480,7 +476,7 @@ void Server_InitWebServer_Sets() {
/* set 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());
response_msg = MSG_SAVE_OK;
response = true;
@ -488,7 +484,7 @@ void Server_InitWebServer_Sets() {
/* set 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());
response_msg = MSG_SAVE_OK;
response = true;
@ -496,7 +492,7 @@ void Server_InitWebServer_Sets() {
/* set white balancing 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());
response_msg = MSG_SAVE_OK;
response = true;
@ -504,7 +500,7 @@ void Server_InitWebServer_Sets() {
/* set auto exposition 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());
response_msg = MSG_SAVE_OK;
response = true;
@ -512,7 +508,7 @@ void Server_InitWebServer_Sets() {
/* set auto exposition controll 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());
response_msg = MSG_SAVE_OK;
response = true;
@ -520,7 +516,7 @@ void Server_InitWebServer_Sets() {
/* set auto gain correction value */
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());
response_msg = MSG_SAVE_OK;
response = true;
@ -528,7 +524,7 @@ void Server_InitWebServer_Sets() {
/* set log level /set_int?log_level=2 */
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();
if ((level >= LogLevel_Error) && (level <= LogLevel_Verbose)) {
SystemConfig.SaveLogLevel(level);
@ -548,7 +544,7 @@ void Server_InitWebServer_Sets() {
/* route to set bool value */
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)
return;
@ -556,84 +552,84 @@ void Server_InitWebServer_Sets() {
/* check cfg for 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()));
response = true;
}
/* set vertical flip */
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()));
response = true;
}
/* set lens correction */
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()));
response = true;
}
/* set exposure controll */
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()));
response = true;
}
/* set auto white balancing */
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()));
response = true;
}
/* set auto white balancing 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()));
response = true;
}
/* set bad pixel correction */
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()));
response = true;
}
/* set white pixel correction */
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()));
response = true;
}
/* set raw gama correction */
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()));
response = true;
}
/* set automatic exposure correction */
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()));
response = true;
}
/* set gain controll */
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()));
response = true;
}
/* set 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.SetFlashStatus(false);
response = true;
@ -646,7 +642,7 @@ void Server_InitWebServer_Sets() {
/* route for set token for authentification to prusa backend*/
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)
return;
request->send_P(200, F("text/html"), MSG_SAVE_OK);
@ -658,7 +654,7 @@ void Server_InitWebServer_Sets() {
/* route for set prusa connect hostname */
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)
return;
request->send_P(200, F("text/html"), MSG_SAVE_OK);
@ -670,7 +666,7 @@ void Server_InitWebServer_Sets() {
/* route for set WI-FI credentials */
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)
return;
@ -702,7 +698,7 @@ void Server_InitWebServer_Sets() {
/* route for set basic auth */
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;
String ret_msg = "";
@ -719,8 +715,7 @@ void Server_InitWebServer_Sets() {
ret = true;
} else {
ret = false;
ret_msg = "Maximum username length: ";
ret_msg += String(EEPROM_ADDR_BASIC_AUTH_USERNAME_LENGTH);
ret_msg = "Maximum username length: " + String(EEPROM_ADDR_BASIC_AUTH_USERNAME_LENGTH);
}
}
@ -734,8 +729,7 @@ void Server_InitWebServer_Sets() {
ret = true;
} else {
ret = false;
ret_msg = "Maximum password length: ";
ret_msg += String(EEPROM_ADDR_BASIC_AUTH_PASSWORD_LENGTH);
ret_msg = "Maximum password length: " + String(EEPROM_ADDR_BASIC_AUTH_PASSWORD_LENGTH);
}
}
@ -752,15 +746,14 @@ void Server_InitWebServer_Sets() {
} else {
String msg = MSG_SAVE_NOTOK;
msg += " ";
msg += ret_msg;
msg += " " + ret_msg;
request->send_P(200, F("text/html"), msg.c_str());
}
});
/* route for set firmware size */
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)
return;
request->send_P(200, F("text/html"), MSG_SAVE_OK);
@ -774,7 +767,7 @@ void Server_InitWebServer_Sets() {
/* route for set firmware size */
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)
return;
@ -843,7 +836,7 @@ void Server_InitWebServer_Update() {
FirmwareUpdate.Processing = false;
if (Update.end(true)) {
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 {
Update.printError(Serial);
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 */
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)
return;
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 */
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)
return;
@ -898,7 +891,7 @@ void Server_InitWebServer_Stream() {
*/
void Server_pause() {
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() {
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) {
String message = "URL not Found\n\n";
message += "URI: ";
message += request->url();
message += "\nMethod: ";
message += "URI: " + request->url() + "\nMethod: ";
message += (request->method() == HTTP_GET) ? "GET" : "POST";
message += "\nArguments: ";
message += request->args();
message += "\n";
message += "\nArguments: " + String(request->args()) + "\n";
for (uint8_t i = 0; i < request->args(); i++) {
message += " " + request->argName(i) + ": " + request->arg(i) + "\n";
@ -1017,7 +1006,7 @@ String Server_GetJsonData() {
*/
bool Server_CheckBasicAuth(AsyncWebServerRequest* request) {
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();
return false;
}

View File

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

View File

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

View File

@ -59,7 +59,7 @@ void WiFiMngt::Init() {
/* Set Wi-Fi networks */
SetWifiEvents();
CreateApSsid();
log->AddEvent(LogLevel_Warning, "Set WiFi AP mode");
log->AddEvent(LogLevel_Warning, F("Set WiFi AP mode"));
WiFi.mode(WIFI_AP_STA);
esp_wifi_set_ps(WIFI_PS_NONE);
WiFi.softAPConfig(Service_LocalIp, Service_Gateway, Service_Subnet);
@ -96,9 +96,9 @@ void WiFiMngt::Init() {
/* Init MDNS record */
log->AddEvent(LogLevel_Info, "Starting mDNS record: http://" + mDNS_record + ".local");
if (!MDNS.begin(mDNS_record)) {
log->AddEvent(LogLevel_Error, "Error starting mDNS");
log->AddEvent(LogLevel_Error, F("Error starting mDNS"));
} else {
log->AddEvent(LogLevel_Info, "Starting mDNS OK");
log->AddEvent(LogLevel_Info, F("Starting mDNS OK"));
}
MDNS.addService("http", "tcp", 80);
}
@ -116,7 +116,7 @@ void WiFiMngt::WifiManagement() {
if ((true == config->CheckActifeWifiCfgFlag()) && (true == ServiceMode) && (WL_CONNECTED == WiFi.status())
&& (false == FirmwareUpdate.Processing) && (false == cam->GetStreamStatus())) {
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);
esp_wifi_set_ps(WIFI_PS_NONE);
WiFiStaConnect();
@ -151,11 +151,11 @@ void WiFiMngt::WifiManagement() {
*/
void WiFiMngt::WiFiReconnect() {
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();
log->AddEvent(LogLevel_Warning, "Disconnect from WiFi");
log->AddEvent(LogLevel_Warning, F("Disconnect from WiFi"));
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) {
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
@ -163,7 +163,7 @@ void WiFiMngt::WiFiReconnect() {
}
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.reconnect();
Connect.SetBackendAvailabilitStatus(WaitForFirstConnection);
@ -202,10 +202,10 @@ void WiFiMngt::WiFiStaConnect() {
system_led.setTimer(STATUS_LED_STA_CONNECTING);
if (false == WiFiStaMultipleNetwork) {
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) {
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);
}
@ -219,8 +219,8 @@ void WiFiMngt::WiFiStaConnect() {
void WiFiMngt::SyncNtpTime() {
if (WL_CONNECTED == WiFi.status()) {
/* configure NTP server and timezone to UTC */
configTime(0, 0, "pool.ntp.org", "time.nist.gov"); // UTC
log->AddEvent(LogLevel_Info, "Waiting for NTP time sync: ");
configTime(NTP_GTM_OFFSET_SEC, NTP_DAYLIGHT_OFFSET_SEC, NTP_SERVER_1, NTP_SERVER_2); // UTC
log->AddEvent(LogLevel_Info, F("Waiting for NTP time sync: "));
log->SetNtpTimeSynced(false);
/* wait maximum 10s for time sync */
@ -237,10 +237,10 @@ void WiFiMngt::SyncNtpTime() {
/* report sync status */
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;
} 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
*/
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);
uint8_t ret = 0; ///< total wifi network count
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 */
int n = WiFi.scanNetworks();
log->AddEvent(LogLevel_Verbose, "Scan done");
log->AddEvent(LogLevel_Verbose, F("Scan done"));
JsonDocument doc_json;
JsonArray wifiArray = doc_json.to<JsonArray>();
WifiScanJson = "";
/* make json with each found WI-FI networks */
if (n == 0) {
log->AddEvent(LogLevel_Info, "No networks found!");
log->AddEvent(LogLevel_Info, F("No networks found!"));
} else {
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) {
/* 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 */
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();
if (false == StartStaWdg) {
if (ScanWifiNetwork(WifiSsid) >= 1) {
StartStaWdg = true;
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)) {
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 */
ESP.restart();
}
} 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;
TaskWdg_previousMillis = millis();
}
@ -427,40 +427,40 @@ String WiFiMngt::TranslateTxPower(wifi_power_t data) {
String ret = "";
switch (data) {
case WIFI_POWER_MINUS_1dBm:
ret = "-1dBm";
ret = F("-1dBm");
break;
case WIFI_POWER_2dBm:
ret = "2dBm";
ret = F("2dBm");
break;
case WIFI_POWER_5dBm:
ret = "5dBm";
ret = F("5dBm");
break;
case WIFI_POWER_7dBm:
ret = "7dBm";
ret = F("7dBm");
break;
case WIFI_POWER_8_5dBm:
ret = "8.5dBm";
ret = F("8.5dBm");
break;
case WIFI_POWER_11dBm:
ret = "11dBm";
ret = F("11dBm");
break;
case WIFI_POWER_13dBm:
ret = "13dBm";
ret = F("13dBm");
break;
case WIFI_POWER_15dBm:
ret = "15dBm";
ret = F("15dBm");
break;
case WIFI_POWER_17dBm:
ret = "17dBm";
ret = F("17dBm");
break;
case WIFI_POWER_18_5dBm:
ret = "18.5dBm";
ret = F("18.5dBm");
break;
case WIFI_POWER_19dBm:
ret = "19dBm";
ret = F("19dBm");
break;
case WIFI_POWER_19_5dBm:
ret = "19.5dBm";
ret = F("19.5dBm");
break;
}
@ -477,31 +477,31 @@ String WiFiMngt::TranslateWiFiStatus(wl_status_t i_wifi_status) {
String ret = "";
switch (i_wifi_status) {
case WL_IDLE_STATUS:
ret = "Idle";
ret = F("Idle");
break;
case WL_NO_SSID_AVAIL:
ret = "No SSID available";
ret = F("No SSID available");
break;
case WL_SCAN_COMPLETED:
ret = "Scan completed";
ret = F("Scan completed");
break;
case WL_CONNECTED:
ret = "Connected";
ret = F("Connected");
break;
case WL_CONNECT_FAILED:
ret = "Connect failed";
ret = F("Connect failed");
break;
case WL_CONNECTION_LOST:
ret = "Connection lost";
ret = F("Connection lost");
break;
case WL_DISCONNECTED:
ret = "Disconnected";
ret = F("Disconnected");
break;
case WL_NO_SHIELD:
ret = "No WiFi shield";
ret = F("No WiFi shield");
break;
default:
ret = "Unkcnown status";
ret = F("Unkcnown status");
ret += String(i_wifi_status);
}
return ret;
@ -516,34 +516,34 @@ String WiFiMngt::TranslateWiFiEncrypion(wifi_auth_mode_t i_data) {
String ret = "";
switch (i_data) {
case WIFI_AUTH_OPEN:
ret = "open";
ret = F("open");
break;
case WIFI_AUTH_WEP:
ret = "WEP";
ret = F("WEP");
break;
case WIFI_AUTH_WPA_PSK:
ret = "WPA";
ret = F("WPA");
break;
case WIFI_AUTH_WPA2_PSK:
ret = "WPA2";
ret = F("WPA2");
break;
case WIFI_AUTH_WPA_WPA2_PSK:
ret = "WPA+WPA2";
ret = F("WPA+WPA2");
break;
case WIFI_AUTH_WPA2_ENTERPRISE:
ret = "WPA2-EAP";
ret = F("WPA2-EAP");
break;
case WIFI_AUTH_WPA3_PSK:
ret = "WPA3";
ret = F("WPA3");
break;
case WIFI_AUTH_WPA2_WPA3_PSK:
ret = "WPA2+WPA3";
ret = F("WPA2+WPA3");
break;
case WIFI_AUTH_WAPI_PSK:
ret = "WAPI";
ret = F("WAPI");
break;
default:
ret = "unknown";
ret = F("unknown");
}
return ret;
@ -739,7 +739,7 @@ void WiFiMngt::SetFirstConnection(bool i_data) {
@return none
*/
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
*/
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
*/
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
*/
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
*/
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
*/
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
*/
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
*/
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 */

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.
- 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 [AsyncTCP 1.1.4](https://github.com/dvarrel/AsyncTCP)
- Library [ArduinoJson 7.0.4](https://github.com/bblanchon/ArduinoJson)