X-Git-Url: https://sigrok.org/gitweb/?a=blobdiff_plain;f=src%2Fdevice.c;h=6fcad410f2bc3802f979f7bb2f9687b755861940;hb=56c8dd821e7d8ab3602e5fd001f56d91d7b42df3;hp=6eff16d16573e45c78f0e836a168ff72ff15d31f;hpb=093e1cba6b7bf14cfb77fa36f59b0c16e6fca7cc;p=libsigrok.git diff --git a/src/device.c b/src/device.c index 6eff16d1..6fcad410 100644 --- a/src/device.c +++ b/src/device.c @@ -529,27 +529,40 @@ SR_API GSList *sr_dev_list(const struct sr_dev_driver *driver) */ SR_API int sr_dev_clear(const struct sr_dev_driver *driver) { - int ret; - if (!driver) { sr_err("Invalid driver."); return SR_ERR_ARG; } - if (driver->dev_clear) - ret = driver->dev_clear(driver); - else - ret = std_dev_clear(driver, NULL); + if (!driver->context) { + /* + * Driver was never initialized, nothing to do. + * + * No log message since this usually gets called for all + * drivers, whether they were initialized or not. + */ + return SR_OK; + } - return ret; + /* No log message here, too verbose and not very useful. */ + + return driver->dev_clear(driver); } /** - * Open the specified device. + * Open the specified device instance. + * + * If the device instance is already open (sdi->status == SR_ST_ACTIVE), + * SR_ERR will be returned and no re-opening of the device will be attempted. + * + * If opening was successful, sdi->status is set to SR_ST_ACTIVE, otherwise + * it will be left unchanged. * * @param sdi Device instance to use. Must not be NULL. * - * @return SR_OK upon success, a negative error code upon errors. + * @retval SR_OK Success. + * @retval SR_ERR_ARG Invalid arguments. + * @retval SR_ERR Device instance was already active, or other error. * * @since 0.2.0 */ @@ -558,28 +571,47 @@ SR_API int sr_dev_open(struct sr_dev_inst *sdi) int ret; if (!sdi || !sdi->driver || !sdi->driver->dev_open) + return SR_ERR_ARG; + + if (sdi->status == SR_ST_ACTIVE) { + sr_err("%s: Device instance already active, can't re-open.", + sdi->driver->name); return SR_ERR; + } + + sr_dbg("%s: Opening device instance.", sdi->driver->name); ret = sdi->driver->dev_open(sdi); + if (ret == SR_OK) + sdi->status = SR_ST_ACTIVE; + return ret; } /** - * Close the specified device. + * Close the specified device instance. + * + * If the device instance is not open (sdi->status != SR_ST_ACTIVE), + * SR_ERR_DEV_CLOSED will be returned and no closing will be attempted. + * + * Note: sdi->status will be set to SR_ST_INACTIVE, regardless of whether + * there are any errors during closing of the device instance (any errors + * will be reported via error code and log message, though). * * @param sdi Device instance to use. Must not be NULL. * - * @return SR_OK upon success, a negative error code upon errors. + * @retval SR_OK Success. + * @retval SR_ERR_ARG Invalid arguments. + * @retval SR_ERR_DEV_CLOSED Device instance was not active. + * @retval SR_ERR Other error. * * @since 0.2.0 */ SR_API int sr_dev_close(struct sr_dev_inst *sdi) { - int ret; - if (!sdi || !sdi->driver || !sdi->driver->dev_close) - return SR_ERR; + return SR_ERR_ARG; if (sdi->status != SR_ST_ACTIVE) { sr_err("%s: Device instance not active, can't close.", @@ -587,11 +619,11 @@ SR_API int sr_dev_close(struct sr_dev_inst *sdi) return SR_ERR_DEV_CLOSED; } - sr_dbg("%s: Closing device.", sdi->driver->name) + sdi->status = SR_ST_INACTIVE; - ret = sdi->driver->dev_close(sdi); + sr_dbg("%s: Closing device instance.", sdi->driver->name); - return ret; + return sdi->driver->dev_close(sdi); } /**