X-Git-Url: https://sigrok.org/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2Fhardware%2Fhameg-hmo%2Fapi.c;h=00d57c5ef3a8d103877b11a041a9189b9dc469ba;hb=e06875b2ce47e128922d63f09ca4e9b3d8105722;hp=4b50b7aa6edb7a37dffaea3bdcac019de899def5;hpb=709468baf7626b162b5559c101516289d9bbb258;p=libsigrok.git diff --git a/src/hardware/hameg-hmo/api.c b/src/hardware/hameg-hmo/api.c index 4b50b7aa..00d57c5e 100644 --- a/src/hardware/hameg-hmo/api.c +++ b/src/hardware/hameg-hmo/api.c @@ -24,7 +24,7 @@ #define SERIALCOMM "115200/8n1/flow=1" -SR_PRIV struct sr_dev_driver hameg_hmo_driver_info; +static struct sr_dev_driver hameg_hmo_driver_info; static const char *manufacturers[] = { "HAMEG", @@ -487,7 +487,8 @@ static int config_list(uint32_t key, GVariant **data, const struct sr_dev_inst * struct dev_context *devc = NULL; const struct scope_config *model = NULL; - if (sdi && (devc = sdi->priv)) { + if (sdi) { + devc = sdi->priv; if ((cg_type = check_channel_group(devc, cg)) == CG_INVALID) return SR_ERR; @@ -567,6 +568,11 @@ SR_PRIV int hmo_request_data(const struct sr_dev_inst *sdi) case SR_CHANNEL_ANALOG: g_snprintf(command, sizeof(command), (*model->scpi_dialect)[SCPI_CMD_GET_ANALOG_DATA], +#ifdef WORDS_BIGENDIAN + "MSBF", +#else + "LSBF", +#endif ch->index + 1); break; case SR_CHANNEL_LOGIC: @@ -700,55 +706,88 @@ static int hmo_setup_channels(const struct sr_dev_inst *sdi) static int dev_acquisition_start(const struct sr_dev_inst *sdi) { GSList *l; - gboolean digital_added; + gboolean digital_added[MAX_DIGITAL_GROUP_COUNT]; + size_t group, pod_count; struct sr_channel *ch; struct dev_context *devc; struct sr_scpi_dev_inst *scpi; + int ret; if (sdi->status != SR_ST_ACTIVE) return SR_ERR_DEV_CLOSED; scpi = sdi->conn; devc = sdi->priv; - digital_added = FALSE; + /* Preset empty results. */ + for (group = 0; group < ARRAY_SIZE(digital_added); group++) + digital_added[group] = FALSE; g_slist_free(devc->enabled_channels); devc->enabled_channels = NULL; + /* + * Contruct the list of enabled channels. Determine the highest + * number of digital pods involved in the acquisition. + */ + pod_count = 0; for (l = sdi->channels; l; l = l->next) { ch = l->data; if (!ch->enabled) continue; - /* Only add a single digital channel. */ - if (ch->type != SR_CHANNEL_LOGIC || !digital_added) { + /* Only add a single digital channel per group (pod). */ + group = ch->index / 8; + if (ch->type != SR_CHANNEL_LOGIC || !digital_added[group]) { devc->enabled_channels = g_slist_append( devc->enabled_channels, ch); - if (ch->type == SR_CHANNEL_LOGIC) - digital_added = TRUE; + if (ch->type == SR_CHANNEL_LOGIC) { + digital_added[group] = TRUE; + if (pod_count < group + 1) + pod_count = group + 1; + } } } - if (!devc->enabled_channels) return SR_ERR; + devc->pod_count = pod_count; + devc->logic_data = NULL; + /* + * Check constraints. Some channels can be either analog or + * digital, but not both at the same time. + */ if (hmo_check_channels(devc->enabled_channels) != SR_OK) { sr_err("Invalid channel configuration specified!"); - return SR_ERR_NA; + ret = SR_ERR_NA; + goto free_enabled; } + /* + * Configure the analog and digital channels and the + * corresponding digital pods. + */ if (hmo_setup_channels(sdi) != SR_OK) { sr_err("Failed to setup channel configuration!"); - return SR_ERR; + ret = SR_ERR; + goto free_enabled; } + /* + * Start acquisition on the first enabled channel. The + * receive routine will continue driving the acquisition. + */ sr_scpi_source_add(sdi->session, scpi, G_IO_IN, 50, hmo_receive_data, (void *)sdi); - std_session_send_df_header(sdi, LOG_PREFIX); + std_session_send_df_header(sdi); devc->current_channel = devc->enabled_channels; return hmo_request_data(sdi); + +free_enabled: + g_slist_free(devc->enabled_channels); + devc->enabled_channels = NULL; + return ret; } static int dev_acquisition_stop(struct sr_dev_inst *sdi) @@ -756,7 +795,7 @@ static int dev_acquisition_stop(struct sr_dev_inst *sdi) struct dev_context *devc; struct sr_scpi_dev_inst *scpi; - std_session_send_df_end(sdi, LOG_PREFIX); + std_session_send_df_end(sdi); if (sdi->status != SR_ST_ACTIVE) return SR_ERR_DEV_CLOSED; @@ -772,7 +811,7 @@ static int dev_acquisition_stop(struct sr_dev_inst *sdi) return SR_OK; } -SR_PRIV struct sr_dev_driver hameg_hmo_driver_info = { +static struct sr_dev_driver hameg_hmo_driver_info = { .name = "hameg-hmo", .longname = "Hameg HMO", .api_version = 1, @@ -790,3 +829,4 @@ SR_PRIV struct sr_dev_driver hameg_hmo_driver_info = { .dev_acquisition_stop = dev_acquisition_stop, .context = NULL, }; +SR_REGISTER_DEV_DRIVER(hameg_hmo_driver_info);