Sto scrivendo una libreria che fa uso di un'altra libreria, che ha bisogno di essere inizializzata a livello di costruttore di un'istanza di classe, e non può settare i valori a runtime. Ha un solo costruttore e vuole due parametri. Nello specifico gli servono come parametri due interi che identificano dei pin.
Tutto ovviamente funziona se questi parametri vengono creati e forniti all'interno della mia libreria, ma supponiamo che voglia assegnarli l'utente. Nello sketch posso scrivere, anzi vorrei poter scrivere:
- Codice: Seleziona tutto
// codice errato!
#define PIN_1 12
#define PIN_2 14
#include <mialibreria.h>
void setup ()
{
// Non so come, ma la mia libreria "vede" PIN_1 e PIN_2
}
void loop ()
{
}
Ovviamente la mia libreria non "vede" PIN_1 e PIN_2 e difatti mi dà errore in compilazione dei files della mia libreria, non dello sketch. La libreria che devo utilizzare non permette di cambiare i pin a runtime e credo che non sarà l'ultima volta che avrò avuto questo problema.
Ci sono due soluzioni, che ho provato e funzionano.
1) Costringo l'utente a creare l'oggetto che mi occorre e passarlo o come puntatore o come referenza. In questo caso la dipendenza dalla libreria è esplicita per l'utente (dovrebbe sapere che sta usando due librerie) mentre vorrei che non fosse così. Avrei:
- Codice: Seleziona tutto
#define PIN_1 12
#define PIN_2 14
#include <dipendenza.h>
#include <mialibreria.h>
DependClass GV_instance (PIN_1, PIN_2) ;
void setup ()
{
mylib_use (&GV_instance) ;
}
void loop ()
{
}
2) Creo una funzione che accetta i parametri ma devo memorizzare i valori in variabili visibili solo alla libreria, poi usarli per chiamare il costruttore. L'utente vede solo la mia libreria ma spreco una ventina di bytes. E' vero che posso riutilizzare le variabili se le rendo globali alla libreria ma è la strada migliore per creare bugs difficili da identificare. D'altro canto sprecare anche un byte sui micro o arduino mi dà veramente fastidio. In questo caso:
- Codice: Seleziona tutto
#define PIN_1 12
#define PIN_2 14
#include <mialibreria.h>
void setup ()
{
/*
* I valori passati verranno memorizzati in variabili
* globali allocate nell'ambito di visibilità della
* mia libreria, poi utilizzate per l'inizializzazione
* della libreria che uso nella mia.
*/
mylib_setup (PIN_1, PIN_2) ;
}
void loop ()
{
}
So che molto dipende dai "numeri". Lo sketch dovrebbe poter girare anche su Arduini di piccola taglia e quanto ai parametri parliamo di una decina di "int", appunto 20-30 byte considerando parametri che ancora non si sono dimostrati necessari. Su "Nano" lo spazio occupato dalla mia e altre libreria inizia a essere impattante. Persino sul Mega arrivo al 18-20% e senza codice utente.
So anche che ci potrebbero essere strade "esoteriche", come derivare una classe da quella della libreria che devo usare, creare un costruttore con parametri dell'oggetto relativo alla mia libreria e passarglieli. Ebbene, queste cose non mi sono mai riuscite o non hanno mai funzionato. Solo leggere i messaggi di errore in gcc quando sono di mezzo questi problemi è un problema a sua volta. Di fatto conosco troppo male il C++ su tanti aspetti, a cominciare appunto dall'annidamento dei parametri dei costruttori. Ma se esiste una soluzione chiara e semplice rispetto alla mia incompetenza e soprattutto è una pratica standard su Arduino suppongo varrà la pena di studiarla. Magari con un esempio se possibile :)
La cosa strana è che la libreria Mysensors sembra riuscire a fare quello che vorrei. Prima dell'istruzione #include è possibile cambiare dei parametri. Ovviamente lo sketch vede le macro ma come fa a vederle la libreria se ciascuno dei suoi sorgenti non vede lo sketch utente?
Grazie per qualsiasi suggerimento. Se non c'è una soluzione migliore sceglierò la seconda perché una libreria ha senso solo se nasconde il più possibile all'utente e se scrivo con cura posso anche riutilizzare le variabili globali. Ma vorrei tanto sapere come fa Mysensors

Elettrotecnica e non solo (admin)
Un gatto tra gli elettroni (IsidoroKZ)
Esperienza e simulazioni (g.schgor)
Moleskine di un idraulico (RenzoDF)
Il Blog di ElectroYou (webmaster)
Idee microcontrollate (TardoFreak)
PICcoli grandi PICMicro (Paolino)
Il blog elettrico di carloc (carloc)
DirtEYblooog (dirtydeeds)
Di tutto... un po' (jordan20)
AK47 (lillo)
Esperienze elettroniche (marco438)
Telecomunicazioni musicali (clavicordo)
Automazione ed Elettronica (gustavo)
Direttive per la sicurezza (ErnestoCappelletti)
EYnfo dall'Alaska (mir)
Apriamo il quadro! (attilio)
H7-25 (asdf)
Passione Elettrica (massimob)
Elettroni a spasso (guidob)
Bloguerra (guerra)


