diff --git a/include/hasp_conf.h b/include/hasp_conf.h index b1ee1526..a4095aca 100644 --- a/include/hasp_conf.h +++ b/include/hasp_conf.h @@ -154,7 +154,7 @@ #endif #ifndef HASP_USE_SDCARD -#define HASP_USE_SDCARD 0 +#define HASP_USE_SDCARD 1 #endif #ifndef HASP_USE_GPIO diff --git a/platformio.ini b/platformio.ini index a003dc93..64afed1b 100644 --- a/platformio.ini +++ b/platformio.ini @@ -98,6 +98,7 @@ lib_deps = ;AsyncTCP ;https://github.com/me-no-dev/ESPAsyncWebServer/archive/master.zip ;https://github.com/me-no-dev/ESPAsyncTCP/archive/master.zip + ${override.lib_deps} build_src_filter = +<*> -<.git/> - - - - - diff --git a/src/hasp/hasp_attribute.cpp b/src/hasp/hasp_attribute.cpp index b8b42eca..d939b2d4 100644 --- a/src/hasp/hasp_attribute.cpp +++ b/src/hasp/hasp_attribute.cpp @@ -23,8 +23,8 @@ LV_FONT_DECLARE(unscii_8_icon); extern const char** btnmatrix_default_map; // memory pointer to lvgl default btnmatrix map extern const char* msgbox_default_map[]; // memory pointer to lvgl default btnmatrix map -// extern const uint8_t rootca_crt_bundle_start[] asm("_binary_data_cert_x509_crt_bundle_bin_start"); -// extern const uint8_t rootca_crt_bundle_end[] asm("_binary_data_cert_x509_crt_bundle_bin_end"); +//extern const uint8_t rootca_crt_bundle_start[] asm("_binary_data_cert_x509_crt_bundle_bin_start"); +//extern const uint8_t rootca_crt_bundle_end[] asm("_binary_data_cert_x509_crt_bundle_bin_end"); void my_image_release_resources(lv_obj_t* obj) { @@ -98,7 +98,7 @@ const char** my_map_create(const char* payload) { // Reserve memory for JsonDocument // StaticJsonDocument<1024> map_doc; - size_t maxsize = (128u * ((strlen(payload) / 128) + 1)) + 1024; + size_t maxsize = (128u * ((strlen(payload) / 128) + 1)) + 256; DynamicJsonDocument map_doc(maxsize); DeserializationError jsonError = deserializeJson(map_doc, payload); @@ -398,7 +398,6 @@ static void hasp_attribute_get_part_state_new(lv_obj_t* obj, const char* attr_in case LV_HASP_IMGBTN: case LV_HASP_OBJECT: case LV_HASP_TAB: - case LV_HASP_QRCODE: part = LV_BTN_PART_MAIN; break; @@ -1325,16 +1324,120 @@ static inline bool do_attribute(T& list, lv_obj_t* obj, uint16_t attr_hash, int3 static hasp_attribute_type_t special_attribute_src(lv_obj_t* obj, const char* payload, char** text, bool update) { + LOG_ERROR(TAG_ATTR, "PAYLOAD %s", payload); if(!obj_check_type(obj, LV_HASP_IMAGE)) return HASP_ATTR_TYPE_NOT_FOUND; if(update) { - if(payload != strstr_P(payload, PSTR("http://")) && // not start with http payload != strstr_P(payload, PSTR("https://"))) { // not start with https if(payload == strstr_P(payload, PSTR("L:"))) { // startsWith command/ my_image_release_resources(obj); lv_img_set_src(obj, payload); + } else if (payload == strstr_P(payload, PSTR("Z:"))) { + // if (HASP_SD_FS.exists("/b.png")) + char tempsrcf[64] = ""; + strncpy(tempsrcf , payload + 2, sizeof(tempsrcf)); + LOG_ERROR(TAG_ATTR, "PAYLOAD DENTRO %s", tempsrcf); + + + int readf = 0; + File file; + file = HASP_SD_FS.open(tempsrcf, "r"); + + + int buf_lenf = file.size(); + LOG_ERROR(TAG_ATTR, "size %d", buf_lenf); + + int dsc_lenf = sizeof(lv_img_dsc_t); + lv_img_dsc_t* img_dscf = (lv_img_dsc_t*)lv_mem_alloc(dsc_lenf); + uint8_t* img_buf_startf = (uint8_t*)(buf_lenf > 0 ? hasp_malloc(buf_lenf) : NULL); + uint8_t* img_buf_posf = img_buf_startf; + + + // Initialize the buffers + memset(img_buf_startf, 0, buf_lenf); // empty data buffer + memset(img_dscf, 0, dsc_lenf); // empty img descriptor + url + img_dscf->data = img_buf_startf; // store pointer to the start of the data buffer + if(!img_buf_startf) { + lv_mem_free(img_dscf); // destroy header too + LOG_ERROR(TAG_ATTR, "img buffer creation failed %d", buf_lenf); + return HASP_ATTR_TYPE_STR; + } + // Read image header + readf = 0; + const uint8_t png_magic[] = {0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a}; + if(file.available() >= 8) { + int c = file.readBytes((char *)img_buf_posf, 8); // don't read too far + + if(!memcmp(png_magic, img_buf_posf, sizeof(png_magic))) { + // PNG image, keep all data and advance buffer + LOG_VERBOSE(TAG_ATTR, D_BULLET "PNG HEADER: %d bytes read=%d buf_len=%d", c, readf, buf_lenf); + img_buf_posf += c; + buf_lenf -= c; + readf += c; + } else { + // BIN format, copy the header + lv_img_header_t* header = (lv_img_header_t*)img_buf_posf; + img_dscf->header.always_zero = 0; + img_dscf->header.w = header->w; + img_dscf->header.h = header->h; + img_dscf->header.cf = header->cf; + + LOG_VERBOSE(TAG_ATTR, D_BULLET "BIN image: w=%d h=%d cf=%d len=%d", img_dscf->header.w, + img_dscf->header.h, img_dscf->header.cf, img_dscf->data_size); + img_buf_posf += sizeof(lv_img_header_t); + // shift remainder of 8 data-bytes to the start of the buffer + memcpy(img_buf_startf, img_buf_posf, 8U - sizeof(lv_img_header_t)); + buf_lenf -= c; + readf += c; + } + } else { + // disconnected + hasp_free(img_buf_startf); + lv_mem_free(img_dscf); // destroy header too + LOG_ERROR(TAG_ATTR, "img header read failed %d", buf_lenf); + file.close(); + return HASP_ATTR_TYPE_STR; + } + + // Read image data + while( (buf_lenf > 0)) { + if(size_t size = file.available()) { + int c = file.readBytes((char *)img_buf_posf, size > buf_lenf ? buf_lenf : size); // don't read too far + LOG_DEBUG(TAG_ATTR, "%s %d %x -> %x", __FILE__, __LINE__, img_dscf->data, img_buff); + img_buf_posf += c; + buf_lenf -= c; + LOG_DEBUG(TAG_ATTR, D_BULLET "IMG DATA: %d bytes read=%d buf_len=%d", c, readf, buf_lenf); + readf += c; + } else { + delay(1); // wait for data + } + } + + if(!memcmp(png_magic, img_dscf->data, sizeof(png_magic))) { + // PNG format, get image size from header + img_dscf->header.always_zero = 0; + img_dscf->header.w = img_buf_startf[19] + (img_buf_startf[18] << 8); + img_dscf->header.h = img_buf_startf[23] + (img_buf_startf[22] << 8); + img_dscf->data_size = img_buf_posf - img_buf_startf; // end of buffer - start of buffer + img_dscf->header.cf = LV_IMG_CF_RAW_ALPHA; + LOG_VERBOSE(TAG_ATTR, D_BULLET "PNG image: w=%d h=%d cf=%d len=%d", img_dscf->header.w, + img_dscf->header.h, img_dscf->header.cf, img_dscf->data_size); + } else { + img_dscf->data_size = img_buf_posf - img_buf_startf - sizeof(lv_img_header_t); // end buf - start buf + LOG_VERBOSE(TAG_ATTR, D_BULLET "BIN image: w=%d h=%d cf=%d len=%d", img_dscf->header.w, + img_dscf->header.h, img_dscf->header.cf, img_dscf->data_size); + } + file.close(); + my_image_release_resources(obj); + lv_img_set_src(obj, img_dscf); + //hasp_free(img_buf_startf); + LOG_VERBOSE(TAG_ATTR, F("Funciona %s"), payload); + //lv_mem_free(img_dscf); // NO LOP DESTUYASSSS cuando pongas + //lv_img_set_src(obj, img_dscf); + LOG_DEBUG(TAG_ATTR, "%s %d %x -> %x", __FILE__, __LINE__, img_buf_startf, img_buf_start_posf); + } else if(payload == strstr_P(payload, PSTR("/littlefs/"))) { // startsWith command/ char tempsrc[64] = "L:"; @@ -1756,9 +1859,6 @@ static hasp_attribute_type_t attribute_common_text(lv_obj_t* obj, uint16_t attr_ {LV_HASP_TAB, ATTR_TEXT, my_tab_set_text, my_tab_get_text}, #if LV_USE_WIN != 0 {LV_HASP_WINDOW, ATTR_TEXT, lv_win_set_title, lv_win_get_title}, -#endif -#if HASP_USE_QRCODE > 0 - {LV_HASP_QRCODE, ATTR_TEXT, my_qrcode_set_text, my_qrcode_get_text}, #endif {LV_HASP_MSGBOX, ATTR_TEXT, my_msgbox_set_text, lv_msgbox_get_text} }; @@ -2377,12 +2477,12 @@ static hasp_attribute_type_t attribute_common_int(lv_obj_t* obj, uint16_t attr_h val = obj->user_data.groupid; break; // attribute_found - // case ATTR_TRANSITION: - // if(update) - // obj->user_data.transitionid = (uint8_t)val; - // else - // val = obj->user_data.transitionid; - // break; // attribute_found + // case ATTR_TRANSITION: + // if(update) + // obj->user_data.transitionid = (uint8_t)val; + // else + // val = obj->user_data.transitionid; + // break; // attribute_found case ATTR_OBJID: if(update && val != obj->user_data.objid) return HASP_ATTR_TYPE_INT_READONLY; @@ -2454,18 +2554,6 @@ static hasp_attribute_type_t attribute_common_int(lv_obj_t* obj, uint16_t attr_h val = lv_obj_get_ext_click_pad_top(obj); break; // attribute_found -#if HASP_USE_QRCODE > 0 - case ATTR_SIZE: - if(obj_check_type(obj, LV_HASP_QRCODE)) { - if(update) { - lv_qrcode_set_size(obj, val); - } else { - val = lv_obj_get_width(obj); - } - } - break; -#endif - default: return HASP_ATTR_TYPE_NOT_FOUND; // attribute_not found } @@ -2515,12 +2603,12 @@ static hasp_attribute_type_t attribute_common_bool(lv_obj_t* obj, uint16_t attr_ val = !(lv_obj_get_state(obj, LV_BTN_PART_MAIN) & LV_STATE_DISABLED); break; // attribute_found - // case ATTR_SWIPE: - // if(update) - // obj->user_data.swipeid = (!!val) % 16; - // else - // val = obj->user_data.swipeid; - // break; // attribute_found + // case ATTR_SWIPE: + // if(update) + // obj->user_data.swipeid = (!!val) % 16; + // else + // val = obj->user_data.swipeid; + // break; // attribute_found case ATTR_TOGGLE: switch(obj_get_type(obj)) { @@ -2668,7 +2756,6 @@ void hasp_process_obj_attribute(lv_obj_t* obj, const char* attribute, const char case ATTR_OPACITY: case ATTR_EXT_CLICK_H: case ATTR_EXT_CLICK_V: - case ATTR_SIZE: val = strtol(payload, nullptr, DEC); ret = attribute_common_int(obj, attr_hash, val, update); break; @@ -2947,4 +3034,4 @@ void hasp_process_obj_attribute(lv_obj_t* obj, const char* attribute, const char default: LOG_ERROR(TAG_ATTR, F(D_ERROR_UNKNOWN " (%d)"), ret); } -} +} \ No newline at end of file diff --git a/src/hasp/hasp_dispatch.cpp b/src/hasp/hasp_dispatch.cpp index 03b0da9d..2d1f15b1 100644 --- a/src/hasp/hasp_dispatch.cpp +++ b/src/hasp/hasp_dispatch.cpp @@ -788,7 +788,7 @@ void dispatch_run_script(const char*, const char* payload, uint8_t source) if(filename[0] == 'L' && filename[1] == ':') filename += 2; // strip littlefs drive letter #if ARDUINO -#if HASP_USE_SPIFFS > 0 || HASP_USE_LITTLEFS > 0 +#if HASP_USE_SPIFFS > 0 || HASP_USE_LITTLEFS > 0 || HASP_USE_SDCARD if(!HASP_FS.exists(filename)) { LOG_WARNING(TAG_MSGR, F(D_FILE_NOT_FOUND ": %s"), payload); @@ -796,7 +796,7 @@ void dispatch_run_script(const char*, const char* payload, uint8_t source) } LOG_TRACE(TAG_MSGR, F(D_FILE_LOADING), payload); - + File cmdfile = HASP_FS.open(filename, "r"); if(!cmdfile) { LOG_ERROR(TAG_MSGR, F(D_FILE_LOAD_FAILED), payload); @@ -1678,4 +1678,4 @@ void everySecond() } } } -#endif +#endif \ No newline at end of file diff --git a/src/hasp_filesystem.cpp b/src/hasp_filesystem.cpp index 1f9f4953..a56f66c2 100644 --- a/src/hasp_filesystem.cpp +++ b/src/hasp_filesystem.cpp @@ -180,7 +180,7 @@ void filesystemList() #else if(!HASP_FS.begin(true)) { // default vfs path: /littlefs #endif - LOG_ERROR(TAG_FILE, F("Flash file system not mounted.")); + LOG_ERROR(TAG_FILE, F("Flash file system not mouted.")); } else { LOG_VERBOSE(TAG_FILE, F("Listing files on the internal flash:")); @@ -204,6 +204,38 @@ void filesystemList() } #if defined(ARDUINO_ARCH_ESP32) + +void listDir_SD(fs::FS &fs, const char *dirname, uint8_t levels) { + LOG_VERBOSE(TAG_FILE, "Listing directory: %s\n", dirname); + + File root = fs.open(dirname); + if (!root) { + LOG_WARNING(TAG_FILE, "Failed to open directory"); + return; + } + if (!root.isDirectory()) { + LOG_WARNING(TAG_FILE, "Not a directory"); + return; + } + + File file = root.openNextFile(); + while (file) { + if (file.isDirectory()) { + LOG_VERBOSE(TAG_FILE, " DIR : "); + Serial.println(file.name()); + if (levels) { + listDir_SD(fs, file.path(), levels - 1); + } + } else { + LOG_VERBOSE(TAG_FILE, " FILE: "); + LOG_VERBOSE(TAG_FILE, "%s ", file.name()); + LOG_VERBOSE(TAG_FILE, " SIZE: "); + LOG_VERBOSE(TAG_FILE, "%d\n", file.size()); + } + file = root.openNextFile(); + } +} + String filesystem_list(fs::FS& fs, const char* dirname, uint8_t levels) { LOG_VERBOSE(TAG_FILE, "Listing directory: %s\n", dirname); @@ -282,6 +314,29 @@ void filesystemSetupFiles() filesystem_write_file("/mqtt_off.cmd", HASP_MQTT_OFF_CMD, strlen(HASP_MQTT_OFF_CMD)); #endif } +bool sdcardSetup(void) +{ + bool flag = false; + pinMode(SD_CS, OUTPUT); + digitalWrite(SD_CS, HIGH); + SPI.begin(SPI_SCK, SPI_MISO, SPI_MOSI); + LOG_INFO(TAG_FILE, "sdcardSetup..."); + + if (!HASP_SD_FS.begin(SD_CS, SPI, 1000000)) { + LOG_ERROR(TAG_FILE, F("SD Card Mount Failed")); + return flag; + } + uint8_t cardType = HASP_SD_FS.cardType(); + if (cardType == CARD_NONE) { + LOG_ERROR(TAG_FILE, F("No SD card attached")); + return flag; + } + uint64_t cardSize = HASP_SD_FS.cardSize() / (1024 * 1024); + LOG_INFO(TAG_FILE, "TF Card Size: %lluMB\n", cardSize); + //listDir_SD(HASP_SD_FS, "/", 2); + flag = true; + return flag; +} bool filesystemSetup(void) { @@ -311,4 +366,4 @@ bool filesystemSetup(void) return false; } -#endif +#endif \ No newline at end of file diff --git a/src/hasp_filesystem.h b/src/hasp_filesystem.h index 0299fc7f..f5f8ac34 100644 --- a/src/hasp_filesystem.h +++ b/src/hasp_filesystem.h @@ -8,6 +8,7 @@ #include bool filesystemSetup(void); +bool sdcardSetup(void); void filesystemList(); void filesystemInfo(); @@ -50,6 +51,14 @@ typedef struct #define HASP_FS LITTLEFS #endif // ESP_ARDUINO_VERSION +#if HASP_USE_SDCARD > 0 +#include "SPI.h" +#include "SD.h" +#include "FS.h" +#define HASP_SD_FS SD + +#endif + #endif #elif defined(ARDUINO_ARCH_ESP8266) @@ -66,6 +75,7 @@ typedef struct #if defined(ARDUINO_ARCH_ESP32) void filesystemUnzip(const char*, const char* filename, uint8_t source); String filesystem_list(fs::FS& fs, const char* dirname, uint8_t levels); +void listDir_SD(fs::FS &fs, const char *dirname, uint8_t levels); #endif #endif // HASP_FILESYSTEM_H \ No newline at end of file diff --git a/src/hasp_gui.cpp b/src/hasp_gui.cpp index ebb7870a..89718ab7 100644 --- a/src/hasp_gui.cpp +++ b/src/hasp_gui.cpp @@ -19,7 +19,7 @@ #define BACKLIGHT_CHANNEL 0 // pwm channel 0-15 -#if HASP_USE_SPIFFS > 0 || HASP_USE_LITTLEFS > 0 +#if HASP_USE_SPIFFS > 0 || HASP_USE_LITTLEFS > 0 || HASP_USE_SDCARD File pFileOut; #endif diff --git a/src/lang/es_ES.h b/src/lang/es_ES.h index acee2059..905cbb8a 100644 --- a/src/lang/es_ES.h +++ b/src/lang/es_ES.h @@ -15,9 +15,9 @@ #define D_ERROR_OUT_OF_MEMORY "Memory llena" #define D_ERROR_UNKNOWN "Error desconocido" -#define D_CONFIG_NOT_CHANGED "No hay cambios en la configuración" -#define D_CONFIG_CHANGED "Configuración cambiada" -#define D_CONFIG_LOADED "Configuración cargada" +#define D_CONFIG_NOT_CHANGED "No hay cambios en la configuracion" +#define D_CONFIG_CHANGED "Configuracion cambiada" +#define D_CONFIG_LOADED "Configuracion cargada" #define D_FILE_LOADING "Cargando %s" #define D_FILE_LOADED "%s cargado" @@ -46,85 +46,85 @@ #define D_SETTING_DISABLED "Deshabilitado" // New #define D_SETTING_DEFAULT "Default" // New -#define D_NETWORK_IP_ADDRESS_RECEIVED "Se recibió la dirección IP: %s" +#define D_NETWORK_IP_ADDRESS_RECEIVED "Se recibio la direccion IP: %s" #define D_NETWORK_ONLINE "en linea" #define D_NETWORK_OFFLINE "fuera de línea" -#define D_NETWORK_CONNECTION_FAILED "Falló la conexión" -#define D_NETWORK_CONNECTION_UNAUTHORIZED "Falló la autorización" +#define D_NETWORK_CONNECTION_FAILED "Fallo la conexion" +#define D_NETWORK_CONNECTION_UNAUTHORIZED "Fallo la autorizacion" #define D_MQTT_DEFAULT_NAME "placa_%s" #define D_MQTT_CONNECTING "Conectando..." #define D_MQTT_CONNECTED "Conectado al Broker %s con el clientID %s" -#define D_MQTT_NOT_CONNECTED "No hay conexión ???" +#define D_MQTT_NOT_CONNECTED "No hay conexion ???" #define D_MQTT_DISCONNECTING "Desconectando..." #define D_MQTT_DISCONNECTED "Desconectado" #define D_MQTT_RECONNECTING "Desconectado del broker, reconectando..." #define D_MQTT_NOT_CONFIGURED "No se ha configurado el Broker" #define D_MQTT_STARTED "Arrancando: %d bytes" -#define D_MQTT_FAILED "Falló:" -#define D_MQTT_INVALID_TOPIC "El mensaje tiene un tópico inválido" +#define D_MQTT_FAILED "Fallo:" +#define D_MQTT_INVALID_TOPIC "El mensaje tiene un topico invalido" #define D_MQTT_SUBSCRIBED "Subscrito a %s" #define D_MQTT_NOT_SUBSCRIBED "No se pudo subscribir a %s" #define D_MQTT_HA_AUTO_DISCOVERY "Registrando auto-descubrimiento en HA" #define D_MQTT_PAYLOAD_TOO_LONG "Los datos enviados son demasiado largos(%u bytes)" -#define D_TELNET_CLOSING_CONNECTION "Cerrando sesión de %s" +#define D_TELNET_CLOSING_CONNECTION "Cerrando sesion de %s" #define D_TELNET_CLIENT_LOGIN_FROM "Se ha firmado el cliente %s" #define D_TELNET_CLIENT_CONNECT_FROM "Se ha conectado el cliente %s" #define D_TELNET_CLIENT_NOT_CONNECTED "Cliente NO conectado" -#define D_TELNET_INCORRECT_LOGIN_ATTEMPT "Intento de conexión incorrecta desde %s" +#define D_TELNET_INCORRECT_LOGIN_ATTEMPT "Intento de conexion incorrecta desde %s" #define D_TELNET_STARTED "Console Telnet arrancada" -#define D_TELNET_FAILED "Falló el arranque de la consola Telnet" +#define D_TELNET_FAILED "Fallo el arranque de la consola Telnet" #define D_TELNET_CLIENT_CONNECTED "Cliente conectado" #define D_TELNET_CLIENT_REJECTED "Cliente rechazado" -#define D_HASP_INVALID_PAGE "Página inválida %u" +#define D_HASP_INVALID_PAGE "Pagina invalida %u" #define D_HASP_INVALID_LAYER "No se puede borrar una capa del sistema" -#define D_HASP_CHANGE_PAGE "Cambiando a página %u" -#define D_HASP_CLEAR_PAGE "Limpiando página %u" +#define D_HASP_CHANGE_PAGE "Cambiando a pagina %u" +#define D_HASP_CLEAR_PAGE "Limpiando pagina %u" #define D_OBJECT_DELETED "Objeto borrado" #define D_OBJECT_UNKNOWN "Objeto desconocido" #define D_OBJECT_MISMATCH "Los objetos NO SON IGUALES!" #define D_OBJECT_LOST "Objeto perdido!" #define D_OBJECT_CREATE_FAILED "No se pudo crear objeto %u" -#define D_OBJECT_PAGE_UNKNOWN "La página ID %u no está definida" +#define D_OBJECT_PAGE_UNKNOWN "La pagina ID %u no esta definida" #define D_OBJECT_EVENT_UNKNOWN "NO se conoce el evento %d " #define D_ATTRIBUTE_UNKNOWN "Propiedad %s desconocida" // D_ATTRIBUTE_OBSOLETE D_ATTRIBUTE_INSTEAD can be used together or just D_ATTRIBUTE_OBSOLETE alone -#define D_ATTRIBUTE_OBSOLETE "%s está obsoleto" +#define D_ATTRIBUTE_OBSOLETE "%s esta obsoleto" #define D_ATTRIBUTE_INSTEAD ", usa %s en su lugar" #define D_ATTRIBUTE_READ_ONLY "%s es solo lectura" -#define D_ATTRIBUTE_PAGE_METHOD_INVALID "No se puede llamar %s en una página" +#define D_ATTRIBUTE_PAGE_METHOD_INVALID "No se puede llamar %s en una pagina" #define D_ATTRIBUTE_ALIGN_INVALID "Invalid align property: %s" // new #define D_ATTRIBUTE_COLOR_INVALID "Invalid color property: %s" // new #define D_ATTRIBUTE_LONG_MODE_INVALID "Invalid long mode: %s" // new #define D_OOBE_SSID_VALIDATED "SSID %s validado" -#define D_OOBE_AUTO_CALIBRATE "Auto calibración hablitada" +#define D_OOBE_AUTO_CALIBRATE "Auto calibracion hablitada" #define D_OOBE_CALIBRATED "Ya se ha calibrado" -#define D_DISPATCH_COMMAND_NOT_FOUND "No se encontró el comando '%s'" -#define D_DISPATCH_INVALID_PAGE "Página inválida %s" +#define D_DISPATCH_COMMAND_NOT_FOUND "No se encontro el comando '%s'" +#define D_DISPATCH_INVALID_PAGE "Pagina invalida %s" #define D_DISPATCH_REBOOT "Reiniciando microprocesador!" #define D_JSON_FAILED "No se pudo analizar JSON:" -#define D_JSONL_FAILED "El análisis del JSONL falló en la línea %u" +#define D_JSONL_FAILED "El analisis del JSONL fallo en la línea %u" #define D_JSONL_SUCCEEDED "JSONL analizado" -#define D_OTA_CHECK_UPDATE "Buscando actualización en URL: %s" -#define D_OTA_CHECK_COMPLETE "Verificación de actualizacion completa" -#define D_OTA_CHECK_FAILED "Falló la verificación de actualización: %s" -#define D_OTA_UPDATE_FIRMWARE "Actualización de firmware OTA" -#define D_OTA_UPDATE_COMPLETE "Actualización OTA completada" +#define D_OTA_CHECK_UPDATE "Buscando actualizacion en URL: %s" +#define D_OTA_CHECK_COMPLETE "Verificacion de actualizacion completa" +#define D_OTA_CHECK_FAILED "Fallo la verificacion de actualizacion: %s" +#define D_OTA_UPDATE_FIRMWARE "Actualizacion de firmware OTA" +#define D_OTA_UPDATE_COMPLETE "Actualizacion OTA completada" #define D_OTA_UPDATE_APPLY "Aplicando el nuevo firmware y reinicio" -#define D_OTA_UPDATE_FAILED "La actualización OTA falló" +#define D_OTA_UPDATE_FAILED "La actualizacion OTA fallo" #define D_OTA_UPDATING_FIRMWARE "Actualizando el firmware..." #define D_OTA_UPDATING_FILESYSTEM "Actualizando el sistema de archivos..." #define D_HTTP_HASP_DESIGN "Diseño de HASP" -#define D_HTTP_INFORMATION "Información" +#define D_HTTP_INFORMATION "Informacion" #define D_HTTP_HTTP_SETTINGS "Ajustes HTTP" #define D_HTTP_HTTP_SETTINGS "Ajustes FTP" #define D_HTTP_WIFI_SETTINGS "Ajustes Wifi" @@ -133,33 +133,33 @@ #define D_HTTP_GPIO_SETTINGS "Ajustes GPIO" #define D_HTTP_MDNS_SETTINGS "Ajustes mDNS" #define D_HTTP_TELNET_SETTINGS "Ajustes Telnet" -#define D_HTTP_DEBUG_SETTINGS "Ajustes de depuración" +#define D_HTTP_DEBUG_SETTINGS "Ajustes de depuracion" #define D_HTTP_GUI_SETTINGS "Ajustes de Pantalla" -#define D_HTTP_SAVE_SETTINGS "Guardar configuración" +#define D_HTTP_SAVE_SETTINGS "Guardar configuracion" #define D_HTTP_UPLOAD_FILE "Cargar archivo" -#define D_HTTP_ERASE_DEVICE "Borrar configuración" +#define D_HTTP_ERASE_DEVICE "Borrar configuracion" #define D_HTTP_ADD_GPIO "Agragar un nuevo pin" -#define D_HTTP_BACK "Atrás" +#define D_HTTP_BACK "Atras" #define D_HTTP_REFRESH "Refrescar" -#define D_HTTP_PREV_PAGE "Página Previa" -#define D_HTTP_NEXT_PAGE "Siguiente Página" +#define D_HTTP_PREV_PAGE "Pagina Previa" +#define D_HTTP_NEXT_PAGE "Siguiente Pagina" #define D_HTTP_CALIBRATE "Calibrar" #define D_HTTP_ANTIBURN "Run Anti Burn-in" // New #define D_HTTP_SCREENSHOT "Imagen de Pantalla" #define D_HTTP_FILE_BROWSER "Editor de Archivos" -#define D_HTTP_FIRMWARE_UPGRADE "Actualización de firmware" +#define D_HTTP_FIRMWARE_UPGRADE "Actualizacion de firmware" #define D_HTTP_UPDATE_FIRMWARE "Actualizar firmware" -#define D_HTTP_FACTORY_RESET "Restaurar conf de fábrica" -#define D_HTTP_MAIN_MENU "Menú principal" +#define D_HTTP_FACTORY_RESET "Restaurar conf de fabrica" +#define D_HTTP_MAIN_MENU "Menu principal" #define D_HTTP_REBOOT "Reiniciar" -#define D_HTTP_CONFIGURATION "Configuración" +#define D_HTTP_CONFIGURATION "Configuracion" #define D_HTTP_CONFIG_CHANGED \ - "La configuración ha cambiado, haga clic en Reiniciar para guardar los cambios en la " \ -#define D_HTTP_SENDING_PAGE "Se envió pagina %S a %s" + "La configuracion ha cambiado, haga clic en Reiniciar para guardar los cambios en la flash" +#define D_HTTP_SENDING_PAGE "Se envio pagina %S a %s" #define D_HTTP_FOOTER "por Francis Van Roie" -#define D_INFO_VERSION "Versión" -#define D_INFO_BUILD_DATETIME "Fecha de compilación" +#define D_INFO_VERSION "Version" +#define D_INFO_BUILD_DATETIME "Fecha de compilacion" #define D_INFO_ENVIRONMENT "Environment" // new #define D_INFO_UPTIME "Tiempo activo" #define D_INFO_FREE_HEAP "Heap libre" @@ -168,7 +168,7 @@ #define D_INFO_LVGL_MEMORY "Memoria LVGL" #define D_INFO_TOTAL_MEMORY "Total" #define D_INFO_FREE_MEMORY "Libre" -#define D_INFO_FRAGMENTATION "Fragmentación" +#define D_INFO_FRAGMENTATION "Fragmentacion" #define D_INFO_PSRAM_FREE "PSRam libre" #define D_INFO_PSRAM_SIZE "Tamaño PSRam " #define D_INFO_FLASH_SIZE "Tamaño Flash" @@ -177,11 +177,11 @@ #define D_INFO_FS_SIZE "Filesystem Size" #define D_INFO_FS_USED "Filesystem Used" #define D_INFO_FS_FREE "Filesystem Free" -#define D_INFO_MODULE "Módulo" +#define D_INFO_MODULE "Modulo" #define D_INFO_MODEL "Modelo" #define D_INFO_FREQUENCY "Frecuencia" -#define D_INFO_CORE_VERSION "Versión del núcleo" -#define D_INFO_RESET_REASON "Razón de ultimo Reset" +#define D_INFO_CORE_VERSION "Version del nucleo" +#define D_INFO_RESET_REASON "Razon de ultimo Reset" #define D_INFO_STATUS "Estado" #define D_INFO_SERVER "Servidor" #define D_INFO_USERNAME "Nombre de usuario" @@ -199,8 +199,8 @@ #define D_INFO_BSSID "BSSID" #define D_INFO_SSID "SSID" #define D_INFO_RSSI "Potencia de señal" -#define D_INFO_IP_ADDRESS "Dirección IP" -#define D_INFO_MAC_ADDRESS "Dirección MAC" +#define D_INFO_IP_ADDRESS "Direccion IP" +#define D_INFO_MAC_ADDRESS "Direccion MAC" #define D_INFO_GATEWAY "Gateway" #define D_INFO_DNS_SERVER "Servidor DNS" #define D_INFO_ENDPOINT_IP "IP de punto final" @@ -214,21 +214,21 @@ #define D_WIFI_RSSI_EXCELLENT "Excellente" #define D_WIFI_RSSI_GOOD "Buena" #define D_WIFI_RSSI_FAIR "Pasable" -#define D_WIFI_RSSI_WEAK "Débil" +#define D_WIFI_RSSI_WEAK "Debil" #define D_WIFI_RSSI_BAD "Muy baka" #define D_WG_INITIALIZED "Inicializado" #define D_WG_BAD_CONFIG "Falta o mala configuración" #define D_GPIO_SWITCH "Switch" -#define D_GPIO_BUTTON "Botón" +#define D_GPIO_BUTTON "Boton" #define D_GPIO_TOUCH "Capacitive Touch" // new #define D_GPIO_LED "DEL" -#define D_GPIO_LED_R "Ánimo Red" -#define D_GPIO_LED_G "Ánimo Green" -#define D_GPIO_LED_B "Ánimo Blue" -#define D_GPIO_POWER_RELAY "Power Relé" // new -#define D_GPIO_LIGHT_RELAY "Light Relé" // new +#define D_GPIO_LED_R "animo Red" +#define D_GPIO_LED_G "animo Green" +#define D_GPIO_LED_B "animo Blue" +#define D_GPIO_POWER_RELAY "Power Rele" // new +#define D_GPIO_LIGHT_RELAY "Light Rele" // new #define D_GPIO_PWM "PWM" #define D_GPIO_DAC "DAC" #define D_GPIO_SERIAL_DIMMER "Atenuador serial" @@ -238,5 +238,5 @@ #define D_GPIO_GROUP_NONE "Ninguno" #define D_GPIO_STATE_NORMAL "Normal" // new #define D_GPIO_STATE_INVERTED "Inverted" // new - +#define D_HTTP_SENDING_PAGE "Enviando %S pagina a %s" #endif \ No newline at end of file diff --git a/src/main.cpp b/src/main.cpp index b065909c..9ab73a39 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -37,6 +37,9 @@ uint16_t statLoopCounter = 0; // measures the average looptime void setup() { // hal_setup(); +#if HASP_USE_SDCARD > 0 + sdcardSetup(); +#endif #if HASP_TARGET_ARDUINO esp_log_level_set("*", ESP_LOG_NONE); // set all components to ERROR level diff --git a/user_setups/esp32s3/sunton-esp32-s3-tft.ini b/user_setups/esp32s3/sunton-esp32-s3-tft.ini index 1da68da7..a3e035b7 100644 --- a/user_setups/esp32s3/sunton-esp32-s3-tft.ini +++ b/user_setups/esp32s3/sunton-esp32-s3-tft.ini @@ -84,6 +84,13 @@ build_flags = -D TOUCH_MOSI=11 -D TOUCH_CS=38 -D TOUCH_IRQ=18 + ; SD Card Settings + -D SD_CS=10 + -D SPI_MOSI=11 + -D SPI_MISO=13 + -D SPI_SCK=12 + +#endif [env:sunton-4827s043c_16MB] @@ -116,6 +123,11 @@ build_flags = -D TOUCH_RST=38 -D I2C_TOUCH_ADDRESS=0x14 ; or 0x5D -D I2C_TOUCH_FREQUENCY=400000 + ; SD Card Settings + -D SD_CS=10 + -D SPI_MOSI=11 + -D SPI_MISO=13 + -D SPI_SCK=12 lib_deps = ${sunton-esp32-s3-tft.lib_deps} ${goodix.lib_deps} @@ -154,6 +166,11 @@ build_flags = -D TOUCH_RST=38 -D I2C_TOUCH_ADDRESS=0x14 ; or 0x5D -D I2C_TOUCH_FREQUENCY=400000 + ; SD Card Settings + -D SD_CS=10 + -D SPI_MOSI=11 + -D SPI_MISO=13 + -D SPI_SCK=12 lib_deps = ${sunton-esp32-s3-tft.lib_deps} ${goodix.lib_deps} @@ -192,6 +209,11 @@ build_flags = -D TOUCH_RST=38 -D I2C_TOUCH_ADDRESS=0x14 ; or 0x5D -D I2C_TOUCH_FREQUENCY=400000 + ; SD Card Settings + -D SD_CS=10 + -D SPI_MOSI=11 + -D SPI_MISO=13 + -D SPI_SCK=12 lib_deps = ${sunton-esp32-s3-tft.lib_deps} ${goodix.lib_deps} @@ -249,6 +271,11 @@ build_flags = -D TOUCH_RST=38 -D I2C_TOUCH_ADDRESS=0x5d ; or 0x14 -D I2C_TOUCH_FREQUENCY=400000 + ; SD Card Settings + -D SD_CS=10 + -D SPI_MOSI=11 + -D SPI_MISO=13 + -D SPI_SCK=12 lib_deps = ${sunton-esp32-s3-tft.lib_deps} ${goodix.lib_deps}