Skip to content

Recipe 4 — Continuous vs Frames Modes

Continuous mode appends samples to a scrolling history, while Frames mode replaces the visible packet with the latest complete frame. In VoidLoop ViewPoint™, continuous draws new data with each point, while frames draws only after the full data set has been received — defining the frame rate. See Update Modes.

This recipe uses the same burst-shaped data in both sketches. The burst center stays fixed so the screenshots emphasize update behavior rather than motion.

Continuous mode

Continuous mode draws point by point
Recipe 4A — Continuous mode draws point by point and does NOT define FPS
#include <ViewPoint.h>
#include <math.h>

const int PACKET_SIZE = 256;

float burstCenter = 40.0f;

float burstValue(int i, float center) {
    float d = i - center;
    float pulse = expf(-(d * d) / (2.0f * 8.0f * 8.0f));
    float ripple = 0.08f * sinf(i * 0.35f);
    return pulse + ripple;
}

void setup() {
    view.begin();
    view.setDelay(2);
    view.setTitle("Continuous: point-by-point drawing");
    view.setPlotTitle("Moving Burst");
    view.setHorizontalRange(0, PACKET_SIZE);
    view.setVerticalRange(-0.2, 1.2, 0.2, 0.5);
    view.setAxisLabels("Sample", "Amplitude");
}

void loop() {
    for (int i = 0; i < PACKET_SIZE; i++) {
        view.addData("Burst", burstValue(i, burstCenter));
        view.send();
    }
}

Frames mode

Frames mode replaces the complete packet
Recipe 4B — Frames mode replaces the complete packet and defines the frame rate
#include <ViewPoint.h>
#include <math.h>

const int PACKET_SIZE = 256;

float burstCenter = 40.0f;

float burstValue(int i, float center) {
    float d = i - center;
    float pulse = expf(-(d * d) / (2.0f * 8.0f * 8.0f));
    float ripple = 0.08f * sinf(i * 0.35f);
    return pulse + ripple;
}

void setup() {
    view.begin(frames, PACKET_SIZE);
    view.setDelay(120);
    view.setTitle("Frames: full-packet replacement");
    view.setPlotTitle("Moving Burst");
    view.setHorizontalRange(0, PACKET_SIZE);
    view.setVerticalRange(-0.2, 1.2, 0.2, 0.5);
    view.setAxisLabels("Sample", "Amplitude");
}

void loop() {
    for (int i = 0; i < PACKET_SIZE; i++) {
        view.addData("Burst", burstValue(i, burstCenter));
    }

    view.send();
}

What changes

  • Continuous: view.send() is called after every point. VoidLoop ViewPoint™ receives and draws the burst one sample at a time, so the plot behaves like a scrolling stream.
  • Frames: view.send() is called once after all PACKET_SIZE samples have been added. VoidLoop ViewPoint™ receives a complete packet and replaces the previous frame in one update.
  • Same data, different timing: both sketches generate the same burst samples. The visible difference comes from when send() is called and which update mode was selected in view.begin(...).

When to use this

  • Use Continuous for telemetry, sensor streams, and values that are meaningful as history.
  • Use Frames for FFTs, oscilloscope captures, histograms, display modes, and data where packet boundaries are meaningful.

See also

examples/Cartesian/Quadrature/Quadrature.ino