diff -r a7ff6c28a432 -r be807e224b0e tool/CommandSoeRead.cpp --- a/tool/CommandSoeRead.cpp Fri Nov 26 11:23:19 2010 +0100 +++ b/tool/CommandSoeRead.cpp Sat Nov 27 17:02:54 2010 +0100 @@ -28,6 +28,7 @@ ****************************************************************************/ #include +#include using namespace std; #include "CommandSoeRead.h" @@ -36,23 +37,28 @@ /*****************************************************************************/ CommandSoeRead::CommandSoeRead(): - SoeCommand("soe_read", "Read an SoE IDN from a slave.") + Command("soe_read", "Read an SoE IDN from a slave.") { } /*****************************************************************************/ -string CommandSoeRead::helpString() const +string CommandSoeRead::helpString(const string &binaryBaseName) const { stringstream str; - str << getName() << " [OPTIONS] " << endl + str << binaryBaseName << " " << getName() + << " [OPTIONS] " << endl + << binaryBaseName << " " << getName() + << " [OPTIONS] " << endl << endl << getBriefDescription() << endl << endl << "This command requires a single slave to be selected." << endl << endl << "Arguments:" << endl + << " DRIVE is the drive number (0 - 7). If omitted, 0 is assumed." + << endl << " IDN is the IDN and must be either an unsigned" << endl << " 16 bit number acc. to IEC 61800-7-204:" << endl << " Bit 15: (0) Standard data, (1) Product data" << endl @@ -84,18 +90,38 @@ stringstream err; const DataType *dataType = NULL; ec_ioctl_slave_soe_read_t ioctl; + int driveArgIndex = -1, idnArgIndex = -1; - if (args.size() != 1) { - err << "'" << getName() << "' takes one argument!"; + if (args.size() == 1) { + idnArgIndex = 0; + } else if (args.size() == 2) { + driveArgIndex = 0; + idnArgIndex = 1; + } else { + err << "'" << getName() << "' takes eiter 1 or 2 arguments!"; throwInvalidUsageException(err); } - ioctl.drive_no = 0; // FIXME + if (driveArgIndex >= 0) { + stringstream str; + unsigned int number; + str << args[driveArgIndex]; + str + >> resetiosflags(ios::basefield) // guess base from prefix + >> number; + if (str.fail() || number > 7) { + err << "Invalid drive number '" << args[driveArgIndex] << "'!"; + throwInvalidUsageException(err); + } + ioctl.drive_no = number; + } else { + ioctl.drive_no = 0; + } try { - ioctl.idn = parseIdn(args[0]); + ioctl.idn = parseIdn(args[idnArgIndex]); } catch (runtime_error &e) { - err << "Invalid IDN '" << args[0] << "': " << e.what(); + err << "Invalid IDN '" << args[idnArgIndex] << "': " << e.what(); throwInvalidUsageException(err); }