From 46ff5229e13d67341cbee9cb4b8c2eb56cffca2e Mon Sep 17 00:00:00 2001 From: pelgraine <140762863+pelgraine@users.noreply.github.com> Date: Thu, 30 Apr 2026 16:49:25 +1000 Subject: [PATCH] attempted to fix emojisprites override; added beer stein sprite; renamed t-echo card folder --- .../companion_radio/ui-new/Emojisprites.h | 33 ++++++++++++++++--- examples/companion_radio/ui-new/emojipicker.h | 1 + .../TechoCardBoard.cpp | 0 .../TechoCardBoard.h | 0 .../pins_arduino.h | 0 .../platformio.ini | 0 .../target.cpp | 0 .../target.h | 0 .../variant.h | 0 9 files changed, 30 insertions(+), 4 deletions(-) rename variants/{lilygo_techo_card_WIP => lilygo_techo_card}/TechoCardBoard.cpp (100%) rename variants/{lilygo_techo_card_WIP => lilygo_techo_card}/TechoCardBoard.h (100%) rename variants/{lilygo_techo_card_WIP => lilygo_techo_card}/pins_arduino.h (100%) rename variants/{lilygo_techo_card_WIP => lilygo_techo_card}/platformio.ini (100%) rename variants/{lilygo_techo_card_WIP => lilygo_techo_card}/target.cpp (100%) rename variants/{lilygo_techo_card_WIP => lilygo_techo_card}/target.h (100%) rename variants/{lilygo_techo_card_WIP => lilygo_techo_card}/variant.h (100%) diff --git a/examples/companion_radio/ui-new/Emojisprites.h b/examples/companion_radio/ui-new/Emojisprites.h index 8ae28c98..8cbda242 100644 --- a/examples/companion_radio/ui-new/Emojisprites.h +++ b/examples/companion_radio/ui-new/Emojisprites.h @@ -3,7 +3,7 @@ // Emoji sprites for e-ink display - dual size // Large (12x12) for compose/picker, Small (10x10) for channel view // MSB-first, 2 bytes per row -// 76 total emoji: joy/thumbsup/frown first, then 43 original, then 19 new, then 11 newest +// 77 total emoji: joy/thumbsup/frown first, then 43 original, then 19 new, then 11 newest, then 1 latest #include #ifdef ESP32 @@ -15,11 +15,11 @@ #define EMOJI_SM_W 10 #define EMOJI_SM_H 10 -#define EMOJI_COUNT 76 +#define EMOJI_COUNT 77 // Escape codes in 0x80+ range - safe from keyboard ASCII (32-126) #define EMOJI_ESCAPE_START 0x80 -#define EMOJI_ESCAPE_END 0xCB // 0x80 + 75 +#define EMOJI_ESCAPE_END 0xCC // 0x80 + 76 #define EMOJI_PAD_BYTE 0x7F // DEL, not typeable (key < 127 guard) // ======== LARGE 12x12 SPRITES ======== @@ -328,6 +328,10 @@ static const uint8_t emoji_lg_eight_spoked_asterisk[] PROGMEM = { static const uint8_t emoji_lg_signal_strength[] PROGMEM = { 0x00,0x20, 0x00,0x20, 0x00,0xA0, 0x00,0xA0, 0x02,0xA0, 0x02,0xA0, 0x0A,0xA0, 0x0A,0xA0, 0x2A,0xA0, 0x2A,0xA0, 0xAA,0xA0, 0xAA,0xA0, }; +// [76] beer 🍺 +static const uint8_t emoji_lg_beer[] PROGMEM = { + 0x24,0x80, 0x77,0x60, 0xFF,0x80, 0x7F,0xC0, 0x40,0x70, 0x5F,0x50, 0x5F,0x50, 0x5F,0x50, 0x40,0x70, 0x7F,0xC0, 0xFF,0xE0, 0x00,0x00, +}; static const uint8_t* const EMOJI_SPRITES_LG[] PROGMEM = { @@ -354,6 +358,7 @@ static const uint8_t* const EMOJI_SPRITES_LG[] PROGMEM = { emoji_lg_diamond_suit, emoji_lg_spade_suit, emoji_lg_pizza, emoji_lg_four_leaf_clover, emoji_lg_cloud, emoji_lg_rocket, emoji_lg_passport_control, emoji_lg_eight_spoked_asterisk, emoji_lg_signal_strength, + emoji_lg_beer, }; // ======== SMALL 10x10 SPRITES ======== @@ -616,6 +621,10 @@ static const uint8_t emoji_sm_eight_spoked_asterisk[] PROGMEM = { static const uint8_t emoji_sm_signal_strength[] PROGMEM = { 0x00,0x80, 0x00,0x80, 0x02,0x80, 0x02,0x80, 0x0A,0x80, 0x0A,0x80, 0x2A,0x80, 0x2A,0x80, 0xAA,0x80, 0xAA,0x80, }; +// [76] beer 🍺 +static const uint8_t emoji_sm_beer[] PROGMEM = { + 0x54,0x00, 0x6E,0xC0, 0xFF,0x80, 0x80,0xC0, 0xBE,0x80, 0xBE,0x80, 0x80,0xC0, 0xFF,0x80, 0x00,0x00, 0xFF,0x80, +}; static const uint8_t* const EMOJI_SPRITES_SM[] PROGMEM = { // Faces/emotion first @@ -641,6 +650,7 @@ static const uint8_t* const EMOJI_SPRITES_SM[] PROGMEM = { emoji_sm_diamond_suit, emoji_sm_spade_suit, emoji_sm_pizza, emoji_sm_four_leaf_clover, emoji_sm_cloud, emoji_sm_rocket, emoji_sm_passport_control, emoji_sm_eight_spoked_asterisk, emoji_sm_signal_strength, + emoji_sm_beer, }; // ---- Codepoint lookup for UTF-8 conversion ---- @@ -726,6 +736,7 @@ static const EmojiCodepoint EMOJI_CODEPOINTS[EMOJI_COUNT] = { { 0x1F6C2, 0x0000, 0xC9 }, // passport_control { 0x2733, 0x0000, 0xCA }, // eight_spoked_asterisk { 0x1F4F6, 0x0000, 0xCB }, // signal_strength + { 0x1F37A, 0x0000, 0xCC }, // beer }; // ---- Helper functions ---- @@ -769,6 +780,7 @@ static void emojiSanitize(const char* src, char* dst, int dstLen) { int consumed; uint32_t cp = emojiDecodeUtf8(s + si, srcLen - si, &consumed); if (cp == 0xFE0F) { si += consumed; continue; } + if (cp == 0xFFFD) { si += consumed; continue; } // Invalid UTF-8 — skip stray bytes safely bool found = false; for (int e = 0; e < EMOJI_COUNT; e++) { if (EMOJI_CODEPOINTS[e].cp == cp) { @@ -803,7 +815,20 @@ static void emojiSanitize(const char* src, char* dst, int dstLen) { } } } - if (!found) si += consumed; // Skip unknown multi-byte chars + if (!found) { + // Preserve non-emoji UTF-8 (accented letters, Cyrillic, Greek, etc.) by + // copying original bytes through to dst. UTF-8-aware render paths handle + // them downstream. Emoji-escape disambiguation remains unambiguous because + // emoji escapes (0x80-0xCC) only appear standalone — never as a continuation + // byte following a UTF-8 lead byte (0xC2-0xF7), so the decoder can tell them + // apart by tracking lead-byte state. + if (di + consumed < dstLen) { + for (int k = 0; k < consumed; k++) dst[di++] = (char)s[si + k]; + si += consumed; + } else { + break; // Not enough room for full UTF-8 sequence — stop cleanly + } + } } else { dst[di++] = (char)b; si++; diff --git a/examples/companion_radio/ui-new/emojipicker.h b/examples/companion_radio/ui-new/emojipicker.h index 368b3cc3..d05f1f2a 100644 --- a/examples/companion_radio/ui-new/emojipicker.h +++ b/examples/companion_radio/ui-new/emojipicker.h @@ -91,6 +91,7 @@ static const char* EMOJI_LABELS[EMOJI_COUNT] = { "HFC", // 73 passport_control "Star", // 74 eight_spoked_asterisk "Sig", // 75 signal_strength + "Beer", // 76 beer }; struct EmojiPicker { diff --git a/variants/lilygo_techo_card_WIP/TechoCardBoard.cpp b/variants/lilygo_techo_card/TechoCardBoard.cpp similarity index 100% rename from variants/lilygo_techo_card_WIP/TechoCardBoard.cpp rename to variants/lilygo_techo_card/TechoCardBoard.cpp diff --git a/variants/lilygo_techo_card_WIP/TechoCardBoard.h b/variants/lilygo_techo_card/TechoCardBoard.h similarity index 100% rename from variants/lilygo_techo_card_WIP/TechoCardBoard.h rename to variants/lilygo_techo_card/TechoCardBoard.h diff --git a/variants/lilygo_techo_card_WIP/pins_arduino.h b/variants/lilygo_techo_card/pins_arduino.h similarity index 100% rename from variants/lilygo_techo_card_WIP/pins_arduino.h rename to variants/lilygo_techo_card/pins_arduino.h diff --git a/variants/lilygo_techo_card_WIP/platformio.ini b/variants/lilygo_techo_card/platformio.ini similarity index 100% rename from variants/lilygo_techo_card_WIP/platformio.ini rename to variants/lilygo_techo_card/platformio.ini diff --git a/variants/lilygo_techo_card_WIP/target.cpp b/variants/lilygo_techo_card/target.cpp similarity index 100% rename from variants/lilygo_techo_card_WIP/target.cpp rename to variants/lilygo_techo_card/target.cpp diff --git a/variants/lilygo_techo_card_WIP/target.h b/variants/lilygo_techo_card/target.h similarity index 100% rename from variants/lilygo_techo_card_WIP/target.h rename to variants/lilygo_techo_card/target.h diff --git a/variants/lilygo_techo_card_WIP/variant.h b/variants/lilygo_techo_card/variant.h similarity index 100% rename from variants/lilygo_techo_card_WIP/variant.h rename to variants/lilygo_techo_card/variant.h