Auteur Sujet: Perte des fonctions  (Lu 21982 fois)

Tony04

  • Hero Member
  • *****
  • Messages: 549
    • Voir le profil
Re : Re : Perte des fonctions
« Réponse #15 le: octobre 31, 2018, 11:49:25 am »
C’est aussi documenté dans la bibliothèque et les exemples.

Bonjour Dominique,

merci pour ces infos, j'ai bien réussi à allumer et éteindre les feux par "DCCpp::setFunctionsMain(1, 13, gLocoFunctions);" mais, d'une part je ne sais pas ce que représente le 1 dans la parenthèse (je suppose que c'est un registre), d'autre part je n'ai pas trouvé la doc dont tu me parles ni dans la biblio ni dans les exemples.
Si je veux activer d'autres fonctions par exemple, comment dois-je m'y prendre ? Plus j'avance plus je découvre mes lacunes  :(

Amitiés
Antoine

Thierry

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 744
    • Voir le profil
Re : Perte des fonctions
« Réponse #16 le: octobre 31, 2018, 11:58:44 am »
Bonjour

Dans cette fonction, le 1 est effectivement le numéro de registre. Mais comme je le disais précédemment c'est plutôt le 0 qui devrait être utilisé ici, parce que le 1 est probablement utilisé par une machine pour sa vitesse, ce qui signifie qu'au lieu de répéter la vitesse comme c'est la norme, on répète l'état des fonctions ! Le 13 est l'adresse DCC de la loco, et gLocoFonction est une structure qui connait l'état de l'ensemble des fonctions d'une loco. En effet, le DCC ne permet pas d'activer les fonctions une par une. A la place il faut envoyer l'état voulu par groupes de quatre, ce qui fait que l'on doit se souvenir de l'état des autres fonctions du groupe à chaque envoi...
Accessoirement, il faudra que je change l'aide de la fonction qui dit de ne pas utiliser le registre 0...

Tony04

  • Hero Member
  • *****
  • Messages: 549
    • Voir le profil
Re : Perte des fonctions
« Réponse #17 le: octobre 31, 2018, 12:30:28 pm »
Je comprends un (tout petit) mieux.

Par contre grâce à tous ces essais je viens de découvrir un gros problème sur ma config MEGA. Le blocage que j'imaginais venir de mes répétitions trop rapides des fonctions vient d'ailleurs, je m'explique:

Je mets une loco 13 sur le rail
j'envoie par le moniteur série "<t 1 13 1 1>", la loco avance bien sur le cran 1
j'envoie par le moniteur série "<t 1 14 1 1>" même qu'il n'y a pas de loco 14 sur le rail
je crée une petite coupure en soulevant la loco 13, en la remettant elle ne démarre plus. Mon erreur vient-elle de l'utilisation du même registre "1" ? Et si oui, combien de registres puis utiliser ? Est-ce 11 si j'ai bien compris la réponse de Thierry ici: http://forum.locoduino.org/index.php?topic=625.msg7100#msg7100

En faisant un essai avec, pour la loco 14, le registre 2, tout rentre dans l'ordre, le problème semble donc bien venir de là. Y-a-t-il un endroit ou ces registres sont expliqués ?

Beaucoup de question mais oh combien utiles.


Thierry

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 744
    • Voir le profil
Re : Perte des fonctions
« Réponse #18 le: octobre 31, 2018, 01:45:32 pm »
Malheureusement, il n'y a pas de doc très claire sur le sujet. Par contre ce n'est pas très compliqué. Sur une config normale, il y a douze registres permis, de 0 à 11. Un registre, c'est juste une commande DCC prête à être envoyée. On a donc dans le logiciel une liste de 12 commandes DCC.

- Le registre 0 ne concerne que les ordres transitoires : fonctions, réglage CV, accessoires.
- Les autres, 1 à 10, répètent simplement inlassablement leur contenu sur la ligne DCC.

A charge pour celui qui utilise DCC++ de gérer lui-même l'affectation d'un registre à une loco particulière, ou à la répétition d'autre chose, comme les fonctions d'une loco. J'avais par exemple envisagé de pouvoir gérer cinq locos, avec les registres impair pour la vitesse (1, 3, 5, 7, 9) et les pairs pour les fonctions (2, 4, 6, 8, 10), le 0 restant pour les accessoires. Ce n'est qu'une affaire de convention, DCC++ ne décide de rien, juste de répéter ou pas les commandes selon le registre.

Tony04

  • Hero Member
  • *****
  • Messages: 549
    • Voir le profil
Re : Perte des fonctions
« Réponse #19 le: octobre 31, 2018, 01:54:55 pm »
Bien compris Thierry, cela commence à être plus limpide pour moi. J'étais entrain de poser une question à Dominique à ce sujet, la voilà:

Tu trouveras un exemple dans mon programme de va et vient :
Dans la fonction Train::feux()

FunctionsState gLocoFunctions;     // Current functions of the loco

void Train::feux(bool l) {
  if (l) {
    gLocoFunctions.activate(0);
  } else {
    gLocoFunctions.inactivate(0);
  }
  DCCpp::setFunctionsMain(1, adresse_dcc, gLocoFunctions);
}

J'essaye au maximum de comprendre l'utilisation de la fonction feux: Je vais déjà passer le N° de registre à 0 comme le suggère Thierry, ensuite je suppose que dans activate(0) le (0) est le N° de la fonction à traiter.
Mais comme je veux garder en mémoire toutes les fonctions de 10 locos par exemple, je suppose que je suis obligé de créer pour chaque loco une structure séparée dans le style:
FunctionsState gLoco_1_Functions;
FunctionsState gLoco_2_Functions;
FunctionsState gLoco_3_Functions;

Peux-t-on le faire avec un indice (question peut-être idiote)?
FunctionsState gLocoFunctions[0];
FunctionsState gLocoFunctions[1];
FunctionsState gLocoFunctions[2];

Fin de la question à Dominique.

Quand j'aurais la réponse à ces questions il suffira que je définisse les registres que je veux utiliser pour les fonctions et cela devrait rouler non ?

Dominique

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 2889
  • 100% Arduino et N
    • Voir le profil
Re : Perte des fonctions
« Réponse #20 le: octobre 31, 2018, 05:00:47 pm »
Si je comprends bien il vaudrait mieux écrire

FunctionsState gLocoFunctions;     // Current functions of the loco

void Train::feux(bool l) {
  if (l) {
    gLocoFunctions.activate(0);
  } else {
    gLocoFunctions.inactivate(0);
  }
  DCCpp::setFunctionsMain(2, adresse_dcc, gLocoFunctions);
}

Car le registre 1 est utilisé pour le vitesse/direction et le registre 2 sera donc utilisé par la fonction.

Comme il n'y a qu'un seul train sur le va et vient, il y a assez de registres.

Si je veux utiliser 12 trains (ou 11 ?) alors je dois répéter pour chaque machine, une séquence de commande de fonction (une fois) suivi de la commende de vitesse pour que cette dernière soit bien répétée automatiquement. Mais la répétition de la séquence, est à faire dans la loop sur condition de millis().
Cordialement,
Dominique

Tony04

  • Hero Member
  • *****
  • Messages: 549
    • Voir le profil
Re : Re : Perte des fonctions
« Réponse #21 le: novembre 01, 2018, 12:28:33 am »
@ Tony, lançons une bouteille à la mer à destination de ceux qui se sentent de taille à intervenir dans le code de DCCpp pour y ajouter cette option. Option qui a peut-être ses contreparties, car sinon, j'imagine que Gregg y avait pensé.

La bouteille à la mer a visiblement portée ses fruits. Avec l'aide de Dominique et Thierry + un peu le fichier d'aide en html j'ai trouvé la solution de sauvegarde des fonctions.

J'ai décidé d'un maximum de 12 locos, c'est pour un club et ma centrale tourne avec un MEGA donc pas de problème de mémoire.
Modifié la ligne 23 de config.h MAX_MAIN_REGISTERS = 24 (le registre 0 n'étant pas utilisable à la demande), registre 1 à 12 pour la sauvegarde des vitesses et sens, 13 à 24 pour la sauvegarde des fonctions.
J'ai un tableau d'int de 12 adresses DCC qui se rempli au fur et à mesure de l'arrivée d'une nouvelle loco.
L'indice de ce tableau me permet de pointer soit les 12 registres de vitesse (indice+1), soit les 12 registres de fonctions(indice+13). Ces tableaux sont remplis au fur et à mesure des ordres DCC qui arrivent. Pour les fonctions par le code de Dominique ci-dessous:

FunctionsState gLocoFunctions; // définir la structure

if (etat_fct) {
gLocoFunctions.activate(num_fct);
} else {
gLocoFunctions.inactivate(num_fct);
}
DCCpp::setFunctionsMain(num_registre, adr_loco, gLocoFunctions);  // MAJ registre loco

Et le tour est joué, je ne perds plus aucune fonction et sans faire de mise à jour dans le loop.

Reste à faire l'essai avec le maximum de locos et le maximum de fonctions pour être sûr du résultat, ce qui sera fait en fin de semaine. Je vous tiendrai au courant pour ceux que cela intéresse.

Bonne nuit à tous, je vais me coucher  :)


Dominique

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 2889
  • 100% Arduino et N
    • Voir le profil
Re : Re : Re : Perte des fonctions
« Réponse #22 le: novembre 01, 2018, 09:10:45 am »
Modifié la ligne 23 de config.h MAX_MAIN_REGISTERS = 24 (le registre 0 n'étant pas utilisable à la demande), registre 1 à 12 pour la sauvegarde des vitesses et sens, 13 à 24 pour la sauvegarde des fonctions.

Attention : de 0 à 24, ça fait 25 registres !
Cordialement,
Dominique

Tony04

  • Hero Member
  • *****
  • Messages: 549
    • Voir le profil
Re : Perte des fonctions
« Réponse #23 le: novembre 01, 2018, 11:28:15 am »
Oui, il semblerait d'après ma calculette  :D

mais comme je l'ai précisé et que les essais m'ont prouvés, le registre 0 ne peut pas être utilisé avec l'instruction DCCpp::setFunctionsMain(num_registre, adr_loco, gLocoFunctions);  // MAJ registre loco