From: bernie Date: Wed, 13 Aug 2008 09:45:31 +0000 (+0000) Subject: Move algorithms from mware/ to algo/ X-Git-Tag: 2.0.0~307 X-Git-Url: https://codewiz.org/gitweb?a=commitdiff_plain;h=3ce6434919d7607917e366a7b69fcbfb918d534b;hp=e5174304054e26cd8f3cd1f9980871c20c07fc46;p=bertos.git Move algorithms from mware/ to algo/ git-svn-id: https://src.develer.com/svnoss/bertos/trunk@1627 38d2e660-2303-0410-9eaa-f027e97ec537 --- diff --git a/bertos/algo/mean.h b/bertos/algo/mean.h new file mode 100644 index 00000000..893241e2 --- /dev/null +++ b/bertos/algo/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) + diff --git a/bertos/algo/rle.c b/bertos/algo/rle.c new file mode 100644 index 00000000..66701e94 --- /dev/null +++ b/bertos/algo/rle.c @@ -0,0 +1,151 @@ +/** + * \file + * + * + * \brief General-purpose run-length {en,de}coding algorithm (implementation) + * + * Original source code from http://www.compuphase.com/compress.htm + * + * \version $Id$ + * \author Bernie Innocenti + */ + +#include "rle.h" + + +/** + * Run-length encode \a len bytes from the \a input buffer + * to the \a output buffer. + */ +int rle(unsigned char *output, const unsigned char *input, int len) +{ + int count, index, i; + unsigned char first; + unsigned char *out; + + + out = output; + count = 0; + while (count < len) + { + index = count; + first = input[index++]; + + /* Scan for bytes identical to the first one */ + while ((index < len) && (index - count < 127) && (input[index] == first)) + index++; + + if (index - count == 1) + { + /* Failed to "replicate" the current byte. See how many to copy. + */ + while ((index < len) && (index - count < 127)) + { + /* Avoid a replicate run of only 2-bytes after a literal run. + * There is no gain in this, and there is a risc of loss if the + * run after the two identical bytes is another literal run. + * So search for 3 identical bytes. + */ + if ((input[index] == input[index - 1]) && + ((index > 1) && (input[index] == input[index - 2]))) + { + /* Reset the index so we can back up these three identical + * bytes in the next run. + */ + index -= 2; + break; + } + + index++; + } + + /* Output a run of uncompressed bytes: write length and values */ + *out++ = (unsigned char)(count - index); + for (i = count; i < index; i++) + *out++ = input[i]; + } + else + { + /* Output a compressed run: write length and value */ + *out++ = (unsigned char)(index - count); + *out++ = first; + } + + count = index; + } + + /* Output EOF marker */ + *out++ = 0; + + return (out - output); +} + + +/** + * Run-length decode from the \a input buffer to the \a output + * buffer. + * + * \note The output buffer must be large enough to accomodate + * all decoded output. + */ +int unrle(unsigned char *output, const unsigned char *input) +{ + signed char count; + unsigned char *out; + unsigned char value; + + + out = output; + + for (;;) + { + count = (signed char)*input++; + if (count > 0) + { + /* replicate run */ + value = *input++; + while (count--) + *out++ = value; + } + else if (count < 0) + { + /* literal run */ + while (count++) + *out++ = *input++; + } + else + /* EOF */ + break; + } + + return (out - output); +} diff --git a/bertos/algo/rle.h b/bertos/algo/rle.h new file mode 100644 index 00000000..6e056d22 --- /dev/null +++ b/bertos/algo/rle.h @@ -0,0 +1,45 @@ +/** + * \file + * + * + * \version $Id$ + * \author Bernie Innocenti + * + * \brief General-purpose run-length {en,de}coding algorithm (interface) + */ +#ifndef RLE_H +#define RLE_H + +int rle(unsigned char *output, const unsigned char *input, int length); +int unrle(unsigned char *output, const unsigned char *input); + +#endif /* RLE_H */ diff --git a/bertos/mware/hex.c b/bertos/mware/hex.c index dd326c43..4b22f1ef 100644 --- a/bertos/mware/hex.c +++ b/bertos/mware/hex.c @@ -27,13 +27,11 @@ * the GNU General Public License. * * Copyright 2005 Develer S.r.l. (http://www.develer.com/) - * * --> * * \brief Poor man's hex arrays (implementation). * * \version $Id$ - * * \author Bernie Innocenti */ diff --git a/bertos/mware/rle.c b/bertos/mware/rle.c deleted file mode 100644 index 66701e94..00000000 --- a/bertos/mware/rle.c +++ /dev/null @@ -1,151 +0,0 @@ -/** - * \file - * - * - * \brief General-purpose run-length {en,de}coding algorithm (implementation) - * - * Original source code from http://www.compuphase.com/compress.htm - * - * \version $Id$ - * \author Bernie Innocenti - */ - -#include "rle.h" - - -/** - * Run-length encode \a len bytes from the \a input buffer - * to the \a output buffer. - */ -int rle(unsigned char *output, const unsigned char *input, int len) -{ - int count, index, i; - unsigned char first; - unsigned char *out; - - - out = output; - count = 0; - while (count < len) - { - index = count; - first = input[index++]; - - /* Scan for bytes identical to the first one */ - while ((index < len) && (index - count < 127) && (input[index] == first)) - index++; - - if (index - count == 1) - { - /* Failed to "replicate" the current byte. See how many to copy. - */ - while ((index < len) && (index - count < 127)) - { - /* Avoid a replicate run of only 2-bytes after a literal run. - * There is no gain in this, and there is a risc of loss if the - * run after the two identical bytes is another literal run. - * So search for 3 identical bytes. - */ - if ((input[index] == input[index - 1]) && - ((index > 1) && (input[index] == input[index - 2]))) - { - /* Reset the index so we can back up these three identical - * bytes in the next run. - */ - index -= 2; - break; - } - - index++; - } - - /* Output a run of uncompressed bytes: write length and values */ - *out++ = (unsigned char)(count - index); - for (i = count; i < index; i++) - *out++ = input[i]; - } - else - { - /* Output a compressed run: write length and value */ - *out++ = (unsigned char)(index - count); - *out++ = first; - } - - count = index; - } - - /* Output EOF marker */ - *out++ = 0; - - return (out - output); -} - - -/** - * Run-length decode from the \a input buffer to the \a output - * buffer. - * - * \note The output buffer must be large enough to accomodate - * all decoded output. - */ -int unrle(unsigned char *output, const unsigned char *input) -{ - signed char count; - unsigned char *out; - unsigned char value; - - - out = output; - - for (;;) - { - count = (signed char)*input++; - if (count > 0) - { - /* replicate run */ - value = *input++; - while (count--) - *out++ = value; - } - else if (count < 0) - { - /* literal run */ - while (count++) - *out++ = *input++; - } - else - /* EOF */ - break; - } - - return (out - output); -} diff --git a/bertos/mware/rle.h b/bertos/mware/rle.h index 6e056d22..0ca9a28d 100644 --- a/bertos/mware/rle.h +++ b/bertos/mware/rle.h @@ -1,45 +1,2 @@ -/** - * \file - * - * - * \version $Id$ - * \author Bernie Innocenti - * - * \brief General-purpose run-length {en,de}coding algorithm (interface) - */ -#ifndef RLE_H -#define RLE_H - -int rle(unsigned char *output, const unsigned char *input, int length); -int unrle(unsigned char *output, const unsigned char *input); - -#endif /* RLE_H */ +#warning This header is OBSOLETE +#include