fp@1126: /***************************************************************************** fp@1126: * fp@1126: * $Id$ fp@1126: * fp@1126: ****************************************************************************/ fp@1126: fp@1126: #include fp@1126: #include fp@1126: #include fp@1126: using namespace std; fp@1126: fp@1126: #include "globals.h" fp@1126: fp@1126: /****************************************************************************/ fp@1126: fp@1126: const char *help_slaves = fp@1126: "[OPTIONS]\n" fp@1126: "\n" fp@1126: "\n" fp@1126: "Command-specific options:\n"; fp@1126: fp@1126: void listSlaves(int); fp@1126: void showSlave(uint16_t); fp@1126: fp@1126: /****************************************************************************/ fp@1126: fp@1126: void command_slaves() fp@1126: { fp@1126: masterDev.open(MasterDevice::Read); fp@1126: fp@1126: if (verbosity == Verbose) { fp@1126: if (slavePosition == -1) { fp@1126: unsigned int numSlaves = masterDev.slaveCount(), i; fp@1126: fp@1126: for (i = 0; i < numSlaves; i++) { fp@1126: showSlave(i); fp@1126: } fp@1126: } else { fp@1126: showSlave(slavePosition); fp@1126: } fp@1126: } else { fp@1126: listSlaves(slavePosition); fp@1126: } fp@1126: } fp@1126: fp@1126: /****************************************************************************/ fp@1126: fp@1126: string slaveState(uint8_t state) fp@1126: { fp@1126: switch (state) { fp@1126: case 1: return "INIT"; fp@1126: case 2: return "PREOP"; fp@1126: case 4: return "SAFEOP"; fp@1126: case 8: return "OP"; fp@1126: default: return "???"; fp@1126: } fp@1126: } fp@1126: fp@1126: /****************************************************************************/ fp@1126: fp@1126: struct SlaveInfo { fp@1126: string pos; fp@1126: string alias; fp@1126: string relPos; fp@1126: string state; fp@1126: string flag; fp@1126: string name; fp@1126: }; fp@1126: fp@1126: void listSlaves(int slavePosition) fp@1126: { fp@1126: unsigned int numSlaves, i; fp@1126: ec_ioctl_slave_t slave; fp@1126: uint16_t lastAlias, aliasIndex; fp@1126: SlaveInfo slaveInfo; fp@1126: typedef list SlaveInfoList; fp@1126: SlaveInfoList slaveInfoList; fp@1126: SlaveInfoList::const_iterator iter; fp@1126: stringstream str; fp@1126: unsigned int maxPosWidth = 0, maxAliasWidth = 0, fp@1126: maxRelPosWidth = 0, maxStateWidth = 0; fp@1126: fp@1126: numSlaves = masterDev.slaveCount(); fp@1126: fp@1126: lastAlias = 0; fp@1126: aliasIndex = 0; fp@1126: for (i = 0; i < numSlaves; i++) { fp@1126: masterDev.getSlave(&slave, i); fp@1126: fp@1126: if (slave.alias) { fp@1126: lastAlias = slave.alias; fp@1126: aliasIndex = 0; fp@1126: } fp@1126: fp@1126: if (slavePosition == -1 || i == (unsigned int) slavePosition) { fp@1126: str << dec << i; fp@1126: slaveInfo.pos = str.str(); fp@1126: str.clear(); fp@1126: str.str(""); fp@1126: fp@1126: str << lastAlias; fp@1126: slaveInfo.alias = str.str(); fp@1126: str.str(""); fp@1126: fp@1126: str << aliasIndex; fp@1126: slaveInfo.relPos = str.str(); fp@1126: str.str(""); fp@1126: fp@1126: slaveInfo.state = slaveState(slave.state); fp@1126: slaveInfo.flag = (slave.error_flag ? 'E' : '+'); fp@1126: fp@1126: if (strlen(slave.name)) { fp@1126: slaveInfo.name = slave.name; fp@1126: } else { fp@1126: str << "0x" << hex << setfill('0') fp@1126: << setw(8) << slave.vendor_id << ":0x" fp@1126: << setw(8) << slave.product_code; fp@1126: slaveInfo.name = str.str(); fp@1126: str.str(""); fp@1126: } fp@1126: fp@1126: fp@1126: slaveInfoList.push_back(slaveInfo); fp@1126: fp@1126: if (slaveInfo.pos.length() > maxPosWidth) fp@1126: maxPosWidth = slaveInfo.pos.length(); fp@1126: if (slaveInfo.alias.length() > maxAliasWidth) fp@1126: maxAliasWidth = slaveInfo.alias.length(); fp@1126: if (slaveInfo.relPos.length() > maxRelPosWidth) fp@1126: maxRelPosWidth = slaveInfo.relPos.length(); fp@1126: if (slaveInfo.state.length() > maxStateWidth) fp@1126: maxStateWidth = slaveInfo.state.length(); fp@1126: } fp@1126: fp@1126: aliasIndex++; fp@1126: } fp@1126: fp@1126: for (iter = slaveInfoList.begin(); iter != slaveInfoList.end(); iter++) { fp@1126: cout << setfill(' ') << right fp@1126: << setw(maxPosWidth) << iter->pos << " " fp@1126: << setw(maxAliasWidth) << iter->alias fp@1126: << ":" << left fp@1126: << setw(maxRelPosWidth) << iter->relPos << " " fp@1126: << setw(maxStateWidth) << iter->state << " " fp@1126: << iter->flag << " " fp@1126: << iter->name << endl; fp@1126: } fp@1126: } fp@1126: fp@1126: /****************************************************************************/ fp@1126: fp@1126: void showSlave(uint16_t slavePosition) fp@1126: { fp@1126: ec_ioctl_slave_t slave; fp@1126: list protoList; fp@1126: list::const_iterator protoIter; fp@1126: fp@1126: masterDev.getSlave(&slave, slavePosition); fp@1126: fp@1126: cout << "=== Slave " << dec << slavePosition << " ===" << endl; fp@1126: fp@1126: if (slave.alias) fp@1126: cout << "Alias: " << slave.alias << endl; fp@1126: fp@1126: cout fp@1126: << "State: " << slaveState(slave.state) << endl fp@1126: << "Flag: " << (slave.error_flag ? 'E' : '+') << endl fp@1126: << "Identity:" << endl fp@1126: << " Vendor Id: 0x" fp@1126: << hex << setfill('0') fp@1126: << setw(8) << slave.vendor_id << endl fp@1126: << " Product code: 0x" fp@1126: << setw(8) << slave.product_code << endl fp@1126: << " Revision number: 0x" fp@1126: << setw(8) << slave.revision_number << endl fp@1126: << " Serial number: 0x" fp@1126: << setw(8) << slave.serial_number << endl; fp@1126: fp@1126: if (slave.mailbox_protocols) { fp@1126: cout << "Mailboxes:" << endl fp@1126: << " RX: 0x" fp@1126: << hex << setw(4) << slave.rx_mailbox_offset << "/" fp@1126: << dec << slave.rx_mailbox_size fp@1126: << ", TX: 0x" fp@1126: << hex << setw(4) << slave.tx_mailbox_offset << "/" fp@1126: << dec << slave.tx_mailbox_size << endl fp@1126: << " Supported protocols: "; fp@1126: fp@1126: if (slave.mailbox_protocols & EC_MBOX_AOE) { fp@1126: protoList.push_back("AoE"); fp@1126: } fp@1126: if (slave.mailbox_protocols & EC_MBOX_EOE) { fp@1126: protoList.push_back("EoE"); fp@1126: } fp@1126: if (slave.mailbox_protocols & EC_MBOX_COE) { fp@1126: protoList.push_back("CoE"); fp@1126: } fp@1126: if (slave.mailbox_protocols & EC_MBOX_FOE) { fp@1126: protoList.push_back("FoE"); fp@1126: } fp@1126: if (slave.mailbox_protocols & EC_MBOX_SOE) { fp@1126: protoList.push_back("SoE"); fp@1126: } fp@1126: if (slave.mailbox_protocols & EC_MBOX_VOE) { fp@1126: protoList.push_back("VoE"); fp@1126: } fp@1126: fp@1126: for (protoIter = protoList.begin(); protoIter != protoList.end(); fp@1126: protoIter++) { fp@1126: if (protoIter != protoList.begin()) fp@1126: cout << ", "; fp@1126: cout << *protoIter; fp@1126: } fp@1126: cout << endl; fp@1126: } fp@1126: fp@1126: if (slave.has_general_category) { fp@1126: cout << "General:" << endl fp@1126: << " Group: " << slave.group << endl fp@1126: << " Image name: " << slave.image << endl fp@1126: << " Order number: " << slave.order << endl fp@1126: << " Device name: " << slave.name << endl; fp@1126: fp@1126: if (slave.mailbox_protocols & EC_MBOX_COE) { fp@1126: cout << " CoE details:" << endl fp@1126: << " Enable Sdo: " fp@1126: << (slave.coe_details.enable_sdo ? "yes" : "no") << endl fp@1126: << " Enable Sdo Info: " fp@1126: << (slave.coe_details.enable_sdo_info ? "yes" : "no") << endl fp@1126: << " Enable Pdo Assign: " fp@1126: << (slave.coe_details.enable_pdo_assign fp@1126: ? "yes" : "no") << endl fp@1126: << " Enable Pdo Configuration: " fp@1126: << (slave.coe_details.enable_pdo_configuration fp@1126: ? "yes" : "no") << endl fp@1126: << " Enable Upload at startup: " fp@1126: << (slave.coe_details.enable_upload_at_startup fp@1126: ? "yes" : "no") << endl fp@1126: << " Enable Sdo complete access: " fp@1126: << (slave.coe_details.enable_sdo_complete_access fp@1126: ? "yes" : "no") << endl; fp@1126: } fp@1126: fp@1126: cout << " Flags:" << endl fp@1126: << " Enable SafeOp: " fp@1126: << (slave.general_flags.enable_safeop ? "yes" : "no") << endl fp@1126: << " Enable notLRW: " fp@1126: << (slave.general_flags.enable_not_lrw ? "yes" : "no") << endl fp@1126: << " Current consumption: " fp@1126: << dec << slave.current_on_ebus << " mA" << endl; fp@1126: } fp@1126: } fp@1126: fp@1126: /*****************************************************************************/