]> sigrok.org Git - libsigrok.git/blobdiff - src/hardware/hameg-hmo/protocol.c
hameg-hmo: free memory that was allocated by SCPI get routines
[libsigrok.git] / src / hardware / hameg-hmo / protocol.c
index 457fb86bc28011f6238c9f2a846e0cf62b017f75..26dac0cb037f34de3a8e370bc2d74a99285a799d 100644 (file)
@@ -117,7 +117,7 @@ static const char *rohde_schwarz_log_not_pod_scpi_dialect[] = {
 static const uint32_t devopts[] = {
        SR_CONF_OSCILLOSCOPE,
        SR_CONF_LIMIT_SAMPLES | SR_CONF_SET,
-       SR_CONF_LIMIT_FRAMES | SR_CONF_SET,
+       SR_CONF_LIMIT_FRAMES | SR_CONF_GET | SR_CONF_SET,
        SR_CONF_SAMPLERATE | SR_CONF_GET,
        SR_CONF_TIMEBASE | SR_CONF_GET | SR_CONF_SET | SR_CONF_LIST,
        SR_CONF_NUM_HDIV | SR_CONF_GET,
@@ -1380,8 +1380,6 @@ SR_PRIV int hmo_receive_data(int fd, int revents, void *cb_data)
        (void)fd;
        (void)revents;
 
-       data = NULL;
-
        if (!(sdi = cb_data))
                return TRUE;
 
@@ -1402,16 +1400,15 @@ SR_PRIV int hmo_receive_data(int fd, int revents, void *cb_data)
         * Send "frame begin" packet upon reception of data for the
         * first enabled channel.
         */
-       if (devc->current_channel == devc->enabled_channels) {
-               packet.type = SR_DF_FRAME_BEGIN;
-               sr_session_send(sdi, &packet);
-       }
+       if (devc->current_channel == devc->enabled_channels)
+               std_session_send_df_frame_begin(sdi);
 
        /*
         * Pass on the received data of the channel(s).
         */
        switch (ch->type) {
        case SR_CHANNEL_ANALOG:
+               data = NULL;
                if (sr_scpi_get_block(sdi->conn, NULL, &data) != SR_OK) {
                        if (data)
                                g_byte_array_free(data, TRUE);
@@ -1425,25 +1422,9 @@ SR_PRIV int hmo_receive_data(int fd, int revents, void *cb_data)
                /* Truncate acquisition if a smaller number of samples has been requested. */
                if (devc->samples_limit > 0 && analog.num_samples > devc->samples_limit)
                        analog.num_samples = devc->samples_limit;
-               analog.encoding = &encoding;
-               analog.meaning = &meaning;
-               analog.spec = &spec;
-
-               encoding.unitsize = sizeof(float);
-               encoding.is_signed = TRUE;
-               encoding.is_float = TRUE;
-#ifdef WORDS_BIGENDIAN
-               encoding.is_bigendian = TRUE;
-#else
-               encoding.is_bigendian = FALSE;
-#endif
                /* TODO: Use proper 'digits' value for this device (and its modes). */
-               encoding.digits = 2;
-               encoding.is_digits_decimal = FALSE;
-               encoding.scale.p = 1;
-               encoding.scale.q = 1;
-               encoding.offset.p = 0;
-               encoding.offset.q = 1;
+               sr_analog_init(&analog, &encoding, &meaning, &spec, 2);
+               encoding.is_signed = TRUE;
                if (state->analog_channels[ch->index].probe_unit == 'V') {
                        meaning.mq = SR_MQ_VOLTAGE;
                        meaning.unit = SR_UNIT_VOLT;
@@ -1451,10 +1432,7 @@ SR_PRIV int hmo_receive_data(int fd, int revents, void *cb_data)
                        meaning.mq = SR_MQ_CURRENT;
                        meaning.unit = SR_UNIT_AMPERE;
                }
-               meaning.mqflags = 0;
                meaning.channels = g_slist_append(NULL, ch);
-               /* TODO: Use proper 'digits' value for this device (and its modes). */
-               spec.spec_digits = 2;
                packet.payload = &analog;
                sr_session_send(sdi, &packet);
                devc->num_samples = data->len / sizeof(float);
@@ -1463,6 +1441,7 @@ SR_PRIV int hmo_receive_data(int fd, int revents, void *cb_data)
                data = NULL;
                break;
        case SR_CHANNEL_LOGIC:
+               data = NULL;
                if (sr_scpi_get_block(sdi->conn, NULL, &data) != SR_OK) {
                        if (data)
                                g_byte_array_free(data, TRUE);
@@ -1526,8 +1505,7 @@ SR_PRIV int hmo_receive_data(int fd, int revents, void *cb_data)
         */
        hmo_cleanup_logic_data(devc);
 
-       packet.type = SR_DF_FRAME_END;
-       sr_session_send(sdi, &packet);
+       std_session_send_df_frame_end(sdi);
 
        /*
         * End of frame was reached. Stop acquisition after the specified