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);