hameg-hmo: Fix array_float_get() and also use it for the time base

This commit is contained in:
Soeren Apel 2016-01-29 21:35:16 +01:00
parent fe227d17ae
commit 8cccbac8da
1 changed files with 25 additions and 14 deletions

View File

@ -355,7 +355,7 @@ static int scope_state_get_array_option(struct sr_scpi_dev_inst *scpi,
static int array_float_get(gchar *value, const uint64_t array[][2], static int array_float_get(gchar *value, const uint64_t array[][2],
int array_len, unsigned int *result) int array_len, unsigned int *result)
{ {
int i; int i, pos, e;
uint64_t f; uint64_t f;
float s; float s;
unsigned int s_int; unsigned int s_int;
@ -364,16 +364,20 @@ static int array_float_get(gchar *value, const uint64_t array[][2],
memset(ss, 0, sizeof(ss)); memset(ss, 0, sizeof(ss));
memset(es, 0, sizeof(es)); memset(es, 0, sizeof(es));
strncpy(ss, value, 5); /* Get index of the separating 'E' character and break up the string. */
strncpy(es, &(value[6]), 3); pos = (int)g_strstr_len(value, strlen(value), "E");
pos -= (int)value;
strncpy(ss, value, pos);
strncpy(es, &(value[pos+1]), 3);
if (sr_atof_ascii(ss, &s) != SR_OK) if (sr_atof_ascii(ss, &s) != SR_OK)
return SR_ERR; return SR_ERR;
if (sr_atoi(es, &i) != SR_OK) if (sr_atoi(es, &e) != SR_OK)
return SR_ERR; return SR_ERR;
/* Transform e.g. 10^-03 to 1000 as the array stores the inverse. */ /* Transform e.g. 10^-03 to 1000 as the array stores the inverse. */
f = pow(10, abs(i)); f = pow(10, abs(e));
/* /*
* Adjust the significand/factor pair to make sure * Adjust the significand/factor pair to make sure
@ -381,7 +385,11 @@ static int array_float_get(gchar *value, const uint64_t array[][2],
*/ */
while ((int)fmod(log10(f), 3) > 0) { while ((int)fmod(log10(f), 3) > 0) {
s *= 10; s *= 10;
if (e < 0)
f *= 10; f *= 10;
else
f /= 10;
} }
/* Truncate s to circumvent rounding errors. */ /* Truncate s to circumvent rounding errors. */
@ -550,6 +558,7 @@ SR_PRIV int hmo_scope_state_get(struct sr_dev_inst *sdi)
const struct scope_config *config; const struct scope_config *config;
float tmp_float; float tmp_float;
unsigned int i; unsigned int i;
char *tmp_str;
devc = sdi->priv; devc = sdi->priv;
config = devc->model_config; config = devc->model_config;
@ -568,18 +577,20 @@ SR_PRIV int hmo_scope_state_get(struct sr_dev_inst *sdi)
&tmp_float) != SR_OK) &tmp_float) != SR_OK)
return SR_ERR; return SR_ERR;
for (i = 0; i < config->num_timebases; i++) { if (sr_scpi_get_string(sdi->conn,
if (tmp_float == ((float) (*config->timebases)[i][0] / (*config->scpi_dialect)[SCPI_CMD_GET_TIMEBASE],
(*config->timebases)[i][1])) { &tmp_str) != SR_OK)
state->timebase = i; return SR_ERR;
break;
} if (array_float_get(tmp_str, hmo_timebases, ARRAY_SIZE(hmo_timebases),
} &i) != SR_OK) {
if (i == config->num_timebases) { g_free(tmp_str);
sr_err("Could not determine array index for time base."); sr_err("Could not determine array index for time base.");
return SR_ERR; return SR_ERR;
} }
state->timebase = i;
if (sr_scpi_get_float(sdi->conn, if (sr_scpi_get_float(sdi->conn,
(*config->scpi_dialect)[SCPI_CMD_GET_HORIZ_TRIGGERPOS], (*config->scpi_dialect)[SCPI_CMD_GET_HORIZ_TRIGGERPOS],
&tmp_float) != SR_OK) &tmp_float) != SR_OK)