From a06bd11d2b73f57f3121088dd7f606202be27a2c Mon Sep 17 00:00:00 2001 From: "tom.tiltmann" <tom.tiltmann@th-koeln.de> Date: Fri, 31 Jan 2025 14:44:08 +0100 Subject: [PATCH] add truncate/umlauts ability --- .../preproc/ctags_target_for_gcc_minus_e.cpp | 2 +- README.md | 2 +- SerialTable.h | 45 ++++++++++++++----- examples/serialTable/serialTable.ino | 2 +- 4 files changed, 36 insertions(+), 15 deletions(-) diff --git a/.build/preproc/ctags_target_for_gcc_minus_e.cpp b/.build/preproc/ctags_target_for_gcc_minus_e.cpp index 7da6236..c8f442e 100644 --- a/.build/preproc/ctags_target_for_gcc_minus_e.cpp +++ b/.build/preproc/ctags_target_for_gcc_minus_e.cpp @@ -12,7 +12,7 @@ void setup() const char *headers[] = {"Vorname", "Nachname", "Alter", "Stadt", "Beruf", "Unternehmen", "Hobby", "Bemerkung"}; int columnWidths[] = {10, 15, 5, 10, 10, 15, 10, 20}; - SerialTable table(headers, columnWidths, 8); + SerialTable table(headers, columnWidths, 8, true, true); table.printHeader(); // Erstellen von 20 Zeilen mit unterschiedlichen Einträgen diff --git a/README.md b/README.md index f889952..fee8ccc 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ # SerialTable (thk_serialTable) Die `SerialTable`-Klasse bietet eine komfortable Möglichkeit, tabellarische Daten über die serielle Schnittstelle auf einem Arduino-Gerät auszugeben. Sie unterstützt die Darstellung von mehrbyteigen UTF-8-Zeichen, wie z.B. Umlauten, und bietet Funktionen, um Textangaben innerhalb definierter Spaltenbreiten zu verwalten. -```cpp +```txt +----------+---------------+-----+----------+----------+---------------+----------+--------------------+ |Vorname |Nachname |Alter|Stadt |Beruf |Unternehmen |Hobby |Bemerkung | +==========+===============+=====+==========+==========+===============+==========+====================+ diff --git a/SerialTable.h b/SerialTable.h index 2773195..11b48b8 100644 --- a/SerialTable.h +++ b/SerialTable.h @@ -6,8 +6,8 @@ class SerialTable { public: - SerialTable(const char *headers[], const int columnWidths[], size_t size) - : headers(headers), columnWidths(columnWidths), size(size) {} + SerialTable(const char *headers[], const int columnWidths[], size_t size, bool doTruncateText = false, bool doReplaceUmlauts = false) + : headers(headers), columnWidths(columnWidths), size(size), doTruncateText(doTruncateText), doReplaceUmlauts(doReplaceUmlauts) {} // Diese Methode gibt den Header an die serielle Schnittstelle aus void printHeader() @@ -36,13 +36,18 @@ public: // Erste Phase: Teile jede Zelle in Zeilen und finde maximale Zeilenzahl for (size_t i = 0; i < size; ++i) { - if (truncateText) + if (doReplaceUmlauts) + replaceUmlauts(t_row[i]); + + safeStringCopy(buffer, t_row[i], sizeof(buffer)); + + if (doTruncateText) { - truncateToColumnWidth(t_row[i], columnWidths[i], buffer); + truncateToColumnWidth(buffer, columnWidths[i], buffer); } else { - splitStringByLength(t_row[i], columnWidths[i], buffer); + splitStringByLength(buffer, columnWidths[i], buffer); } // Zähle Zeilen in dieser Zelle @@ -64,7 +69,17 @@ public: // Gehe durch jede Spalte for (size_t col = 0; col < size; ++col) { - if (truncateText) + if (replaceUmlauts) + { + safeStringCopy(buffer, t_row[col], sizeof(buffer)); + replaceUmlauts(buffer); + } + else + { + safeStringCopy(buffer, t_row[col], sizeof(buffer)); + } + + if (doTruncateText) { truncateToColumnWidth(t_row[col], columnWidths[col], buffer); } @@ -119,16 +134,22 @@ public: return output; } - void setTruncateText(bool value) + void setDoReplaceUmlauts(bool value) + { + doReplaceUmlauts = value; + } + + void setdoTruncateText(bool value) { - truncateText = value; + doTruncateText = value; } -public: // private: +public: // private: //public für UnitTests! const char **headers; const int *columnWidths; size_t size; - bool truncateText = false; + bool doTruncateText = false; + bool doReplaceUmlauts = false; static int displayLength(const char *text) { @@ -260,9 +281,9 @@ public: // private: int len = strlen(input); if (len > width) { - width = (width > 3) ? width - 3 : width; + width = (width > 2) ? width - 2 : width; strncpy(output, input, width); - strcpy(output + width, "..."); + strcpy(output + width, ".."); } else { diff --git a/examples/serialTable/serialTable.ino b/examples/serialTable/serialTable.ino index ac42ae4..0a927d2 100644 --- a/examples/serialTable/serialTable.ino +++ b/examples/serialTable/serialTable.ino @@ -11,7 +11,7 @@ void setup() const char *headers[] = {"Vorname", "Nachname", "Alter", "Stadt", "Beruf", "Unternehmen", "Hobby", "Bemerkung"}; int columnWidths[] = {10, 15, 5, 10, 10, 15, 10, 20}; - SerialTable table(headers, columnWidths, 8); + SerialTable table(headers, columnWidths, 8, true, true); table.printHeader(); // Erstellen von 20 Zeilen mit unterschiedlichen Einträgen -- GitLab