From 9dbe634f0833eb0eb341467eaa5e26f99eb7510c Mon Sep 17 00:00:00 2001 From: SASANO Takayoshi Date: Sun, 13 Dec 2020 16:39:23 +0900 Subject: [PATCH] adjust message layout to display whole POCSAG message --- OLED.cpp | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/OLED.cpp b/OLED.cpp index c83c714..562afde 100644 --- a/OLED.cpp +++ b/OLED.cpp @@ -571,14 +571,25 @@ void COLED::writePOCSAGInt(uint32_t ric, const std::string& message) m_mode = MODE_POCSAG; m_display.clearDisplay(); - m_display.fillRect(0, OLED_LINE1, m_display.width(), m_display.height(), BLACK); + m_display.fillRect(0, OLED_LINE2, m_display.width(), m_display.height(), BLACK); - m_display.setCursor(0,OLED_LINE3); + m_display.setCursor(0,OLED_LINE2); m_display.printf("RIC: %u", ric); m_display.setTextWrap(true); // text wrap temorally enable - m_display.setCursor(0,OLED_LINE5); - m_display.printf("MSG: %s", message.c_str()); + m_display.setCursor(0,OLED_LINE3); + // no room to display "MSG: " header + + // due to limitation of AdaFruit_GFX::vprintf() (in ArduiPi_OLED), + // the maximum string length displayed by single printf() call is 63. + // to avoid this, divide POCSAG (max 80 chars) message into some pieces. + int total = message.length(); + for (int i = 0; i < total; ) { + int remain = total - i; + int len = (remain < 40) ? remain : 40; + m_display.printf("%s", message.substr(i, len).c_str()); + i += len; + } m_display.setTextWrap(false); OLED_statusbar(); @@ -588,9 +599,9 @@ void COLED::writePOCSAGInt(uint32_t ric, const std::string& message) void COLED::clearPOCSAGInt() { - m_display.fillRect(0, OLED_LINE1, m_display.width(), m_display.height(), BLACK); + m_display.fillRect(0, OLED_LINE2, m_display.width(), m_display.height(), BLACK); - m_display.setCursor(40,OLED_LINE4); + m_display.setCursor(40,OLED_LINE3); m_display.print("Listening"); m_display.setCursor(0,OLED_LINE6);