RadioSvegliaGBE
StopWatchData.cpp
Go to the documentation of this file.
1 
11 // Inclusione <automatica> dell'header che si sta implementando
12 #include "StopWatchData.h"
13 
14 // Implementazione del costruttore di default della categoria 'Costruttori e Distruttori'
16 // inizializzazione ai valori di default della 'constexpr' [_initvalue]
17 // inizializzazione stato della sveglia 'WorkingState' al valore di default 'WorkingState::OFFLINE'.
18 // Inizializzazione valore booleano per controllo errori al valore di default 'false'.
19 // Utilizzo di una INITIALIZER LIST per ottimizzazione
20  : m_Time(StopWatchData__file::_initvalue), m_BaseTime(StopWatchData__file::_initvalue), m_OldTime(StopWatchData__file::_initvalue), m_WorkingState(WorkingState::OFFLINE),
21  m_isErrorOccured(false)
22 {
23 }
24 
25 // Implementazione del distruttore della categoria 'Costruttori e di Distruttori'
27 {
28  // Arresto il cronometro. Nel caso sia gi� arrestato, il metodo 'Stop' gestir� l'eccezzione.
29  Stop();
30 
31  // Deallocazione dell'oggetto con la perdit� di tutte le informazioni ad esso associate.
32 }
33 
34 // Implementazione del metodo 'Start' della categoria 'Service Management'
35 // Avvia il cronometro
37 {
38  // Variabile locale allo STACK FRAME del metodo.
39  // Questa variabile locale viene creata per salvare localmente il valore ritornato dalla chiamata del metodo "get_EpochTime" della classe "Clock".
40  // Questo viene effettuato per evitare DUPLICI CHIAMATE in previsione di un controllo sul valore per la gestione di eventuali eccezioni.
41  // Il tipo è 'unsigned long', essendo questo anche quello del valore in ritorno dal metodo "get_EpochTime".
42  unsigned long l_Tester;
43 
44  // Controllo che il cronometro non sia gi� avviato
46  {
47  // In questo caso, posso procedere con l'avvio
48  // Per procedere con l'avvio, eseguo un campionamento dell'ora corrente grazie ai metodi forniti dalla classe "Clock".
49  // Successivamente, salvo questo valore nell'attributo 'm_BaseTime'.
50 
51  // Prima di procedere, effettuo un controllo sul valore ottenuto. Devo essere sicuro che la classe "Clock" era pronta nel momento della chiamata.
52  // Se il valore ritornato è uguale all'invalidatore della classe "Clock", allora NON procedo con le operazioni.
54  // In questo caso, non effettuo nessuna operazione. Il valore di 'm_BaseTime' non verrà modificato e il cronometro NON verrà avviato.
55  return false;
56 
57  // In questo caso, essendo il valore ottenuto valido, allora procedo con le operazioni.
58  // Al valore ottenuto è stato sottratto "1" per gestire la ripresa del cronometro per evitare la ripetizione del primo valore in partenza.
59  // Il valore viene salvato nell'attributo 'm_BaseTime'
60  get_BaseTime();
61 
62  // Imposto lo stato di funzionamento su 'true'
64  return true;
65  }
66 
67  // Il cronometro non pu� essere avviato. Non eseguo alcuna operazione.
68  return false;
69 }
70 
71 // Implementazione del metodo 'Stop' della categoria 'Service Management'
73 {
74  // Controllo che il cronometro sia gi� avviato
76  {
77  // Prima di fermare effettivamente il cronometro, salvo il valore corrente di esso nell'attributo 'm_OldTime'.
78  // Questa operazione è essenziale per permettere la ripresa dell'esecuzione del cronometro dallo stesso valore di arresto
79  m_OldTime = m_Time;
80 
81  // Imposto lo stato di funzionamento su 'false'
83  return true;
84  }
85 
86  // Il cronometro non pu� essere arrestato. Non eseguo alcuna operazione.
87  return false;
88 }
89 
90 // Implementazione del metodo 'get_BaseTime' della categoria 'Service Management'
91 /*
92 Il seguente metodo non prevede nessun tipo di implementazione del controllo. Questo è del tutto normale e viene derivato da 2 motivi:
93 - il metodo rappresenta una risorsa privata, che viene richiamata solo all'interno del codice della classe, implementato dal creatore stesso
94 - le chiamate al seguente metodo vengono effettuate di già in previo controllo. Quindi, quando il seguente metodo verrà chiamato,
95 si avrà già la certezza della prontezza della classe "Clock" per supportare la chiamata del suo metodo 'get_EpochTIme'.
96 */
98 {
99  // Calcolo del 'm_BaseTime'.
100  // Si sottrae '1' per evitare ripetizioni dello stesso valore alla ripresa dell'esecuzione del cronometro da un valore medio precedentemente interrotto
102 }
103 
104 // Implementazione del metodo 'get_Time' della categoria 'Service Management'
106 {
107  // Variabile locale allo STACK FRAME del metodo.
108  // Questa variabile locale viene creata per salvare localmente il valore ritornato dalla chiamata del metodo "get_EpochTime" della classe "Clock".
109  // Questo viene effettuato per evitare DUPLICI CHIAMATE in previsione di un controllo sul valore per la gestione di eventuali eccezioni.
110  // Il tipo è 'unsigned long', essendo questo anche quello del valore in ritorno dal metodo "get_EpochTime".
111  unsigned long l_Tester;
112 
113  // Effettua le operazioni necessarie per determinare il valore corrente del cronometro.
114  /*
115  - effettua una differenza tra VALORE CORRENTE e BASE. In risultato sarà l'OFFSET che rappresenterà il valore corrente del cronometro.
116  - salvo quest'ultimo valore nell'attributo 'm_Time'.
117 
118  Le operazioni avvengono sul tempo ESPRESSO IN SECONDI. Per ottenere questo valore, è stato utilizzato il metodo "get_EpochTime"
119  */
120 
121  // Prima di effettuare le operazioni, controllo che il cronometro sia in funzione
123  {
124  // Solo quando il cronometro è in funzione, eseguo le operazioni di determinazione
125  /*
126  - Ottengo il valore corrente dell'ora espresso in secondi con il metodo "get_EpochTime"
127  - Sottraggo il valore di base 'm_BaseTime' calcolato precedentemente
128  - Aggiungo un eventuale tempo rimasto salvato in memoria nell'attributo 'm_OldTime'
129  - Salvo il tutto nell'attributo 'm_Time'. Il valore sarà espresso in secondi
130  */
131 
132  // Prima di procedere, effettuo un controllo sul valore ottenuto. Devo essere sicuro che la classe "Clock" era pronta nel momento della chiamata.
133  // Se il valore ritornato è uguale all'invalidatore della classe "Clock", allora NON procedo con le operazioni.
135  {
136  // In questo caso, non effettuo nessuna operazione. Il valore di 'm_BaseTime' non verrà modificato e il cronometro NON verrà avviato.
137 
138  // Avviso che, nel campionamento precedente dei valori, si è verificato un errore
139  m_isErrorOccured = true;
140  return false;
141  }
142 
143  // In questo caso, essendo il valore ottenuto valido, allora procedo con le operazioni.
144  // Controllo se precedentemente si è verificato un errore
145  /*
146  In caso affermativo, non avrebbe senso tentare di continuare con il precedente campionamento di 'm_BaseTime'.
147  Ecco, perchè si effettua un nuovo campionamento.
148  */
149  if (m_isErrorOccured)
150  {
151  // Campiono il nuovo valore da utilizzare come base per il calcolo del valore del cronometro
152  get_BaseTime();
153 
154  // Avviso che, durante questo campionamento, non si sono verificati errori
155  m_isErrorOccured = false;
156  }
157 
158  // Calcolo tempo effettivo che è il valore del cronometro
160 
161  return true;
162  }
163 
164  return true;
165 }
166 
167 // Implementazione del metodo 'get_CurrentFormattedStopWatch' della categoria 'Metodi'
169 {
170  // Richiamo il metodo 'get_Time' per ottenere il valore corrente del cronometro --> "strong-updated" (appena aggiornato/"fresco")
171  // Il valore verrà salvato nell'attributo 'm_Time'
172  // Prima di tutto, controllo lo stato booleano ritornato dal metodo 'get_Time'.
173  /*
174  - 'true' --> il cronometro era in stato WorkingState::ONLINE e ha funzionato correttamente
175  - 'true' --> il cronometro era in stato WorkingState::OFFLINE e ha funzionato correttamente (restituendo un valore momentaneamente costante)
176  - 'false' --> il cronomtero era in stato WorkingState::ONLINE ma NON ha funzionato correttamenteù
177  */
178  // Nel caso 'get_Time' non funzioni correttamente, ritorniamo il valore dell'invalidatore della classe "StopWatchData"
179  // Il valore corrisponde a quella della constexpr '_invalidvalue'.
180  if (!(get_Time()))
181  return String(m_CoreInvalidator);
182 
183  // Creo una variabile locale allo STACK FRAME di questo metodo <-- [reference '&'] non disponibile in ritorno
184  // Questa variabile verrà utilizzata per la conversione del valore in secondi nel formato 'hh:mm:ss'.
185  // La conversione restituirà un tipo 'String' [stringa]
186  String l_Time = "";
187 
188  // Creo una seconda variabile locale allo STACK FRAME di questo metodo.
189  // Quest'ultima verrà utilizzata per effettuare le operazioni di conversione del valore dell'attributo 'm_Time' senza però
190  // cambiare il valore effettivo di 'm_Time'. Questo è necessario perchè un cambiamento al valore di 'm_Time' provocherebbe valori indesiderati durante
191  // il salvataggio in 'm_OldTime' e il successivo recupero.
192  // Prendendo il valore di 'm_Time' di tipo 'unsigned long', anche 'l_ConversionSupporter' deve essere di tipo 'unsigned long'
193  unsigned long l_ConversionSupporter = m_Time;
194 
195  // In questo caso, essendo il valore in 'm_Time' valido (controllato precedentemente nella prima condizione), allora procedo con le operazioni.
196  // Operazioni di conversione in tipo 'String' [stringa] nel formato --> 'hh:mm:ss'
197  // Le seguenti operazioni NON lavorano direttamente sul valore dell'attributo 'm_Time', ma sulla variabile locale di appoggio 'l_ConversionSupporter'
198 
199  // Ottengo il valore 'hh'
200  // 'Elegant Adjustment' "Regolazione Elegante" della stringa in ritorno per il cronometro formattato
201  // Aggiunge uno zero '0' inziale per compensare un eventuale mancanza di seconda cifra (per i valori minori di '_ElegantAdj' (i.e. '10'))
202  if (l_ConversionSupporter / 3600 < StopWatchData__file::_ElegantAdj)
203  l_Time = l_Time + "0";
204 
205  l_Time = l_Time + String(l_ConversionSupporter / 3600) + ":";
206  l_ConversionSupporter = l_ConversionSupporter - ((l_ConversionSupporter / 3600) * 3600);
207 
208  // Ottengo il valore 'mm'
209  // 'Elegant Adjustment' "Regolazione Elegante" della stringa in ritorno per il cronometro formattato
210  // Aggiunge uno zero '0' inziale per compensare un eventuale mancanza di seconda cifra (per i valori minori di '_ElegantAdj' (i.e. '10'))
211  if (l_ConversionSupporter / 60 < StopWatchData__file::_ElegantAdj)
212  l_Time = l_Time + "0";
213 
214  l_Time = l_Time + String(l_ConversionSupporter / 60) + ":";
215  l_ConversionSupporter = l_ConversionSupporter - ((l_ConversionSupporter / 60) * 60);
216 
217  // Ottengo il valore 'ss'
218  // 'Elegant Adjustment' "Regolazione Elegante" della stringa in ritorno per il cronometro formattato
219  // Aggiunge uno zero '0' inziale per compensare un eventuale mancanza di seconda cifra (per i valori minori di '_ElegantAdj' (i.e. '10'))
220  if (l_ConversionSupporter < StopWatchData__file::_ElegantAdj)
221  l_Time = l_Time + "0";
222 
223  l_Time = l_Time + String(l_ConversionSupporter);
224 
225  // Ritorno la 'String' [stringa] equivalente
226  return l_Time;
227 }
228 
229 // Implementazione del metodo 'get_WorkingState' della categoria 'Metodi'
231 {
232  // Ritorno l'attributo originale costante (non modificabile, per evitare modifiche indesiderate)
233  return m_WorkingState;
234 }
235 
236 // Implementazione del metodo 'Trigger_to_Check' della categoria 'Metodi'
238 {
240  // Avviso che, nel campionamento precedente dei valori, si è verificato un errore
241  m_isErrorOccured = true;
242 }
243 
244 // Implementazione del metodo 'get_Invalidator' della categoria 'getter -> Invalidator'
245 /*La specificazione 'inline' rappresenta una grossa ottimizzazione!!*/
247 {
248  // Ritorno il valore dell'attributo 'm_Invalidator'. Per evitare la copia durante la fase di ritorno, ritorno l'attributo
249  // originale [referenza --> reference '&']. L'attributo è già costante, questo evita modifiche non autorizzate.
250  return m_CoreInvalidator;
251 }
252 
StopWatchData::m_CoreInvalidator
static const int m_CoreInvalidator
Definition: StopWatchData.h:352
StopWatchData::m_WorkingState
WorkingState m_WorkingState
Definition: StopWatchData.h:145
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
StopWatchData::get_CoreInvalidator
static const int & get_CoreInvalidator()
Permette di ottenere l'invalidatore del nucleo della classe.
Definition: StopWatchData.cpp:246
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.h
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
AlarmData__file::_initvalue
static constexpr auto _initvalue
Definition: AlarmData.h:52
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::get_Invalidator
static const int & get_Invalidator()
Permette di ottenere l'invalidatore della classe.
Definition: Clock.cpp:761
StopWatchData::StopWatchData
StopWatchData()
Costruttore di default della classe StopWatchData.
Definition: StopWatchData.cpp:15
StopWatchData::WorkingState::ONLINE