24
24
#if defined (HTTP_FEATURE)
25
25
#if defined (ARDUINO_ARCH_ESP32)
26
26
#include < WebServer.h>
27
+ #define DOWNLOAD_PACKET_SIZE 2048
27
28
#endif // ARDUINO_ARCH_ESP32
28
29
#if defined (ARDUINO_ARCH_ESP8266)
29
30
#include < ESP8266WebServer.h>
31
+ #define DOWNLOAD_PACKET_SIZE 1024
30
32
#endif // ARDUINO_ARCH_ESP8266
31
33
#include " http_server.h"
32
34
#include " ../authentication/authentication_service.h"
36
38
#include " ../websocket/websocket_server.h"
37
39
#if defined(SD_DEVICE)
38
40
#include " ../filesystem/esp_sd.h"
39
-
40
41
#endif // SD_DEVICE
42
+ #ifdef ESP_BENCHMARK_FEATURE
43
+ #include " ../../core/benchmark.h"
44
+ #endif // ESP_BENCHMARK_FEATURE
45
+
41
46
bool HTTP_Server::_started = false ;
42
47
uint16_t HTTP_Server::_port = 0 ;
43
48
WEBSERVER * HTTP_Server::_webserver = nullptr ;
@@ -91,6 +96,7 @@ void HTTP_Server::init_handlers()
91
96
bool HTTP_Server::StreamFSFile (const char * filename, const char * contentType)
92
97
{
93
98
ESP_File datafile = ESP_FileSystem::open (filename);
99
+ uint64_t last_WS_update = millis ();
94
100
if (!datafile) {
95
101
return false ;
96
102
}
@@ -99,10 +105,10 @@ bool HTTP_Server::StreamFSFile(const char* filename, const char * contentType)
99
105
bool done = false ;
100
106
_webserver->setContentLength (totalFileSize);
101
107
_webserver->send (200 , contentType, " " );
102
- uint8_t buf[1024 ];
108
+ uint8_t buf[DOWNLOAD_PACKET_SIZE ];
103
109
while (!done && _webserver->client ().connected ()) {
104
110
Hal::wait (0 );
105
- int v = datafile.read (buf,1024 );
111
+ int v = datafile.read (buf,DOWNLOAD_PACKET_SIZE );
106
112
if ((v == -1 ) || (v == 0 )) {
107
113
done = true ;
108
114
} else {
@@ -112,6 +118,11 @@ bool HTTP_Server::StreamFSFile(const char* filename, const char * contentType)
112
118
if (i >= totalFileSize) {
113
119
done = true ;
114
120
}
121
+ // update websocket every 2000 ms
122
+ if (millis ()-last_WS_update > 2000 ) {
123
+ websocket_terminal_server.handle ();
124
+ last_WS_update = millis ();
125
+ }
115
126
}
116
127
datafile.close ();
117
128
if ( i != totalFileSize) {
@@ -124,6 +135,11 @@ bool HTTP_Server::StreamFSFile(const char* filename, const char * contentType)
124
135
bool HTTP_Server::StreamSDFile (const char * filename, const char * contentType)
125
136
{
126
137
ESP_SDFile datafile = ESP_SD::open (filename);
138
+ uint64_t last_WS_update = millis ();
139
+ #ifdef ESP_BENCHMARK_FEATURE
140
+ uint64_t bench_start = millis ();
141
+ size_t bench_transfered = 0 ;
142
+ #endif // ESP_BENCHMARK_FEATURE
127
143
if (!datafile) {
128
144
return false ;
129
145
}
@@ -132,24 +148,36 @@ bool HTTP_Server::StreamSDFile(const char* filename, const char * contentType)
132
148
bool done = false ;
133
149
_webserver->setContentLength (totalFileSize);
134
150
_webserver->send (200 , contentType, " " );
135
- uint8_t buf[1024 ];
151
+ uint8_t buf[DOWNLOAD_PACKET_SIZE ];
136
152
while (!done && _webserver->client ().connected ()) {
137
153
Hal::wait (0 );
138
- int v = datafile.read (buf,1024 );
154
+ int v = datafile.read (buf,DOWNLOAD_PACKET_SIZE );
139
155
if ((v == -1 ) || (v == 0 )) {
140
156
done = true ;
141
157
} else {
142
158
_webserver->client ().write (buf,v);
143
159
i+=v;
160
+ #ifdef ESP_BENCHMARK_FEATURE
161
+ bench_transfered += v;
162
+ #endif // ESP_BENCHMARK_FEATURE
144
163
}
145
164
if (i >= totalFileSize) {
146
165
done = true ;
147
166
}
167
+
168
+ // update websocket every 2000 ms
169
+ if (millis ()-last_WS_update > 2000 ) {
170
+ websocket_terminal_server.handle ();
171
+ last_WS_update = millis ();
172
+ }
148
173
}
149
174
datafile.close ();
150
175
if ( i != totalFileSize) {
151
176
return false ;
152
177
}
178
+ #ifdef ESP_BENCHMARK_FEATURE
179
+ benchMark (" SD download" , bench_start, millis (), bench_transfered);
180
+ #endif // ESP_BENCHMARK_FEATURE
153
181
return true ;
154
182
}
155
183
#endif // SD_DEVICE
0 commit comments