git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@5251 8e941d3f-bd1b-0410-a28a-d453659cc2b4
		
			
				
	
	
		
			290 lines
		
	
	
		
			7.4 KiB
		
	
	
	
		
			ObjectPascal
		
	
	
	
	
	
			
		
		
	
	
			290 lines
		
	
	
		
			7.4 KiB
		
	
	
	
		
			ObjectPascal
		
	
	
	
	
	
unit main; 
 | 
						||
{ Name: EpikTimer Demo Program
 | 
						||
  Description: Test application
 | 
						||
  Author: Tom Lisjac <vlx@users.sourceforge.net>
 | 
						||
 | 
						||
  Demonstrates the capabilities of TEpikTimer in epiktimer.pas
 | 
						||
}
 | 
						||
 | 
						||
{ Copyright (C) 2003 by Tom Lisjac <vlx@users.sourceforge.net>
 | 
						||
 | 
						||
  This program is free software; you can redistribute it and/or modify it
 | 
						||
  under the terms of the GNU General Public License as published by the Free
 | 
						||
  Software Foundation; either version 2 of the License, or (at your option)
 | 
						||
  any later version.
 | 
						||
 | 
						||
  This program is distributed in the hope that it will be useful, but WITHOUT
 | 
						||
  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 | 
						||
  FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License
 | 
						||
  for more details.
 | 
						||
 | 
						||
  You should have received a copy of the GNU General Public License along with
 | 
						||
  this program; if not, write to the Free Software Foundation, Inc., 59 Temple
 | 
						||
  Place - Suite 330, Boston, MA 02111-1307, USA.
 | 
						||
}
 | 
						||
 | 
						||
{
 | 
						||
 Contributors
 | 
						||
   Felipe Monteiro de Carvalho (felipemonteiro.carvalho@gmail.com)
 | 
						||
 | 
						||
 Known Issues
 | 
						||
 | 
						||
   - Quickly written and completely undocumented... but there's nothing
 | 
						||
     complicated going on in this unit.
 | 
						||
 | 
						||
 Change log
 | 
						||
 | 
						||
  Initially written on 28-06-2003 TL
 | 
						||
  Pre-release 30-06-2003 TL - Needs testing on systems without CPUID and TSC hardware
 | 
						||
 | 
						||
  15-11-2005
 | 
						||
    Removed Linux unit to compile on Windows. It happens that main.pas didn´t
 | 
						||
   use this unit.
 | 
						||
}
 | 
						||
 | 
						||
{$mode objfpc}{$H+}
 | 
						||
 | 
						||
interface
 | 
						||
 | 
						||
uses
 | 
						||
  Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs,
 | 
						||
  Buttons, StdCtrls, ExtCtrls, EpikTimer, ComCtrls, Grids, newsw;
 | 
						||
 | 
						||
Const
 | 
						||
  MaxStopwatches=10;
 | 
						||
  
 | 
						||
type
 | 
						||
 | 
						||
  TForm1 = class(TForm)
 | 
						||
    Button1: TBUTTON;
 | 
						||
    Button10: TBUTTON;
 | 
						||
    Button11: TBUTTON;
 | 
						||
    Button12: TBUTTON;
 | 
						||
    Button13: TBUTTON;
 | 
						||
    Button14: TBUTTON;
 | 
						||
    Button15: TBUTTON;
 | 
						||
    Button16: TBUTTON;
 | 
						||
    Button17: TBUTTON;
 | 
						||
    Button18: TBUTTON;
 | 
						||
    Button2: TBUTTON;
 | 
						||
    Button3: TBUTTON;
 | 
						||
    Button4: TBUTTON;
 | 
						||
    Button5: TBUTTON;
 | 
						||
    Button6: TBUTTON;
 | 
						||
    Button7: TBUTTON;
 | 
						||
    Button8: TBUTTON;
 | 
						||
    Button9: TBUTTON;
 | 
						||
    Checkbox2: TCHECKBOX;
 | 
						||
    Checkbox3: TCHECKBOX;
 | 
						||
    Checkbox4: TCHECKBOX;
 | 
						||
    Combobox1: TCOMBOBOX;
 | 
						||
    Edit1: TEDIT;
 | 
						||
    Edit11: TEDIT;
 | 
						||
    Edit2: TEDIT;
 | 
						||
    Edit3: TEDIT;
 | 
						||
    Edit4: TEDIT;
 | 
						||
    Edit5: TEDIT;
 | 
						||
    Edit6: TEDIT;
 | 
						||
    Edit7: TEDIT;
 | 
						||
    Edit8: TEDIT;
 | 
						||
    Edit9: TEDIT;
 | 
						||
    Groupbox1: TGROUPBOX;
 | 
						||
    Groupbox2: TGROUPBOX;
 | 
						||
    Groupbox3: TGROUPBOX;
 | 
						||
    Groupbox4: TGROUPBOX;
 | 
						||
    Groupbox5: TGROUPBOX;
 | 
						||
    Idletimer1: TIDLETIMER;
 | 
						||
    Label1: TLABEL;
 | 
						||
    Label10: TLABEL;
 | 
						||
    Label11: TLABEL;
 | 
						||
    Label12: TLABEL;
 | 
						||
    Label13: TLABEL;
 | 
						||
    Label16: TLABEL;
 | 
						||
    Label17: TLABEL;
 | 
						||
    Label2: TLABEL;
 | 
						||
    Label3: TLABEL;
 | 
						||
    Label4: TLABEL;
 | 
						||
    Label5: TLABEL;
 | 
						||
    Label6: TLABEL;
 | 
						||
    Label7: TLABEL;
 | 
						||
    Label8: TLABEL;
 | 
						||
    Label9: TLABEL;
 | 
						||
    Memo1: TMEMO;
 | 
						||
    Memo2: TMEMO;
 | 
						||
    Memo3: TMEMO;
 | 
						||
    Memo4: TMEMO;
 | 
						||
    Panel1: TPANEL;
 | 
						||
    Radiogroup1: TRADIOGROUP;
 | 
						||
    procedure Button18CLICK(Sender: TObject);
 | 
						||
    procedure Button1CLICK(Sender: TObject);
 | 
						||
    procedure Button2CLICK(Sender: TObject);
 | 
						||
    procedure Button3CLICK(Sender: TObject);
 | 
						||
    procedure Button4CLICK(Sender: TObject);
 | 
						||
    procedure Button5CLICK(Sender: TObject);
 | 
						||
    procedure Button6CLICK(Sender: TObject);
 | 
						||
    procedure Button7CLICK(Sender: TObject);
 | 
						||
    procedure Button8CLICK(Sender: TObject);
 | 
						||
    procedure Checkbox2CLICK(Sender: TObject);
 | 
						||
    procedure Checkbox3CLICK(Sender: TObject);
 | 
						||
    procedure Combobox1CHANGE(Sender: TObject);
 | 
						||
    procedure Form1CREATE(Sender: TObject);
 | 
						||
    procedure Form1DESTROY(Sender: TObject);
 | 
						||
    procedure Radiogroup1CLICK(Sender: TObject);
 | 
						||
 | 
						||
  private
 | 
						||
     CurFreq,PrevFreq:Extended;
 | 
						||
     CorrelationJitter:Extended;
 | 
						||
     Iter:Integer;
 | 
						||
  public
 | 
						||
    ET:TEpikTimer;
 | 
						||
  end;
 | 
						||
 | 
						||
var
 | 
						||
  Form1: TForm1;
 | 
						||
  NewStopwatches:array[1..MaxStopwatches] of Tform2;
 | 
						||
 | 
						||
implementation
 | 
						||
 | 
						||
 | 
						||
{ TForm1 }
 | 
						||
 | 
						||
procedure TForm1.Button1CLICK(Sender: TObject);
 | 
						||
Var TimerNumber:Integer;
 | 
						||
begin
 | 
						||
  TimerNumber:=StrtoInt(Tbutton(Sender).Caption);
 | 
						||
  With Newstopwatches[TimerNumber] do
 | 
						||
    Begin
 | 
						||
      Left:=TimerNumber*8;
 | 
						||
      Top:=TimerNumber*8;
 | 
						||
      Caption:='Stopwatch '+Tbutton(Sender).Caption;
 | 
						||
      visible:=true;
 | 
						||
      show
 | 
						||
    End
 | 
						||
end;
 | 
						||
 | 
						||
procedure TForm1.Button18CLICK(Sender: TObject);
 | 
						||
begin
 | 
						||
  Showmessage('EpikTimer component demo program'+#10#10+
 | 
						||
  'By Tom Lisjac <vlx@users.sourceforge.net>'+#10+
 | 
						||
  'Additional information about this program can be found at http://theseus.sourceforge.net/fpclaz'+#10+
 | 
						||
  'or by contacting the author.');
 | 
						||
end;
 | 
						||
 | 
						||
procedure TForm1.Button2CLICK(Sender: TObject);
 | 
						||
begin
 | 
						||
  ET.Start;
 | 
						||
  Edit5.text:=ET.WallClockTime;
 | 
						||
end;
 | 
						||
 | 
						||
procedure TForm1.Button3CLICK(Sender: TObject);
 | 
						||
begin
 | 
						||
  ET.Stop;
 | 
						||
  edit11.text:=ET.WallClockTime;
 | 
						||
end;
 | 
						||
 | 
						||
procedure TForm1.Button4CLICK(Sender: TObject);
 | 
						||
begin
 | 
						||
  edit2.text:=ET.ElapsedStr;
 | 
						||
  Edit3.text:=ET.elapsedDHMS;
 | 
						||
  edit8.text:=ET.WallClockTime;
 | 
						||
end;
 | 
						||
 | 
						||
procedure TForm1.Button5CLICK(Sender: TObject);
 | 
						||
begin
 | 
						||
  ET.Clear;
 | 
						||
  edit1.text:=ET.WallClockTime;
 | 
						||
  edit2.text:=ET.ElapsedStr;
 | 
						||
  Edit3.text:=ET.elapsedDHMS;
 | 
						||
end;
 | 
						||
 | 
						||
procedure TForm1.Button6CLICK(Sender: TObject);
 | 
						||
begin
 | 
						||
  edit4.text:=format('%.0n',[extended(ET.GetHardwareTicks)]);
 | 
						||
  edit6.text:=format('%.0n',[extended(ET.GetSystemTicks)]);
 | 
						||
end;
 | 
						||
 | 
						||
procedure TForm1.Button7CLICK(Sender: TObject);
 | 
						||
begin
 | 
						||
  Inc(Iter);
 | 
						||
  ET.CalibrateCallOverheads(ET.SelectedTimebase^);
 | 
						||
  ET.CalibrateTickFrequency(ET.SelectedTimebase^);
 | 
						||
  With ET.SelectedTimebase^ do
 | 
						||
  Begin
 | 
						||
    memo2.lines.insert(0,format('%2.0d:%.0n',[Iter,extended(SleepOverhead)]));
 | 
						||
    memo3.lines.insert(0,format('%2.0d:%.0n',[Iter,extended(TicksOverhead)]));
 | 
						||
    memo4.lines.insert(0,format('%2.0d:%.0n',[Iter,extended(TicksFrequency)]));
 | 
						||
    CurFreq:=TicksFrequency;
 | 
						||
    memo1.lines.insert(0,format('%2.0d:%.0n',[Iter,CurFreq-PrevFreq]));
 | 
						||
  End;
 | 
						||
  PrevFreq:=CurFreq;
 | 
						||
end;
 | 
						||
 | 
						||
procedure TForm1.Button8CLICK(Sender: TObject);
 | 
						||
Var
 | 
						||
  CorrelatedTickFrequency:TickType;
 | 
						||
  tbdata: TimeBaseData;
 | 
						||
begin
 | 
						||
  CorrelatedTickFrequency:=ET.GetTimebaseCorrelation;
 | 
						||
  Edit9.text:=format('%.0n',[extended(CorrelationJitter-CorrelatedTickFrequency)]);
 | 
						||
  Edit7.text:=format('%.0n',[extended(CorrelatedTickFrequency)]);
 | 
						||
  CorrelationJitter:= CorrelatedTickFrequency;
 | 
						||
  If checkbox4.checked then begin
 | 
						||
    tbdata := ET.HWTimebase;
 | 
						||
    tbdata.TicksFrequency := trunc(CorrelatedTickFrequency);
 | 
						||
    ET.HWTimebase := tbdata;
 | 
						||
  end;
 | 
						||
end;
 | 
						||
 | 
						||
procedure TForm1.Checkbox2CLICK(Sender: TObject);
 | 
						||
begin
 | 
						||
  ET.WantMilliseconds:=Checkbox2.checked
 | 
						||
end;
 | 
						||
 | 
						||
procedure TForm1.Checkbox3CLICK(Sender: TObject);
 | 
						||
begin
 | 
						||
  ET.WantDays:=Checkbox3.checked
 | 
						||
end;
 | 
						||
 | 
						||
procedure TForm1.Combobox1CHANGE(Sender: TObject);
 | 
						||
begin
 | 
						||
  ET.StringPrecision:=ComboBox1.Itemindex;
 | 
						||
end;
 | 
						||
 | 
						||
procedure TForm1.Form1CREATE(Sender: TObject);
 | 
						||
  Var S:String;
 | 
						||
begin
 | 
						||
  Iter:=0;
 | 
						||
  PrevFreq:=0.0;
 | 
						||
  CorrelationJitter:=0.0;
 | 
						||
  ET:=TEpikTimer.create(nil);
 | 
						||
  RadioGroup1.itemindex:=ord(ET.TimebaseSource);
 | 
						||
  ComboBox1.itemindex:=ET.StringPrecision;
 | 
						||
  If ET.HWCapabilityDataAvailable then S:='Yes' else S:='No';
 | 
						||
  Label6.caption:=label6.caption+S;
 | 
						||
  If ET.HWTickSupportAvailable then S:='Yes' else S:='No';
 | 
						||
  Label7.caption:=label7.caption+S;
 | 
						||
  If ET.MicrosecondSystemClockAvailable then S:='Yes' else S:='No';
 | 
						||
  Label11.caption:=Label11.caption+S;
 | 
						||
  Checkbox2.checked:=ET.WantMilliseconds;
 | 
						||
  Checkbox3.checked:=ET.WantDays;
 | 
						||
  Application.showhint:=true;
 | 
						||
end;
 | 
						||
 | 
						||
procedure TForm1.Form1DESTROY(Sender: TObject);
 | 
						||
begin
 | 
						||
  ET.free;
 | 
						||
end;
 | 
						||
 | 
						||
procedure TForm1.Radiogroup1CLICK(Sender: TObject);
 | 
						||
begin
 | 
						||
  ET.TimebaseSource:= TickSources(Radiogroup1.itemindex);
 | 
						||
  Radiogroup1.itemindex:=ord(ET.TimebaseSource); // verifies the change
 | 
						||
  Iter:=0;
 | 
						||
end;
 | 
						||
 | 
						||
initialization
 | 
						||
{$i main.lrs}
 | 
						||
 | 
						||
end.
 | 
						||
 |