Аааа, PROGMEM, указатели, указатели на указатели, адреса указателей ... Моя голова поражает.
У меня есть массив данных для рассматриваемого шрифта
const uint8_t dejaVuSans9ptBitmaps[] =
{
/* @0 ' ' (5 pixels wide) */
0x00, /* */
0x00, /* */
...
к которому я добавил PROGMEM
const uint8_t dejaVuSans9ptBitmaps[] PROGMEM =
На это ссылаются в другой структуре, например:
const FONT_INFO dejaVuSans9ptFontInfo = {
13,
' ',
'~',
dejaVuSans9ptDescriptors,
dejaVuSans9ptBitmaps,
};
Структура определяется как;
typedef struct {
const uint8_t height;
const uint8_t startChar;
const uint8_t endChar;
const FONT_CHAR_INFO* charInfo;
const uint8_t* data;
} FONT_INFO;
Правильно ли я считаю, что это должно измениться на;
typedef struct {
const uint8_t height;
const uint8_t startChar;
const uint8_t endChar;
const FONT_CHAR_INFO* charInfo;
const PGM_P data;
} FONT_INFO;
Когда я так поступаю, он жалуется, что
warning: pointer targets in initialization differ in signedness
Для этой конкретной строки в переменной FONT_INFO;
const FONT_INFO dejaVuSans9ptFontInfo = {
13,
' ',
'~',
dejaVuSans9ptDescriptors,
--> dejaVuSans9ptBitmaps, <--
};
Затем рисуется с помощью функции;
void drawString(uint16_t x, uint16_t y, uint16_t color, const FONT_INFO *fontInfo, char *str) {
...
drawCharBitmap(currentX, y, color, &fontInfo->data[charOffset], charWidth, fontInfo->height);
...
Что, наконец, рисует глиф;
void drawCharBitmap(const uint16_t xPixel, const uint16_t yPixel, uint16_t color, const uint8_t *glyph, uint8_t cols, uint8_t rows) {
...
if (glyph[indexIntoGlyph] & (0X80)) drawPixel(currentX, currentY, color);
...
Я нахожусь над моей головой: / Кто-нибудь может дать мне какое-то руководство? Я потратил часы, пытаясь использовать PGM_P, pgm_read_byte и т. Д. Безрезультатно - я всегда получаю мусор на экране.
Спаси меня!