Added price fetch code, fix webUI bug
This commit is contained in:
parent
d0eb007c4c
commit
78437c9722
7 changed files with 75 additions and 2 deletions
|
@ -82,7 +82,7 @@
|
|||
-
|
||||
Mempool.space connection:
|
||||
<span>
|
||||
{{#if connectionStatus.price}}
|
||||
{{#if connectionStatus.blocks}}
|
||||
✅
|
||||
{{else}}
|
||||
❌
|
||||
|
|
|
@ -163,6 +163,7 @@ void setupPreferences()
|
|||
void setupWebsocketClients(void *pvParameters)
|
||||
{
|
||||
setupBlockNotify();
|
||||
// setupPriceFetchTask();
|
||||
setupPriceNotify();
|
||||
|
||||
vTaskDelete(NULL);
|
||||
|
|
60
src/lib/price_fetch.cpp
Normal file
60
src/lib/price_fetch.cpp
Normal 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
9
src/lib/price_fetch.hpp
Normal 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);
|
|
@ -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();
|
||||
|
|
|
@ -5,6 +5,7 @@
|
|||
#include <freertos/FreeRTOS.h>
|
||||
#include <freertos/task.h>
|
||||
|
||||
#include "price_fetch.hpp"
|
||||
#include "shared.hpp"
|
||||
#include "lib/epd.hpp"
|
||||
|
||||
|
|
|
@ -5,7 +5,6 @@
|
|||
|
||||
#include "lib/config.hpp"
|
||||
#define USE_QR
|
||||
|
||||
//char ptrTaskList[400];
|
||||
|
||||
extern "C" void app_main()
|
||||
|
|
Loading…
Reference in a new issue