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