From: Gerhard Sittig Date: Fri, 30 Dec 2016 22:46:27 +0000 (+0100) Subject: hameg-hmo: Support BE format for SCPI sample downloads X-Git-Tag: libsigrok-0.5.0~156 X-Git-Url: https://sigrok.org/gitweb/?p=libsigrok.git;a=commitdiff_plain;h=d431e4ec28d5d168bc0d98d5545a585b89d52e8d hameg-hmo: Support BE format for SCPI sample downloads 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. --- diff --git a/src/hardware/hameg-hmo/protocol.c b/src/hardware/hameg-hmo/protocol.c index 528d7b04..99a30acd 100644 --- a/src/hardware/hameg-hmo/protocol.c +++ b/src/hardware/hameg-hmo/protocol.c @@ -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; diff --git a/src/hardware/hameg-hmo/protocol.h b/src/hardware/hameg-hmo/protocol.h index 6219ed63..c42aa98a 100644 --- a/src/hardware/hameg-hmo/protocol.h +++ b/src/hardware/hameg-hmo/protocol.h @@ -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. */ diff --git a/src/scpi.h b/src/scpi.h index e9e7084b..bafdbe62 100644 --- a/src/scpi.h +++ b/src/scpi.h @@ -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 {