Main Page | Class Hierarchy | Class List | File List | Class Members | File Members

# Telepati.h

    00001 #ifndef Telepati_h_DEFINED
    00002 #define Telepati_h_DEFINED
    00003
    00004 #include <OPENR/OObject.h>
    00005 #include <OPENR/OSubject.h>
    00006 #include <OPENR/OObserver.h>
    00007
    00008 #include "UDPConnection.h"  //Strutture delle connessioni usate da Telepati
    00009 #include <ant.h>  //stack tcp/ip
    00010 #include <EndpointTypes.h>  //tipi di Endpoint
    00011 #include "./Packages/Packages.h" //package usati da Telepati i TelepatiPkges
    00012
    00013 #include <vector>
    00014 #include <queue>
    00015 #include "def.h"
    00016
    00017 #include "EtherStat.h"
    00018
    00019 using namespace std;
    00021 const char* const AIBONET="/MS/OPEN-R/MW/CONF/AIBONET.CFG";
    00025 class Telepati : public OObject {
    00026  public:
    00027
    00029   Telepati();
    00031   virtual ~Telepati();
    00032
    00033   OSubject*    subject[numOfSubject];
    00034   OObserver*   observer[numOfObserver];
    00037   virtual OStatus DoInit   (const OSystemEvent& event);
    00039   virtual OStatus DoStart  (const OSystemEvent& event);
    00041   virtual OStatus DoStop   (const OSystemEvent& event);
    00043   virtual OStatus DoDestroy(const OSystemEvent& event);
    00044
    00046   void SendCont(ANTENVMSG msg);
    00048   void ReceiveCont(ANTENVMSG msg);
    00050   inline void TimerEnd(void* msg){
    00051     OSYSDEBUG(("#"));
    00052     if(ackWaitingMsg != 0) //se c'e' un messaggio in attesa di Ack
    00053       sendViaCtrl(ackWaitingMsg);
    00054     return;};
    00056   void BoneTimerEnd(void* msg);
    00058   void EtherStat(void* msg);
    00059
    00061   void SendNotify(const ONotifyEvent& event);
    00062
    00063   static const Port TELEPATI_PORT= 3030;
    00064   static const int TELEPATI_BUFFER_SIZE= 1024;
    00065   static const longword TELEPATI_ACK_TIME= 500;
    00066   static const longword TELEPATI_BONE_TIME= 8;
    00068   enum {
    00069     DATA_CONNECTION=0,
    00070     CTRL_CONNECTION=1
    00071   };
    00072
    00073  private:
    00074
    00075   unsigned int sendMessage;
    00076   unsigned int totalRecvMessage;
    00077   unsigned int dataRecvMessage;
    00078
    00079   vector<IPAddress> aiboIp;         /* Vettore di indirizzi IP degli AIBO*/
    00080   UDPRecvConnection recvConnection; /* Endpoint per la ricezione*/
    00081   UDPSendConnection* sendConnection; /* Array di Endpoint per la spedizione (ctrl Endpoint e Data Endpoint*/
    00082   aiboState* aiboIpActive;          /* Stato di attivita' degli aibo presenti. Array, in link con aiboIp, di aiboState*/
    00083   unsigned short* expectedSerial;   /* Array dei seriali attesi da ogni Aibo*/
    00084   int numaibo;                      /* Numero di aibo presenti nel campo meno 1 (escluso colui su cui gira Telepati)*/
    00085   queue<TelepatiPkg*> sendQueue;    /* Coda di TelepatiPkg. Si occupa della memorizazione dei messaggi in attesa di essere spediti*/
    00086   queue<TelepatiPkg*> sendCtrlQueue; /* Coda dei messaggi di controllo.*/
    00087   TelepatiPkg* ackWaitingMsg;      /* Puntatore che memorizza il messaggio in attesa di un Ack  */
    00088
    00089
    00090   antStackRef ipstackRef;           /* Riferimento allo stack IP (richiesto da OPENR)*/
    00091   EventID ackEvent;                 /*Evento: timer ciclico di controllo degli Ack ricevuti*/
    00092
    00093   static const size_t LINEBUFFERSIZE= 256;   /* Buffer per il parsing dei file*/
    00094
    00095   struct ackIdentify{
    00096     unsigned short serial;
    00097     int aibo;
    00098   };
    00099
    00100   OStatus parseIpConfigFile();   /* Parser del file di configurazione. Imposta numaibo, aiboIp, aiboIpActive. Fa il parsing del file AIBONET*/
    00101   OStatus initConnections();     /* Inizializza le connessioni*/
    00102   OStatus initRecvBuffer();      /* Inizializza il buffer di ricezione*/
    00103   OStatus initRecvUdpEndpoint(); /* Inizializza l'Endpoint UDP per la ricezione*/
    00104   OStatus initRecvBind();        /* Fa il Bind dell'Endpoint di ricezione */
    00105
    00106   OStatus initSendBuffer(int i);      /* Inizializza il buffer di spedizione*/
    00107   OStatus initSendUdpEndpoint(int i); /* Inizializza l'Endpoint UDP per la spedizione*/
    00108   OStatus initSendBind(int i);        /* Fa il Bind dell'Endpoint di spedizione*/
    00109
    00110   void send(TelepatiPkg* msg);   /* Spedisce il messaggio. @param msg messaggio da spedire*/
    00111   void sendViaCtrl(TelepatiPkg* msg); /*Spedisce il messaggio attraverso la connessione Ctrl. @param msg messaggio da spedire*/
    00112   void sendViaData(TelepatiPkg* msg); /*Spedisce il messaggio attraverso la connessione Data. @param msg messaggio da spedire*/
    00113   void receive();                /* Avvia la ricezione*/
    00114
    00115   /* Manda un HiMsg (msg di saluto) all'i-esimo Aibo. @param i aibo a cui mandare l'hy message*/
    00116   inline void sendHiMsg(int i){
    00117     OSYSDEBUG(("Telepati::sendHiMsg(%d)\n",i));
    00118     send(new HiPkg(i));
    00119 #ifdef TELEPATI_POLLING
    00120     aiboIpActive[i]= (aiboIpActive[i] == ACTIVE ? WAITINGREPLY : aiboIpActive[i]);
    00121 #endif
    00122   };
    00123
    00124   /* Manda un HiReplyMsg (msg di risposta al saluto) all'i-esimo Aibo. @param i aibo a cui mandare l'HiReply message*/
    00125   inline void sendHiReplyMsg(int i){
    00126     OSYSDEBUG(("Telepati::sendHiReplyMsg(%d)\n",i));
    00127     send(new HiReplyPkg(i));
    00128   };
    00129   /* Manda un ByeMsg (msg di arrivederci) all'i-esimo Aibo. @param i aibo a cui mandare il byte message*/
    00130   inline void sendByeMsg(int i){
    00131     OSYSDEBUG(("Telepati::sendByeMsg(%d)\n",i));
    00132     send(new ByePkg(i));
    00133   };
    00134
    00135   void sendAiboInfoMsg();        /* Manda un AiboInfoMsg all'observer di Telepati*/
    00136
    00137   int aiboFromIp(const IPAddress& ip) const; /* Converte l'IP passato come parametro nell'indice da usare nell'array aiboIp*/
    00138   void checkQueue();             /* Controlla la presenza di messaggi in attesa di essere spediti e, se presenti, li spedisce.*/
    00139   void checkCtrlQueue();          /* Controlla la presenza di messaggi di ACK in attesa di essere spediti e, se presenti, li spedisce.*/
    00140   IPAddress* retrieveMyIp();     /* Recupera l'indirizzo IP dell'Aibo stesso*/
    00141   bool setAiboIpActive(int aibo, aiboState newVal);  /* Imposta l'array aiboIpActive per i-esimo Aibo in base al valore passato e se cambia ne informa l'observer. @param aibo aibo di cui modificare lo stato di attivita'. @param newVal nuovo stato di attivitą. @return true: se ha cambiato stato; false: altrimenti.*/
    00142   void eraseFromAckWaitingMsg(unsigned short serial, int aibo);  /* Cancella un msg dal vettore ackWaitingMsg @param serial seriale del messaggio da cancellare @param aibo aibo di destinazione */
    00143 };
    00144
    00145 #endif  //Telepati_h_DEFINED