Auteur Sujet: Bug DCC++ dans fonction Sensor::check()  (Lu 17644 fois)

nopxor

  • Full Member
  • ***
  • Messages: 195
    • Voir le profil
Bug DCC++ dans fonction Sensor::check()
« le: février 01, 2018, 05:11:32 pm »
Bonjour,

J'ai trouvé un bug dans la fonction Sensor::check() du fichier Sensor.cpp

Cette fonction est appelée  par DCCpp::loop() pour transmettre les changements d'états des pins des sensors.

Telle qu'elle est définie elle ne transmet que sur l'interface ETHERNET.
Donc si on utilise une connection USB série les états des sensors ne sont jamais envoyés.

Pour remédier à cela, il suffit de commenter les lignes #if defined(USE_ETHERNET)  en 128, 132, 135 et 139

Avec cette correction l'état des sensors est bien transmis au PC et JMRI peut (enfin...) les prendre en compte. 8)

Ce bug est dans la librairie DCCpp mais pas dans DCC++ sur GitHub.
« Modifié: février 01, 2018, 05:35:54 pm par nopxor »

Thierry

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 810
    • Voir le profil
Re : Bug DCC++ dans fonction Sensor::check()
« Réponse #1 le: février 02, 2018, 11:30:36 pm »
Tu as tout à fait raison. Le problème sera corrigé -un peu différemment- dans la prochaine version:

void Sensor::check(){
  Sensor *tt;

  for(tt = firstSensor; tt != NULL; tt = tt->nextSensor){
    tt->signal = (float)(tt->signal * (1.0 - SENSOR_DECAY) + digitalRead(tt->data.pin) * SENSOR_DECAY);
   
    if(!tt->active && tt->signal<0.5){
      tt->active=true;
      INTERFACE.print("<Q");
      INTERFACE.print(tt->data.snum);
      INTERFACE.print(">");
#if !defined(USE_ETHERNET)
      INTERFACE.println("");
#endif
    } else if(tt->active && tt->signal>0.9){
      tt->active=false;
      INTERFACE.print("<q");
      INTERFACE.print(tt->data.snum);
      INTERFACE.print(">");
#if !defined(USE_ETHERNET)
      INTERFACE.println("");
#endif
    }
  } // loop over all sensors
   
} // Sensor::check

Ainsi le texte est toujours envoyé, quelle que soit l'interface, mais en plus si on est sur une connexion série, un retour chariot sort le message de suite sur la console et améliore la lisibilité.