- unsigned char newzone;
-
- if (!ambient_zone_set)
- ambient_val = adcval << 4;
- else // running sum
- ambient_val += adcval - (ambient_val >> 4);
-
- newzone = 0;
- while (newzone < N_AMBIENT_ZONES-1
- && ambient_zones[newzone] < ambient_val)
- newzone++;
-
- // TODO: implement hysteresis?
- if (!ambient_zone_set || newzone != ambient_zone) {
- ambient_zone = newzone;
- ambient_zone_set = 1;
- // ambient_zone_changed();
+ unsigned char old_zone = ambient_zone;
+ unsigned char byte_val, byte_val16;
+
+ ambient_val += adcval - (ambient_val
+ >> (AMBIENT_VAL_SHIFT - AMBIENT_ADC_SHIFT));
+
+ while (ambient_zones[ambient_zone].lo > ambient_val)
+ ambient_zone--;
+
+ while (ambient_zones[ambient_zone].hi < ambient_val)
+ ambient_zone++;
+
+ byte_val = ambient_val >> (2 + AMBIENT_VAL_SHIFT - AMBIENT_ADC_SHIFT);
+
+ ambient_val16 += byte_val - (ambient_val16 >> 4);
+ byte_val16 = ambient_val16 >> 4;
+
+ if (byte_val16 > byte_val) {
+ byte_val16 -= byte_val;
+ if (byte_val16 > ambient_16drop)
+ ambient_16drop = byte_val16;
+ }
+
+ if (ambient_min > byte_val)
+ ambient_min = byte_val;
+
+ if (ambient_max < byte_val)
+ ambient_max = byte_val;
+#if 0
+ if (old_zone != ambient_zone) {
+ log_byte(0xab);
+ log_byte(ambient_zone);
+ log_word(adcval);
+ log_flush();