static double tune_trx_phase_offset(struct iio_device *ldev, int *ret, long long cal_freq, long long cal_tone, double sign, double abort, void (*tune)(struct iio_device *, gdouble)) { int i; double offset, mag; double phase = 0.0, increment; for (i = 0; i < 10; i++) { get_markers(&offset, &mag); get_markers(&offset, &mag); increment = calc_phase_offset(cal_freq, cal_tone, offset, mag); increment *= sign; phase += increment; phase = scale_phase_0_360(phase); tune(ldev, phase); DBG("Step: %i increment %f Phase: %f\n", i, increment, phase); if (fabs(offset) < 0.001) break; } if (fabs(offset) > 0.1) *ret = -EFAULT; else *ret = 0; return phase * sign; }
static double tune_trx_phase_offset(struct iio_device *ldev, int *ret, long long cal_freq, long long cal_tone, double sign, double abort, void (*tune)(struct iio_device *, gdouble)) { long long y, y1, y2, delta = LLONG_MAX, min_delta = LLONG_MAX, x1; int i, offset, pos = 0, neg = 0; double min_phase, phase = 0.0, step = 1.0; for (i = 0; i < 30; i++) { get_markers(&offset, &y, &y1, &y2, &x1); get_markers(&offset, &y, &y1, &y2, &x1); if (i == 0) { phase = calc_phase_offset(cal_freq, cal_tone, offset, y); tune(ldev, phase * sign); continue; } if (offset != 0) { phase += (360.0 / ((cal_freq / cal_tone) / offset) / 2); tune(ldev, phase * sign); continue; } delta = abs(y1) - abs(y2); if (delta < min_delta) { min_delta = delta; min_phase = phase; } if (x1 > 0) { if (pos == 1) { step /= 2; pos = 0; } phase -= step; neg = 1; } else { if (neg == 1) { step /= 2; neg = 0; } phase += step; pos = 1; } if (step < abort) break; DBG("Step: %f Phase: %f, min_Phase: %f\ndelta %d, pdelta %d, min_delta %d\n", step, phase, min_phase, (int)delta, (int)min_delta); tune(ldev, phase * sign); } if (offset) *ret = -EFAULT; else *ret = 0; return phase * sign; }