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 { |