tool/MasterDevice.cpp
changeset 1826 ec6223c3b7ec
parent 1804 742607c464c4
child 1831 1875b9fea0ba
equal deleted inserted replaced
1825:65781b048a47 1826:ec6223c3b7ec
    40 
    40 
    41 #include "MasterDevice.h"
    41 #include "MasterDevice.h"
    42 
    42 
    43 /****************************************************************************/
    43 /****************************************************************************/
    44 
    44 
    45 MasterDevice::MasterDevice()
    45 MasterDevice::MasterDevice(unsigned int index):
    46 {
    46     index(index),
    47     index = 0;
    47     masterCount(0U),
    48     fd = -1;
    48     fd(-1)
       
    49 {
    49 }
    50 }
    50 
    51 
    51 /****************************************************************************/
    52 /****************************************************************************/
    52 
    53 
    53 MasterDevice::~MasterDevice()
    54 MasterDevice::~MasterDevice()
    67 void MasterDevice::open(Permissions perm)
    68 void MasterDevice::open(Permissions perm)
    68 {
    69 {
    69     stringstream deviceName;
    70     stringstream deviceName;
    70 
    71 
    71     if (fd == -1) { // not already open
    72     if (fd == -1) { // not already open
       
    73         ec_ioctl_module_t module_data;
    72         deviceName << "/dev/EtherCAT" << index;
    74         deviceName << "/dev/EtherCAT" << index;
    73 
    75 
    74         if ((fd = ::open(deviceName.str().c_str(),
    76         if ((fd = ::open(deviceName.str().c_str(),
    75                         perm == ReadWrite ? O_RDWR : O_RDONLY)) == -1) {
    77                         perm == ReadWrite ? O_RDWR : O_RDONLY)) == -1) {
    76             stringstream err;
    78             stringstream err;
    77             err << "Failed to open master device " << deviceName.str() << ": "
    79             err << "Failed to open master device " << deviceName.str() << ": "
    78                 << strerror(errno);
    80                 << strerror(errno);
    79             throw MasterDeviceException(err);
    81             throw MasterDeviceException(err);
    80         }
    82         }
       
    83 
       
    84         getModule(&module_data);
       
    85         if (module_data.ioctl_version_magic != EC_IOCTL_VERSION_MAGIC) {
       
    86             stringstream err;
       
    87             err << "ioctl() version magic is differing: "
       
    88                 << deviceName << ": " << module_data.ioctl_version_magic
       
    89                 << ", ethercat tool: " << EC_IOCTL_VERSION_MAGIC;
       
    90             throw MasterDeviceException(err);
       
    91         }
       
    92         masterCount = module_data.master_count;
    81     }
    93     }
    82 }
    94 }
    83 
    95 
    84 /****************************************************************************/
    96 /****************************************************************************/
    85 
    97 
    86 void MasterDevice::close()
    98 void MasterDevice::close()
    87 {
    99 {
    88     if (fd != -1) {
   100     if (fd != -1) {
    89         ::close(fd);
   101         ::close(fd);
    90         fd = -1;
   102         fd = -1;
       
   103     }
       
   104 }
       
   105 
       
   106 /****************************************************************************/
       
   107 
       
   108 void MasterDevice::getModule(ec_ioctl_module_t *data)
       
   109 {
       
   110     if (ioctl(fd, EC_IOCTL_MODULE, data) < 0) {
       
   111         stringstream err;
       
   112         err << "Failed to get module information: " << strerror(errno);
       
   113         throw MasterDeviceException(err);
    91     }
   114     }
    92 }
   115 }
    93 
   116 
    94 /****************************************************************************/
   117 /****************************************************************************/
    95 
   118