Main Page   Class Hierarchy   Compound List   File List   Compound Members   File Members  

/home/gilberto/prog/tesi2.31/TelepatiUdp/TelepatiUdp.h

Go to the documentation of this file.
00001 
00002 /*
00003 TelepatiUdp ver 1.5
00004 
00005 Copyright (C) 2005 Gilberto Decaro
00006 email: msgid@email.it
00007 
00008 This program is free software; you can redistribute it and/or
00009 modify it under the terms of the GNU General Public License
00010 as published by the Free Software Foundation; either version 2
00011 of the License, or (at your option) any later version.
00012 
00013 This program is distributed in the hope that it will be useful,
00014 but WITHOUT ANY WARRANTY; without even the implied warranty of
00015 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00016 GNU General Public License for more details.
00017 
00018 You should have received a copy of the GNU General Public License
00019 along with this program; if not, write to the Free Software
00020 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
00021 */
00022 
00023 #ifndef TelepatiUdp_h_DEFINED
00024 #define TelepatiUdp_h_DEFINED
00025 
00026 #include <OPENR/OObject.h>
00027 #include <OPENR/OSubject.h>
00028 #include <OPENR/OObserver.h>
00029 
00030 /*Strutture delle connessioni UDP usate da Telepati*/
00031 #include "UDPConnection.h" 
00032 /*Header dello stack tcp/ip*/
00033 #include <ant.h>  
00034 /*Tipi di Endpoint*/
00035 #include <EndpointTypes.h>  
00036 /*package usati da Telepati i TelepatiPkges*/
00037 #include <Packages.h>
00038 
00039 //***
00040 #include <fstream>
00041 
00042 #include <vector> 
00043 #include <queue>
00044 #include "def.h"
00045 
00046 /*Header della classe che si occupa della stampa delle statistiche di rete*/
00047 #include "EtherStat.h"
00048 
00049 /*Header fuzzy*/
00050 #include <FlFVar.h>
00051 #include <FlFRule.h> 
00052 #include <FlFuzzyLib.h>
00053 #include <FlString.h>
00054 #include <FlFRuleBase.h>
00055 #include <FlFSetTrapez.h>    
00056 
00059 #define TLPT_BEG_COLOR "\e[32m"
00060 
00062 #define TLPT_END_COLOR "\e[0m"
00063 
00067 #define TLPT_NAME TLPT_BEG_COLOR"TelepatiUdp"TLPT_END_COLOR
00068 
00069 using namespace std; 
00074 const char* const AIBONET="/MS/OPEN-R/MW/CONF/AIBONET.CFG";  
00075 
00090 class TelepatiUdp : public OObject {
00091  public:
00092     
00094   TelepatiUdp();
00096   virtual ~TelepatiUdp();
00097   
00098   OSubject*    subject[numOfSubject]; 
00099   OObserver*   observer[numOfObserver]; 
00103   virtual OStatus DoInit   (const OSystemEvent& event); 
00106   virtual OStatus DoStart  (const OSystemEvent& event); 
00108   virtual OStatus DoStop   (const OSystemEvent& event); 
00111   virtual OStatus DoDestroy(const OSystemEvent& event); 
00112 
00119   void SendCont(ANTENVMSG msg);  
00125   void ReceiveCont(ANTENVMSG msg);  
00130   void TimerEnd(void* msg);
00131 
00132 
00139   void BoneTimerEnd(void* msg);  
00145   void EtherStat(void* msg);  
00146   
00151   void SendNotify(const ONotifyEvent& event); 
00154   void ObserverReady(const OReadyEvent& event); 
00155   
00157   static const Port TELEPATI_PORT= 3030;  
00159   static const unsigned int TELEPATI_BUFFER_SIZE= 65535; 
00163   static const int TELEPATI_MAX_MESSAGE_TO_OBSERVER = 20; 
00165   static const longword TELEPATI_ACK_TIME= 200;
00169   static const longword TELEPATI_BONE_TIME= 8; 
00176   static const int TELEPATI_MAX_RESENDING = 20;
00177 
00179   enum {
00182     DATA_CONNECTION=0, 
00185     CTRL_CONNECTION=1  
00186   }; 
00187 
00188  private:
00189 
00190   /*--- Variabili per le statistiche di comunicazione ---*/
00191   unsigned int sendMessage;          /*numero di messaggi spediti*/         
00192   unsigned int sendByte;             /*byte spediti*/
00193   unsigned int totalRecvMessage;     /*numero di messaggi totali ricevuti*/ 
00194   unsigned int dataRecvMessage;      /*numero di messaggi di dati ricevuti*/
00195   unsigned int dataRecvByte;         /*byte di dati ricevuti*/
00196   unsigned int numOfResending;       /*numero di rispedizioni di package*/
00197   unsigned int numOfAckSended;       /*numero di Ack spediti*/
00198   int sendSpeed;                     /* velcita' di spedizione in byte/s*/
00199   /* memorizza il momento in cui e' iniziata la spedizione del pkg
00200     sulla connesione DATA*/
00201   SystemTime* startSendTime;       
00202   
00203 
00204   /*Enumeratori Fuzzy*/
00205   enum{PICCOLA, PICCOLO, MEDIA, MEDIO, GRANDE, MOLTO_GRANDE}; 
00206   /* Variabile Fuzzy di input, dimensione del pacchetti (PICCOLA,
00207      MEDIO, GRANDE, MOLTO_GRANDE)*/
00208   FlFVar* dimension; 
00209   /* Variabile Fuzzy di output, intervallo di tempo da attendere prima
00210      di rispedire il pacchetto (PICCOLO, MEDIO, GRANDE,
00211      MOLTO_GRANDE)*/
00212   FlFVar* interval; 
00213   /* Modello Fuzzy del timerend. Il modello, basato sulle due
00214      variabili dimension e interval, viene usato per calcolare il
00215      tempo di attesa che intercorre tra la spedizione di un messaggio
00216      che richiede un Ack e la sua rispedizione nel caso non venga
00217      ricevuto l'Ack.*/
00218   FlFRuleBase* model;
00219 
00220   /* Riferimento allo stack IP (richiesto da OPENR)*/
00221   antStackRef ipstackRef;       
00222   /* Connessione di ricezione*/
00223   UDPRecvConnection recvConnection; 
00224   /* Array di connessioni di spedizione (CTRL e DATA connection). @see
00225      enum*/
00226   UDPSendConnection* sendConnection;
00227 
00228   /* Vettore di indirizzi IP degli AIBO*/
00229   vector<IPAddress> aiboIp;  
00230   /* Stato di attivita' degli aibo presenti. Array di aiboState, in
00231      link con aiboIp.*/
00232   aiboState* aiboIpActive;          
00233   /* Numero di aibo presenti nel campo meno 1 (escluso colui su cui
00234      gira Telepati)*/
00235   int numaibo;    
00236 
00237   /* Array dei seriali deli Ack attesi da ogni Aibo.*/
00238   unsigned short* expectedSerial;                    
00239   /* Numero di rispedizioni dello stesso messaggio da parte di
00240      TimerEnd*/
00241   int resending;
00242   /* Coda di TelepatiPkg. Memorizza i messaggi in attesa di essere
00243      spediti attraverso la connessione DATA*/
00244   queue<TelepatiPkg*> sendQueue;  
00245   /* Coda dei messaggi di controllo in attesa di essere spediti dalla
00246      connessione CTRL..*/
00247   queue<TelepatiPkg*> sendCtrlQueue; 
00248   /* Coda dei messaggi in attesa di essere spediti all'observer.*/
00249   queue<TelepatiPkg*> interObjectQueue;
00250   /* Puntatore che memorizza il messaggio in attesa di un Ack. */
00251   TelepatiPkg* ackWaitingMsg;        
00252   
00253   /* Numero di volte che dev'essere invocata la funzione TimerEnd
00254      prima di rispedire il TelepatiPkg in ackWaitingMsg.*/
00255   int numOfTimerEnd;
00256   /* Contatore del numero di volte che viene invocata la funzione
00257      TimeEnd, il timer ciclico di rilevamento dell'Ack. A causa di una
00258      gestine non efficiente dei timer in OPENR non e' possibile far
00259      partire un nuovo timer per ogni messaggio di conseguenza e'
00260      neessario questo contatore per poter eseguire cicli di attesa di
00261      lunghezza temporale variabile in funzione della dimensione del
00262      pacchetto.*/
00263   int timerEndCont;
00264   
00265   /* Buffer per il parsing dei file*/
00266   static const size_t LINEBUFFERSIZE= 256;   
00267   
00268   /* Parser del file di configurazione. Imposta numaibo, aiboIp,
00269      aiboIpActive e expectedSerial. Fa il parsing del file AIBONET.*/
00270   OStatus parseIpConfigFile();   
00271   /* Inizializza le connessioni di ricezione e di spedizione.*/
00272   OStatus initConnections();     
00273 
00274   /*Spedisce il messaggio attraverso la connessione Ctrl. Imposta
00275     IPStack mandandogli i dati da spedire, non appena il buffer di
00276     spedizione di IPStack sara' riempito verra' invocata
00277     SendCont(). In caso la connessione sia in spedizione accoda il
00278     messaggio nella coda sendCtrlQueu. @param msg messaggio da
00279     spedire*/
00280   void sendViaCtrl(TelepatiPkg* msg); 
00281   /*Spedisce il messaggio attraverso la connessione Data. Imposta
00282     IPStack mandandogli i dati da spedire, non appena il buffer di
00283     spedizione di IPStack sara' riempito verra' invocata
00284     SendCont(). In caso la connessione sia in spedizione accoda il
00285     messaggio nella coda sendQueu. @param msg messaggio da spedire*/
00286   void sendViaData(TelepatiPkg* msg); 
00287   /* Controlla la presenza di messaggi di dati in attesa di essere
00288      spediti e, se presenti, li spedisce attraverso ls connessione
00289      DATA.*/
00290   void checkQueue();             
00291   /* Controlla la presenza di messaggi di controllo in attesa di
00292      essere spediti e, se presenti, li spedisce attraverso la
00293      connessione CTRL.*/
00294   void checkCtrlQueue();  
00295   /* Avvia la ricezione. Imposta IPStack in modo da restare in ascolto
00296      sulla rete, non appena verra' ricevuto un pacchetto verra'
00297      invocata la funzione ReceiveCont().*/
00298   void receive();               
00299   
00300   /* Manda il package agli observer se pronti a riceverlo, altrimenti
00301      lo acconda. @param pkg package da mandare.*/
00302   void sendToObserver(TelepatiPkg* pkg);
00303   /* Manda un HiMsg (msg di saluto) all'i-esimo Aibo. @param i aibo a
00304      cui mandare l'hy message.*/
00305   inline void sendHiMsg(int i){
00306     OSYSDEBUG(("Telepati::sendHiMsg(%d)\n",i));
00307     sendViaCtrl(new HiPkg(i));
00308 #ifdef TELEPATI_POLLING
00309     aiboIpActive[i]= (aiboIpActive[i] == ACTIVE ? WAITINGREPLY : aiboIpActive[i]);
00310 #endif
00311   };
00312 
00313   /* Manda un HiReplyMsg (msg di risposta al saluto) all'i-esimo
00314      Aibo. @param i aibo a cui mandare l'HiReply message*/
00315   inline void sendHiReplyMsg(int i){
00316     OSYSDEBUG(("Telepati::sendHiReplyMsg(%d)\n",i));
00317     sendViaCtrl(new HiReplyPkg(i));
00318   };
00319   /* Manda un ByeMsg (msg di arrivederci) all'i-esimo Aibo,
00320      l'esecuzione di Telepati rimane bloccata fino a completa
00321      spedizione del package. @param i aibo a cui mandare il byte
00322      message*/
00323   void sendByeMsg(int i);
00324   /* Manda un CounterPkg agli observer di Telepati*/
00325   void sendCounterMsg();
00326   /* Manda un AiboInfoMsg agli observer di Telepati*/
00327   void sendAiboInfoMsg();  
00328 
00329   /* Converte l'IP passato come parametro nell'indice da usare
00330      nell'array aiboIp. @param ip indirizzo IP dell'Aibo di cui si
00331      vuole conoscere l'indice*/
00332   int aiboFromIp(const IPAddress& ip) const; 
00333          
00334   /* Recupera l'indirizzo IP dell'Aibo stesso*/
00335   IPAddress* retrieveMyIp();     
00336   /* Imposta l'array aiboIpActive degli stati degli Aibo per i-esimo
00337      Aibo in base al valore passato e se cambia lo stato ne informa
00338      l'observer. @param aibo aibo di cui modificare lo stato di
00339      attivita'. @param newVal nuovo stato di attivitą. @return true:
00340      se ha cambiato stato; false: altrimenti.*/
00341   bool setAiboIpActive(int aibo, aiboState newVal); 
00342   /*Cancella il messaggio in attesa di Ack puntato da
00343     ackWaitingMessage. @param serial seriale del messaggio da
00344     cancellare. @param aibo aibo di destinazione */
00345   void eraseFromAckWaitingMsg(unsigned short serial, int aibo);  
00346   /* Calcola la velocita' di spedizione del package. Se richiede un
00347      Ack il tempo di spedizione e' calcolato dal momento in cui il
00348      package viene spedito al momento in cui viene ricevuto il
00349      relativo Ack.*/
00350   void computeSpeed();
00351   /* Effettua alcune impostazioni iniziali per il calcolo della
00352      velocita'. Fa partire il conteggio del tempo di spedizione e
00353      salva la dimensione dei dati spediti.*/
00354   void preComputeSpeed(size_t dataDimension);
00355   /* Imposta alcuni valori necessari al timer periodico di
00356      rispedizione del messaggio. In base alla dimensione del pacchetto
00357      spedito calcola il valore fuzzy del tempo di attesa da attendere
00358      prima di rispedirlo nel caso non venga ricevuto un Ack.*/
00359   void setTimerEndValue(size_t dataDimension);
00360   /* Inizializza il sistema fuzzy per il calcolo della durata del
00361      tempo di attesa del timer per la rispedizione del pacchetto in
00362      caso non venga ricevuto l'Ack*/
00363   void initFuzzySystem();
00364 
00365   //***
00366   ofstream* debugFile;
00367   
00368 };
00369 #endif  //TelepatiUdp_h_DEFINED

Generated on Tue Mar 1 16:20:22 2005 for TelepatiUdp by doxygen1.2.14 written by Dimitri van Heesch, © 1997-2002