9#include "rte/utils/buffer/rte_buffer.h"
10#include "rte/oal/memory/rte_mem_util.h"
11#include "rte/utils/lifecycle/rte_lifecycle.h"
12#include "rte/utils/notify/rte_notify.h"
27 rte_status_t lifecycle_status;
31 return RTE_STATUS_INVALID_PARAM;
33 lifecycle_status = rte_lifecycle_check_setup_allowed();
34 if (lifecycle_status != RTE_STATUS_OK)
36 return lifecycle_status;
40 return RTE_STATUS_RESOURCE_EXHAUSTED;
69 out_ctx->
id = route->
id;
114 if (db == NULL || route_id == 0U)
156 if (db == NULL || route_id == 0U)
175 train = &db->
trains[train_id - 1U];
201 uint8_t disconnected_train_id;
204 if (db == NULL || route_id == 0U)
227 train = &db->
trains[disconnected_train_id - 1U];
238 for (shift = k; (uint8_t)(shift + 1U) < train->
route_count; shift++)
303 rte_mem_set(&db->
routes[idx], 0,
sizeof(db->
routes[idx]));
396 uint16_t *out_start_signal, uint16_t *out_end_signal,
397 uint8_t *out_train_id,
bool *out_used_in_ma)
409 if (out_route_id != NULL)
411 *out_route_id = db->
routes[index].
id;
413 if (out_start_signal != NULL)
417 if (out_end_signal != NULL)
421 if (out_train_id != NULL)
425 if (out_used_in_ma != NULL)
451 out_routes == NULL || out_count == NULL)
463 for (i = 0U; i < count; i++)
481 return RTE_STATUS_INVALID_PARAM;
491 out_bytes[offset] = (uint8_t)(r->
id & 0xFFU);
492 out_bytes[offset + 1U] = (uint8_t)((r->
id >> 8) & 0xFFU);
496 out_bytes[offset + 1U] = (uint8_t)((r->
start_signal >> 8) & 0xFFU);
499 out_bytes[offset] = (uint8_t)(r->
end_signal & 0xFFU);
500 out_bytes[offset + 1U] = (uint8_t)((r->
end_signal >> 8) & 0xFFU);
503 out_bytes[offset] = (uint8_t)(r->
route_type & 0xFFU);
504 out_bytes[offset + 1U] = (uint8_t)((r->
route_type >> 8) & 0xFFU);
507 out_bytes[offset] = r->
occupied ? 1U : 0U;
509 out_bytes[offset] = (uint8_t)r->
il_status;
527 out_bytes[offset] = t->
connected ? 1U : 0U;
529 out_bytes[offset] = t->
has_ma ? 1U : 0U;
531 out_bytes[offset] = rc;
534 for (j = 0U; j < 4U; j++)
537 out_bytes[offset] = (uint8_t)(rid & 0xFFU);
538 out_bytes[offset + 1U] = (uint8_t)((rid >> 8) & 0xFFU);
543 out_bytes[offset + 1U] = (uint8_t)((t->
last_nid_lrbg >> 8) & 0xFFU);
544 out_bytes[offset + 2U] = (uint8_t)((t->
last_nid_lrbg >> 16) & 0xFFU);
545 out_bytes[offset + 3U] = (uint8_t)((t->
last_nid_lrbg >> 24) & 0xFFU);
549 if (out_written != NULL)
551 *out_written = (uint32_t)offset;
554 return RTE_STATUS_OK;
566 return RTE_STATUS_INVALID_PARAM;
569 status = rte_buffer_init(&buf, (
void *)in_bytes, (
size_t)in_size);
570 if (status != RTE_STATUS_OK)
574 status = rte_buffer_set_length(&buf, (
size_t)in_size);
575 if (status != RTE_STATUS_OK)
586 uint16_t u16_val = 0U;
588 (void)rte_buffer_read_u16_le(&buf, offset, &r->
id);
590 (void)rte_buffer_read_u16_le(&buf, offset, &r->
start_signal);
592 (void)rte_buffer_read_u16_le(&buf, offset, &r->
end_signal);
594 (void)rte_buffer_read_u16_le(&buf, offset, &u16_val);
598 r->
occupied = (in_bytes[offset] != 0U);
617 t->
has_ma = (in_bytes[offset] != 0U);
629 (void)rte_buffer_read_u16_le(&buf, offset, &t->
route_ids[0]);
631 (void)rte_buffer_read_u16_le(&buf, offset, &t->
route_ids[1]);
633 (void)rte_buffer_read_u16_le(&buf, offset, &t->
route_ids[2]);
635 (void)rte_buffer_read_u16_le(&buf, offset, &t->
route_ids[3]);
638 (void)rte_buffer_read_u32_le(&buf, offset, &t->
last_nid_lrbg);
642 return RTE_STATUS_OK;
static ab_gp_db_route_context_list_t g_route_context_subscribers
bool ab_gp_db_get_route_context(const ab_gp_db_t *db, uint16_t route_id, ab_gp_route_context_t *out_ctx)
One-shot pull equivalent of the push notification above - the SAME snapshot-building logic (real impl...
bool ab_gp_db_route_disconnect_train(ab_gp_db_t *db, uint16_t route_id)
Reverses ab_gp_db_route_connect_train(): clears the route's own used_in_ma/train_id and removes it fr...
static void notify_route_context(const ab_gp_db_t *db, int route_idx, uint8_t train_id, ab_gp_route_update_type_t update_type)
bool ab_gp_db_train_is_connected(const ab_gp_db_t *db, uint8_t train_id)
Checks if a train has an active connection session in the DB.
rte_status_t ab_gp_db_register_route_context_notify(ab_gp_route_context_notify_fn fn, const void *context)
bool ab_gp_db_route_set_fsm_state(ab_gp_db_t *db, uint16_t route_id, uint32_t fsm_state)
Get/set the per-route FSM state (ab_ga_route_state_t, raw uint32_t - GA owns the value space,...
static int find_route_index(const ab_gp_db_t *db, uint16_t route_id)
rte_status_t ab_gp_db_decode(ab_gp_db_t *db, const uint8_t *in_bytes, uint32_t in_size)
Decodes the full route and train database from a deterministic wire format.
bool ab_gp_db_route_connect_train(ab_gp_db_t *db, uint16_t route_id, uint8_t train_id)
Connects route_id to train_id: appends the route to that train's own route_ids[] and marks the route ...
bool ab_gp_db_train_get_routes(const ab_gp_db_t *db, uint8_t train_id, uint16_t out_routes[RTE_EXAMPLE_MAX_ROUTES_PER_TRAIN], uint8_t *out_count)
Retrieves routes currently allocated to a train.
bool ab_gp_db_route_remove(ab_gp_db_t *db, uint16_t route_id)
Removes a tracked route from db->routes[], freeing its slot.
uint8_t ab_gp_db_route_get_count(const ab_gp_db_t *db)
Returns total number of active routes currently in the GP database.
bool ab_gp_db_route_set_type(ab_gp_db_t *db, uint16_t route_id, uint32_t route_type)
static int find_free_route_slot(const ab_gp_db_t *db)
static void build_route_context(const ab_gp_db_t *db, int route_idx, uint8_t train_id, ab_gp_route_context_t *out_ctx)
rte_status_t ab_gp_db_encode(const ab_gp_db_t *db, uint8_t *out_bytes, uint32_t out_capacity, uint32_t *out_written)
Encodes the full route and train database into a deterministic wire format.
bool ab_gp_db_route_add(ab_gp_db_t *db, uint16_t route_id, uint16_t start_signal, uint16_t end_signal)
Adds a new route to db->routes[]. New entry starts fully idle: occupied=false, il_status=AB_GP_DB_ROU...
bool ab_gp_db_route_exists(const ab_gp_db_t *db, uint16_t route_id)
bool ab_gp_db_route_get_by_index(const ab_gp_db_t *db, uint8_t index, uint16_t *out_route_id, uint16_t *out_start_signal, uint16_t *out_end_signal, uint8_t *out_train_id, bool *out_used_in_ma)
Retrieves route snapshot by table index for GA/GP route list synchronization.
RTE_DECLARE_CALLBACK_LIST(ab_gp_db_route_context_list_t, ab_gp_route_context_notify_fn, AB_GP_DB_MAX_ROUTE_CONTEXT_SUBSCRIBERS)
bool ab_gp_db_route_set_status(ab_gp_db_t *db, uint16_t route_id, ab_gp_db_route_il_status_t status)
uint32_t ab_gp_db_route_get_fsm_state(const ab_gp_db_t *db, uint16_t route_id)
A/B's own simplified Train/Route database - fixed-size arrays describing the domain objects logic/ (p...
#define AB_GP_DB_MAX_ROUTE_CONTEXT_SUBSCRIBERS
void(*) ab_gp_route_context_notify_fn(const void *context, const ab_gp_route_context_t *ctx, ab_gp_route_update_type_t update_type)
ab_gp_db_route_il_status_t
@ AB_GP_DB_ROUTE_IL_STATUS_UNKNOWN
ab_gp_route_update_type_t
@ AB_ROUTE_STATUS_CHANGED
#define RTE_EXAMPLE_MAX_ROUTES_PER_TRAIN
#define RTE_EXAMPLE_MAX_ROUTES
#define RTE_EXAMPLE_DB_WIRE_SIZE
#define RTE_EXAMPLE_MAX_TRAINS
One track section A/B's simplified layout knows about.
ab_gp_db_route_il_status_t il_status
ab_gp_db_route_t routes[RTE_EXAMPLE_MAX_ROUTES]
ab_gp_db_train_t trains[RTE_EXAMPLE_MAX_TRAINS]
One train A/B's simplified database knows about.
uint16_t route_ids[RTE_EXAMPLE_MAX_ROUTES_PER_TRAIN]
ab_gp_db_route_il_status_t il_status