I had a binary file that I needed to decode using UART decoder. UART
decoder needs to know the sample rate for the data, but currently it's
not possible to pass parameters to input formats and so the "binary"
file format always sets the samplerate to 0.
This patch adds the possibility to append a colon-separated list of
key=value options to the -I argument, in the same way -d supports it.
Also, it makes the "binary" format support the "samplerate" option.
I included the GHashTable containing input format options directly in
the sr_input struct. I'm not sure if that's the right way to do it. I
saw that -d uses a much more elaborate system with device capabilities
and typed options, but that seemed like an overkill for input formats.
#define CHUNKSIZE (512 * 1024)
#define DEFAULT_NUM_PROBES 8
#define CHUNKSIZE (512 * 1024)
#define DEFAULT_NUM_PROBES 8
+struct context {
+ int samplerate;
+};
+
static int format_match(const char *filename)
{
/* suppress compiler warning */
static int format_match(const char *filename)
{
/* suppress compiler warning */
{
int num_probes, i;
char name[SR_MAX_PROBENAME_LEN + 1];
{
int num_probes, i;
char name[SR_MAX_PROBENAME_LEN + 1];
+ char *param;
+ struct context *ctx;
+
+ if (!(ctx = g_try_malloc0(sizeof(*ctx)))) {
+ sr_err("binary in: %s: ctx malloc failed", __func__);
+ return SR_ERR_MALLOC;
+ }
- if (in->param && in->param[0]) {
- num_probes = strtoul(in->param, NULL, 10);
- if (num_probes < 1)
- return SR_ERR;
- } else {
- num_probes = DEFAULT_NUM_PROBES;
+ num_probes = DEFAULT_NUM_PROBES;
+ ctx->samplerate = 0;
+
+ if(in->param) {
+ param = g_hash_table_lookup(in->param, "numprobes");
+ if (param) {
+ num_probes = strtoul(param, NULL, 10);
+ if (num_probes < 1)
+ return SR_ERR;
+ }
+
+ param = g_hash_table_lookup(in->param, "samplerate");
+ if (param) {
+ ctx->samplerate = strtoul(param, NULL, 10);
+ if (ctx->samplerate < 1) {
+ return SR_ERR;
+ }
+ }
}
/* Create a virtual device. */
in->vdev = sr_dev_new(NULL, 0);
}
/* Create a virtual device. */
in->vdev = sr_dev_new(NULL, 0);
for (i = 0; i < num_probes; i++) {
snprintf(name, SR_MAX_PROBENAME_LEN, "%d", i);
for (i = 0; i < num_probes; i++) {
snprintf(name, SR_MAX_PROBENAME_LEN, "%d", i);
struct sr_datafeed_logic logic;
unsigned char buffer[CHUNKSIZE];
int fd, size, num_probes;
struct sr_datafeed_logic logic;
unsigned char buffer[CHUNKSIZE];
int fd, size, num_probes;
+ struct context *ctx;
+
+ ctx = in->internal;
if ((fd = open(filename, O_RDONLY)) == -1)
return SR_ERR;
if ((fd = open(filename, O_RDONLY)) == -1)
return SR_ERR;
/* Send metadata about the SR_DF_LOGIC packets to come. */
packet.type = SR_DF_META_LOGIC;
packet.payload = &meta;
/* Send metadata about the SR_DF_LOGIC packets to come. */
packet.type = SR_DF_META_LOGIC;
packet.payload = &meta;
+ meta.samplerate = ctx->samplerate;
meta.num_probes = num_probes;
sr_session_send(in->vdev, &packet);
meta.num_probes = num_probes;
sr_session_send(in->vdev, &packet);
packet.type = SR_DF_END;
sr_session_send(in->vdev, &packet);
packet.type = SR_DF_END;
sr_session_send(in->vdev, &packet);
+ g_free(ctx);
+ in->internal = NULL;
+
{
int num_probes, i;
char name[SR_MAX_PROBENAME_LEN + 1];
{
int num_probes, i;
char name[SR_MAX_PROBENAME_LEN + 1];
-
- if (in->param && in->param[0]) {
- num_probes = strtoul(in->param, NULL, 10);
- if (num_probes < 1) {
- sr_err("la8 in: %s: strtoul failed", __func__);
- return SR_ERR;
+ char *param;
+
+ num_probes = DEFAULT_NUM_PROBES;
+
+ if (in->param) {
+ param = g_hash_table_lookup(in->param, "numprobes");
+ if (param) {
+ num_probes = strtoul(param, NULL, 10);
+ if (num_probes < 1) {
+ sr_err("la8 in: %s: strtoul failed", __func__);
+ return SR_ERR;
+ }
- } else {
- num_probes = DEFAULT_NUM_PROBES;
}
/* Create a virtual device. */
}
/* Create a virtual device. */