687 } |
687 } |
688 } |
688 } |
689 |
689 |
690 /****************************************************************************/ |
690 /****************************************************************************/ |
691 |
691 |
|
692 struct CategoryName { |
|
693 uint16_t type; |
|
694 const char *name; |
|
695 }; |
|
696 |
|
697 static const CategoryName categoryNames[] = { |
|
698 {0x000a, "STRINGS"}, |
|
699 {0x0014, "DataTypes"}, |
|
700 {0x001e, "General"}, |
|
701 {0x0028, "FMMU"}, |
|
702 {0x0029, "SyncM"}, |
|
703 {0x0032, "TXPDO"}, |
|
704 {0x0033, "RXPDO"}, |
|
705 {0x003c, "DC"}, |
|
706 {} |
|
707 }; |
|
708 |
|
709 const char *getCategoryName(uint16_t type) |
|
710 { |
|
711 const CategoryName *cn = categoryNames; |
|
712 |
|
713 while (cn->type) { |
|
714 if (cn->type == type) { |
|
715 return cn->name; |
|
716 } |
|
717 cn++; |
|
718 } |
|
719 |
|
720 return "unknown"; |
|
721 } |
|
722 |
692 void Master::siiRead(int slavePosition) |
723 void Master::siiRead(int slavePosition) |
693 { |
724 { |
694 ec_ioctl_slave_sii_t data; |
725 ec_ioctl_slave_sii_t data; |
695 ec_ioctl_slave_t slave; |
726 ec_ioctl_slave_t slave; |
696 unsigned int i; |
727 unsigned int i; |
739 // cycle through categories |
770 // cycle through categories |
740 categoryHeader = data.words + 0x0040U; |
771 categoryHeader = data.words + 0x0040U; |
741 categoryType = le16tocpu(*categoryHeader); |
772 categoryType = le16tocpu(*categoryHeader); |
742 while (categoryType != 0xffff) { |
773 while (categoryType != 0xffff) { |
743 cout << "SII Category 0x" << hex |
774 cout << "SII Category 0x" << hex |
744 << setw(4) << categoryType << flush; |
775 << setw(4) << categoryType |
|
776 << " (" << getCategoryName(categoryType) << ")" << flush; |
745 |
777 |
746 if (categoryHeader + 1 > data.words + data.nwords) { |
778 if (categoryHeader + 1 > data.words + data.nwords) { |
747 err << "SII data seem to be corrupted!"; |
779 err << "SII data seem to be corrupted!"; |
748 throw MasterException(err.str()); |
780 throw MasterException(err.str()); |
749 } |
781 } |
750 categorySize = le16tocpu(*(categoryHeader + 1)); |
782 categorySize = le16tocpu(*(categoryHeader + 1)); |
751 cout << ", " << dec << categorySize << " words" << flush; |
783 cout << ", " << dec << categorySize << " words" << flush; |
752 |
784 |
753 if (categoryHeader + 2 + categorySize > data.words + data.nwords) { |
785 if (categoryHeader + 2 + categorySize |
|
786 > data.words + data.nwords) { |
754 err << "SII data seem to be corrupted!"; |
787 err << "SII data seem to be corrupted!"; |
755 throw MasterException(err.str()); |
788 throw MasterException(err.str()); |
756 } |
789 } |
757 |
790 |
758 cout << hex; |
791 cout << hex; |