fp@922: /***************************************************************************** fp@922: * fp@922: * $Id$ fp@922: * fp@922: ****************************************************************************/ fp@922: fp@922: #include fp@922: #include fp@922: #include fp@922: #include fp@922: #include fp@922: fp@922: #include fp@922: #include fp@922: #include fp@922: using namespace std; fp@922: fp@922: #include "Master.h" fp@922: #include "../master/ioctl.h" fp@922: fp@922: /****************************************************************************/ fp@922: fp@922: Master::Master() fp@922: { fp@922: index = 0; fp@922: fd = -1; fp@922: } fp@922: fp@922: /****************************************************************************/ fp@922: fp@922: Master::~Master() fp@922: { fp@922: close(); fp@922: } fp@922: fp@922: /****************************************************************************/ fp@922: fp@922: void Master::open(unsigned int index) fp@922: { fp@922: stringstream deviceName; fp@922: fp@922: Master::index = index; fp@922: fp@922: deviceName << "/dev/EtherCAT" << index; fp@922: fp@922: if ((fd = ::open(deviceName.str().c_str(), O_RDONLY)) == -1) { fp@922: stringstream err; fp@922: err << "Failed to open master device " << deviceName.str() << ": " fp@922: << strerror(errno); fp@922: throw MasterException(err.str()); fp@922: } fp@922: } fp@922: fp@922: /****************************************************************************/ fp@922: fp@922: void Master::close() fp@922: { fp@922: if (fd == -1) fp@922: return; fp@922: fp@922: ::close(fd); fp@922: } fp@922: fp@922: /****************************************************************************/ fp@922: fp@922: unsigned int Master::slaveCount() fp@922: { fp@922: unsigned int numSlaves; fp@922: fp@922: if (ioctl(fd, EC_IOCTL_SLAVE_COUNT, &numSlaves)) { fp@922: stringstream err; fp@922: err << "Failed to get number of slaves: " << strerror(errno); fp@922: throw MasterException(err.str()); fp@922: } fp@922: fp@922: return numSlaves; fp@922: } fp@922: fp@922: /****************************************************************************/ fp@922: fp@922: void Master::listSlaves() fp@922: { fp@922: unsigned int numSlaves = slaveCount(), i; fp@922: struct ec_ioctl_slave_info *infos, *info; fp@922: uint16_t lastAlias, aliasIndex; fp@922: fp@922: if (!numSlaves) fp@922: return; fp@922: fp@922: infos = new struct ec_ioctl_slave_info[numSlaves]; fp@922: fp@922: if (ioctl(fd, EC_IOCTL_SLAVE_INFO, infos)) { fp@922: stringstream err; fp@922: err << "Failed to get slave information: " << strerror(errno); fp@922: throw MasterException(err.str()); fp@922: } fp@922: fp@922: lastAlias = 0; fp@922: aliasIndex = 0; fp@922: for (i = 0; i < numSlaves; i++) { fp@922: info = &infos[i]; fp@922: cout << setw(2) << info->ring_position << " "; fp@922: fp@922: if (info->alias) { fp@922: lastAlias = info->alias; fp@922: aliasIndex = 0; fp@922: } fp@922: if (lastAlias) { fp@922: cout << setw(10) << "#" << lastAlias << ":" << aliasIndex; fp@922: } fp@922: fp@922: cout << " " << slaveState(info->state) << " "; fp@922: fp@922: if (strlen(info->description)) { fp@922: cout << info->description; fp@922: } else { fp@922: cout << "0x" << hex << setfill('0') << info->vendor_id fp@922: << ":0x" << info->product_code; fp@922: } fp@922: fp@922: cout << endl; fp@922: } fp@922: fp@922: delete [] infos; fp@922: } fp@922: fp@922: /****************************************************************************/ fp@922: fp@922: string Master::slaveState(uint8_t state) const fp@922: { fp@922: switch (state) { fp@922: case 1: return "INIT"; fp@922: case 2: return "PREOP"; fp@922: case 4: return "SAFEOP"; fp@922: case 8: return "OP"; fp@922: default: return "???"; fp@922: } fp@922: } fp@922: fp@922: /****************************************************************************/