tp_1_tgenerator.cpp

Go to the documentation of this file.
00001 /** @file tp_1_tgenerator.cpp  
00002 
00003 Tutorial, class faudes::TimedGenerator. This tutorial demonstrates
00004 basic maintenance of TimedGenerator objects
00005 
00006 @ingroup Tutorials 
00007 
00008 @include tp_1_tgenerator.cpp
00009 
00010 */
00011 
00012 #include "libfaudes.h"
00013 #include "tp_include.h"
00014 
00015 
00016 // make the faudes namespace available to our program
00017 using namespace faudes;
00018 
00019 
00020 
00021 /////////////////
00022 // main program
00023 /////////////////
00024 
00025 int main() {
00026 
00027   ////////////////////////////////////////////////////
00028   // constructor and file io
00029   // EventSets
00030   ////////////////////////////////////////////////////
00031 
00032   // Create an empty TimedGenerator object
00033   TimedGenerator g1;
00034 
00035   // Create a TimedGenerator by reading a TimedGenerator file
00036   TimedGenerator g2("data/tsimplemachine.gen");
00037  
00038   // Create a TimedGenerator by reading a Generator file (no timing, no control)
00039   TimedGenerator g3("data/simplemachine.gen");
00040 
00041   // Read a TimedGenerator from a System file (no timing)
00042   g1.Read("data/csimplemachine.gen");
00043 
00044   // Copy a Generator to a TimedGenerator (no timing, no control)
00045   TimedGenerator g4;
00046   Generator g5("data/simplemachine.gen");
00047   g4.Assign(g5);
00048 
00049   // Write the TimedGenerator to a files 
00050   g1.Write("tmp_tsimplemachine1.gen");
00051   g2.Write("tmp_tsimplemachine2.gen");
00052   g3.Write("tmp_tsimplemachine3.gen");
00053   g4.Write("tmp_tsimplemachine4.gen");
00054 
00055   // See result on console
00056   std::cout << "######################################\n";
00057   std::cout << "# tc simple machine (\n";
00058   g2.DWrite();
00059   std::cout << "######################################\n";
00060 
00061   // Test protocol
00062   FAUDES_TEST_DUMP("construct g1",g1);
00063   FAUDES_TEST_DUMP("construct g2",g2);
00064   FAUDES_TEST_DUMP("construct g3",g3);
00065   FAUDES_TEST_DUMP("construct g4",g4);
00066 
00067 
00068   ////////////////////////////////////////////////////
00069   // access to controllability status of events
00070   //
00071   // (using System methods)
00072   ////////////////////////////////////////////////////
00073 
00074   // Retrieve an EventSet containing all the controllabe events 
00075 
00076   EventSet cevents = g2.ControllableEvents();
00077 
00078   // See result on console
00079   std::cout << "######################################\n";
00080   std::cout << "# controllabel events\n";
00081   cevents.DWrite();
00082   std::cout << "######################################\n";
00083 
00084   // Test protocol
00085   FAUDES_TEST_DUMP("contr attrib",cevents);
00086 
00087 
00088   ////////////////////////////////////////////////////
00089   //   access/edit timing 
00090   ////////////////////////////////////////////////////
00091   
00092   // Insert a clock to tcsimplemachine
00093   g2.InsClock("cRepair");
00094 
00095   // Read clocks from tcsimplemachine and set them for csimplemachine 
00096   ClockSet clocks = g2.Clocks();
00097  
00098   // Report
00099   std::cout << "######################################\n";
00100   std::cout << "# tcsimple machine clocks \n";
00101   clocks.DWrite();
00102   std::cout << "######################################\n";
00103 
00104 
00105   // Add constraints to invariant 
00106   TimeConstraint inv;
00107   inv.Insert("cRepair",ElemConstraint::LessEqual,20);
00108   g2.InsInvariant("down", inv);
00109 
00110   // Add constraints to guard and a reset
00111   TransSet::Iterator tit;
00112   tit=g2.FindTransition("down","lambda","idle");
00113   if(tit==g2.TransRelEnd()) {}; // not found
00114   TimeConstraint guard;
00115   guard.Insert("cRepair",ElemConstraint::GreaterEqual,10);
00116   g2.InsGuard(*tit, guard);
00117   tit=g2.FindTransition("busy","mue","down");
00118   if(tit==g2.TransRelEnd()) {}; // not found
00119   ClockSet resets;
00120   resets.Insert("cRepair");
00121   g2.InsResets(*tit, resets);
00122 
00123   // Fix name
00124   g2.Name("tc simple machine with timed repair");
00125 
00126   // Report
00127   std::cout << "######################################\n";
00128   std::cout << "# tcsimple machine with timed repair \n";
00129   g2.DWrite();
00130   g2.ActiveClocks().DWrite();
00131   std::cout << "######################################\n";
00132 
00133   // Copy to g1 and remove a clock
00134   g1=g2;
00135   g1.DelClock("cBusy");
00136 
00137   // Report
00138   std::cout << "######################################\n";
00139   std::cout << "# tcsimple machine with untimed busy \n";
00140   g1.DWrite();
00141   g1.ActiveClocks().DWrite();
00142   std::cout << "######################################\n";
00143 
00144 
00145   // Test protocol
00146   FAUDES_TEST_DUMP("edit timing 1",g1);
00147   FAUDES_TEST_DUMP("edit timing 2",g2);
00148 
00149 
00150   // Read clocks from tcsimplemachine and set them for csimplemachine 
00151   std::cout << "######################################\n";
00152   std::cout << "# csimple machine (active clocks) \n";
00153   g3.InsClocks(g2.ActiveClocks());
00154   std::cout << g3.Clocks().ToString() << "\n";
00155 
00156   // Read invriants from tcsimplemachine and set them for csimplemachine 
00157   std::cout << "######################################\n";
00158   std::cout << "# csimple machine (invariants) \n";
00159   StateSet::Iterator sit;
00160   for(sit=g2.StatesBegin(); sit!=g2.StatesEnd(); sit++) {
00161     TimeConstraint invariant = g2.Invariant(*sit);
00162     std::string state = g2.StateName(*sit);
00163     std::cout << state << " inv " << invariant.ToString() << "\n";
00164     g3.Invariant(state, invariant);
00165   }
00166 
00167   // Read guards and resets from tcsimplemachine and set them for csimplemachine 
00168   std::cout << "######################################\n";
00169   std::cout << "# csimple machine (guards and resets) \n";
00170   TransSet::Iterator stit, dtit;
00171   for(stit=g2.TransRelBegin(); stit!= g2.TransRelEnd(); stit++) {
00172     std::cout << "src transition: " << g2.TStr(*stit) << "\n";
00173     std::cout << "guard:  " << g2.Guard(*stit).ToString() << "\n";
00174     std::cout << "resets: " << g2.Resets(*stit).ToString() << "\n";
00175     dtit=g3.FindTransition(g2.StateName(stit->X1),g2.EventName(stit->Ev),g2.StateName(stit->X2));
00176     g3.Guard(*dtit,g2.Guard(*stit));
00177     g3.Resets(*dtit,g2.Resets(*stit));
00178   }
00179 
00180   // Report
00181   std::cout << "######################################\n";
00182   std::cout << "# csimple machine with timing \n";
00183   g3.DWrite();
00184   std::cout << "######################################\n";
00185 
00186 
00187   // Check validiy (internal names and symboltables)
00188   if(g3.Valid())
00189     std::cout << "############# valid #################\n";
00190   
00191   // Test protocol
00192   FAUDES_TEST_DUMP("edit timing 3",g3);
00193 
00194   return 0;
00195 }
00196 
00197 
00198 

libFAUDES 2.23h --- 2014.04.03 --- c++ api documentaion by doxygen