]> sigrok.org Git - libsigrok.git/blobdiff - hardware/demo/demo.c
Sigma: Only send trigger packet if enabled.
[libsigrok.git] / hardware / demo / demo.c
index 86aadc4adae434d001e8f515d6476cd0079ff478..f1580a7dfc36f808ffa49d6053c041bb8a082c8e 100644 (file)
 #include <unistd.h>
 #include <string.h>
 #include <sigrok.h>
+#ifdef _WIN32
+#include <io.h>
+#include <fcntl.h>
+#define pipe(fds) _pipe(fds, 4096, _O_BINARY)
+#endif
 #include "config.h"
 
 #define NUM_PROBES             8
 #define BUFSIZE                4096
 
 enum {
+       GENMODE_DEFAULT,
        GENMODE_RANDOM,
        GENMODE_INC,
 };
 
+GIOChannel *channels[2];
+
 struct databag {
        int pipe_fds[2];
        uint8_t sample_generator;
@@ -43,15 +51,14 @@ struct databag {
        int device_index;
        int loop_sleep;
        gpointer session_device_id;
+       GTimer *timer;
 };
 
-static GThread *my_thread;
-static int thread_running;
-
 static int capabilities[] = {
        HWCAP_LOGIC_ANALYZER,
        HWCAP_PATTERN_MODE,
        HWCAP_LIMIT_SAMPLES,
+       HWCAP_LIMIT_MSEC,
        HWCAP_CONTINUOUS
 };
 
@@ -61,11 +68,25 @@ static const char *patternmodes[] = {
        NULL,
 };
 
+static uint8_t genmode_default[] = {
+       0x4c, 0x92, 0x92, 0x92, 0x64, 0x00, 0x00, 0x00,
+       0x82, 0xfe, 0xfe, 0x82, 0x00, 0x00, 0x00, 0x00,
+       0x7c, 0x82, 0x82, 0x92, 0x74, 0x00, 0x00, 0x00,
+       0xfe, 0x12, 0x12, 0x32, 0xcc, 0x00, 0x00, 0x00,
+       0x7c, 0x82, 0x82, 0x82, 0x7c, 0x00, 0x00, 0x00,
+       0xfe, 0x10, 0x28, 0x44, 0x82, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0xbe, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+};
+
 /* List of struct sigrok_device_instance, maintained by opendev()/closedev(). */
 static GSList *device_instances = NULL;
 static uint64_t cur_samplerate = 0;
-static uint64_t limit_samples = -1;
-static int default_genmode = GENMODE_RANDOM;
+static uint64_t limit_samples = 0;
+static uint64_t limit_msec = 0;
+static int default_genmode = GENMODE_DEFAULT;
+static GThread *my_thread;
+static int thread_running;
 
 static void hw_stop_acquisition(int device_index, gpointer session_device_id);
 
@@ -162,6 +183,10 @@ static int hw_set_configuration(int device_index, int capability, void *value)
                tmp_u64 = value;
                limit_samples = *tmp_u64;
                ret = SIGROK_OK;
+       } else if (capability == HWCAP_LIMIT_MSEC) {
+               tmp_u64 = value;
+               limit_msec = *tmp_u64;
+               ret = SIGROK_OK;
        } else if (capability == HWCAP_PATTERN_MODE) {
                stropt = value;
                if (!strcmp(stropt, "random")) {
@@ -183,11 +208,19 @@ static int hw_set_configuration(int device_index, int capability, void *value)
 static void samples_generator(uint8_t *buf, uint64_t size, void *data)
 {
        struct databag *mydata = data;
-       uint64_t i;
+       uint64_t p, i;
 
        memset(buf, 0, size);
 
        switch (mydata->sample_generator) {
+       case GENMODE_DEFAULT:
+               p = 0;
+               for (i = 0; i < size; i++) {
+                       *(buf + i) = ~(genmode_default[p] >> 1);
+                       if (++p == 64)
+                               p = 0;
+               }
+               break;
        case GENMODE_RANDOM: /* Random */
                for (i = 0; i < size; i++)
                        *(buf + i) = (uint8_t)(rand() & 0xff);
@@ -205,6 +238,8 @@ static void thread_func(void *data)
        struct databag *mydata = data;
        uint8_t buf[BUFSIZE];
        uint64_t nb_to_send = 0;
+       int bytes_written;
+       unsigned int msec_elapsed;
 
        while (thread_running) {
                if (limit_samples)
@@ -212,6 +247,12 @@ static void thread_func(void *data)
                else
                        nb_to_send = BUFSIZE;  /* Continuous mode */
 
+               if (limit_msec) {
+                       msec_elapsed = g_timer_elapsed(mydata->timer, NULL) * 1000;
+                       if (msec_elapsed > limit_msec)
+                               nb_to_send = 0;
+               }
+
                if (nb_to_send == 0) {
                        close(mydata->pipe_fds[1]);
                        thread_running = 0;
@@ -224,7 +265,9 @@ static void thread_func(void *data)
                samples_generator(buf, nb_to_send, data);
                mydata->samples_counter += nb_to_send;
 
-               write(mydata->pipe_fds[1], &buf, nb_to_send);
+               g_io_channel_write_chars(channels[1], (gchar *)&buf,
+                               nb_to_send, (gsize *)&bytes_written, NULL);
+
                g_usleep(mydata->loop_sleep);
        }
 }
@@ -237,9 +280,11 @@ static int receive_data(int fd, int revents, void *user_data)
        uint64_t z;
 
        /* Avoid compiler warnings. */
+       fd = fd;
        revents = revents;
 
-       z = read(fd, &c, BUFSIZE);
+       g_io_channel_read_chars(channels[0], (gchar *)&c, BUFSIZE, &z, NULL);
+
        if (z > 0) {
                packet.type = DF_LOGIC;
                packet.length = z;
@@ -269,11 +314,24 @@ static int hw_start_acquisition(int device_index, gpointer session_device_id)
        if (pipe(mydata->pipe_fds))
                return SIGROK_ERR;
 
+       channels[0] = g_io_channel_unix_new(mydata->pipe_fds[0]);
+       channels[1] = g_io_channel_unix_new(mydata->pipe_fds[1]);
+
+       /* Set channel encoding to binary (default is UTF-8). */
+       g_io_channel_set_encoding(channels[0], NULL, NULL);
+       g_io_channel_set_encoding(channels[1], NULL, NULL);
+
+       /* Make channels to unbuffered. */
+       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);
 
        /* Run the demo thread. */
        g_thread_init(NULL);
+       if (limit_msec)
+               mydata->timer = g_timer_new();
        thread_running = 1;
        my_thread =
            g_thread_create((GThreadFunc)thread_func, mydata, TRUE, NULL);