]> sigrok.org Git - libsigrok.git/blobdiff - hardware/demo/demo.c
demo: Bring analog square wave amplitude into line with other patterns.
[libsigrok.git] / hardware / demo / demo.c
index 50bd50c844856dde3d1215c2940e917e7372cbcd..b5b0d786c064b9081089528d139ea0cbe7abfd16 100644 (file)
@@ -78,6 +78,8 @@ enum {
         */
        PATTERN_SQUARE,
        PATTERN_SINE,
+       PATTERN_TRIANGLE,
+       PATTERN_SAWTOOTH,
 };
 
 static const char *logic_pattern_str[] = {
@@ -91,6 +93,8 @@ static const char *logic_pattern_str[] = {
 static const char *analog_pattern_str[] = {
        "square",
        "sine",
+       "triangle",
+       "sawtooth",
 };
 
 struct analog_gen {
@@ -188,7 +192,7 @@ static void generate_analog_pattern(const struct sr_probe_group *probe_group, ui
 
        switch (ag->pattern) {
        case PATTERN_SQUARE:
-               value = 5.0;
+               value = ANALOG_AMPLITUDE;
                last_end = 0;
                for (i = 0; i < num_samples; i++) {
                        if (i % 5 == 0)
@@ -216,6 +220,36 @@ static void generate_analog_pattern(const struct sr_probe_group *probe_group, ui
                                                sin(2 * M_PI * frequency * t);
                }
 
+               ag->num_samples = num_samples;
+               break;
+
+       case PATTERN_TRIANGLE:
+               frequency = sample_rate / ANALOG_SAMPLES_PER_PERIOD;
+
+               while (num_samples % ANALOG_SAMPLES_PER_PERIOD != 0)
+                       num_samples--;
+
+               for (i = 0; i < num_samples; i++) {
+                       t = (double) i / (double) sample_rate;
+                       ag->pattern_data[i] = (2 * ANALOG_AMPLITUDE / M_PI) *
+                                               asin(sin(2 * M_PI * frequency * t));
+               }
+
+               ag->num_samples = num_samples;
+               break;
+
+       case PATTERN_SAWTOOTH:
+               frequency = sample_rate / ANALOG_SAMPLES_PER_PERIOD;
+
+               while (num_samples % ANALOG_SAMPLES_PER_PERIOD != 0)
+                       num_samples--;
+
+               for (i = 0; i < num_samples; i++) {
+                       t = (double) i / (double) sample_rate;
+                       ag->pattern_data[i] = 2 * ANALOG_AMPLITUDE *
+                                               ((t * frequency) - floor(0.5f + t * frequency));
+               }
+
                ag->num_samples = num_samples;
                break;
        }