|
50 | 50 |
|
51 | 51 | /* --------------------------------- Notes --------------------------------- */ |
52 | 52 | /* ----------------------------- Include files ----------------------------- */ |
| 53 | +#include "rkhdef.h" |
| 54 | +#include "rkhevt.h" |
53 | 55 | #include "rkhitl.h" |
54 | 56 | #include "rkhsm.h" |
55 | 57 | #include "rkhassert.h" |
@@ -392,7 +394,8 @@ rkh_sm_dispatch(RKH_SM_T *me, RKH_EVT_T *pe) |
392 | 394 | RKHROM RKH_ST_T *cs, *ts; |
393 | 395 | RKHROM void *ets; |
394 | 396 | RKHROM RKH_TR_T *tr; |
395 | | - rbool_t isIntTrn, isCompletionEvent, isMicroStep, isCreationEvent; |
| 397 | + rbool_t isIntTrn, isCompletionEvent, isMicroStep, isCreationEvent, |
| 398 | + isPropagatedEvent; |
396 | 399 | RKH_SIG_T in; |
397 | 400 | #if RKH_CFG_TRC_EN == RKH_ENABLED |
398 | 401 | rui8_t step; |
@@ -423,7 +426,7 @@ rkh_sm_dispatch(RKH_SM_T *me, RKH_EVT_T *pe) |
423 | 426 | RKH_SR_ALLOC(); |
424 | 427 |
|
425 | 428 | RKH_ASSERT(me && pe); |
426 | | - isCompletionEvent = isIntTrn = isMicroStep = RKH_FALSE; |
| 429 | + isCompletionEvent = isIntTrn = isMicroStep = isPropagatedEvent = RKH_FALSE; |
427 | 430 | isCreationEvent = (pe->e == RKH_SM_CREATION_EVENT); |
428 | 431 |
|
429 | 432 | if (isCreationEvent == RKH_FALSE) |
@@ -461,6 +464,15 @@ rkh_sm_dispatch(RKH_SM_T *me, RKH_EVT_T *pe) |
461 | 464 | pe = (RKH_EVT_T *)&evCompletion; |
462 | 465 | isCompletionEvent = RKH_FALSE; |
463 | 466 | } |
| 467 | + else if (isPropagatedEvent) |
| 468 | + { |
| 469 | + pe = me->propagatedEvent; |
| 470 | + me->propagatedEvent = RKH_EVT_CAST(0); |
| 471 | + isPropagatedEvent = RKH_FALSE; |
| 472 | + } |
| 473 | + else |
| 474 | + { |
| 475 | + } |
464 | 476 |
|
465 | 477 | if (isCreationEvent == RKH_FALSE) |
466 | 478 | { |
@@ -753,7 +765,9 @@ rkh_sm_dispatch(RKH_SM_T *me, RKH_EVT_T *pe) |
753 | 765 |
|
754 | 766 | RKH_TR_SM_EVT_PROC(me); |
755 | 767 | isCreationEvent = RKH_FALSE; |
756 | | - } while (isCompletionEvent); |
| 768 | + isPropagatedEvent = |
| 769 | + (me->propagatedEvent != (RKH_EVT_T*)0) ? RKH_TRUE : RKH_FALSE; |
| 770 | + } while (isCompletionEvent || isPropagatedEvent); |
757 | 771 |
|
758 | 772 | INFO_EXEC_TRS(me); |
759 | 773 | return RKH_EVT_PROC; |
@@ -800,4 +814,11 @@ rkh_sm_else(void) |
800 | 814 | } |
801 | 815 | #endif |
802 | 816 |
|
| 817 | +void |
| 818 | +rkh_sm_propagate(RKH_SM_T* me, RKH_EVT_T* e) |
| 819 | +{ |
| 820 | + RKH_REQUIRE((me != (RKH_SM_T*)0) && (e != (RKH_EVT_T*)0)); |
| 821 | + me->propagatedEvent = e; |
| 822 | +} |
| 823 | + |
803 | 824 | /* ------------------------------ End of file ------------------------------ */ |
0 commit comments