Implemented 'ethercat sii_read -v'.

This commit is contained in:
Florian Pose 2008-07-07 08:46:41 +00:00
parent 5cc3194ee8
commit 2e60f64575
1 changed files with 65 additions and 6 deletions

View File

@ -694,6 +694,9 @@ void Master::siiRead(int slavePosition)
ec_ioctl_slave_sii_t data;
ec_ioctl_slave_t slave;
unsigned int i;
const uint16_t *categoryHeader;
uint16_t categoryType, categorySize;
stringstream err;
if (slavePosition < 0) {
stringstream err;
@ -720,9 +723,64 @@ void Master::siiRead(int slavePosition)
throw MasterException(err.str());
}
for (i = 0; i < data.nwords; i++) {
uint16_t *w = data.words + i;
cout << *(uint8_t *) w << *((uint8_t *) w + 1);
if (verbosity == Verbose) {
cout << "SII Area:" << hex << setfill('0');
for (i = 0; i < min(data.nwords, 0x0040U) * 2; i++) {
if (i % BreakAfterBytes) {
cout << " ";
} else {
cout << endl << " ";
}
cout << setw(2) << (unsigned int) *((uint8_t *) data.words + i);
}
cout << endl;
if (data.nwords > 0x0040U) {
// cycle through categories
categoryHeader = data.words + 0x0040U;
categoryType = le16tocpu(*categoryHeader);
while (categoryType != 0xffff) {
cout << "SII Category 0x" << hex
<< setw(4) << categoryType << flush;
if (categoryHeader + 1 > data.words + data.nwords) {
err << "SII data seem to be corrupted!";
throw MasterException(err.str());
}
categorySize = le16tocpu(*(categoryHeader + 1));
cout << ", " << dec << categorySize << " words" << flush;
if (categoryHeader + 2 + categorySize > data.words + data.nwords) {
err << "SII data seem to be corrupted!";
throw MasterException(err.str());
}
cout << hex;
for (i = 0; i < categorySize * 2U; i++) {
if (i % BreakAfterBytes) {
cout << " ";
} else {
cout << endl << " ";
}
cout << setw(2) << (unsigned int)
*((uint8_t *) (categoryHeader + 2) + i);
}
cout << endl;
if (categoryHeader + 2 + categorySize + 1
> data.words + data.nwords) {
err << "SII data seem to be corrupted!";
throw MasterException(err.str());
}
categoryHeader += 2 + categorySize;
categoryType = le16tocpu(*categoryHeader);
}
}
} else {
for (i = 0; i < data.nwords; i++) {
uint16_t *w = data.words + i;
cout << *(uint8_t *) w << *((uint8_t *) w + 1);
}
}
delete [] data.words;
@ -795,7 +853,7 @@ void Master::siiWrite(
}
// cycle through categories to detect corruption
categoryHeader = data.words + 0x0040;
categoryHeader = data.words + 0x0040U;
categoryType = le16tocpu(*categoryHeader);
while (categoryType != 0xffff) {
if (categoryHeader + 1 > data.words + data.nwords) {
@ -804,12 +862,13 @@ void Master::siiWrite(
throw MasterException(err.str());
}
categorySize = le16tocpu(*(categoryHeader + 1));
if (categoryHeader + categorySize + 2 > data.words + data.nwords) {
if (categoryHeader + 2 + categorySize + 1
> data.words + data.nwords) {
err << "SII data seem to be corrupted! "
"Use --force to write anyway.";
throw MasterException(err.str());
}
categoryHeader += categorySize + 2;
categoryHeader += 2 + categorySize;
categoryType = le16tocpu(*categoryHeader);
}
}