LOCODUINO

Parlons Arduino => Bibliothèques => Discussion démarrée par: Thierry le octobre 18, 2017, 04:15:13 pm

Titre: ArduiEmulator
Posté par: Thierry le octobre 18, 2017, 04:15:13 pm
Pour moi qui développe professionnellement au quotidien avec Visual Studio de Microsoft sous Windows 10, utiliser l'IDE et ses ressources pour identifier un problème dans mes développements Arduino est une 'souffrance' permanente. Pas de vrai débogueur, un éditeur minimaliste... Alors dès le début de mes pérégrinations Arduinesques, j'ai tenté de trouver le moyen d'utiliser visual plutôt que l'IDE, mais aussi et surtout de tester mon code sans utiliser d'Arduino !

Des émulateurs existent sur le net ou ailleurs, mais ils ne permettent pas de voir l'évolution des variables pendant l'exécution, ni de suivre la progression du programme sur chaque ligne de code exécutée... Et ça, c'est dans le meilleurs des cas, lorsqu'ils permettent d'utiliser une bibliothèque maison...

Utilisant Visual Studio 2015 à l'époque, j'ai créé un projet ArduiEmulator dont le but initial n'était que de pouvoir compiler et lancer un fichier .ino sans aucune émulation. Juste de quoi voir ce qui se passe dans le setup... Pour ceux que cela intéresse, ce projet est en C++ managé, c'est à dire dans le Framework .Net. Si ces mots ne vous disent rien, ce n'est pas grave, ils ne seront utiles qu'à ceux qui voudront modifier l'émulateur. Rapidement, le besoin d'une véritable émulation pour les broches et un écran Lcd ont été nécessaires. En particulier au moment de développer et tester LcdUI.

Aujourd'hui, le projet s'est étendu, et il permet de simuler une mémoire EEPROM, une liaison série bidirectionnelle, un écran Lcd. Il dispose d'une console série pour voir passer les messages, d'une zone de saisie pour en envoyer par la liaison série, d'une liste des broches actives avec possibilité de les nommer pour plus de clarté, de la possibilité de cliquer dessus pour en changer l'état, etc...

Pour s'en servir il faut un Visual Studio 2015 ou 2017 Community qui est gratuit (https://www.visualstudio.com/fr/thank-you-downloading-visual-studio/?sku=Community&rel=15 (https://www.visualstudio.com/fr/thank-you-downloading-visual-studio/?sku=Community&rel=15)). Je sais que Visual existe sous Mac, mais je ne sais pas s'il est compatible, en particulier à cause de la partie .Net qui est obligatoire pour l'émulateur. Pour simplifier, nous considéreront pour la suite que l'on parle d'une version Windows.
Les croquis créés à l'aide de l'IDE vont par défaut dans 'Mes Documents/Arduino'. C'est là qu'il faudra décompresser le ArduiEmulator.zip que vous trouverez dans le répertoire extras de toutes mes bibliothèques (très) récentes. C'est d'ailleurs le même zip partout, il n'y a pas une version par bibliothèque...

Visual a besoin d'une 'solution' (un fichier .sln) pour travailler. Une solution est un ensemble de projets (fichiers .vcxproj) dont ArduiEmulator fait partie. Toujours dans mes bibliothèques récentes, se trouve un répertoire vstudio contenant une solution. Par exemple Accessories contient dans le répertoire 'Mes documents/Arduino/libraries/Accessories/vstudio' un fichier AccessoriesTestExe.sln qui permet de travailler avec l'émulateur.
Pour utiliser un fichier ino particulier, il faut modifier le fichier InoProjet.cpp dans Visual en remplaçant l'include du type

#include "../examples/locoduino.org/programme6/programme6.ino"

par le vôtre :

#include "../../MonCroquis/MonCroquis.ino"

Ensuite, F5 pour compiler et lancer, et vous vous retrouvez dans l'émulateur !

Il est également disponible pour Commanders, Accessories, LcdUi et DcDccNanoController. Bien sûr, certaines choses ne sont pas traitées, comme le DCC ou les bus CAN, I2C ou SPI. Mais si vous utilisez Commanders, alors vous aurez à disposition un nouveau type de bouton ButtonsCommanderKeyboard qui permet d'utiliser le clavier pour simuler des poussoirs. Il y a aussi une fonction pinName() pour nommer une broche. Pour les parties de code spécifiques à Visual, il y a un define VISUALSTUDIO pour faire la différence entre compilation dans Visual et ailleurs:

#ifdef VISUALSTUDIO
...
#endif

Cela permet par exemple d'isoler une partie liée au bus I2C puisque l'émulateur n'en fera rien.
Lors d'une compilation sur Visual Studio, on compile pour un Mega2560 avec 200 broches ! Les macros comme ACCESSORIES_DEBUG_MODE et ACCESSORIES_PRINT_ACCESSORIES sont activées par défaut.

Beaucoup de fonctions ne sont que purement décoratives et ne font rien, sauf permettre de compiler, comme la gestion des interruptions ou la bibliothèque Wire utilisée par le bus SPI. D'autres ont été complètement implémentées pour fonctionner, comme LiquidCrystal ou Serial. Je ne serais pas contre un peu d'aide pour continuer à étendre les fonctionnalités de cet émulateur !
Titre: Re : ArduiEmulator
Posté par: bagou91 le octobre 18, 2017, 05:21:42 pm
bonjour,

j'ai ouvert la solution AccessoriesTestExe.sln avec VS2015.
après avoir rafraichit les chemins pour ArduiEmulator, j'ai lancé une compilation:

1ère erreur pour Test.exe: il demande DIO2.dll
j'essaye de compiler le projet DIO2: erreur arduino.h introuvable
j'ajoute arduino.h (se trouvant dans les sources de ArduiEmulator) dans le projet DIO2
encore erreur: arduiemulator.inc introuvable (et effectivement manquant dans les sources ArduiEmulator)

peux tu corriger tout cela et également mettre à jour ton sujet pour expliquer les imbrications des projets et les étapes à effectuer avant de pouvoir exécuter l'émulation arduino avec un .ino ?

Merci beaucoup
Titre: Re : ArduiEmulator
Posté par: Thierry le octobre 18, 2017, 08:37:16 pm
Je dois faire des essais.
Tu es le premier utilisateur de cette solution qui n'était pas destinée à une diffusion mondiale ! Il faut donc que je teste un peu en situation réelle (biblio fraîchement installées...) pour me retrouver dans le même cas que toi et pouvoir corriger... L'autre excuse, si je devais en avoir une, c'est que la plupart des autres contributeurs du site travaillent sous Linux ou Mac. Je n'avais donc pas la pression pour mettre ArduiEmulator à disposition, vu qu'il ne tourne pas dans ces environnements.
Je reviens au plus vite pour apporter des réponses.
Titre: Re : ArduiEmulator
Posté par: bagou91 le octobre 18, 2017, 08:42:51 pm
Tu n'as pas besoin de t'excuser :)
Je trouve déjà formidable cette émulation en pouvant charger des sketch !  :D

Prends ton temps.
De mon coté je suis plus occuper sur les autres librairies ;)
Titre: Re : ArduiEmulator
Posté par: Thierry le octobre 19, 2017, 05:38:39 pm
J'ai refait les tests, ajouté les fichiers manquants et poussé toutes les bibliothèques avec les bonnes versions partout : DIO2, Accessories, Commanders, LcdUI et DcDccNanoController.
Je te conseille vivement d'enlever toutes ces bibliothèques, de les ré-installer, ainsi que ArduiEmulator. Chez moi, en partant d'un Libraries vide et sans ArduiEmulator du tout, j'ai  tout installé et cliqué sur les fichiers sln de Accessories, LcdUi et DcDccNanoController, et tout à démarré au premier F5...
Titre: Re : ArduiEmulator
Posté par: bagou91 le octobre 20, 2017, 09:49:09 am
Bonjour,

J'ai récupéré les nouveaux fichiers, tout remplacé.
J'ai ouvert la solution AccessoriesTestExe.sln, fait F5....
Mais à la compilation j'ai toujours ce problème de dll manquante:
Error   C1192   #using failed on 'Documents\Arduino\libraries\Accessories\VStudio\x64\Debug\DIO2.dll'   TestExe   Documents\Arduino\libraries\Commanders\src\ButtonsCommander.cpp   1   
Et pour le projet DIO2, le fichier arduino.h manquant.
Titre: Re : ArduiEmulator
Posté par: Thierry le octobre 21, 2017, 10:50:01 am
Deux pistes rapides :

L'emplacement de ArduiEmulator. Pour que ça marche le fichier Arduino.h doit se trouver avec une arborescence comme "Mes Documents\Arduino\ArduiEmulator\ArduiEmulator\Arduino.h" . Oui, oui, avec deux fois ArduiEmulator. C'est une erreur sans conséquence du début du projet que je n'ai pas pris le temps de corriger....

La compilation doit se faire en debug/x64. Je n'ai rien testé d'autre !
Titre: Re : ArduiEmulator
Posté par: bagou91 le octobre 21, 2017, 11:21:25 am
Bonjour,

Je suis d'accord pour l'emplacement à respecter mais arduino.h n'existe pas dans les sources de DIO2.
Titre: Re : ArduiEmulator
Posté par: Thierry le octobre 21, 2017, 01:34:52 pm
C'est parce qu'il n'y est pas ! Il est présent dans ArduiEmulator et doit y rester. C'est la configuration du projet qui dit d'aller chercher les includes dans ArduiEmulator. Pour retrouver cette configuration :

propriétés du projet DIO2
C/C++/General
première ligne Additionnal Include Directories : $(VisualStudioDir)\..\Arduino\ArduiEmulator\ArduiEmulator

dans le contexte $(VisualStudioDir) est remplacé par 'Mes documents/Visual Studio 2017'.

Je me rend compte en écrivant cette réponse que c'est peut être Visual lui-même le problème. J'utilise 2017 en anglais, et je viens d'essayer avec un 2015 en français et le résultat n'est pas bon. Je dois creuser, mais on m'attend pour aller au théâtre, alors ce sera pour demain. Bonne fin de journée !
Titre: Re : ArduiEmulator
Posté par: bagou91 le octobre 21, 2017, 02:27:57 pm
OK.
Pour ma part je ne pourrai vérifier que lundi sur VS2015...
Titre: Re : ArduiEmulator
Posté par: Thierry le octobre 22, 2017, 03:13:03 pm
Que faire pour que ça compile sur VS2015 :

Dans le projet DIO2, changer dans Linker/Debugging : 'Generate Debug Info' en 'Optimize for debugging (/DEBUG)'

Dans les trois projets changer dans General : 'Platform Toolset' en 'Visual Studio 2015 (v140)'

Pour moi, cela a corrigé les problèmes. L'autre solution est d'utiliser VS 2017 !
Titre: Re : ArduiEmulator
Posté par: bagou91 le octobre 23, 2017, 10:01:02 am
bonjour,

Oui j'avais déjà modifié "Platform Toolset" pour correspondre avec VS2015.

J'ai enfin réussi à compiler et exécuter TestExe.exe !  :D
J'ai dû en plus:
- pour chaque projet, reconfigurer "Output Directory"
- TestExe:
    ajouter dans "Additonnal Include Directory" les répertoires sources de ArduiEmulator, DIO2, Commanders
    ré-inclure en dépendances les projets ArduiEmulator et DIO2 après qu'ils ait été recompilés.

L'exemple programme2.ino fonctionne bien dans l'émulateur  8)

Par contre programme6.ino plante sur EEPROMClass ligne 343 dans InoProject.cpp, mais bon ton projet émulateur est en plein développement donc je ne m'inquiète pas d'avoir des possibles plantages  ;)

Encore bravo pour cet émulateur, et je suis prêt à t'aider (plus en tant que beta testeur qu'en tant que développeur) pour continuer son développement :)
Titre: Re : ArduiEmulator
Posté par: Thierry le octobre 23, 2017, 10:17:58 am
Bravo. Content que ça marche.
Pour l'EEPROM, je n'ai pas réussi à reproduire les fonctions get et put via des macros/templates/generics. Rien n'y fait, je n'y arrive pas. En désespoir de cause, j'ai fini par ajouter une alternative qui permet de tester quand même au prix d'un #ifdef VISUALSTUDIO bien peu élégant...
Dans l'état actuel des choses, à part ce problème je n'ai rien de prévu pour encore améliorer l'émulateur. Mais si tu as des suggestions, je suis preneur.
Titre: Re : ArduiEmulator
Posté par: bagou91 le octobre 23, 2017, 10:25:31 am
une suggestion:
si on peut livrer une release (beta) avec les dll sans avoir besoin de recompiler ce serait bien:
peut être ajouter un bouton sur l'interface pour choisir le sketch à exécuter.
Titre: Re : ArduiEmulator
Posté par: Marc-Henri le avril 24, 2018, 02:24:02 pm
Bonjour Thierry,

J'ai lu avec grand intérêt les échanges autour de la bibliothèque ArduiEmulator.

Développant sous Linux avec gcc, je serais intéressé d'adapter le concept pour mettre au point des programmes Arduino comme je fais déjà en C natif pour AVR.

Cela implique de créer un Makefile ou passer sous Eclipse pour cela, mais il me faudrait les sources. Mais je n'ai pas trouver d'où les télécharger.

Merci pour l'info.
Meilleures salutations.

Marc-Henri
Titre: Re : ArduiEmulator
Posté par: Thierry le avril 24, 2018, 04:48:27 pm
Salut

Le problème c'est que la boite de test est développée en C++ managé dotNet, qui à ma connaissance n'est pas dispo sous Linux. Peut être que du côté de Mono, clone de dotNet pour Linux, c'est possible mais là je ne maîtrise pas... Il faudrait sans la refaire en Qt ou un autre framework portable du même acabit.
Je te joins le .zip des sources.
Titre: Re : ArduiEmulator
Posté par: Marc-Henri le avril 25, 2018, 07:57:29 am
Bonjour Thierry,

Un tout grand merci pour les sources .Net dont je vais pouvoir m'inspirer.

Mon objectif est de pouvoir plus facilement mettre au point les machines d'états de l'application, éventuellement à l'aide d'un debugger. Pour cela, je vais probablement m'orienter vers une simulation en mode terminal à l'aide de la librairie stdio, ce que je fais déjà en développement natif C AVR sans Arduino et qui me suffit.

Je vais probablement procéder comme suit:
Belle journée et meilleures salutations.

Marc-Henri
Titre: Re : ArduiEmulator
Posté par: BrutDePomme le janvier 22, 2019, 11:34:33 am
Bonjour Thierry,

J'essaye d'utiliser ArduiEmulator avec la solution AccessoriesTestExe.sln. J'arrive bien à générer ArduiEmulator et DIO2.
Par contre pour TestExe, j'ai le message suivant sur VS2017:
1>AccessoriesCircularBuffer.cpp
1>d:\documents\arduino\libraries\accessories\src\portservo.hpp(54): error C2039: 'detach' : n'est pas membre de 'Servo'
1>d:\documents\arduino\arduiemulator\arduiemulator\servo.h(1): note: voir la déclaration de 'Servo'

Pouvez-vous m'aider?

Cordialement,

Philippe
Titre: Re : ArduiEmulator
Posté par: Thierry le janvier 24, 2019, 09:42:07 am
Oui effectivement, le detach était manquant à l'époque, je l'ai ajouté depuis. En pièce jointe, le nouveau fichier servo.h  .
Titre: Re : ArduiEmulator
Posté par: BrutDePomme le janvier 24, 2019, 02:05:03 pm
Bonjour Thierry,

Merci pour le fichier Servo.h, par contre, la compilation ne se fait toujours pas. J'ai ce message d'erreur:
3>d:\documents\arduino\libraries\commanders\src\eventssequencer.cpp(68): error C3861: 'memcpy_P' : identificateur introuvable


Cordialement,

Philippe
Titre: Re : ArduiEmulator
Posté par: Thierry le janvier 24, 2019, 03:06:46 pm
De mon côté, la compilation passe très bien, avec l'IDE 1.8.7 pour un Nano.
Titre: Re : ArduiEmulator
Posté par: Thierry le juin 01, 2019, 03:19:01 pm
Bonjour à tous

Deux ans après la première version de ArduiEmulator, je reviens vous présenter la version 2.0.0.
J'avais deux problèmes avec la version 1 : l'utilisation de C++ managé que je maîtrise assez peu, et la structure de la bibliothèque qui m'obligeait à passer par des macros pour les fonctions de base comme pinMode ou digitalWrite... Ce qui a été fatal lorsqu'une amélioration de Accessories a proposé de nommer des méthodes de classe avec ces mêmes noms. Impossible tant que les macros chercheraient à remplacer les nouvelles fonctions par des macros sans aucun rapport.
J'ai essayé de solutionner les deux problèmes simultanément.

Première partie de la solution, un exécutable Window en véritable C# beaucoup plus facile à manipuler (pour moi en tout cas) que le C++ managé. Ce programme, ArduiEmulatorWin, que nous appellerons l'émulateur, ne contient que l'émulation proprement dite. Un fois compilé, cet exécutable n'a pas besoin de changer à chaque projet...
L'allure générale et les capacités sont globalement les mêmes que la version 1, mais des nouveautés sont apparues :

Seconde partie : la librairie qu'il faut lier au ino utilisateur pour créer l'exécutable Arduino. On se retrouve avec deux exécutables qui vont discuter et échanger des informations.

Comment ça marche : chacun des deux exécutables est à la fois un émetteur et un récepteur de messages texte. La discussion passe par des 'NamedPipes'. Chaque exécutable dispose d'un NamedPipe en émission, et d'un autre en réception. Les deux programmes échangent continuellement des messages pour maintenir la connexion active. L'émulateur dispose en bas à gauche d'une icône rouge lorsque rien n'est connecté qui passe au vert lorsqu'un programme utilisant la librairie se met en route. Dès que ce programme s’arrête, l'icone de l'émulateur redevient rouge. L'émulateur peut rester ouvert en permanence, à chaque lancement de l'exécutable Arduino, un premier message de 'Reset' est envoyé à l'émulateur qui va tout vider pour revenir à un état de démarrage. L'exécutable Arduino est un simple programme 'Console'.

L'avenir de ce programme passe par Linux. Microsoft a développé .Net Core, version de .Net multiplate-forme en Open Source. La version 3.0 permet de construire des boites de dialogue mais reste dans ce cas un programme Windows. D'autres framework de dialogue vont émerger, peut être parmi ceux déjà connus pour être aussi multiplate-forme comme WX ou Qt (les Unixiens sont fainéants des doigts...) . Cela permettra à terme de faire en sorte que ArduiEmulatorWin devienne lui aussi multiplate-forme ! Les NamedPipes utilisés pour discuter entre les programmes existent sous Linux, et en fait viennent d'Unix. Donc pas de problème de ce côté. Il faudra en outre adapter la librairie pour travailler par exemple avec Gcc. Bref, encore du boulot en perspective. Peut être que des Linuxiens pourraient m'aider dans cette partie ? Je n'ai jamais été à l'aise avec ce système... Idem pour Mac, je ne doute pas que l'on trouve des solutions pour adapter tout ça.

Cette fois, c'est bien d'un bon projet collaboratif qui est présent sur le locogit : https://github.com/Locoduino/ArduiEmulatorWin (https://github.com/Locoduino/ArduiEmulatorWin). Le répertoire ArduinoEmulatorWin contient  les sources de l'émulateur, tandis que ArduiEmulatorLib contient la librairie.
Les projets DIO2, Accessories, Commanders et LcdUi ont été mis à jour dans le Locogit pour prendre en compte de nouvel émulateur. Ceux qui ont utilisé la version 1 constateront que ces bibliothèques disposent maintenant de projets locaux à inclure dans une nouvelle solution pour bénéficier de leur comportement. Il n'est plus besoin d'ajouter manuellement au projet principal tous les sources d'une bibliothèque pour les utiliser.