]> pilppa.org Git - lib1wire.git/blobdiff - src/Data.cc
Initial support for reading and writing device specific config data.
[lib1wire.git] / src / Data.cc
index d9c6e1a70eb59dc00a93f009e057e15c4fc10fd1..388dbefa71471c3910b680972abba3ac2361b6e6 100644 (file)
@@ -5,31 +5,53 @@
  *      Author: lamikr
  */
 
+#include <string>
 #include <iostream>
+#include <sstream>
 
 #include <stdio.h>
 #include <time.h>
 #include <malloc.h>
 
-#include "Data.hh"
 #include <plp/log.h>
 
+#include "Data.hh"
+#include "W1Util.hh"
+
 using namespace std;
 using namespace plp;
 using namespace w1;
 
+template <class NumberDataType>
+bool string_to_number(NumberDataType& result,
+                 const std::string& string_param,
+                 std::ios_base& (*format)(std::ios_base&))
+{
+       std::istringstream iss(string_param);
+       return !(iss >> format >> result).fail();
+}
+
 Data::Data(int size) {
        value_arr.resize(size);
 }
 
+Data::Data(int size, double default_value) {
+       int ii;
+
+       value_arr.resize(size);
+       for (ii = 0; ii < size; ii++) {
+               value_arr[ii]   = default_value;
+       }
+}
+
 Data::Data(vector<double> vector_param, Date *date_param) {
-       int     ii;
-       int     size;
+       unsigned int    ii;
+       unsigned int    size;
 
        size    = vector_param.size();
        //log_debug("Data(), value count: %d\n", size);
        value_arr.resize(size);
-       for (int ii = 0; ii < vector_param.size(); ii++) {
+       for (ii = 0; ii < vector_param.size(); ii++) {
                value_arr[ii]   = vector_param.at(ii);
                //log_debug("Data(), value[%d]: %f\n", ii, value_arr[ii]);
        }
@@ -37,8 +59,11 @@ Data::Data(vector<double> vector_param, Date *date_param) {
 }
 
 Data::Data(std::valarray<double> value_arr_param, Date *date_param) {
+       unsigned int ii;
+
        value_arr.resize(value_arr_param.size());
-       for (int ii = 0; ii < value_arr_param.size(); ii++) {
+
+       for (ii = 0; ii < value_arr_param.size(); ii++) {
                value_arr[ii]   = value_arr_param[ii];
        }
        date_time.copy(date_param);
@@ -56,7 +81,7 @@ void Data::set_date(plp::Date date) {
 }
 
 void Data::printout() {
-       int     ii;
+       unsigned int    ii;
 
        date_time.printout();
        for (ii = 0; ii < value_arr.size(); ii++) {
@@ -64,6 +89,37 @@ void Data::printout() {
        }
 }
 
+Data *Data::parse_data_string(const string& dataline) {
+       stringstream    ss(dataline);
+       string          item;
+       double          val;
+       Data            *ret_val;
+       int             ii;
+       bool            suc_flg;
+       vector<double>  v;
+       Date            date;
+
+       ii      = 0;
+       while(getline(ss, item, '|')) {
+               if (ii == 0) {
+                       // parse date
+                       date    = W1Util::parse_date_str(item);
+               }
+               // skip the device type and device id fields
+               // TODO: store device type and id to own file
+               else if (ii >= 3) {
+                       suc_flg = string_to_number<double>(val, item, dec);
+                       if (suc_flg) {
+                               //log_debug("adding number: %f\n", val);
+                               v.push_back(val);
+                       }
+               }
+               ii++;
+       }
+       ret_val = new Data(v, &date);
+       return ret_val;
+}
+
 DataRange::DataRange(int value_count_per_data_item) {
        val_matrix      = NULL;
        column_count    = value_count_per_data_item;
@@ -78,8 +134,8 @@ DataRange::DataRange(Data data) {
 }
 
 DataRange::~DataRange() {
-       int     ii;
-       Date    *date;
+       unsigned int    ii;
+       Date            *date;
 
        if (val_matrix != NULL) {
                free(val_matrix);
@@ -92,10 +148,9 @@ DataRange::~DataRange() {
 }
 
 void DataRange::add_data(Data data) {
-       int                     ii;
-       int                     r_count;
-       int                     indx;
-       Date                    date;
+       unsigned int    ii;
+       int             indx;
+       Date            date;
 
        //log_debug("old row_count: %d, column_count: %d, value_arr_size: %d\n", row_count, column_count, data.value_arr.size());
        val_matrix      = (double *)realloc(val_matrix, ((row_count + 1) * column_count) * sizeof(double));