parent
2f352b653f
commit
9984962b98
@ -0,0 +1,28 @@ |
||||
#include <stdlib.h> |
||||
#include <stdio.h> |
||||
#include <stdint.h> |
||||
#include <stdbool.h> |
||||
|
||||
#include "matcher.h" |
||||
|
||||
|
||||
/** Handle incoming char. Returns true if this char completed the match. */ |
||||
bool matcher_test(matcher_t * m, uint8_t b) |
||||
{ |
||||
// If mismatch, rewind (and check at 0)
|
||||
if (m->pattern[m->cursor] != b) { |
||||
m->cursor = 0; |
||||
} |
||||
|
||||
// Check for match
|
||||
if (m->pattern[m->cursor] == b) { |
||||
// Good char
|
||||
m->cursor++; |
||||
if (m->pattern[m->cursor] == 0) { // end of pattern
|
||||
m->cursor = 0; // rewind
|
||||
return true; // indicate success
|
||||
} |
||||
} |
||||
|
||||
return false; |
||||
} |
@ -0,0 +1,21 @@ |
||||
#pragma once |
||||
|
||||
#include <stdint.h> |
||||
#include <stdbool.h> |
||||
#include <stdlib.h> |
||||
|
||||
typedef struct { |
||||
const char *pattern; |
||||
size_t cursor; |
||||
} matcher_t; |
||||
|
||||
|
||||
/**
|
||||
* Consume an incoming character. |
||||
* If this char was the last char of the pattern, returns true and rewinds. |
||||
* |
||||
* If the char is not in the pattern, resets match state. |
||||
* |
||||
* @returns true if the char concluded the expected pattern. |
||||
*/ |
||||
bool matcher_test(matcher_t * mb, uint8_t b); |
@ -0,0 +1,48 @@ |
||||
#include <stdint.h> |
||||
#include <malloc.h> |
||||
|
||||
#include "meanbuf.h" |
||||
|
||||
|
||||
/** Init a buffer */ |
||||
void meanbuf_init(meanbuf_t *mb, size_t size) |
||||
{ |
||||
if (size < 1) size = 1; |
||||
|
||||
mb->buf = calloc(size, sizeof(float)); // calloc, so it starts with zeros.
|
||||
mb->cap = size; |
||||
mb->nw = 0; |
||||
mb->mean = 0; |
||||
|
||||
// clean buffer
|
||||
for (uint16_t i = 0; i < size; i++) { |
||||
mb->buf[i] = 0; |
||||
} |
||||
} |
||||
|
||||
|
||||
void meanbuf_deinit(meanbuf_t *mb) |
||||
{ |
||||
if (mb->buf != NULL) { |
||||
free(mb->buf); |
||||
} |
||||
} |
||||
|
||||
|
||||
/** Add a value to the buffer. Returns current mean. */ |
||||
float meanbuf_add(meanbuf_t *mb, float f) |
||||
{ |
||||
// add sample
|
||||
mb->buf[mb->nw++] = f; |
||||
if (mb->nw == mb->cap) mb->nw = 0; |
||||
|
||||
// calculate average
|
||||
float acc = 0; |
||||
for (size_t i = 0; i < mb->cap; i++) { |
||||
acc += mb->buf[i]; |
||||
} |
||||
|
||||
acc /= mb->cap; |
||||
|
||||
return mb->mean = acc; |
||||
} |
@ -0,0 +1,21 @@ |
||||
#pragma once |
||||
#include <stdlib.h> |
||||
#include <stdint.h> |
||||
|
||||
|
||||
typedef struct { |
||||
float * buf; // buffer (allocated at init)
|
||||
size_t cap; // capacity
|
||||
size_t nw; // next write index
|
||||
float mean; // updated on write
|
||||
} meanbuf_t; |
||||
|
||||
|
||||
/** Init a buffer */ |
||||
void meanbuf_init(meanbuf_t *mb, size_t size); |
||||
|
||||
/** Deinit a buffer (free buffer array) */ |
||||
void meanbuf_deinit(meanbuf_t *mb); |
||||
|
||||
/** Add a value to the buffer. Returns current mean. */ |
||||
float meanbuf_add(meanbuf_t *mb, float f); |
Loading…
Reference in new issue