RTE RBC 2oo2 Reference Application
0.1.0 build 0006685
SIL 4 2oo2 Dual-Site Fault-Tolerant ERTMS Radio Block Centre Reference Architecture
Toggle main menu visibility
Loading...
Searching...
No Matches
ab_gp_train_data_fsm.c
Go to the documentation of this file.
1
5
6
#include "
ab_gp_train_data_fsm.h
"
7
8
#include "rte/oal/log/rte_log.h"
9
#include "rte/utils/string/rte_string.h"
10
26
static
const
struct
27
{
28
ab_gp_train_data_state_t
from
;
29
ab_gp_event_t
event
;
30
ab_gp_train_data_state_t
to
;
31
}
s_transitions
[] = {
32
{
AB_GP_TRAIN_DATA_NONE
,
AB_GP_EVENT_TRAIN_DATA_RECEIVED
,
AB_GP_TRAIN_DATA_RECEIVED
},
33
{
AB_GP_TRAIN_DATA_NONE
,
AB_GP_SESSION_EVENT_TRAIN_DATA_VALIDATED
,
AB_GP_TRAIN_DATA_VALIDATED
},
34
{
AB_GP_TRAIN_DATA_NONE
,
AB_GP_EVENT_TRAIN_DATA_REJECTED
,
AB_GP_TRAIN_DATA_REJECTED
},
35
36
{
AB_GP_TRAIN_DATA_RECEIVED
,
AB_GP_EVENT_TRAIN_DATA_RECEIVED
,
AB_GP_TRAIN_DATA_RECEIVED
},
37
{
AB_GP_TRAIN_DATA_RECEIVED
,
AB_GP_SESSION_EVENT_TRAIN_DATA_VALIDATED
,
AB_GP_TRAIN_DATA_VALIDATED
},
38
{
AB_GP_TRAIN_DATA_RECEIVED
,
AB_GP_EVENT_TRAIN_DATA_REJECTED
,
AB_GP_TRAIN_DATA_REJECTED
},
39
40
{
AB_GP_TRAIN_DATA_VALIDATED
,
AB_GP_EVENT_TRAIN_DATA_RECEIVED
,
AB_GP_TRAIN_DATA_RECEIVED
},
41
{
AB_GP_TRAIN_DATA_VALIDATED
,
AB_GP_SESSION_EVENT_TRAIN_DATA_VALIDATED
,
AB_GP_TRAIN_DATA_VALIDATED
},
42
/* VALIDATED + TRAIN_DATA_REJECTED: intentionally absent - see doc. */
43
44
{
AB_GP_TRAIN_DATA_REJECTED
,
AB_GP_EVENT_TRAIN_DATA_RECEIVED
,
AB_GP_TRAIN_DATA_RECEIVED
},
45
{
AB_GP_TRAIN_DATA_REJECTED
,
AB_GP_SESSION_EVENT_TRAIN_DATA_VALIDATED
,
AB_GP_TRAIN_DATA_VALIDATED
},
46
{
AB_GP_TRAIN_DATA_REJECTED
,
AB_GP_EVENT_TRAIN_DATA_REJECTED
,
AB_GP_TRAIN_DATA_REJECTED
}
47
};
48
49
#define AB_GP_TRAIN_DATA_FSM_TRANSITION_COUNT \
50
(sizeof(s_transitions) / sizeof(s_transitions[0]))
51
52
bool
ab_gp_train_data_fsm_can_handle
(
ab_gp_train_data_state_t
from,
ab_gp_event_t
event,
53
ab_gp_train_data_state_t
*out_to)
54
{
55
uint32_t i;
56
57
for
(i = 0U; i < (uint32_t)
AB_GP_TRAIN_DATA_FSM_TRANSITION_COUNT
; i++)
58
{
59
if
((
s_transitions
[i].from == from) && (
s_transitions
[i].event == event))
60
{
61
if
(out_to != NULL)
62
{
63
*out_to =
s_transitions
[i].to;
64
}
65
return
true
;
66
}
67
}
68
return
false
;
69
}
70
72
static
const
char
*
state_name
(
ab_gp_train_data_state_t
state)
73
{
74
switch
(state)
75
{
76
case
AB_GP_TRAIN_DATA_NONE
:
return
"NONE"
;
77
case
AB_GP_TRAIN_DATA_RECEIVED
:
return
"RECEIVED"
;
78
case
AB_GP_TRAIN_DATA_VALIDATED
:
return
"VALIDATED"
;
79
case
AB_GP_TRAIN_DATA_REJECTED
:
return
"REJECTED"
;
80
default
:
return
"UNKNOWN"
;
81
}
82
}
83
86
static
void
log_event
(
const
ab_gp_ertms_train_context_t
*ctx,
ab_gp_event_t
event,
bool
handled,
87
ab_gp_train_data_state_t
to)
88
{
89
char
storage[112];
90
rte_string_t line;
91
const
char
*out_cstr = NULL;
92
93
if
(rte_string_init(&line, storage,
sizeof
(storage)) != RTE_STATUS_OK)
94
{
95
return
;
96
}
97
(void)rte_string_copy(&line,
"train="
);
98
(void)rte_string_append_u32(&line, (uint32_t)ctx->
train_id
);
99
(void)rte_string_concat(&line,
" event="
);
100
(void)rte_string_append_u32(&line, (uint32_t)event);
101
(void)rte_string_concat(&line,
" state="
);
102
(void)rte_string_concat(&line,
state_name
(ctx->
train_data
.
state
));
103
if
(handled)
104
{
105
(void)rte_string_concat(&line,
" -> "
);
106
(void)rte_string_concat(&line,
state_name
(to));
107
}
108
else
109
{
110
(void)rte_string_concat(&line,
" NOT HANDLED"
);
111
}
112
if
(rte_string_c_str(&line, &out_cstr) == RTE_STATUS_OK)
113
{
114
rte_log_write(RTE_LOG_LEVEL_DEBUG,
"TRAIN_DATA_FSM"
, out_cstr);
115
}
116
}
117
118
bool
ab_gp_train_data_fsm_handle_event
(
ab_gp_ertms_train_context_t
*ctx,
ab_gp_event_t
event)
119
{
120
ab_gp_train_data_state_t
to =
AB_GP_TRAIN_DATA_NONE
;
121
bool
handled;
122
123
if
(ctx == NULL)
124
{
125
return
false
;
126
}
127
128
handled =
ab_gp_train_data_fsm_can_handle
(ctx->
train_data
.
state
, event, &to);
129
log_event
(ctx, event, handled, to);
130
131
if
(!handled)
132
{
133
return
false
;
134
}
135
ctx->
train_data
.
state
= to;
136
/* Keep the pre-FSM .valid field a derived mirror so every existing
137
* reader (ab_gp_proc_train_data_is_valid(), ab_gp_proc_dispatch.c)
138
* is unaffected. */
139
ctx->
train_data
.
valid
= (to ==
AB_GP_TRAIN_DATA_VALIDATED
);
140
return
true
;
141
}
ab_gp_event_t
ab_gp_event_t
Every event any GP procedure state machine reacts to. One per distinct real trigger in ertms_procedur...
Definition
ab_gp_event.h:53
AB_GP_EVENT_TRAIN_DATA_REJECTED
@ AB_GP_EVENT_TRAIN_DATA_REJECTED
Definition
ab_gp_event.h:73
AB_GP_SESSION_EVENT_TRAIN_DATA_VALIDATED
@ AB_GP_SESSION_EVENT_TRAIN_DATA_VALIDATED
Definition
ab_gp_event.h:57
AB_GP_EVENT_TRAIN_DATA_RECEIVED
@ AB_GP_EVENT_TRAIN_DATA_RECEIVED
Definition
ab_gp_event.h:72
log_event
static void log_event(const ab_gp_ertms_train_context_t *ctx, ab_gp_session_event_t event, bool handled, ab_gp_ertms_session_state_t to)
Definition
ab_gp_session_fsm.c:281
state_name
static const char * state_name(ab_gp_ertms_session_state_t state)
Definition
ab_gp_session_fsm.c:236
s_transitions
static const struct @047340101045272040271351026101327061062326177146 s_transitions[]
ab_gp_train_data_fsm_can_handle
bool ab_gp_train_data_fsm_can_handle(ab_gp_train_data_state_t from, ab_gp_event_t event, ab_gp_train_data_state_t *out_to)
Read-only lookup, no side effect.
Definition
ab_gp_train_data_fsm.c:52
AB_GP_TRAIN_DATA_FSM_TRANSITION_COUNT
#define AB_GP_TRAIN_DATA_FSM_TRANSITION_COUNT
Definition
ab_gp_train_data_fsm.c:49
ab_gp_train_data_fsm_handle_event
bool ab_gp_train_data_fsm_handle_event(ab_gp_ertms_train_context_t *ctx, ab_gp_event_t event)
Applies event to ctx->train_data.state, and keeps ctx->train_data.valid in sync (true iff the new sta...
Definition
ab_gp_train_data_fsm.c:118
ab_gp_train_data_fsm.h
(state, event) -> state table for ab_gp_train_data_state_t (Subset-026 §5.4 Validated Train Data acce...
ab_gp_train_data_state_t
ab_gp_train_data_state_t
Validated-train-data acceptance state (Subset-026 §5.4). ab_gp_train_data_fsm.c's own (state,...
Definition
ab_gp_ertms_types.h:69
AB_GP_TRAIN_DATA_NONE
@ AB_GP_TRAIN_DATA_NONE
Definition
ab_gp_ertms_types.h:70
AB_GP_TRAIN_DATA_RECEIVED
@ AB_GP_TRAIN_DATA_RECEIVED
Definition
ab_gp_ertms_types.h:71
AB_GP_TRAIN_DATA_VALIDATED
@ AB_GP_TRAIN_DATA_VALIDATED
Definition
ab_gp_ertms_types.h:72
AB_GP_TRAIN_DATA_REJECTED
@ AB_GP_TRAIN_DATA_REJECTED
Definition
ab_gp_ertms_types.h:73
[struct].s_transitions::to
ab_gp_train_data_state_t to
[struct].s_transitions::event
ab_gp_event_t event
[struct].s_transitions::from
ab_gp_train_data_state_t from
ab_gp_ertms_train_context_t
Complete ERTMS state and procedure context for one train slot.
Definition
ab_gp_ertms_types.h:235
ab_gp_ertms_train_context_t::train_id
uint8_t train_id
Definition
ab_gp_ertms_types.h:236
ab_gp_ertms_train_context_t::train_data
ab_gp_ertms_train_data_t train_data
Definition
ab_gp_ertms_types.h:240
ab_gp_ertms_train_data_t::valid
bool valid
Definition
ab_gp_ertms_types.h:82
ab_gp_ertms_train_data_t::state
ab_gp_train_data_state_t state
Definition
ab_gp_ertms_types.h:81
src
application
AB
GP
state_machines
train_data
ab_gp_train_data_fsm.c
Generated by
1.18.0