11#include "rte/oal/memory/rte_mem_util.h"
12#include "rte/utils/cast/rte_cast.h"
34 const ab_site_balise_t *balise = ab_site_get_balise(nid_lrbg);
35 const ab_site_signal_t *end_sig = ab_site_get_signal(route->end_signal);
37 if ((balise == NULL) || (end_sig == NULL) || (out_dist_m == NULL))
42 if (end_sig->direction == AB_SITE_DIR_REVERSE)
44 *out_dist_m = (balise->chainage_m > end_sig->chainage_m) ? (balise->chainage_m - end_sig->chainage_m) : 0U;
48 *out_dist_m = (end_sig->chainage_m > balise->chainage_m) ? (end_sig->chainage_m - balise->chainage_m) : 0U;
55 uint32_t remaining_m = 0U;
75 return route->length_m;
84 const ab_site_ga_route_layout_t *route,
88 const ab_site_segment_t *seg;
89 const ab_site_balise_t *balise;
90 uint32_t cum_dist = 0U;
93 if (ctx == NULL || route == NULL)
136 rte_mem_set(&ctx->
ma, 0,
sizeof(ctx->
ma));
158 for (i = 0U; (i < route->segment_count) && (i < (uint8_t)RTE_EXAMPLE_MAX_SEGMENTS_PER_ROUTE) && (i < (uint8_t)
RBC_MAX_GRADIENT_SEGMENTS); i++)
160 seg = ab_site_get_segment(route->segment_ids[i]);
165 (void)rte_cast_i32_to_i8((int32_t)seg->gradient_permil, &g_a);
168 (void)rte_cast_checked_add_u32(cum_dist, seg->length_m, &cum_dist);
175 for (i = 0U; (i < route->segment_count) && (i < (uint8_t)RTE_EXAMPLE_MAX_SEGMENTS_PER_ROUTE) && (i < (uint8_t)
RBC_MAX_SPEED_SEGMENTS); i++)
177 seg = ab_site_get_segment(route->segment_ids[i]);
180 uint8_t v_static = 0U;
182 (void)rte_cast_u32_to_u8(seg->v_max_kmh / 5U, &v_static);
185 (void)rte_cast_checked_add_u32(cum_dist, seg->length_m, &cum_dist);
191 for (i = 0U; (i < route->balise_count) && (i < (uint8_t)RTE_EXAMPLE_MAX_BALISES_PER_ROUTE) && (i < (uint8_t)
RBC_MAX_LINKING_ITEMS); i++)
193 balise = ab_site_get_balise(route->balise_nid_lrbgs[i]);
196 uint16_t nid_bg = 0U;
197 (void)rte_cast_u32_to_u16(balise->nid_lrbg & 0x3FFFU, &nid_bg);
215 const ab_site_ga_route_layout_t *additional_route)
249 uint32_t new_ma_length_m)
256 if (new_ma_length_m < ctx->ma.ma_length_m)
bool ab_gp_dispatch(ab_gp_ertms_train_context_t *ctx, ab_gp_event_t event)
Raises event to every state machine subscribed to it, in subscription-table order,...
Synchronous, statically-wired event dispatch for GP's per-entity procedure state machines (state_mach...
#define RBC_MAX_GRADIENT_SEGMENTS
#define RBC_MAX_LINKING_ITEMS
#define RBC_MAX_SPEED_SEGMENTS
@ AB_GP_SESSION_EVENT_MA_REVOKED
@ AB_GP_SESSION_EVENT_MA_GRANTED
bool ab_gp_proc_ma_shorten(ab_gp_ertms_train_context_t *ctx, uint32_t new_ma_length_m)
Shortens an existing Movement Authority (Subset-026 §5.5.4 / Msg 9).
bool ab_gp_proc_ma_extend(ab_gp_ertms_train_context_t *ctx, const ab_site_ga_route_layout_t *additional_route)
Extends an existing Movement Authority with an additional connected route.
bool ab_gp_proc_ma_compute(ab_gp_ertms_train_context_t *ctx, const ab_site_ga_route_layout_t *route, uint32_t ma_seq)
Computes and grants a new Movement Authority based on site track layout.
void ab_gp_proc_ma_revoke(ab_gp_ertms_train_context_t *ctx)
Revokes active Movement Authority (e.g. during emergency or termination).
bool ab_gp_proc_ma_handle_ack(ab_gp_ertms_train_context_t *ctx, uint32_t ma_seq)
Handles Movement Authority Acknowledgement (Msg 146).
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...
static bool distance_from_lrbg_to_route_end(const ab_site_ga_route_layout_t *route, uint32_t nid_lrbg, uint32_t *out_dist_m)
Distance, in meters, from nid_lrbg's own balise to route's END signal, measured along the route's dir...
ERTMS Subset-026 §5.5 Movement Authority (MA) Management Procedure.
bool ab_gp_session_fsm_can_handle(ab_gp_ertms_session_state_t from, ab_gp_session_event_t event, ab_gp_ertms_session_state_t *out_to)
Read-only lookup, no side effect: what event does from a given state produce, if anything.
Event-driven legal-transition table for ab_gp_ertms_session_state_t (Subset-026 Chapter 5's various p...
#define RTE_EXAMPLE_MAX_ROUTES_PER_TRAIN
#define RTE_EXAMPLE_MA_OVERLAP_M
rbc_packet_21_gradient_profile_t p21
uint16_t route_ids[RTE_EXAMPLE_MAX_ROUTES_PER_TRAIN]
rbc_packet_5_linking_t p5
Complete ERTMS state and procedure context for one train slot.
ab_gp_ertms_session_state_t session_state
ab_gp_ertms_position_record_t position
ab_gp_ertms_ma_record_t ma
rbc_gradient_permille_t g_a
rbc_distance_m_t d_gradient
rbc_distance_m_t ma_length
rbc_gradient_segment_t segments[RBC_MAX_GRADIENT_SEGMENTS]
rbc_speed_segment_t segments[RBC_MAX_SPEED_SEGMENTS]
rbc_linking_item_t links[RBC_MAX_LINKING_ITEMS]
rbc_distance_m_t d_static