sr_err("Unknown quantity 0x%03x.", is_secondary << 8 | buf[0]);
- return -1;
+ return 0;
}
-static float parse_value(const uint8_t *buf)
+static float parse_value(const uint8_t *buf, int *digits)
{
- static const float decimals[] = {
- 1, 1e-1, 1e-2, 1e-3, 1e-4, 1e-5, 1e-6, 1e-7
- };
+ static const int exponents[] = {0, -1, -2, -3, -4, -5, -6, -7};
+ int exponent;
int16_t val;
+ exponent = exponents[buf[3] & 7];
+ *digits = -exponent;
val = (buf[1] << 8) | buf[2];
- return (float)val * decimals[buf[3] & 7];
+ return (float)val * powf(10, exponent);
}
static void parse_measurement(const uint8_t *pkt, float *floatval,
- struct sr_datafeed_analog_old *analog,
+ struct sr_datafeed_analog *analog,
int is_secondary)
{
static const struct {
int unit;
- float mult;
+ int exponent;
} units[] = {
- { SR_UNIT_UNITLESS, 1 }, /* no unit */
- { SR_UNIT_OHM, 1 }, /* Ohm */
- { SR_UNIT_OHM, 1e3 }, /* kOhm */
- { SR_UNIT_OHM, 1e6 }, /* MOhm */
- { -1, 0 }, /* ??? */
- { SR_UNIT_HENRY, 1e-6 }, /* uH */
- { SR_UNIT_HENRY, 1e-3 }, /* mH */
- { SR_UNIT_HENRY, 1 }, /* H */
- { SR_UNIT_HENRY, 1e3 }, /* kH */
- { SR_UNIT_FARAD, 1e-12 }, /* pF */
- { SR_UNIT_FARAD, 1e-9 }, /* nF */
- { SR_UNIT_FARAD, 1e-6 }, /* uF */
- { SR_UNIT_FARAD, 1e-3 }, /* mF */
- { SR_UNIT_PERCENTAGE, 1 }, /* % */
- { SR_UNIT_DEGREE, 1 } /* degree */
+ { SR_UNIT_UNITLESS, 0 }, /* no unit */
+ { SR_UNIT_OHM, 0 }, /* Ohm */
+ { SR_UNIT_OHM, 3 }, /* kOhm */
+ { SR_UNIT_OHM, 6 }, /* MOhm */
+ { -1, 0 }, /* ??? */
+ { SR_UNIT_HENRY, -6 }, /* uH */
+ { SR_UNIT_HENRY, -3 }, /* mH */
+ { SR_UNIT_HENRY, 0 }, /* H */
+ { SR_UNIT_HENRY, 3 }, /* kH */
+ { SR_UNIT_FARAD, -12 }, /* pF */
+ { SR_UNIT_FARAD, -9 }, /* nF */
+ { SR_UNIT_FARAD, -6 }, /* uF */
+ { SR_UNIT_FARAD, -3 }, /* mF */
+ { SR_UNIT_PERCENTAGE, 0 }, /* % */
+ { SR_UNIT_DEGREE, 0 }, /* degree */
};
const uint8_t *buf;
+ int digits, exponent;
int state;
buf = pkt_to_buf(pkt, is_secondary);
- analog->mq = -1;
- analog->mqflags = 0;
+ analog->meaning->mq = 0;
+ analog->meaning->mqflags = 0;
state = buf[4] & 0xf;
if (!is_secondary) {
if (pkt[2] & 0x01)
- analog->mqflags |= SR_MQFLAG_HOLD;
+ analog->meaning->mqflags |= SR_MQFLAG_HOLD;
if (pkt[2] & 0x02)
- analog->mqflags |= SR_MQFLAG_REFERENCE;
+ analog->meaning->mqflags |= SR_MQFLAG_REFERENCE;
} else {
if (pkt[2] & 0x04)
- analog->mqflags |= SR_MQFLAG_RELATIVE;
+ analog->meaning->mqflags |= SR_MQFLAG_RELATIVE;
}
- if ((analog->mq = parse_mq(pkt, is_secondary, pkt[2] & 0x80)) < 0)
+ if ((analog->meaning->mq = parse_mq(pkt, is_secondary, pkt[2] & 0x80)) < 0)
return;
if ((buf[3] >> 3) >= ARRAY_SIZE(units)) {
sr_err("Unknown unit %u.", buf[3] >> 3);
- analog->mq = -1;
+ analog->meaning->mq = 0;
return;
}
- analog->unit = units[buf[3] >> 3].unit;
+ analog->meaning->unit = units[buf[3] >> 3].unit;
- *floatval = parse_value(buf);
- *floatval *= (state == 0) ? units[buf[3] >> 3].mult : INFINITY;
+ exponent = units[buf[3] >> 3].exponent;
+ *floatval = parse_value(buf, &digits);
+ *floatval *= (state == 0) ? powf(10, exponent) : INFINITY;
+ analog->encoding->digits = digits - exponent;
+ analog->spec->spec_digits = digits - exponent;
}
static unsigned int parse_freq(const uint8_t *pkt)
static void handle_packet(struct sr_dev_inst *sdi, const uint8_t *pkt)
{
struct sr_datafeed_packet packet;
- struct sr_datafeed_analog_old analog;
+ struct sr_datafeed_analog analog;
+ struct sr_analog_encoding encoding;
+ struct sr_analog_meaning meaning;
+ struct sr_analog_spec spec;
struct dev_context *devc;
unsigned int val;
float floatval;
frame = FALSE;
- memset(&analog, 0, sizeof(analog));
+ /* Note: digits/spec_digits will be overridden later. */
+ sr_analog_init(&analog, &encoding, &meaning, &spec, 0);
analog.num_samples = 1;
analog.data = &floatval;
- analog.channels = g_slist_append(NULL, sdi->channels->data);
+ analog.meaning->channels = g_slist_append(NULL, sdi->channels->data);
parse_measurement(pkt, &floatval, &analog, 0);
- if (analog.mq >= 0) {
+ if (analog.meaning->mq != 0) {
if (!frame) {
packet.type = SR_DF_FRAME_BEGIN;
sr_session_send(sdi, &packet);
frame = TRUE;
}
- packet.type = SR_DF_ANALOG_OLD;
+ packet.type = SR_DF_ANALOG;
packet.payload = &analog;
sr_session_send(sdi, &packet);
}
- g_slist_free(analog.channels);
- analog.channels = g_slist_append(NULL, sdi->channels->next->data);
+ g_slist_free(analog.meaning->channels);
+ analog.meaning->channels = g_slist_append(NULL, sdi->channels->next->data);
parse_measurement(pkt, &floatval, &analog, 1);
- if (analog.mq >= 0) {
+ if (analog.meaning->mq != 0) {
if (!frame) {
packet.type = SR_DF_FRAME_BEGIN;
sr_session_send(sdi, &packet);
frame = TRUE;
}
- packet.type = SR_DF_ANALOG_OLD;
+ packet.type = SR_DF_ANALOG;
packet.payload = &analog;
sr_session_send(sdi, &packet);
}
- g_slist_free(analog.channels);
+ g_slist_free(analog.meaning->channels);
if (frame) {
packet.type = SR_DF_FRAME_END;
dev_limit_counter_start(&devc->frame_count);
dev_time_counter_start(&devc->time_count);
- std_session_send_df_header(sdi, LOG_PREFIX);
+ std_session_send_df_header(sdi);
/* Poll every 50ms, or whenever some data comes in. */
serial = sdi->conn;
return SR_OK;
}
-
-SR_PRIV int es51919_serial_acquisition_stop(struct sr_dev_inst *sdi)
-{
- return std_serial_dev_acquisition_stop(sdi,
- std_serial_dev_close, sdi->conn, LOG_PREFIX);
-}