Discussions Générales > Bus DCC

Perte des fonctions

<< < (5/5)

Dominique:
Si je comprends bien il vaudrait mieux écrire


--- Code: ---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);
}
--- Fin du code ---

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().

Tony04:

--- Citation de: msport le octobre 28, 2018, 05:56:47 pm ---@ 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é.

--- Fin de citation ---

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:


--- Code: ---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

--- Fin du code ---

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:

--- Citation de: Tony04 le novembre 01, 2018, 12:28:33 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.

--- Fin de citation ---

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

Tony04:
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

Navigation

[0] Index des messages

[*] Page précédente

Utiliser la version classique