+ unsigned char new_zone, user_zone, new_shadow = 0;
+ unsigned char byte_fast, byte_slow, drop;
+ uint16_t fast_10bit, slow_10bit;
+
+ // running avg - shorter timespan
+ ambient_fast += adcval - (ambient_fast >> AMBIENT_FAST_SHIFT);
+
+ // running avg - longer timespan
+ fast_10bit = ambient_fast >> (AMBIENT_FAST_SHIFT + AMBIENT_ADC_SHIFT);
+ ambient_slow += fast_10bit - (ambient_slow >> AMBIENT_SLOW_SHIFT);
+
+ // ambient zones are governed by shorter timespan by default
+ new_zone = val_to_zone(fast_10bit);
+
+ slow_10bit = ambient_slow >> AMBIENT_SLOW_SHIFT;
+
+ if ((new_zone > ambient_zone)
+ || (new_zone > 1 && new_zone == ambient_zone - 1)) {
+ // but change to the neighbouring zone is governed by _slow,
+ // except to the darkest zone, where we want fast reaction.
+ new_zone = val_to_zone(slow_10bit);
+ }