Fix UI error, use paged updates for EPDs

This commit is contained in:
Djuri Baars 2023-11-08 20:29:06 +01:00
parent 902b35d11e
commit 0541a7759f
13 changed files with 225 additions and 100 deletions

View file

@ -59,11 +59,11 @@
</div>
<hr>
<div>
<div class="progress" role="progressbar" aria-label="Memory usage" aria-valuenow="{{ memUsage }}" aria-valuemin="0" aria-valuemax="100">
<div class="progress-bar progress-bar-striped" style="width: {{ memUsage }}%">{{ memUsage }}%</div>
<div class="progress" role="progressbar" aria-label="Memory free" aria-valuenow="{{ memFreePercent }}" aria-valuemin="0" aria-valuemax="100">
<div class="progress-bar progress-bar-striped" style="width: {{ memFreePercent }}%">{{ memFreePercent }}%</div>
</div>
<div class="d-flex justify-content-between">
<div>Memory usage</div>
<div>Memory free</div>
<div>{{ memFree }} / {{ memTotal }} KiB</div>
</div>
</div>

View file

@ -25,7 +25,7 @@ let processStatusData = (jsonData) => {
var context = {
timerRunning: jsonData.timerRunning,
memUsage: Math.round(jsonData.espFreeHeap / jsonData.espHeapSize * 100),
memFreePercent: Math.round(jsonData.espFreeHeap / jsonData.espHeapSize * 100),
memFree: Math.round(jsonData.espFreeHeap / 1024),
memTotal: Math.round(jsonData.espHeapSize / 1024),
uptime: toTime(jsonData.espUptime),

View file

@ -16,12 +16,11 @@ void setupBlockNotify()
if (dnsErr != 1) {
Serial.print(mempoolInstance);
Serial.println("mempool DNS could not be resolved");
Serial.println(F("mempool DNS could not be resolved"));
WiFi.reconnect();
vTaskDelay(pdMS_TO_TICKS(1000));
}
}
Serial.println("mempool DNS can be resolved");
// Get current block height through regular API
HTTPClient *http = new HTTPClient();
@ -41,8 +40,6 @@ void setupBlockNotify()
.uri = "wss://mempool.bitcoin.nl/api/v1/ws",
};
Serial.printf("Connecting to %s\r\n", config.uri);
blockNotifyClient = esp_websocket_client_init(&config);
esp_websocket_register_events(blockNotifyClient, WEBSOCKET_EVENT_ANY, onWebsocketEvent, blockNotifyClient);
esp_websocket_client_start(blockNotifyClient);
@ -51,17 +48,15 @@ void setupBlockNotify()
void onWebsocketEvent(void *handler_args, esp_event_base_t base, int32_t event_id, void *event_data)
{
esp_websocket_event_data_t *data = (esp_websocket_event_data_t *)event_data;
String init;
String sub;
const char sub[38] = "{\"action\": \"want\", \"data\":[\"blocks\"]}";
switch (event_id)
{
case WEBSOCKET_EVENT_CONNECTED:
Serial.println("Connected to Mempool.space WebSocket");
Serial.println(F("Connected to Mempool.space WebSocket"));
sub = "{\"action\": \"want\", \"data\":[\"blocks\"]}";
if (esp_websocket_client_send_text(blockNotifyClient, sub.c_str(), sub.length(), portMAX_DELAY) == -1)
if (esp_websocket_client_send_text(blockNotifyClient, sub, 38, portMAX_DELAY) == -1)
{
Serial.println("Mempool.space WS Block Subscribe Error");
Serial.println(F("Mempool.space WS Block Subscribe Error"));
}
break;
@ -70,10 +65,10 @@ void onWebsocketEvent(void *handler_args, esp_event_base_t base, int32_t event_i
// Handle the received WebSocket message (block notifications) here
break;
case WEBSOCKET_EVENT_ERROR:
Serial.println("Mempool.space WS Connnection error");
Serial.println(F("Mempool.space WS Connnection error"));
break;
case WEBSOCKET_EVENT_DISCONNECTED:
Serial.println("Mempool.space WS Connnection Closed");
Serial.println(F("Mempool.space WS Connnection Closed"));
break;
}
}
@ -83,19 +78,17 @@ void onWebsocketMessage(esp_websocket_event_data_t *event_data)
SpiRamJsonDocument doc(event_data->data_len);
deserializeJson(doc, (char *)event_data->data_ptr);
// serializeJsonPretty(doc, Serial);
if (doc.containsKey("block"))
{
JsonObject block = doc["block"];
currentBlockHeight = block["height"].as<long>();
Serial.print("New block found: ");
Serial.println(block["height"].as<long>());
if (blockUpdateTaskHandle != nullptr) {
xTaskNotifyGive(blockUpdateTaskHandle);
if (preferences.getBool("ledFlashOnUpd", false)) {
setCurrentScreen(SCREEN_BLOCK_HEIGHT);
vTaskDelay(pdMS_TO_TICKS(250)); // Wait until screens are updated
queueLedEffect(LED_FLASH_BLOCK_NOTIFY);
}

View file

@ -6,7 +6,7 @@
Preferences preferences;
Adafruit_MCP23X17 mcp;
std::map<int, std::string> screenNameMap;
std::vector<std::string> screenNameMap(SCREEN_COUNT);
void setup()
{
@ -90,11 +90,11 @@ void setupPreferences()
setFgColor(preferences.getUInt("fgColor", DEFAULT_FG_COLOR));
setBgColor(preferences.getUInt("bgColor", DEFAULT_BG_COLOR));
screenNameMap = {{SCREEN_BLOCK_HEIGHT, "Block Height"},
{SCREEN_MSCW_TIME, "Sats per dollar"},
{SCREEN_BTC_TICKER, "Ticker"},
{SCREEN_TIME, "Time"},
{SCREEN_HALVING_COUNTDOWN, "Halving countdown"}};
screenNameMap[SCREEN_BLOCK_HEIGHT] = "Block Height";
screenNameMap[SCREEN_MSCW_TIME] = "Sats per dollar";
screenNameMap[SCREEN_BTC_TICKER] = "Ticker";
screenNameMap[SCREEN_TIME] = "Time";
screenNameMap[SCREEN_HALVING_COUNTDOWN] = "Halving countdown";
}
void setupWebsocketClients()
@ -105,8 +105,8 @@ void setupWebsocketClients()
void setupTimers()
{
xTaskCreate(setupTimeUpdateTimer, "setupTimeUpdateTimer", 4096, NULL, 1, NULL);
xTaskCreate(setupScreenRotateTimer, "setupScreenRotateTimer", 4096, NULL, 1, NULL);
xTaskCreate(setupTimeUpdateTimer, "setupTimeUpdateTimer", 2048, NULL, 1, NULL);
xTaskCreate(setupScreenRotateTimer, "setupScreenRotateTimer", 2048, NULL, 1, NULL);
}
void finishSetup()
@ -120,7 +120,7 @@ void finishSetup()
}
std::map<int, std::string> getScreenNameMap() {
std::vector<std::string> getScreenNameMap() {
return screenNameMap;
}

View file

@ -44,7 +44,7 @@ void setupHardware();
void tryImprovSetup();
void setupTimers();
void finishSetup();
std::map<int, std::string> getScreenNameMap();
std::vector<std::string> getScreenNameMap();
std::vector<std::string> getLocalUrl();
bool improv_connectWifi(std::string ssid, std::string password);

View file

@ -53,6 +53,8 @@ std::array<String, NUM_SCREENS> currentEpdContent;
std::array<String, NUM_SCREENS> epdContent;
uint32_t lastFullRefresh[NUM_SCREENS];
TaskHandle_t tasks[NUM_SCREENS];
TaskHandle_t epdTaskHandle = NULL;
SemaphoreHandle_t epdUpdateSemaphore[NUM_SCREENS];
int fgColor = GxEPD_WHITE;
@ -76,9 +78,11 @@ void setupDisplays()
int *taskParam = new int;
*taskParam = i;
xTaskCreate(updateDisplay, "EpdUpd" + char(i), 4096, taskParam, tskIDLE_PRIORITY, &tasks[i]); // create task
xTaskCreate(updateDisplay, ("EpdUpd" + String(i)).c_str(), 4096, taskParam, tskIDLE_PRIORITY, &tasks[i]); // create task
}
xTaskCreate(taskEpd, "epd_task", 2048, NULL, tskIDLE_PRIORITY, &epdTaskHandle);
epdContent = {"B",
"T",
"C",
@ -86,18 +90,20 @@ void setupDisplays()
"O",
"C",
"K"};
for (uint i = 0; i < NUM_SCREENS; i++)
{
xTaskNotifyGive(tasks[i]);
}
xTaskCreate(taskEpd, "epd_task", 2048, NULL, tskIDLE_PRIORITY, NULL);
setEpdContent(epdContent);
// for (uint i = 0; i < NUM_SCREENS; i++)
// {
// xTaskNotifyGive(tasks[i]);
// }
}
void taskEpd(void *pvParameters)
{
while (1)
{
ulTaskNotifyTake(pdTRUE, portMAX_DELAY);
bool updatedThisCycle = false;
for (uint i = 0; i < NUM_SCREENS; i++)
@ -127,13 +133,17 @@ void taskEpd(void *pvParameters)
}
#endif
vTaskDelay(pdMS_TO_TICKS(1000));
// vTaskDelay(pdMS_TO_TICKS(1000));
}
}
void setEpdContent(std::array<String, NUM_SCREENS> newEpdContent)
{
epdContent = newEpdContent;
if (epdTaskHandle != NULL)
xTaskNotifyGive(epdTaskHandle);
if (eventSourceTaskHandle != NULL)
xTaskNotifyGive(eventSourceTaskHandle);
}
extern "C" void updateDisplay(void *pvParameters) noexcept
@ -151,9 +161,11 @@ extern "C" void updateDisplay(void *pvParameters) noexcept
displays[epdIndex].init(0, false); // Little longer reset duration because of MCP
uint count = 0;
while (EPD_BUSY[epdIndex].digitalRead() == HIGH || count < 10) {
while (EPD_BUSY[epdIndex].digitalRead() == HIGH || count < 10)
{
vTaskDelay(pdMS_TO_TICKS(100));
if (count >= 9) {
if (count >= 9)
{
displays[epdIndex].init(0, false);
}
count++;
@ -167,35 +179,48 @@ extern "C" void updateDisplay(void *pvParameters) noexcept
updatePartial = false;
lastFullRefresh[epdIndex] = millis();
}
// if (updatePartial)
// {
// displays[epdIndex].setPartialWindow(0, 0, displays[i].width(), display[i].height());
// }
if (strstr(epdContent[epdIndex].c_str(), "/") != NULL)
{
String top = epdContent[epdIndex].substring(0, epdContent[epdIndex].indexOf("/"));
String bottom = epdContent[epdIndex].substring(epdContent[epdIndex].indexOf("/") + 1);
splitText(epdIndex, top, bottom, updatePartial);
splitTextPaged(epdIndex, top, bottom, updatePartial);
}
else
{
showDigit(epdIndex, epdContent[epdIndex].c_str()[0], updatePartial, &FONT_BIG);
// displays[epdIndex].drawPaged([&epdIndex, &updatePartial](const void *data)
// { showDigit(epdIndex, epdContent[epdIndex].c_str()[0], updatePartial, &FONT_BIG); },
// 0);
showDigitPaged(epdIndex, epdContent[epdIndex].c_str()[0], updatePartial, &FONT_BIG);
}
char tries = 0;
while (tries < 3)
{
if (displays[epdIndex].displayWithReturn(updatePartial))
{
displays[epdIndex].hibernate();
currentEpdContent[epdIndex] = epdContent[epdIndex];
break;
}
// char tries = 0;
// while (tries < 3)
// {
// if (displays[epdIndex].displayWithReturn(updatePartial))
// {
// displays[epdIndex].hibernate();
currentEpdContent[epdIndex] = epdContent[epdIndex];
// break;
// }
vTaskDelay(pdMS_TO_TICKS(100));
tries++;
}
// vTaskDelay(pdMS_TO_TICKS(100));
// tries++;
// }
}
xSemaphoreGive(epdUpdateSemaphore[epdIndex]);
}
}
void updateDisplayAlt(int epdIndex)
{
}
void splitText(const uint dispNum, String top, String bottom, bool partial)
{
displays[dispNum].setRotation(2);
@ -232,6 +257,55 @@ void splitText(const uint dispNum, String top, String bottom, bool partial)
displays[dispNum].print(bottom);
}
void splitTextPaged(const uint dispNum, String top, String bottom, bool partial)
{
displays[dispNum].setRotation(2);
displays[dispNum].setFont(&FONT_SMALL);
displays[dispNum].setTextColor(getFgColor());
// Top text
int16_t ttbx, ttby;
uint16_t ttbw, ttbh;
displays[dispNum].getTextBounds(top, 0, 0, &ttbx, &ttby, &ttbw, &ttbh);
uint16_t tx = ((displays[dispNum].width() - ttbw) / 2) - ttbx;
uint16_t ty = ((displays[dispNum].height() - ttbh) / 2) - ttby - ttbh / 2 - 12;
// Bottom text
int16_t tbbx, tbby;
uint16_t tbbw, tbbh;
displays[dispNum].getTextBounds(bottom, 0, 0, &tbbx, &tbby, &tbbw, &tbbh);
uint16_t bx = ((displays[dispNum].width() - tbbw) / 2) - tbbx;
uint16_t by = ((displays[dispNum].height() - tbbh) / 2) - tbby + tbbh / 2 + 12;
// Make separator as wide as the shortest text.
uint16_t lineWidth, lineX;
if (tbbw < ttbh)
lineWidth = tbbw;
else
lineWidth = ttbw;
lineX = round((displays[dispNum].width() - lineWidth) / 2);
if (partial)
{
displays[dispNum].setPartialWindow(0, 0, displays[dispNum].width(), displays[dispNum].height());
}
else
{
displays[dispNum].setFullWindow();
}
displays[dispNum].firstPage();
do
{
displays[dispNum].fillScreen(getBgColor());
displays[dispNum].setCursor(tx, ty);
displays[dispNum].print(top);
displays[dispNum].fillRoundRect(lineX, displays[dispNum].height() / 2 - 3, lineWidth, 6, 3, getFgColor());
displays[dispNum].setCursor(bx, by);
displays[dispNum].print(bottom);
} while (displays[dispNum].nextPage());
}
void showDigit(const uint dispNum, char chr, bool partial, const GFXfont *font)
{
String str(chr);
@ -249,6 +323,36 @@ void showDigit(const uint dispNum, char chr, bool partial, const GFXfont *font)
displays[dispNum].print(str);
}
void showDigitPaged(const uint dispNum, char chr, bool partial, const GFXfont *font)
{
String str(chr);
displays[dispNum].setRotation(2);
displays[dispNum].setFont(font);
displays[dispNum].setTextColor(getFgColor());
int16_t tbx, tby;
uint16_t tbw, tbh;
displays[dispNum].getTextBounds(str, 0, 0, &tbx, &tby, &tbw, &tbh);
// center the bounding box by transposition of the origin:
uint16_t x = ((displays[dispNum].width() - tbw) / 2) - tbx;
uint16_t y = ((displays[dispNum].height() - tbh) / 2) - tby;
if (partial)
{
displays[dispNum].setPartialWindow(0, 0, displays[dispNum].width(), displays[dispNum].height());
}
else
{
displays[dispNum].setFullWindow();
}
displays[dispNum].firstPage();
do
{
displays[dispNum].fillScreen(getBgColor());
displays[dispNum].setCursor(x, y);
displays[dispNum].print(str);
} while (displays[dispNum].nextPage());
}
int getBgColor()
{
return bgColor;
@ -271,7 +375,7 @@ void setFgColor(int color)
std::array<String, NUM_SCREENS> getCurrentEpdContent()
{
// Serial.println("currentEpdContent");
// Serial.println("currentEpdContent");
// for (int i = 0; i < NUM_SCREENS; i++) {
// Serial.printf("%d = %s", i, currentEpdContent[i]);

View file

@ -11,8 +11,13 @@ void setupDisplays();
void taskEpd(void *pvParameters);
void splitText(const uint dispNum, String top, String bottom, bool partial);
void splitTextPaged(const uint dispNum, String top, String bottom, bool partial);
void showDigit(const uint dispNum, char chr, bool partial, const GFXfont *font);
void showDigitPaged(const uint dispNum, char chr, bool partial, const GFXfont *font);
extern "C" void updateDisplay(void *pvParameters) noexcept;
void updateDisplayAlt(int epdIndex);
int getBgColor();
int getFgColor();

View file

@ -52,6 +52,7 @@ void ledTask(void *parameter)
delay(100);
}
pixels.setPixelColor(0, pixels.Color(255, 0, 0));
delay(900);
@ -60,7 +61,7 @@ void ledTask(void *parameter)
break;
case LED_EFFECT_START_TIMER:
pixels.clear();
pixels.setPixelColor(NEOPIXEL_COUNT, pixels.Color(0, 255, 0));
pixels.setPixelColor(NEOPIXEL_COUNT, pixels.Color(255, 0, 0));
pixels.show();
delay(900);
@ -113,9 +114,9 @@ void setupLeds()
void setupLedTask()
{
ledTaskQueue = xQueueCreate(10, sizeof(unsigned long));
ledTaskQueue = xQueueCreate(10, sizeof(char));
xTaskCreate(ledTask, "LedTask", 4096, NULL, tskIDLE_PRIORITY, &ledTaskHandle);
xTaskCreate(ledTask, "LedTask", 2048, NULL, tskIDLE_PRIORITY, &ledTaskHandle);
}
void blinkDelay(int d, int times)
@ -221,6 +222,6 @@ bool queueLedEffect(uint effect)
return false;
}
unsigned long flashType = effect;
char flashType = effect;
xQueueSend(ledTaskQueue, &flashType, portMAX_DELAY);
}

View file

@ -20,21 +20,20 @@ void setupPriceNotify()
void onWebsocketPriceEvent(void *handler_args, esp_event_base_t base, int32_t event_id, void *event_data)
{
esp_websocket_event_data_t *data = (esp_websocket_event_data_t *)event_data;
String init;
String sub;
switch (event_id)
{
case WEBSOCKET_EVENT_CONNECTED:
Serial.println("Connected to CoinCap.io WebSocket");
Serial.println(F("Connected to CoinCap.io WebSocket"));
break;
case WEBSOCKET_EVENT_DATA:
onWebsocketPriceMessage(data);
break;
case WEBSOCKET_EVENT_ERROR:
Serial.println("Connnection error");
Serial.println(F("Price WS Connnection error"));
break;
case WEBSOCKET_EVENT_DISCONNECTED:
Serial.println("Connnection Closed");
Serial.println(F("Price WS Connnection Closed"));
break;
}
}

View file

@ -61,7 +61,7 @@ void taskScreenRotate(void *pvParameters)
{
ulTaskNotifyTake(pdTRUE, portMAX_DELAY);
int nextScreen = (currentScreen+ 1) % 5;
int nextScreen = (currentScreen + 1) % 5;
String key = "screen" + String(nextScreen) + "Visible";
while (!preferences.getBool(key.c_str(), true))
@ -115,7 +115,8 @@ void taskBlockUpdate(void *pvParameters)
taskEpdContent[(NUM_SCREENS - 1)] = "TO/GO";
}
if (getCurrentScreen() == SCREEN_HALVING_COUNTDOWN || getCurrentScreen() == SCREEN_BLOCK_HEIGHT) {
if (getCurrentScreen() == SCREEN_HALVING_COUNTDOWN || getCurrentScreen() == SCREEN_BLOCK_HEIGHT)
{
setEpdContent(taskEpdContent);
}
}
@ -217,7 +218,8 @@ void setupScreenRotateTimer(void *pvParameters)
esp_timer_create(&screenRotateTimerConfig, &screenRotateTimer);
if (preferences.getBool("timerActive", true)) {
if (preferences.getBool("timerActive", true))
{
esp_timer_start_periodic(screenRotateTimer, getTimerSeconds() * usPerSecond);
}
@ -248,9 +250,13 @@ void setTimerActive(bool status)
queueLedEffect(LED_EFFECT_PAUSE_TIMER);
preferences.putBool("timerActive", false);
}
if (eventSourceTaskHandle != NULL)
xTaskNotifyGive(eventSourceTaskHandle);
}
void toggleTimerActive() {
void toggleTimerActive()
{
setTimerActive(!isTimerActive());
}
@ -282,6 +288,9 @@ void setCurrentScreen(uint newScreen)
xTaskNotifyGive(priceUpdateTaskHandle);
break;
}
if (eventSourceTaskHandle != NULL)
xTaskNotifyGive(eventSourceTaskHandle);
}
void nextScreen()
@ -329,9 +338,9 @@ void showSystemStatusScreen()
ipAddr = ipAddr.substring(ipAddrPos);
subNet = subNet.substring(subnetPos);
}
sysStatusEpdContent[NUM_SCREENS-2] = "RAM/Status";
sysStatusEpdContent[NUM_SCREENS - 2] = "RAM/Status";
sysStatusEpdContent[NUM_SCREENS-1] = String((int)round(ESP.getFreeHeap()/1024)) + "/" + (int)round(ESP.getHeapSize()/1024);
sysStatusEpdContent[NUM_SCREENS - 1] = String((int)round(ESP.getFreeHeap() / 1024)) + "/" + (int)round(ESP.getHeapSize() / 1024);
setCurrentScreen(SCREEN_CUSTOM);
setEpdContent(sysStatusEpdContent);
}

View file

@ -2,6 +2,7 @@
AsyncWebServer server(80);
AsyncEventSource events("/events");
TaskHandle_t eventSourceTaskHandle;
void setupWebserver()
{
@ -19,7 +20,7 @@ void setupWebserver()
}
// send event with message "hello!", id current millis
// and set reconnect delay to 1 second
eventSourceLoop();
eventSourceUpdate();
});
server.addHandler(&events);
@ -66,6 +67,8 @@ void setupWebserver()
}
}
MDNS.addService("http", "tcp", 80);
xTaskCreate(eventSourceTask, "eventSourceTask", 4096, NULL, tskIDLE_PRIORITY, &eventSourceTaskHandle);
}
StaticJsonDocument<768> getStatusObject()
@ -76,12 +79,12 @@ StaticJsonDocument<768> getStatusObject()
root["numScreens"] = NUM_SCREENS;
root["timerRunning"] = isTimerActive();
root["espUptime"] = esp_timer_get_time() / 1000000;
root["currentPrice"] = getPrice();
root["currentBlockHeight"] = getBlockHeight();
// root["currentPrice"] = getPrice();
// root["currentBlockHeight"] = getBlockHeight();
root["espFreeHeap"] = ESP.getFreeHeap();
root["espHeapSize"] = ESP.getHeapSize();
root["espFreePsram"] = ESP.getFreePsram();
root["espPsramSize"] = ESP.getPsramSize();
// root["espFreePsram"] = ESP.getFreePsram();
// root["espPsramSize"] = ESP.getPsramSize();
JsonObject conStatus = root.createNestedObject("connectionStatus");
conStatus["price"] = isPriceNotifyConnected();
@ -90,7 +93,7 @@ StaticJsonDocument<768> getStatusObject()
return root;
}
void eventSourceLoop()
void eventSourceUpdate()
{
if (!events.count()) return;
StaticJsonDocument<768> root = getStatusObject();
@ -101,8 +104,6 @@ void eventSourceLoop()
copyArray(epdContent, data);
size_t bufSize = measureJson(root);
char buffer[bufSize];
String bufString;
serializeJson(root, bufString);
@ -229,7 +230,7 @@ void onApiSettingsGet(AsyncWebServerRequest *request)
#endif
JsonArray screens = root.createNestedArray("screens");
std::map<int, std::string> screenNameMap = getScreenNameMap();
std::vector<std::string> screenNameMap = getScreenNameMap();
for (int i = 0; i < screenNameMap.size(); i++)
{
@ -274,7 +275,6 @@ bool processEpdColorSettings(AsyncWebServerRequest *request)
void onApiSettingsPost(AsyncWebServerRequest *request)
{
int params = request->params();
bool settingsChanged = false;
settingsChanged = processEpdColorSettings(request);
@ -300,8 +300,7 @@ void onApiSettingsPost(AsyncWebServerRequest *request)
AsyncWebParameter *mempoolInstance = request->getParam("mempoolInstance", true);
preferences.putString("mempoolInstance", mempoolInstance->value().c_str());
Serial.print("Setting mempool instance to ");
Serial.println(mempoolInstance->value().c_str());
Serial.printf("Setting mempool instance to %s\r\n", mempoolInstance->value().c_str());
settingsChanged = true;
}
@ -310,8 +309,7 @@ void onApiSettingsPost(AsyncWebServerRequest *request)
AsyncWebParameter *ledBrightness = request->getParam("ledBrightness", true);
preferences.putUInt("ledBrightness", ledBrightness->value().toInt());
Serial.print("Setting brightness to ");
Serial.println(ledBrightness->value().c_str());
Serial.printf("Setting brightness to %d\r\n", ledBrightness->value().toInt());
settingsChanged = true;
}
@ -320,8 +318,7 @@ void onApiSettingsPost(AsyncWebServerRequest *request)
AsyncWebParameter *fullRefreshMin = request->getParam("fullRefreshMin", true);
preferences.putUInt("fullRefreshMin", fullRefreshMin->value().toInt());
Serial.print("Set full refresh minutes to ");
Serial.println(fullRefreshMin->value().c_str());
Serial.printf("Set full refresh minutes to %d\r\n",fullRefreshMin->value().toInt());
settingsChanged = true;
}
@ -330,12 +327,11 @@ void onApiSettingsPost(AsyncWebServerRequest *request)
AsyncWebParameter *wpTimeout = request->getParam("wpTimeout", true);
preferences.putUInt("wpTimeout", wpTimeout->value().toInt());
Serial.print("Set WiFi portal timeout seconds to ");
Serial.println(wpTimeout->value().c_str());
Serial.printf("Set WiFi portal timeout seconds to %d\r\n", wpTimeout->value().toInt());
settingsChanged = true;
}
std::map<int, std::string> screenNameMap = getScreenNameMap();
std::vector<std::string> screenNameMap = getScreenNameMap();
for (int i = 0; i < screenNameMap.size(); i++)
{
@ -347,8 +343,7 @@ void onApiSettingsPost(AsyncWebServerRequest *request)
AsyncWebParameter *screenParam = request->getParam(key, true);
visible = screenParam->value().toInt();
}
Serial.print("Setting screen " + String(i) + " to ");
Serial.println(visible);
Serial.printf("Setting screen %d to %d\r\n", i, visible);
preferences.putBool(prefKey.c_str(), visible);
}
@ -358,18 +353,16 @@ void onApiSettingsPost(AsyncWebServerRequest *request)
AsyncWebParameter *p = request->getParam("tzOffset", true);
int tzOffsetSeconds = p->value().toInt() * 60;
preferences.putInt("gmtOffset", tzOffsetSeconds);
Serial.print("Setting tz offset to ");
Serial.println(tzOffsetSeconds);
Serial.printf("Setting tz offset to %d\r\n", tzOffsetSeconds);
settingsChanged = true;
}
if (request->hasParam("minSecPriceUpd", true))
{
AsyncWebParameter *p = request->getParam("minSecPriceUpd", true);
int minSecPriceUpd = p->value().toInt() * 60;
preferences.putInt("minSecPriceUpd", minSecPriceUpd);
Serial.print("Setting minSecPriceUpd ");
Serial.println(minSecPriceUpd);
int minSecPriceUpd = p->value().toInt();
preferences.putUInt("minSecPriceUpd", minSecPriceUpd);
Serial.printf("Setting minSecPriceUpd to %d\r\n", minSecPriceUpd);
settingsChanged = true;
}
@ -465,3 +458,11 @@ void onNotFound(AsyncWebServerRequest *request)
request->send(404);
}
};
void eventSourceTask(void *pvParameters) {
for (;;)
{
ulTaskNotifyTake(pdTRUE, portMAX_DELAY);
eventSourceUpdate();
}
}

View file

@ -12,6 +12,8 @@
#include "webserver/OneParamRewrite.hpp"
extern TaskHandle_t eventSourceTaskHandle;
void setupWebserver();
bool processEpdColorSettings(AsyncWebServerRequest *request);
@ -36,4 +38,5 @@ void onIndex(AsyncWebServerRequest *request);
void onNotFound(AsyncWebServerRequest *request);
StaticJsonDocument<768> getStatusObject();
void eventSourceLoop();
void eventSourceUpdate();
void eventSourceTask(void *pvParameters);

View file

@ -1,6 +1,8 @@
#include "Arduino.h"
#include "lib/config.hpp"
//char ptrTaskList[400];
extern "C" void app_main()
{
initArduino();
@ -10,7 +12,15 @@ extern "C" void app_main()
while (true)
{
eventSourceLoop();
vTaskDelay(pdMS_TO_TICKS(2500));
// vTaskList(ptrTaskList);
// Serial.println(F("**********************************"));
// Serial.println(F("Task State Prio Stack Num"));
// Serial.println(F("**********************************"));
// Serial.print(ptrTaskList);
// Serial.println(F("**********************************"));
if (eventSourceTaskHandle != NULL)
xTaskNotifyGive(eventSourceTaskHandle);
vTaskDelay(pdMS_TO_TICKS(5000));
}
}