char *e, *u;
gboolean is_oor;
int digits;
+ int exponent;
+ enum sr_mq mq;
+ enum sr_unit unit;
+ enum sr_mqflag mqflags;
devc = sdi->priv;
while (*e && *e == ' ')
e++;
- sr_analog_init(&analog, &encoding, &meaning, &spec, digits);
- analog.data = &fvalue;
- analog.meaning->channels = sdi->channels;
- analog.num_samples = 1;
if (is_oor)
fvalue = NAN;
- analog.meaning->mq = 0;
+ mq = 0;
+ unit = 0;
+ exponent = 0;
+ mqflags = 0;
if ((u = strstr(e, "V DC")) || (u = strstr(e, "V AC"))) {
- analog.meaning->mq = SR_MQ_VOLTAGE;
- analog.meaning->unit = SR_UNIT_VOLT;
+ mq = SR_MQ_VOLTAGE;
+ unit = SR_UNIT_VOLT;
if (!is_oor && e[0] == 'm')
- fvalue /= 1000;
+ exponent = -3;
/* This catches "V AC", "V DC" and "V AC+DC". */
if (strstr(u, "AC"))
- analog.meaning->mqflags |= SR_MQFLAG_AC | SR_MQFLAG_RMS;
+ mqflags |= SR_MQFLAG_AC | SR_MQFLAG_RMS;
if (strstr(u, "DC"))
- analog.meaning->mqflags |= SR_MQFLAG_DC;
+ mqflags |= SR_MQFLAG_DC;
} else if ((u = strstr(e, "dBV")) || (u = strstr(e, "dBm"))) {
- analog.meaning->mq = SR_MQ_VOLTAGE;
+ mq = SR_MQ_VOLTAGE;
if (u[2] == 'm')
- analog.meaning->unit = SR_UNIT_DECIBEL_MW;
+ unit = SR_UNIT_DECIBEL_MW;
else
- analog.meaning->unit = SR_UNIT_DECIBEL_VOLT;
- analog.meaning->mqflags |= SR_MQFLAG_AC | SR_MQFLAG_RMS;
+ unit = SR_UNIT_DECIBEL_VOLT;
+ mqflags |= SR_MQFLAG_AC | SR_MQFLAG_RMS;
} else if ((u = strstr(e, "Ohms"))) {
- analog.meaning->mq = SR_MQ_RESISTANCE;
- analog.meaning->unit = SR_UNIT_OHM;
+ mq = SR_MQ_RESISTANCE;
+ unit = SR_UNIT_OHM;
if (is_oor)
fvalue = INFINITY;
else if (e[0] == 'k')
- fvalue *= 1000;
+ exponent = 3;
else if (e[0] == 'M')
- fvalue *= 1000000;
+ exponent = 6;
} else if (!strcmp(e, "nS")) {
- analog.meaning->mq = SR_MQ_CONDUCTANCE;
- analog.meaning->unit = SR_UNIT_SIEMENS;
- *((float *)analog.data) /= 1e+9;
+ mq = SR_MQ_CONDUCTANCE;
+ unit = SR_UNIT_SIEMENS;
+ exponent = -9;
} else if ((u = strstr(e, "Farads"))) {
- analog.meaning->mq = SR_MQ_CAPACITANCE;
- analog.meaning->unit = SR_UNIT_FARAD;
+ mq = SR_MQ_CAPACITANCE;
+ unit = SR_UNIT_FARAD;
if (!is_oor) {
if (e[0] == 'm')
- fvalue /= 1e+3;
+ exponent = -3;
else if (e[0] == 'u')
- fvalue /= 1e+6;
+ exponent = -6;
else if (e[0] == 'n')
- fvalue /= 1e+9;
+ exponent = -9;
}
} else if ((u = strstr(e, "Deg C")) || (u = strstr(e, "Deg F"))) {
- analog.meaning->mq = SR_MQ_TEMPERATURE;
+ mq = SR_MQ_TEMPERATURE;
if (u[4] == 'C')
- analog.meaning->unit = SR_UNIT_CELSIUS;
+ unit = SR_UNIT_CELSIUS;
else
- analog.meaning->unit = SR_UNIT_FAHRENHEIT;
+ unit = SR_UNIT_FAHRENHEIT;
} else if ((u = strstr(e, "A AC")) || (u = strstr(e, "A DC"))) {
- analog.meaning->mq = SR_MQ_CURRENT;
- analog.meaning->unit = SR_UNIT_AMPERE;
+ mq = SR_MQ_CURRENT;
+ unit = SR_UNIT_AMPERE;
/* This catches "A AC", "A DC" and "A AC+DC". */
if (strstr(u, "AC"))
- analog.meaning->mqflags |= SR_MQFLAG_AC | SR_MQFLAG_RMS;
+ mqflags |= SR_MQFLAG_AC | SR_MQFLAG_RMS;
if (strstr(u, "DC"))
- analog.meaning->mqflags |= SR_MQFLAG_DC;
+ mqflags |= SR_MQFLAG_DC;
if (!is_oor) {
if (e[0] == 'm')
- fvalue /= 1e+3;
+ exponent = -3;
else if (e[0] == 'u')
- fvalue /= 1e+6;
+ exponent = -6;
}
} else if ((u = strstr(e, "Hz"))) {
- analog.meaning->mq = SR_MQ_FREQUENCY;
- analog.meaning->unit = SR_UNIT_HERTZ;
+ mq = SR_MQ_FREQUENCY;
+ unit = SR_UNIT_HERTZ;
if (e[0] == 'k')
- fvalue *= 1e+3;
+ exponent = 3;
} else if (!strcmp(e, "%")) {
- analog.meaning->mq = SR_MQ_DUTY_CYCLE;
- analog.meaning->unit = SR_UNIT_PERCENTAGE;
+ mq = SR_MQ_DUTY_CYCLE;
+ unit = SR_UNIT_PERCENTAGE;
} else if ((u = strstr(e, "ms"))) {
- analog.meaning->mq = SR_MQ_PULSE_WIDTH;
- analog.meaning->unit = SR_UNIT_SECOND;
- fvalue /= 1e+3;
+ mq = SR_MQ_PULSE_WIDTH;
+ unit = SR_UNIT_SECOND;
+ exponent = -3;
}
- if (analog.meaning->mq != 0) {
+ if (mq != 0) {
/* Got a measurement. */
+ digits -= exponent;
+ fvalue *= pow(10.0f, exponent);
+
+ sr_analog_init(&analog, &encoding, &meaning, &spec, digits);
+ analog.data = &fvalue;
+ analog.num_samples = 1;
+ analog.meaning->unit = unit;
+ analog.meaning->mq = mq;
+ analog.meaning->mqflags = mqflags;
+ analog.meaning->channels = sdi->channels;
+
packet.type = SR_DF_ANALOG;
packet.payload = &analog;
sr_session_send(sdi, &packet);