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
rbc_util_km114_relay.h
Go to the documentation of this file.
1#ifndef RTE_EXAMPLE_RBC_UTIL_KM114_RELAY_H
2#define RTE_EXAMPLE_RBC_UTIL_KM114_RELAY_H
3
27
28#include <stdbool.h>
29#include <stdint.h>
30#include <string.h>
31
32#include "rbc_util_frame.h"
33
34#ifdef __cplusplus
35extern "C" {
36#endif
37
38#define RBC_UTIL_KM114_RELAY_HEADER_SIZE 4U
39#define RBC_UTIL_KM114_RELAY_CHUNK_MAX (RBC_UTIL_PAYLOAD_MAX - RBC_UTIL_KM114_RELAY_HEADER_SIZE) /* 246 */
40#define RBC_UTIL_KM114_RELAY_MAX_FRAGS 2U
41#define RBC_UTIL_KM114_RELAY_FILE_MAX (RBC_UTIL_KM114_RELAY_CHUNK_MAX * RBC_UTIL_KM114_RELAY_MAX_FRAGS) /* 492 */
42
55static inline size_t rbc_util_km114_relay_encode_chunk(uint8_t *out, uint16_t total_len, uint8_t frag_index,
56 uint8_t frag_count, const uint8_t *chunk,
57 size_t chunk_len)
58{
59 if (chunk_len > (size_t)RBC_UTIL_KM114_RELAY_CHUNK_MAX)
60 {
61 return 0U;
62 }
63 out[0] = (uint8_t)(total_len & 0xFFU);
64 out[1] = (uint8_t)((total_len >> 8) & 0xFFU);
65 out[2] = frag_index;
66 out[3] = frag_count;
67 if (chunk_len > 0U)
68 {
69 (void)memcpy(&out[RBC_UTIL_KM114_RELAY_HEADER_SIZE], chunk, chunk_len);
70 }
71 return RBC_UTIL_KM114_RELAY_HEADER_SIZE + chunk_len;
72}
73
80static inline bool rbc_util_km114_relay_decode_chunk(const uint8_t *payload, uint8_t payload_len,
81 uint16_t *out_total_len, uint8_t *out_frag_index,
82 uint8_t *out_frag_count, const uint8_t **out_chunk,
83 uint8_t *out_chunk_len)
84{
85 if (payload_len < (uint8_t)RBC_UTIL_KM114_RELAY_HEADER_SIZE)
86 {
87 return false;
88 }
89 *out_total_len = (uint16_t)((uint16_t)payload[0] | ((uint16_t)payload[1] << 8));
90 *out_frag_index = payload[2];
91 *out_frag_count = payload[3];
92 *out_chunk = &payload[RBC_UTIL_KM114_RELAY_HEADER_SIZE];
93 *out_chunk_len = (uint8_t)(payload_len - (uint8_t)RBC_UTIL_KM114_RELAY_HEADER_SIZE);
94 return true;
95}
96
97#ifdef __cplusplus
98} /* extern "C" */
99#endif
100
101#endif /* RTE_EXAMPLE_RBC_UTIL_KM114_RELAY_H */
ADR-038: the wire frame for the A/B<->C util side channel (RTE_EXAMPLE_RELAY_KIND_UTIL) and the C-sid...
#define RBC_UTIL_KM114_RELAY_CHUNK_MAX
static bool rbc_util_km114_relay_decode_chunk(const uint8_t *payload, uint8_t payload_len, uint16_t *out_total_len, uint8_t *out_frag_index, uint8_t *out_frag_count, const uint8_t **out_chunk, uint8_t *out_chunk_len)
Decodes one chunk's header out of a received RBC_UTIL_TOPIC_KM114_FILE publish payload (payload_len b...
static size_t rbc_util_km114_relay_encode_chunk(uint8_t *out, uint16_t total_len, uint8_t frag_index, uint8_t frag_count, const uint8_t *chunk, size_t chunk_len)
Encodes one chunk of a file relay transfer into a RBC_UTIL_TOPIC_KM114_FILE publish payload.
#define RBC_UTIL_KM114_RELAY_HEADER_SIZE