mirror of
https://gitlab.com/etherlab.org/ethercat.git
synced 2026-02-08 04:41:44 +08:00
141 lines
3.2 KiB
C++
141 lines
3.2 KiB
C++
/*****************************************************************************
|
|
*
|
|
* $Id$
|
|
*
|
|
****************************************************************************/
|
|
|
|
#include <sys/types.h>
|
|
#include <sys/stat.h>
|
|
#include <fcntl.h>
|
|
#include <errno.h>
|
|
#include <sys/ioctl.h>
|
|
|
|
#include <iostream>
|
|
#include <iomanip>
|
|
#include <sstream>
|
|
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 "???";
|
|
}
|
|
}
|
|
|
|
/****************************************************************************/
|