RTE RBC 2oo2 Reference Application
0.1.0 build 0006685
SIL 4 2oo2 Dual-Site Fault-Tolerant ERTMS Radio Block Centre Reference Architecture
Toggle main menu visibility
Loading...
Searching...
No Matches
ab_gp_site_status.c
Go to the documentation of this file.
1
5
#include "
ab_gp_site_status.h
"
6
7
#include <stdio.h>
8
9
bool
ab_gp_site_status_ready_for_online
(
const
ab_gp_channel_context_t
*ctx)
10
{
11
const
bool
relay_recent = (ctx->
cyc_cycle
>= ctx->
last_relay_rx_cycle
) && ((ctx->
cyc_cycle
- ctx->
last_relay_rx_cycle
) <= 10U) &&
12
(ctx->
last_relay_rx_cycle
> 0U);
13
14
/* The inter-site negotiation link is deliberately not part of readiness: a dispatcher-confirmed takeover happens
15
* exactly when that link is silent, and serving trains needs the Gateway relay, not the negotiation link. */
16
return
relay_recent;
17
}
18
19
void
ab_gp_site_status_collect
(
const
ab_gp_channel_context_t
*ctx,
ab_gp_site_status_t
*out)
20
{
21
rte_site_role_status_t role;
22
23
rte_site_role_get_status(&ctx->
site_role
, &role);
24
out->
role_online
= ctx->
is_online
;
25
out->
role_faulted
= ctx->
own_faulted
;
26
out->
link_up
= role.link_up;
27
out->
peer_answering
= role.peer_answering;
28
out->
peer_online_now
= role.peer_online_now;
29
out->
sibling_known
= ctx->
peer_site_state
.
known
;
30
out->
sibling_online
= ctx->
peer_site_state
.
known
&& (ctx->
peer_site_state
.
bytes
[0] != 0U);
31
out->
standby_warm
= role.standby_warm;
32
out->
standby_healthy
= role.standby_healthy;
33
out->
last_reason
= role.last_reason;
34
if
(!ctx->
is_online
&& !ctx->
own_faulted
&& role.peer_unresponsive)
35
{
36
out->
waiting_for
=
AB_GP_SITE_WAIT_DISPATCHER
;
37
}
38
else
if
(!ctx->
is_online
&& (role.last_reason == RTE_SITE_ROLE_REASON_WAITING_READY))
39
{
40
out->
waiting_for
=
AB_GP_SITE_WAIT_READY
;
41
}
42
else
if
(!role.link_up)
43
{
44
out->
waiting_for
=
AB_GP_SITE_WAIT_LINK
;
45
}
46
else
47
{
48
out->
waiting_for
=
AB_GP_SITE_WAIT_NOTHING
;
49
}
50
}
51
52
size_t
ab_gp_site_status_append_text
(
const
ab_gp_site_status_t
*st,
char
*buf,
size_t
size)
53
{
54
const
char
*wait =
"none"
;
55
int
n;
56
57
if
(st->
waiting_for
==
AB_GP_SITE_WAIT_DISPATCHER
)
58
{
59
wait =
"dispatcher"
;
60
}
61
else
if
(st->
waiting_for
==
AB_GP_SITE_WAIT_LINK
)
62
{
63
wait =
"link"
;
64
}
65
else
if
(st->
waiting_for
==
AB_GP_SITE_WAIT_READY
)
66
{
67
wait =
"ready"
;
68
}
69
n = snprintf(buf, size,
" site_wait=%s site_why=%s"
, wait, rte_site_role_reason_token(st->
last_reason
));
70
return
((n > 0) && ((
size_t
)n < size)) ? (size_t)n : 0U;
71
}
ab_gp_site_status_append_text
size_t ab_gp_site_status_append_text(const ab_gp_site_status_t *st, char *buf, size_t size)
Appends " site_wait=<none|dispatcher|link> site_why=<short reason>" to a status payload.
Definition
ab_gp_site_status.c:52
ab_gp_site_status_collect
void ab_gp_site_status_collect(const ab_gp_channel_context_t *ctx, ab_gp_site_status_t *out)
Definition
ab_gp_site_status.c:19
ab_gp_site_status_ready_for_online
bool ab_gp_site_status_ready_for_online(const ab_gp_channel_context_t *ctx)
Whether this channel confirms it is ready to be ONLINE: the Gateway relay delivered a frame within th...
Definition
ab_gp_site_status.c:9
ab_gp_site_status.h
The site status monitor: collects, in one struct, the facts that decide and explain this channel's si...
AB_GP_SITE_WAIT_READY
@ AB_GP_SITE_WAIT_READY
Definition
ab_gp_site_status.h:23
AB_GP_SITE_WAIT_NOTHING
@ AB_GP_SITE_WAIT_NOTHING
Definition
ab_gp_site_status.h:20
AB_GP_SITE_WAIT_DISPATCHER
@ AB_GP_SITE_WAIT_DISPATCHER
Definition
ab_gp_site_status.h:21
AB_GP_SITE_WAIT_LINK
@ AB_GP_SITE_WAIT_LINK
Definition
ab_gp_site_status.h:22
ab_gp_channel_context_t
Central application context owned by composition root (main.c).
Definition
ab_gp_channel_types.h:155
ab_gp_channel_context_t::site_role
rte_site_role_t site_role
Definition
ab_gp_channel_types.h:197
ab_gp_channel_context_t::peer_site_state
ab_gp_sibling_state_t peer_site_state
Definition
ab_gp_channel_types.h:217
ab_gp_channel_context_t::last_relay_rx_cycle
uint32_t last_relay_rx_cycle
Definition
ab_gp_channel_types.h:202
ab_gp_channel_context_t::own_faulted
bool own_faulted
Definition
ab_gp_channel_types.h:206
ab_gp_channel_context_t::is_online
bool is_online
Definition
ab_gp_channel_types.h:205
ab_gp_channel_context_t::cyc_cycle
uint32_t cyc_cycle
Definition
ab_gp_channel_types.h:286
ab_gp_sibling_state_t::known
bool known
Definition
ab_gp_sibling_state.h:30
ab_gp_sibling_state_t::bytes
uint8_t bytes[RTE_EXAMPLE_AB_SITE_STATE_WIRE_SIZE]
Definition
ab_gp_sibling_state.h:29
ab_gp_site_status_t
Definition
ab_gp_site_status.h:27
ab_gp_site_status_t::last_reason
rte_site_role_reason_t last_reason
Definition
ab_gp_site_status.h:38
ab_gp_site_status_t::link_up
bool link_up
Definition
ab_gp_site_status.h:30
ab_gp_site_status_t::peer_online_now
bool peer_online_now
Definition
ab_gp_site_status.h:32
ab_gp_site_status_t::standby_warm
bool standby_warm
Definition
ab_gp_site_status.h:35
ab_gp_site_status_t::sibling_online
bool sibling_online
Definition
ab_gp_site_status.h:34
ab_gp_site_status_t::standby_healthy
bool standby_healthy
Definition
ab_gp_site_status.h:36
ab_gp_site_status_t::role_faulted
bool role_faulted
Definition
ab_gp_site_status.h:29
ab_gp_site_status_t::sibling_known
bool sibling_known
Definition
ab_gp_site_status.h:33
ab_gp_site_status_t::role_online
bool role_online
Definition
ab_gp_site_status.h:28
ab_gp_site_status_t::peer_answering
bool peer_answering
Definition
ab_gp_site_status.h:31
ab_gp_site_status_t::waiting_for
ab_gp_site_wait_t waiting_for
Definition
ab_gp_site_status.h:37
src
application
AB
GP
com
ab_gp_site_status.c
Generated by
1.18.0