RadioSvegliaGBE
Alarm.h
Go to the documentation of this file.
1 #pragma once
2 
20 // Macro per sovvertire alla presenza dell'enumerazione 'AlarmState' nella classe CORE "AlarmData", alla quale l'utente non
21 // deve avere accesso
22 /*
23 L'utente deve poter utilizzare l'enumerazione degli stati 'AlarmState' come se fosse definita all'interno del WRAPPER "Alarm".
24 Questo è più complicato dato dal fatto che l'enumerazione, per la logica sulla quale si basa il progetto, si trova nel CORE "AlarmData"
25 [classe] alla quale l'utente non ha accesso.
26 Per "risolvere" questo inconvenite risulta "comodo" "ingannare l'utente" "facendoli sembrare" che l'enumerazione si trovi nel WRAPPER "Alarm".
27 Altri metodi potrebbero prevedere la riformulazione totale della logica base sulla quale si basa il progetto.
28 In questo caso, però, avendo sia CORE e corrispondente WRAPPER, risulta più logico definire tutte le eventuali enumerazioni nel CORE.
29 Il WRAPPER fungerà solamente da TRAMITE e INTERPRETE tra utente e codice.
30 */
32 #define Alarm__AlarmState AlarmData::AlarmState
33 
34 #pragma region INCLUSIONS
35  // Classe per la gestione dell'oggetto SVEGLIA
36  /*
37  Classe di autori 'Grandieri Andrea', 'Barsotti Mirko', 'Erba Lorenzo' rappresentante l'oggetto SVEGLIA e tutti gli attributi
38  e i metodi associati.
39  */
40 #include "AlarmData.h"
41 #pragma endregion INCLUSIONS
42 
43 // Namespace di protezione dalle inclusioni multiple con nominazione uguale
44 /*
45 I valori constexpr, come spiegato appena sopra, equivalgono alla direttiva '#define'. Questo può creare problemi nel momento in cui un singolo file viene incluso
46 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
47 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
48 file in cui il 'namespace' è stato dichiarato ed implementato.
49 Mantieniamo comunque la specificazione 'static', per evitare errori di linker in caso di inclusioni multiple di questa unità di traslazione [file].
50 */
59 namespace Alarm__file
60 {
61  // Espressione costante (equivalente della direttiva '#define') per la definizione del valore '_invalidvalue'
62  // Valore costante che viene ritornato in caso di invalidità riscontrata nell'oggetto durante il dereferenziamento
63  // per la chiamata dei metodi.
64  // Il valore invalido utilizzato è un valore impossibile, cioè che non potrebbe essere mai restituito naturalmente.
66  static constexpr int _invalidvalue = -1;
67 }
68 
76 class Alarm
77 {
78  /*Blocco trivial*/
79  /*
80  Stiamo trattando una classe interamente statica. Per la definizione di staticità, descritta successivamente, questa classe fungerà solamente
81  da "contenitore astratto" per organizzare più logicamente i dati. In verità, tutto risiederà principalmente nel Data Segment, quindi sarà
82  globale, ma statico (anche questo descritto successivamente).
83  Questa staticità implica la NON necessità di creare istanze di questa classe, che risulterebbero totalmente inutili dato che tutti gli attributi
84  e i metodi esistono nell'ambito globale.
85  Per evitare, quindi, inutili istanziamenti, verranno bloccati il costruttore trivial (di default generato dal compilatore) e il distruttore, reso
86  inutile dalla non-istanziabilità della classe stessa.
87  */
88 private:
89  // Blocco attraverso privatizzazione del costruttore trivial
96  Alarm() = default;
97  // Blocco attraverso privatizzazione del distruttore trivial
104  ~Alarm() = default;
105 
106  /*Attributi*/
107 private:
108  // Puntatore all'oggetto sveglia di classe "AlarmData"
109  /*
110  Questa variabile conterrà l'istanza dell'oggetto di classe "StopWatchData" creata durante l'operazione di inizializzazione.
111  Questo oggetto rappresenta una vera e propria sveglia. Fornisce tutti i metodi necessari alla sua gestione e implementa una comunicazione
112  generica degli errori.
113  L'oggetto sarà sottoposto ad allocazione dinamica [heap]. Questo per evitare problemi con la deallocazione mirata all'ambito
114  caratteristica della memoria statica [stack]. Una allocazione statica [stack] provocherebbe l'allocazione e successiva deallocazione
115  immediata dell'oggetto esistendo solamente nell'ambito di inizializzazione.
116  Essendo statica, la variabile (puntatore) verr� allocata nel 'Data Segment' (segmento dei dati) ed "esister�" fino a termine
117  del programma stesso. Quindi si tratta di una variabile globale, ma statica. Questo la rende esistente solamente in questa unit�
118  di traslazione (file).
119  */
122 
123  /*Init*/
124 public:
125  // Inizializza la sveglia con il rispettivo costruttore
126  /*
127  Questo metodo, fondamentale, "dà vita" alla sveglia. Effettua una allocazione (dinamica [heap]) attraverso il rispettivo costruttore della classe
128  "AlarmData".
129  Analizzando questo costruttore, notiamo come non accetti nessun parametro. Possiamo quindi trattarlo come un costruttore di default.
130  Il metodo ritorna un valore booleano, utilizzato per comunicare eventuali errori durante l'allocazione.
131  Inoltre, prima dell'effettiva allocazione, esegue una deallocazione [delete] se necessaria.
132  Anche qua ritroviamo la specificazione di staticità. Nel caso di applicazione ad un metodo, dissocia il metodo stesso da qualsiasi possibile istanza
133  della classe. Quindi, il metodo sarà richiamabile come se fosse globale (e statico). Sarà solamente necessario anteporre il nome della classe di
134  appartenenza. Ricordiamo anche che i metodi statici possono operare solo su variabili statiche, che anch'esse, essendo globali (e statiche) sono
135  totalmente dissociate da possibili istanze della classe stessa (da oggetti).
136  */
151  static bool Init();
152 
153  /*Value Setters*/
154  // Permette l'impostazione dello stato della sveglia
155  /*
156  Per fare ciò, effettua una chiamata ad uno specifico metodo implementato nella classe "AlarmData"
157  Restituisce un valore booleano per comunicare la corretta assegnazione dei valori 'true' oppure no 'false'
158  Permette quindi, la gestione ad alto livello lasciata all'utente.
159  Anche qua, per via della staticità, viene applicata la gestione analizzata prima.
160  */
161  // set_Time (1)
178  static bool set_Time(const unsigned int& t_Hour, const unsigned int& t_Minute);
179 
180  // set_Time (2)
199  static bool set_Time(const unsigned int& t_Hour, const unsigned int& t_Minute, const Clock::TimePeriod& t_Period);
200 
201  // set_Time (3)
220  static bool set_Time(const String& t_Value);
221 
222  // set_Time (4)
243  static bool set_Time(const String& t_Value, const Clock::TimePeriod& t_Period);
244 
245  // Permette l'impostazione dello stato della sveglia
246  /*
247  Per fare ciò, effettua una chiamata ad uno specifico metodo implementato nella classe "AlarmData"
248  Restituisce un valore booleano per comunicare la corretta assegnazione dei valori 'true' oppure no 'false'
249  Permette quindi, la gestione ad alto livello lasciata all'utente.
250  Anche qua, per via della staticità, viene applicata la gestione analizzata prima.
251  */
268  static bool set_State(const AlarmData::AlarmState& t_State);
269 
270  /*LowLevel getters*/
271  /*
272  I seguenti metodi LowLevel sono supposti soprattutto per uso a scopo di debug e management manuale.
273  Forniscono un punto di accesso costante a VALORE MODIFICABILE (quindi dereferenziabile ma non reindirizzabile).
274  In release mode, potrebbe risultare efficace cambiare il contrassegno da 'public' a 'private'.
275  Anche qua, per via della staticità, viene applicata la gestione analizzata prima.
276  */
277 public:
278  // Ritorna un puntatore all'oggetto di classe "StopWatchData"
290  static AlarmData* const get_Alarm();
291 
292  /*LowLevel reallocator*/
293  // In questo caso, non è necessaria l'implementazione essendo equivalente al metodo 'Init'
294 
295  /*Metodi*/
296 public:
297  // Restituisce, in tipo 'String' [stringa], l'ora impostata per il trigger della sveglia
298  /*
299  Per fare ciò, effettua una chiamata ad uno specifico metodo implementato nella classe "AlarmData"
300  Anche qua, per via della staticità, viene applicata la gestione analizzata prima.
301  */
315  static String get_SetTime();
316 
317  // Controlla se la sveglia è in trigger oppure no al momento della chiamata del medesimo metodo
318  /*
319  Per fare ciò, effettua una chiamata ad uno specifico metodo implementato nella classe "AlarmData"
320  Restituisce un valore booleano in base al trigger:
321  - 'true' --> sveglia in trigger nel momento della chiamata
322  - 'false' --> sveglia non in trigger nel momento della chiamata
323  Anche qua, per via della staticità, viene applicata la gestione analizzata prima.
324  */
338  static bool Check();
339 
340  // Effettua l'aggiornamento del formato dell'ora dal punto di vista di AlarmData per sincronizzarlo con quello di Clock
352  static bool UpdateFormat();
353 
354  /*Invalidator*/
355  /*
356  L'invalidatore consiste in quel valore che viene ritornato ogni qualvolta una chiamata da parte dell'utente ai metodi non produce il risultato atteso.
357  E' importante specificare che, l'invalidatore, pur essendo costante, non deve essere dichiarato come 'constexpr' perchè NON deve seguire le regole di
358  comportamento della direttiva '#define'. Il compilatore NON deve sostituire il nome dell'attributo con un valore numerico costante --> i.e. RVALUE!!
359  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
360  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
361  solamente nell'ambito della classe di dichiarazione.
362  */
363  /*Attributo*/
364 private:
365  // Valore costante che viene ritornato in caso di invalidità riscontrata nell'oggetto durante il dereferenziamento
366  // per la chiamata dei metodi.
367  // Il valore invalido utilizzato è un valore impossibile, cioè che non potrebbe essere mai restituito naturalmente.
369  static const int m_Invalidator;
370 
371  /*getter*/
372 public:
373  // Metodo per il ritorno del valore dell'Invalidatore. Verrà ritornata una referenza [reference --> '&'] costante, in modo tale da ottimizzare il processo e,
374  // allo stesso tempo evitare modifiche inappropriate.
375  /*
376  Un'altra particolarità di questo metodo sta nel fatto che è definita come 'inline'. Questa keyword comunica al compilatore, ovunque trovi una chiamata
377  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).
378  Questa tecnica risulta molto utile per funzioni che effettuano pochissime operazioni e sono sottoposte a frequenti chiamate.
379  Anche qua, per via della staticità, viene applicata la gestione analizzata prima.
380  */
391  static inline const int& get_Invalidator();
392 };
393 
394 // Dichiarazione delle variabili GLOBALI STATICHE
395 // Risiederanno nel Data Segment
396 /*
397 Essendo statiche in classe, tutti gli attributi non sono altro che variabili GLOBALI STATICHE.
398 Per questo è richiesta la dichiarazione globale. Non è necessario specificare 'static' essendo già stato specificato nella dichiarazione degli
399 attributi nella classe stessa.
400 */
405 
407 //////////////////////////////////////////////////////////////////////////
Alarm__file
Spazio dei nomi riferito al file Alarm.h.
Clock::TimePeriod
TimePeriod
Enumerazione per la gestione del periodo durante la visualizzazione dell'ora corrente.
Definition: Clock.h:182
Alarm::Alarm
Alarm()=default
Costruttore di default della classe Alarm.
Alarm
Classe per la gestione della sveglia integrata digitale.
Definition: Alarm.h:76
Alarm::m_Alarm
static AlarmData * m_Alarm
Definition: Alarm.h:121
Alarm::m_Invalidator
static const int m_Invalidator
Definition: Alarm.h:369
Alarm::set_Time
static bool set_Time(const unsigned int &t_Hour, const unsigned int &t_Minute)
Permette di impostare il valore dell'ora per il trigger della sveglia.
Definition: Alarm.cpp:40
Alarm::Init
static bool Init()
Metodo di inizializzazione dei componenti della classe.
Definition: Alarm.cpp:15
Alarm::get_Alarm
static AlarmData *const get_Alarm()
LowLevel getter per l'attributo m_Alarm.
Definition: Alarm.cpp:113
Alarm__file::_invalidvalue
static constexpr int _invalidvalue
Definition: Alarm.h:66
Alarm::get_SetTime
static String get_SetTime()
Restituisce il valore dell'ora impostata per il trigger della sveglia.
Definition: Alarm.cpp:120
AlarmData.h
AlarmData
Classe di definizione dell'oggetto per la funzione 'sveglia'.
Definition: AlarmData.h:97
Alarm::get_Invalidator
static const int & get_Invalidator()
Permette di ottenere l'invalidatore della classe.
AlarmData::AlarmState
AlarmState
Enumerazione per la gestione dello stato della sveglia.
Definition: AlarmData.h:115
Alarm::~Alarm
~Alarm()=default
Distruttore della classe Alarm.
Alarm::set_State
static bool set_State(const AlarmData::AlarmState &t_State)
Permette di impostare lo stato della sveglia.
Definition: Alarm.cpp:99
Alarm::UpdateFormat
static bool UpdateFormat()
Aggiorna il formato dell'ora corrente dal punto di vista di AlarmData.
Definition: Alarm.cpp:153
Alarm::Check
static bool Check()
Restituisce se la sveglia è in trigger al momento della chiamata del metodo stesso oppure no.
Definition: Alarm.cpp:139