ST7565 aggiungere custom fonts

ciao! Ho acquistato un display grafico 128x64 ed ora ho la necessitá di modificare tipo e grandezza dei font. Sulla libreria Adafruit (GitHub - adafruit/ST7565-LCD: There are two 'versions' of the LCD library - one is straightup avr-gcc and the other is an Arduino Library. They're essentially the same. You can create new icons for bitmapdisplaying using bmp2glcd have fun! limor) vi sono due funzioni principali per l'output del testo:

 void ST7565::drawstring(uint8_t x, uint8_t line, char *c) {
  while (c[0] != 0) {
    drawchar(x, line, c[0]);
    c++;
    x += 6; // 6 pixels wide
    if (x + 6 >= LCDWIDTH) {
      x = 0;    // ran out of this line
      line++;
    }
    if (line >= (LCDHEIGHT/8))
      return;        // ran out of space :(
  }
}

void  ST7565::drawchar(uint8_t x, uint8_t line, char c) {
  for (uint8_t i =0; i<5; i++ ) {
    st7565_buffer[x + (line*128) ] = pgm_read_byte(font+(c*5)+i);
    x++;
  }

  updateBoundingBox(x, line*8, x+5, line*8 + 8);
}

L'unico font disponibile é strutturato in questa maniera (lo riporto parzialmente dato che é lungo):

uint8_t font[] PROGMEM = { 
  0x0, 0x0, 0x0, 0x0, 0x0,       // Ascii 0
  0x7C, 0xDA, 0xF2, 0xDA, 0x7C,  //ASC(01)
  0x7C, 0xD6, 0xF2, 0xD6, 0x7C,  //ASC(02)
  0x38, 0x7C, 0x3E, 0x7C, 0x38, 
  0x18, 0x3C, 0x7E, 0x3C, 0x18, 
  0x38, 0xEA, 0xBE, 0xEA, 0x38, };

Per ora ho provato a utilizzare vari programmi di conversione da font a hex, da bmp a hex ecc. , ho provato a modificare la funzione drawchar, ma senza alcun successo.
Ora ho la necessitá che mi spieghiate in detaglio, dato che in C++ sono un po' niubbo, cosa fanno esattamente le due funzioni e come modificarle per ottenere delle funzioni universali in cui poter inserire il tipo di font e la rispettiva dimensione.

Grazie!

Purtroppo per come è strutturata la libreria i font sono raster, e quindi non c'è modo di fare un font unico per tutte le dimensioni. Non credo neanche che arduino abbia abbastanza potenza da poter gestire dei font vettoriali...

Quindi l'unica alternativa è usare un array diverso per ogni dimensione che ti serve, e modificare di conseguenza le funzioni drawstring\drawchar per adattarle alle misure diverse. Cosa che di certo non è impossibile, ma richiede non poco lavoro.

Tieni conto poi che usare tanti font diversi occupa un sacco di memoria flash!

Come detto quel display é un display grafico che devi settare e cancellare ogni pixel. per quello devi avere una "memoria di font" dove sono disposti i pixel di ogni carattere. per avere diversi font o diverse grandezze di caratteri serve avere un altro set di caratteri e percui piú memoria.
È facilmete realizzabiel un carattere della grandezza doppia di quello originale settando 4 pixel al posto di 1 ma la qualitá sará scadente.

Ciao Uwe

Benissimo. diciamo che voglio, per ora, solamente inserire un set di caratteri numerici da 0 a 9 piú grandi dei precedenti.

  1. da immagini bitmap di dimensione 20x34 li converto in hex e li scrivo in un altro array denominato numBig
  2. alla funzione drawchar inserisco il parametro font e le dimensioni del carattere drawchar(uint8_t x,uint8_t line, char c,uint8_t W, uint8_t H, char font)
  3. la funzione drawchar verrá quindi modificata ma non so da dove partire. Potreste farmi un esempio?

Grazie ancora

franhk77:
Benissimo. diciamo che voglio, per ora, solamente inserire un set di caratteri numerici da 0 a 9 piú grandi dei precedenti.

  1. da immagini bitmap di dimensione 20x34 li converto in hex e li scrivo in un altro array denominato numBig
  2. alla funzione drawchar inserisco il parametro font e le dimensioni del carattere drawchar(uint8_t x,uint8_t line, char c,uint8_t W, uint8_t H, char font)
  3. la funzione drawchar verrá quindi modificata ma non so da dove partire. Potreste farmi un esempio?

Grazie ancora

ce l'ho anch'io quel display lì e anch'io volevo creare il modo di scrivere con dimensioni diverse, però non ho ancora avuto tempo di dedicarmi a farlo... :frowning:
per creare dei caratteri speciali, non presenti nella libreria, ho li ho inseriti con il metodo drawbitmap e gli ho messo le dimensioni e la posizioni...
per fare un nuovo metodo drawstring avevo pensato di mettergli in memoria tutti i caratteri come bitmap e poi scriverli usando drawbitmap, così da risparmiarmi tante noie, e con la possibilità di scrivere su ogni pixel e non ogni 8 pixel, perchè se devo scrivere in centro ad una figura vorrei essere in grado di centrare il più possibile la scritta... non so se sonoriuscito a spiegarti le mie idee :sweat_smile:

dancol90:
Tieni conto poi che usare tanti font diversi occupa un sacco di memoria flash!

per fortuna io ho un arduino mega perchè il programma che sto facendo è 28.034 bytes e penso di essere più o meno a metà del codice :sweat_smile:

franhk77:
Benissimo. diciamo che voglio, per ora, solamente inserire un set di caratteri numerici da 0 a 9 piú grandi dei precedenti.

  1. da immagini bitmap di dimensione 20x34 li converto in hex e li scrivo in un altro array denominato numBig
  2. alla funzione drawchar inserisco il parametro font e le dimensioni del carattere drawchar(uint8_t x,uint8_t line, char c,uint8_t W, uint8_t H, char font)
  3. la funzione drawchar verrá quindi modificata ma non so da dove partire. Potreste farmi un esempio?

Grazie ancora

Alla fin fine senza andare a mettere le mani sulla lib se devi stampare solo delle cifre numeriche ti conviene, come diceva ?R, usare questi caratteri come delle bitmap e stamparle con drawbitmap.
Nel tuo sketch faresti bene anche a scriverti una funzione che date le coordinate e un numero (una stringa tipo "1234" o un intero tipo 1234) richiami drawbitmap per ogni singola cifra posizionandole correttamente una dopo l'altra, in modo che se scrivere più volte dei numeri col font più grande non devi ripetere codice :slight_smile: