static void update_widget(GtkBuilder *builder, struct w_info *item) { GtkWidget *widget; int val; long long value; widget = GTK_WIDGET(gtk_builder_get_object(builder, item->name)); val = iio_device_debug_attr_read_longlong(dev, item->name, &value); /* check for errors, in case there is a kernel <-> userspace mismatch */ if (val < 0) { printf("%s:%s: error accessing '%s' (%s)\n", __FILE__, __func__, item->name, strerror(-val)); gtk_widget_hide(widget); return; } val = (int) value; switch (item->type) { case CHECKBOX: gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), !!val); break; case BUTTON: if (val) gtk_button_clicked(GTK_BUTTON(widget)); break; case SPINBUTTON: gtk_spin_button_set_value(GTK_SPIN_BUTTON(widget), val); break; case COMBOBOX: gtk_combo_box_set_active(GTK_COMBO_BOX(widget), val); break; } }
static void signal_handler_cb (GtkWidget *widget, gpointer data) { struct w_info *item = data; unsigned val; char str[80]; int bit, ret; long long mask; switch (item->type) { case CHECKBOX: val = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON (widget)); break; case BUTTON: val = 1; break; case SPINBUTTON: case SPINBUTTON_S8: val = (unsigned) gtk_spin_button_get_value(GTK_SPIN_BUTTON (widget)); break; case COMBOBOX: val = gtk_combo_box_get_active(GTK_COMBO_BOX(widget)); break; case CHECKBOX_MASK: /* Format is: adi,gpo-manual-mode-enable-mask#2 * # separates item name from bit number */ val = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON (widget)); ret = sscanf(item->name, "%[^'#']#%d", str, &bit); if (ret != 2) return; iio_device_debug_attr_read_longlong(dev, str, &mask); if (val) { mask |= (1 << bit); } else { mask &= ~(1 << bit); } iio_device_debug_attr_write_longlong(dev, str, mask); if (dev_slave) iio_device_debug_attr_write_longlong(dev_slave, str, mask); return; default: return; } iio_device_debug_attr_write_longlong(dev, item->name, val); if (dev_slave) iio_device_debug_attr_write_longlong(dev_slave, item->name, val); if (!strcmp(item->name, "initialize")) { reload_settings(); } }
int iio_device_debug_attr_read_bool(const struct iio_device *dev, const char *attr, bool *val) { long long value; int ret = iio_device_debug_attr_read_longlong(dev, attr, &value); if (ret < 0) return ret; *val = !!value; return 0; }
int iio_device_reg_read(struct iio_device *dev, uint32_t address, uint32_t *value) { /* NOTE: There is a race condition here. But it is extremely unlikely to * happen, and as this is a debug function, it shouldn't be used for * something else than debug. */ long long val; int ret = iio_device_debug_attr_write_longlong(dev, "direct_reg_access", (long long) address); if (ret < 0) return ret; ret = iio_device_debug_attr_read_longlong(dev, "direct_reg_access", &val); if (!ret) *value = (uint32_t) val; return ret; }