X-Git-Url: http://sigrok.org/gitweb/?a=blobdiff_plain;f=src%2Finput%2Fraw_analog.c;h=9c7135f0622aacfd9a6b2177f3ce316f53d66bad;hb=bee2b0168c087676c1b365861d8c2d4714afa9b9;hp=9be40b623287a500ab5837c875ab008dd4aaa75c;hpb=e6b15cb5e609c9263f501d3b12965206feddb42b;p=libsigrok.git diff --git a/src/input/raw_analog.c b/src/input/raw_analog.c index 9be40b62..9c7135f0 100644 --- a/src/input/raw_analog.c +++ b/src/input/raw_analog.c @@ -48,36 +48,31 @@ struct context { }; struct sample_format { - const char const* fmt_name; - // same as struct sr_analog_encoding - uint8_t unitsize; - gboolean is_signed; - gboolean is_float; - gboolean is_bigendian; + const char *fmt_name; + struct sr_analog_encoding encoding; }; -static const struct sample_format const sample_formats[] = +static const struct sample_format sample_formats[] = { - { "S8", 1, TRUE, FALSE, FALSE }, - { "U8", 1, FALSE, FALSE, FALSE }, - { "S16_LE", 2, TRUE, FALSE, FALSE }, - { "U16_LE", 2, FALSE, FALSE, FALSE }, - { "S16_BE", 2, TRUE, FALSE, TRUE }, - { "U16_BE", 2, FALSE, FALSE, TRUE }, - { "S32_LE", 4, TRUE, FALSE, FALSE }, - { "U32_LE", 4, FALSE, FALSE, FALSE }, - { "S32_BE", 4, TRUE, FALSE, TRUE }, - { "U32_BE", 4, FALSE, FALSE, TRUE }, - { "FLOAT_LE", 4, TRUE, TRUE, FALSE }, - { "FLOAT_BE", 4, TRUE, TRUE, TRUE }, - { "FLOAT64_LE", 8, TRUE, TRUE, FALSE }, - { "FLOAT64_BE", 8, TRUE, TRUE, TRUE }, + { "S8", { 1, TRUE, FALSE, FALSE, 0, TRUE, { 1, 128}, { 0, 1}}}, + { "U8", { 1, FALSE, FALSE, FALSE, 0, TRUE, { 1, 255}, {-1, 2}}}, + { "S16_LE", { 2, TRUE, FALSE, FALSE, 0, TRUE, { 1, INT16_MAX + 1}, { 0, 1}}}, + { "U16_LE", { 2, FALSE, FALSE, FALSE, 0, TRUE, { 1, UINT16_MAX}, {-1, 2}}}, + { "S16_BE", { 2, TRUE, FALSE, TRUE, 0, TRUE, { 1, INT16_MAX + 1}, { 0, 1}}}, + { "U16_BE", { 2, FALSE, FALSE, TRUE, 0, TRUE, { 1, UINT16_MAX}, {-1, 2}}}, + { "S32_LE", { 4, TRUE, FALSE, FALSE, 0, TRUE, { 1, (uint64_t)INT32_MAX + 1}, { 0, 1}}}, + { "U32_LE", { 4, FALSE, FALSE, FALSE, 0, TRUE, { 1, UINT32_MAX}, {-1, 2}}}, + { "S32_BE", { 4, TRUE, FALSE, TRUE, 0, TRUE, { 1, (uint64_t)INT32_MAX + 1}, { 0, 1}}}, + { "U32_BE", { 4, FALSE, FALSE, TRUE, 0, TRUE, { 1, UINT32_MAX}, {-1, 2}}}, + { "FLOAT_LE", { 4, TRUE, TRUE, FALSE, 0, TRUE, { 1, 1}, { 0, 1}}}, + { "FLOAT_BE", { 4, TRUE, TRUE, TRUE, 0, TRUE, { 1, 1}, { 0, 1}}}, + { "FLOAT64_LE", { 8, TRUE, TRUE, FALSE, 0, TRUE, { 1, 1}, { 0, 1}}}, + { "FLOAT64_BE", { 8, TRUE, TRUE, TRUE, 0, TRUE, { 1, 1}, { 0, 1}}}, }; static int parse_format_string(const char *format) { - int num_formats = sizeof(sample_formats)/ sizeof(sample_formats[0]); - for (int i = 0; i < num_formats; i++) { + for (unsigned int i = 0; i < ARRAY_SIZE(sample_formats); i++) { if (!strcmp(format, sample_formats[i].fmt_name)) return i; } @@ -96,16 +91,7 @@ static void init_context(struct context *inc, const struct sample_format *fmt, G inc->analog.meaning = &inc->meaning; inc->analog.spec = &inc->spec; - inc->encoding.unitsize = fmt->unitsize; - inc->encoding.is_signed = fmt->is_signed; - inc->encoding.is_float = fmt->is_float; - inc->encoding.is_bigendian = fmt->is_bigendian; - inc->encoding.digits = 0; - inc->encoding.is_digits_decimal = TRUE; - inc->encoding.scale.p = 1; - inc->encoding.scale.q = 1; - inc->encoding.offset.p = 0; - inc->encoding.offset.q = 1; + memcpy(&inc->encoding, &fmt->encoding, sizeof(inc->encoding)); inc->meaning.mq = 0; inc->meaning.unit = 0; @@ -132,8 +118,7 @@ static int init(struct sr_input *in, GHashTable *options) format = g_variant_get_string(g_hash_table_lookup(options, "format"), NULL); if ((fmt_index = parse_format_string(format)) == -1) { GString *formats = g_string_sized_new(200); - int num_formats = sizeof(sample_formats)/ sizeof(sample_formats[0]); - for (int i = 0; i < num_formats; i++) + for (unsigned int i = 0; i < ARRAY_SIZE(sample_formats); i++) g_string_append_printf(formats, "%s ", sample_formats[i].fmt_name); sr_err("Invalid format '%s': must be one of: %s.", format, formats->str); @@ -150,7 +135,7 @@ static int init(struct sr_input *in, GHashTable *options) } inc->samplerate = g_variant_get_uint64(g_hash_table_lookup(options, "samplerate")); - inc->samplesize = sample_formats[fmt_index].unitsize * num_channels; + inc->samplesize = sample_formats[fmt_index].encoding.unitsize * num_channels; init_context(inc, &sample_formats[fmt_index], in->sdi->channels); return SR_OK; @@ -166,7 +151,7 @@ static int process_buffer(struct sr_input *in) inc = in->priv; if (!inc->started) { - std_session_send_df_header(in->sdi, LOG_PREFIX); + std_session_send_df_header(in->sdi); if (inc->samplerate) { packet.type = SR_DF_META; @@ -232,7 +217,6 @@ static int receive(struct sr_input *in, GString *buf) static int end(struct sr_input *in) { - struct sr_datafeed_packet packet; struct context *inc; int ret; @@ -242,10 +226,8 @@ static int end(struct sr_input *in) ret = SR_OK; inc = in->priv; - if (inc->started) { - packet.type = SR_DF_END; - sr_session_send(in->sdi, &packet); - } + if (inc->started) + std_session_send_df_end(in->sdi); return ret; } @@ -259,12 +241,11 @@ static struct sr_option options[] = { static const struct sr_option *get_options(void) { - int num_formats = sizeof(sample_formats)/ sizeof(sample_formats[0]); if (!options[0].def) { options[0].def = g_variant_ref_sink(g_variant_new_int32(DEFAULT_NUM_CHANNELS)); options[1].def = g_variant_ref_sink(g_variant_new_uint64(DEFAULT_SAMPLERATE)); options[2].def = g_variant_ref_sink(g_variant_new_string(sample_formats[0].fmt_name)); - for (int i = 0; i < num_formats; i++) { + for (unsigned int i = 0; i < ARRAY_SIZE(sample_formats); i++) { options[2].values = g_slist_append(options[2].values, g_variant_ref_sink(g_variant_new_string(sample_formats[i].fmt_name))); } @@ -286,6 +267,17 @@ static void cleanup(struct sr_input *in) in->priv = NULL; } +static int reset(struct sr_input *in) +{ + struct context *inc = in->priv; + + cleanup(in); + inc->started = FALSE; + g_string_truncate(in->buf, 0); + + return SR_OK; +} + SR_PRIV struct sr_input_module input_raw_analog = { .id = "raw_analog", .name = "RAW analog", @@ -296,4 +288,5 @@ SR_PRIV struct sr_input_module input_raw_analog = { .receive = receive, .end = end, .cleanup = cleanup, + .reset = reset, };