]> pilppa.org Git - lib1wire.git/blob - src/Data.cc
initial device configuration support.
[lib1wire.git] / src / Data.cc
1 /*
2  * DataRange.cc
3  *
4  *  Created on: Dec 7, 2010
5  *      Author: lamikr
6  */
7
8 #include <string>
9 #include <iostream>
10 #include <sstream>
11
12 #include <stdio.h>
13 #include <time.h>
14 #include <malloc.h>
15
16 #include <plp/log.h>
17
18 #include "Data.hh"
19 #include "W1Util.hh"
20
21 using namespace std;
22 using namespace plp;
23 using namespace w1;
24
25 template <class NumberDataType>
26 bool string_to_number(NumberDataType& result,
27                  const std::string& string_param,
28                  std::ios_base& (*format)(std::ios_base&))
29 {
30         std::istringstream iss(string_param);
31         return !(iss >> format >> result).fail();
32 }
33
34 Data::Data(int size) {
35         value_arr.resize(size);
36 }
37
38 Data::Data(vector<double> vector_param, Date *date_param) {
39         int     ii;
40         int     size;
41
42         size    = vector_param.size();
43         //log_debug("Data(), value count: %d\n", size);
44         value_arr.resize(size);
45         for (int ii = 0; ii < vector_param.size(); ii++) {
46                 value_arr[ii]   = vector_param.at(ii);
47                 //log_debug("Data(), value[%d]: %f\n", ii, value_arr[ii]);
48         }
49         date_time.copy(date_param);
50 }
51
52 Data::Data(std::valarray<double> value_arr_param, Date *date_param) {
53         value_arr.resize(value_arr_param.size());
54         for (int ii = 0; ii < value_arr_param.size(); ii++) {
55                 value_arr[ii]   = value_arr_param[ii];
56         }
57         date_time.copy(date_param);
58 }
59
60 Data::~Data() {
61 }
62
63 plp::Date Data::get_date() {
64         return date_time;
65 }
66
67 void Data::set_date(plp::Date date) {
68         date_time.copy(&date);
69 }
70
71 void Data::printout() {
72         int     ii;
73
74         date_time.printout();
75         for (ii = 0; ii < value_arr.size(); ii++) {
76                 log_debug("  data[%d] = %f\n", ii, value_arr[ii]);
77         }
78 }
79
80 Data *Data::parse_data_string(const string& dataline) {
81         stringstream    ss(dataline);
82         string          item;
83         double          val;
84         Data            *ret_val;
85         int             ii;
86         bool            suc_flg;
87         vector<double>  v;
88         Date            date;
89
90         ii      = 0;
91         while(getline(ss, item, '|')) {
92                 if (ii == 0) {
93                         // parse date
94                         date    = W1Util::parse_date_str(item);
95                 }
96                 // skip the device type and device id fields
97                 // TODO: store device type and id to own file
98                 else if (ii >= 3) {
99                         suc_flg = string_to_number<double>(val, item, dec);
100                         if (suc_flg) {
101                                 //log_debug("adding number: %f\n", val);
102                                 v.push_back(val);
103                         }
104                 }
105                 ii++;
106         }
107         ret_val = new Data(v, &date);
108         return ret_val;
109 }
110
111 DataRange::DataRange(int value_count_per_data_item) {
112         val_matrix      = NULL;
113         column_count    = value_count_per_data_item;
114         row_count       = 0;
115 }
116
117 DataRange::DataRange(Data data) {
118         val_matrix      = NULL;
119         column_count    = data.value_arr.size();
120         row_count       = 0;
121         add_data(data);
122 }
123
124 DataRange::~DataRange() {
125         int     ii;
126         Date    *date;
127
128         if (val_matrix != NULL) {
129                 free(val_matrix);
130                 val_matrix      = NULL;
131         }
132         for (ii = 0; ii < date_list.size(); ii++) {
133                 date    = date_list.at(ii);
134                 delete(date);
135         }
136 }
137
138 void DataRange::add_data(Data data) {
139         int                     ii;
140         int                     r_count;
141         int                     indx;
142         Date                    date;
143
144         //log_debug("old row_count: %d, column_count: %d, value_arr_size: %d\n", row_count, column_count, data.value_arr.size());
145         val_matrix      = (double *)realloc(val_matrix, ((row_count + 1) * column_count) * sizeof(double));
146         indx            = row_count * column_count;
147         for (ii = 0; ii < data.value_arr.size(); ii++) {
148                 val_matrix[indx + ii]   = data.value_arr[ii];
149         }
150 /*
151         for (int ii = 0; ii < ((row_count + 1) * column_count); ii++) {
152                 log_debug("data_matrix[%d] = %f\n", ii, val_matrix[ii]);
153         }
154 */
155         date    = data.get_date();
156         date_list.push_back(date.clone());
157         row_count++;
158 }
159
160 Data *DataRange::get_data(int row_index) {
161         Data            *ret_val;
162         int             start_indx;
163         int             ii;
164         vector<double>  vector;
165         Date            *date;
166
167         ret_val = NULL;
168         if ((row_index >= 0) &&
169             (row_index < row_count)) {
170                 start_indx      = row_index * column_count;
171                 for (ii = 0; ii < column_count; ii++) {
172                         vector.push_back(val_matrix[start_indx + ii]);
173                 }
174                 date    = date_list.at(row_index);
175                 ret_val = new Data(vector, date);
176         }
177         return ret_val;
178 }
179
180 int DataRange::get_data_row_count() {
181         return row_count;
182 }
183
184 int DataRange::get_data_column_count() {
185         return column_count;
186 }
187
188 Data *DataRange::get_first_data() {
189         Data    *ret_val;
190
191         ret_val = NULL;
192         if (row_count > 0) {
193                 ret_val = get_data(0);
194         }
195         return ret_val;
196 }
197
198 Data *DataRange::get_last_data() {
199         return get_data(row_count - 1);
200 }