MBDyn-1.7.3
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups
mbrtai_utils.c
Go to the documentation of this file.
1 /* $Header: /var/cvs/mbdyn/mbdyn/mbdyn-1.0/mbdyn/base/mbrtai_utils.c,v 1.33 2017/01/12 14:46:09 masarati Exp $ */
2 /*
3  * MBDyn (C) is a multibody analysis code.
4  * http://www.mbdyn.org
5  *
6  * Copyright (C) 1996-2017
7  *
8  * Pierangelo Masarati <masarati@aero.polimi.it>
9  * Paolo Mantegazza <mantegazza@aero.polimi.it>
10  *
11  * Dipartimento di Ingegneria Aerospaziale - Politecnico di Milano
12  * via La Masa, 34 - 20156 Milano, Italy
13  * http://www.aero.polimi.it
14  *
15  * Changing this copyright notice is forbidden.
16  *
17  * This program is free software; you can redistribute it and/or modify
18  * it under the terms of the GNU General Public License as published by
19  * the Free Software Foundation (version 2 of the License).
20  *
21  *
22  * This program is distributed in the hope that it will be useful,
23  * but WITHOUT ANY WARRANTY; without even the implied warranty of
24  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
25  * GNU General Public License for more details.
26  *
27  * You should have received a copy of the GNU General Public License
28  * along with this program; if not, write to the Free Software
29  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
30  */
31 
32 /* socket driver */
33 
34 #include "mbconfig.h" /* This goes first in every *.c,*.cc file */
35 
36 #ifdef USE_RTAI
37 
38 /*
39  * Mante prefers KEEP_STATIC_INLINE instead of linking liblxrt.a
40  */
41 #define KEEP_STATIC_INLINE
42 
43 #if defined(HAVE_RTAI_LXRT_H) /* RTAI 3.0 */
44 #include <rtai_lxrt.h>
45 #elif defined(HAVE_RTAI_LXRT_USER_H) /* up to RTAI 24.1.13 */
46 #include <rtai_lxrt_user.h>
47 #endif /* HAVE_RTAI_LXRT_USER_H */
48 #if defined(HAVE_RTAI_NETRPC_H) /* RTAI 3.0 */
49 #include <rtai_netrpc.h>
50 #elif defined(HAVE_NET_RPC_H) /* up to RTAI 24.1.13 */
51 #include <net_rpc.h>
52 #endif /* HAVE_NET_RPC_H */
53 
54 #include <assert.h>
55 #include "mbrtai_utils.h"
56 
57 int
58 rtmbdyn_rt_task_init(const char *name, int priority, int stack_size,
59  int max_msg_size, int cpu, void **v_task)
60 {
61  assert(name != NULL);
62  assert(strlen(name) == 6);
63  assert(v_task != NULL);
64  assert(*v_task == NULL);
65 
66  *v_task = (void *)rt_task_init_schmod(nam2num(name), priority,
67  stack_size, max_msg_size, SCHED_FIFO, /*0x2*/ cpu);
68  return (*v_task == NULL);
69 }
70 
71 int
72 rtmbdyn_rt_task_delete(void **v_task)
73 {
74  RT_TASK *task;
75  int rc;
76 
77  assert(v_task != NULL);
78  assert(*v_task != NULL);
79 
80  task = (RT_TASK *)*v_task;
81  rc = rt_task_delete(task);
82 
83  *v_task = NULL;
84 
85  return /* rc */ 0;
86 }
87 void
88 rtmbdyn_rt_make_hard_real_time(void)
89 {
90  rt_make_hard_real_time();
91 }
92 void
93 rtmbdyn_rt_make_soft_real_time(void)
94 {
95  rt_make_soft_real_time();
96 }
97 int
98 rtmbdyn_rt_task_make_periodic(void *v_task, long long v_start_time,
99  long long v_period)
100 {
101 
102 
103  RT_TASK *task = (RT_TASK *)v_task;
104  RTIME start_time = (RTIME)v_start_time;
105  RTIME period = (RTIME)v_period;
106 
107  assert(v_task != NULL);
108 
109  return rt_task_make_periodic(task, start_time, period);
110 }
111 
112 void
113 rtmbdyn_rt_task_wait_period(void)
114 {
115  rt_task_wait_period();
116 }
117 
118 void
119 rtmbdyn_rt_allow_nonroot_hrt(void)
120 {
121  rt_allow_nonroot_hrt();
122 }
123 
124 int
125 rtmbdyn_rt_request_port(unsigned long node)
126 {
127  assert(node > 0);
128 
129  return rt_request_port(node);
130 }
131 
132 void
133 rtmbdyn_rt_set_oneshot_mode(void)
134 {
135  rt_set_oneshot_mode();
136 }
137 
138 void
139 rtmbdyn_rt_set_periodic_mode(void)
140 {
141  rt_set_periodic_mode();
142 }
143 
144 int
145 rtmbdyn_rt_is_hard_timer_running(void)
146 {
147  return rt_is_hard_timer_running();
148 }
149 
150 long long
151 rtmbdyn_start_rt_timer(long long v_period)
152 {
153  RTIME period = (RTIME)v_period;
154  return start_rt_timer(period);
155 }
156 
157 void
158 rtmbdyn_stop_rt_timer(void)
159 {
160  stop_rt_timer();
161 }
162 
163 long long
164 rtmbdyn_rt_get_time(void)
165 {
166  return (long long)rt_get_time();
167 }
168 
169 long long
170 rtmbdyn_count2nano(long long count)
171 {
172  return (long long)count2nano((RTIME)count);
173 }
174 
175 long long
176 rtmbdyn_nano2count(long long nanos)
177 {
178  return (long long)nano2count((RTIME)nanos);
179 }
180 
181 int
182 rtmbdyn_rt_mbx_init(const char *name, int size, void **v_mbx)
183 {
184  assert(name);
185  assert(strlen(name) <= 6);
186  assert(size > 0);
187  assert(v_mbx != NULL);
188  assert(*v_mbx == NULL); /* questa e' bastarda */
189 
190  *v_mbx = (void *)rt_mbx_init(nam2num(name), size);
191 
192  return (*v_mbx == NULL);
193 }
194 
195 int
196 rtmbdyn_rt_mbx_delete(void **v_mbx)
197 {
198  MBX *mbx;
199  int rc;
200 
201  assert(v_mbx != NULL);
202  assert(*v_mbx != NULL);
203 
204  mbx = (MBX *)*v_mbx;
205  rc = rt_mbx_delete(mbx);
206 
207  *v_mbx = NULL;
208 
209  return rc;
210 }
211 
212 int
213 rtmbdyn_RT_get_adr(unsigned long node, int port, const char *name, void **v_task)
214 {
215  assert(node >= 0);
216  assert(node == 0 || port > 0);
217  assert(name != NULL);
218  assert(strlen(name) == 6);
219  assert(v_task != NULL);
220  assert(*v_task == NULL); /* questa e' bastarda */
221 
222  /* non ci va nam2num(name) */
223  *v_task = (void *)RT_get_adr(node, port, name);
224 
225  return (*v_task == NULL);
226 }
227 
228 int
229 rtmbdyn_RT_mbx_send(unsigned long node, int port, void *v_mbx,
230  void *msg, int msg_size)
231 {
232  MBX *mbx = (MBX *)v_mbx;
233 
234  assert(v_mbx != NULL);
235  assert(msg != NULL);
236  assert(msg_size > 0);
237 
238  return RT_mbx_send(node, port, mbx, msg, msg_size);
239 
240 }
241 
242 int
243 rtmbdyn_RT_mbx_send_if(unsigned long node, int port, void *v_mbx,
244  void *msg, int msg_size)
245 {
246  MBX *mbx = (MBX *)v_mbx;
247 
248  assert(v_mbx != NULL);
249  assert(msg != NULL);
250  assert(msg_size > 0);
251 
252  return RT_mbx_send_if(node, port, mbx, msg, msg_size);
253 
254 }
255 
256 int
257 rtmbdyn_RT_mbx_receive(unsigned long node, int port, void *v_mbx,
258  void *msg, int msg_size)
259 {
260  MBX *mbx = (MBX *)v_mbx;
261 
262  assert(v_mbx != NULL);
263  assert(msg != NULL);
264  assert(msg_size > 0);
265 
266  return RT_mbx_receive(node, port, mbx, msg, msg_size);
267 }
268 
269 int
270 rtmbdyn_RT_mbx_receive_if(unsigned long node, int port, void *v_mbx,
271  void *msg, int msg_size)
272 {
273  MBX *mbx = (MBX *)v_mbx;
274 
275  assert(v_mbx != NULL);
276  assert(msg != NULL);
277  assert(msg_size > 0);
278 
279  return RT_mbx_receive_if(node, port, mbx, msg, msg_size);
280 }
281 
282 int
283 rtmbdyn_rt_task_suspend(void *v_task)
284 {
285  RT_TASK *task = (RT_TASK *)v_task;
286 
287  assert(v_task != NULL);
288 
289  return rt_task_suspend(task);
290 
291 }
292 
293 int
294 rtmbdyn_rt_task_resume(void *v_task)
295 {
296  RT_TASK *task = (RT_TASK *)v_task;
297 
298  assert(v_task != NULL);
299 
300  return rt_task_resume(task);
301 
302 }
303 void
304 rtmbdyn_rt_sleep(long long count)
305 {
306  rt_sleep((RTIME)count);
307 }
308 int
309 rtmbdyn_rt_sem_init(char *name, int value, void **v_sem)
310 {
311  assert(strlen(name) == 6);
312  assert(v_sem != NULL);
313  assert(*v_sem == NULL); /* questa e' bastarda */
314  *v_sem = (void *)rt_sem_init(nam2num(name),value);
315 
316  return (*v_sem == NULL);
317 }
318 
319 int
320 rtmbdyn_rt_sem_delete(void **v_sem)
321 {
322  SEM *sem;
323  int rc;
324 
325  assert(v_sem != NULL);
326  assert(*v_sem != NULL);
327 
328  sem = (SEM *)*v_sem;
329  rc = rt_sem_delete(sem);
330 
331  *v_sem = NULL;
332 
333  return rc;
334 }
335 int
336 rtmbdyn_rt_sem_signal(void *v_sem)
337 {
338  SEM *sem = (SEM *)v_sem;
339 
340  return rt_sem_signal(sem);
341 }
342 int
343 rtmbdyn_rt_sem_wait(void *v_sem)
344 {
345  SEM *sem=(SEM *)v_sem;
346 
347  return rt_sem_wait(sem);
348 }
349 
350 void *
351 rtmbdyn_rt_receive(void *v_task, int *msg)
352 {
353  RT_TASK *task = (RT_TASK *)v_task;
354 
355  return (void *)rt_receive(task, msg);
356 }
357 
358 void *
359 rtmbdyn_rt_receive_if(void *v_task, int *msg)
360 {
361  RT_TASK *task = (RT_TASK *)v_task;
362 
363  return (void *)rt_receive_if(task, msg);
364 }
365 
366 long long
367 rtmbdyn_rt_get_cpu_time_ns(void)
368 {
369  return rt_get_cpu_time_ns();
370 }
371 
372 #endif /* USE_RTAI */
373 
static int count
Definition: modules.cc:41
struct mbrtai_msg_t msg
unsigned short int port
Definition: autopilot.c:143