tool/CommandRegWrite.cpp
changeset 1835 20748e9d2238
parent 1826 ec6223c3b7ec
child 1868 489ea0becd74
equal deleted inserted replaced
1834:67fc217d7341 1835:20748e9d2238
    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);