urtware / doc / classdiagrams / overview.uml @ e98c61a8
History | View | Annotate | Download (24.263 KB)
1 | 6ebd2388 | Thomas Schöpping | /' |
---|---|---|---|
2 | µRtWare is a lightweight publish/subscribe middleware for real-time |
||
3 | applications. It was developed as part of the software habitat for the |
||
4 | Autonomous Mini Robot [1] (AMiRo) but can be used for other purposes as well. |
||
5 | |||
6 | Copyright (C) 2018..2018 Thomas Schöpping et al. |
||
7 | |||
8 | This program is free software: you can redistribute it and/or modify |
||
9 | it under the terms of the GNU General Public License as published by |
||
10 | the Free Software Foundation, either version 3 of the License, or |
||
11 | (at your option) any later version. |
||
12 | |||
13 | This program is distributed in the hope that it will be useful, |
||
14 | but WITHOUT ANY WARRANTY; without even the implied warranty of |
||
15 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||
16 | GNU General Public License for more details. |
||
17 | |||
18 | You should have received a copy of the GNU General Public License |
||
19 | along with this program. If not, see <http://www.gnu.org/licenses/>. |
||
20 | '/ |
||
21 | |||
22 | @startuml |
||
23 | |||
24 | title **µRtWare**\nOverview\n |
||
25 | |||
26 | |||
27 | |||
28 | package "primitives" { |
||
29 | |||
30 | /' Temporal delay in microseconds. '/ |
||
31 | class urt_delay_t <<(T,lightblue)>> { |
||
32 | .. either .. |
||
33 | uint32_t |
||
34 | .. or .. |
||
35 | uint64_t |
||
36 | } |
||
37 | |||
38 | /' Well defined error codes. '/ |
||
39 | enum urt_status_t { |
||
40 | URT_STATUS_OK = 0 |
||
41 | URT_STATUS_WARNING = 1 |
||
42 | URT_STATUS_ERROR = -1 |
||
43 | } |
||
44 | |||
45 | /' Topic ID type. '/ |
||
46 | class urt_topicid_t <<(T,lightblue)>> { |
||
47 | 'configurable |
||
48 | uin8_t |
||
49 | .. or .. |
||
50 | uint16_t |
||
51 | .. or .. |
||
52 | uint32_t |
||
53 | .. or .. |
||
54 | uint64_t |
||
55 | } |
||
56 | |||
57 | 35c9457f | Thomas Schöpping | /' Just a function for debugging. '/ |
58 | class urt_debug <<(F,white)>> { |
||
59 | 'Checks the condition in debug mode. |
||
60 | + urtDebugAssert(condition : bool) : void |
||
61 | } |
||
62 | |||
63 | /' Node synchronization type. '/ |
||
64 | class urt_nodesync_t <<T,lightblue>> { |
||
65 | 'configurable |
||
66 | uin8_t |
||
67 | .. or .. |
||
68 | int8_t |
||
69 | .. or .. |
||
70 | uint16_t |
||
71 | .. or .. |
||
72 | int16_t |
||
73 | .. or .. |
||
74 | uint32_t |
||
75 | .. or .. |
||
76 | int32_t |
||
77 | .. or .. |
||
78 | uint64_t |
||
79 | .. or .. |
||
80 | int64_t |
||
81 | } |
||
82 | |||
83 | 6ebd2388 | Thomas Schöpping | } /' package "primitives" '/ |
84 | |||
85 | |||
86 | |||
87 | package "interfaces" { |
||
88 | |||
89 | 35c9457f | Thomas Schöpping | /' Not a type but a set of configuration macros. '/ |
90 | class urt_config <<(C,grey)>> { |
||
91 | 'Selection to en-/disable debug checks. |
||
92 | + URT_CONFIG_DEBUG : bool |
||
93 | } |
||
94 | |||
95 | 6ebd2388 | Thomas Schöpping | /' OS time type with arbitrary resolution. '/ |
96 | class urt_osTime_t <<(T,lightblue)>> { |
||
97 | 'Converts an OS time to 64 bit microsecond precise value. |
||
98 | + urtTime2Us (t : urt_osTime_t*) : uint64_t |
||
99 | 'Retrieves the current time. |
||
100 | + urtTimeNow (void) : urt_osTime_t |
||
101 | } |
||
102 | |||
103 | /' OS mutex lock interface. '/ |
||
104 | class urt_osMutex_t <<(T,lightblue)>> { |
||
105 | 'Initializes a urt_osMutex_t object. |
||
106 | + urtMutexInit (mutex : urt_osmutex_t*) : void |
||
107 | 'Block the thread until the mutex could be locked. |
||
108 | + urtMutexLock (mutex : urt_osmutex_t*) : void |
||
109 | 'Tries to lock the mutex, but does not block but immediately returns an indicator. |
||
110 | + urtMutexTryLock (mutex : urt_osmutex_t*) : bool |
||
111 | 'Unlocks a previously locked mutex. |
||
112 | + urtMutexUnlock (mutex : urt_osmutex_t*) : void |
||
113 | } |
||
114 | |||
115 | package "condition variable" { |
||
116 | |||
117 | /' Return type for the wait function on condition variables. '/ |
||
118 | enum urt_condvarStatus_t { |
||
119 | 'The condition variable has been signaled. |
||
120 | + URT_CONDVAR_STATUS_SIGNAL = 0 |
||
121 | 'The condition variable has been broadcasted. |
||
122 | + URT_CONDVAR_STATUS_BROADCAST = 1 |
||
123 | 'The wait function timed out. |
||
124 | + URT_CONDVAR_STATUS_TIMEOUT = 2 |
||
125 | } |
||
126 | |||
127 | /' Condition variable interface. '/ |
||
128 | class urt_osCondvar_t <<(T,lightblue)>> { |
||
129 | 'Initializes a urt_osCondvar_t object. |
||
130 | + urtCondvarInit (condvar : urt_osCondvar_t*) : void |
||
131 | 'Signals one thread that is waiting for the condition variable. |
||
132 | + urtConvarSignal (condvar : urt_osCondvar_t*) : void |
||
133 | 'Signals all threads that are waiting for the condition variable. |
||
134 | + urtCondvarBroadcast (condvar : urt_osCondvar_t*) : void |
||
135 | 'Waits for the condition variable. |
||
136 | + urtCondvarWait (condvar : urt_osCondvar_t*, mutex : urt_osMutex_t*, timeout : urt_delay_t) : urt_condvarStatus_t |
||
137 | } |
||
138 | urt_osCondvar_t ..> urt_osMutex_t |
||
139 | urt_osCondvar_t ..> urt_delay_t |
||
140 | urt_osCondvar_t ..> urt_condvarStatus_t |
||
141 | |||
142 | } /' package "condition variable" '/ |
||
143 | |||
144 | package "timer" { |
||
145 | |||
146 | /' Timer callback definition. '/ |
||
147 | class urt_osTimerCallback_t <<(T,lightblue)>> { |
||
148 | urt_osTimerCallback_t (parameter : void*) : void |
||
149 | } |
||
150 | |||
151 | /' OS timer interface. '/ |
||
152 | class urt_osTimer_t <<(T,lightblue)>> { |
||
153 | 'Initializes an urt_osTimer_t object. |
||
154 | + urtTimerInit (timer : urt_osTimer_t*) : void |
||
155 | 'Sets the timer to a specified delay with specified callback and arguments. |
||
156 | + urtTimerSet (timer : urt_osTimer_t*, delay : urt_delay_t, callback : urt_osTimerCallback_t*, parameter : void*) : urt_status_t |
||
157 | 'Resets the timer. |
||
158 | + urtTimerReset (timer : urt_osTimer_t*) : urt_status_t |
||
159 | 'Check whether the timer is already armed. |
||
160 | + urtTimerIsArmed (timer : urt_timer_t*) : bool |
||
161 | } |
||
162 | urt_osTimer_t ..> urt_delay_t |
||
163 | urt_osTimer_t ..> urt_status_t |
||
164 | urt_osTimer_t ..> urt_osTimerCallback_t |
||
165 | |||
166 | } /' package "timer" '/ |
||
167 | |||
168 | package "thread" { |
||
169 | |||
170 | /' Thread priority type. '/ |
||
171 | class urt_osThreadPrio_t <<(T,lightblue)>> |
||
172 | |||
173 | /' Thread main function type. '/ |
||
174 | class urt_osThreadFunction_t <<(T,lightblue)>> { |
||
175 | urt_osThreadFunction_t (arg : void*) : void |
||
176 | } |
||
177 | |||
178 | /' Thread terminate signals. '/ |
||
179 | enum urt_osThreadTerminateSignal_t { |
||
180 | 'Signal to request termination asap. |
||
181 | URT_THREAD_TERMINATE_REQUEST = 15 |
||
182 | 'Signal to kill a thread immediately. |
||
183 | URT_THREAD_TERMINATE_KILL = 9 |
||
184 | } |
||
185 | |||
186 | 35c9457f | Thomas Schöpping | /' Thread execution states. '/ |
187 | enum urt_osThreadState_t { |
||
188 | 'Thread is currently being executed. |
||
189 | URT_THREAD_STATE_RUNNING = 0 |
||
190 | 'Thread is ready but waiting to be scheduled. |
||
191 | URT_THREAD_STATE_READY = 1 |
||
192 | 'Thread is actively sleeping. |
||
193 | URT_THREAD_STATE_SLEEPING = 2 |
||
194 | 'Thread has ben suspended explicitely. |
||
195 | URT_THREAD_STATE_SUSPENDED = 3 |
||
196 | 'Thread is waiting for something (e.g. Mutex, event, etc.). |
||
197 | URT_THREAD_STATE_WAITING = 4 |
||
198 | 'Thread has terminated. |
||
199 | URT_THREAD_STATE_TERMINATED = 5 |
||
200 | } |
||
201 | |||
202 | 6ebd2388 | Thomas Schöpping | /' OS thread interface. '/ |
203 | class urt_osThread_t <<(T,lightblue)>> { |
||
204 | 'Minimum priority for low priority threads. |
||
205 | + URT_THREAD_PRIO_LOW_MIN : urt_osThreadPrio_t |
||
206 | 'Maximum priority for low priority threads. |
||
207 | + URT_THREAD_PRIO_LOW_MAX : urt_osThreadPrio_t |
||
208 | 'Minimum priority for normal priority threads. |
||
209 | + URT_THREAD_PRIO_NORMAL_MIN : urt_osThreadPrio_t |
||
210 | 'Maximum priority for normal priority threads. |
||
211 | + URT_THREAD_PRIO_NORMAL_MAX : urt_osThreadPrio_t |
||
212 | 'Minimum priority for high priority threads. |
||
213 | + URT_THREAD_PRIO_HIGH_MIN : urt_osThreadPrio_t |
||
214 | 'Maximum priority for high priority threads. |
||
215 | + URT_THREAD_PRIO_HIGH_MAX : urt_osThreadPrio_t |
||
216 | 'Minimum priority for real-time threads. |
||
217 | + URT_THREAD_PRIO_RT_MIN : urt_osThreadPrio_t |
||
218 | 'Maximum priority for real-time threads. |
||
219 | + URT_THREAD_PRIO_RT_MAX : urt_osThreadPrio_t |
||
220 | .. |
||
221 | 'Maximum sleep interval in seconds (as float). |
||
222 | + URT_THREAD_MAX_SLEEP : float |
||
223 | 'Maximum sleep interval in seconds. |
||
224 | + URT_THREAD_MAX_SSLEP : unsigned int |
||
225 | 'Maximum sleep interval in milliseconds. |
||
226 | + URT_THREAD_MAX_MSLEEP : unsigned int |
||
227 | 'Maximum sleep interval in microseconds. |
||
228 | + URT_THREAD_MAX_USLEEP : unsigned int |
||
229 | __ |
||
230 | 'Macro to setup working area as static variable (handles alignment if required). |
||
231 | 35c9457f | Thomas Schöpping | + URT_THREAD_WORKING_AREA (varname, stacksize) |
232 | 6ebd2388 | Thomas Schöpping | .. |
233 | 'Initializes an urt_osThread_t object. |
||
234 | + urtThreadInit (wa : void*, wasize : size_t, func : urt_osThreadFunction_t*, arg : void*) : urt_osThread_t* |
||
235 | 'Starts a thread. |
||
236 | + urtThreadStart (thread : urt_osThread_t*, prio : urt_osThreadPrio_t, arg : void*) : void |
||
237 | 'The calling threads yields. |
||
238 | + urtThreadYield (void) : void |
||
239 | 'Retrieves the priority of a thread. |
||
240 | + urtThreadGetPriority (thread : urt_osThread_t*) : urt_osThreadPrio_t |
||
241 | 'Sets the priority of a thread. |
||
242 | + urtThreadSetPriority (thread : urt_osThread_t*, prio : urt_osThreadPrio_t) : void |
||
243 | 'Retrieves the first thread in the list of children. |
||
244 | + urtThreadSuspend (void) : void |
||
245 | 'Wakes a suspended thread. |
||
246 | + urtThreadResume (thread : urt_osThread_t*) : urt_status_t |
||
247 | 'Suspends the calling thread for the specified time. |
||
248 | + urtThreadSleep (seconds : float) : void |
||
249 | 'Suspends the calling thread for the specified time. |
||
250 | + urtThreadSSleep (seconds : usnigned int) : void |
||
251 | 'Suspends the calling thread for the specified time. |
||
252 | + urtThreadMSleep (milliseconds : unsigned int) : void |
||
253 | 'Suspends the calling thread for the specified time. |
||
254 | + urtThreadUSleep (microseconds : unsigned int) : void |
||
255 | 'Suspends the calling thread until the specified time. |
||
256 | + urtThreadSleepUntil (time : urt_osTime_t) : void |
||
257 | 'The calling thread exits execution (terminates). |
||
258 | + urtThreadExit (void) : void |
||
259 | 'Terminates a specified thread. |
||
260 | + urtThreadTerminate (thread : urt_osThread_t*, sig : urt_osThreadTerminateSignal_t) : void |
||
261 | 'Waits until the specified thread terminates. |
||
262 | + urtThreadJoin (thread : urt_osThread_t*) : void |
||
263 | 35c9457f | Thomas Schöpping | 'Retrieves the execution state of the specified thread. |
264 | + urtThreadGetState (thread : urt_osThread_t*) : urt_osThreadState_t |
||
265 | 'Retrieves the first child of a thread (or ""NULL""). |
||
266 | + urtThreadGetChildren (thread : urt_osThread_t*) : urt_osThread_t* |
||
267 | 'Retrieves a sibling (next child in a list) of the thread or ""NULL"". |
||
268 | + urtThreadGetSibling (thread : urt_osThread_t*) : urt_psThread_t* |
||
269 | 6ebd2388 | Thomas Schöpping | } |
270 | urt_osThread_t ..> urt_osThreadPrio_t |
||
271 | urt_osThread_t ..> urt_osThreadFunction_t |
||
272 | urt_osThread_t ..> urt_osTime_t |
||
273 | urt_osThread_t ..> urt_osThreadTerminateSignal_t |
||
274 | 35c9457f | Thomas Schöpping | urt_osThread_t ..> urt_osThreadState_t |
275 | 6ebd2388 | Thomas Schöpping | |
276 | } /' package "thread" '/ |
||
277 | |||
278 | package "events" { |
||
279 | |||
280 | /' OS event mask type. '/ |
||
281 | 35c9457f | Thomas Schöpping | class urt_osEventMask_t <<(T,lightblue)>> { |
282 | 'The event mask, which will be handled with maximum priority by the event system. |
||
283 | + URT_EVENTMASK_MAXPRIO : urt_osEventMask_t |
||
284 | } |
||
285 | 6ebd2388 | Thomas Schöpping | |
286 | /' OS event flag type. '/ |
||
287 | class urt_osEventFlags_t <<(T,lightblue)>> |
||
288 | |||
289 | enum urt_osEventWaitType_t { |
||
290 | URT_EVENT_WAIT_ONE = 0 |
||
291 | URT_EVENT_WAIT_ANY = 1 |
||
292 | URT_EVENT_WAIT_ALL = 2 |
||
293 | } |
||
294 | |||
295 | /' OS event listener interface. '/ |
||
296 | class urt_osEventListener_t <<(T,lightblue)>> { |
||
297 | 'Initializes an urt_osEventListener_t object. |
||
298 | + urtEventListenerInit (listener : urt_osEventListener_t*) : void |
||
299 | 'Retrieves the flags of the event listener. |
||
300 | + urtEventListenerGetFlags (listener : urt_osEventListener_t*) : urt_osEventFlags_t |
||
301 | 'Retrieves and clears the flags of the event listener. |
||
302 | + urtEventListenerClearFlags (listener : urt_osEventListener_t*) : urt_osEventFlags_t |
||
303 | } |
||
304 | urt_osEventListener_t ..> urt_osEventFlags_t |
||
305 | |||
306 | /' OS event source interface. '/ |
||
307 | class urt_osEventSource_t <<(T,lightblue)>> { |
||
308 | 'Initializes an urt_osEventSource_t object. |
||
309 | + urtEventSourceInit (source : urt_osEventSource_t*) : void |
||
310 | 'Emits an event. |
||
311 | + urtEventSourceBroadcast (source : urt_osEventSource_t*, flags : urt_osEventFlags_t) : void |
||
312 | } |
||
313 | urt_osEventSource_t ..> urt_osEventFlags_t |
||
314 | |||
315 | /' Not a class/type but a set of static event-related functions. '/ |
||
316 | class urt_events <<(F,white)>> { |
||
317 | 'Registers a lister to a source. |
||
318 | + urtEventRegister (source : urt_osEventSource_t*, listener : urt_osEventListener_t*, mask : urt_osEventMask_t) : urt_status_t |
||
319 | 'Unregisters a listener from a source. |
||
320 | + urtEventUnregister (source _ urt_osEventSource_t*, listener : urt_osEventListener_t*) : urt_status_t |
||
321 | 'Blocks the thread until any event occurs or the timeout expires. |
||
322 | + urtEventWait (type : urt_osEventWaitType_t, timeout : urt_delay_t) : urt_osEventMask_t |
||
323 | } |
||
324 | urt_events ..> urt_osEventSource_t |
||
325 | urt_events ..> urt_osEventListener_t |
||
326 | urt_events ..> urt_osEventMask_t |
||
327 | urt_events ..> urt_status_t |
||
328 | urt_events ..> urt_osEventWaitType_t |
||
329 | urt_events ..> urt_delay_t |
||
330 | |||
331 | } /' package "events" '/ |
||
332 | |||
333 | 35c9457f | Thomas Schöpping | /' Not a class/type but a set of output-related functions. '/ |
334 | class urt_streams <<(F,white)>> { |
||
335 | 'Prints a formatted string to the standard output stream (stdout). |
||
336 | + urtPrintf(fmt : char*, ... ) : int |
||
337 | 'Prints a formatted string to the standard error stream (stderr). |
||
338 | + urtErrPrintf(fmt : char*, ... ) : int |
||
339 | } |
||
340 | |||
341 | 6ebd2388 | Thomas Schöpping | } /' package "interfaces" '/ |
342 | |||
343 | package "middleware" { |
||
344 | |||
345 | package "real-time class" { |
||
346 | |||
347 | /' The top level RT class structure. '/ |
||
348 | class urt_rtclass_t <<(S,lightgrey)>> { |
||
349 | 'The actual RT class. |
||
350 | + class : urt_rtclasstype_t |
||
351 | 'Parameters of the RT class. |
||
352 | + params : urt_rtclassparams_t |
||
353 | } |
||
354 | urt_rtclass_t "1" *-- "1" urt_rtclasstype_t |
||
355 | urt_rtclass_t "1" *-- "1" urt_rtclassparams_t |
||
356 | |||
357 | /' Descriptor to distinguish the four RT classes. '/ |
||
358 | enum urt_rtclasstype_t { |
||
359 | 'Hard real-time. |
||
360 | URT_RTCLASS_HARD = 0 |
||
361 | 'Firm real-time. |
||
362 | URT_RTCLASS_FIRM = 1 |
||
363 | 'Soft real-time. |
||
364 | URT_RTCLASS_SOFT = 2 |
||
365 | 'No real-time at all. |
||
366 | URT_RTCLASS_NONE = 3 |
||
367 | } |
||
368 | |||
369 | /' Union structure, holding RT class parameters. '/ |
||
370 | class urt_rtclassparams_t <<(U,lightgreen)>> { |
||
371 | 'Parameters for hard real-time. |
||
372 | + hrt : urt_hrtparams_t |
||
373 | 'Parameters for firm real-time. |
||
374 | + frt : urt_frtparams_t |
||
375 | 'Parameters for soft real-time. |
||
376 | + srt : urt_srtparans_t |
||
377 | 'Parameters for non-real-time. |
||
378 | + nrt : urt_nrtparams_t |
||
379 | } |
||
380 | urt_rtclassparams_t "1" *-- "0..1" urt_hrtparams_t |
||
381 | urt_rtclassparams_t "1" *-- "0..1" urt_frtparams_t |
||
382 | urt_rtclassparams_t "1" *-- "0..1" urt_srtparams_t |
||
383 | urt_rtclassparams_t "1" *-- "0..1" urt_nrtparams_t |
||
384 | |||
385 | /' Parameters for hard real-time. '/ |
||
386 | class urt_hrtparams_t <<(S,lightgrey)>> { |
||
387 | 'Maximum temporal offset between creation and consumption of messages. |
||
388 | + deadlineOffset : urt_delay_t |
||
389 | 'Expected rate at which data is published. |
||
390 | + expectedRate : urt_delay_t |
||
391 | 'QoS timer to detected missed deadlines. |
||
392 | + qosTimer : urt_osTimer_t |
||
393 | } |
||
394 | urt_hrtparams_t ..> urt_delay_t |
||
395 | urt_hrtparams_t "1" *-- "1" urt_osTimer_t |
||
396 | |||
397 | /' Parameters for firm real-time. '/ |
||
398 | class urt_frtparams_t <<(S,lightgrey)>> { |
||
399 | 'Maximum temporal offset between creation and consumption of messages. |
||
400 | + deadlineOffset : urt_delay_t |
||
401 | 'Expected rate at which data is published. |
||
402 | + expectedRate : urt_delay_t |
||
403 | 'QoS Timer to detect missed deadlines. |
||
404 | + qosTimer : urt_osTimer_t |
||
405 | 'Callback function for the QoS timer. |
||
406 | + callback : urt_osTimerCallback_t |
||
407 | 'Parameters for the callback function. |
||
408 | + cbparams : void* |
||
409 | } |
||
410 | urt_frtparams_t ..> urt_delay_t |
||
411 | urt_frtparams_t "1" *-- "1" urt_osTimer_t |
||
412 | urt_frtparams_t "1" *-- "1" urt_osTimerCallback_t |
||
413 | |||
414 | /' Parameters for soft real-time. '/ |
||
415 | class urt_srtparams_t <<(S,lightgrey)>> { |
||
416 | 'Callback function to calculate usefulness given a dleay. |
||
417 | + *usefulness (dt : urt_delay_t, params : void*) : float |
||
418 | 'Optional parameters for the callback function. |
||
419 | + params : void* |
||
420 | } |
||
421 | urt_srtparams_t ..> urt_delay_t |
||
422 | |||
423 | /' Parameters for non-real-time. '/ |
||
424 | class urt_nrtparams_t <<(S,lightgrey)>> { |
||
425 | 'There are nor parameters in this case. |
||
426 | } |
||
427 | |||
428 | } /' package "real-time class" '/ |
||
429 | |||
430 | |||
431 | |||
432 | /' Message type. '/ |
||
433 | class urt_message_t <<(S,lightgrey)>> { |
||
434 | 'Pointer to the next message in a list. |
||
435 | + next : urt_message_t* |
||
436 | 'Pointer to some arbitrary (reusable) payload object. |
||
437 | + payload : void* |
||
438 | 'Origin time of the message. |
||
439 | + originTime : urt_osTime_t |
||
440 | 'Mutex lock for exclusive access. |
||
441 | + lock : urt_osMutex_t |
||
442 | 'Counter of HRT subscribers that did not consume the message yet. |
||
443 | + numHrtConsumersLeft : unsigned int |
||
444 | 'Condition variable to inform waiting publishers when the message is available again. |
||
445 | + hrtConsumersLeft : urt_osCondvar_t |
||
446 | -- evaluation data -- |
||
447 | 'Counter of overall subscribers that did not consume the message yet. |
||
448 | + numConsumersLeft : unsigned int |
||
449 | __ |
||
450 | 'Initializes a urt_message_t object. |
||
451 | + urtMessageInit (message : urt_message_t*, payload : void*) : urt_status_t |
||
452 | } |
||
453 | urt_message_t "1" o-- "0..1" urt_message_t |
||
454 | urt_message_t "1" *-- "1" urt_osTime_t |
||
455 | urt_message_t "1" *-- "1" urt_osMutex_t |
||
456 | urt_message_t "1" *-- "1" urt_osCondvar_t |
||
457 | |||
458 | /' Subscriber type. '/ |
||
459 | class urt_subscriber_t <<(S,lightgrey)>> { |
||
460 | 'Pointer to the next subscriber in a list. |
||
461 | + next : urt_subscriber_t* |
||
462 | 'Pointer to the topic, this subscriber subscribed to. |
||
463 | + topic : urt_topic_t* |
||
464 | 'Event listener to notify the node about new messages. |
||
465 | + evtListener : urt_osEventListener_t |
||
466 | 'Real-time class descriptor. |
||
467 | + rtclass : urt_rtclass_t |
||
468 | 'Pointer to the message consumed most recently. |
||
469 | + lastMessage : urt_message_t* |
||
470 | 'Copy of the origin time of the message consumed most recently. |
||
471 | + lastMessageTime : urt_osTime_t |
||
472 | -- evaluation data -- |
||
473 | 'Minimum latency ever detected. |
||
474 | + minLatency : urt_delay_t |
||
475 | 'Maximum latency ever detected. |
||
476 | + maxLatency : urt_delay_t |
||
477 | 'Sum of all latencies. |
||
478 | + sumLatencies : uint64_t |
||
479 | 'Number of messages received. |
||
480 | + numMessagesReceived : unsigned int |
||
481 | __ |
||
482 | 'Initializes a urt_subscriber_t object. |
||
483 | + urtSubscriberInit (subscriber : urt_subscriber_t*) : urt_status_t |
||
484 | 'Tries to subscribe to a topic and contributes an optional list of messages. |
||
485 | + urtSubscriberSubscribe (subscriber : urt_subscriber_t*, topic : urt_topic_t*, rtclass : urt_rtclass_t*, messages : urt_messages_t*) : urt_status_t |
||
486 | 'Unsubscribes from a topic. |
||
487 | + urtSubscriberUnsubscribe (subscriber : urt_subscriber_t*) : urt_status_t |
||
488 | e98c61a8 | Thomas Schöpping | 'Fetches either the next or the latest message and optionally copies the payload. |
489 | + urtSubscriberFetchMessage (subscriber : urt_subscriber_t*, payload : void*, bytes : size_t, latest : bool) : urt_status_t |
||
490 | 6ebd2388 | Thomas Schöpping | } |
491 | urt_subscriber_t "1" o-- "0..1" urt_subscriber_t |
||
492 | urt_subscriber_t "1" o-- "0..1" urt_topic_t |
||
493 | urt_subscriber_t "1" *-- "1" urt_osEventListener_t |
||
494 | urt_subscriber_t "1" *-- "1" urt_rtclass_t |
||
495 | urt_subscriber_t "1" o-- "0..1" urt_message_t |
||
496 | urt_subscriber_t "1" *-- "1" urt_osTime_t |
||
497 | urt_subscriber_t "1" *-- "2" urt_delay_t |
||
498 | urt_subscriber_t ..> urt_status_t |
||
499 | urt_subscriber_t ..> urt_topicid_t |
||
500 | |||
501 | /' Publisher type. '/ |
||
502 | class urt_publisher_t <<(S,lightgrey)>> { |
||
503 | 'Pointer to the topic for publishing. |
||
504 | + topic : urt_topic_t* |
||
505 | -- evaluation data -- |
||
506 | 'Counter of attempts to publish a message. |
||
507 | + publishAttempts : unsigned int |
||
508 | 'Counter of failed attempts to publish a message. |
||
509 | + publishFails : unsigned int |
||
510 | __ |
||
511 | 'Initializes a urt_publisher_t object and contributes an optional list of messages. |
||
512 | + urtPublisherInit (publisher : urt_publisher_t*, topic : urt_topic_t*, messages : urt_message_t*) : urt_status_t |
||
513 | 'Publishes a message via the associated topic. |
||
514 | + urtPublisherPublish (publisher : urt_publisher_t*, payload : void*, n : size_t, t : urt_osTime_t, timeout : urt_delay_t) : urt_status_t |
||
515 | } |
||
516 | urt_publisher_t "1" o-- "1" urt_topic_t |
||
517 | urt_publisher_t ..> urt_message_t |
||
518 | urt_publisher_t ..> urt_osTime_t |
||
519 | urt_publisher_t ..> urt_delay_t |
||
520 | urt_publisher_t ..> urt_status_t |
||
521 | |||
522 | /' Topic type. '/ |
||
523 | class urt_topic_t <<(S,lightgrey)>> { |
||
524 | 'Pointer to the next topic in a list. |
||
525 | + next : urt_topic_t* |
||
526 | 'Mutex lock for exclusive access. |
||
527 | 35c9457f | Thomas Schöpping | + lock : urt_osMutex_t |
528 | 6ebd2388 | Thomas Schöpping | 'Event source to inform all subscribers when a new message is published. |
529 | + evtSource : urt_osEventSource_t |
||
530 | 'Number of HRT subscribers. |
||
531 | + numHrtSubscribers : unsigned int |
||
532 | 'List of HRT subscribers, orderd by their expected rate (most critical first). |
||
533 | + hrtSubscribers : urt_subscriber_t* |
||
534 | 'Timer to check for missed rates. |
||
535 | + qosTimer : urt_osTimer_t |
||
536 | 'Mandatory message, each Topic holds. |
||
537 | + mandatoryMessage : urt_message_t |
||
538 | 'Pointer to the latest message. |
||
539 | + latestMessage : urt_message_t* |
||
540 | 'Identifier of the topic. |
||
541 | + id : urt_topicid_t |
||
542 | -- evaluation data -- |
||
543 | 'Variable to count how many (non-hrt) subscribers did not fetch a message before it was reused. |
||
544 | + numDiscardedMessages : unsigned int |
||
545 | 'Number of overall subscribers. |
||
546 | + numSubscribers : unsigned int |
||
547 | __ |
||
548 | 'Initializes an urt_topic_t object. |
||
549 | + urtTopicInit (topic : urt_topic_t*, id : urt_topicid_t) : urt_status_t |
||
550 | } |
||
551 | urt_topic_t "1" o-- "0..1" urt_topic_t |
||
552 | urt_topic_t "1" *-- "1" urt_osMutex_t |
||
553 | urt_topic_t "1" *-- "1" urt_osEventSource_t |
||
554 | urt_topic_t "1" o-- "0..*" urt_subscriber_t |
||
555 | urt_topic_t "1" *-- "1" urt_osTimer_t |
||
556 | urt_topic_t "1" o-- "1..*" urt_message_t |
||
557 | urt_topic_t "1" *-- "1" urt_message_t |
||
558 | urt_topic_t "1" *-- "1" urt_topicid_t |
||
559 | urt_topic_t ..> urt_osTime_t |
||
560 | urt_topic_t ..> urt_status_t |
||
561 | |||
562 | /' uRtWare core type. '/ |
||
563 | class urt_core_t <<(S,lightgrey)>> { |
||
564 | 'List of nodes ordered by their (initial) priority. |
||
565 | - {static} _nodes : urt_node_t* |
||
566 | 'List of topics ordered by their identifiers. |
||
567 | - {static} _topics : urt_topic_t* |
||
568 | 35c9457f | Thomas Schöpping | 'Event source for control events. |
569 | - {static} _evtSource : urt_osEventSource_t |
||
570 | 'Mutex used for synchronization. |
||
571 | - {static} _lock : urt_osMutex_t |
||
572 | 6ebd2388 | Thomas Schöpping | __ |
573 | 'Initializes the urt_core_t object. |
||
574 | + urtCoreInit (void) : urt_status_t |
||
575 | 35c9457f | Thomas Schöpping | 'Starts all node threads (nodes will block before the loop). |
576 | + urtCoreStartNodes (void) : urt_status_t |
||
577 | 'Nodes can use this function to synchronize globally. |
||
578 | + urtCoreSynchronizeNodes (node : urt_node_t*, stage : urt_nodesync_t) : urt_status_t |
||
579 | 6ebd2388 | Thomas Schöpping | 'Stops all nodes. |
580 | 35c9457f | Thomas Schöpping | + urtCoreStopNodes (void) : urt_status_t |
581 | 6ebd2388 | Thomas Schöpping | 'Retrieves a topic given an identifier. |
582 | + urtCoreRetrieveTopic (id : urt_topicid_t) : urt_topic_t* |
||
583 | } |
||
584 | urt_core_t "1" o-- "0..*" urt_topic_t |
||
585 | urt_core_t "1" o-- "0..*" urt_node_t |
||
586 | 35c9457f | Thomas Schöpping | urt_core_t "1" *-- "1" urt_osEventSource_t |
587 | urt_core_t "1" *-- "1" urt_osMutex_t |
||
588 | 6ebd2388 | Thomas Schöpping | urt_core_t ..> urt_status_t |
589 | 35c9457f | Thomas Schöpping | urt_core_t --> urt_nodesync_t |
590 | 6ebd2388 | Thomas Schöpping | urt_core_t ..> urt_topicid_t |
591 | |||
592 | package "node" { |
||
593 | |||
594 | /' Function type to be called during setup phase of node threads. '/ |
||
595 | class urt_nodeSetupCallback_t <<(T,lightblue)>> { |
||
596 | 35c9457f | Thomas Schöpping | 'Takes the node and optional parameters as arguments and returns a event mask for the next iteration. |
597 | urt_nodeSetupCallback_t (node : urt_node_t*, arg : void*) : urt_osEventMask_t |
||
598 | 6ebd2388 | Thomas Schöpping | } |
599 | urt_nodeSetupCallback_t ..> urt_node_t |
||
600 | urt_nodeSetupCallback_t ..> urt_status_t |
||
601 | |||
602 | /' Function type to be called during loop phase of node threads. '/ |
||
603 | class urt_nodeLoopCallback_t <<(T,lightblue)>> { |
||
604 | 35c9457f | Thomas Schöpping | 'Takes the node, a mask of occurred events and optional parameters as arguments and returns a event mask for the next iteration. |
605 | urt_nodeLoopCallback_t (node : urt_node_t*, events : urt_osEventMask_t, arg : void*) : urt_osEventMask_t |
||
606 | 6ebd2388 | Thomas Schöpping | } |
607 | urt_nodeLoopCallback_t ..> urt_node_t |
||
608 | urt_nodeLoopCallback_t ..> urt_osEventMask_t |
||
609 | urt_nodeLoopCallback_t ..> urt_status_t |
||
610 | |||
611 | /' Node type. '/ |
||
612 | class urt_node_t <<(S,lightgrey)>> { |
||
613 | 'Pointer to the next node in a list. |
||
614 | + next : urt_node_t* |
||
615 | 'Pointer to the nore thread. |
||
616 | + thread : urt_osThread_t* |
||
617 | 'Callback function to be called during the setup phase. |
||
618 | + setupcallback : urt_nodeSetupCallback_t* |
||
619 | 'Optional parameters for the setup callback function. |
||
620 | + setupparams : void* |
||
621 | 'Callback function to be called in each loop iteration. |
||
622 | + loopcallback : urt_nodeLoopCallback_t* |
||
623 | 'Optional parameters for the loop callback function. |
||
624 | + loopparams : void* |
||
625 | 35c9457f | Thomas Schöpping | 'Execution stage of the node. |
626 | + stage : urt_nodesync_t |
||
627 | 'Event listener for middleware-wide control events. |
||
628 | + listener : urt_osEventListener_t |
||
629 | 6ebd2388 | Thomas Schöpping | __ |
630 | 'The main() function of the node thread. |
||
631 | - {static} _main : urt_osThreadFunction_t |
||
632 | 'Initializes an urt_node_t object. |
||
633 | + urtNodeInit (node : urt_node_t*, stacksize : size_t, setupcallback : urt_nodeSetupCallback_t*, setupparams : void*, loopcallback : urt_nodeLoopCallback_t*, loopparams : void*) : urt_status_t |
||
634 | } |
||
635 | urt_node_t "1" o-- "0..1" urt_node_t |
||
636 | urt_node_t "1" o-- "1" urt_osThread_t |
||
637 | urt_node_t "1" o-- "1" urt_nodeSetupCallback_t |
||
638 | urt_node_t "1" o-- "1" urt_nodeLoopCallback_t |
||
639 | 35c9457f | Thomas Schöpping | urt_node_t "1" *-- "1" urt_nodesync_t |
640 | 6ebd2388 | Thomas Schöpping | urt_node_t "1" *-- "1" urt_osEventMask_t |
641 | urt_node_t "1" *-- "1" urt_osEventWaitType_t |
||
642 | 35c9457f | Thomas Schöpping | urt_node_t "1" *-- "1" urt_osEventListener_t |
643 | 6ebd2388 | Thomas Schöpping | urt_node_t ..> urt_osThreadTerminateSignal_t |
644 | |||
645 | } /' package "node" '/ |
||
646 | |||
647 | } /' package "middleware" '/ |
||
648 | |||
649 | @enduml |