diff -r 9976f7b9fe66 -r b09fd81894cb tool/cmd_sii_read.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tool/cmd_sii_read.cpp Tue Jul 22 14:17:20 2008 +0000 @@ -0,0 +1,157 @@ +/***************************************************************************** + * + * $Id$ + * + ****************************************************************************/ + +#include +#include +using namespace std; + +#include "globals.h" + +/****************************************************************************/ + +const char *help_sii_read = + "[OPTIONS]\n" + "\n" + "\n" + "Command-specific options:\n"; + +/****************************************************************************/ + +struct CategoryName { + uint16_t type; + const char *name; +}; + +static const CategoryName categoryNames[] = { + {0x000a, "STRINGS"}, + {0x0014, "DataTypes"}, + {0x001e, "General"}, + {0x0028, "FMMU"}, + {0x0029, "SyncM"}, + {0x0032, "TXPDO"}, + {0x0033, "RXPDO"}, + {0x003c, "DC"}, + {} +}; + +/****************************************************************************/ + +const char *getCategoryName(uint16_t type) +{ + const CategoryName *cn = categoryNames; + + while (cn->type) { + if (cn->type == type) { + return cn->name; + } + cn++; + } + + return "unknown"; +} + +/****************************************************************************/ + +void command_sii_read(void) +{ + 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; + err << "'sii_read' requires a slave! Please specify --slave."; + throw MasterDeviceException(err.str()); + } + data.slave_position = slavePosition; + + masterDev.open(MasterDevice::Read); + + masterDev.getSlave(&slave, slavePosition); + + if (!slave.sii_nwords) + return; + + data.offset = 0; + data.nwords = slave.sii_nwords; + data.words = new uint16_t[data.nwords]; + + try { + masterDev.readSii(&data); + } catch (MasterDeviceException &e) { + delete [] data.words; + throw e; + } + + 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 + << " (" << getCategoryName(categoryType) << ")" << flush; + + if (categoryHeader + 1 > data.words + data.nwords) { + err << "SII data seem to be corrupted!"; + throw MasterDeviceException(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 MasterDeviceException(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 MasterDeviceException(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; +} + +/*****************************************************************************/