unit kpadtime;
{
  Unit to do time based padding.

   Author:  Vesa Lappalainen
   Date:    30.09.1997

}

interface
uses Windows,kParam,kpadbef;

type
  TPadBeforeByTime = class(TPadBefore)
  private
    dt,t1,t2 : double;
    lastslave : integer;
  public
    ParamMinDt : TkParam;
    ParamMinDtSame : TkParam;
    constructor Create;
    procedure CheckPad(i:integer); override;
    procedure StartNew(i:integer); override;
    function Str:string; override;
  end;

implementation
uses k9cio,kdouble;

constructor TPadBeforeByTime.Create;
begin
  inherited;
  t1 := 0;
end;

procedure TPadBeforeByTime.CheckPad(i:integer);
var dmin,dmin2 : double;
begin
  dmin := 0.01;
  if ( assigned(ParamMinDt) ) then dmin := ParamMinDt.Value;
  if ( assigned(ParamMinDtSame) and ( i = lastslave ) ) then begin
    dmin2 := ParamMinDtSame.Value;
    if ( dmin2 >= 0 ) then dmin := dmin2;
  end;
  if ( dmin <= 0.000000001 ) then exit;
  t2 := ReadFCounter(clkFys);
  dt := t2 - t1;
  if ( dt > 3 ) then // Jos ajanoton kierros tullut täyteen
    dt := -1;
  if ( 0 <= dt ) and ( dt < dmin ) then
    sleep(trunc(1000*(dmin-dt)));
end;

procedure TPadBeforeByTime.StartNew(i:integer);
begin
  t1 := ReadFCounter(clkFys);
  lastslave := i;
end;

function TPadBeforeByTime.Str: string;
begin
  Result := DoubleToStr(t2,4)+' '+DoubleToStr(t1,4)
end;

end.
