221 } |
222 } |
222 } |
223 } |
223 |
224 |
224 /****************************************************************************/ |
225 /****************************************************************************/ |
225 |
226 |
|
227 void Master::requestStates( |
|
228 int slavePosition, |
|
229 const vector<string> &commandArgs |
|
230 ) |
|
231 { |
|
232 string stateStr; |
|
233 uint8_t state; |
|
234 |
|
235 if (commandArgs.size() != 1) { |
|
236 stringstream err; |
|
237 err << "'state' takes exactly one argument!"; |
|
238 throw MasterException(err.str()); |
|
239 } |
|
240 |
|
241 stateStr = commandArgs[0]; |
|
242 transform(stateStr.begin(), stateStr.end(), |
|
243 stateStr.begin(), (int (*) (int)) std::toupper); |
|
244 |
|
245 if (stateStr == "INIT") { |
|
246 state = 0x01; |
|
247 } else if (stateStr == "PREOP") { |
|
248 state = 0x02; |
|
249 } else if (stateStr == "SAFEOP") { |
|
250 state = 0x04; |
|
251 } else if (stateStr == "OP") { |
|
252 state = 0x08; |
|
253 } else { |
|
254 stringstream err; |
|
255 err << "Invalid state '" << commandArgs[0] << "'!"; |
|
256 throw MasterException(err.str()); |
|
257 } |
|
258 |
|
259 if (slavePosition == -1) { |
|
260 unsigned int i, numSlaves = slaveCount(); |
|
261 for (i = 0; i < numSlaves; i++) |
|
262 requestState(i, state); |
|
263 } else { |
|
264 requestState(slavePosition, state); |
|
265 } |
|
266 } |
|
267 |
|
268 /****************************************************************************/ |
|
269 |
226 void Master::generateXml(int slavePosition) |
270 void Master::generateXml(int slavePosition) |
227 { |
271 { |
228 if (slavePosition == -1) { |
272 if (slavePosition == -1) { |
229 unsigned int numSlaves = slaveCount(), i; |
273 unsigned int numSlaves = slaveCount(), i; |
230 |
274 |
671 } |
715 } |
672 } |
716 } |
673 |
717 |
674 /****************************************************************************/ |
718 /****************************************************************************/ |
675 |
719 |
|
720 void Master::requestState( |
|
721 uint16_t slavePosition, |
|
722 uint8_t state |
|
723 ) |
|
724 { |
|
725 ec_ioctl_slave_state_t data; |
|
726 |
|
727 data.slave_position = slavePosition; |
|
728 data.requested_state = state; |
|
729 |
|
730 if (ioctl(fd, EC_IOCTL_SLAVE_STATE, &data)) { |
|
731 stringstream err; |
|
732 err << "Failed to request slave state: "; |
|
733 if (errno == EINVAL) |
|
734 err << "Slave " << slavePosition << " does not exist!"; |
|
735 else |
|
736 err << strerror(errno); |
|
737 throw MasterException(err.str()); |
|
738 } |
|
739 } |
|
740 |
|
741 /****************************************************************************/ |
|
742 |
676 string Master::slaveState(uint8_t state) |
743 string Master::slaveState(uint8_t state) |
677 { |
744 { |
678 switch (state) { |
745 switch (state) { |
679 case 1: return "INIT"; |
746 case 1: return "INIT"; |
680 case 2: return "PREOP"; |
747 case 2: return "PREOP"; |