void DecoderStack::decode_proc() { optional<int64_t> sample_count; srd_session *session; srd_decoder_inst *prev_di = NULL; assert(_snapshot); // Create the session srd_session_new(&session); assert(session); // Create the decoders const unsigned int unit_size = _snapshot->unit_size(); for (const shared_ptr<decode::Decoder> &dec : _stack) { srd_decoder_inst *const di = dec->create_decoder_inst(session, unit_size); if (!di) { _error_message = tr("Failed to create decoder instance"); srd_session_destroy(session); return; } if (prev_di) srd_inst_stack (session, prev_di, di); prev_di = di; } // Get the intial sample count { unique_lock<mutex> input_lock(_input_mutex); sample_count = _sample_count = _snapshot->get_sample_count(); } // Start the session srd_session_metadata_set(session, SRD_CONF_SAMPLERATE, g_variant_new_uint64((uint64_t)_samplerate)); srd_pd_output_callback_add(session, SRD_OUTPUT_ANN, DecoderStack::annotation_callback, this); srd_session_start(session); do { decode_data(*sample_count, unit_size, session); } while(_error_message.isEmpty() && (sample_count = wait_for_data())); // Destroy the session srd_session_destroy(session); }
void MainWindow::on_actionQUICK_HACK_PD_TEST_triggered() { #define N 500000 struct srd_decoder_inst *di; GHashTable *pd_opthash; uint8_t *buf = (uint8_t *)malloc(N + 1); pd_opthash = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free); /* Hardcode a specific I2C probe mapping. */ g_hash_table_insert(pd_opthash, g_strdup("scl"), g_strdup("5")); g_hash_table_insert(pd_opthash, g_strdup("sda"), g_strdup("7")); /* * Get data from a hardcoded binary file. * (converted to binary from melexis_mlx90614_5s_24deg.sr. */ QFile file("foo.bin"); int ret = file.open(QIODevice::ReadOnly); ret = file.read((char *)buf, N); // sr_log_loglevel_set(SR_LOG_NONE); // srd_log_loglevel_set(SRD_LOG_NONE); if (!(di = srd_inst_new("i2c", pd_opthash))) { ui->plainTextEdit->appendPlainText("ERROR: srd_inst_new"); return; } if (srd_inst_probe_set_all(di, pd_opthash) != SRD_OK) { ui->plainTextEdit->appendPlainText("ERROR: srd_inst_set_probes"); return; } if (srd_pd_output_callback_add(SRD_OUTPUT_ANN, (srd_pd_output_callback_t)show_pd_annotation, (void *)this) != SRD_OK) { ui->plainTextEdit->appendPlainText("ERROR: srd_pd_output_callback_add"); return; } if (srd_session_start(8, 1, 1000000) != SRD_OK) { ui->plainTextEdit->appendPlainText("ERROR: srd_session_start"); return; } if (srd_session_send(0, buf, N) != SRD_OK) { ui->plainTextEdit->appendPlainText("ERROR: srd_session_send"); return; } }
int main(int argc, char **argv) { g_log_set_default_handler(logger, NULL); if (parse_options(argc, argv)) { return 1; } /* Set the loglevel (amount of messages to output) for libsigrok. */ if (sr_log_loglevel_set(opt_loglevel) != SR_OK) goto done; if (sr_init(&sr_ctx) != SR_OK) goto done; #ifdef HAVE_SRD /* Set the loglevel (amount of messages to output) for libsigrokdecode. */ if (srd_log_loglevel_set(opt_loglevel) != SRD_OK) goto done; if (opt_pds) { if (srd_init(NULL) != SRD_OK) goto done; if (srd_session_new(&srd_sess) != SRD_OK) { g_critical("Failed to create new decode session."); goto done; } if (register_pds(opt_pds, opt_pd_annotations) != 0) goto done; if (setup_pd_stack(opt_pds, opt_pd_stack, opt_pd_annotations) != 0) goto done; /* Only one output type is ever shown. */ if (opt_pd_binary) { if (setup_pd_binary(opt_pd_binary) != 0) goto done; if (srd_pd_output_callback_add(srd_sess, SRD_OUTPUT_BINARY, show_pd_binary, NULL) != SRD_OK) goto done; } else if (opt_pd_meta) { if (setup_pd_meta(opt_pd_meta) != 0) goto done; if (srd_pd_output_callback_add(srd_sess, SRD_OUTPUT_META, show_pd_meta, NULL) != SRD_OK) goto done; } else { if (opt_pd_annotations) if (setup_pd_annotations(opt_pd_annotations) != 0) goto done; if (srd_pd_output_callback_add(srd_sess, SRD_OUTPUT_ANN, show_pd_annotations, NULL) != SRD_OK) goto done; } } #endif if (opt_version) show_version(); else if (opt_input_format && opt_show) show_input(); else if (opt_output_format && opt_show) show_output(); else if (opt_transform_module && opt_show) show_transform(); else if (opt_scan_devs) show_dev_list(); #ifdef HAVE_SRD else if (opt_pds && opt_show) show_pd_detail(); #endif else if (opt_show) show_dev_detail(); else if (opt_input_file) load_input_file(); else if (opt_get) get_option(); else if (opt_set) set_options(); else if (opt_samples || opt_time || opt_frames || opt_continuous) run_session(); else show_help(); #ifdef HAVE_SRD if (opt_pds) srd_exit(); #endif done: if (sr_ctx) sr_exit(sr_ctx); return 0; }
int main(int argc, char **argv) { GOptionContext *context; GError *error; g_log_set_default_handler(logger, NULL); error = NULL; context = g_option_context_new(NULL); g_option_context_add_main_entries(context, optargs, NULL); if (!g_option_context_parse(context, &argc, &argv, &error)) { g_critical("%s", error->message); return 1; } /* Set the loglevel (amount of messages to output) for libsigrok. */ if (sr_log_loglevel_set(opt_loglevel) != SR_OK) return 1; /* Set the loglevel (amount of messages to output) for libsigrokdecode. */ if (srd_log_loglevel_set(opt_loglevel) != SRD_OK) return 1; if (sr_init() != SR_OK) return 1; if (opt_pds) { if (srd_init(NULL) != SRD_OK) return 1; if (register_pds(NULL, opt_pds) != 0) return 1; if (srd_pd_output_callback_add(SRD_OUTPUT_ANN, show_pd_annotations, NULL) != SRD_OK) return 1; if (setup_pd_stack() != 0) return 1; if (setup_pd_annotations() != 0) return 1; } if (setup_output_format() != 0) return 1; if (opt_version) show_version(); else if (opt_list_devs) show_dev_list(); else if (opt_input_file) load_input_file(); else if (opt_samples || opt_time || opt_frames || opt_continuous) run_session(); else if (opt_dev) show_dev_detail(); else if (opt_pds) show_pd_detail(); else printf("%s", g_option_context_get_help(context, TRUE, NULL)); if (opt_pds) srd_exit(); g_option_context_free(context); sr_exit(); return 0; }