Problemi nel passaggio di oggetti ad altri costruttori

di il
2 risposte

Problemi nel passaggio di oggetti ad altri costruttori

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

2 Risposte

  • Re: Problemi nel passaggio di oggetti ad altri costruttori

    In effetti qui stai restituedo copie dell'oggetto.
    
    /*
     * Getter for the front right motor
     * @return Motor front right motor
     */
    Motor Car::getMotorFR()
    {
        return *motorFR;
    }
    
    Devi restituirle per reference affinché le modifiche abbiano effetto.
    
    /*
     * Getter for the front right motor
     * @return Motor front right motor
     */
    Motor& Car::getMotorFR()
    {
        return *motorFR;
    }
    
    La modifica vale per ogni funzione che restituisce un oggetto (facendo attenzione al lifetime).
    In alternativa puoi restituire semplicemente il puntatore:
    
    /*
     * Getter for the front right motor
     * @return Motor front right motor
     */
    Motor* Car::getMotorFR()
    {
        return motorFR;
    }
    
  • Re: Problemi nel passaggio di oggetti ad altri costruttori

    Grazie mille, con la modifica suggerita sono riuscito a risolvere.
Devi accedere o registrarti per scrivere nel forum
2 risposte