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:
parent
74413fafb4
commit
d431e4ec28
|
@ -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;
|
||||
|
|
|
@ -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. */
|
||||
|
|
|
@ -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 {
|
||||
|
|
Loading…
Reference in New Issue