]> sigrok.org Git - libsigrok.git/commitdiff
scpi: Add function to get an array of floats.
authorpoljar (Damir Jelić) <redacted>
Fri, 1 Nov 2013 19:40:04 +0000 (20:40 +0100)
committerUwe Hermann <redacted>
Tue, 3 Dec 2013 14:10:01 +0000 (15:10 +0100)
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.

hardware/common/scpi.c
libsigrok-internal.h

index b29e14ba61336514c0b40cbbe5daeeed1c9a7a8f..d9b8def94c8a2627a64b26f18733c9bb0b9c108a 100644 (file)
@@ -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.
index b8a3fde505dbf3cedeb9e8e7d4276644482d6798..52962fd61cebc189964702db4919c987429d71a2 100644 (file)
@@ -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);