Command-line help in the docs.
/*****************************************************************************
*
* $Id$
*
****************************************************************************/
#include <iostream>
#include <iomanip>
#include <list>
using namespace std;
#include "globals.h"
/****************************************************************************/
const char *help_slaves =
"[OPTIONS]\n"
"\n"
"Display slaves on the bus.\n"
"\n"
"If the --verbose option is not given, the slaves are displayed\n"
"one-per-line. Example:\n"
"\n"
"1 5555:0 PREOP + EL3162 2C. Ana. Input 0-10V\n"
"| | | | | |\n"
"| | | | | \\- Name from SII if avaliable, otherwise\n"
"| | | | | hexadecimal vendor ID and product code\n"
"| | | | | separated by a colon.\n"
"| | | | \\- Error flag. '+' means no error, 'E' means,\n"
"| | | | that scanning or configuration failed.\n"
"| | | \\- Current slave state.\n"
"| | \\- Relative position (decimal) after the last slave with an\n"
"| | alias address set.\n"
"| \\- Alias address of the slave (if set to non-zero), or the alias\n"
"| of the last slave with an alias set, or zero if there is none.\n"
"\\- Ring position (use this with any --slave option).\n"
"\n"
"If the --verbose option is given, a detailed (multi-line) description\n"
"is output for each slave.\n"
"\n"
"Command-specific options:\n"
" --slave -s <index> Positive numerical ring position, or 'all' for\n"
" all slaves (default).\n"
" --verbose -v Show detailed slave information.\n"
"\n"
"Numerical values can be specified either with decimal (no prefix),\n"
"octal (prefix '0') or hexadecimal (prefix '0x') base.\n";
/****************************************************************************/
void listSlaves(int);
void showSlave(uint16_t);
/****************************************************************************/
void command_slaves()
{
masterDev.open(MasterDevice::Read);
if (verbosity == Verbose) {
if (slavePosition == -1) {
unsigned int numSlaves = masterDev.slaveCount(), i;
for (i = 0; i < numSlaves; i++) {
showSlave(i);
}
} else {
showSlave(slavePosition);
}
} else {
listSlaves(slavePosition);
}
}
/****************************************************************************/
string slaveState(uint8_t state)
{
switch (state) {
case 1: return "INIT";
case 2: return "PREOP";
case 4: return "SAFEOP";
case 8: return "OP";
default: return "???";
}
}
/****************************************************************************/
struct SlaveInfo {
string pos;
string alias;
string relPos;
string state;
string flag;
string name;
};
void listSlaves(int slavePosition)
{
unsigned int numSlaves, i;
ec_ioctl_slave_t slave;
uint16_t lastAlias, aliasIndex;
SlaveInfo slaveInfo;
typedef list<SlaveInfo> SlaveInfoList;
SlaveInfoList slaveInfoList;
SlaveInfoList::const_iterator iter;
stringstream str;
unsigned int maxPosWidth = 0, maxAliasWidth = 0,
maxRelPosWidth = 0, maxStateWidth = 0;
numSlaves = masterDev.slaveCount();
lastAlias = 0;
aliasIndex = 0;
for (i = 0; i < numSlaves; i++) {
masterDev.getSlave(&slave, i);
if (slave.alias) {
lastAlias = slave.alias;
aliasIndex = 0;
}
if (slavePosition == -1 || i == (unsigned int) slavePosition) {
str << dec << i;
slaveInfo.pos = str.str();
str.clear();
str.str("");
str << lastAlias;
slaveInfo.alias = str.str();
str.str("");
str << aliasIndex;
slaveInfo.relPos = str.str();
str.str("");
slaveInfo.state = slaveState(slave.state);
slaveInfo.flag = (slave.error_flag ? 'E' : '+');
if (strlen(slave.name)) {
slaveInfo.name = slave.name;
} else {
str << "0x" << hex << setfill('0')
<< setw(8) << slave.vendor_id << ":0x"
<< setw(8) << slave.product_code;
slaveInfo.name = str.str();
str.str("");
}
slaveInfoList.push_back(slaveInfo);
if (slaveInfo.pos.length() > maxPosWidth)
maxPosWidth = slaveInfo.pos.length();
if (slaveInfo.alias.length() > maxAliasWidth)
maxAliasWidth = slaveInfo.alias.length();
if (slaveInfo.relPos.length() > maxRelPosWidth)
maxRelPosWidth = slaveInfo.relPos.length();
if (slaveInfo.state.length() > maxStateWidth)
maxStateWidth = slaveInfo.state.length();
}
aliasIndex++;
}
for (iter = slaveInfoList.begin(); iter != slaveInfoList.end(); iter++) {
cout << setfill(' ') << right
<< setw(maxPosWidth) << iter->pos << " "
<< setw(maxAliasWidth) << iter->alias
<< ":" << left
<< setw(maxRelPosWidth) << iter->relPos << " "
<< setw(maxStateWidth) << iter->state << " "
<< iter->flag << " "
<< iter->name << endl;
}
}
/****************************************************************************/
void showSlave(uint16_t slavePosition)
{
ec_ioctl_slave_t slave;
list<string> protoList;
list<string>::const_iterator protoIter;
masterDev.getSlave(&slave, slavePosition);
cout << "=== Slave " << dec << slavePosition << " ===" << endl;
if (slave.alias)
cout << "Alias: " << slave.alias << endl;
cout
<< "State: " << slaveState(slave.state) << endl
<< "Flag: " << (slave.error_flag ? 'E' : '+') << endl
<< "Identity:" << endl
<< " Vendor Id: 0x"
<< hex << setfill('0')
<< setw(8) << slave.vendor_id << endl
<< " Product code: 0x"
<< setw(8) << slave.product_code << endl
<< " Revision number: 0x"
<< setw(8) << slave.revision_number << endl
<< " Serial number: 0x"
<< setw(8) << slave.serial_number << endl;
if (slave.mailbox_protocols) {
cout << "Mailboxes:" << endl
<< " RX: 0x"
<< hex << setw(4) << slave.rx_mailbox_offset << "/"
<< dec << slave.rx_mailbox_size
<< ", TX: 0x"
<< hex << setw(4) << slave.tx_mailbox_offset << "/"
<< dec << slave.tx_mailbox_size << endl
<< " Supported protocols: ";
if (slave.mailbox_protocols & EC_MBOX_AOE) {
protoList.push_back("AoE");
}
if (slave.mailbox_protocols & EC_MBOX_EOE) {
protoList.push_back("EoE");
}
if (slave.mailbox_protocols & EC_MBOX_COE) {
protoList.push_back("CoE");
}
if (slave.mailbox_protocols & EC_MBOX_FOE) {
protoList.push_back("FoE");
}
if (slave.mailbox_protocols & EC_MBOX_SOE) {
protoList.push_back("SoE");
}
if (slave.mailbox_protocols & EC_MBOX_VOE) {
protoList.push_back("VoE");
}
for (protoIter = protoList.begin(); protoIter != protoList.end();
protoIter++) {
if (protoIter != protoList.begin())
cout << ", ";
cout << *protoIter;
}
cout << endl;
}
if (slave.has_general_category) {
cout << "General:" << endl
<< " Group: " << slave.group << endl
<< " Image name: " << slave.image << endl
<< " Order number: " << slave.order << endl
<< " Device name: " << slave.name << endl;
if (slave.mailbox_protocols & EC_MBOX_COE) {
cout << " CoE details:" << endl
<< " Enable Sdo: "
<< (slave.coe_details.enable_sdo ? "yes" : "no") << endl
<< " Enable Sdo Info: "
<< (slave.coe_details.enable_sdo_info ? "yes" : "no") << endl
<< " Enable Pdo Assign: "
<< (slave.coe_details.enable_pdo_assign
? "yes" : "no") << endl
<< " Enable Pdo Configuration: "
<< (slave.coe_details.enable_pdo_configuration
? "yes" : "no") << endl
<< " Enable Upload at startup: "
<< (slave.coe_details.enable_upload_at_startup
? "yes" : "no") << endl
<< " Enable Sdo complete access: "
<< (slave.coe_details.enable_sdo_complete_access
? "yes" : "no") << endl;
}
cout << " Flags:" << endl
<< " Enable SafeOp: "
<< (slave.general_flags.enable_safeop ? "yes" : "no") << endl
<< " Enable notLRW: "
<< (slave.general_flags.enable_not_lrw ? "yes" : "no") << endl
<< " Current consumption: "
<< dec << slave.current_on_ebus << " mA" << endl;
}
}
/*****************************************************************************/