Browse Source

Added support of cyrillic characters output on companion devices with SSD1306 display. Use -D CYRILLIC=1 with -D DISPLAY_CLASS=SSD1306Display for enable. Fixed bug with "glueing" next message preview with current message preview for messages ended with trimmed UTF-8 sequence. Fixed bug with incorrect trimming of UTF-8 message previews.

pull/1439/head
ivang78 3 months ago
parent
commit
f4c9e34d42
  1. 6
      examples/companion_radio/ui-new/UITask.cpp
  2. 4
      src/helpers/ui/DisplayDriver.h
  3. 10
      src/helpers/ui/SSD1306Display.cpp
  4. 2
      src/helpers/ui/SSD1306Display.h
  5. 6
      variants/heltec_v3/platformio.ini

6
examples/companion_radio/ui-new/UITask.cpp

@ -71,7 +71,7 @@ public:
display.drawTextCentered(display.width()/2, 35, _version_info);
display.setTextSize(1);
#ifdef OLED_RU
#ifdef CYRILLIC
char filtered_date[sizeof(FIRMWARE_BUILD_DATE)];
display.translateUTF8ToBlocks(filtered_date, FIRMWARE_BUILD_DATE, sizeof(filtered_date));
display.drawTextCentered(display.width()/2, 48, filtered_date);
@ -476,7 +476,7 @@ class MsgPreviewScreen : public UIScreen {
struct MsgEntry {
uint32_t timestamp;
char origin[62];
#ifdef OLED_RU
#ifdef CYRILLIC
char msg[140];
#else
char msg[78];
@ -537,7 +537,7 @@ public:
display.setColor(DisplayDriver::LIGHT);
char filtered_msg[sizeof(p->msg)];
display.translateUTF8ToBlocks(filtered_msg, p->msg, sizeof(filtered_msg));
#ifdef OLED_RU
#ifdef CYRILLIC
char truncated_msg[78];
StrHelper::strncpy(truncated_msg, filtered_msg, sizeof(truncated_msg));
display.printWordWrap(truncated_msg, display.width());

4
src/helpers/ui/DisplayDriver.h

@ -45,14 +45,14 @@ public:
// convert UTF-8 characters to displayable block characters for compatibility
virtual void translateUTF8ToBlocks(char* dest, const char* src, size_t dest_size) {
size_t j = 0;
#ifdef OLED_RU
#ifdef CYRILLIC
char last_char = 0;
char cc = 0;
#endif
for (size_t i = 0; src[i] != 0 && j < dest_size - 1; i++) {
unsigned char c = (unsigned char)src[i];
if (c >= 32 && c <= 126) {
#ifdef OLED_RU
#ifdef CYRILLIC
last_char = 0;
dest[j++] = c; // ASCII printable
} else if (last_char == 0 && (c == 0xD0 || c == 0xD1 || c == 0xD2)) { // Cyrillic UTF-8 start byte for 2 bytes sequence

10
src/helpers/ui/SSD1306Display.cpp

@ -1,5 +1,5 @@
#include "SSD1306Display.h"
#ifdef OLED_RU
#ifdef CYRILLIC
#include "glcdfont6x8.h"
#endif
@ -50,20 +50,20 @@ void SSD1306Display::clear() {
void SSD1306Display::startFrame(Color bkg) {
display.clearDisplay(); // TODO: apply 'bkg'
_color = SSD1306_WHITE;
#ifdef OLED_RU
#ifdef CYRILLIC
display.setFont(&glcdfont6x8);
#endif
display.setTextColor(_color);
display.setTextSize(1);
display.cp437(true); // Use full 256 char 'Code Page 437' font
#ifdef OLED_RU
#ifdef CYRILLIC
display.setCursor(0, 7);
#endif
}
void SSD1306Display::setTextSize(int sz) {
display.setTextSize(sz);
#ifdef OLED_RU
#ifdef CYRILLIC
_size = sz;
#endif
}
@ -74,7 +74,7 @@ void SSD1306Display::setColor(Color c) {
}
void SSD1306Display::setCursor(int x, int y) {
#ifdef OLED_RU
#ifdef CYRILLIC
display.setCursor(x, y + (_size * 7));
#else
display.setCursor(x, y);

2
src/helpers/ui/SSD1306Display.h

@ -19,7 +19,7 @@ class SSD1306Display : public DisplayDriver {
Adafruit_SSD1306 display;
bool _isOn;
uint8_t _color;
#ifdef OLED_RU
#ifdef CYRILLIC
uint8_t _size;
#endif
RefCountedDigitalPin* _peripher_power;

6
variants/heltec_v3/platformio.ini

@ -144,7 +144,7 @@ build_flags =
-D MAX_CONTACTS=350
-D MAX_GROUP_CHANNELS=40
-D DISPLAY_CLASS=SSD1306Display
-D OLED_RU=1
-D CYRILLIC=1
; NOTE: DO NOT ENABLE --> -D MESH_PACKET_LOGGING=1
; NOTE: DO NOT ENABLE --> -D MESH_DEBUG=1
build_src_filter = ${Heltec_lora32_v3.build_src_filter}
@ -168,7 +168,7 @@ build_flags =
-D AUTO_SHUTDOWN_MILLIVOLTS=3400
-D BLE_DEBUG_LOGGING=1
-D OFFLINE_QUEUE_SIZE=256
-D OLED_RU=1
-D CYRILLIC=1
; -D MESH_PACKET_LOGGING=1
; -D MESH_DEBUG=1
build_src_filter = ${Heltec_lora32_v3.build_src_filter}
@ -193,7 +193,7 @@ build_flags =
-D WIFI_SSID='"myssid"'
-D WIFI_PWD='"mypwd"'
-D OFFLINE_QUEUE_SIZE=256
-D OLED_RU=1
-D CYRILLIC=1
; -D MESH_PACKET_LOGGING=1
; -D MESH_DEBUG=1
build_src_filter = ${Heltec_lora32_v3.build_src_filter}

Loading…
Cancel
Save