Crea costanti.
Probabilmente hai visto spesso passare una costante a una funzione nelle librerie, non c'è bisogno di andare lontano: digitalWrite(13, HIGH);. HIGH
- che cos'è? Se apri Arduino.h, troverai HIGH lì, questa è una costante #define:
#define HIGH 0x1
E in keywords.txt è elencato come LITERAL1, che gli conferisce un colore blu. Creiamo una libreria che restituisca il testo in base alla costante specificata:
File <Create_Constant.h>
#pragma once
#include <Arduino.h>
// costanti
#define MIO 0
#define SITO 1
#define WEB 2
#define ELECTRON 3
class CreateConstant
{
public:
void printing(byte value);
private:
};
File <Create_Constant.cpp>
#include <Create_Constant.h> // include il file di intestazione richiesto
void CreateConstant::printing(byte value)
{
switch (value)
{
case 0:
Serial.println("mio");
break;
case 1:
Serial.println("sito");
break;
case 2:
Serial.println("web");
break;
case 3:
Serial.println("Electron32");
break;
}
}
File <Create_Constant.ino>
#include <Create_Constant.h>
CreateConstant createObject;
void setup()
{
Serial.begin(9600);
createObject.printing(MIO);
createObject.printing(SITO);
createObject.printing(WEB);
createObject.printing(ELECTRON);
}
void loop()
{
}
File keywords.txt
#################################
#Syntax Create_Constant
#################################
#File name and Class (KEYWORD1)
#################################
Create_Constant KEYWORD1
CreateConstant KEYWORD1
#################################
#Methods and Functions (KEYWORD2)
#################################
printing KEYWORD2
#################################
#Constant (LITERAL1)
#################################
MIO LITERAL1
SITO LITERAL1
WEB LITERAL1
ELECTRON LITERAL1
Questo è il modo in cui puoi passare una parola invece di un valore e sarà più conveniente lavorare con una tale libreria. Nota che abbiamo usato costanti (define), questo non è corretto: se in un altro documento collegato di seguito o nello sketch stesso la nostra definizione corrisponde al nome di un'altra variabile, funzione o altra definizione, allora il programma non funzionerà correttamente. Il define si estende ad altri documenti, incluso il programma principale (schizzo). Cosa fare? Puoi nominare le tue costanti in un modo così unico che nessuno le intersecherà mai, ad esempio aggiungi un prefisso con il nome della libreria: MYLIB_CONSTANT. Puoi anche sostituire la definizione con un'enumerazione, quindi la tua libreria non influirà sugli altri e sul documento principale. Un esempio, lo stesso di sopra, ma su enum:
File <Create_Constant2.h>
#pragma once
#include <Arduino.h>
// costanti
enum printModes
{
MIO,
SITO,
WEB,
ELECTRON,
};
class CreateConstant
{
public:
void printing(printModes value);
private:
};
File <Create_Constant2.cpp>
#include <Create_Constant2.h> // include il file di intestazione richiesto
void CreateConstant::printing(printModes value)
{
switch (value)
{
case MIO:
Serial.println("mio");
break;
case SITO:
Serial.println("sito");
break;
case WEB:
Serial.println("web");
break;
case ELECTRON:
Serial.println("Electron32");
break;
}
}
File <Create_Constant2.ino>
#include <Create_Constant2.h>
CreateConstant createObject;
void setup()
{
Serial.begin(9600);
createObject.printing(MIO);
createObject.printing(SITO);
createObject.printing(WEB);
createObject.printing(ELECTRON);
}
void loop()
{
}
#################################
#Syntax Create_Constant2
#################################
#File name and Class (KEYWORD1)
#################################
Create_Constant2 KEYWORD1
CreateConstant KEYWORD1
#################################
#Methods and Functions (KEYWORD2)
#################################
printing KEYWORD2
#################################
#Constant (LITERAL1)
#################################
MIO LITERAL1
SITO LITERAL1
WEB LITERAL1
ELECTRON LITERAL1
L'uso di enum nella sua forma attuale può anche portare a problemi: i nomi enum (sia il nome di enum stesso che le sue costanti) non devono intersecarsi nei documenti inclusi, altrimenti si verificherà un errore di doppia dichiarazione. Che cosa esattamente:
Enumerazioni sovrapposte.
// documento doc1.h
enum motorControl
{
start,
stop,
restart,
};
// documento doc2.h
enum soundControl
{
play,
pause,
stop,
replay,
};
// documento principale
#include "doc1.h"
#include "doc2.h"
// comporterà già l'errore "il valore stop è dichiarato altrove"
Per dividere enum in file diversi, ad esempio per isolare i propri valori l'uno dall'altro, ci sono tre modi:
- Spazio dei nomi (namespace)
- enum class
- Introduzione di enum nella classe principale della libreria
Considera un esempio attraverso lo namespace.
namespace:
// documento
doc1.h
namespace motor
{
enum motorControl
{
start,
stop,
restart,
};
};
// documento
doc2.h
namespace sound
{
enum soundControl
{
play,
pause,
stop,
replay,
};
};
// documento principale
#include <doc1.h>
#include <doc2.h>
// usa lo namespace
appropriato
motor::motorControl control1 = motor::stop;
sound::soundControl sound1 = sound::stop;
enum class:
// documento
doc1.h
enum class motorControl
{
start,
stop,
restart,
};
// documento
doc2.h
enum class soundControl
{
play,
pause,
stop,
replay,
};
// documento principale
#include <doc1.h>
#include <doc2.h>
// usa lo spazio dei nomi per il valore enum
motorControl control1 = motorControl::stop;
soundControl sound1 = soundControl::stop;
Rifacciamo l'esempio sopra sotto la classe enum, nascondendo così le costanti da altri file:
File <Create_Constant3.h>
#pragma once
#include <Arduino.h>
// costanti
enum class printModes
{
MIO,
SITO,
WEB,
ELECTRON,
};
class CreateConstant
{
public:
void printing(printModes value);
private:
};
File <Create_Constant3.cpp>
#include <Create_Constant3.h> // include il file di intestazione richiesto
void CreateConstant::printing(printModes value)
{
switch (value)
{
case printModes::MIO:
Serial.println("mio");
break;
case printModes::SITO:
Serial.println("sito");
break;
case printModes::WEB:
Serial.println("web");
break;
case printModes::ELECTRON:
Serial.println("Electron32");
break;
}
}
File <Create_Constant3.ino>
#include <Create_Constant3.h>
CreateConstant createObject;
void setup()
{
Serial.begin(9600);
createObject.printing(printModes::MIO);
createObject.printing(printModes::SITO);
createObject.printing(printModes::WEB);
createObject.printing(printModes::ELECTRON);
}
void loop()
{
}
File keywords.txt
#################################
#Syntax Create_Constant3
#################################
#File name and Class (KEYWORD1)
#################################
Create_Constant3 KEYWORD1
CreateConstant KEYWORD1
#################################
#################################
#Methods and Functions (KEYWORD2)
#################################
printModes KEYWORD2
printing KEYWORD2
#################################
#Constant (LITERAL1)
#################################
MIO LITERAL1
SITO LITERAL1
WEB LITERAL1
ELECTRON LITERAL1
Un'altra opzione è dichiarare un enum all'interno della classe, quindi dovrai accedervi tramite il NOME_CLASSE::
File <Create_Constant4.h>
#pragma once
#include <Arduino.h>
class CreateConstant
{
public:
// costanti
enum printModes
{
MIO,
SITO,
WEB,
ELECTRON,
};
void printing(printModes value);
private:
};
File <Create_Constant4.cpp>
#include <Create_Constant4.h> // include il file di intestazione richiesto
void CreateConstant::printing(printModes value)
{
switch (value)
{
case MIO:
Serial.println("mio");
break;
case SITO:
Serial.println("sito");
break;
case WEB:
Serial.println("web");
break;
case ELECTRON:
Serial.println("Electron32");
break;
}
}
File <Create_Constant4.ino>
#include <Create_Constant4.h>
CreateConstant createObject;
void setup()
{
Serial.begin(9600);
createObject.printing(CreateConstant::MIO);
createObject.printing(CreateConstant::SITO);
createObject.printing(CreateConstant::WEB);
createObject.printing(CreateConstant::ELECTRON);
}
void loop()
{
}
File keywords.txt
#################################
#Syntax Create_Constant4
#################################
#File name and Class (KEYWORD1)
#################################
Create_Constant4 KEYWORD1
CreateConstant KEYWORD1
#################################
#################################
#Methods and Functions (KEYWORD2)
#################################
printing KEYWORD2
#################################
#Constant (LITERAL1)
#################################
MIO LITERAL1
SITO LITERAL1
WEB LITERAL1
ELECTRON LITERAL1