Tab Multiple

Ciao a tutti,

ho un programma scritto nell´arduino ide che é diventato abbastanza grande e quindi l´ho separato in diverse tabs.

Sono a conoscenza del fatto che l´arduino IDE compila le tabs in ordine alfabetico ma ho il seguente problema :

ho il mio main in un file chiamato “Controller_v3_2” l´unico con la lettera maiuscola delle mie tabs.
In questo file ci sta setup e loop

ho altre tabs tra cui quella “controller” in cui é implementata una funzione che ha la seguente firma:

void simplecontroller(float &V, int L,float Ldot, int &flag, int &S1, int &S2, int S1_delay_up, int S1_delay_down);

Questa funzione utilizza due funzioni:

void parse_delay(String &c, int (&delay_values)[16], boolean (&rise_fall_values)[16]);
void check_voltage_divider(String c);

queste funzioni sono implementate in una tab chiamata: “parsing” .

Quindi in ordine alfabetico ho:
Controller_v3_2, controller, parsing

Quando provo a compilare mi dice che la funzione:
parse_delay(…); é undefined.

Sono daccordo con il compilatore ma non riesco a capire perché l´errore non me lo da con l´altra funzione chiamata:
check_voltage_divider();
Mi aspetterei un errore anche per questa funzione perché anch´essa é definita in una tab che in ordine alfabetico sta dopo la tab “controller” in cui viene richiamata.

vi dico anche che nella funzione simplecontroller() implementata nella tab “controller” la funzione
check_voltage_divider();
viene richiamata prima di quella che mi da errore:
parse_delay(…);
Quindi mi aspetterei che l´errore sia prima dato dalla check_voltage_divider() e poi da parse_delay(…);

Qualcuno puó aiutarmi?
Grazie.

f.schiano: Sono a conoscenza del fatto che l´arduino IDE compila le tabs in ordine alfabetico

L'ordine di compilazione non è quello alfabetico, è determinato da come sono messi in sequenza i file nella riga di comando del compilatore e/o nel file make, l'ordine alfabetico riguarda solo come sono visualizzati i tab a partire da quello principale, che è sempre e comunque il primo. Il tuo errore prima di tutto tocca vedere se è del compilatore o del linker, le cause sono errata scrittura del nome della funzione, basta una maiuscola al posto di una minuscola, mancato inserimento del file h con i prototipi, omissione del prototipo della funzione nel relativo file .h.

io ho un file .h che contiene l´inizializzazione delle variabili ma non i prototipi delle funzioni.

Devo inserire all´interno del file .h anche i prototipi delle funzioni?

Per prototipo intendi la firma giusto?

EDIT: se quello che dici é vero riguardo l´ordine alfabetico. Perché se rinomino la tab "parsing" in "a_parsing" il tutto funziona?

f.schiano:
Devo inserire all´interno del file .h anche i prototipi delle funzioni?

Si, i file .h servono principalmente per i prototipi delle funzioni.

se ho un file .h é buona norma averne anche uno .cpp ? e organizzare il tutto come in una libreria? oppure posso farne a meno e lasciare solo il file .h per definire i valori iniziali delle variabili e inserirci i vari prototipi?

Puoi mettere un file .h con alcune definizioni. Ricordati solo di metterci anche un include "Arduino.h" nel tuo file header altrimenti in quel file non puoi usare le funzioni ed i comandi nonché i tipi specifici di Arduino.

f.schiano: se ho un file .h é buona norma averne anche uno .cpp ?

E' il contrario :) Per ogni file .c o .cpp ci dovrebbe sempre essere un file .h che contiene tutti i prototipi delle funzioni e le eventuali define, questo file .h deve essere incluso in tutti i file .c o .ccp che devono utilizzare le funzioni contenute nel file c/ccp abbinato altrimenti incorri nell'errore di funzione non definita. Attenzione a non mettere delle variabili nei file .h perché poi ti ritrovi con errori di definizioni multiple se usi il file .h più di una volta. Nel software scritto bene solitamente c'è un file common.h che contiene tutte le include e le define comuni a tutti i file c/ccp, così includi solo questo senza ogni volta dover scrivere un poema di #include :)

ok. Grazie mille . Ste cose dovrei saperle ma purtroppo essendo MAtlab il mio ambiente di programmazione preferito le dimentico spesso.

Comunque ho aggiunto al mio file initialization.h :

#include "Arduino.h"
      // LIBRARIES /////////////////////////////////////////////////////      
      // Library for the LED Strip
      #include <LPD8806.h>
      // Library for the DAC and the SD which are both working over SPI
      #include <SPI.h>
      // Library for more mathematical functions
      #include <math.h>
      // Library for Strings
      #include <String.h>
      // Library for SD card
      #include <SD.h>

Ma ricevo un errore:
In file included from Controller_v3_2.ino:8:
/initialization.h:6: fatal error: LPD8806.h: No such file or directory
compilation terminated

f.schiano: In file included from Controller_v3_2.ino:8: /initialization.h:6: fatal error: LPD8806.h: No such file or directory compilation terminated

Dove si trova il file LPD8806.h ?

eh é quello che mi stavo chiedendo. Sta nelle libraries di arduino, dove ci sono tutte le altre librerie.

devo metterlo nella stessa directory del file .h ?

f.schiano: eh é quello che mi stavo chiedendo. Sta nelle libraries di arduino, dove ci sono tutte le altre librerie.

Se è li o il nome è sbagliato oppure non si trova dentro la corretta cartella.

Ho appena controllato, la cartella LPD8806 si trova, con i rispettivi files all´interno nella cartella “libraries” di Arduino.

L´ho sempre inserita cosí una libreria e ha sempre funzionato.

Forse ho sbagliato a creare il file .h ? Perché per crearlo ho semplicementecreato un nuovo file e poi ho modificato l´estensione da .ino a .h .

Grazie

f.schiano: Forse ho sbagliato a creare il file .h ? Perché per crearlo ho semplicementecreato un nuovo file e poi ho modificato l´estensione da .ino a .h

Per quale motivo hai aggiunto un file h ad una libreria già esistente ?

scusami mi sono spiegato male.

Mi serviva la libreria LPD8806. Ho effettuato il download della cartella completa di :
examples
LPD8806.cpp
LPD8806.h

e l´ho copiata nella cartella “libraries” dell´arduino IDE.

Cosí funziona perché se scrivo:

#include <LPD8806.h>

in un qualunque sketch arduino , la libreria viene inclusa senza problemi.

Invece dal file .h mi da quel problema.

il file .h a cui mi riferisco é semplicemente un file .h che ho creato tra le mie tab e richiamo con

#include <initialization.h>

Quindi alla fine la mia cartella del progetto conterrá:
controller.ino
Controller_v3_2.ino
initializazion.h
parsing.ino

f.schiano:
il file .h a cui mi riferisco é semplicemente un file .h che ho creato tra le mie tab e richiamo con
#include <initialization.h>

Si ma questo file deve stare dove c’è il tuo sketch, non capisco perché hai dovuto creare un nuovo file .h dentro la cartella della libreria LPD8806.

no infatti non l´ho messo nella libreria LPD8806. Mi sono forse espresso male prima.

la cartella della libreria non l´ho minimamente toccata naturalmente.

Semplicemente, spostando gli include dal mio file main ( dove ci sta il setup() e il loop()) al mio file initialization.h, ho l'errore precedente.

f.schiano: Semplicemente, spostando gli include dal mio file main ( dove ci sta il setup() e il loop()) a l mio file initialization.h, ho l´errore precedente.

Stiamo facendo il giro di peppe :grin: Posta tutto lo sketch, librerie extra incluse, magari sotto forma di file rar, altrimenti non ne veniamo mai a capo.

Ok. Ma se perdi troppo tempo lascia perdere che cerco di trovarlo da solo l´errore.

In ogni caso ti ringrazio tanto. Fab.

Non ho seguito bene la discussione, ma ho letto l'ultima parte ... ... occhio che con l'IDE ci sono problemi ad includere librerie nelle librerie.

Ad esempio, io ho un mio .h che include la SoftwareSerial.h ... bene, se la SoftwareSerial.h NON la includo anche a livello di .ino, prima di includere il mio modulo .h che la usa ... l'IDE non la trova e da errore ...

Ho idea che tu sia nella stessa situazione ... :roll_eyes:

Guglielmo