Skip to content

Commit afccc8a

Browse files
committed
feat: Add event propagation
- Add function rkh_sm_propagate() to rkhsm module to propagate an event to self without using the AO's event queue. - Add unit test cases to module rkhsm.c to demonstrate how to build periodic non-reactive/reactive active object classes.
1 parent cbddba0 commit afccc8a

File tree

12 files changed

+477
-7
lines changed

12 files changed

+477
-7
lines changed

source/fwk/inc/rkhitl.h

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1718,7 +1718,8 @@ extern "C" {
17181718
#if RKH_CFG_SMA_SM_CONST_EN == RKH_ENABLED
17191719
#define MKSM(constSM, initialState) \
17201720
(RKHROM RKH_ROM_T *)(constSM), /** RKH_SM_T::romrkh member */ \
1721-
(RKHROM RKH_ST_T *)(initialState) /** RKH_SM_T::state member */
1721+
(RKHROM RKH_ST_T *)(initialState), /** RKH_SM_T::state member */ \
1722+
(RKH_EVT_T *)(0) /** RKH_SM_T::propagatedEvent member */
17221723

17231724
#if RKH_CFG_SMA_VFUNCT_EN == RKH_ENABLED
17241725
#define MKSMA(constSM, initialState) \
@@ -1739,27 +1740,27 @@ extern "C" {
17391740
initialEvt) \
17401741
(prio), (ppty), #name, (RKHROM RKH_ST_T*)initialState, \
17411742
((RKH_TRN_ACT_T)initialAction), (initialEvt), \
1742-
(RKHROM RKH_ST_T*)initialState
1743+
(RKHROM RKH_ST_T*)initialState, (RKH_EVT_T*)0
17431744
#else
17441745
#define MKSM(name, prio, ppty, initialState, initialAction, \
17451746
initialEvt) \
17461747
(prio), (ppty), (RKHROM RKH_ST_T*)initialState, \
17471748
((RKH_TRN_ACT_T)initialAction), (initialEvt), \
1748-
(RKHROM RKH_ST_T*)initialState
1749+
(RKHROM RKH_ST_T*)initialState, (RKH_EVT_T*)0
17491750
#endif
17501751
#else
17511752
#if R_TRC_AO_NAME_EN == RKH_ENABLED
17521753
#define MKSM(name, prio, ppty, initialState, initialAction, \
17531754
initialEvt) \
17541755
(prio), (ppty), #name, (RKHROM RKH_ST_T*)initialState, \
17551756
((RKH_TRN_ACT_T)initialAction), \
1756-
(RKHROM RKH_ST_T*)initialState
1757+
(RKHROM RKH_ST_T*)initialState, (RKH_EVT_T*)0
17571758
#else
17581759
#define MKSM(name, prio, ppty, initialState, initialAction, \
17591760
initialEvt) \
17601761
(prio), (ppty), (RKHROM RKH_ST_T*)initialState, \
17611762
((RKH_TRN_ACT_T)initialAction), \
1762-
(RKHROM RKH_ST_T*)initialState
1763+
(RKHROM RKH_ST_T*)initialState, (RKH_EVT_T*)0
17631764
#endif
17641765
#endif
17651766
#if RKH_CFG_SMA_VFUNCT_EN == RKH_ENABLED
@@ -1787,7 +1788,8 @@ extern "C" {
17871788
((RKH_SM_T *)(sm_))->istate = (RKHROM RKH_ST_T*)initialState_; \
17881789
((RKH_SM_T *)(sm_))->iaction = (RKH_TRN_ACT_T)initialAction_; \
17891790
MKSM_IEVENT(sm_, initialEvt_); \
1790-
((RKH_SM_T *)(sm_))->state = (RKHROM RKH_ST_T*)initialState_
1791+
((RKH_SM_T *)(sm_))->state = (RKHROM RKH_ST_T*)initialState_; \
1792+
((RKH_SM_T *)(sm_))->propagatedEvent = (RKH_EVT_T*)0;
17911793

17921794
#if R_TRC_AO_NAME_EN == RKH_ENABLED
17931795
#if RKH_CFG_SMA_INIT_EVT_EN == RKH_ENABLED

source/sm/inc/rkhsm.h

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@
5555
#define __RKHSM_H__
5656

5757
/* ----------------------------- Include files ----------------------------- */
58+
#include "rkhevt.h"
5859
#include "rkhitl.h"
5960

6061
/* ---------------------- External C language linkage ---------------------- */
@@ -1914,6 +1915,12 @@ struct RKH_SM_T
19141915
* Points to current stable state (simple or final state).
19151916
*/
19161917
RKHROM RKH_ST_T *state;
1918+
1919+
/**
1920+
* \brief
1921+
* Points to the propagated event.
1922+
*/
1923+
RKH_EVT_T* propagatedEvent;
19171924
};
19181925
#else
19191926
struct RKH_SM_T
@@ -1983,6 +1990,12 @@ struct RKH_SM_T
19831990
* Points to current stable state (simple or final state).
19841991
*/
19851992
RKHROM RKH_ST_T *state;
1993+
1994+
/**
1995+
* \brief
1996+
* Points to the propagated event.
1997+
*/
1998+
RKH_EVT_T* propagatedEvent;
19861999
};
19872000
#endif
19882001

@@ -2655,6 +2668,25 @@ rbool_t rkh_sm_else(const RKH_SM_T *sma);
26552668
rbool_t rkh_sm_else(void);
26562669
#endif
26572670

2671+
/**
2672+
* \brief
2673+
* Propagate an event to self. This event will be processed subsequently,
2674+
* without exiting from the current execution of rkh_sma_dispatch().
2675+
* This feature has the same purpose as posting the interesting event to
2676+
* this active object, but it ensures that the event is processed without
2677+
* competing with other active objects that are ready to run.
2678+
*
2679+
* \param[in] me pointer to previously created state machine.
2680+
* \param[in] e pointer to arrived event. It's used as state-machine's
2681+
* input alphabet.
2682+
*
2683+
* \note
2684+
* This function was intented to be called from a state machine action.
2685+
*
2686+
* \ingroup apiSM
2687+
*/
2688+
void rkh_sm_propagate(RKH_SM_T *me, RKH_EVT_T* e);
2689+
26582690
/* -------------------- External C language linkage end -------------------- */
26592691
#ifdef __cplusplus
26602692
}

source/sm/test/support/common.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -262,6 +262,12 @@ expInitSm(RKH_SMA_T *const me, const RKH_ST_T *dftSt)
262262
}
263263
}
264264

265+
RKH_EVT_T*
266+
getPropagatedEvent(RKH_SMA_T* const me)
267+
{
268+
return RKH_UPCAST(RKH_SM_T, me)->propagatedEvent;
269+
}
270+
265271
/** @} doxygen end group definition */
266272
/** @} doxygen end group definition */
267273
/* ------------------------------ End of file ------------------------------ */

source/sm/test/support/common.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
/* ----------------------------- Include files ----------------------------- */
2525

2626
#include "rkh.h"
27+
#include "rkhevt.h"
2728

2829
/* ---------------------- External C language linkage ---------------------- */
2930

@@ -82,6 +83,7 @@ void setState(RKH_SMA_T *const me, const RKH_ST_T *state);
8283
const RKH_ST_T *getState(RKH_SMA_T *const me);
8384
void stateList_create(const RKH_ST_T **list, int nElems, ...);
8485
void expInitSm(RKH_SMA_T *const me, const RKH_ST_T *dftSt);
86+
RKH_EVT_T* getPropagatedEvent(RKH_SMA_T *const me);
8587

8688
/* -------------------- External C language linkage end -------------------- */
8789

source/sm/test/support/smTest.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020

2121
#include "rkh.h"
2222
#include "smTest.h"
23+
#include "rkhsm.h"
2324
#include "smTestAct.h"
2425

2526
/* ----------------------------- Local macros ------------------------------ */
@@ -38,6 +39,8 @@ RKH_CREATE_BASIC_STATE(waiting, NULL, NULL, RKH_ROOT, NULL);
3839
RKH_CREATE_TRANS_TABLE(waiting)
3940
RKH_TRREG(A, NULL, NULL, &s0),
4041
RKH_TRREG(B, NULL, NULL, &SmTest_Final),
42+
RKH_TRINT(C, NULL, smTest_tr16),
43+
RKH_TRINT(D, NULL, smTest_tr17),
4144
RKH_END_TRANS_TABLE
4245

4346
RKH_CREATE_BASIC_STATE(s0, smTest_nS0, smTest_xS0, RKH_ROOT, NULL);

source/sm/test/support/smTestAct.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,8 @@ void smTest_tr12(SmTest *const me, RKH_EVT_T *pe);
5151
void smTest_tr13(SmTest *const me, RKH_EVT_T *pe);
5252
void smTest_tr14(SmTest *const me, RKH_EVT_T *pe);
5353
void smTest_tr15(SmTest *const me, RKH_EVT_T *pe);
54+
void smTest_tr16(SmTest *const me, RKH_EVT_T *pe);
55+
void smTest_tr17(SmTest *const me, RKH_EVT_T *pe);
5456
void smTest_tr21(SmTest *const me, RKH_EVT_T *pe);
5557
void smTest_tr22(SmTest *const me, RKH_EVT_T *pe);
5658
void smTest_tr23(SmTest *const me, RKH_EVT_T *pe);

source/sm/test/test_rkhsm.c

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -253,6 +253,20 @@ setRKHTraceFilters(void)
253253
RKH_FILTER_OFF_EVENT(RKH_TE_FWK_ASSERT);
254254
}
255255

256+
static void
257+
MockEffectCallback0(SmTest *const me, RKH_EVT_T *pe, int cmock_num_calls)
258+
{
259+
TEST_ASSERT_NULL(getPropagatedEvent(smTest));
260+
rkh_sm_propagate(RKH_UPCAST(RKH_SM_T, me), &evD);
261+
TEST_ASSERT_NOT_NULL(getPropagatedEvent(smTest));
262+
}
263+
264+
static void
265+
MockEffectCallback1(SmTest *const me, RKH_EVT_T *pe, int cmock_num_calls)
266+
{
267+
TEST_ASSERT_NULL(getPropagatedEvent(smTest));
268+
}
269+
256270
/* ---------------------------- Global functions --------------------------- */
257271
void
258272
setUp(void)
@@ -1870,6 +1884,30 @@ test_trnWoutUnitrazerSyncDispatchingToStateMachine(void)
18701884
setUpWoutUnitrazer();
18711885
}
18721886

1887+
void
1888+
test_trnWoutUnitrazerPropagateAnEvent(void)
1889+
{
1890+
setUpWoutUnitrazer();
1891+
1892+
expectedState = RKH_STATE_CAST(&waiting);
1893+
1894+
smTest_init_Expect(RKH_CAST(SmTest, smTest), (RKH_EVT_T *)&evCreation);
1895+
smTest_tr16_Expect(RKH_CAST(SmTest, smTest), &evC);
1896+
smTest_tr16_StubWithCallback(MockEffectCallback0);
1897+
smTest_tr17_Expect(RKH_CAST(SmTest, smTest), &evD);
1898+
smTest_tr17_StubWithCallback(MockEffectCallback1);
1899+
setProfileWoutUnitrazer(smTest,
1900+
RKH_STATE_CAST(&waiting),
1901+
RKH_STATE_CAST(&waiting),
1902+
expectedState,
1903+
INIT_STATE_MACHINE);
1904+
1905+
result = rkh_sm_dispatch((RKH_SM_T *)smTest, &evC);
1906+
1907+
TEST_ASSERT_TRUE(expectedState == getState(smTest));
1908+
TEST_ASSERT_EQUAL(RKH_EVT_PROC, result);
1909+
}
1910+
18731911
/** @} doxygen end group definition */
18741912
/** @} doxygen end group definition */
18751913
/**

source/sma/project.yml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,3 +83,6 @@
8383
- module_generator
8484
- gcov
8585
- junit_tests_report
86+
87+
:test_runner:
88+
:cmdline_args: true

source/sma/test/support/bsp.h

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
/**
2+
* \file bsp.h
3+
* \ingroup Test
4+
*
5+
* \brief Helper functions.
6+
*/
7+
8+
/* -------------------------- Development history -------------------------- */
9+
/*
10+
* 2024.12.11 LeFr v1.0.00 Initial version
11+
*/
12+
13+
/* -------------------------------- Authors -------------------------------- */
14+
/*
15+
* LeFr Leandro Francucci [email protected]
16+
*/
17+
18+
/* --------------------------------- Notes --------------------------------- */
19+
/* --------------------------------- Module -------------------------------- */
20+
21+
#ifndef __BSP_H__
22+
#define __BSP_H__
23+
24+
/* ----------------------------- Include files ----------------------------- */
25+
/* ---------------------- External C language linkage ---------------------- */
26+
#ifdef __cplusplus
27+
extern "C" {
28+
#endif
29+
30+
/* --------------------------------- Macros -------------------------------- */
31+
/* -------------------------------- Constants ------------------------------ */
32+
/* -------------------------- External variables --------------------------- */
33+
/* -------------------------- Function prototypes -------------------------- */
34+
double Sensor_get(void);
35+
double Sensor_process(double value);
36+
void Actuator_set(double value);
37+
38+
/* -------------------- External C language linkage end -------------------- */
39+
40+
#ifdef __cplusplus
41+
}
42+
#endif
43+
44+
/* ------------------------------ Module end ------------------------------- */
45+
46+
#endif
47+
48+
/* ------------------------------ End of file ------------------------------ */

0 commit comments

Comments
 (0)