Merge from kseries.
[bertos.git] / mware / mean.h
diff --git a/mware/mean.h b/mware/mean.h
new file mode 100644 (file)
index 0000000..893241e
--- /dev/null
@@ -0,0 +1,41 @@
+#warning revise me!
+
+
+/**
+ *  DECLARE_SMEAN(temperature, uint8_t, uint16_t);
+ *  for (i = 0; i < TEMP_MEANS; ++i)
+ *    SMEAN_ADD(temperature, adc_get(), TEMP_MEANS);
+ *  printf("mean temperature = %d\n", SMEAN_GET(temperature));
+ */
+
+/**
+ * Instantiate a mean instance
+ */
+#define DECLARE_SMEAN(name, Type, SumType) \
+       struct { \
+               SumType sum; \
+               Type result; \
+               int count; \
+       } name = { 0, 0, 0 }
+
+/**
+ * Insert a new sample into the mean.
+ *
+ * \note \a mean and \a max_samples are evaluated multiple times
+ */
+#define SMEAN_ADD(mean, sample, max_samples) \
+       do { \
+               (mean).sum += (sample); \
+               if ((mean).count++ >= (max_samples)) \
+               { \
+                       (mean).result = (mean).sum / (max_samples); \
+                       (mean).sum = 0; \
+                       (mean).count = 0; \
+               } \
+       } while (0)
+
+/**
+ * Return current mean value.
+ */
+#define SMEAN_GET(mean)  ((mean).result)
+