johnnyb / Eventually

A library for event-based programming to make Arduino programming more fun and intuitive
MIT License
190 stars 41 forks source link

BUG: EvtTimeListener endless fire #5

Open olivernadj opened 6 years ago

olivernadj commented 6 years ago

I would like to create a one time event, but it trigger endless fire. Code snipped:

#include "Eventually.h"

EvtManager mgr;

void setup() 
{
  Serial.begin(9600);
  mgr.addListener(new EvtTimeListener(1000, false, (EvtAction)sayHelloSerial));   
}

void loop() 
{
  mgr.loopIteration();
}

bool sayHelloSerial() {
  Serial.println("Hello Serial");
  return false;
}

Expected result (after 1s says):

Hello Serial

Actual result (immediately prints endless):

Hello Serial
Hello Serial
Hello Serial
...

I am using version 0.1.5

cwienands1 commented 3 years ago

But I think there is yet another problem with non-multiFire timer listeners: The startMillis will not be updated after successful execution of the action. A fraction of a millisecond later when isEventTiggered is called the next time, isEventTriggered will again return true because if(curTime - startMillis > this->millis) still evaluates the same way. I introduced a hasExecuted member in the EvtListener class that gets set when the associated action executes for the first time. Then check for that condition in isEventTriggered, like this...

bool EvtTimeListener::isEventTriggered() {
  if (!this->multiFire && this->hasExecuted) return false;
   ...