RadioSvegliaGBE
Clock.cpp
Go to the documentation of this file.
1 
11 // Inclusione <automatica> dell'header che si sta implementando
12 #include "Clock.h"
13 
14 // Implementazione del metodo 'Init' della categoria 'Init'
15 // Init (1) --> default
17 {
18  // Se esiste, dealloco istanza corrente per 'm_NTPEntryPoint'
19  if (m_NTPEntryPoint)
20  {
21  // Deallocazione
22  // Arresta l'interrogazione del Time Server
23  StopService();
24  delete m_NTPEntryPoint;
25 
26  // Sanificazione manuale
27  m_NTPEntryPoint = nullptr;
28  }
29 
30  // Se esiste, dealloco istanza corrente per 'm_UDPProtocol'
31  if (m_UDPProtocol)
32  {
33  // Deallocazione
34  delete m_UDPProtocol;
35 
36  // Sanificazione manuale
37  m_UDPProtocol = nullptr;
38  }
39 
40  // Assegnazione constexpr agli attributi della classe (valori di default)
46 
47  // Costruzione dell'oggetto di classe "WiFiUDP" con il rispettivo costruttore di default
48  m_UDPProtocol = new WiFiUDP();
49 
50  // Costruzione dell'oggetto di classe "NTPClient" con il rispettivo costruttore parametrico
51  // Verranno utilizzati i valori degli attributi 'm_UDPProtocol', 'm_PoolingZone', 'm_TimeOffset', 'm_UpdateInterval'
53 
54  // Dopo l'allocazione, controllo che effettivamente è andata a buon fine. Un puntatore nullo (i.e. 'nullptr') sarebbe indice di errori durante l'allocazione.
56  // Inizia l'interrogazione del Time Server
57  // L'interrogazione ha inizio solamente se presente una connessione ad Internet. In caso affermativo, la funzione 'StartService' ritornerà un valore booleano 'true'.
58  // In caso negativo, un valore booleano 'false'.
59  return StartService();
60 
61  return false;
62 }
63 
64 // Implementazione del metodo 'Init' della categoria 'Init'
65 // Init (2) --> parametrico
66 bool Clock::Init(const TimeFormat& t_TimeFormat)
67 {
68  // Se esiste, dealloco istanza corrente per 'm_NTPEntryPoint'
69  if (m_NTPEntryPoint)
70  {
71  // Deallocazione
72  // Arresta l'interrogazione del Time Server
73  StopService();
74  delete m_NTPEntryPoint;
75 
76  // Sanificazione manuale
77  m_NTPEntryPoint = nullptr;
78  }
79 
80  // Se esiste, dealloco istanza corrente per 'm_UDPProtocol'
81  if (m_UDPProtocol)
82  {
83  // Deallocazione
84  delete m_UDPProtocol;
85 
86  // Sanificazione manuale
87  m_UDPProtocol = nullptr;
88  }
89 
90  // Assegnazione constexpr agli attributi della classe (valori di default)
95 
96  // Assegnazione parametro 't_TimeFormat' all'attributo 'm_TimeFormat'
97  m_TimeFormat = t_TimeFormat;
98 
99  // Costruzione dell'oggetto di classe "WiFiUDP" con il rispettivo costruttore di default
100  m_UDPProtocol = new WiFiUDP();
101 
102  // Costruzione dell'oggetto di classe "NTPClient" con il rispettivo costruttore parametrico
103  // Verranno utilizzati i valori degli attributi 'm_UDPProtocol', 'm_PoolingZone', 'm_TimeOffset', 'm_UpdateInterval'
105 
106  // Dopo l'allocazione, controllo che effettivamente è andata a buon fine. Un puntatore nullo (i.e. 'nullptr') sarebbe indice di errori durante l'allocazione.
108  // Inizia l'interrogazione del Time Server
109  // L'interrogazione ha inizio solamente se presente una connessione ad Internet. In caso affermativo, la funzione 'StartService' ritornerà un valore booleano 'true'.
110  // In caso negativo, un valore booleano 'false'.
111  return StartService();
112 
113  return false;
114 }
115 
116 // Implementazione del metodo 'Init' della categoria 'Init'
117 // Init (3) --> parametrico
118 bool Clock::Init(WiFiUDP* t_UDPProtocol, const char* t_PoolingZone, const int& t_TimeOffset, const int& t_UpdateInterval, const TimeFormat& t_TimeFormat)
119 {
120  // Se esiste, dealloco istanza corrente per 'm_NTPEntryPoint'
121  if (m_NTPEntryPoint)
122  {
123  // Deallocazione
124  // Arresta l'interrogazione del Time Server
125  StopService();
126  delete m_NTPEntryPoint;
127 
128  // Sanificazione manuale
129  m_NTPEntryPoint = nullptr;
130  }
131 
132  // Se esiste, dealloco istanza corrente per 'm_UDPProtocol'
133  if (m_UDPProtocol)
134  {
135  // Deallocazione
136  delete m_UDPProtocol;
137 
138  // Sanificazione manuale
139  m_UDPProtocol = nullptr;
140  }
141 
142  // Assegnazione parametri agli attributi della classe
143  m_UDPProtocol = t_UDPProtocol; /*si suppone oggetto già allocato. Controllo alla fine. Valore booleano in risposta.*/
144  m_PoolingZone = t_PoolingZone;
145  m_TimeOffset = t_TimeOffset;
146  m_UpdateInterval = t_UpdateInterval;
147  m_TimeFormat = t_TimeFormat;
148 
149  // Assegnazione constexpr '_TimePeriod' all'attributo 'm_Period' della classe (valore di default)
151 
152  // Costruzione dell'oggetto di classe "NTPClient" con il rispettivo costruttore parametrico
153  // Verranno utilizzati i valori degli attributi 'm_UDPProtocol', 'm_PoolingZone', 'm_TimeOffset', 'm_UpdateInterval'
155 
156  // Dopo l'allocazione, controllo che effettivamente è andata a buon fine. Un puntatore nullo (i.e. 'nullptr') sarebbe indice di errori durante l'allocazione.
158  // Inizia l'interrogazione del Time Server
159  // L'interrogazione ha inizio solamente se presente una connessione ad Internet. In caso affermativo, la funzione 'StartService' ritornerà un valore booleano 'true'.
160  // In caso negativo, un valore booleano 'false'.
161  return StartService();
162 
163  return false;
164 }
165 
166 // Implementazione del metodo 'StartService' della categoria 'Service management'
168 {
169  // Controllo se è presente una connessione ad Internet
170  // Per effettuare questa operazione, utilizzo l'oggetto già istanziato nella definizione della libreria "ESP8266WiFi"
171  // Utilizzo il metodo "status" sempre della stessa classe ed effettuo il confronto con il valore intero rappresentato dal campo 'WL_CONNECTED' dell'enumerazione appartenente
172  // sempre alla medesima classe.
173  if (WiFi.status() == WL_CONNECTED && m_NTPEntryPoint)
174  {
175  // In caso affermativo, supponendo l'oggetto 'm_NTPEntryPoint' già allocato, avvio l'interrogazione del Time Server.
176  m_NTPEntryPoint->begin();
177  return true;
178  }
179 
180  // In caso negativo, non eseguo nessuna azione. L'interrogazione del Time Server non avrà inizio.
181  return false;
182 }
183 
184 // Implementazione del metodo 'StopService' della categoria 'Service management'
186 {
187  // Supponendo l'oggetto 'm_NTPEntryPoint' già allocato, arresto l'interrogazione del Time Server.
188  // Non importa se l'interrogazione è effettivamente in corso oppure no.
189  if (m_NTPEntryPoint)
190  {
191  m_NTPEntryPoint->end();
192  return true;
193  }
194  else
195  return false;
196 }
197 
198 // Implementazione del metodo 'get_UDPProtocol' della categoria 'LowLevel getters'
199 WiFiUDP* const Clock::get_UDPProtocol()
200 {
201  // Ritorno l'attributo 'm_UDPProtocol' perchè rappresenta già un puntatore
202  return m_UDPProtocol;
203 }
204 
205 // Implementazione del metodo 'm_NTPEntryPoint' della categoria 'LowLevel getters'
206 NTPClient* const Clock::get_NTPEntryPoint()
207 {
208  // Ritorno l'attributo 'm_NTPEntryPoint' perchè rappresenta già un puntatore
209  return m_NTPEntryPoint;
210 }
211 
212 // Implementazione del metodo 'get_PoolingZone' della categoria 'LowLevel getters'
213 const char* const Clock::get_PoolingZone()
214 {
215  // Ritorno l'indirizzo di memoria dell'attributo 'm_PoolingZone'
216  // Calcolo dell'indirizzo attraverso utilizzo dell'operatore '&'
217  return m_PoolingZone;
218 }
219 
220 // Implementazione del metodo 'get_TimeOffset' della categoria 'LowLevel getters'
222 {
223  // Ritorno l'indirizzo di memoria dell'attributo 'm_TimeOffset'
224  // Calcolo dell'indirizzo attraverso utilizzo dell'operatore '&'
225  return &m_TimeOffset;
226 }
227 
228 // Implementazione del metodo 'get_UpdateInterval' della categoria 'LowLevel getters'
230 {
231  // Ritorno l'indirizzo di memoria dell'attributo 'm_TimeOffset'
232  // Calcolo dell'indirizzo attraverso utilizzo dell'operatore '&'
233  return &m_UpdateInterval;
234 }
235 
236 // Implementazione del metodo 'get_TimeFormat' della categoria 'LowLevel getters'
238 {
239  // Ritorno l'indirizzo di memoria dell'attributo 'm_TimeFormat'
240  // Calcolo dell'indirizzo attraverso utilizzo dell'operatore '&'
241  return &m_TimeFormat;
242 }
243 
244 // Implementazione del metodo 'get_TimePeriod' della categoria 'LowLevel getters'
246 {
247  // Ritorno l'indirizzo di memoria dell'attributo 'm_TimePeriod'
248  // Calcolo dell'indirizzo attraverso l'utilizzo dell'operatore '&'
249  return &m_Period;
250 }
251 
252 // Implementazione del metodo 'ReInit' della categoria 'LowLevel reallocator'
254 {
255  // Se esiste, dealloco istanza corrente per 'm_NTPEntryPoint'
256  if (m_NTPEntryPoint)
257  {
258  // Deallocazione
259  // Arresta l'interrogazione del Time Server
260  StopService();
261  delete m_NTPEntryPoint;
262 
263  // Sanificazione manuale
264  m_NTPEntryPoint = nullptr;
265  }
266 
267  // Se esiste, dealloco istanza corrente per 'm_UDPProtocol'
268  if (m_UDPProtocol)
269  {
270  // Deallocazione
271  delete m_UDPProtocol;
272 
273  // Sanificazione manuale
274  m_UDPProtocol = nullptr;
275  }
276 
277  // Non effettua alcuna modifica sugli attributi
278 
279  // Costruzione dell'oggetto di classe "WiFiUDP" con il rispettivo costruttore di default
280  m_UDPProtocol = new WiFiUDP();
281 
282  // Costruzione dell'oggetto di classe "NTPClient" con il rispettivo costruttore parametrico
283  // Verranno utilizzati i valori degli attributi 'm_UDPProtocol', 'm_PoolingZone', 'm_TimeOffset', 'm_UpdateInterval'
285 
286  // Dopo l'allocazione, controllo che effettivamente è andata a buon fine. Un puntatore nullo (i.e. 'nullptr') sarebbe indice di errori durante l'allocazione.
288  // Inizia l'interrogazione del Time Server
289  // L'interrogazione ha inizio solamente se presente una connessione ad Internet. In caso affermativo, la funzione 'StartService' ritornerà un valore booleano 'true'.
290  // In caso negativo, un valore booleano 'false'.
291  return StartService();
292 
293  return false;
294 }
295 
296 // Implementazione del metodo 'set_TimeFormat' della categoria 'Value Setters'
297 bool Clock::set_TimeFormat(const TimeFormat& t_TimeFormat)
298 {
299  // Prima di procedere, controllo che l'inizializzazione della classe sia già stata eseguita
300  // Se così non fosse, il valore di 'm_TimeFormat' sarebbe un valore indeterminato, causando risultati indefiniti durante il confronto.
301  // La presenza di riferimenti validi negli attributi 'm_UDPProtocol' e 'm_NTPEntryPoint' è segno di una inizializzazione già effettuata e correttamente completata
303  {
304  // Prima dell'assegnamento, effettuo un controllo per verificare la effettiva necessità dell'assegnamento
305  if (t_TimeFormat == m_TimeFormat)
306  // Operazione di assegnamento non necessaria
307  return false;
308 
309  // Operazione di assegnamento necessaria
310  m_TimeFormat = t_TimeFormat;
311 
312  return true;
313  }
314  else
315  return false;
316 }
317 
318 // Implementazione del metodo 'get_Day' della categoria 'Metodi'
320 {
321  // Ritorno il valore che ottengo attraverso la chiamata della funzione 'getDay'
322  // della libreria "NTPClient"
323  /*Ausilio dell'operatore '->' per dereferenziamento "nascosto"*/
324 
325  // Prima di ritornare il valore, lo AGGIORNO attraveso la funzione "update" della libreria "NTPClient"
326  // Questo perchè, una volta avviata l'interrogazione del Time Server, la richiesta dei valori avviene ogni 'm_UpdateInterval' millisecondi.
327  // Con i nostri dati di inizializzazione avviene ogni 60 secondi. Richiamando, invece, manualmente il metodo "update", forzo un aggiornamento dei valori.
328 
329  // Prima di richiamare il corrispettivo metodo della classe "NTPClient", controllo che l'oggetto di classe "NTPClient"
330  // sia stato già allocato. Una chiamata su un oggetto non allocato (i.e. 'nullptr') causerebbe una eccezione con
331  // conseguente fail della memoria.
332  // Il funzionamento dell'oggetto di classe di classe "NTPClient" dipende anche dall'oggetto di classe "WiFiUDP".
333  // Per questo motivo, effettuo un controllo anche su quello.
334  // Infine, effettuo anche un controllo sulla connessione. Chiamo i metodi solo se sono connesso ad Internet, questo perchè essi richiedono
335  // una connessione per funzionare correttamente.
336  if (m_UDPProtocol && m_NTPEntryPoint && WiFi.status() == WL_CONNECTED)
337  {
338  m_NTPEntryPoint->update();
339  return m_NTPEntryPoint->getDay();
340  }
341  else
342  return m_Invalidator;
343 }
344 
345 // Implementazione del metodo 'get_Hours' della categoria 'Metodi'
347 {
348  // Ritorno il valore che ottengo attraverso la chiamata della funzione 'getHours'
349  // della libreria "NTPClient"
350  /*Ausilio dell'operatore '->' per dereferenziamento "nascosto"*/
351 
352  // Prima di ritornare il valore, lo AGGIORNO attraveso la funzione "update" della libreria "NTPClient"
353  // Questo perchè, una volta avviata l'interrogazione del Time Server, la richiesta dei valori avviene ogni 'm_UpdateInterval' millisecondi.
354  // Con i nostri dati di inizializzazione avviene ogni 60 secondi. Richiamando, invece, manualmente il metodo "update", forzo un aggiornamento dei valori.
355 
356  // Prima di richiamare il corrispettivo metodo della classe "NTPClient", controllo che l'oggetto di classe "NTPClient"
357  // sia stato già allocato. Una chiamata su un oggetto non allocato (i.e. 'nullptr') causerebbe una eccezione con
358  // conseguente fail della memoria.
359  // Il funzionamento dell'oggetto di classe di classe "NTPClient" dipende anche dall'oggetto di classe "WiFiUDP".
360  // Per questo motivo, effettuo un controllo anche su quello.
361  // Infine, effettuo anche un controllo sulla connessione. Chiamo i metodi solo se sono connesso ad Internet, questo perchè essi richiedono
362  // una connessione per funzionare correttamente.
363  if (m_UDPProtocol && m_NTPEntryPoint && WiFi.status() == WL_CONNECTED)
364  {
365  // Prima di effettuare l'aggiornamamento e ritornare il corrispettivo valore, controllo il valore dell'attributo 'm_TimeFormat'
366  // per determinare il formato dell'ora [12h/24h]
367  switch (m_TimeFormat)
368  {
370  // Formato 12h
371  {
372  m_NTPEntryPoint->update();
373  auto l_Supporter = m_NTPEntryPoint->getHours();
374 
375  if (l_Supporter > Clock__file::_Period)
376  {
377  // Imposta PM
379  return (l_Supporter - Clock__file::_Period);
380  }
381  else /*<=*/
382  {
383  // Imposta AM
385  return l_Supporter;
386  }
387  break;
388  }
390  // Formato 24h
391  // Imposto NOT_USED
393 
394  m_NTPEntryPoint->update();
395  return m_NTPEntryPoint->getHours();
396  break;
397  }
398  }
399  else
400  return m_Invalidator;
401 }
402 
403 // Implementazione del metodo 'get_Minutes' della categoria 'Metodi'
405 {
406  // Ritorno il valore che ottengo attraverso la chiamata della funzione 'getMinutes'
407  // della libreria "NTPClient"
408  /*Ausilio dell'operatore '->' per dereferenziamento "nascosto"*/
409 
410  // Prima di ritornare il valore, lo AGGIORNO attraveso la funzione "update" della libreria "NTPClient"
411  // Questo perchè, una volta avviata l'interrogazione del Time Server, la richiesta dei valori avviene ogni 'm_UpdateInterval' millisecondi.
412  // Con i nostri dati di inizializzazione avviene ogni 60 secondi. Richiamando, invece, manualmente il metodo "update", forzo un aggiornamento dei valori.
413 
414  // Prima di richiamare il corrispettivo metodo della classe "NTPClient", controllo che l'oggetto di classe "NTPClient"
415  // sia stato già allocato. Una chiamata su un oggetto non allocato (i.e. 'nullptr') causerebbe una eccezione con
416  // conseguente fail della memoria.
417  // Il funzionamento dell'oggetto di classe di classe "NTPClient" dipende anche dall'oggetto di classe "WiFiUDP".
418  // Per questo motivo, effettuo un controllo anche su quello.
419  // Infine, effettuo anche un controllo sulla connessione. Chiamo i metodi solo se sono connesso ad Internet, questo perchè essi richiedono
420  // una connessione per funzionare correttamente.
421  if (m_UDPProtocol && m_NTPEntryPoint && WiFi.status() == WL_CONNECTED)
422  {
423  m_NTPEntryPoint->update();
424  return m_NTPEntryPoint->getMinutes();
425  }
426  else
427  return m_Invalidator;
428 }
429 
430 // Implementazione del metodo 'get_Seconds' della categoria 'Metodi'
432 {
433  // Ritorno il valore che ottengo attraverso la chiamata della funzione 'getSeconds'
434  // della libreria "NTPClient"
435  /*Ausilio dell'operatore '->' per dereferenziamento "nascosto"*/
436 
437  // Prima di ritornare il valore, lo AGGIORNO attraveso la funzione "update" della libreria "NTPClient"
438  // Questo perchè, una volta avviata l'interrogazione del Time Server, la richiesta dei valori avviene ogni 'm_UpdateInterval' millisecondi.
439  // Con i nostri dati di inizializzazione avviene ogni 60 secondi. Richiamando, invece, manualmente il metodo "update", forzo un aggiornamento dei valori.
440 
441  // Prima di richiamare il corrispettivo metodo della classe "NTPClient", controllo che l'oggetto di classe "NTPClient"
442  // sia stato già allocato. Una chiamata su un oggetto non allocato (i.e. 'nullptr') causerebbe una eccezione con
443  // conseguente fail della memoria.
444  // Il funzionamento dell'oggetto di classe di classe "NTPClient" dipende anche dall'oggetto di classe "WiFiUDP".
445  // Per questo motivo, effettuo un controllo anche su quello.
446  // Infine, effettuo anche un controllo sulla connessione. Chiamo i metodi solo se sono connesso ad Internet, questo perchè essi richiedono
447  // una connessione per funzionare correttamente.
448  if (m_UDPProtocol && m_NTPEntryPoint && WiFi.status() == WL_CONNECTED)
449  {
450  m_NTPEntryPoint->update();
451  return m_NTPEntryPoint->getSeconds();
452  }
453  else
454  return m_Invalidator;
455 }
456 
457 // Implementazione del metodo 'get_CurrentFormattedTime' della categoria 'Metodi'
459 {
460  // Ritorno il valore che ottengo attraverso la chiamata della funzione 'getFormattedTime'
461  // della libreria "NTPClient"
462  /*Ausilio dell'operatore '->' per dereferenziamento "nascosto"*/
463 
464  // Prima di ritornare il valore, lo AGGIORNO attraveso la funzione "update" della libreria "NTPClient"
465  // Questo perchè, una volta avviata l'interrogazione del Time Server, la richiesta dei valori avviene ogni 'm_UpdateInterval' millisecondi.
466  // Con i nostri dati di inizializzazione avviene ogni 60 secondi. Richiamando, invece, manualmente il metodo "update", forzo un aggiornamento dei valori.
467 
468  // Prima di richiamare il corrispettivo metodo della classe "NTPClient", controllo che l'oggetto di classe "NTPClient"
469  // sia stato già allocato. Una chiamata su un oggetto non allocato (i.e. 'nullptr') causerebbe una eccezione con
470  // conseguente fail della memoria.
471  // Il funzionamento dell'oggetto di classe di classe "NTPClient" dipende anche dall'oggetto di classe "WiFiUDP".
472  // Per questo motivo, effettuo un controllo anche su quello.
473  // Infine, effettuo anche un controllo sulla connessione. Chiamo i metodi solo se sono connesso ad Internet, questo perchè essi richiedono
474  // una connessione per funzionare correttamente.
475 
476  if (m_UDPProtocol && m_NTPEntryPoint && WiFi.status() == WL_CONNECTED)
477  {
478  // Prima di effettuare l'aggiornamamento e ritornare il corrispettivo valore, controllo il valore dell'attributo 'm_TimeFormat'
479  // per determinare il formato dell'ora [12h/24h]
480  switch (m_TimeFormat)
481  {
483  {
484  // Formato 12h
485  // Creo una variabile locale allo STACK FRAME di questo metodo <-- [reference '&'] non disponibile in ritorno
486  // Questa variabile verrà utilizzata per la formattazione dell'ora corrente nel formato 'hh:mm:ss'.
487  // La conversione restituirà un tipo 'String' [stringa]
488  String l_Time = "";
489 
490  m_NTPEntryPoint->update();
491 
492  // Ottengo il valore 'hh'
493  // Creo una variabile locale allo STACK FRAME di questo metodo non destinata ad essere utilizzata come valore di ritorno.
494  // Questa variabile verrà utilizzata per contenere il valore dell'ora corrente formato 'hh' per effettuare i controlli sul periodo delle 12h.
495  auto l_Supporter = m_NTPEntryPoint->getHours();
496  if (l_Supporter > Clock__file::_Period)
497  {
498  // Imposta PM
500 
501  // 'Elegant Adjustment' "Regolazione Elegante" della stringa in ritorno per l'ora formattata nel formato --> 12h
502  // Aggiunge uno zero '0' inziale per compensare un eventuale mancanza di seconda cifra (per i valori minori di '_ElegantAdj' (i.e. '10'))
504  l_Time = l_Time + "0";
505 
506  l_Time = l_Time + String((l_Supporter - Clock__file::_Period)) + ":";
507  }
508  else
509  {
510  // Imposta AM
512 
513  // 'Elegant Adjustment' "Regolazione Elegante" della stringa in ritorno per l'ora formattata nel formato --> 12h
514  // Aggiunge uno zero '0' inziale per compensare un eventuale mancanza di seconda cifra (per i valori minori di '_ElegantAdj' (i.e. '10'))
515  if (l_Supporter < Clock__file::_ElegantAdj)
516  l_Time = l_Time + "0";
517 
518  l_Time = l_Time + String(l_Supporter) + ":";
519  }
520 
521  // Ottengo il valore 'mm'
522  // 'Elegant Adjustment' "Regolazione Elegante" della stringa in ritorno per l'ora formattata nel formato --> 12h
523  // Aggiunge uno zero '0' inziale per compensare un eventuale mancanza di seconda cifra (per i valori minori di '_ElegantAdj' (i.e. '10'))
525  l_Time = l_Time + "0";
526 
527  l_Time = l_Time + String(get_Minutes()) + ":";
528 
529  // Ottengo il valore 'ss'
530  // 'Elegant Adjustment' "Regolazione Elegante" della stringa in ritorno per l'ora formattata nel formato --> 12h
531  // Aggiunge uno zero '0' inziale per compensare un eventuale mancanza di seconda cifra (per i valori minori di '_ElegantAdj' (i.e. '10'))
533  l_Time = l_Time + "0";
534 
535  l_Time = l_Time + String(get_Seconds());
536 
537  // Aggiungo il periodo
538  switch (m_Period)
539  {
541  break;
543  // AM
544  l_Time = l_Time + "am";
545  break;
547  // PM
548  l_Time = l_Time + "pm";
549  break;
550  }
551 
552  // Ritorno il risultato finale 'String' [stringa] che ho composto
553  return l_Time;
554  break;
555  }
557  // Formato 24h
558  // 'Elegant Adjustment' "Regolazione Elegante" automatica effettuata dal metodo 'getFormattedTime' della classe "NTPClient"
559  m_NTPEntryPoint->update();
560  return m_NTPEntryPoint->getFormattedTime();
561  break;
562  }
563  }
564  else
565  return String(m_Invalidator);
566 }
567 
568 // Implementazione del metodo 'get_CurrentFormattedTimeHM' della categoria 'Metodi'
570 {
571  // Ritorno il valore che ottengo attraverso la chiamata della funzione 'getFormattedTime'
572  // della libreria "NTPClient"
573  /*Ausilio dell'operatore '->' per dereferenziamento "nascosto"*/
574 
575  // Prima di ritornare il valore, lo AGGIORNO attraveso la funzione "update" della libreria "NTPClient"
576  // Questo perchè, una volta avviata l'interrogazione del Time Server, la richiesta dei valori avviene ogni 'm_UpdateInterval' millisecondi.
577  // Con i nostri dati di inizializzazione avviene ogni 60 secondi. Richiamando, invece, manualmente il metodo "update", forzo un aggiornamento dei valori.
578 
579  // Prima di richiamare il corrispettivo metodo della classe "NTPClient", controllo che l'oggetto di classe "NTPClient"
580  // sia stato già allocato. Una chiamata su un oggetto non allocato (i.e. 'nullptr') causerebbe una eccezione con
581  // conseguente fail della memoria.
582  // Il funzionamento dell'oggetto di classe di classe "NTPClient" dipende anche dall'oggetto di classe "WiFiUDP".
583  // Per questo motivo, effettuo un controllo anche su quello.
584  // Infine, effettuo anche un controllo sulla connessione. Chiamo i metodi solo se sono connesso ad Internet, questo perchè essi richiedono
585  // una connessione per funzionare correttamente.
586 
587  if (m_UDPProtocol && m_NTPEntryPoint && WiFi.status() == WL_CONNECTED)
588  {
589  // Prima di effettuare l'aggiornamamento e ritornare il corrispettivo valore, controllo il valore dell'attributo 'm_TimeFormat'
590  // per determinare il formato dell'ora [12h/24h]
591  switch (m_TimeFormat)
592  {
594  {
595  // Formato 12h
596  // Creo una variabile locale allo STACK FRAME di questo metodo <-- [reference '&'] non disponibile in ritorno
597  // Questa variabile verrà utilizzata per la formattazione dell'ora corrente nel formato 'hh:mm'.
598  // La conversione restituirà un tipo 'String' [stringa]
599  String l_Time = "";
600 
601  m_NTPEntryPoint->update();
602 
603  // Ottengo il valore 'hh'
604  // Creo una variabile locale allo STACK FRAME di questo metodo non destinata ad essere utilizzata come valore di ritorno.
605  // Questa variabile verrà utilizzata per contenere il valore dell'ora corrente formato 'hh' per effettuare i controlli sul periodo delle 12h.
606  auto l_Supporter = m_NTPEntryPoint->getHours();
607  if (l_Supporter > Clock__file::_Period)
608  {
609  // Imposta PM
611 
612  // 'Elegant Adjustment' "Regolazione Elegante" della stringa in ritorno per l'ora formattata nel formato --> 12h
613  // Aggiunge uno zero '0' inziale per compensare un eventuale mancanza di seconda cifra (per i valori minori di '_ElegantAdj' (i.e. '10'))
615  l_Time = l_Time + "0";
616 
617  l_Time = l_Time + String((l_Supporter - Clock__file::_Period)) + ":";
618  }
619  else
620  {
621  // Imposta AM
623 
624  // 'Elegant Adjustment' "Regolazione Elegante" della stringa in ritorno per l'ora formattata nel formato --> 12h
625  // Aggiunge uno zero '0' inziale per compensare un eventuale mancanza di seconda cifra (per i valori minori di '_ElegantAdj' (i.e. '10'))
626  if (l_Supporter < Clock__file::_ElegantAdj)
627  l_Time = l_Time + "0";
628 
629  l_Time = l_Time + String(l_Supporter) + ":";
630  }
631 
632  // Ottengo il valore 'mm'
633  // 'Elegant Adjustment' "Regolazione Elegante" della stringa in ritorno per l'ora formattata nel formato --> 12h
634  // Aggiunge uno zero '0' inziale per compensare un eventuale mancanza di seconda cifra (per i valori minori di '_ElegantAdj' (i.e. '10'))
636  l_Time = l_Time + "0";
637 
638  l_Time = l_Time + String(get_Minutes());
639 
640  // Aggiungo il periodo
641  switch (m_Period)
642  {
644  break;
646  // AM
647  l_Time = l_Time + "am";
648  break;
650  // PM
651  l_Time = l_Time + "pm";
652  break;
653  }
654 
655  // Ritorno il risultato finale 'String' [stringa] che ho composto
656  return l_Time;
657  break;
658  }
660  // Formato 24h
661  // 'Elegant Adjustment' "Regolazione Elegante" automatica effettuata dal metodo 'getFormattedTime' della classe "NTPClient"
662  // Non posso utilizzare il metodo 'getFormattedTime' vergine. Necessito di una composizione manuale della stringa per il valore di ritorno nel formato --> 'hh:mm'
663 
664  // Creo una variabile locale allo STACK FRAME di questo metodo <-- [reference '&'] non disponibile in ritorno
665  // Questa variabile verrà utilizzata per la formattazione dell'ora corrente nel formato 'hh:mm'.
666  // La conversione restituirà un tipo 'String' [stringa]
667  String l_Time = "";
668 
669  m_NTPEntryPoint->update();
670 
671  // Ottengo 'hh'
672  // Ottengo il valore 'mm'
673  // 'Elegant Adjustment' "Regolazione Elegante" della stringa in ritorno per l'ora formattata nel formato --> 12h
674  // Aggiunge uno zero '0' inziale per compensare un eventuale mancanza di seconda cifra (per i valori minori di '_ElegantAdj' (i.e. '10'))
675  if (m_NTPEntryPoint->getHours() < Clock__file::_ElegantAdj)
676  l_Time = l_Time + "0";
677 
678  l_Time = l_Time + String(m_NTPEntryPoint->getHours()) + ":";
679 
680  // Ottengo 'mm'
681  // Ottengo il valore 'mm'
682  // 'Elegant Adjustment' "Regolazione Elegante" della stringa in ritorno per l'ora formattata nel formato --> 12h
683  // Aggiunge uno zero '0' inziale per compensare un eventuale mancanza di seconda cifra (per i valori minori di '_ElegantAdj' (i.e. '10'))
685  l_Time = l_Time + "0";
686 
687  l_Time = l_Time + String(get_Minutes());
688 
689  return l_Time;
690  break;
691  }
692  }
693  else
694  return String(m_Invalidator);
695 }
696 
697 // Implementazione del metodo 'get_EpochTime' della categoria 'Metodi'
698 unsigned long Clock::get_EpochTime()
699 {
700  // Ritorno il valore che ottengo attraverso la chiamata della funzione 'getEpochTime'
701  // della libreria "NTPClient"
702  /*Ausilio dell'operatore '->' per dereferenziamento "nascosto"*/
703 
704  // Prima di ritornare il valore, lo AGGIORNO attraveso la funzione "update" della libreria "NTPClient"
705  // Questo perchè, una volta avviata l'interrogazione del Time Server, la richiesta dei valori avviene ogni 'm_UpdateInterval' millisecondi.
706  // Con i nostri dati di inizializzazione avviene ogni 60 secondi. Richiamando, invece, manualmente il metodo "update", forzo un aggiornamento dei valori.
707 
708  // Prima di richiamare il corrispettivo metodo della classe "NTPClient", controllo che l'oggetto di classe "NTPClient"
709  // sia stato già allocato. Una chiamata su un oggetto non allocato (i.e. 'nullptr') causerebbe una eccezione con
710  // conseguente fail della memoria.
711  // Il funzionamento dell'oggetto di classe di classe "NTPClient" dipende anche dall'oggetto di classe "WiFiUDP".
712  // Per questo motivo, effettuo un controllo anche su quello.
713  // Infine, effettuo anche un controllo sulla connessione. Chiamo i metodi solo se sono connesso ad Internet, questo perchè essi richiedono
714  // una connessione per funzionare correttamente.
715  if (m_UDPProtocol && m_NTPEntryPoint && WiFi.status() == WL_CONNECTED)
716  {
717  m_NTPEntryPoint->update();
718  return m_NTPEntryPoint->getEpochTime();
719  }
720  else
721  // Precisiamo che non importa la incorrispondenza tra signed and unsigned. In questo caso, il valore che verrà ritornato NON sarà '-1', ma il corrispodente
722  // valore 'unsigned'. Questo potrebbe far pensare a possibili problematiche legate al confronto tra questo valore e quello restituito dal metodo 'get_Invalidator' --> '-1'.
723  // In verità, non ci sarà nessun problema. Questo, perchè durante la compilazione il compilatore, ovunque trovi un confronto tra valori 'signed' e 'unsigned',
724  // effettua una conversione automatica del valore 'signed' nel corrispondente 'unsigned'.
725  // In questo modo, avremo un confronto tra due 'unsigned' il quale valore 'signed' è uguale --> '-1'. Quindi anche il corrispettivo valore 'unsigned' sarà uguale.
726 
727  // Ricordiamo, inoltre, che il tipo 'long' non è altro che un 'int' "ingrandito". E' sempre e comunque un 'int'.
728  return m_Invalidator;
729 }
730 
731 // Implementazione del metodo 'get_Period' della categoria 'Metodi'
733 {
734  // Prima di procedere, controllo che l'inizializzazione della classe sia già stata eseguita
735  // Se così non fosse, il valore di 'm_TimeFormat' sarebbe un valore indeterminato, causando risultati indefiniti durante il ritorno
736  // La presenza di riferimenti validi negli attributi 'm_UDPProtocol' e 'm_NTPEntryPoint' è segno di una inizializzazione già effettuata e correttamente completata
737  if (m_UDPProtocol && m_NTPEntryPoint && WiFi.status() == WL_CONNECTED)
738  // Ritorno l'attributo originale costante (non modificabile, per evitare modifiche indesiderate)
739  return m_Period;
740  else
741  // Causa l'impossibilità nell'uso di un ritorno come referenza 'reference'[&]
742  return TimePeriod::NOT_USED;
743 }
744 
745 // Implementazione del metodo 'get_Format' della categoria 'Metodi'
747 {
748  // Prima di procedere, controllo che l'inizializzazione della classe sia già stata eseguita
749  // Se così non fosse, il valore di 'm_TimeFormat' sarebbe un valore indeterminato, causando risultati indefiniti durante il ritorno
750  // La presenza di riferimenti validi negli attributi 'm_UDPProtocol' e 'm_NTPEntryPoint' è segno di una inizializzazione già effettuata e correttamente completata
752  // Ritorno l'attributo originale costante (non modificabile, per evitare modifiche indesiderate)
753  return m_TimeFormat;
754  else
755  // Causa l'impossibilità nell'uso di un ritorno come referenza 'reference'[&]
757 }
758 
759 // Implementazione del metodo 'get_Invalidator' della categoria 'getter -> Invalidator'
760 /*La specificazione 'inline' rappresenta una grossa ottimizzazione!!*/
761 inline const int& Clock::get_Invalidator()
762 {
763  // Ritorno il valore dell'attributo 'm_Invalidator'. Per evitare la copia durante la fase di ritorno, ritorno l'attributo
764  // originale [referenza --> reference '&']. L'attributo è già costante, questo evita modifiche non autorizzate.
765  return m_Invalidator;
766 }
767 
Clock::TimeFormat::_12HOURS
Clock::StopService
static bool StopService()
Metodo per arrestare il servizio di sincronizzazione online dell'ora corrente.
Definition: Clock.cpp:185
Clock::get_NTPEntryPoint
static NTPClient *const get_NTPEntryPoint()
LowLevel getter per l'attributo m_NTPEntryPoint.
Definition: Clock.cpp:206
Clock::TimeFormat
TimeFormat
Enumerazione per la gestione del formato di visualizzazione dell'ora corrente.
Definition: Clock.h:165
Clock::get_UDPProtocol
static WiFiUDP *const get_UDPProtocol()
LowLevel getter per l'attributo m_UDPProtocol.
Definition: Clock.cpp:199
Clock::get_TimePeriod
static TimePeriod *const get_TimePeriod()
LowLevel getter per l'attributo m_TimePeriod.
Definition: Clock.cpp:245
Clock::TimePeriod::PM
Clock::TimePeriod
TimePeriod
Enumerazione per la gestione del periodo durante la visualizzazione dell'ora corrente.
Definition: Clock.h:182
Clock::Init
static bool Init()
Metodo di inizializzazione dei componenti della classe.
Definition: Clock.cpp:16
Clock::TimePeriod::AM
Clock::m_TimeOffset
static int m_TimeOffset
Definition: Clock.h:234
Clock::m_Period
static TimePeriod m_Period
Definition: Clock.h:268
Clock::get_TimeOffset
static int *const get_TimeOffset()
LowLevel getter per l'attributo m_TimeOffset.
Definition: Clock.cpp:221
Clock::ReInit
static bool ReInit()
LowLevel reallocator della classe Clock.
Definition: Clock.cpp:253
Clock::m_NTPEntryPoint
static NTPClient * m_NTPEntryPoint
Definition: Clock.h:213
Clock::m_UpdateInterval
static int m_UpdateInterval
Definition: Clock.h:248
Clock::get_Hours
static int get_Hours()
Permette di ottenere il valore dell'ora sincronizzata online. Il formato è: 'h/hh'.
Definition: Clock.cpp:346
Clock::get_PoolingZone
static const char *const get_PoolingZone()
LowLevel getter per l'attributo m_PoolingZone.
Definition: Clock.cpp:213
Clock::get_EpochTime
static unsigned long get_EpochTime()
Permette di ottenere il valore dell'ora sincronizzata online Il formato è: 'secondi passati dal '1 Ge...
Definition: Clock.cpp:698
Clock::get_Minutes
static int get_Minutes()
Permette di ottenere il valore dell'ora sincronizzata online. Il formato è: 'm/mm'.
Definition: Clock.cpp:404
Clock__file::_PoolingZone
static constexpr auto _PoolingZone
Definition: Clock.h:60
Clock::get_CurrentFormattedTime
static String get_CurrentFormattedTime()
Permette di ottenere il valore dell'ora sincronizzata online. Il formato è: 'hh:mm:ss'.
Definition: Clock.cpp:458
Clock::m_TimeFormat
static TimeFormat m_TimeFormat
Definition: Clock.h:257
Clock::m_UDPProtocol
static WiFiUDP * m_UDPProtocol
Definition: Clock.h:204
Clock::get_Period
static const TimePeriod get_Period()
Permette di ottenere il valore del periodo corrente.
Definition: Clock.cpp:732
Clock::m_Invalidator
static const int m_Invalidator
Definition: Clock.h:822
Clock::get_Format
static const TimeFormat get_Format()
Permette di ottenere il valore del formato corrente dell'ora.
Definition: Clock.cpp:746
Clock::m_PoolingZone
static const char * m_PoolingZone
Definition: Clock.h:222
Clock__file::_UpdateInterval
static constexpr auto _UpdateInterval
Definition: Clock.h:66
Clock::set_TimeFormat
static bool set_TimeFormat(const TimeFormat &t_TimeFormat)
Permette di impostare il formato di visualizzazione dell'ora corrente.
Definition: Clock.cpp:297
Clock::get_TimeFormat
static TimeFormat *const get_TimeFormat()
LowLevel getter per l'attributo m_TimeFormat.
Definition: Clock.cpp:237
Clock::get_UpdateInterval
static int *const get_UpdateInterval()
LowLevel getter per l'attributo m_UpdateInterval.
Definition: Clock.cpp:229
Clock::get_Seconds
static int get_Seconds()
Permette di ottenere il valore dell'ora sincronizzata online. Il formato è: 's/ss'.
Definition: Clock.cpp:431
Clock::TimePeriod::NOT_USED
Clock::StartService
static bool StartService()
Metodo per avviare il servizio di sincronizzazione online dell'ora corrente.
Definition: Clock.cpp:167
Clock__file::_Period
static constexpr auto _Period
Definition: Clock.h:77
Clock::get_Invalidator
static const int & get_Invalidator()
Permette di ottenere l'invalidatore della classe.
Definition: Clock.cpp:761
Clock::TimeFormat::INVALID_REFERENCE
Clock__file::_ElegantAdj
static constexpr auto _ElegantAdj
Definition: Clock.h:81
Clock.h
Clock::get_Day
static int get_Day()
Permette di ottenere il valore del giorno corrente sincronizzato online.
Definition: Clock.cpp:319
Clock__file::_TimeOffset
static constexpr auto _TimeOffset
Definition: Clock.h:63
Clock::TimeFormat::_24HOURS
Clock::get_CurrentFormattedTimeHM
static String get_CurrentFormattedTimeHM()
Permette di ottenere il valore dell'ora sincronizzata online. Il formato è: 'hh:mm'.
Definition: Clock.cpp:569