+ if (!cg) {
+ /* No channel group: global options. */
+ switch (key) {
+ case SR_CONF_DEVICE_OPTIONS:
+ *data = g_variant_new_fixed_array(G_VARIANT_TYPE_UINT32,
+ devc->device->devopts, devc->device->num_devopts,
+ sizeof(uint32_t));
+ break;
+ case SR_CONF_OUTPUT_CHANNEL_CONFIG:
+ /* Not used. */
+ i = 0;
+ if (devc->device->features & PPS_INDEPENDENT)
+ s[i++] = "Independent";
+ if (devc->device->features & PPS_SERIES)
+ s[i++] = "Series";
+ if (devc->device->features & PPS_PARALLEL)
+ s[i++] = "Parallel";
+ if (i == 0) {
+ /*
+ * Shouldn't happen: independent-only devices
+ * shouldn't advertise this option at all.
+ */
+ return SR_ERR_NA;
+ }
+ *data = g_variant_new_strv(s, i);
+ break;
+ default:
+ return SR_ERR_NA;
+ }
+ } else {
+ /* Channel group specified. */
+ /*
+ * Per-channel-group options depending on a channel are actually
+ * done with the first channel. Channel groups in PPS can have
+ * more than one channel, but they will typically be of equal
+ * specification for use in series or parallel mode.
+ */
+ ch = cg->channels->data;
+
+ switch (key) {
+ case SR_CONF_DEVICE_OPTIONS:
+ *data = g_variant_new_fixed_array(G_VARIANT_TYPE_UINT32,
+ devc->device->devopts_cg, devc->device->num_devopts_cg,
+ sizeof(uint32_t));
+ break;
+ case SR_CONF_OUTPUT_VOLTAGE_TARGET:
+ ch_spec = &(devc->device->channels[ch->index]);
+ g_variant_builder_init(&gvb, G_VARIANT_TYPE_ARRAY);
+ /* Min, max, write resolution. */
+ for (i = 0; i < 3; i++) {
+ gvar = g_variant_new_double(ch_spec->voltage[i]);
+ g_variant_builder_add_value(&gvb, gvar);
+ }
+ *data = g_variant_builder_end(&gvb);
+ break;
+ case SR_CONF_OUTPUT_CURRENT_LIMIT:
+ g_variant_builder_init(&gvb, G_VARIANT_TYPE_ARRAY);
+ /* Min, max, step. */
+ for (i = 0; i < 3; i++) {
+ ch_spec = &(devc->device->channels[ch->index]);
+ gvar = g_variant_new_double(ch_spec->current[i]);
+ g_variant_builder_add_value(&gvb, gvar);
+ }
+ *data = g_variant_builder_end(&gvb);
+ break;
+ default:
+ return SR_ERR_NA;
+ }