Main Page | 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 #ifdef OPENR_ETHERSTAT  // se e' attivata la stampa delle statistiche di rete
00018 #include <ERA201D1.h>
00019 #endif
00020 
00021 using namespace std; 
00023 const char* const AIBONET="/MS/OPEN-R/MW/CONF/AIBONET.CFG";  
00027 class Telepati : public OObject {
00028  public:
00029     
00031   Telepati();
00033   virtual ~Telepati();
00034   
00035   OSubject*    subject[numOfSubject]; 
00036   OObserver*   observer[numOfObserver];
00039   virtual OStatus DoInit   (const OSystemEvent& event); 
00041   virtual OStatus DoStart  (const OSystemEvent& event); 
00043   virtual OStatus DoStop   (const OSystemEvent& event); 
00045   virtual OStatus DoDestroy(const OSystemEvent& event); 
00046   
00047   
00048   void SendCont(ANTENVMSG msg);  
00050   void ReceiveCont(ANTENVMSG msg);  
00051   void TimerEnd(void* msg);  
00052   void BoneTimerEnd(void* msg);  
00053   void EtherStat(void* msg);  
00055   void SendNotify(const ONotifyEvent& event);  
00057   static const Port TELEPATI_PORT= 3030;  
00058   static const int TELEPATI_BUFFER_SIZE= 512;  
00059   static const longword TELEPATI_ACK_TIME= 1200; 
00060   static const longword TELEPATI_BONE_TIME= 5; 
00062  private:
00063 #ifdef OPENR_DEBUG
00064   unsigned int sendMessage;
00065   unsigned int recvMessage;
00066 #endif
00067 #ifdef OPENR_ETHERSTAT
00068   void PrintWLANStatistics(const EtherDriverGetWLANStatisticsMsg& msg);
00069   void PrintWLANSettings(const EtherDriverGetWLANSettingsMsg& msg);
00070   void PrintEtherStatistics(const EtherDriverGetStatisticsMsg& msg);
00071 #endif
00072   vector<IPAddress> aiboIp;         /* Vettore di indirizzi IP degli AIBO*/
00073   UDPRecvConnection recvConnection; /* Endpoint per la ricezione*/
00074   UDPSendConnection sendConnection; /* Endpoint per la spedizione*/
00075   aiboState* aiboIpActive;          /* Stato di attivita' degli aibo presenti. Array, in link con aiboIp, di aiboState*/
00076   unsigned short* expectedSerial;    /* Array dei seriali attesi da ogni Aibo*/
00077   int numaibo;                      /* Numero di aibo presenti nel campo meno 1 (escluso colui su cui gira Telepati)*/
00078   queue<TelepatiPkg*> sendQueue;    /* Coda di TelepatiPkg. Si occupa della memorizazione dei messaggi in attesa di essere spediti*/
00079   vector<TelepatiPkg*> ackWaitingMsg; /* Vettore che memorizza i messaggi in attesa di un Ack  */
00080   
00081   antStackRef    ipstackRef;      /* Riferimento allo stack IP (richiesto da OPENR)*/
00082   
00083   static const size_t LINEBUFFERSIZE= 256;   /* Buffer per il parsing dei file*/
00084   
00085   struct ackIdentify{
00086     unsigned short serial;
00087     int aibo;
00088   };
00089 
00090   OStatus parseIpConfigFile();   /* Parser del file di configurazione. Imposta numaibo, aiboIp, aiboIpActive. Fa il parsing del file AIBONET*/
00091   OStatus initConnections();     /* Inizializza le connessioni*/
00092   OStatus initRecvBuffer();      /* Inizializza il buffer di ricezione*/
00093   OStatus initRecvUdpEndpoint(); /* Inizializza l'Endpoint UDP per la ricezione*/
00094   OStatus initRecvBind();        /* Fa il Bind dell'Endpoint di ricezione */
00095 
00096   OStatus initSendBuffer();      /* Inizializza il buffer di spedizione*/
00097   OStatus initSendUdpEndpoint(); /* Inizializza l'Endpoint UDP per la spedizione*/
00098   OStatus initSendBind();        /* Fa il Bind dell'Endpoint di spedizione*/
00099   
00100   void send(TelepatiPkg* msg);   /* Spedisce il messaggio. @param msg messaggio da spedire*/
00101   void receive();                /* Avvia la ricezione*/
00102   
00103   /* Manda un HyMsg (msg di saluto) all'i-esimo Aibo. @param i aibo a cui mandare l'hy message*/
00104   inline void sendHyMsg(int i){
00105     OSYSDEBUG(("Telepati::sendHyMsg(%d)\n",i));
00106     send(new HyPkg(i));
00107 #ifdef TELEPATI_POLLING
00108     aiboIpActive[i]= (aiboIpActive[i] == ACTIVE ? WAITINGREPLY : aiboIpActive[i]);
00109 #endif
00110   };
00111 
00112   /* Manda un HyReplyMsg (msg di risposta al saluto) all'i-esimo Aibo. @param i aibo a cui mandare l'HyReply message*/
00113   inline void sendHyReplyMsg(int i){
00114     OSYSDEBUG(("Telepati::sendHyReplyMsg(%d)\n",i));
00115     send(new HyReplyPkg(i));
00116   };
00117   /* Manda un ByeMsg (msg di arrivederci) all'i-esimo Aibo. @param i aibo a cui mandare il byte message*/
00118   inline void sendByeMsg(int i){
00119     OSYSDEBUG(("Telepati::sendByeMsg(%d)\n",i));
00120     send(new ByePkg(i));
00121   };
00122 
00123   void sendAiboInfoMsg();        /* Manda un AiboInfoMsg all'observer di Telepati*/
00124   
00125   int aiboFromIp(const IPAddress& ip) const; /* Converte l'IP passato come parametro nell'indice da usare nell'array aiboIp*/
00126   void checkQueue();             /* Controlla la presenza di messaggi in attesa di essere spediti e, se presenti, li spedisce.*/
00127   IPAddress* retrieveMyIp();     /* Recupera l'indirizzo IP dell'Aibo stesso*/
00128   bool setAiboIpActive(int aibo, aiboState newVal);  /* Imposta l'array aiboIpActive per i-esimo Aibo in base al valore passato. @param aibo aibo di cui modificare lo stato di attivita'. @param newVal nuovo stato di attivitą. @return true: se ha cambiato stato; false: altrimenti.*/
00129   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 */
00130 };
00131 
00132 #endif  //Telepati_h_DEFINED

Generated on Tue Nov 9 17:57:34 2004 for Telepati by  doxygen 1.3.9.1