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 { |