From ae48cbc798a4553ff6351815da357931052537da Mon Sep 17 00:00:00 2001 From: gerritdevriese <1899386+gerritdevriese@users.noreply.github.com> Date: Wed, 28 May 2025 17:41:06 +0200 Subject: [PATCH 1/3] Add TIME_MODE 7 and 8 --- src/Apps.cpp | 31 +++++++++++++++++++++++++++++-- 1 file changed, 29 insertions(+), 2 deletions(-) diff --git a/src/Apps.cpp b/src/Apps.cpp index 378915e7..0725e325 100644 --- a/src/Apps.cpp +++ b/src/Apps.cpp @@ -235,7 +235,7 @@ void TimeApp(FastLED_NeoMatrix *matrix, MatrixDisplayUiState *state, int16_t x, int16_t wdPosY; int16_t timePosY; - if (TIME_MODE == 2 || TIME_MODE == 4) + if (TIME_MODE == 2 || TIME_MODE == 4 || TIME_MODE == 8) { // week days on top line wdPosY = 0; @@ -252,7 +252,7 @@ void TimeApp(FastLED_NeoMatrix *matrix, MatrixDisplayUiState *state, int16_t x, DisplayManager.printText(12 + x, timePosY + y, t, TIME_MODE == 0, 2); // day of month in calendar box - if (TIME_MODE > 0) + if (TIME_MODE > 0 && TIME_MODE < 7) { int offset; char day_str[3]; @@ -280,6 +280,33 @@ void TimeApp(FastLED_NeoMatrix *matrix, MatrixDisplayUiState *state, int16_t x, DisplayManager.matrixPrint(day_str); } + // draw clock icon + if (TIME_MODE == 7 || TIME_MODE == 8) + { + // use time.gif if available, otherwise use default clock icon + static File TIME_ICON_GIF; + static bool TIME_ICON_ISGIF = false; + static uint16_t TIME_ICON_CURRENTFRAME = 0; + if (!TIME_ICON_ISGIF) + { + if (LittleFS.exists("/time.gif")) + { + TIME_ICON_GIF = LittleFS.open("/time.gif"); + TIME_ICON_ISGIF = true; + TIME_ICON_CURRENTFRAME = 0; + } + } + if (TIME_ICON_ISGIF) + { + gifPlayer->playGif(x, y, &TIME_ICON_GIF, TIME_ICON_CURRENTFRAME); + TIME_ICON_CURRENTFRAME = gifPlayer->getFrame(); + } + else + { + matrix->drawRGBBitmap(x, y, icon_13, 8, 8); // default clock icon + } + } + if (!SHOW_WEEKDAY) return; From 7b83ca72ce642407d7696069e5bd9a383ab76c6c Mon Sep 17 00:00:00 2001 From: gerritdevriese <1899386+gerritdevriese@users.noreply.github.com> Date: Wed, 28 May 2025 18:21:53 +0200 Subject: [PATCH 2/3] Draw icon before drawing time --- src/Apps.cpp | 54 ++++++++++++++++++++++++++-------------------------- 1 file changed, 27 insertions(+), 27 deletions(-) diff --git a/src/Apps.cpp b/src/Apps.cpp index 0725e325..6abaef9e 100644 --- a/src/Apps.cpp +++ b/src/Apps.cpp @@ -203,6 +203,33 @@ void TimeApp(FastLED_NeoMatrix *matrix, MatrixDisplayUiState *state, int16_t x, return; } + // draw clock icon + if (TIME_MODE == 7 || TIME_MODE == 8) + { + // use time.gif if available, otherwise use default clock icon + static File TIME_ICON_GIF; + static bool TIME_ICON_ISGIF = false; + static uint16_t TIME_ICON_CURRENTFRAME = 0; + if (!TIME_ICON_ISGIF) + { + if (LittleFS.exists("/time.gif")) + { + TIME_ICON_GIF = LittleFS.open("/time.gif"); + TIME_ICON_ISGIF = true; + TIME_ICON_CURRENTFRAME = 0; + } + } + if (TIME_ICON_ISGIF) + { + gifPlayer->playGif(x, y, &TIME_ICON_GIF, TIME_ICON_CURRENTFRAME); + TIME_ICON_CURRENTFRAME = gifPlayer->getFrame(); + } + else + { + matrix->drawRGBBitmap(x, y, icon_13, 8, 8); // default clock icon + } + } + if (TIME_COLOR > 0) { DisplayManager.setTextColor(TIME_COLOR); @@ -280,33 +307,6 @@ void TimeApp(FastLED_NeoMatrix *matrix, MatrixDisplayUiState *state, int16_t x, DisplayManager.matrixPrint(day_str); } - // draw clock icon - if (TIME_MODE == 7 || TIME_MODE == 8) - { - // use time.gif if available, otherwise use default clock icon - static File TIME_ICON_GIF; - static bool TIME_ICON_ISGIF = false; - static uint16_t TIME_ICON_CURRENTFRAME = 0; - if (!TIME_ICON_ISGIF) - { - if (LittleFS.exists("/time.gif")) - { - TIME_ICON_GIF = LittleFS.open("/time.gif"); - TIME_ICON_ISGIF = true; - TIME_ICON_CURRENTFRAME = 0; - } - } - if (TIME_ICON_ISGIF) - { - gifPlayer->playGif(x, y, &TIME_ICON_GIF, TIME_ICON_CURRENTFRAME); - TIME_ICON_CURRENTFRAME = gifPlayer->getFrame(); - } - else - { - matrix->drawRGBBitmap(x, y, icon_13, 8, 8); // default clock icon - } - } - if (!SHOW_WEEKDAY) return; From 502be552775c2dd1b06b55b2b30de72abf84ba90 Mon Sep 17 00:00:00 2001 From: gerritdevriese <1899386+gerritdevriese@users.noreply.github.com> Date: Thu, 29 May 2025 14:15:41 +0200 Subject: [PATCH 3/3] Add new TMODES to documentation --- docs/api.md | 2 +- docs/apps.md | 12 ++++++++++++ docs/assets/TMODE7.png | Bin 0 -> 12088 bytes docs/assets/TMODE8.png | Bin 0 -> 12046 bytes 4 files changed, 13 insertions(+), 1 deletion(-) create mode 100644 docs/assets/TMODE7.png create mode 100644 docs/assets/TMODE8.png diff --git a/docs/api.md b/docs/api.md index 9556a83f..11666cba 100644 --- a/docs/api.md +++ b/docs/api.md @@ -376,7 +376,7 @@ You can adjust each property in the JSON object according to your preferences. I | `TEFF` | number | Choose between app transition effects. | 0–10 | 1 | | `TSPEED` | number | Time taken for the transition to the next app in milliseconds. | Positive integer | 500 | | `TCOL` | string/array of ints | Global text color. | RGB array or hex color | N/A | -| `TMODE` | integer | Changes the time app style. | 0–6 | 1 | +| `TMODE` | integer | Changes the time app style. | 0–8 | 1 | | `CHCOL` | string/array of ints | Calendar header color of the time app. | RGB array or hex color |`#FF0000`| | `CBCOL` | string/array of ints | Calendar body color of the time app. | RGB array or hex color |`#FFFFFF`| | `CTCOL` | string/array of ints | Calendar text color in the time app. | RGB array or hex color |`#000000` | diff --git a/docs/apps.md b/docs/apps.md index db4f650a..50dc5bd4 100644 --- a/docs/apps.md +++ b/docs/apps.md @@ -45,6 +45,18 @@ The top row shows the hour, the middle row shows the minutes, and the bottom row Each row has six dots, where lit dots represent binary "1" and white dots represent binary "0". To read the time, convert the lit dots in each row to a decimal number. +**TMODE=7** + +Adds an icon to the left side of the time display. +If a GIF named `time.gif` exists in the root directory, it will be used instead of the default clock icon. +Both 8X8 and 32X8 GIFs are supported. +If the weekday bar is enabled, it will be displayed at the bottom of the screen. + +**TMODE=8** + +Same as `TMODE=7`, but moves the weekday bar to the top of the screen. + + #### **Available Time Formats:** | Format | Example | Description | |--------------|------------|--------------------------------------------| diff --git a/docs/assets/TMODE7.png b/docs/assets/TMODE7.png new file mode 100644 index 0000000000000000000000000000000000000000..3159364d5936f8c68deccf477be85b98e5befa3d GIT binary patch literal 12088 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 literal 0 HcmV?d00001 diff --git a/docs/assets/TMODE8.png b/docs/assets/TMODE8.png new file mode 100644 index 0000000000000000000000000000000000000000..7e1786c8108b4c7ba3194d0b14b6f2ddddb4002b GIT binary patch literal 12046 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

lxg+)&TkI(`bdC6bf+{G} literal 0 HcmV?d00001