matthewturner / Eventually

A library for event-based programming to make Arduino programming more fun and intuitive

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Adding a listener twice

hmueller01 opened this issue · comments

Is it really wanted that the same listener can be added twice?

EvtManager mgr(true);  // true to manage memory
EvtOnceListener readShtListener((EvtAction)[](IEvtListener *lst, IEvtContext *ctx) {
  readSht();
  return false;  // do not stop the current action chain, execute other events
});

      Serial.println("listenerCount = " + mgr.listenerCount());
      mgr.addListener(&readShtListener);
      Serial.println("listenerCount = " + mgr.listenerCount());
      mgr.addListener(&readShtListener);
      Serial.println("listenerCount = " + mgr.listenerCount());

outputs

listenerCount = 1
listenerCount = 2
listenerCount = 3

Just for information:

#ifndef EvtOnceListener_h
#define EvtOnceListener_h

#include "EvtListener.h"

class EvtOnceListener : public EvtListener {
 public:
  EvtOnceListener();
  EvtOnceListener(EvtAction triggerAction);
  ~EvtOnceListener();
  void reset();
  bool isEventTriggered();
  bool performTriggerAction(IEvtContext *);
};

EvtOnceListener::EvtOnceListener() {
  // Nothing to construct
}

EvtOnceListener::EvtOnceListener(EvtAction triggerAction) {
  _triggerAction = triggerAction;
}

EvtOnceListener::~EvtOnceListener() {
  // Nothing to destruct
}

void EvtOnceListener::reset() {
  // Nothing to setup
}

/**
 * @brief  Evaluate if action shall be triggered / executed (performTriggerAction())
 * @author Holger Mueller
 * @date   2024-02-20
 *
 * @return returns true if the event is triggered.
 */
bool EvtOnceListener::isEventTriggered() {
  return _enabled;
}

/**
 * @brief  Perform the triggered action and disable further triggers
 * @author Holger Mueller
 * @date   2024-02-21
 * 
 * @param  ctx EvtManager context
 * @return Return value of the action. 
 */
bool EvtOnceListener::performTriggerAction(IEvtContext *ctx) {
  Serial.println("EvtOnceListener::performTriggerAction execution started"); // TODO: delme
  bool returnVal = (*_triggerAction)(this, ctx);
  disable();
  Serial.println("EvtOnceListener::performTriggerAction execution ended"); // TODO: delme
  return returnVal;
}

#endif