]> pilppa.org Git - lib1wire.git/blob - src/W1DataList.cc
5f85db07b6420b9ae18c4810ca02099bef9c3d92
[lib1wire.git] / src / W1DataList.cc
1 /*
2  * W1DataList.cc
3  *
4  *  Created on: Nov 7, 2010
5  *      Author: lamikr
6  */
7 #include <dirent.h>
8 #include <malloc.h>
9 #include <errno.h>
10 #include <string.h>
11
12 #include "W1Util.hh"
13 #include "W1DataList.hh"
14 #include "W1Store.hh"
15
16 #include "plp/log.h"
17
18 using namespace w1;
19 using namespace std;
20 using namespace plp;
21
22 W1DataList::W1DataList(string device_id_param) {
23         string          base_dir;
24
25         device_id       = device_id_param;
26         base_dir        = W1Store::get_base_dir_name();
27         device_dir      = W1Util::concat_paths(base_dir, device_id);
28         device_ch_dir   = W1Util::concat_paths(base_dir, "cache");
29         device_ch_dir   = W1Util::concat_paths(device_ch_dir, device_id);
30 }
31
32 W1DataList::~W1DataList() {
33         //delete(device_dir);
34 }
35
36 Data *W1DataList::find_oldest_data(vector<string> year_vector) {
37         int             ii;
38         string          year_dir;
39         string          month_dir;
40         vector<string>  month_vector;
41         vector<string>  data_vector;
42         string          f_name;
43         W1Store         *store;
44         Data            *ret_val;
45
46         ret_val = NULL;
47         if (year_vector.size() > 0) {
48                 // dirs are alphabetically sorted
49                 year_dir        = year_vector.at(0);
50                 year_dir        = W1Util::concat_paths(device_dir, year_dir);
51                 month_vector    = W1Util::get_subdirectories(year_dir);
52                 for (ii = 0; ii < month_vector.size(); ii++) {
53                         month_dir       = month_vector.at(ii);
54                         month_dir       = W1Util::concat_paths(year_dir, month_dir);
55                         // scan data files from month dir
56                         data_vector     = W1Util::get_data_files(month_dir);
57                         if (data_vector.size() > 0) {
58                                 f_name  = data_vector.at(0);
59                                 f_name  = W1Util::concat_paths(month_dir, f_name);
60                                 store   = new W1Store(f_name);
61                                 ret_val = store->get_oldest_data();
62                                 delete(store);
63                                 break;
64                         }
65                 }
66         }
67         return ret_val;
68 }
69
70 Data *W1DataList::find_newest_data(vector<string> year_vector) {
71         int             ii;
72         string          year_dir;
73         string          month_dir;
74         vector<string>  month_vector;
75         vector<string>  data_vector;
76         string          f_name;
77         Data            *ret_val;
78         int             size;
79         W1Store         *store;
80
81         ret_val = NULL;
82         size    = year_vector.size();
83         if (size > 0) {
84                 // dirs are alphabetically sorted
85                 year_dir        = year_vector.at(size - 1);
86                 year_dir        = W1Util::concat_paths(device_dir, year_dir);
87                 month_vector    = W1Util::get_subdirectories(year_dir);
88                 for (ii = month_vector.size() - 1; ii >= 0; ii--) {
89                         month_dir       = month_vector.at(ii);
90                         month_dir       = W1Util::concat_paths(year_dir, month_dir);
91                         // scan data files from month dir
92                         data_vector     = W1Util::get_data_files(month_dir);
93                         size    = data_vector.size();
94                         if (size > 0) {
95                                 f_name  = data_vector.at(size - 1);
96                                 f_name  = W1Util::concat_paths(month_dir, f_name);
97                                 store   = new W1Store(f_name);
98                                 ret_val = store->get_newest_data();
99                                 delete(store);
100                                 break;
101                         }
102                 }
103         }
104         return ret_val;
105 }
106
107 DataRange *W1DataList::get_data_range() {
108         DataRange       *ret_val;
109         DIR             *data_dir;
110         struct dirent   *year_dirent;
111         vector<string>  year_list;
112         Data            *first_data;
113         Data            *newest_data;
114
115         ret_val         = NULL;
116         year_list       = W1Util::get_subdirectories(device_dir);
117         first_data      = find_oldest_data(year_list);
118         if (first_data != NULL) {
119                 newest_data     = find_newest_data(year_list);
120                 if (newest_data != NULL) {
121                         ret_val = new DataRange(*first_data);
122                         ret_val->add_data(*newest_data);
123                         delete(newest_data);
124                 }
125                 delete(first_data);
126         }
127         return ret_val;
128 }
129
130 long int get_interval_type(Date *start_date,
131                         Date *end_date) {
132         int     diff;
133         int     ret_val;
134
135         ret_val = 0;
136         diff    = end_date->year - start_date->year;
137         if (diff != 0) {
138                 ret_val = 0;
139         }
140         else {
141                 diff    = end_date->month - start_date->month;
142                 if (diff != 0) {
143                         ret_val = 1;
144                 }
145                 else {
146                         diff    = end_date->day - start_date->day;
147                         if (diff != 0) {
148                                 ret_val = 2;
149                         }
150                         else {
151                                 diff    = end_date->hour - start_date->hour;
152                                 if (diff != 0) {
153                                         ret_val = 3;
154                                 }
155                                 else {
156                                         diff    = end_date->min - start_date->min;
157                                         if (diff != 0) {
158                                                 ret_val = 4;
159                                         }
160                                         else {
161                                                 ret_val = 5;
162                                         }
163                                 }
164                         }
165                 }
166         }
167         return ret_val;
168 }
169
170 Data *W1DataList::get_daily_summary(Date *date) {
171         Data    *data;
172         W1Store *store;
173
174         store   = new W1Store(device_id, date);
175         store->load();
176         data    = store->get_mean();
177         data->printout();
178         delete(store);
179
180         return data;
181 }
182
183 DataRange *W1DataList::get_daily_summary(Date *start_date,
184                                         Date *end_date) {
185         DataRange       *ret_val;
186         Data            *data;
187         Date            *date;
188
189         ret_val = NULL;
190         date    = start_date->clone();
191         while(date->before(*end_date)) {
192                 data    = get_daily_summary(date);
193                 if (ret_val == NULL) {
194                         ret_val = new DataRange(*data);
195                 }
196                 else {
197                         ret_val->add_data(*data);
198                 }
199                 delete(data);
200                 date->tomorrow();
201         }
202         delete(date);
203         return ret_val;
204 }
205
206 DataRange *W1DataList::get_data(Date *start_date,
207                                 Date *end_date) {
208         DataRange       *ret_val;
209         int             int_type;
210
211         ret_val         = NULL;
212         start_date->printout();
213         end_date->printout();
214         int_type        = get_interval_type(start_date, end_date);
215         switch(int_type) {
216                 case 0:
217                         log_debug("get yearly summary\n");
218                         break;
219                 case 1:
220                         log_debug("get monthly summary\n");
221                         break;
222                 case 2:
223                         log_debug("get daily summary\n");
224                         ret_val = get_daily_summary(start_date, end_date);
225                         break;
226                 case 3:
227                         log_debug("get hourly summary\n");
228                         break;
229                 case 4:
230                         log_debug("get minute summary data\n");
231                         break;
232                 case 5:
233                         log_debug("get second summary data\n");
234                         break;
235         }
236         return ret_val;
237 }