401 return ecrt_slave_config_sdo(sc, index, subindex, data, 4); |
401 return ecrt_slave_config_sdo(sc, index, subindex, data, 4); |
402 } |
402 } |
403 |
403 |
404 /*****************************************************************************/ |
404 /*****************************************************************************/ |
405 |
405 |
|
406 int ecrt_slave_config_emerg_size(ec_slave_config_t *sc, size_t elements) |
|
407 { |
|
408 ec_ioctl_sc_emerg_t io; |
|
409 int ret; |
|
410 |
|
411 io.config_index = sc->index; |
|
412 io.size = elements; |
|
413 |
|
414 ret = ioctl(sc->master->fd, EC_IOCTL_SC_EMERG_SIZE, &io); |
|
415 if (EC_IOCTL_IS_ERROR(ret)) { |
|
416 fprintf(stderr, "Failed to set emergency ring size: %s\n", |
|
417 strerror(EC_IOCTL_ERRNO(ret))); |
|
418 return -EC_IOCTL_ERRNO(ret); |
|
419 } |
|
420 |
|
421 return 0; |
|
422 } |
|
423 |
|
424 /*****************************************************************************/ |
|
425 |
|
426 int ecrt_slave_config_emerg_pop(ec_slave_config_t *sc, uint8_t *target) |
|
427 { |
|
428 ec_ioctl_sc_emerg_t io; |
|
429 int ret; |
|
430 |
|
431 io.config_index = sc->index; |
|
432 io.target = target; |
|
433 |
|
434 ret = ioctl(sc->master->fd, EC_IOCTL_SC_EMERG_POP, &io); |
|
435 if (EC_IOCTL_IS_ERROR(ret)) { |
|
436 fprintf(stderr, "Failed to get emergency message: %s\n", |
|
437 strerror(EC_IOCTL_ERRNO(ret))); |
|
438 return -EC_IOCTL_ERRNO(ret); |
|
439 } |
|
440 |
|
441 return 0; |
|
442 } |
|
443 |
|
444 /*****************************************************************************/ |
|
445 |
|
446 int ecrt_slave_config_emerg_clear(ec_slave_config_t *sc) |
|
447 { |
|
448 ec_ioctl_sc_emerg_t io; |
|
449 int ret; |
|
450 |
|
451 io.config_index = sc->index; |
|
452 |
|
453 ret = ioctl(sc->master->fd, EC_IOCTL_SC_EMERG_CLEAR, &io); |
|
454 if (EC_IOCTL_IS_ERROR(ret)) { |
|
455 fprintf(stderr, "Failed to clear emergency ring: %s\n", |
|
456 strerror(EC_IOCTL_ERRNO(ret))); |
|
457 return -EC_IOCTL_ERRNO(ret); |
|
458 } |
|
459 |
|
460 return 0; |
|
461 } |
|
462 |
|
463 /*****************************************************************************/ |
|
464 |
|
465 int ecrt_slave_config_emerg_overruns(ec_slave_config_t *sc) |
|
466 { |
|
467 ec_ioctl_sc_emerg_t io; |
|
468 int ret; |
|
469 |
|
470 io.config_index = sc->index; |
|
471 |
|
472 ret = ioctl(sc->master->fd, EC_IOCTL_SC_EMERG_OVERRUNS, &io); |
|
473 if (EC_IOCTL_IS_ERROR(ret)) { |
|
474 fprintf(stderr, "Failed to get emergency overruns: %s\n", |
|
475 strerror(EC_IOCTL_ERRNO(ret))); |
|
476 return -EC_IOCTL_ERRNO(ret); |
|
477 } |
|
478 |
|
479 return io.overruns; |
|
480 } |
|
481 |
|
482 /*****************************************************************************/ |
|
483 |
406 void ec_slave_config_add_sdo_request(ec_slave_config_t *sc, |
484 void ec_slave_config_add_sdo_request(ec_slave_config_t *sc, |
407 ec_sdo_request_t *req) |
485 ec_sdo_request_t *req) |
408 { |
486 { |
409 if (sc->first_sdo_request) { |
487 if (sc->first_sdo_request) { |
410 ec_sdo_request_t *r = sc->first_sdo_request; |
488 ec_sdo_request_t *r = sc->first_sdo_request; |