ovvero, il C che non ti insegnano a scuola! per farla breve, ecco cosa ho io:
// impostazioni varie
typedef struct
{
unsigned int channel : 4;
unsigned int ottava : 4;
unsigned int sens : 1;
unsigned int patch : 7;
unsigned int waveform : 3;
unsigned int soglia : 9;
unsigned int tonalita : 4;
}Settings;
questa è la definizione della struttura contentente le impostazioni per il mio sketch, che vengono modificate selezionando le relative voci da un menù (mostrato su display 4x20 e gestito da 4 bottoni e un solido set di funzioni, di cui vado profondamente orgoglioso e che non mancherò di postare in caso qualcuno ne avesse bisogno). Ora, visto che per ogni impostazione il lavoro da fare è sempre quello (mostra una stringa sullo schermo, mostra la variabile X, ascolta lo stato della pulsantiera, eventualmente aggiorna la variabile e il display), avrei voluto creare una singola funzione e delegarle il compito di gestire tutte queste impostazioni, passandogliele come parametro. Per spiegare meglio, posto un po' del codice, già commentato:
// editSetting
// si occupa di gestire la modifica delle impostazioni
void editSetting(char str, / vuoto più assoluto su cosa scrivere qui */)
{
/*memorizzo il vecchio valore della variabile */byte state = IDLE;
byte save = 255;
lcd.setCursor(0, 1);
lcd.print(str);
lcd.setCursor(9, 2);while(save != 255)
{
state = buttonCheck(A0)
switch(state)
{
case UP: /* incremento la variabile */
break;case DOWN: /* decremento la variabile */
break;case SEL: save = 1;
break;case BACK: save = 0;
break;
}
if(state==SEL || state== BACK)
break;
lcd.print(/variabile/);
}
if(state == SEL)
/esce normalmente/
if(state == back)
/reimposta la variabile al vecchio valore ed esce/
}
come potrete capire la (mia) difficoltà sta nel lavorare con la variabile passata per referenza (non per valore!), in quanto contenuta in una struttura peraltro suddivisa in bit fields.. confido in voi ![]()