Salve ragazzi, innanzitutto, scusatemi per il lungo post, ma è difficile dirlo in 4 parole (e non sapevo nemmeno come metterlo in Subject!)
ho un quesito per voi esperti. Sono alle prime armi con Arduino e la programmazione in C/C++, sto tentando di imparare ogni giorno quancosa di nuovo, adesso sto "giocando" (a "Wrestling" direi) con arduino ed un display della 4D Systems, un uLCD144 che tenevo nel cassetto da oltre 1 anno e che con il picaxe non ne aveva voluto sapere di funzionare (ma ci ho anche perso poco tempo, per la verità). Adesso, avendo trovato uno sketch dove veniva usato il mio stesso display, ho deciso di provare, ho collegato tutto come da istruzione "ET VOILA" il tutto funziona al primo colpo. Quindi mi studio la struttura dei comandi e decido di crearmi i miei per provare. Dopo svariate "grattate" finalmente ho incominciato ad "ingranare" e dopo qualche giorno, sono riuscito ad ottenere una "specie di menu" (nel senso che visualizzo una serie di opzioni a schermo e mediante un pulsante incremento un contatore che mi fa comparire un rettangolo rosso sullo sfondo della voce corrispondente e questo si muove al premere il pulsante tra le varie voci e sotto al display, va a scrivere in caratteri più piccoli una specie di GUIDA - HELP di cosa fa quella voce del menù. Esteticamente tutto è molto carino e promette bene. il mio problema, se così posso chiamarlo è:
Quale di questi 4 metodi secondo voi è il migliore per far visualizzare dati ripetitivi dove solo uno cambia (il testo da visualizzare) visto che posizione, dimensioni, fonts ecc sono gli stessi?
//******************************************************************************************************************************
/* Esempio 1: questo è stato il mio primo approcio "GREZZO" il quale si ripete per altre 3 function identiche tranne che il "testo" string da visualizzare. FUNZIONA BENE.
*/
void Help_1(){
Serial.write(0x53); //cmd,
Serial.write(0x01); //coordinata X,
Serial.write(0x5E); //coordinata Y,
Serial.write(0x00); //font,
Serial.write(0xF8); //colore_MSB,
Serial.write(0x00); //colore_LSB,
Serial.write(0x01); //width,
Serial.write(0x01); //height,
Serial.write("testo da visulizzare 1"); //testo da visualizzare,
Serial.write(0x00); //terminatore
}
//**************************************************************************************************************
/* Esempio 2: ho creato un'array che contiene tutti i dati tranne che gli ultimi 2, poi in un ciclo FOR invio al display i comandi in sequenza usando solo 3 "Serial.write()"... ANCHE QUESTO FUNZIONA.
*/
void Help_1(){ //di queste function ce ne sono altre 3, numerate Help_2, Help_3 e Help_4...
int i;
int var;
char Array_Help_1[8]={0x53,0x01,0x5E,0x00,0xF8,0x00,0x01,0x01};
//{cmd,X,Y,font,String_Color_MSB,String_Color_LSB,width,height}
for (i=0; i<8; i++) {
Serial.write(var=Array_Help_1[i]);
}
Serial.write("testo da visualizzare 1);
Serial.write(0x00); //terminatore
}
}
//*******************************************************************************************************************
/* Esempio 3: l'array dell'esempio precedente invece di ripeterlo per 4 functions, ho creato un'unica function e solo la variabile string - Testo_Help (global) viene aggiornata durante le operazioni di "selezione" della variabile "Selezione_Attiva", quindi in loop() ho un ciclo if...else if che in base al contatore del pulsante mi va a chiamare le function corrispondenti. ANCHE QUESTO FUNZIONA.
*/
void Help(){
int i;
int var;
char Array_Help_1[8]={0x53,0x01,0x5E,0x00,0xF8,0x00,0x01,0x01}; //{cmd,X,Y,font,String_Color_MSB,String_Color_LSB,width,height}
for (i=0; i<8; i++) {
Serial.write(var=Array_Help_1[i]);
}
Serial.print(Testo_Help); //questa string viene di volta in volta aggiornata in base all'assegnazione alla variabile del testo da visualizzare
Serial.write(0x00); //terminatore
}
//************************************************************************************************************
/* Esempio 4: Questa è l'ultima evoluzione nella compattazione del codice, o almeno così credevo. un'unica function, in base al contatore "Selezione_Attiva" che mi dice quale voce del menù è attiva, un switch case mi selezione i testi da assegnare ad una variabile locale. ANCHE QUESTA FUNZIONA BENE!!
*/
void Help() {
String Testo_Help; //variabile string locale
switch (Selezione_Attiva) { //variabile del contatore posizione menu
case 1:
Testo_Help="Testo 1 "; //testo da visualizzare se Selezione_Attiva=1
break;
case 2:
Testo_Help="Testo 2 "; //testo da visualizzare se Selezione_Attiva=2
break;
case 3:
Testo_Help="Testo 3 "; //testo da visualizzare se Selezione_Attiva=3
break;
case 4:
Testo_Help="Testo 4 "; //testo da visualizzare se Selezione_Attiva=4
break;
default:
Testo_Help="Selezzionare una voce"; //se nessuno dei precedenti applicasse...
// default is optional
}
int i; //variabile locale usata solo per il FOR.
int var; //variabile locale usata solo per prelevare i dati dall'array.
char Array_Help[8]={0x53,0x01,0x5E,0x00,0xF8,0x00,0x01,0x01}; //{cmd,X,Y,font,String_Color_MSB,String_Color_LSB,width,height}
for (i=0; i<8; i++) {
Serial.write(var=Array_Help[i]);
}
Serial.print(Testo_Help); //variabile con il testo da visualizzare..
Serial.write(0x00); //terminatore
}
}
Adesso, dove sta il problema? Semplice, sono sconcertato dal fatto che a discapito di quello che credevo, l'aver "ottimizzato" in lunghezza codice in termine di linee si è rivelato un dispendio enorme di risorse di memoria flash durante la compilazione!
per Esempio 1: non ricordo i bytes occupati, ma leggermente superiore all' Esempio 2 lo era (sui 7080 bytes circa).
per Esempio 2: 6984 bytes. (i testi string da inviare sono presenti solo nei comandi Serial.write() )
per Esempio 3: 8296 bytes. (i testi string da inviare erano global)
per Esempio 4: 8272 bytes. (i testi string da inviare erano locali)
Quindi credendo di ottimizzare, ho incasinato il programma?? Pensavo che riducendo il numero di Serial.write() ad un minimo avrei ridotto di un bel po i byte di codice compilato, ma ho scoperto che è così solo per i comandi dove NON vi sono STRING come variabili, e qui ho appreso, dolorosamente, che le string sono un vero flagello per la memoria (flash e RAM).
La mia domanda ora è questa: Secondo voi, la soluzione giusta, quale sarebbe?
1- la GREZZA, ed avere un codice lunghissimo che renderebbe tedioso il suo aggiornamento...
2- la mini ottimizzata (esempio 2) che ridurrebbe un po l'estensione delle linee di codice occupate e ridurrebbe un po i bytes di compilazione...
3- l' ottimizzata con variabile string=>global, molto compatta ma dispendiosa di FLASH?
4-l' ottimizzata con variabili string=>locale, ugualmente compatta e leggermente meno dispendiosa di FLASH della soluzione 3?
Ovviamente Voi avreste ottimizzato molto meglio, io fin qui arrivo per ora. E pensare che ho speso almeno 6-7 ore per rivedere il codice dalla soluzione 1 alla 4, se avessi saputo, mi tenevo la GREZZA!!
Scusate del lungo post per una questione così BANALE, ma voglio imparare e capire la sottile differenza che c'é tra "tentare" di imparare e rimanere un "ignorante" in materia. A voi la parola!!
edit by mod: per favore includi il codice usando gli appositi tag