]> pilppa.org Git - lib1wire.git/blobdiff - src/W1Store.cc
add min,max,mean,sum and delta calculations for stored data.
[lib1wire.git] / src / W1Store.cc
index 23adbb02da5b57d9769da7f88c2f7ccd46bd7038..80dde72388e325635b26abfda9455bf19d96ebea 100644 (file)
@@ -9,6 +9,7 @@
 #include <string>
 #include <fstream>
 #include <valarray>
+#include <limits>
 
 #include <time.h>
 #include <dirent.h>
@@ -150,6 +151,51 @@ void W1Store::load() {
        }
 }
 
+Data *W1Store::get_sum() {
+       int     row_count;
+       int     col_count;
+       double  new_val;
+       int     ii;
+       int     jj;
+       Date    *date;
+       Data    *data;
+       Data    *ret_val;
+
+       ret_val = NULL;
+       data    = NULL;
+       if (store_data == NULL) {
+               load();
+       }
+       if (store_data != NULL) {
+               row_count       = store_data->get_data_row_count();
+               log_debug("data row count: %d\n", row_count);
+               if (row_count > 0) {
+                       col_count       = store_data->get_data_column_count();
+                       log_debug("data item count per row: %d\n", col_count);
+                       ret_val         = new Data(col_count);
+                       if (col_count > 0) {
+                               for (ii = 0; ii < row_count - 1; ii++) {
+                                       data    = store_data->get_data(ii);
+                                       for (jj = 0; jj < col_count; jj++) {
+                                               new_val                 = data->value_arr[jj];
+                                               ret_val->value_arr[jj]  = ret_val->value_arr[jj] + new_val;
+                                       }
+                                       if (ii < (row_count - 2)) {
+                                               delete(data);
+                                               data    = NULL;
+                                       }
+                                       //log_debug("new val: %f, sum: %f\n", new_val, sum);
+                               }
+                       }
+                       ret_val->set_date(data->get_date());
+                       if (data != NULL) {
+                               delete(data);
+                       }
+               }
+       }
+       return ret_val;
+}
+
 Data *W1Store::get_delta() {
        int             row_count;
        int             col_count;
@@ -185,13 +231,39 @@ Data *W1Store::get_delta() {
 Data *W1Store::get_mean() {
        int     row_count;
        int     col_count;
-       double  avg;
+       int     ii;
+       Data    *ret_val;
+
+       ret_val = 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();
+                       ret_val         = get_sum();
+                       if (col_count > 0) {
+                               for (ii = 0; ii < col_count; ii++) {
+                                       ret_val->value_arr[ii]  = ret_val->value_arr[ii] / row_count;
+                                       log_debug("avg: %f\n", ret_val->value_arr[ii]);
+                               }
+                       }
+               }
+       }
+       return ret_val;
+}
+
+Data *W1Store::get_max() {
+       int     row_count;
+       int     col_count;
        double  new_val;
        int     ii;
        int     jj;
        Date    *date;
        Data    *data;
        Data    *ret_val;
+       double  min_val;
 
        ret_val = NULL;
        data    = NULL;
@@ -204,23 +276,69 @@ Data *W1Store::get_mean() {
                if (row_count > 0) {
                        col_count       = store_data->get_data_column_count();
                        log_debug("data item count per row: %d\n", col_count);
-                       ret_val         = new Data(col_count);
+                       min_val         = numeric_limits<double>::min();
+                       ret_val         = new Data(col_count, min_val);
                        if (col_count > 0) {
                                for (ii = 0; ii < row_count - 1; ii++) {
                                        data    = store_data->get_data(ii);
                                        for (jj = 0; jj < col_count; jj++) {
-                                               new_val                 = data->value_arr[jj];
-                                               ret_val->value_arr[jj]  = ret_val->value_arr[jj] + new_val;
+                                               new_val = data->value_arr[jj];
+                                               if (new_val > ret_val->value_arr[jj]) {
+                                                       ret_val->value_arr[jj]  = new_val;
+                                               }
                                        }
                                        if (ii < (row_count - 2)) {
                                                delete(data);
                                                data    = NULL;
                                        }
-                                       //log_debug("new val: %f, sum: %f\n", new_val, sum);
                                }
-                               for (ii = 0; ii < col_count; ii++) {
-                                       ret_val->value_arr[ii]  = ret_val->value_arr[ii] / row_count;
-                                       log_debug("avg: %f\n", ret_val->value_arr[ii]);
+                       }
+                       ret_val->set_date(data->get_date());
+                       if (data != NULL) {
+                               delete(data);
+                       }
+               }
+       }
+       return ret_val;
+}
+
+Data *W1Store::get_min() {
+       int     row_count;
+       int     col_count;
+       double  new_val;
+       int     ii;
+       int     jj;
+       Date    *date;
+       Data    *data;
+       Data    *ret_val;
+       double  max_val;
+
+       ret_val = NULL;
+       data    = NULL;
+       if (store_data == NULL) {
+               load();
+       }
+       if (store_data != NULL) {
+               row_count       = store_data->get_data_row_count();
+               log_debug("data row count: %d\n", row_count);
+               if (row_count > 0) {
+                       col_count       = store_data->get_data_column_count();
+                       log_debug("data item count per row: %d\n", col_count);
+                       max_val         = numeric_limits<double>::max();
+                       ret_val         = new Data(col_count, max_val);
+                       if (col_count > 0) {
+                               for (ii = 0; ii < row_count - 1; ii++) {
+                                       data    = store_data->get_data(ii);
+                                       for (jj = 0; jj < col_count; jj++) {
+                                               new_val = data->value_arr[jj];
+                                               if (new_val < ret_val->value_arr[jj]) {
+                                                       ret_val->value_arr[jj]  = new_val;
+                                               }
+                                       }
+                                       if (ii < (row_count - 2)) {
+                                               delete(data);
+                                               data    = NULL;
+                                       }
                                }
                        }
                        ret_val->set_date(data->get_date());