22#include "rte/status.h"
24#include "rte/ipc/rte_ipc_request_reply.h"
49#define SIGNAL_YELLOW 1
65 RTE_LOG_DEBUG(
"Database query: train=%u, location=%u m",
99 printf(
"═══════════════════════════════════════════════════════════════\n");
100 printf(
"Signal Database Server (Request-Reply)\n");
101 printf(
"═══════════════════════════════════════════════════════════════\n");
104 RTE_LOG_INFO(
"Starting signal server");
108 .name =
"signal-database",
116 RTE_LOG_ERROR(
"Failed to create server: %d", status);
120 RTE_LOG_INFO(
"Server ready, waiting for queries...");
123 for (
int i = 0; i < 10; i++) {
128 RTE_LOG_WARN(
"No query received (timeout)");
133 RTE_LOG_ERROR(
"Failed to receive request: %d", status);
141 RTE_LOG_INFO(
"Received query #%d from train %u (location=%u m)",
149 &reply,
sizeof(reply));
152 RTE_LOG_INFO(
"Replied: signal=%u, speed=%u km/h, \"%s\"",
156 RTE_LOG_ERROR(
"Failed to send reply: %d", status);
164 printf(
"═══════════════════════════════════════════════════════════════\n");
165 printf(
"Signal Server shutdown\n");
166 printf(
"═══════════════════════════════════════════════════════════════\n");
185 printf(
"═══════════════════════════════════════════════════════════════\n");
186 printf(
"Train Controller (Request-Reply Client)\n");
187 printf(
"═══════════════════════════════════════════════════════════════\n");
190 RTE_LOG_INFO(
"Starting train controller");
194 .server_name =
"signal-database",
201 RTE_LOG_ERROR(
"Failed to connect to signal server: %d", status);
205 RTE_LOG_INFO(
"Connected to signal server");
208 uint32_t train_id = 42;
209 uint32_t position = 0;
211 for (
int i = 0; i < 10; i++) {
217 .train_id = train_id,
218 .location_m = position
223 RTE_LOG_INFO(
"Query #%d: Train %u at location %u m",
228 &query,
sizeof(query),
229 &reply,
sizeof(reply),
233 const char *signal_names[] = {
"RED",
"YELLOW",
"GREEN"};
234 RTE_LOG_INFO(
"Reply: signal=%s, speed=%u km/h (\"%s\")",
242 printf(
" → Train accelerating to %u km/h\n",
246 printf(
" → Train preparing to stop\n");
249 printf(
" → Train EMERGENCY STOP\n");
253 RTE_LOG_ERROR(
"Server did not reply in time!");
256 RTE_LOG_ERROR(
"RPC failed: %d", status);
268 printf(
"═══════════════════════════════════════════════════════════════\n");
269 printf(
"Train Controller shutdown\n");
270 printf(
"═══════════════════════════════════════════════════════════════\n");
280int main(
int argc,
char *argv[])
283 printf(
"Usage: %s <server|client>\n", argv[0]);
284 printf(
" server - Run as signal database server\n");
285 printf(
" client - Run as train controller client\n");
286 printf(
"\nExample:\n");
287 printf(
" Terminal 1: %s server\n", argv[0]);
288 printf(
" Terminal 2: %s client\n", argv[0]);
292 rte_log_initialize();
294 if (strcmp(argv[1],
"server") == 0) {
296 }
else if (strcmp(argv[1],
"client") == 0) {
299 printf(
"Unknown mode: %s\n", argv[1]);
rte_status_t
Common result/status codes.
static rte_status_t query_signal_database(const signal_query_t *query, signal_reply_t *reply)
Signal database query logic.
static int run_train_controller(void)
Simulate train moving and querying signal state.
static int run_signal_server(void)
Run signal server (responder).
rte_status_t rte_ipc_rr_client_destroy(rte_ipc_rr_client_t client)
Destroy request-reply client connection.
rte_status_t rte_ipc_rr_send_reply(rte_ipc_rr_server_t server, uint32_t request_id, const void *reply_data, size_t reply_size)
Send reply to a request.
rte_status_t rte_ipc_rr_server_destroy(rte_ipc_rr_server_t server)
Destroy request-reply server.
rte_status_t rte_ipc_rr_server_create(rte_ipc_rr_server_t *handle_out, const rte_ipc_rr_server_config_t *config)
Create a request-reply server channel.
rte_status_t rte_ipc_rr_receive_request(rte_ipc_rr_server_t server, rte_ipc_rr_request_t *request_out, rte_duration_ms_t timeout_ms)
Receive a request (blocking with timeout).
struct rte_ipc_rr_server_s * rte_ipc_rr_server_t
Request-Reply server channel handle.
struct rte_ipc_rr_client_s * rte_ipc_rr_client_t
Request-reply client handle.
rte_status_t rte_ipc_rr_request(rte_ipc_rr_client_t client, const void *request_data, size_t request_size, void *reply_out, size_t reply_size, rte_duration_ms_t timeout_ms)
Send request and wait for reply (blocking with timeout).
rte_status_t rte_ipc_rr_client_create(rte_ipc_rr_client_t *handle_out, const rte_ipc_rr_client_config_t *config)
Create a request-reply client connection.
Configuration for request-reply client.
Incoming request with context for sending reply.
Configuration for request-reply server.
Query message: Train asks for signal state.
Reply message: Signal state and limits.
uint32_t track_speed_limit