RTE RBC 2oo2 Reference Application 0.1.0 build 0006685
SIL 4 2oo2 Dual-Site Fault-Tolerant ERTMS Radio Block Centre Reference Architecture
Loading...
Searching...
No Matches
ab_gp_train_data_fsm.c
Go to the documentation of this file.
1
5
7
8#include "rte/oal/log/rte_log.h"
9#include "rte/utils/string/rte_string.h"
10
35
39
42 /* VALIDATED + TRAIN_DATA_REJECTED: intentionally absent - see doc. */
43
47};
48
49#define AB_GP_TRAIN_DATA_FSM_TRANSITION_COUNT \
50 (sizeof(s_transitions) / sizeof(s_transitions[0]))
51
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
72static 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
86static void log_event(const ab_gp_ertms_train_context_t *ctx, ab_gp_event_t event, bool handled,
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
119{
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. */
140 return true;
141}
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
Definition ab_gp_event.h:73
@ AB_GP_SESSION_EVENT_TRAIN_DATA_VALIDATED
Definition ab_gp_event.h:57
@ AB_GP_EVENT_TRAIN_DATA_RECEIVED
Definition ab_gp_event.h:72
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)
static const char * state_name(ab_gp_ertms_session_state_t state)
static const struct @047340101045272040271351026101327061062326177146 s_transitions[]
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.
#define AB_GP_TRAIN_DATA_FSM_TRANSITION_COUNT
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...
(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
Validated-train-data acceptance state (Subset-026 §5.4). ab_gp_train_data_fsm.c's own (state,...
@ AB_GP_TRAIN_DATA_NONE
@ AB_GP_TRAIN_DATA_RECEIVED
@ AB_GP_TRAIN_DATA_VALIDATED
@ AB_GP_TRAIN_DATA_REJECTED
ab_gp_train_data_state_t to
ab_gp_train_data_state_t from
Complete ERTMS state and procedure context for one train slot.
ab_gp_ertms_train_data_t train_data
ab_gp_train_data_state_t state