RadioSvegliaGBE
SerialReader.h
Go to the documentation of this file.
1 #pragma once
2 
19 #pragma region INCLUSIONS
20 // nothing
21 #pragma endregion INCLUSIONS
22 
23 // Namespace di protezione dalle inclusioni multiple con nominazione uguale
24 /*
25 I valori constexpr, come spiegato appena sopra, equivalgono alla direttiva '#define'. Questo pu� creare problemi nel momento in cui un singolo file viene incluso
26 in una gerarchia di molti pi� file, dove si potrebbe riscontrare la presenza di constexpr appartenenti a file diversi ma con gli stessi nomi! Questa ripetitivit� dei nomi deriva
27 dagli standard di nominazione. Per evitare, quindi, conflitti di multipla definizione, andremo ad utilizzare un 'namespace', che, come dice il nome, fornisce uno SPAZIO per i NOMI del nostro
28 file in cui il 'namespace' � stato dichiarato ed implementato.
29 Mantieniamo comunque la specificazione 'static', per evitare errori di linker in caso di inclusioni multiple di questa unit� di traslazione [file].
30 */
39 namespace SerialReader__file
40 {
41  // Questo valore rappresenta il valore che viene assegnato agli attributi della classe durante l'inizializzazione.
43  static const String _initvalue = "";
44 
45  // Questo valore rappresenta il valore di assegnazione all'attributo 'm_Invalidator_asString'. Deve essere un valore "impossibile", che non
46  // deve esistere in altri contesti.
47  // In questo contesto, qualsiasi dato pu� essere inviato durante la comunicazione. Risulta quindi impossibile individuare un valore "impossibile".
48  // Per questo motivo, verr� utilizzata una "stringa campione" che gi� da se specifica di essere un invalidatore.
49  // --> String
51  static const String _invalidvalue_asString = "------___invalidator___------";
52 
53  // Questo valore rappresenta il valore di assegnazione all'attributo 'm_Invalidator_asNumber'. Deve essere un valore "impossibile", che non
54  // deve esistere in altri contesti.
55  // In questo contesto, qualsiasi dato pu� essere inviato durante la comunicazione. Risulta quindi impossibile individuare un valore "impossibile".
56  // Per questo motivo, verr� utilizzata una "stringa campione" che gi� da se specifica di essere un invalidatore.
57  // --> int
59  static constexpr int _invalidvalue_asNumber = -1;
60 }
61 
70 {
71  /*Blocco trivial*/
72  /*
73  Stiamo trattando una classe interamente statica. Per la definizione di staticit�, descritta successivamente, questa classe funger� solamente
74  da "contenitore astratto" per organizzare pi� logicamente i dati. In verit�, tutto risieder� principalmente nel Data Segment, quindi sar�
75  globale, ma statico (anche questo descritto successivamente).
76  Questa staticit� implica la NON necessit� di creare istanze di questa classe, che risulterebbero totalmente inutili dato che tutti gli attributi
77  e i metodi esistono nell'ambito globale.
78  Per evitare, quindi, inutili istanziamenti, verranno bloccati il costruttore trivial (di default generato dal compilatore) e il distruttore, reso
79  inutile dalla non-istanziabilit� della classe stessa.
80  */
81 private:
82  // Blocco attraverso privatizzazione del costruttore trivial
89  SerialReader() = default;
90  // Blocco attraverso privatizzazione del distruttore trivial
97  ~SerialReader() = default;
98 
99  /*Attributi*/
100 private:
101  // Variabile che contiene il valore dell'ultima stringa letta (attraverso la chiamata del metodo 'read')
103  static String m_buffer;
104 
105  // Variabile che contiene il valore del Baud Rate
107  static unsigned int m_BaudRate;
108 
109  // Variabile che segnala se il metodo 'Init' è stato mai chiamato oppure no
111  static bool m_hasBeenCalled;
112 
113  /*Init*/
114 public:
115  // Metodo fondamentale che "da vita" alla classe (anche se in modo differente, infatti, in questo caso, non stiamo trattando una classe WRAPPER)
116  /*
117  Inizializza la comunicazione seriale con il 'baud rate' specificato.
118  Inizializza il buffer al carattere di default definito dalla constexpr '_initvalue'.
119  Tutti gli altri metodi appartenenti alla suddetta classe saranno disattivati fino alla chimata del metodo 'Init'.
120  */
141  static bool Init(const unsigned int& t_BaudRate);
142 
143  /*Risorse Interne*/
144 private:
145  // Risorsa privata della classe "SerialReader" che effettua la lettura dei singoli valori 'char' eventualmente presenti nel porta seriale
146  // della comunicazione e restituisce una stringa equivalente.
147  /*
148  Questo metodo fornisce una risorsa per la lettura di valori presenti sulla comunicazione seriale [rx, tx].
149  Durante la comunicazione, i dati vengono inviati "char x char". Questo implica la necessit� di implementare manualmente una gestione
150  per avere i dati "compattati" in un formato pi� comodo. Questa risorsa fornisce quindi anche una formattazione dei dati, che verranno "compattati"
151  in una variabile di tipo 'String' [stringa].
152 
153  Il metodo, per via della sua logica di funzionamento, ritorna (conclude la sua funzione) solo e solamente quando riceve il carattere ASCII '0x0A',
154  che corrisponde a "\nl" (i.e. 'new line'). Una volta effettuata la chiamata, assicurarsi di fornire sempre il carattere di 'new line', altrimenti
155  l'esecuzione rimarr� in attesa "per sempre".
156  */
166  static String read_n_format();
167 
168  /*Metodi*/
169 public:
170  // Metodo per effettuare la lettura di dati in comunicazione seriale [rx, tx]
187  static String read();
188 
189  // Ritorna il valore del buffer (contiene il valore dell'ultima stringa letta (attraverso la chiamata al metodo 'read')
203  static inline String get_buffer();
204 
205  // Ritorna il valore del Baud Rate utilizzato
219  static inline const unsigned int& get_BaudRate();
220 
221  /*Invalidator*/
222  /*
223  L'invalidatore consiste in quel valore che viene ritornato ogni qualvolta una chiamata da parte dell'utente ai metodi non produce il risultato atteso.
224  E' importante specificare che, l'invalidatore, pur essendo costante, non deve essere dichiarato come 'constexpr' perch� NON deve seguire le regole di
225  comportamento della direttiva '#define'. Il compilatore NON deve sostituire il nome dell'attributo con un valore numerico costante --> i.e. RVALUE!!
226  L'invalidatore deve essere un vero e proprio attributo della classe, che per� non deve mai appartenere ad uno specifico oggetto. Per questo deve essere sempre
227  specificato come statico. Ovviamente, avr� una locazione nel Data Segment, sar� quindi globale ma statico (valido sono in questa unit� di traslazione (file)) e utilizzabile
228  solamente nell'ambito della classe di dichiarazione.
229  */
230  /*Attributo*/
231 private:
232  // Valore costante che viene ritornato in caso di invalidit� riscontrata nell'oggetto durante il dereferenziamento
233  // per la chiamata dei metodi.
234  // Il valore invalido utilizzato � un valore impossibile, cio� che non potrebbe essere mai rilevato naturalmente dal sensore.
236  static const String m_Invalidator_asString;
237 
238  // Valore costante che viene ritornato in caso di invalidit� riscontrata nell'oggetto durante il dereferenziamento
239  // per la chiamata dei metodi.
240  // Il valore invalido utilizzato � un valore impossibile, cio� che non potrebbe essere mai rilevato naturalmente dal sensore.
242  static const int m_Invalidator_asNumber;
243 
244  /*getter*/
245 public:
246  // Metodo per il ritorno del valore dell'Invalidatore. Verr� ritornata una referenza [reference --> '&'] costante, in modo tale da ottimizzare il processo e,
247  // allo stesso tempo evitare modifiche inappropriate.
248  /*
249  Un'altra particolarit� di questo metodo sta nel fatto che � definita come 'inline'. Questa keyword comunica al compilatore, ovunque trovi una chiamata
250  a questo metodo, di NON effettuare una vera e propria chiamata, ma di sostituire la porzione del codice per la chiamata con il BODY del metodo (la implementazione stessa).
251  Questa tecnica risulta molto utile per funzioni che effettuano pochissime operazioni e sono sottoposte a frequenti chiamate.
252  Anche qua, per via della staticit�, viene applicata la gestione analizzata prima.
253  */
264  static inline const String& get_Invalidator_asString();
265 
266  // Metodo per il ritorno del valore dell'Invalidatore. Verr� ritornata una referenza [reference --> '&'] costante, in modo tale da ottimizzare il processo e,
267  // allo stesso tempo evitare modifiche inappropriate.
268  /*
269  Un'altra particolarit� di questo metodo sta nel fatto che � definita come 'inline'. Questa keyword comunica al compilatore, ovunque trovi una chiamata
270  a questo metodo, di NON effettuare una vera e propria chiamata, ma di sostituire la porzione del codice per la chiamata con il BODY del metodo (la implementazione stessa).
271  Questa tecnica risulta molto utile per funzioni che effettuano pochissime operazioni e sono sottoposte a frequenti chiamate.
272  Anche qua, per via della staticit�, viene applicata la gestione analizzata prima.
273  */
284  static inline const int& get_Invalidator_asNumber();
285 };
286 
287 // Dichiarazione delle variabili GLOBALI STATICHE
288 // Risiederanno nel Data Segment
289 /*
290 Essendo statiche in classe, tutti gli attributi non sono altro che variabili GLOBALI STATICHE.
291 Per questo � richiesta la dichiarazione globale. Non � necessario specificare 'static' essendo gi� stato specificato nella dichiarazione degli
292 attributi nella classe stessa.
293 */
297 unsigned int SerialReader::m_BaudRate;
299 bool SerialReader::m_hasBeenCalled = false;
304 
306 //////////////////////////////////////////////////////////////////////////
SerialReader::m_Invalidator_asNumber
static const int m_Invalidator_asNumber
Definition: SerialReader.h:242
SerialReader::get_Invalidator_asString
static const String & get_Invalidator_asString()
Permette di ottenere l'invalidatore della classe --> String.
Definition: SerialReader.cpp:110
SerialReader__file::_invalidvalue_asString
static const String _invalidvalue_asString
Definition: SerialReader.h:51
SerialReader::m_hasBeenCalled
static bool m_hasBeenCalled
Definition: SerialReader.h:111
SerialReader::m_BaudRate
static unsigned int m_BaudRate
Definition: SerialReader.h:107
SerialReader::get_BaudRate
static const unsigned int & get_BaudRate()
Permette di ottenere il valore del Baud Rate utilizzato corrente.
Definition: SerialReader.cpp:97
SerialReader::m_buffer
static String m_buffer
Definition: SerialReader.h:103
SerialReader::Init
static bool Init(const unsigned int &t_BaudRate)
Metodo di inizializzazione dei componenti della classe.
Definition: SerialReader.cpp:15
SerialReader::m_Invalidator_asString
static const String m_Invalidator_asString
Definition: SerialReader.h:236
SerialReader::read
static String read()
Metodo per effettuare la lettura di dati via comunicazione seriale [rx, tx].
Definition: SerialReader.cpp:69
SerialReader::get_buffer
static String get_buffer()
Permette di ottenere il valore del buffer corrente.
Definition: SerialReader.cpp:84
SerialReader::~SerialReader
~SerialReader()=default
Distruttore della classe SerialReader.
SerialReader__file::_invalidvalue_asNumber
static constexpr int _invalidvalue_asNumber
Definition: SerialReader.h:59
SerialReader__file
Spazio dei nomi riferito al file SerialReader.h.
SerialReader::get_Invalidator_asNumber
static const int & get_Invalidator_asNumber()
Permette di ottenere l'invalidatore della classe --> int.
Definition: SerialReader.cpp:119
SerialReader__file::_initvalue
static const String _initvalue
Definition: SerialReader.h:43
SerialReader::read_n_format
static String read_n_format()
Risorsa interna per la formattazione corretta dei dati in lettura.
Definition: SerialReader.cpp:39
SerialReader::SerialReader
SerialReader()=default
Costruttore di default della classe SerialReader.
SerialReader
Classe per la gestione della lettura dati via comunicazione seriale [rx, tx].
Definition: SerialReader.h:69