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.
This commit is contained in:
parent
f5922adef5
commit
8acbb89a1d
|
@ -332,6 +332,65 @@ SR_PRIV int sr_scpi_get_opc(struct sr_serial_dev_inst *serial)
|
||||||
return SR_ERR;
|
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
|
* 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.
|
* reply as a sr_scpi_hw_info structure in the supplied scpi_response pointer.
|
||||||
|
|
|
@ -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,
|
SR_PRIV int sr_scpi_get_double(struct sr_serial_dev_inst *serial,
|
||||||
const char *command, double *scpi_response);
|
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_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,
|
SR_PRIV int sr_scpi_get_hw_id(struct sr_serial_dev_inst *serial,
|
||||||
struct sr_scpi_hw_info **scpi_reponse);
|
struct sr_scpi_hw_info **scpi_reponse);
|
||||||
SR_PRIV void sr_scpi_hw_info_free(struct sr_scpi_hw_info *hw_info);
|
SR_PRIV void sr_scpi_hw_info_free(struct sr_scpi_hw_info *hw_info);
|
||||||
|
|
Loading…
Reference in New Issue