diff --git a/src/helpers/ui/DisplaySelect.h b/src/helpers/ui/DisplaySelect.h new file mode 100644 index 00000000..6647a959 --- /dev/null +++ b/src/helpers/ui/DisplaySelect.h @@ -0,0 +1,41 @@ +#pragma once + +// Единая точка подключения драйвера дисплея по макросу DISPLAY_CLASS. +// +// Вариант задаёт в platformio.ini только имя класса, например +// -D DISPLAY_CLASS=SH1106Display +// и больше ничего не правит: ни target.h, ни build_src_filter (последний +// обрабатывает build_as_lib.py, либо он задан явно в env). +// +// Приём: имена классов на время вычисления подменяются числовыми маркерами, +// поэтому DISPLAY_CLASS можно сравнить через #if. Маркеры снимаются до +// include драйвера, чтобы имя класса осталось обычным идентификатором, а не +// макросом (иначе `extern DISPLAY_CLASS display;` превратился бы в `extern 1 +// display;`). +// +// Чтобы добавить драйвер: дописать маркер, ветку и #include ниже. + +#ifdef DISPLAY_CLASS + + #define SSD1306Display 1 + #define SH1106Display 2 + + #if DISPLAY_CLASS == 1 + #define MC_DISPLAY_SSD1306 + #elif DISPLAY_CLASS == 2 + #define MC_DISPLAY_SH1106 + #else + #error "DisplaySelect.h: unsupported DISPLAY_CLASS (SSD1306Display or SH1106Display expected)" + #endif + + #undef SSD1306Display + #undef SH1106Display + + #ifdef MC_DISPLAY_SSD1306 + #include "SSD1306Display.h" + #endif + #ifdef MC_DISPLAY_SH1106 + #include "SH1106Display.h" + #endif + +#endif // DISPLAY_CLASS diff --git a/src/helpers/ui/SH1106Display.cpp b/src/helpers/ui/SH1106Display.cpp index 8b91d857..c9b41171 100644 --- a/src/helpers/ui/SH1106Display.cpp +++ b/src/helpers/ui/SH1106Display.cpp @@ -1,6 +1,9 @@ #include "SH1106Display.h" #include #include "Adafruit_SH110X.h" +#ifdef OLED_RU + #include "glcdfont6x8.h" +#endif bool SH1106Display::i2c_probe(TwoWire &wire, uint8_t addr) { @@ -63,14 +66,23 @@ void SH1106Display::startFrame(ColorVal bkg) { display.clearDisplay(); // TODO: apply 'bkg' _color = SH110X_WHITE; +#ifdef OLED_RU + display.setFont(&glcdfont6x8); +#endif display.setTextColor(_color); display.setTextSize(1); display.cp437(true); // Use full 256 char 'Code Page 437' font +#ifdef OLED_RU + display.setCursor(0, 7); +#endif } void SH1106Display::setTextSize(int sz) { display.setTextSize(sz); +#ifdef OLED_RU + _size = sz; +#endif } void SH1106Display::setColor(ColorVal c) @@ -81,7 +93,11 @@ void SH1106Display::setColor(ColorVal c) void SH1106Display::setCursor(int x, int y) { +#ifdef OLED_RU + display.setCursor(x, y + (_size * 7)); +#else display.setCursor(x, y); +#endif } void SH1106Display::print(const char *str) diff --git a/src/helpers/ui/SH1106Display.h b/src/helpers/ui/SH1106Display.h index 4e269d5e..facd651b 100644 --- a/src/helpers/ui/SH1106Display.h +++ b/src/helpers/ui/SH1106Display.h @@ -19,11 +19,19 @@ class SH1106Display : public DisplayDriver Adafruit_SH1106G display; bool _isOn; uint8_t _color; +#ifdef OLED_RU + uint8_t _size; +#endif bool i2c_probe(TwoWire &wire, uint8_t addr); public: - SH1106Display() : DisplayDriver(128, 64), display(128, 64, &Wire, PIN_OLED_RESET) { _isOn = false; } + SH1106Display() : DisplayDriver(128, 64), display(128, 64, &Wire, PIN_OLED_RESET) { + _isOn = false; +#ifdef OLED_RU + _size = 1; // setCursor() смещает текст на _size*7, без этого до первого setTextSize() в _size мусор +#endif + } bool begin(); bool isOn() override { return _isOn; } diff --git a/src/helpers/ui/SSD1306Display.h b/src/helpers/ui/SSD1306Display.h index 66835e86..f924ca79 100644 --- a/src/helpers/ui/SSD1306Display.h +++ b/src/helpers/ui/SSD1306Display.h @@ -31,6 +31,9 @@ public: _peripher_power(peripher_power) { _isOn = false; +#ifdef OLED_RU + _size = 1; // setCursor() смещает текст на _size*7, без этого до первого setTextSize() в _size мусор +#endif } bool begin(); diff --git a/variants/promicro/platformio.ini b/variants/promicro/platformio.ini index c0918ded..e1463ca4 100644 --- a/variants/promicro/platformio.ini +++ b/variants/promicro/platformio.ini @@ -156,6 +156,31 @@ lib_deps = ${Promicro.lib_deps} adafruit/RTClib @ ^2.1.3 densaugeo/base64 @ ~1.4.0 +[env:ProMicro_SH1106_companion_radio_ble] +extends = Promicro +board_build.ldscript = boards/nrf52840_s140_v6_extrafs.ld +board_upload.maximum_size = 712704 +build_flags = ${Promicro.build_flags} + -I examples/companion_radio/ui-new + -D MAX_CONTACTS=350 + -D MAX_GROUP_CHANNELS=40 + -D BLE_PIN_CODE=123456 + -D BLE_DEBUG_LOGGING=1 + -D OFFLINE_QUEUE_SIZE=256 + -D DISPLAY_CLASS=SH1106Display +; -D MESH_PACKET_LOGGING=1 +; -D MESH_DEBUG=1 +build_src_filter = ${Promicro.build_src_filter} + + + + + + + +<../examples/companion_radio/*.cpp> + +<../examples/companion_radio/ui-new/*.cpp> +lib_deps = ${Promicro.lib_deps} + adafruit/Adafruit SH110X @ ^2.1.13 + adafruit/RTClib @ ^2.1.3 + densaugeo/base64 @ ~1.4.0 + [env:ProMicro_companion_xiaowa_radio_ble] extends = Promicro board_build.ldscript = boards/nrf52840_s140_v6_extrafs.ld diff --git a/variants/promicro/target.h b/variants/promicro/target.h index e577ab4e..cecd45e9 100644 --- a/variants/promicro/target.h +++ b/variants/promicro/target.h @@ -7,7 +7,8 @@ #include #include #ifdef DISPLAY_CLASS - #include + // драйвер выбирается по значению DISPLAY_CLASS (SSD1306Display / SH1106Display) + #include #include #endif