X-Git-Url: http://pilppa.org/gitweb/?a=blobdiff_plain;f=src%2FW1Store.cc;h=9913d0dcd8cefad6787cdcf299accf15fd56b210;hb=dcc5fd94e2ec65898dd8bda440cb0539e1f60373;hp=8debaa1b316f336e33a5265edcbebf5e09fe4ef7;hpb=8c97cbb9b5f8997fe9ab3917fcbea66d74b45837;p=lib1wire.git diff --git a/src/W1Store.cc b/src/W1Store.cc index 8debaa1..9913d0d 100644 --- a/src/W1Store.cc +++ b/src/W1Store.cc @@ -109,11 +109,13 @@ void W1Store::store(std::string device_id, delete(date); } -void W1Store::load() { +bool W1Store::load() { Data *data; ifstream in; string line; + bool ret_val; + ret_val = false; if (store_data != NULL) { delete(store_data); store_data = NULL; @@ -131,7 +133,12 @@ void W1Store::load() { } delete(data); } + ret_val = true; } + else { + log_error("Could not load data from file: %s\n", store_file_name.c_str()); + } + return ret_val; } Data *W1Store::get_sum() { @@ -330,6 +337,165 @@ Data *W1Store::get_min() { return ret_val; } +vector W1Store::get_mean(int freq_sec) { + int row_count; + int col_count; + int d_count; + int jj; + int ii; + Data *data; + Data *calc; + Date *limit_d; + Date date; + vector ret_val; + + calc = NULL; + limit_d = NULL; + d_count = 1; + if (store_data == NULL) { + load(); + } + if (store_data != NULL) { + row_count = store_data->get_data_row_count(); + if (row_count > 0) { + col_count = store_data->get_data_column_count(); + if (col_count > 0) { + for (ii = 0; ii < row_count; ii++) { + data = store_data->get_data(ii); + if (data != NULL) { + if (calc == NULL) { + d_count = 1; + calc = data->clone(); + limit_d = data->get_date().clone(); + limit_d->min = 0; + limit_d->sec = 0; + limit_d->inc_seconds(freq_sec); + } + else { + date = data->get_date(); + if (date.before(*limit_d)) { + for (jj = 0; jj < col_count; jj++) { + calc->value_arr[jj] = calc->value_arr[jj] + data->value_arr[jj]; + } + d_count++; + } + else { + for (jj = 0; jj < col_count; jj++) { + calc->value_arr[jj] = calc->value_arr[jj] / d_count; + } + ret_val.push_back(calc); + d_count = 1; + calc = data->clone(); + if (limit_d != NULL) { + delete(limit_d); + } + limit_d = data->get_date().clone(); + limit_d->min = 0; + limit_d->sec = 0; + limit_d->inc_seconds(freq_sec); + } + } + delete(data); + } + } + if (calc != NULL) { + delete(calc); + calc = NULL; + } + if (limit_d != NULL) { + delete(limit_d); + } + } + } + } + return ret_val; +} + +vector W1Store::get_delta(int freq_sec) { + int row_count; + int col_count; + int jj; + int ii; + Data *data; + Data *calc1; + Data *calc2; + Date *limit_d; + Date date; + vector ret_val; + + calc1 = NULL; + calc2 = NULL; + limit_d = NULL; + if (store_data == NULL) { + load(); + } + if (store_data != NULL) { + row_count = store_data->get_data_row_count(); + if (row_count > 0) { + col_count = store_data->get_data_column_count(); + if (col_count > 0) { + for (ii = 0; ii < row_count; ii++) { + data = store_data->get_data(ii); + if (data != NULL) { + if (calc1 == NULL) { + calc1 = data->clone(); + limit_d = data->get_date().clone(); + limit_d->min = 0; + limit_d->sec = 0; + limit_d->inc_seconds(freq_sec); + if (calc2 != NULL) { + delete(calc2); + } + calc2 = NULL; + } + else { + date = data->get_date(); + if (date.before(*limit_d)) { + if (calc2 != NULL) { + delete(calc2); + } + calc2 = data->clone(); + } + else { + if (calc2 == NULL) { + calc2 = calc1->clone(); + } + for (jj = 0; jj < col_count; jj++) { + calc2->value_arr[jj] = calc2->value_arr[jj] - calc1->value_arr[jj]; + } + ret_val.push_back(calc2); + delete(calc1); + calc1 = data->clone(); + calc2 = NULL; // do not delete calc2 as it's stored to array + if (limit_d != NULL) { + delete(limit_d); + } + limit_d = data->get_date().clone(); + limit_d->min = 0; + limit_d->sec = 0; + limit_d->inc_seconds(freq_sec); + } + } + delete(data); + } + } + if (calc1 != NULL) { + delete(calc1); + calc1 = NULL; + } + if (calc2 != NULL) { + delete(calc2); + calc2 = NULL; + } + if (limit_d != NULL) { + delete(limit_d); + } + } + } + } + return ret_val; +} + DataRange *W1Store::get_oldest_and_newest_data() { DataRange *ret_val; ifstream in;