37 #include "MasterDevice.h" |
37 #include "MasterDevice.h" |
38 |
38 |
39 /*****************************************************************************/ |
39 /*****************************************************************************/ |
40 |
40 |
41 CommandRegWrite::CommandRegWrite(): |
41 CommandRegWrite::CommandRegWrite(): |
42 CommandReg("reg_write", "Write data to a slave's registers.") |
42 Command("reg_write", "Write data to a slave's registers.") |
43 { |
43 { |
44 } |
44 } |
45 |
45 |
46 /*****************************************************************************/ |
46 /*****************************************************************************/ |
47 |
47 |
129 throwInvalidUsageException(err); |
129 throwInvalidUsageException(err); |
130 } |
130 } |
131 |
131 |
132 if (dataType->byteSize) { |
132 if (dataType->byteSize) { |
133 data.length = dataType->byteSize; |
133 data.length = dataType->byteSize; |
134 data.data = new uint8_t[data.length]; |
134 } else { |
135 } |
135 data.length = 1024; // FIXME |
136 |
136 } |
137 strValue << args[1]; |
137 |
138 strValue >> resetiosflags(ios::basefield); // guess base from prefix |
138 data.data = new uint8_t[data.length]; |
139 strValue.exceptions(ios::failbit); |
|
140 |
139 |
141 try { |
140 try { |
142 if (string(dataType->name) == "int8") { |
141 data.length = interpretAsType( |
143 int16_t val; // uint8_t is interpreted as char |
142 dataType, args[1], data.data, data.length); |
144 strValue >> val; |
143 } catch (SizeException &e) { |
145 if (val > 127 || val < -128) |
144 delete [] data.data; |
146 throw ios::failure("Value out of range"); |
145 throwCommandException(e.what()); |
147 *data.data = (int8_t) val; |
|
148 } else if (string(dataType->name) == "int16") { |
|
149 int16_t val; |
|
150 strValue >> val; |
|
151 *(int16_t *) data.data = cpu_to_le16(val); |
|
152 } else if (string(dataType->name) == "int32") { |
|
153 int32_t val; |
|
154 strValue >> val; |
|
155 *(int32_t *) data.data = cpu_to_le32(val); |
|
156 } else if (string(dataType->name) == "int64") { |
|
157 int64_t val; |
|
158 strValue >> val; |
|
159 *(int64_t *) data.data = cpu_to_le64(val); |
|
160 } else if (string(dataType->name) == "uint8") { |
|
161 uint16_t val; // uint8_t is interpreted as char |
|
162 strValue >> val; |
|
163 if (val > 0xff) |
|
164 throw ios::failure("Value out of range"); |
|
165 *data.data = (uint8_t) val; |
|
166 } else if (string(dataType->name) == "uint16") { |
|
167 uint16_t val; |
|
168 strValue >> val; |
|
169 *(uint16_t *) data.data = cpu_to_le16(val); |
|
170 } else if (string(dataType->name) == "uint32") { |
|
171 uint32_t val; |
|
172 strValue >> val; |
|
173 *(uint32_t *) data.data = cpu_to_le32(val); |
|
174 } else if (string(dataType->name) == "uint64") { |
|
175 uint64_t val; |
|
176 strValue >> val; |
|
177 *(uint64_t *) data.data = cpu_to_le64(val); |
|
178 } else if (string(dataType->name) == "string" || |
|
179 string(dataType->name) == "octet_string") { |
|
180 data.length = strValue.str().size(); |
|
181 if (!data.length) { |
|
182 err << "Zero-size string now allowed!"; |
|
183 throwCommandException(err); |
|
184 } |
|
185 data.data = new uint8_t[data.length]; |
|
186 strValue >> (char *) data.data; |
|
187 } else { |
|
188 err << "Invalid data type " << dataType->name; |
|
189 throwCommandException(err); |
|
190 } |
|
191 } catch (ios::failure &e) { |
146 } catch (ios::failure &e) { |
192 delete [] data.data; |
147 delete [] data.data; |
193 err << "Invalid value argument '" << args[1] |
148 err << "Invalid value argument '" << args[1] |
194 << "' for type '" << dataType->name << "'!"; |
149 << "' for type '" << dataType->name << "'!"; |
195 throwInvalidUsageException(err); |
150 throwInvalidUsageException(err); |