RadioSvegliaGBE
StopWatchData.h
Go to the documentation of this file.
1 #pragma once
2 
20 #pragma region INCLUSIONS
21 // Classe per sfruttare la sincronizzazione online dell'ora corrente per la sincronia del cronometro
22 /*
23 Classe di autori 'Grandieri Andrea', 'Barsotti Mirko', 'Erba Lorenzo' per la sincronizzazione online dell'ora corrente.
24 Verrà utilizzata anche per il timing del cronometro fornendo una precisione fino all'unità "picosecondo".
25 */
26 #include "Clock.h"
27 #pragma endregion INCLUSIONS
28 
29 // Namespace di protezione dalle inclusioni multiple con nominazione uguale
30 /*
31 I valori constexpr, come spiegato appena sopra, equivalgono alla direttiva '#define'. Questo può creare problemi nel momento in cui un singolo file viene incluso
32 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
33 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
34 file in cui il 'namespace' è stato dichiarato ed implementato.
35 Mantieniamo comunque la specificazione 'static', per evitare errori di linker in caso di inclusioni multiple di questa unità di traslazione [file].
36 */
45 namespace StopWatchData__file
46 {
47  // Espressione costante (equivalente della direttiva '#define') per la definizione del valore '_initvalue'.
48  // Questo valore rappresenta il valore assegnato agli attributi 'm_Time', 'm_BaseTime', 'm_OldTime' durante la fase di costruzione
49  // attraverso il costruttore di default.
50  // All'attributo 'm_isWorking' verrà assegnato il valore di default 'WorkingState::OFFLINE'.
52  static constexpr auto _initvalue = 0;
53 
54  // Valore per eseguire l'adattamento 'Elegant Adjustment'
56  static constexpr auto _ElegantAdj /*Adjustment*/ = 10;
57 
58  // Valore costante che viene ritornato in caso di invalidità riscontrata nell'oggetto durante il dereferenziamento
59  // per la chiamata dei metodi.
60  // Il valore invalido utilizzato è un valore impossibile, cioè che non potrebbe essere mai restituito naturalmente.
62  static constexpr int _invalidvalue = -1;
63 }
64 
74 {
75  /*Enumerazioni*/
76  /*
77  Una enumerazione permette una gestione più intelligente degli "switcher" forniti all'utente finale.
78  Tramite nomi significativi, si gestiscono gli "switcher" appunto con dei nomi, utilizzati per mascherare i valori di enumerazione meno significativi per l'utente.
79  Anche qua si applica la staticità descritta successivamente. Una classe di enumarazione è automaticamente statica.
80  */
90 public:
91  enum class WorkingState
92  {
93  ONLINE,
94  OFFLINE,
95 
96  // Lo stato 'INVALID' viene aggiunto per permettere un più semplice "WRAPPERING" (incapsulamento) della classe stessa "StopWatchData".
97  // In questo caso, essendo la classe destinata all'incapsulamento in "StopWatch", è stato aggiunto quest'ultimo stato.
98  // Questo stato verrà restituito NON da questa classe CORE, ma direttamente dal WRAPPER, in caso gli altri due stati
99  // non siano accessibili (probabilmente per una mancata allocazione iniziale).
100  INVALID
101  };
102 
103  /*Attributi*/
104 private:
105  // Variabile contenente il valore corrente del cronometro
106  /*
107  Questa variabile conterrà il valore corrente del cronometro. Verrà aggiornata ad ogni chiamata del metodo 'get_CurrentFormattedStopWatch'.
108  Verrà anche utilizzata per mantenere in memoria il valore del cronometro anche dopo il suo arresto e il successivo avvio dello stesso.
109  La variabile è stata resa di tipo 'unsigned long' per permetterli di contenere i valori forniti dal metodo "get_EpochTime" della classe "Clock"
110  */
112  unsigned long m_Time;
113 
114  // Variabile contenente la Base del 'Time' dalla quale iniziare per il calcolo dell'Offset
115  /*
116  Questa variabile è necessaria proprio per la natura del funzionamento di questo cronometro. Esso si baserà sulla presenza di una connessione Internet utilizzata
117  per la sincronizzazione online dell'ora corrente. Alla chiamata del metodo 'Start' verrà campionata l'ora corrente e salvata in questa variabile. Da quel momento
118  in poi (fino alla chiamata di 'Stop') il valore del cronometro 'm_Time' non sarà altro che l'Offset tra l'ora precedentemente campionata 'm_BaseTime' e l'ora
119  corrente, ottenuta grazie ai metodi della classe "Clock".
120  Si effettueranno operazioni sull'ora corrente espressa in secondi, secondo i valori ottenuti dal metodo "get_EpochTime" della classe "Clock"
121  */
125  unsigned long m_BaseTime;
126 
127  // Variabile contente il valore precedente del cronometro, salvato nel momento dello 'Stop'
128  /*
129  Questa variabile consente la ripresa dell'esecuzione del cronometro dopo l'arresto dal punto nel quale si era fermato.
130  Il valore di 'm_Time' verrà salvato in 'm_OldTime' durante la chiamata al metodo 'Stop'.
131  Nel caso non è stata indivuata ancora alcuna chiamata al metodo, il valore sarà '_initvalue' in modo tale da non interferire con
132  i calcoli correnti.
133  */
136  unsigned long m_OldTime;
137 
138  // Variabile contenente lo stato corrente del cronometro
139  /*
140  Questa variabile contiene il valore dello stato corrente del cronometro. Essendo di tipo booleano, può assumere soltanto due stati, corrispondenti
141  al cronometro in funzione oppure no. Servirà a gestire possibili eccezioni causate dalla ripetuta chiamata al metodo 'Start' o 'Stop'.
142  */
146 
147  // Variabile per la gestione dell'errore
148  /*
149  Il cronometro è stato realizzato in modo tale da "auto-resettarsi" in caso di errore di connessione alla rete Internet.
150  Questo per garantire una corretta sincronizzazione, che rischierebbe di venir persa in caso di continue sconnessioni e riconessioni alla rete.
151  */
154 
155  /*Costruttori e Distruttori*/
156 public:
157  // Costruttore default
158  /*
159  Il costruttore di default di questa classe inizializza un oggetto di classe "StopWatchData" che raprresenta un cronometro.
160  Inizialmente i valori degli attributi sono impostati al valore default della constexpr '_initvalue'.
161  Possono esistere contemporaneamente più istanze di questa classe, ognuna rappresentante un diverso cronometro.
162  Nonostante ciò, bisogna prestare attenzione alla concorrenza di chiamata per i metodi della classe "Clock"
163  */
175  StopWatchData();
176 
177  // Distruttore
178  /*
179  Il distruttore di questa classe semplicemente dealloca l'oggetto interessato. Questo provocherà la perdita di tutte le informazioni annesse.
180  Prima di ciò, verrà eseguita una chiamata di sicurezza al metodo 'Stop'.
181  */
191  ~StopWatchData();
192 
193  /*Service Management*/
194 public:
195  // Una volta richiamato, il cronometro verrà avviato.
196  /*
197  Questo metodo permette un semplice avvio del cronometro. Dal momento della chiamata in poi il cronometro sarà in funzione.
198  Da ricordare che questo metodo restituisce un valore booleano nel caso l'avvio non sia riuscito 'false', oppure nel caso l'avvio sia riuscito 'true'.
199  Questo metodo NON fornisce in ritorno il valore corrente del cronometro.
200  */
213  bool Start();
214 
215  // Una volta richiamato, il cronometro verrà arrestato.
216  /*
217  Questo metodo permette un semplice arresto del cronometro. Dal momento della chiamata in poi il cronometro NON sarà in funzione.
218  Questo non signfica perdere i valori, ma solamente fermare il cronometro. Il valore 'm_Time' conterrà l'ultimo valore registrato dal cronometro.
219  Per perdere questo valore bisognerà creare una nuova istanza di questa classe.
220  Un successivo avvio del cronometro ripartirà dal precedente valore 'm_Time'.
221  */
234  bool Stop();
235 
236 private:
237  // Opera con il metodo 'get_EpochTime' della classe "Clock" per calcolare il tempo base 'm_BaseTime' dal quale successivamente
238  // calcolare l'offset.
239  /*
240  Questo metodo rappresenta una risorsa privata non richiamabile direttamente dall'utente.
241  Il suo compito è effettuare le operazioni necessarie a determinare il valore base del cronometro. Alla fine, salva questo valore nell'attributo
242  'm_BaseTime'.
243  Questo metodo verrà automaticamente richiamato al richiamo, da parte dell'utente, dei metodi 'getter' disponibili.
244  Il valore che verrà salvato nell'attributo 'm_BaseTime' è espresso in secondi
245  */
256  void get_BaseTime();
257 
258  // Opera in maniera diretta su 'Base' ed 'Offset' per calcolare i valori di distanza.
259  // Salva nell'attributo 'm_Time' il valore corrente del cronometro.
260  /*
261  Questo metodo rappresenta una risorsa privata non richiamabile direttamente dall'utente.
262  Il suo compito è effettuare le operazioni necessarie a determinare il valore corrente del cronometro. Alla fine, salva questo valore nell'attributo
263  'm_Time'.
264  Questo metodo verrà automaticamente richiamato al richiamo, da parte dell'utente, dei metodi 'getter' disponibili.
265  Il valore che verrà salvato nell'attributo 'm_Time' è espresso in secondi, secondo i valori ritornati dal metodo "get_EpochTime" della classe "Clock".
266  Sarà necessaria una conversione per ottenere il formato --> 'hh:mm:ss'
267  */
285  bool get_Time();
286 
287  /*Metodi*/
288 public:
289  // Ritorna il valore corrispondente al valore corrente del cronometo secondo la formattazione --> 'hh:mm:ss'
290  /*
291  Questo metodo rappresenta il principale scopo della classe: ottenere il valore del cronometro.
292  Il tipo restituito è 'String' [stringa]. Il formato dei valori è --> 'hh:mm:ss'
293  */
307 
308  // Ritorna il valore corrispondente allo stato attuale di funzionamento del cronometro
309  /*
310  Questo metodo permette di ottenere come valore di ritorno lo stato attuale del cronometro.
311  Sono possibili 2 stati:
312  'WorkingState::OFFLINE' --> il cronometro non è in funzione
313  'WorkingState::ONLINE' --> il cronometro è in funzione
314  */
325 
326  // Controlla la disponibilità di una connessione Internet. In caso negativo, effettua il reset di sicurezza del valore del cronometro
335  void Trigger_to_Check();
336 
337  /*Invalidator*/
338  /*
339  L'invalidatore consiste in quel valore che viene ritornato ogni qualvolta una chiamata da parte dell'utente ai metodi non produce il risultato atteso.
340  E' importante specificare che, l'invalidatore, pur essendo costante, non deve essere dichiarato come 'constexpr' perchè NON deve seguire le regole di
341  comportamento della direttiva '#define'. Il compilatore NON deve sostituire il nome dell'attributo con un valore numerico costante --> i.e. RVALUE!!
342  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
343  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
344  solamente nell'ambito della classe di dichiarazione.
345  */
346  /*Attributo*/
347 private:
348  // Valore costante che viene ritornato in caso di invalidità riscontrata nell'oggetto durante il dereferenziamento
349  // per la chiamata dei metodi.
350  // Il valore invalido utilizzato è un valore impossibile, cioè che non potrebbe essere mai restituito naturalmente.
352  static const int m_CoreInvalidator;
353 
354  /*getter*/
355 public:
356  // Metodo per il ritorno del valore dell'Invalidatore. Verrà ritornata una referenza [reference --> '&'] costante, in modo tale da ottimizzare il processo e,
357  // allo stesso tempo evitare modifiche inappropriate.
358  /*
359  Un'altra particolarità di questo metodo sta nel fatto che è definita come 'inline'. Questa keyword comunica al compilatore, ovunque trovi una chiamata
360  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).
361  Questa tecnica risulta molto utile per funzioni che effettuano pochissime operazioni e sono sottoposte a frequenti chiamate.
362  Anche qua, per via della staticità, viene applicata la gestione analizzata prima.
363  */
364  /*L'invalidatore del CORE (questa unità di traslazione [file]) prende il nome di 'CoreInvalidator' (i.e. 'invalidatore del nucleo').
365  Questo è reso necessario per l'identificazione della differenza tra invalidatore del WRAPPER e invalidatore del CORE.
366  Come riportato nel brief del WRAPPER, l'unico invalidatore al quale l'utente deve aver accesso è quello del WRAPPER 'Invalidator'.
367  L'invalidatore del CORE 'CoreInvalidator' è necessario solamente per la gestione dell'invalidatore del WRAPPER 'Invalidator' che dipende in parte (non in ogni caso, ma solo in alcuni)
368  dall'invalidatore del CORE 'CoreInvalidator'. L'invalidatore del CORE non deve essere disponibile all'utente.*/
379  static inline const int& get_CoreInvalidator();
380 };
381 
382 // Dichiarazione delle variabili GLOBALI STATICHE
383 // Risiederanno nel Data Segment
384 /*
385 Essendo statiche in classe, tutti gli attributi non sono altro che variabili GLOBALI STATICHE.
386 Per questo è richiesta la dichiarazione globale. Non è necessario specificare 'static' essendo già stato specificato nella dichiarazione degli
387 attributi nella classe stessa.
388 */
391 
393 //////////////////////////////////////////////////////////////////////////
StopWatchData::m_CoreInvalidator
static const int m_CoreInvalidator
Definition: StopWatchData.h:352
StopWatchData::WorkingState::INVALID
StopWatchData::m_WorkingState
WorkingState m_WorkingState
Definition: StopWatchData.h:145
StopWatchData__file::_initvalue
static constexpr auto _initvalue
Definition: StopWatchData.h:52
StopWatchData::get_CoreInvalidator
static const int & get_CoreInvalidator()
Permette di ottenere l'invalidatore del nucleo della classe.
Definition: StopWatchData.cpp:246
StopWatchData
Classe di definizione dell'oggetto per la funzione 'cronometro'.
Definition: StopWatchData.h:73
StopWatchData::m_OldTime
unsigned long m_OldTime
Definition: StopWatchData.h:136
StopWatchData::get_CurrentFormattedStopWatch
String get_CurrentFormattedStopWatch()
Permette di ottenere il valore del cronometro formattato nel seguente formato: 'hh:mm:ss'.
Definition: StopWatchData.cpp:168
StopWatchData::~StopWatchData
~StopWatchData()
Distruttore della classe StopWatchData.
Definition: StopWatchData.cpp:26
StopWatchData::WorkingState
WorkingState
Enumerazione per la gestione dello stato del cronometro.
Definition: StopWatchData.h:91
StopWatchData::get_Time
bool get_Time()
Risorsa interna della classe StopWatchData. Calcola il valore del cronometro basandosi sulla tecnica ...
Definition: StopWatchData.cpp:105
StopWatchData::m_Time
unsigned long m_Time
Definition: StopWatchData.h:112
StopWatchData::Start
bool Start()
Avvia l'esecuzione del cronometro.
Definition: StopWatchData.cpp:36
StopWatchData::WorkingState::OFFLINE
StopWatchData::m_BaseTime
unsigned long m_BaseTime
Definition: StopWatchData.h:125
StopWatchData::get_WorkingState
const WorkingState & get_WorkingState()
Permette di ottenere il valore dello stato del cronometro.
Definition: StopWatchData.cpp:230
StopWatchData::get_BaseTime
void get_BaseTime()
Risorsa interna della classe StopWatchData. Calcola il valore del tempo base dal quale estrudere l'of...
Definition: StopWatchData.cpp:97
StopWatchData::m_isErrorOccured
bool m_isErrorOccured
Definition: StopWatchData.h:153
StopWatchData::Trigger_to_Check
void Trigger_to_Check()
Controlla la presenza di una connessione Internet valida. In caso negativo, effettua il reset di sicu...
Definition: StopWatchData.cpp:237
StopWatchData__file
Spazio dei nomi riferito al file StopWatchData.h.
StopWatchData__file::_ElegantAdj
static constexpr auto _ElegantAdj
Definition: StopWatchData.h:56
StopWatchData::Stop
bool Stop()
Arresta l'esecuzione del cronometro.
Definition: StopWatchData.cpp:72
Clock.h
StopWatchData__file::_invalidvalue
static constexpr int _invalidvalue
Definition: StopWatchData.h:62
StopWatchData::StopWatchData
StopWatchData()
Costruttore di default della classe StopWatchData.
Definition: StopWatchData.cpp:15
StopWatchData::WorkingState::ONLINE