]> www.fi.muni.cz Git - openparking.git/blobdiff - firmware/firmware.c
Infinite reads handling
[openparking.git] / firmware / firmware.c
index 3554dcc768e38e6deda7bdd7fe5fb8459e52a2c2..7fbcdf18601b65f661edfb46b9cced58d937a72a 100644 (file)
 #define thresholds     (hold_regs+1)
 #define led1_sensors   (hold_regs[13])
 #define led2_sensors   (hold_regs[14])
+#define long_as_free   (hold_regs[15])
+#define long_thr       (hold_regs[16])
 
 #define led_bitmap     (hold_regs[MB_N_HOLD_REGS_EEPROM])
 #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 long_bitmap    (hold_regs[MB_N_HOLD_REGS_EEPROM+15])
 #define max_distances  (hold_regs+MB_N_HOLD_REGS_EEPROM+21)
 #define err_counts     (hold_regs+MB_N_HOLD_REGS_EEPROM+41)
 
@@ -126,7 +129,8 @@ static void do_measurement(unsigned char trig)
                        }
                        /*
                         * If the echo pulse is too long, do not treat it
-                        * as error, just count it as maximum length.
+                        * as error, just count it as maximum length
+                        * and notify the state in the bitmap.
                         */
                        distances[off] = now - starttimes[i];
                }
@@ -195,7 +199,7 @@ static void leds_update()
 
 static void eval_bitmaps()
 {
-       uint16_t free_b = 0, err_b = 0, mask;
+       uint16_t free_b = 0, err_b = 0, long_b = 0, mask;
        uint8_t i;
 
        for (i = 0; i < N_SENSORS; i++) {
@@ -205,13 +209,21 @@ static void eval_bitmaps()
                        if (distances[i] == -1) {
                                err_b |= mask;
                        } else if (distances[i] > thresholds[i]) {
-                               free_b |= mask;
+                               if (long_thr && distances[i] > long_thr) {
+                                       long_b |= mask;
+                                       if (long_as_free & mask) {
+                                               free_b |= mask;
+                                       }
+                               } else {
+                                       free_b |= mask;
+                               }
                        }
                }
        }
 
        free_bitmap = free_b;
        err_bitmap  = err_b;
+       long_bitmap = long_b;
 
        if (led1_sensors) {
                if (led1_sensors & err_bitmap) {