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
56static void co_nmt_srv_init_pdo(
57 struct co_nmt_srv *srv, can_net_t *net, co_dev_t *dev);
59static void co_nmt_srv_fini_pdo(struct co_nmt_srv *srv);
60#if !LELY_NO_CO_RPDO
62static 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
68static void co_nmt_srv_init_sdo(
69 struct co_nmt_srv *srv, can_net_t *net, co_dev_t *dev);
71static void co_nmt_srv_fini_sdo(struct co_nmt_srv *srv);
72
73#if !LELY_NO_CO_SYNC
75static void co_nmt_srv_init_sync(
76 struct co_nmt_srv *srv, can_net_t *net, co_dev_t *dev);
78static void co_nmt_srv_fini_sync(struct co_nmt_srv *srv);
80static void co_nmt_srv_sync_ind(
81 co_sync_t *sync, co_unsigned8_t cnt, void *data);
83static 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
89static void co_nmt_srv_init_time(
90 struct co_nmt_srv *srv, can_net_t *net, co_dev_t *dev);
92static void co_nmt_srv_fini_time(struct co_nmt_srv *srv);
93#endif
94
95#if !LELY_NO_CO_EMCY
97static void co_nmt_srv_init_emcy(
98 struct co_nmt_srv *srv, can_net_t *net, co_dev_t *dev);
100static void co_nmt_srv_fini_emcy(struct co_nmt_srv *srv);
101#endif
102
103#if !LELY_NO_CO_LSS
105static void co_nmt_srv_init_lss(struct co_nmt_srv *srv, co_nmt_t *nmt);
107static void co_nmt_srv_fini_lss(struct co_nmt_srv *srv);
108#endif
109
110void
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
151void
153{
154 assert(srv);
155
156 co_nmt_srv_set(srv, NULL, 0);
157}
158
159void
160co_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)
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)
182#if !LELY_NO_CO_RPDO || !LELY_NO_CO_TPDO
183 if ((srv->set & ~set) & CO_NMT_SRV_PDO)
185#endif
186
187 if (nmt) {
188 can_net_t *net = co_nmt_get_net(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
217static 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;
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
290error:
291 diag(DIAG_ERROR, get_errc(), "unable to initialize PDO services");
292}
293
294static 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
322static void
323co_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
336static 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
405error:
406 diag(DIAG_ERROR, get_errc(), "unable to initialize SDO services");
407}
408
409static 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
436static 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
459static 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
471static void
472co_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
481static void
482co_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
496static 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
515static 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
531static 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
550static 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
566static 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
584static 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
This header file is part of the CANopen library; it contains the device description declarations.
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
int co_dev_get_lss(const co_dev_t *dev)
Returns 1 if LSS is supported and 0 if not.
Definition: dev.c:535
This header file is part of the CANopen library; it contains the time stamp (TIME) object declaration...
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
void co_time_destroy(co_time_t *time)
Destroys a CANopen TIME producer/consumer service.
Definition: time.c:267
This header file is part of the CANopen library; it contains the Client-SDO declarations.
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
void co_csdo_destroy(co_csdo_t *sdo)
Destroys a CANopen Client-SDO service.
Definition: csdo.c:1024
This header file is part of the utilities library; it contains the diagnostic declarations.
@ DIAG_ERROR
An error.
Definition: diag.h:57
void diag(enum diag_severity severity, int errc, const char *format,...)
Emits a diagnostic message.
Definition: diag.c:171
This header file is part of the CANopen library; it contains the emergency (EMCY) object declarations...
void co_emcy_destroy(co_emcy_t *emcy)
Destroys a CANopen EMCY producer/consumer service.
Definition: emcy.c:360
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
int get_errc(void)
Returns the last (thread-specific) native error code set by a system call or library function.
Definition: errnum.c:932
void set_errc(int errc)
Sets the current (thread-specific) native error code to errc.
Definition: errnum.c:944
int errno2c(int errnum)
Transforms a standard C error number to a native error code.
Definition: errnum.c:46
#define CO_NUM_SDOS
The maximum number of Client/Server-SDOs.
Definition: sdo.h:178
This header file is part of the CANopen library; it contains the Layer Setting Services (LSS) and pro...
void co_lss_destroy(co_lss_t *lss)
Destroys a CANopen LSS master/slave service.
Definition: lss.c:810
co_lss_t * co_lss_create(co_nmt_t *nmt)
Creates a new CANopen LSS master/slave service.
Definition: lss.c:783
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
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
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_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
static void co_nmt_srv_fini_sync(struct co_nmt_srv *srv)
Finalizes the SYNC producer/consumer service.
Definition: nmt_srv.c:460
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
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
void co_nmt_srv_fini(struct co_nmt_srv *srv)
Finalizes a CANopen NMT service manager.
Definition: nmt_srv.c:152
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
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
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
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
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
static void co_nmt_srv_fini_pdo(struct co_nmt_srv *srv)
Finalizes all Receive/Transmit-PDO services.
Definition: nmt_srv.c:295
static void co_nmt_srv_fini_time(struct co_nmt_srv *srv)
Finalizes the TIME producer/consumer service.
Definition: nmt_srv.c:516
static void co_nmt_srv_fini_emcy(struct co_nmt_srv *srv)
Finalizes the EMCY producer/consumer service.
Definition: nmt_srv.c:551
static void co_nmt_srv_fini_sdo(struct co_nmt_srv *srv)
Finalizes all Server/Client-SDO services.
Definition: nmt_srv.c:410
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
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
static void co_nmt_srv_fini_lss(struct co_nmt_srv *srv)
Finalizes the EMCY master/slave service.
Definition: nmt_srv.c:585
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
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
This is the internal header file of the NMT service manager declarations.
#define CO_NMT_SRV_LSS
The LSS master/slave service.
Definition: nmt_srv.h:95
#define CO_NMT_SRV_SDO
The Server/Client-SDO services.
Definition: nmt_srv.h:83
#define CO_NMT_SRV_TIME
The TIME producer/consumer service.
Definition: nmt_srv.h:89
#define CO_NMT_SRV_EMCY
The EMCY producer/consumer service.
Definition: nmt_srv.h:92
#define CO_NMT_SRV_SYNC
The SYNC producer/consumer service.
Definition: nmt_srv.h:86
#define CO_NMT_SRV_PDO
The Receive/Transmit-PDO services.
Definition: nmt_srv.h:80
#define CO_NUM_PDOS
The maximum number of Receive/Transmit-PDOs.
Definition: pdo.h:28
This header file is part of the CANopen library; it contains the Receive-PDO declarations.
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
void co_rpdo_destroy(co_rpdo_t *pdo)
Destroys a CANopen Receive-PDO service.
Definition: rpdo.c:298
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
This is the internal header file of the CANopen library.
This header file is part of the CANopen library; it contains the Server-SDO declarations.
void co_ssdo_destroy(co_ssdo_t *sdo)
Destroys a CANopen Server-SDO service.
Definition: ssdo.c:677
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
This header file is part of the C11 and POSIX compatibility library; it includes <stdlib....
A CAN network interface.
Definition: net.c:37
A CANopen Client-SDO.
Definition: csdo.c:71
A CANopen device.
Definition: dev.h:30
A CANopen NMT master/slave service.
Definition: nmt.c:148
A CANopen object.
Definition: obj.h:31
A CANopen Receive-PDO.
Definition: rpdo.c:44
A CANopen Server-SDO.
Definition: ssdo.c:63
A CANopen SYNC producer/consumer service.
Definition: sync.c:40
A CANopen Transmit-PDO.
Definition: tpdo.c:53
A CANopen NMT service manager.
Definition: nmt_srv.h:30
co_tpdo_t ** tpdos
An array of pointers to the Transmit-PDO services.
Definition: nmt_srv.h:47
co_unsigned16_t ntpdo
The number of Transmit-PDO services.
Definition: nmt_srv.h:49
co_lss_t * lss
A pointer to the LSS master/slave service.
Definition: nmt_srv.h:75
co_ssdo_t ** ssdos
An array of pointers to the Server-SDO services.
Definition: nmt_srv.h:52
int set
The currently enabled CANopen services (any combination of CO_NMT_SRV_PDO, CO_NMT_SRV_SDO,...
Definition: nmt_srv.h:38
co_rpdo_t ** rpdos
An array of pointers to the Receive-PDO services.
Definition: nmt_srv.h:41
co_unsigned8_t ncsdo
The number of Client-SDO services.
Definition: nmt_srv.h:59
co_unsigned8_t nssdo
The number of Server-SDO services.
Definition: nmt_srv.h:54
co_nmt_t * nmt
A pointer to the NMT master/slave service.
Definition: nmt_srv.h:32
co_time_t * time
A pointer to the TIME producer/consumer service.
Definition: nmt_srv.h:67
co_csdo_t ** csdos
An array of pointers to the Client-SDO services.
Definition: nmt_srv.h:57
co_emcy_t * emcy
A pointer to the EMCY producer/consumer service.
Definition: nmt_srv.h:71
co_unsigned16_t nrpdo
The number of Receive-PDO services.
Definition: nmt_srv.h:43
co_sync_t * sync
A pointer to the SYNC producer/consumer service.
Definition: nmt_srv.h:63
This header file is part of the CANopen library; it contains the synchronization (SYNC) object declar...
void co_sync_destroy(co_sync_t *sync)
Destroys a CANopen SYNC producer/consumer service.
Definition: sync.c:238
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
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_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
This header file is part of the CANopen library; it contains the Transmit-PDO declarations.
void co_tpdo_destroy(co_tpdo_t *pdo)
Destroys a CANopen Transmit-PDO service.
Definition: tpdo.c:330
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