@@ -205,7 +205,7 @@ void OpenStreetMap::updateCache(const tileList &requiredTiles, uint8_t zoom, Til
205
205
if (!jobs.empty ())
206
206
{
207
207
runJobs (jobs);
208
- log_i ( " Updated %i tiles in %lu ms - %i ms/tile " , jobs.size (), millis () - startMS, (millis () - startMS) / jobs.size ());
208
+ log_d ( " Finished %i jobs in %lu ms - %i ms/job " , jobs.size (), millis () - startMS, (millis () - startMS) / jobs.size ());
209
209
}
210
210
}
211
211
@@ -345,84 +345,6 @@ bool OpenStreetMap::fetchMap(LGFX_Sprite &mapSprite, double longitude, double la
345
345
return true ;
346
346
}
347
347
348
- bool OpenStreetMap::fillBuffer (WiFiClient *stream, MemoryBuffer &buffer, size_t contentSize, String &result)
349
- {
350
- size_t readSize = 0 ;
351
- unsigned long lastReadTime = millis ();
352
- while (readSize < contentSize)
353
- {
354
- const size_t availableData = stream->available ();
355
- if (!availableData)
356
- {
357
- if (millis () - lastReadTime >= OSM_TILE_TIMEOUT_MS)
358
- {
359
- result = " Timeout: " + String (OSM_TILE_TIMEOUT_MS) + " ms" ;
360
- return false ;
361
- }
362
- taskYIELD ();
363
- continue ;
364
- }
365
-
366
- const size_t remaining = contentSize - readSize;
367
- const size_t toRead = std::min (availableData, remaining);
368
- if (toRead == 0 )
369
- continue ;
370
-
371
- const int bytesRead = stream->readBytes (buffer.get () + readSize, toRead);
372
- if (bytesRead > 0 )
373
- {
374
- readSize += bytesRead;
375
- lastReadTime = millis ();
376
- }
377
- else
378
- taskYIELD ();
379
- }
380
- return true ;
381
- }
382
-
383
- std::unique_ptr<MemoryBuffer> OpenStreetMap::urlToBuffer (const char *url, String &result)
384
- {
385
- HTTPClientRAII http;
386
- if (!http.begin (url))
387
- {
388
- result = " Failed to initialize HTTP client" ;
389
- return nullptr ;
390
- }
391
-
392
- const int httpCode = http.GET ();
393
- if (httpCode != HTTP_CODE_OK)
394
- {
395
- result = " HTTP Error: " + String (httpCode);
396
- return nullptr ;
397
- }
398
-
399
- const size_t contentSize = http.getSize ();
400
- if (contentSize < 1 )
401
- {
402
- result = " Empty or chunked response" ;
403
- return nullptr ;
404
- }
405
-
406
- WiFiClient *stream = http.getStreamPtr ();
407
- if (!stream)
408
- {
409
- result = " Failed to get HTTP stream" ;
410
- return nullptr ;
411
- }
412
-
413
- auto buffer = std::make_unique<MemoryBuffer>(contentSize);
414
- if (!buffer->isAllocated ())
415
- {
416
- result = " Failed to allocate buffer" ;
417
- return nullptr ;
418
- }
419
-
420
- if (!fillBuffer (stream, *buffer, contentSize, result))
421
- return nullptr ;
422
-
423
- return buffer;
424
- }
425
-
426
348
void OpenStreetMap::PNGDraw (PNGDRAW *pDraw)
427
349
{
428
350
uint16_t *destRow = currentInstance->currentTileBuffer + (pDraw->y * currentInstance->currentProvider ->tileSize );
@@ -431,20 +353,19 @@ void OpenStreetMap::PNGDraw(PNGDRAW *pDraw)
431
353
432
354
bool OpenStreetMap::fetchTile (ReusableTileFetcher &fetcher, CachedTile &tile, uint32_t x, uint32_t y, uint8_t zoom, String &result)
433
355
{
434
-
435
356
String url = currentProvider->urlTemplate ;
436
357
url.replace (" {x}" , String (x));
437
358
url.replace (" {y}" , String (y));
438
359
url.replace (" {z}" , String (zoom));
439
360
if (currentProvider->requiresApiKey && strstr (url.c_str (), " {apiKey}" ))
440
361
url.replace (" {apiKey}" , currentProvider->apiKey );
441
362
442
- const std::unique_ptr< MemoryBuffer> buffer = fetcher.fetchToBuffer (url, result);
443
- if (!buffer)
363
+ MemoryBuffer buffer = fetcher.fetchToBuffer (url, result, renderMode );
364
+ if (!buffer. isAllocated () )
444
365
return false ;
445
366
446
367
PNG *png = getPNGCurrentCore ();
447
- const int16_t rc = png->openRAM (buffer-> get (), buffer-> size (), PNGDraw);
368
+ const int16_t rc = png->openRAM (buffer. get (), buffer. size (), PNGDraw);
448
369
if (rc != PNG_SUCCESS)
449
370
{
450
371
result = " PNG Decoder Error: " + String (rc);
@@ -488,21 +409,18 @@ void OpenStreetMap::tileFetcherTask(void *param)
488
409
String result;
489
410
if (!osm->fetchTile (fetcher, *job.tile , job.x , job.y , job.z , result))
490
411
{
412
+ log_e (" Tile fetch failed: %s" , result.c_str ());
413
+ job.tile ->valid = false ;
491
414
const size_t tileByteCount = osm->currentProvider ->tileSize * osm->currentProvider ->tileSize * 2 ;
492
415
memset (job.tile ->buffer , 0 , tileByteCount);
493
- job.tile ->valid = false ;
494
- log_e (" Tile fetch failed: %s" , result.c_str ());
495
416
}
496
417
else
497
418
{
498
419
job.tile ->valid = true ;
499
420
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
421
}
501
-
502
422
job.tile ->busy = false ;
503
423
--osm->pendingJobs ;
504
- if (!uxQueueMessagesWaiting (osm->jobQueue ))
505
- fetcher.close ();
506
424
}
507
425
log_d (" task on core %i exiting" , xPortGetCoreID ());
508
426
xTaskNotifyGive (osm->ownerTask );
@@ -577,3 +495,8 @@ bool OpenStreetMap::setTileProvider(int index)
577
495
log_i (" provider changed to '%s'" , currentProvider->name );
578
496
return true ;
579
497
}
498
+
499
+ void OpenStreetMap::setRenderMode (RenderMode mode)
500
+ {
501
+ renderMode = mode;
502
+ }
0 commit comments