Programmation de l’afficheur AIVBT Fiche d’activité Objectifs À l’issue de cette activité, vous devez être capable de … : faire évoluer une application Qt pour intégrer un protocole de messagerie précis mettre en œuvre la classe QTcpSocket pour développer un client TCP Compétences du référentiel abordées Domaine Compétence C3. Concevoir C3.1 : Analyser un cahier des charges C4. Réaliser C4.4: Développer un module logiciel C4.5: Tester et valider un module logiciel C7. Maintenir C7.2: Proposer des corrections ou des améliorations Savoirs du référentiel abordés Savoir Description: S4. Développement logiciel S4.6 : Programmation orientée objet S4.7 : Langages de programmation S4.8 : Outils de génération de code S4.9 : Programmation évènementielle S7. Réseaux, télécommunications et modes de transmission S7.7 : Programmation réseau Conditions Durée : 4h Travail individuel Compte rendu : code source de l’application finale à remettre en fin de séance Ressources Matériel(s) : Afficheur MAT AIVBT Logiciel(s) : VM Linux OpenSUSE avec framework Qt PacketSender (à des fins de test) Documentation : documentation de l’afficheur Pré-requis Notions sur TCP/IP Maitrise du protocole défini dans la documentation de l’afficheur Mise en situation On désire poursuivre le développement interrompu d’une application Qt qui permet de piloter l’afficheur AIVBT. Son IHM actuelle est la suivante : En terme de fonctionnalités seules la mise à l’heure de l’horloge interne (→ “§4.1.4. Procédure de mise à jour de l’horloge temps réel” dans la documentation) et l’effacement de l’intégralité des messages contenus dans l’afficheur (→ “4.1.2. Procédure d’effacement de toutes les pages en mémoire” dans la documentation) sont pleinement opérationnelles. La fonctionnalité d’effacement d’une seule page de message en mémoire (→ §4.1.3. Procédure d’effacement d’une en mémoire) n’est pas du tout implémentée. La fonctionnalité de programmation de messages dans l’afficheur (→ “§4.1.1. Procédure d’écriture des messages dans la mémoire de l’afficheur”) n’est, quant à elle, que partiellement implémentée. L’envoi d’un message programmé via l’IHM est en lui-même opérationnel mais il manque les possibilités de personnaliser : les heures de début et de fin d’affichage des messages. Pour l’instant, ces heures sont définies “en dur” dans la trame sur 06h00 → 22h00. la plage de dates pendant laquelle un message est visible (dates de début/fin ou toujours visible). Actuellement, cette plage est définie “en dur” dans la trame comme étant toujours visible (champs remplis de ‘-’). la durée d’affichage du message. Pour l’instant, cette durée est codée “en dur” dans la trame sur 5s. Une dernière fonctionnalité manquante dans le code actuel est d’informer l’utilisateur de la prise en compte ou non par l’afficheur des commandes envoyées par l’application. Votre mission est d’implémenter ces fonctionnalités manquantes. 🖮 Travail n° 1 Récupération du code de base S’assurer que le gestionnaire de version git est installé sur la machine. Dans le cas contraire, l’installer soit depuis YaST soit depuis le terminal avec la commande avec : sudo zypper install git Se déplacer dans le répertoire que vous aurez choisi pour développer l’application. Exemple : > mkdir -p ~/Documents/tps-programmation/qt; cd $_ (1) 1 Création du sous-répertoire qt/ avec création automatique des répertoires parents (→ option -p) et déplacement direct dans celui-ci (→ ; cd $_). $_ est une variable spéciale du shell qui contient l’argument de la dernière commande : ici, elle contient donc le chemin fourni à la commande mkdir. “Cloner” le dépôt logiciel contenant le code de base de l’application sur la forge logiciellle Framagit avec la commande suivante : > git clone --branch main --single-branch https://framagit.org/labworks-bts-sn/qaivbt.git 🖮 Travail n° 2 Effacement d’une page de message spécifique Modifier l’IHM pour avoir la possibilité via une case à cocher d’effacer un seul ou l’intégralité des messages. Dans ce dernier cas, l’application doit désactiver la sélection d’un n° de message via la “spin box”. Exemple : Sur le modèle de la méthode TcpAivbtClient::eraseAllMessages(int numDisplay), coder la méthode TcpAivbtClient::eraseMessage(int numDisplay, int numMsg) pour n’effacer que le message dont le numéro est passé en argument (→ §4.1.3. de la doc de l’afficheur “Procédure d’effacement d’une en mémoire”) Tester l’application dans un 1er temps dans PacketSender en vérifiant le contenu de la trame envoyée. Dans un 2nd temps, tester l’effacement d’un message particulier et de tous les messages sur l’afficheur. 🖮 Travail n° 3 Paramétrage des plages d’heures et de dates d’affichage d’un message Modifier l’IHM pour avoir la possibilité, via des widgets QDateEdit, QTimeEdit et QSpinBox, de spécifier les plages d’heures et/ou dates d’affichage du message ainsi que la durée d’affichage du message (de 1s à 9s selon la documentation de l’afficheur). Une case à cocher doit permettre de spécifier un message visible tous les jours. La sélection des dates de début et de fin doit alors être impossible. Exemple : Modifier la méthode TcpAivbtClient::writeMessage(int numDisplay) (prototype + corps) pour prendre en compte ces nouveaux paramètres dans l’élaboration de la trame à envoyer. Inutile de spécifier un paramètre particulier pour un message visible tous les jours. Celui-ci peut se traduire dans les nouveaux paramètres comme un message dont les dates de début et de fin sont nulles. Au lieu de passer un à un tous les nouveaux paramètres (2 heures, 2 dates, 1 durée), on peut les regrouper dans une structure. Tester l’application avec PacketSender puis sur l’afficheur. 🖮 Travail n° 4 Statut d’exécution d’une commande afficheur Modifier la classe TcpAivbtClient pour intercepter le signal readyRead de TcpSocket. Le slot se contentera d’ajouter dans un buffer tous les caractères reçus jusqu’à la détection de la réception de l’accusé de réception de l’afficheur (→ texte “ACK”). Une fois ce texte détecté, le slot émettra son propre signal (→ ex. : ackReceived) vers l’IHM pour signaler la bonne prise en compte de la commande par l’afficheur. Modifier la classe de l’IHM pour intégrer cette nouvelle fonctionnalité. On pourra complètement désactiver l’IHM (→ setEnabled(false)) lors de l’envoi d’une trame pour interdire toute nouvelle transmission avant d’avoir reçu l’accusé de réception. Tester l’application avec PacketSender et sur l’afficheur Faire évoluer le code de façon à mettre en place un délai de garde (avec un QTimer) sur l’attente de l’accusé de réception de l’afficheur de façon à pouvoir signaler à l’utilisateur toute absence de réponse de la part de l’afficheur. Tester l’application avec PacketSender et sur l’afficheur Conclusion Cet atelier visait essentiellement l’utilisation de la classe Qt QTcpSocket avec ses méthodes (→ connectToHost(), write() …) et signaux (→ connected, readyRead)pour communiquer via TCP avec un appareil distant. Cependant, vous avez aussi découvert comment construire des trames basées sur le type de base QByteArray soit en utilisant ses propres méthodes (→ append, insert) soit en passant par des flux (→ QDataStream). Enfin, vous avez eu l’occasion de manipuler les widgets Qt liés aux dates et heures (→ QDateEdit, QTimeEdit). Il est possible d’accéder au corrigé de cet atelier directement dans une nouvelle branche votre dépôt Git local en suivant la procédure suivante : > git remote set-branches --add origin develop (1) > git fetch origin develop (2) > git switch develop (3) 1 Ajoute le suivi de la branche develop sur le dépôt distant 2 Récupère localement le code de la branche develop 3 Bascule sur la branche develop pour avoir accès au code de la proposition de corrigé 🞄 🞄 🞄 Prise en main de l’afficheur AIVBT VLSM