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 |