RTE RBC 2oo2 Generic Application 0.1.0 build 308eda7
IL/CTC route and train logic for the RBC_GP reference RBC
Loading...
Searching...
No Matches
ab_ga_dispatch.c
Go to the documentation of this file.
1
6#include "ab_ga_dispatch.h"
7
8#include "ga_interface.h" /* every ab_gp_register_*() this module calls */
9#include "../il/ab_ga_il.h" /* ab_ga_il_on_route_context_changed()/_apply_envelope()/_build_outputs() */
10#include "../ctc/ab_ga_ctc.h" /* ab_ga_ctc_on_route_context_changed()/_on_train_context_changed()/_build_outputs() */
11
17typedef struct
18{
19 ab_gp_train_session_t *sessions;
20 ab_gp_db_t *db;
22
23static ga_channel_ctx_t g_channel_ctx;
24
26static void on_route_context_changed(const void *context, const ab_gp_route_context_t *ctx,
27 ab_gp_route_update_type_t update_type);
28static void on_train_context_changed(const void *context, const ab_gp_train_context_t *ctx,
29 ab_gp_train_update_type_t update_type);
30static uint8_t il_output_producer_trampoline(const void *context,
31 ab_gp_il_pending_output_t out[AB_GP_IL_MAX_PENDING_OUTPUTS]);
32static uint8_t ctc_output_producer_trampoline(const void *context,
33 ab_gp_ctc_pending_output_t out[AB_GP_CTC_MAX_PENDING_OUTPUTS]);
34static void il_output_confirm_trampoline(const void *context);
35static void ctc_output_confirm_trampoline(const void *context);
36
38rte_status_t ab_ga_dispatch_init(ab_gp_train_session_t *sessions, ab_gp_db_t *db)
39{
40 rte_status_t status;
41
42 g_channel_ctx.sessions = sessions;
43 g_channel_ctx.db = db;
44
45 status = ab_gp_db_register_route_context_notify(on_route_context_changed, &g_channel_ctx);
46 if (status != RTE_STATUS_OK)
47 {
48 return status;
49 }
50 status = ab_gp_register_train_context_notify(on_train_context_changed, NULL);
51 if (status != RTE_STATUS_OK)
52 {
53 return status;
54 }
55 /* ab_ga_il_apply_envelope() itself matches ab_gp_il_envelope_handler_fn's
56 * exact signature now (it takes/ignores the leading context param) -
57 * registered directly, no trampoline needed; GP hands it fresh
58 * sessions/db every call, so this module's own g_channel_ctx capture
59 * above is not what it uses. */
60 status = ab_gp_register_il_envelope_handler(ab_ga_il_apply_envelope, NULL);
61 if (status != RTE_STATUS_OK)
62 {
63 return status;
64 }
65 status = ab_gp_register_il_output_producer(il_output_producer_trampoline, il_output_confirm_trampoline, NULL);
66 if (status != RTE_STATUS_OK)
67 {
68 return status;
69 }
70 return ab_gp_register_ctc_output_producer(ctc_output_producer_trampoline, ctc_output_confirm_trampoline,
71 &g_channel_ctx);
72}
73
74/****Local functions ****/
75
86static void on_route_context_changed(const void *context, const ab_gp_route_context_t *ctx,
87 ab_gp_route_update_type_t update_type)
88{
89 const ga_channel_ctx_t *ch = (const ga_channel_ctx_t *)context;
90
91 ab_ga_il_on_route_context_changed(ch->sessions, ch->db, ctx, update_type);
92 ab_ga_ctc_on_route_context_changed(ctx, update_type);
93}
94
98static void on_train_context_changed(const void *context, const ab_gp_train_context_t *ctx,
99 ab_gp_train_update_type_t update_type)
100{
101 (void)context;
102 ab_ga_ctc_on_train_context_changed(ctx, update_type);
103}
104
108static uint8_t il_output_producer_trampoline(const void *context,
109 ab_gp_il_pending_output_t out[AB_GP_IL_MAX_PENDING_OUTPUTS])
110{
111 (void)context;
112 return ab_ga_il_build_outputs(out);
113}
114
119static uint8_t ctc_output_producer_trampoline(const void *context,
120 ab_gp_ctc_pending_output_t out[AB_GP_CTC_MAX_PENDING_OUTPUTS])
121{
122 const ga_channel_ctx_t *ch = (const ga_channel_ctx_t *)context;
123
124 if (ch == NULL)
125 {
126 return 0U;
127 }
128 return ab_ga_ctc_build_outputs(ch->sessions, ch->db, out);
129}
130
135static void il_output_confirm_trampoline(const void *context)
136{
137 (void)context;
139}
140
146static void ctc_output_confirm_trampoline(const void *context)
147{
148 const ga_channel_ctx_t *ch = (const ga_channel_ctx_t *)context;
149 ab_gp_train_session_t *sessions = NULL;
150
151 if (ch != NULL)
152 {
153 sessions = ch->sessions;
154 }
156}
void ab_ga_ctc_confirm_outputs_sent(ab_gp_train_session_t *sessions)
Consumes what the immediately-preceding ab_ga_ctc_build_outputs() call actually included in its own o...
Definition ab_ga_ctc.c:288
void ab_ga_ctc_on_train_context_changed(const ab_gp_train_context_t *ctx, ab_gp_train_update_type_t update_type)
GA's dispatch module fans every train-context change here - stores the received snapshot and marks th...
Definition ab_ga_ctc.c:337
uint8_t ab_ga_ctc_build_outputs(const ab_gp_train_session_t *sessions, ab_gp_db_t *db, ab_gp_ctc_pending_output_t out[AB_GP_CTC_MAX_PENDING_OUTPUTS])
Decides which trains need a CTC indication THIS cycle and builds all of them - see this file's own mo...
Definition ab_ga_ctc.c:186
void ab_ga_ctc_on_route_context_changed(const ab_gp_route_context_t *ctx, ab_gp_route_update_type_t update_type)
GA's single dispatch module (safeAPIRBC2oo2GA/src/AB/main/ ab_ga_dispatch.c) is the ONLY thing that r...
Definition ab_ga_ctc.c:323
A/B's own outbound messages to CtcRBCSim. Two layers, same split as AB/GP/train/ab_gp_train....
static void on_route_context_changed(const void *context, const ab_gp_route_context_t *ctx, ab_gp_route_update_type_t update_type)
static void il_output_confirm_trampoline(const void *context)
static uint8_t ctc_output_producer_trampoline(const void *context, ab_gp_ctc_pending_output_t out[AB_GP_CTC_MAX_PENDING_OUTPUTS])
static void on_train_context_changed(const void *context, const ab_gp_train_context_t *ctx, ab_gp_train_update_type_t update_type)
static void ctc_output_confirm_trampoline(const void *context)
static uint8_t il_output_producer_trampoline(const void *context, ab_gp_il_pending_output_t out[AB_GP_IL_MAX_PENDING_OUTPUTS])
rte_status_t ab_ga_dispatch_init(ab_gp_train_session_t *sessions, ab_gp_db_t *db)
Registers every GA<->GP subscription this process needs, in one place: route-context notify,...
GA's single GP-notification subscriber AND registration point for everything GP calls into GA with - ...
void ab_ga_il_on_route_context_changed(ab_gp_train_session_t *sessions, ab_gp_db_t *db, const ab_gp_route_context_t *ctx, ab_gp_route_update_type_t update_type)
GA's single dispatch module (ab_ga_dispatch.c) fans every route change here for AB_ROUTE_CONNECTED/AB...
Definition ab_ga_il.c:711
uint8_t ab_ga_il_build_outputs(ab_gp_il_pending_output_t out[AB_GP_IL_MAX_PENDING_OUTPUTS])
Drains this module's own TrainPositionInRoute event queue (populated by this module's own route-conne...
Definition ab_ga_il.c:233
void ab_ga_il_confirm_outputs_sent(void)
Clears the pending-route-event queue ab_ga_il_build_outputs() just built from - call ONLY once those ...
Definition ab_ga_il.c:274
bool ab_ga_il_apply_envelope(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)
THE handler this module registers with GP (ab_gp_register_il_envelope_handler(), ga_interface....
Definition ab_ga_il.c:163
A/B's own route handling against GP's own runtime table (via AB/GP/ga_interface/ga_interface....