Skip to content
Snippets Groups Projects
Commit ce7141f0 authored by Florian Pose's avatar Florian Pose
Browse files

Implemented domain command.

parent 1c112bae
No related branches found
No related tags found
No related merge requests found
......@@ -347,6 +347,38 @@ long eccdev_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
break;
}
case EC_IOCTL_DOMAIN_COUNT:
retval = ec_master_domain_count(master);
break;
case EC_IOCTL_DOMAIN:
{
ec_ioctl_domain_t data;
const ec_domain_t *domain;
if (copy_from_user(&data, (void __user *) arg, sizeof(data))) {
retval = -EFAULT;
break;
}
if (!(domain = ec_master_find_domain(master, data.index))) {
EC_ERR("Domain %u does not exist!\n", data.index);
retval = -EINVAL;
break;
}
data.data_size = domain->data_size;
data.logical_base_address = domain->logical_base_address;
data.working_counter = domain->working_counter;
data.expected_working_counter = domain->expected_working_counter;
if (copy_to_user((void __user *) arg, &data, sizeof(data))) {
retval = -EFAULT;
break;
}
break;
}
default:
retval = -ENOIOCTLCMD;
}
......
......@@ -49,6 +49,8 @@ enum {
EC_IOCTL_SYNC,
EC_IOCTL_PDO,
EC_IOCTL_PDO_ENTRY,
EC_IOCTL_DOMAIN_COUNT,
EC_IOCTL_DOMAIN
};
/*****************************************************************************/
......@@ -123,4 +125,17 @@ typedef struct {
/*****************************************************************************/
typedef struct {
// inputs
unsigned int index;
// outputs
unsigned int data_size;
uint32_t logical_base_address;
uint16_t working_counter;
uint16_t expected_working_counter;
} ec_ioctl_domain_t;
/*****************************************************************************/
#endif
......@@ -62,6 +62,21 @@ void Master::close()
/****************************************************************************/
void Master::showDomains(int domainIndex)
{
if (domainIndex == -1) {
unsigned int numDomains = domainCount(), i;
for (i = 0; i < numDomains; i++) {
showDomain(i);
}
} else {
showDomain(domainIndex);
}
}
/****************************************************************************/
void Master::listSlaves()
{
unsigned int numSlaves = slaveCount(), i;
......@@ -127,6 +142,29 @@ void Master::generateXml(int slavePosition)
/****************************************************************************/
void Master::showDomain(unsigned int domainIndex)
{
ec_ioctl_domain_t data;
getDomain(&data, domainIndex);
unsigned int data_size;
uint32_t logical_base_address;
uint16_t working_counter;
uint16_t expected_working_counter;
cout << "Domain" << domainIndex << ":"
<< " LogBaseAddr 0x"
<< hex << setfill('0') << setw(8) << data.logical_base_address
<< ", Size " << dec << data.data_size
<< ", WorkingCounter "
<< dec << data.working_counter
<< " of " << data.expected_working_counter
<< endl;
}
/****************************************************************************/
void Master::listSlavePdos(uint16_t slavePosition, bool printSlave)
{
ec_ioctl_slave_t slave;
......@@ -275,13 +313,28 @@ void Master::generateSlaveXml(uint16_t slavePosition)
/****************************************************************************/
unsigned int Master::domainCount()
{
int ret;
if ((ret = ioctl(fd, EC_IOCTL_DOMAIN_COUNT, 0)) < 0) {
stringstream err;
err << "Failed to get number of domains: " << strerror(errno);
throw MasterException(err.str());
}
return ret;
}
/****************************************************************************/
unsigned int Master::slaveCount()
{
int ret;
if ((ret = ioctl(fd, EC_IOCTL_SLAVE_COUNT, 0)) < 0) {
stringstream err;
err << "Failed to get slave: " << strerror(errno);
err << "Failed to get number of slaves: " << strerror(errno);
throw MasterException(err.str());
}
......@@ -290,6 +343,23 @@ unsigned int Master::slaveCount()
/****************************************************************************/
void Master::getDomain(ec_ioctl_domain_t *data, unsigned int index)
{
data->index = index;
if (ioctl(fd, EC_IOCTL_DOMAIN, data)) {
stringstream err;
err << "Failed to get domain: ";
if (errno == EINVAL)
err << "Domain " << index << " does not exist!";
else
err << strerror(errno);
throw MasterException(err.str());
}
}
/****************************************************************************/
void Master::getSlave(ec_ioctl_slave_t *slave, uint16_t slaveIndex)
{
slave->position = slaveIndex;
......
......@@ -40,15 +40,19 @@ class Master
void open(unsigned int);
void close();
void showDomains(int);
void listSlaves();
void listPdos(int);
void generateXml(int);
protected:
void showDomain(unsigned int);
void listSlavePdos(uint16_t, bool = false);
void generateSlaveXml(uint16_t);
unsigned int domainCount();
unsigned int slaveCount();
void slaveSyncs(uint16_t);
void getDomain(ec_ioctl_domain_t *, unsigned int);
void getSlave(ec_ioctl_slave_t *, uint16_t);
void getSync(ec_ioctl_sync_t *, uint16_t, uint8_t);
void getPdo(ec_ioctl_pdo_t *, uint16_t, uint8_t, uint8_t);
......
......@@ -17,9 +17,11 @@ using namespace std;
#define DEFAULT_MASTER 0
#define DEFAULT_COMMAND "slaves"
#define DEFAULT_SLAVEPOSITION -1
#define DEFAULT_DOMAININDEX -1
static unsigned int masterIndex = DEFAULT_MASTER;
static int slavePosition = DEFAULT_SLAVEPOSITION;
static int domainIndex = DEFAULT_DOMAININDEX;
static string command = DEFAULT_COMMAND;
/*****************************************************************************/
......@@ -29,16 +31,21 @@ void printUsage()
cerr
<< "Usage: ethercat <COMMAND> [OPTIONS]" << endl
<< "Commands:" << endl
<< " domain Show domain information." << endl
<< " list (ls, slaves) List all slaves (former 'lsec')." << endl
<< " pdos List Pdo mapping of given slaves." << endl
<< " xml Generate slave information xml." << endl
<< "Global options:" << endl
<< " --master -m <master> Index of the master to use. Default: "
<< DEFAULT_MASTER << endl
<< " --slave -s <slave> Positive numerical ring position,"
<< " --slave -s <index> Positive numerical ring position,"
<< endl
<< " or 'all' for all slaves. Default: 'all'."
<< endl
<< " --domain -d <index> Positive numerical index,"
<< endl
<< " or 'all' for all domains. Default: "
<< "'all'." << endl
<< " --help -h Show this help." << endl;
}
......@@ -53,12 +60,13 @@ void getOptions(int argc, char **argv)
//name, has_arg, flag, val
{"master", required_argument, NULL, 'm'},
{"slave", required_argument, NULL, 's'},
{"domain", required_argument, NULL, 'd'},
{"help", no_argument, NULL, 'h'},
{}
};
do {
c = getopt_long(argc, argv, "m:s:h", longOptions, &optionIndex);
c = getopt_long(argc, argv, "m:s:d:h", longOptions, &optionIndex);
switch (c) {
case 'm':
......@@ -87,6 +95,21 @@ void getOptions(int argc, char **argv)
}
break;
case 'd':
if (!strcmp(optarg, "all")) {
domainIndex = -1;
} else {
number = strtoul(optarg, &remainder, 0);
if (remainder == optarg || *remainder || number < 0) {
cerr << "Invalid domain index "
<< optarg << "!" << endl;
printUsage();
exit(1);
}
domainIndex = number;
}
break;
case 'h':
case '?':
printUsage();
......@@ -120,7 +143,9 @@ int main(int argc, char **argv)
try {
master.open(masterIndex);
if (command == "list" || command == "ls" || command == "slaves") {
if (command == "domain") {
master.showDomains(domainIndex);
} else if (command == "list" || command == "ls" || command == "slaves") {
master.listSlaves();
} else if (command == "pdos") {
master.listPdos(slavePosition);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment