#ifndef RECOGNITIONMODULE_H
#define RECOGNITIONMODULE_H

#include "../opencvext.h"
#include <iostream>
#include <list>

using namespace std;

namespace seemicro
{

// see controller.h
extern int DEBUGLEVEL;

/**
  * Grundlage aller Erkennungsmodule.
  * Enthält im Wesentlichen das Interface
  * aus processFrame() / processKeyFrame(),
  * das es ermöglicht, viele Module in einer
  * Kette anzureihen.
  * TODO: Messung der Modullaufzeiten
  */
class RecognitionModule
{
public:
  /**
    * Wird von außen auf true gesetzt, wenn Parameter
    * dieses Moduls geändert wurden und führt
    * beim nächsten Aufruf von process(Key)Frame()
    * zu einer Neuberechnung der Ausgabe dieses Moduls.
    */
  bool paramChanged;

  /**
    * Wird von diesem Modul auf true gesetzt, wenn
    * sich die Ausgabe dieses Moduls geändert hat.
    * nachfolgende Module können so sehen, ob sie
    * ihrerseits neue Berechnungen anstellen müssen.
    */
  bool outputChanged;

  RecognitionModule()
  {
    paramChanged = false;
    outputChanged = true;
  }

  /**
    * Destructor is empty, but since it is virtual,
    * allows correct destruction of objects of eventually derived
    * classes, because their correct destructor will be called
    */
  virtual ~RecognitionModule() { };

  /**
    * Verarbeite ein Bild, das keinen Keyframe darstellt
    */
  virtual void processFrame(myrect *ROI)
  {
    paramChanged = false;
  };

  virtual void processKeyFrame(void)
  {
#ifdef DEBUG
    if(DEBUGLEVEL>=3) cerr << "RecognitionModule::processKeyFrame()\n";
#endif
    paramChanged = false;
  };

  void registerMe(std::list<RecognitionModule*>& l)
  {
#ifdef DEBUG
    if(DEBUGLEVEL>=2) cerr << "Registering this...";
#endif
    l.push_back(this);
  }

  void unregisterMe(std::list<RecognitionModule*>& l)
  {
#ifdef DEBUG
    if(DEBUGLEVEL>=2) cerr << "Unregistering this...";
#endif
    l.remove(this);
  }

};

}

#endif // RECOGNITIONMODULE_H

