diff --git a/NEWS b/NEWS index 5b2fa65e..403cc680 100644 --- a/NEWS +++ b/NEWS @@ -40,6 +40,8 @@ Changes since 1.4.0: an application transfer SDOs before activating the master. Thanks to Stefan Weiser. * Changed EC_MAX_SII_SIZE to 4096. +* 'ethercat xml' creates valid XML for more than one slave + (thanks to E. Burgstaller). Changes in 1.4.0: diff --git a/tool/CommandXml.cpp b/tool/CommandXml.cpp index 34f968e9..74d69ff9 100644 --- a/tool/CommandXml.cpp +++ b/tool/CommandXml.cpp @@ -82,8 +82,17 @@ void CommandXml::execute(MasterDevice &m, const StringVector &args) m.open(MasterDevice::Read); slaves = selectedSlaves(m); + cout << "" << endl; + if (slaves.size() > 1) { + cout << "" << endl; + } + for (si = slaves.begin(); si != slaves.end(); si++) { - generateSlaveXml(m, *si); + generateSlaveXml(m, *si, slaves.size() > 1 ? 1 : 0); + } + + if (slaves.size() > 1) { + cout << "" << endl; } } @@ -91,26 +100,30 @@ void CommandXml::execute(MasterDevice &m, const StringVector &args) void CommandXml::generateSlaveXml( MasterDevice &m, - const ec_ioctl_slave_t &slave + const ec_ioctl_slave_t &slave, + unsigned int indent ) { ec_ioctl_slave_sync_t sync; ec_ioctl_slave_sync_pdo_t pdo; - string pdoType; + string pdoType, in; ec_ioctl_slave_sync_pdo_entry_t entry; unsigned int i, j, k; + + for (i = 0; i < indent; i++) { + in += " "; + } cout - << "" << endl - << " " << endl - << " " << endl - << " " << endl - << " " << slave.vendor_id << "" << endl - << " " << endl - << " " << endl - << " " << endl - << " " << endl - << " " << endl + << in << " " << endl + << in << " " << endl + << in << " " << slave.vendor_id << "" << endl + << in << " " << endl + << in << " " << endl + << in << " " << endl + << in << " " << endl + << in << " " << endl; } @@ -127,7 +140,7 @@ void CommandXml::generateSlaveXml( m.getSync(&sync, slave.position, i); cout - << " " << endl - << " #x" + << in << " #x" << hex << setfill('0') << setw(4) << pdo.index << "" << endl - << " " << pdo.name << "" << endl; + << in << " " << pdo.name << "" << endl; for (k = 0; k < pdo.entry_count; k++) { m.getPdoEntry(&entry, slave.position, i, j, k); cout - << " " << endl - << " #x" + << in << " " << endl + << in << " #x" << hex << setfill('0') << setw(4) << entry.index << "" << endl; if (entry.index) cout - << " " + << in << " " << dec << (unsigned int) entry.subindex << "" << endl; cout - << " " + << in << " " << dec << (unsigned int) entry.bit_length << "" << endl; if (entry.index) { cout - << " " << entry.name + << in << " " << entry.name << "" << endl - << " "; + << in << " "; if (entry.bit_length == 1) { cout << "BOOL"; @@ -192,18 +205,19 @@ void CommandXml::generateSlaveXml( cout << "" << endl; } - cout << " " << endl; + cout << in << " " << endl; } cout - << " " << endl; + << in << " " << endl; } } cout - << " " << endl - << " " << endl - << " " << endl - << "" << endl; + << in << " " << endl + << in << " " << endl + << in << " " << endl + << in << "" << endl; } + /*****************************************************************************/ diff --git a/tool/CommandXml.h b/tool/CommandXml.h index 42b696b1..fd593762 100644 --- a/tool/CommandXml.h +++ b/tool/CommandXml.h @@ -44,7 +44,8 @@ class CommandXml: void execute(MasterDevice &, const StringVector &); protected: - void generateSlaveXml(MasterDevice &, const ec_ioctl_slave_t &); + void generateSlaveXml(MasterDevice &, const ec_ioctl_slave_t &, + unsigned int); }; /****************************************************************************/