spejsiot-sonoff_pow/soft/src/impuls_counter.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;
}
}