Add market cap in big characters

This commit is contained in:
Djuri Baars 2023-11-10 20:59:08 +01:00
parent 705f27fda9
commit b7f0f1014c
7 changed files with 122 additions and 31 deletions

View File

@ -95,7 +95,7 @@
</script> </script>
<div class="container-fluid"> <div class="container-fluid">
<div class="row"> <div class="row">
<div class="col"> <div class="col-sm-3">
<div class="h-100 p-3 border bg-light"> <div class="h-100 p-3 border bg-light">
<h1>Custom text</h1> <h1>Custom text</h1>
<form name="customText" id="customTextForm"> <form name="customText" id="customTextForm">
@ -124,10 +124,10 @@
</form> </form>
</div> </div>
</div> </div>
<div class="col"> <div class="col-sm-5">
<div id="output" class="p-3 border bg-light">Loading, please wait...</div> <div id="output" class="p-3 border bg-light">Loading, please wait...</div>
</div> </div>
<div class="col"> <div class="col-sm-4">
<div class="h-100 p-3 border bg-light"> <div class="h-100 p-3 border bg-light">
<h1>Settings</h1> <h1>Settings</h1>
<form method="post" action="/api/settings" name="settings" id="settingsForm"> <form method="post" action="/api/settings" name="settings" id="settingsForm">
@ -192,13 +192,29 @@
</div> </div>
</div> </div>
<div class="row"> <div class="row">
<div class=" col-sm-6"> <div class="col-sm-12">
<div class="form-check form-switch"> <div class="form-check form-switch">
<input class="form-check-input" type="checkbox" id="ledFlashOnUpdate" name="ledFlashOnUpd" value="1"> <input class="form-check-input" type="checkbox" id="ledFlashOnUpdate" name="ledFlashOnUpd" value="1">
<label class="form-check-label" for="ledFlashOnUpdate">LED flash on new block</label> <label class="form-check-label" for="ledFlashOnUpdate">LED flash on new block</label>
</div> </div>
</div> </div>
</div> </div>
<div class="row">
<div class="col-sm-12">
<div class="form-check form-switch">
<input class="form-check-input" type="checkbox" id="stealFocusOnBlock" name="stealFocusOnBlock" value="1">
<label class="form-check-label" for="stealFocusOnBlock">Steal focus on new block</label>
</div>
</div>
</div>
<div class="row">
<div class="col-sm-12">
<div class="form-check form-switch">
<input class="form-check-input" type="checkbox" id="mcapBigChar" name="mcapBigChar" value="1">
<label class="form-check-label" for="mcapBigChar">Use big characters for market cap</label>
</div>
</div>
</div>
<div class="row"> <div class="row">
<label class="col-sm-6 col-form-label" for="ledBrightness">LED brightness</label> <label class="col-sm-6 col-form-label" for="ledBrightness">LED brightness</label>
<div class="col-sm-6"> <div class="col-sm-6">

View File

@ -100,6 +100,12 @@ fetch('/api/settings', {
if (jsonData.ledFlashOnUpdate) if (jsonData.ledFlashOnUpdate)
document.getElementById('ledFlashOnUpdate').checked = true; document.getElementById('ledFlashOnUpdate').checked = true;
if (jsonData.stealFocusOnBlock)
document.getElementById('stealFocusOnBlock').checked = true;
if (jsonData.mcapBigChar)
document.getElementById('mcapBigChar').checked = true;
if (jsonData.useBitcoinNode) if (jsonData.useBitcoinNode)
document.getElementById('useBitcoinNode').checked = true; document.getElementById('useBitcoinNode').checked = true;

View File

@ -94,8 +94,12 @@ void onWebsocketMessage(esp_websocket_event_data_t *event_data)
if (blockUpdateTaskHandle != nullptr) { if (blockUpdateTaskHandle != nullptr) {
xTaskNotifyGive(blockUpdateTaskHandle); xTaskNotifyGive(blockUpdateTaskHandle);
if (preferences.getBool("ledFlashOnUpd", false)) {
if (getCurrentScreen() != SCREEN_BLOCK_HEIGHT && preferences.getBool("stealFocus", true)) {
setCurrentScreen(SCREEN_BLOCK_HEIGHT); setCurrentScreen(SCREEN_BLOCK_HEIGHT);
}
if (getCurrentScreen() == SCREEN_BLOCK_HEIGHT && preferences.getBool("ledFlashOnUpd", false)) {
vTaskDelay(pdMS_TO_TICKS(250)); // Wait until screens are updated vTaskDelay(pdMS_TO_TICKS(250)); // Wait until screens are updated
queueLedEffect(LED_FLASH_BLOCK_NOTIFY); queueLedEffect(LED_FLASH_BLOCK_NOTIFY);
} }

View File

@ -49,13 +49,22 @@ void taskPriceUpdate(void *pvParameters)
{ {
double supply = getSupplyAtBlock(getBlockHeight()); double supply = getSupplyAtBlock(getBlockHeight());
int64_t marketCap = static_cast<std::int64_t>(supply * double(price)); int64_t marketCap = static_cast<std::int64_t>(supply * double(price));
taskEpdContent[0] = "USD/MCAP";
if (preferences.getBool("mcapBigChar", true)) {
firstIndex = 1;
priceString = "$" + formatNumberWithSuffix(marketCap);
priceString.insert(priceString.begin(), NUM_SCREENS - priceString.length(), ' ');
} else {
std::string stringValue = std::to_string(marketCap); std::string stringValue = std::to_string(marketCap);
size_t mcLength = stringValue.length(); size_t mcLength = stringValue.length();
size_t leadingSpaces = (3 - mcLength % 3) % 3; size_t leadingSpaces = (3 - mcLength % 3) % 3;
stringValue = std::string(leadingSpaces, ' ') + stringValue; stringValue = std::string(leadingSpaces, ' ') + stringValue;
taskEpdContent[0] = "USD/MCAP";
uint groups = (mcLength + leadingSpaces) / 3; uint groups = (mcLength + leadingSpaces) / 3;
if (groups < NUM_SCREENS) { if (groups < NUM_SCREENS) {
@ -72,8 +81,9 @@ void taskPriceUpdate(void *pvParameters)
taskEpdContent[(NUM_SCREENS-groups+i)] = stringValue.substr(i*3, 3).c_str(); taskEpdContent[(NUM_SCREENS-groups+i)] = stringValue.substr(i*3, 3).c_str();
} }
} }
}
if (getCurrentScreen() != SCREEN_MARKET_CAP) { if (!(getCurrentScreen() == SCREEN_MARKET_CAP && !preferences.getBool("mcapBigChar", true))) {
for (uint i = firstIndex; i < NUM_SCREENS; i++) for (uint i = firstIndex; i < NUM_SCREENS; i++)
{ {
taskEpdContent[i] = priceString[i]; taskEpdContent[i] = priceString[i];

View File

@ -30,3 +30,25 @@ double getSupplyAtBlock(uint blockNr) {
return totalBitcoinInCirculation; return totalBitcoinInCirculation;
} }
std::string formatNumberWithSuffix(int64_t num) {
const long long quadrillion = 1000000000000000LL;
const long long trillion = 1000000000000LL;
const long long billion = 1000000000;
const long long million = 1000000;
const long long thousand = 1000;
if (num >= quadrillion) {
return std::to_string(num / quadrillion) + "Q";
} else if (num >= trillion) {
return std::to_string(num / trillion) + "T";
} else if (num >= billion) {
return std::to_string(num / billion) + "B";
} else if (num >= million) {
return std::to_string(num / million) + "M";
} else if (num >= thousand) {
return std::to_string(num / thousand) + "K";
} else {
return std::to_string(num);
}
}

View File

@ -8,3 +8,4 @@ int modulo(int x,int N);
double getSupplyAtBlock(uint blockNr); double getSupplyAtBlock(uint blockNr);
String getMyHostname(); String getMyHostname();
std::string formatNumberWithSuffix(int64_t num);

View File

@ -20,8 +20,7 @@ void setupWebserver()
} }
// send event with message "hello!", id current millis // send event with message "hello!", id current millis
// and set reconnect delay to 1 second // and set reconnect delay to 1 second
client->send("welcome",NULL,millis(),1000); client->send("welcome",NULL,millis(),1000); });
});
server.addHandler(&events); server.addHandler(&events);
server.serveStatic("/css", LittleFS, "/css/"); server.serveStatic("/css", LittleFS, "/css/");
@ -95,7 +94,8 @@ StaticJsonDocument<768> getStatusObject()
void eventSourceUpdate() void eventSourceUpdate()
{ {
if (!events.count()) return; if (!events.count())
return;
StaticJsonDocument<768> root = getStatusObject(); StaticJsonDocument<768> root = getStatusObject();
JsonArray data = root.createNestedArray("data"); JsonArray data = root.createNestedArray("data");
String epdContent[NUM_SCREENS]; String epdContent[NUM_SCREENS];
@ -221,6 +221,8 @@ void onApiSettingsGet(AsyncWebServerRequest *request)
root["ledTestOnPower"] = preferences.getBool("ledTestOnPower", true); root["ledTestOnPower"] = preferences.getBool("ledTestOnPower", true);
root["ledFlashOnUpdate"] = preferences.getBool("ledFlashOnUpd", false); root["ledFlashOnUpdate"] = preferences.getBool("ledFlashOnUpd", false);
root["ledBrightness"] = preferences.getUInt("ledBrightness", 128); root["ledBrightness"] = preferences.getUInt("ledBrightness", 128);
root["stealFocusOnBlock"] = preferences.getBool("stealFocus", true);
root["mcapBigChar"] = preferences.getBool("mcapBigChar", true);
#ifdef GIT_REV #ifdef GIT_REV
root["gitRev"] = String(GIT_REV); root["gitRev"] = String(GIT_REV);
@ -284,8 +286,7 @@ void onApiSettingsPost(AsyncWebServerRequest *request)
AsyncWebParameter *ledFlashOnUpdate = request->getParam("ledFlashOnUpd", true); AsyncWebParameter *ledFlashOnUpdate = request->getParam("ledFlashOnUpd", true);
preferences.putBool("ledFlashOnUpd", ledFlashOnUpdate->value().toInt()); preferences.putBool("ledFlashOnUpd", ledFlashOnUpdate->value().toInt());
Serial.print("Setting led flash on update to "); Serial.printf("Setting led flash on update to %d\r\n", ledFlashOnUpdate->value().toInt());
Serial.println(ledFlashOnUpdate->value().c_str());
settingsChanged = true; settingsChanged = true;
} }
else else
@ -295,6 +296,36 @@ void onApiSettingsPost(AsyncWebServerRequest *request)
settingsChanged = true; settingsChanged = true;
} }
if (request->hasParam("stealFocusOnBlock", true))
{
AsyncWebParameter *stealFocusOnBlock = request->getParam("stealFocusOnBlock", true);
preferences.putBool("stealFocus", stealFocusOnBlock->value().toInt());
Serial.printf("Setting steal focus on new block to %d\r\n", stealFocusOnBlock->value().toInt());
settingsChanged = true;
}
else
{
preferences.putBool("stealFocus", 0);
Serial.print("Setting steal focus on new block to false");
settingsChanged = true;
}
if (request->hasParam("mcapBigChar", true))
{
AsyncWebParameter *mcapBigChar = request->getParam("mcapBigChar", true);
preferences.putBool("mcapBigChar", mcapBigChar->value().toInt());
Serial.printf("Setting big characters for market cap to %d\r\n", mcapBigChar->value().toInt());
settingsChanged = true;
}
else
{
preferences.putBool("mcapBigChar", 0);
Serial.print("Setting big characters for market cap to false");
settingsChanged = true;
}
if (request->hasParam("mempoolInstance", true)) if (request->hasParam("mempoolInstance", true))
{ {
AsyncWebParameter *mempoolInstance = request->getParam("mempoolInstance", true); AsyncWebParameter *mempoolInstance = request->getParam("mempoolInstance", true);
@ -318,7 +349,7 @@ void onApiSettingsPost(AsyncWebServerRequest *request)
AsyncWebParameter *fullRefreshMin = request->getParam("fullRefreshMin", true); AsyncWebParameter *fullRefreshMin = request->getParam("fullRefreshMin", true);
preferences.putUInt("fullRefreshMin", fullRefreshMin->value().toInt()); preferences.putUInt("fullRefreshMin", fullRefreshMin->value().toInt());
Serial.printf("Set full refresh minutes to %d\r\n",fullRefreshMin->value().toInt()); Serial.printf("Set full refresh minutes to %d\r\n", fullRefreshMin->value().toInt());
settingsChanged = true; settingsChanged = true;
} }
@ -459,7 +490,8 @@ void onNotFound(AsyncWebServerRequest *request)
} }
}; };
void eventSourceTask(void *pvParameters) { void eventSourceTask(void *pvParameters)
{
for (;;) for (;;)
{ {
ulTaskNotifyTake(pdTRUE, portMAX_DELAY); ulTaskNotifyTake(pdTRUE, portMAX_DELAY);