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
ga_interface.h
Go to the documentation of this file.
1
70#ifndef RTE_EXAMPLE_GA_INTERFACE_H
71#define RTE_EXAMPLE_GA_INTERFACE_H
72
73#include <stdbool.h>
74#include <stdint.h>
75
76#include "rte/app/appmanager/rte_appmanager.h" /* RTE_CHECKPOINT_MARK() - AB_GA_CHECKPOINT_MARK() below */
77#include "rte/utils/status/rte_status.h"
78
79#include "common_config.h" /* RBC_ENVELOPE_WIRE_SIZE - the GP-calls-into-GA surface below */
80#include "site_config.h" /* rte_example_site_t - same */
81#include "ab_siteGA.h" /* ab_site_ga_route_layout_t - ab_gp_proc_ma_remaining_length_m()
82 * below, GA-calls-into-GP direction, needs GA's own route type */
83
84/* Genuinely shared between GP (ab_gp_db.h/.c's own route-per-train
85 * tracking) and GA (this header's own ab_gp_db_train_get_routes field
86 * signature below) - guarded, not `#include`d from common_config.h, so
87 * this header stays a self-contained export GA's separate build doesn't
88 * need any other GP-internal header for. Matched by an identical guarded
89 * copy in common_config.h - whichever is included first wins, same
90 * pattern this file's own opaque-type guards already use. */
91#ifndef RTE_EXAMPLE_MAX_ROUTES_PER_TRAIN
92#define RTE_EXAMPLE_MAX_ROUTES_PER_TRAIN 4U
93#endif
94
97#ifndef AB_GP_DB_T_DEFINED
98#define AB_GP_DB_T_DEFINED
99typedef struct ab_gp_db_s ab_gp_db_t;
100#endif
101
104#ifndef TRAIN_SESSION_T_DEFINED
105#define TRAIN_SESSION_T_DEFINED
106typedef struct train_session_s ab_gp_train_session_t;
107#endif
108
112#ifndef AB_GP_DB_ROUTE_IL_STATUS_T_DEFINED
113#define AB_GP_DB_ROUTE_IL_STATUS_T_DEFINED
121#endif
122
126#ifndef AB_GP_ROUTE_UPDATE_TYPE_T_DEFINED
127#define AB_GP_ROUTE_UPDATE_TYPE_T_DEFINED
135#endif
136
137#ifndef AB_GP_ROUTE_CONTEXT_T_DEFINED
138#define AB_GP_ROUTE_CONTEXT_T_DEFINED
139typedef struct
140{
141 uint16_t id;
142 uint16_t start_signal;
143 uint16_t end_signal;
145 uint32_t route_type;
146 bool used_in_ma;
147 uint8_t train_id;
149#endif
150
151#ifndef AB_GP_DB_ROUTE_NOTIFY_FN_DEFINED
152#define AB_GP_DB_ROUTE_NOTIFY_FN_DEFINED
153typedef void (*ab_gp_route_context_notify_fn)(const void *context, const ab_gp_route_context_t *ctx,
154 ab_gp_route_update_type_t update_type);
155#endif
156
160#ifndef AB_GP_TRAIN_UPDATE_TYPE_T_DEFINED
161#define AB_GP_TRAIN_UPDATE_TYPE_T_DEFINED
170#endif
171
172#ifndef AB_GP_TRAIN_CONTEXT_T_DEFINED
173#define AB_GP_TRAIN_CONTEXT_T_DEFINED
196#endif
197
198#ifndef AB_GP_TRAIN_NOTIFY_FN_DEFINED
199#define AB_GP_TRAIN_NOTIFY_FN_DEFINED
200typedef void (*ab_gp_train_context_notify_fn)(const void *context, const ab_gp_train_context_t *ctx,
201 ab_gp_train_update_type_t update_type);
202#endif
203
204#ifndef AB_GP_LOGIC_ROUTE_VALIDATOR_FN_DEFINED
205#define AB_GP_LOGIC_ROUTE_VALIDATOR_FN_DEFINED
206typedef bool (*ab_gp_logic_route_validator_fn)(void *context, uint16_t route_id, uint8_t train_id);
207#endif
208
223
231bool ab_gp_db_route_exists(const ab_gp_db_t *db, uint16_t route_id);
232bool ab_gp_db_route_add(ab_gp_db_t *db, uint16_t route_id, uint16_t start_signal, uint16_t end_signal);
233bool ab_gp_db_route_remove(ab_gp_db_t *db, uint16_t route_id);
234bool ab_gp_db_route_set_status(ab_gp_db_t *db, uint16_t route_id, ab_gp_db_route_il_status_t status);
235bool ab_gp_db_route_set_type(ab_gp_db_t *db, uint16_t route_id, uint32_t route_type);
236bool ab_gp_db_route_set_fsm_state(ab_gp_db_t *db, uint16_t route_id, uint32_t fsm_state);
237uint32_t ab_gp_db_route_get_fsm_state(const ab_gp_db_t *db, uint16_t route_id);
238bool ab_gp_db_route_connect_train(ab_gp_db_t *db, uint16_t route_id, uint8_t train_id);
239bool ab_gp_db_route_disconnect_train(ab_gp_db_t *db, uint16_t route_id);
241
255bool ab_gp_train_set_has_ma(ab_gp_db_t *db, uint8_t train_id, bool has_ma);
256bool ab_gp_train_get_last_position(const ab_gp_db_t *db, uint8_t train_id, uint32_t *out_nid_lrbg);
258
266bool ab_gp_db_get_route_context(const ab_gp_db_t *db, uint16_t route_id, ab_gp_route_context_t *out_ctx);
268
277uint32_t ab_gp_proc_ma_remaining_length_m(const ab_site_ga_route_layout_t *route, uint32_t nid_lrbg, uint32_t d_lrbg_m);
279
287bool ab_gp_train_session_add_granted_length(ab_gp_train_session_t *sessions, uint8_t train_id, uint32_t delta);
289 uint32_t granted_length);
291bool ab_gp_train_session_set_ma_pending_send(ab_gp_train_session_t *sessions, uint8_t train_id, bool pending);
292bool ab_gp_train_session_set_ma_acked(ab_gp_train_session_t *sessions, uint8_t train_id, bool acked);
293bool ab_gp_train_session_set_ctc_connected_sent(ab_gp_train_session_t *sessions, uint8_t train_id, bool sent);
294bool ab_gp_train_session_set_ctc_ma_granted_sent(ab_gp_train_session_t *sessions, uint8_t train_id, bool sent);
295bool ab_gp_train_session_set_ctc_ma_notify_pending(ab_gp_train_session_t *sessions, uint8_t train_id, bool pending);
297
305rte_status_t ab_gp_register_train_context_notify(ab_gp_train_context_notify_fn fn, const void *context);
306bool ab_gp_get_train_context(const ab_gp_train_session_t *sessions, const ab_gp_db_t *db, uint8_t train_id,
307 ab_gp_train_context_t *out_ctx);
311 uint8_t train_id, ab_gp_train_update_type_t update_type);
313
318rte_status_t ab_gp_ga_register_init(ab_gp_logic_route_validator_fn fn, void *context);
320
325#ifndef AB_GP_LOGIC_SHUNTING_VALIDATOR_FN_DEFINED
326#define AB_GP_LOGIC_SHUNTING_VALIDATOR_FN_DEFINED
327typedef bool (*ab_gp_logic_shunting_validator_fn)(void *context, uint8_t train_id);
328#endif
331
333
355
383 const char *role_tag);
384
391#ifndef AB_GP_IL_ENVELOPE_HANDLER_FN_DEFINED
392#define AB_GP_IL_ENVELOPE_HANDLER_FN_DEFINED
393typedef bool (*ab_gp_il_envelope_handler_fn)(const void *context, ab_gp_train_session_t *sessions, ab_gp_db_t *db,
394 const uint8_t env_bytes[RBC_ENVELOPE_WIRE_SIZE], uint32_t cycle,
395 rte_example_site_t site, const char *role_tag);
396#endif
402rte_status_t ab_gp_register_il_envelope_handler(ab_gp_il_envelope_handler_fn fn, const void *context);
404
414#ifndef AB_GP_IL_PENDING_OUTPUT_T_DEFINED
415#define AB_GP_IL_PENDING_OUTPUT_T_DEFINED
416typedef struct
417{
419 char tag[16];
420 uint8_t index; /* which IL relay channel (train slot) this entry goes out on */
422#endif
423#ifndef AB_GP_IL_MAX_PENDING_OUTPUTS
424/* x2: each route change now emits BOTH a legacy TRAIN_POSITION_IN_ROUTE
425 * frame AND a richer RBC_MSG_IL_ROUTE_INDICATION frame (ab_ga_il.c's own
426 * build_outputs()) - same "widen the cap for a second per-item output"
427 * step ab_ga_ctc.c's AB_GA_CTC_MAX_PENDING_OUTPUTS already took. */
428#define AB_GP_IL_MAX_PENDING_OUTPUTS (RTE_EXAMPLE_MAX_ROUTES * 2U)
429#endif
430#ifndef AB_GP_IL_OUTPUT_PRODUCER_FN_DEFINED
431#define AB_GP_IL_OUTPUT_PRODUCER_FN_DEFINED
432typedef uint8_t (*ab_gp_il_output_producer_fn)(const void *context,
448typedef void (*ab_gp_il_output_confirm_fn)(const void *context);
449#endif
451 const void *context);
452
453#ifndef AB_GP_CTC_PENDING_OUTPUT_T_DEFINED
454#define AB_GP_CTC_PENDING_OUTPUT_T_DEFINED
455typedef struct
456{
458 char tag[16];
460#endif
461#ifndef AB_GP_CTC_MAX_PENDING_OUTPUTS
462#define AB_GP_CTC_MAX_PENDING_OUTPUTS ((uint8_t)(RTE_EXAMPLE_MAX_TRAINS * 3U))
463#endif
464#ifndef AB_GP_CTC_OUTPUT_PRODUCER_FN_DEFINED
465#define AB_GP_CTC_OUTPUT_PRODUCER_FN_DEFINED
466typedef uint8_t (*ab_gp_ctc_output_producer_fn)(const void *context,
470typedef void (*ab_gp_ctc_output_confirm_fn)(const void *context);
471#endif
473 ab_gp_ctc_output_confirm_fn confirm_fn, const void *context);
475
477
487#define AB_GA_CHECKPOINT_MARK() RTE_CHECKPOINT_MARK()
488
489#endif /* RTE_EXAMPLE_GA_INTERFACE_H */
bool ab_gp_db_get_route_context(const ab_gp_db_t *db, uint16_t route_id, ab_gp_route_context_t *out_ctx)
One-shot pull equivalent of the push notification above - the SAME snapshot-building logic (real impl...
Definition ab_gp_db.c:323
bool ab_gp_db_route_disconnect_train(ab_gp_db_t *db, uint16_t route_id)
Reverses ab_gp_db_route_connect_train(): clears the route's own used_in_ma/train_id and removes it fr...
Definition ab_gp_db.c:197
rte_status_t ab_gp_db_register_route_context_notify(ab_gp_route_context_notify_fn fn, const void *context)
Definition ab_gp_db.c:25
bool ab_gp_db_route_set_fsm_state(ab_gp_db_t *db, uint16_t route_id, uint32_t fsm_state)
Get/set the per-route FSM state (ab_ga_route_state_t, raw uint32_t - GA owns the value space,...
Definition ab_gp_db.c:347
bool ab_gp_db_route_connect_train(ab_gp_db_t *db, uint16_t route_id, uint8_t train_id)
Connects route_id to train_id: appends the route to that train's own route_ids[] and marks the route ...
Definition ab_gp_db.c:150
bool ab_gp_db_route_remove(ab_gp_db_t *db, uint16_t route_id)
Removes a tracked route from db->routes[], freeing its slot.
Definition ab_gp_db.c:291
bool ab_gp_db_route_set_type(ab_gp_db_t *db, uint16_t route_id, uint32_t route_type)
Definition ab_gp_db.c:335
bool ab_gp_db_route_add(ab_gp_db_t *db, uint16_t route_id, uint16_t start_signal, uint16_t end_signal)
Adds a new route to db->routes[]. New entry starts fully idle: occupied=false, il_status=AB_GP_DB_ROU...
Definition ab_gp_db.c:258
bool ab_gp_db_route_exists(const ab_gp_db_t *db, uint16_t route_id)
Definition ab_gp_db.c:253
bool ab_gp_db_route_set_status(ab_gp_db_t *db, uint16_t route_id, ab_gp_db_route_il_status_t status)
Definition ab_gp_db.c:310
uint32_t ab_gp_db_route_get_fsm_state(const ab_gp_db_t *db, uint16_t route_id)
Definition ab_gp_db.c:359
void(*) ab_gp_route_context_notify_fn(const void *context, const ab_gp_route_context_t *ctx, ab_gp_route_update_type_t update_type)
Definition ab_gp_db.h:353
ab_gp_db_route_il_status_t
Definition ab_gp_db.h:54
@ AB_GP_DB_ROUTE_IL_STATUS_LOCKED
Definition ab_gp_db.h:58
@ AB_GP_DB_ROUTE_IL_STATUS_UNKNOWN
Definition ab_gp_db.h:55
@ AB_GP_DB_ROUTE_IL_STATUS_RESERVED
Definition ab_gp_db.h:57
@ AB_GP_DB_ROUTE_IL_STATUS_FREE
Definition ab_gp_db.h:56
ab_gp_route_update_type_t
Definition ab_gp_db.h:310
@ AB_ROUTE_STATUS_CHANGED
Definition ab_gp_db.h:312
@ AB_ROUTE_CONNECTED
Definition ab_gp_db.h:313
@ AB_ROUTE_DISCONNECTED
Definition ab_gp_db.h:315
@ AB_ROUTE_ADDED
Definition ab_gp_db.h:311
uint32_t ab_gp_proc_ma_remaining_length_m(const ab_site_ga_route_layout_t *route, uint32_t nid_lrbg, uint32_t d_lrbg_m)
Computes the Movement Authority length actually REMAINING from a train's own last-KNOWN balise to rou...
#define RTE_EXAMPLE_MAX_ROUTES_PER_TRAIN
#define RBC_ENVELOPE_WIRE_SIZE
bool(*) ab_gp_il_envelope_handler_fn(const void *context, ab_gp_train_session_t *sessions, ab_gp_db_t *db, const uint8_t env_bytes[RBC_ENVELOPE_WIRE_SIZE], uint32_t cycle, rte_example_site_t site, const char *role_tag)
uint8_t(*) ab_gp_ctc_output_producer_fn(const void *context, ab_gp_ctc_pending_output_t out[AB_GP_CTC_MAX_PENDING_OUTPUTS])
rte_status_t ab_gp_register_train_context_notify(ab_gp_train_context_notify_fn fn, const void *context)
Definition ab_gp_train.c:39
bool ab_gp_train_session_set_ctc_ma_granted_sent(ab_gp_train_session_t *sessions, uint8_t train_id, bool sent)
bool ab_gp_train_session_set_ctc_connected_sent(ab_gp_train_session_t *sessions, uint8_t train_id, bool sent)
bool ab_gp_train_session_set_ma_pending_send(ab_gp_train_session_t *sessions, uint8_t train_id, bool pending)
void(*) ab_gp_il_output_confirm_fn(const void *context)
void ab_gp_train_notify_context_changed(const ab_gp_train_session_t *sessions, const ab_gp_db_t *db, uint8_t train_id, ab_gp_train_update_type_t update_type)
void(*) ab_gp_train_context_notify_fn(const void *context, const ab_gp_train_context_t *ctx, ab_gp_train_update_type_t update_type)
bool ab_gp_train_get_last_position(const ab_gp_db_t *db, uint8_t train_id, uint32_t *out_nid_lrbg)
#define AB_GP_IL_MAX_PENDING_OUTPUTS
uint8_t(*) ab_gp_il_output_producer_fn(const void *context, ab_gp_il_pending_output_t out[AB_GP_IL_MAX_PENDING_OUTPUTS])
bool ab_gp_train_session_set_ma_acked(ab_gp_train_session_t *sessions, uint8_t train_id, bool acked)
bool ab_gp_train_set_has_ma(ab_gp_db_t *db, uint8_t train_id, bool has_ma)
bool(*) ab_gp_logic_shunting_validator_fn(void *context, uint8_t train_id)
bool ab_gp_train_session_increment_ma_seq(ab_gp_train_session_t *sessions, uint8_t train_id)
bool ab_gp_train_session_add_granted_length(ab_gp_train_session_t *sessions, uint8_t train_id, uint32_t delta)
void(*) ab_gp_ctc_output_confirm_fn(const void *context)
#define AB_GP_CTC_MAX_PENDING_OUTPUTS
bool ab_gp_train_session_set_ctc_ma_notify_pending(ab_gp_train_session_t *sessions, uint8_t train_id, bool pending)
bool ab_gp_train_session_set_granted_length(ab_gp_train_session_t *sessions, uint8_t train_id, uint32_t granted_length)
rte_status_t ab_gp_ga_register_shunting_validator(ab_gp_logic_shunting_validator_fn fn, void *context)
Definition ab_gp_logic.c:69
ab_gp_train_update_type_t
@ AB_TRAIN_REGISTERED
@ AB_TRAIN_REMOVED
@ AB_TRAIN_POSITION
@ AB_TRAIN_EMERGENCY_REACTION_RAISED
@ AB_TRAIN_MA_CHANGED
bool(*) ab_gp_logic_route_validator_fn(void *context, uint16_t route_id, uint8_t train_id)
rte_status_t ab_gp_ga_register_init(ab_gp_logic_route_validator_fn fn, void *context)
Definition ab_gp_logic.c:46
rte_status_t ab_gp_register_ctc_output_producer(ab_gp_ctc_output_producer_fn fn, ab_gp_ctc_output_confirm_fn confirm_fn, const void *context)
bool ab_gp_get_train_context(const ab_gp_train_session_t *sessions, const ab_gp_db_t *db, uint8_t train_id, ab_gp_train_context_t *out_ctx)
rte_status_t ab_gp_register_il_output_producer(ab_gp_il_output_producer_fn fn, ab_gp_il_output_confirm_fn confirm_fn, const void *context)
rte_status_t ab_ga_ma_adaptation_init(ab_gp_train_session_t *sessions, ab_gp_db_t *db, rte_example_site_t site, const char *role_tag)
GA's own single entry point - registers this channel's route- connection validator (ab_gp_ga_register...
rte_status_t ab_gp_register_il_envelope_handler(ab_gp_il_envelope_handler_fn fn, const void *context)
West/East site identity and the per-site config derived from it (ports, container host lookup) - see ...
rte_example_site_t
Definition site_config.h:20
uint8_t bytes[RBC_ENVELOPE_WIRE_SIZE]
uint8_t bytes[RBC_ENVELOPE_WIRE_SIZE]
uint16_t route_ids[RTE_EXAMPLE_MAX_ROUTES_PER_TRAIN]