aboutsummaryrefslogtreecommitdiffstats
path: root/src/adccmds.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/adccmds.c')
-rw-r--r--src/adccmds.c15
1 files changed, 12 insertions, 3 deletions
diff --git a/src/adccmds.c b/src/adccmds.c
index 41247a54..09db9b9d 100644
--- a/src/adccmds.c
+++ b/src/adccmds.c
@@ -15,6 +15,7 @@ struct analog_in {
uint32_t rest_time, sample_time, next_begin_time;
uint16_t value, min_value, max_value;
struct gpio_adc pin;
+ uint8_t invalid_count, range_check_count;
uint8_t state, sample_count;
};
@@ -42,8 +43,15 @@ analog_in_event(struct timer *timer)
a->timer.waketime += a->sample_time;
return SF_RESCHEDULE;
}
- if (a->value < a->min_value || a->value > a->max_value)
- try_shutdown("ADC out of range");
+ if (likely(a->value >= a->min_value && a->value <= a->max_value)) {
+ a->invalid_count = 0;
+ } else {
+ a->invalid_count++;
+ if (a->invalid_count >= a->range_check_count) {
+ try_shutdown("ADC out of range");
+ a->invalid_count = 0;
+ }
+ }
sched_wake_task(&analog_wake);
a->next_begin_time += a->rest_time;
a->timer.waketime = a->next_begin_time;
@@ -75,13 +83,14 @@ command_query_analog_in(uint32_t *args)
a->rest_time = args[4];
a->min_value = args[5];
a->max_value = args[6];
+ a->range_check_count = args[7];
if (! a->sample_count)
return;
sched_add_timer(&a->timer);
}
DECL_COMMAND(command_query_analog_in,
"query_analog_in oid=%c clock=%u sample_ticks=%u sample_count=%c"
- " rest_ticks=%u min_value=%hu max_value=%hu");
+ " rest_ticks=%u min_value=%hu max_value=%hu range_check_count=%c");
void
analog_in_task(void)