Ciao a tutti,
conosco abbastanza bene il CPP ma non ho esperienza con Arduino, per cui vengo a chiedere aiuto agli esperti.
Abbiamo scritto una libreria e un protocollo di comunicazione con il PC. L'implementazione è avvenuta senza troppe difficoltà, ma c'è un particolare che non siamo riusciti a risolvere nel modo dovuto. Abbiamo quindi dovuto ricorrere a una soluzione che comporta un maggiore carico di lavoro alla CPU della scheda Arduino. Ora la libreria è completa e funziona bene, ma siccome io sono un tantino pignolo, mi resta il dubbio che possa esistere una soluzione migliore.
Tutto nasce dalla funzione "serialEvent()", che evento non è, ma solo un polling ad ogni giro di "loop()".
Per cui, per rendere la comunicazione seriale asincrona, e indipendente da quel che l'utente scrive nel "loop()", abbiamo preparato un secondo modo di funzionamento chiamato "AsyncMode".
In questo modo di funzionamento il controllo del buffer della seriale viene chiamato dall'interrupt del comparatore del timer zero, cioè da "ISR(TIMER0_COMPA_vect)"
L'"AsyncMode" non è sempre una buona idea perché diminuisce l'efficienza di comunicazione di un 25% e potrebbe anche creare problemi con alcune librerie che utilizzano il TIMER0_COMPA_vect.
Per cui l'AsyncMode andrebbe abilitato solo se necessario.
Quindi la soluzione pulita sarebbe una "#define AsyncMode" nel file ".ino", e una compilazione condizionale nel file CPP della libreria, con alcuni "#ifdef AsyncMode", per compilare solo le parti necessarie.
Ma, a quanto pare, i file vengono compilati separatamente, e niente di quel che si scrive nel file ".ino" riesce a modificare il comportamento della precompilazione di una libreria.
Abbiamo provato di tutto, #define, costanti ecc.. Abbiamo anche provato a includere un file ".h" di definizioni... Ma il problema fondamentale resta, nessuna informazione passa dal file ".ino" alla libreria in fase di precompilazione.
Qualche idea?