tools/Master.cpp
changeset 1072 94a5f043dee5
parent 1071 82122748f4e0
child 1073 f3c50aa42b6c
equal deleted inserted replaced
1071:82122748f4e0 1072:94a5f043dee5
   140         err << "'alias' takes exactly one argument!";
   140         err << "'alias' takes exactly one argument!";
   141         throw MasterException(err.str());
   141         throw MasterException(err.str());
   142     }
   142     }
   143 
   143 
   144     strAlias << commandArgs[0];
   144     strAlias << commandArgs[0];
   145     strAlias >> number;
   145     strAlias
       
   146         >> resetiosflags(ios::basefield) // guess base from prefix
       
   147         >> number;
   146     if (strAlias.fail() || number < 0x0000 || number > 0xffff) {
   148     if (strAlias.fail() || number < 0x0000 || number > 0xffff) {
   147         err << "Invalid alias '" << commandArgs[0] << "'!";
   149         err << "Invalid alias '" << commandArgs[0] << "'!";
   148         throw MasterException(err.str());
   150         throw MasterException(err.str());
   149     }
   151     }
   150     alias = number;
   152     alias = number;
   215         err << "'debug' takes exactly one argument!";
   217         err << "'debug' takes exactly one argument!";
   216         throw MasterException(err.str());
   218         throw MasterException(err.str());
   217     }
   219     }
   218 
   220 
   219     str << commandArgs[0];
   221     str << commandArgs[0];
   220     str >> debugLevel;
   222     str >> resetiosflags(ios::basefield) // guess base from prefix
       
   223         >> debugLevel;
   221 
   224 
   222     if (str.fail()) {
   225     if (str.fail()) {
   223         stringstream err;
   226         stringstream err;
   224         err << "Invalid debug level '" << commandArgs[0] << "'!";
   227         err << "Invalid debug level '" << commandArgs[0] << "'!";
   225         throw MasterException(err.str());
   228         throw MasterException(err.str());
   348         const string &dataTypeStr,
   351         const string &dataTypeStr,
   349         const vector<string> &commandArgs
   352         const vector<string> &commandArgs
   350         )
   353         )
   351 {
   354 {
   352     stringstream strIndex, strSubIndex, strValue, err;
   355     stringstream strIndex, strSubIndex, strValue, err;
   353     int number, sval;
       
   354     ec_ioctl_sdo_download_t data;
   356     ec_ioctl_sdo_download_t data;
   355     unsigned int i, uval;
   357     unsigned int i, number;
   356     const CoEDataType *dataType = NULL;
   358     const CoEDataType *dataType = NULL;
   357 
   359 
   358     if (slavePosition < 0) {
   360     if (slavePosition < 0) {
   359         err << "'sdo_download' requires a slave! Please specify --slave.";
   361         err << "'sdo_download' requires a slave! Please specify --slave.";
   360         throw MasterException(err.str());
   362         throw MasterException(err.str());
   365         err << "'sdo_download' takes 3 arguments!";
   367         err << "'sdo_download' takes 3 arguments!";
   366         throw MasterException(err.str());
   368         throw MasterException(err.str());
   367     }
   369     }
   368 
   370 
   369     strIndex << commandArgs[0];
   371     strIndex << commandArgs[0];
   370     strIndex >> hex >> number;
   372     strIndex
   371     if (strIndex.fail() || number < 0x0000 || number > 0xffff) {
   373         >> resetiosflags(ios::basefield) // guess base from prefix
       
   374         >> data.sdo_index;
       
   375     if (strIndex.fail()) {
   372         err << "Invalid Sdo index '" << commandArgs[0] << "'!";
   376         err << "Invalid Sdo index '" << commandArgs[0] << "'!";
   373         throw MasterException(err.str());
   377         throw MasterException(err.str());
   374     }
   378     }
   375     data.sdo_index = number;
       
   376 
   379 
   377     strSubIndex << commandArgs[1];
   380     strSubIndex << commandArgs[1];
   378     strSubIndex >> hex >> number;
   381     strSubIndex
   379     if (strSubIndex.fail() || number < 0x00 || number > 0xff) {
   382         >> resetiosflags(ios::basefield) // guess base from prefix
       
   383         >> number;
       
   384     if (strSubIndex.fail() || number > 0xff) {
   380         err << "Invalid Sdo subindex '" << commandArgs[1] << "'!";
   385         err << "Invalid Sdo subindex '" << commandArgs[1] << "'!";
   381         throw MasterException(err.str());
   386         throw MasterException(err.str());
   382     }
   387     }
   383     data.sdo_entry_subindex = number;
   388     data.sdo_entry_subindex = number;
   384 
   389 
   416     }
   421     }
   417 
   422 
   418     data.data = new uint8_t[data.data_size + 1];
   423     data.data = new uint8_t[data.data_size + 1];
   419 
   424 
   420     strValue << commandArgs[2];
   425     strValue << commandArgs[2];
   421 
   426     strValue >> resetiosflags(ios::basefield); // guess base from prefix
   422     switch (dataType->coeCode) {
   427     strValue.exceptions(ios::failbit);
   423         case 0x0002: // int8
   428 
   424             strValue >> sval;
   429     try {
   425             if ((uint32_t) sval > 0xff) {
   430         switch (dataType->coeCode) {
       
   431             case 0x0002: // int8
       
   432                 {
       
   433                     int16_t val; // uint8_t is interpreted as char
       
   434                     strValue >> val;
       
   435                     if (val > 127 || val < -128)
       
   436                         throw ios::failure("Value out of range");
       
   437                     *data.data = val;
       
   438                     break;
       
   439                 }
       
   440             case 0x0003: // int16
       
   441                 {
       
   442                     int16_t val;
       
   443                     strValue >> val;
       
   444                     *(int16_t *) data.data = cputole16(val);
       
   445                     break;
       
   446                 }
       
   447             case 0x0004: // int32
       
   448                 {
       
   449                     int32_t val;
       
   450                     strValue >> val;
       
   451                     *(int32_t *) data.data = cputole32(val);
       
   452                     break;
       
   453                 }
       
   454             case 0x0005: // uint8
       
   455                 {
       
   456                     uint16_t val; // uint8_t is interpreted as char
       
   457                     strValue >> val;
       
   458                     if (val > 0xff)
       
   459                         throw ios::failure("Value out of range");
       
   460                     *data.data = val;
       
   461                     break;
       
   462                 }
       
   463             case 0x0006: // uint16
       
   464                 {
       
   465                     uint16_t val;
       
   466                     strValue >> val;
       
   467                     *(uint16_t *) data.data = cputole16(val);
       
   468                     break;
       
   469                 }
       
   470             case 0x0007: // uint32
       
   471                 {
       
   472                     uint32_t val;
       
   473                     strValue >> val;
       
   474                     *(uint32_t *) data.data = cputole32(val);
       
   475                     break;
       
   476                 }
       
   477             case 0x0009: // string
       
   478                 if (strValue.str().size() >= data.data_size) {
       
   479                     err << "String too large";
       
   480                     throw MasterException(err.str());
       
   481                 }
       
   482                 data.data_size = strValue.str().size();
       
   483                 strValue >> (char *) data.data;
       
   484                 break;
       
   485 
       
   486             default:
   426                 delete [] data.data;
   487                 delete [] data.data;
   427                 err << "Invalid value for type '"
   488                 err << "Unknown data type 0x" << hex << dataType->coeCode;
   428                     << dataType->name << "'!";
       
   429                 throw MasterException(err.str());
   489                 throw MasterException(err.str());
   430             }
   490         }
   431             *data.data = (int8_t) sval;
   491     } catch (ios::failure &e) {
   432             break;
   492         delete [] data.data;
   433         case 0x0003: // int16
   493         err << "Invalid value argument '" << commandArgs[2]
   434             strValue >> sval;
   494             << "' for type '" << dataType->name << "'!";
   435             if ((uint32_t) sval > 0xffff) {
       
   436                 delete [] data.data;
       
   437                 err << "Invalid value for type '"
       
   438                     << dataType->name << "'!";
       
   439                 throw MasterException(err.str());
       
   440             }
       
   441             *(int16_t *) data.data = cputole16(sval);
       
   442             break;
       
   443         case 0x0004: // int32
       
   444             strValue >> sval;
       
   445             *(int32_t *) data.data = cputole32(sval);
       
   446             break;
       
   447         case 0x0005: // uint8
       
   448             strValue >> uval;
       
   449             if ((uint32_t) uval > 0xff) {
       
   450                 delete [] data.data;
       
   451                 err << "Invalid value for type '"
       
   452                     << dataType->name << "'!";
       
   453                 throw MasterException(err.str());
       
   454             }
       
   455             *data.data = (uint8_t) uval;
       
   456             break;
       
   457         case 0x0006: // uint16
       
   458             strValue >> uval;
       
   459             if ((uint32_t) uval > 0xffff) {
       
   460                 delete [] data.data;
       
   461                 err << "Invalid value for type '"
       
   462                     << dataType->name << "'!";
       
   463                 throw MasterException(err.str());
       
   464             }
       
   465             *(uint16_t *) data.data = cputole16(uval);
       
   466             break;
       
   467         case 0x0007: // uint32
       
   468             strValue >> uval;
       
   469             *(uint32_t *) data.data = cputole32(uval);
       
   470             break;
       
   471         case 0x0009: // string
       
   472             if (strValue.str().size() >= data.data_size) {
       
   473                 err << "String too big";
       
   474                 throw MasterException(err.str());
       
   475             }
       
   476             data.data_size = strValue.str().size();
       
   477             strValue >> (char *) data.data;
       
   478             break;
       
   479         default:
       
   480             break;
       
   481     }
       
   482 
       
   483     if (strValue.fail()) {
       
   484         err << "Invalid value argument '" << commandArgs[2] << "'!";
       
   485         throw MasterException(err.str());
   495         throw MasterException(err.str());
   486     }
   496     }
   487 
   497 
   488     open(ReadWrite);
   498     open(ReadWrite);
   489 
   499 
   490     if (ioctl(fd, EC_IOCTL_SDO_DOWNLOAD, &data) < 0) {
   500     if (ioctl(fd, EC_IOCTL_SDO_DOWNLOAD, &data) < 0) {
   491         stringstream err;
   501         stringstream err;
   492         err << "Failed to download Sdo: ";
   502         err << "Failed to download Sdo: ";
   493         if (errno == EIO && data.abort_code) {
   503         if (errno == EIO && data.abort_code) {
   494             err << "Abort code 0x" << hex << setfill('0') << setw(8)
   504             err << "Abort code 0x" << hex << setfill('0')
   495                 << data.abort_code;
   505                 << setw(8) << data.abort_code;
   496         } else {
   506         } else {
   497             err << strerror(errno);
   507             err << strerror(errno);
   498         }
   508         }
   499         delete [] data.data;
   509         delete [] data.data;
   500         throw MasterException(err.str());
   510         throw MasterException(err.str());
   510         const string &dataTypeStr,
   520         const string &dataTypeStr,
   511         const vector<string> &commandArgs
   521         const vector<string> &commandArgs
   512         )
   522         )
   513 {
   523 {
   514     stringstream strIndex, strSubIndex;
   524     stringstream strIndex, strSubIndex;
   515     int number, sval;
   525     int sval;
   516     ec_ioctl_sdo_upload_t data;
   526     ec_ioctl_sdo_upload_t data;
   517     unsigned int i, uval;
   527     unsigned int i, uval;
   518     const CoEDataType *dataType = NULL;
   528     const CoEDataType *dataType = NULL;
   519 
   529 
   520     if (slavePosition < 0) {
   530     if (slavePosition < 0) {
   529         err << "'sdo_upload' takes two arguments!";
   539         err << "'sdo_upload' takes two arguments!";
   530         throw MasterException(err.str());
   540         throw MasterException(err.str());
   531     }
   541     }
   532 
   542 
   533     strIndex << commandArgs[0];
   543     strIndex << commandArgs[0];
   534     strIndex >> hex >> number;
   544     strIndex
   535     if (strIndex.fail() || number < 0x0000 || number > 0xffff) {
   545         >> resetiosflags(ios::basefield) // guess base from prefix
       
   546         >> data.sdo_index;
       
   547     if (strIndex.fail()) {
   536         stringstream err;
   548         stringstream err;
   537         err << "Invalid Sdo index '" << commandArgs[0] << "'!";
   549         err << "Invalid Sdo index '" << commandArgs[0] << "'!";
   538         throw MasterException(err.str());
   550         throw MasterException(err.str());
   539     }
   551     }
   540     data.sdo_index = number;
       
   541 
   552 
   542     strSubIndex << commandArgs[1];
   553     strSubIndex << commandArgs[1];
   543     strSubIndex >> hex >> number;
   554     strSubIndex
   544     if (strSubIndex.fail() || number < 0x00 || number > 0xff) {
   555         >> resetiosflags(ios::basefield) // guess base from prefix
       
   556         >> uval;
       
   557     if (strSubIndex.fail() || uval > 0xff) {
   545         stringstream err;
   558         stringstream err;
   546         err << "Invalid Sdo subindex '" << commandArgs[1] << "'!";
   559         err << "Invalid Sdo subindex '" << commandArgs[1] << "'!";
   547         throw MasterException(err.str());
   560         throw MasterException(err.str());
   548     }
   561     }
   549     data.sdo_entry_subindex = number;
   562     data.sdo_entry_subindex = uval;
   550 
   563 
   551     if (dataTypeStr != "") { // data type specified
   564     if (dataTypeStr != "") { // data type specified
   552         if (!(dataType = findDataType(dataTypeStr))) {
   565         if (!(dataType = findDataType(dataTypeStr))) {
   553             stringstream err;
   566             stringstream err;
   554             err << "Invalid data type '" << dataTypeStr << "'!";
   567             err << "Invalid data type '" << dataTypeStr << "'!";
   590 
   603 
   591     if (ioctl(fd, EC_IOCTL_SDO_UPLOAD, &data) < 0) {
   604     if (ioctl(fd, EC_IOCTL_SDO_UPLOAD, &data) < 0) {
   592         stringstream err;
   605         stringstream err;
   593         err << "Failed to upload Sdo: ";
   606         err << "Failed to upload Sdo: ";
   594         if (errno == EIO && data.abort_code) {
   607         if (errno == EIO && data.abort_code) {
   595             err << "Abort code 0x" << hex << setfill('0') << setw(8)
   608             err << "Abort code 0x" << hex << setfill('0')
   596                 << data.abort_code;
   609                 << setw(8) << data.abort_code;
   597         } else {
   610         } else {
   598             err << strerror(errno);
   611             err << strerror(errno);
   599         }
   612         }
   600         delete [] data.target;
   613         delete [] data.target;
   601         close();
   614         close();
   979 
   992 
   980         cout << "Alias: "
   993         cout << "Alias: "
   981             << dec << config.alias << endl
   994             << dec << config.alias << endl
   982             << "Position: " << config.position << endl
   995             << "Position: " << config.position << endl
   983             << "Vendor Id: 0x"
   996             << "Vendor Id: 0x"
   984             << hex << setfill('0') << setw(8) << config.vendor_id << endl
   997             << hex << setfill('0')
       
   998             << setw(8) << config.vendor_id << endl
   985             << "Product code: 0x"
   999             << "Product code: 0x"
   986             << hex << setw(8) << config.product_code << endl
  1000             << setw(8) << config.product_code << endl
   987             << "Attached: " << (config.attached ? "yes" : "no") << endl
  1001             << "Attached: " << (config.attached ? "yes" : "no") << endl
   988             << "Operational: " << (config.operational ? "yes" : "no") << endl;
  1002             << "Operational: " << (config.operational ? "yes" : "no") << endl;
   989 
  1003 
   990         for (j = 0; j < 16; j++) {
  1004         for (j = 0; j < 16; j++) {
   991             if (config.syncs[j].pdo_count) {
  1005             if (config.syncs[j].pdo_count) {
   993                     << (config.syncs[j].dir == EC_DIR_INPUT
  1007                     << (config.syncs[j].dir == EC_DIR_INPUT
   994                             ? "Input" : "Output") << ")" << endl;
  1008                             ? "Input" : "Output") << ")" << endl;
   995                 for (k = 0; k < config.syncs[j].pdo_count; k++) {
  1009                 for (k = 0; k < config.syncs[j].pdo_count; k++) {
   996                     getConfigPdo(&pdo, i, j, k);
  1010                     getConfigPdo(&pdo, i, j, k);
   997 
  1011 
   998                     cout << "  Pdo 0x"
  1012                     cout << "  Pdo 0x" << hex
   999                         << hex << setfill('0') << setw(4) << pdo.index
  1013                         << setw(4) << pdo.index
  1000                         << " \"" << pdo.name << "\"" << endl;
  1014                         << " \"" << pdo.name << "\"" << endl;
  1001 
  1015 
  1002                     for (l = 0; l < pdo.entry_count; l++) {
  1016                     for (l = 0; l < pdo.entry_count; l++) {
  1003                         getConfigPdoEntry(&entry, i, j, k, l);
  1017                         getConfigPdoEntry(&entry, i, j, k, l);
  1004 
  1018 
  1005                         cout << "    Pdo entry 0x"
  1019                         cout << "    Pdo entry 0x" << hex
  1006                             << hex << setfill('0') << setw(4) << entry.index
  1020                             << setw(4) << entry.index << ":"
  1007                             << ":" << setw(2) << (unsigned int) entry.subindex
  1021                             << setw(2) << (unsigned int) entry.subindex
  1008                             << ", " << dec << (unsigned int) entry.bit_length
  1022                             << ", " << dec << (unsigned int) entry.bit_length
  1009                             << " bit, \"" << entry.name << "\"" << endl;
  1023                             << " bit, \"" << entry.name << "\"" << endl;
  1010                     }
  1024                     }
  1011                 }
  1025                 }
  1012             }
  1026             }
  1016             cout << "Sdo configuration:" << endl;
  1030             cout << "Sdo configuration:" << endl;
  1017             for (j = 0; j < config.sdo_count; j++) {
  1031             for (j = 0; j < config.sdo_count; j++) {
  1018                 getConfigSdo(&sdo, i, j);
  1032                 getConfigSdo(&sdo, i, j);
  1019 
  1033 
  1020                 cout << "  0x"
  1034                 cout << "  0x"
  1021                     << hex << setfill('0') << setw(4) << sdo.index
  1035                     << hex << setfill('0')
  1022                     << ":" << setw(2) << (unsigned int) sdo.subindex
  1036                     << setw(4) << sdo.index << ":"
  1023                     << ", " << sdo.size << " byte: " << hex;
  1037                     << setw(2) << (unsigned int) sdo.subindex
       
  1038                     << ", " << dec << sdo.size << " byte: " << hex;
  1024 
  1039 
  1025                 switch (sdo.size) {
  1040                 switch (sdo.size) {
  1026                     case 1:
  1041                     case 1:
  1027                         cout << "0x" << setw(2)
  1042                         cout << "0x" << setw(2)
  1028                             << (unsigned int) *(uint8_t *) &sdo.data;
  1043                             << (unsigned int) *(uint8_t *) &sdo.data;
  1081         str << dec << config.alias;
  1096         str << dec << config.alias;
  1082         info.alias = str.str();
  1097         info.alias = str.str();
  1083         str.clear();
  1098         str.clear();
  1084         str.str("");
  1099         str.str("");
  1085 
  1100 
  1086         str << dec << config.position;
  1101         str << config.position;
  1087         info.pos = str.str();
  1102         info.pos = str.str();
  1088         str.clear();
  1103         str.clear();
  1089         str.str("");
  1104         str.str("");
  1090 
  1105 
  1091         str << "0x"
  1106         str << hex << setfill('0')
  1092             << hex << setfill('0') << setw(8) << config.vendor_id
  1107             << "0x" << setw(8) << config.vendor_id
  1093             << "/0x"
  1108             << "/0x" << setw(8) << config.product_code;
  1094             << hex << setw(8) << config.product_code;
       
  1095         info.ident = str.str();
  1109         info.ident = str.str();
  1096         str.clear();
  1110         str.clear();
  1097         str.str("");
  1111         str.str("");
  1098 
  1112 
  1099         str << (config.attached ? "attached" : "-");
  1113         str << (config.attached ? "attached" : "-");
  1173     ec_ioctl_domain_fmmu_t fmmu;
  1187     ec_ioctl_domain_fmmu_t fmmu;
  1174     unsigned int dataOffset;
  1188     unsigned int dataOffset;
  1175     
  1189     
  1176     getDomain(&domain, domainIndex);
  1190     getDomain(&domain, domainIndex);
  1177 
  1191 
  1178 	cout << "Domain" << domainIndex << ":"
  1192 	cout << "Domain" << dec << domainIndex << ":"
  1179 		<< " LogBaseAddr 0x"
  1193 		<< " LogBaseAddr 0x"
  1180 		<< hex << setfill('0') << setw(8) << domain.logical_base_address
  1194 		<< hex << setfill('0')
  1181 		<< ", Size " << dec << setfill(' ') << setw(3) << domain.data_size
  1195         << setw(8) << domain.logical_base_address
       
  1196 		<< ", Size " << dec << setfill(' ')
       
  1197         << setw(3) << domain.data_size
  1182 		<< ", WorkingCounter "
  1198 		<< ", WorkingCounter "
  1183 		<< dec << domain.working_counter << "/"
  1199 		<< domain.working_counter << "/"
  1184         << domain.expected_working_counter << endl;
  1200         << domain.expected_working_counter << endl;
  1185 
  1201 
  1186     if (!domain.data_size)
  1202     if (!domain.data_size)
  1187         return;
  1203         return;
  1188 
  1204 
  1197 
  1213 
  1198     for (i = 0; i < domain.fmmu_count; i++) {
  1214     for (i = 0; i < domain.fmmu_count; i++) {
  1199         getFmmu(&fmmu, domainIndex, i);
  1215         getFmmu(&fmmu, domainIndex, i);
  1200 
  1216 
  1201         cout << "  SlaveConfig "
  1217         cout << "  SlaveConfig "
  1202             << fmmu.slave_config_alias << ":" << fmmu.slave_config_position
  1218             << dec << fmmu.slave_config_alias
  1203             << ", SM" << dec << (unsigned int) fmmu.sync_index << " ("
  1219             << ":" << fmmu.slave_config_position
  1204             << setfill(' ') << setw(3)
  1220             << ", SM" << (unsigned int) fmmu.sync_index << " ("
       
  1221             << setfill(' ') << setw(6)
  1205             << (fmmu.dir == EC_DIR_INPUT ? "Input" : "Output")
  1222             << (fmmu.dir == EC_DIR_INPUT ? "Input" : "Output")
  1206             << "), LogAddr 0x" 
  1223             << "), LogAddr 0x"
  1207             << hex << setfill('0') << setw(8) << fmmu.logical_address
  1224             << hex << setfill('0')
       
  1225             << setw(8) << fmmu.logical_address
  1208             << ", Size " << dec << fmmu.data_size << endl;
  1226             << ", Size " << dec << fmmu.data_size << endl;
  1209 
  1227 
  1210         dataOffset = fmmu.logical_address - domain.logical_base_address;
  1228         dataOffset = fmmu.logical_address - domain.logical_base_address;
  1211         if (dataOffset + fmmu.data_size > domain.data_size) {
  1229         if (dataOffset + fmmu.data_size > domain.data_size) {
  1212             stringstream err;
  1230             stringstream err;
  1248     for (i = 0; i < slave.sync_count; i++) {
  1266     for (i = 0; i < slave.sync_count; i++) {
  1249         getSync(&sync, slavePosition, i);
  1267         getSync(&sync, slavePosition, i);
  1250 
  1268 
  1251         cout << "SM" << i << ":"
  1269         cout << "SM" << i << ":"
  1252             << " PhysAddr 0x"
  1270             << " PhysAddr 0x"
  1253             << hex << setfill('0') << setw(4) << sync.physical_start_address
  1271             << hex << setfill('0')
       
  1272             << setw(4) << sync.physical_start_address
  1254             << ", DefaultSize "
  1273             << ", DefaultSize "
  1255             << dec << setfill(' ') << setw(4) << sync.default_size
  1274             << dec << setfill(' ') << setw(4) << sync.default_size
  1256             << ", ControlRegister 0x"
  1275             << ", ControlRegister 0x"
  1257             << hex << setfill('0') << setw(2)
  1276             << hex << setfill('0') << setw(2)
  1258             << (unsigned int) sync.control_register
  1277             << (unsigned int) sync.control_register
  1262         for (j = 0; j < sync.pdo_count; j++) {
  1281         for (j = 0; j < sync.pdo_count; j++) {
  1263             getPdo(&pdo, slavePosition, i, j);
  1282             getPdo(&pdo, slavePosition, i, j);
  1264 
  1283 
  1265             cout << "  " << (sync.control_register & 0x04 ? "R" : "T")
  1284             cout << "  " << (sync.control_register & 0x04 ? "R" : "T")
  1266                 << "xPdo 0x"
  1285                 << "xPdo 0x"
  1267                 << hex << setfill('0') << setw(4) << pdo.index
  1286                 << hex << setfill('0')
       
  1287                 << setw(4) << pdo.index
  1268                 << " \"" << pdo.name << "\"" << endl;
  1288                 << " \"" << pdo.name << "\"" << endl;
  1269 
  1289 
  1270             if (quiet)
  1290             if (quiet)
  1271                 continue;
  1291                 continue;
  1272 
  1292 
  1273             for (k = 0; k < pdo.entry_count; k++) {
  1293             for (k = 0; k < pdo.entry_count; k++) {
  1274                 getPdoEntry(&entry, slavePosition, i, j, k);
  1294                 getPdoEntry(&entry, slavePosition, i, j, k);
  1275 
  1295 
  1276                 cout << "    Pdo entry 0x"
  1296                 cout << "    Pdo entry 0x"
  1277                     << hex << setfill('0') << setw(4) << entry.index
  1297                     << hex << setfill('0')
       
  1298                     << setw(4) << entry.index
  1278                     << ":" << setw(2) << (unsigned int) entry.subindex
  1299                     << ":" << setw(2) << (unsigned int) entry.subindex
  1279                     << ", " << dec << (unsigned int) entry.bit_length
  1300                     << ", " << dec << (unsigned int) entry.bit_length
  1280                     << " bit, \"" << entry.name << "\"" << endl;
  1301                     << " bit, \"" << entry.name << "\"" << endl;
  1281             }
  1302             }
  1282         }
  1303         }
  1304 
  1325 
  1305     for (i = 0; i < slave.sdo_count; i++) {
  1326     for (i = 0; i < slave.sdo_count; i++) {
  1306         getSdo(&sdo, slavePosition, i);
  1327         getSdo(&sdo, slavePosition, i);
  1307 
  1328 
  1308         cout << "Sdo 0x"
  1329         cout << "Sdo 0x"
  1309             << hex << setfill('0') << setw(4) << sdo.sdo_index
  1330             << hex << setfill('0')
       
  1331             << setw(4) << sdo.sdo_index
  1310             << ", \"" << sdo.name << "\"" << endl;
  1332             << ", \"" << sdo.name << "\"" << endl;
  1311 
  1333 
  1312         if (quiet)
  1334         if (quiet)
  1313             continue;
  1335             continue;
  1314 
  1336 
  1315         for (j = 0; j <= sdo.max_subindex; j++) {
  1337         for (j = 0; j <= sdo.max_subindex; j++) {
  1316             getSdoEntry(&entry, slavePosition, -i, j);
  1338             getSdoEntry(&entry, slavePosition, -i, j);
  1317 
  1339 
  1318             cout << "  0x" << hex << setfill('0')
  1340             cout << "  0x" << hex << setfill('0')
  1319                 << setw(4) << sdo.sdo_index << ":" 
  1341                 << setw(4) << sdo.sdo_index << ":"
  1320                 << setw(2) << (unsigned int) entry.sdo_entry_subindex
  1342                 << setw(2) << (unsigned int) entry.sdo_entry_subindex
  1321                 << ", ";
  1343                 << ", ";
  1322 
  1344 
  1323             if ((d = findDataType(entry.data_type))) {
  1345             if ((d = findDataType(entry.data_type))) {
  1324                 cout << d->name;
  1346                 cout << d->name;
  1442 
  1464 
  1443     cout
  1465     cout
  1444         << "State: " << slaveState(slave.state) << endl
  1466         << "State: " << slaveState(slave.state) << endl
  1445         << "Flag: " << (slave.error_flag ? 'E' : '+') << endl
  1467         << "Flag: " << (slave.error_flag ? 'E' : '+') << endl
  1446         << "Identity:" << endl
  1468         << "Identity:" << endl
  1447         << "  Vendor Id: 0x"
  1469         << "  Vendor Id:       0x"
  1448         << hex << setfill('0') << setw(8) << slave.vendor_id << endl
  1470         << hex << setfill('0')
  1449         << "  Product code: 0x"
  1471         << setw(8) << slave.vendor_id << endl
       
  1472         << "  Product code:    0x"
  1450         << setw(8) << slave.product_code << endl
  1473         << setw(8) << slave.product_code << endl
  1451         << "  Revision number: 0x"
  1474         << "  Revision number: 0x"
  1452         << setw(8) << slave.revision_number << endl
  1475         << setw(8) << slave.revision_number << endl
  1453         << "  Serial number: 0x"
  1476         << "  Serial number:   0x"
  1454         << setw(8) << slave.serial_number << endl;
  1477         << setw(8) << slave.serial_number << endl;
  1455 
  1478 
  1456     if (slave.mailbox_protocols) {
  1479     if (slave.mailbox_protocols) {
  1457         cout << "Mailboxes:" << endl
  1480         cout << "Mailboxes:" << endl
  1458         << "  RX: 0x"
  1481         << "  RX: 0x"