Outils pour utilisateurs

Outils du site


tppic

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentes Révision précédente
Prochaine révision
Révision précédente
tppic [2019/03/09 18:12]
bvandepo
tppic [2019/04/06 14:08] (Version actuelle)
bvandepo [Exercice 3: Réception de commandes des LED]
Ligne 46: Ligne 46:
 copier coller dans une console: copier coller dans une console:
 </​color>​ </​color>​
-  rsync -av --delete ~/​TCPIP_Demo_App_etudiant /mnt/etu/s4+  rsync -av --delete ~/​TCPIP_Demo_App_etudiant /mnt/etu/
  
 <color red> <color red>
Ligne 323: Ligne 323:
  
 ====Remarques importantes:​==== ====Remarques importantes:​====
-   - Ne brancher le câble réseau sur l'​interface du PIC que lorsque vous voulez tester votre programme sur la carte et que vous l'avez déjà testé en pas à pas.+   - Dans tout le TP, vous veillerez à ne pas commenter ou casser du code précédemment validé. Chaque exercice doit ajouter des fonctionnalités,​ en maintenant le bon fonctionnement des fonctionnalités précédentes! 
 +   - Ne brancher le câble réseau sur l'​interface du PIC que lorsque vous voulez tester votre programme sur la carte.
    - Les cartes PIC ainsi que les câbles réseaux sont numérotés,​ il est IMPERATIF de n'​utiliser que votre câble et votre carte et de régler correctement l'​adresse IP de votre carte via le fichier "​TCPIPConfig PIC32 Internal Ethernet.h"​.    - Les cartes PIC ainsi que les câbles réseaux sont numérotés,​ il est IMPERATIF de n'​utiliser que votre câble et votre carte et de régler correctement l'​adresse IP de votre carte via le fichier "​TCPIPConfig PIC32 Internal Ethernet.h"​.
   - Votre application est contenue uniquement dans les fichiers etudiantSocketApp.c et etudiantSocketApp.h. Vous n'avez pas à modifier d'​autres fichiers hormis "​TCPIPConfig PIC32 Internal Ethernet.h"​ pour les réglages d'​adresses IP.   - Votre application est contenue uniquement dans les fichiers etudiantSocketApp.c et etudiantSocketApp.h. Vous n'avez pas à modifier d'​autres fichiers hormis "​TCPIPConfig PIC32 Internal Ethernet.h"​ pour les réglages d'​adresses IP.
Ligne 363: Ligne 364:
 Vous pouvez ensuite fermer l'​outils gitk qui permet de voir les changements entre les différentes versions. Vous pouvez ensuite fermer l'​outils gitk qui permet de voir les changements entre les différentes versions.
   ​   ​
-==Note importante==  ​ 
-  <color red> 
-Dans tout le TP, vous veillerez à ne pas commenter ou casser du code précédemment validé. Chaque exercice doit ajouter des fonctionnalités,​ en maintenant le bon fonctionnement des fonctionnalités précédentes! 
- 
- 
-</​color>​ 
   ​   ​
 ==Lancement de l'​outils de développement== ==Lancement de l'​outils de développement==
Ligne 433: Ligne 428:
  
 ====Exercice 3: Réception de commandes des LED ==== ====Exercice 3: Réception de commandes des LED ====
-  - Compléter les fonctions **etudiantSocketAppInit()** et **etudiantSocketAppTask()** pour gérer la réception périodique des chaînes de caractères commandant les LED depuis le PC superviseur. Pour cela, vous devrez ouvrir un socket écoutant sur le bon numéro de port et depuis n'​importe quelle IP.  Veillez à définir un tableau de caractères en mémoire et à ne pas tenter de lire plus de caractères qu'il n'y a de place dans ce tableau. Vous pourrez au choix traiter un ordre de commutation des LEDS par appel de la fonction **etudiantSocketAppTask()** ou bien traiter autant d'ordre que possible (en fonction de la taille de votre tableau)+  - Compléter les fonctions **etudiantSocketAppInit()** et **etudiantSocketAppTask()** pour gérer la réception périodique des chaînes de caractères commandant les LED depuis le PC superviseur. Pour cela, vous devrez ouvrir un socket écoutant sur le bon numéro de port et depuis n'​importe quelle IP.  Veillez à définir un tableau de caractères en mémoire et à ne pas tenter de lire plus de caractères qu'il n'y a de place dans ce tableau. Vous pourrez au choix traiter un ordre de commutation des LEDS par appel de la fonction **etudiantSocketAppTask()** ou bien traiter autant d'ordres ​que possible (en fonction de la taille de votre tableau)
   - Vous penserez à commenter **UNIQUEMENT** les lignes de votre programme qui pilotent les leds à partir de l'​état des boutons pour ne pas interférer avec la commande des LEDs depuis le réseau. Conserver tout le reste du code en place, notamment la lecture de l'​état des boutons et l'​affichage de la chaine dans **DBPRINTF**.   - Vous penserez à commenter **UNIQUEMENT** les lignes de votre programme qui pilotent les leds à partir de l'​état des boutons pour ne pas interférer avec la commande des LEDs depuis le réseau. Conserver tout le reste du code en place, notamment la lecture de l'​état des boutons et l'​affichage de la chaine dans **DBPRINTF**.
   - Tester votre programme en demandant sur le PC superviseur,​ via l'​application BroadcastReceiver qui communique avec votre carte PIC, de commuter chacune des LEDs.   - Tester votre programme en demandant sur le PC superviseur,​ via l'​application BroadcastReceiver qui communique avec votre carte PIC, de commuter chacune des LEDs.
Ligne 484: Ligne 479:
   bool ARPIsResolved(type pointeur sur adresse IP, type pointeur sur adresse MAC)   bool ARPIsResolved(type pointeur sur adresse IP, type pointeur sur adresse MAC)
  
-Dans la fonction **etudiantSocketAppTask()**,​ à l'​intérieur de la tâche périodique à 1Hz, ajouter une machine à état **simple** permettant de faire des requêtes ARP avec la fonction **ARPResolve**. Ceci permet d'​envoyer une requette ARP avec l'​adresse IP passée en argument. Dans les appels suivants de la fonction** etudiantSocketAppTask()**,​ il vous faudra tester si **ARPIsResolved** a renvoyé **TRUE**, ce qui signifie que la réponse ARP est arrivée et donc que le champ adresse MAC est mis à jour. Dans ce cas il faudra ouvrir le socket (une seule fois) puis effectuer l'​envoi des données comme dans l'​exercice précédent. Dans le cas contraire, il faudra appeler à nouveau **ARPResolve** pour envoyer une nouvelle requête.+Dans la fonction **etudiantSocketAppTask()**,​ à l'​intérieur de la tâche périodique à 1Hz, ajouter une machine à état **simple** ​(l'​état étant codé par une variable **static int**) ​permettant de faire des requêtes ARP avec la fonction **ARPResolve**. Ceci permet d'​envoyer une requette ARP avec l'​adresse IP passée en argument. Dans les appels suivants de la fonction** etudiantSocketAppTask()**,​ il vous faudra tester si **ARPIsResolved** a renvoyé **TRUE**, ce qui signifie que la réponse ARP est arrivée et donc que le champ adresse MAC est mis à jour. Dans ce cas il faudra ouvrir le socket (une seule fois) puis effectuer l'​envoi des données comme dans l'​exercice précédent. Dans le cas contraire, il faudra appeler à nouveau **ARPResolve** pour envoyer une nouvelle requête. 
  
 <color red> <color red>
 Il est important que la fonction **etudiantSocketAppTask()** soit NON BLOQUANTE!</​color>​ Il est important que la fonction **etudiantSocketAppTask()** soit NON BLOQUANTE!</​color>​
  
-<​graphviz dot 500x90>+<​graphviz dot 350x90>
 ////////////////////////////////////////////////////////////////////////////////​ ////////////////////////////////////////////////////////////////////////////////​
 // Finite State Machine .dot diagram autogenerated by FsmProcess V 1.0 B. VANDEPORTAELE LAAS-CNRS 2016 // Finite State Machine .dot diagram autogenerated by FsmProcess V 1.0 B. VANDEPORTAELE LAAS-CNRS 2016
Ligne 498: Ligne 494:
     nodesep=0.1;​     nodesep=0.1;​
 ///////////////////////////////////////////////////////////////////////////////////////////////////////////​ ///////////////////////////////////////////////////////////////////////////////////////////////////////////​
-// Finite State Machine Name: arp+// Finite State Machine Name: arp2
 ///////////////////////////////////////////////////////////////////////////////////////////////////////////​ ///////////////////////////////////////////////////////////////////////////////////////////////////////////​
 //////////////////​display ​ states//////////////////​ //////////////////​display ​ states//////////////////​
Ligne 516: Ligne 512:
     //Action on state:     //Action on state:
     stateaction_1 ​ [shape=box,​label= ​  <<​TABLE BORDER="​0"​ CELLBORDER="​1"​ CELLSPACING="​0"​ CELLPADDING="​4">​     stateaction_1 ​ [shape=box,​label= ​  <<​TABLE BORDER="​0"​ CELLBORDER="​1"​ CELLSPACING="​0"​ CELLPADDING="​4">​
-        <​TR><​TD>​F</​TD><​TD COLSPAN="​2">​UDPOPEN</TD> </TR>+        <​TR><​TD>​F</​TD><​TD COLSPAN="​2">​UDPPUTARRAY</TD> </TR>
         </​TABLE>> ​ ];         </​TABLE>> ​ ];
     //attach the action on the state     //attach the action on the state
     state_1 ->​stateaction_1 ​ [arrowhead=none ]     ;     state_1 ->​stateaction_1 ​ [arrowhead=none ]     ;
- ​}; ​ 
-    //​---------State: ​  ​2 ​   ----------------- 
- { rank = same; 
-    state_2 [shape=circle,​fixedsize=true,​width=0.63,​ label= "​2"​ ]; 
-    //Action on state: 
-    stateaction_2 ​ [shape=box,​label= ​  <<​TABLE BORDER="​0"​ CELLBORDER="​1"​ CELLSPACING="​0"​ CELLPADDING="​4">​ 
-        <​TR><​TD>​F</​TD><​TD COLSPAN="​2">​UDPPUTARRAY</​TD>​ </TR> 
-        </​TABLE>> ​ ]; 
-    //attach the action on the state 
-    state_2 ->​stateaction_2 ​ [arrowhead=none ]     ; 
  ​}; ​  ​}; ​
 //////////////////​display ​ transitions//////////////////​ //////////////////​display ​ transitions//////////////////​
     state_0 -> state_1[ shape=box, ​ label= ​ <<​TABLE BORDER="​0"​ CELLBORDER="​1"​ CELLSPACING="​0"​ CELLPADDING="​4">​     state_0 -> state_1[ shape=box, ​ label= ​ <<​TABLE BORDER="​0"​ CELLBORDER="​1"​ CELLSPACING="​0"​ CELLPADDING="​4">​
-        <​TR><​TD COLSPAN="​2">​ARPISRESOLVED</​TD>​ </​TR>​ +        <​TR><​TD COLSPAN="​3">​ARPISRESOLVED</​TD>​ </​TR>​ 
-        </TABLE>>  ]; +        <TR><TD>F</TD><TD COLSPAN="​2">​UDPOPEN</TD> </TR>
-    state_1 -> state_2[ shape=box, ​ label=  ​<<TABLE BORDER="​0"​ CELLBORDER="​1"​ CELLSPACING="​0"​ CELLPADDING="​4"​> +
-        <TR><TD COLSPAN="​2">​1</TD> </TR>+
         </​TABLE>> ​ ];         </​TABLE>> ​ ];
 } }
- 
 </​graphviz>​ </​graphviz>​
  
  
 +Pour débugger, vous pourrez afficher l'​adresse IP demandée dans la requête ARP à l'aide de: 
 +  sprintf(chaine,​ "​ARPResolve adresse IP= %d.%d.%d.%d\n",​ myRemoteNode.IPAddr.v[0],​ myRemoteNode.IPAddr.v[1],​ myRemoteNode.IPAddr.v[2],​ myRemoteNode.IPAddr.v[3]);​
 +  DBPRINTF(chaine);​
 +Puis afficher l'​adresse MAC obtenue à l'aide de 
 +  sprintf(chaine,​ "ARP OK: adresse mac= %02x:​%02x:​%02x:​%02x:​%02x:​%02x\n",​ myRemoteNode.MACAddr.v[0],​ myRemoteNode.MACAddr.v[1],​ myRemoteNode.MACAddr.v[2],​ myRemoteNode.MACAddr.v[3],​ myRemoteNode.MACAddr.v[4],​ myRemoteNode.MACAddr.v[5]);​
 +  DBPRINTF(chaine);​
 +        ​
  
  
tppic.1552151545.txt.gz · Dernière modification: 2019/03/09 18:12 par bvandepo