myGLCD.drawBitmapFar

Buongiorno a tutti, sono nuovo del Forum ringrazio in anticipo tutti gli eventuali partecipanti alla mio thread.

Come da titolo, sto cercando di caricare una serie di img sulla memoria interna di un Arduino Mega.
Ho cercato, delle info in giro per il web rispetto a questo argomento, ma nulla di esaustivo...
So che potrei usare una SD, ma non mi interessa e non capisco l'esigenza visto che la memoria interna del mio hardware è perfettamente in grado di immagazzinare quanto richiesto. Credo di capire che sia soltanto una mancanza di gestione dell'attuale libreria UTFT scritta da RinkyDinkElectronics.com. Quindi il mio intendo è di aggiornare e includere questa funzione implementando l'attuale disponibile al momento.
Il problema credo sia noto, superando i 64KB o in generale dovendo gestire indirizzi di memoria superiori a 16 bit l'attuale libreria non funziona.
Al momento sono arrivato a questo punto:

void UTFT::drawBitmapFar(int x, int y, int sx, int sy, bitmapdatatype data, int scale)
{
	unsigned int col;
	int tx, ty, tc, tsx, tsy;

	if (scale==1)
	{
		if (orient==PORTRAIT)
		{
			cbi(P_CS, B_CS);
			setXY(x, y, x+sx-1, y+sy-1);
			for (tc=0; tc<(sx*sy); tc++)
			{
				col=pgm_read_word_far(pgm_get_far_address(data[tc]));
				LCD_Write_DATA(col>>8,col & 0xff);
			}
			sbi(P_CS, B_CS);
		}
		else
		{
			cbi(P_CS, B_CS);
			for (ty=0; ty<sy; ty++)
			{
				setXY(x, y+ty, x+sx-1, y+ty);
				for (tx=sx-1; tx>=0; tx--)
				{
					col=pgm_read_word_far(pgm_get_far_address(data[(ty*sx)+tx]));
					LCD_Write_DATA(col>>8,col & 0xff);
				}
			}
			sbi(P_CS, B_CS);
		}
	}
	else
	{
		if (orient==PORTRAIT)
		{
			cbi(P_CS, B_CS);
			for (ty=0; ty<sy; ty++)
			{
				setXY(x, y+(ty*scale), x+((sx*scale)-1), y+(ty*scale)+scale);
				for (tsy=0; tsy<scale; tsy++)
					for (tx=0; tx<sx; tx++)
					{
						col=pgm_read_word_far(pgm_get_far_address(data[(ty*sx)+tx]));
						for (tsx=0; tsx<scale; tsx++)
							LCD_Write_DATA(col>>8,col & 0xff);
					}
			}
			sbi(P_CS, B_CS);
		}
		else
		{
			cbi(P_CS, B_CS);
			for (ty=0; ty<sy; ty++)
			{
				for (tsy=0; tsy<scale; tsy++)
				{
					setXY(x, y+(ty*scale)+tsy, x+((sx*scale)-1), y+(ty*scale)+tsy);
					for (tx=sx-1; tx>=0; tx--)
					{
						col=pgm_read_word_far(pgm_get_far_address(data[(ty*sx)+tx]));
						for (tsx=0; tsx<scale; tsx++)
							LCD_Write_DATA(col>>8,col & 0xff);
					}
				}
			}
			sbi(P_CS, B_CS);
		}
	}
	clrXY();
}

Ho aggiunto alla libreria questa nuova funzione che è copia e incolla della "standard" con la modifica relativa alla gestione indirizzi 32bit:

col=pgm_read_word_far(pgm_get_far_address(data[tc]));

Ia "standard" invece era :

col=pgm_read_word(&data[tc]);

L'array è dichiarato in questo modo :

#define PROGMEM_FAR  __attribute__((section(".fini7")))

const unsigned short Lampada_OFF_55x70[3850] PROGMEM_FAR={ .....

Non funziona, al momento della compilazione, nel log spunta :

. . .
C:\Users\Antonio\AppData\Local\Temp\cc2VSFOg.ltrans0.ltrans.o: In function `drawBitmapFar':
c:\Users\Antonio\Documents\Arduino\libraries\UTFT/UTFT.cpp:1159: undefined reference to `r28'
c:\Users\Antonio\Documents\Arduino\libraries\UTFT/UTFT.cpp:1159: undefined reference to `r28'
c:\Users\Antonio\Documents\Arduino\libraries\UTFT/UTFT.cpp:1159: undefined reference to `r28'
c:\Users\Antonio\Documents\Arduino\libraries\UTFT/UTFT.cpp:1172: undefined reference to `r30'
c:\Users\Antonio\Documents\Arduino\libraries\UTFT/UTFT.cpp:1172: undefined reference to `r30'
c:\Users\Antonio\Documents\Arduino\libraries\UTFT/UTFT.cpp:1172: undefined reference to `r30'
collect2.exe: error: ld returned 1 exit status

1159 e 1172 sono proprio le righe del file UTFT.cpp mostrare in precedenza dove ho modificato:

1159 - col=pgm_read_word_far(pgm_get_far_address(data[tc]));
. . .
1172 - col=pgm_read_word_far(pgm_get_far_address(data[(ty*sx)+tx]));

Se qualcuno può darmi qualche dritta, sono tutto orecchie :slight_smile: !!

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.