--- /dev/null
+#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)
+