diff --git a/data/src/index.html b/data/src/index.html index 19ce6f7..2865177 100644 --- a/data/src/index.html +++ b/data/src/index.html @@ -82,7 +82,7 @@ - Mempool.space connection: - {{#if connectionStatus.price}} + {{#if connectionStatus.blocks}} ✅ {{else}} ❌ diff --git a/src/lib/config.cpp b/src/lib/config.cpp index ed96c1b..d633cac 100644 --- a/src/lib/config.cpp +++ b/src/lib/config.cpp @@ -163,6 +163,7 @@ void setupPreferences() void setupWebsocketClients(void *pvParameters) { setupBlockNotify(); + // setupPriceFetchTask(); setupPriceNotify(); vTaskDelete(NULL); diff --git a/src/lib/price_fetch.cpp b/src/lib/price_fetch.cpp new file mode 100644 index 0000000..08a588c --- /dev/null +++ b/src/lib/price_fetch.cpp @@ -0,0 +1,60 @@ +#include "price_fetch.hpp" + +const PROGMEM char *cgApiUrl = "https://api.coingecko.com/api/v3/simple/price?ids=bitcoin&vs_currencies=usd%2Ceur"; + +TaskHandle_t priceFetchTaskHandle; + +void taskPriceFetch(void *pvParameters) +{ + WiFiClientSecure *client = new WiFiClientSecure; + client->setInsecure(); + for (;;) + { + ulTaskNotifyTake(pdTRUE, portMAX_DELAY); + + HTTPClient *http = new HTTPClient(); + http->setUserAgent(USER_AGENT); + + // Send HTTP request to CoinGecko API + http->begin(*client, cgApiUrl); + + int httpCode = http->GET(); + + // Parse JSON response and extract average price + uint usdPrice, eurPrice; + if (httpCode == 200) + { + String payload = http->getString(); + StaticJsonDocument<96> doc; + deserializeJson(doc, payload); + usdPrice = doc["bitcoin"]["usd"]; + eurPrice = doc["bitcoin"]["eur"]; + + setPrice(usdPrice); + if (workQueue != nullptr && (getCurrentScreen() == SCREEN_BTC_TICKER || getCurrentScreen() == SCREEN_MSCW_TIME || getCurrentScreen() == SCREEN_MARKET_CAP)) + { + WorkItem priceUpdate = {TASK_PRICE_UPDATE, 0}; + xQueueSend(workQueue, &priceUpdate, portMAX_DELAY); + } + + preferences.putUInt("lastPrice", usdPrice); + } + else + { + Serial.print(F("Error retrieving BTC/USD price (CoinGecko). HTTP status code: ")); + Serial.println(httpCode); + if (httpCode == -1) + { + WiFi.reconnect(); + } + } + } +} + +void setupPriceFetchTask() +{ + xTaskCreate(taskPriceFetch, "priceFetch", (6*1024), NULL, tskIDLE_PRIORITY, &priceFetchTaskHandle); + + xTaskNotifyGive(priceFetchTaskHandle); + +} \ No newline at end of file diff --git a/src/lib/price_fetch.hpp b/src/lib/price_fetch.hpp new file mode 100644 index 0000000..08caa86 --- /dev/null +++ b/src/lib/price_fetch.hpp @@ -0,0 +1,9 @@ +#include +#include +#include "config.hpp" +#include "shared.hpp" + +extern TaskHandle_t priceFetchTaskHandle; + +void setupPriceFetchTask(); +void taskPriceFetch(void *pvParameters); \ No newline at end of file diff --git a/src/lib/screen_handler.cpp b/src/lib/screen_handler.cpp index 2005442..bef59cf 100644 --- a/src/lib/screen_handler.cpp +++ b/src/lib/screen_handler.cpp @@ -227,6 +227,9 @@ void IRAM_ATTR minuteTimerISR(void *arg) // vTaskNotifyGiveFromISR(timeUpdateTaskHandle, &xHigherPriorityTaskWoken); WorkItem timeUpdate = {TASK_TIME_UPDATE, 0}; xQueueSendFromISR(workQueue, &timeUpdate, &xHigherPriorityTaskWoken); + if (priceFetchTaskHandle != NULL) { + vTaskNotifyGiveFromISR(priceFetchTaskHandle, &xHigherPriorityTaskWoken); + } if (xHigherPriorityTaskWoken == pdTRUE) { portYIELD_FROM_ISR(); diff --git a/src/lib/screen_handler.hpp b/src/lib/screen_handler.hpp index 45a6d61..20f8f3b 100644 --- a/src/lib/screen_handler.hpp +++ b/src/lib/screen_handler.hpp @@ -5,6 +5,7 @@ #include #include +#include "price_fetch.hpp" #include "shared.hpp" #include "lib/epd.hpp" diff --git a/src/main.cpp b/src/main.cpp index 9d4b5e2..9c009a7 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -5,7 +5,6 @@ #include "lib/config.hpp" #define USE_QR - //char ptrTaskList[400]; extern "C" void app_main()