+ if (key == SR_CONF_SCAN_OPTIONS) {
+ *data = g_variant_new_fixed_array(G_VARIANT_TYPE_INT32,
+ scanopts, ARRAY_SIZE(scanopts), sizeof(int32_t));
+ return SR_OK;
+ }
+
+ if (!sdi)
+ return SR_ERR_ARG;
+
+ if (!cg) {
+ switch (key) {
+ case SR_CONF_DEVICE_OPTIONS:
+ *data = g_variant_new_fixed_array(G_VARIANT_TYPE_INT32,
+ devopts, ARRAY_SIZE(devopts), sizeof(int32_t));
+ break;
+ case SR_CONF_SAMPLERATE:
+ g_variant_builder_init(&gvb, G_VARIANT_TYPE("a{sv}"));
+ gvar = g_variant_new_fixed_array(G_VARIANT_TYPE("t"), samplerates,
+ ARRAY_SIZE(samplerates), sizeof(uint64_t));
+ g_variant_builder_add(&gvb, "{sv}", "samplerate-steps", gvar);
+ *data = g_variant_builder_end(&gvb);
+ break;
+ default:
+ return SR_ERR_NA;
+ }
+ } else {
+ ch = cg->channels->data;
+ switch (key) {
+ case SR_CONF_DEVICE_OPTIONS:
+ *data = g_variant_new_fixed_array(G_VARIANT_TYPE_INT32,
+ devopts_cg, ARRAY_SIZE(devopts_cg), sizeof(int32_t));
+ break;
+ case SR_CONF_PATTERN_MODE:
+ if (ch->type == SR_CHANNEL_LOGIC)
+ *data = g_variant_new_strv(logic_pattern_str,
+ ARRAY_SIZE(logic_pattern_str));
+ else if (ch->type == SR_CHANNEL_ANALOG)
+ *data = g_variant_new_strv(analog_pattern_str,
+ ARRAY_SIZE(analog_pattern_str));
+ else
+ return SR_ERR_BUG;
+ break;
+ default:
+ return SR_ERR_NA;
+ }
+ }
+
+ return SR_OK;
+}
+
+static void logic_generator(struct sr_dev_inst *sdi, uint64_t size)
+{
+ struct dev_context *devc;
+ uint64_t i, j;
+ uint8_t pat;
+
+ devc = sdi->priv;
+
+ switch (devc->logic_pattern) {
+ case PATTERN_SIGROK:
+ memset(devc->logic_data, 0x00, size);
+ for (i = 0; i < size; i += devc->logic_unitsize) {
+ for (j = 0; j < devc->logic_unitsize; j++) {
+ pat = pattern_sigrok[(devc->step + j) % sizeof(pattern_sigrok)] >> 1;
+ devc->logic_data[i + j] = ~pat;
+ }
+ devc->step++;