static void rx_phase_rotation_update() { struct iio_channel *out[4]; gdouble val[4]; int i, d = 0; out[0] = iio_device_find_channel(cap, "voltage0", false); out[1] = iio_device_find_channel(cap, "voltage1", false); if (is_2rx_2tx) { out[2] = iio_device_find_channel(cap, "voltage2", false); out[3] = iio_device_find_channel(cap, "voltage3", false); d = 2; } for (i = 0; i <= d; i += 2) { iio_channel_attr_read_double(out[i], "calibscale", &val[0]); iio_channel_attr_read_double(out[i], "calibphase", &val[1]); iio_channel_attr_read_double(out[i + 1], "calibscale", &val[2]); iio_channel_attr_read_double(out[i + 1], "calibphase", &val[3]); val[0] = acos(val[0]) * 360.0 / (2.0 * M_PI); val[1] = asin(-1.0 * val[1]) * 360.0 / (2.0 * M_PI); val[2] = acos(val[2]) * 360.0 / (2.0 * M_PI); val[3] = asin(val[3]) * 360.0 / (2.0 * M_PI); if (val[1] < 0.0) val[0] *= -1.0; if (val[3] < 0.0) val[2] *= -1.0; if (val[1] < -90.0) val[0] = (val[0] * -1.0) - 180.0; if (val[3] < -90.0) val[0] = (val[0] * -1.0) - 180.0; if (fabs(val[0]) > 90.0) { if (val[1] < 0.0) val[1] = (val[1] * -1.0) - 180.0; else val[1] = 180 - val[1]; } if (fabs(val[2]) > 90.0) { if (val[3] < 0.0) val[3] = (val[3] * -1.0) - 180.0; else val[3] = 180 - val[3]; } if (round(val[0]) != round(val[1]) && round(val[0]) != round(val[2]) && round(val[0]) != round(val[3])) { printf("error calculating phase rotations\n"); val[0] = 0.0; } else val[0] = (val[0] + val[1] + val[2] + val[3]) / 4.0; gtk_spin_button_set_value(GTK_SPIN_BUTTON(rx_phase_rotation[i/2]), val[0]); } }
static double read_double_attr(const struct iio_channel *chn, const char *name) { double val; int ret = iio_channel_attr_read_double(chn, name, &val); return ret < 0 ? -1.0 : val; }