]> sigrok.org Git - libsigrok.git/blobdiff - src/hardware/demo/protocol.c
scpi-pps: don't break SCPI devices when scanning for HP-IB devices
[libsigrok.git] / src / hardware / demo / protocol.c
index 42348a374f224d234a1bf4d6612bae45a53b43f6..eea3c9b8e7e622a72941ca23be952aa2e54c30e4 100644 (file)
@@ -187,12 +187,14 @@ SR_PRIV void demo_generate_analog_pattern(struct dev_context *devc)
        amplitude = DEFAULT_ANALOG_AMPLITUDE;
        offset = DEFAULT_ANALOG_OFFSET;
 
-       /* FIXME we actually need only one period. A ringbuffer would be
-        * useful here. */
-       /* Make sure the number of samples we put out is an integer
-        * multiple of our period size */
+       /*
+        * FIXME: We actually need only one period. A ringbuffer would be
+        * useful here.
+        * Make sure the number of samples we put out is an integer
+        * multiple of our period size.
+        */
 
-       /* PATTERN_SQUARE */
+       /* PATTERN_SQUARE: */
        sr_dbg("Generating %s pattern.", analog_pattern_str[PATTERN_SQUARE]);
        pattern = g_malloc(sizeof(struct analog_pattern));
        value = amplitude;
@@ -207,7 +209,7 @@ SR_PRIV void demo_generate_analog_pattern(struct dev_context *devc)
        pattern->num_samples = last_end;
        devc->analog_patterns[PATTERN_SQUARE] = pattern;
 
-       /*  Readjusting num_samples for all other patterns */
+       /* Readjusting num_samples for all other patterns. */
        while (num_samples % ANALOG_SAMPLES_PER_PERIOD != 0)
                num_samples--;
 
@@ -242,6 +244,21 @@ SR_PRIV void demo_generate_analog_pattern(struct dev_context *devc)
        }
        pattern->num_samples = last_end;
        devc->analog_patterns[PATTERN_SAWTOOTH] = pattern;
+
+       /* PATTERN_ANALOG_RANDOM */
+       /* Data not filled here, will be generated in send_analog_packet(). */
+       pattern = g_malloc(sizeof(struct analog_pattern));
+       pattern->num_samples = last_end;
+       devc->analog_patterns[PATTERN_ANALOG_RANDOM] = pattern;
+}
+
+SR_PRIV void demo_free_analog_pattern(struct dev_context *devc)
+{
+       g_free(devc->analog_patterns[PATTERN_SQUARE]);
+       g_free(devc->analog_patterns[PATTERN_SINE]);
+       g_free(devc->analog_patterns[PATTERN_TRIANGLE]);
+       g_free(devc->analog_patterns[PATTERN_SAWTOOTH]);
+       g_free(devc->analog_patterns[PATTERN_ANALOG_RANDOM]);
 }
 
 static uint64_t encode_number_to_gray(uint64_t nr)
@@ -408,7 +425,7 @@ static void send_analog_packet(struct analog_gen *ag,
        ag->packet.meaning->mq = ag->mq;
        ag->packet.meaning->mqflags = ag->mq_flags;
 
-       /* Set a unit for the given quantity */
+       /* Set a unit for the given quantity. */
        if (ag->mq == SR_MQ_VOLTAGE)
                ag->packet.meaning->unit = SR_UNIT_VOLT;
        else if (ag->mq == SR_MQ_CURRENT)
@@ -482,17 +499,28 @@ static void send_analog_packet(struct analog_gen *ag,
                ag_pattern_pos = analog_pos % pattern->num_samples;
                sending_now = MIN(analog_todo, pattern->num_samples - ag_pattern_pos);
                if (ag->amplitude != DEFAULT_ANALOG_AMPLITUDE ||
-                       ag->offset != DEFAULT_ANALOG_OFFSET) {
-
-                       /* Amplitude or offset changed, modify each sample */
-                       amplitude = ag->amplitude / DEFAULT_ANALOG_AMPLITUDE;
-                       offset = ag->offset - DEFAULT_ANALOG_OFFSET;
+                       ag->offset != DEFAULT_ANALOG_OFFSET ||
+                       ag->pattern == PATTERN_ANALOG_RANDOM) {
+                       /*
+                        * Amplitude or offset changed (or we are generating
+                        * random data), modify each sample.
+                        */
+                       if (ag->pattern == PATTERN_ANALOG_RANDOM) {
+                               amplitude = ag->amplitude / 500.0;
+                               offset = ag->offset - DEFAULT_ANALOG_OFFSET - ag->amplitude;
+                       } else {
+                               amplitude = ag->amplitude / DEFAULT_ANALOG_AMPLITUDE;
+                               offset = ag->offset - DEFAULT_ANALOG_OFFSET;
+                       }
                        data = ag->packet.data;
                        for (i = 0; i < sending_now; i++) {
-                               data[i] = pattern->data[ag_pattern_pos + i] * amplitude + offset;
+                               if (ag->pattern == PATTERN_ANALOG_RANDOM)
+                                       data[i] = (rand() % 1000) * amplitude + offset;
+                               else
+                                       data[i] = pattern->data[ag_pattern_pos + i] * amplitude + offset;
                        }
                } else {
-                       /* Amplitude and offset not changed, use the fast way */
+                       /* Amplitude and offset unchanged, use the fast way. */
                        ag->packet.data = pattern->data + ag_pattern_pos;
                }
                ag->packet.num_samples = sending_now;
@@ -503,11 +531,19 @@ static void send_analog_packet(struct analog_gen *ag,
        } else {
                ag_pattern_pos = analog_pos % pattern->num_samples;
                to_avg = MIN(analog_todo, pattern->num_samples - ag_pattern_pos);
-               amplitude = ag->amplitude / DEFAULT_ANALOG_AMPLITUDE;
-               offset = ag->offset - DEFAULT_ANALOG_OFFSET;
+               if (ag->pattern == PATTERN_ANALOG_RANDOM) {
+                       amplitude = ag->amplitude / 500.0;
+                       offset = ag->offset - DEFAULT_ANALOG_OFFSET - ag->amplitude;
+               } else {
+                       amplitude = ag->amplitude / DEFAULT_ANALOG_AMPLITUDE;
+                       offset = ag->offset - DEFAULT_ANALOG_OFFSET;
+               }
 
                for (i = 0; i < to_avg; i++) {
-                       value = *(pattern->data + ag_pattern_pos + i) * amplitude + offset;
+                       if (ag->pattern == PATTERN_ANALOG_RANDOM)
+                               value = (rand() % 1000) * amplitude + offset;
+                       else
+                               value = *(pattern->data + ag_pattern_pos + i) * amplitude + offset;
                        ag->avg_val = (ag->avg_val + value) / 2;
                        ag->num_avgs++;
                        /* Time to send averaged data? */
@@ -678,7 +714,7 @@ SR_PRIV int demo_prepare_data(int fd, int revents, void *cb_data)
        devc->spent_us += todo_us;
 
        if (devc->limit_frames && devc->sent_frame_samples >= SAMPLES_PER_FRAME) {
-               std_session_send_frame_end(sdi);
+               std_session_send_df_frame_end(sdi);
                devc->sent_frame_samples = 0;
                devc->limit_frames--;
                if (!devc->limit_frames) {
@@ -706,7 +742,7 @@ SR_PRIV int demo_prepare_data(int fd, int revents, void *cb_data)
                sr_dev_acquisition_stop(sdi);
        } else if (devc->limit_frames) {
                if (devc->sent_frame_samples == 0)
-                       std_session_send_frame_begin(sdi);
+                       std_session_send_df_frame_begin(sdi);
        }
 
        return G_SOURCE_CONTINUE;