Hi,

Am 2015-09-21 um 15:32 schrieb Uwe Hermann:
> Hi,
> 
> On Sun, Sep 20, 2015 at 07:25:13PM +0200, Martin Lederhilger wrote:
>>  this driver is for the above mentioned oscilloscope series. The patches
>> in the attachment should apply to master.
> 
> Great work, thanks a lot!
> 
> See below for a quick review with mostly minor cosmetics. Apart from
> that it looks pretty good and certainly mergeable in the next iteration.
> 

You can find the patch which resolves the cosmetic issues in the attachment.

>  
>> oscilloscope. It seems to contain an serial to USB converter, but I was
>> unable to establish a connection.
> 
> Are you sure both USB and RS232 have the same protocol and features
> behind them? The vendor webpage has two different software package names
> (FreeCapture and FreeView), maybe the USB port is meant for something
> different, or has another protocol or such?
> 

FreeView was used to get a screen shot from the scope's display via the
USB port. Since the USB port presented itself as an serial to USB
converter I simply tried it, because I thought it would probably allow
faster transfer rates. But unfortunately it seems to be not possible.

>  
>> Please integrate the driver into Sigrok. Let me know if you need a
>> photograph from the scope - for example for the web page - I do not want
>> to post it to the mailing list, because the image is rather big.
> 
> Sure, one or more (self-made) photos would be great for the wiki. Please
> join us on IRC (#sigrok on FreeNode) for a wiki account if you like to
> upload the photo and add a wiki page for the device. If that's too much
> hassle you can also send me a photo via email and I'll upload it for you.
> Let me know if "Public domain" or "CC-BY-SA 3.0" is fine for you as
> license for the photo(s).

I will send you a photo that I have taken yesterday.


Greetings,

Martin
>From 2559a843d402b484e074848271d3ca37ed31b44e Mon Sep 17 00:00:00 2001
From: Martin Lederhilger <martin.lederhil...@gmx.at>
Date: Mon, 21 Sep 2015 19:29:27 +0200
Subject: [PATCH] gwinstek-gds-800: Cosmetic changes for being accepted
 upstream.

---
 configure.ac                             |   2 +-
 src/hardware/gwinstek-gds-800/api.c      |  48 ++--
 src/hardware/gwinstek-gds-800/protocol.c | 368 +++++++++++++++----------------
 src/hardware/gwinstek-gds-800/protocol.h |   8 +-
 4 files changed, 208 insertions(+), 218 deletions(-)

diff --git a/configure.ac b/configure.ac
index 3eb0486..ba98f3e 100644
--- a/configure.ac
+++ b/configure.ac
@@ -229,7 +229,7 @@ SR_DRIVER([demo], [demo])
 SR_DRIVER([Fluke DMM], [fluke-dmm], [libserialport])
 SR_DRIVER([fx2lafw], [fx2lafw], [libusb])
 SR_DRIVER([GMC MH 1x/2x], [gmc-mh-1x-2x], [libserialport])
-SR_DRIVER([gwinstek gds-800], [gwinstek-gds-800], [libserialport])
+SR_DRIVER([GW Instek GDS-800], [gwinstek-gds-800], [libserialport])
 SR_DRIVER([Hameg HMO], [hameg-hmo], [libserialport])
 SR_DRIVER([Hantek DSO], [hantek-dso], [libusb])
 SR_DRIVER([Hung-Chang DSO-2100], [hung-chang-dso-2100], [libieee1284])
diff --git a/src/hardware/gwinstek-gds-800/api.c b/src/hardware/gwinstek-gds-800/api.c
index 1d86705..b3e62c1 100644
--- a/src/hardware/gwinstek-gds-800/api.c
+++ b/src/hardware/gwinstek-gds-800/api.c
@@ -49,13 +49,13 @@ static struct sr_dev_inst *probe_device(struct sr_scpi_dev_inst *scpi)
 		sr_info("Couldn't get IDN response.");
 		return NULL;
 	}
-	
-	if(strcmp(hw_info->manufacturer, "GW") != 0 ||
-	   strncmp(hw_info->model, "GDS-8", 5) != 0) {
+
+	if (strcmp(hw_info->manufacturer, "GW") != 0 ||
+	    strncmp(hw_info->model, "GDS-8", 5) != 0) {
 		sr_scpi_hw_info_free(hw_info);
 		return NULL;
 	}
-	   
+
 	sdi = g_malloc0(sizeof(struct sr_dev_inst));
 	sdi->status = SR_ST_ACTIVE;
 	sdi->vendor = g_strdup(hw_info->manufacturer);
@@ -67,25 +67,25 @@ static struct sr_dev_inst *probe_device(struct sr_scpi_dev_inst *scpi)
 	sdi->serial_num = g_strdup(hw_info->serial_number);
 	sdi->channels = NULL;
 	sdi->channel_groups = NULL;
-	
+
 	sr_scpi_hw_info_free(hw_info);
-	
+
 	devc = g_malloc0(sizeof(struct dev_context));
 	devc->frame_limit = 1;
 	devc->sample_rate = 0.;
 	devc->df_started  = FALSE;
 	sdi->priv = devc;
-	
+
 	sr_channel_new(sdi, 0, SR_CHANNEL_ANALOG, TRUE, "CH1");
 	sr_channel_new(sdi, 1, SR_CHANNEL_ANALOG, TRUE, "CH2");
-	
+
 	cg = g_malloc0(sizeof(struct sr_channel_group));
 	cg->name = g_strdup("");
 	cg->channels = g_slist_append(cg->channels, g_slist_nth_data(sdi->channels, 0));
 	cg->channels = g_slist_append(cg->channels, g_slist_nth_data(sdi->channels, 1));
 	cg->priv = NULL;
 	sdi->channel_groups = g_slist_append(NULL, cg);
-	
+
 	return sdi;
 }
 
@@ -122,7 +122,7 @@ static int dev_open(struct sr_dev_inst *sdi)
 static int dev_close(struct sr_dev_inst *sdi)
 {
 	struct sr_scpi_dev_inst *scpi;
-	
+
 	if (sdi->status != SR_ST_ACTIVE)
 		return SR_ERR_DEV_CLOSED;
 
@@ -148,10 +148,9 @@ static int config_get(uint32_t key, GVariant **data, const struct sr_dev_inst *s
 {
 	int ret;
 	struct dev_context *devc;
-	
-	(void)data;
+
 	(void)cg;
-	
+
 	if (!sdi || !(devc = sdi->priv))
 		return SR_ERR_ARG;
 
@@ -172,10 +171,9 @@ static int config_set(uint32_t key, GVariant *data, const struct sr_dev_inst *sd
 {
 	int ret;
 	struct dev_context *devc;
-	
-	(void)data;
+
 	(void)cg;
-	
+
 	if (!sdi || !(devc = sdi->priv))
 		return SR_ERR_ARG;
 
@@ -198,10 +196,10 @@ static int config_list(uint32_t key, GVariant **data, const struct sr_dev_inst *
 		const struct sr_channel_group *cg)
 {
 	int ret;
-	
+
 	(void)sdi;
 	(void)cg;
-	
+
 	ret = SR_OK;
 	switch (key) {
 	case SR_CONF_SCAN_OPTIONS:
@@ -226,20 +224,20 @@ static int dev_acquisition_start(const struct sr_dev_inst *sdi,
 	struct dev_context *devc;
 	
 	(void)cb_data;
-	
+
 	scpi = sdi->conn;
 	devc = sdi->priv;
-	
+
 	if (sdi->status != SR_ST_ACTIVE)
 		return SR_ERR_DEV_CLOSED;
-	
+
 	/* Initialize device context; */
-	devc->state = START_AQUISITION;
+	devc->state = START_ACQUISITION;
 	devc->cur_acq_frame = 0;	
 	
 	sr_scpi_source_add(sdi->session, scpi, G_IO_IN, 50,
 			gwinstek_gds_800_receive_data, (void *)sdi);
-	
+
 	return SR_OK;
 }
 
@@ -248,7 +246,7 @@ static int dev_acquisition_stop(struct sr_dev_inst *sdi, void *cb_data)
 	struct sr_scpi_dev_inst *scpi;
 	struct dev_context *devc;
 	struct sr_datafeed_packet packet;
-	
+
 	(void)cb_data;
 
 	scpi = sdi->conn;
@@ -276,7 +274,7 @@ static int dev_acquisition_stop(struct sr_dev_inst *sdi, void *cb_data)
 
 SR_PRIV struct sr_dev_driver gwinstek_gds_800_driver_info = {
 	.name = "gwinstek-gds-800",
-	.longname = "gwinstek gds-800",
+	.longname = "GW Instek GDS-800 series",
 	.api_version = 1,
 	.init = init,
 	.cleanup = cleanup,
diff --git a/src/hardware/gwinstek-gds-800/protocol.c b/src/hardware/gwinstek-gds-800/protocol.c
index 0285703..7824c3d 100644
--- a/src/hardware/gwinstek-gds-800/protocol.c
+++ b/src/hardware/gwinstek-gds-800/protocol.c
@@ -20,30 +20,33 @@
 #include "protocol.h"
 #include <string.h>
 
+#define ANALOG_CHANNELS 2
+#define VERTICAL_DIVISIONS 10
+
 static int read_data(struct sr_dev_inst *sdi, void *cb_data, struct sr_scpi_dev_inst *scpi, struct dev_context *devc, int data_size)
 {
 	int len;
 	
 	len = sr_scpi_read_data(scpi, &devc->rcv_buffer[devc->cur_rcv_buffer_position], data_size - devc->cur_rcv_buffer_position);
-	if(len < 0) {
+	if (len < 0) {
 		sr_err("Read data error.");
 		sdi->driver->dev_acquisition_stop(sdi, cb_data);
 		devc->cur_rcv_buffer_position = 0;
 		return SR_ERR;
 	}
-	
+
 	devc->cur_rcv_buffer_position += len;
-	
+
 	/* handle the case where sr_scpi_read_data has stopped at the newline */
-	if(len < data_size && sr_scpi_read_complete(scpi)) {
+	if (len < data_size && sr_scpi_read_complete(scpi)) {
 		devc->rcv_buffer[devc->cur_rcv_buffer_position] = '\n';
 		devc->cur_rcv_buffer_position++;
 	}	
-	
-	if(devc->cur_rcv_buffer_position < data_size)
-		return SR_ERR; //not finished yet
-	else if(devc->cur_rcv_buffer_position == data_size) {
-		devc->cur_rcv_buffer_position = 0;
+
+	if (devc->cur_rcv_buffer_position < data_size)
+		return SR_ERR; /* not finished yet */
+	else if (devc->cur_rcv_buffer_position == data_size) {
+		 devc->cur_rcv_buffer_position = 0;
 		return SR_OK;
 	}
 	else {
@@ -68,9 +71,9 @@ SR_PRIV int gwinstek_gds_800_receive_data(int fd, int revents, void *cb_data)
 	float samples[MAX_SAMPLES];
 	uint32_t sample_rate;
 	char *end_ptr;
-	
+
 	(void)fd;
-	
+
 	if (!(sdi = cb_data))
 		return TRUE;
 
@@ -81,207 +84,198 @@ SR_PRIV int gwinstek_gds_800_receive_data(int fd, int revents, void *cb_data)
 
 	if (!(revents == G_IO_IN || revents == 0))
 		return TRUE;
-	
-	switch(devc->state)
-	{
-		case START_AQUISITION:
-			if (sr_scpi_send(scpi, ":TRIG:MOD 3") != SR_OK) {
-				sr_err("Failed to set trigger mode to SINGLE.");
-				sdi->driver->dev_acquisition_stop(sdi, cb_data);
-				return TRUE;
-			}
-			if (sr_scpi_send(scpi, ":STOP") != SR_OK) {
-				sr_err("Failed to put the trigger system into STOP state.");
+
+	switch(devc->state) {
+	case START_ACQUISITION:
+		if (sr_scpi_send(scpi, ":TRIG:MOD 3") != SR_OK) {
+			sr_err("Failed to set trigger mode to SINGLE.");
+			sdi->driver->dev_acquisition_stop(sdi, cb_data);
+			return TRUE;
+		}
+		if (sr_scpi_send(scpi, ":STOP") != SR_OK) {
+			sr_err("Failed to put the trigger system into STOP state.");
+			sdi->driver->dev_acquisition_stop(sdi, cb_data);
+			return TRUE;
+		}
+		if (sr_scpi_send(scpi, ":RUN") != SR_OK) {
+			sr_err("Failed to put the trigger system into RUN state.");
+			sdi->driver->dev_acquisition_stop(sdi, cb_data);
+			return TRUE;
+		}
+
+		devc->cur_acq_channel = 0;
+		devc->state = START_TRANSFER_OF_CHANNEL_DATA;
+		break;
+	case START_TRANSFER_OF_CHANNEL_DATA:
+		if (((struct sr_channel*)g_slist_nth_data(sdi->channels, devc->cur_acq_channel))->enabled) {
+			if (sr_scpi_send(scpi, ":ACQ%d:MEM?", devc->cur_acq_channel+1) != SR_OK) {
+				sr_err("Failed to acquire memory.");
 				sdi->driver->dev_acquisition_stop(sdi, cb_data);
 				return TRUE;
 			}
-			if (sr_scpi_send(scpi, ":RUN") != SR_OK) {
-				sr_err("Failed to put the trigger system into RUN state.");
+			if (sr_scpi_read_begin(scpi) != SR_OK) {
+				sr_err("Could not begin reading SCPI response.");
 				sdi->driver->dev_acquisition_stop(sdi, cb_data);
 				return TRUE;
 			}
-			
-			devc->cur_acq_channel = 0;
-			devc->state = START_TRANSFER_OF_CHANNEL_DATA;
-			break;
-		case START_TRANSFER_OF_CHANNEL_DATA:
-			if(((struct sr_channel*)g_slist_nth_data(sdi->channels, devc->cur_acq_channel))->enabled) {
-				if (sr_scpi_send(scpi, ":ACQ%d:MEM?", devc->cur_acq_channel+1) != SR_OK) {
-					sr_err("Failed to acquire memory.");
-					sdi->driver->dev_acquisition_stop(sdi, cb_data);
-					return TRUE;
-				}
-				if(sr_scpi_read_begin(scpi) != SR_OK) {
-					sr_err("Could not begin reading SCPI response.");
+			devc->state = WAIT_FOR_TRANSFER_OF_BEGIN_TRANSMISSION_COMPLETE;
+			devc->cur_rcv_buffer_position = 0;
+		} else {
+			/* All channels acquired. */
+			if (devc->cur_acq_channel == ANALOG_CHANNELS - 1) {
+				sr_spew("All channels acquired.");
+
+				/* All frames accquired. */
+				if (devc->cur_acq_frame == devc->frame_limit - 1) {
+					sr_spew("All frames acquired.");
+					
 					sdi->driver->dev_acquisition_stop(sdi, cb_data);
 					return TRUE;
 				}
-				devc->state = WAIT_FOR_TRANSFER_OF_BEGIN_TRANSMISSION_COMPLETE;
-				devc->cur_rcv_buffer_position = 0;
-			} else {
-				/* All channels acquired. */
-				if(devc->cur_acq_channel == ANALOG_CHANNELS - 1) {
-					sr_spew("All channels acquired.");
-					
-					/* All frames accquired. */
-					if(devc->cur_acq_frame == devc->frame_limit - 1) {
-						sr_spew("All frames acquired.");
+				/* Start acquiring next frame. */
+				else {
+					if (devc->df_started) {
+						packet.type = SR_DF_FRAME_END;
+						sr_session_send(sdi, &packet);
 						
-						sdi->driver->dev_acquisition_stop(sdi, cb_data);
-						return TRUE;
-					}
-					/* Start acquiring next frame. */
-					else {
-						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_AQUISITION;
+						packet.type = SR_DF_FRAME_BEGIN;
+						sr_session_send(sdi, &packet);
 					}
+
+					devc->cur_acq_frame++;
+					devc->state = START_ACQUISITION;
 				}
-				/* Start acquiring next channel. */
-				else
-					devc->cur_acq_channel++;
 			}
-			break;
-		case WAIT_FOR_TRANSFER_OF_BEGIN_TRANSMISSION_COMPLETE:
-			if(read_data(sdi, cb_data, scpi, devc, 1) == SR_OK)
-			{
-				if(devc->rcv_buffer[0] == '#')
-					devc->state = WAIT_FOR_TRANSFER_OF_DATA_SIZE_DIGIT_COMPLETE;
+			/* Start acquiring next channel. */
+			else
+				devc->cur_acq_channel++;
+		}
+		break;
+	case WAIT_FOR_TRANSFER_OF_BEGIN_TRANSMISSION_COMPLETE:
+		if (read_data(sdi, cb_data, scpi, devc, 1) == SR_OK) {
+			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, cb_data, 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]);
+				sdi->driver->dev_acquisition_stop(sdi, cb_data);
+				return TRUE;
 			}
-			break;
-		case WAIT_FOR_TRANSFER_OF_DATA_SIZE_DIGIT_COMPLETE:
-			if(read_data(sdi, cb_data, 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]);
-					sdi->driver->dev_acquisition_stop(sdi, cb_data);
-					return TRUE;
-				}
-				else
-				{
-					devc->data_size_digits = devc->rcv_buffer[0] - '0';
-					devc->state = WAIT_FOR_TRANSFER_OF_DATA_SIZE_COMPLETE;
-				}
+			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, cb_data, 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);
-					sdi->driver->dev_acquisition_stop(sdi, cb_data);
-					return TRUE;
-				}
-				else
-					devc->state = WAIT_FOR_TRANSFER_OF_SAMPLE_RATE_COMPLETE;
+		}
+		break;
+	case WAIT_FOR_TRANSFER_OF_DATA_SIZE_COMPLETE:
+		if (read_data(sdi, cb_data, 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);
+				sdi->driver->dev_acquisition_stop(sdi, cb_data);
+				return TRUE;
 			}
-			break;
-		case WAIT_FOR_TRANSFER_OF_SAMPLE_RATE_COMPLETE:
-			if(read_data(sdi, cb_data, 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, LOG_PREFIX);
+			else
+				devc->state = WAIT_FOR_TRANSFER_OF_SAMPLE_RATE_COMPLETE;
+		}
+		break;
+	case WAIT_FOR_TRANSFER_OF_SAMPLE_RATE_COMPLETE:
+		if (read_data(sdi, cb_data, 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, LOG_PREFIX);
 
-					packet.type = SR_DF_FRAME_BEGIN;
-					sr_session_send(sdi, &packet);
-	
-					devc->df_started = TRUE;
-				}
+				packet.type = SR_DF_FRAME_BEGIN;
+				sr_session_send(sdi, &packet);
+
+				devc->df_started = TRUE;
+			}
+		}
+		break;
+	case WAIT_FOR_TRANSFER_OF_CHANNEL_INDICATOR_COMPLETE:
+		if (read_data(sdi, cb_data, scpi, devc, 1) == SR_OK)
+			devc->state = WAIT_FOR_TRANSFER_OF_RESERVED_DATA_COMPLETE;
+		break;
+	case WAIT_FOR_TRANSFER_OF_RESERVED_DATA_COMPLETE:
+		if (read_data(sdi, cb_data, scpi, devc, 3) == SR_OK)
+			devc->state = WAIT_FOR_TRANSFER_OF_CHANNEL_DATA_COMPLETE;
+		break;
+	case WAIT_FOR_TRANSFER_OF_CHANNEL_DATA_COMPLETE:
+		if (read_data(sdi, cb_data, 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.");
+				sdi->driver->dev_acquisition_stop(sdi, cb_data);
+				return TRUE;
 			}
-			break;
-		case WAIT_FOR_TRANSFER_OF_CHANNEL_INDICATOR_COMPLETE:
-			if(read_data(sdi, cb_data, scpi, devc, 1) == SR_OK)
-				devc->state = WAIT_FOR_TRANSFER_OF_RESERVED_DATA_COMPLETE;
-			break;
-		case WAIT_FOR_TRANSFER_OF_RESERVED_DATA_COMPLETE:
-			if(read_data(sdi, cb_data, scpi, devc, 3) == SR_OK)
-				devc->state = WAIT_FOR_TRANSFER_OF_CHANNEL_DATA_COMPLETE;
-			break;
-		case WAIT_FOR_TRANSFER_OF_CHANNEL_DATA_COMPLETE:
-			if(read_data(sdi, cb_data, 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.");
+			volts_per_division = g_ascii_strtod(response, &end_ptr);
+			if (strcmp(end_ptr, "mV") == 0)
+				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);
+
+			/* Convert data */
+			for (i = 0; i < num_samples; i++)
+				samples[i] = ((float) ((int16_t) (RB16(&devc->rcv_buffer[i*2])))) / 256. * VERTICAL_DIVISIONS * volts_per_division;
+
+			/* Fill frame */
+			analog.channels = g_slist_append(NULL, g_slist_nth_data(sdi->channels, devc->cur_acq_channel));
+			analog.num_samples = num_samples;
+			analog.data = samples;
+			analog.mq = SR_MQ_VOLTAGE;
+			analog.unit = SR_UNIT_VOLT;
+			analog.mqflags = 0;
+			packet.type = SR_DF_ANALOG;
+			packet.payload = &analog;
+			sr_session_send(cb_data, &packet);
+			g_slist_free(analog.channels);
+
+			/* All channels acquired. */
+			if (devc->cur_acq_channel == ANALOG_CHANNELS - 1) {
+				sr_spew("All channels acquired.");
+				
+				/* All frames accquired. */
+				if (devc->cur_acq_frame == devc->frame_limit - 1) {
+					sr_spew("All frames acquired.");
+					
 					sdi->driver->dev_acquisition_stop(sdi, cb_data);
 					return TRUE;
 				}
-				volts_per_division = g_ascii_strtod(response, &end_ptr);
-				if(strcmp(end_ptr, "mV") == 0)
-					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);
-				
-				/* Convert data */
-				for(i = 0; i < num_samples; i++)
-					samples[i] = ((float) ((int16_t) (RB16(&devc->rcv_buffer[i*2])))) / 256. * VERTICAL_DIVISIONS * volts_per_division;
-				
-				/* Fill frame */
-				analog.channels = g_slist_append(NULL, g_slist_nth_data(sdi->channels, devc->cur_acq_channel));
-				analog.num_samples = num_samples;
-				analog.data = samples;
-				analog.mq = SR_MQ_VOLTAGE;
-				analog.unit = SR_UNIT_VOLT;
-				analog.mqflags = 0;
-				packet.type = SR_DF_ANALOG;
-				packet.payload = &analog;
-				sr_session_send(cb_data, &packet);
-				g_slist_free(analog.channels);
-					
-				/* All channels acquired. */
-				if(devc->cur_acq_channel == ANALOG_CHANNELS - 1) {
-					sr_spew("All channels acquired.");
-					
-					/* All frames accquired. */
-					if(devc->cur_acq_frame == devc->frame_limit - 1) {
-						sr_spew("All frames acquired.");
+				/* Start acquiring next frame. */
+				else {
+					if (devc->df_started) {
+						packet.type = SR_DF_FRAME_END;
+						sr_session_send(sdi, &packet);
 						
-						sdi->driver->dev_acquisition_stop(sdi, cb_data);
-						return TRUE;
-					}
-					/* Start acquiring next frame. */
-					else {
-						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_AQUISITION;
+						packet.type = SR_DF_FRAME_BEGIN;
+						sr_session_send(sdi, &packet);
 					}
+	
+					devc->cur_acq_frame++;
+					devc->state = START_ACQUISITION;
 				}
-				/* Start acquiring next channel. */
-				else {
-					devc->state = START_TRANSFER_OF_CHANNEL_DATA;
-					devc->cur_acq_channel++;
-					return TRUE;
-				}
 			}
-			break;
+			/* Start acquiring next channel. */
+			else {
+				devc->state = START_TRANSFER_OF_CHANNEL_DATA;
+				devc->cur_acq_channel++;
+				return TRUE;
+			}
+		}
+		break;
 	}
 
 	return TRUE;
diff --git a/src/hardware/gwinstek-gds-800/protocol.h b/src/hardware/gwinstek-gds-800/protocol.h
index e312dac..b846ac3 100644
--- a/src/hardware/gwinstek-gds-800/protocol.h
+++ b/src/hardware/gwinstek-gds-800/protocol.h
@@ -28,14 +28,12 @@
 
 #define LOG_PREFIX "gwinstek-gds-800"
 
-#define ANALOG_CHANNELS 2
-#define VERTICAL_DIVISIONS 10
 #define MAX_SAMPLES 125000
 #define MAX_RCV_BUFFER_SIZE (MAX_SAMPLES*2)
 
 enum gds_state
 {
-	START_AQUISITION,
+	START_ACQUISITION,
 	START_TRANSFER_OF_CHANNEL_DATA,
 	WAIT_FOR_TRANSFER_OF_BEGIN_TRANSMISSION_COMPLETE,
 	WAIT_FOR_TRANSFER_OF_DATA_SIZE_DIGIT_COMPLETE,
@@ -49,8 +47,8 @@ enum gds_state
 /** Private, per-device-instance driver context. */
 struct dev_context {
 	enum  gds_state state;
-	guint64  cur_acq_frame;
-	guint64  frame_limit;
+	uint64_t cur_acq_frame;
+	uint64_t frame_limit;
 	int      cur_acq_channel;
 	int      cur_rcv_buffer_position;
 	char     rcv_buffer[MAX_RCV_BUFFER_SIZE];
-- 
2.3.6

------------------------------------------------------------------------------
_______________________________________________
sigrok-devel mailing list
sigrok-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/sigrok-devel

Reply via email to