Labo 3 – Classes simples
1. Présentation
1.1. Objectifs pédagogiques
- Mettre en œuvre la notion de classe sur des cas simples.
1.2. Recommandations
- Appliquer de façon judicieuse les principes d’encapsulation.
- Public, Private ?
- Créer un projet pour le développement et le test unitaire des classes.
- Intégrer ces classes dans le logiciel de commande lorsqu’elles sont au point.
2. Tâches à effectuer 2.1. Objectif
Le but de ce travail de laboratoire est de créer une petite application de commande de la machine de gravage laser, offrant les fonctionnalités suivantes :
- Apprentissage d’un segment constitué de 2 points A et B.
- Exécution d’un gravage laser du segment A et B. A la fin du gravage laser, le temps de gravage mesuré doit être affiché à l’écran.
- Chargement d’une nouvelle pièce.
Le segment A-B doit être persistant, c'est-à-dire que si on quitte le logiciel, puis on le redémarre, il doit toujours connaître les positions A et B qui avaient été apprises lors de la dernière exécution.
2.2. Espace de nommage
Toutes les classes seront développées dans l’espace de nommage ACOO.
2.3. Classes de données
2.3.1. Classe PointCréer une classe « Point » comportant 3 champs X, Y et Z.
Ecrire l’opérateur de sérialisation << vers ostream produisant un affichage
2.3.2. Classe Segment
Créer une classe « Segment » comportant 2 points.
Ecrire l’opérateur de sérialisation << vers ostream.
2.3.3. Apprentissage de points
Ecrire une fonction d’aprentissage de point (pas une méthode) recevant en paramètre un objet point.
L’apprentissage d’un point se déroule de la façon suivante :
- Proposer à l’utilisateur de déplacer le robot vers la coordonnée courante (dernière coordonnée apprise).
- Exécuter le mode « déplacement manuel ».
- Après sortie du mode « déplacement manuel », demander à l’utilisateur si la coordonnée courante du robot doit être mémorisée pour le point considéré.
2.3.4. Apprentissage de segments
Ecrire une fonction d’aprentissage de segment recevant en paramètre un objet segment, et permettant d’apprendre les 2 points constituants ce segment.
2.4. Classes de traitement
2.4.1. Sérialisation XMLLes logiciels orientés objets ont fréquemment besoin d’enregistrer des données dont la composition est très variable et qui sont organisées de façon hiérarchique. Pour enregistrer les données dans un format lisible et supportant la grande variabilité des données, un format textuel nommé XML pour eXtensible Markup Language est largement utilisé aujourd’hui.
Un fichier XML bien formé peut être visualisé avec le logiciel Internet Explorer (il suffit qu’il ait l’extension .XML), ou avec le logiciel gratuit « XML Notepad ».
Exemple : Une liste de points de l’espace R3
XML impose qu’au niveau principal, il n’y ait qu’un seul nœud.
Si l’écriture par programme de fichiers XML ne pose pas de problèmes, la relecture n’est pas évidente et passe par la réalisation d’un analyseur lexical.
Pour simplifier la relecture de fichiers, nous utiliserons la convention suivante : une ligne comporte soit une balise, soit une valeur. En utilisant cette convention, la relecture se fait ligne à ligne, ce qui simplifie considérablement le traitement.
Exemple XML respectant notre convention :
2.4.2. Classe XMLWriter
Créer une classe offrant des méthodes facilitant la sérialisation XML de données. Cette classe reçoit un ostream lors de sa création, et permet ensuite : - d’écrire une balise ouvrante ou fermante.
- d’écrire une valeur pour les différents types courants (bool, int, double, const char *) encadrée par une balise ouvrante et fermante.
Ajouter ensuite une méthode XMLWrite aux classes Point et Segment, permettant de sérialiser les données correspondantes vers le XMLWriter.
Tester.
2.4.3. Classe XMLReader
Créer une classe offrant des méthodes facilitant la désérialisation XML de données. Cette classe reçoit un istream lors de sa création, et permet ensuite : - De lire une balise ouvrante ou fermante. Si la ligne lue est différente de la
balise attendue, une exception doit être levée.
- De lire une valeur pour les différents types courants (bool, int, double, const char *) encadrée par une balise ouvrante et fermante.
Ajouter ensuite une méthode XMLWrite aux classes Point et Segment, permettant de sérialiser les données correspondantes vers le XMLWriter.
Tester.
2.4.4. Chronomètre
Créer une classe chronomètre. Un objet chronomètre offre les possibilités suivantes :
- Accéder au temps courant chronométré.
- Démarrer le chronomètre.
- Arrêter le chronomètre.
- Réinitialiser le chronomètre.
La fonction long GetTickCount() de <windows.h> retourne le nombre de millisecondes écoulées depuis le lancement de Windows. Il suffit de mémoriser la valeur de GetTickCount à 2 instants et d’en faire la différence pour connaître le temps écoulé entre ces instants.
Tester.
2.5. Application
Exploiter les classes et fonctions développées pour écrire l’application de gravage laser d’un segment. Les différentes fonctionnalités utiles seront accessibles depuis un menu.
2.6. Gestion des erreurs
Durant les attentes de fin de mouvement, il faut tester l’occurrence d’erreurs.
Avec le simulateur, des erreurs peuvent survenir si un déplacement hors de l’espace de travail du robot est demandé.
Lorsqu’une erreur survient, le traitement en cours doit être interrompu, la lampe rouge doit être allumée, et le message d’erreur doit être affiché.
Lors du démarrage de la prochaine opération, les erreurs doivent être quittancées automatiquement.
2.7. Signalisation
Pendant les modes de déplacement manuels, la lampe orange doit être allumée pour signaliser le danger.
Pendant les modes automatiques, la lampe verte doit être allumée.
Lorsque la machine s’arrête sur un cas d’erreur, la lampe rouge doit être allumée jusqu’au prochain démarrage qui quittancera les erreurs.
3. Travaux à rendre 3.1. Livrables
- Placez l’intégralité du dossier contenant votre projet Visual C++ 2008 dans le dossier dépôt étudiants.
- Une version imprimée du code source comportant votre nom et prénom.
3.2. Délai
Les travaux sont à rendre impérativement en l’état à la fin de la séance, et terminés après une semaine.