4 * Created on: Nov 7, 2010
13 #include "DeviceData.hh"
14 #include "StoreDay.hh"
15 #include "StoreCache.hh"
16 #include "DeviceConfig.hh"
25 DeviceData::DeviceData(string device_id_param) {
29 device_id = device_id_param;
30 base_dir = DeviceConfig::get_base_dir_name();
31 device_dir = W1Util::concat_paths(base_dir, device_id);
32 device_ch_dir = W1Util::concat_paths(base_dir, "cache");
33 device_ch_dir = W1Util::concat_paths(device_ch_dir, device_id);
36 DeviceData::~DeviceData() {
37 if (device_config != NULL) {
38 delete(device_config);
43 Data *DeviceData::find_newest_data(string year_name_param) {
46 vector<string> mon_vcr;
55 year_dr = W1Util::concat_paths(device_dir, year_name_param);
56 mon_vcr = W1Util::get_subdirectories(year_dr);
57 for (ii = mon_vcr.size() - 1; ii >= 0; ii--) {
58 mon_dr = mon_vcr.at(ii);
59 mon_dr = W1Util::concat_paths(year_dr, mon_dr);
60 // scan data files from month dir
61 d_vcr = W1Util::get_data_files(mon_dr);
64 f_name = d_vcr.at(size - 1);
65 f_name = W1Util::concat_paths(mon_dr, f_name);
66 store = new StoreDay(f_name);
67 ret_val = store->get_newest_data();
75 Data *DeviceData::find_newest_data(vector<string> year_name_vector_param) {
81 size = year_name_vector_param.size();
83 // dirs are alphabetically sorted
84 year_name = year_name_vector_param.at(size - 1);
85 ret_val = find_newest_data(year_name);
90 Data *DeviceData::find_oldest_data(string year_name_param) {
95 vector<string> mon_vcr;
96 vector<string> dta_vcr;
102 year_dr = W1Util::concat_paths(device_dir, year_name_param);
103 mon_vcr = W1Util::get_subdirectories(year_dr);
104 for (ii = 0; ii < mon_vcr.size(); ii++) {
105 mon_dr = mon_vcr.at(ii);
106 mon_dr = W1Util::concat_paths(year_dr, mon_dr);
107 // scan data files from month dir
108 dta_vcr = W1Util::get_data_files(mon_dr);
109 size = dta_vcr.size();
111 f_name = dta_vcr.at(0);
112 f_name = W1Util::concat_paths(mon_dr, f_name);
113 store = new StoreDay(f_name);
114 ret_val = store->get_oldest_data();
122 Data *DeviceData::find_oldest_data(vector<string> year_name_vector_param) {
128 size = year_name_vector_param.size();
130 // dirs are alphabetically sorted
131 year_name = year_name_vector_param.at(0);
132 ret_val = find_oldest_data(year_name);
137 DataRange *DeviceData::get_data_range() {
139 vector<string> y_list;
144 y_list = W1Util::get_subdirectories(device_dir);
145 o_data = find_oldest_data(y_list);
146 if (o_data != NULL) {
147 n_data = find_newest_data(y_list);
148 if (n_data != NULL) {
149 ret_val = new DataRange(o_data);
150 ret_val->add(n_data);
158 EnumSummaryPeriod get_period_type(Date *start_date,
161 EnumSummaryPeriod ret_val;
163 ret_val = PERIOD_YEARLY;
164 diff = end_date->year - start_date->year;
166 ret_val = PERIOD_YEARLY;
169 diff = end_date->month - start_date->month;
171 ret_val = PERIOD_MONTHLY;
174 diff = end_date->day - start_date->day;
176 ret_val = PERIOD_DAILY;
179 diff = end_date->hour - start_date->hour;
181 ret_val = PERIOD_HOURLY;
184 diff = end_date->min - start_date->min;
186 ret_val = PERIOD_MINUTELY;
189 ret_val = PERIOD_SECONDLY;
198 DataRange *DeviceData::get_summary(Date *date_param,
199 EnumSummaryCalculationType calc_type_param,
200 EnumSummaryPeriod period_type_param) {
205 //store = new StoreDay(device_id, date_param);
206 store = new StoreCache(device_id, date_param);
208 switch(calc_type_param) {
210 ret_val = store->get_sum(period_type_param);
213 ret_val = store->get_delta(period_type_param);
216 ret_val = store->get_max(period_type_param);
219 ret_val = store->get_min(period_type_param);
223 ret_val = store->get_mean(period_type_param);
226 if (ret_val != NULL) {
230 log_error("Could not read data log for device: %s\n", device_id.c_str());
234 log_error("Could not read data log for device: %s\n", device_id.c_str());
240 DataRange *DeviceData::get_yearly_summary(Date *date,
241 EnumSummaryCalculationType calc_type_param) {
242 return get_summary(date, calc_type_param, PERIOD_YEARLY);
245 DataRange *DeviceData::get_yearly_summary(Date *date) {
248 if (device_config == NULL) {
249 device_config = Factory::get_device_config(device_id);
250 summary_calc_type = device_config->get_summary_calculation_type();
252 ret_val = get_yearly_summary(date, summary_calc_type);
256 DataRange *DeviceData::get_yearly_summary(Date *start_date,
263 date = start_date->clone();
264 while(date->before_or_equal_year(end_date)) {
265 data = get_yearly_summary(date);
267 if (ret_val == NULL) {
268 ret_val = new DataRange(data);
281 DataRange *DeviceData::get_monthly_summary(Date *date,
282 EnumSummaryCalculationType calc_type_param) {
283 return get_summary(date, calc_type_param, PERIOD_MONTHLY);
286 DataRange *DeviceData::get_monthly_summary(Date *date) {
289 if (device_config == NULL) {
290 device_config = Factory::get_device_config(device_id);
291 summary_calc_type = device_config->get_summary_calculation_type();
293 ret_val = get_monthly_summary(date, summary_calc_type);
297 DataRange *DeviceData::get_monthly_summary(Date *start_date,
304 date = start_date->clone();
305 while(date->before_or_equal_month(end_date)) {
306 data = get_monthly_summary(date);
308 if (ret_val == NULL) {
309 ret_val = new DataRange(data);
322 DataRange *DeviceData::get_daily_summary(Date *date,
323 EnumSummaryCalculationType calc_type_param) {
324 return get_summary(date, calc_type_param, PERIOD_DAILY);
327 DataRange *DeviceData::get_daily_summary(Date *date) {
330 if (device_config == NULL) {
331 device_config = Factory::get_device_config(device_id);
332 summary_calc_type = device_config->get_summary_calculation_type();
334 ret_val = get_daily_summary(date, summary_calc_type);
338 DataRange *DeviceData::get_daily_summary(Date *start_date,
345 date = start_date->clone();
346 while(date->before_or_equal_day(end_date)) {
347 data = get_daily_summary(date);
349 if (ret_val == NULL) {
350 ret_val = new DataRange(data);
363 DataRange *DeviceData::get_hourly_summary(Date *date,
364 EnumSummaryCalculationType calc_type_param) {
365 return get_summary(date, calc_type_param, PERIOD_HOURLY);
368 DataRange *DeviceData::get_hourly_summary(Date *date) {
371 if (device_config == NULL) {
372 device_config = Factory::get_device_config(device_id);
373 summary_calc_type = device_config->get_summary_calculation_type();
375 ret_val = get_hourly_summary(date, summary_calc_type);
379 DataRange *DeviceData::get_hourly_summary(Date *start_date,
389 date = start_date->clone();
390 while(date->before_or_equal_hour(end_date)) {
391 dta_lst = get_hourly_summary(date);
392 cnt = dta_lst->get_count();
393 for(ii = 0; ii < cnt; ii++) {
394 data = dta_lst->get(ii);
396 if (ret_val == NULL) {
397 ret_val = new DataRange(data);
411 DataRange *DeviceData::get_data(Date *start_date,
414 EnumSummaryPeriod period;
417 start_date->printout();
418 end_date->printout();
419 period = get_period_type(start_date, end_date);
422 log_debug("get yearly summary: %s - %s\n", start_date->to_string().c_str(), end_date->to_string().c_str());
423 ret_val = get_yearly_summary(start_date, end_date);
426 log_debug("get monthly summary\n");
427 ret_val = get_monthly_summary(start_date, end_date);
430 log_debug("get daily summary\n");
431 ret_val = get_daily_summary(start_date, end_date);
434 log_debug("get hourly summary\n");
435 ret_val = get_hourly_summary(start_date, end_date);
437 case PERIOD_MINUTELY:
438 log_debug("get minute summary data\n");
440 case PERIOD_SECONDLY:
442 log_debug("get second summary data\n");