2023-11-07 01:11:12 +01:00
|
|
|
#include "price_notify.hpp"
|
|
|
|
|
2024-05-13 11:59:02 +02:00
|
|
|
const char *wsOwnServerPrice = "wss://ws.btclock.dev/ws?assets=bitcoin";
|
2024-08-31 23:11:48 +02:00
|
|
|
const char *wsOwnServerV2 = "wss://ws-staging.btclock.dev/api/v2/ws";
|
|
|
|
|
2023-11-07 01:11:12 +01:00
|
|
|
const char *wsServerPrice = "wss://ws.coincap.io/prices?assets=bitcoin";
|
2023-11-12 12:38:28 +01:00
|
|
|
|
|
|
|
// const char* coinCapWsCert = R"(-----BEGIN CERTIFICATE-----
|
|
|
|
// MIIFMjCCBNmgAwIBAgIQBtgXvFyc28MsvQ1HjCnXJTAKBggqhkjOPQQDAjBKMQsw
|
|
|
|
// CQYDVQQGEwJVUzEZMBcGA1UEChMQQ2xvdWRmbGFyZSwgSW5jLjEgMB4GA1UEAxMX
|
|
|
|
// Q2xvdWRmbGFyZSBJbmMgRUNDIENBLTMwHhcNMjMwNTEwMDAwMDAwWhcNMjQwNTA5
|
|
|
|
// MjM1OTU5WjB1MQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQG
|
|
|
|
// A1UEBxMNU2FuIEZyYW5jaXNjbzEZMBcGA1UEChMQQ2xvdWRmbGFyZSwgSW5jLjEe
|
|
|
|
// MBwGA1UEAxMVc25pLmNsb3VkZmxhcmVzc2wuY29tMFkwEwYHKoZIzj0CAQYIKoZI
|
|
|
|
// zj0DAQcDQgAEpvFIXzQKHuqTo+IE6c6sB4p0PMXK1KsseEGf2UN/CNRhG5hO7lr8
|
|
|
|
// JtXrPZkawWBysZxOsEoetkPrDHMugCLfXKOCA3QwggNwMB8GA1UdIwQYMBaAFKXO
|
|
|
|
// N+rrsHUOlGeItEX62SQQh5YfMB0GA1UdDgQWBBShsZDJohaR1a5E0Qj7yblZjKDC
|
|
|
|
// gDA6BgNVHREEMzAxggwqLmNvaW5jYXAuaW+CCmNvaW5jYXAuaW+CFXNuaS5jbG91
|
|
|
|
// ZGZsYXJlc3NsLmNvbTAOBgNVHQ8BAf8EBAMCB4AwHQYDVR0lBBYwFAYIKwYBBQUH
|
|
|
|
// AwEGCCsGAQUFBwMCMHsGA1UdHwR0MHIwN6A1oDOGMWh0dHA6Ly9jcmwzLmRpZ2lj
|
|
|
|
// ZXJ0LmNvbS9DbG91ZGZsYXJlSW5jRUNDQ0EtMy5jcmwwN6A1oDOGMWh0dHA6Ly9j
|
|
|
|
// cmw0LmRpZ2ljZXJ0LmNvbS9DbG91ZGZsYXJlSW5jRUNDQ0EtMy5jcmwwPgYDVR0g
|
|
|
|
// BDcwNTAzBgZngQwBAgIwKTAnBggrBgEFBQcCARYbaHR0cDovL3d3dy5kaWdpY2Vy
|
|
|
|
// dC5jb20vQ1BTMHYGCCsGAQUFBwEBBGowaDAkBggrBgEFBQcwAYYYaHR0cDovL29j
|
|
|
|
// c3AuZGlnaWNlcnQuY29tMEAGCCsGAQUFBzAChjRodHRwOi8vY2FjZXJ0cy5kaWdp
|
|
|
|
// Y2VydC5jb20vQ2xvdWRmbGFyZUluY0VDQ0NBLTMuY3J0MAwGA1UdEwEB/wQCMAAw
|
|
|
|
// ggF+BgorBgEEAdZ5AgQCBIIBbgSCAWoBaAB1AO7N0GTV2xrOxVy3nbTNE6Iyh0Z8
|
|
|
|
// vOzew1FIWUZxH7WbAAABiAPnoRAAAAQDAEYwRAIgAP2W09OozuhmKeKKMsaVBcae
|
|
|
|
// o+nPHF1WUWk0i387YYYCIDIM1Wll7/4O3GNx2/Fx9bC6pi69Uya4pLxsCfW3fZMe
|
|
|
|
// AHYASLDja9qmRzQP5WoC+p0w6xxSActW3SyB2bu/qznYhHMAAAGIA+eg+QAABAMA
|
|
|
|
// RzBFAiEAuNpSqrbx47gYBgBMz5M6q0CnV/WMJqWQOxYFKrwfwVACIH3nCs4bKToT
|
|
|
|
// e+MiBrqSDaekixk4kPFEQESO9qHCkWY5AHcA2ra/az+1tiKfm8K7XGvocJFxbLtR
|
|
|
|
// hIU0vaQ9MEjX+6sAAAGIA+eg1gAABAMASDBGAiEAolCFl2IfbOHUPAOxoi4BLclS
|
|
|
|
// v9FVXb7LwIvTuCfyrEQCIQDcvehwhV9XGopKGl17F2LYYKI7hvlO3RmpPZQJt1da
|
|
|
|
// MDAKBggqhkjOPQQDAgNHADBEAiAXRWZ/JVMsfpSFFTHQHUSqRnQ/7cCOWx+9svIy
|
|
|
|
// mYnFZQIgHMEG0Cm7O4cn5KUzKOsTwwK+2U15s/jPUQi2n2IDTEM=
|
|
|
|
// -----END CERTIFICATE-----)";
|
|
|
|
|
2023-11-07 01:11:12 +01:00
|
|
|
// WebsocketsClient client;
|
2023-11-08 12:18:59 +01:00
|
|
|
esp_websocket_client_handle_t clientPrice = NULL;
|
2024-05-08 23:54:17 +02:00
|
|
|
esp_websocket_client_config_t config;
|
|
|
|
uint currentPrice = 50000;
|
2023-11-10 19:52:06 +01:00
|
|
|
unsigned long int lastPriceUpdate;
|
2024-01-27 15:54:31 +01:00
|
|
|
bool priceNotifyInit = false;
|
2023-11-07 01:11:12 +01:00
|
|
|
|
2024-05-08 23:54:17 +02:00
|
|
|
void setupPriceNotify()
|
|
|
|
{
|
2024-07-11 14:08:37 +02:00
|
|
|
if (preferences.getBool("ownDataSource", DEFAULT_OWN_DATA_SOURCE))
|
2024-05-08 23:54:17 +02:00
|
|
|
{
|
|
|
|
config = {.uri = wsOwnServerPrice,
|
|
|
|
.user_agent = USER_AGENT};
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
config = {.uri = wsServerPrice,
|
|
|
|
.user_agent = USER_AGENT};
|
|
|
|
}
|
2023-11-30 22:38:01 +01:00
|
|
|
|
|
|
|
clientPrice = esp_websocket_client_init(&config);
|
|
|
|
esp_websocket_register_events(clientPrice, WEBSOCKET_EVENT_ANY,
|
|
|
|
onWebsocketPriceEvent, clientPrice);
|
|
|
|
esp_websocket_client_start(clientPrice);
|
2023-11-07 01:11:12 +01:00
|
|
|
}
|
|
|
|
|
2023-11-30 22:38:01 +01:00
|
|
|
void onWebsocketPriceEvent(void *handler_args, esp_event_base_t base,
|
2024-05-08 23:54:17 +02:00
|
|
|
int32_t event_id, void *event_data)
|
|
|
|
{
|
2023-11-30 22:38:01 +01:00
|
|
|
esp_websocket_event_data_t *data = (esp_websocket_event_data_t *)event_data;
|
|
|
|
|
2024-05-08 23:54:17 +02:00
|
|
|
switch (event_id)
|
|
|
|
{
|
|
|
|
case WEBSOCKET_EVENT_CONNECTED:
|
|
|
|
Serial.println("Connected to " + String(config.uri) + " WebSocket");
|
|
|
|
priceNotifyInit = true;
|
|
|
|
|
|
|
|
break;
|
|
|
|
case WEBSOCKET_EVENT_DATA:
|
|
|
|
onWebsocketPriceMessage(data);
|
2024-07-11 14:08:37 +02:00
|
|
|
if (preferences.getBool("ownDataSource", DEFAULT_OWN_DATA_SOURCE))
|
2024-05-09 01:02:40 +02:00
|
|
|
{
|
|
|
|
onWebsocketBlockMessage(data);
|
|
|
|
}
|
2024-05-08 23:54:17 +02:00
|
|
|
break;
|
|
|
|
case WEBSOCKET_EVENT_ERROR:
|
|
|
|
Serial.println(F("Price WS Connnection error"));
|
|
|
|
break;
|
|
|
|
case WEBSOCKET_EVENT_DISCONNECTED:
|
|
|
|
Serial.println(F("Price WS Connnection Closed"));
|
|
|
|
break;
|
2023-11-30 22:38:01 +01:00
|
|
|
}
|
2023-11-07 01:11:12 +01:00
|
|
|
}
|
|
|
|
|
2024-05-08 23:54:17 +02:00
|
|
|
void onWebsocketPriceMessage(esp_websocket_event_data_t *event_data)
|
|
|
|
{
|
2024-03-10 20:24:55 +01:00
|
|
|
JsonDocument doc;
|
2023-11-30 22:38:01 +01:00
|
|
|
|
|
|
|
deserializeJson(doc, (char *)event_data->data_ptr);
|
|
|
|
|
2024-05-08 23:54:17 +02:00
|
|
|
if (doc.containsKey("bitcoin"))
|
|
|
|
{
|
|
|
|
if (currentPrice != doc["bitcoin"].as<long>())
|
|
|
|
{
|
2024-07-11 22:08:42 +02:00
|
|
|
processNewPrice(doc["bitcoin"].as<long>());
|
2023-11-07 01:11:12 +01:00
|
|
|
}
|
2023-11-30 22:38:01 +01:00
|
|
|
}
|
2023-11-07 01:11:12 +01:00
|
|
|
}
|
|
|
|
|
2024-07-11 22:08:42 +02:00
|
|
|
void processNewPrice(uint newPrice)
|
|
|
|
{
|
|
|
|
uint minSecPriceUpd = preferences.getUInt(
|
|
|
|
"minSecPriceUpd", DEFAULT_SECONDS_BETWEEN_PRICE_UPDATE);
|
|
|
|
uint currentTime = esp_timer_get_time() / 1000000;
|
|
|
|
|
|
|
|
if (lastPriceUpdate == 0 ||
|
|
|
|
(currentTime - lastPriceUpdate) > minSecPriceUpd)
|
|
|
|
{
|
|
|
|
// const unsigned long oldPrice = currentPrice;
|
|
|
|
currentPrice = newPrice;
|
|
|
|
if (lastPriceUpdate == 0 ||
|
|
|
|
(currentTime - lastPriceUpdate) > 120)
|
|
|
|
{
|
|
|
|
preferences.putUInt("lastPrice", currentPrice);
|
|
|
|
}
|
|
|
|
lastPriceUpdate = currentTime;
|
|
|
|
// if (abs((int)(oldPrice-currentPrice)) > round(0.0015*oldPrice)) {
|
|
|
|
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);
|
|
|
|
}
|
|
|
|
//}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2024-05-08 23:54:17 +02:00
|
|
|
uint getLastPriceUpdate()
|
|
|
|
{
|
2024-03-17 23:16:15 +01:00
|
|
|
return lastPriceUpdate;
|
|
|
|
}
|
|
|
|
|
2023-11-30 22:38:01 +01:00
|
|
|
uint getPrice() { return currentPrice; }
|
2023-11-08 12:18:59 +01:00
|
|
|
|
2023-11-30 22:38:01 +01:00
|
|
|
void setPrice(uint newPrice) { currentPrice = newPrice; }
|
2023-11-12 12:38:28 +01:00
|
|
|
|
2024-05-08 23:54:17 +02:00
|
|
|
bool isPriceNotifyConnected()
|
|
|
|
{
|
|
|
|
if (clientPrice == NULL)
|
|
|
|
return false;
|
2023-11-30 22:38:01 +01:00
|
|
|
return esp_websocket_client_is_connected(clientPrice);
|
2023-11-10 23:18:14 +01:00
|
|
|
}
|
|
|
|
|
2024-05-08 23:54:17 +02:00
|
|
|
bool getPriceNotifyInit()
|
|
|
|
{
|
2024-01-31 23:45:26 +01:00
|
|
|
return priceNotifyInit;
|
|
|
|
}
|
|
|
|
|
2024-05-08 23:54:17 +02:00
|
|
|
void stopPriceNotify()
|
|
|
|
{
|
|
|
|
if (clientPrice == NULL)
|
|
|
|
return;
|
2024-04-16 15:17:34 +02:00
|
|
|
esp_websocket_client_close(clientPrice, pdMS_TO_TICKS(5000));
|
2023-11-30 22:38:01 +01:00
|
|
|
esp_websocket_client_stop(clientPrice);
|
|
|
|
esp_websocket_client_destroy(clientPrice);
|
2024-01-31 23:45:26 +01:00
|
|
|
|
|
|
|
clientPrice = NULL;
|
2024-04-16 15:17:34 +02:00
|
|
|
}
|
|
|
|
|
2024-05-08 23:54:17 +02:00
|
|
|
void restartPriceNotify()
|
|
|
|
{
|
2024-04-16 15:17:34 +02:00
|
|
|
stopPriceNotify();
|
2024-05-08 23:54:17 +02:00
|
|
|
if (clientPrice == NULL)
|
|
|
|
{
|
2024-04-16 15:17:34 +02:00
|
|
|
setupPriceNotify();
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
// esp_websocket_client_close(clientPrice, pdMS_TO_TICKS(5000));
|
|
|
|
// esp_websocket_client_stop(clientPrice);
|
|
|
|
// esp_websocket_client_start(clientPrice);
|
2023-11-07 01:11:12 +01:00
|
|
|
}
|