Merge branch 'master' of ssh://git.gag.com/scm/git/fw/altos
[fw/altos] / ao-tools / lib / cc-analyse.c
index 6fd36cdc9007bd50b3e6311c8b52fefc1306de22..0e020115affe54ca6017bb010785808ee21bce0c 100644 (file)
  */
 
 #include "cc.h"
+#include <math.h>
 
 int
 cc_timedata_min(struct cc_timedata *d, double min_time, double max_time)
 {
        int     i;
        int     set = 0;
-       int     min_i;
+       int     min_i = -1;
        double  min;
 
        if (d->num == 0)
-               return 0;
+               return -1;
        for (i = 0; i < d->num; i++)
                if (min_time <= d->data[i].time && d->data[i].time <= max_time)
                        if (!set || d->data[i].value < min) {
@@ -42,11 +43,11 @@ cc_timedata_max(struct cc_timedata *d, double min_time, double max_time)
 {
        int     i;
        double  max;
-       int     max_i;
+       int     max_i = -1;
        int     set = 0;
 
        if (d->num == 0)
-               return 0;
+               return -1;
        for (i = 0; i < d->num; i++)
                if (min_time <= d->data[i].time && d->data[i].time <= max_time)
                        if (!set || d->data[i].value > max) {
@@ -56,3 +57,59 @@ cc_timedata_max(struct cc_timedata *d, double min_time, double max_time)
                        }
        return max_i;
 }
+
+int
+cc_perioddata_min(struct cc_perioddata *d, double min_time, double max_time)
+{
+       int     start, stop;
+       int     i;
+       double  min;
+       int     min_i;
+
+       if (d->num == 0)
+               return -1;
+       start = (int) ceil((min_time - d->start) / d->step);
+       if (start < 0)
+               start = 0;
+       stop = (int) floor((max_time - d->start) / d->step);
+       if (stop >= d->num)
+               stop = d->num - 1;
+       if (stop < start)
+               return -1;
+       min = d->data[start];
+       min_i = start;
+       for (i = start + 1; i <= stop; i++)
+               if (d->data[i] < min) {
+                       min = d->data[i];
+                       min_i = i;
+               }
+       return min_i;
+}
+
+int
+cc_perioddata_max(struct cc_perioddata *d, double min_time, double max_time)
+{
+       int     start, stop;
+       int     i;
+       double  max;
+       int     max_i;
+
+       if (d->num == 0)
+               return -1;
+       start = (int) ceil((min_time - d->start) / d->step);
+       if (start < 0)
+               start = 0;
+       stop = (int) floor((max_time - d->start) / d->step);
+       if (stop >= d->num)
+               stop = d->num - 1;
+       if (stop < start)
+               return -1;
+       max = d->data[start];
+       max_i = start;
+       for (i = start + 1; i <= stop; i++)
+               if (fabs(d->data[i]) > max) {
+                       max = fabs(d->data[i]);
+                       max_i = i;
+               }
+       return max_i;
+}