RadioSvegliaGBE
SerialSender.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 SerialSender__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  SerialSender() = default;
90  // Blocco attraverso privatizzazione del distruttore trivial
97  ~SerialSender() = default;
98 
99  /*Attributi*/
100 private:
101  // Variabile che contiene il valore dell'ultima stringa inviata (attraverso la chiamata del metodo 'send)
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  /*Metodi*/
144 public:
145  // Metodo per effettuare la scrittura di dati in comunicazione seriale [rx, tx]
146  // send (1)
164  static bool send(const char* t_toSend);
165 
166  // Metodo per effettuare l'invio di dati in comunicazione seriale [rx, tx]
167  // send (2)
185  static bool send(String t_toSend);
186 
187  // Ritorna il valore del buffer (contiene il valore dell'ultima stringa letta (attraverso la chiamata al metodo 'send')
201  static inline String get_buffer();
202 
203  // Ritorna il valore del Baud Rate utilizzato
217  static inline const unsigned int& get_BaudRate();
218 
219  /*Invalidator*/
220  /*
221  L'invalidatore consiste in quel valore che viene ritornato ogni qualvolta una chiamata da parte dell'utente ai metodi non produce il risultato atteso.
222  E' importante specificare che, l'invalidatore, pur essendo costante, non deve essere dichiarato come 'constexpr' perch� NON deve seguire le regole di
223  comportamento della direttiva '#define'. Il compilatore NON deve sostituire il nome dell'attributo con un valore numerico costante --> i.e. RVALUE!!
224  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
225  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
226  solamente nell'ambito della classe di dichiarazione.
227  */
228  /*Attributo*/
229 private:
230  // Valore costante che viene ritornato in caso di invalidit� riscontrata nell'oggetto durante il dereferenziamento
231  // per la chiamata dei metodi.
232  // Il valore invalido utilizzato � un valore impossibile, cio� che non potrebbe essere mai restituito naturalemente.
234  static const String m_Invalidator_asString;
235 
236  // Valore costante che viene ritornato in caso di invalidit� riscontrata nell'oggetto durante il dereferenziamento
237  // per la chiamata dei metodi.
238  // Il valore invalido utilizzato � un valore impossibile, cio� che non potrebbe essere mai restituito naturalmente.
240  static const int m_Invalidator_asNumber;
241 
242  /*getter*/
243 public:
244  // Metodo per il ritorno del valore dell'Invalidatore. Verr� ritornata una referenza [reference --> '&'] costante, in modo tale da ottimizzare il processo e,
245  // allo stesso tempo evitare modifiche inappropriate.
246  /*
247  Un'altra particolarit� di questo metodo sta nel fatto che � definita come 'inline'. Questa keyword comunica al compilatore, ovunque trovi una chiamata
248  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).
249  Questa tecnica risulta molto utile per funzioni che effettuano pochissime operazioni e sono sottoposte a frequenti chiamate.
250  Anche qua, per via della staticit�, viene applicata la gestione analizzata prima.
251  */
262  static inline const String& get_Invalidator_asString();
263 
264  // Metodo per il ritorno del valore dell'Invalidatore. Verr� ritornata una referenza [reference --> '&'] costante, in modo tale da ottimizzare il processo e,
265  // allo stesso tempo evitare modifiche inappropriate.
266  /*
267  Un'altra particolarit� di questo metodo sta nel fatto che � definita come 'inline'. Questa keyword comunica al compilatore, ovunque trovi una chiamata
268  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).
269  Questa tecnica risulta molto utile per funzioni che effettuano pochissime operazioni e sono sottoposte a frequenti chiamate.
270  Anche qua, per via della staticit�, viene applicata la gestione analizzata prima.
271  */
282  static inline const int& get_Invalidator_asNumber();
283 };
284 
285 // Dichiarazione delle variabili GLOBALI STATICHE
286 // Risiederanno nel Data Segment
287 /*
288 Essendo statiche in classe, tutti gli attributi non sono altro che variabili GLOBALI STATICHE.
289 Per questo � richiesta la dichiarazione globale. Non � necessario specificare 'static' essendo gi� stato specificato nella dichiarazione degli
290 attributi nella classe stessa.
291 */
295 unsigned int SerialSender::m_BaudRate;
297 bool SerialSender::m_hasBeenCalled = false;
302 
303 
305 //////////////////////////////////////////////////////////////////////////
SerialSender::get_buffer
static String get_buffer()
Permette di ottenere il valore del buffer corrente.
Definition: SerialSender.cpp:83
SerialSender::m_hasBeenCalled
static bool m_hasBeenCalled
Definition: SerialSender.h:111
SerialSender::~SerialSender
~SerialSender()=default
Distruttore della classe SerialSender.
SerialSender
Classe per la gestione della scrittura dati via comunicazione seriale [rx, tx].
Definition: SerialSender.h:69
SerialSender::m_BaudRate
static unsigned int m_BaudRate
Definition: SerialSender.h:107
SerialSender::m_Invalidator_asString
static const String m_Invalidator_asString
Definition: SerialSender.h:234
SerialSender::get_BaudRate
static const unsigned int & get_BaudRate()
Permette di ottenere il valore del Baud Rate utilizzato corrente.
Definition: SerialSender.cpp:96
SerialSender__file::_invalidvalue_asNumber
static constexpr int _invalidvalue_asNumber
Definition: SerialSender.h:59
SerialSender::send
static bool send(const char *t_toSend)
Metodo per effettuare la scrittura di dati via comunicazione seriale [rx, tx].
Definition: SerialSender.cpp:40
SerialSender__file::_initvalue
static const String _initvalue
Definition: SerialSender.h:43
SerialSender::get_Invalidator_asNumber
static const int & get_Invalidator_asNumber()
Permette di ottenere l'invalidatore della classe --> int.
Definition: SerialSender.cpp:118
SerialSender__file
Spazio dei nomi riferito al file SerialSender.h.
SerialSender__file::_invalidvalue_asString
static const String _invalidvalue_asString
Definition: SerialSender.h:51
SerialSender::SerialSender
SerialSender()=default
Costruttore di default della classe SerialSender.
SerialSender::get_Invalidator_asString
static const String & get_Invalidator_asString()
Permette di ottenere l'invalidatore della classe --> String.
Definition: SerialSender.cpp:109
SerialSender::m_buffer
static String m_buffer
Definition: SerialSender.h:103
SerialSender::m_Invalidator_asNumber
static const int m_Invalidator_asNumber
Definition: SerialSender.h:240
SerialSender::Init
static bool Init(const unsigned int &t_BaudRate)
Metodo di inizializzazione dei componenti della classe.
Definition: SerialSender.cpp:15