]> sigrok.org Git - libsigrok.git/commitdiff
hameg-hmo: Support BE format for SCPI sample downloads
authorGerhard Sittig <redacted>
Fri, 30 Dec 2016 22:46:27 +0000 (23:46 +0100)
committerUwe Hermann <redacted>
Sat, 7 Jan 2017 14:51:46 +0000 (15:51 +0100)
When the channel state is retrieved, query the pre-set byteorder for
SCPI data blocks as well. When samples get retrieved during capture,
support float representations in either big or little endian format.

This commit unbreaks devices which operate in BE format by default
(tested with HMO2524). It keeps working with LE format as before. For
devices which don't support the byteorder query or return unknown
responses, LE format is assumed for backwards compatibility. The
device's byteorder is only queried and never set. This makes the
commit least intrusive.

src/hardware/hameg-hmo/protocol.c
src/hardware/hameg-hmo/protocol.h
src/scpi.h

index 528d7b04295dac4eda31220d537c71ac614e35af..99a30acd75dd8ec21af14235be879732d87ea87b 100644 (file)
@@ -48,6 +48,7 @@ static const char *hameg_scpi_dialect[] = {
        [SCPI_CMD_GET_ANALOG_CHAN_STATE]    = ":CHAN%d:STAT?",
        [SCPI_CMD_SET_ANALOG_CHAN_STATE]    = ":CHAN%d:STAT %d",
        [SCPI_CMD_GET_PROBE_UNIT]           = ":PROB%d:SET:ATT:UNIT?",
+       [SCPI_CMD_GET_BYTE_ORDER]           = ":FORM:BORD?",
 };
 
 static const uint32_t hmo_devopts[] = {
@@ -495,6 +496,22 @@ static int analog_channel_state_get(struct sr_scpi_dev_inst *scpi,
                g_free(tmp_str);
        }
 
+       /*
+        * Determine the byte order which will be used for data blocks.
+        * A ":FORM:BORD?" request will yield either an "MSBF" or "LSBF"
+        * response.
+        */
+       state->byteorder = '?';
+       if (sr_scpi_get_string(scpi,
+                              (*config->scpi_dialect)[SCPI_CMD_GET_BYTE_ORDER],
+                              &tmp_str) != SR_OK)
+               return SR_ERR;
+       if (tmp_str[0] == 'M')
+               state->byteorder = 'b';
+       else if (tmp_str[0] == 'L')
+               state->byteorder = 'l';
+       g_free(tmp_str);
+
        return SR_OK;
 }
 
@@ -821,7 +838,8 @@ SR_PRIV int hmo_receive_data(int fd, int revents, void *cb_data)
                encoding.unitsize = sizeof(float);
                encoding.is_signed = TRUE;
                encoding.is_float = TRUE;
-               encoding.is_bigendian = FALSE;
+               /* Assume LE format when unknown for backwards compat. */
+               encoding.is_bigendian = (state->byteorder == 'b') ? TRUE : FALSE;
                /* TODO: Use proper 'digits' value for this device (and its modes). */
                encoding.digits = 2;
                encoding.is_digits_decimal = FALSE;
index 6219ed635ef048fc014bb43200f1b3b2a79ebd15..c42aa98a6a8fc3a3fcd130c57b0073f4c4d06ed1 100644 (file)
@@ -87,6 +87,9 @@ struct scope_state {
        int trigger_source;
        int trigger_slope;
        uint64_t sample_rate;
+
+       /** SCPI data block byte order. 'l'/'b' when known, '?' otherwise. */
+       char byteorder;
 };
 
 /** Private, per-device-instance driver context. */
index e9e7084ba0876293a572a1a17327de221f4b69bd..bafdbe62314dcd0b55439b27dc1b90661db5c203 100644 (file)
@@ -63,6 +63,7 @@ enum {
        SCPI_CMD_SET_PROBE_UNIT,
        SCPI_CMD_GET_ANALOG_CHAN_NAME,
        SCPI_CMD_GET_DIG_CHAN_NAME,
+       SCPI_CMD_GET_BYTE_ORDER,
 };
 
 struct scpi_command {