X-Git-Url: https://codewiz.org/gitweb?a=blobdiff_plain;f=mware%2Fmean.h;fp=mware%2Fmean.h;h=893241e29d892dee4c5a7978c36bb7e09296dfb3;hb=f1afe0bce11f8d2a5b739fdfb5e1a02d3dcd7d0a;hp=0000000000000000000000000000000000000000;hpb=95653ebdc7081ad0c989e971fe4cab9bc8d1f945;p=bertos.git diff --git a/mware/mean.h b/mware/mean.h new file mode 100644 index 00000000..893241e2 --- /dev/null +++ b/mware/mean.h @@ -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) +