1515#define MIN_MALLOC 24112
1616#endif
1717
18- #define CORS_DEBUG
18+ // #define CORS_DEBUG
1919
2020NetServer netserver;
2121
@@ -40,21 +40,20 @@ void NetServer::takeMallocDog(){
4040 int mcb = heap_caps_get_free_size (MALLOC_CAP_8BIT);
4141 int mci = heap_caps_get_free_size (MALLOC_CAP_INTERNAL);
4242 (void )mci;
43- log_i ( " [yoradio] webserver.on / - MALLOC_CAP_INTERNAL =%d, MALLOC_CAP_8BIT =%d" , mci, mcb );
43+ DBGVB ( " MALLOC_CAP_8BIT =%d, MALLOC_CAP_INTERNAL =%d" , mcb, mci );
4444 resumePlay = mcb < MIN_MALLOC;
4545 if (resumePlay) {
4646 player.toggle ();
47- while (player.isRunning ()) {
48- vTaskDelay (10 );
49- }
50- vTaskDelay (50 );
47+ vTaskDelay (150 );
48+ xSemaphoreTake (player.playmutex , portMAX_DELAY);
5149 }
5250}
5351
5452void NetServer::giveMallocDog (){
5553 if (resumePlay) {
5654 resumePlay = false ;
57- vTaskDelay (100 );
55+ vTaskDelay (150 );
56+ xSemaphoreGive (player.playmutex );
5857 player.toggle ();
5958 }
6059}
@@ -63,13 +62,13 @@ bool NetServer::begin() {
6362 importRequest = false ;
6463 irRecordEnable = false ;
6564 webserver.on (" /" , HTTP_GET, [](AsyncWebServerRequest * request) {
66- netserver.takeMallocDog ();
6765 if (network.status == CONNECTED) {
68- request->send (SPIFFS, " /www/index.html" , String (), false , processor);
66+ netserver.htmlPath = PINDEX;
67+ netserver.chunkedHtmlPage (String (), request);
6968 }else {
70- request->send (SPIFFS, " /www/settings.html" , String (), false , processor);
69+ netserver.htmlPath = PSETTINGS;
70+ netserver.chunkedHtmlPage (String (), request);
7171 }
72- netserver.giveMallocDog ();
7372 });
7473
7574 webserver.serveStatic (" /" , SPIFFS, " /www/" ).setCacheControl (" max-age=31536000" );
@@ -81,34 +80,35 @@ bool NetServer::begin() {
8180 netserver.takeMallocDog ();
8281 request->send (SPIFFS, PLAYLIST_PATH, " application/octet-stream" );
8382 netserver.giveMallocDog ();
83+ DBGVB (" PLAYLIST_PATH client ip=%s" , request->client ()->remoteIP ().toString ().c_str ());
84+ /* netserver.htmlPath = PPLAYLIST; // TODO
85+ netserver.chunkedHtmlPage("application/octet-stream", request);
86+ netserver.giveMallocDog();*/
8487 });
8588 webserver.on (INDEX_PATH, HTTP_GET, [](AsyncWebServerRequest * request) {
8689 request->send (SPIFFS, INDEX_PATH, " application/octet-stream" );
8790 });
8891 webserver.on (SSIDS_PATH, HTTP_GET, [](AsyncWebServerRequest * request) {
89- netserver.takeMallocDog ();
90- request->send (SPIFFS, SSIDS_PATH, " application/octet-stream" );
91- netserver.giveMallocDog ();
92+ netserver.htmlPath = PSSIDS;
93+ netserver.chunkedHtmlPage (" application/octet-stream" , request);
9294 });
9395 webserver.on (" /upload" , HTTP_POST, [](AsyncWebServerRequest * request) {
9496 // request->send(200);
9597
9698 }, handleUpload);
9799 webserver.on (" /update" , HTTP_GET, [](AsyncWebServerRequest *request){
98- netserver.takeMallocDog ();
99- request->send (SPIFFS, " /www/update.html" , String (), false , processor);
100- netserver.giveMallocDog ();
100+ netserver.htmlPath = PUPDATE;
101+ netserver.chunkedHtmlPage (String (), request);
101102 });
102103 webserver.on (" /settings" , HTTP_GET, [](AsyncWebServerRequest *request){
103- netserver.takeMallocDog ();
104- request->send (SPIFFS, " /www/settings.html" , String (), false , processor);
105- netserver.giveMallocDog ();
104+ netserver.htmlPath = PSETTINGS;
105+ netserver.chunkedHtmlPage (String (), request);
106106 });
107+
107108#if IR_PIN!=255
108109 webserver.on (" /ir" , HTTP_GET, [](AsyncWebServerRequest *request){
109- netserver.takeMallocDog ();
110- request->send (SPIFFS, " /www/ir.html" , String (), false , processor);
111- netserver.giveMallocDog ();
110+ netserver.htmlPath = PIR;
111+ netserver.chunkedHtmlPage (String (), request);
112112 });
113113#endif
114114 webserver.on (" /update" , HTTP_POST, [](AsyncWebServerRequest *request){
@@ -160,6 +160,66 @@ bool NetServer::begin() {
160160 return true ;
161161}
162162
163+ void NetServer::chunkedHtmlPage (const String& contentType, AsyncWebServerRequest *request){
164+ max = heap_caps_get_free_size (MALLOC_CAP_8BIT) / 32 ;
165+ htmlpos = 0 ;
166+ theend = false ;
167+ DBGVB (" chunkedHtmlPage client ip=%s" , request->client ()->remoteIP ().toString ().c_str ());
168+ AsyncWebServerResponse *response = request->beginChunkedResponse (contentType, [](uint8_t *buffer, size_t maxLen, size_t index) -> size_t {
169+ if (netserver.theend ) return 0 ;
170+ File htmlpage;
171+ switch (netserver.htmlPath ){
172+ case PINDEX: {
173+ htmlpage = SPIFFS.open (" /www/index.html" , " r" );
174+ break ;
175+ }
176+ case PSETTINGS: {
177+ htmlpage = SPIFFS.open (" /www/settings.html" , " r" );
178+ break ;
179+ }
180+ case PUPDATE: {
181+ htmlpage = SPIFFS.open (" /www/update.html" , " r" );
182+ break ;
183+ }
184+ case PIR: {
185+ htmlpage = SPIFFS.open (" /www/ir.html" , " r" );
186+ break ;
187+ }
188+ case PPLAYLIST: {
189+ htmlpage = SPIFFS.open (PLAYLIST_PATH, " r" );
190+ DBGVB (" SPIFFS.open(PLAYLIST_PATH)" );
191+ break ;
192+ }
193+ case PSSIDS: {
194+ htmlpage = SPIFFS.open (SSIDS_PATH, " r" );
195+ break ;
196+ }
197+ default : {
198+ return 0 ;
199+ break ;
200+ }
201+ }
202+ if (!htmlpage) return 0 ;
203+ uint32_t htmlpagesize = htmlpage.size ();
204+ uint32_t len = htmlpagesize - netserver.htmlpos ;
205+ if (len > maxLen) len = maxLen;
206+ if (len > netserver.max ) len = netserver.max ;
207+ if (len + netserver.htmlpos > htmlpagesize) {
208+ netserver.theend = true ;
209+ len = htmlpagesize - netserver.htmlpos ;
210+ }
211+ if (len > 0 ) {
212+ DBGVB (" seek to %d in %s and read %d bytes" , netserver.htmlpos , htmlpage.name (), len);
213+ htmlpage.seek (netserver.htmlpos , SeekSet);
214+ htmlpage.read (buffer, len);
215+ netserver.htmlpos = netserver.htmlpos + len;
216+ }
217+ if (htmlpage) htmlpage.close ();
218+ return len;
219+ }, processor); // AsyncWebServerResponse
220+ request->send (response);
221+ }
222+
163223void NetServer::loop () {
164224 if (shouldReboot){
165225 Serial.println (" Rebooting..." );
@@ -173,7 +233,7 @@ void NetServer::loop() {
173233 }
174234 if (importRequest) {
175235 if (importPlaylist ()) {
176- // requestOnChange(PLAYLIST, 0);
236+ requestOnChange (PLAYLIST, 0 );
177237 }
178238 importRequest = false ;
179239 }
@@ -400,7 +460,7 @@ void NetServer::onWsMessage(void *arg, uint8_t *data, size_t len, uint8_t client
400460 display.putRequest ({NEWMODE, PLAYER});
401461 return ;
402462 }
403-
463+ /* RESETS */
404464 if (strcmp (cmd, " reset" ) == 0 ) {
405465 if (strcmp (val, " system" ) == 0 ) {
406466 config.store .smartstart =2 ;
@@ -465,7 +525,7 @@ void NetServer::onWsMessage(void *arg, uint8_t *data, size_t len, uint8_t client
465525 requestOnChange (GETCONTROLS,clientId);
466526 return ;
467527 }
468- }
528+ } /* RESETS */
469529 if (strcmp (cmd, " volume" ) == 0 ) {
470530 byte v = atoi (val);
471531 player.setVol (v, false );
@@ -541,6 +601,9 @@ void NetServer::onWsMessage(void *arg, uint8_t *data, size_t len, uint8_t client
541601 player.toggle ();
542602 resumePlay=false ;
543603 }
604+ #ifdef MQTT_HOST
605+ mqttPublishPlaylist ();
606+ #endif
544607 return ;
545608 }
546609#if IR_PIN!=255
@@ -589,6 +652,7 @@ bool NetServer::savePlaylist(const char* post) {
589652 } else {
590653 file.print (post );
591654 file.close ();
655+ vTaskDelay (150 );
592656 netserver.requestOnChange (PLAYLISTSAVED, 0 );
593657 return true ;
594658 }
@@ -650,9 +714,9 @@ void NetServer::requestOnChange(requestType_e request, uint8_t clientId) {
650714 config.indexPlaylist ();
651715 config.initPlaylist ();
652716 getPlaylist (clientId);
653- #ifdef MQTT_HOST
717+ /* #ifdef MQTT_HOST
654718 mqttPublishPlaylist();
655- #endif
719+ #endif*/
656720 break ;
657721 }
658722 case GETACTIVE: {
@@ -808,6 +872,7 @@ String processor(const String& var) { // %Templates%
808872
809873void handleUpload (AsyncWebServerRequest *request, String filename, size_t index, uint8_t *data, size_t len, bool final ) {
810874 if (!index) {
875+ netserver.takeMallocDog ();
811876 request->_tempFile = SPIFFS.open (TMP_PATH , " w" );
812877 }
813878 if (len) {
@@ -824,7 +889,7 @@ void handleUpload(AsyncWebServerRequest *request, String filename, size_t index,
824889void onWsEvent (AsyncWebSocket *server, AsyncWebSocketClient *client, AwsEventType type, void *arg, uint8_t *data, size_t len) {
825890 switch (type) {
826891 case WS_EVT_CONNECT:
827- if (config.store .audioinfo ) Serial.printf (" WebSocket client #%u connected from %s\n " , client->id (), client->remoteIP ().toString ().c_str ());
892+ if (config.store .audioinfo ) Serial.printf (" [WEBSOCKET] client #%u connected from %s\n " , client->id (), client->remoteIP ().toString ().c_str ());
828893 /* netserver.requestOnChange(STATION, client->id());
829894 netserver.requestOnChange(TITLE, client->id());
830895 netserver.requestOnChange(VOLUME, client->id());
@@ -836,7 +901,7 @@ void onWsEvent(AsyncWebSocket *server, AsyncWebSocketClient *client, AwsEventTyp
836901
837902 break ;
838903 case WS_EVT_DISCONNECT:
839- if (config.store .audioinfo ) Serial.printf (" WebSocket client #%u disconnected\n " , client->id ());
904+ if (config.store .audioinfo ) Serial.printf (" [WEBSOCKET] client #%u disconnected\n " , client->id ());
840905 break ;
841906 case WS_EVT_DATA:
842907 netserver.onWsMessage (arg, data, len, client->id ());
0 commit comments