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

Generated on Wed Nov 17 15:49:18 2004 for Telepati by  doxygen 1.3.9.1