X-Git-Url: https://www.fi.muni.cz/~kas/git//home/kas/public_html/git/?a=blobdiff_plain;f=firmware%2Ffirmware.c;h=5400714f48b10645dc196673493eb88d7a321871;hb=0bbaad8dc171999d4aeabae9b5b222364f066388;hp=bbba9874c0231bf0467e01c249495dc264e52b9d;hpb=2f5956f3e324eb12fa3c20f0f4383a1e745bbe78;p=openparking.git diff --git a/firmware/firmware.c b/firmware/firmware.c index bbba987..5400714 100644 --- a/firmware/firmware.c +++ b/firmware/firmware.c @@ -5,8 +5,9 @@ #include "clock.h" #include "modbus.h" -#define ECHO_TIMEOUT (CLOCK_HZ/10) // 10 ms -#define MEASUREMENT_WAIT (CLOCK_HZ/3) // three triggers per second +#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 @@ -23,6 +24,7 @@ #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) { @@ -70,10 +72,33 @@ static void do_measurement(unsigned char 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 } } }