master/device.c
branchredundancy
changeset 2156 71425e6120d8
parent 1956 f461dc0d145a
child 2158 69f2b2702336
equal deleted inserted replaced
2142:26c74f035ab0 2156:71425e6120d8
   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.