#ifndef STUFF_H_DEFINED
#define STUFF_H_DEFINED
#include "../Motion/MotionInterface.h"
#include <OPENR/ODataFormats.h>
#include <OPENR/OFbkImage.h>

/** Classe astratta per l'implementazione di "oggetti" da
    indentificare utilizzati da Ocipital.*/
class Stuff{
 public:
  /** Tipi di oggetti.*/
  enum stuffType{
    UNDEF,  /**< Non definito*/
    BALL, /**< La AiboBall*/
    GOAL, /**< La porta del campo da calcio*/
  };
  
 public:
  /** Costruttore di default.*/
  Stuff() : _type(UNDEF), _state(IDLE) {};
  /** Distruttore di default.*/
  virtual ~Stuff() {};

  /** Effettua alcune operazioni di inizializzazione dell'oggetto,
      come l'impostazione della CDT table della telecamera. @param
      fbkID id della telecamera.*/
  virtual void init(OPrimitiveID& fbkID) =0;
  /** Cerca l'oggetto. Ricerca l'oggetto nel campo visivo e
      restituisce un MotionCommand da mandare a Motion per spostare la
      testa nella posizione in cui si trova l'oggetto.*/
  virtual Motion::MotionCommand search(OFbkImageVectorData& imageVec, double pan, double tilt2, double tilt, OCdtChannel channel, int threshold, int ForceScanNear) =0;
  /** Controlla se l'oggetto e' stato trovato e puntato. @return true
      se trovato, false altrimenti.*/
  virtual bool isTracked() =0;
  /** Calcola la distanza dell'oggetto dall'Aibo basandosi
      esclusivamente sulle informazioni visive. @return distanza
      stimata in mm; -1 se non trovato.*/
  virtual double getVisualDistance(OFbkImageVectorData& imageVec, OCdtChannel channel) = 0;

  /** Restituisce il tipo di oggetto.*/
  inline stuffType getType() { return _type; };
 protected:
  /* Tipo di oggetto.*/
  stuffType _type;

  /** Stati dell'oggetto di ricerca di Stuff.*/
  enum
    {
      IDLE,
      SEARCHING, /**< Sto cercando l'oggetto.*/
      TRACKING, /**< L'oggetto e' stato trovato, lo sto puntando.*/
      TRACKED /**< Oggetto trovato e puntato.*/
    } _state;

};

#endif
