Added price fetch code, fix webUI bug

This commit is contained in:
Djuri Baars 2023-11-12 13:29:52 +01:00
parent d0eb007c4c
commit 78437c9722
7 changed files with 75 additions and 2 deletions

View file

@ -82,7 +82,7 @@
-
Mempool.space connection:
<span>
{{#if connectionStatus.price}}
{{#if connectionStatus.blocks}}
&#9989;
{{else}}
&#10060;

View file

@ -163,6 +163,7 @@ void setupPreferences()
void setupWebsocketClients(void *pvParameters)
{
setupBlockNotify();
// setupPriceFetchTask();
setupPriceNotify();
vTaskDelete(NULL);

60
src/lib/price_fetch.cpp Normal file
View file

@ -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);
}

9
src/lib/price_fetch.hpp Normal file
View file

@ -0,0 +1,9 @@
#include <Arduino.h>
#include <HTTPClient.h>
#include "config.hpp"
#include "shared.hpp"
extern TaskHandle_t priceFetchTaskHandle;
void setupPriceFetchTask();
void taskPriceFetch(void *pvParameters);

View file

@ -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();

View file

@ -5,6 +5,7 @@
#include <freertos/FreeRTOS.h>
#include <freertos/task.h>
#include "price_fetch.hpp"
#include "shared.hpp"
#include "lib/epd.hpp"

View file

@ -5,7 +5,6 @@
#include "lib/config.hpp"
#define USE_QR
//char ptrTaskList[400];
extern "C" void app_main()