Не могу разобраться с внутренностями библиотеки для oled ssd1306

Тема в разделе "Arduino & Shields", создана пользователем Николай19971997, 1 авг 2022.

  1. Здравствуйте. Не могу разобраться с некоторыми функциями библиотеки adafruit для oled дисплея ssd1306 https://github.com/adafruit/Adafruit_SSD1306 https://github.com/adafruit/Adafruit-GFX-Library. А конкретно с функциями "print" и "println". Разобраться мне с ними надо потому что я переписываю библиотеку под stm32 на Си, без классов. Можно было бы конечно взять готовую библиотеку для stm32, но я решил переписывать ее и заодно чуть чуть разобраться с функционалом дисплея и принцип по которому пишут библиотеки для него.
    В принципе, никаких проблем нет, потому что все работает. Я выводил всякие треугольники, прямоугольники, но потом дошел до функций с выводом текста и тут начались проблемы.
    Я не могу понять как работают методы "print" и "println" класса с дисплеем. В само библиотеке эти методы не реализованы. Эти методы наследуются от класса print.

    Код (C++):
    class Adafruit_GFX : public Print {

    public:
    И в самом скетче используется данный код

    Код (C++):
    void testdrawstyles(void) {
      display.clearDisplay();

      display.setTextSize(1);             // Normal 1:1 pixel scale
      display.setTextColor(SSD1306_WHITE);        // Draw white text
      display.setCursor(0,0);             // Start at top-left corner
      display.println(F("Hello, world!"));

      display.setTextColor(SSD1306_BLACK, SSD1306_WHITE); // Draw 'inverse' text
      display.println(3.141592);

      display.setTextSize(2);             // Draw 2X-scale text
      display.setTextColor(SSD1306_WHITE);
      display.print(F("0x")); display.println(0xDEADBEEF, HEX);

      display.display();
      delay(2000);
    }
    и я не совсем понимаю каким образом тут выводится текст через print. Текст сам выводится должен при вызове метода display(), где он измененный буфер в памяти выведет на сам дисплей. А до этого буфер определенным образом должен быть изменен, так чтобы при его выводе была необходимая картинка. Так и работали все предыдущие методы, когда я в них заглядывал.
    Но проблема заключается в том, что методы "print" и "prinln" класса print ничего подобного внутри не делают. Если взять эту строку кода

    Код (C++):
    display.println(F("Hello, world!"));
    и заглянуть в реализацию класса Print то данная функция делает вот это

    Код (C++):
    size_t Print::write(const uint8_t *buffer, size_t size)
    {
      size_t n = 0;
      while (size--) {
        if (write(*buffer++)) n++;
        else break;
      }
      return n;
    }

    size_t Print::print(const char str[])
    {
      return write(str);
    }

    то есть она просто возвращает размер буфера. да даже если посмотреть на все функции класса Print, то там везде одинаковый принцип и везде оно и тоже, но нет никакой работы непосредственно с дисплеем. То есть я не понимаю каким образом работает библиотека с этими функциями. Я могу сделать только один вывод - настоящая реализация этих методов для oled дисплея находится не в классе Print а где то в другом месте, например - в самой классе дисплея, но там тоже ничего нет или я плохо искал. Короче, я ничего не понимаю, или жестко туплю.
     
  2. b707

    b707 Гуру

    Вывод текста устроен примерно так - сначала метод Print заполняет буфер символами. а далее
    внутри библиотеки Adafruit GFX используется метод drawChar() который по точкам рисует символ с помощью метода дисплея drawPixel(x,y)

    PS не вполне понимаю, зачем переписывать эту библиотеку "на С без классов"? Для СТМ32 есть С++ компилятор