Skip to content

Commit 2a76f9e

Browse files
Fix WiFiClient (#117)
* Add a keep-alive fetcher
1 parent 6d07ecf commit 2a76f9e

File tree

4 files changed

+29
-7
lines changed

4 files changed

+29
-7
lines changed

src/OpenStreetMap-esp32.cpp

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -429,16 +429,17 @@ void OpenStreetMap::PNGDraw(PNGDRAW *pDraw)
429429
getPNGCurrentCore()->getLineAsRGB565(pDraw, destRow, PNG_RGB565_BIG_ENDIAN, 0xffffffff);
430430
}
431431

432-
bool OpenStreetMap::fetchTile(CachedTile &tile, uint32_t x, uint32_t y, uint8_t zoom, String &result)
432+
bool OpenStreetMap::fetchTile(ReusableTileFetcher &fetcher, CachedTile &tile, uint32_t x, uint32_t y, uint8_t zoom, String &result)
433433
{
434+
434435
String url = currentProvider->urlTemplate;
435436
url.replace("{x}", String(x));
436437
url.replace("{y}", String(y));
437438
url.replace("{z}", String(zoom));
438439
if (currentProvider->requiresApiKey && strstr(url.c_str(), "{apiKey}"))
439440
url.replace("{apiKey}", currentProvider->apiKey);
440441

441-
const std::unique_ptr<MemoryBuffer> buffer = urlToBuffer(url.c_str(), result);
442+
const std::unique_ptr<MemoryBuffer> buffer = fetcher.fetchToBuffer(url, result);
442443
if (!buffer)
443444
return false;
444445

@@ -462,19 +463,18 @@ bool OpenStreetMap::fetchTile(CachedTile &tile, uint32_t x, uint32_t y, uint8_t
462463
if (decodeResult != PNG_SUCCESS)
463464
{
464465
result = "Decoding " + url + " failed with code: " + String(decodeResult);
465-
tile.valid = false;
466466
return false;
467467
}
468468

469469
tile.x = x;
470470
tile.y = y;
471471
tile.z = zoom;
472-
tile.valid = true;
473472
return true;
474473
}
475474

476475
void OpenStreetMap::tileFetcherTask(void *param)
477476
{
477+
ReusableTileFetcher fetcher;
478478
OpenStreetMap *osm = static_cast<OpenStreetMap *>(param);
479479
while (true)
480480
{
@@ -486,17 +486,23 @@ void OpenStreetMap::tileFetcherTask(void *param)
486486
break;
487487

488488
String result;
489-
if (!osm->fetchTile(*job.tile, job.x, job.y, job.z, result))
489+
if (!osm->fetchTile(fetcher, *job.tile, job.x, job.y, job.z, result))
490490
{
491491
const size_t tileByteCount = osm->currentProvider->tileSize * osm->currentProvider->tileSize * 2;
492492
memset(job.tile->buffer, 0, tileByteCount);
493+
job.tile->valid = false;
493494
log_e("Tile fetch failed: %s", result.c_str());
494495
}
495496
else
497+
{
498+
job.tile->valid = true;
496499
log_d("core %i fetched tile z=%u x=%lu, y=%lu in %lu ms", xPortGetCoreID(), job.z, job.x, job.y, millis() - startMS);
500+
}
497501

498502
job.tile->busy = false;
499503
--osm->pendingJobs;
504+
if (!uxQueueMessagesWaiting(osm->jobQueue))
505+
fetcher.close();
500506
}
501507
log_d("task on core %i exiting", xPortGetCoreID());
502508
xTaskNotifyGive(osm->ownerTask);

src/OpenStreetMap-esp32.hpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
#include "TileJob.hpp"
3838
#include "MemoryBuffer.hpp"
3939
#include "HTTPClientRAII.hpp"
40+
#include "ReusableTileFetcher.hpp"
4041
#include "fonts/DejaVu9-modded.h"
4142

4243
constexpr uint16_t OSM_BGCOLOR = lgfx::color565(32, 32, 128);
@@ -109,7 +110,7 @@ class OpenStreetMap
109110
CachedTile *findUnusedTile(const tileList &requiredTiles, uint8_t zoom);
110111
CachedTile *isTileCached(uint32_t x, uint32_t y, uint8_t z);
111112
std::unique_ptr<MemoryBuffer> urlToBuffer(const char *url, String &result);
112-
bool fetchTile(CachedTile &tile, uint32_t x, uint32_t y, uint8_t zoom, String &result);
113+
bool fetchTile(ReusableTileFetcher &fetcher, CachedTile &tile, uint32_t x, uint32_t y, uint8_t zoom, String &result);
113114
bool fillBuffer(WiFiClient *stream, MemoryBuffer &buffer, size_t contentSize, String &result);
114115
bool composeMap(LGFX_Sprite &mapSprite, TileBufferList &tilePointers);
115116
static void tileFetcherTask(void *param);

src/ReusableTileFetcher.cpp

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -113,13 +113,18 @@ bool ReusableTileFetcher::readHttpHeaders(size_t &contentLength, String &result)
113113
break; // End of headers
114114

115115
if (line.startsWith("Content-Length:"))
116-
contentLength = line.substring(15).toInt();
116+
{
117+
String val = line.substring(15);
118+
val.trim();
119+
contentLength = val.toInt();
120+
}
117121

118122
else if (line.startsWith("HTTP/1.1"))
119123
{
120124
if (!line.startsWith("HTTP/1.1 200"))
121125
{
122126
result = "HTTP error: " + line;
127+
client.stop();
123128
return false;
124129
}
125130
}
@@ -128,6 +133,7 @@ bool ReusableTileFetcher::readHttpHeaders(size_t &contentLength, String &result)
128133
if (contentLength == 0)
129134
{
130135
result = "Missing or invalid Content-Length";
136+
client.stop();
131137
return false;
132138
}
133139

@@ -152,6 +158,7 @@ bool ReusableTileFetcher::readBody(MemoryBuffer &buffer, size_t contentLength, S
152158
else if (len < 0)
153159
{
154160
result = "Read error";
161+
client.stop();
155162
return false;
156163
}
157164
else
@@ -161,8 +168,15 @@ bool ReusableTileFetcher::readBody(MemoryBuffer &buffer, size_t contentLength, S
161168
if (remaining > 0)
162169
{
163170
result = "Incomplete read";
171+
client.stop();
164172
return false;
165173
}
166174

167175
return true;
168176
}
177+
178+
void ReusableTileFetcher::close()
179+
{
180+
if (client)
181+
client.stop();
182+
}

src/ReusableTileFetcher.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ class ReusableTileFetcher
3737
ReusableTileFetcher &operator=(const ReusableTileFetcher &) = delete;
3838

3939
std::unique_ptr<MemoryBuffer> fetchToBuffer(const String &url, String &result);
40+
void close();
4041

4142
private:
4243
WiFiClient client;

0 commit comments

Comments
 (0)