Le support Yoctopuce reçoit de temps à autre des emails d'utilisateurs se plaignant que les exemples fournis avec les librairies de programmation Yoctopuce ne fonctionnent pas. On n'a pas la prétention de croire notre code est 100% sans erreur, mais force est de constater que la plupart du temps, le problème vient d'un malentendu à propos du fonctionnement de ces exemples. Cette semaine, on vous propose de mettre les choses au clair.
Ligne de commande
La majorité des exemples fournis sont des programmes en ligne de commande, cela signifie qu'ils n'ont pas d'interface graphique et qu'ils doivent être lancés depuis une fenêtre de commande, aussi connue sous le nom de terminal dans le monde Linux. Si on a choisi cette présentation, ce n'est pas parce qu'on avait la flemme de faire des interfaces graphiques, c'est parce que cela évite de noyer le code, relativement court, de gestion des modules Yoctopuce dans celui, généralement conséquent, de la gestion de l'interface graphique.
Pour faire apparaître rapidement une fenêtre de commande sous Windows, pour pouvez appuyer simultanément sur les touches Windows et R, ce qui fait apparaître une petite fenêtre avec un champ de commande, il suffit alors de taper dans ce champ cmd suivi de la touche ENTER pour faire apparaître la fenêtre de commande.
La fenêtre de commande de Windows
Si vous ne savez pas quoi faire de cette fenêtre de commande, il n'est jamais trop tard pour apprendre quelque chose de nouveau. Vous pourrez sûrement vous en sortir en cherchant "tutoriel ms-dos" dans Google.
Les paramètres de la ligne de commande
Chez Yoctopuce, lorsqu'il a été question d'écrire les premiers exemples, il y a eu des discussions assez animées à propos des fonctionnalités qu'il fallait montrer dans ces exemples. Le défi étant de trouver un compromis entre le nombre de fonctionnalités et la simplicité du code. On a fini par se mettre d'accord, un exemple de base doit:
- Montrer la fonctionnalité de base, typiquement lire une valeur de capteur ou activer un actuateur
- Montrer comment accéder à un module par nom logique, ou par numéro de série
- Monter comment accéder à un module par énumération
C'est pourquoi tous les exemples en ligne de commande s'attendent à au moins un paramètre sur la ligne de commande, typiquement un numéro de série, un nom logique, ou encore le mot clef any. Regardons en détail l'exemple C# pour le Yocto-Relay, la partie principale ressemble à cela:
{ string errmsg = "";
string target;
YRelay relay;
string state;
if (args.Length < 2) usage();
target = args[0].ToUpper();
state = args[1].ToUpper();
if (YAPI.RegisterHub("usb", ref errmsg) != YAPI.SUCCESS) {
Console.WriteLine("RegisterHub error: " + errmsg);
Environment.Exit(0);
}
if (target == "ANY") {
relay = YRelay.FirstRelay();
if (relay == null) {
Console.WriteLine("No module connected (check USB cable) ");
Environment.Exit(0);
}
} else relay = YRelay.FindRelay(target + ".relay1");
if (relay.isOnline()) {
if (state == "A") relay.set_state(YRelay.STATE_A);
else relay.set_state(YRelay.STATE_B);
} else {
Console.WriteLine("Module not connected (check identification and cable)");
}
YAPI.FreeAPI();
}
La première chose que fait le code, c'est de vérifier à l'aide de args.Length s'il y a au moins deux paramètres sur la ligne de commande. Si ce n'est pas le cas, il appelle la fonction usage() qui affiche le mode d'emploi de l'exemple et termine le programme.
{
string execname = System.AppDomain.CurrentDomain.FriendlyName;
Console.WriteLine("Usage:");
Console.WriteLine(execname + " <serial_number> < A | B >");
Console.WriteLine(execname + " <logical_name> < A | B >");
Console.WriteLine(execname + " any < A | B >");
System.Threading.Thread.Sleep(2500);
Environment.Exit(0);
}
Résultat de la fonction usage()
S'il y a le bon nombre de paramètres, il utilise le premier (args[0]) comme identification du module à utiliser, et le deuxième (args[1]) comme l'état dans lequel il doit mettre le relais. Si le nom du module est "ANY", il va alors utiliser la fonction YRelay.FirstRelay() pour obtenir le premier relais disponible. Dans le cas contraire, il va utiliser la fonction YRelay.FindRelay() pour trouver le relais en supposant que le paramètre correspond au numéro de série ou au nom logique du module. Si ce paragraphe vous parait un peu nébuleux, une lecture attentive de cet article vous permettra certainement d'y voir peu plus clair.
Une fois le relais identifié, le programme change son état en fonction de la valeur du deuxième paramètre placé sur la ligne de commande
Exemple d'utilisation de la ligne de commande
Le cas des IDE
Cette approche basée ligne de commande a malgré tout un tout petit inconvénient, lorsque ces exemples sont utilisés dans un environnement de développement intégré (Integrated Development Environment en anglais). Dans un IDE, il n'est pas forcément très pratique de passer des paramètres au programme que l'on exécute. De plus, lorsqu'ils sont lancés dans certains environnements, la fenêtre dans laquelle ils tournent se ferme aussitôt le programme terminé sans qu'on ait le temps de réaliser ce qu'il s'est passé. La parade consiste à mettre une attente ou encore une boucle infinie à la fin du programme, le temps de débugger.
Ceci dit, tous les environnements de développement permettent, d'une manière ou d'une autre, de donner des arguments au programme en cours de développement. Par exemple:
VisualStudio
Allez dans Project/ Properties / Debug et remplissez le champ "Command line arguments".
Paramètres de la ligne de commande dans VisualStudio
Petite astuce: dans VisualStudio si vous lancez votre programme avec Ctr-F5 au lieu de F5, la fenêtre d'exécution ne se fermera pas automatiquement à la fin du programme.
PyCharm
Allez dans Run / Edit Configurations et remplissez le champ "Script parameters"
Paramètres de la ligne de commande dans PyCharm
Delphi
Allez dans Run / Parameters et remplissez le champ "Parameters".
Paramètres de la ligne de commande dans Delphi XE2
Une dernière chose
Si vous obtenez un mystérieux message "RegisterHub error: Another process named VirtualHub.exe (pid xxxx) is already using yAPI" et ne savez pas trop quoi faire, la réponse se trouve ici.