static void show_pd_detail(void) { GSList *l; struct srd_decoder *dec; char **pdtokens, **pdtok, **ann, *doc; struct srd_probe *p; pdtokens = g_strsplit(opt_pds, ",", -1); for (pdtok = pdtokens; *pdtok; pdtok++) { if (!(dec = srd_decoder_get_by_id(*pdtok))) { printf("Protocol decoder %s not found.\n", *pdtok); return; } printf("ID: %s\nName: %s\nLong name: %s\nDescription: %s\n", dec->id, dec->name, dec->longname, dec->desc); printf("License: %s\n", dec->license); printf("Annotations:\n"); if (dec->annotations) { for (l = dec->annotations; l; l = l->next) { ann = l->data; printf("- %s\n %s\n", ann[0], ann[1]); } } else { printf("None.\n"); } /* TODO: Print supported decoder options. */ printf("Required probes:\n"); if (dec->probes) { for (l = dec->probes; l; l = l->next) { p = l->data; printf("- %s (%s): %s\n", p->name, p->id, p->desc); } } else { printf("None.\n"); } printf("Optional probes:\n"); if (dec->opt_probes) { for (l = dec->opt_probes; l; l = l->next) { p = l->data; printf("- %s (%s): %s\n", p->name, p->id, p->desc); } } else { printf("None.\n"); } if ((doc = srd_decoder_doc_get(dec))) { printf("Documentation:\n%s\n", doc[0] == '\n' ? doc + 1 : doc); g_free(doc); } } g_strfreev(pdtokens); }
int setup_pd_annotations(void) { GSList *l; struct srd_decoder *dec; int ann; char **pds, **pdtok, **keyval, **ann_descr; /* Set up custom list of PDs and annotations to show. */ if (opt_pd_annotations) { pds = g_strsplit(opt_pd_annotations, ",", 0); for (pdtok = pds; *pdtok && **pdtok; pdtok++) { ann = 0; keyval = g_strsplit(*pdtok, "=", 0); if (!(dec = srd_decoder_get_by_id(keyval[0]))) { g_critical("Protocol decoder '%s' not found.", keyval[0]); return 1; } if (!dec->annotations) { g_critical("Protocol decoder '%s' has no annotations.", keyval[0]); return 1; } if (g_strv_length(keyval) == 2) { for (l = dec->annotations; l; l = l->next, ann++) { ann_descr = l->data; if (!canon_cmp(ann_descr[0], keyval[1])) /* Found it. */ break; } if (!l) { g_critical("Annotation '%s' not found " "for protocol decoder '%s'.", keyval[1], keyval[0]); return 1; } } g_debug("cli: showing protocol decoder annotation %d from '%s'", ann, keyval[0]); g_hash_table_insert(pd_ann_visible, g_strdup(keyval[0]), GINT_TO_POINTER(ann)); g_strfreev(keyval); } g_strfreev(pds); } return 0; }
/** * Create a new protocol decoder instance. * * @param sess The session holding the protocol decoder instance. * @param decoder_id Decoder 'id' field. * @param options GHashtable of options which override the defaults set in * the decoder class. May be NULL. * * @return Pointer to a newly allocated struct srd_decoder_inst, or * NULL in case of failure. * * @since 0.3.0 */ SRD_API struct srd_decoder_inst *srd_inst_new(struct srd_session *sess, const char *decoder_id, GHashTable *options) { int i; struct srd_decoder *dec; struct srd_decoder_inst *di; char *inst_id; srd_dbg("Creating new %s instance.", decoder_id); if (session_is_valid(sess) != SRD_OK) { srd_err("Invalid session."); return NULL; } if (!(dec = srd_decoder_get_by_id(decoder_id))) { srd_err("Protocol decoder %s not found.", decoder_id); return NULL; } if (!(di = g_try_malloc0(sizeof(struct srd_decoder_inst)))) { srd_err("Failed to g_malloc() instance."); return NULL; } di->decoder = dec; di->sess = sess; if (options) { inst_id = g_hash_table_lookup(options, "id"); di->inst_id = g_strdup(inst_id ? inst_id : decoder_id); g_hash_table_remove(options, "id"); } else di->inst_id = g_strdup(decoder_id); /* * Prepare a default probe map, where samples come in the * order in which the decoder class defined them. */ di->dec_num_probes = g_slist_length(di->decoder->probes) + g_slist_length(di->decoder->opt_probes); if (di->dec_num_probes) { if (!(di->dec_probemap = g_try_malloc(sizeof(int) * di->dec_num_probes))) { srd_err("Failed to g_malloc() probe map."); g_free(di); return NULL; } for (i = 0; i < di->dec_num_probes; i++) di->dec_probemap[i] = i; di->data_unitsize = (di->dec_num_probes + 7) / 8; /* * Will be used to prepare a sample at every iteration * of the instance's decode() method. */ if (!(di->probe_samples = g_try_malloc(di->dec_num_probes))) { srd_err("Failed to g_malloc() sample buffer."); g_free(di->dec_probemap); g_free(di); return NULL; } } /* Create a new instance of this decoder class. */ if (!(di->py_inst = PyObject_CallObject(dec->py_dec, NULL))) { if (PyErr_Occurred()) srd_exception_catch("failed to create %s instance: ", decoder_id); g_free(di->dec_probemap); g_free(di); return NULL; } if (options && srd_inst_option_set(di, options) != SRD_OK) { g_free(di->dec_probemap); g_free(di); return NULL; } /* Instance takes input from a frontend by default. */ sess->di_list = g_slist_append(sess->di_list, di); return di; }
/** * Create a new protocol decoder instance. * * @param sess The session holding the protocol decoder instance. * @param decoder_id Decoder 'id' field. * @param options GHashtable of options which override the defaults set in * the decoder class. May be NULL. * * @return Pointer to a newly allocated struct srd_decoder_inst, or * NULL in case of failure. * * @since 0.3.0 */ SRD_API struct srd_decoder_inst *srd_inst_new(struct srd_session *sess, const char *decoder_id, GHashTable *options) { int i; struct srd_decoder *dec; struct srd_decoder_inst *di; char *inst_id; i = 1; srd_dbg("Creating new %s instance.", decoder_id); if (session_is_valid(sess) != SRD_OK) { srd_err("Invalid session."); return NULL; } if (!(dec = srd_decoder_get_by_id(decoder_id))) { srd_err("Protocol decoder %s not found.", decoder_id); return NULL; } di = g_malloc0(sizeof(struct srd_decoder_inst)); di->decoder = dec; di->sess = sess; if (options) { inst_id = g_hash_table_lookup(options, "id"); if (inst_id) di->inst_id = g_strdup(inst_id); g_hash_table_remove(options, "id"); } /* Create a unique instance ID (as none was provided). */ if (!di->inst_id) { di->inst_id = g_strdup_printf("%s-%d", decoder_id, i++); while (srd_inst_find_by_id(sess, di->inst_id)) { g_free(di->inst_id); di->inst_id = g_strdup_printf("%s-%d", decoder_id, i++); } } /* * Prepare a default channel map, where samples come in the * order in which the decoder class defined them. */ di->dec_num_channels = g_slist_length(di->decoder->channels) + g_slist_length(di->decoder->opt_channels); if (di->dec_num_channels) { di->dec_channelmap = g_malloc(sizeof(int) * di->dec_num_channels); for (i = 0; i < di->dec_num_channels; i++) di->dec_channelmap[i] = i; /* * Will be used to prepare a sample at every iteration * of the instance's decode() method. */ di->channel_samples = g_malloc(di->dec_num_channels); } /* Create a new instance of this decoder class. */ if (!(di->py_inst = PyObject_CallObject(dec->py_dec, NULL))) { if (PyErr_Occurred()) srd_exception_catch("Failed to create %s instance", decoder_id); g_free(di->dec_channelmap); g_free(di); return NULL; } if (options && srd_inst_option_set(di, options) != SRD_OK) { g_free(di->dec_channelmap); g_free(di); return NULL; } di->condition_list = NULL; di->match_array = NULL; di->abs_start_samplenum = 0; di->abs_end_samplenum = 0; di->inbuf = NULL; di->inbuflen = 0; di->abs_cur_samplenum = 0; di->old_pins_array = NULL; di->thread_handle = NULL; di->got_new_samples = FALSE; di->handled_all_samples = FALSE; /* Instance takes input from a frontend by default. */ sess->di_list = g_slist_append(sess->di_list, di); srd_dbg("Created new %s instance with ID %s.", decoder_id, di->inst_id); return di; }
void show_pd_detail(void) { GSList *l, *ll, *ol; struct srd_decoder *dec; struct srd_decoder_option *o; char **pdtokens, **pdtok, *optsep, **ann, *val, *doc; struct srd_channel *pdch; struct srd_decoder_annotation_row *r; pdtokens = g_strsplit(opt_pds, ",", -1); for (pdtok = pdtokens; *pdtok; pdtok++) { /* Strip options. */ if ((optsep = strchr(*pdtok, ':'))) *optsep = '\0'; if (!(dec = srd_decoder_get_by_id(*pdtok))) { g_critical("Protocol decoder %s not found.", *pdtok); return; } printf("ID: %s\nName: %s\nLong name: %s\nDescription: %s\n", dec->id, dec->name, dec->longname, dec->desc); printf("License: %s\n", dec->license); printf("Annotation classes:\n"); if (dec->annotations) { for (l = dec->annotations; l; l = l->next) { ann = l->data; printf("- %s: %s\n", ann[0], ann[1]); } } else { printf("None.\n"); } printf("Annotation rows:\n"); if (dec->annotation_rows) { for (l = dec->annotation_rows; l; l = l->next) { r = l->data; printf("- %s (%s): ", r->id, r->desc); for (ll = r->ann_classes; ll; ll = ll->next) printf("%d ", GPOINTER_TO_INT(ll->data)); printf("\n"); } } else { printf("None.\n"); } printf("Required channels:\n"); if (dec->channels) { for (l = dec->channels; l; l = l->next) { pdch = l->data; printf("- %s (%s): %s\n", pdch->id, pdch->name, pdch->desc); } } else { printf("None.\n"); } printf("Optional channels:\n"); if (dec->opt_channels) { for (l = dec->opt_channels; l; l = l->next) { pdch = l->data; printf("- %s (%s): %s\n", pdch->id, pdch->name, pdch->desc); } } else { printf("None.\n"); } printf("Options:\n"); if (dec->options) { for (l = dec->options; l; l = l->next) { o = l->data; printf("- %s: %s (", o->id, o->desc); for (ol = o->values; ol; ol = ol->next) { val = g_variant_print(ol->data, FALSE); printf("%s, ", val); g_free(val); } val = g_variant_print(o->def, FALSE); printf("default %s)\n", val); g_free(val); } } else { printf("None.\n"); } if ((doc = srd_decoder_doc_get(dec))) { printf("Documentation:\n%s\n", doc[0] == '\n' ? doc + 1 : doc); g_free(doc); } } g_strfreev(pdtokens); }