urtware / doc / classdiagrams / rpc.uml @ 64fde4ba
History | View | Annotate | Download (10.741 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**\nRemote Procedure Call System |
||
27 | |||
28 | dd31cb03 | Thomas Schöpping | !include ./functions.iuml |
29 | 4d55cea4 | Thomas Schöpping | |
30 | /'### ENTITIES ###############################################################'/ |
||
31 | |||
32 | !startsub ENTITIES |
||
33 | |||
34 | 2d315870 | Thomas Schöpping | $group("request") { |
35 | /' Base request structure type. '/ |
||
36 | $structure("urt_baserequest_t") { |
||
37 | 'Pointer to the previous request in a queue. |
||
38 | + {field} prev : urt_baserequest_t* |
||
39 | 'Pointer to the next request in a queue. |
||
40 | + {field} next : urt_baserequest_t* |
||
41 | 'Lock for exclusive access. |
||
42 | + {field} lock : urt_osMutex_t |
||
43 | 'Pointer to the owning service. |
||
44 | + {field} owner : urt_service_t* |
||
45 | 'Time when the request was submitted. |
||
46 | + {field} submissionTime : urt_osTime_t |
||
47 | 'Pointer to an optional payload of the service request. |
||
48 | + {field} payload : void* |
||
49 | 'Source for service events. |
||
50 | + {field} evtSource : urt_osEventSource_t |
||
51 | 'Listener to service events. |
||
52 | + {field} evtListener : urt_osEventListener_t |
||
53 | .. URT_CFG_RPC_PROFILING == true .. |
||
54 | 'Sum of all latencies. |
||
55 | + {field} sumLatencies : uint64_t |
||
56 | 'Number of calls emitted. |
||
57 | + {field} numCalls : uint64_t |
||
58 | 'Number of calls that were not processed successfully. |
||
59 | + {field} numFails : uint64_t |
||
60 | } |
||
61 | |||
62 | /' NRT request type. '/ |
||
63 | $structure("urt_nrtrequest_t") { |
||
64 | .. URT_CFG_RPC_PROFILING == true .. |
||
65 | 'Minimum latency ever detected. |
||
66 | + {field} minLatency : urt_delay_t |
||
67 | 'Maximum latency ever detected. |
||
68 | + {field} maxLatency : urt_delay_t |
||
69 | __ |
||
70 | 'Initializes a urt_nrtrequest_t object. |
||
71 | + {method} urtNrtRequestInit (request : urt_nrtrequest_t*) : void |
||
72 | 'Acquire and lock an NRT request (blocking). |
||
73 | + {method} urtNrtRequestAcquire (request : urt_nrtrequest_t*) : urt_status_t |
||
74 | 'Try to acquire and lock an NRT request (non blocking). |
||
75 | + {method} urtNrtRequestTryAcquire (request : urt_nrtrequest_t*) : urt_status_t |
||
76 | 'Release an acquired/locked NRT request. |
||
77 | + {method} urtNrtRequestRelease (request : urt_nrtrequest_t*) : urt_status_t |
||
78 | 'Submit an NRT request to the specified service. |
||
79 | + {method} urtNrtRequestSubmit (request : urt_nrtrequest_t*, service : urt_service_t*) : urt_status_t |
||
80 | 'Retrieve an NRT request, thereby removing it from the service's request queue if required. |
||
81 | + {method} urtNrtRequestRetrieve (request : urt_nrtrequest_t*) : urt_status_t |
||
82 | } |
||
83 | |||
84 | /' SRT request type. '/ |
||
85 | $structure("urt_srtrequest_t") { |
||
86 | .. URT_CFG_RPC_PROFILING == true .. |
||
87 | 'Minimum latency ever detected. |
||
88 | + {field} minLatency : urt_delay_t |
||
89 | 'Maximum latency ever detected. |
||
90 | + {field} maxLatency : urt_delay_t |
||
91 | __ |
||
92 | 'Initializes a urt_srtrequest_t object. |
||
93 | + {method} urtSrtRequestInit (request : urt_srtrequest_t*) : void |
||
94 | 'Acquire and lock an SRT request (blocking). |
||
95 | + {method} urtSrtRequestAcquire (request : urt_srtrequest_t*) : urt_status_t |
||
96 | 'Try to acquire and lock an SRT request (non blocking). |
||
97 | + {method} urtSrtRequestTryAcquire (request : urt_srtrequest_t*) : urt_status_t |
||
98 | 'Release an acquired/locked SRT request. |
||
99 | + {method} urtSrtRequestRelease (request : urt_srtrequest_t*) : urt_status_t |
||
100 | 'Submit an SRT request to the specified service. |
||
101 | + {method} urtSrtRequestSubmit (request : urt_srtrequest_t*, service : urt_service_t*) : urt_status_t |
||
102 | 'Retrieve an SRT request, thereby removing it from the service's request queue if required. |
||
103 | + {method} urtSrtRequestRetrieve (request : urt_srtrequest_t*) : urt_status_t |
||
104 | 'Calculate the usefulness on an SRT RPC response. |
||
105 | + {method} urtSrtCalculateUsefulness (request : urt_srtrequest_t*, usefulnesscb : urt_usefulness_f, cbparams : void*) : float |
||
106 | } |
||
107 | |||
108 | /' FRT request type. '/ |
||
109 | $structure("urt_frtrequest_t") { |
||
110 | .. URT_CFG_RPC_QOS_DEADLINECHECKS == true .. |
||
111 | 'Maximum temporal offset between sending and consuming the FRT request. |
||
112 | + {field} deadlineOffset : urt_delay_t |
||
113 | .. URT_CFG_RPC_QOS_JITTERCHECKS == true .. |
||
114 | 'Maximum expected jitter. |
||
115 | + {field} maxJitter : urt_delay_t |
||
116 | .. URT_CFG_RPC_QOS_JITTERCHECKS == true || URT_CFG_RPC_PROFILING == true .. |
||
117 | 'Minimum latency ever detected (to calculate jitter). |
||
118 | + {field} minLatency : urt_delay_t |
||
119 | 'Maximum latency ever detected (to calculate jitter). |
||
120 | + {field} maxLatency : urt_delay_t |
||
121 | __ |
||
122 | 'Initializes a urt_frtrequest_t object. |
||
123 | + {method} urtFrtRequestInit (request : urt_frtrequest_t*) : void |
||
124 | 'Acquire and lock an FRT request (blocking). |
||
125 | + {method} urtFrtRequestAcquire (request : urt_frtrequest_t*) : urt_status_t |
||
126 | 'Try to acquire and lock an FRT request (non blocking). |
||
127 | + {method} urtFrtRequestTryAcquire (request : urt_frtrequest_t*) : urt_status_t |
||
128 | 'Release an acquired/locked FRT request. |
||
129 | + {method} urtFrtRequestRelease (request : urt_frtrequest_t*) : urt_status_t |
||
130 | 'Submit an FRT request to the specified service. |
||
131 | + {method} urtFrtRequestSubmit (request : urt_frtrequest_t*, service : urt_service_t*, deadline : urt_delay_t) : urt_status_t |
||
132 | 'Retrieve an FRT request, thereby removing it from the service's request queue if required. |
||
133 | + {method} urtFrtRequestRetrieve (request : urt_frtrequest_t*) : urt_status_t |
||
134 | 'Calculate the validity on an FRT RPC response. |
||
135 | + {method} urtDrtCalculateValidity (request : urt_frtrequest_t) : bool |
||
136 | .. URT_CFG_RPC_QOS_JITTERCHECKS == true .. |
||
137 | 'Get a pointer to the request's maximum jitter value. |
||
138 | + {method} urtFrtRequestGetMaxJitter(request : urt_frtrequest_t*) : urt_delay_t* const |
||
139 | } |
||
140 | |||
141 | /' HRT request type. '/ |
||
142 | $structure("urt_hrtrequest_t") { |
||
143 | .. URT_CFG_RPC_QOS_DEADLINECHECKS == true .. |
||
144 | 'Maximum temporal offset between sending and consuming the HRT request. |
||
145 | + {field} deadlineOffset : urt_delay_t |
||
146 | .. URT_CFG_RPC_QOS_JITTERCHECKS == true .. |
||
147 | 'Maximum expected jitter. |
||
148 | + {field} maxJitter : urt_delay_t |
||
149 | .. URT_CFG_RPC_QOS_DEADLINECHECKS == true || URT_CFG_RPC_QOS_JITTERCHECKS == true .. |
||
150 | 'QoS timer to detect missed deadlines and/or jitter. |
||
151 | + {field} qosTimer : urt_osTimer_t |
||
152 | .. URT_CFG_RPC_QOS_JITTERCHECKS == true || URT_CFG_RPC_PROFILING == true .. |
||
153 | 'Minimum latency ever detected (to calculate jitter). |
||
154 | + {field} minLatency : urt_delay_t |
||
155 | 'Maximum latency ever detected (to calculate jitter). |
||
156 | + {field} maxLatency : urt_delay_t |
||
157 | __ |
||
158 | 'Initializes a urt_hrtrequest_t object. |
||
159 | + {method} urtHrtRequestInit (request : urt_hrtrequest_t*) : void |
||
160 | 'Acquire and lock an HRT request (blocking). |
||
161 | + {method} urtHrtRequestAcquire (request : urt_hrtrequest_t*) : urt_status_t |
||
162 | 'Try to acquire and lock an HRT request (non blocking). |
||
163 | + {method} urtHrtRequestTryAcquire (request : urt_hrtrequest_t*) : urt_status_t |
||
164 | 'Release an acquired/locked HRT request. |
||
165 | + {method} urtHrtRequestRelease (request : urt_hrtrequest_t*) : urt_status_t |
||
166 | 'Submit an HRT request to the specified service. |
||
167 | + {method} urtHrtRequestSubmit (request : urt_hrtrequest_t*, service : urt_service_t*, deadline : urt_delay_t) : urt_status_t |
||
168 | 'Retrieve an HRT request, thereby removing it from the service's request queue if required. |
||
169 | + {method} urtHrtRequestRetrieve (request : urt_hrtrequest_t*) : urt_status_t |
||
170 | .. URT_CFG_RPC_QOS_JITTERCHECKS == true .. |
||
171 | 'Get a pointer to the request's maximum jitter value. |
||
172 | + {method} urtHrtRequestGetMaxJitter(request : urt_hrtrequest_t*) : urt_delay_t* const |
||
173 | } |
||
174 | 4d55cea4 | Thomas Schöpping | } |
175 | |||
176 | 056e40d2 | Thomas Schöpping | /' Service structure type. '/ |
177 | $structure("urt_service_t") { |
||
178 | 'Pointer to the next service in a list. |
||
179 | + {field} next : urt_service_t* |
||
180 | 'Identifier of the service. |
||
181 | + {field} id : urt_serviceid_t |
||
182 | 2d315870 | Thomas Schöpping | 'Mutex lock for exclusive access. |
183 | 056e40d2 | Thomas Schöpping | + {field} lock : urt_osMutex_t |
184 | 2d315870 | Thomas Schöpping | 'Pointer to the first element in a queue of pending requests. |
185 | + {field} requestQueue_front : urt_baserequest_t* |
||
186 | 'Pointer to the last HRT request in a queue of pending requests. |
||
187 | + {field} requestQueue_hrtBack : urt_hrtrequest_t* |
||
188 | 'Pointer to the last FRT/SRT request in a queue pf pending requests. |
||
189 | + {field} requestQueue_fsrtBack : urt_baserequest_t* |
||
190 | 'Pointer to the last element in a queue of pending requests. |
||
191 | + {field} requestQueue_back : urt_baserequest_t* |
||
192 | 'Event source to be fired by requests. |
||
193 | + {field} evtSource : urt_osEventSource_t |
||
194 | 'Event listener to notify the service thread. |
||
195 | + {field} evtListener : urt_osEventListener_t |
||
196 | ee83a495 | Thomas Schöpping | .. URT_CFG_RPC_PROFILING == true .. |
197 | 2d315870 | Thomas Schöpping | 'Number of calls. |
198 | 056e40d2 | Thomas Schöpping | + {field} numCalls : uint64_t |
199 | 2d315870 | Thomas Schöpping | 'Number of lost ownerships. |
200 | + {field} numOwnershipLost : uint64_t |
||
201 | 4d55cea4 | Thomas Schöpping | __ |
202 | 056e40d2 | Thomas Schöpping | 'Initializes a urt_service_t object. |
203 | 2d315870 | Thomas Schöpping | + {method} urtServiceInit (service : urt_service_t*, id : urt_serviceid_t) : urt_status_t |
204 | 'Dispatch the next pending request. |
||
205 | + {method} urtServiceDispatch (service : urt_service_t*, payload : void*, bytes : size_t) : urt_baserequest_t* |
||
206 | 'Acquire and lock the specified request (blocking). |
||
207 | + {method} urtServiceAcquireRequest (service* urt_serviceid_t*, request : urt_baserequest_t*) : urt_status_t |
||
208 | 'Acquire and lock the specified request (non blocking). |
||
209 | + {method} urtServiceTryAcquireRequest (service* urt_serviceid_t*, request : urt_baserequest_t*) : urt_status_t |
||
210 | 'Respond to a request. |
||
211 | + {method} urtServiceRespond (request : urt_baserequest_t*) : urt_status_t |
||
212 | 4d55cea4 | Thomas Schöpping | } |
213 | |||
214 | !endsub |
||
215 | |||
216 | /'### DEPENDENCIES & LAYOUT ##################################################'/ |
||
217 | |||
218 | !startsub DEPENDENCIES |
||
219 | |||
220 | 2d315870 | Thomas Schöpping | urt_baserequest_t "1" o- "0,1,2" urt_baserequest_t |
221 | urt_baserequest_t "1" o- "0,1" urt_service_t |
||
222 | |||
223 | urt_nrtrequest_t --|> urt_baserequest_t |
||
224 | urt_nrtrequest_t ..> urt_service_t |
||
225 | |||
226 | urt_srtrequest_t --|> urt_baserequest_t |
||
227 | urt_srtrequest_t ..> urt_service_t |
||
228 | |||
229 | urt_frtrequest_t --|> urt_baserequest_t |
||
230 | urt_frtrequest_t ..> urt_service_t |
||
231 | |||
232 | urt_hrtrequest_t --|> urt_baserequest_t |
||
233 | urt_hrtrequest_t ..> urt_service_t |
||
234 | |||
235 | urt_service_t "1" o- "0,1" urt_service_t |
||
236 | urt_service_t "1" o- "0,2,3" urt_baserequest_t |
||
237 | urt_service_t "1" o- "0,1" urt_hrtrequest_t |
||
238 | 4d55cea4 | Thomas Schöpping | |
239 | !endsub |
||
240 | |||
241 | /'### OUTRO ##################################################################'/ |
||
242 | |||
243 | @enduml |