494 * \ingroup DeviceInterface |
494 * \ingroup DeviceInterface |
495 */ |
495 */ |
496 void ecdev_withdraw(ec_device_t *device /**< EtherCAT device */) |
496 void ecdev_withdraw(ec_device_t *device /**< EtherCAT device */) |
497 { |
497 { |
498 ec_master_t *master = device->master; |
498 ec_master_t *master = device->master; |
499 char str[20]; |
499 char dev_str[20], mac_str[20]; |
500 |
500 |
501 ec_mac_print(device->dev->dev_addr, str); |
501 ec_mac_print(device->dev->dev_addr, mac_str); |
502 EC_MASTER_INFO(master, "Releasing main device %s.\n", str); |
502 |
|
503 if (device == &master->main_device) { |
|
504 sprintf(dev_str, "main"); |
|
505 } else if (device == &master->backup_device) { |
|
506 sprintf(dev_str, "backup"); |
|
507 } else { |
|
508 EC_MASTER_WARN(master, "%s() called with unknown device %s!\n", |
|
509 __func__, mac_str); |
|
510 sprintf(dev_str, "UNKNOWN"); |
|
511 } |
|
512 |
|
513 EC_MASTER_INFO(master, "Releasing %s device %s.\n", dev_str, mac_str); |
503 |
514 |
504 down(&master->device_sem); |
515 down(&master->device_sem); |
505 ec_device_detach(device); |
516 ec_device_detach(device); |
506 up(&master->device_sem); |
517 up(&master->device_sem); |
507 } |
518 } |
514 * \ingroup DeviceInterface |
525 * \ingroup DeviceInterface |
515 */ |
526 */ |
516 int ecdev_open(ec_device_t *device /**< EtherCAT device */) |
527 int ecdev_open(ec_device_t *device /**< EtherCAT device */) |
517 { |
528 { |
518 int ret; |
529 int ret; |
|
530 ec_master_t *master = device->master; |
519 |
531 |
520 ret = ec_device_open(device); |
532 ret = ec_device_open(device); |
521 if (ret) { |
533 if (ret) { |
522 EC_MASTER_ERR(device->master, "Failed to open device!\n"); |
534 EC_MASTER_ERR(master, "Failed to open device!\n"); |
523 return ret; |
535 return ret; |
524 } |
536 } |
525 |
537 |
526 ret = ec_master_enter_idle_phase(device->master); |
538 if (master->main_device.open && |
527 if (ret) { |
539 (ec_mac_is_zero(master->backup_mac) || |
528 EC_MASTER_ERR(device->master, "Failed to enter IDLE phase!\n"); |
540 master->backup_device.open)) { |
529 return ret; |
541 ret = ec_master_enter_idle_phase(device->master); |
|
542 if (ret) { |
|
543 EC_MASTER_ERR(device->master, "Failed to enter IDLE phase!\n"); |
|
544 return ret; |
|
545 } |
530 } |
546 } |
531 |
547 |
532 return 0; |
548 return 0; |
533 } |
549 } |
534 |
550 |
539 * \return 0 on success, else < 0 |
555 * \return 0 on success, else < 0 |
540 * \ingroup DeviceInterface |
556 * \ingroup DeviceInterface |
541 */ |
557 */ |
542 void ecdev_close(ec_device_t *device /**< EtherCAT device */) |
558 void ecdev_close(ec_device_t *device /**< EtherCAT device */) |
543 { |
559 { |
544 ec_master_leave_idle_phase(device->master); |
560 ec_master_t *master = device->master; |
545 |
561 |
546 if (ec_device_close(device)) |
562 if (master->phase == EC_IDLE) { |
547 EC_MASTER_WARN(device->master, "Failed to close device!\n"); |
563 ec_master_leave_idle_phase(master); |
|
564 } |
|
565 |
|
566 if (ec_device_close(device)) { |
|
567 EC_MASTER_WARN(master, "Failed to close device!\n"); |
|
568 } |
548 } |
569 } |
549 |
570 |
550 /*****************************************************************************/ |
571 /*****************************************************************************/ |
551 |
572 |
552 /** Accepts a received frame. |
573 /** Accepts a received frame. |