From ae9d2a2c857aedeb5a4f10390f3f248acf672dfa Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Tue, 11 Jun 2024 11:07:30 +0200 Subject: [PATCH] Refactor display modes1 to 4 --- .../tasmota_xdrv_driver/xdrv_13_display.ino | 92 +++++++++---------- tasmota/tasmota_xdsp_display/xdsp_01_lcd.ino | 3 - .../tasmota_xdsp_display/xdsp_03_matrix.ino | 3 - .../xdsp_05_epaper_29.ino | 2 - .../tasmota_xdsp_display/xdsp_15_tm1637.ino | 3 - .../xdsp_17_universal.ino | 5 +- 6 files changed, 42 insertions(+), 66 deletions(-) diff --git a/tasmota/tasmota_xdrv_driver/xdrv_13_display.ino b/tasmota/tasmota_xdrv_driver/xdrv_13_display.ino index cdb9faded..b0350afef 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_13_display.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_13_display.ino @@ -256,6 +256,7 @@ char **disp_log_buffer; char **disp_screen_buffer; char disp_temp[2]; // C or F char disp_pres[5]; // hPa or mmHg +char disp_topic[TOPSZ]; uint8_t disp_log_buffer_cols = 0; uint8_t disp_log_buffer_idx = 0; @@ -1497,8 +1498,7 @@ void free_dt_vars(void) { #ifdef USE_DISPLAY_MODES1TO5 -void DisplayClearScreenBuffer(void) -{ +void DisplayClearScreenBuffer(void) { if (disp_screen_buffer_cols) { for (uint32_t i = 0; i < disp_screen_buffer_rows; i++) { memset(disp_screen_buffer[i], 0, disp_screen_buffer_cols); @@ -1506,8 +1506,7 @@ void DisplayClearScreenBuffer(void) } } -void DisplayFreeScreenBuffer(void) -{ +void DisplayFreeScreenBuffer(void) { if (disp_screen_buffer != nullptr) { for (uint32_t i = 0; i < disp_screen_buffer_rows; i++) { if (disp_screen_buffer[i] != nullptr) { free(disp_screen_buffer[i]); } @@ -1518,14 +1517,13 @@ void DisplayFreeScreenBuffer(void) } } -void DisplayAllocScreenBuffer(void) -{ +void DisplayAllocScreenBuffer(void) { if (!disp_screen_buffer_cols) { disp_screen_buffer_rows = Settings->display_rows; - disp_screen_buffer = (char**)malloc(sizeof(*disp_screen_buffer) * disp_screen_buffer_rows); + disp_screen_buffer = (char**)calloc(sizeof(*disp_screen_buffer) * disp_screen_buffer_rows, 1); if (disp_screen_buffer != nullptr) { for (uint32_t i = 0; i < disp_screen_buffer_rows; i++) { - disp_screen_buffer[i] = (char*)malloc(sizeof(*disp_screen_buffer[i]) * (Settings->display_cols[0] +1)); + disp_screen_buffer[i] = (char*)calloc(sizeof(*disp_screen_buffer[i]) * (Settings->display_cols[0] +1), 1); if (disp_screen_buffer[i] == nullptr) { DisplayFreeScreenBuffer(); break; @@ -1539,14 +1537,12 @@ void DisplayAllocScreenBuffer(void) } } -void DisplayReAllocScreenBuffer(void) -{ +void DisplayReAllocScreenBuffer(void) { DisplayFreeScreenBuffer(); DisplayAllocScreenBuffer(); } -void DisplayFillScreen(uint32_t line) -{ +void DisplayFillScreen(uint32_t line) { uint32_t len = disp_screen_buffer_cols - strlen(disp_screen_buffer[line]); if (len) { memset(disp_screen_buffer[line] + strlen(disp_screen_buffer[line]), 0x20, len); @@ -1556,17 +1552,7 @@ void DisplayFillScreen(uint32_t line) /*-------------------------------------------------------------------------------------------*/ -void DisplayClearLogBuffer(void) -{ - if (disp_log_buffer_cols) { - for (uint32_t i = 0; i < DISPLAY_LOG_ROWS; i++) { - memset(disp_log_buffer[i], 0, disp_log_buffer_cols); - } - } -} - -void DisplayFreeLogBuffer(void) -{ +void DisplayFreeLogBuffer(void) { if (disp_log_buffer != nullptr) { for (uint32_t i = 0; i < DISPLAY_LOG_ROWS; i++) { if (disp_log_buffer[i] != nullptr) { free(disp_log_buffer[i]); } @@ -1576,13 +1562,12 @@ void DisplayFreeLogBuffer(void) } } -void DisplayAllocLogBuffer(void) -{ +void DisplayAllocLogBuffer(void) { if (!disp_log_buffer_cols) { - disp_log_buffer = (char**)malloc(sizeof(*disp_log_buffer) * DISPLAY_LOG_ROWS); + disp_log_buffer = (char**)calloc(sizeof(*disp_log_buffer) * DISPLAY_LOG_ROWS, 1); if (disp_log_buffer != nullptr) { for (uint32_t i = 0; i < DISPLAY_LOG_ROWS; i++) { - disp_log_buffer[i] = (char*)malloc(sizeof(*disp_log_buffer[i]) * (Settings->display_cols[0] +1)); + disp_log_buffer[i] = (char*)calloc(sizeof(*disp_log_buffer[i]) * (Settings->display_cols[0] +1), 1); if (disp_log_buffer[i] == nullptr) { DisplayFreeLogBuffer(); break; @@ -1591,46 +1576,42 @@ void DisplayAllocLogBuffer(void) } if (disp_log_buffer != nullptr) { disp_log_buffer_cols = Settings->display_cols[0] +1; - DisplayClearLogBuffer(); DisplayClearScreenBuffer(); DisplayClear(); } } } -void DisplayReAllocLogBuffer(void) -{ +void DisplayReAllocLogBuffer(void) { DisplayFreeLogBuffer(); DisplayAllocLogBuffer(); } -void DisplayLogBufferAdd(char* txt) -{ +void DisplayLogBufferAdd(char* txt) { if (disp_log_buffer_cols) { - strlcpy(disp_log_buffer[disp_log_buffer_idx], txt, disp_log_buffer_cols); // This preserves the % sign where printf won't - disp_log_buffer_idx++; + strlcpy(disp_log_buffer[disp_log_buffer_idx++], txt, disp_log_buffer_cols); // This preserves the % sign where printf won't if (DISPLAY_LOG_ROWS == disp_log_buffer_idx) { disp_log_buffer_idx = 0; } } } -char* DisplayLogBuffer(char temp_code) -{ +char* DisplayLogBuffer(char temp_code) { char* result = nullptr; if (disp_log_buffer_cols) { if (disp_log_buffer_idx != disp_log_buffer_ptr) { - result = disp_log_buffer[disp_log_buffer_ptr]; - disp_log_buffer_ptr++; + uint32_t log_buffer_ptr = disp_log_buffer_ptr; + result = disp_log_buffer[disp_log_buffer_ptr++]; if (DISPLAY_LOG_ROWS == disp_log_buffer_ptr) { disp_log_buffer_ptr = 0; } char *pch = strchr(result, '~'); // = 0x7E (~) Replace degrees character (276 octal) if (pch != nullptr) { result[pch - result] = temp_code; } + + AddLog(LOG_LEVEL_DEBUG_MORE, PSTR("DSP: %02d %s"), log_buffer_ptr, result); } } return result; } -void DisplayLogBufferInit(void) -{ +void DisplayLogBufferInit(void) { if (Settings->display_mode) { disp_log_buffer_idx = 0; disp_log_buffer_ptr = 0; @@ -1730,19 +1711,31 @@ void DisplayJsonValue(const char* topic, const char* device, const char* mkey, c } char buffer[Settings->display_cols[0] +1]; // Max sized buffer string - memset(buffer, 0x20, sizeof(buffer)); // Temporarily use for spaces + uint32_t size = strlen(topic); + if ((Settings->display_rows > 4) && size) { // Skip header if less than five rows + if (strcmp(topic, disp_topic)) { // Show topic header only once + strcpy(disp_topic, topic); + char buffer2[Settings->display_cols[0] +1]; // Max sized buffer string + memset(buffer2, '-', sizeof(buffer2)); // Set to - + buffer2[sizeof(buffer2) -1] = '\0'; + snprintf_P(buffer, sizeof(buffer), PSTR("- %s %s"), topic, buffer2); // - pow1 ------------- + DisplayLogBufferAdd(buffer); + } + size = 0; // Remove topic from source + } + memset(buffer, ' ', sizeof(buffer)); // Temporarily use for spaces buffer[sizeof(buffer) -1] = '\0'; char source[Settings->display_cols[0] - Settings->display_cols[1]]; // Max sized source string - snprintf_P(source, sizeof(source), PSTR("%s%s%s%s"), topic, (strlen(topic))?"/":"", mkey, buffer); // pow1/Voltage or Voltage if topic is empty (local sensor) + snprintf_P(source, sizeof(source), PSTR("%s%s%s%s"), (size)?topic:"", (size)?"/":"", mkey, buffer); // pow1/Voltage or Voltage if topic is empty (local sensor or header) snprintf_P(buffer, sizeof(buffer), PSTR("%s %s"), source, svalue); -// AddLog(LOG_LEVEL_DEBUG, PSTR(D_LOG_DEBUG "mkey [%s], source [%s], value [%s], quantity_code %d, log_buffer [%s]"), mkey, source, value, quantity_code, buffer); +// AddLog(LOG_LEVEL_DEBUG, PSTR(D_LOG_DEBUG "topic [%s], device [%s], mkey [%s], source [%s], value [%s], quantity_code %d, log_buffer [%s]"), +// topic, device, mkey, source, value, quantity_code, buffer); DisplayLogBufferAdd(buffer); } -void DisplayAnalyzeJson(char *topic, const char *json) -{ +void DisplayAnalyzeJson(char *topic, const char *json) { // //tele/pow2/STATE {"Time":"2017-09-20T11:53:03", "Uptime":10, "Vcc":3.123, "POWER":"ON", "Wifi":{"AP":2, "SSId":"indebuurt2", "RSSI":68, "APMac":"00:22:6B:FE:8E:20"}} // //tele/pow2/ENERGY {"Time":"2017-09-20T11:53:03", "Total":6.522, "Yesterday":0.150, "Today":0.073, "Period":0.5, "Power":12.1, "Factor":0.56, "Voltage":210.1, "Current":0.102} @@ -1819,10 +1812,8 @@ void DisplayMqttSubscribe(void) { strncat(ntopic, SettingsText(SET_MQTTPREFIX3), sizeof(ntopic) - strlen(ntopic) -1); // Subscribe to tele messages strncat_P(ntopic, PSTR("/#"), sizeof(ntopic) - strlen(ntopic) -1); // Add multi-level wildcard if (Settings->display_model && (Settings->display_mode &0x04)) { - if (!disp_subscribed) { - disp_subscribed = true; - MqttSubscribe(ntopic); - } + disp_subscribed = true; + MqttSubscribe(ntopic); } else { if (disp_subscribed) { disp_subscribed = false; @@ -1831,8 +1822,7 @@ void DisplayMqttSubscribe(void) { } } -bool DisplayMqttData(void) -{ +bool DisplayMqttData(void) { if (disp_subscribed) { char stopic[TOPSZ]; diff --git a/tasmota/tasmota_xdsp_display/xdsp_01_lcd.ino b/tasmota/tasmota_xdsp_display/xdsp_01_lcd.ino index 2dff946f2..c70ac4bb3 100644 --- a/tasmota/tasmota_xdsp_display/xdsp_01_lcd.ino +++ b/tasmota/tasmota_xdsp_display/xdsp_01_lcd.ino @@ -149,9 +149,6 @@ bool LcdPrintLog(void) } strlcpy(disp_screen_buffer[last_row], txt, disp_screen_buffer_cols); DisplayFillScreen(last_row); - - AddLog(LOG_LEVEL_DEBUG, PSTR(D_LOG_DEBUG "[%s]"), disp_screen_buffer[last_row]); - lcd->setCursor(0, last_row); lcd->print(disp_screen_buffer[last_row]); diff --git a/tasmota/tasmota_xdsp_display/xdsp_03_matrix.ino b/tasmota/tasmota_xdsp_display/xdsp_03_matrix.ino index c314d4982..d8a6d5fa4 100644 --- a/tasmota/tasmota_xdsp_display/xdsp_03_matrix.ino +++ b/tasmota/tasmota_xdsp_display/xdsp_03_matrix.ino @@ -267,9 +267,6 @@ void MatrixPrintLog(uint8_t direction) } i++; } - - AddLog(LOG_LEVEL_DEBUG, PSTR(D_LOG_APPLICATION "[%s]"), mtx_buffer); - mtx_done = 1; } diff --git a/tasmota/tasmota_xdsp_display/xdsp_05_epaper_29.ino b/tasmota/tasmota_xdsp_display/xdsp_05_epaper_29.ino index 4c18e219b..959c4c48f 100644 --- a/tasmota/tasmota_xdsp_display/xdsp_05_epaper_29.ino +++ b/tasmota/tasmota_xdsp_display/xdsp_05_epaper_29.ino @@ -130,8 +130,6 @@ void EpdPrintLog29(void) DisplayFillScreen(last_row); renderer->DrawStringAt(0, epd_scroll, disp_screen_buffer[last_row], COLORED, 0); // EpdDisplayFrame(); - - AddLog(LOG_LEVEL_DEBUG, PSTR(D_LOG_APPLICATION "[%s]"), txt); } } } diff --git a/tasmota/tasmota_xdsp_display/xdsp_15_tm1637.ino b/tasmota/tasmota_xdsp_display/xdsp_15_tm1637.ino index 4d43d23ff..62b48632f 100644 --- a/tasmota/tasmota_xdsp_display/xdsp_15_tm1637.ino +++ b/tasmota/tasmota_xdsp_display/xdsp_15_tm1637.ino @@ -1203,9 +1203,6 @@ bool TM1637PrintLog(void) { strlcpy(disp_screen_buffer[last_row], txt, disp_screen_buffer_cols); DisplayFillScreen(last_row); - - AddLog(LOG_LEVEL_DEBUG, PSTR(D_LOG_DEBUG "[%s]"), disp_screen_buffer[last_row]); - TM1637Print(disp_screen_buffer[last_row]); result = true; diff --git a/tasmota/tasmota_xdsp_display/xdsp_17_universal.ino b/tasmota/tasmota_xdsp_display/xdsp_17_universal.ino index ac5599dea..8c07b1d56 100644 --- a/tasmota/tasmota_xdsp_display/xdsp_17_universal.ino +++ b/tasmota/tasmota_xdsp_display/xdsp_17_universal.ino @@ -550,7 +550,7 @@ void UDISP_PrintLog(void) if (!disp_screen_buffer_cols) { DisplayAllocScreenBuffer(); } char* txt = DisplayLogBuffer('\370'); - if (txt != NULL) { + if (txt != nullptr) { uint8_t last_row = Settings->display_rows -1; // renderer->clearDisplay(); @@ -562,9 +562,6 @@ void UDISP_PrintLog(void) } strlcpy(disp_screen_buffer[last_row], txt, disp_screen_buffer_cols); DisplayFillScreen(last_row); - - AddLog(LOG_LEVEL_DEBUG, PSTR(D_LOG_DEBUG "[%s]"), disp_screen_buffer[last_row]); - renderer->println(disp_screen_buffer[last_row]); renderer->Updateframe(); }