#include "clock.h"
#include "modbus.h"
-#define ECHO_TIMEOUT (CLOCK_HZ/20) // 50 ms
-#define MEASUREMENT_WAIT (4*ECHO_TIMEOUT)
+#define ECHO_TIMEOUT (CLOCK_HZ/10) // 100 ms
+#define MEASUREMENT_WAIT (2*ECHO_TIMEOUT)
+#define MEASUREMENT_SHIFT 0 // running avg (1 << M_SHIFT)
#define N_TRIGGERS 3
#define N_SENSORS 12
#define distances (hold_regs+MB_N_HOLD_REGS_EEPROM+1)
#define free_bitmap (hold_regs[MB_N_HOLD_REGS_EEPROM+13])
#define err_bitmap (hold_regs[MB_N_HOLD_REGS_EEPROM+14])
+#define max_distances (hold_regs+MB_N_HOLD_REGS_EEPROM+21)
static void pull_trigger(uint8_t trig)
{
to_start &= ~mask;
to_measure |= mask;
} else if ((to_measure & mask) && !(bits & mask)) {
+#if MEASUREMENT_SHIFT > 0
+ uint16_t old_d;
+#endif
+ uint16_t new_d;
+ uint8_t idx = trig*N_TRIG_SENSORS+i;
// echo end
to_measure &= ~mask;
- distances[trig*N_TRIG_SENSORS + i]
- = now - starttimes[i];
+ new_d = now - starttimes[i];
+ if (new_d > max_distances[idx])
+ max_distances[idx] = new_d;
+
+#if MEASUREMENT_SHIFT > 0
+ old_d = distances[idx];
+
+ if (old_d == 0
+ || old_d == -1) {
+ distances[idx] = new_d;
+ } else {
+ distances[idx] = (
+ (old_d << MEASUREMENT_SHIFT)
+ + new_d
+ - old_d
+ ) >> MEASUREMENT_SHIFT;
+ }
+#else
+ distances[idx] = new_d;
+#endif
}
}
}