From 1ad14502bd3d20591dd553963aed735472b3eb87 Mon Sep 17 00:00:00 2001 From: Cellie Date: Sun, 25 May 2025 12:10:39 +0200 Subject: [PATCH 1/2] Refactor `updateCache` --- src/OpenStreetMap-esp32.cpp | 45 ++++++++++++++++++++----------------- src/OpenStreetMap-esp32.hpp | 2 ++ 2 files changed, 27 insertions(+), 20 deletions(-) diff --git a/src/OpenStreetMap-esp32.cpp b/src/OpenStreetMap-esp32.cpp index 2baa9bb..9da1a74 100644 --- a/src/OpenStreetMap-esp32.cpp +++ b/src/OpenStreetMap-esp32.cpp @@ -214,10 +214,18 @@ bool OpenStreetMap::resizeTilesCache(uint16_t numberOfTiles) void OpenStreetMap::updateCache(const tileList &requiredTiles, uint8_t zoom) { - std::vector jobs; - const unsigned long startMS = millis(); + std::vector jobs; + makeJobList(requiredTiles, jobs, zoom); + if (!jobs.empty()) + { + runJobs(jobs); + log_i("Cache updated in %lu ms", millis() - startMS); + } +} +void OpenStreetMap::makeJobList(const tileList &requiredTiles, std::vector &jobs, uint8_t zoom) +{ for (const auto &[x, y] : requiredTiles) { if (isTileCached(x, y, zoom) || y < 0 || y >= (1 << zoom)) @@ -229,27 +237,24 @@ void OpenStreetMap::updateCache(const tileList &requiredTiles, uint8_t zoom) jobs.push_back({x, static_cast(y), zoom, tileToReplace}); } +} - if (!jobs.empty()) - { - pendingJobs.store(jobs.size()); - - log_i("submitting %i jobs", (int)jobs.size()); - - for (const TileJob &job : jobs) - { - if (xQueueSend(jobQueue, &job, portMAX_DELAY) != pdPASS) - log_e("Failed to enqueue TileJob"); - } +void OpenStreetMap::runJobs(std::vector &jobs) +{ + log_i("submitting %i jobs", (int)jobs.size()); - while (pendingJobs.load() > 0) - delay(1); + pendingJobs.store(jobs.size()); + for (const TileJob &job : jobs) + { + if (xQueueSend(jobQueue, &job, portMAX_DELAY) != pdPASS) + log_e("Failed to enqueue TileJob"); + } - for (const TileJob &job : jobs) - job.tile->busy = false; + while (pendingJobs.load() > 0) + delay(1); - log_i("Cache updated in %lu ms", millis() - startMS); - } + for (const TileJob &job : jobs) + job.tile->busy = false; } bool OpenStreetMap::composeMap(LGFX_Sprite &mapSprite, const tileList &requiredTiles, uint8_t zoom) @@ -483,7 +488,7 @@ bool OpenStreetMap::fetchTile(CachedTile &tile, uint32_t x, uint32_t y, uint8_t currentInstance = this; currentTileBuffer = tile.buffer; - + const int decodeResult = png->decode(0, PNG_FAST_PALETTE); if (decodeResult != PNG_SUCCESS) { diff --git a/src/OpenStreetMap-esp32.hpp b/src/OpenStreetMap-esp32.hpp index 00cc340..e0fadea 100644 --- a/src/OpenStreetMap-esp32.hpp +++ b/src/OpenStreetMap-esp32.hpp @@ -92,6 +92,8 @@ class OpenStreetMap double lat2tile(double lat, uint8_t zoom); void computeRequiredTiles(double longitude, double latitude, uint8_t zoom, tileList &requiredTiles); void updateCache(const tileList &requiredTiles, uint8_t zoom); + void makeJobList(const tileList &requiredTiles, std::vector &jobs, uint8_t zoom); + void runJobs(std::vector &jobs); CachedTile *findUnusedTile(const tileList &requiredTiles, uint8_t zoom); bool isTileCached(uint32_t x, uint32_t y, uint8_t z); bool fetchTile(CachedTile &tile, uint32_t x, uint32_t y, uint8_t zoom, String &result); From c58d3b7b91245f43891c242511eac10e29654096 Mon Sep 17 00:00:00 2001 From: Cellie Date: Sun, 25 May 2025 12:21:23 +0200 Subject: [PATCH 2/2] Decrease `pendingJobs` when adding a job to the queue fails --- src/OpenStreetMap-esp32.cpp | 7 ++++--- src/OpenStreetMap-esp32.hpp | 2 +- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/OpenStreetMap-esp32.cpp b/src/OpenStreetMap-esp32.cpp index 9da1a74..e7a75f0 100644 --- a/src/OpenStreetMap-esp32.cpp +++ b/src/OpenStreetMap-esp32.cpp @@ -239,16 +239,17 @@ void OpenStreetMap::makeJobList(const tileList &requiredTiles, std::vector &jobs) +void OpenStreetMap::runJobs(const std::vector &jobs) { log_i("submitting %i jobs", (int)jobs.size()); pendingJobs.store(jobs.size()); for (const TileJob &job : jobs) - { if (xQueueSend(jobQueue, &job, portMAX_DELAY) != pdPASS) + { log_e("Failed to enqueue TileJob"); - } + --pendingJobs; + } while (pendingJobs.load() > 0) delay(1); diff --git a/src/OpenStreetMap-esp32.hpp b/src/OpenStreetMap-esp32.hpp index e0fadea..e569ab8 100644 --- a/src/OpenStreetMap-esp32.hpp +++ b/src/OpenStreetMap-esp32.hpp @@ -93,7 +93,7 @@ class OpenStreetMap void computeRequiredTiles(double longitude, double latitude, uint8_t zoom, tileList &requiredTiles); void updateCache(const tileList &requiredTiles, uint8_t zoom); void makeJobList(const tileList &requiredTiles, std::vector &jobs, uint8_t zoom); - void runJobs(std::vector &jobs); + void runJobs(const std::vector &jobs); CachedTile *findUnusedTile(const tileList &requiredTiles, uint8_t zoom); bool isTileCached(uint32_t x, uint32_t y, uint8_t z); bool fetchTile(CachedTile &tile, uint32_t x, uint32_t y, uint8_t zoom, String &result);