tools/Master.cpp
changeset 960 36e460ffbb5e
parent 957 ed5ac2e83495
child 965 1aee4aa1def3
equal deleted inserted replaced
959:676e15bc5f27 960:36e460ffbb5e
    11 #include <sys/ioctl.h>
    11 #include <sys/ioctl.h>
    12 
    12 
    13 #include <iostream>
    13 #include <iostream>
    14 #include <iomanip>
    14 #include <iomanip>
    15 #include <sstream>
    15 #include <sstream>
       
    16 #include <cctype> // toupper()
    16 using namespace std;
    17 using namespace std;
    17 
    18 
    18 #include "Master.h"
    19 #include "Master.h"
    19 
    20 
    20 /****************************************************************************/
    21 /****************************************************************************/
   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";