]> sigrok.org Git - sigrok-cli.git/blobdiff - sigrok-cli.c
srd: don't load all protocol decoders unless we really need to.
[sigrok-cli.git] / sigrok-cli.c
index 4502da40482ad53c3aa4f7a8598fcc96a40a6541..505f10e4f2ebd461a50fea41ec1d16f1639a92ee 100644 (file)
@@ -93,8 +93,9 @@ static void show_version(void)
        int i;
 
        printf("sigrok-cli %s\n\n", VERSION);
+
        printf("Supported hardware drivers:\n");
-       plugins = sr_list_hwplugins();
+       plugins = sr_hwplugins_list();
        for (p = plugins; p; p = p->next) {
                plugin = p->data;
                printf("  %-20s %s\n", plugin->name, plugin->longname);
@@ -113,24 +114,24 @@ static void show_version(void)
                printf("  %-20s %s\n", outputs[i]->id, outputs[i]->description);
        printf("\n");
 
-       /* TODO: Error handling. */
-       srd_init(NULL);
-
-       printf("Supported protocol decoders:\n");
-       for (l = srd_list_decoders(); l; l = l->next) {
-               dec = l->data;
-               printf("  %-20s %s\n", dec->id, dec->longname);
+       if (srd_init(NULL) == SRD_OK) {
+               printf("Supported protocol decoders:\n");
+               srd_load_all_decoders();
+               for (l = srd_list_decoders(); l; l = l->next) {
+                       dec = l->data;
+                       printf("  %-20s %s\n", dec->id, dec->longname);
+               }
+               srd_exit();
        }
        printf("\n");
 
-       srd_exit();
 }
 
 static void print_device_line(const struct sr_device *device)
 {
        const struct sr_device_instance *sdi;
 
-       sr_device_get_info(device, SR_DI_INSTANCE, (const void **)&sdi);
+       sr_dev_info_get(device, SR_DI_INSTANCE, (const void **)&sdi);
 
        if (sdi->vendor && sdi->vendor[0])
                printf("%s ", sdi->vendor);
@@ -150,7 +151,7 @@ static void show_device_list(void)
        int devcnt;
 
        devcnt = 0;
-       devices = sr_device_list();
+       devices = sr_dev_list();
 
        if (g_slist_length(devices) == 0)
                return;
@@ -159,7 +160,7 @@ static void show_device_list(void)
        demo_device = NULL;
        for (l = devices; l; l = l->next) {
                device = l->data;
-               if (sr_device_has_hwcap(device, SR_HWCAP_DEMO_DEVICE)) {
+               if (sr_dev_has_hwcap(device, SR_HWCAP_DEMO_DEVICE)) {
                        demo_device = device;
                        continue;
                }
@@ -189,7 +190,7 @@ static void show_device_detail(void)
 
        print_device_line(device);
 
-       if (sr_device_get_info(device, SR_DI_TRIGGER_TYPES,
+       if (sr_dev_info_get(device, SR_DI_TRIGGER_TYPES,
                                        (const void **)&charopts) == SR_OK) {
                printf("Supported triggers: ");
                while (*charopts) {
@@ -202,7 +203,7 @@ static void show_device_detail(void)
        title = "Supported options:\n";
        capabilities = device->plugin->get_capabilities();
        for (cap = 0; capabilities[cap]; cap++) {
-               if (!(hwo = sr_find_hwcap_option(capabilities[cap])))
+               if (!(hwo = sr_hwplugins_hwcap_get(capabilities[cap])))
                        continue;
 
                if (title) {
@@ -212,7 +213,7 @@ static void show_device_detail(void)
 
                if (hwo->capability == SR_HWCAP_PATTERN_MODE) {
                        printf("    %s", hwo->shortname);
-                       if (sr_device_get_info(device, SR_DI_PATTERNMODES,
+                       if (sr_dev_info_get(device, SR_DI_PATTERNMODES,
                                        (const void **)&stropts) == SR_OK) {
                                printf(" - supported modes:\n");
                                for (i = 0; stropts[i]; i++)
@@ -223,7 +224,7 @@ static void show_device_detail(void)
                } else if (hwo->capability == SR_HWCAP_SAMPLERATE) {
                        printf("    %s", hwo->shortname);
                        /* Supported samplerates */
-                       if (sr_device_get_info(device, SR_DI_SAMPLERATES,
+                       if (sr_dev_info_get(device, SR_DI_SAMPLERATES,
                                        (const void **)&samplerates) != SR_OK) {
                                printf("\n");
                                continue;
@@ -484,8 +485,12 @@ static int register_pds(struct sr_device *device, const char *pdstring)
 
                pd_name = g_strdup(g_hash_table_lookup(pd_opthash, "sigrok_key"));
                g_hash_table_remove(pd_opthash, "sigrok_key");
+               if (srd_load_decoder(pd_name) != SRD_OK) {
+                       fprintf(stderr, "Failed to load protocol decoder %s\n", pd_name);
+                       goto err_out;
+               }
                if (!(di = srd_inst_new(pd_name, pd_opthash))) {
-                       fprintf(stderr, "Failed to instantiate PD %s\n", pd_name);
+                       fprintf(stderr, "Failed to instantiate protocol decoder %s\n", pd_name);
                        goto err_out;
                }
                g_datalist_set_data(&pd_ann_visible, di->inst_id, pd_name);
@@ -559,10 +564,10 @@ static int select_probes(struct sr_device *device)
 
        for (i = 0; i < max_probes; i++) {
                if (probelist[i]) {
-                       sr_device_probe_name(device, i + 1, probelist[i]);
+                       sr_dev_probe_name(device, i + 1, probelist[i]);
                        g_free(probelist[i]);
                } else {
-                       probe = sr_device_probe_find(device, i + 1);
+                       probe = sr_dev_probe_find(device, i + 1);
                        probe->enabled = FALSE;
                }
        }
@@ -706,10 +711,10 @@ int num_real_devices(void)
        int num_devices;
 
        num_devices = 0;
-       devices = sr_device_list();
+       devices = sr_dev_list();
        for (l = devices; l; l = l->next) {
                device = l->data;
-               if (!sr_device_has_hwcap(device, SR_HWCAP_DEMO_DEVICE))
+               if (!sr_dev_has_hwcap(device, SR_HWCAP_DEMO_DEVICE))
                        num_devices++;
        }
 
@@ -782,7 +787,7 @@ static void run_session(void)
 {
        struct sr_device *device;
        GHashTable *devargs;
-       int num_devices, max_probes, *capabilities, i;
+       int num_devices, max_probes, i;
        uint64_t time_msec;
        char **probelist, *devspec;
 
@@ -832,8 +837,7 @@ static void run_session(void)
             return;
 
        if (opt_continuous) {
-               capabilities = device->plugin->get_capabilities();
-               if (!sr_find_hwcap(capabilities, SR_HWCAP_CONTINUOUS)) {
+               if (!sr_hwplugin_has_hwcap(device->plugin, SR_HWCAP_CONTINUOUS)) {
                        printf("This device does not support continuous sampling.");
                        sr_session_destroy();
                        return;
@@ -850,7 +854,7 @@ static void run_session(void)
                max_probes = g_slist_length(device->probes);
                for (i = 0; i < max_probes; i++) {
                        if (probelist[i]) {
-                               sr_device_trigger_set(device, i + 1, probelist[i]);
+                               sr_dev_trigger_set(device, i + 1, probelist[i]);
                                g_free(probelist[i]);
                        }
                }
@@ -865,8 +869,7 @@ static void run_session(void)
                        return;
                }
 
-               capabilities = device->plugin->get_capabilities();
-               if (sr_find_hwcap(capabilities, SR_HWCAP_LIMIT_MSEC)) {
+               if (sr_hwplugin_has_hwcap(device->plugin, SR_HWCAP_LIMIT_MSEC)) {
                        if (device->plugin->set_configuration(device->plugin_index,
                                                          SR_HWCAP_LIMIT_MSEC, &time_msec) != SR_OK) {
                                printf("Failed to configure time limit.\n");
@@ -879,10 +882,10 @@ static void run_session(void)
                         * convert to samples based on the samplerate.
                         */
                        limit_samples = 0;
-                       if (sr_device_has_hwcap(device, SR_HWCAP_SAMPLERATE)) {
+                       if (sr_dev_has_hwcap(device, SR_HWCAP_SAMPLERATE)) {
                                const uint64_t *samplerate;
 
-                               sr_device_get_info(device, SR_DI_CUR_SAMPLERATE,
+                               sr_dev_info_get(device, SR_DI_CUR_SAMPLERATE,
                                                (const void **)&samplerate);
                                limit_samples = (*samplerate) * time_msec / (uint64_t)1000;
                        }