Statistics
| Branch: | Revision:

urtware / doc / classdiagrams / pubsub.uml @ 056e40d2

History | View | Annotate | Download (11.725 KB)

1 4d55cea4 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..2020  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
/'### INTRO ##################################################################'/
23
24
@startuml
25
26
title **µRtWare**\nPublish-Subscribe System
27
28
!include ../functions.iuml
29
30
/'### ENTITIES ###############################################################'/
31
32
!startsub ENTITIES
33
34
/' Message type. '/
35
$structure("urt_message_t") {
36
    'Pointer to the next message in a list.
37
  + {field} next : urt_message_t*
38
    'Pointer to some arbitrary (reusable) payload object.
39
  + {field} payload : void*
40
    'Origin time of the message.
41
  + {field} originTime : urt_osTime_t
42
    'Mutex lock for exclusive access.
43
  + {field} lock : urt_osMutex_t
44
    'Counter of HRT subscribers that did not consume the message yet.
45
  + {field} numHrtConsumersLeft : unsigned int
46
  .. URT_CFG_PUBSUB_PROFILING == true ..
47
    'Counter of overall subscribers that did not consume the message yet.
48
  + {field} numConsumersLeft : unsigned int
49
  __
50
    'Initializes a urt_message_t object.
51
  + {method} urtMessageInit (message : urt_message_t*, payload : void*) : urt_status_t
52
}
53
54
$group("subscriber") {
55
  $group("real-time constraint data") {
56
    /' The top level RT constraints structure. '/
57
    $structure("urt_rtdata_t") {
58
        'The actual RT constraint class.
59
      + {field} class : urt_rtconstraintclass_t
60
        'Parameters of the RT constraints.
61
      + {field} params : urt_rtconstraintsparams_t
62
    }
63
64
    /' Descriptor to distinguish the four RT classes. '/
65
    $enumeration("urt_rtclass_t") {
66
        'Hard real-time.
67
      URT_RTCLASS_HARD = 0
68
        'Firm real-time.
69
      URT_RTCLASS_FIRM = 1
70
        'Soft real-time.
71
      URT_RTCLASS_SOFT = 2
72
        'No real-time at all.
73
      URT_RTCLASS_NONE = 3
74
    }
75
76
    /' Union structure, holding RT constraints parameters. '/
77
    $union("urt_rtclassdata_t") {
78
        'Parameters for hard real-time.
79
      + {field} hrt : urt_hrtparams_t
80
        'Parameters for firm real-time.
81
      + {field} frt : urt_frtparams_t
82
        'Parameters for soft real-time.
83
      + {field} srt : urt_srtparans_t
84
        'Parameters for non-real-time.
85
      + {field} nrt : urt_nrtparams_t
86
    }
87
88
    /' Parameters for hard real-time. '/
89
    $structure("urt_hrtdata_t") {
90
        'Pointer to the next HRT subscriber in a list.
91
      + {field} next : urt_subscriber_t*
92
      .. URT_CFG_PUBSUB_QOS_DEADLINECHECKS == true ..
93
        'QoS Timer to detect missed deadlines.
94
      + {field} qosDeadlineTimer : urt_osTimer_t
95
        'Maximum temporal offset between creation and consumption of messages.
96
      + {field} deadlineOffset : urt_delay_t
97
      .. URT_CFG_PUBSUB_QOS_RATECHECKS == true ..
98
        'Expected rate at which data is published.
99
      + {field} expectedRate : urt_delay_t
100 056e40d2 Thomas Schöpping
      .. URT_CFG_PUBSUB_PROFILING == true || URT_CFG_PUBSUB_QOS_JITTERCHECKS == true ..
101 4d55cea4 Thomas Schöpping
        'Maximum expected jitter.
102
      + {field} maxJitter : urt_delay_t
103
        'Minimum latency ever detected (to calculate jitter).
104
      + {field} minLatency : urt_delay_t
105
        'Maximum latency ever detected (to calculate jitter).
106
      + {field} maxLatency : urt_delay_t
107
    }
108
109
    /' Parameters for firm real-time. '/
110
    $structure("urt_frtdata_t") {
111
      .. URT_CFG_PUBSUB_QOS_DEADLINECHECKS == true ..
112
        'Maximum temporal offset between creation and consumption of messages.
113
      + {field} deadlineOffset : urt_delay_t
114
      .. URT_CFG_PUBSUB_QOS_RATECHECKS == true ..
115
        'Expected rate at which data is published.
116
      + {field} expectedRate : urt_delay_t
117 056e40d2 Thomas Schöpping
      .. URT_CFG_PUBSUB_PROFILING == true || URT_CFG_PUBSUB_QOS_JITTERCHECKS == true ..
118 4d55cea4 Thomas Schöpping
        'Maximum expected jitter.
119
      + {field} maxJitter : urt_delay_t
120
        'Minimum latency ever detected (to calculate jitter).
121
      + {field} minLatency : urt_delay_t
122
        'Maximum latency ever detected (to calculate jitter).
123
      + {field} maxLatency : urt_delay_t
124
    }
125
126
    $group("SRT data") {
127
      /' Function type to be called when calculating the usefulness of a message. '/
128
      $function("urt_srtusefulnessfunc_t") {
129
          'Takes a delay and optionally parameters as arguments and returns a float in [0, 1].
130
        urt_srtusefulnessfunc_t (dt : urt_delay_t, params : void*) : float
131
      }
132
133
      /' Parameters for soft real-time. '/
134
      $structure("urt_srtdata_t") {
135
          'Callback to calculate usefulness of a message
136
        + {field} usefullnesscb : urt_srtusefulnessfunc_t*
137
          'Optional parameters for the callback function.
138
        + {field} cbparams : void*
139
      }
140
    } /'SRT data'/
141
142
    /' Parameters for non-real-time. '/
143
    $structure("urt_nrtdata_t") {
144
      'There are nor parameters in this case.
145
    }
146
  } /'real-time constraint data'/
147
148
  /' Subscriber type. '/
149
  $structure("urt_subscriber_t") {
150
      'Pointer to the topic, this subscriber subscribed to.
151
    + {field} topic : urt_topic_t*
152
      'Event listener to notify the node about new messages.
153
    + {field} evtListener : urt_osEventListener_t
154
      'Real-time class descriptor.
155 056e40d2 Thomas Schöpping
    + {field} rtdata : urt_rtdata_t
156 4d55cea4 Thomas Schöpping
      'Pointer to the message consumed most recently.
157
    + {field} lastMessage : urt_message_t*
158
      'Copy of the origin time of the message consumed most recently.
159
    + {field} lastMessageTime : urt_osTime_t
160
    .. URT_CFG_PUBSUB_PROFILING == true ..
161
      'Sum of all latencies.
162
    + {field} sumLatencies : uint64_t
163
      'Number of messages received.
164
    + {field} numMessagesReceived : uint64_t
165 056e40d2 Thomas Schöpping
    .. URT_CFG_PUBSUB_PROFILING == true ..
166 4d55cea4 Thomas Schöpping
      'Minimum latency ever detected (to calculate jitter).
167
    + {field} minLatency : urt_delay_t
168
      'Maximum latency ever detected (to calculate jitter).
169
    + {field} maxLatency : urt_delay_t
170
    __
171
      'Initializes a urt_subscriber_t object.
172
    + {method} urtSubscriberInit (subscriber : urt_subscriber_t*) : urt_status_t
173
      'Tries to subscribe to a topic as HRT subscriber, sets all according parameters and optionally contributes a list of messages to the topic.
174
    + {method} urtSubscriberSubscribeHrt (subscriber : urt_subscriber_t*, topic : urt_topic_t*, messages : urt_message_t*, deadline : urt_delay_t, rate : urt_delay_t, jitter : urt_delay_t) : urt_status_t
175
      'Tries to subscribe to a topic as FRT subscriber, sets all according parameters and optionally contributes a list of messages to the topic.
176
    + {method} urtSubscriberSubscribeFrt (subscriber : urt_subscriber_t*, topic : urt_topic_t*, messages : urt_message_t*, deadline : urt_delay_t, rate : urt_delay_t, jitter : urt_delay_t) : urt_status_t
177
      'Tries to subscribe to a topic as SRT subscriber, sets all according parameters and optionally contributes a list of messages to the topic.
178
    + {method} urtSubscriberSubscribeSrt (subscriber : urt_subscriber_t*, topic : urt_topic_t*, messages : urt_message_t*, usefulnesscb : urt_srtusefulnessfunc_t*, cbparams : void*) : urt_status_t
179
      'Tries to subscribe to a topic as NRT subscriber and optionally contributes a list of messages to the topic.
180
    + {method} urtSubscriberSubscribeNrt (subscriber : urt_subscriber_t*, topic : urt_topic_t*, messages : urt_message_t*) : urt_status_t
181
      'Unsubscribes from a topic.
182
    + {method} urtSubscriberUnsubscribe (subscriber : urt_subscriber_t*) : urt_status_t
183
      'Fetches the next message in the buffer, optionally copies the payload and optionally returns the latency.
184
    + {method} urtSubscriberFetchNextMessage (subscriber : urt_subscriber_t*, payload : void*, bytes : size_t, latency : urt_delay_t*) : urt_status_t
185
      'Fetches the latest message, optionally copies the payload and optionally returns the latency.
186
    + {method} urtSubscriberFetchLatestMessage (subscriber : urt_subscriber_t*, payload : void*, bytes : size_t, latency : urt_delay_t*) : urt_status_t
187
      'Calculates the usefulness of a message after the specified delay depending on the SRT or FRT (or HRT) parameters.
188
    + {method} urtSubscriberCalculateUsefulness (subscriber : urt_subscriber_t*, latency : urt_delay_t) : float
189
  }
190
} /'subscriber'/
191
192
/' Publisher type. '/
193
$structure("urt_publisher_t") {
194
    'Pointer to the topic for publishing.
195
  + {field} topic : urt_topic_t*
196
  .. URT_CFG_PROFILING == true ..
197
    'Counter of attempts to publish a message.
198
  + {field} publishAttempts : uint64_t
199
    'Counter of failed attempts to publish a message.
200
  + {field} publishFails : uint64_t
201
  __
202
    'Initializes a urt_publisher_t object and contributes an optional list of messages.
203
  + {method} urtPublisherInit (publisher : urt_publisher_t*, topic : urt_topic_t*, messages : urt_message_t*) : urt_status_t
204
    'Publishes a message via the associated topic.
205
  + {method} urtPublisherPublish (publisher : urt_publisher_t*, payload : void*, n : size_t, t : urt_osTime_t, timeout : urt_delay_t) : urt_status_t
206
}
207
208
/' Topic type. '/
209
$structure("urt_topic_t") {
210
    'Pointer to the next topic in a list.
211
  + {field} next : urt_topic_t*
212
    'Identifier of the topic.
213
  + {field} id : urt_topicid_t
214
    'Mutex lock for exclusive access.
215
  + {field} lock : urt_osMutex_t
216
    'Event source to inform all subscribers when a new message is published.
217
  + {field} evtSource : urt_osEventSource_t
218
    'Number of HRT subscribers.
219
  + {field} numHrtSubscribers : unsigned int
220
    'List of HRT subscribers, orderd by their expected rate (most critical first).
221
  + {field} hrtSubscribers : urt_subscriber_t*
222 056e40d2 Thomas Schöpping
    'Condition variable to inform waiting publishers when a blocked message becomes available.
223
  + {field} hrtReleased : urt_osCondvar_t
224 4d55cea4 Thomas Schöpping
    'Mandatory message, each Topic holds.
225
  + {field} mandatoryMessage : urt_message_t
226
    'Pointer to the latest message.
227
  + {field} latestMessage : urt_message_t*
228
  .. URT_CFG_PUBSUB_QOS_RATECHECKS == true ..
229
    'Timer to check for missed rates.
230
  + {field} qosRateTimer : urt_osTimer_t
231
  .. URT_CFG_PUBSUB_PROFILING == true ..
232
    'Variable to count how many (non-hrt) subscribers did not fetch a message before it was reused.
233
  + {field} numDiscardedMessages : uint64_t
234
    'Number of overall subscribers.
235
  + {field} numSubscribers : unsigned int
236
  __
237
    'Initializes an urt_topic_t object.
238
  + {method} urtTopicInit (topic : urt_topic_t*, id : urt_topicid_t) : urt_status_t
239
}
240
241
!endsub
242
243
/'### DEPENDENCIES & LAYOUT ##################################################'/
244
245
!startsub DEPENDENCIES
246
247
urt_srtdata_t "1" o-- "0..1" urt_srtusefulnessfunc_t
248
249
urt_rtclassdata_t "1" *-- "0..1" urt_hrtdata_t
250
urt_rtclassdata_t "1" *-- "0..1" urt_frtdata_t
251
urt_rtclassdata_t "1" *-- "0..1" urt_srtdata_t
252
urt_rtclassdata_t "1" *-- "0..1" urt_nrtdata_t
253
254
urt_rtdata_t "1" *-- "1" urt_rtclass_t
255
urt_rtdata_t "1" *-- "1" urt_rtclassdata_t
256
257
urt_hrtdata_t "1" o-up- "0..1" urt_subscriber_t
258
259
urt_message_t "1" o-- "0..1" urt_message_t
260
261
urt_subscriber_t "1" *-- "1" urt_rtdata_t
262
urt_subscriber_t "1" o- "0..1" urt_topic_t
263
urt_subscriber_t "1" o-- "0..1" urt_message_t
264
265
urt_publisher_t "1" o- "1" urt_topic_t
266
urt_publisher_t ..> urt_message_t
267
268
urt_topic_t "1" o-- "0..1" urt_topic_t
269
urt_topic_t "1" o- "0..1" urt_subscriber_t
270
urt_topic_t "1" o-- "1..1" urt_message_t
271
urt_topic_t "1" *-- "1" urt_message_t
272
273
!endsub
274
275
/'### OUTRO ##################################################################'/
276
277
@enduml