- switch (key) {
- case SR_CONF_SCAN_OPTIONS:
- *data = g_variant_new_fixed_array(G_VARIANT_TYPE_UINT32,
- scanopts, ARRAY_SIZE(scanopts), sizeof(uint32_t));
- break;
- case SR_CONF_DEVICE_OPTIONS:
- *data = g_variant_new_fixed_array(G_VARIANT_TYPE_UINT32,
- devopts, G_N_ELEMENTS(devopts), sizeof(uint32_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, G_N_ELEMENTS(samplerates),
- sizeof(uint64_t));
- g_variant_builder_add(&gvb, "{sv}", "samplerates", gvar);
- *data = g_variant_builder_end(&gvb);
- break;
- case SR_CONF_TRIGGER_MATCH:
- *data = g_variant_new_fixed_array(G_VARIANT_TYPE_INT32,
- trigger_matches, ARRAY_SIZE(trigger_matches),
- sizeof(int32_t));
- break;
- case SR_CONF_TRIGGER_SOURCE:
- *data = g_variant_new_strv(trigger_source_names,
- G_N_ELEMENTS(trigger_source_names));
- break;
- case SR_CONF_TRIGGER_SLOPE:
- case SR_CONF_CLOCK_EDGE:
- *data = g_variant_new_strv(signal_edge_names,
- G_N_ELEMENTS(signal_edge_names));
- break;
- default:
- return SR_ERR_NA;
+ idx = match->channel->index;
+ trg = match->match;
+
+ if (idx < 0 || idx >= devc->model->num_channels) {
+ sr_err("Channel index %d out of range.", idx);
+ return SR_ERR_BUG; /* Should not happen. */
+ }
+ if (trg != SR_TRIGGER_ZERO
+ && trg != SR_TRIGGER_ONE
+ && trg != SR_TRIGGER_RISING
+ && trg != SR_TRIGGER_FALLING) {
+ sr_err("Unsupported trigger match for CH%d.", idx + 1);
+ return SR_ERR_ARG;
+ }
+ level_bit = (trg == SR_TRIGGER_ONE
+ || trg == SR_TRIGGER_RISING) ? 1 : 0;
+ type_bit = (trg == SR_TRIGGER_RISING
+ || trg == SR_TRIGGER_FALLING) ? 1 : 0;
+
+ trigger_mask |= UINT64_C(1) << idx;
+ trigger_values |= level_bit << idx;
+ trigger_edge_mask |= type_bit << idx;