From 9ad82acc80f606bf179cb4a28a129f79db475e1f Mon Sep 17 00:00:00 2001 From: e2002 Date: Tue, 17 Dec 2024 15:31:43 +0300 Subject: [PATCH] v0.9.380 --- README.md | 6 ++++ yoRadio/src/AsyncWebServer/AsyncTCP.cpp | 33 +++++++++++++++++-- .../AsyncWebServer/AsyncWebSynchronization.h | 4 +++ yoRadio/src/core/config.cpp | 3 +- yoRadio/src/core/config.h | 3 +- yoRadio/src/core/netserver.cpp | 12 +++++++ yoRadio/src/core/network.cpp | 16 +++++---- yoRadio/src/core/options.h | 2 +- yoRadio/src/core/telnet.cpp | 11 +++++++ 9 files changed, 77 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index f3e0234..bc2a991 100644 --- a/README.md +++ b/README.md @@ -234,6 +234,12 @@ Work is in progress... --- ## Version history +### v0.9.380 +- fixed compilation error for ESP32 cores >= 3.1.0 +- fixed freezing error with incorrectly configured RTC module +- [www|uart|telnet] new command `mode` - change SD/WEB mode. (0 - WEB, 1 - SD, 2 - Toggle) + example: http:///?mode=2 + #### v0.9.375 - fixed the issue with saving settings for TIMEZONE. diff --git a/yoRadio/src/AsyncWebServer/AsyncTCP.cpp b/yoRadio/src/AsyncWebServer/AsyncTCP.cpp index d27cf97..2b3d840 100644 --- a/yoRadio/src/AsyncWebServer/AsyncTCP.cpp +++ b/yoRadio/src/AsyncWebServer/AsyncTCP.cpp @@ -31,6 +31,20 @@ extern "C"{ } #include "esp_task_wdt.h" +#if ESP_ARDUINO_VERSION >= ESP_ARDUINO_VERSION_VAL(3, 1, 0) +#define TCP_MUTEX_LOCK() \ + if (!sys_thread_tcpip(LWIP_CORE_LOCK_QUERY_HOLDER)) { \ + LOCK_TCPIP_CORE(); \ + } + +#define TCP_MUTEX_UNLOCK() \ + if (sys_thread_tcpip(LWIP_CORE_LOCK_QUERY_HOLDER)) { \ + UNLOCK_TCPIP_CORE(); \ + } +#else + #define TCP_MUTEX_LOCK() + #define TCP_MUTEX_UNLOCK() +#endif /* * TCP/IP Event Task * */ @@ -690,10 +704,11 @@ bool AsyncClient::connect(IPAddress ip, uint16_t port){ ip_addr_t addr; addr.type = IPADDR_TYPE_V4; addr.u_addr.ip4.addr = ip; - + TCP_MUTEX_LOCK(); tcp_pcb* pcb = tcp_new_ip_type(IPADDR_TYPE_V4); if (!pcb){ log_e("pcb == NULL"); + TCP_MUTEX_UNLOCK(); return false; } @@ -702,6 +717,7 @@ bool AsyncClient::connect(IPAddress ip, uint16_t port){ tcp_recv(pcb, &_tcp_recv); tcp_sent(pcb, &_tcp_sent); tcp_poll(pcb, &_tcp_poll, 1); + TCP_MUTEX_UNLOCK(); //_tcp_connect(pcb, &addr, port,(tcp_connected_fn)&_s_connected); _tcp_connect(pcb, _closed_slot, &addr, port,(tcp_connected_fn)&_tcp_connected); return true; @@ -714,8 +730,9 @@ bool AsyncClient::connect(const char* host, uint16_t port){ log_e("failed to start task"); return false; } - + TCP_MUTEX_LOCK(); err_t err = dns_gethostbyname(host, &addr, (dns_found_callback)&_tcp_dns_found, this); + TCP_MUTEX_UNLOCK(); if(err == ERR_OK) { return connect(IPAddress(addr.u_addr.ip4.addr), port); } else if(err == ERR_INPROGRESS) { @@ -803,11 +820,13 @@ int8_t AsyncClient::_close(){ int8_t err = ERR_OK; if(_pcb) { //log_i(""); + TCP_MUTEX_LOCK(); tcp_arg(_pcb, NULL); tcp_sent(_pcb, NULL); tcp_recv(_pcb, NULL); tcp_err(_pcb, NULL); tcp_poll(_pcb, NULL, 0); + TCP_MUTEX_UNLOCK(); _tcp_clear_events(this); err = _tcp_close(_pcb, _closed_slot); if(err != ERR_OK) { @@ -865,6 +884,7 @@ int8_t AsyncClient::_connected(void* pcb, int8_t err){ void AsyncClient::_error(int8_t err) { if(_pcb){ + TCP_MUTEX_LOCK(); tcp_arg(_pcb, NULL); if(_pcb->state == LISTEN) { tcp_sent(_pcb, NULL); @@ -872,6 +892,7 @@ void AsyncClient::_error(int8_t err) { tcp_err(_pcb, NULL); tcp_poll(_pcb, NULL, 0); } + TCP_MUTEX_UNLOCK(); _pcb = NULL; } if(_error_cb) { @@ -1274,12 +1295,14 @@ void AsyncServer::begin(){ return; } int8_t err; + TCP_MUTEX_LOCK(); _pcb = tcp_new_ip_type(IPADDR_TYPE_V4); if (!_pcb){ log_e("_pcb == NULL"); + TCP_MUTEX_UNLOCK(); return; } - + TCP_MUTEX_UNLOCK(); ip_addr_t local_addr; local_addr.type = IPADDR_TYPE_V4; local_addr.u_addr.ip4.addr = (uint32_t) _addr; @@ -1297,17 +1320,21 @@ void AsyncServer::begin(){ log_e("listen_pcb == NULL"); return; } + TCP_MUTEX_LOCK(); tcp_arg(_pcb, (void*) this); tcp_accept(_pcb, &_s_accept); + TCP_MUTEX_UNLOCK(); } void AsyncServer::end(){ if(_pcb){ + TCP_MUTEX_LOCK(); tcp_arg(_pcb, NULL); tcp_accept(_pcb, NULL); if(tcp_close(_pcb) != ERR_OK){ _tcp_abort(_pcb, -1); } + TCP_MUTEX_UNLOCK(); _pcb = NULL; } } diff --git a/yoRadio/src/AsyncWebServer/AsyncWebSynchronization.h b/yoRadio/src/AsyncWebServer/AsyncWebSynchronization.h index 238847c..41cdbee 100644 --- a/yoRadio/src/AsyncWebServer/AsyncWebSynchronization.h +++ b/yoRadio/src/AsyncWebServer/AsyncWebSynchronization.h @@ -7,6 +7,10 @@ #ifdef ESP32 +#if ESP_ARDUINO_VERSION >= ESP_ARDUINO_VERSION_VAL(3, 1, 0) + #define pxCurrentTCB pxCurrentTCBs +#endif + // This is the ESP32 version of the Sync Lock, using the FreeRTOS Semaphore class AsyncWebLock { diff --git a/yoRadio/src/core/config.cpp b/yoRadio/src/core/config.cpp index 03040cb..2ccd550 100644 --- a/yoRadio/src/core/config.cpp +++ b/yoRadio/src/core/config.cpp @@ -59,7 +59,6 @@ void Config::init() { if (store.config_set != 4262) { setDefaults(); - eepromWrite(EEPROM_START, store); } if(store.version>CONFIG_VERSION) store.version=1; while(store.version!=CONFIG_VERSION) _setupVersion(); @@ -285,7 +284,6 @@ template int Config::eepromRead(int ee, T& value) { void Config::reset(){ setDefaults(); - eepromWrite(EEPROM_START, store); delay(500); ESP.restart(); } @@ -341,6 +339,7 @@ void Config::setDefaults() { store.forcemono = false; store.i2sinternal = false; store.rotate90 = false; + eepromWrite(EEPROM_START, store); } void Config::setTimezone(int8_t tzh, int8_t tzm) { diff --git a/yoRadio/src/core/config.h b/yoRadio/src/core/config.h index 886e265..c38696c 100644 --- a/yoRadio/src/core/config.h +++ b/yoRadio/src/core/config.h @@ -250,7 +250,8 @@ class Config { if (strcmp(field, value) == 0 && !force) return; strlcpy(field, value, N); size_t address = getAddr(field); - for (size_t i = 0; i <= strlen(field); i++) EEPROM.write(address + i, field[i]); + size_t fieldlen = strlen(field); + for (size_t i = 0; i <=fieldlen ; i++) EEPROM.write(address + i, field[i]); if(commit) EEPROM.commit(); } diff --git a/yoRadio/src/core/netserver.cpp b/yoRadio/src/core/netserver.cpp index 2b624ae..91c788b 100644 --- a/yoRadio/src/core/netserver.cpp +++ b/yoRadio/src/core/netserver.cpp @@ -840,6 +840,18 @@ void handleHTTPArgs(AsyncWebServerRequest * request) { if (request->hasArg("next")) { player.next(); commandFound=true; } if (request->hasArg("volm")) { player.stepVol(false); commandFound=true; } if (request->hasArg("volp")) { player.stepVol(true); commandFound=true; } + #ifdef USE_SD + if (request->hasArg("mode")) { + AsyncWebParameter* p = request->getParam("mode"); + int mm = atoi(p->value().c_str()); + if(mm>2) mm=0; + if(mm==2) + config.changeMode(); + else + config.changeMode(mm); + commandFound=true; + } + #endif if (request->hasArg("reset")) { request->redirect("/"); request->send(200); config.reset(); return; } if (request->hasArg("trebble") && request->hasArg("middle") && request->hasArg("bass")) { AsyncWebParameter* pt = request->getParam("trebble", request->method() == HTTP_POST); diff --git a/yoRadio/src/core/network.cpp b/yoRadio/src/core/network.cpp index 3e6fcf7..4763066 100644 --- a/yoRadio/src/core/network.cpp +++ b/yoRadio/src/core/network.cpp @@ -50,9 +50,11 @@ void ticks() { } } #if RTCSUPPORTED - rtc.getTime(&network.timeinfo); - mktime(&network.timeinfo); - display.putRequest(CLOCK); + if(config.isRTCFound()){ + rtc.getTime(&network.timeinfo); + mktime(&network.timeinfo); + display.putRequest(CLOCK); + } #else if(network.timeinfo.tm_year>100 || network.status == SDREADY) { network.timeinfo.tm_sec++; @@ -185,9 +187,11 @@ void MyNetwork::begin() { if(REAL_LEDBUILTIN!=255) digitalWrite(REAL_LEDBUILTIN, LOW); #if RTCSUPPORTED - rtc.getTime(&network.timeinfo); - mktime(&network.timeinfo); - display.putRequest(CLOCK); + if(config.isRTCFound()){ + rtc.getTime(&network.timeinfo); + mktime(&network.timeinfo); + display.putRequest(CLOCK); + } #endif ctimer.attach(1, ticks); if (network_on_connect) network_on_connect(); diff --git a/yoRadio/src/core/options.h b/yoRadio/src/core/options.h index d943daf..51df279 100644 --- a/yoRadio/src/core/options.h +++ b/yoRadio/src/core/options.h @@ -1,7 +1,7 @@ #ifndef options_h #define options_h -#define YOVERSION "0.9.375" +#define YOVERSION "0.9.380" /******************************************************* DO NOT EDIT THIS FILE. diff --git a/yoRadio/src/core/telnet.cpp b/yoRadio/src/core/telnet.cpp index fae20b9..8fe5baf 100644 --- a/yoRadio/src/core/telnet.cpp +++ b/yoRadio/src/core/telnet.cpp @@ -296,6 +296,17 @@ void Telnet::on_input(const char* str, uint8_t clientId) { player.sendCommand({PR_PLAY, (uint16_t)sb}); return; } + #ifdef USE_SD + int mm; + if (sscanf(str, "mode %d", &mm) == 1 ) { + if (mm > 2) mm = 0; + if(mm==2) + config.changeMode(); + else + config.changeMode(mm); + return; + } + #endif if (strcmp(str, "sys.tzo") == 0 || strcmp(str, "tzo") == 0) { printf(clientId, "##SYS.TZO#: %d:%d\n> ", config.store.tzHour, config.store.tzMin); return;