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