OpenLcbCLib 1.0 Alpha
OpenSource C Library to create OpenLcb/Lcc Nodes
Loading...
Searching...
No Matches
openlcb_main_statemachine.h
Go to the documentation of this file.
1
40#ifndef __OPENLCB_OPENLCB_MAIN_STATEMACHINE__
41#define __OPENLCB_OPENLCB_MAIN_STATEMACHINE__
42
43#include <stdbool.h>
44#include <stdint.h>
45
46#include "openlcb_types.h"
47
51typedef struct {
52
53 // =========================================================================
54 // Resource Management (all REQUIRED)
55 // =========================================================================
56
58 void (*lock_shared_resources)(void);
59
61 void (*unlock_shared_resources)(void);
62
64 bool (*send_openlcb_msg)(openlcb_msg_t *outgoing_msg);
65
66 // =========================================================================
67 // Clock Access (REQUIRED)
68 // =========================================================================
69
71 uint8_t (*get_current_tick)(void);
72
73 // =========================================================================
74 // Node Enumeration (all REQUIRED)
75 // =========================================================================
76
78 openlcb_node_t *(*openlcb_node_get_first)(uint8_t key);
79
81 openlcb_node_t *(*openlcb_node_get_next)(uint8_t key);
82
84 bool (*openlcb_node_is_last)(uint8_t key);
85
87 uint16_t (*openlcb_node_get_count)(void);
88
89 // =========================================================================
90 // Core Handlers (all REQUIRED)
91 // =========================================================================
92
94 void (*load_interaction_rejected)(openlcb_statemachine_info_t *statemachine_info);
95
96 // =========================================================================
97 // Required Message Network Protocol Handlers
98 // =========================================================================
99
101 void (*message_network_initialization_complete)(openlcb_statemachine_info_t *statemachine_info);
102
104 void (*message_network_initialization_complete_simple)(openlcb_statemachine_info_t *statemachine_info);
105
107 void (*message_network_verify_node_id_addressed)(openlcb_statemachine_info_t *statemachine_info);
108
110 void (*message_network_verify_node_id_global)(openlcb_statemachine_info_t *statemachine_info);
111
113 void (*message_network_verified_node_id)(openlcb_statemachine_info_t *statemachine_info);
114
116 void (*message_network_optional_interaction_rejected)(openlcb_statemachine_info_t *statemachine_info);
117
119 void (*message_network_terminate_due_to_error)(openlcb_statemachine_info_t *statemachine_info);
120
121 // =========================================================================
122 // Required Protocol Support (PIP) Handlers
123 // =========================================================================
124
126 void (*message_network_protocol_support_inquiry)(openlcb_statemachine_info_t *statemachine_info);
127
129 void (*message_network_protocol_support_reply)(openlcb_statemachine_info_t *statemachine_info);
130
131 // =========================================================================
132 // Internal functions (exposed for unit testing)
133 // =========================================================================
134
136 void (*process_main_statemachine)(openlcb_statemachine_info_t *statemachine_info);
137
139 bool (*does_node_process_msg)(openlcb_statemachine_info_t *statemachine_info);
140
142 bool (*handle_outgoing_openlcb_message)(void);
143
145 bool (*handle_try_reenumerate)(void);
146
148 bool (*handle_try_pop_next_incoming_openlcb_message)(void);
149
151 bool (*handle_try_enumerate_first_node)(void);
152
154 bool (*handle_try_enumerate_next_node)(void);
155
156 // =========================================================================
157 // Optional SNIP Handlers (NULL = Interaction Rejected)
158 // =========================================================================
159
161 void (*snip_simple_node_info_request)(openlcb_statemachine_info_t *statemachine_info);
162
164 void (*snip_simple_node_info_reply)(openlcb_statemachine_info_t *statemachine_info);
165
166 // =========================================================================
167 // Optional Event Transport Handlers (NULL = Interaction Rejected)
168 // =========================================================================
169
171 void (*event_transport_consumer_identify)(openlcb_statemachine_info_t *statemachine_info);
172
174 void (*event_transport_consumer_range_identified)(openlcb_statemachine_info_t *statemachine_info);
175
177 void (*event_transport_consumer_identified_unknown)(openlcb_statemachine_info_t *statemachine_info);
178
180 void (*event_transport_consumer_identified_set)(openlcb_statemachine_info_t *statemachine_info);
181
183 void (*event_transport_consumer_identified_clear)(openlcb_statemachine_info_t *statemachine_info);
184
186 void (*event_transport_consumer_identified_reserved)(openlcb_statemachine_info_t *statemachine_info);
187
189 void (*event_transport_producer_identify)(openlcb_statemachine_info_t *statemachine_info);
190
192 void (*event_transport_producer_range_identified)(openlcb_statemachine_info_t *statemachine_info);
193
195 void (*event_transport_producer_identified_unknown)(openlcb_statemachine_info_t *statemachine_info);
196
198 void (*event_transport_producer_identified_set)(openlcb_statemachine_info_t *statemachine_info);
199
201 void (*event_transport_producer_identified_clear)(openlcb_statemachine_info_t *statemachine_info);
202
204 void (*event_transport_producer_identified_reserved)(openlcb_statemachine_info_t *statemachine_info);
205
207 void (*event_transport_identify_dest)(openlcb_statemachine_info_t *statemachine_info);
208
210 void (*event_transport_identify)(openlcb_statemachine_info_t *statemachine_info);
211
213 void (*event_transport_learn)(openlcb_statemachine_info_t *statemachine_info);
214
216 void (*event_transport_pc_report)(openlcb_statemachine_info_t *statemachine_info);
217
219 void (*event_transport_pc_report_with_payload)(openlcb_statemachine_info_t *statemachine_info);
220
221 // =========================================================================
222 // Optional Train Protocol Handlers (NULL = Interaction Rejected)
223 // =========================================================================
224
226 void (*train_control_command)(openlcb_statemachine_info_t *statemachine_info);
227
229 void (*train_control_reply)(openlcb_statemachine_info_t *statemachine_info);
230
231 // =========================================================================
232 // Optional Train SNIP Handlers (NULL = Interaction Rejected)
233 // =========================================================================
234
236 void (*simple_train_node_ident_info_request)(openlcb_statemachine_info_t *statemachine_info);
237
239 void (*simple_train_node_ident_info_reply)(openlcb_statemachine_info_t *statemachine_info);
240
241 // =========================================================================
242 // Optional Datagram Handlers (NULL = Interaction Rejected)
243 // =========================================================================
244
246 void (*datagram)(openlcb_statemachine_info_t *statemachine_info);
247
249 void (*datagram_ok_reply)(openlcb_statemachine_info_t *statemachine_info);
250
252 void (*load_datagram_rejected)(openlcb_statemachine_info_t *statemachine_info, uint16_t error_code);
253
255 void (*datagram_rejected_reply)(openlcb_statemachine_info_t *statemachine_info);
256
257 // =========================================================================
258 // Optional Stream Handlers (NULL = Interaction Rejected)
259 // =========================================================================
260
262 void (*stream_initiate_request)(openlcb_statemachine_info_t *statemachine_info);
263
265 void (*stream_initiate_reply)(openlcb_statemachine_info_t *statemachine_info);
266
268 void (*stream_send_data)(openlcb_statemachine_info_t *statemachine_info);
269
271 void (*stream_data_proceed)(openlcb_statemachine_info_t *statemachine_info);
272
274 void (*stream_data_complete)(openlcb_statemachine_info_t *statemachine_info);
275
276 // =========================================================================
277 // Optional Broadcast Time Handler (NULL = not implemented)
278 // =========================================================================
279
281 void (*broadcast_time_event_handler)(openlcb_statemachine_info_t *statemachine_info, event_id_t event_id);
282
283 // =========================================================================
284 // Optional Train Search Handler (NULL = not implemented)
285 // =========================================================================
286
288 void (*train_search_event_handler)(openlcb_statemachine_info_t *statemachine_info, event_id_t event_id);
289
291 void (*train_search_no_match_handler)(openlcb_statemachine_info_t *statemachine_info, event_id_t event_id);
292
293 // =========================================================================
294 // Optional Train Emergency Event Handler (NULL = not implemented)
295 // =========================================================================
296
298 void (*train_emergency_event_handler)(openlcb_statemachine_info_t *statemachine_info, event_id_t event_id);
299
301
302#ifdef __cplusplus
303extern "C" {
304#endif /* __cplusplus */
305
315 const interface_openlcb_main_statemachine_t *interface_openlcb_main_statemachine);
316
323 extern void OpenLcbMainStatemachine_run(void);
324
331 openlcb_statemachine_info_t *statemachine_info);
332
333 // ---- Internal functions exposed for unit testing ----
334
337
340
343
346
349
356 openlcb_statemachine_info_t *statemachine_info);
357
364 openlcb_statemachine_info_t *statemachine_info);
365
368
369#ifdef __cplusplus
370}
371#endif /* __cplusplus */
372
373#endif /* __OPENLCB_OPENLCB_MAIN_STATEMACHINE__ */
bool OpenLcbMainStatemachine_handle_try_enumerate_first_node(void)
Starts node enumeration from the first node. Returns true if processed.
Definition openlcb_main_statemachine.c:996
bool OpenLcbMainStatemachine_handle_try_reenumerate(void)
Re-enters the state processor if the enumerate flag is set.
Definition openlcb_main_statemachine.c:932
bool OpenLcbMainStatemachine_does_node_process_msg(openlcb_statemachine_info_t *statemachine_info)
Address filter. Returns true if the node should process this message.
Definition openlcb_main_statemachine.c:223
void OpenLcbMainStatemachine_load_interaction_rejected(openlcb_statemachine_info_t *statemachine_info)
Builds an Interaction Rejected response for the current incoming message. Internal use.
Definition openlcb_main_statemachine.c:275
bool OpenLcbMainStatemachine_handle_try_enumerate_next_node(void)
Advances to the next node; frees message at end. Returns true if processed.
Definition openlcb_main_statemachine.c:1040
void OpenLcbMainStatemachine_run(void)
Runs one non-blocking step of protocol processing.
Definition openlcb_main_statemachine.c:1081
void OpenLcbMainStatemachine_initialize(const interface_openlcb_main_statemachine_t *interface_openlcb_main_statemachine)
Stores the callback interface and prepares internal state.
Definition openlcb_main_statemachine.c:107
void OpenLcbMainStatemachine_process_main_statemachine(openlcb_statemachine_info_t *statemachine_info)
MTI dispatcher. Routes incoming message to the correct handler.
Definition openlcb_main_statemachine.c:337
bool OpenLcbMainStatemachine_handle_try_pop_next_incoming_openlcb_message(void)
Pops the next message from the FIFO (thread-safe). Returns true if popped.
Definition openlcb_main_statemachine.c:957
openlcb_statemachine_info_t * OpenLcbMainStatemachine_get_statemachine_info(void)
Returns pointer to internal static state machine info. For unit testing only — do not modify.
Definition openlcb_main_statemachine.c:1122
bool OpenLcbMainStatemachine_handle_outgoing_openlcb_message(void)
Tries to send the pending message. Returns true if one was pending.
Definition openlcb_main_statemachine.c:892
Core type definitions, structures, and configuration constants for the OpenLCB library.
uint64_t event_id_t
64-bit Event ID.
Definition openlcb_types.h:340
Dependency-injection interface for the main state machine. Required pointers must be non-NULL; option...
Definition openlcb_main_statemachine.h:51
Core OpenLCB message structure.
Definition openlcb_types.h:480
OpenLCB virtual node.
Definition openlcb_types.h:679
Complete context passed to protocol handler functions.
Definition openlcb_types.h:743

Copyright (c) 2026 Jim Kueneman all rights reserved. See the License