Added configuration listing command.
--- a/TODO Fri Jun 27 08:58:04 2008 +0000
+++ b/TODO Fri Jun 27 09:31:20 2008 +0000
@@ -9,16 +9,15 @@
Version 1.4.0:
* Move EC_NUM_SYNCS define to ecrt.h.
-* Read Pdo mapping for unknown Pdos.
+* Read Pdo mapping for unknown Pdos before configuring it.
* Attach Pdo names from SII or Coe dictioary to Pdos read via CoE.
* Make scanning and configuration run parallel (each).
* Adapt remaining examples.
* READMEs for examples.
* Update documentation.
-* ethercat 'list_config'
-* Stop master thread at ecrt_master_request().
* Overthink display style of hex numbers.
* Remove #x:y alias output.
+* Add -a and -p switches for 'ethercat config' command.
* Race in jiffies frame timeout.
* FoE
* Allow master requesting when in ORPHANED phase
@@ -42,6 +41,7 @@
Smaller issues:
+* Stop master thread at ecrt_master_request() to get rid of allow_* flags.
* Evaluate SII Size field (0x003E) to determine maximum SII memory size.
* Unite fsm_pdo_mapping, fsm_pdo_config and fsm_coe_map.
* Clear sync managers in INIT.
--- a/tools/Master.cpp Fri Jun 27 08:58:04 2008 +0000
+++ b/tools/Master.cpp Fri Jun 27 09:31:20 2008 +0000
@@ -173,91 +173,14 @@
/*****************************************************************************/
-/**
- * Lists the bus configuration.
+/** Lists the bus configuration.
*/
-void Master::showConfig()
-{
- ec_ioctl_master_t master;
- unsigned int i, j, k, l;
- ec_ioctl_config_t config;
- ec_ioctl_config_pdo_t pdo;
- ec_ioctl_config_pdo_entry_t entry;
- ec_ioctl_config_sdo_t sdo;
-
- open(Read);
- getMaster(&master);
-
- for (i = 0; i < master.config_count; i++) {
- getConfig(&config, i);
-
- cout << "Alias: 0x"
- << hex << setfill('0') << setw(4) << config.alias << endl
- << "Position: " << dec << config.position << endl
- << "Vendor Id: 0x"
- << hex << setw(8) << config.vendor_id << endl
- << "Product code: 0x"
- << hex << setw(8) << config.product_code << endl
- << "Attached: " << (config.attached ? "yes" : "no") << endl
- << "Operational: " << (config.operational ? "yes" : "no") << endl;
-
- for (j = 0; j < 16; j++) {
- if (config.syncs[j].pdo_count) {
- cout << "SM" << dec << j << " ("
- << (config.syncs[j].dir == EC_DIR_INPUT
- ? "Input" : "Output") << ")" << endl;
- for (k = 0; k < config.syncs[j].pdo_count; k++) {
- getConfigPdo(&pdo, i, j, k);
-
- cout << " Pdo 0x"
- << hex << setfill('0') << setw(4) << pdo.index
- << " \"" << pdo.name << "\"" << endl;
-
- for (l = 0; l < pdo.entry_count; l++) {
- getConfigPdoEntry(&entry, i, j, k, l);
-
- cout << " Pdo entry 0x"
- << hex << setfill('0') << setw(4) << entry.index
- << ":" << setw(2) << (unsigned int) entry.subindex
- << ", " << dec << (unsigned int) entry.bit_length
- << " bit, \"" << entry.name << "\"" << endl;
- }
- }
- }
- }
-
- if (config.sdo_count) {
- cout << "Sdo configuration:" << endl;
- for (j = 0; j < config.sdo_count; j++) {
- getConfigSdo(&sdo, i, j);
-
- cout << " 0x"
- << hex << setfill('0') << setw(4) << sdo.index
- << ":" << setw(2) << (unsigned int) sdo.subindex
- << ", " << sdo.size << " byte: " << hex;
-
- switch (sdo.size) {
- case 1:
- cout << "0x" << setw(2)
- << (unsigned int) *(uint8_t *) &sdo.data;
- break;
- case 2:
- cout << "0x" << setw(4)
- << le16tocpu(*(uint16_t *) &sdo.data);
- break;
- case 4:
- cout << "0x" << setw(8)
- << le32tocpu(*(uint32_t *) &sdo.data);
- break;
- default:
- cout << "???";
- }
-
- cout << endl;
- }
- }
-
- cout << endl;
+void Master::showConfigs(bool verbose)
+{
+ if (verbose) {
+ showConfigs();
+ } else {
+ listConfigs();
}
}
@@ -1036,6 +959,180 @@
delete [] data.words;
}
+/*****************************************************************************/
+
+/** Lists the complete bus configuration.
+ */
+void Master::showConfigs()
+{
+ ec_ioctl_master_t master;
+ unsigned int i, j, k, l;
+ ec_ioctl_config_t config;
+ ec_ioctl_config_pdo_t pdo;
+ ec_ioctl_config_pdo_entry_t entry;
+ ec_ioctl_config_sdo_t sdo;
+
+ open(Read);
+ getMaster(&master);
+
+ for (i = 0; i < master.config_count; i++) {
+ getConfig(&config, i);
+
+ cout << "Alias: 0x"
+ << hex << setfill('0') << setw(4) << config.alias << endl
+ << "Position: " << dec << config.position << endl
+ << "Vendor Id: 0x"
+ << hex << setw(8) << config.vendor_id << endl
+ << "Product code: 0x"
+ << hex << setw(8) << config.product_code << endl
+ << "Attached: " << (config.attached ? "yes" : "no") << endl
+ << "Operational: " << (config.operational ? "yes" : "no") << endl;
+
+ for (j = 0; j < 16; j++) {
+ if (config.syncs[j].pdo_count) {
+ cout << "SM" << dec << j << " ("
+ << (config.syncs[j].dir == EC_DIR_INPUT
+ ? "Input" : "Output") << ")" << endl;
+ for (k = 0; k < config.syncs[j].pdo_count; k++) {
+ getConfigPdo(&pdo, i, j, k);
+
+ cout << " Pdo 0x"
+ << hex << setfill('0') << setw(4) << pdo.index
+ << " \"" << pdo.name << "\"" << endl;
+
+ for (l = 0; l < pdo.entry_count; l++) {
+ getConfigPdoEntry(&entry, i, j, k, l);
+
+ cout << " Pdo entry 0x"
+ << hex << setfill('0') << setw(4) << entry.index
+ << ":" << setw(2) << (unsigned int) entry.subindex
+ << ", " << dec << (unsigned int) entry.bit_length
+ << " bit, \"" << entry.name << "\"" << endl;
+ }
+ }
+ }
+ }
+
+ if (config.sdo_count) {
+ cout << "Sdo configuration:" << endl;
+ for (j = 0; j < config.sdo_count; j++) {
+ getConfigSdo(&sdo, i, j);
+
+ cout << " 0x"
+ << hex << setfill('0') << setw(4) << sdo.index
+ << ":" << setw(2) << (unsigned int) sdo.subindex
+ << ", " << sdo.size << " byte: " << hex;
+
+ switch (sdo.size) {
+ case 1:
+ cout << "0x" << setw(2)
+ << (unsigned int) *(uint8_t *) &sdo.data;
+ break;
+ case 2:
+ cout << "0x" << setw(4)
+ << le16tocpu(*(uint16_t *) &sdo.data);
+ break;
+ case 4:
+ cout << "0x" << setw(8)
+ << le32tocpu(*(uint32_t *) &sdo.data);
+ break;
+ default:
+ cout << "???";
+ }
+
+ cout << endl;
+ }
+ }
+
+ cout << endl;
+ }
+}
+
+/*****************************************************************************/
+
+struct ConfigInfo {
+ string alias;
+ string pos;
+ string ident;
+ string att;
+ string op;
+};
+
+/** Lists the bus configuration.
+ */
+void Master::listConfigs()
+{
+ ec_ioctl_master_t master;
+ unsigned int i;
+ ec_ioctl_config_t config;
+ stringstream str;
+ ConfigInfo info;
+ typedef list<ConfigInfo> ConfigInfoList;
+ ConfigInfoList list;
+ ConfigInfoList::const_iterator iter;
+ unsigned int maxAliasWidth = 0, maxPosWidth = 0,
+ maxAttWidth = 0, maxOpWidth = 0;
+
+ open(Read);
+ getMaster(&master);
+
+ for (i = 0; i < master.config_count; i++) {
+ getConfig(&config, i);
+
+ str << dec << config.alias;
+ info.alias = str.str();
+ str.clear();
+ str.str("");
+
+ str << dec << config.position;
+ info.pos = str.str();
+ str.clear();
+ str.str("");
+
+ str << "0x"
+ << hex << setfill('0') << setw(8) << config.vendor_id
+ << "/0x"
+ << hex << setw(8) << config.product_code;
+ info.ident = str.str();
+ str.clear();
+ str.str("");
+
+ str << (config.attached ? "attached" : "-");
+ info.att = str.str();
+ str.clear();
+ str.str("");
+
+ str << (config.operational ? "operational" : "-");
+ info.op = str.str();
+ str.clear();
+ str.str("");
+
+ list.push_back(info);
+
+ if (info.alias.length() > maxAliasWidth)
+ maxAliasWidth = info.alias.length();
+ if (info.pos.length() > maxPosWidth)
+ maxPosWidth = info.pos.length();
+ if (info.att.length() > maxAttWidth)
+ maxAttWidth = info.att.length();
+ if (info.op.length() > maxOpWidth)
+ maxOpWidth = info.op.length();
+ }
+
+ for (iter = list.begin(); iter != list.end(); iter++) {
+ cout << setfill(' ') << right
+ << setw(maxAliasWidth) << iter->alias
+ << ":" << left
+ << setw(maxPosWidth) << iter->pos
+ << " "
+ << iter->ident
+ << " "
+ << setw(maxAttWidth) << iter->att << " "
+ << setw(maxOpWidth) << iter->op << " "
+ << endl;
+ }
+}
+
/****************************************************************************/
void Master::outputDomainData(unsigned int domainIndex)
--- a/tools/Master.h Fri Jun 27 08:58:04 2008 +0000
+++ b/tools/Master.h Fri Jun 27 09:31:20 2008 +0000
@@ -43,7 +43,7 @@
void setIndex(unsigned int);
void writeAlias(int, bool, const vector<string> &);
- void showConfig();
+ void showConfigs(bool);
void outputData(int);
void setDebug(const vector<string> &);
void showDomains(int);
@@ -64,6 +64,8 @@
void close();
void writeSlaveAlias(uint16_t, uint16_t);
+ void showConfigs();
+ void listConfigs();
void outputDomainData(unsigned int);
void showDomain(unsigned int);
void listSlavePdos(uint16_t, bool = false, bool = false);
--- a/tools/main.cpp Fri Jun 27 08:58:04 2008 +0000
+++ b/tools/main.cpp Fri Jun 27 09:31:20 2008 +0000
@@ -188,7 +188,7 @@
if (command == "alias") {
master.writeAlias(slavePosition, force, commandArgs);
} else if (command == "config") {
- master.showConfig();
+ master.showConfigs(verbose);
} else if (command == "data") {
master.outputData(domainIndex);
} else if (command == "debug") {