diff --git a/src/hardware/gwinstek-gds-800/protocol.c b/src/hardware/gwinstek-gds-800/protocol.c index 962bfe05..ce9e8d41 100644 --- a/src/hardware/gwinstek-gds-800/protocol.c +++ b/src/hardware/gwinstek-gds-800/protocol.c @@ -158,55 +158,55 @@ SR_PRIV int gwinstek_gds_800_receive_data(int fd, int revents, void *cb_data) } break; case WAIT_FOR_TRANSFER_OF_BEGIN_TRANSMISSION_COMPLETE: - if (read_data(sdi, scpi, devc, 1) == SR_OK) { - if (devc->rcv_buffer[0] == '#') - devc->state = WAIT_FOR_TRANSFER_OF_DATA_SIZE_DIGIT_COMPLETE; - } + if (read_data(sdi, scpi, devc, 1) < 0) + break; + if (devc->rcv_buffer[0] == '#') + devc->state = WAIT_FOR_TRANSFER_OF_DATA_SIZE_DIGIT_COMPLETE; break; case WAIT_FOR_TRANSFER_OF_DATA_SIZE_DIGIT_COMPLETE: - if (read_data(sdi, scpi, devc, 1) == SR_OK) { - if (devc->rcv_buffer[0] != '4' && - devc->rcv_buffer[0] != '5' && - devc->rcv_buffer[0] != '6') { - sr_err("Data size digits is not 4, 5 or 6 but " - "'%c'.", devc->rcv_buffer[0]); - sr_dev_acquisition_stop(sdi); - return TRUE; - } else { - devc->data_size_digits = devc->rcv_buffer[0] - '0'; - devc->state = WAIT_FOR_TRANSFER_OF_DATA_SIZE_COMPLETE; - } + if (read_data(sdi, scpi, devc, 1) < 0) + break; + if (devc->rcv_buffer[0] != '4' && + devc->rcv_buffer[0] != '5' && + devc->rcv_buffer[0] != '6') { + sr_err("Data size digits is not 4, 5 or 6 but " + "'%c'.", devc->rcv_buffer[0]); + sr_dev_acquisition_stop(sdi); + return TRUE; + } else { + devc->data_size_digits = devc->rcv_buffer[0] - '0'; + devc->state = WAIT_FOR_TRANSFER_OF_DATA_SIZE_COMPLETE; } break; case WAIT_FOR_TRANSFER_OF_DATA_SIZE_COMPLETE: - if (read_data(sdi, scpi, devc, devc->data_size_digits) == SR_OK) { - devc->rcv_buffer[devc->data_size_digits] = 0; - if (sr_atoi(devc->rcv_buffer, &devc->data_size) != SR_OK) { - sr_err("Could not parse data size '%s'", devc->rcv_buffer); - sr_dev_acquisition_stop(sdi); - return TRUE; - } else - devc->state = WAIT_FOR_TRANSFER_OF_SAMPLE_RATE_COMPLETE; - } + if (read_data(sdi, scpi, devc, devc->data_size_digits) < 0) + break; + devc->rcv_buffer[devc->data_size_digits] = 0; + if (sr_atoi(devc->rcv_buffer, &devc->data_size) != SR_OK) { + sr_err("Could not parse data size '%s'", devc->rcv_buffer); + sr_dev_acquisition_stop(sdi); + return TRUE; + } else + devc->state = WAIT_FOR_TRANSFER_OF_SAMPLE_RATE_COMPLETE; break; case WAIT_FOR_TRANSFER_OF_SAMPLE_RATE_COMPLETE: - if (read_data(sdi, scpi, devc, sizeof(float)) == SR_OK) { - /* - * Contrary to the documentation, this field is - * transfered with most significant byte first! - */ - sample_rate = RB32(devc->rcv_buffer); - memcpy(&devc->sample_rate, &sample_rate, sizeof(float)); - devc->state = WAIT_FOR_TRANSFER_OF_CHANNEL_INDICATOR_COMPLETE; + if (read_data(sdi, scpi, devc, sizeof(float)) < 0) + break; + /* + * Contrary to the documentation, this field is + * transfered with most significant byte first! + */ + sample_rate = RB32(devc->rcv_buffer); + memcpy(&devc->sample_rate, &sample_rate, sizeof(float)); + devc->state = WAIT_FOR_TRANSFER_OF_CHANNEL_INDICATOR_COMPLETE; - if (!devc->df_started) { - std_session_send_df_header(sdi); + if (!devc->df_started) { + std_session_send_df_header(sdi); - packet.type = SR_DF_FRAME_BEGIN; - sr_session_send(sdi, &packet); + packet.type = SR_DF_FRAME_BEGIN; + sr_session_send(sdi, &packet); - devc->df_started = TRUE; - } + devc->df_started = TRUE; } break; case WAIT_FOR_TRANSFER_OF_CHANNEL_INDICATOR_COMPLETE: @@ -218,72 +218,73 @@ SR_PRIV int gwinstek_gds_800_receive_data(int fd, int revents, void *cb_data) devc->state = WAIT_FOR_TRANSFER_OF_CHANNEL_DATA_COMPLETE; break; case WAIT_FOR_TRANSFER_OF_CHANNEL_DATA_COMPLETE: - if (read_data(sdi, scpi, devc, devc->data_size - 8) == SR_OK) { - /* Fetch data needed for conversion from device. */ - snprintf(command, sizeof(command), ":CHAN%d:SCAL?", - devc->cur_acq_channel + 1); - if (sr_scpi_get_string(scpi, command, &response) != SR_OK) { - sr_err("Failed to get volts per division."); + if (read_data(sdi, scpi, devc, devc->data_size - 8) < 0) + break; + + /* Fetch data needed for conversion from device. */ + snprintf(command, sizeof(command), ":CHAN%d:SCAL?", + devc->cur_acq_channel + 1); + if (sr_scpi_get_string(scpi, command, &response) != SR_OK) { + sr_err("Failed to get volts per division."); + sr_dev_acquisition_stop(sdi); + return TRUE; + } + volts_per_division = g_ascii_strtod(response, &end_ptr); + if (!strcmp(end_ptr, "mV")) + volts_per_division *= 1.e-3; + g_free(response); + + num_samples = (devc->data_size - 8) / 2; + sr_spew("Received %d number of samples from channel " + "%d.", num_samples, devc->cur_acq_channel + 1); + + float vbit = volts_per_division * VERTICAL_DIVISIONS / 256.0; + float vbitlog = log10f(vbit); + int digits = -(int)vbitlog + (vbitlog < 0.0); + + /* Convert data. */ + for (i = 0; i < num_samples; i++) + samples[i] = ((float) ((int16_t) (RB16(&devc->rcv_buffer[i*2])))) * vbit; + + /* Fill frame. */ + sr_analog_init(&analog, &encoding, &meaning, &spec, digits); + analog.meaning->channels = g_slist_append(NULL, g_slist_nth_data(sdi->channels, devc->cur_acq_channel)); + analog.num_samples = num_samples; + analog.data = samples; + analog.meaning->mq = SR_MQ_VOLTAGE; + analog.meaning->unit = SR_UNIT_VOLT; + analog.meaning->mqflags = 0; + packet.type = SR_DF_ANALOG; + packet.payload = &analog; + sr_session_send(sdi, &packet); + g_slist_free(analog.meaning->channels); + + /* All channels acquired. */ + if (devc->cur_acq_channel == ANALOG_CHANNELS - 1) { + sr_spew("All channels acquired."); + + if (devc->cur_acq_frame == devc->frame_limit - 1) { + /* All frames acquired. */ + sr_spew("All frames acquired."); sr_dev_acquisition_stop(sdi); return TRUE; - } - volts_per_division = g_ascii_strtod(response, &end_ptr); - if (!strcmp(end_ptr, "mV")) - volts_per_division *= 1.e-3; - g_free(response); - - num_samples = (devc->data_size - 8) / 2; - sr_spew("Received %d number of samples from channel " - "%d.", num_samples, devc->cur_acq_channel + 1); - - float vbit = volts_per_division * VERTICAL_DIVISIONS / 256.0; - float vbitlog = log10f(vbit); - int digits = -(int)vbitlog + (vbitlog < 0.0); - - /* Convert data. */ - for (i = 0; i < num_samples; i++) - samples[i] = ((float) ((int16_t) (RB16(&devc->rcv_buffer[i*2])))) * vbit; - - /* Fill frame. */ - sr_analog_init(&analog, &encoding, &meaning, &spec, digits); - analog.meaning->channels = g_slist_append(NULL, g_slist_nth_data(sdi->channels, devc->cur_acq_channel)); - analog.num_samples = num_samples; - analog.data = samples; - analog.meaning->mq = SR_MQ_VOLTAGE; - analog.meaning->unit = SR_UNIT_VOLT; - analog.meaning->mqflags = 0; - packet.type = SR_DF_ANALOG; - packet.payload = &analog; - sr_session_send(sdi, &packet); - g_slist_free(analog.meaning->channels); - - /* All channels acquired. */ - if (devc->cur_acq_channel == ANALOG_CHANNELS - 1) { - sr_spew("All channels acquired."); - - if (devc->cur_acq_frame == devc->frame_limit - 1) { - /* All frames acquired. */ - sr_spew("All frames acquired."); - sr_dev_acquisition_stop(sdi); - return TRUE; - } else { - /* Start acquiring next frame. */ - if (devc->df_started) { - packet.type = SR_DF_FRAME_END; - sr_session_send(sdi, &packet); - - packet.type = SR_DF_FRAME_BEGIN; - sr_session_send(sdi, &packet); - } - devc->cur_acq_frame++; - devc->state = START_ACQUISITION; - } } else { - /* Start acquiring next channel. */ - devc->state = START_TRANSFER_OF_CHANNEL_DATA; - devc->cur_acq_channel++; - return TRUE; + /* Start acquiring next frame. */ + if (devc->df_started) { + packet.type = SR_DF_FRAME_END; + sr_session_send(sdi, &packet); + + packet.type = SR_DF_FRAME_BEGIN; + sr_session_send(sdi, &packet); + } + devc->cur_acq_frame++; + devc->state = START_ACQUISITION; } + } else { + /* Start acquiring next channel. */ + devc->state = START_TRANSFER_OF_CHANNEL_DATA; + devc->cur_acq_channel++; + return TRUE; } break; } diff --git a/src/hardware/hameg-hmo/api.c b/src/hardware/hameg-hmo/api.c index 0abc722c..44841e85 100644 --- a/src/hardware/hameg-hmo/api.c +++ b/src/hardware/hameg-hmo/api.c @@ -176,28 +176,24 @@ static int config_get(uint32_t key, GVariant **data, (*model->timebases)[state->timebase][1]); break; case SR_CONF_NUM_VDIV: - if (!cg) { + if (!cg) return SR_ERR_CHANNEL_GROUP; - } else if (cg_type == CG_ANALOG) { - if (std_cg_idx(cg, devc->analog_groups, model->analog_channels) < 0) - return SR_ERR_ARG; - *data = g_variant_new_int32(model->num_ydivs); - } else { + if (cg_type != CG_ANALOG) return SR_ERR_NA; - } + if (std_cg_idx(cg, devc->analog_groups, model->analog_channels) < 0) + return SR_ERR_ARG; + *data = g_variant_new_int32(model->num_ydivs); break; case SR_CONF_VDIV: - if (!cg) { + if (!cg) return SR_ERR_CHANNEL_GROUP; - } else if (cg_type == CG_ANALOG) { - if ((idx = std_cg_idx(cg, devc->analog_groups, model->analog_channels)) < 0) - return SR_ERR_ARG; - *data = g_variant_new("(tt)", - (*model->vdivs)[state->analog_channels[idx].vdiv][0], - (*model->vdivs)[state->analog_channels[idx].vdiv][1]); - } else { + if (cg_type != CG_ANALOG) return SR_ERR_NA; - } + if ((idx = std_cg_idx(cg, devc->analog_groups, model->analog_channels)) < 0) + return SR_ERR_ARG; + *data = g_variant_new("(tt)", + (*model->vdivs)[state->analog_channels[idx].vdiv][0], + (*model->vdivs)[state->analog_channels[idx].vdiv][1]); break; case SR_CONF_TRIGGER_SOURCE: *data = g_variant_new_string((*model->trigger_sources)[state->trigger_source]); @@ -209,15 +205,13 @@ static int config_get(uint32_t key, GVariant **data, *data = g_variant_new_double(state->horiz_triggerpos); break; case SR_CONF_COUPLING: - if (!cg) { + if (!cg) return SR_ERR_CHANNEL_GROUP; - } else if (cg_type == CG_ANALOG) { - if ((idx = std_cg_idx(cg, devc->analog_groups, model->analog_channels)) < 0) - return SR_ERR_ARG; - *data = g_variant_new_string((*model->coupling_options)[state->analog_channels[idx].coupling]); - } else { + if (cg_type != CG_ANALOG) return SR_ERR_NA; - } + if ((idx = std_cg_idx(cg, devc->analog_groups, model->analog_channels)) < 0) + return SR_ERR_ARG; + *data = g_variant_new_string((*model->coupling_options)[state->analog_channels[idx].coupling]); break; case SR_CONF_SAMPLERATE: *data = g_variant_new_uint64(state->sample_rate); diff --git a/src/hardware/hameg-hmo/protocol.c b/src/hardware/hameg-hmo/protocol.c index 0c4d57f3..13063382 100644 --- a/src/hardware/hameg-hmo/protocol.c +++ b/src/hardware/hameg-hmo/protocol.c @@ -495,8 +495,21 @@ SR_PRIV int hmo_update_sample_rate(const struct sr_dev_inst *sdi) channel_found = FALSE; for (i = 0; i < config->analog_channels; i++) { - if (state->analog_channels[i].state) { - g_snprintf(chan_name, sizeof(chan_name), "CHAN%d", i + 1); + if (!state->analog_channels[i].state) + continue; + g_snprintf(chan_name, sizeof(chan_name), "CHAN%d", i + 1); + g_snprintf(tmp_str, sizeof(tmp_str), + (*config->scpi_dialect)[SCPI_CMD_GET_SAMPLE_RATE_LIVE], + chan_name); + channel_found = TRUE; + break; + } + + if (!channel_found) { + for (i = 0; i < config->digital_pods; i++) { + if (!state->digital_pods[i]) + continue; + g_snprintf(chan_name, sizeof(chan_name), "POD%d", i); g_snprintf(tmp_str, sizeof(tmp_str), (*config->scpi_dialect)[SCPI_CMD_GET_SAMPLE_RATE_LIVE], chan_name); @@ -505,19 +518,6 @@ SR_PRIV int hmo_update_sample_rate(const struct sr_dev_inst *sdi) } } - if (!channel_found) { - for (i = 0; i < config->digital_pods; i++) { - if (state->digital_pods[i]) { - g_snprintf(chan_name, sizeof(chan_name), "POD%d", i); - g_snprintf(tmp_str, sizeof(tmp_str), - (*config->scpi_dialect)[SCPI_CMD_GET_SAMPLE_RATE_LIVE], - chan_name); - channel_found = TRUE; - break; - } - } - } - /* No channel is active, ask the instrument for the sample rate * in single shot mode */ if (!channel_found) { diff --git a/src/hardware/hung-chang-dso-2100/api.c b/src/hardware/hung-chang-dso-2100/api.c index a16eb899..e0806070 100644 --- a/src/hardware/hung-chang-dso-2100/api.c +++ b/src/hardware/hung-chang-dso-2100/api.c @@ -312,35 +312,29 @@ static int config_get(uint32_t key, GVariant **data, case SR_CONF_TRIGGER_SLOPE: if (devc->edge >= ARRAY_SIZE(trigger_slopes)) return SR_ERR; - else - *data = g_variant_new_string(trigger_slopes[devc->edge]); + *data = g_variant_new_string(trigger_slopes[devc->edge]); break; case SR_CONF_BUFFERSIZE: *data = g_variant_new_uint64(buffersizes[devc->last_step]); break; case SR_CONF_VDIV: - if (!cg) { + if (!cg) return SR_ERR_CHANNEL_GROUP; - } else { - if ((idx = std_u8_idx_s(devc->cctl[ch] & 0x33, ARRAY_AND_SIZE(vdivs_map))) < 0) - return SR_ERR_BUG; - *data = g_variant_new("(tt)", vdivs[idx][0], vdivs[idx][1]); - } + if ((idx = std_u8_idx_s(devc->cctl[ch] & 0x33, ARRAY_AND_SIZE(vdivs_map))) < 0) + return SR_ERR_BUG; + *data = g_variant_new("(tt)", vdivs[idx][0], vdivs[idx][1]); break; case SR_CONF_COUPLING: - if (!cg) { + if (!cg) return SR_ERR_CHANNEL_GROUP; - } else { - if ((idx = std_u8_idx_s(devc->cctl[ch] & 0x0C, ARRAY_AND_SIZE(coupling_map))) < 0) - return SR_ERR_BUG; - *data = g_variant_new_string(coupling[idx]); - } + if ((idx = std_u8_idx_s(devc->cctl[ch] & 0x0C, ARRAY_AND_SIZE(coupling_map))) < 0) + return SR_ERR_BUG; + *data = g_variant_new_string(coupling[idx]); break; case SR_CONF_PROBE_FACTOR: if (!cg) return SR_ERR_CHANNEL_GROUP; - else - *data = g_variant_new_uint64(devc->probe[ch]); + *data = g_variant_new_uint64(devc->probe[ch]); break; default: return SR_ERR_NA; @@ -384,35 +378,28 @@ static int config_set(uint32_t key, GVariant *data, devc->last_step = idx; break; case SR_CONF_VDIV: - if (!cg) { + if (!cg) return SR_ERR_CHANNEL_GROUP; - } else if (!g_variant_is_of_type(data, G_VARIANT_TYPE("(tt)"))) { + if (!g_variant_is_of_type(data, G_VARIANT_TYPE("(tt)"))) return SR_ERR_ARG; - } else { - if ((idx = std_u64_tuple_idx(data, ARRAY_AND_SIZE(vdivs))) < 0) - return SR_ERR_ARG; - devc->cctl[ch] = (devc->cctl[ch] & 0xCC) | vdivs_map[idx]; - } + if ((idx = std_u64_tuple_idx(data, ARRAY_AND_SIZE(vdivs))) < 0) + return SR_ERR_ARG; + devc->cctl[ch] = (devc->cctl[ch] & 0xCC) | vdivs_map[idx]; break; case SR_CONF_COUPLING: - if (!cg) { + if (!cg) return SR_ERR_CHANNEL_GROUP; - } else { - if ((idx = std_str_idx(data, ARRAY_AND_SIZE(coupling))) < 0) - return SR_ERR_ARG; - devc->cctl[ch] = (devc->cctl[ch] & 0xF3) | coupling_map[idx]; - } + if ((idx = std_str_idx(data, ARRAY_AND_SIZE(coupling))) < 0) + return SR_ERR_ARG; + devc->cctl[ch] = (devc->cctl[ch] & 0xF3) | coupling_map[idx]; break; case SR_CONF_PROBE_FACTOR: - if (!cg) { + if (!cg) return SR_ERR_CHANNEL_GROUP; - } else { - u = g_variant_get_uint64(data); - if (!u) - return SR_ERR_ARG; - else - devc->probe[ch] = u; - } + u = g_variant_get_uint64(data); + if (!u) + return SR_ERR_ARG; + devc->probe[ch] = u; break; default: return SR_ERR_NA; @@ -427,17 +414,19 @@ static int config_channel_set(const struct sr_dev_inst *sdi, struct dev_context *devc = sdi->priv; uint8_t v; - if (changes & SR_CHANNEL_SET_ENABLED) { - if (ch->enabled) { - v = devc->channel | (1 << ch->index); - if (v & (v - 1)) - return SR_ERR; - devc->channel = v; - devc->enabled_channel->data = ch; - } else { - devc->channel &= ~(1 << ch->index); - } + if (!(changes & SR_CHANNEL_SET_ENABLED)) + return SR_OK; + + if (ch->enabled) { + v = devc->channel | (1 << ch->index); + if (v & (v - 1)) + return SR_ERR; + devc->channel = v; + devc->enabled_channel->data = ch; + } else { + devc->channel &= ~(1 << ch->index); } + return SR_OK; } diff --git a/src/hardware/lascar-el-usb/protocol.c b/src/hardware/lascar-el-usb/protocol.c index bda67b33..44f4be82 100644 --- a/src/hardware/lascar-el-usb/protocol.c +++ b/src/hardware/lascar-el-usb/protocol.c @@ -298,50 +298,52 @@ static struct sr_dev_inst *lascar_identify(unsigned char *config) modelid = config[0]; sdi = NULL; - if (modelid) { - profile = NULL; - for (i = 0; profiles[i].modelid; i++) { - if (profiles[i].modelid == modelid) { - profile = &profiles[i]; - break; - } + + if (!modelid) + return sdi; + + profile = NULL; + for (i = 0; profiles[i].modelid; i++) { + if (profiles[i].modelid == modelid) { + profile = &profiles[i]; + break; } - if (!profile) { - sr_dbg("unknown EL-USB modelid %d", modelid); - return NULL; - } - - i = config[52] | (config[53] << 8); - memcpy(firmware, config + 0x30, 4); - firmware[4] = '\0'; - sr_dbg("found %s with firmware version %s serial %d", - profile->modelname, firmware, i); - - if (profile->logformat == LOG_UNSUPPORTED) { - sr_dbg("unsupported EL-USB logformat for %s", profile->modelname); - return NULL; - } - - sdi = g_malloc0(sizeof(struct sr_dev_inst)); - sdi->status = SR_ST_INACTIVE; - sdi->vendor = g_strdup("Lascar"); - sdi->model = g_strdup(profile->modelname); - sdi->version = g_strdup(firmware); - - if (profile->logformat == LOG_TEMP_RH) { - /* Model this as two channels: temperature and humidity. */ - sr_channel_new(sdi, 0, SR_CHANNEL_ANALOG, TRUE, "Temp"); - sr_channel_new(sdi, 0, SR_CHANNEL_ANALOG, TRUE, "Hum"); - } else if (profile->logformat == LOG_CO) { - sr_channel_new(sdi, 0, SR_CHANNEL_ANALOG, TRUE, "CO"); - } else { - sr_channel_new(sdi, 0, SR_CHANNEL_ANALOG, TRUE, "P1"); - } - - devc = g_malloc0(sizeof(struct dev_context)); - sdi->priv = devc; - devc->profile = profile; } + if (!profile) { + sr_dbg("unknown EL-USB modelid %d", modelid); + return NULL; + } + + i = config[52] | (config[53] << 8); + memcpy(firmware, config + 0x30, 4); + firmware[4] = '\0'; + sr_dbg("found %s with firmware version %s serial %d", + profile->modelname, firmware, i); + + if (profile->logformat == LOG_UNSUPPORTED) { + sr_dbg("unsupported EL-USB logformat for %s", profile->modelname); + return NULL; + } + + sdi = g_malloc0(sizeof(struct sr_dev_inst)); + sdi->status = SR_ST_INACTIVE; + sdi->vendor = g_strdup("Lascar"); + sdi->model = g_strdup(profile->modelname); + sdi->version = g_strdup(firmware); + + if (profile->logformat == LOG_TEMP_RH) { + /* Model this as two channels: temperature and humidity. */ + sr_channel_new(sdi, 0, SR_CHANNEL_ANALOG, TRUE, "Temp"); + sr_channel_new(sdi, 0, SR_CHANNEL_ANALOG, TRUE, "Hum"); + } else if (profile->logformat == LOG_CO) { + sr_channel_new(sdi, 0, SR_CHANNEL_ANALOG, TRUE, "CO"); + } else { + sr_channel_new(sdi, 0, SR_CHANNEL_ANALOG, TRUE, "P1"); + } + + devc = g_malloc0(sizeof(struct dev_context)); + sdi->priv = devc; + devc->profile = profile; return sdi; } diff --git a/src/hardware/saleae-logic16/protocol.c b/src/hardware/saleae-logic16/protocol.c index 28a4c52f..a3dc0900 100644 --- a/src/hardware/saleae-logic16/protocol.c +++ b/src/hardware/saleae-logic16/protocol.c @@ -913,46 +913,50 @@ SR_PRIV void LIBUSB_CALL logic16_receive_transfer(struct libusb_transfer *transf new_samples = convert_sample_data(devc, devc->convbuffer, devc->convbuffer_size, transfer->buffer, transfer->actual_length); - if (new_samples > 0) { - if (devc->trigger_fired) { - /* Send the incoming transfer to the session bus. */ + if (new_samples <= 0) { + resubmit_transfer(transfer); + return; + } + + /* At least one new sample. */ + if (devc->trigger_fired) { + /* Send the incoming transfer to the session bus. */ + packet.type = SR_DF_LOGIC; + packet.payload = &logic; + if (devc->limit_samples && + new_samples > devc->limit_samples - devc->sent_samples) + new_samples = devc->limit_samples - devc->sent_samples; + logic.length = new_samples * 2; + logic.unitsize = 2; + logic.data = devc->convbuffer; + sr_session_send(sdi, &packet); + devc->sent_samples += new_samples; + } else { + trigger_offset = soft_trigger_logic_check(devc->stl, + devc->convbuffer, new_samples * 2, &pre_trigger_samples); + if (trigger_offset > -1) { + devc->sent_samples += pre_trigger_samples; packet.type = SR_DF_LOGIC; packet.payload = &logic; + num_samples = new_samples - trigger_offset; if (devc->limit_samples && - new_samples > devc->limit_samples - devc->sent_samples) - new_samples = devc->limit_samples - devc->sent_samples; - logic.length = new_samples * 2; + num_samples > devc->limit_samples - devc->sent_samples) + num_samples = devc->limit_samples - devc->sent_samples; + logic.length = num_samples * 2; logic.unitsize = 2; - logic.data = devc->convbuffer; + logic.data = devc->convbuffer + trigger_offset * 2; sr_session_send(sdi, &packet); - devc->sent_samples += new_samples; - } else { - trigger_offset = soft_trigger_logic_check(devc->stl, - devc->convbuffer, new_samples * 2, &pre_trigger_samples); - if (trigger_offset > -1) { - devc->sent_samples += pre_trigger_samples; - packet.type = SR_DF_LOGIC; - packet.payload = &logic; - num_samples = new_samples - trigger_offset; - if (devc->limit_samples && - num_samples > devc->limit_samples - devc->sent_samples) - num_samples = devc->limit_samples - devc->sent_samples; - logic.length = num_samples * 2; - logic.unitsize = 2; - logic.data = devc->convbuffer + trigger_offset * 2; - sr_session_send(sdi, &packet); - devc->sent_samples += num_samples; + devc->sent_samples += num_samples; - devc->trigger_fired = TRUE; - } + devc->trigger_fired = TRUE; } + } - if (devc->limit_samples && - (uint64_t)devc->sent_samples >= devc->limit_samples) { - devc->sent_samples = -2; - free_transfer(transfer); - return; - } + if (devc->limit_samples && + (uint64_t)devc->sent_samples >= devc->limit_samples) { + devc->sent_samples = -2; + free_transfer(transfer); + return; } resubmit_transfer(transfer); diff --git a/src/hardware/yokogawa-dlm/api.c b/src/hardware/yokogawa-dlm/api.c index 16983653..9d566076 100644 --- a/src/hardware/yokogawa-dlm/api.c +++ b/src/hardware/yokogawa-dlm/api.c @@ -211,22 +211,18 @@ static int config_get(uint32_t key, GVariant **data, ret = SR_OK; break; case SR_CONF_NUM_VDIV: - if (!cg) { + if (!cg) return SR_ERR_CHANNEL_GROUP; - } else if (cg_type == CG_ANALOG) { - *data = g_variant_new_int32(model->num_ydivs); - ret = SR_OK; - break; - } else { - ret = SR_ERR_NA; - } + if (cg_type != CG_ANALOG) + return SR_ERR_NA; + *data = g_variant_new_int32(model->num_ydivs); + ret = SR_OK; break; case SR_CONF_VDIV: - ret = SR_ERR_NA; - if (!cg) { + if (!cg) return SR_ERR_CHANNEL_GROUP; - } else if (cg_type != CG_ANALOG) - break; + if (cg_type != CG_ANALOG) + return SR_ERR_NA; if ((idx = std_cg_idx(cg, devc->analog_groups, model->analog_channels)) < 0) return SR_ERR_ARG; *data = g_variant_new("(tt)", @@ -247,11 +243,10 @@ static int config_get(uint32_t key, GVariant **data, ret = SR_OK; break; case SR_CONF_COUPLING: - ret = SR_ERR_NA; - if (!cg) { + if (!cg) return SR_ERR_CHANNEL_GROUP; - } else if (cg_type != CG_ANALOG) - break; + if (cg_type != CG_ANALOG) + return SR_ERR_NA; if ((idx = std_cg_idx(cg, devc->analog_groups, model->analog_channels)) < 0) return SR_ERR_ARG; *data = g_variant_new_string((*model->coupling_options)[state->analog_states[idx].coupling]);