From: poljar (Damir Jelić) Date: Fri, 1 Nov 2013 19:40:04 +0000 (+0100) Subject: scpi: Add function to get an array of floats. X-Git-Tag: libsigrok-0.3.0~510 X-Git-Url: https://sigrok.org/gitaction?a=commitdiff_plain;h=8acbb89a1dd38f15e53c5a46c226c074db5c4efa;p=libsigrok.git scpi: Add function to get an array of floats. This patch adds a function to read and parse a SCPI response which contains a comma-separated list of floating-point numbers (e.g. "1.0e-5,2.0e-4,3.0e-3"). This is particularly useful if the instrument sends analog measurement data in this format. --- diff --git a/hardware/common/scpi.c b/hardware/common/scpi.c index b29e14ba..d9b8def9 100644 --- a/hardware/common/scpi.c +++ b/hardware/common/scpi.c @@ -332,6 +332,65 @@ SR_PRIV int sr_scpi_get_opc(struct sr_serial_dev_inst *serial) return SR_ERR; } +/** + * Send a SCPI command, read the reply, parse it as comma separated list of + * floats and store the as an result in scpi_response. + * + * @param serial Previously initialized serial port structure. + * @param command The SCPI command to send to the device (can be NULL). + * @param scpi_response Pointer where to store the parsed result. + * + * @return SR_OK upon successfully parsing all values, SR_ERR upon a parsing + * error or upon no response. The allocated response must be freed by the caller + * in the case of an SR_OK as well as in the case of parsing error. + */ +SR_PRIV int sr_scpi_get_floatv(struct sr_serial_dev_inst *serial, + const char *command, GArray **scpi_response) +{ + int ret; + float tmp; + char *response; + + gchar **ptr; + gchar **tokens; + GArray *response_array; + + ret = SR_OK; + response = NULL; + tokens = NULL; + + if (sr_scpi_get_string(serial, command, &response) != SR_OK) + if (!response) + return SR_ERR; + + tokens = g_strsplit(response, ",", 0); + ptr = tokens; + + response_array = g_array_sized_new(TRUE, FALSE, sizeof(float), 256); + + while(*ptr) { + if (sr_atof(*ptr, &tmp) == SR_OK) + response_array = g_array_append_val(response_array, + tmp); + else + ret = SR_ERR; + + ptr++; + } + g_strfreev(tokens); + g_free(response); + + if (ret == SR_ERR && response_array->len == 0) { + g_array_free(response_array, TRUE); + *scpi_response = NULL; + return SR_ERR; + } + + *scpi_response = response_array; + + return ret; +} + /** * Send the *IDN? SCPI command, receive the reply, parse it and store the * reply as a sr_scpi_hw_info structure in the supplied scpi_response pointer. diff --git a/libsigrok-internal.h b/libsigrok-internal.h index b8a3fde5..52962fd6 100644 --- a/libsigrok-internal.h +++ b/libsigrok-internal.h @@ -289,6 +289,8 @@ SR_PRIV int sr_scpi_get_float(struct sr_serial_dev_inst *serial, SR_PRIV int sr_scpi_get_double(struct sr_serial_dev_inst *serial, const char *command, double *scpi_response); SR_PRIV int sr_scpi_get_opc(struct sr_serial_dev_inst *serial); +SR_PRIV int sr_scpi_get_floatv(struct sr_serial_dev_inst *serial, + const char *command, GArray **scpi_response); SR_PRIV int sr_scpi_get_hw_id(struct sr_serial_dev_inst *serial, struct sr_scpi_hw_info **scpi_reponse); SR_PRIV void sr_scpi_hw_info_free(struct sr_scpi_hw_info *hw_info);