./0000755000076400003600000000000010642436704007722 5ustar sironens./Readme0000644000076400003600000000351510642436547011053 0ustar sironensFédéré de test interactif Il s'agit d'une fédération très simple composée de plusieurs instances du même fédéré, permettant à l'aide d'un menu élémentaire de tester pas à pas des services de HLA. Chaque fédéré doit être lancé avec en paramètre un nom distinctif : Federe_Interactif xxx La phase d'initialisation comporte la création de la fédération (à ne faire que dans un fédéré) et la jonction de chaque fédéré à cette fédération. La synchronisation dans cette phase est manuelle et n'a donc pas besoin de faire usage des services de HLA. Au cours ce cette même phase, l'utilisation d'une classe d'interaction est mise en place. Dans le fichier fed, il sera possible de jouer avec un éditeur de texte entre les options TIMESTAMP et RECEIVE pour provoquer par la suite la livraison des interactions dans un mode FIFO ou TSO (Time Stamp Ordered). Le menu ensuite permet d'entrelacer des appels à : - timeAdvanceRequest (une estampille à donner), - nextEventRequest (une estampille à donner), - sendInteraction ( une estampille à donner), - et tick (indique si un callback a été reçu, i. e. receiveInteraction ou timeAdvanceGrant, ou rien). Ceci permet de contrôler l'avancée du temps coordonnée des différents fédérés (le lookakead est fixé à 1 au début du code) et de contrôler la livraison coordonnée ou non des interactions. Ce fédéré met également en évidence le problème de performances qui peut survenir avec une méthode d'avancée au prochain événement et un lookahead faible. Par exemple, si deux fédérés à l'instant initial (0) demandent nextEventRequest de 5, il devront effectuer chacun 4 ticks (correspondant à l'envoi d'autant de messages NULL) pour que le temps progresse. Il est également possible de modifier ce fédéré pour inclure l'appel d'autres services à tester. ./Makefile0000644000076400003600000000032510640456743011365 0ustar sironensCERTI_HOME = /home/ens/siron/certi/CERTI-3.2.4 all : gcc -o Federe_Interactif Federe_Interactif.cpp \ -L$(CERTI_HOME)/lib -lRTI -lCERTI -lxml2 -DRTI_USES_STD_FSTREAM -DWITH_CERTI\ -I$(CERTI_HOME)/include ./Federe_Interactif.cpp0000644000076400003600000001567510642433716014006 0ustar sironens#include #include #include #include RTIfedTime* temps = new RTIfedTime(0.0); RTIfedTime* lookahead = new RTIfedTime(1.0); class Federe_Interactif : public RTI::RTIambassador, public NullFederateAmbassador { public: Federe_Interactif() {} virtual ~Federe_Interactif() throw (RTI::FederateInternalError) {} private: void timeAdvanceGrant (const RTI::FedTime& theTime) throw ( RTI::InvalidFederationTime, RTI::TimeAdvanceWasNotInProgress, RTI::FederateInternalError) { *(temps) = theTime; std::cout << std::endl << "t=" << ((RTIfedTime&)theTime).getTime() << " : <----- timeAdvanceGrant(" << ((RTIfedTime&)theTime).getTime() << ")"<< std::endl << std::endl; } void receiveInteraction ( RTI::InteractionClassHandle theInteraction, // supplied C1 const RTI::ParameterHandleValuePairSet& theParameters, // supplied C4 const RTI::FedTime& theTime, // supplied C4 const char *theTag, // supplied C4 RTI::EventRetractionHandle theHandle) // supplied C1 throw ( RTI::InteractionClassNotKnown, RTI::InteractionParameterNotKnown, RTI::InvalidFederationTime, RTI::FederateInternalError) { std::cout << std::endl << "t=" << ((RTIfedTime&)theTime).getTime() << " : <----- receiveInteraction(" << ((RTIfedTime&)theTime).getTime() << ")" << std::endl; } void receiveInteraction ( RTI::InteractionClassHandle theInteraction, // supplied C1 const RTI::ParameterHandleValuePairSet& theParameters, // supplied C4 const char *theTag) // supplied C4 throw ( RTI::InteractionClassNotKnown, RTI::InteractionParameterNotKnown, RTI::FederateInternalError) { std::cout << std::endl << " <----- receiveInteraction" << std::endl; } }; //VARIABLE Federe_Interactif* myFedere_Interactif = new Federe_Interactif(); int main(int argc, char **argv) { int i; float d; char c, entree; if (argc!=2) { std::cout <<"Vous devez donner en parametre le nom du federe" << std::endl; exit(1); } while(1) { std::cout <<"Voulez-vous creer la federation ? [y/n]" << std::endl; scanf("%c", &c); scanf("%c", &entree); if (c=='y' || c=='n') break; std::cout <<"Vous devez entrer 'y' ou 'n'" << std::endl; } //CREER if (c=='y') { myFedere_Interactif->createFederationExecution("Federation_Interactive","Federation_Interactive.fed"); std::cout << "federation creee" << std::endl; } //REJOINDRE myFedere_Interactif->joinFederationExecution(argv[1], "Federation_Interactive", myFedere_Interactif); std::cout << "federation rejointe" << std::endl; //PUBLIER myFedere_Interactif->publishInteractionClass(myFedere_Interactif->getInteractionClassHandle("msg")); std::cout << "interaction publiee" << std::endl; //SOUSCRIRE myFedere_Interactif->subscribeInteractionClass(myFedere_Interactif->getInteractionClassHandle("msg"), RTI::RTI_TRUE); std::cout << "interaction souscrite" << std::endl; //DECLARER REGULATEUR ET CONTRAIN #ifdef WITH_CERTI myFedere_Interactif->queryFederateTime(*temps); myFedere_Interactif->enableTimeRegulation(*temps, *lookahead); myFedere_Interactif->enableTimeConstrained(); myFedere_Interactif->modifyLookahead(*(new RTIfedTime(1.0))); #else bool timeRegulation = false; while (!timeRegulation) { try { myFedere_Interactif->enableTimeRegulation(*temps,*lookahead); } catch (RTI::EnableTimeRegulationPending&) { myFedere_Interactif->tick(0.1, 0.2); } catch (RTI::TimeRegulationAlreadyEnabled&) { timeRegulation = true; } } bool timeConstrained = false; while (!timeConstrained) { try { myFedere_Interactif->enableTimeConstrained(); } catch (RTI::EnableTimeConstrainedPending&) { myFedere_Interactif->tick(0.1, 0.2); } catch (RTI::TimeConstrainedAlreadyEnabled&) { timeConstrained = true; } } #endif std::cout << "federe regulateur et contraint" << std::endl; //SYNCHRONISER std::cout << std::endl << "Synchro manuel, tapez ENTREE continuer"; getchar(); std::cout << "federation synchronisee" << std::endl << std::endl; while(1) { while(1) { std::cout << std::endl <<"Choisissez une action : " << std::endl; std::cout <<" 1 : timeAdvanceRequest()" << std::endl; std::cout <<" 2 : nextEventRequest()" << std::endl; std::cout <<" 3 : sendInteraction()" << std::endl; std::cout <<" 5 : tick()" << std::endl; std::cout <<" 8 : Quitter la federation" << std::endl; if (c=='y') std::cout <<" 9 : Detruire la federation" << std::endl; scanf("%i", &i); scanf("%c", &entree); if (i==1 || i==2 || i==3 || i==5 || i==8) break; if (c=='y') { if (i==9) break; } if (c=='n') std::cout <<"Vous devez entrer 1, 2, 3, 5 ou 8" << std::endl << std::endl; if (c=='y') std::cout <<"Vous devez entrer 1, 2, 3, 5, 8 ou 9" << std::endl << std::endl; } //TIME_ADVANCE_REQUEST if (i==1) { std::cout << std::endl << "t=" << temps->getTime() << " : Donner la date a laquelle vous souhaitez avancer : "; scanf("%f", &d); scanf("%c", &entree); myFedere_Interactif->timeAdvanceRequest(*(new RTIfedTime(d))); std::cout << std::endl << "t=" << temps->getTime() << " : -----> timeAdvanceRequest(" << d << ")" << std::endl; } //NEXT_EVENT_REQUEST else if (i==2) { std::cout << std::endl << "t=" << temps->getTime() << " : Donner la date a laquelle vous souhaitez avancer : "; scanf("%f", &d); scanf("%c", &entree); myFedere_Interactif->nextEventRequest(*(new RTIfedTime(d))); std::cout << std::endl << "t=" << temps->getTime() << " : -----> nextEventRequest(" << d << ")" << std::endl; } //SEND_INTERACTION else if (i==3) { std::cout << std::endl << "t=" << temps->getTime() << " : Donner la valeur de l'estampille voulue : "; scanf("%f", &d); scanf("%c", &entree); myFedere_Interactif->sendInteraction(myFedere_Interactif->getInteractionClassHandle("msg"), *(RTI::ParameterSetFactory::create(0)), *(new RTIfedTime(d)), "msg"); std::cout << std::endl << "t=" << temps->getTime() << " : -----> sendInteraction(getInteractionClassHandle(-, -, " << d << ", -)" << std::endl; } //TICK else if (i==5) { myFedere_Interactif->tick(0.1, 0.2); std::cout << std::endl << "t=" << temps->getTime() << " : -----> tick" << std::endl; } //QUITTER else if (i==8) { myFedere_Interactif->resignFederationExecution(RTI::DELETE_OBJECTS_AND_RELEASE_ATTRIBUTES); std::cout << std::endl << "federation quittee" << std::endl; if (c=='n') break; } //DETRUIRE else if (i==9) { myFedere_Interactif->destroyFederationExecution("Federation_Interactive"); std::cout << std::endl << "federation detruite" << std::endl; break; } } exit(0); } ./Federation_Interactive.fed0000644000076400003600000000040610634522564015020 0ustar sironens;; Federation_Interactive (Fed (Federation Federation_Interactive) (FedVersion v1.3) (Spaces ) (Objects (Class ObjectRoot (Attribute privilegeToDelete reliable timestamp) ) ) (Interactions (Class msg RELIABLE RECEIVE ) ) )