Здравствуйте. Не могу разобраться с некоторыми функциями библиотеки 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 а где то в другом месте, например - в самой классе дисплея, но там тоже ничего нет или я плохо искал. Короче, я ничего не понимаю, или жестко туплю.
Вывод текста устроен примерно так - сначала метод Print заполняет буфер символами. а далее внутри библиотеки Adafruit GFX используется метод drawChar() который по точкам рисует символ с помощью метода дисплея drawPixel(x,y) PS не вполне понимаю, зачем переписывать эту библиотеку "на С без классов"? Для СТМ32 есть С++ компилятор