void autoiso() { ev_t limit; ec_t ec = EC_ZERO; ev_t ev = EV_ZERO; iso_t newiso; switch (DPData.ae) { case AE_MODE_M: if (DPData.tv_val != TV_VAL_BULB) { // M mode: set ISO to match exposure ec = - (status.measured_ec - persist.ev_comp); // Normalize an apply new ISO if (ec != EC_ZERO) { if (settings.autoiso_relaxed) ec = (ec - 1) / 3; newiso = DPData.iso + ec; newiso = CLAMP(newiso, settings.autoiso_miniso, settings.autoiso_maxiso); newiso = EV_ROUND(newiso); send_to_intercom(IC_SET_ISO, newiso); } } return; case AE_MODE_P: case AE_MODE_AV: // P / Av mode: raise ISO if shutter time is lower than limit ev = status.measured_tv; limit = settings.autoiso_mintv; break; case AE_MODE_TV: // Tv mode: raise ISO if apperture is larger than lens' max plus offset ev = status.measured_av; limit = DPData.avo + settings.autoiso_maxav; break; default: return; } // Decide whether we need to change current ISO if (ev != EC_ZERO) { if (ev < limit) ec = (limit - ev) + EV_CODE(1, 0); else if (ev >= limit + EV_CODE(1, 0)) ec = (limit - ev); } // Normalize an apply new ISO if (ec != EC_ZERO) { newiso = DPData.iso + ec; newiso = CLAMP(newiso, settings.autoiso_miniso, settings.autoiso_maxiso); newiso = EV_TRUNC(newiso); send_to_intercom(IC_SET_ISO, newiso); } }
iso_t iso_roll(iso_t iso) { int step = (1 << settings.digital_iso_step); int mask = 0x100 - step; iso = iso & mask; iso = EV_CODE(EV_VAL(iso), (EV_SUB(iso) + step) % 8); return MIN(iso, ISO_EXT); }
void viewfinder_change_evc(ec_t ev_comp) { persist.ev_comp = CLAMP(ev_comp, EV_CODE(-2, 0), EV_CODE(2,0)); enqueue_action(persist_write); }
ev_t ev_time(int s) { return EV_CODE(7, 0) - 8.0f * float_log(s) / float_log(2); }
iso_t iso_prev(iso_t iso) { iso = EV_CODE(EV_VAL(iso) - 1, 0); return MAX(iso, ISO_MIN); }
iso_t iso_next(iso_t iso) { iso = EV_CODE(EV_VAL(iso) + 1, 0); return MIN(iso, ISO_MAX); }