X-Git-Url: https://sigrok.org/gitweb/?p=libsigrok.git;a=blobdiff_plain;f=src%2Fhardware%2Fbaylibre-acme%2Fapi.c;h=ebaf3e5a674a07db20b3b0dac2ece3ee5bf15237;hp=49cf96aed5c3ae66f72233966de57c9610540b6a;hb=HEAD;hpb=1f8f5bc08e0f684156baac513431b40d79ab4ea1 diff --git a/src/hardware/baylibre-acme/api.c b/src/hardware/baylibre-acme/api.c index 49cf96ae..ebaf3e5a 100644 --- a/src/hardware/baylibre-acme/api.c +++ b/src/hardware/baylibre-acme/api.c @@ -22,7 +22,10 @@ #include #include -SR_PRIV struct sr_dev_driver baylibre_acme_driver_info; +static const uint32_t drvopts[] = { + SR_CONF_THERMOMETER, + SR_CONF_POWERMETER, +}; static const uint32_t devopts[] = { SR_CONF_CONTINUOUS, @@ -53,25 +56,15 @@ static const uint64_t samplerates[] = { SR_HZ(1), }; -static int init(struct sr_dev_driver *di, struct sr_context *sr_ctx) -{ - return std_init(di, sr_ctx, LOG_PREFIX); -} - static GSList *scan(struct sr_dev_driver *di, GSList *options) { - struct drv_context *drvc; struct dev_context *devc; struct sr_dev_inst *sdi; - GSList *devices; gboolean status; int i; (void)options; - drvc = di->context; - devices = NULL; - devc = g_malloc0(sizeof(struct dev_context)); devc->samplerate = SR_HZ(10); @@ -79,7 +72,6 @@ static GSList *scan(struct sr_dev_driver *di, GSList *options) sdi->status = SR_ST_INACTIVE; sdi->vendor = g_strdup("BayLibre"); sdi->model = g_strdup("ACME"); - sdi->driver = di; sdi->priv = devc; status = bl_acme_is_sane(); @@ -130,10 +122,7 @@ static GSList *scan(struct sr_dev_driver *di, GSList *options) if (!sdi->channel_groups) goto err_out; - devices = g_slist_append(devices, sdi); - drvc->instances = g_slist_append(drvc->instances, sdi); - - return devices; + return std_scan_complete(di, g_slist_append(NULL, sdi)); err_out: g_free(devc); @@ -142,27 +131,8 @@ err_out: return NULL; } -static int dev_open(struct sr_dev_inst *sdi) -{ - (void)sdi; - - sdi->status = SR_ST_ACTIVE; - - return SR_OK; -} - -static int dev_close(struct sr_dev_inst *sdi) -{ - (void)sdi; - - sdi->status = SR_ST_INACTIVE; - - return SR_OK; -} - static int config_get(uint32_t key, GVariant **data, - const struct sr_dev_inst *sdi, - const struct sr_channel_group *cg) + const struct sr_dev_inst *sdi, const struct sr_channel_group *cg) { struct dev_context *devc; int ret; @@ -172,11 +142,11 @@ static int config_get(uint32_t key, GVariant **data, devc = sdi->priv; ret = SR_OK; + switch (key) { case SR_CONF_LIMIT_SAMPLES: case SR_CONF_LIMIT_MSEC: - ret = sr_sw_limits_config_get(&devc->limits, key, data); - break; + return sr_sw_limits_config_get(&devc->limits, key, data); case SR_CONF_SAMPLERATE: *data = g_variant_new_uint64(devc->samplerate); break; @@ -202,30 +172,22 @@ static int config_get(uint32_t key, GVariant **data, } static int config_set(uint32_t key, GVariant *data, - const struct sr_dev_inst *sdi, - const struct sr_channel_group *cg) + const struct sr_dev_inst *sdi, const struct sr_channel_group *cg) { struct dev_context *devc; uint64_t samplerate; - int ret; - - if (sdi->status != SR_ST_ACTIVE) - return SR_ERR_DEV_CLOSED; devc = sdi->priv; - ret = SR_OK; switch (key) { case SR_CONF_LIMIT_SAMPLES: case SR_CONF_LIMIT_MSEC: - ret = sr_sw_limits_config_set(&devc->limits, key, data); - break; + return sr_sw_limits_config_set(&devc->limits, key, data); case SR_CONF_SAMPLERATE: samplerate = g_variant_get_uint64(data); if (samplerate > MAX_SAMPLE_RATE) { sr_err("Maximum sample rate is %d", MAX_SAMPLE_RATE); - ret = SR_ERR_SAMPLERATE; - break; + return SR_ERR_SAMPLERATE; } devc->samplerate = samplerate; bl_acme_maybe_set_update_interval(sdi, samplerate); @@ -233,46 +195,30 @@ static int config_set(uint32_t key, GVariant *data, case SR_CONF_PROBE_FACTOR: if (!cg) return SR_ERR_CHANNEL_GROUP; - ret = bl_acme_set_shunt(cg, g_variant_get_uint64(data)); - break; + return bl_acme_set_shunt(cg, g_variant_get_uint64(data)); case SR_CONF_POWER_OFF: if (!cg) return SR_ERR_CHANNEL_GROUP; - ret = bl_acme_set_power_off(cg, g_variant_get_boolean(data)); - break; + return bl_acme_set_power_off(cg, g_variant_get_boolean(data)); default: - ret = SR_ERR_NA; + return SR_ERR_NA; } - return ret; + return SR_OK; } static int config_list(uint32_t key, GVariant **data, - const struct sr_dev_inst *sdi, - const struct sr_channel_group *cg) + const struct sr_dev_inst *sdi, const struct sr_channel_group *cg) { uint32_t devopts_cg[MAX_DEVOPTS_CG]; - GVariant *gvar; - GVariantBuilder gvb; - int ret, num_devopts_cg = 0; - - (void)sdi; - (void)cg; + int num_devopts_cg = 0; - ret = SR_OK; if (!cg) { switch (key) { case SR_CONF_DEVICE_OPTIONS: - *data = g_variant_new_fixed_array(G_VARIANT_TYPE_UINT32, - devopts, ARRAY_SIZE(devopts), sizeof(uint32_t)); - break; + return STD_CONFIG_LIST(key, data, sdi, cg, NO_OPTS, drvopts, devopts); 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); + *data = std_gvar_samplerates_steps(ARRAY_AND_SIZE(samplerates)); break; default: return SR_ERR_NA; @@ -285,15 +231,14 @@ static int config_list(uint32_t key, GVariant **data, if (bl_acme_probe_has_pws(cg)) devopts_cg[num_devopts_cg++] = HAS_POWER_OFF; - *data = g_variant_new_fixed_array(G_VARIANT_TYPE_UINT32, - devopts_cg, num_devopts_cg, sizeof(uint32_t)); + *data = std_gvar_array_u32(devopts_cg, num_devopts_cg); break; default: return SR_ERR_NA; } } - return ret; + return SR_OK; } static void dev_acquisition_close(const struct sr_dev_inst *sdi) @@ -332,9 +277,6 @@ static int dev_acquisition_start(const struct sr_dev_inst *sdi) .it_value = { 0, 0 } }; - if (sdi->status != SR_ST_ACTIVE) - return SR_ERR_DEV_CLOSED; - if (dev_acquisition_open(sdi)) return SR_ERR; @@ -364,7 +306,7 @@ static int dev_acquisition_start(const struct sr_dev_inst *sdi) sr_session_source_add_channel(sdi->session, devc->channel, G_IO_IN | G_IO_ERR, 1000, bl_acme_receive_data, (void *)sdi); - std_session_send_df_header(sdi, LOG_PREFIX); + std_session_send_df_header(sdi); sr_sw_limits_acquisition_start(&devc->limits); return SR_OK; @@ -376,16 +318,13 @@ static int dev_acquisition_stop(struct sr_dev_inst *sdi) devc = sdi->priv; - if (sdi->status != SR_ST_ACTIVE) - return SR_ERR_DEV_CLOSED; - dev_acquisition_close(sdi); sr_session_source_remove_channel(sdi->session, devc->channel); g_io_channel_shutdown(devc->channel, FALSE, NULL); g_io_channel_unref(devc->channel); devc->channel = NULL; - std_session_send_df_end(sdi, LOG_PREFIX); + std_session_send_df_end(sdi); if (devc->samples_missed > 0) sr_warn("%" PRIu64 " samples missed", devc->samples_missed); @@ -393,20 +332,22 @@ static int dev_acquisition_stop(struct sr_dev_inst *sdi) return SR_OK; } -SR_PRIV struct sr_dev_driver baylibre_acme_driver_info = { +static struct sr_dev_driver baylibre_acme_driver_info = { .name = "baylibre-acme", .longname = "BayLibre ACME (Another Cute Measurement Equipment)", .api_version = 1, - .init = init, + .init = std_init, .cleanup = std_cleanup, .scan = scan, .dev_list = std_dev_list, + .dev_clear = std_dev_clear, .config_get = config_get, .config_set = config_set, .config_list = config_list, - .dev_open = dev_open, - .dev_close = dev_close, + .dev_open = std_dummy_dev_open, + .dev_close = std_dummy_dev_close, .dev_acquisition_start = dev_acquisition_start, .dev_acquisition_stop = dev_acquisition_stop, .context = NULL, }; +SR_REGISTER_DEV_DRIVER(baylibre_acme_driver_info);