FSMExample.cpp
Go to the documentation of this file.
00001 //============================================================================
00002 // Name        : DMExample.cpp
00003 // Author      : 
00004 // Version     :
00005 // Copyright   : Your copyright notice
00006 // Description : Hello World in C++, Ansi-style
00007 //============================================================================
00008 
00009 #include <iostream>
00010 
00011 
00012 #include "SynchCout.h"
00013 #include "EventSystem.h"
00014 #include "FSM.h"
00015 using namespace decision_making;
00016 
00017 EventQueue mainEventQueue;
00018 
00019 
00020 void callTask(std::string task_address, const CallContext& call_ctx, EventQueue& queue){
00021         cout<<" TASK("<<task_address<<":CALL) ";
00022         while(true)
00023         {
00024                 Event e = queue.waitEvent();
00025                 if(not e){
00026                         cout<<" TASK("<<task_address<<":TERMINATED) ";
00027                         return;
00028                 }
00029                 if( e=="/SUCCESS" or e=="/FAIL" or e=="/GO" ){
00030                         Event new_event ( Event(""+e.event_name(), call_ctx) );
00031                         cout<<" TASK("<<task_address<<":"<<new_event<<") ";
00032                         queue.riseEvent(new_event);
00033                 }
00034         }
00035 }
00036 
00037 #define CALL_REMOTE(NAME, CALLS, EVENTS) boost::bind(&callTask, #NAME, CALLS, EVENTS)
00038 
00039 
00040 #define X(...) __VA_ARGS__
00041 
00042 FSM(TEST1){
00043         enum STATS{
00044                 C,
00045                 D,
00046                 S
00047         }
00048         FSM_START(C);
00049         FSM_BGN{
00050                 FSM_STATE( C ){
00051                         FSM_CALL_TASK(C);
00052                         FSM_TRANSITIONS{
00053                                 FSM_ON_EVENT(C/SUCCESS, FSM_NEXT(D));
00054                                 FSM_ON_EVENT(C/FAIL, FSM_NEXT(D));
00055                         }
00056                 }
00057                 FSM_STATE( D ){
00058                         FSM_CALL_TASK(D);
00059                         FSM_TRANSITIONS{
00060 //                              FAM_NEXT(D/SUCCESS, FSM_NEXT(D));
00061 //                              FAM_NEXT(D/FAIL, FSM_NEXT(D));
00062                         }
00063                 }
00064                 FSM_STATE( S ){
00065                         FSM_STOP(SUCCESS, TaskResult::SUCCESS());
00066                         FSM_TRANSITIONS{}
00067                 }
00068         }
00069         FSM_END
00070 }
00071 //X(
00072 FSM(TEST){
00073         enum STATS{
00074                 A,
00075                 B,
00076                 STOP
00077         }
00078         FSM_START(A);
00079         FSM_BGN{
00080                 FSM_STATE( A ){
00081                         FSM_CALL_TASK(TA);
00082                         FSM_CALL_TASK(TB);
00083                         FSM_RISE(GO_TO_STOP)
00084                         FSM_TRANSITIONS{
00085                                 FSM_PRINT_EVENT;
00086                                 FSM_ON_EVENT(TA/GO, FSM_NEXT(B));
00087                                 FSM_ON_EVENT(/A/SUCCESS, FSM_NEXT(B));
00088                                 //FSM_ON_EVENT(/A/FAIL, FSM_NEXT(B));
00089                                 //FSM_ON_EVENT(GO_TO_STOP, FSM_NEXT(STOP));
00090                         }
00091                 }
00092                 FSM_STATE( B ){
00093                         FSM_CALL_FSM(TEST1);
00094                         FSM_TRANSITIONS{
00095                                 FSM_PRINT_EVENT;
00096                                 FSM_ON_EVENT(TEST1/D/SUCCESS, FSM_NEXT(A));
00097                                 //FSM_ON_EVENT(FAIL, FSM_NEXT(B));
00098                         }
00099                 }
00100                 FSM_STATE( STOP ){
00101 
00102                         FSM_TRANSITIONS
00103                 }
00104         }
00105         FSM_END
00106 }
00107 
00108 void FSM_TEST(){
00109         FsmTEST(NULL,&mainEventQueue);
00110 }
00111 
00112 void FSM_EVENTS_GENERATOR(){
00113         Event spec[]={"SUCCESS", "FAIL", "SUCCESS", "FAIL", "SUCCESS", "FAIL", "SUCCESS", "FAIL", "GO", "NOTHING"};
00114         int i=0;
00115         while(true){
00116                 Event t = spec[i];
00117                 if(t == "NOTHING"){ i=1; t=spec[0]; }else i++;
00118                 cout << endl << t<<" -> ";
00119                 mainEventQueue.riseEvent(t);
00120                 boost::this_thread::sleep(boost::posix_time::seconds(1));
00121         }
00122 }
00123 
00124 
00125 int main() {
00126 
00127 boost::thread_group threads;
00128 threads.add_thread(new boost::thread(boost::bind(&FSM_TEST)));
00129 threads.add_thread(new boost::thread(boost::bind(&FSM_EVENTS_GENERATOR)));
00130 
00131 threads.join_all();
00132 }
00133 
00134 
00135 
00136 
00137 
00138 
00139 //-------------------------------------------------------------
00140 
00141 
00142 
00143 //FSM(Turnstile)
00144 //{
00145 //      enum STATES
00146 //      {
00147 //              Locked,
00148 //              Unlocked
00149 //      }
00150 //      FSM_START(Locked);
00151 //      FSM_BGN
00152 //      {
00153 //              FSM_STATE(Locked)
00154 //              {
00155 //                      FSM_TRANSITIONS
00156 //                      {
00157 //                              FSM_ON_EVENT(COIN, FSM_NEXT(Unlocked));
00158 //                      }
00159 //              }
00160 //              FSM_STATE(Unlocked)
00161 //              {
00162 //                      FSM_TRANSITIONS
00163 //                      {
00164 //                              FSM_ON_EVENT(PUSH, FSM_NEXT(Locked));
00165 //                      }
00166 //              }
00167 //      }
00168 //      FSM_END
00169 //}
00170 //
00171 //bool leftBumper, rightBumper, wallSensor;
00172 //FSM(Roomba)
00173 //{
00174 //      enum STATES
00175 //      {
00176 //              findWall,
00177 //              turnSx,
00178 //              correctSx,
00179 //              correctDx
00180 //      }
00181 //      FSM_START(findWall);
00182 //      FSM_BGN
00183 //      {
00184 //              FSM_STATE(findWall)
00185 //              {
00186 //                      FSM_TRANSITIONS
00187 //                      {
00188 //                              FSM_ON_CONDITION( leftBumper==1||rightBumper==1 , FSM_NEXT(turnSx));
00189 //                      }
00190 //              }
00191 //              FSM_STATE(turnSx)
00192 //              {
00193 //
00194 //                      FSM_TRANSITIONS
00195 //                      {
00196 //                              FSM_ON_CONDITION( leftBumper==0&&rightBumper==0 , FSM_NEXT(correctDx));
00197 //                      }
00198 //              }
00199 //              FSM_STATE(correctSx)
00200 //              {
00201 //
00202 //                      FSM_TRANSITIONS
00203 //                      {
00204 //                              FSM_ON_CONDITION( leftBumper==1||rightBumper==1 , FSM_NEXT(turnSx));
00205 //                              FSM_ON_CONDITION( wallSensor==0 , FSM_NEXT(correctDx));
00206 //                      }
00207 //              }
00208 //              FSM_STATE(correctDx)
00209 //              {
00210 //
00211 //                      FSM_TRANSITIONS
00212 //                      {
00213 //                              FSM_ON_CONDITION( leftBumper==1||rightBumper==1 , FSM_NEXT(turnSx));
00214 //                              FSM_ON_CONDITION( wallSensor==1 , FSM_NEXT(correctSx));
00215 //                      }
00216 //              }
00217 //      }
00218 //      FSM_END
00219 //}
00221 //
00222 //FSM(Superstate)
00223 //{
00224 //      enum STATES
00225 //      {
00226 //              Start, Process
00227 //      }
00228 //      FSM_START(Start);
00229 //      FSM_BGN
00230 //      {
00231 //              FSM_STATE(Start)
00232 //              {
00233 //                      FSM_TRANSITIONS
00234 //                      {
00235 //                              FSM_ON_EVENT(/begin, FSM_NEXT(Process));
00236 //                              FSM_ON_EVENT(/end, FSM_RISE(Start/end));
00237 //                              FSM_ON_EVENT(/data, FSM_RISE(Start/data));
00238 //                      }
00239 //              }
00240 //              FSM_STATE(Process)
00241 //              {
00242 //                      FSM_TRANSITIONS
00243 //                      {
00244 //                              FSM_ON_EVENT(/data, FSM_NEXT(Process));
00245 //                              FSM_ON_EVENT(/end, FSM_RISE(Process/end));
00246 //                              FSM_ON_EVENT(/data, FSM_RISE(Process/data));
00247 //                      }
00248 //              }
00249 //      }
00250 //      FSM_END
00251 //}
00252 //
00253 //FSM(ScxmlExampleHierarchy)
00254 //{
00255 //      enum STATES
00256 //      {
00257 //              Success, Error, Superstate
00258 //      }
00259 //      FSM_START(Superstate);
00260 //      FSM_BGN
00261 //      {
00262 //              FSM_STATE(Success)
00263 //              {
00264 //                      FSM_TRANSITIONS
00265 //              }
00266 //              FSM_STATE(Error)
00267 //              {
00268 //                      FSM_TRANSITIONS
00269 //              }
00270 //              FSM_STATE(Superstate)
00271 //              {
00272 //                      FSM_CALL_FSM(Superstate);
00273 //                      FSM_TRANSITIONS
00274 //                      {
00275 //                              FSM_ON_EVENT(/error, FSM_NEXT(Error));
00276 //                              FSM_ON_EVENT(Superstate/error, FSM_NEXT(Error));
00277 //                              FSM_ON_EVENT(Superstate/Start/end, FSM_NEXT(Error));
00278 //                              FSM_ON_EVENT(Superstate/Start/data, FSM_NEXT(Error));
00279 //                              FSM_ON_EVENT(Superstate/Process/begin, FSM_NEXT(Error));
00280 //                              FSM_ON_EVENT(Superstate/Process/end, FSM_NEXT(Success));
00281 //                      }
00282 //              }
00283 //
00284 //      }
00285 //      FSM_END
00286 //}
00288 //FSM(A)
00289 //{
00290 //      enum STATES
00291 //      {
00292 //              a0, a1
00293 //      }
00294 //      FSM_START(a0);
00295 //      FSM_BGN
00296 //      {
00297 //              FSM_STATE(a0)
00298 //              {
00299 //                      FSM_TRANSITIONS
00300 //                      {
00301 //                              FSM_ON_EVENT(/a, FSM_NEXT(a1));
00302 //                              FSM_ON_EVENT(/d, FSM_RISE(a1/d));
00303 //                      }
00304 //              }
00305 //              FSM_STATE(a1)
00306 //              {
00307 //                      FSM_TRANSITIONS
00308 //                      {
00309 //                              FSM_ON_EVENT(/a, FSM_RISE(a1/a));
00310 //                              FSM_ON_EVENT(/d, FSM_RISE(d));
00311 //                      }
00312 //              }
00313 //      }
00314 //      FSM_END
00315 //}
00316 //FSM(B)
00317 //{
00318 //      enum STATES
00319 //      {
00320 //              b0, b1
00321 //      }
00322 //      FSM_START(b0);
00323 //      FSM_BGN
00324 //      {
00325 //              FSM_STATE(b0)
00326 //              {
00327 //                      FSM_TRANSITIONS
00328 //                      {
00329 //                              FSM_ON_EVENT(/b, FSM_NEXT(b1));
00330 //                              FSM_ON_EVENT(/d, FSM_RISE(b1/d));
00331 //                      }
00332 //              }
00333 //              FSM_STATE(b1)
00334 //              {
00335 //                      FSM_TRANSITIONS
00336 //                      {
00337 //                              FSM_ON_EVENT(/b, FSM_RISE(b1/b));
00338 //                              FSM_ON_EVENT(/d, FSM_RISE(d));
00339 //                      }
00340 //              }
00341 //      }
00342 //      FSM_END
00343 //}
00344 //FSM(C)
00345 //{
00346 //      enum STATES
00347 //      {
00348 //              c0, c1
00349 //      }
00350 //      FSM_START(c0);
00351 //      FSM_BGN
00352 //      {
00353 //              FSM_STATE(c0)
00354 //              {
00355 //                      FSM_TRANSITIONS
00356 //                      {
00357 //                              FSM_ON_EVENT(/c, FSM_NEXT(c1));
00358 //                              FSM_ON_EVENT(/d, FSM_RISE(c1/d));
00359 //                      }
00360 //              }
00361 //              FSM_STATE(c1)
00362 //              {
00363 //                      FSM_TRANSITIONS
00364 //                      {
00365 //                              FSM_ON_EVENT(/c, FSM_RISE(c1/c));
00366 //                              FSM_ON_EVENT(/d, FSM_RISE(d));
00367 //                      }
00368 //              }
00369 //      }
00370 //      FSM_END
00371 //}
00372 //
00373 //FSM(ScxmlExampleParallel)
00374 //{
00375 //      enum STATES
00376 //      {
00377 //              Success, Error, Parallel
00378 //      }
00379 //      FSM_START(Parallel);
00380 //      FSM_BGN
00381 //      {
00382 //              FSM_STATE(Success)
00383 //              {
00384 //                      FSM_TRANSITIONS
00385 //              }
00386 //              FSM_STATE(Error)
00387 //              {
00388 //                      FSM_TRANSITIONS
00389 //              }
00390 //              FSM_STATE(Parallel)
00391 //              {
00392 //                      int finished_counter=0;
00393 //                      FSM_CALL_FSM(A);
00394 //                      FSM_CALL_FSM(B);
00395 //                      FSM_CALL_FSM(C);
00396 //                      FSM_TRANSITIONS
00397 //                      {
00398 //                              FSM_ON_EVENT(A/a0/d, FSM_NEXT(Error));
00399 //                              FSM_ON_EVENT(B/b0/d, FSM_NEXT(Error));
00400 //                              FSM_ON_EVENT(C/c0/d, FSM_NEXT(Error));
00401 //                              FSM_ON_EVENT(A/a1/a, FSM_NEXT(Error));
00402 //                              FSM_ON_EVENT(B/b1/b, FSM_NEXT(Error));
00403 //                              FSM_ON_EVENT(C/c1/c, FSM_NEXT(Error));
00404 //                              FSM_ON_EVENT(A/d, finished_counter++ );
00405 //                              FSM_ON_EVENT(B/d, finished_counter++ );
00406 //                              FSM_ON_EVENT(C/d, finished_counter++ );
00407 //                              FSM_ON_CONDITION( finished_counter==3 , FSM_RISE(d));
00408 //                              FSM_ON_EVENT( d , FSM_NEXT(Success));
00409 //                              //FSM_ON_CONDITION( finished_counter==3 , FSM_NEXT(Success));
00410 //                      }
00411 //              }
00412 //      }
00413 //      FSM_END
00414 //}
00415 
00416 
00417 
00418 
00419 
00420 
00421 
00422 


decision_making
Author(s):
autogenerated on Wed Aug 26 2015 11:16:53