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_ertms_train_message_codec.c
Go to the documentation of this file.
1
11
13
15#include "rte/oal/memory/rte_mem_util.h"
16
19static void write_track_to_train_header(uint8_t *buf, size_t cap, size_t *offset,
21{
22 (void)rbc_codec_write_u8(buf, cap, offset, h->nid_message);
23 (void)rbc_codec_write_u16_be(buf, cap, offset, h->l_message);
24 (void)rbc_codec_write_u32_be(buf, cap, offset, (uint32_t)(h->t_train & 0xFFFFFFFFU)); /* wire field is 32-bit (wraps) */
25 (void)rbc_codec_write_u8(buf, cap, offset, (uint8_t)h->m_ack);
26 (void)rbc_codec_write_u16_be(buf, cap, offset, h->nid_lrbg.nid_c);
27 (void)rbc_codec_write_u16_be(buf, cap, offset, h->nid_lrbg.nid_bg);
28}
29
31 uint8_t *out_buffer,
32 size_t buffer_size,
33 size_t *out_bytes_written)
34{
35 size_t offset = 0U;
36
37 if (msg == NULL || out_buffer == NULL || out_bytes_written == NULL || buffer_size < 32U)
38 {
39 return false;
40 }
41
42 switch (msg->nid_message)
43 {
45 {
46 const rbc_msg_3_movement_authority_t *m3 = &msg->payload.msg_3;
47
48 write_track_to_train_header(out_buffer, buffer_size, &offset, &m3->header);
49 (void)rbc_packet_write_15_ma(out_buffer, buffer_size, &offset, &m3->ma);
50 if (m3->has_gradient)
51 {
52 (void)rbc_packet_write_21_gradient_profile(out_buffer, buffer_size, &offset, &m3->gradient);
53 }
54 if (m3->has_ssp)
55 {
56 (void)rbc_packet_write_27_ssp(out_buffer, buffer_size, &offset, &m3->ssp);
57 }
58 if (m3->has_linking)
59 {
60 (void)rbc_packet_write_5_linking(out_buffer, buffer_size, &offset, &m3->linking);
61 }
62 break;
63 }
64
66 {
67 const rbc_msg_15_ces_t *m15 = &msg->payload.msg_15;
68
69 write_track_to_train_header(out_buffer, buffer_size, &offset, &m15->header);
70 (void)rbc_codec_write_u8(out_buffer, buffer_size, &offset, m15->nid_em);
71 (void)rbc_codec_write_u8(out_buffer, buffer_size, &offset, (uint8_t)m15->q_scale);
72 (void)rbc_codec_write_u32_be(out_buffer, buffer_size, &offset, m15->d_ref);
73 (void)rbc_codec_write_u8(out_buffer, buffer_size, &offset, (uint8_t)m15->q_dir);
74 (void)rbc_codec_write_u32_be(out_buffer, buffer_size, &offset, m15->d_emergencystop);
75 break;
76 }
77
79 {
80 const rbc_msg_16_ues_t *m16 = &msg->payload.msg_16;
81
82 write_track_to_train_header(out_buffer, buffer_size, &offset, &m16->header);
83 (void)rbc_codec_write_u8(out_buffer, buffer_size, &offset, m16->nid_em);
84 break;
85 }
86
88 {
89 const rbc_msg_18_ces_revocation_t *m18 = &msg->payload.msg_18;
90
91 write_track_to_train_header(out_buffer, buffer_size, &offset, &m18->header);
92 (void)rbc_codec_write_u8(out_buffer, buffer_size, &offset, m18->nid_em);
93 break;
94 }
95
97 {
98 const rbc_msg_24_general_message_t *m24 = &msg->payload.msg_24;
99
100 write_track_to_train_header(out_buffer, buffer_size, &offset, &m24->header);
101 if (m24->has_national_values)
102 {
103 (void)rbc_packet_write_3_national_values(out_buffer, buffer_size, &offset, &m24->national_values);
104 }
105 if (m24->has_ma_request_params)
106 {
107 (void)rbc_packet_write_57_ma_request_params(out_buffer, buffer_size, &offset,
108 &m24->ma_request_params);
109 }
110 if (m24->has_pr_params)
111 {
112 (void)rbc_packet_write_58_pr_params(out_buffer, buffer_size, &offset, &m24->pr_params);
113 }
114 if (m24->has_tsr)
115 {
116 (void)rbc_packet_write_65_tsr(out_buffer, buffer_size, &offset, &m24->tsr);
117 }
118 if (m24->has_tsr_revoke)
119 {
120 (void)rbc_packet_write_66_tsr_revoke(out_buffer, buffer_size, &offset, &m24->tsr_revoke);
121 }
122 if (m24->has_text_message)
123 {
124 (void)rbc_packet_write_72_text_message(out_buffer, buffer_size, &offset, &m24->text_message);
125 }
126 break;
127 }
128
130 {
131 /* NOTE (Subset-026 conformance): this codebase's own NID_MESSAGE 33
132 * carries transition-target fields shaped like Packet 131 (RBC
133 * transition order), not the real Subset-026 Message 33 ("MA with
134 * Shifted Location Reference"). Per the real spec, RBC transition
135 * is carried as a PACKET (131, or 31 for FRMCS) inside Message 24
136 * (General Message), never a standalone NID_MESSAGE of its own.
137 * Encoding here preserves this codebase's existing (pre-existing,
138 * not introduced by this change) simplified numbering rather than
139 * silently reassigning wire-visible message IDs - flagged for a
140 * dedicated conformance pass, not fixed blind. */
141 const rbc_msg_33_transition_order_t *m33 = &msg->payload.msg_33;
143
144 write_track_to_train_header(out_buffer, buffer_size, &offset, &m33->header);
145 p131.d_rbctr = m33->d_rbctr;
146 p131.nid_c = m33->nid_c;
147 p131.nid_rbc = m33->nid_rbc;
148 p131.nid_radio = m33->nid_radio;
149 p131.q_sleepingsession = false; /* not modeled by Msg 33's own field set */
150 (void)rbc_packet_write_131_rbc_transition(out_buffer, buffer_size, &offset, &p131);
151 break;
152 }
153
155 {
156 const rbc_msg_2_sr_authorisation_t *m2 = &msg->payload.msg_2;
157 uint32_t d_sr_wire = m2->d_sr_unlimited ? 0xFFFFFFFFU : m2->d_sr;
158
159 write_track_to_train_header(out_buffer, buffer_size, &offset, &m2->header);
160 (void)rbc_codec_write_u8(out_buffer, buffer_size, &offset, (uint8_t)m2->q_scale);
161 (void)rbc_codec_write_u32_be(out_buffer, buffer_size, &offset, d_sr_wire);
162 break;
163 }
164
166 {
167 /* NOTE: this codebase's own constant name is "RECOGNITION_EXIT_SR"
168 * for NID_MESSAGE 6, while Subset-026 8.7.3 names Message 6
169 * "Recognition of exit from TRIP mode" (SR has no "recognition of
170 * exit" message of its own). Header-only either way, so the wire
171 * bytes below are correct regardless of which reading is meant;
172 * left the existing constant name alone rather than guess. */
173 const rbc_msg_6_recognition_exit_trip_t *m6 = &msg->payload.msg_6;
174
175 write_track_to_train_header(out_buffer, buffer_size, &offset, &m6->header);
176 break;
177 }
178
180 {
181 const rbc_msg_8_ack_train_data_t *m8 = &msg->payload.msg_8;
182
183 write_track_to_train_header(out_buffer, buffer_size, &offset, &m8->header);
184 (void)rbc_codec_write_u32_be(out_buffer, buffer_size, &offset, (uint32_t)m8->t_train_ref);
185 break;
186 }
187
189 {
190 const rbc_msg_27_sh_refused_t *m27 = &msg->payload.msg_27;
191
192 write_track_to_train_header(out_buffer, buffer_size, &offset, &m27->header);
193 (void)rbc_codec_write_u32_be(out_buffer, buffer_size, &offset, (uint32_t)m27->t_train_ref);
194 break;
195 }
196
198 {
199 const rbc_msg_28_sh_authorised_t *m28 = &msg->payload.msg_28;
200
201 write_track_to_train_header(out_buffer, buffer_size, &offset, &m28->header);
202 (void)rbc_codec_write_u32_be(out_buffer, buffer_size, &offset, (uint32_t)m28->t_train_ref);
203 break;
204 }
205
207 {
208 const rbc_msg_9_request_shorten_ma_t *m9 = &msg->payload.msg_9;
209
210 write_track_to_train_header(out_buffer, buffer_size, &offset, &m9->header);
211 /* Packet 15: (shortened) MA - same rbc_packet_write_15_ma() call
212 * Msg 3 already uses. */
213 (void)rbc_packet_write_15_ma(out_buffer, buffer_size, &offset, &m9->ma);
214 break;
215 }
216
218 {
219 const rbc_msg_34_track_ahead_free_request_t *m34 = &msg->payload.msg_34;
220
221 write_track_to_train_header(out_buffer, buffer_size, &offset, &m34->header);
222 (void)rbc_codec_write_u8(out_buffer, buffer_size, &offset, (uint8_t)m34->q_scale);
223 (void)rbc_codec_write_u32_be(out_buffer, buffer_size, &offset, m34->d_ref);
224 (void)rbc_codec_write_u8(out_buffer, buffer_size, &offset, (uint8_t)m34->q_dir);
225 (void)rbc_codec_write_u32_be(out_buffer, buffer_size, &offset, m34->d_tafdisplay);
226 (void)rbc_codec_write_u32_be(out_buffer, buffer_size, &offset, m34->l_tafdisplay);
227 break;
228 }
229
231 {
232 /* NOTE (Subset-026 conformance, same posture as Msg 33/Msg 6 above):
233 * this codebase's own NID_MESSAGE 41 is header-only, matching what
234 * a "session termination order" would minimally need; the real
235 * spec's own Message 41 is "Train Accepted" (also header-only, so
236 * the wire bytes happen to coincide either way). Flagged, not
237 * silently renumbered. */
238 const rbc_msg_41_session_termination_order_t *m41 = &msg->payload.msg_41;
239
240 write_track_to_train_header(out_buffer, buffer_size, &offset, &m41->header);
241 break;
242 }
243
244 default:
245 return false;
246 }
247
248 /* l_message is computed HERE, from the real total bytes written, not
249 * trusted from the caller's own header.l_message (which every
250 * handler in ab_gp_proc_dispatch.c leaves at 0, per this struct's
251 * own zero-initialization) - same "l_message computed here, not
252 * caller-supplied" discipline train_wire_encode() already applies to
253 * the flat scheme. Patches bytes[1:3] (big-endian, right after the
254 * 1-byte nid_message already written at bytes[0]) after the fact,
255 * since the real length isn't known until encoding completes. */
256 out_buffer[1] = (uint8_t)((offset >> 8) & 0xFFU);
257 out_buffer[2] = (uint8_t)(offset & 0xFFU);
258
259 *out_bytes_written = offset;
260 return true;
261}
262
263
264bool rbc_train_codec_decode_train_to_track(const uint8_t *in_buffer,
265 size_t buffer_size,
267{
268 size_t offset = 0U;
269 uint8_t nid_message = 0U;
270 uint16_t l_message = 0U;
271 uint32_t t_train = 0U;
272 uint32_t nid_engine = 0U;
273
274 if (in_buffer == NULL || out_msg == NULL || buffer_size < 11U)
275 {
276 return false;
277 }
278
279 rte_mem_set(out_msg, 0, sizeof(*out_msg));
280
281 /* Read Train-to-Track Header */
282 if (!rbc_codec_read_u8(in_buffer, buffer_size, &offset, &nid_message) ||
283 !rbc_codec_read_u16_be(in_buffer, buffer_size, &offset, &l_message) ||
284 !rbc_codec_read_u32_be(in_buffer, buffer_size, &offset, &t_train) ||
285 !rbc_codec_read_u32_be(in_buffer, buffer_size, &offset, &nid_engine))
286 {
287 return false;
288 }
289
290 out_msg->nid_message = nid_message;
291
292 switch (nid_message)
293 {
295 {
296 rbc_msg_129_validated_train_data_t *m129 = &out_msg->payload.msg_129;
297 uint32_t l_train = 0U;
298 uint16_t v_max = 0U;
299 uint8_t m_load = 0U;
300 uint8_t m_axle = 0U;
301 uint8_t m_air = 0U;
302
303 m129->header.nid_message = nid_message;
304 m129->header.l_message = l_message;
305 m129->header.t_train = t_train;
306 m129->header.nid_engine = nid_engine;
307
308 /* Packet 0 (Position Report) precedes the train-data fields
309 * on the wire - same field subset RBC_MSG_TRAIN_TO_TRACK_POSITION_REPORT's
310 * own decode below reads, for consistency. */
311 if (!rbc_packet_read_0_position_report(in_buffer, buffer_size, &offset, &m129->position_report))
312 {
313 return false;
314 }
315
316 (void)rbc_codec_read_u32_be(in_buffer, buffer_size, &offset, &l_train);
317 (void)rbc_codec_read_u16_be(in_buffer, buffer_size, &offset, &v_max);
318 (void)rbc_codec_read_u8(in_buffer, buffer_size, &offset, &m_load);
319 (void)rbc_codec_read_u8(in_buffer, buffer_size, &offset, &m_axle);
320 (void)rbc_codec_read_u8(in_buffer, buffer_size, &offset, &m_air);
321
322 m129->l_train = l_train;
323 m129->v_maxtrain = (rbc_speed_kmh_t)v_max;
324 m129->m_loadinggauge = m_load;
325 m129->m_axleload = m_axle;
326 m129->m_airtight = (m_air != 0U);
327 break;
328 }
329
331 {
332 rbc_msg_132_ma_request_t *m132 = &out_msg->payload.msg_132;
333 uint8_t q_marqst = 0U;
334
335 m132->header.nid_message = nid_message;
336 m132->header.l_message = l_message;
337 m132->header.t_train = t_train;
338 m132->header.nid_engine = nid_engine;
339
340 (void)rbc_codec_read_u8(in_buffer, buffer_size, &offset, &q_marqst);
341 m132->q_marqstreason = (rbc_q_marqstreason_t)q_marqst;
342
343 /* Packet 0 (Position Report) follows Q_MARQSTREASON - same
344 * field subset as Msg 129/136's own decode. */
345 if (!rbc_packet_read_0_position_report(in_buffer, buffer_size, &offset, &m132->position_report))
346 {
347 return false;
348 }
349 break;
350 }
351
353 {
354 rbc_msg_136_position_report_t *m136 = &out_msg->payload.msg_136;
355 uint8_t nid_packet = 0U;
356
357 m136->header.nid_message = nid_message;
358 m136->header.l_message = l_message;
359 m136->header.t_train = t_train;
360 m136->header.nid_engine = nid_engine;
361
362 /* Real Subset-026 8.6.4: Msg 136 carries "Packet 0 or 1" - a
363 * leading NID_PACKET byte says which. Msg 129/132's own
364 * Packet 0 (above) has no such choice, so their own decode
365 * stays a bare rbc_packet_read_0_position_report() call,
366 * unchanged. */
367 if (!rbc_codec_read_u8(in_buffer, buffer_size, &offset, &nid_packet))
368 {
369 return false;
370 }
371
372 if (nid_packet == (uint8_t)RBC_PACKET_1_POSITION_REPORT_2BG)
373 {
374 m136->has_packet1 = true;
375 if (!rbc_packet_read_1_position_report_2bg(in_buffer, buffer_size, &offset, &m136->packet1))
376 {
377 return false;
378 }
379 /* Mirror Packet 1's own core fields into position_report
380 * too (see rbc_msg_136_position_report_t's own doc) - every
381 * EXISTING reader that only ever looks at position_report
382 * (written before Packet 1 existed) keeps working
383 * unchanged; only a caller that specifically cares about
384 * the Packet 0-vs-1 distinction needs has_packet1. */
386 m136->position_report.d_lrbg = m136->packet1.d_lrbg;
388 m136->position_report.m_mode = m136->packet1.m_mode;
390 }
391 else if (nid_packet == (uint8_t)RBC_PACKET_0_POSITION_REPORT)
392 {
393 m136->has_packet1 = false;
394 if (!rbc_packet_read_0_position_report(in_buffer, buffer_size, &offset, &m136->position_report))
395 {
396 return false;
397 }
398 }
399 else
400 {
401 /* REQ-RBC-002: an unrecognized NID_PACKET on Msg 136 is
402 * rejected, not silently decoded as if it were Packet 0. */
403 return false;
404 }
405 break;
406 }
407
409 {
410 rbc_msg_146_ack_t *m146 = &out_msg->payload.msg_146;
411 uint32_t t_ack = 0U;
412
413 m146->header.nid_message = nid_message;
414 m146->header.l_message = l_message;
415 m146->header.t_train = t_train;
416 m146->header.nid_engine = nid_engine;
417
418 (void)rbc_codec_read_u32_be(in_buffer, buffer_size, &offset, &t_ack);
419 m146->t_train_ack = t_ack;
420 break;
421 }
422
424 {
425 rbc_msg_147_ack_emergency_stop_t *m147 = &out_msg->payload.msg_147;
426 uint8_t nid_em = 0U;
427 uint8_t accepted = 0U;
428
429 m147->header.nid_message = nid_message;
430 m147->header.l_message = l_message;
431 m147->header.t_train = t_train;
432 m147->header.nid_engine = nid_engine;
433
434 (void)rbc_codec_read_u8(in_buffer, buffer_size, &offset, &nid_em);
435 (void)rbc_codec_read_u8(in_buffer, buffer_size, &offset, &accepted);
436
437 m147->nid_em = nid_em;
438 m147->ces_accepted = (accepted != 0U);
439 break;
440 }
441
443 {
444 rbc_msg_155_init_session_t *m155 = &out_msg->payload.msg_155;
445 m155->header.nid_message = nid_message;
446 m155->header.l_message = l_message;
447 m155->header.t_train = t_train;
448 m155->header.nid_engine = nid_engine;
449 break;
450 }
451
453 {
454 rbc_msg_156_terminate_session_t *m156 = &out_msg->payload.msg_156;
455 m156->header.nid_message = nid_message;
456 m156->header.l_message = l_message;
457 m156->header.t_train = t_train;
458 m156->header.nid_engine = nid_engine;
459 break;
460 }
461
463 {
464 rbc_msg_159_session_established_t *m159 = &out_msg->payload.msg_159;
465 uint8_t m_version = 0U;
466
467 m159->header.nid_message = nid_message;
468 m159->header.l_message = l_message;
469 m159->header.t_train = t_train;
470 m159->header.nid_engine = nid_engine;
471
472 (void)rbc_codec_read_u8(in_buffer, buffer_size, &offset, &m_version);
473 m159->m_version = m_version;
474 break;
475 }
476
478 {
479 rbc_msg_130_request_for_shunting_t *m130 = &out_msg->payload.msg_130;
480
481 m130->header.nid_message = nid_message;
482 m130->header.l_message = l_message;
483 m130->header.t_train = t_train;
484 m130->header.nid_engine = nid_engine;
485
486 /* Bare position report, no leading NID_PACKET byte - same
487 * convention Msg 129/132's own decode already use above. */
488 if (!rbc_packet_read_0_position_report(in_buffer, buffer_size, &offset, &m130->position_report))
489 {
490 return false;
491 }
492 break;
493 }
494
496 {
497 rbc_msg_150_end_of_mission_t *m150 = &out_msg->payload.msg_150;
498 uint8_t q_desk = 0U;
499
500 m150->header.nid_message = nid_message;
501 m150->header.l_message = l_message;
502 m150->header.t_train = t_train;
503 m150->header.nid_engine = nid_engine;
504
505 if (!rbc_codec_read_u8(in_buffer, buffer_size, &offset, &q_desk))
506 {
507 return false;
508 }
509 m150->desk_open = (q_desk != 0U);
510
511 if (!rbc_packet_read_0_position_report(in_buffer, buffer_size, &offset, &m150->position_report))
512 {
513 return false;
514 }
515 break;
516 }
517
518 default:
519 return false;
520 }
521
522 return true;
523}
bool rbc_train_codec_decode_train_to_track(const uint8_t *in_buffer, size_t buffer_size, rbc_train_inbound_msg_t *out_msg)
Decodes an inbound Train-to-Track message (Msg 129, 130, 132, 136, 146, 147, 150, 155,...
static void write_track_to_train_header(uint8_t *buf, size_t cap, size_t *offset, const rbc_track_to_train_header_t *h)
bool rbc_train_codec_encode_track_to_train(const rbc_train_outbound_msg_t *msg, uint8_t *out_buffer, size_t buffer_size, size_t *out_bytes_written)
Encodes an outbound Track-to-Train message (Msg 2, 3, 6, 8, 9, 15, 16, 18, 24, 33,...
#define RBC_MSG_TRACK_TO_TRAIN_CONDITIONAL_EMERGENCY_STOP
#define RBC_MSG_TRAIN_TO_TRACK_POSITION_REPORT
#define RBC_MSG_TRAIN_TO_TRACK_INIT_SESSION
#define RBC_MSG_TRAIN_TO_TRACK_REQUEST_FOR_SHUNTING
#define RBC_MSG_TRACK_TO_TRAIN_SH_REFUSED
#define RBC_MSG_TRACK_TO_TRAIN_REQUEST_SHORTEN_MA
#define RBC_MSG_TRACK_TO_TRAIN_RECOGNITION_EXIT_SR
#define RBC_MSG_TRAIN_TO_TRACK_END_OF_MISSION
#define RBC_MSG_TRAIN_TO_TRACK_VALIDATED_TRAIN_DATA
#define RBC_MSG_TRACK_TO_TRAIN_TRACK_AHEAD_FREE_REQUEST
#define RBC_MSG_TRACK_TO_TRAIN_MOVEMENT_AUTHORITY
#define RBC_MSG_TRACK_TO_TRAIN_REVOCATION_EMERGENCY_STOP
#define RBC_MSG_TRACK_TO_TRAIN_GENERAL_MESSAGE
#define RBC_MSG_TRACK_TO_TRAIN_RBC_TRANSITION_ORDER
#define RBC_MSG_TRAIN_TO_TRACK_ACK_EMERGENCY_STOP
#define RBC_MSG_TRAIN_TO_TRACK_MA_REQUEST
#define RBC_MSG_TRAIN_TO_TRACK_TERMINATE_SESSION
#define RBC_MSG_TRACK_TO_TRAIN_SESSION_TERMINATION_ORDER
#define RBC_MSG_TRAIN_TO_TRACK_ACKNOWLEDGEMENT
#define RBC_MSG_TRACK_TO_TRAIN_SH_AUTHORISED
#define RBC_MSG_TRACK_TO_TRAIN_SR_AUTHORISATION
#define RBC_MSG_TRACK_TO_TRAIN_ACK_TRAIN_DATA
#define RBC_MSG_TRACK_TO_TRAIN_UNCONDITIONAL_EMERGENCY_STOP
#define RBC_MSG_TRAIN_TO_TRACK_SESSION_ESTABLISHED
bool rbc_packet_write_72_text_message(uint8_t *buf, size_t cap, size_t *offset, const rbc_packet_72_text_message_t *text)
bool rbc_packet_write_57_ma_request_params(uint8_t *buf, size_t cap, size_t *offset, const rbc_packet_57_ma_request_params_t *params)
bool rbc_codec_read_u8(const uint8_t *buf, size_t len, size_t *offset, uint8_t *val)
bool rbc_packet_write_131_rbc_transition(uint8_t *buf, size_t cap, size_t *offset, const rbc_packet_131_rbc_transition_t *transition)
Encodes Packet 131 (RBC Transition Order). NOTE: only d_rbctr/nid_c/ nid_rbc/nid_radio are written to...
bool rbc_codec_write_u8(uint8_t *buf, size_t cap, size_t *offset, uint8_t val)
bool rbc_packet_write_21_gradient_profile(uint8_t *buf, size_t cap, size_t *offset, const rbc_packet_21_gradient_profile_t *gradient)
bool rbc_codec_read_u32_be(const uint8_t *buf, size_t len, size_t *offset, uint32_t *val)
bool rbc_codec_read_u16_be(const uint8_t *buf, size_t len, size_t *offset, uint16_t *val)
bool rbc_packet_write_27_ssp(uint8_t *buf, size_t cap, size_t *offset, const rbc_packet_27_ssp_t *ssp)
bool rbc_codec_write_u16_be(uint8_t *buf, size_t cap, size_t *offset, uint16_t val)
bool rbc_packet_write_65_tsr(uint8_t *buf, size_t cap, size_t *offset, const rbc_packet_65_tsr_t *tsr)
bool rbc_packet_write_5_linking(uint8_t *buf, size_t cap, size_t *offset, const rbc_packet_5_linking_t *linking)
bool rbc_packet_write_66_tsr_revoke(uint8_t *buf, size_t cap, size_t *offset, const rbc_packet_66_tsr_revoke_t *revoke)
bool rbc_packet_read_1_position_report_2bg(const uint8_t *buf, size_t len, size_t *offset, rbc_packet_1_position_report_2bg_t *out_p1)
bool rbc_packet_write_3_national_values(uint8_t *buf, size_t cap, size_t *offset, const rbc_packet_3_national_values_t *nv)
bool rbc_packet_write_58_pr_params(uint8_t *buf, size_t cap, size_t *offset, const rbc_packet_58_pr_params_t *params)
bool rbc_packet_write_15_ma(uint8_t *buf, size_t cap, size_t *offset, const rbc_packet_15_ma_t *ma)
bool rbc_codec_write_u32_be(uint8_t *buf, size_t cap, size_t *offset, uint32_t val)
bool rbc_packet_read_0_position_report(const uint8_t *buf, size_t len, size_t *offset, rbc_packet_0_position_report_t *out_p0)
#define RBC_PACKET_1_POSITION_REPORT_2BG
#define RBC_PACKET_0_POSITION_REPORT
uint16_t rbc_speed_kmh_t
Speed in km/h (5 km/h ETCS granularity or exact integer).
rbc_q_marqstreason_t
Movement Authority Request Reason (Q_MARQSTREASON) Subset-026 Section 7.5.1.28.
rbc_packet_0_position_report_t position_report
Msg 130: Request for Shunting (Subset-026 8.6.2) - header plus a position report, same bare (no leadi...
rbc_packet_0_position_report_t position_report
Msg 132: Movement Authority Request.
rbc_packet_0_position_report_t position_report
rbc_train_to_track_header_t header
Msg 136: Train Position Report - carries Packet 0 OR Packet 1 (Subset-026 8.6.4: "Packet 0 or 1"),...
rbc_packet_0_position_report_t position_report
rbc_packet_1_position_report_2bg_t packet1
Msg 146: Acknowledgement.
rbc_train_to_track_header_t header
Msg 147: Emergency Stop Acknowledgement.
Msg 150: End of Mission (Subset-026 8.6.10).
rbc_packet_0_position_report_t position_report
Msg 155: Initiation of a Communication Session.
rbc_train_to_track_header_t header
Msg 156: Termination of a Communication Session.
Msg 15: Conditional Emergency Stop (CES).
rbc_track_to_train_header_t header
Msg 16: Unconditional Emergency Stop (UES).
rbc_track_to_train_header_t header
Msg 18: Revocation of Emergency Stop.
rbc_track_to_train_header_t header
Msg 24: General Message (National Values, TSRs, Text, Parameters).
rbc_packet_3_national_values_t national_values
rbc_packet_66_tsr_revoke_t tsr_revoke
rbc_packet_57_ma_request_params_t ma_request_params
rbc_packet_72_text_message_t text_message
Msg 27: SH Refused (Subset-026 8.7.10) - answers a Msg 130 Request for Shunting; carries the T_TRAIN ...
rbc_track_to_train_header_t header
Msg 28: SH Authorised (Subset-026 8.7.11) - carries the T_TRAIN of the authorised Msg 130,...
rbc_track_to_train_header_t header
Msg 2: SR Authorisation (Subset-026 8.7.1).
rbc_track_to_train_header_t header
Msg 33: RBC Transition Order (this codebase's own numbering - see ab_gp_ertms_train_message_codec....
Msg 34: Track Ahead Free Request (Subset-026 8.7.14).
Msg 3: Movement Authority (with optional packets).
rbc_packet_21_gradient_profile_t gradient
Msg 41 (this codebase's own numbering - see codec's own encode-case comment for the Subset-026 confor...
Msg 6: Recognition of exit from TRIP mode (Subset-026 8.7.3) - header only, no message-specific field...
Msg 8: Acknowledgement of Train Data (Subset-026 8.7.4).
rbc_track_to_train_header_t header
Msg 9: Request to Shorten MA (Subset-026 8.7.5) - carries a shortened Level 2 MA (Packet 15),...
rbc_nid_bg_t nid_bg
union rbc_train_inbound_msg_t::@156151041174124231025067150227167311270040326010 payload
union rbc_train_outbound_msg_t::@072257326371153356142277360163235337000010176256 payload