]> sigrok.org Git - libsigrok.git/blobdiff - hardware/demo/demo.c
demo: s/genmode/pattern/.
[libsigrok.git] / hardware / demo / demo.c
index fda8091bbced50fe915ce8834d502c34751633dc..2bd4709545cd656d93c99abb35f12fac779ede91 100644 (file)
@@ -23,6 +23,7 @@
 #include <unistd.h>
 #include <string.h>
 #include <sigrok.h>
+#include <sigrok-internal.h>
 #ifdef _WIN32
 #include <io.h>
 #include <fcntl.h>
 /* size of chunks to send through the session bus */
 #define BUFSIZE                4096
 
+/* Supported patterns which we can generate */
 enum {
-       GENMODE_DEFAULT,
-       GENMODE_RANDOM,
-       GENMODE_INC,
+       /**
+        * Pattern which spells "sigrok" using '0's (with '1's as "background")
+        * when displayed using the 'bits' output format.
+        */
+       PATTERN_SIGROK,
+
+       /**
+        * Pattern which consists of (pseudo-)random values on all probes.
+        */
+       PATTERN_RANDOM,
+
+       /**
+        * Pattern which consists of incrementing numbers.
+        * TODO: Better description.
+        */
+       PATTERN_INC,
 };
 
+/* FIXME: Should not be global. */
 GIOChannel *channels[2];
 
 struct databag {
@@ -55,19 +71,27 @@ struct databag {
 
 static int capabilities[] = {
        SR_HWCAP_LOGIC_ANALYZER,
+       SR_HWCAP_SAMPLERATE,
        SR_HWCAP_PATTERN_MODE,
        SR_HWCAP_LIMIT_SAMPLES,
        SR_HWCAP_LIMIT_MSEC,
        SR_HWCAP_CONTINUOUS,
 };
 
-static const char *patternmodes[] = {
+static struct sr_samplerates samplerates = {
+       SR_HZ(1),
+       SR_GHZ(1),
+       SR_HZ(1),
+       NULL,
+};
+
+static const char *pattern_strings[] = {
        "random",
        "incremental",
        NULL,
 };
 
-static uint8_t genmode_default[] = {
+static uint8_t pattern_sigrok[] = {
        0x4c, 0x92, 0x92, 0x92, 0x64, 0x00, 0x00, 0x00,
        0x82, 0xfe, 0xfe, 0x82, 0x00, 0x00, 0x00, 0x00,
        0x7c, 0x82, 0x82, 0x92, 0x74, 0x00, 0x00, 0x00,
@@ -80,16 +104,16 @@ static uint8_t genmode_default[] = {
 
 /* List of struct sr_device_instance, maintained by opendev()/closedev(). */
 static GSList *device_instances = NULL;
-static uint64_t cur_samplerate = KHZ(200);
+static uint64_t cur_samplerate = SR_KHZ(200);
 static uint64_t limit_samples = 0;
 static uint64_t limit_msec = 0;
-static int default_genmode = GENMODE_DEFAULT;
+static int default_pattern = PATTERN_SIGROK;
 static GThread *my_thread;
 static int thread_running;
 
 static void hw_stop_acquisition(int device_index, gpointer session_device_id);
 
-static int hw_init(char *deviceinfo)
+static int hw_init(const char *deviceinfo)
 {
        struct sr_device_instance *sdi;
 
@@ -111,15 +135,18 @@ static int hw_opendev(int device_index)
        device_index = device_index;
 
        /* Nothing needed so far. */
+
        return SR_OK;
 }
 
-static void hw_closedev(int device_index)
+static int hw_closedev(int device_index)
 {
        /* Avoid compiler warnings. */
        device_index = device_index;
 
        /* Nothing needed so far. */
+
+       return SR_OK;
 }
 
 static void hw_cleanup(void)
@@ -142,11 +169,14 @@ static void *hw_get_device_info(int device_index, int device_info_id)
        case SR_DI_NUM_PROBES:
                info = GINT_TO_POINTER(NUM_PROBES);
                break;
+       case SR_DI_SAMPLERATES:
+               info = &samplerates;
+               break;
        case SR_DI_CUR_SAMPLERATE:
                info = &cur_samplerate;
                break;
        case SR_DI_PATTERNMODES:
-               info = &patternmodes;
+               info = &pattern_strings;
                break;
        }
 
@@ -169,7 +199,6 @@ static int *hw_get_capabilities(void)
 static int hw_set_configuration(int device_index, int capability, void *value)
 {
        int ret;
-       uint64_t *tmp_u64;
        char *stropt;
 
        /* Avoid compiler warnings. */
@@ -179,28 +208,33 @@ static int hw_set_configuration(int device_index, int capability, void *value)
                /* Nothing to do, but must be supported */
                ret = SR_OK;
        } else if (capability == SR_HWCAP_SAMPLERATE) {
-               tmp_u64 = value;
-               cur_samplerate = *tmp_u64;
+               cur_samplerate = *(uint64_t *)value;
+               sr_dbg("demo: %s: setting samplerate to %" PRIu64, __func__,
+                      cur_samplerate);
                ret = SR_OK;
        } else if (capability == SR_HWCAP_LIMIT_SAMPLES) {
-               tmp_u64 = value;
-               limit_samples = *tmp_u64;
+               limit_samples = *(uint64_t *)value;
+               sr_dbg("demo: %s: setting limit_samples to %" PRIu64, __func__,
+                      limit_samples);
                ret = SR_OK;
        } else if (capability == SR_HWCAP_LIMIT_MSEC) {
-               tmp_u64 = value;
-               limit_msec = *tmp_u64;
+               limit_msec = *(uint64_t *)value;
+               sr_dbg("demo: %s: setting limit_msec to %" PRIu64, __func__,
+                      limit_msec);
                ret = SR_OK;
        } else if (capability == SR_HWCAP_PATTERN_MODE) {
                stropt = value;
                if (!strcmp(stropt, "random")) {
-                       default_genmode = GENMODE_RANDOM;
+                       default_pattern = PATTERN_RANDOM;
                        ret = SR_OK;
                } else if (!strcmp(stropt, "incremental")) {
-                       default_genmode = GENMODE_INC;
+                       default_pattern = PATTERN_INC;
                        ret = SR_OK;
                } else {
                        ret = SR_ERR;
                }
+               sr_dbg("demo: %s: setting pattern to %d", __func__,
+                      default_pattern);
        } else {
                ret = SR_ERR;
        }
@@ -217,18 +251,18 @@ static void samples_generator(uint8_t *buf, uint64_t size, void *data)
        memset(buf, 0, size);
 
        switch (mydata->sample_generator) {
-       case GENMODE_DEFAULT:
+       case PATTERN_SIGROK:
                for (i = 0; i < size; i++) {
-                       *(buf + i) = ~(genmode_default[p] >> 1);
+                       *(buf + i) = ~(pattern_sigrok[p] >> 1);
                        if (++p == 64)
                                p = 0;
                }
                break;
-       case GENMODE_RANDOM: /* Random */
+       case PATTERN_RANDOM: /* Random */
                for (i = 0; i < size; i++)
                        *(buf + i) = (uint8_t)(rand() & 0xff);
                break;
-       case GENMODE_INC: /* Simple increment */
+       case PATTERN_INC: /* Simple increment */
                for (i = 0; i < size; i++)
                        *(buf + i) = i;
                break;
@@ -303,7 +337,7 @@ static int receive_data(int fd, int revents, void *user_data)
                        packet.length = z;
                        packet.unitsize = 1;
                        packet.payload = c;
-                       session_bus(user_data, &packet);
+                       sr_session_bus(user_data, &packet);
                }
        } while (z > 0);
 
@@ -314,7 +348,7 @@ static int receive_data(int fd, int revents, void *user_data)
 
                /* Send last packet. */
                packet.type = SR_DF_END;
-               session_bus(user_data, &packet);
+               sr_session_bus(user_data, &packet);
 
                return FALSE;
        }
@@ -328,11 +362,13 @@ static int hw_start_acquisition(int device_index, gpointer session_device_id)
        struct sr_datafeed_header *header;
        struct databag *mydata;
 
-       mydata = malloc(sizeof(struct databag));
-       if (!mydata)
+       /* TODO: 'mydata' is never g_free()'d? */
+       if (!(mydata = g_try_malloc(sizeof(struct databag)))) {
+               sr_err("demo: %s: mydata malloc failed", __func__);
                return SR_ERR_MALLOC;
+       }
 
-       mydata->sample_generator = default_genmode;
+       mydata->sample_generator = default_pattern;
        mydata->session_device_id = session_device_id;
        mydata->device_index = device_index;
        mydata->samples_counter = 0;
@@ -351,8 +387,8 @@ static int hw_start_acquisition(int device_index, gpointer session_device_id)
        g_io_channel_set_buffered(channels[0], FALSE);
        g_io_channel_set_buffered(channels[1], FALSE);
 
-       source_add(mydata->pipe_fds[0], G_IO_IN | G_IO_ERR, 40, receive_data,
-                  session_device_id);
+       sr_source_add(mydata->pipe_fds[0], G_IO_IN | G_IO_ERR, 40,
+                     receive_data, session_device_id);
 
        /* Run the demo thread. */
        g_thread_init(NULL);
@@ -364,10 +400,15 @@ static int hw_start_acquisition(int device_index, gpointer session_device_id)
        if (!my_thread)
                return SR_ERR;
 
-       packet = malloc(sizeof(struct sr_datafeed_packet));
-       header = malloc(sizeof(struct sr_datafeed_header));
-       if (!packet || !header)
+       if (!(packet = g_try_malloc(sizeof(struct sr_datafeed_packet)))) {
+               sr_err("demo: %s: packet malloc failed", __func__);
+               return SR_ERR_MALLOC;
+       }
+
+       if (!(header = g_try_malloc(sizeof(struct sr_datafeed_header)))) {
+               sr_err("demo: %s: header malloc failed", __func__);
                return SR_ERR_MALLOC;
+       }
 
        packet->type = SR_DF_HEADER;
        packet->length = sizeof(struct sr_datafeed_header);
@@ -378,9 +419,9 @@ static int hw_start_acquisition(int device_index, gpointer session_device_id)
        header->protocol_id = SR_PROTO_RAW;
        header->num_logic_probes = NUM_PROBES;
        header->num_analog_probes = 0;
-       session_bus(session_device_id, packet);
-       free(header);
-       free(packet);
+       sr_session_bus(session_device_id, packet);
+       g_free(header);
+       g_free(packet);
 
        return SR_OK;
 }
@@ -396,17 +437,17 @@ static void hw_stop_acquisition(int device_index, gpointer session_device_id)
 }
 
 struct sr_device_plugin demo_plugin_info = {
-       "demo",
-       "Demo driver and pattern generator",
-       1,
-       hw_init,
-       hw_cleanup,
-       hw_opendev,
-       hw_closedev,
-       hw_get_device_info,
-       hw_get_status,
-       hw_get_capabilities,
-       hw_set_configuration,
-       hw_start_acquisition,
-       hw_stop_acquisition,
+       .name = "demo",
+       .longname = "Demo driver and pattern generator",
+       .api_version = 1,
+       .init = hw_init,
+       .cleanup = hw_cleanup,
+       .opendev = hw_opendev,
+       .closedev = hw_closedev,
+       .get_device_info = hw_get_device_info,
+       .get_status = hw_get_status,
+       .get_capabilities = hw_get_capabilities,
+       .set_configuration = hw_set_configuration,
+       .start_acquisition = hw_start_acquisition,
+       .stop_acquisition = hw_stop_acquisition,
 };