From 0c9ed6a110149013fd3690338fac0b33f760e0ed Mon Sep 17 00:00:00 2001 From: "Jan \"Yenya\" Kasprzak" Date: Sat, 23 May 2015 17:28:06 +0200 Subject: [PATCH] Maximum distance is not an error Try to handle the too-distant object gracefully - treat them as if the pulse ended at the ECHO_TIMEOUT time. Now -1 means error (the echo pulse has not started), while too long value is simply recorded as maximum value. --- firmware/firmware.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/firmware/firmware.c b/firmware/firmware.c index 5400714..8e97351 100644 --- a/firmware/firmware.c +++ b/firmware/firmware.c @@ -49,6 +49,7 @@ static void do_measurement(unsigned char trig) uint16_t starttimes[N_TRIG_SENSORS], starttime; uint8_t to_start = (1 << N_TRIG_SENSORS) - 1; uint8_t to_measure = 0, i; + uint16_t now; pull_trigger(trig); @@ -56,7 +57,7 @@ static void do_measurement(unsigned char trig) while (to_start || to_measure) { uint8_t bits = 0; - uint16_t now = get_clock(); + now = get_clock(); if (now-starttime >= ECHO_TIMEOUT) break; @@ -107,7 +108,12 @@ static void do_measurement(unsigned char trig) if (to_start & (1 << i)) distances[trig*N_TRIG_SENSORS + i] = -1; else if (to_measure & (1 << i)) - distances[trig*N_TRIG_SENSORS + i] = 0; + /* + * If the echo pulse is too long, do not treat it + * as error, just count it as maximum length. + */ + distances[trig*N_TRIG_SENSORS + i] + = now - starttimes[i]; } static void led_set(uint8_t led, uint8_t state) @@ -179,7 +185,7 @@ static void eval_bitmaps() mask = 1 << i; if (thresholds[i]) { - if (distances[i] == -1 || distances[i] == 0) { + if (distances[i] == -1) { err_b |= mask; } else if (distances[i] > thresholds[i]) { free_b |= mask; -- 2.43.5