parameter
  psWaveForm1  : ( 1, string, 'WaveForm (Sine/Square)', 'Sine/Square', 'Sine' );
  psWaveForm2  : ( 2, string, 'WaveForm (Sine/Square)', 'Sine/Square', 'Sine' );

const
  cPI = 3.1415926536;

var
  vrActiveDuts : vector;
  vrIndex : real;
  vrLen : real;
  vrPoint : real;
  vrFrequency1 : real;
  vrFrequency2 : real;
  vrOffset1 : real;
  vrOffset2 : real;
  vrNoise1 : real;
  vrNoise2 : real;
  vrAmplitude1 : real;
  vrAmplitude2 : real;
  vrRange1 : real;
  vrRange2 : real;
  vrAmplitudeAct1 : real;
  vrAmplitudeAct2 : real;
  vrDrift1 : real;
  vrDrift2 : real;
  vrDriftAct1 : real;
  vrDriftAct2 : real;
  vCurve1 : vector;
  vCurve2 : vector;

step

  Action.Trigger(2020);

  vrActiveDuts := ActiveDuts;

  for vrIndex := 1 to Len(vrActiveDuts) do begin

    vrLen := 1000;
    vrFrequency1 := 10;
    vrFrequency2 := 15;
    vrNoise1 := 0.2;
    vrNoise2 := 0.2;
    vrAmplitude1 := 1;
    vrAmplitude2 := 2;
    vrOffset1 := 0;
    vrOffset2 := 4;
    vrRange1 := 0.5;
    vrRange2 := 0.5;
    vrDrift1 := 100;
    vrDrift2 := 100;
    SetLen(vCurve1, vrLen);
    SetLen(vCurve2, vrLen);

    vrAmplitudeAct1 := (vrAmplitude1 + Math.Random * vrRange1 - vrRange1 / 2);
    vrAmplitudeAct2 := (vrAmplitude2 + Math.Random * vrRange2 - vrRange2 / 2);

    vrDriftAct1 := Math.Random(vrDrift1);
    vrDriftAct2 := Math.Random(vrDrift2);
    for vrPoint := 1 to vrLen do begin
      case psWaveForm1 of
        'Sine'   : begin
          vCurve1[vrPoint] := vrOffset1 + vrAmplitudeAct1 * Math.Sin((vrPoint + vrDriftAct1) / vrLen * 2 * cPI * vrFrequency1) + Math.Random * vrNoise1 - vrNoise1 / 2;
        end;
        'Square' : begin
          vCurve1[vrPoint] := vrOffset1 + vrAmplitudeAct1 * Int(Math.Sin((vrPoint + vrDriftAct1) / vrLen * 2 * cPI * vrFrequency1) + 0.999) + Math.Random * vrNoise1 - vrNoise1 / 2;
        end;
      end;
      case psWaveForm2 of
        'Sine'   : begin
          vCurve2[vrPoint] := vrOffset2 + vrAmplitudeAct2 * Math.Sin((vrPoint + vrDriftAct2) / vrLen * 2 * cPI * vrFrequency2) + Math.Random * vrNoise2 - vrNoise2 / 2;
        end;
        'Square' : begin
          vCurve2[vrPoint] := vrOffset2 + vrAmplitudeAct2 * Int(Math.Sin((vrPoint + vrDriftAct2) / vrLen * 2 * cPI * vrFrequency2) + 0.999) + Math.Random * vrNoise2 - vrNoise2 / 2;
        end;
      end;
    end;

    Curve.Name(1, 'Channel 1', 'Channel 2');
    Curve.Setup(1, 1000, vCurve1, vCurve2);

    SetValueEx (vrActiveDuts[vrIndex], 0);

  end;

  DateTime.Delay(Math.Random * Val(RegForm.Get('RFE_STEPDELAY'),0), true);

end.
