diff --git a/ESPTimeCast_ESP32/ESPTimeCast_ESP32.ino b/ESPTimeCast_ESP32/ESPTimeCast_ESP32.ino index 6ba769d..d330aa6 100644 --- a/ESPTimeCast_ESP32/ESPTimeCast_ESP32.ino +++ b/ESPTimeCast_ESP32/ESPTimeCast_ESP32.ino @@ -392,6 +392,14 @@ void connectWiFi() { // --- IP Display initiation --- pendingIpToShow = WiFi.localIP().toString(); + + // Replace all dots with your custom font code 184 + for (int i = 0; i < pendingIpToShow.length(); i++) { + if (pendingIpToShow[i] == '.') { + pendingIpToShow[i] = 184; + } + } + showingIp = true; ipDisplayCount = 0; // Reset count for IP display P.displayClear(); @@ -1944,11 +1952,11 @@ void loop() { errorAltTimer = millis(); showNtpError = !showNtpError; } - P.print(showNtpError ? F("?/") : F("?*")); + P.print(showNtpError ? F("(<") : F("(*")); } else if (!ntpSyncSuccessful) { - P.print(F("?/")); + P.print(F("(<")); } else if (!weatherAvailable) { - P.print(F("?*")); + P.print(F("(*")); } } // --- DISPLAY CLOCK --- @@ -2024,7 +2032,7 @@ void loop() { } else { P.setCharSpacing(0); P.setTextAlignment(PA_CENTER); - P.print(F("?*")); + P.print(F("(*")); } } yield(); @@ -2321,6 +2329,15 @@ void loop() { if (strlen(countdownLabel) > 0) { label = String(countdownLabel); label.trim(); + + // Replace standard digits 0–9 with your custom font character codes + for (int i = 0; i < label.length(); i++) { + if (isDigit(label[i])) { + int num = label[i] - '0'; // 0–9 + label[i] = 145 + ((num + 9) % 10); // Maps 0→154, 1→145, ... 9→153 + } + } + } else { static const char *fallbackLabels[] = { "PARTY TIME", "SHOWTIME", "CLOCKOUT", "BLASTOFF", @@ -2342,6 +2359,11 @@ void loop() { String fullString = String(buf); + // --- Add a leading space only if showDayOfWeek is true --- + if (showDayOfWeek) { + fullString = " " + fullString; + } + // Display the full string and scroll it P.setTextAlignment(PA_LEFT); P.setCharSpacing(1); @@ -2473,7 +2495,7 @@ void loop() { // Build display text String displayText = ""; - if (isOutdated) displayText += "º"; // add warning first + if (isOutdated) displayText += char(186); // add warning first displayText += String(currentGlucose) + String(arrow); P.setTextAlignment(PA_CENTER); @@ -2486,7 +2508,7 @@ void loop() { } else { P.setTextAlignment(PA_CENTER); P.setCharSpacing(0); - P.print(F("?)")); + P.print(F("())")); delay(2000); advanceDisplayMode(); return; diff --git a/ESPTimeCast_ESP32/data/index.html b/ESPTimeCast_ESP32/data/index.html index 1985d4b..99d6893 100644 --- a/ESPTimeCast_ESP32/data/index.html +++ b/ESPTimeCast_ESP32/data/index.html @@ -616,12 +616,12 @@ textarea::placeholder {
- - -
Only uppercase letters, numbers, space, and : ! ' - . allowed
+ + +
Only uppercase letters, numbers, space, and : ! ' - . ? , _ + % / allowed
@@ -763,11 +763,11 @@ window.onload = function () { countdownLabelInput.addEventListener('input', function() { // Convert to uppercase and remove any characters that are not A-Z or space // Note: The `maxlength` attribute in HTML handles the length limit. - this.value = this.value.toUpperCase().replace(/[^A-Z0-9 :!'.\-]/g, ''); + this.value = this.value.toUpperCase().replace(/[^A-Z0-9 :!'\-.,_\+%\/?]/g, ''); }); // Set initial value for countdownLabel from config.json (apply validation on load too) if (data.countdown && data.countdown.label) { - countdownLabelInput.value = data.countdown.label.toUpperCase().replace(/[^A-Z0-9 :!'.\-]/g, ''); + countdownLabelInput.value = data.countdown.label.toUpperCase().replace(/[^A-Z0-9 :!'\-.,_\+%\/?]/g, ''); } else { countdownLabelInput.value = ''; } @@ -882,7 +882,7 @@ async function submitConfig(event) { // Date and Time inputs are already handled by formData if they have a 'name' attribute // 'countdownDate' and 'countdownTime' are collected automatically // Also apply the same validation for the label when submitting - const finalCountdownLabel = document.getElementById('countdownLabel').value.toUpperCase().replace(/[^A-Z0-9 :!'.\-]/g, ''); + const finalCountdownLabel = document.getElementById('countdownLabel').value.toUpperCase().replace(/[^A-Z0-9 :!'\-.,_\+%\/?]/g, ''); formData.set('countdownLabel', finalCountdownLabel); // --- END NEW --- diff --git a/ESPTimeCast_ESP32/mfactoryfont.h b/ESPTimeCast_ESP32/mfactoryfont.h index e3b3b10..b418c07 100644 --- a/ESPTimeCast_ESP32/mfactoryfont.h +++ b/ESPTimeCast_ESP32/mfactoryfont.h @@ -40,19 +40,19 @@ MD_MAX72XX::fontType_t mFactory[] PROGMEM = 1, 0, // 34 - '""' 13, 63, 192, 127, 192, 63, 0, 250, 0, 255, 9, 1, 0, 250, // 35 - '#' 16, 72, 84, 36, 0, 12, 112, 12, 0, 124, 4, 120, 0, 56, 68, 68, 0, // 36 - '$' - 6, 66, 37, 18, 72, 164, 66, // 37 - '%' + 6, 6, 70, 48, 12, 98, 96, // 37 - '%' 1, 1, // 38 - '&' 1, 6, // 39 - '' - 13, 254, 17, 17, 254, 0, 126, 129, 65, 190, 0, 129, 255, 129, // 40 - '(' + 7, 124, 254, 254, 162, 254, 254, 254, // 40 - '(' 17, 130, 186, 198, 254, 134, 234, 134, 254, 250, 130, 250, 254, 134, 234, 134, 254, 124, // 41 - ')' 20, 250, 130, 250, 254, 130, 170, 186, 254, 130, 250, 226, 250, 134, 254, 130, 234, 234, 246, 254, 124, // 42 - '*' - 1, 0, // 43 - '+' - 3, 64, 0, 0, // 44 - ',' - 2, 8, 8, // 45 - '-' - 1, 128, // 46 - '.' - 15, 130, 246, 238, 130, 254, 250, 130, 250, 254, 130, 234, 234, 246, 254, 124, // 47 - '/' + 5, 8, 8, 62, 8, 8, // 43 - '+' + 1, 192, // 44 - ',' + 2, 8, 8, // 45 - '-' + 1, 64, // 46 - '.' + 3, 96, 24, 6, // 47 - '/' 3, 126, 129, 126, // 48 - '0' - 3, 130, 255, 128, // 49 - '1' + 3, 130, 255, 128, // 49 - '1' 3, 194, 177, 142, // 50 - '2' 3, 66, 137, 118, // 51 - '3' 3, 15, 8, 255, // 52 - '4' @@ -63,10 +63,10 @@ MD_MAX72XX::fontType_t mFactory[] PROGMEM = 3, 78, 145, 126, // 57 - '9' 1, 36, // 58 - ':' 1, 0, // 59 - ';' - 1, 0, // 60 - '<' + 15, 130, 246, 238, 130, 254, 250, 130, 250, 254, 130, 234, 234, 246, 254, 124, // 60 - '<' 9, 254, 17, 17, 254, 0, 255, 17, 17, 14, // 61 - '=' 1, 0, // 62 - '>' - 7, 124, 254, 254, 162, 254, 254, 254, // 63 - '?' + 3, 4, 82, 12, // 63 - '?' 1, 250, // 64 - '@' 3, 124, 10, 124, // 65 - 'A' 3, 126, 74, 52, // 66 - 'B' @@ -98,7 +98,7 @@ MD_MAX72XX::fontType_t mFactory[] PROGMEM = 3, 6, 28, 48, // 92 - '\' 4, 255, 9, 9, 1, // 93 - ']' 1, 8, // 94 - '^' - 3, 32, 32, 32, // 95 - '_' + 2, 64, 64, // 95 - '_' 4, 255, 8, 20, 227, // 96 - '`' 3, 249, 21, 249, // 97 - 'a' 3, 253, 149, 105, // 98 - 'b' @@ -187,7 +187,7 @@ MD_MAX72XX::fontType_t mFactory[] PROGMEM = 7, 68, 36, 20, 254, 20, 36, 68, // 181 - 'µ' 7, 168, 232, 172, 250, 172, 232, 168, // 182 - '¶' 7, 128, 136, 136, 254, 136, 136, 128, // 183 - '·' - 0, // 184 - '¸' + 1, 128, // 184 - '¸' 0, // 185 - '¹' 3, 4, 10, 4, // 186 - 'º' 0, // 187 - '»' @@ -197,17 +197,17 @@ MD_MAX72XX::fontType_t mFactory[] PROGMEM = 0, // 191 - '¿' 0, // 192 - 'À' 0, // 193 - 'Á' - 0, // 194 - 'Â' - 0, // 195 - 'Ã' - 0, // 196 - 'Ä' - 0, // 197 - 'Å' - 0, // 198 - 'Æ' - 0, // 199 - 'Ç' - 0, // 200 - 'È' - 0, // 201 - 'É' - 0, // 202 - 'Ê' - 0, // 203 - 'Ë' - 0, // 204 - 'Ì' + 0, // 194 - 'Â' + 3, 138, 255, 136, // 195 - 'Ã' + 3, 202, 185, 142, // 196 - 'Ä' + 3, 74, 137, 126, // 197 - 'Å' + 3, 15, 8, 255, // 198 - 'Æ' + 3, 79, 137, 121, // 199 - 'Ç' + 3, 126, 137, 122, // 200 - 'È' + 3, 9, 249, 15, // 201 - 'É' + 3, 126, 137, 126, // 202 - 'Ê' + 3, 78, 153, 126, // 203 - 'Ë' + 3, 126, 129, 126, // 204 - 'Ì' 0, // 205 - 'Í' 0, // 206 - 'Î' 0, // 207 - 'Ï' @@ -224,8 +224,8 @@ MD_MAX72XX::fontType_t mFactory[] PROGMEM = 0, // 218 - 'Ú' 0, // 219 - 'Û' 0, // 220 - 'Ü' - 0, // 221 - 'Ý' - 0, // 222 - 'Þ' + 0, // 221 - 'Ý' + 0, // 222 - 'Þ' 0, // 223 - 'ß' 0, // 224 - 'à' 0, // 225 - 'á' @@ -258,5 +258,5 @@ MD_MAX72XX::fontType_t mFactory[] PROGMEM = 0, // 252 - 'ü' 0, // 253 - 'ý' 0, // 254 - 'þ' - 0, // 255 - 'ÿ' + 1, 8, // 255 - 'ÿ' }; diff --git a/ESPTimeCast_ESP8266/ESPTimeCast_ESP8266.ino b/ESPTimeCast_ESP8266/ESPTimeCast_ESP8266.ino index 2a231c9..bb2c6a8 100644 --- a/ESPTimeCast_ESP8266/ESPTimeCast_ESP8266.ino +++ b/ESPTimeCast_ESP8266/ESPTimeCast_ESP8266.ino @@ -394,6 +394,14 @@ void connectWiFi() { // --- IP Display initiation --- pendingIpToShow = WiFi.localIP().toString(); + + // Replace all dots with your custom font code 184 + for (int i = 0; i < pendingIpToShow.length(); i++) { + if (pendingIpToShow[i] == '.') { + pendingIpToShow[i] = 184; + } + } + showingIp = true; ipDisplayCount = 0; // Reset count for IP display P.displayClear(); @@ -1938,11 +1946,11 @@ void loop() { errorAltTimer = millis(); showNtpError = !showNtpError; } - P.print(showNtpError ? F("?/") : F("?*")); + P.print(showNtpError ? F("(<") : F("(*")); } else if (!ntpSyncSuccessful) { - P.print(F("?/")); + P.print(F("(<")); } else if (!weatherAvailable) { - P.print(F("?*")); + P.print(F("(*")); } } // --- DISPLAY CLOCK --- @@ -2016,7 +2024,7 @@ void loop() { } else { P.setCharSpacing(0); P.setTextAlignment(PA_CENTER); - P.print(F("?*")); + P.print(F("(*")); } } yield(); @@ -2311,6 +2319,15 @@ void loop() { if (strlen(countdownLabel) > 0) { label = String(countdownLabel); label.trim(); + + // Replace standard digits 0–9 with your custom font character codes + for (int i = 0; i < label.length(); i++) { + if (isDigit(label[i])) { + int num = label[i] - '0'; // 0–9 + label[i] = 145 + ((num + 9) % 10); // Maps 0→154, 1→145, ... 9→153 + } + } + } else { static const char *fallbackLabels[] = { "PARTY TIME", "SHOWTIME", "CLOCKOUT", "BLASTOFF", @@ -2332,6 +2349,11 @@ void loop() { String fullString = String(buf); + // --- Add a leading space only if showDayOfWeek is true --- + if (showDayOfWeek) { + fullString = " " + fullString; + } + // Display the full string and scroll it P.setTextAlignment(PA_LEFT); P.setCharSpacing(1); @@ -2464,7 +2486,7 @@ void loop() { // Build display text String displayText = ""; - if (isOutdated) displayText += "º"; // add warning first + if (isOutdated) displayText += char(186); // add warning first displayText += String(currentGlucose) + String(arrow); P.setTextAlignment(PA_CENTER); @@ -2477,7 +2499,7 @@ void loop() { } else { P.setTextAlignment(PA_CENTER); P.setCharSpacing(0); - P.print(F("?)")); + P.print(F("())")); delay(2000); advanceDisplayMode(); return; diff --git a/ESPTimeCast_ESP8266/data/index.html b/ESPTimeCast_ESP8266/data/index.html index 1985d4b..99d6893 100644 --- a/ESPTimeCast_ESP8266/data/index.html +++ b/ESPTimeCast_ESP8266/data/index.html @@ -616,12 +616,12 @@ textarea::placeholder {
- - -
Only uppercase letters, numbers, space, and : ! ' - . allowed
+ + +
Only uppercase letters, numbers, space, and : ! ' - . ? , _ + % / allowed
@@ -763,11 +763,11 @@ window.onload = function () { countdownLabelInput.addEventListener('input', function() { // Convert to uppercase and remove any characters that are not A-Z or space // Note: The `maxlength` attribute in HTML handles the length limit. - this.value = this.value.toUpperCase().replace(/[^A-Z0-9 :!'.\-]/g, ''); + this.value = this.value.toUpperCase().replace(/[^A-Z0-9 :!'\-.,_\+%\/?]/g, ''); }); // Set initial value for countdownLabel from config.json (apply validation on load too) if (data.countdown && data.countdown.label) { - countdownLabelInput.value = data.countdown.label.toUpperCase().replace(/[^A-Z0-9 :!'.\-]/g, ''); + countdownLabelInput.value = data.countdown.label.toUpperCase().replace(/[^A-Z0-9 :!'\-.,_\+%\/?]/g, ''); } else { countdownLabelInput.value = ''; } @@ -882,7 +882,7 @@ async function submitConfig(event) { // Date and Time inputs are already handled by formData if they have a 'name' attribute // 'countdownDate' and 'countdownTime' are collected automatically // Also apply the same validation for the label when submitting - const finalCountdownLabel = document.getElementById('countdownLabel').value.toUpperCase().replace(/[^A-Z0-9 :!'.\-]/g, ''); + const finalCountdownLabel = document.getElementById('countdownLabel').value.toUpperCase().replace(/[^A-Z0-9 :!'\-.,_\+%\/?]/g, ''); formData.set('countdownLabel', finalCountdownLabel); // --- END NEW --- diff --git a/ESPTimeCast_ESP8266/mfactoryfont.h b/ESPTimeCast_ESP8266/mfactoryfont.h index e3b3b10..11ad9d9 100644 --- a/ESPTimeCast_ESP8266/mfactoryfont.h +++ b/ESPTimeCast_ESP8266/mfactoryfont.h @@ -40,19 +40,19 @@ MD_MAX72XX::fontType_t mFactory[] PROGMEM = 1, 0, // 34 - '""' 13, 63, 192, 127, 192, 63, 0, 250, 0, 255, 9, 1, 0, 250, // 35 - '#' 16, 72, 84, 36, 0, 12, 112, 12, 0, 124, 4, 120, 0, 56, 68, 68, 0, // 36 - '$' - 6, 66, 37, 18, 72, 164, 66, // 37 - '%' + 6, 6, 70, 48, 12, 98, 96, // 37 - '%' 1, 1, // 38 - '&' 1, 6, // 39 - '' - 13, 254, 17, 17, 254, 0, 126, 129, 65, 190, 0, 129, 255, 129, // 40 - '(' + 7, 124, 254, 254, 162, 254, 254, 254, // 40 - '(' 17, 130, 186, 198, 254, 134, 234, 134, 254, 250, 130, 250, 254, 134, 234, 134, 254, 124, // 41 - ')' 20, 250, 130, 250, 254, 130, 170, 186, 254, 130, 250, 226, 250, 134, 254, 130, 234, 234, 246, 254, 124, // 42 - '*' - 1, 0, // 43 - '+' - 3, 64, 0, 0, // 44 - ',' - 2, 8, 8, // 45 - '-' - 1, 128, // 46 - '.' - 15, 130, 246, 238, 130, 254, 250, 130, 250, 254, 130, 234, 234, 246, 254, 124, // 47 - '/' + 5, 8, 8, 62, 8, 8, // 43 - '+' + 1, 192, // 44 - ',' + 2, 8, 8, // 45 - '-' + 1, 64, // 46 - '.' + 3, 96, 24, 6, // 47 - '/' 3, 126, 129, 126, // 48 - '0' - 3, 130, 255, 128, // 49 - '1' + 3, 130, 255, 128, // 49 - '1' 3, 194, 177, 142, // 50 - '2' 3, 66, 137, 118, // 51 - '3' 3, 15, 8, 255, // 52 - '4' @@ -63,10 +63,10 @@ MD_MAX72XX::fontType_t mFactory[] PROGMEM = 3, 78, 145, 126, // 57 - '9' 1, 36, // 58 - ':' 1, 0, // 59 - ';' - 1, 0, // 60 - '<' + 15, 130, 246, 238, 130, 254, 250, 130, 250, 254, 130, 234, 234, 246, 254, 124, // 60 - '<' 9, 254, 17, 17, 254, 0, 255, 17, 17, 14, // 61 - '=' 1, 0, // 62 - '>' - 7, 124, 254, 254, 162, 254, 254, 254, // 63 - '?' + 3, 4, 82, 12, // 63 - '?' 1, 250, // 64 - '@' 3, 124, 10, 124, // 65 - 'A' 3, 126, 74, 52, // 66 - 'B' @@ -98,7 +98,7 @@ MD_MAX72XX::fontType_t mFactory[] PROGMEM = 3, 6, 28, 48, // 92 - '\' 4, 255, 9, 9, 1, // 93 - ']' 1, 8, // 94 - '^' - 3, 32, 32, 32, // 95 - '_' + 2, 64, 64, // 95 - '_' 4, 255, 8, 20, 227, // 96 - '`' 3, 249, 21, 249, // 97 - 'a' 3, 253, 149, 105, // 98 - 'b' @@ -187,7 +187,7 @@ MD_MAX72XX::fontType_t mFactory[] PROGMEM = 7, 68, 36, 20, 254, 20, 36, 68, // 181 - 'µ' 7, 168, 232, 172, 250, 172, 232, 168, // 182 - '¶' 7, 128, 136, 136, 254, 136, 136, 128, // 183 - '·' - 0, // 184 - '¸' + 1, 128, // 184 - '¸' 0, // 185 - '¹' 3, 4, 10, 4, // 186 - 'º' 0, // 187 - '»' @@ -197,17 +197,17 @@ MD_MAX72XX::fontType_t mFactory[] PROGMEM = 0, // 191 - '¿' 0, // 192 - 'À' 0, // 193 - 'Á' - 0, // 194 - 'Â' - 0, // 195 - 'Ã' - 0, // 196 - 'Ä' - 0, // 197 - 'Å' - 0, // 198 - 'Æ' - 0, // 199 - 'Ç' - 0, // 200 - 'È' - 0, // 201 - 'É' - 0, // 202 - 'Ê' - 0, // 203 - 'Ë' - 0, // 204 - 'Ì' + 0, // 194 - 'Â' + 3, 138, 255, 136, // 195 - 'Ã' + 3, 202, 185, 142, // 196 - 'Ä' + 3, 74, 137, 126, // 197 - 'Å' + 3, 15, 8, 255, // 198 - 'Æ' + 3, 79, 137, 121, // 199 - 'Ç' + 3, 126, 137, 122, // 200 - 'È' + 3, 9, 249, 15, // 201 - 'É' + 3, 126, 137, 126, // 202 - 'Ê' + 3, 78, 153, 126, // 203 - 'Ë' + 3, 126, 129, 126, // 204 - 'Ì' 0, // 205 - 'Í' 0, // 206 - 'Î' 0, // 207 - 'Ï' @@ -224,8 +224,8 @@ MD_MAX72XX::fontType_t mFactory[] PROGMEM = 0, // 218 - 'Ú' 0, // 219 - 'Û' 0, // 220 - 'Ü' - 0, // 221 - 'Ý' - 0, // 222 - 'Þ' + 0, // 221 - 'Ý' + 0, // 222 - 'Þ' 0, // 223 - 'ß' 0, // 224 - 'à' 0, // 225 - 'á' @@ -258,5 +258,5 @@ MD_MAX72XX::fontType_t mFactory[] PROGMEM = 0, // 252 - 'ü' 0, // 253 - 'ý' 0, // 254 - 'þ' - 0, // 255 - 'ÿ' + 1, 8, // 255 - 'ÿ' };