Skip to content

Commit 64f3fd7

Browse files
showfonts: simplify
1 parent b51ad7d commit 64f3fd7

2 files changed

Lines changed: 82 additions & 20 deletions

File tree

internal_filesystem/apps/com.micropythonos.showfonts/assets/showfonts.py

Lines changed: 78 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,21 @@
11
from mpos import Activity
22
import lvgl as lv
3+
import os
34

4-
CP_FROWNING_FACE = 0x2639 # ☹
5-
CP_HEAVY_BLACK_HEART = 0x2764 # ❤️
6-
CP_WHITE_SMILING_FACE = 0x263A # ☺
7-
CP_SLIGHTLY_SMILING_FACE = 0x1F642 # 🙂
8-
CP_GRINNING_FACE = 0x1F600 # 😀
9-
CP_STAR_EYES = 0x1F929 # 🤩
105
CP_VARIATION_SELECTOR_TEXT = 0xFE0E
116
CP_VARIATION_SELECTOR_EMOJI = 0xFE0F
127

13-
# Ideally, just list the files in EMOJI_PNG_PATH to know which emojis that are supported
14-
EMOJI_PNG_PATH = "M:apps/com.micropythonos.showfonts/assets/openmoji-72x72-color/"
15-
EMOJI_PNG_2639 = "2639.png"
16-
EMOJI_PNG_263A = "263A.png"
17-
EMOJI_PNG_1F600 = "1F600.png"
18-
EMOJI_PNG_1F929 = "1F929.png"
8+
EMOJI_PNG_DIR = "openmoji-72x72-color"
9+
EMOJI_PNG_SRC_PREFIX = "M:apps/com.micropythonos.showfonts/assets/openmoji-72x72-color/"
10+
EMOJI_PNG_DIR_CANDIDATES = (
11+
EMOJI_PNG_DIR,
12+
"./" + EMOJI_PNG_DIR,
13+
"assets/" + EMOJI_PNG_DIR,
14+
"apps/com.micropythonos.showfonts/assets/" + EMOJI_PNG_DIR,
15+
"/apps/com.micropythonos.showfonts/assets/" + EMOJI_PNG_DIR,
16+
"M:apps/com.micropythonos.showfonts/assets/" + EMOJI_PNG_DIR,
17+
)
18+
UNKNOWN_EMOJI_LOG_THRESHOLD = 0x2300
1919

2020

2121
class ShowFonts(Activity):
@@ -32,6 +32,7 @@ def onCreate(self):
3232
self._imgfont_scaled_src_cache = {}
3333
self._imgfont_source_size_cache = {}
3434
self._imgfont_empty_src_cache = {}
35+
self._unknown_emoji_codepoints_logged = {}
3536
self._init_imagefont()
3637
self._init_ttf_font()
3738

@@ -149,21 +150,67 @@ def addAllGlyphs(self, screen, start_y):
149150
screen.set_height(y + 20)
150151

151152
def _init_imagefont(self):
152-
self._emoji_map = {
153-
CP_FROWNING_FACE: EMOJI_PNG_PATH + EMOJI_PNG_2639,
154-
CP_WHITE_SMILING_FACE: EMOJI_PNG_PATH + EMOJI_PNG_263A,
155-
CP_HEAVY_BLACK_HEART : EMOJI_PNG_PATH + "2764.png", # ❤️
156-
CP_STAR_EYES : EMOJI_PNG_PATH + EMOJI_PNG_1F929,
157-
CP_SLIGHTLY_SMILING_FACE: EMOJI_PNG_PATH + EMOJI_PNG_263A,
158-
CP_GRINNING_FACE: EMOJI_PNG_PATH + EMOJI_PNG_1F600,
159-
}
153+
self._emoji_map = self._build_emoji_map_from_png_dir()
160154
self._emoji_font_big = lv.imgfont_create(72, self._imgfont_path_cb, None)
161155
self._emoji_font_big.fallback = lv.font_montserrat_28
162156
self._emoji_font = lv.imgfont_create(36, self._imgfont_path_cb, None)
163157
self._emoji_font.fallback = lv.font_montserrat_28
164158
self._emoji_font_small = lv.imgfont_create(18, self._imgfont_path_cb, None)
165159
self._emoji_font_small.fallback = lv.font_montserrat_16
166160

161+
def _build_emoji_map_from_png_dir(self):
162+
emoji_map = {}
163+
dir_path = None
164+
entries = None
165+
for candidate in EMOJI_PNG_DIR_CANDIDATES:
166+
entries = self._list_dir_names(candidate)
167+
if entries is not None:
168+
dir_path = candidate
169+
break
170+
171+
if entries is None:
172+
print("showfonts: could not list emoji dir candidates (cwd=" + self._safe_getcwd() + ")")
173+
return emoji_map
174+
175+
for name in entries:
176+
if not name.lower().endswith(".png"):
177+
continue
178+
179+
codepoint_hex = name[:-4]
180+
try:
181+
codepoint = int(codepoint_hex, 16)
182+
except Exception:
183+
print("showfonts: skip non-hex emoji file: " + name)
184+
continue
185+
186+
emoji_map[codepoint] = EMOJI_PNG_SRC_PREFIX + name
187+
188+
print("showfonts: loaded " + str(len(emoji_map)) + " emoji png mappings from " + dir_path)
189+
return emoji_map
190+
191+
def _list_dir_names(self, path):
192+
try:
193+
names = []
194+
for entry in os.ilistdir(path):
195+
if isinstance(entry, tuple):
196+
names.append(entry[0])
197+
else:
198+
names.append(entry)
199+
return names
200+
except Exception:
201+
pass
202+
203+
try:
204+
return os.listdir(path)
205+
except Exception:
206+
return None
207+
208+
def _safe_getcwd(self):
209+
try:
210+
return os.getcwd()
211+
except Exception:
212+
return "?"
213+
167214
def _normalize_emoji_text(self, text):
168215
text = text.replace(chr(CP_VARIATION_SELECTOR_TEXT), "")
169216
text = text.replace(chr(CP_VARIATION_SELECTOR_EMOJI), "")
@@ -186,8 +233,19 @@ def _imgfont_path_cb(self, font, unicode_cp, unicode_next, offset_y, user_data):
186233
src = self._emoji_map[unicode_cp]
187234
target_height = self._font_pixel_height(font)
188235
return self._get_scaled_imgfont_src(src, target_height)
236+
237+
self._log_unknown_emoji_codepoint(unicode_cp)
189238
return None
190239

240+
def _log_unknown_emoji_codepoint(self, unicode_cp):
241+
if unicode_cp < UNKNOWN_EMOJI_LOG_THRESHOLD:
242+
return
243+
if unicode_cp in self._unknown_emoji_codepoints_logged:
244+
return
245+
246+
self._unknown_emoji_codepoints_logged[unicode_cp] = True
247+
print("showfonts: unknown emoji codepoint 0x{:X}".format(unicode_cp))
248+
191249
def _get_empty_imgfont_src(self, target_height):
192250
target_height = max(1, int(target_height))
193251
if target_height in self._imgfont_empty_src_cache:

internal_filesystem/lib/mpos/board/fri3d_2026.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -334,6 +334,10 @@ def keypad_read_cb(indev, data):
334334
from mpos import SensorManager
335335
SensorManager.init(i2c_bus, address=0x6A, mounted_position=SensorManager.FACING_EARTH) # IMU (LSM6DSOTR-C / LSM6DSO)
336336

337+
print("Disabling UART REPL because it receives data from the Communicator Add-On. Use esp.uart_repl(True) to re-enable.")
338+
import esp
339+
esp.uart_repl(False)
340+
337341
# === STARTUP "WOW" EFFECT ===
338342
import _thread
339343

0 commit comments

Comments
 (0)