Lely core libraries  2.3.4
nmt_srv.c
Go to the documentation of this file.
1 
24 #include "co.h"
25 #include <lely/util/diag.h>
26 #if !LELY_NO_CO_CSDO
27 #include <lely/co/csdo.h>
28 #endif
29 #include <lely/co/dev.h>
30 #if !LELY_NO_CO_EMCY
31 #include <lely/co/emcy.h>
32 #endif
33 #if !LELY_NO_CO_LSS
34 #include <lely/co/lss.h>
35 #endif
36 #if !LELY_NO_CO_RPDO
37 #include <lely/co/rpdo.h>
38 #endif
39 #include <lely/co/ssdo.h>
40 #if !LELY_NO_CO_SYNC
41 #include <lely/co/sync.h>
42 #endif
43 #if !LELY_NO_CO_TIME
44 #include <lely/co/time.h>
45 #endif
46 #if !LELY_NO_CO_TPDO
47 #include <lely/co/tpdo.h>
48 #endif
49 #include "nmt_srv.h"
50 
51 #include <assert.h>
52 #include <stdlib.h>
53 
54 #if !LELY_NO_CO_RPDO || !LELY_NO_CO_TPDO
55 static void co_nmt_srv_init_pdo(
57  struct co_nmt_srv *srv, can_net_t *net, co_dev_t *dev);
59 static void co_nmt_srv_fini_pdo(struct co_nmt_srv *srv);
60 #if !LELY_NO_CO_RPDO
61 static void co_nmt_srv_rpdo_err(co_rpdo_t *pdo, co_unsigned16_t eec,
63  co_unsigned8_t er, void *data);
64 #endif
65 #endif
66 
68 static void co_nmt_srv_init_sdo(
69  struct co_nmt_srv *srv, can_net_t *net, co_dev_t *dev);
71 static void co_nmt_srv_fini_sdo(struct co_nmt_srv *srv);
72 
73 #if !LELY_NO_CO_SYNC
74 static void co_nmt_srv_init_sync(
76  struct co_nmt_srv *srv, can_net_t *net, co_dev_t *dev);
78 static void co_nmt_srv_fini_sync(struct co_nmt_srv *srv);
80 static void co_nmt_srv_sync_ind(
81  co_sync_t *sync, co_unsigned8_t cnt, void *data);
83 static void co_nmt_srv_sync_err(co_sync_t *sync, co_unsigned16_t eec,
84  co_unsigned8_t er, void *data);
85 #endif
86 
87 #if !LELY_NO_CO_TIME
88 static void co_nmt_srv_init_time(
90  struct co_nmt_srv *srv, can_net_t *net, co_dev_t *dev);
92 static void co_nmt_srv_fini_time(struct co_nmt_srv *srv);
93 #endif
94 
95 #if !LELY_NO_CO_EMCY
96 static void co_nmt_srv_init_emcy(
98  struct co_nmt_srv *srv, can_net_t *net, co_dev_t *dev);
100 static void co_nmt_srv_fini_emcy(struct co_nmt_srv *srv);
101 #endif
102 
103 #if !LELY_NO_CO_LSS
104 static void co_nmt_srv_init_lss(struct co_nmt_srv *srv, co_nmt_t *nmt);
107 static void co_nmt_srv_fini_lss(struct co_nmt_srv *srv);
108 #endif
109 
110 void
112 {
113  assert(srv);
114  assert(nmt);
115 
116  srv->nmt = nmt;
117 
118  srv->set = 0;
119 
120 #if !LELY_NO_CO_RPDO
121  srv->rpdos = NULL;
122  srv->nrpdo = 0;
123 #endif
124 #if !LELY_NO_CO_TPDO
125  srv->tpdos = NULL;
126  srv->ntpdo = 0;
127 #endif
128 
129  srv->ssdos = NULL;
130  srv->nssdo = 0;
131 #if !LELY_NO_CO_CSDO
132  srv->csdos = NULL;
133  srv->ncsdo = 0;
134 #endif
135 
136 #if !LELY_NO_CO_SYNC
137  srv->sync = NULL;
138 #endif
139 #if !LELY_NO_CO_TIME
140  srv->time = NULL;
141 #endif
142 #if !LELY_NO_CO_EMCY
143  srv->emcy = NULL;
144 #endif
145 
146 #if !LELY_NO_CO_LSS
147  srv->lss = NULL;
148 #endif
149 }
150 
151 void
153 {
154  assert(srv);
155 
156  co_nmt_srv_set(srv, NULL, 0);
157 }
158 
159 void
160 co_nmt_srv_set(struct co_nmt_srv *srv, co_nmt_t *nmt, int set)
161 {
162  assert(srv);
163 
164 #if !LELY_NO_CO_LSS
165  if ((srv->set & ~set) & CO_NMT_SRV_LSS)
166  co_nmt_srv_fini_lss(srv);
167 #endif
168 #if !LELY_NO_CO_EMCY
169  if ((srv->set & ~set) & CO_NMT_SRV_EMCY)
171 #endif
172 #if !LELY_NO_CO_TIME
173  if ((srv->set & ~set) & CO_NMT_SRV_TIME)
175 #endif
176 #if !LELY_NO_CO_SYNC
177  if ((srv->set & ~set) & CO_NMT_SRV_SYNC)
179 #endif
180  if ((srv->set & ~set) & CO_NMT_SRV_SDO)
181  co_nmt_srv_fini_sdo(srv);
182 #if !LELY_NO_CO_RPDO || !LELY_NO_CO_TPDO
183  if ((srv->set & ~set) & CO_NMT_SRV_PDO)
184  co_nmt_srv_fini_pdo(srv);
185 #endif
186 
187  if (nmt) {
189  co_dev_t *dev = co_nmt_get_dev(nmt);
190 #if !LELY_NO_CO_RPDO || !LELY_NO_CO_TPDO
191  if ((set & ~srv->set) & CO_NMT_SRV_PDO)
192  co_nmt_srv_init_pdo(srv, net, dev);
193 #endif
194  if ((set & ~srv->set) & CO_NMT_SRV_SDO)
195  co_nmt_srv_init_sdo(srv, net, dev);
196 #if !LELY_NO_CO_SYNC
197  if ((set & ~srv->set) & CO_NMT_SRV_SYNC)
198  co_nmt_srv_init_sync(srv, net, dev);
199 #endif
200 #if !LELY_NO_CO_TIME
201  if ((set & ~srv->set) & CO_NMT_SRV_TIME)
202  co_nmt_srv_init_time(srv, net, dev);
203 #endif
204 #if !LELY_NO_CO_EMCY
205  if ((set & ~srv->set) & CO_NMT_SRV_EMCY)
206  co_nmt_srv_init_emcy(srv, net, dev);
207 #endif
208 #if !LELY_NO_CO_LSS
209  if ((set & ~srv->set) & CO_NMT_SRV_LSS)
210  co_nmt_srv_init_lss(srv, nmt);
211 #endif
212  }
213 }
214 
215 #if !LELY_NO_CO_RPDO || !LELY_NO_CO_TPDO
216 
217 static void
219 {
220  assert(srv);
221  assert(!(srv->set & CO_NMT_SRV_PDO));
222 
223  srv->set |= CO_NMT_SRV_PDO;
224 
225 #if !LELY_NO_CO_RPDO
226  assert(!srv->rpdos);
227  assert(!srv->nrpdo);
228 
229  // Create the Receive-PDOs.
230  for (co_unsigned16_t i = 0; i < CO_NUM_PDOS; i++) {
231  co_obj_t *obj_1400 = co_dev_find_obj(dev, 0x1400 + i);
232  co_obj_t *obj_1600 = co_dev_find_obj(dev, 0x1600 + i);
233  if (!obj_1400 || !obj_1600)
234  continue;
235 
236  co_rpdo_t **rpdos =
237  realloc(srv->rpdos, (i + 1) * sizeof(*rpdos));
238  if (!rpdos) {
239 #if !LELY_NO_ERRNO
240  set_errc(errno2c(errno));
241 #endif
242  goto error;
243  }
244  srv->rpdos = rpdos;
245 
246  for (size_t j = srv->nrpdo; j < i; j++)
247  srv->rpdos[j] = NULL;
248  srv->rpdos[i] = co_rpdo_create(net, dev, i + 1);
249  if (!srv->rpdos[i])
250  goto error;
251  co_rpdo_set_err(srv->rpdos[i], &co_nmt_srv_rpdo_err, srv->nmt);
252 
253  srv->nrpdo = i + 1;
254  }
255 #endif // !LELY_NO_CO_RPDO
256 
257 #if !LELY_NO_CO_TPDO
258  assert(!srv->tpdos);
259  assert(!srv->ntpdo);
260 
261  // Create the Transmit-PDOs.
262  for (co_unsigned16_t i = 0; i < CO_NUM_PDOS; i++) {
263  co_obj_t *obj_1800 = co_dev_find_obj(dev, 0x1800 + i);
264  co_obj_t *obj_1a00 = co_dev_find_obj(dev, 0x1a00 + i);
265  if (!obj_1800 || !obj_1a00)
266  continue;
267 
268  co_tpdo_t **tpdos =
269  realloc(srv->tpdos, (i + 1) * sizeof(*tpdos));
270  if (!tpdos) {
271 #if !LELY_NO_ERRNO
272  set_errc(errno2c(errno));
273 #endif
274  goto error;
275  }
276  srv->tpdos = tpdos;
277 
278  for (size_t j = srv->ntpdo; j < i; j++)
279  srv->tpdos[j] = NULL;
280  srv->tpdos[i] = co_tpdo_create(net, dev, i + 1);
281  if (!srv->tpdos[i])
282  goto error;
283 
284  srv->ntpdo = i + 1;
285  }
286 #endif // !LELY_NO_CO_TPDO
287 
288  return;
289 
290 error:
291  diag(DIAG_ERROR, get_errc(), "unable to initialize PDO services");
292 }
293 
294 static void
296 {
297  assert(srv);
298  assert(srv->set & CO_NMT_SRV_PDO);
299 
300  srv->set &= ~CO_NMT_SRV_PDO;
301 
302 #if !LELY_NO_CO_TPDO
303  // Destroy the Transmit-PDOs.
304  for (size_t i = 0; i < srv->ntpdo; i++)
305  co_tpdo_destroy(srv->tpdos[i]);
306  free(srv->tpdos);
307  srv->tpdos = NULL;
308  srv->ntpdo = 0;
309 #endif
310 
311 #if !LELY_NO_CO_RPDO
312  // Destroy the Receive-PDOs.
313  for (size_t i = 0; i < srv->nrpdo; i++)
314  co_rpdo_destroy(srv->rpdos[i]);
315  free(srv->rpdos);
316  srv->rpdos = NULL;
317  srv->nrpdo = 0;
318 #endif
319 }
320 
321 #if !LELY_NO_CO_RPDO
322 static void
323 co_nmt_srv_rpdo_err(co_rpdo_t *pdo, co_unsigned16_t eec, co_unsigned8_t er,
324  void *data)
325 {
326  (void)pdo;
327  co_nmt_t *nmt = data;
328  assert(nmt);
329 
330  co_nmt_on_err(nmt, eec, er, NULL);
331 }
332 #endif
333 
334 #endif // !LELY_NO_CO_RPDO || !LELY_NO_CO_TPDO
335 
336 static void
338 {
339  assert(srv);
340  assert(!(srv->set & CO_NMT_SRV_SDO));
341  assert(!srv->ssdos);
342  assert(!srv->nssdo);
343 
344  srv->set |= CO_NMT_SRV_SDO;
345 
346  // Create the Server-SDOs.
347  for (co_unsigned8_t i = 0; i < CO_NUM_SDOS; i++) {
348  co_obj_t *obj_1200 = co_dev_find_obj(dev, 0x1200 + i);
349  // The default Server-SDO does not have to exist in the object
350  // dictionary.
351  if (i && !obj_1200)
352  continue;
353 
354  co_ssdo_t **ssdos =
355  realloc(srv->ssdos, (i + 1) * sizeof(*ssdos));
356  if (!ssdos) {
357 #if !LELY_NO_ERRNO
358  set_errc(errno2c(errno));
359 #endif
360  goto error;
361  }
362  srv->ssdos = ssdos;
363 
364  for (size_t j = srv->nssdo; j < i; j++)
365  srv->ssdos[j] = NULL;
366  srv->ssdos[i] = co_ssdo_create(net, dev, i + 1);
367  if (!srv->ssdos[i])
368  goto error;
369 
370  srv->nssdo = i + 1;
371  }
372 
373 #if !LELY_NO_CO_CSDO
374  assert(!srv->csdos);
375  assert(!srv->ncsdo);
376 
377  // Create the Client-SDOs.
378  for (co_unsigned8_t i = 0; i < CO_NUM_SDOS; i++) {
379  co_obj_t *obj_1280 = co_dev_find_obj(dev, 0x1280 + i);
380  if (!obj_1280)
381  continue;
382 
383  co_csdo_t **csdos =
384  realloc(srv->csdos, (i + 1) * sizeof(*csdos));
385  if (!csdos) {
386 #if !LELY_NO_ERRNO
387  set_errc(errno2c(errno));
388 #endif
389  goto error;
390  }
391  srv->csdos = csdos;
392 
393  for (size_t j = srv->ncsdo; j < i; j++)
394  srv->csdos[j] = NULL;
395  srv->csdos[i] = co_csdo_create(net, dev, i + 1);
396  if (!srv->csdos[i])
397  goto error;
398 
399  srv->ncsdo = i + 1;
400  }
401 #endif // !LELY_NO_CO_CSDO
402 
403  return;
404 
405 error:
406  diag(DIAG_ERROR, get_errc(), "unable to initialize SDO services");
407 }
408 
409 static void
411 {
412  assert(srv);
413  assert(srv->set & CO_NMT_SRV_SDO);
414 
415  srv->set &= ~CO_NMT_SRV_SDO;
416 
417 #if !LELY_NO_CO_CSDO
418  // Destroy the Client-SDOs.
419  for (size_t i = 0; i < srv->ncsdo; i++)
420  co_csdo_destroy(srv->csdos[i]);
421  free(srv->csdos);
422  srv->csdos = NULL;
423  srv->ncsdo = 0;
424 #endif
425 
426  // Destroy the Server-SDOs (skipping the default one).
427  for (size_t i = 0; i < srv->nssdo; i++)
428  co_ssdo_destroy(srv->ssdos[i]);
429  free(srv->ssdos);
430  srv->ssdos = NULL;
431  srv->nssdo = 0;
432 }
433 
434 #if !LELY_NO_CO_SYNC
435 
436 static void
438 {
439  assert(srv);
440  assert(!(srv->set & CO_NMT_SRV_SYNC));
441  assert(!srv->sync);
442 
443  srv->set |= CO_NMT_SRV_SYNC;
444 
445  co_obj_t *obj_1005 = co_dev_find_obj(dev, 0x1005);
446  if (!obj_1005)
447  return;
448 
449  srv->sync = co_sync_create(net, dev);
450  if (!srv->sync) {
452  "unable to initialize SYNC service");
453  return;
454  }
457 }
458 
459 static void
461 {
462  assert(srv);
463  assert(srv->set & CO_NMT_SRV_SYNC);
464 
465  srv->set &= ~CO_NMT_SRV_SYNC;
466 
467  co_sync_destroy(srv->sync);
468  srv->sync = NULL;
469 }
470 
471 static void
472 co_nmt_srv_sync_ind(co_sync_t *sync, co_unsigned8_t cnt, void *data)
473 {
474  (void)sync;
475  co_nmt_t *nmt = data;
476  assert(nmt);
477 
478  co_nmt_on_sync(nmt, cnt);
479 }
480 
481 static void
482 co_nmt_srv_sync_err(co_sync_t *sync, co_unsigned16_t eec, co_unsigned8_t er,
483  void *data)
484 {
485  (void)sync;
486  co_nmt_t *nmt = data;
487  assert(nmt);
488 
489  co_nmt_on_err(nmt, eec, er, NULL);
490 }
491 
492 #endif // !LELY_NO_CO_SYNC
493 
494 #if !LELY_NO_CO_TIME
495 
496 static void
498 {
499  assert(srv);
500  assert(!(srv->set & CO_NMT_SRV_TIME));
501  assert(!srv->time);
502 
503  srv->set |= CO_NMT_SRV_TIME;
504 
505  co_obj_t *obj_1012 = co_dev_find_obj(dev, 0x1012);
506  if (!obj_1012)
507  return;
508 
509  srv->time = co_time_create(net, dev);
510  if (!srv->time)
512  "unable to initialize TIME service");
513 }
514 
515 static void
517 {
518  assert(srv);
519  assert(srv->set & CO_NMT_SRV_TIME);
520 
521  srv->set &= ~CO_NMT_SRV_TIME;
522 
523  co_time_destroy(srv->time);
524  srv->time = NULL;
525 }
526 
527 #endif // !LELY_NO_CO_TIME
528 
529 #if !LELY_NO_CO_EMCY
530 
531 static void
533 {
534  assert(srv);
535  assert(!(srv->set & CO_NMT_SRV_EMCY));
536  assert(!srv->emcy);
537 
538  srv->set |= CO_NMT_SRV_EMCY;
539 
540  co_obj_t *obj_1001 = co_dev_find_obj(dev, 0x1001);
541  if (!obj_1001)
542  return;
543 
544  srv->emcy = co_emcy_create(net, dev);
545  if (!srv->emcy)
547  "unable to initialize EMCY service");
548 }
549 
550 static void
552 {
553  assert(srv);
554  assert(srv->set & CO_NMT_SRV_EMCY);
555 
556  srv->set &= ~CO_NMT_SRV_EMCY;
557 
558  co_emcy_destroy(srv->emcy);
559  srv->emcy = NULL;
560 }
561 
562 #endif // !LELY_NO_CO_EMCY
563 
564 #if !LELY_NO_CO_LSS
565 
566 static void
568 {
569  assert(srv);
570  assert(!(srv->set & CO_NMT_SRV_LSS));
571  assert(!srv->lss);
572 
574  return;
575 
576  srv->set |= CO_NMT_SRV_LSS;
577 
578  srv->lss = co_lss_create(nmt);
579  if (!srv->lss)
581  "unable to initialize LSS service");
582 }
583 
584 static void
586 {
587  assert(srv);
588  assert(srv->set & CO_NMT_SRV_LSS);
589 
590  srv->set &= ~CO_NMT_SRV_LSS;
591 
592  co_lss_destroy(srv->lss);
593  srv->lss = NULL;
594 }
595 
596 #endif // !LELY_NO_CO_LSS
co_nmt_srv_init_time
static void co_nmt_srv_init_time(struct co_nmt_srv *srv, can_net_t *net, co_dev_t *dev)
Initializes the TIME producer/consumer service.
Definition: nmt_srv.c:497
emcy.h
co_sync_set_err
void co_sync_set_err(co_sync_t *sync, co_sync_err_t *err, void *data)
Sets the error handling function of a SYNC consumer service.
Definition: sync.c:371
co_nmt_srv_sync_ind
static void co_nmt_srv_sync_ind(co_sync_t *sync, co_unsigned8_t cnt, void *data)
Invokes co_nmt_sync() to handle SYNC objects.
Definition: nmt_srv.c:472
co_nmt_srv::lss
co_lss_t * lss
A pointer to the LSS master/slave service.
Definition: nmt_srv.h:75
dev.h
CO_NMT_SRV_TIME
#define CO_NMT_SRV_TIME
The TIME producer/consumer service.
Definition: nmt_srv.h:89
co_nmt_srv::set
int set
The currently enabled CANopen services (any combination of CO_NMT_SRV_PDO, CO_NMT_SRV_SDO,...
Definition: nmt_srv.h:38
sync.h
co_nmt_srv_sync_err
static void co_nmt_srv_sync_err(co_sync_t *sync, co_unsigned16_t eec, co_unsigned8_t er, void *data)
Invokes co_nmt_err() to handle SYNC errors.
Definition: nmt_srv.c:482
co_ssdo_create
co_ssdo_t * co_ssdo_create(can_net_t *net, co_dev_t *dev, co_unsigned8_t num)
Creates a new CANopen Server-SDO service.
Definition: ssdo.c:650
co_nmt_srv::nrpdo
co_unsigned16_t nrpdo
The number of Receive-PDO services.
Definition: nmt_srv.h:43
co_nmt_srv::sync
co_sync_t * sync
A pointer to the SYNC producer/consumer service.
Definition: nmt_srv.h:63
diag.h
__co_nmt_hb::net
can_net_t * net
A pointer to a CAN network interface.
Definition: nmt_hb.c:35
ssdo.h
co_nmt_srv::csdos
co_csdo_t ** csdos
An array of pointers to the Client-SDO services.
Definition: nmt_srv.h:57
co_nmt_srv::tpdos
co_tpdo_t ** tpdos
An array of pointers to the Transmit-PDO services.
Definition: nmt_srv.h:47
CO_NUM_SDOS
#define CO_NUM_SDOS
The maximum number of Client/Server-SDOs.
Definition: sdo.h:178
co_nmt_srv::emcy
co_emcy_t * emcy
A pointer to the EMCY producer/consumer service.
Definition: nmt_srv.h:71
get_errc
int get_errc(void)
Returns the last (thread-specific) native error code set by a system call or library function.
Definition: errnum.c:932
__co_nmt_hb::nmt
co_nmt_t * nmt
A pointer to an NMT master/slave service.
Definition: nmt_hb.c:37
errno2c
int errno2c(int errnum)
Transforms a standard C error number to a native error code.
Definition: errnum.c:46
co_nmt_srv_rpdo_err
static void co_nmt_srv_rpdo_err(co_rpdo_t *pdo, co_unsigned16_t eec, co_unsigned8_t er, void *data)
Invokes co_nmt_err() to handle Receive-PDO errors.
Definition: nmt_srv.c:323
co_nmt_on_err
void co_nmt_on_err(co_nmt_t *nmt, co_unsigned16_t eec, co_unsigned8_t er, const co_unsigned8_t msef[5])
Implements the default error handling behavior by generating an EMCY message with co_emcy_push() and ...
Definition: nmt.c:1636
co.h
co_nmt_srv_fini_time
static void co_nmt_srv_fini_time(struct co_nmt_srv *srv)
Finalizes the TIME producer/consumer service.
Definition: nmt_srv.c:516
time.h
co_nmt_on_sync
void co_nmt_on_sync(co_nmt_t *nmt, co_unsigned8_t cnt)
Implements the default behavior after a SYNC object is received or transmitted.
Definition: nmt.c:1610
co_nmt_srv_init
void co_nmt_srv_init(struct co_nmt_srv *srv, co_nmt_t *nmt)
Initializes a CANopen NMT service manager.
Definition: nmt_srv.c:111
co_nmt_srv_init_pdo
static void co_nmt_srv_init_pdo(struct co_nmt_srv *srv, can_net_t *net, co_dev_t *dev)
Initializes all Receive/Transmit-PDO services.
Definition: nmt_srv.c:218
co_nmt_srv_init_lss
static void co_nmt_srv_init_lss(struct co_nmt_srv *srv, co_nmt_t *nmt)
Initializes the LSS master/slave service.
Definition: nmt_srv.c:567
co_nmt_srv_fini_emcy
static void co_nmt_srv_fini_emcy(struct co_nmt_srv *srv)
Finalizes the EMCY producer/consumer service.
Definition: nmt_srv.c:551
__co_rpdo
A CANopen Receive-PDO.
Definition: rpdo.c:44
co_nmt_srv_fini_sdo
static void co_nmt_srv_fini_sdo(struct co_nmt_srv *srv)
Finalizes all Server/Client-SDO services.
Definition: nmt_srv.c:410
__co_ssdo
A CANopen Server-SDO.
Definition: ssdo.c:63
co_nmt_srv::nssdo
co_unsigned8_t nssdo
The number of Server-SDO services.
Definition: nmt_srv.h:54
co_time_destroy
void co_time_destroy(co_time_t *time)
Destroys a CANopen TIME producer/consumer service.
Definition: time.c:267
co_nmt_srv_fini_sync
static void co_nmt_srv_fini_sync(struct co_nmt_srv *srv)
Finalizes the SYNC producer/consumer service.
Definition: nmt_srv.c:460
co_nmt_srv_fini
void co_nmt_srv_fini(struct co_nmt_srv *srv)
Finalizes a CANopen NMT service manager.
Definition: nmt_srv.c:152
DIAG_ERROR
@ DIAG_ERROR
An error.
Definition: diag.h:57
__co_tpdo
A CANopen Transmit-PDO.
Definition: tpdo.c:53
co_sync_create
co_sync_t * co_sync_create(can_net_t *net, co_dev_t *dev)
Creates a new CANopen SYNC producer/consumer service.
Definition: sync.c:211
set_errc
void set_errc(int errc)
Sets the current (thread-specific) native error code to errc.
Definition: errnum.c:944
tpdo.h
co_csdo_create
co_csdo_t * co_csdo_create(can_net_t *net, co_dev_t *dev, co_unsigned8_t num)
Creates a new CANopen Client-SDO service.
Definition: csdo.c:997
co_nmt_srv_init_emcy
static void co_nmt_srv_init_emcy(struct co_nmt_srv *srv, can_net_t *net, co_dev_t *dev)
Initializes the EMCY producer/consumer service.
Definition: nmt_srv.c:532
CO_NUM_PDOS
#define CO_NUM_PDOS
The maximum number of Receive/Transmit-PDOs.
Definition: pdo.h:28
lss.h
co_nmt_srv_init_sync
static void co_nmt_srv_init_sync(struct co_nmt_srv *srv, can_net_t *net, co_dev_t *dev)
Initializes the SYNC producer/consumer service.
Definition: nmt_srv.c:437
co_nmt_srv
A CANopen NMT service manager.
Definition: nmt_srv.h:30
co_csdo_destroy
void co_csdo_destroy(co_csdo_t *sdo)
Destroys a CANopen Client-SDO service.
Definition: csdo.c:1024
__co_nmt
A CANopen NMT master/slave service.
Definition: nmt.c:148
co_nmt_srv::time
co_time_t * time
A pointer to the TIME producer/consumer service.
Definition: nmt_srv.h:67
co_tpdo_destroy
void co_tpdo_destroy(co_tpdo_t *pdo)
Destroys a CANopen Transmit-PDO service.
Definition: tpdo.c:330
co_nmt_srv_set
void co_nmt_srv_set(struct co_nmt_srv *srv, co_nmt_t *nmt, int set)
Enables/disables the specified CANopen services.
Definition: nmt_srv.c:160
CO_NMT_SRV_SDO
#define CO_NMT_SRV_SDO
The Server/Client-SDO services.
Definition: nmt_srv.h:83
co_ssdo_destroy
void co_ssdo_destroy(co_ssdo_t *sdo)
Destroys a CANopen Server-SDO service.
Definition: ssdo.c:677
diag
void diag(enum diag_severity severity, int errc, const char *format,...)
Emits a diagnostic message.
Definition: diag.c:171
co_time_create
co_time_t * co_time_create(can_net_t *net, co_dev_t *dev)
Creates a new CANopen TIME producer/consumer service.
Definition: time.c:240
__co_obj
A CANopen object.
Definition: obj.h:31
co_nmt_get_dev
co_dev_t * co_nmt_get_dev(const co_nmt_t *nmt)
Returns a pointer to the CANopen device of an NMT master/slave service.
Definition: nmt.c:1275
CO_NMT_SRV_PDO
#define CO_NMT_SRV_PDO
The Receive/Transmit-PDO services.
Definition: nmt_srv.h:80
co_nmt_srv::rpdos
co_rpdo_t ** rpdos
An array of pointers to the Receive-PDO services.
Definition: nmt_srv.h:41
__co_dev
A CANopen device.
Definition: dev.h:30
co_nmt_srv::nmt
co_nmt_t * nmt
A pointer to the NMT master/slave service.
Definition: nmt_srv.h:32
co_emcy_destroy
void co_emcy_destroy(co_emcy_t *emcy)
Destroys a CANopen EMCY producer/consumer service.
Definition: emcy.c:360
co_nmt_srv_fini_lss
static void co_nmt_srv_fini_lss(struct co_nmt_srv *srv)
Finalizes the EMCY master/slave service.
Definition: nmt_srv.c:585
co_rpdo_destroy
void co_rpdo_destroy(co_rpdo_t *pdo)
Destroys a CANopen Receive-PDO service.
Definition: rpdo.c:298
co_sync_destroy
void co_sync_destroy(co_sync_t *sync)
Destroys a CANopen SYNC producer/consumer service.
Definition: sync.c:238
CO_NMT_SRV_SYNC
#define CO_NMT_SRV_SYNC
The SYNC producer/consumer service.
Definition: nmt_srv.h:86
co_rpdo_set_err
void co_rpdo_set_err(co_rpdo_t *pdo, co_rpdo_err_t *err, void *data)
Sets the error handling function of a Receive-PDO service.
Definition: rpdo.c:463
co_lss_destroy
void co_lss_destroy(co_lss_t *lss)
Destroys a CANopen LSS master/slave service.
Definition: lss.c:810
__co_csdo
A CANopen Client-SDO.
Definition: csdo.c:71
co_tpdo_create
co_tpdo_t * co_tpdo_create(can_net_t *net, co_dev_t *dev, co_unsigned16_t num)
Creates a new CANopen Transmit-PDO service.
Definition: tpdo.c:303
co_nmt_srv_init_sdo
static void co_nmt_srv_init_sdo(struct co_nmt_srv *srv, can_net_t *net, co_dev_t *dev)
Initializes all Server/Client-SDO services.
Definition: nmt_srv.c:337
co_lss_create
co_lss_t * co_lss_create(co_nmt_t *nmt)
Creates a new CANopen LSS master/slave service.
Definition: lss.c:783
co_dev_get_lss
int co_dev_get_lss(const co_dev_t *dev)
Returns 1 if LSS is supported and 0 if not.
Definition: dev.c:535
CO_NMT_SRV_EMCY
#define CO_NMT_SRV_EMCY
The EMCY producer/consumer service.
Definition: nmt_srv.h:92
co_nmt_srv::ncsdo
co_unsigned8_t ncsdo
The number of Client-SDO services.
Definition: nmt_srv.h:59
co_nmt_srv_fini_pdo
static void co_nmt_srv_fini_pdo(struct co_nmt_srv *srv)
Finalizes all Receive/Transmit-PDO services.
Definition: nmt_srv.c:295
csdo.h
co_nmt_get_net
can_net_t * co_nmt_get_net(const co_nmt_t *nmt)
Returns a pointer to the CAN network of an NMT master/slave service.
Definition: nmt.c:1267
co_nmt_srv::ssdos
co_ssdo_t ** ssdos
An array of pointers to the Server-SDO services.
Definition: nmt_srv.h:52
CO_NMT_SRV_LSS
#define CO_NMT_SRV_LSS
The LSS master/slave service.
Definition: nmt_srv.h:95
stdlib.h
co_emcy_create
co_emcy_t * co_emcy_create(can_net_t *net, co_dev_t *dev)
Creates a new CANopen EMCY producer/consumer service.
Definition: emcy.c:333
rpdo.h
__co_sync
A CANopen SYNC producer/consumer service.
Definition: sync.c:40
co_nmt_srv::ntpdo
co_unsigned16_t ntpdo
The number of Transmit-PDO services.
Definition: nmt_srv.h:49
__can_net
A CAN network interface.
Definition: net.c:37
co_rpdo_create
co_rpdo_t * co_rpdo_create(can_net_t *net, co_dev_t *dev, co_unsigned16_t num)
Creates a new CANopen Receive-PDO service.
Definition: rpdo.c:271
nmt_srv.h
co_sync_set_ind
void co_sync_set_ind(co_sync_t *sync, co_sync_ind_t *ind, void *data)
Sets the indication function invoked after a CANopen SYNC message is received or transmitted.
Definition: sync.c:351
co_dev_find_obj
co_obj_t * co_dev_find_obj(const co_dev_t *dev, co_unsigned16_t idx)
Finds an object in the object dictionary of a CANopen device.
Definition: dev.c:279