Fichier Alarme.h
/**
*
* \file Alarme.h
*
* \authors S. Nabitz
*
* \date 04/04/2018
*
* \version V1.0
*
* \brief déclaration de la classe Alarme
*
**/
#ifndef _ALARME
#define _ALARME
namespace nsDigicode {
class Alarme {
public:
void declencher (void);
}; // Alarme
} /* nsDigicode */
#endif /* _ALARME */
Fichier Alarme.cpp
/**
*
* \file Alarme.cpp
*
* \authors S. Nabitz
*
* \date 04/04/2018
*
* \version V1.0
*
* \brief définition de la classe Alarme
*
**/
#include <iostream>
#include <unistd.h> // sleep()
using namespace std;
#include "Alarme.h"
void nsDigicode::Alarme::declencher (void) {
while (true) {
cout << "Alarme : la porte n'est pas fermée" << endl;
sleep(1);
}
} // declencher()
Fichier Archivage.h
/**
*
* \file Archivage.h
*
* \authors S. Nabitz
*
* \date 04/04/2018
*
* \version V1.0
*
* \brief déclaration de la classe Archivage
*
**/
#ifndef _ARCHIVAGE
#define _ARCHIVAGE
namespace nsDigicode {
class Archivage {
public:
void archiver (int);
}; // Archivage
} /* ns_Digicode */
#endif /* _ARCHIVAGE */
Fichier Archivage.cpp
/**
*
* \file Archivage.cpp
*
* \authors S. Nabitz
*
* \date 04/04/2018
*
* \version V1.0
*
* \brief définition de la classe Archivage
*
**/
#include <fstream>
#include <ctime> // time_t, time ()
using namespace std;
#include "Archivage.h"
#define NOM_FIC "../DigicodeIUT/Archive.txt"
#define MODE std::fstream::out | std::fstream::app
void nsDigicode::Archivage::archiver (int code) {
ofstream leFichier (NOM_FIC,MODE);
time_t dateActuelle;
time (&dateActuelle);
leFichier << "Code : " << code << " Date : "
<< ctime (&dateActuelle) << endl;
leFichier.close ();
} //archiver()
Fichier BD.h
/**
*
* \file BD.h
*
* \authors S. Nabitz
*
* \date 04/04/2018
*
* \version V1.0
*
* \brief déclaration de la classe BD
*
**/
#ifndef _BD
#define _BD
namespace nsDigicode {
class BD {
public:
bool verifier (int);
}; // BD
} /* ns_Digicode */
#endif /* _BD */
Fichier BD.cpp
/**
*
* \file BD.cpp
*
* \authors S. Nabitz
*
* \date 04/04/2018
*
* \version V1.0
*
* \brief définition de la classe BD
*
**/
#include <iostream>
#include <fstream>
using namespace std;
#include "BD.h"
#define NOM_FIC "../DigicodeIUT/Base.txt"
bool nsDigicode::BD::verifier (int code) {
int lu = -1;
cout << "Vérification du code" << endl;
ifstream leFichier;
leFichier.open (NOM_FIC);
while (!leFichier.eof () && lu != code ) leFichier >> lu;
leFichier.close ();
if (lu != code) cout << "Code erroné" << endl;
return lu == code;
} //verifier()
Fichier Capteur.h
/**
*
* \file Capteur.h
*
* \authors S. Nabitz
*
* \date 04/04/2018
*
* \version V1.0
*
* \brief déclaration de la classe Capteur
*
**/
#ifndef _CAPTEUR
#define _CAPTEUR
namespace nsDigicode {
class Capteur {
public:
int detecter (void);
}; // Capteur
} /* ns_Digicode */
#endif /* _CAPTEUR */
Fichier Capteur.cpp
/**
*
* \file Capteur.cpp
*
* \authors S. Nabitz
*
* \date 04/04/2018
*
* \version V1.0
*
* \brief définition de la classe Capteur
*
**/
#include "Capteur.h"
#include "kbhit.h"
int nsDigicode::Capteur::detecter (void) { return _kbhit(); }
Fichier Chrono.h
/**
*
* \file Chrono.h
*
* \authors S. Nabitz
*
* \date 04/04/2018
*
* \version V1.0
*
* \brief déclaration de la classe Chrono
*
**/
#ifndef _CHRONO
#define _CHRONO
namespace nsDigicode {
class ObjetTempo;
class Chrono {
bool actif;
static void* compter (void *);
public:
void demarrer (ObjetTempo*);
void arreter (void);
Chrono (void);
}; // Chrono
} /* ns_Digicode */
#endif /* _CHRONO */
Fichier Chrono.cpp
/**
*
* \file Chrono.cpp
*
* \authors S. Nabitz
*
* \date 04/04/2018
*
* \version V1.0
*
* \brief définition de la classe Chrono
*
**/
#include
#include
using namespace std;
#include
#include "ObjetTempo.h"
#include "Chrono.h"
void nsDigicode::Chrono::arreter (void) { actif = false; }
nsDigicode::Chrono::Chrono (void) { actif = false; }
void* nsDigicode::Chrono::compter (void * p) {
double duree = (clock_t) ( (ObjetTempo *) p)->getDelai ();
Chrono *lec = ( (ObjetTempo *) p)->getChrono ();
clock_t debut = clock ();
double tempsEcoule = (clock () - debut) / CLOCKS_PER_SEC;
lec->actif = true;
while (lec->actif && tempsEcoule<duree) {="" tempsecoule="(clock" ()="" -="" debut)="" clocks_per_sec;="" }="" if="" (tempsecoule="">= duree ) {
( (ObjetTempo *) p)->finTempo ();
lec->actif = false;
}
pthread_exit (NULL);
} //compter()
void nsDigicode::Chrono::demarrer (ObjetTempo * a) {
pthread_t thread;
while (actif) std::cout.flush ();
// double duree = a->getDelai ();
std::cout.flush ();
pthread_create (&thread, NULL, compter, (void *) a);
} //demarrer()
</duree)>
Fichier Clavier.h
/**
*
* \file Clavier.h
*
* \authors S. Nabitz
*
* \date 04/04/2018
*
* \version V1.0
*
* \brief déclaration de la classe Clavier
*
**/
#ifndef _CLAVIER
#define _CLAVIER
namespace nsDigicode {
class Clavier {
public:
int saisieChiffre (void);
}; // Clavier
} /* ns_Digicode */
#endif /* _CLAVIER */
Fichier Clavier.cpp
/**
*
* \file Clavier.cpp
*
* \authors S. Nabitz
*
* \date 04/04/2018
*
* \version V1.0
*
* \brief définition de la classe Clavier
*
**/
#include
#include "Clavier.h"
#include "kbhit.h"
using namespace std;
int nsDigicode::Clavier::saisieChiffre (void) {
int c ;
if (c = _kbhit()) {
cout << "*" << flush;
return c - '0';
}
return -1;
} // saisieChiffre()
Fichier Interface.h
/**
*
* \file Interface.h
*
* \authors S. Nabitz
*
* \date 04/04/2018
*
* \version V1.0
*
* \brief déclaration de la classe Interface
*
**/
#ifndef _INTERFACE
#define _INTERFACE
#include
#include "ObjetTempo.h"
#include "Clavier.h"
#include "Voyant.h"
#include "Chrono.h"
namespace nsDigicode {
class Interface : public ObjetTempo {
int nbChiffresAttendus;
Clavier leClavier;
Voyant leVoyantVert;
Voyant leVoyantRouge;
void statut (std::string = "\n");
public:
int saisieCode (void);
Interface (Chrono*, int, int);
}; // Interface
} /* ns_Digicode */
#endif /* _INTERFACE */
Fichier Interface.cpp
/**
*
* \file Interface.cpp
*
* \authors S. Nabitz
*
* \date 04/04/2018
*
* \version V1.0
*
* \brief définition de la classe Interface
*
**/
#include
#include
using namespace std;
#include "Interface.h"
#include "Chrono.h"
nsDigicode::Interface::Interface (Chrono * lech, int d, int nbca) :
ObjetTempo (lech, d),
leVoyantRouge (rouge, eteint),
leVoyantVert (vert, eteint),
nbChiffresAttendus (nbca)
{}
void nsDigicode::Interface::statut (string s) {
cout << endl << "VERT" << setw(4) << leVoyantVert.getStatut()
<< setw(7) << "ROUGE" << setw(4) << leVoyantRouge.getStatut()
<< setw(24) << s << flush;
} // statut()
int nsDigicode::Interface::saisieCode (void) {
int code, chiffreLu, nbChiffresLus;
attente = false;
do {
leVoyantVert.eteindre ();
leVoyantRouge.allumer ();
statut ("Entrez votre code : ");
cin.clear ();
code = 0;
while ((code = leClavier.saisieChiffre ()) == -1);
nbChiffresLus = 1;
leVoyantVert.allumer ();
statut ("Continuez la saisie : ");
attente = true;
leChrono->demarrer (this);
while (attente && nbChiffresLus < nbchiffresattendus) {
while (attente && (chiffrelu = leClavier.saisieChiffre())
== -1);
if (attente) {
code = code * 10 + chiffrelu;
nbchiffreslus++;
if (nbchiffreslus == nbchiffresattendus)
lechrono->arreter ();
}
else
cout << endl << "Temps ecoulé - Fin de saisie" << endl;
}
while (nbChiffresLus < nbChiffresAttendus );
leVoyantRouge.eteindre ();
statut ();
return code;
} // saisieCode()
</nbchiffresattendus)>
Fichier kbhit.h
/**
*
* \file kbhit.h
*
* \authors S. Nabitz
*
* \date 04/04/2018
*
* \version V1.0
*
* \brief déclaration de la fonction _kbhit()
*
**/
int _kbhit (void);
Fichier kbhit.cpp
/**
*
* \file kbhit.cpp
*
* \authors S. Nabitz
*
* \date 04/04/2018
*
* \version V1.0
*
* \brief définition de la fonction _kbhit()
*
**/
#include
#include
#include
#include
#include
using namespace std;
void set_mode (bool want_key) {
static struct termios old, cur;
if (!want_key) {
tcsetattr (STDIN_FILENO, TCSANOW, &old);
return;
}
tcgetattr (STDIN_FILENO, &old);
cur = old;
cur.c_lflag &= ~(ICANON | ECHO);
tcsetattr (STDIN_FILENO, TCSANOW, &cur);
}
int _kbhit (void) {
int c = 0;
struct timeval tv;
set_mode (true);
fd_set fs;
tv.tv_usec = tv.tv_sec = 0;
FD_ZERO (&fs);
FD_SET (STDIN_FILENO, &fs);
select (STDIN_FILENO + 1, &fs, 0, 0, &tv);
if (FD_ISSET (STDIN_FILENO, &fs)) {
c = cin.get ();
set_mode (false);
}
return c;
} // _kbhit()
Fichier ObjetTempo.h
/**
*
* \file ObjetTempo.h
*
* \authors S. Nabitz
*
* \date 04/04/2018
*
* \version V1.0
*
* \brief déclaration de la classe ObjetTempo
*
**/
#ifndef _OBJETTEMPO
#define _OBJETTEMPO
#include "Chrono.h"
namespace nsDigicode {
class ObjetTempo {
int delai;
protected:
bool attente;
Chrono* leChrono;
public:
Chrono* getChrono (void);
void finTempo (void);
ObjetTempo (Chrono*, int);
int getDelai (void) const;
}; // ObjetTempo
} /* ns_Digicode */
#endif /* _OBJETTEMPO */
Fichier ObjetTempo.cpp
/**
*
* \file ObjetTempo.cpp
*
* \authors S. Nabitz
*
* \date 04/04/2018
*
* \version V1.0
*
* \brief définition de la classe ObjetTempo
*
**/
#include "ObjetTempo.h"
#include "Chrono.h"
using namespace std;
nsDigicode::ObjetTempo::ObjetTempo (Chrono* lech, int d) :
leChrono (lech),
delai (d) {}
void nsDigicode::ObjetTempo::finTempo (void) { attente = false; }
int nsDigicode::ObjetTempo::getDelai (void) const { return delai; }
nsDigicode::Chrono* nsDigicode::ObjetTempo::getChrono (void) { return leChrono; }
Fichier Porte.h
/**
*
* \file Porte.h
*
* \authors S. Nabitz
*
* \date 04/04/2018
*
* \version V1.0
*
* \brief déclaration de la classe Porte
*
**/
#ifndef _PORTE
#define _PORTE
#include "ObjetTempo.h"
#include "Capteur.h"
#include "Chrono.h"
namespace nsDigicode {
class Porte : public ObjetTempo {
Capteur leCapteur;
bool fermer();
public:
bool ouvrir();
Porte(Chrono*, int);
}; // Porte
} /* ns_Digicode */
#endif /* _PORTE */
Fichier Porte.cpp
/**
*
* \file Porte.cpp
*
* \authors S. Nabitz
*
* \date 04/04/2018
*
* \version V1.0
*
* \brief définition de la classe Porte
*
**/
#include
#include "Porte.h"
using namespace std;
nsDigicode::Porte::Porte (Chrono * lech, int d) : ObjetTempo(lech, d) {}
bool nsDigicode::Porte::ouvrir (void) {
attente = true;
leChrono->demarrer(this);
cout << "Vous pouvez entrer" << endl;
while (attente && !leCapteur.detecter());
if (attente)
return fermer ();
else {
cout << "Temps écoulé - La porte se verrouille" << endl;
return true;
}
} // ouvrir()
bool nsDigicode::Porte::fermer (void)
{
cout << "Porte ouverte : fermez la porte" << endl;
while (attente && !leCapteur.detecter ());
if (attente)
{
leChrono->arreter ();
attente = false;
cout << "Vous avez fermé la porte" << endl;
return true;
}
else
return false;
} // fermer()
Fichier Voyant.h
/**
*
* \file Voyant.h
*
* \authors S. Nabitz
*
* \date 04/04/2018
*
* \version V1.0
*
* \brief déclaration de la classe Voyant
*
**/
#ifndef _VOYANT
#define _VOYANT
#include
namespace nsDigicode {
enum Color {rouge, vert};
enum Etat {allume, eteint};
class Voyant {
Color couleur;
Etat et;
public:
void allumer (void);
void eteindre (void);
Voyant (Color c, Etat e);
std::string getStatut (void) const;
}; // Voyant
} /* ns_Digicode */
#endif /* _VOYANT */
Fichier Voyant.cpp
/**
*
* \file Voyant.cpp
*
* \authors S. Nabitz
*
* \date 04/04/2018
*
* \version V1.0
*
* \brief définition de la classe Voyant
*
**/
#include "Voyant.h"
nsDigicode::Voyant::Voyant(Color c, Etat e) {
couleur = c;
et = e;
} // Voyant()
void nsDigicode::Voyant::allumer (void) {
if (et == eteint)
et = allume;
} // allumer()
void nsDigicode::Voyant::eteindre (void) {
if (et == allume)
et = eteint;
} // eteindre()
string nsDigicode::Voyant::getStatut (void) const {
if (et == allume) return "ON";
return "OFF";
} // getStatut()
Fichier Systeme.h
/**
*
* \file Systeme.h
*
* \authors S. Nabitz
*
* \date 04/04/2018
*
* \version V1.0
*
* \brief déclaration de la classe Systeme
*
**/
#ifndef _SYSTEME
#define _SYSTEME
#include "Interface.h"
#include "Porte.h"
#include "Alarme.h"
#include "BD.h"
#include "Archivage.h"
#include "Chrono.h"
namespace nsDigicode {
class Systeme {
Interface lInterface;
Porte laPorte;
Alarme lAlarme;
BD laBD;
Archivage lArchive;
Chrono leChrono;
public:
Systeme (int, int, int);
}; // Systeme
} /* ns_Digicode */
#endif /* _SYSTEME */
Fichier Systeme.cpp
/**
*
* \file Systeme.cpp
*
* \authors S. Nabitz
*
* \date 04/04/2018
*
* \version V1.0
*
* \brief définition de la classe Systeme
*
**/
#include
using namespace std;
#include "Systeme.h"
#define DELAI_CLAVIER 5
#define DELAI_PORTE 8
#define NB_CHIFFRES_CLAVIER 4
nsDigicode::Systeme::Systeme (int dc, int dp, int nbca) :
lInterface (&leChrono, dc, nbca), laPorte (&leChrono, dp) {
int c;
while (true) {
lArchive.archiver (c = lInterface.saisieCode());
if (laBD.verifier (c)) {
if (!laPorte.ouvrir ())
lAlarme.declencher ();
}
}
} // Systeme()
int main (void) {
nsDigicode::Systeme s (DELAI_CLAVIER, DELAI_PORTE, NB_CHIFFRES_CLAVIER);
return 0;
} // main()