Auteur Sujet: Bibliothèque CommandInterpreter  (Lu 24710 fois)

Jean-Luc

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 1714
    • Voir le profil
Bibliothèque CommandInterpreter
« le: avril 14, 2015, 10:20:05 am »
Bonjour,

Je ne sais pas si vous êtes comme moi mais lors de la mise au point de programmes un peu plus compliqués que le basique, je reflashe pas mal l'Arduino. Par ailleurs, pour configurer une application, valeurs par défaut de variables, configuration en EEPROM, ... c'est assez pénible.

Il m'est donc venu à l'idée d'utiliser une interface ligne de commande qui tournerait sur l'Arduino. Il y en a qui existent mais pas forcément comme je veux. J'ai donc fait la mienne.

L'idée est d'avoir sur l'Arduino une interface en ligne de commande qui gère la communication sur la ligne série, attend des commandes et les exécute. Les commandes sont à coder sous forme de fonction et peuvent avoir des arguments. La bibliothèque gère également un historique de 8 commandes pour ne pas avoir à les retaper et deux commandes internes : hist qui permet d'afficher l'historique des commandes et help qui affiche l'aide. Le tampon d'entrée est de 20 caractères et la saisie au delà de ce tampon est gérée.

Côté logiciel sur le PC/Mac, il faut un logiciel de terminal plus sérieux que celui inclus dans l'IDE Arduino, j'aime beaucoup CoolTerm qui est multiplateforme : http://freeware.the-meiers.org mais, Guillaume va râler, il n'est pas libre. Sinon il y a minicom et un tas d'autres.
Les paramètres de connexion sont la vitesse qui dépend du Serial.begin() de votre appli, 8 bits de données, pas de parité, 1 bit de stop, pas de contrôle de flot. Comme ceci :



Il faut également ne pas avoir d'écho local et prendre en charge le backspace



La bibliothèque est ici : https://git.framasoft.org/Koryphon/CommandInterpreter/repository/archive.zip. Une fois décompressée, on obtient un dossier CommandInterpreter.git. Enlever le .git et placer le dossier dans libraries.

J'ai inclus deux exemples : un interpréteur avec 3 commandes pour lire, écrire et avoir la taille de l'EEPROM, un interpréteur pour changer et afficher l'état de la led 13.

En résumé, il faut :

  • Instancier un objet de type CommandInterpreter avec comme argument de constructeur la ligne série utilisée
  • Instancier un objet de type Command pour chaque commande avec 3 arguments : le nom de la commande, la fonction à appeler, une chaîne d'aide
  • écrire pour chaque commande une fonction à appeler. Ces fonctions prennent 2 arguments : une référence vers un CommandInterpreter (ce qui permet de récupérer la ligne série employée et chaque argument), un byte qui est le nombre d'arguments
  • dans setup, ajouter les commandes à l'interpréteur via la méthode addCommand
  • dans loop, appeler CommandInterpreter::update() pour que l'interaction avec l'utilisateur se fasse

On a alors un moniteur qui fonctionne en « tâche de fond » pourvu qu'il n'y ait aucun appel à des delay longs dans le programme.

Avec les flèches haut / bas, on peut se balader dans l'historique, une fois une entrée de l'historique sélectionnée elle peut bien entendu être éditée. L'historique ne stocke pas une nouvelle commande si la précédente est identique.
« Modifié: avril 14, 2015, 02:24:48 pm par Jean-Luc »
Cordialement

Thierry

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 810
    • Voir le profil
Re : Bibliothèque CommandInterpreter
« Réponse #1 le: avril 14, 2015, 11:55:55 am »
Très intéressant, mais pour ma part j'ai préféré me passer complètement de l'Arduino !
La disponibilité gratuite de Visual Studio Community m'a poussé à développer une solution permettant d'émuler certains comportements dans Visual.

J'ai commencé avec UAD qui m'a permis de créer un environnement de compilation/exécution d'un .ino avec une émulation très partielle de l'Arduino. Les fonctions d'entrée sortie ne font rien mais je peux ainsi regarder sous débuggueur si je passe bien là où je crois dans le code, et si tout est bien initialisé. En ajoutant un peu de code de test, il devient possible de simuler l'activation d'un bouton et de voir son effet...

Dans mon nouveau projet DcDccControler, d'autres besoins sont apparus. J'ai besoin d'un écran LCD alphanumérique, et de lecture/sauvegarde sur EEPROM. Pour ce denier point, c'est facile, j'écris un fichier disque dont le contenu est le reflet de la mémoire EEPROM... Par contre, pour simuler l'écran, j'ai créé une fenêtre Windows capable d'afficher 4 lignes de 40 caractères (pour parer à toute éventualité), plus une zone en dessous affichant le moniteur série... Du coup, je peux complètement développer mon interactif sans même flasher l'Arduino !

Jean-Luc

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 1714
    • Voir le profil
Re : Bibliothèque CommandInterpreter
« Réponse #2 le: avril 14, 2015, 12:18:33 pm »
Pas mal ta paravirtualisation ;-)

Mais tu ne peux pas allumer une vrai LED :-) Trêve de plaisanterie, je n'opposerais pas les deux solutions. Ta solution permet de développer et débugguer confortablement mais si ton modèle n'est pas conforme à la réalité, tu passes à côté de certaines choses. Ma solution permet juste de doter une application d'une interface pour interagir via la ligne série.
Cordialement

Thierry

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 810
    • Voir le profil
Re : Bibliothèque CommandInterpreter
« Réponse #3 le: avril 14, 2015, 02:12:48 pm »
Tu as tout à fait raison, ce n'est pas le même besoin. Il existe de vrais émulateurs pour allumer une led, mais ça reste très limité...
Ta solution est bien plus pertinente pour tester du PWM ou du DCC...

Guillaume

  • Global Moderator
  • Full Member
  • *****
  • Messages: 204
    • Voir le profil
    • Locoduino
Re : Bibliothèque CommandInterpreter
« Réponse #4 le: avril 22, 2015, 11:25:19 pm »
Je vais aller un peu plus loin ou moins finalement.
J'avoue qu'en ayant regardé l'exemple de la del, cela me dépasse un peu avec les & et tout ce sera pour plus tard.
Mais j'ai compris le système : à peu près le même principe que scheduleTable dans le fonctionnement de la table. On crée un objet pour faire la config dela voie et l'update. Et  on crée chaque objet avec une instance de la voie série (auquel il va répondre) auquel on associe une fonction qui agit en fonction du "suffixe" après son mot clé. J'avoue que le reste je patine un peu mais je vois quand même le potentiel qui est une biblio dérivée de celle-ci (avec peut-être moins de choses) pour écouter la voie série et agir en fonction ; idéal avec processing dans ce cas. Ou alors je fais fausse route comme d'hab...
G.

Dominique

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 3038
  • 100% Arduino et N
    • Voir le profil
Re : Bibliothèque CommandInterpreter
« Réponse #5 le: juillet 25, 2015, 12:05:06 pm »
Je viens de tester cette bibliothèque dans mon programme de tests de performances du CAN pour réaliser diverses fonctions comme un affichage complet ou non des messages échangés, l'affichage des compteurs émis/reçus/perdus ou la variation du delay entre émissions (donc la fréquence des envois de messages)

J'atteste que ça marche nickel !!!
Bravo Jean-Luc  ;D
Cordialement,
Dominique