-static void *thread_init(void *arg)
-{
- struct sr_dev_driver *drv, **drvlist;
- struct sr_config *src;
- GSList *devlist, *drvopts, *l;
- struct config_device *cfdev;
- int ret, i;
- char hwident[512];
-
- (void)arg;
-
- sr_log_callback_set(cd_logger, NULL);
- sr_log_loglevel_set(loglevel);
-
- if ((ret = sr_init(&sr_ctx)) != SR_OK) {
- ERROR("Failed to initialize libsigrok: %s.", sr_strerror(ret));
- return NULL;
- }
-
- if (!(session = sr_session_new()))
- return NULL;
-
- num_devices = 0;
- drvlist = sr_driver_list();
- for (l = config_devices; l; l = l->next) {
- cfdev = l->data;
- drv = NULL;
- for (i = 0; drvlist[i]; i++) {
- if (!strcmp(drvlist[i]->name, cfdev->driver)) {
- drv = drvlist[i];
- break;
- }
- }
- if (!drv) {
- ERROR("sigrok: Unknown driver '%s'.", cfdev->driver);
- return NULL;
- }
-
- if (sr_driver_init(sr_ctx, drv) != SR_OK)
- return NULL;
-
- drvopts = NULL;
- if (cfdev->conn) {
- if (!(src = malloc(sizeof(struct sr_config))))
- return NULL;
- src->key = SR_CONF_CONN;
- src->data = g_variant_new_string(cfdev->conn);
- drvopts = g_slist_append(drvopts, src);
- }
- if (cfdev->serialcomm) {
- if (!(src = malloc(sizeof(struct sr_config))))
- return NULL;
- src->key = SR_CONF_SERIALCOMM;
- src->data = g_variant_new_string(cfdev->serialcomm);
- drvopts = g_slist_append(drvopts, src);
- }
- devlist = sr_driver_scan(drv, drvopts);
- g_slist_free_full(drvopts, (GDestroyNotify)free_drvopts);
- if (!devlist)
- /* No devices found for this driver. */
- continue;
-
- if (g_slist_length(devlist) > 1) {
- INFO("sigrok: %d sigrok devices for device entry '%s': must be 1.",
- g_slist_length(devlist), cfdev->name);
- return NULL;
- }
- cfdev->sdi = devlist->data;
- g_slist_free(devlist);
- ssnprintf(hwident, sizeof(hwident), "%s %s %s",
- cfdev->sdi->vendor ? cfdev->sdi->vendor : "",
- cfdev->sdi->model ? cfdev->sdi->model : "",
- cfdev->sdi->version ? cfdev->sdi->version : "");
- INFO("sigrok: Device '%s' is a %s.", cfdev->name, hwident);
-
- if (sr_dev_open(cfdev->sdi) != SR_OK)
- return NULL;
-
- if (sr_session_dev_add(cfdev->sdi) != SR_OK)
- return NULL;
-
- num_devices++;
- }
-
- if (num_devices > 0) {
- /* Do this only when we're sure there's hardware to talk to. */
- if (sr_session_datafeed_callback_add(sigrok_feed_callback, NULL) != SR_OK)
- return NULL;
-
- /* Start acquisition on all devices. */
- if (sr_session_start() != SR_OK)
- return NULL;
-
- /* Main loop, runs forever. */
- sr_session_run();
-
- sr_session_stop();
- sr_session_dev_remove_all();
- }
-
- sr_session_destroy();
-
- sr_exit(sr_ctx);
-
- pthread_exit(NULL);
- sr_thread_running = FALSE;
-
- return NULL;