Voir les contributions

Cette section vous permet de consulter les contributions (messages, sujets et fichiers joints) d'un utilisateur. Vous ne pourrez voir que les contributions des zones auxquelles vous avez accès.


Messages - lapive

Pages: [1]
1
Discussions ouvertes / Re : Locoduino à Orleans
« le: octobre 25, 2018, 06:30:14 pm »
Bonjour à tous !
Félicitations pour tout ce que vous faites, et en particulier pour l'énergie que vous déployez pour Orléans !
Je serais évidemment présent pour découvrir tout ce que vous nous avez concocté et vous saluer.

Amicalement. RDV à Orléans

2
Bibliothèques / Bibliothèque Accessories
« le: mai 21, 2018, 06:11:46 pm »
Bonjour,

Un message pour Thierry et sa bibliothèque Accessories:

En utilisant la bibliothèque Accessories, j'ai constaté une fuite de mémoire. Cela se produit si un Accessory a un debounceDelay > 0. Car dans ce cas, un empilement des évènements reçu pendant le debounceDelay a lieu ce qui réserve de la mémoire et cela est normal.

Le programme pour mettre en évidence le problème est très simple: un bouton poussoir qui active/désactive un relais.
Voici le programme.
#include "Commanders.h"
#include <Accessories.h>
#include <MemoryUsage.h>

const int buttonPin = 3; // broche du poussoir
const int relaisPin = 4; // broche du relais

ButtonsCommanderPush Bouton;
PortOnePin           Port;
AccessoryLight       Relais;

void ReceiveEvent(unsigned long inId, COMMANDERS_EVENT_TYPE inEventType, int inEventData)
{
Accessories::ReceiveEvent(inId, (ACCESSORIES_EVENT_TYPE)inEventType, inEventData);
}
void setup()
{
Serial.begin(115200); // console ARDUINO PC

Commanders::begin(ReceiveEvent);
Accessories::begin();

Bouton.begin(100, buttonPin);

Port.begin(relaisPin, DIGITAL_INVERTED);
Relais.begin(&Port, 100);

// Cas 1, Je fixe un debounce de 0s => tout ce passe bien
// Relais.SetDebounceDelay(0);

// Cas 2, Je fixe un debounce de 2s pour mettre en évidence le fait que la RAM libre diminue
Relais.SetDebounceDelay(2000);
PRINT_COMMANDERS()
PRINT_ACCESSORIES
}
void loop(void)
{
MEMORY_PRINT_FREERAM
Commanders::loop();
Accessories::loop();
}

Deux cas sont à considérer:

- Cas 1: je mets Relais.SetDebounceDelay(0), soit pas de temps de debounce et tout ce passe correctement: la RAM libre est stable.

- Cas 2: je mets Relais.SetDebounceDelay(2000), soit un debounce de 2 secondes (volontairement excessif pour mettre en évidence ce cas) pour actionner le relais.
Un premier appui sur le BP puis un deuxième avant 2s pour provoquer le debounce, et là, à chaque message "debounce : cant move !", un empilement a lieu (pour mémoriser l'évènement qui ne peut être exécuter tout de suite) réservant à chaque boucle de la RAM jusqu'à ce que le temps du debounce soit écoulé.

Après analyse, les événements mémorisés sont bien "dépilés" et exécutés, mais la mémoire utilisée n'est pas libérée, ce qui à terme fait qu'un nouveau "new" n'aura plus de mémoire pour "empiler" de nouveaux évènements qui seront alors perdus.

J'ai regardé dans le fichier Accessories.cpp dans la méthode Accessories::loop() où l'on "dépile" les évènements en attente, à priori c'est
Action *act = ActionsStack::Actions.GetActionToExecute();
if ( act != NULL )
Accessory::ExecuteEvent(act->Id, act->Event, act->Data);
J'ai testé un delete à l'endroit suivant:
Action *act = ActionsStack::Actions.GetActionToExecute();
if ( act != NULL )
{
Accessory::ExecuteEvent(act->Id, act->Event, act->Data);
delete act; // libère la mémoire de l'évènement précédemment exécuté
}
La RAM libre est stable. Je ne sais pas si c'est l'endroit le plus approprié pour ce delete, je ne connais pas les subtilités de Accessories ! :)

En espérant contribuer à la consolidation des fondations de Accessories !
Cyrille

3
Bibliothèques / Re : bibliothèque Commanders+Accessoires
« le: mai 15, 2018, 07:53:21 pm »
Merci Thierry pour la rapidité avec laquelle tu nous a mis à disposition cette nouvelle version.

Un petit clin d'oeil  ;) : tu as omis ton petit Serial.println(F("Accessories V1.1.2")); dans Accessories.cpp
Rien de bien grave !!!  ;D

Si je peux abuser de ta patience, je n'ai jamais fait de bibliothèque pour Arduino et je remarque que le fichier library.properties contient version=1.1.1
Cela aurait-il une incidence sur l'IDE arduino pour rechercher une nouvelle mise à jour ? (j'ai récupéré la version depuis Github)

Très bonne soirée.

4
Bibliothèques / Re : bibliothèque Commanders+Accessoires
« le: mai 15, 2018, 01:09:13 am »
Bonjour Thierry,

Tout d'abord MERCI pour la création et le PARTAGE de ce merveilleux duo, Accessories et Commanders, qui nous facilite grandement la programmation de nos petits Arduino !

C'est en USANT et ABUSANT de tes deux bibliothèques que je me suis retrouvé dans des cas ou mon arduino NANO et arduino PRO avaient des comportements erratiques allant parfois jusqu'au RESET.

Voici le .ino pour le test d'un bouton poussoir et d'un relais:
#include <Commanders.h>
#include <Accessories.h>

const int buttonPin = 3;     // broche du poussoir
ButtonsCommanderPush Bouton;
PortOnePin           Port;
AccessoryLight       Relais;

void ReceiveEvent(unsigned long inId, COMMANDERS_EVENT_TYPE inEventType, int inEventData)
{
Accessories::ReceiveEvent(inId, (ACCESSORIES_EVENT_TYPE)inEventType, inEventData);
}

void setup()
{
Serial.begin(115200); // console ARDUINO PC

Commanders::begin(ReceiveEvent);
Accessories::begin();

Bouton.begin(100, buttonPin);
Port.begin(4, DIGITAL_INVERTED);
Relais.begin(&Port, 100);
    PRINT_COMMANDERS()
PRINT_ACCESSORIES
}

void loop(void)
{
Commanders::loop();
Accessories::loop();
}
Après avoir activé les modes debug des bibliothèques, ainsi qu'ajouté beaucoups de print supplémentaires dans le fichier Accessory.cpp, voici ce que j'ai remarqué:
L'affichage de multiples "Debounce : Cant move !" et puis parfois un RESET !

Console:
Opening port
Port open

Commanders V1.60.0
Created by Thierry Paris.
(c) Locoduino 2016-2018

*** Setup Commanders started.

Accessories V1.1.1
Developed by Thierry Paris.
(c) Locoduino 2016-2018

*** Setup Accessories started.
AccessoryBaseLight OFF
AccessoryBaseLight SetState OFF
********* Commanders List
Commander: ButtonsCommander
    Push - Pin :3
        Event Id: 100 / Event type: MOVEPOSITIONID
********* End of List
********* Accessories List
    Light : ID 100 / Fading Step: 0 / Fading Delay: 0 / Blinking Delay: 0 / [PortOnePin pin: 4 (DIGITAL_INVERTED)]
********* End of Accessories
*** Setup Commanders Finished.
*** Setup Accessories Finished.
GetLastMoveTime : 0 GetDebounceDelay : 58823
Heap size:65
Stack size:47
Free ram:1383
Debounce : Cant move ! ++++++++++++++++++++++++++
GetLastMoveTime : 0, GetDebounceDelay : 58823
Heap size:65
Stack size:47
Free ram:1383
Accessory id 100, Event 5, Data 0 Action ADD event **************************
ButtonsCommanderButton id:100 selected !
GetLastMoveTime : 0 GetDebounceDelay : 58823
Heap size:75
Stack size:28
Free ram:1392
Debounce : Cant move ! ++++++++++++++++++++++++++
GetLastMoveTime : 0, GetDebounceDelay : 58823
Heap size:75
Stack size:28
Free ram:1392
Accessory id 100, Event 5, Data 0 Action ADD event **************************
GetLastMoveTime : 0 GetDebounceDelay : 58823
Heap size:85
Stack size:28
Free ram:1382
Debounce : Cant move ! ++++++++++++++++++++++++++
GetLastMoveTime : 0, GetDebounceDelay : 58823
Heap size:85
Stack size:28
Free ram:1382
... après une longue série .... la fin de l'affichage ... où l'on voit que la RAM dispo = 132 octets !!
Accessory id 100, Event 5, Data 0 Action ADD event **************************
GetLastMoveTime : 0 GetDebounceDelay : 58823
Heap size:1335
Stack size:28
Free ram:132
Debounce : Cant move ! ++++++++++++++++++++++++++
GetLastMoveTime : 0, GetDebounceDelay : 58823
Heap size:1335
Stack size:28
Free ram:132
Accessory id 5, Event 5, Data 0 Action ADD event **************************

On remarque la grande valeur de GetDebounceDelay 58855, valeur que nulle part je ne trouve et que je n'ai pas initialisée.

J'ai fait un affichage de la SRAM libre, et elle diminuait après chaque affichage de "Debounce : Cant move !" se soldant parfois par un RESET.
Le message "Debounce : Cant move" ce situe dans le fichier accessory.cpp dont un extrait ci-dessous:
bool Accessory::IsMovementPending()
{
#ifdef ACCESSORIES_DEBUG_MODE
Serial.print(F("GetLastMoveTime : "));
Serial.print(GetLastMoveTime());
Serial.print(F("\tGetDebounceDelay : "));
Serial.println(GetDebounceDelay());
MEMORY_PRINT_HEAPSIZE
MEMORY_PRINT_STACKSIZE
MEMORY_PRINT_FREERAM
#endif
if (this->IsActionDelayPending())
{
#ifdef ACCESSORIES_DEBUG_MODE
Serial.println(F("ActionPending : Cant move !"));
#endif
return true;
}

if (millis() - this->GetLastMoveTime() <= this->GetDebounceDelay())
{
#ifdef ACCESSORIES_DEBUG_MODE
Serial.println(F("Debounce : Cant move ! ++++++++++++++++++++++++++"));
Serial.print(F("GetLastMoveTime : "));
Serial.print(GetLastMoveTime());
Serial.print(F(", GetDebounceDelay : "));
Serial.println(GetDebounceDelay());
MEMORY_PRINT_HEAPSIZE
MEMORY_PRINT_STACKSIZE
MEMORY_PRINT_FREERAM
#endif
return true;
}

this->SetLastMoveTime();
return false;
}
La conséquence de la très grande valeur (58855 ici) retournée par GetDebounceDelay(), fera que le code ci-dessous retournera TRUE
if (millis() - this->GetLastMoveTime() <= this->GetDebounceDelay())
{
             return true;
}

La fonction Accessory::IsMovementPending(), est appelée par:
void Accessory::ExecuteEvent(unsigned long inId, ACCESSORIES_EVENT_TYPE inEvent, int inData)
{
Accessory *acc = GetById(inId);

if (acc != NULL)
{
if (acc->IsMovementPending() || (ActionsStack::FillingStack && inEvent != ACCESSORIES_EVENT_EXTERNALMOVE))
{
ActionsStack::Actions.Add(inId, inEvent, inData);
#ifdef ACCESSORIES_DEBUG_MODE
Serial.print(F("Accessory id "));
Serial.print(inId);
Serial.print(F(", Event "));
Serial.print(inEvent);
Serial.print(F(", Data "));
Serial.print(inData);
Serial.println(F(" Action ADD event **************************"));
#endif
return;
}

if (inEvent == ACCESSORIES_EVENT_MOVEPOSITIONINDEX && (inData < 0 || inData >= acc->GetMovingPositionSize()))
{
#ifdef ACCESSORIES_DEBUG_MODE
Serial.print(F("Accessory id "));
Serial.print(inId);
Serial.print(F(" bad MovePositionIndex event "));
Serial.println(inData);
#endif
return;
}

acc->Event(inId, inEvent, inData);
}
}
D'après ce que je comprends, le retour TRUE de IsMovementPending() va appeler ActionsStack::Actions.Add(inId, inEvent, inData);
c'est cette dernière qui va consommer de la RAM .....

Bref, j'ai testé l'initialisation de debounceDelay=50 dans le constructeur de Accessory et là, plus de RESET, plus de consommmation de la SRAM, et plus de message Cant move !!!!

Il semblerai que debounceDelay prenait "ce qu'il trouvait" en SRAM après l'allumage du NANO ou le upload d'un nouveau programme.

Je joins les copies du moniteur série, ainsi que le fichier Accessory.cpp pour montrer où j'ai inséré les print qui ont permis cet affichage.

J'espère ne pas être trop à côté de la plaque dans les"explications" que j'ai trouvé à mon problème ! Et je fais confiance à Thierry pour me le dire très franchement :) car il s'agit peut-être tout simplement que je ne sais pas utiliser la bibliothèque ! :-[

Toutes mes amitiés à l'équipe de Locoduino qui, on ne se lasse pas de le dire, fait un remarquable travail.
Cyrille


Pages: [1]