#ifndef COMMANDPKG_H_DEF
#define COMMANDPKG_H_DEF

#include "TelepatiPkg.h"
#include "time.h"

using namespace std;
/**@file*/

/**Tipi di comandi spediti. Identifica il tipo di comando, se per la
   testa o le zampe.*/
enum typeOfCommand {
  LEGS, /**< Comando per le zampe*/
  HEAD /**< Comando per la testa*/
};

/**Implementa il messaggio di comando.@n
   Permette di spedire ad un Aibo un comando di movimento, movimento sia per le zampe sia per la testa.@n
   Struttura: oltre all'header standard e' composto da:@n
   commandType [1byte]= tipo di comando: 1 se per le zampe, 0 se per la testa.@n
   command [8byte]=stringa contenente il comando.@n
   when [4byte]=quando eseguire il comando, in tempo assoluto.@n
*/
class CommandPkg : public TelepatiPkg{
 public:
  /** Costruttore ordinario. @param a aibo di destinazione. @param command
      comando da spedire. @param when quando eseguire il
      comando. @param cmdType tipo di comando (zampe o testa) @see typeOfCommand. @param ack se richiede o meno l'ack*/
  CommandPkg(int a, const char command[8], time_t when, typeOfCommand cmdType, bool ack);
  /**Costruisce l'oggetto a partire dall'array restituito da
     getMsg(). @param ptr puntatore all'array di byte. @see
     getMsg()*/
  CommandPkg(byte* ptr);

  /** Distruttore di Default.*/
  virtual ~CommandPkg();

  /** Clonatore. Restituisce un clone dell'oggetto su cui e'
      chiamato.*/
  virtual TelepatiPkg* clone();

  /** Ritorna un array che rappresenta l'oggetto. Costruisce un array
      che rappresenta l'oggetto, l'array corrisponde ai dati spediti
      via rete. @return array di byte. @see CommandPkg(byte* ptr)*/
  byte* getMsg();  
  
  /**Tipo di comando. Da informazioni sul tipo di comando spedito, se
     il comando è per le zampe o per la testa. @return tipo di
     comando. @see typeOfCommand*/
  inline typeOfCommand getTypeOfCommand() {return _cmdType;} ;
  /** Comando da eseguire. @return una stringa rappresentante il
      comando da eseguire e da mandare a. @return stringa raprresentante il comando da eseguire. */
  const char* getCommand() {return _command;}; 
  /**Quando eseguire il comando. Da informazioni su quando eseguire il
     comando. @return tempo assoluto in cui eseguire il comando.*/
  inline time_t whenExecuteCommand() {return _when;};

 private:
  /* Comandi riconosciuti:
     --- Zampe ---
     WAKE_UP= Posizione di Riposo
     STANDUP= Alzati
     ELBOWLK= Camminata sui gomiti start
     STPEWLK= Camminata sui gomiti stop
     STRTWLK= Camminata in avanti start
     STOPWLK= Camminata in avanti stop
     TRNRGHT= Gira a destra
     STP_T_R= Stop gira a destra
     TRNLEFT= Gira a sinistra
     STP_T_L= Stop gira a sinistra
     SITDOWN= Siediti... a cuccia
     LAYDOWN= Mettiti in posizione di riposo dopo un SITDOWN

     --- Testa ---
     MOVE_FP= Muove la testa nella posizione avanti
     MOVE_MP= Muove la testa nella posizine centrale
     MOVE_BP= Muove la testa nella posizione dietro
     MV_RGHT= muove la testa a dx
     STOP_MR= alt moviemnto dx
     MV_LEFT= muove la testa a sx
     STOP_ML= stop movimento sx
     MV_FWRD= muove la testa in avanti
     STOP_MF= stop movimento avanti
     MV_BACK= muove la testa in dietro
     STOP_MB= stop movimento in dietro
     MOVE_UP= muovi in altro
     STOP_MU= stop movimento in alto
     MV_DOWN= muovi in basso
     STOP_MD= stop movimento in basso*/

  /* Tipo di comando. LEGS se per le zampe, HEAD se per la testa*/
  typeOfCommand _cmdType;
  
  /* Comando da spedire*/
  char _command[8];

  /* Quando eseguire il comando. Tempo assoluto*/
  time_t _when;

};

#endif
