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 {