- ret = SR_ERR_ARG;
- break;
- case SR_CONF_TRIGGER_SOURCE:
- tmp_str = g_variant_get_string(data, NULL);
- for (i = 0; trigger_sources[i]; i++) {
- if (!strcmp(tmp_str, trigger_sources[i])) {
- devc->triggersource = g_strdup(tmp_str);
- break;
- }
- }
- if (trigger_sources[i] == 0)
- ret = SR_ERR_ARG;
- break;
- case SR_CONF_FILTER:
- tmp_str = g_variant_get_string(data, NULL);
- devc->filter_ch1 = devc->filter_ch2 = devc->filter_trigger = 0;
- targets = g_strsplit(tmp_str, ",", 0);
- for (i = 0; targets[i]; i++) {
- if (targets[i] == '\0')
- /* Empty filter string can be used to clear them all. */
- ;
- else if (!strcmp(targets[i], "CH1"))
- devc->filter_ch1 = TRUE;
- else if (!strcmp(targets[i], "CH2"))
- devc->filter_ch2 = TRUE;
- else if (!strcmp(targets[i], "TRIGGER"))
- devc->filter_trigger = TRUE;
- else {
- sr_err("Invalid filter target %s.", targets[i]);
- ret = SR_ERR_ARG;
- }
- }
- g_strfreev(targets);
- break;
- case SR_CONF_VDIV:
- /* TODO: Not supporting vdiv per channel yet. */
- g_variant_get(data, "(tt)", &p, &q);
- tmp_int = -1;
- for (i = 0; i < ARRAY_SIZE(vdivs); i++) {
- if (vdivs[i][0] == p && vdivs[i][1] == q) {
- tmp_int = i;
- break;
- }
- }
- if (tmp_int >= 0) {
- devc->voltage_ch1 = tmp_int;
- devc->voltage_ch2 = tmp_int;
- } else
- ret = SR_ERR_ARG;
- break;
- case SR_CONF_COUPLING:
- tmp_str = g_variant_get_string(data, NULL);
- /* TODO: Not supporting coupling per channel yet. */
- for (i = 0; coupling[i]; i++) {
- if (!strcmp(tmp_str, coupling[i])) {
- devc->coupling_ch1 = i;
- devc->coupling_ch2 = i;
- break;
- }
+ return SR_ERR_ARG;
+ switch (key) {
+ case SR_CONF_FILTER:
+ devc->filter[ch_idx] = g_variant_get_boolean(data);
+ break;
+ case SR_CONF_VDIV:
+ if ((idx = std_u64_tuple_idx(data, ARRAY_AND_SIZE(vdivs))) < 0)
+ return SR_ERR_ARG;
+ devc->voltage[ch_idx] = idx;
+ break;
+ case SR_CONF_COUPLING:
+ if ((idx = std_str_idx(data, ARRAY_AND_SIZE(coupling))) < 0)
+ return SR_ERR_ARG;
+ devc->coupling[ch_idx] = idx;
+ break;
+ default:
+ return SR_ERR_NA;