X-Git-Url: https://sigrok.org/gitweb/?p=libsigrok.git;a=blobdiff_plain;f=src%2Fhardware%2Fgwinstek-gds-800%2Fprotocol.c;h=ce9e8d416aae0d1862b689c3fdf9d579f76cf41f;hp=962bfe05467222431049bbcb178bc47318d5c5e0;hb=HEAD;hpb=d2f7c417fdd96a13d8fd86350d2fc13db16f626c diff --git a/src/hardware/gwinstek-gds-800/protocol.c b/src/hardware/gwinstek-gds-800/protocol.c index 962bfe05..5feb25b1 100644 --- a/src/hardware/gwinstek-gds-800/protocol.c +++ b/src/hardware/gwinstek-gds-800/protocol.c @@ -141,11 +141,8 @@ SR_PRIV int gwinstek_gds_800_receive_data(int fd, int revents, void *cb_data) } 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); + std_session_send_df_frame_end(sdi); + std_session_send_df_frame_begin(sdi); } devc->cur_acq_frame++; @@ -158,55 +155,52 @@ 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 (!devc->df_started) { - std_session_send_df_header(sdi); + 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; - packet.type = SR_DF_FRAME_BEGIN; - sr_session_send(sdi, &packet); - - devc->df_started = TRUE; - } + if (!devc->df_started) { + std_session_send_df_header(sdi); + std_session_send_df_frame_begin(sdi); + devc->df_started = TRUE; } break; case WAIT_FOR_TRANSFER_OF_CHANNEL_INDICATOR_COMPLETE: @@ -218,72 +212,70 @@ 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."); - 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); + if (read_data(sdi, scpi, devc, devc->data_size - 8) < 0) + break; - num_samples = (devc->data_size - 8) / 2; - sr_spew("Received %d number of samples from channel " - "%d.", num_samples, devc->cur_acq_channel + 1); + /* 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); - float vbit = volts_per_division * VERTICAL_DIVISIONS / 256.0; - float vbitlog = log10f(vbit); - int digits = -(int)vbitlog + (vbitlog < 0.0); + num_samples = (devc->data_size - 8) / 2; + sr_spew("Received %d number of samples from channel " + "%d.", num_samples, devc->cur_acq_channel + 1); - /* Convert data. */ - for (i = 0; i < num_samples; i++) - samples[i] = ((float) ((int16_t) (RB16(&devc->rcv_buffer[i*2])))) * vbit; + float vbit = volts_per_division * VERTICAL_DIVISIONS / 256.0; + float vbitlog = log10f(vbit); + int digits = -(int)vbitlog + (vbitlog < 0.0); - /* 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); + /* Convert data. */ + for (i = 0; i < num_samples; i++) + samples[i] = ((float) ((int16_t) (RB16(&devc->rcv_buffer[i*2])))) * vbit; - /* All channels acquired. */ - if (devc->cur_acq_channel == ANALOG_CHANNELS - 1) { - sr_spew("All channels acquired."); + /* 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); - 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); + /* All channels acquired. */ + if (devc->cur_acq_channel == ANALOG_CHANNELS - 1) { + sr_spew("All channels acquired."); - 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++; + 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) { + std_session_send_df_frame_end(sdi); + std_session_send_df_frame_begin(sdi); + } + 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; }