SafeAPI RBC 2oo2 Generic Application
IL/CTC route and train logic for the safeAPIRBC2oo2 reference RBC
Loading...
Searching...
No Matches
ab_ga_route_fsm.c
Go to the documentation of this file.
1
5
6#include "ab_ga_route_fsm.h"
7
8#include "safeapi/oal/log/sapi_log.h"
9#include "safeapi/utils/string/sapi_string.h"
10
11static ab_ga_route_state_t status_to_state(rbc_il_route_status_t status)
12{
13 switch (status)
14 {
15 case RBC_IL_ROUTE_STATUS_NO_STATUS: return AB_GA_ROUTE_STATE_LOCKED;
16 case RBC_IL_ROUTE_STATUS_FS: return AB_GA_ROUTE_STATE_FS;
17 case RBC_IL_ROUTE_STATUS_OS: return AB_GA_ROUTE_STATE_OS;
18 case RBC_IL_ROUTE_STATUS_SH: return AB_GA_ROUTE_STATE_SH;
19 case RBC_IL_ROUTE_STATUS_USED: return AB_GA_ROUTE_STATE_USED;
20 case RBC_IL_ROUTE_STATUS_DEGRADED: return AB_GA_ROUTE_STATE_DEGRADED;
21 default: return AB_GA_ROUTE_STATE_LOCKED;
22 }
23}
24
25static bool state_is_stub(ab_ga_route_state_t s)
26{
28}
29
31 const ab_ga_il_route_cmd_t *cmd)
32{
34
35 r.from = from;
36 r.to = from;
37 r.changed = false;
38 r.is_stub = false;
39 r.is_release = false;
40
41 if (cmd == NULL)
42 {
43 return r;
44 }
45
46 if (cmd->release_route_request)
47 {
48 /* Release always wins and always resolves to NO_ROUTE. */
49 r.is_release = true;
51 }
52 else if (cmd->route_type == RBC_IL_ROUTE_TYPE_NO_ROUTE)
53 {
55 }
56 else /* RBC_IL_ROUTE_TYPE_LOCKED */
57 {
58 r.to = status_to_state(cmd->route_status);
59 }
60
61 r.changed = (r.to != r.from);
62 r.is_stub = state_is_stub(r.to);
63 return r;
64}
65
66static const char *state_name(ab_ga_route_state_t s)
67{
68 switch (s)
69 {
70 case AB_GA_ROUTE_STATE_NO_ROUTE: return "NO_ROUTE";
71 case AB_GA_ROUTE_STATE_LOCKED: return "LOCKED";
72 case AB_GA_ROUTE_STATE_FS: return "FS";
73 case AB_GA_ROUTE_STATE_OS: return "OS";
74 case AB_GA_ROUTE_STATE_SH: return "SH";
75 case AB_GA_ROUTE_STATE_USED: return "USED";
76 case AB_GA_ROUTE_STATE_DEGRADED: return "DEGRADED";
77 default: return "UNKNOWN";
78 }
79}
80
81static void log_step(uint32_t cycle, const char *role_tag, uint16_t route_id,
83{
84 char storage[160];
85 sapi_string_t line;
86 const char *out_cstr = NULL;
87
88 if (sapi_string_init(&line, storage, sizeof(storage)) != SAPI_STATUS_OK)
89 {
90 return;
91 }
92 (void)sapi_string_copy(&line, "cycle=");
93 (void)sapi_string_append_u32(&line, cycle);
94 (void)sapi_string_concat(&line, " role=");
95 (void)sapi_string_concat(&line, (role_tag != NULL) ? role_tag : "?");
96 (void)sapi_string_concat(&line, " route=");
97 (void)sapi_string_append_u32(&line, (uint32_t)route_id);
98 (void)sapi_string_concat(&line, " ");
99 (void)sapi_string_concat(&line, state_name(r->from));
100 (void)sapi_string_concat(&line, " -> ");
101 (void)sapi_string_concat(&line, state_name(r->to));
102 if (r->is_release)
103 {
104 (void)sapi_string_concat(&line, " (release)");
105 }
106 if (r->is_stub)
107 {
108 (void)sapi_string_concat(&line, " STUB: ");
109 (void)sapi_string_concat(&line, state_name(r->to));
110 (void)sapi_string_concat(&line, " route supervision not implemented yet");
111 }
112 if (sapi_string_c_str(&line, &out_cstr) == SAPI_STATUS_OK)
113 {
114 sapi_log_write(SAPI_LOG_LEVEL_INFO, "GA_ROUTE_FSM", out_cstr);
115 /* Also to plain stdout (SAFEAPI_EXAMPLE_LOG, ga_interface.h ->
116 * common_config.h) - same path every other GA log line uses, so
117 * this shows up in `docker logs` / container-log assertions
118 * regardless of which sapi_log backend is registered. */
119 SAFEAPI_EXAMPLE_LOG("[%s] GA_ROUTE_FSM %s\n", (role_tag != NULL) ? role_tag : "?", out_cstr);
120 }
121}
122
123ab_ga_route_fsm_result_t ab_ga_route_fsm_step(ab_gp_db_t *db, uint16_t route_id,
124 const ab_ga_il_route_cmd_t *cmd,
125 uint32_t cycle, const char *role_tag)
126{
129
130 from = (ab_ga_route_state_t)ab_gp_db_route_get_fsm_state(db, route_id);
131 r = ab_ga_route_fsm_eval(from, cmd);
132
133 log_step(cycle, role_tag, route_id, &r);
134
135 if (r.changed)
136 {
137 (void)ab_gp_db_route_set_fsm_state(db, route_id, (uint32_t)r.to);
138 }
139 return r;
140}
ab_ga_route_fsm_result_t ab_ga_route_fsm_step(ab_gp_db_t *db, uint16_t route_id, const ab_ga_il_route_cmd_t *cmd, uint32_t cycle, const char *role_tag)
Applies cmd to the route's FSM: reads the current state via ab_gp_db_route_get_fsm_state(),...
ab_ga_route_fsm_result_t ab_ga_route_fsm_eval(ab_ga_route_state_t from, const ab_ga_il_route_cmd_t *cmd)
Computes the target state for (from, cmd), WITHOUT logging or touching any storage - pure,...
Per-route state machine, driven by IL route commands (RBC_MSG_IL_ROUTE_CMD / ab_ga_il_route_cmd_t).
ab_ga_route_state_t
Per-route lifecycle state. Stored raw (uint32_t) on GP's route DB record - keep these values stable.
@ AB_GA_ROUTE_STATE_LOCKED
@ AB_GA_ROUTE_STATE_DEGRADED
@ AB_GA_ROUTE_STATE_NO_ROUTE
@ AB_GA_ROUTE_STATE_OS
@ AB_GA_ROUTE_STATE_SH
@ AB_GA_ROUTE_STATE_USED
@ AB_GA_ROUTE_STATE_FS
Decoded RBC_MSG_IL_ROUTE_CMD payload.
Result of applying one IL route command to a route's FSM.
ab_ga_route_state_t to
ab_ga_route_state_t from