36#ifndef RTE_EXAMPLE_AB_GP_TRAIN_H
37#define RTE_EXAMPLE_AB_GP_TRAIN_H
42#include "rte/utils/status/rte_status.h"
77#ifndef TRAIN_SESSION_T_DEFINED
78#define TRAIN_SESSION_T_DEFINED
79typedef struct train_session_s
171#define RTE_EXAMPLE_TRAIN_SESSION_WIRE_SIZE 19U
221#ifndef AB_GP_TRAIN_UPDATE_TYPE_T_DEFINED
222#define AB_GP_TRAIN_UPDATE_TYPE_T_DEFINED
248#ifndef AB_GP_TRAIN_CONTEXT_T_DEFINED
249#define AB_GP_TRAIN_CONTEXT_T_DEFINED
259 uint32_t granted_length;
270 bool ma_pending_send;
271 bool ctc_connected_sent;
272 bool ctc_ma_granted_sent;
273 bool ctc_ma_notify_pending;
279#ifndef AB_GP_TRAIN_NOTIFY_FN_DEFINED
280#define AB_GP_TRAIN_NOTIFY_FN_DEFINED
286#define AB_GP_TRAIN_MAX_CONTEXT_SUBSCRIBERS 4U
471 uint32_t d_lrbg, uint32_t msg_type);
495#define AB_GP_TRAIN_MAX_PENDING_OUTPUTS ((uint8_t)(RTE_EXAMPLE_MAX_TRAINS * 2U))
525 const bool cyc_position_reply_due[],
583 bool cyc_position_reply_due[]);
A/B's own simplified Train/Route database - fixed-size arrays describing the domain objects logic/ (p...
bool ab_gp_train_handle_connect(ab_gp_db_t *db, uint8_t train_id)
Handles an inbound P0 (connect handshake) - wraps ab_gp_train_add() with the same env->train_id-as-ni...
bool ab_gp_train_add(ab_gp_db_t *db, uint8_t train_id, uint8_t nid_engine)
Adds a train on connect: fills db->trains[train_id-1] with nid_engine, connected=true,...
bool ab_gp_train_remove(ab_gp_db_t *db, uint8_t train_id)
Removes a train on disconnect: resets db->trains[train_id-1] back to its all-zero/disconnected state.
bool ab_gp_train_set_last_position(ab_gp_db_t *db, uint8_t train_id, uint32_t nid_lrbg)
Records this train's own most recently reported NID_LRBG - the write side of the field logic/'s own c...
bool ab_gp_train_apply_envelope(ab_gp_train_session_t sessions[], ab_gp_db_t *db, const uint8_t env_bytes[RBC_ENVELOPE_WIRE_SIZE], uint32_t cycle, bool is_role_a, rte_example_site_t site, const char *role_tag, uint32_t cyc_msg_type_due[], bool cyc_position_reply_due[])
THE single entry point com/'s ab_gp_channel.c calls for every raw envelope popped off its dedicated T...
uint8_t ab_gp_train_build_outputs(const ab_gp_train_session_t sessions[], const uint32_t cyc_msg_type_due[], const bool cyc_position_reply_due[], ab_gp_train_pending_output_t out[AB_GP_TRAIN_MAX_PENDING_OUTPUTS])
Decides which trains need a Train-directed envelope THIS cycle and builds all of them - see this file...
bool ab_gp_train_set_nid_engine(ab_gp_db_t *db, uint8_t train_id, uint8_t nid_engine)
void ab_gp_train_build_movement_authority(uint8_t out[RBC_ENVELOPE_WIRE_SIZE], uint8_t train_id, uint32_t ma_seq, uint32_t ma_length)
Builds and wire-encodes the outbound M3 (Movement Authority) envelope for train_id (kind=RBC_MSG_M3) ...
ab_gp_db_train_t * ab_gp_train_find(ab_gp_db_t *db, uint8_t train_id)
Finds a connected train's own slot for direct field access.
bool ab_gp_train_find_by_nid_engine(const ab_gp_db_t *db, uint8_t nid_engine, uint8_t *out_train_id)
Reverse lookup: which train_id (if any) is nid_engine currently connected as.
bool ab_gp_train_is_connected(const ab_gp_db_t *db, uint8_t train_id)
void ab_gp_train_build_position_answer(uint8_t out[RBC_ENVELOPE_WIRE_SIZE], uint8_t train_id, uint32_t cycle, uint32_t d_lrbg, uint32_t msg_type)
Builds and wire-encodes the outbound M24/M15 Position Report answer for train_id (kind=RBC_MSG_M24_M1...
bool ab_gp_train_handle_position_report(ab_gp_db_t *db, uint8_t train_id, uint32_t nid_lrbg)
Handles an inbound M136 (Position Report) - adds the train first (ab_gp_train_handle_connect()) if th...
bool ab_gp_train_get_nid_engine(const ab_gp_db_t *db, uint8_t train_id, uint8_t *out_nid_engine)
bool ab_gp_train_get_route_count(const ab_gp_db_t *db, uint8_t train_id, uint8_t *out_route_count)
rte_status_t ab_gp_train_init(void)
Registers this module's own ab_gp_train_session_t codec as a payload collector with com/ (AB/GP/com/a...
uint32_t ab_gp_train_payload_collector_id(void)
bool ab_gp_train_session_get_ma_seq(const ab_gp_train_session_t sessions[], uint8_t train_id, uint32_t *out_ma_seq)
#define AB_GP_TRAIN_MAX_PENDING_OUTPUTS
#define RTE_EXAMPLE_MAX_ROUTES_PER_TRAIN
#define RBC_ENVELOPE_WIRE_SIZE
rte_status_t ab_gp_register_train_context_notify(ab_gp_train_context_notify_fn fn, const void *context)
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_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)
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_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)
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)
ab_gp_train_update_type_t
@ AB_TRAIN_EMERGENCY_REACTION_RAISED
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)
The RBC Train/IL/CTC scenario's shared wire envelope (ADR-029) - one fixed-size struct/frame reused f...
West/East site identity and the per-site config derived from it (ports, container host lookup) - see ...
One train A/B's simplified database knows about.
uint8_t bytes[RBC_ENVELOPE_WIRE_SIZE]
bool position_reply_pending
uint32_t position_reply_msg_type
bool ctc_ma_notify_pending