Auteur Sujet: Bibliothèque Accessoire regression BaseAccessoryLigh gestion Blink()  (Lu 23452 fois)

golgoth1009

  • Newbie
  • *
  • Messages: 14
    • Voir le profil
Bonjour,
Déjà merci beaucoup pour cette librairie Accessory qui facilite grandement la gestion de mon réseau.
J'ai découvert une régression sur la bibliothèque >1.0 concernant la gestion du blink() dans BaseAccessoryLight::ActionEnded().
Sur les cases Light_On et Light_Off, il faut rajouter des tests sur les cas LIGHTBLINK pour rentrer dans le if et il faut aussi empêcher de changer le current_state si le temps n'est pas écoulé (rajouter un else if).
J'ai fait ces modifs et cela refonctionne.
Il est aussi intéressant de rajouter SetBLink(..) dans AccessoryLight (comme cela est fait dans AccessoryMultiLight).
Utiliser SetDuration ne fonctionne pas pour AccessoryLight (petite erreur dans la doc)


Thierry

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 810
    • Voir le profil
Re : Bibliothèque Accessoire regression BaseAccessoryLigh gestion Blink()
« Réponse #1 le: février 15, 2018, 11:42:35 am »
Merci pour les infos, je regarde ça demain soir pour publier une version qui marche ! Il y aura pour cette occasion aussi des mises à jour de DCCpp et de Commanders.

golgoth1009

  • Newbie
  • *
  • Messages: 14
    • Voir le profil
Re : Bibliothèque Accessoire regression BaseAccessoryLigh gestion Blink()
« Réponse #2 le: février 15, 2018, 07:34:16 pm »
Bonsoir Thierry,
je l'ai modifié comme ci-dessous et testé grâce à l'émulateur que tu as fait (encore merci!)
case LIGHT_ON:
if (this->state == LIGHTOFF || this->IsBlinking())
{
if (this->IsFading() || (this->IsBlinking() && millis() - this->startingMillis > this->blinkingDelay - FADING_FULL_DELAY))
{
this->currentState = LIGHT_DESCENDING;
this->startingMillis = millis();
this->LightFadingRaw(this->pPort->GetSpeed());
return false;
}
else if (!this->IsBlinking())
{
this->currentState = LIGHT_OFF;
this->pPort->MoveStop();
}
}
break;
case LIGHT_OFF:
if (this->state == LIGHTON || this->IsBlinking())
{
if (this->IsFading() || (this->IsBlinking() && millis() - this->startingMillis > this->blinkingDelay - FADING_FULL_DELAY))
{
this->currentState = LIGHT_ASCENDING;
this->startingMillis = millis();
this->LightFadingRaw(0);
return false;
}
else if (!this->IsBlinking())
{
this->currentState = LIGHT_ON;
this->pPort->MoveLeftDir();
}
}
break;
Je pense que tu n'as pas besoin de mon aide pour fixer ça mais au cas où ;-)

Thierry

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 810
    • Voir le profil
Re : Bibliothèque Accessoire regression BaseAccessoryLigh gestion Blink()
« Réponse #3 le: février 16, 2018, 06:21:07 pm »
Tu pourrais poster ici le .ino qui t'a servi à tester la modification ? Juste pour m'assurer si je ne reporte pas ta modif au caractère près que ça marche quand même...
« Modifié: février 16, 2018, 09:13:38 pm par Thierry »

golgoth1009

  • Newbie
  • *
  • Messages: 14
    • Voir le profil
Re : Bibliothèque Accessoire regression BaseAccessoryLigh gestion Blink()
« Réponse #4 le: février 16, 2018, 08:17:04 pm »
J'ai juste dupliqué le simpleLed.ino et rajouté l'appel au blink. (en fait j'ai testé un midi au taf et je n'ai pas le test à la maison)
Ensuite dans le loop(), sans la modif, le changement d'état ne se fait pas.
Avec la modif, dans l'interface, on voit le changement d'état HIGH/LOW qui s'effectue périodiquement.

Thierry

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 810
    • Voir le profil
Re : Bibliothèque Accessoire regression BaseAccessoryLigh gestion Blink()
« Réponse #5 le: février 16, 2018, 09:13:46 pm »
Si tu pouvais aussi préciser pour la doc, parce que je ne vois pas...

golgoth1009

  • Newbie
  • *
  • Messages: 14
    • Voir le profil
Re : Bibliothèque Accessoire regression BaseAccessoryLigh gestion Blink()
« Réponse #6 le: février 16, 2018, 10:14:43 pm »
ah oui pardon,
au niveau de la doc, tu indique que le SetDuration() dans Accessory.hpp est utilisé pour le temps du Blink.
Mais, en fait, AccessoryLight, le temps de blink ne peut plus être modifié après le begin().
Il faudrait soit surcharger SetDuration() au niveau de AccessoryLight pour aussi appeller SetBlinking() de AccessoryBaseLight() (et la doc devient ok ;-))
soir créer une méthode SetBlinking au niveau de AccessoryLight (ce que tu as fait pour AccessoryMultiLight).

golgoth1009

  • Newbie
  • *
  • Messages: 14
    • Voir le profil
Re : Bibliothèque Accessoire regression BaseAccessoryLigh gestion Blink()
« Réponse #7 le: février 18, 2018, 10:47:51 pm »
Bonsoir Thierry,
Je m'aperçois que ma proposition ne restaure le fonctionnement du blink uniquement si le fading n'est pas activé.
Si le fading est activé, le blink fonctionne mais dure le temps du fading (à cause du test isfading dans la condition).
Sur ce, bonne nuit !

 

Thierry

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 810
    • Voir le profil
Re : Bibliothèque Accessoire regression BaseAccessoryLigh gestion Blink()
« Réponse #8 le: février 19, 2018, 09:09:42 am »
Ok. J'ai poussé une nouvelle version hier soir, mais je reverrai ma copie demain soir (les soirées micro, c'est mardi et vendredi pour moi...).

golgoth1009

  • Newbie
  • *
  • Messages: 14
    • Voir le profil
Re : Bibliothèque Accessoire regression BaseAccessoryLigh gestion Blink()
« Réponse #9 le: février 20, 2018, 06:21:14 pm »
Bonjour Thierry,
J'ai revu ma copie par rapport à ma première proposition pour avoir le fading et blinking cumulé (ici pour le case LIGHT_ON)
if (this->state == LIGHTOFF || (this->IsBlinking() && millis() - this->startingMillis > this->blinkingDelay - FADING_FULL_DELAY))
{
if (this->IsFading())
{
this->currentState = LIGHT_DESCENDING;
this->startingMillis = millis();
this->LightFadingRaw(this->pPort->GetSpeed());
return false;
}
else
{
if (this->IsBlinking())
this->startingMillis = millis();
this->currentState = LIGHT_OFF;
this->pPort->MoveStop();
}
}
Il y a un petit truc à améliorer dans le case Light_Ascending, dans le test une fois l'intensité max atteinte, il faut rajouté un "="
... if (curr >= this->pPort->GetSpeed() || curr <= 0) ...

Un dernier truc, pour le fading_delay, pourrais-tu le transformer en unsigned long au lieu de uint8_t ? (j'ai un cas ou je veux faire un fading très long)
Ton simulateur est vraiment super, j'ai pu tester mon programme (je réalise un circuit de 8 cantons, 3 aiguillages en analogique avec un arduino mega)



Thierry

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 810
    • Voir le profil
Re : Bibliothèque Accessoire regression BaseAccessoryLigh gestion Blink()
« Réponse #10 le: février 20, 2018, 09:11:50 pm »
Merci encore pour la correction. Je l'ai implémentée chez moi, et j'ai aussi ajouté un StartAction() dans SetState parce que sinon le clignotement ne démarrait pas :
void AccessoryBaseLight::SetStateRaw(ACC_STATE inNewState)
{
if (this->state != inNewState)
{
if (inNewState == LIGHTBLINK && this->startingMillis == 0)
this->StartAction();
this->state = inNewState;
this->pOwner->SetStateRaw(inNewState);
}
}

Dans le simulateur, dans ArduinoForm.hpp j'ai corrigé l'affichage des pins pour voir la valeur analogique courante qui ne s'affichait plus (dans le switch)...
private: ref class PinListItem
{
public:
int pin;
int state;
String^ name;

PinListItem(int inPin, int inState, String^ inName)
{
this->pin = inPin;
this->state = inState;
this->name = inName;
}

virtual String ^ToString() override
{
String^ str = gcnew String("     ");
String^ textName;

if (String::IsNullOrEmpty(this->name))
textName = String::Format("{0,-4}", this->pin.ToString());
else
textName = String::Format("{0,-4}", this->name);

switch (this->state)
{
case VS_LOW:
str = String::Format("{0}  LOW", textName);
break;
case VS_HIGH:
str = String::Format("{0} HIGH", textName);
break;
case OUTPUT_RESERVED:
str = String::Format("{0} ----", textName);
break;
case OUTPUT_INTERRUPT:
str = String::Format("{0} INTR", textName);
break;
default:
str = String::Format("{0} {1,4}", textName, this->state.ToString());
break;
}
return str;
}
};

Je ne comprend pas ta demande pour le fading. Dans SetFading, on précise un pas entre 1 et 255, et un délai dans les mêmes limites. Ce qui fait qu'au maximum, un délai de 255ms avec un pas de 1 donne 255*255 ms soit 65 secondes juste pour faire décroître la lumière... Tu as besoin de plus que ça ? Je ne suis pas sûr que le fading soit le plus adapté si c'est le cas.

golgoth1009

  • Newbie
  • *
  • Messages: 14
    • Voir le profil
Re : Bibliothèque Accessoire regression BaseAccessoryLigh gestion Blink()
« Réponse #11 le: février 20, 2018, 09:36:33 pm »
Pour le fading, j'ai un peu détourné le principe, j'ai mis un pas de 255 et un temps de 500ms,
ça m'a permis de faire un délai d'activation entre l'allumage de ma led au vert et l'activation du canton (juste pour que le train démarre légèrement après le passage au vert)