RadioSvegliaGBE
LocalSensor.h
Go to the documentation of this file.
1 #pragma once
2 
20 #pragma region INCLUSIONS
21 // Libreria per la gestione del sensore utilizzato: DHT22
22 /*
23 Libreria di autore "Adafruit" per la gestione LowLevel di un sensore modello "DHT".
24 Sorgenti necessarie:
25 --- DHT sensor library by Adafruit
26 --- Adafruit Unified Sensor by Adafruit
27 */
28 #include <DHT.h>
29 #pragma endregion INCLUSIONS
30 
31 /*
32 E' importante ricordare che le espressioni costanti 'constexpr' equivalgono alla direttiva '#define'.
33 Questo significa che, durante la fase di compilazione, avviene un REPLACEMENT da parte del compilatore, che, dovunque
34 trova il nome assegnato alla 'constexpr' lo SOSTITUISCE con il rispettivo valore.
35 Questo ci fa capire che, in verità, le 'constexpr' sono RVALUE e NON risiedono nel Data Segment come le variabili globali (si/no statiche).
36 */
37 
38 // Namespace di protezione dalle inclusioni multiple con nominazione uguale
39 /*
40 I valori constexpr, come spiegato appena sopra, equivalgono alla direttiva '#define'. Questo può creare problemi nel momento in cui un singolo file viene incluso
41 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
42 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
43 file in cui il 'namespace' è stato dichiarato ed implementato.
44 Mantieniamo comunque la specificazione 'static', per evitare errori di linker in caso di inclusioni multiple di questa unità di traslazione [file].
45 */
46 
55 namespace LocalSensor__file
56 {
57  // Espressione costante (equivalente della direttiva '#define') per la definizione di un valore di "non-pin".
58  // Questo valore rappresenta lo stato delle variabili contenenti valori relativi ai PIN prima dell'inizializzazione.
59  /*Lasciare variabili PIN senza inizializzazione potrebbe causare risultati indefiniti.*/
61  static constexpr auto _nopin = -1;
62 
63  // Espressione costante (equivalente della direttiva '#define') per la definizione di un valore di "_invalidvalue".
64  // Questo valore rappresenta il valore di assegnazione all'attributo 'm_Invalidator'. Deve essere un valore "impossibile", che non
65  // deve esistere in altri contesti.
67  static constexpr float _invalidvalue = -999.9;
68 }
69 
79 {
80  /*Blocco trivial*/
81  /*
82  Stiamo trattando una classe interamente statica. Per la definizione di staticità, descritta successivamente, questa classe fungerà solamente
83  da "contenitore astratto" per organizzare più logicamente i dati. In verità, tutto risiederà principalmente nel Data Segment, quindi sarà
84  globale, ma statico (anche questo descritto successivamente).
85  Questa staticità implica la NON necessità di creare istanze di questa classe, che risulterebbero totalmente inutili dato che tutti gli attributi
86  e i metodi esistono nell'ambito globale.
87  Per evitare, quindi, inutili istanziamenti, verranno bloccati il costruttore trivial (di default generato dal compilatore) e il distruttore, reso
88  inutile dalla non-istanziabilità della classe stessa.
89  */
90 private:
91  // Blocco attraverso privatizzazione del costruttore trivial
98  LocalSensor() = default;
99  // Blocco attraverso privatizzazione del distruttore trivial
106  ~LocalSensor() = default;
107 
108  /*Enumerazioni*/
109  /*
110  Una enumerazione permette una gestione più intelligente degli "switcher" forniti all'utente finale.
111  Tramite nomi significativi, si gestiscono gli "switcher" appunto con dei nomi, utilizzati per mascherare i valori di enumerazione meno significativi per l'utente.
112  Anche qua si applica la staticità descritta successivamente. Una classe di enumarazione è automaticamente statica.
113  */
123 public:
124  enum class TemperatureUnit
125  {
126  CELSIUS,
127  FAHRENHEIT
128  };
129 
130  /*Attributi*/
131 private:
132  // Puntatore al sensore stesso, rappresentato da un oggetto di classe "DHT"
133  /*
134  Questa variabile conterrà l'istanza dell'oggetto sensore creata durante l'operazione di inizializzazione.
135  L'oggetto sarà sottoposto ad allocazione dinamica [heap]. Questo per evitare problemi con la deallocazione mirata all'ambito
136  caratteristica della memoria statica [stack]. Una allocazione statica [stack] provocherebbe l'allocazione e successiva deallocazione
137  immediata dell'oggetto esistendo solamente nell'ambito di inizializzazione.
138  Essendo statica, la variabile (puntatore) verrà allocata nel 'Data Segment' (segmento dei dati) ed "esisterà" fino a termine
139  del programma stesso. Quindi si tratta di una variabile globale, ma statica. Questo la rende esistente solamente in questa unità
140  di traslazione (file).
141  */
143  static DHT* m_Sensor;
144 
145  // Valore del PIN utilizzato per la lettura dei valori corrispondenti alla temperatura
146  /*
147  Questa variabile conterrà il valore che rappresenta il PIN fisico utilizzato per interfacciare il sensore.
148  Il tipo di variabile che rappresenta un PIN è un semplice intero [int].
149  Anche qua, per via della staticità, viene applicata la gestione analizzata prima.
150  */
152  static int m_SensorPin;
153 
154  // Modello del sensore utilizzato per la lettura dei valori
155  /*
156  Questa variabile conterrà il modello (codice identificativo) del sensore che verrà utilizzato.
157  La variabile è resa necessaria dalla presenza della libreria "DHT", la quale può gestire più sensori e quindi necessità
158  del modello del sensore in uso.
159  Anche questa variabile è un tipo intero [int]. Le specificazioni del modello sono solitamente rappresentate da SIGLE
160  (e.g. DHT11, DHT22...) le quali sono rappresentano soltano dei nomi, ma in verità sono dei semplici interi.
161  Anche qua, per via della staticità, viene applicata la gestione analizzata prima.
162  */
164  static int m_SensorType;
165 
166  // Variabile di salvataggio della temperatura rilevata
167  /*
168  Questa variabile conterrà il valore della temperatura rilevata. Il tipo è un numero decimale [float].
169  Esso può rappresentare una temperatura in CELSIUS o FAHRENHEIT. Questa scelta viene fornita dal metodo
170  che verrà utilizzato per la lettura stessa.
171  La variabile viene continuamente aggiornata ad ogni ricampionamento da parte del sensore.
172  Anche qua, per via della staticità, viene applicata la gestione analizzata prima.
173  */
175  static float m_Temperature;
176 
177  // Variabile di salvataggio dell'umidità rilevata
178  /*
179  Questa variabile conterrà il valore della temperatura rilevata. Il tipo è un numero decimale [float] che rappresenta una
180  PERCENTUALE. La variabile viene continuamente aggiornata ad ogni ricampionamento da parte del sensore.
181  Anche qua, per via della staticità, viene applicata la gestione analizzata prima.
182  */
184  static float m_Humidity;
185 
186  /*Init*/
187 public:
188  // Inizializza il sensore tramite il costruttore della classe "DHT"
189  /*
190  Questo metodo, fondamentale, "dà vita" al sensore. Effettua una allocazione (dinamica [heap]) attraverso un costruttore
191  parametrico della classe "DHT". Questo costruttore richiede 2 parametri:
192  --- PIN fisico utilizzato per interfacciare il sensore. Parametro -> 't_SensorPin'
193  --- Modello (codice identificativo) del sensore utilizzato. Parametro -> 't_SensorType'
194  I parametri, per evitare inutili copie, vengono passati per riferimento [reference --> '&'].
195  Il passaggio di questi due valori come parametri potrebbe indurre a dubitare l'utilità dei 2 attributi: 'm_SensorPin' e 'm_SensorType'.
196  Questo è sbagliato perchè il salvataggio di parametri "vitali" per il corretto funzionamento della classe evita la necessità di "recall"
197  per la ripresentazione degli stessi parametri.
198  Il metodo ritorna un valore booleano, utilizzato per comunicare eventuali errori durante l'allocazione.
199  Inoltre, prima dell'effettiva allocazione, esegue una deallocazione [delete] se necessaria.
200  Anche qua ritroviamo la specificazione di staticità. Nel caso di applicazione ad un metodo, dissocia il metodo stesso da qualsiasi possibile istanza
201  della classe. Quindi, il metodo sarà richiamabile come se fosse globale (e statico). Sarà solamente necessario anteporre il nome della classe di
202  appartenenza. Ricordiamo anche che i metodi statici possono operare solo su variabili statiche, che anch'esse, essendo globali (e statiche) sono
203  totalmente dissociate da possibili istanze della classe stessa (da oggetti).
204  */
224  static bool Init(const int& t_SensorPin, const int& t_SensorType);
225 
226  /*Service Management*/
238  static bool Begin();
239 
240  /*LowLevel getters*/
241  /*
242  I seguenti metodi LowLevel sono supposti soprattutto per uso a scopo di debug e management manuale.
243  Forniscono un punto di accesso costante a VALORE MODIFICABILE (quindi dereferenziabile ma non reindirizzabile).
244  In release mode, potrebbe risultare efficace cambiare il contrassegno da 'public' a 'private'.
245  Anche qua, per via della staticità, viene applicata la gestione analizzata prima.
246  */
247 public:
248  // Ritorna un puntatore a 'm_SensorPin'
260  static int* const get_SensorPin();
261 
262  // Ritorna un puntatore a 'm_SensorType'
274  static int* const get_SensorType();
275 
276  // Ritorna un puntatore all'oggetto di classe "DHT"
288  static DHT* const get_Sensor();
289 
290  /*LowLevel reallocator*/
291  /*
292  Il seguente metodo è supposto soprattutto per uso a scopo di debug e management manuale.
293  Esegue una riallocazione dell'oggetto sensore costruito con il rispettivo costruttore parametrico (della libreria "DHT") con i valori degli attributi interessati
294  della classe.
295  Inoltre, prima dell'effettiva riallocazione, esegue una deallocazione [delete] se necessaria.
296  Il metodo ritorna un valore booleano, utilizzato per comunicare eventuali errori durante l'allocazione.
297  Anche qua, per via della staticità, viene applicata la gestione analizzata prima.
298  */
299 public:
300  // Riesegue una operazione di inizializzazione con i valori degli attributi 'm_SensorPin' ed 'm_SensorType'
317  static bool ReInit();
318 
319  /*Metodi*/
320 public:
321  // Ritorna il valore corrispondente alla temperatura rilevata
322  // Parametro 't_Switch' per la selezione dell'unità di misura
323  /*
324  TemperatureUnit::FAHRENHEIT --> FAHRENHEIT ---> maschera: "1" (valore booleano corrispondente --> 'true')
325  TemperatureUnit::CELSIUS --> CELSIUS --> maschera_ "0" (valore booleano corrispondente --> 'false')
326  */
327  /*
328  Questo metodo rappresenta la principale ragione dell'esistenza di questa classe. Permette il campionamento del valore della temperatura,
329  il quale verrà successivamente restituito.
330  E' importante specificare la non possibilità di un ritorno con riferimento [reference --> '&']. Questo a causa della presenza di un rvalue, o
331  comunque di una deallocazione ad ambito.
332  Il tipo del valore ritornato è un numero decimale [float]. E' stato reso costante vista la non necessità di modifiche sulla copia in ritorno.
333  Anche qua, per via della staticità, viene applicata la gestione analizzata prima.
334  */
349  static const float get_Temperature(const TemperatureUnit& t_Switch);
350 
351  // Ritorna il valore corrispondente all'umidità rilevata
352  /*
353  Questo metodo rappresenta la seconda principale ragione dell'esistenza di questa classe. Permette il campionamento del valore dell'umidità, il
354  quale verrà successivamente restituito.
355  Stessa motivazione riguardo il riferimento.
356  Il tipo del valore ritornato è un numero decimale [float]. E' stato reso costante vista la non necessità di modifiche sulla copia in ritorno.
357  Anche qua, per via della staticità, viene applicata la gestione analizzata prima.
358  */
370  static const float get_Humidity();
371 
372  /*Invalidator*/
373  /*
374  L'invalidatore consiste in quel valore che viene ritornato ogni qualvolta una chiamata da parte dell'utente ai metodi non produce il risultato atteso.
375  E' importante specificare che, l'invalidatore, pur essendo costante, non deve essere dichiarato come 'constexpr' perchè NON deve seguire le regole di
376  comportamento della direttiva '#define'. Il compilatore NON deve sostituire il nome dell'attributo con un valore numerico costante --> i.e. RVALUE!!
377  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
378  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
379  solamente nell'ambito della classe di dichiarazione.
380  */
381  /*Attributo*/
382 private:
383  // Valore costante che viene ritornato in caso di invalidità riscontrata nell'oggetto durante il dereferenziamento
384  // per la chiamata dei metodi.
385  // Il valore invalido utilizzato è un valore impossibile, cioè che non potrebbe essere mai rilevato naturalmente dal sensore.
387  static const float m_Invalidator;
388 
389  /*getter*/
390 public:
391  // Metodo per il ritorno del valore dell'Invalidatore. Verrà ritornata una referenza [reference --> '&'] costante, in modo tale da ottimizzare il processo e,
392  // allo stesso tempo evitare modifiche inappropriate.
393  /*
394  Un'altra particolarità di questo metodo sta nel fatto che è definita come 'inline'. Questa keyword comunica al compilatore, ovunque trovi una chiamata
395  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).
396  Questa tecnica risulta molto utile per funzioni che effettuano pochissime operazioni e sono sottoposte a frequenti chiamate.
397  Anche qua, per via della staticità, viene applicata la gestione analizzata prima.
398  */
409  static inline const float& get_Invalidator();
410 };
411 
412 // Dichiarazione delle variabili GLOBALI STATICHE
413 // Risiederanno nel Data Segment
414 /*
415 Essendo statiche in classe, tutti gli attributi non sono altro che variabili GLOBALI STATICHE.
416 Per questo è richiesta la dichiarazione globale. Non è necessario specificare 'static' essendo già stato specificato nella dichiarazione degli
417 attributi nella classe stessa.
418 */
420 DHT* LocalSensor::m_Sensor = nullptr;
431 
LocalSensor::m_Temperature
static float m_Temperature
Definition: LocalSensor.h:175
LocalSensor__file::_nopin
static constexpr auto _nopin
Definition: LocalSensor.h:61
LocalSensor__file
Spazio dei nomi riferito al file LocalSensor.h.
LocalSensor::Begin
static bool Begin()
Metodo di avvio del sensore.
Definition: LocalSensor.cpp:46
LocalSensor::m_SensorPin
static int m_SensorPin
Definition: LocalSensor.h:152
LocalSensor::get_Humidity
static const float get_Humidity()
Permette di ottenere il valore dell'umidità rilevata.
Definition: LocalSensor.cpp:124
LocalSensor
Classe per la gestione del sensore di temperatura ed umidità della radiosveglia.
Definition: LocalSensor.h:78
LocalSensor::m_SensorType
static int m_SensorType
Definition: LocalSensor.h:164
LocalSensor::m_Humidity
static float m_Humidity
Definition: LocalSensor.h:184
LocalSensor::Init
static bool Init(const int &t_SensorPin, const int &t_SensorType)
Metodo di inizializzazione dei componenti della classe.
Definition: LocalSensor.cpp:15
LocalSensor::get_Invalidator
static const float & get_Invalidator()
Permette di ottenere l'invalidatore della classe.
Definition: LocalSensor.cpp:141
LocalSensor::TemperatureUnit::CELSIUS
LocalSensor::get_SensorPin
static int *const get_SensorPin()
LowLevel getter per l'attributo m_SensorPin.
Definition: LocalSensor.cpp:60
LocalSensor::TemperatureUnit::FAHRENHEIT
LocalSensor::~LocalSensor
~LocalSensor()=default
Distruttore della classe LocalSensor.
LocalSensor::get_Temperature
static const float get_Temperature(const TemperatureUnit &t_Switch)
Permette di ottenere il valore della temperatura rilevata.
Definition: LocalSensor.cpp:107
LocalSensor::TemperatureUnit
TemperatureUnit
Enumerazione per la gestione dell'unità per la misurazione della temperatura.
Definition: LocalSensor.h:124
LocalSensor::ReInit
static bool ReInit()
LowLevel reallocator della classe LocalSensor.
Definition: LocalSensor.cpp:83
LocalSensor::m_Invalidator
static const float m_Invalidator
Definition: LocalSensor.h:387
LocalSensor::m_Sensor
static DHT * m_Sensor
Definition: LocalSensor.h:143
LocalSensor::get_SensorType
static int *const get_SensorType()
LowLevel getter per l'attributo m_SensorType.
Definition: LocalSensor.cpp:68
LocalSensor::LocalSensor
LocalSensor()=default
Costruttore di default della classe LocalSensor.
LocalSensor__file::_invalidvalue
static constexpr float _invalidvalue
Definition: LocalSensor.h:67
LocalSensor::get_Sensor
static DHT *const get_Sensor()
LowLevel getter per l'attributo m_Sensor.
Definition: LocalSensor.cpp:76