52 lines
1.3 KiB
C
52 lines
1.3 KiB
C
#include <impuls_counter.h>
|
|
|
|
void impuls_counter_init ( struct impuls_counter *f, uint32_t cycle_len ) {
|
|
f->input_initialized = false;
|
|
f->input_state = false;
|
|
|
|
f->counter = 0;
|
|
f->samples = 0;
|
|
f->cycle_len = cycle_len;
|
|
|
|
f->new_measurement = false;
|
|
f->measurement.samples = 0;
|
|
f->measurement.changes = 0;
|
|
}
|
|
|
|
void IRAM_ATTR impuls_counter_update ( struct impuls_counter *f, bool input ) {
|
|
if ( f->input_initialized == false ) {
|
|
// ignore first input value
|
|
f->input_state = input;
|
|
f->input_initialized = true;
|
|
}
|
|
|
|
bool changed = false;
|
|
f->samples += 1;
|
|
if ( f->input_state != input) {
|
|
changed = true;
|
|
f->counter += 1;
|
|
f->input_state = input;
|
|
}
|
|
|
|
if ( f->samples >= f->cycle_len && (changed || f->counter == 0 \
|
|
|| f->samples >= 2 * f->cycle_len)) {
|
|
/* cycle complete */
|
|
f->measurement.changes = f->counter;
|
|
f->measurement.samples = f->samples;
|
|
f->new_measurement = true;
|
|
f->samples = 0;
|
|
f->counter = 0;
|
|
}
|
|
}
|
|
|
|
bool impuls_counter_get_measurement( struct impuls_counter *f,
|
|
struct impuls_measurement *measurement) {
|
|
if ( f->new_measurement == true ) {
|
|
*measurement = f->measurement;
|
|
f->new_measurement = false;
|
|
return true;
|
|
} else {
|
|
return false;
|
|
}
|
|
}
|