Discussions Générales > Bus DCC

Nouvelle souris sans fil à mémoire

(1/3) > >>

Tony04:
Bonsoir à tous,

je suis entrain de réaliser une souris sans fil dans laquelle je stocke entre 50 et 100 locos (avec adresse, nom, crans). Tout fonctionne mais quand je liste mes locos j'aimerais les trier au moins par adresse de machine (voir par nom, plus dur).
Quelqu'un a-t-il déjà eu ce problème à résoudre avec arduino ou éventuellement dans un autre domaine ?

Que ferais-je sans Locoduino ?   ;) (l'ordi vient de me souligner en rouge Locoduino, je l'ai vite remis en place  >:( )

A plus tard donc
Cordialement
Antoine

Didier44:
Bonjour Antoine,

Tu ne nous donnes pas beaucoup de clés pour t'aider  ;)
En C++ il existe une fonction appelé std::map qui pourrais t'aider (voir ce lien https://fr.cppreference.com/w/cpp/container/map)
Si à chaque loco tu as associé une classe ou une struct que tu puisses atteindre par un pointeur, alors map te permets d'associer à une clé (le nom de la loco ou son CV) le pointeur vers ta loco. Les clés sont triés par ordre alphabétique. Et il est très simple de retrouver une loco juste par son nom:


--- Code: ---std::map<nom_loco, pointeur_vers_loco> liste_locos
pointeur_vers_loco = liste_locos[nom_loco]

--- Fin du code ---

Si tu as de la mémoire disponible dans ton Arduino tu peux faire la même chose en utilisant non pas le nom de la loco mais son adresse.


--- Code: ---std::map<adresse_loco, pointeur_vers_loco> liste_locos
pointeur_vers_loco = liste_locos[adresse_loco]

--- Fin du code ---

Cette fonction n’existe pas en natif dans l'IDE d'Arduino mais sur un développement actuel, dont je parlerais bientôt, j'utilise un plugin (et non une library) qui le permet et qui fonctionne bien. Bien sur cela consomme un peu plus de mémoire sur l'Arduino.
Voir ici pour ce plugin http://andybrown.me.uk/2011/01/15/the-standard-template-library-stl-for-avr-with-c-streams/

Correction: une note dans l'un de mes projets m'a induit en erreur: les STL sont bien natifs à ce jour et la library  (ArduinoSTL par Mike Matera) est inspirée du lien ci dessus et c'est celle que j'ai utilisée récemment.

Bon développement
Didier

Tony04:
Bonjour à tous,

merci à toi Didier pour ce renseignement qui est certainement la solution.
Hélas, je suis absolument nul en classe et en structure; de plus je suis à 98% de stockage programme et 76% de ram, il ne me reste donc pas beaucoup de place mais je vais quand même me pencher sur cette solution peut-être avec les derniers neurones qui me restent  :D

Actuellement j'ai en EEPROM les 50 locos sous ce format: 1 octet=ordre (besoin interne), 2 octets=adresse loco, 14 octets=nom loco. Comment pourrais-je utiliser ta solution ?

Bonne après-midi Locoduino
Antoine

Thierry:
Un autre moyen est de créer une liste d'entiers ou d'octets (si on se limite à 255 machines maxi) qui représente la liste triée des locos présentes en EEPROM. Il "suffit" de créer cette liste au démarrage une fois pour toutes. L'autre solution si l'on veut éviter d'utiliser de la mémoire centrale ou de la mémoire programme est de créer cette liste directement en mémoire EEPROM grâce à un autre programme sur Arduino ou sur ordinateur, et de mettre ces 255 octets dès le début de l'EEPROM, avant les locos. Pour atteindre une loco, une simple indirection suffit : je veux la loco 3 dans l'ordre, je lis l'octet 3 de la liste qui me dit c'est l'enregistrement EEPROM 17, je lis la loco à l'emplacement 17 !

Tony04:
Super idée et totalement dans mes cordes celle-là, un grand merci à toi Thierry.

Bonne soirée à tous
Antoine

Navigation

[0] Index des messages

[#] Page suivante

Utiliser la version classique