X-Git-Url: http://sigrok.org/gitweb/?a=blobdiff_plain;f=src%2Finput%2Fraw_analog.c;h=272250eb2945b06f8a648e9cb24583d13b9139fe;hb=7102443a4adb1743c5a053deee8fd2a93670fc19;hp=bb1aa06bdadf8d552df67d802e44ab94dbc779c3;hpb=21cbe810fe12fbbc93b6f80c950c377528353442;p=libsigrok.git diff --git a/src/input/raw_analog.c b/src/input/raw_analog.c index bb1aa06b..272250eb 100644 --- a/src/input/raw_analog.c +++ b/src/input/raw_analog.c @@ -31,9 +31,9 @@ #define LOG_PREFIX "input/raw_analog" /* How many bytes at a time to process and send to the session bus. */ -#define CHUNK_SIZE 4096 -#define DEFAULT_NUM_CHANNELS 1 -#define DEFAULT_SAMPLERATE 0 +#define CHUNK_SIZE (4 * 1024 * 1024) +#define DEFAULT_NUM_CHANNELS 1 +#define DEFAULT_SAMPLERATE 0 struct context { gboolean started; @@ -48,26 +48,26 @@ struct context { }; struct sample_format { - const char const *fmt_name; + 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, 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, 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, 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}}}, + { "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) @@ -105,7 +105,7 @@ static int init(struct sr_input *in, GHashTable *options) { struct context *inc; int num_channels; - char channelname[8]; + char channelname[16]; const char *format; int fmt_index; @@ -130,7 +130,7 @@ static int init(struct sr_input *in, GHashTable *options) in->priv = inc = g_malloc0(sizeof(struct context)); for (int i = 0; i < num_channels; i++) { - snprintf(channelname, 8, "CH%d", i + 1); + snprintf(channelname, sizeof(channelname) - 1, "CH%d", i + 1); sr_channel_new(in->sdi, i, SR_CHANNEL_ANALOG, TRUE, channelname); } @@ -151,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; @@ -217,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; @@ -227,18 +226,16 @@ 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; } static struct sr_option options[] = { - { "numchannels", "Number of channels", "Number of channels", NULL, NULL }, - { "samplerate", "Sample rate", "Sample rate", NULL, NULL }, - { "format", "Format", "Numeric format", NULL, NULL }, + { "numchannels", "Number of analog channels", "The number of (analog) channels in the data", NULL, NULL }, + { "samplerate", "Sample rate (Hz)", "The sample rate of the (analog) data in Hz", NULL, NULL }, + { "format", "Data format", "The format of the data (data type, signedness, endianness)", NULL, NULL }, ALL_ZERO }; @@ -270,14 +267,26 @@ static void cleanup(struct sr_input *in) in->priv = NULL; } +static int reset(struct sr_input *in) +{ + struct context *inc = in->priv; + + inc->started = FALSE; + cleanup(in); + g_string_truncate(in->buf, 0); + + return SR_OK; +} + SR_PRIV struct sr_input_module input_raw_analog = { .id = "raw_analog", .name = "RAW analog", - .desc = "analog signals without header", + .desc = "Raw analog data without header", .exts = (const char*[]){"raw", "bin", NULL}, .options = get_options, .init = init, .receive = receive, .end = end, .cleanup = cleanup, + .reset = reset, };