#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)