mirror of
https://github.com/open5gs/open5gs.git
synced 2026-05-05 23:37:22 +00:00
improve EMM SM
This commit is contained in:
parent
87b0897602
commit
af4cf2a4e1
11 changed files with 292 additions and 184 deletions
|
|
@ -8,7 +8,7 @@ enum bomb_signal_t {
|
|||
};
|
||||
|
||||
typedef struct _tick_event_t {
|
||||
c_uintptr_t event;
|
||||
fsm_event_t event;
|
||||
} tick_event_t;
|
||||
|
||||
typedef struct _bomb_t {
|
||||
|
|
@ -18,26 +18,25 @@ typedef struct _bomb_t {
|
|||
c_uint8_t defuse;
|
||||
} bomb_t;
|
||||
|
||||
void bomb_initial(bomb_t *s, fsm_event_t *e);
|
||||
void bomb_setting(bomb_t *s, fsm_event_t *e);
|
||||
void bomb_timing(bomb_t *s, fsm_event_t *e);
|
||||
void bomb_initial(bomb_t *s, tick_event_t *e);
|
||||
void bomb_setting(bomb_t *s, tick_event_t *e);
|
||||
void bomb_timing(bomb_t *s, tick_event_t *e);
|
||||
|
||||
void bomb_create(bomb_t *s, uint8_t defuse)
|
||||
{
|
||||
fsm_create(&s->fsm, (fsm_handler_t)&bomb_initial, (fsm_handler_t)0);
|
||||
fsm_create(&s->fsm, &bomb_initial, 0);
|
||||
s->defuse = defuse;
|
||||
}
|
||||
|
||||
void bomb_initial(bomb_t *s, fsm_event_t *e)
|
||||
void bomb_initial(bomb_t *s, tick_event_t *e)
|
||||
{
|
||||
s->timeout = 10;
|
||||
FSM_TRAN(s, &bomb_setting);
|
||||
}
|
||||
|
||||
void bomb_setting(bomb_t *s, fsm_event_t *e)
|
||||
void bomb_setting(bomb_t *s, tick_event_t *e)
|
||||
{
|
||||
tick_event_t *te = (tick_event_t*)e;
|
||||
switch (te->event)
|
||||
switch (e->event)
|
||||
{
|
||||
case UP_SIG:
|
||||
{
|
||||
|
|
@ -62,10 +61,9 @@ void bomb_setting(bomb_t *s, fsm_event_t *e)
|
|||
}
|
||||
}
|
||||
|
||||
void bomb_timing(bomb_t *s, fsm_event_t *e)
|
||||
void bomb_timing(bomb_t *s, tick_event_t *e)
|
||||
{
|
||||
tick_event_t *te = (tick_event_t*)e;
|
||||
switch (te->event)
|
||||
switch (e->event)
|
||||
{
|
||||
case FSM_ENTRY_SIG:
|
||||
{
|
||||
|
|
@ -101,66 +99,66 @@ static void fsm_test1(abts_case *tc, void *data)
|
|||
|
||||
bomb_create(&bomb, 14);
|
||||
|
||||
fsm_init((fsm_t *)&bomb, (fsm_event_t*)0);
|
||||
ABTS_PTR_EQUAL(tc, &bomb_setting, ((fsm_t*)&bomb)->state);
|
||||
fsm_init(&bomb, 0);
|
||||
ABTS_PTR_EQUAL(tc, &bomb_setting, FSM_STATE(&bomb));
|
||||
ABTS_INT_EQUAL(tc, 10, bomb.timeout);
|
||||
|
||||
tick_event.event = UP_SIG;
|
||||
fsm_dispatch((fsm_t *)&bomb, (fsm_event_t*)&tick_event);
|
||||
ABTS_PTR_EQUAL(tc, &bomb_setting, ((fsm_t*)&bomb)->state);
|
||||
fsm_dispatch(&bomb, &tick_event);
|
||||
ABTS_PTR_EQUAL(tc, &bomb_setting, FSM_STATE(&bomb));
|
||||
ABTS_INT_EQUAL(tc, 11, bomb.timeout);
|
||||
fsm_dispatch((fsm_t *)&bomb, (fsm_event_t*)&tick_event);
|
||||
ABTS_PTR_EQUAL(tc, &bomb_setting, ((fsm_t*)&bomb)->state);
|
||||
fsm_dispatch(&bomb, &tick_event);
|
||||
ABTS_PTR_EQUAL(tc, &bomb_setting, FSM_STATE(&bomb));
|
||||
ABTS_INT_EQUAL(tc, 12, bomb.timeout);
|
||||
fsm_dispatch((fsm_t *)&bomb, (fsm_event_t*)&tick_event);
|
||||
ABTS_PTR_EQUAL(tc, &bomb_setting, ((fsm_t*)&bomb)->state);
|
||||
fsm_dispatch(&bomb, &tick_event);
|
||||
ABTS_PTR_EQUAL(tc, &bomb_setting, FSM_STATE(&bomb));
|
||||
ABTS_INT_EQUAL(tc, 12, bomb.timeout);
|
||||
|
||||
tick_event.event = DOWN_SIG;
|
||||
fsm_dispatch((fsm_t *)&bomb, (fsm_event_t*)&tick_event);
|
||||
ABTS_PTR_EQUAL(tc, &bomb_setting, ((fsm_t*)&bomb)->state);
|
||||
fsm_dispatch(&bomb, &tick_event);
|
||||
ABTS_PTR_EQUAL(tc, &bomb_setting, FSM_STATE(&bomb));
|
||||
ABTS_INT_EQUAL(tc, 11, bomb.timeout);
|
||||
fsm_dispatch((fsm_t *)&bomb, (fsm_event_t*)&tick_event);
|
||||
ABTS_PTR_EQUAL(tc, &bomb_setting, ((fsm_t*)&bomb)->state);
|
||||
fsm_dispatch(&bomb, &tick_event);
|
||||
ABTS_PTR_EQUAL(tc, &bomb_setting, FSM_STATE(&bomb));
|
||||
ABTS_INT_EQUAL(tc, 10, bomb.timeout);
|
||||
fsm_dispatch((fsm_t *)&bomb, (fsm_event_t*)&tick_event);
|
||||
ABTS_PTR_EQUAL(tc, &bomb_setting, ((fsm_t*)&bomb)->state);
|
||||
fsm_dispatch(&bomb, &tick_event);
|
||||
ABTS_PTR_EQUAL(tc, &bomb_setting, FSM_STATE(&bomb));
|
||||
ABTS_INT_EQUAL(tc, 9, bomb.timeout);
|
||||
fsm_dispatch((fsm_t *)&bomb, (fsm_event_t*)&tick_event);
|
||||
ABTS_PTR_EQUAL(tc, &bomb_setting, ((fsm_t*)&bomb)->state);
|
||||
fsm_dispatch(&bomb, &tick_event);
|
||||
ABTS_PTR_EQUAL(tc, &bomb_setting, FSM_STATE(&bomb));
|
||||
ABTS_INT_EQUAL(tc, 8, bomb.timeout);
|
||||
fsm_dispatch((fsm_t *)&bomb, (fsm_event_t*)&tick_event);
|
||||
ABTS_PTR_EQUAL(tc, &bomb_setting, ((fsm_t*)&bomb)->state);
|
||||
fsm_dispatch(&bomb, &tick_event);
|
||||
ABTS_PTR_EQUAL(tc, &bomb_setting, FSM_STATE(&bomb));
|
||||
ABTS_INT_EQUAL(tc, 8, bomb.timeout);
|
||||
|
||||
tick_event.event = ARM_SIG;
|
||||
fsm_dispatch((fsm_t *)&bomb, (fsm_event_t*)&tick_event);
|
||||
ABTS_PTR_EQUAL(tc, &bomb_timing, ((fsm_t*)&bomb)->state);
|
||||
fsm_dispatch((fsm_t *)&bomb, &tick_event);
|
||||
ABTS_PTR_EQUAL(tc, &bomb_timing, FSM_STATE(&bomb));
|
||||
ABTS_INT_EQUAL(tc, 0, bomb.code);
|
||||
|
||||
tick_event.event = UP_SIG;
|
||||
fsm_dispatch((fsm_t *)&bomb, (fsm_event_t*)&tick_event);
|
||||
ABTS_PTR_EQUAL(tc, &bomb_timing, ((fsm_t*)&bomb)->state);
|
||||
fsm_dispatch((fsm_t *)&bomb, &tick_event);
|
||||
ABTS_PTR_EQUAL(tc, &bomb_timing, FSM_STATE(&bomb));
|
||||
ABTS_INT_EQUAL(tc, 1, bomb.code);
|
||||
|
||||
tick_event.event = UP_SIG;
|
||||
fsm_dispatch((fsm_t *)&bomb, (fsm_event_t*)&tick_event);
|
||||
ABTS_PTR_EQUAL(tc, &bomb_timing, ((fsm_t*)&bomb)->state);
|
||||
fsm_dispatch((fsm_t *)&bomb, &tick_event);
|
||||
ABTS_PTR_EQUAL(tc, &bomb_timing, FSM_STATE(&bomb));
|
||||
ABTS_INT_EQUAL(tc, 3, bomb.code);
|
||||
|
||||
tick_event.event = UP_SIG;
|
||||
fsm_dispatch((fsm_t *)&bomb, (fsm_event_t*)&tick_event);
|
||||
ABTS_PTR_EQUAL(tc, &bomb_timing, ((fsm_t*)&bomb)->state);
|
||||
fsm_dispatch((fsm_t *)&bomb, &tick_event);
|
||||
ABTS_PTR_EQUAL(tc, &bomb_timing, FSM_STATE(&bomb));
|
||||
ABTS_INT_EQUAL(tc, 7, bomb.code);
|
||||
|
||||
tick_event.event = DOWN_SIG;
|
||||
fsm_dispatch((fsm_t *)&bomb, (fsm_event_t*)&tick_event);
|
||||
ABTS_PTR_EQUAL(tc, &bomb_timing, ((fsm_t*)&bomb)->state);
|
||||
fsm_dispatch((fsm_t *)&bomb, &tick_event);
|
||||
ABTS_PTR_EQUAL(tc, &bomb_timing, FSM_STATE(&bomb));
|
||||
ABTS_INT_EQUAL(tc, 14, bomb.code);
|
||||
|
||||
tick_event.event = ARM_SIG;
|
||||
fsm_dispatch((fsm_t *)&bomb, (fsm_event_t*)&tick_event);
|
||||
ABTS_PTR_EQUAL(tc, &bomb_setting, ((fsm_t*)&bomb)->state);
|
||||
fsm_dispatch((fsm_t *)&bomb, &tick_event);
|
||||
ABTS_PTR_EQUAL(tc, &bomb_setting, FSM_STATE(&bomb));
|
||||
}
|
||||
|
||||
enum alarm_signal_t {
|
||||
|
|
@ -181,29 +179,28 @@ typedef struct _alarm_t {
|
|||
} alarm_t;
|
||||
|
||||
typedef struct _set_event_t {
|
||||
c_uintptr_t event;
|
||||
fsm_event_t event;
|
||||
c_uint8_t digit;
|
||||
} set_event_t;
|
||||
|
||||
typedef struct _time_event_t {
|
||||
c_uintptr_t event;
|
||||
fsm_event_t event;
|
||||
c_uint8_t current_time;
|
||||
} time_event_t;
|
||||
|
||||
void alarm_initial(alarm_t *s, fsm_event_t *e);
|
||||
void alarm_off(alarm_t *s, fsm_event_t *e);
|
||||
void alarm_on(alarm_t *s, fsm_event_t *e);
|
||||
void alarm_initial(alarm_t *s, set_event_t *e);
|
||||
void alarm_off(alarm_t *s, set_event_t *e);
|
||||
void alarm_on(alarm_t *s, time_event_t *e);
|
||||
|
||||
void alarm_initial(alarm_t *s, fsm_event_t *e)
|
||||
void alarm_initial(alarm_t *s, set_event_t *e)
|
||||
{
|
||||
s->time = 12*60;
|
||||
FSM_TRAN(s, &alarm_off);
|
||||
}
|
||||
|
||||
void alarm_off(alarm_t *s, fsm_event_t *e)
|
||||
void alarm_off(alarm_t *s, set_event_t *e)
|
||||
{
|
||||
set_event_t *ae = (set_event_t*)e;
|
||||
switch (ae->event)
|
||||
switch (e->event)
|
||||
{
|
||||
case FSM_ENTRY_SIG:
|
||||
{
|
||||
|
|
@ -223,7 +220,7 @@ void alarm_off(alarm_t *s, fsm_event_t *e)
|
|||
case ALARM_SET_SIG:
|
||||
{
|
||||
c_uint32_t alarm = (10 * s->time
|
||||
+ ae->digit) % 10000;
|
||||
+ e->digit) % 10000;
|
||||
if ((alarm / 100 < 24) && (alarm % 100 < 60))
|
||||
{
|
||||
s->time = alarm;
|
||||
|
|
@ -237,10 +234,9 @@ void alarm_off(alarm_t *s, fsm_event_t *e)
|
|||
}
|
||||
}
|
||||
|
||||
void alarm_on(alarm_t *s, fsm_event_t *e)
|
||||
void alarm_on(alarm_t *s, time_event_t *e)
|
||||
{
|
||||
time_event_t *ae = (time_event_t*)e;
|
||||
switch (ae->event)
|
||||
switch (e->event)
|
||||
{
|
||||
case FSM_ENTRY_SIG:
|
||||
{
|
||||
|
|
@ -264,26 +260,26 @@ static void fsm_test2(abts_case *tc, void *data)
|
|||
set_event_t set_event;
|
||||
time_event_t time_event;
|
||||
|
||||
fsm_create((fsm_t *)&alarm, (fsm_handler_t)&alarm_initial, (fsm_handler_t)0);
|
||||
fsm_create(&alarm.fsm, &alarm_initial, 0);
|
||||
|
||||
fsm_init((fsm_t *)&alarm, (fsm_event_t*)0);
|
||||
ABTS_PTR_EQUAL(tc, &alarm_off, ((fsm_t*)&alarm)->state);
|
||||
fsm_init(&alarm, 0);
|
||||
ABTS_PTR_EQUAL(tc, &alarm_off, FSM_STATE(&alarm));
|
||||
ABTS_INT_EQUAL(tc, 1200, alarm.time);
|
||||
|
||||
set_event.event = ALARM_ON_SIG;
|
||||
fsm_dispatch((fsm_t *)&alarm, (fsm_event_t*)&set_event);
|
||||
ABTS_PTR_EQUAL(tc, &alarm_on, ((fsm_t*)&alarm)->state);
|
||||
fsm_dispatch(&alarm, &set_event);
|
||||
ABTS_PTR_EQUAL(tc, &alarm_on, FSM_STATE(&alarm));
|
||||
ABTS_INT_EQUAL(tc, 720, alarm.time);
|
||||
|
||||
time_event.event = ALARM_OFF_SIG;
|
||||
fsm_dispatch((fsm_t *)&alarm, (fsm_event_t*)&time_event);
|
||||
ABTS_PTR_EQUAL(tc, &alarm_off, ((fsm_t*)&alarm)->state);
|
||||
fsm_dispatch(&alarm, &time_event);
|
||||
ABTS_PTR_EQUAL(tc, &alarm_off, FSM_STATE(&alarm));
|
||||
ABTS_INT_EQUAL(tc, 1200, alarm.time);
|
||||
|
||||
set_event.event = ALARM_SET_SIG;
|
||||
set_event.digit = 0;
|
||||
fsm_dispatch((fsm_t *)&alarm, (fsm_event_t*)&set_event);
|
||||
ABTS_PTR_EQUAL(tc, &alarm_off, ((fsm_t*)&alarm)->state);
|
||||
fsm_dispatch(&alarm, &set_event);
|
||||
ABTS_PTR_EQUAL(tc, &alarm_off, FSM_STATE(&alarm));
|
||||
ABTS_INT_EQUAL(tc, 2000, alarm.time);
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue