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.
This commit is contained in:
Gerhard Sittig 2016-12-30 23:46:27 +01:00 committed by Uwe Hermann
parent 74413fafb4
commit d431e4ec28
3 changed files with 23 additions and 1 deletions

View 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;

View 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. */

View 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 {