mirror of
https://github.com/MarekZegare4/MeshCore-Solo.git
synced 2026-07-27 23:38:12 +00:00
refactor(ui): apply code review fixes — bugs, risk, optimisations, cleanup
Fixes 7 bugs (timing UB on unsigned long, abs() no-op, XBM CRC PROGMEM scan, CayenneLPP heap thrash ×2, UTF-8 reply prefix, lock-seq reset on wake), 3 risk items (notif melody stop guard, bot trigger pre-lowercase, lock-seq cleared on display wake), plus optimisations (fmtMsgAge/ getTextWidth caching, RTTTL builder consolidated to NodePrefs, HP_* constants and homePageLabel table moved to NodePrefs, DataStore flat lambda schema, translateUTF8Static factored out) and minor cleanup. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -6,6 +6,8 @@
|
||||
class DisplayDriver {
|
||||
int _w, _h;
|
||||
protected:
|
||||
bool _vw_dirty = true;
|
||||
bool _vw_result = false;
|
||||
DisplayDriver(int w, int h) { _w = w; _h = h; }
|
||||
void setDimensions(int w, int h) { _w = w; _h = h; }
|
||||
public:
|
||||
@@ -151,8 +153,8 @@ public:
|
||||
}
|
||||
}
|
||||
|
||||
// convert UTF-8 to ASCII, transliterating accented/diacritic characters
|
||||
virtual void translateUTF8ToBlocks(char* dest, const char* src, size_t dest_size) {
|
||||
// convert UTF-8 to ASCII, transliterating accented/diacritic characters (callable without a display instance)
|
||||
static void translateUTF8Static(char* dest, const char* src, size_t dest_size) {
|
||||
size_t j = 0;
|
||||
const uint8_t* p = (const uint8_t*)src;
|
||||
while (*p && j < dest_size - 1) {
|
||||
@@ -178,6 +180,10 @@ public:
|
||||
}
|
||||
dest[j] = 0;
|
||||
}
|
||||
|
||||
virtual void translateUTF8ToBlocks(char* dest, const char* src, size_t dest_size) {
|
||||
translateUTF8Static(dest, src, dest_size);
|
||||
}
|
||||
|
||||
// draw text with ellipsis if it exceeds max_width
|
||||
virtual void drawTextEllipsized(int x, int y, int max_width, const char* str) {
|
||||
@@ -194,9 +200,11 @@ public:
|
||||
// for fixed-width fonts (OLED), keep tight spacing to save precious characters
|
||||
const char* ellipsis;
|
||||
// use a simple heuristic: if 'i' and 'l' have different widths, it's variable-width
|
||||
int i_width = getTextWidth("i");
|
||||
int l_width = getTextWidth("l");
|
||||
if (i_width != l_width) {
|
||||
if (_vw_dirty) {
|
||||
_vw_result = (getTextWidth("i") != getTextWidth("l"));
|
||||
_vw_dirty = false;
|
||||
}
|
||||
if (_vw_result) {
|
||||
ellipsis = "... "; // variable-width fonts: add space
|
||||
} else {
|
||||
ellipsis = "..."; // fixed-width fonts: no space
|
||||
|
||||
@@ -80,6 +80,7 @@ void GxEPDDisplay::startFrame(Color bkg) {
|
||||
|
||||
void GxEPDDisplay::setTextSize(int sz) {
|
||||
_text_sz = sz;
|
||||
_vw_dirty = true;
|
||||
display_crc.update<int>(sz);
|
||||
// Size 1 scales with orientation: 1× in portrait (≈OLED width), 2× in landscape.
|
||||
// Size 2 always uses 2× built-in (12×16) — fixed because layout Y-positions are hardcoded.
|
||||
@@ -163,7 +164,7 @@ void GxEPDDisplay::drawXbm(int x, int y, const uint8_t* bits, int w, int h) {
|
||||
display_crc.update<int>(y);
|
||||
display_crc.update<int>(w);
|
||||
display_crc.update<int>(h);
|
||||
display_crc.update<uint8_t>(bits, w * h / 8);
|
||||
display_crc.update<uintptr_t>((uintptr_t)bits);
|
||||
uint16_t widthInBytes = (w + 7) / 8;
|
||||
for (uint16_t by = 0; by < h; by++) {
|
||||
for (uint16_t bx = 0; bx < w; bx++) {
|
||||
|
||||
@@ -82,7 +82,7 @@ public:
|
||||
if (_text_sz == 2) return 16 * sc;
|
||||
return (_use_lemon ? 10 : 8) * sc;
|
||||
}
|
||||
void setLemonFont(bool enabled) override { _use_lemon = enabled; }
|
||||
void setLemonFont(bool enabled) override { _use_lemon = enabled; _vw_dirty = true; }
|
||||
bool isLemonFont() const override { return _use_lemon; }
|
||||
bool begin();
|
||||
|
||||
|
||||
@@ -50,6 +50,7 @@ void SH1106Display::startFrame(Color bkg)
|
||||
void SH1106Display::setTextSize(int sz)
|
||||
{
|
||||
_text_sz = sz;
|
||||
_vw_dirty = true;
|
||||
display.setTextSize(sz);
|
||||
}
|
||||
|
||||
|
||||
@@ -50,7 +50,7 @@ public:
|
||||
uint16_t getTextWidth(const char *str) override;
|
||||
int getCharWidth() const override { return (_use_lemon ? 5 : 6) * _text_sz; }
|
||||
int getLineHeight() const override { return (_use_lemon ? 9 : 8) * _text_sz; }
|
||||
void setLemonFont(bool enabled) override { _use_lemon = enabled; }
|
||||
void setLemonFont(bool enabled) override { _use_lemon = enabled; _vw_dirty = true; }
|
||||
bool isLemonFont() const override { return _use_lemon; }
|
||||
void translateUTF8ToBlocks(char* dest, const char* src, size_t dest_size) override;
|
||||
void setBrightness(uint8_t level) override;
|
||||
|
||||
Reference in New Issue
Block a user