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