Implemented 'data' command.

This commit is contained in:
Florian Pose 2008-06-04 10:41:50 +00:00
parent ea384440f4
commit c74e50706b
5 changed files with 94 additions and 7 deletions

View File

@ -379,6 +379,37 @@ long eccdev_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
break;
}
case EC_IOCTL_DATA:
{
ec_ioctl_data_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.domain_index))) {
EC_ERR("Domain %u does not exist!\n", data.domain_index);
retval = -EINVAL;
break;
}
if (domain->data_size != data.data_size) {
EC_ERR("Data size mismatch %u/%u!\n",
data.data_size, domain->data_size);
retval = -EFAULT;
break;
}
if (copy_to_user((void __user *) data.target, domain->data,
domain->data_size)) {
retval = -EFAULT;
break;
}
break;
}
default:
retval = -ENOIOCTLCMD;
}

View File

@ -50,7 +50,8 @@ enum {
EC_IOCTL_PDO,
EC_IOCTL_PDO_ENTRY,
EC_IOCTL_DOMAIN_COUNT,
EC_IOCTL_DOMAIN
EC_IOCTL_DOMAIN,
EC_IOCTL_DATA
};
/*****************************************************************************/
@ -138,4 +139,13 @@ typedef struct {
/*****************************************************************************/
typedef struct {
// inputs
unsigned int domain_index;
unsigned int data_size;
unsigned char *target;
} ec_ioctl_data_t;
/*****************************************************************************/
#endif

View File

@ -62,6 +62,21 @@ void Master::close()
/****************************************************************************/
void Master::outputData(int domainIndex)
{
if (domainIndex == -1) {
unsigned int numDomains = domainCount(), i;
for (i = 0; i < numDomains; i++) {
outputDomainData(i);
}
} else {
outputDomainData(domainIndex);
}
}
/****************************************************************************/
void Master::showDomains(int domainIndex)
{
if (domainIndex == -1) {
@ -142,17 +157,43 @@ void Master::generateXml(int slavePosition)
/****************************************************************************/
void Master::outputDomainData(unsigned int domainIndex)
{
ec_ioctl_domain_t domain;
ec_ioctl_data_t data;
unsigned char *processData;
unsigned int i;
getDomain(&domain, domainIndex);
processData = new unsigned char[domain.data_size];
data.domain_index = domainIndex;
data.data_size = domain.data_size;
data.target = processData;
if (ioctl(fd, EC_IOCTL_DATA, &data) < 0) {
stringstream err;
err << "Failed to get domain data: " << strerror(errno);
delete [] processData;
throw MasterException(err.str());
}
for (i = 0; i < data.data_size; i++)
cout << processData[i];
cout.flush();
delete [] processData;
}
/****************************************************************************/
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

View File

@ -40,12 +40,14 @@ class Master
void open(unsigned int);
void close();
void outputData(int);
void showDomains(int);
void listSlaves();
void listPdos(int);
void generateXml(int);
protected:
void outputDomainData(unsigned int);
void showDomain(unsigned int);
void listSlavePdos(uint16_t, bool = false);
void generateSlaveXml(uint16_t);

View File

@ -31,6 +31,7 @@ void printUsage()
cerr
<< "Usage: ethercat <COMMAND> [OPTIONS]" << endl
<< "Commands:" << endl
<< " data Output binary domain process data." << endl
<< " domain Show domain information." << endl
<< " list (ls, slaves) List all slaves (former 'lsec')." << endl
<< " pdos List Pdo mapping of given slaves." << endl
@ -143,7 +144,9 @@ int main(int argc, char **argv)
try {
master.open(masterIndex);
if (command == "domain") {
if (command == "data") {
master.outputData(domainIndex);
} else if (command == "domain") {
master.showDomains(domainIndex);
} else if (command == "list" || command == "ls" || command == "slaves") {
master.listSlaves();