X-Git-Url: https://sigrok.org/gitweb/?a=blobdiff_plain;f=device.c;h=c0df1ecc4b4ee48e7f6bd641ab6b4f107e5761eb;hb=e0df15d43600737fe225f5c68dbdbcf84d5fa326;hp=87031a9afe5a8326f7e8bc9f3cf33bac520c60f4;hpb=3544f848e0d7f67af8e11ce7ec344b34cd797df3;p=libsigrok.git diff --git a/device.c b/device.c index 87031a9a..c0df1ecc 100644 --- a/device.c +++ b/device.c @@ -116,7 +116,9 @@ SR_API int sr_dev_probe_name_set(const struct sr_dev_inst *sdi, * @param probenum The probe number, starting from 0. * @param state TRUE to enable the probe, FALSE to disable. * - * @return SR_OK on success, or SR_ERR_ARG on invalid arguments. + * @return SR_OK on success or SR_ERR on failure. In case of invalid + * arguments, SR_ERR_ARG is returned and the probe enabled state + * remains unchanged. * * @since 0.2.0 */ @@ -126,6 +128,7 @@ SR_API int sr_dev_probe_enable(const struct sr_dev_inst *sdi, int probenum, GSList *l; struct sr_probe *probe; int ret; + gboolean was_enabled; if (!sdi) return SR_ERR_ARG; @@ -134,8 +137,17 @@ SR_API int sr_dev_probe_enable(const struct sr_dev_inst *sdi, int probenum, for (l = sdi->probes; l; l = l->next) { probe = l->data; if (probe->index == probenum) { + was_enabled = probe->enabled; probe->enabled = state; ret = SR_OK; + if (!state != !was_enabled && sdi->driver + && sdi->driver->config_probe_set) { + ret = sdi->driver->config_probe_set( + sdi, probe, SR_PROBE_SET_ENABLED); + /* Roll back change if it wasn't applicable. */ + if (ret == SR_ERR_ARG) + probe->enabled = was_enabled; + } break; } } @@ -153,7 +165,9 @@ SR_API int sr_dev_probe_enable(const struct sr_dev_inst *sdi, int probenum, * @param[in] probenum Number of probe, starting at 0. * @param[in] trigger Trigger string, in the format used by sigrok-cli * - * @return SR_OK on success, or SR_ERR_ARG on invalid arguments. + * @return SR_OK on success or SR_ERR on failure. In case of invalid + * arguments, SR_ERR_ARG is returned and the trigger settings + * remain unchanged. * * @since 0.2.0 */ @@ -162,6 +176,7 @@ SR_API int sr_dev_trigger_set(const struct sr_dev_inst *sdi, int probenum, { GSList *l; struct sr_probe *probe; + char *old_trigger; int ret; if (!sdi) @@ -171,10 +186,24 @@ SR_API int sr_dev_trigger_set(const struct sr_dev_inst *sdi, int probenum, for (l = sdi->probes; l; l = l->next) { probe = l->data; if (probe->index == probenum) { - /* If the probe already has a trigger, kill it first. */ - g_free(probe->trigger); - probe->trigger = g_strdup(trigger); + old_trigger = probe->trigger; ret = SR_OK; + if (g_strcmp0(trigger, old_trigger) == 0) + break; + /* Set new trigger if it has changed. */ + probe->trigger = g_strdup(trigger); + + if (sdi->driver && sdi->driver->config_probe_set) { + ret = sdi->driver->config_probe_set( + sdi, probe, SR_PROBE_SET_TRIGGER); + /* Roll back change if it wasn't applicable. */ + if (ret == SR_ERR_ARG) { + g_free(probe->trigger); + probe->trigger = old_trigger; + break; + } + } + g_free(old_trigger); break; } } @@ -210,7 +239,7 @@ SR_API gboolean sr_dev_has_option(const struct sr_dev_inst *sdi, int key) return FALSE; if (sdi->driver->config_list(SR_CONF_DEVICE_OPTIONS, - &gvar, NULL, NULL) != SR_OK) + &gvar, sdi, NULL) != SR_OK) return FALSE; ret = FALSE; @@ -380,6 +409,7 @@ SR_PRIV void sr_serial_dev_inst_free(struct sr_serial_dev_inst *serial) } #endif +/** @private */ SR_PRIV struct sr_usbtmc_dev_inst *sr_usbtmc_dev_inst_new(const char *device) { struct sr_usbtmc_dev_inst *usbtmc; @@ -400,6 +430,7 @@ SR_PRIV struct sr_usbtmc_dev_inst *sr_usbtmc_dev_inst_new(const char *device) return usbtmc; } +/** @private */ SR_PRIV void sr_usbtmc_dev_inst_free(struct sr_usbtmc_dev_inst *usbtmc) { g_free(usbtmc->device);