tool/cmd_download.cpp
changeset 1136 a0982873d655
parent 1134 3356141fa2f8
child 1137 a73c0f54be42
equal deleted inserted replaced
1135:807ec6498502 1136:a0982873d655
    28     ec_ioctl_slave_sdo_download_t data;
    28     ec_ioctl_slave_sdo_download_t data;
    29     unsigned int number;
    29     unsigned int number;
    30     const CoEDataType *dataType = NULL;
    30     const CoEDataType *dataType = NULL;
    31 
    31 
    32     if (slavePosition < 0) {
    32     if (slavePosition < 0) {
    33         err << "'sdo_download' requires a slave! Please specify --slave.";
    33         err << "'" << commandName << "' requires a slave! "
    34         throw MasterDeviceException(err.str());
    34             << "Please specify --slave.";
       
    35         throw InvalidUsageException(err);
    35     }
    36     }
    36     data.slave_position = slavePosition;
    37     data.slave_position = slavePosition;
    37 
    38 
    38     if (commandArgs.size() != 3) {
    39     if (commandArgs.size() != 3) {
    39         err << "'sdo_download' takes 3 arguments!";
    40         err << "'" << commandName << "' takes 3 arguments!";
    40         throw MasterDeviceException(err.str());
    41         throw InvalidUsageException(err);
    41     }
    42     }
    42 
    43 
    43     strIndex << commandArgs[0];
    44     strIndex << commandArgs[0];
    44     strIndex
    45     strIndex
    45         >> resetiosflags(ios::basefield) // guess base from prefix
    46         >> resetiosflags(ios::basefield) // guess base from prefix
    46         >> data.sdo_index;
    47         >> data.sdo_index;
    47     if (strIndex.fail()) {
    48     if (strIndex.fail()) {
    48         err << "Invalid Sdo index '" << commandArgs[0] << "'!";
    49         err << "Invalid Sdo index '" << commandArgs[0] << "'!";
    49         throw MasterDeviceException(err.str());
    50         throw InvalidUsageException(err);
    50     }
    51     }
    51 
    52 
    52     strSubIndex << commandArgs[1];
    53     strSubIndex << commandArgs[1];
    53     strSubIndex
    54     strSubIndex
    54         >> resetiosflags(ios::basefield) // guess base from prefix
    55         >> resetiosflags(ios::basefield) // guess base from prefix
    55         >> number;
    56         >> number;
    56     if (strSubIndex.fail() || number > 0xff) {
    57     if (strSubIndex.fail() || number > 0xff) {
    57         err << "Invalid Sdo subindex '" << commandArgs[1] << "'!";
    58         err << "Invalid Sdo subindex '" << commandArgs[1] << "'!";
    58         throw MasterDeviceException(err.str());
    59         throw InvalidUsageException(err);
    59     }
    60     }
    60     data.sdo_entry_subindex = number;
    61     data.sdo_entry_subindex = number;
    61 
    62 
    62     if (dataTypeStr != "") { // data type specified
    63     if (dataTypeStr != "") { // data type specified
    63         if (!(dataType = findDataType(dataTypeStr))) {
    64         if (!(dataType = findDataType(dataTypeStr))) {
    64             err << "Invalid data type '" << dataTypeStr << "'!";
    65             err << "Invalid data type '" << dataTypeStr << "'!";
    65             throw MasterDeviceException(err.str());
    66             throw InvalidUsageException(err);
    66         }
    67         }
    67     } else { // no data type specified: fetch from dictionary
    68     } else { // no data type specified: fetch from dictionary
    68         ec_ioctl_slave_sdo_entry_t entry;
    69         ec_ioctl_slave_sdo_entry_t entry;
    69 
    70 
    70         masterDev.open(MasterDevice::ReadWrite);
    71         masterDev.open(MasterDevice::ReadWrite);
    73             masterDev.getSdoEntry(&entry, slavePosition,
    74             masterDev.getSdoEntry(&entry, slavePosition,
    74                     data.sdo_index, data.sdo_entry_subindex);
    75                     data.sdo_index, data.sdo_entry_subindex);
    75         } catch (MasterDeviceException &e) {
    76         } catch (MasterDeviceException &e) {
    76             err << "Failed to determine Sdo entry data type. "
    77             err << "Failed to determine Sdo entry data type. "
    77                 << "Please specify --type.";
    78                 << "Please specify --type.";
    78             throw ExecutionFailureException(err);
    79             throw CommandException(err);
    79         }
    80         }
    80         if (!(dataType = findDataType(entry.data_type))) {
    81         if (!(dataType = findDataType(entry.data_type))) {
    81             err << "Pdo entry has unknown data type 0x"
    82             err << "Pdo entry has unknown data type 0x"
    82                 << hex << setfill('0') << setw(4) << entry.data_type << "!"
    83                 << hex << setfill('0') << setw(4) << entry.data_type << "!"
    83                 << " Please specify --type.";
    84                 << " Please specify --type.";
    84             throw ExecutionFailureException(err);
    85             throw CommandException(err);
    85         }
    86         }
    86     }
    87     }
    87 
    88 
    88     if (dataType->byteSize) {
    89     if (dataType->byteSize) {
    89         data.data_size = dataType->byteSize;
    90         data.data_size = dataType->byteSize;
   146                     break;
   147                     break;
   147                 }
   148                 }
   148             case 0x0009: // string
   149             case 0x0009: // string
   149                 if (strValue.str().size() >= data.data_size) {
   150                 if (strValue.str().size() >= data.data_size) {
   150                     err << "String too large";
   151                     err << "String too large";
   151                     throw MasterDeviceException(err.str());
   152                     throw CommandException(err);
   152                 }
   153                 }
   153                 data.data_size = strValue.str().size();
   154                 data.data_size = strValue.str().size();
   154                 strValue >> (char *) data.data;
   155                 strValue >> (char *) data.data;
   155                 break;
   156                 break;
   156 
   157 
   157             default:
   158             default:
   158                 delete [] data.data;
   159                 delete [] data.data;
   159                 err << "Unknown data type 0x" << hex << dataType->coeCode;
   160                 err << "Unknown data type 0x" << hex << dataType->coeCode;
   160                 throw MasterDeviceException(err.str());
   161                 throw CommandException(err);
   161         }
   162         }
   162     } catch (ios::failure &e) {
   163     } catch (ios::failure &e) {
   163         delete [] data.data;
   164         delete [] data.data;
   164         err << "Invalid value argument '" << commandArgs[2]
   165         err << "Invalid value argument '" << commandArgs[2]
   165             << "' for type '" << dataType->name << "'!";
   166             << "' for type '" << dataType->name << "'!";
   166         throw MasterDeviceException(err.str());
   167         throw InvalidUsageException(err);
   167     }
   168     }
   168 
   169 
   169     masterDev.open(MasterDevice::ReadWrite);
   170     masterDev.open(MasterDevice::ReadWrite);
   170 
   171 
   171 	try {
   172 	try {