@@ -214,10 +214,18 @@ bool OpenStreetMap::resizeTilesCache(uint16_t numberOfTiles)
214214
215215void OpenStreetMap::updateCache (const tileList &requiredTiles, uint8_t zoom)
216216{
217- std::vector<TileJob> jobs;
218-
219217 const unsigned long startMS = millis ();
218+ std::vector<TileJob> jobs;
219+ makeJobList (requiredTiles, jobs, zoom);
220+ if (!jobs.empty ())
221+ {
222+ runJobs (jobs);
223+ log_i (" Cache updated in %lu ms" , millis () - startMS);
224+ }
225+ }
220226
227+ void OpenStreetMap::makeJobList (const tileList &requiredTiles, std::vector<TileJob> &jobs, uint8_t zoom)
228+ {
221229 for (const auto &[x, y] : requiredTiles)
222230 {
223231 if (isTileCached (x, y, zoom) || y < 0 || y >= (1 << zoom))
@@ -229,27 +237,25 @@ void OpenStreetMap::updateCache(const tileList &requiredTiles, uint8_t zoom)
229237
230238 jobs.push_back ({x, static_cast <uint32_t >(y), zoom, tileToReplace});
231239 }
240+ }
232241
233- if (!jobs.empty ())
234- {
235- pendingJobs.store (jobs.size ());
236-
237- log_i (" submitting %i jobs" , (int )jobs.size ());
242+ void OpenStreetMap::runJobs (const std::vector<TileJob> &jobs)
243+ {
244+ log_i (" submitting %i jobs" , (int )jobs.size ());
238245
239- for (const TileJob &job : jobs)
246+ pendingJobs.store (jobs.size ());
247+ for (const TileJob &job : jobs)
248+ if (xQueueSend (jobQueue, &job, portMAX_DELAY) != pdPASS)
240249 {
241- if ( xQueueSend (jobQueue, &job, portMAX_DELAY) != pdPASS)
242- log_e ( " Failed to enqueue TileJob " ) ;
250+ log_e ( " Failed to enqueue TileJob " );
251+ --pendingJobs ;
243252 }
244253
245- while (pendingJobs.load () > 0 )
246- delay (1 );
254+ while (pendingJobs.load () > 0 )
255+ delay (1 );
247256
248- for (const TileJob &job : jobs)
249- job.tile ->busy = false ;
250-
251- log_i (" Cache updated in %lu ms" , millis () - startMS);
252- }
257+ for (const TileJob &job : jobs)
258+ job.tile ->busy = false ;
253259}
254260
255261bool OpenStreetMap::composeMap (LGFX_Sprite &mapSprite, const tileList &requiredTiles, uint8_t zoom)
@@ -483,7 +489,7 @@ bool OpenStreetMap::fetchTile(CachedTile &tile, uint32_t x, uint32_t y, uint8_t
483489
484490 currentInstance = this ;
485491 currentTileBuffer = tile.buffer ;
486-
492+
487493 const int decodeResult = png->decode (0 , PNG_FAST_PALETTE);
488494 if (decodeResult != PNG_SUCCESS)
489495 {
0 commit comments