tools/Master.cpp
changeset 965 1aee4aa1def3
parent 960 36e460ffbb5e
child 966 f1a7ea8a550a
equal deleted inserted replaced
964:957f21465052 965:1aee4aa1def3
   222     }
   222     }
   223 }
   223 }
   224 
   224 
   225 /****************************************************************************/
   225 /****************************************************************************/
   226 
   226 
       
   227 void Master::listSdos(int slavePosition)
       
   228 {
       
   229     if (slavePosition == -1) {
       
   230         unsigned int numSlaves = slaveCount(), i;
       
   231 
       
   232         for (i = 0; i < numSlaves; i++) {
       
   233             listSlaveSdos(i, true);
       
   234         }
       
   235     } else {
       
   236         listSlaveSdos(slavePosition, false);
       
   237     }
       
   238 }
       
   239 
       
   240 /****************************************************************************/
       
   241 
   227 void Master::requestStates(
   242 void Master::requestStates(
   228         int slavePosition,
   243         int slavePosition,
   229         const vector<string> &commandArgs
   244         const vector<string> &commandArgs
   230         )
   245         )
   231 {
   246 {
   373     delete [] processData;
   388     delete [] processData;
   374 }
   389 }
   375 
   390 
   376 /****************************************************************************/
   391 /****************************************************************************/
   377 
   392 
   378 void Master::listSlavePdos(uint16_t slavePosition, bool printSlave)
   393 void Master::listSlavePdos(uint16_t slavePosition, bool withHeader)
   379 {
   394 {
   380     ec_ioctl_slave_t slave;
   395     ec_ioctl_slave_t slave;
   381     ec_ioctl_sync_t sync;
   396     ec_ioctl_sync_t sync;
   382     ec_ioctl_pdo_t pdo;
   397     ec_ioctl_pdo_t pdo;
   383     ec_ioctl_pdo_entry_t entry;
   398     ec_ioctl_pdo_entry_t entry;
   384     unsigned int i, j, k;
   399     unsigned int i, j, k;
   385     
   400     
   386     getSlave(&slave, slavePosition);
   401     getSlave(&slave, slavePosition);
   387 
   402 
   388     if (printSlave)
   403     if (withHeader)
   389         cout << "=== Slave " << slavePosition << " ===" << endl;
   404         cout << "=== Slave " << slavePosition << " ===" << endl;
   390 
   405 
   391     for (i = 0; i < slave.sync_count; i++) {
   406     for (i = 0; i < slave.sync_count; i++) {
   392         getSync(&sync, slavePosition, i);
   407         getSync(&sync, slavePosition, i);
   393 
   408 
   417                     << ":" << hex << setfill('0') << setw(2)
   432                     << ":" << hex << setfill('0') << setw(2)
   418                     << (unsigned int) entry.subindex
   433                     << (unsigned int) entry.subindex
   419                     << ", " << dec << (unsigned int) entry.bit_length
   434                     << ", " << dec << (unsigned int) entry.bit_length
   420                     << " bit, \"" << entry.name << "\"" << endl;
   435                     << " bit, \"" << entry.name << "\"" << endl;
   421             }
   436             }
       
   437         }
       
   438     }
       
   439 }
       
   440 
       
   441 /****************************************************************************/
       
   442 
       
   443 void Master::listSlaveSdos(uint16_t slavePosition, bool withHeader)
       
   444 {
       
   445     ec_ioctl_slave_t slave;
       
   446     ec_ioctl_sdo_t sdo;
       
   447     ec_ioctl_sdo_entry_t entry;
       
   448     unsigned int i, j, k;
       
   449     
       
   450     getSlave(&slave, slavePosition);
       
   451 
       
   452     if (withHeader)
       
   453         cout << "=== Slave " << slavePosition << " ===" << endl;
       
   454 
       
   455     for (i = 0; i < slave.sdo_count; i++) {
       
   456         getSdo(&sdo, slavePosition, i);
       
   457 
       
   458         cout << "Sdo 0x"
       
   459             << hex << setfill('0') << setw(4) << sdo.sdo_index
       
   460             << ", \"" << sdo.name << "\"" << endl;
       
   461 
       
   462         for (j = 0; j <= sdo.max_subindex; j++) {
       
   463             getSdoEntry(&entry, slavePosition, i, j);
       
   464 
       
   465             cout << "  Entry 0x"
       
   466                 << hex << setfill('0') << setw(2)
       
   467                 << (unsigned int) entry.sdo_entry_subindex
       
   468                 << ", type 0x" << setw(4) << entry.data_type
       
   469                 << ", " << dec << entry.bit_length << " bit, \""
       
   470                 << entry.description << "\"" << endl;
   422         }
   471         }
   423     }
   472     }
   424 }
   473 }
   425 
   474 
   426 /****************************************************************************/
   475 /****************************************************************************/
   715     }
   764     }
   716 }
   765 }
   717 
   766 
   718 /****************************************************************************/
   767 /****************************************************************************/
   719 
   768 
       
   769 void Master::getSdo(
       
   770         ec_ioctl_sdo_t *sdo,
       
   771         uint16_t slaveIndex,
       
   772         uint16_t sdoPosition
       
   773         )
       
   774 {
       
   775     sdo->slave_position = slaveIndex;
       
   776     sdo->sdo_position = sdoPosition;
       
   777 
       
   778     if (ioctl(fd, EC_IOCTL_SDO, sdo)) {
       
   779         stringstream err;
       
   780         err << "Failed to get Sdo: ";
       
   781         if (errno == EINVAL)
       
   782             err << "Either slave " << slaveIndex << " does not exist, "
       
   783                 << "or it contains less than " << sdoPosition + 1 << " Sdos!"
       
   784                 << endl;
       
   785         else
       
   786             err << strerror(errno);
       
   787         throw MasterException(err.str());
       
   788     }
       
   789 }
       
   790 
       
   791 /****************************************************************************/
       
   792 
       
   793 void Master::getSdoEntry(
       
   794         ec_ioctl_sdo_entry_t *entry,
       
   795         uint16_t slaveIndex,
       
   796         uint16_t sdoPosition,
       
   797         uint8_t entrySubindex
       
   798         )
       
   799 {
       
   800     entry->slave_position = slaveIndex;
       
   801     entry->sdo_position = sdoPosition;
       
   802     entry->sdo_entry_subindex = entrySubindex;
       
   803 
       
   804     if (ioctl(fd, EC_IOCTL_SDO_ENTRY, entry)) {
       
   805         stringstream err;
       
   806         err << "Failed to get Sdo entry: ";
       
   807         if (errno == EINVAL)
       
   808             err << "Either slave " << slaveIndex << " does not exist, "
       
   809                 << "or it contains less than " << sdoPosition + 1
       
   810                 << " Sdos, or the Sdo at position " << sdoPosition
       
   811                 << " contains less than " << (unsigned int) entrySubindex + 1
       
   812                 << " entries!" << endl;
       
   813         else
       
   814             err << strerror(errno);
       
   815         throw MasterException(err.str());
       
   816     }
       
   817 }
       
   818 
       
   819 /****************************************************************************/
       
   820 
   720 void Master::requestState(
   821 void Master::requestState(
   721         uint16_t slavePosition,
   822         uint16_t slavePosition,
   722         uint8_t state
   823         uint8_t state
   723         )
   824         )
   724 {
   825 {