diff -r 9976f7b9fe66 -r b09fd81894cb tool/cmd_sdo_upload.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tool/cmd_sdo_upload.cpp Tue Jul 22 14:17:20 2008 +0000 @@ -0,0 +1,160 @@ +/***************************************************************************** + * + * $Id$ + * + ****************************************************************************/ + +#include +#include +using namespace std; + +#include "globals.h" +#include "coe_datatypes.h" + +/****************************************************************************/ + +const char *help_sdo_upload = + "[OPTIONS]\n" + "\n" + "\n" + "Command-specific options:\n"; + +/****************************************************************************/ + +void command_sdo_upload(void) +{ + stringstream strIndex, strSubIndex; + int sval; + ec_ioctl_slave_sdo_upload_t data; + unsigned int uval; + const CoEDataType *dataType = NULL; + + if (slavePosition < 0) { + stringstream err; + err << "'sdo_upload' requires a slave! Please specify --slave."; + throw MasterDeviceException(err.str()); + } + data.slave_position = slavePosition; + + if (commandArgs.size() != 2) { + stringstream err; + err << "'sdo_upload' takes two arguments!"; + throw MasterDeviceException(err.str()); + } + + strIndex << commandArgs[0]; + strIndex + >> resetiosflags(ios::basefield) // guess base from prefix + >> data.sdo_index; + if (strIndex.fail()) { + stringstream err; + err << "Invalid Sdo index '" << commandArgs[0] << "'!"; + throw MasterDeviceException(err.str()); + } + + strSubIndex << commandArgs[1]; + strSubIndex + >> resetiosflags(ios::basefield) // guess base from prefix + >> uval; + if (strSubIndex.fail() || uval > 0xff) { + stringstream err; + err << "Invalid Sdo subindex '" << commandArgs[1] << "'!"; + throw MasterDeviceException(err.str()); + } + data.sdo_entry_subindex = uval; + + if (dataTypeStr != "") { // data type specified + if (!(dataType = findDataType(dataTypeStr))) { + stringstream err; + err << "Invalid data type '" << dataTypeStr << "'!"; + throw MasterDeviceException(err.str()); + } + } else { // no data type specified: fetch from dictionary + ec_ioctl_slave_sdo_entry_t entry; + + masterDev.open(MasterDevice::Read); + + try { + masterDev.getSdoEntry(&entry, slavePosition, + data.sdo_index, data.sdo_entry_subindex); + } catch (MasterDeviceException &e) { + stringstream err; + err << "Failed to determine Sdo entry data type. " + << "Please specify --type."; + throw ExecutionFailureException(err); + } + if (!(dataType = findDataType(entry.data_type))) { + stringstream err; + err << "Pdo entry has unknown data type 0x" + << hex << setfill('0') << setw(4) << entry.data_type << "!" + << " Please specify --type."; + throw ExecutionFailureException(err); + } + } + + if (dataType->byteSize) { + data.target_size = dataType->byteSize; + } else { + data.target_size = DefaultBufferSize; + } + + data.target = new uint8_t[data.target_size + 1]; + + masterDev.open(MasterDevice::Read); + + try { + masterDev.sdoUpload(&data); + } catch (MasterDeviceException &e) { + delete [] data.target; + throw e; + } + + masterDev.close(); + + if (dataType->byteSize && data.data_size != dataType->byteSize) { + stringstream err; + err << "Data type mismatch. Expected " << dataType->name + << " with " << dataType->byteSize << " byte, but got " + << data.data_size << " byte."; + throw MasterDeviceException(err.str()); + } + + cout << setfill('0'); + switch (dataType->coeCode) { + case 0x0002: // int8 + sval = *(int8_t *) data.target; + cout << sval << " 0x" << hex << setw(2) << sval << endl; + break; + case 0x0003: // int16 + sval = le16tocpu(*(int16_t *) data.target); + cout << sval << " 0x" << hex << setw(4) << sval << endl; + break; + case 0x0004: // int32 + sval = le32tocpu(*(int32_t *) data.target); + cout << sval << " 0x" << hex << setw(8) << sval << endl; + break; + case 0x0005: // uint8 + uval = (unsigned int) *(uint8_t *) data.target; + cout << uval << " 0x" << hex << setw(2) << uval << endl; + break; + case 0x0006: // uint16 + uval = le16tocpu(*(uint16_t *) data.target); + cout << uval << " 0x" << hex << setw(4) << uval << endl; + break; + case 0x0007: // uint32 + uval = le32tocpu(*(uint32_t *) data.target); + cout << uval << " 0x" << hex << setw(8) << uval << endl; + break; + case 0x0009: // string + cout << string((const char *) data.target, data.data_size) + << endl; + break; + default: + printRawData(data.target, data.data_size); + break; + } + + delete [] data.target; +} + +/*****************************************************************************/