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) {
28 device_config = Factory::get_device_config(device_id_param);
29 summary_calc_type = device_config->get_summary_calculation_type();
30 device_id = device_id_param;
31 base_dir = DeviceConfig::get_base_dir_name();
32 device_dir = W1Util::concat_paths(base_dir, device_id);
33 device_ch_dir = W1Util::concat_paths(base_dir, "cache");
34 device_ch_dir = W1Util::concat_paths(device_ch_dir, device_id);
37 DeviceData::~DeviceData() {
38 delete(device_config);
41 Data *DeviceData::find_oldest_data(vector<string> year_vector) {
45 vector<string> mon_vcr;
46 vector<string> dta_vcr;
52 if (year_vector.size() > 0) {
53 // dirs are alphabetically sorted
54 year_dr = year_vector.at(0);
55 year_dr = W1Util::concat_paths(device_dir, year_dr);
56 mon_vcr = W1Util::get_subdirectories(year_dr);
57 for (ii = 0; ii < mon_vcr.size(); 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 dta_vcr = W1Util::get_data_files(mon_dr);
62 if (dta_vcr.size() > 0) {
63 f_name = dta_vcr.at(0);
64 f_name = W1Util::concat_paths(mon_dr, f_name);
65 store = new StoreDay(f_name);
66 ret_val = store->get_oldest_data();
75 Data *DeviceData::find_newest_data(vector<string> year_vector) {
79 vector<string> mon_vcr;
87 size = year_vector.size();
89 // dirs are alphabetically sorted
90 year_dr = year_vector.at(size - 1);
91 year_dr = W1Util::concat_paths(device_dir, year_dr);
92 mon_vcr = W1Util::get_subdirectories(year_dr);
93 for (ii = mon_vcr.size() - 1; ii >= 0; ii--) {
94 mon_dr = mon_vcr.at(ii);
95 mon_dr = W1Util::concat_paths(year_dr, mon_dr);
96 // scan data files from month dir
97 d_vcr = W1Util::get_data_files(mon_dr);
100 f_name = d_vcr.at(size - 1);
101 f_name = W1Util::concat_paths(mon_dr, f_name);
102 store = new StoreDay(f_name);
103 ret_val = store->get_newest_data();
112 DataRange *DeviceData::get_data_range() {
114 vector<string> y_list;
119 y_list = W1Util::get_subdirectories(device_dir);
120 o_data = find_oldest_data(y_list);
121 if (o_data != NULL) {
122 n_data = find_newest_data(y_list);
123 if (n_data != NULL) {
124 ret_val = new DataRange(o_data);
125 ret_val->add(n_data);
133 EnumSummaryPeriod get_period_type(Date *start_date,
136 EnumSummaryPeriod ret_val;
138 ret_val = PERIOD_YEARLY;
139 diff = end_date->year - start_date->year;
141 ret_val = PERIOD_YEARLY;
144 diff = end_date->month - start_date->month;
146 ret_val = PERIOD_MONTHLY;
149 diff = end_date->day - start_date->day;
151 ret_val = PERIOD_DAILY;
154 diff = end_date->hour - start_date->hour;
156 ret_val = PERIOD_HOURLY;
159 diff = end_date->min - start_date->min;
161 ret_val = PERIOD_MINUTELY;
164 ret_val = PERIOD_SECONDLY;
173 DataRange *DeviceData::get_summary(Date *date_param,
174 EnumSummaryCalculationType calc_type_param,
175 EnumSummaryPeriod period_type_param) {
180 //store = new StoreDay(device_id, date_param);
181 store = new StoreCache(device_id, date_param);
183 switch(calc_type_param) {
185 ret_val = store->get_sum(period_type_param);
188 ret_val = store->get_delta(period_type_param);
191 ret_val = store->get_max(period_type_param);
194 ret_val = store->get_min(period_type_param);
198 ret_val = store->get_mean(period_type_param);
201 if (ret_val != NULL) {
205 log_error("Could not read data log for device: %s\n", device_id.c_str());
209 log_error("Could not read data log for device: %s\n", device_id.c_str());
215 DataRange *DeviceData::get_daily_summary(Date *date,
216 EnumSummaryCalculationType calc_type_param) {
217 return get_summary(date, calc_type_param, PERIOD_DAILY);
220 DataRange *DeviceData::get_daily_summary(Date *date) {
223 ret_val = get_daily_summary(date, summary_calc_type);
227 DataRange *DeviceData::get_daily_summary(Date *start_date,
234 date = start_date->clone();
235 while(date->before_or_equal_day(end_date)) {
236 data = get_daily_summary(date);
238 if (ret_val == NULL) {
239 ret_val = new DataRange(data);
252 DataRange *DeviceData::get_hourly_summary(Date *date,
253 EnumSummaryCalculationType calc_type_param) {
254 return get_summary(date, calc_type_param, PERIOD_HOURLY);
257 DataRange *DeviceData::get_hourly_summary(Date *date) {
260 ret_val = get_hourly_summary(date, summary_calc_type);
264 DataRange *DeviceData::get_hourly_summary(Date *start_date,
274 date = start_date->clone();
275 while(date->before_or_equal_hour(end_date)) {
276 dta_lst = get_hourly_summary(date);
277 cnt = dta_lst->get_count();
278 for(ii = 0; ii < cnt; ii++) {
279 data = dta_lst->get(ii);
281 if (ret_val == NULL) {
282 ret_val = new DataRange(data);
296 DataRange *DeviceData::get_data(Date *start_date,
299 EnumSummaryPeriod period;
302 start_date->printout();
303 end_date->printout();
304 period = get_period_type(start_date, end_date);
307 log_debug("get yearly summary: %s - %s\n", start_date->to_string().c_str(), end_date->to_string().c_str());
308 ret_val = get_daily_summary(start_date, end_date);
311 log_debug("get monthly summary\n");
312 ret_val = get_daily_summary(start_date, end_date);
315 log_debug("get daily summary\n");
316 ret_val = get_daily_summary(start_date, end_date);
319 log_debug("get hourly summary\n");
320 ret_val = get_hourly_summary(start_date, end_date);
322 case PERIOD_MINUTELY:
323 log_debug("get minute summary data\n");
325 case PERIOD_SECONDLY:
327 log_debug("get second summary data\n");