Salve, sto realizzando un mio progetto per un'auto a guida autonoma senza troppe pretese, è un passatempo.
Non posto qui il codice perché è un po' troppo lungo, ma a fine post troverete un link al repository di Github su cui potete trovarlo.
L'auto ha un motore per ogni ruota, su ogni motore è montato un encoder (un disco forato) che ruotando attiva un fotoaccoppiatore ottico e questo genera un interrupt sul microcontrollore, un ESP32.
All'arrivo dell'interrupt viene chiamata una service routine nel main.cpp che invoca il metodo isr() della classe Encoder, incrementa di 1 un contatore (intCount) e calcola il numero di giri al minuto del motore.
Il problema è che il contatore mi risulta essere sempre pari ad 1 mettendo una stampa dopo l'incremento della variabile, il che vuol dire che all'esecuzione della ISR è sempre 0, l'incremento non persiste nel tempo.
Ho già dichiarato le variabili interessate come volatile, ma non ha aiutato.
Ora entra in scena la mia inesperienza con il C++.
Mi si è detto "I costruttori della classe Car e della classe Motor ti creano delle copie della classe Encoder, l'invocazione della ISR non avviene sulla classe che usi globalmente".
Ho provato a dare un senso a questa spiegazione passando l'oggetto encoder per riferimento (&encoderXX) al costruttore della classe Motor e gli oggetti motor per riferimento (&motorXX) al costruttore della classe Car, ma ancora ho lo stesso comportamento, la variabile che dovrei incrementare risulta sempre 1 ad ogni interrupt.
Non riesco a capire come dovrei modificare il codice perché possa incrementare correttamente il contatore intCount sull'oggetto giusto.
Sapreste darmi delle indicazioni concrete su come sistemare la situazione?
Qui potete leggere il codice
https://github.com/LuigiCaradonna/Self-Driving-Car-ESP32