Safe API Framework
Layered API framework for safety-related applications (ERTMS RBC reference targeting CENELEC EN 50128 SIL 4)
Loading...
Searching...
No Matches
sapi_dual_channel.h
Go to the documentation of this file.
1
47#ifndef SAPI_DUAL_CHANNEL_H
48#define SAPI_DUAL_CHANNEL_H
49
50#include <stdint.h>
51#include <stdbool.h>
52
59
60#ifdef __cplusplus
61extern "C" {
62#endif
63
66#define SAPI_DUAL_CHANNEL_MAX_LINKS 4U
67
72#define SAPI_DUAL_CHANNEL_MAX_PAYLOAD (SAPI_DUAL_MSGCHANNEL_MAX_PAYLOAD - 4U)
73
87 void *user_ctx);
88
94typedef struct sapi_dual_channel_s
95{
97 uint32_t link_count;
98 bool link_up[SAPI_DUAL_CHANNEL_MAX_LINKS];
101 void *status_callback_ctx;
102 sapi_duration_ms_t ack_timeout_ms;
103
104 bool pending_data_valid;
105 uint8_t pending_data[SAPI_DUAL_CHANNEL_MAX_PAYLOAD];
106 uint8_t pending_data_size;
107
108 bool pending_state_valid;
109 sapi_dual_state_frame_t pending_state;
111
138
151
178 const uint8_t *payload,
179 uint8_t payload_size,
180 uint32_t *out_ack_link_count);
181
200 uint8_t *out_payload,
201 uint8_t max_size,
202 sapi_duration_ms_t timeout_ms,
203 uint8_t *out_size);
204
241
242sapi_status_t sapi_dual_channel_send_state_frame(sapi_dual_channel_t *channel, sapi_dual_state_t state,
243 bool channel_degraded, uint64_t timestamp_ms);
244
259 sapi_dual_state_frame_t *out_frame);
260
270
282bool sapi_dual_channel_is_link_up(const sapi_dual_channel_t *channel, uint32_t link_index);
283
284#ifdef __cplusplus
285}
286#endif
287
288#endif /* SAPI_DUAL_CHANNEL_H */
289
sapi_status_t sapi_dual_channel_send(sapi_dual_channel_t *channel, const uint8_t *payload, uint8_t payload_size, uint32_t *out_ack_link_count)
Sends payload as a DATA frame on every configured redundant link - never gated by any negotiated stat...
#define SAPI_DUAL_CHANNEL_MAX_LINKS
Maximum number of redundant links one sapi_dual_channel_t may be configured with. Fixed,...
void(*) sapi_dual_channel_status_callback_t(sapi_dual_channel_status_t new_status, sapi_dual_channel_status_t old_status, void *user_ctx)
Optional callback invoked whenever sapi_dual_channel_get_status()'s value changes (ADR-020 section 2'...
sapi_status_t sapi_dual_channel_receive_state_frame(sapi_dual_channel_t *channel, sapi_duration_ms_t timeout_ms, sapi_dual_state_frame_t *out_frame)
Returns the most recently staged inbound STATE frame, actively polling the configured links if none w...
sapi_dual_state_t
State of one instance in a dual (two-redundant-instance) relationship, as decided by sapi_dual_negoti...
sapi_dual_channel_status_t sapi_dual_channel_get_status(const sapi_dual_channel_t *channel)
Returns the aggregate connection status across every configured redundant link, as of the most recent...
sapi_dual_channel_status_t
Aggregate connection status of a sapi_dual_channel_t across all of its configured redundant links (AD...
#define SAPI_DUAL_CHANNEL_MAX_PAYLOAD
Max application payload bytes usable via sapi_dual_channel_send()/_receive() - Layer-1's own SAPI_DUA...
sapi_status_t sapi_dual_channel_receive(sapi_dual_channel_t *channel, uint8_t *out_payload, uint8_t max_size, sapi_duration_ms_t timeout_ms, uint8_t *out_size)
Returns the most recently staged inbound DATA frame, actively polling the configured links (each auto...
sapi_status_t sapi_dual_channel_init(sapi_dual_channel_t *channel, const sapi_dual_channel_config_t *config)
Initializes a sapi_dual_channel_t: initializes every configured redundant link (sapi_dual_msgchannel_...
bool sapi_dual_channel_is_link_up(const sapi_dual_channel_t *channel, uint32_t link_index)
Returns whether one specific configured link is currently considered up, as of the most recent sapi_d...
sapi_status_t sapi_dual_channel_send_heartbeat(sapi_dual_channel_t *channel, uint32_t *out_ack_count)
Sends a sapi_dual_state_frame_t (sapi_dual_frames.h) on every configured redundant link - fire-and-fo...
sapi_status_t
Common result/status codes.
Definition sapi_status.h:27
uint32_t sapi_duration_ms_t
Definition sapi_types.h:27
Layer-2 (DualChannel-owned) frame kind/header definitions for ADR-020 - shared between sapi_dual_chan...
"Channel" layer of ADR-020: one EN 50159-defended message channel over one already-open sapi_netlink_...
Shared enums for the sapi_dual module (ADR-020): dual-instance state negotiation and the redundant,...
Common status/error codes returned by every Safe API Framework function. Shared across all OS Abstrac...
Common fixed-width types and the caller-owned-storage handle pattern used by every OAL service (see A...
Configuration for sapi_dual_channel_init().
sapi_duration_ms_t ack_timeout_ms
sapi_dual_channel_status_callback_t status_callback
sapi_netlink_handle_t links[SAPI_DUAL_CHANNEL_MAX_LINKS]
One sapi_dual_channel_t instance's state. Caller-owned storage; every field is private - reach it onl...
One sapi_dual_msgchannel_t instance's state. Caller-owned storage (REQ-DUAL-MSGCHANNEL-001); opaque i...
SAPI_DUAL_FRAME_KIND_STATE payload - sapi_dual_negotiator_t's own periodic beacon.