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
1.2.14 written by Dimitri van Heesch,
© 1997-2002