Ejemplo n.º 1
0
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);
	}
}
Ejemplo n.º 2
0
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);
}
Ejemplo n.º 3
0
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);
}
Ejemplo n.º 4
0
ev_t ev_time(int s) {
	return EV_CODE(7, 0) - 8.0f * float_log(s) / float_log(2);
}
Ejemplo n.º 5
0
iso_t iso_prev(iso_t iso) {
	iso = EV_CODE(EV_VAL(iso) - 1, 0);

	return MAX(iso, ISO_MIN);
}
Ejemplo n.º 6
0
iso_t iso_next(iso_t iso) {
	iso = EV_CODE(EV_VAL(iso) + 1, 0);

	return MIN(iso, ISO_MAX);
}