From 7636528161e251e6748a3c8aa86e340927ec4018 Mon Sep 17 00:00:00 2001 From: Roman Terekhov Date: Wed, 7 Oct 2026 10:03:38 +0300 Subject: [PATCH] =?UTF-8?q?=D1=82=D0=B5=D0=BC=D1=8B=20ST7735:=20=D1=8F?= =?UTF-8?q?=D0=BD=D1=82=D0=B0=D1=80=D1=8C=20=D0=B4=D0=BB=D1=8F=20T096,=20?= =?UTF-8?q?=D0=BE=D1=84=D0=B8=D1=86=D0=B8=D0=B0=D0=BB=D1=8C=D0=BD=D0=B0?= =?UTF-8?q?=D1=8F=20=D1=81=D1=85=D0=B5=D0=BC=D0=B0=20=D0=B4=D0=BB=D1=8F=20?= =?UTF-8?q?=D1=82=D1=80=D0=B5=D0=BA=D0=B5=D1=80=D0=BE=D0=B2,=20=D0=BF?= =?UTF-8?q?=D1=80=D0=B0=D0=B2=D0=BA=D0=B0=20=D0=B8=D0=BD=D0=B4=D0=B8=D0=BA?= =?UTF-8?q?=D0=B0=D1=82=D0=BE=D1=80=D0=B0=20=D1=81=D1=82=D1=80=D0=B0=D0=BD?= =?UTF-8?q?=D0=B8=D1=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- examples/companion_radio/ui-new/UITask.cpp | 11 +-- src/helpers/ui/ST7735Display.cpp | 103 +++++++++++++++++++-- src/helpers/ui/ST7735Display.h | 6 ++ variants/heltec_t096/platformio.ini | 6 ++ 4 files changed, 110 insertions(+), 16 deletions(-) diff --git a/examples/companion_radio/ui-new/UITask.cpp b/examples/companion_radio/ui-new/UITask.cpp index 6bce068a..540b6ab3 100644 --- a/examples/companion_radio/ui-new/UITask.cpp +++ b/examples/companion_radio/ui-new/UITask.cpp @@ -208,18 +208,17 @@ public: // battery voltage renderBatteryIndicator(display, _task->getBattMilliVolts()); - // curr page indicator - if (UIColor::title_bkg == UIColor::window_bkg) { - display.setColor(UIColor::title_txt); - } else { - display.setColor(UIColor::title_bkg); - } + // curr page indicator: активная точка — акцентным цветом, остальные — вторичным. + // Раньше неактивные точки красились в title_bkg, и на тёмных палитрах + // (тёмная полоса на тёмном фоне) индикатор становился неразличим. int y = 14; int x = display.width() / 2 - 5 * (HomePage::Count-1); for (uint8_t i = 0; i < HomePage::Count; i++, x += 10) { if (i == _page) { + display.setColor(UIColor::warning_txt); display.fillRect(x-1, y-1, 4, 4); } else { + display.setColor(UIColor::secondary_txt); display.fillRect(x, y, 2, 2); } } diff --git a/src/helpers/ui/ST7735Display.cpp b/src/helpers/ui/ST7735Display.cpp index 14c4bb84..13dde16f 100644 --- a/src/helpers/ui/ST7735Display.cpp +++ b/src/helpers/ui/ST7735Display.cpp @@ -421,15 +421,98 @@ bool ST7735Display::i2c_probe(TwoWire& wire, uint8_t addr) { #endif // Color scheme -ColorVal UIColor::window_bkg = ST77XX_BLACK; -ColorVal UIColor::title_bkg = ST77XX_BLUE; -ColorVal UIColor::title_txt = ST77XX_WHITE; -ColorVal UIColor::primary_txt = ST77XX_WHITE; -ColorVal UIColor::secondary_txt = (18 << 11) | (36 << 5) | 18; // mid-gray -ColorVal UIColor::warning_txt = ST77XX_ORANGE; -ColorVal UIColor::popup_bkg = ST77XX_CYAN; -ColorVal UIColor::popup_txt = ST77XX_WHITE; -ColorVal UIColor::corp_blue = 0x001A; +// +// Тема по умолчанию зависит от платы: +// - Heltec T096 — AMBER (графит + янтарь); +// - остальные платы на этом драйвере (heltec_t1 / tracker / tracker_v2) — +// официальная схема MeshCore, её же можно включить явно: ST7735_THEME_CLASSIC. +// Любую тему можно включить на любой плате флагом ST7735_THEME_* в platformio.ini +// варианта (см. variants/heltec_t096). +// +// Тема CLASSIC взята из upstream: github.com/meshcore-dev/MeshCore, ветка main, +// src/helpers/ui/ST7735Display.cpp. Это светлая схема: белый фон, чёрный текст. +// В форке она была перекрашена в тёмную вручную, здесь восстановлен оригинал. + +#if (defined(ST7735_THEME_CLASSIC) + defined(ST7735_THEME_AMBER) + defined(ST7735_THEME_TEAL) + defined(ST7735_THEME_SIGNAL) + defined(ST7735_THEME_NEON)) > 1 + #error "ST7735Display: выбрана более чем одна тема ST7735_THEME_*" +#endif + +#define MC_CLASSIC_WINDOW_BKG ST77XX_WHITE +#define MC_CLASSIC_TITLE_BKG ST77XX_BLUE +#define MC_CLASSIC_TITLE_TXT ST77XX_WHITE +#define MC_CLASSIC_PRIMARY_TXT ST77XX_BLACK +#define MC_CLASSIC_SECONDARY_TXT ((18 << 11) | (36 << 5) | 18) // mid-gray +#define MC_CLASSIC_WARNING_TXT ST77XX_ORANGE +#define MC_CLASSIC_POPUP_BKG ST77XX_CYAN +#define MC_CLASSIC_POPUP_TXT ST77XX_BLACK +#define MC_CLASSIC_CORP_BLUE 0x001A + +#if defined(ST7735_THEME_CLASSIC) // официальная схема MeshCore (светлая) + ColorVal UIColor::window_bkg = MC_CLASSIC_WINDOW_BKG; + ColorVal UIColor::title_bkg = MC_CLASSIC_TITLE_BKG; + ColorVal UIColor::title_txt = MC_CLASSIC_TITLE_TXT; + ColorVal UIColor::primary_txt = MC_CLASSIC_PRIMARY_TXT; + ColorVal UIColor::secondary_txt = MC_CLASSIC_SECONDARY_TXT; + ColorVal UIColor::warning_txt = MC_CLASSIC_WARNING_TXT; + ColorVal UIColor::popup_bkg = MC_CLASSIC_POPUP_BKG; + ColorVal UIColor::popup_txt = MC_CLASSIC_POPUP_TXT; + ColorVal UIColor::corp_blue = MC_CLASSIC_CORP_BLUE; + +#elif defined(ST7735_THEME_TEAL) // B. ночная бирюза + ColorVal UIColor::window_bkg = 0x0883; // #081018 + ColorVal UIColor::title_bkg = 0x1187; // #103038 + ColorVal UIColor::title_txt = 0xEFDF; // #E8F8F8 + ColorVal UIColor::primary_txt = 0xF7DF; // #F0F8F8 + ColorVal UIColor::secondary_txt = 0x8515; // #80A0A8 + ColorVal UIColor::warning_txt = 0xFE4A; // #FFC850 + ColorVal UIColor::popup_bkg = 0x1696; // #10D0B0 + ColorVal UIColor::popup_txt = 0x0881; // #081008 + ColorVal UIColor::corp_blue = 0x45DF; // #40B8F8 + +#elif defined(ST7735_THEME_SIGNAL) // C. чёрный + оранжевый сигнал + ColorVal UIColor::window_bkg = 0x0000; // #000000 + ColorVal UIColor::title_bkg = 0xEB07; // #E86038 + ColorVal UIColor::title_txt = 0x1082; // #101010 + ColorVal UIColor::primary_txt = 0xFFDF; // #F8F8F8 + ColorVal UIColor::secondary_txt = 0x9D15; // #98A0A8 + ColorVal UIColor::warning_txt = 0xFE8C; // #FFD060 + ColorVal UIColor::popup_bkg = 0xFB46; // #FF6830 + ColorVal UIColor::popup_txt = 0x1082; // #101010 + ColorVal UIColor::corp_blue = 0x5D5F; // #58A8FF + +#elif defined(ST7735_THEME_NEON) // D. неон на чёрном + ColorVal UIColor::window_bkg = 0x0000; // #000000 + ColorVal UIColor::title_bkg = 0x0000; // #000000 (полоса слита с фоном) + ColorVal UIColor::title_txt = 0xEF5D; // #E8E8E8 + ColorVal UIColor::primary_txt = 0xFFFF; // #FFFFFF + ColorVal UIColor::secondary_txt = 0x8C52; // #888890 + ColorVal UIColor::warning_txt = 0xFEA0; // #FFD400 + ColorVal UIColor::popup_bkg = 0x18C3; // #181818 + ColorVal UIColor::popup_txt = 0xFEA0; // #FFD400 (рамка и текст) + ColorVal UIColor::corp_blue = 0x555F; // #50A8FF + +#elif defined(ST7735_THEME_AMBER) || defined(HELTEC_T096) // A. графит + янтарь (по умолчанию для T096) + ColorVal UIColor::window_bkg = 0x1082; // #101010 + ColorVal UIColor::title_bkg = 0x2146; // #202830 + ColorVal UIColor::title_txt = 0xF79E; // #F0F0F0 + ColorVal UIColor::primary_txt = 0xFFDF; // #F8F8F8 + ColorVal UIColor::secondary_txt = 0x9493; // #909098 + ColorVal UIColor::warning_txt = 0xFD84; // #FFB020 + ColorVal UIColor::popup_bkg = 0xFD84; // #FFB020 + ColorVal UIColor::popup_txt = 0x10A3; // #101418 + ColorVal UIColor::corp_blue = 0x551F; // #50A0FF + +#else // остальные платы: официальная схема MeshCore + ColorVal UIColor::window_bkg = MC_CLASSIC_WINDOW_BKG; + ColorVal UIColor::title_bkg = MC_CLASSIC_TITLE_BKG; + ColorVal UIColor::title_txt = MC_CLASSIC_TITLE_TXT; + ColorVal UIColor::primary_txt = MC_CLASSIC_PRIMARY_TXT; + ColorVal UIColor::secondary_txt = MC_CLASSIC_SECONDARY_TXT; + ColorVal UIColor::warning_txt = MC_CLASSIC_WARNING_TXT; + ColorVal UIColor::popup_bkg = MC_CLASSIC_POPUP_BKG; + ColorVal UIColor::popup_txt = MC_CLASSIC_POPUP_TXT; + ColorVal UIColor::corp_blue = MC_CLASSIC_CORP_BLUE; +#endif bool ST7735Display::begin() { if (!sprite) { @@ -538,7 +621,7 @@ void ST7735Display::turnOff() { } void ST7735Display::clear() { - sprite->fillScreen(ST77XX_BLACK); + sprite->fillScreen(UIColor::window_bkg); } void ST7735Display::startFrame(ColorVal bkg) { diff --git a/src/helpers/ui/ST7735Display.h b/src/helpers/ui/ST7735Display.h index 368849bc..1575a114 100644 --- a/src/helpers/ui/ST7735Display.h +++ b/src/helpers/ui/ST7735Display.h @@ -21,6 +21,9 @@ public: _peripher_power(peripher_power) { _isOn = false; +#ifdef OLED_RU + _size = 1; +#endif } #else ST7735Display(RefCountedDigitalPin* peripher_power=NULL) : DisplayDriver(128, 64), @@ -28,6 +31,9 @@ public: _peripher_power(peripher_power) { _isOn = false; +#ifdef OLED_RU + _size = 1; +#endif } #endif bool begin(); diff --git a/variants/heltec_t096/platformio.ini b/variants/heltec_t096/platformio.ini index 333677f3..19d90ad5 100644 --- a/variants/heltec_t096/platformio.ini +++ b/variants/heltec_t096/platformio.ini @@ -43,6 +43,12 @@ build_flags = ${nrf52_base.build_flags} -D PIN_BAT_CTL=47 -D DISPLAY_CLASS=ST7735Display -D DISPLAY_ROTATION=1 +; Тема дисплея ST7735 (см. src/helpers/ui/ST7735Display.cpp). +; По умолчанию — янтарь (AMBER, графит + янтарь). Раскомментировать одну строку, чтобы сменить: +; -D ST7735_THEME_TEAL ; B. ночная бирюза: холодный тёмный фон, бирюзовый попап +; -D ST7735_THEME_SIGNAL ; C. чёрный + оранжевый сигнал: яркая полоса заголовка, оранжевый попап +; -D ST7735_THEME_NEON ; D. неон на чёрном: полоса слита с фоном, попап с неоновой рамкой +; -D ST7735_THEME_CLASSIC ; официальная светлая схема MeshCore (её же получают трекеры) build_src_filter = ${nrf52_base.build_src_filter} + +