//Tomáš Vičar
//10.4.2013
//Program pro nahrávání signálu EDA

unit FormMain;

interface

uses
   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, TeeScroB, TeEngine, Series, ExtCtrls, TeeProcs, Chart, Buttons;

const

   // velikost vstupniho a vystupniho bufferu
   BufferInSize  = 3;
   BufferOutSize = 1;
type
   //deklarace bufferu
   TBufferIn = array[0..BufferInSize] of byte;
   TBufferOut = array[0..BufferOutSize] of byte;
   //deklarace všech použitých objektů
   TForm1 = class(TForm)
   Chart1: TChart;
    Series1: TFastLineSeries;
    Label1: TLabel;
    Label2: TLabel;
    Button6: TButton;
    CheckBox1: TCheckBox;
    Series2: TPointSeries;
    Series3: TPointSeries;
    Series4: TPointSeries;
    Button1: TButton;
    Button3: TButton;
    Button5: TButton;
    Button8: TButton;
    Button9: TButton;
    Button10: TButton;
    BitBtn1: TBitBtn;
    BitBtn2: TBitBtn;
    Button11: TButton;
    Button12: TButton;
    Button4: TButton;
    Button7: TButton;
    Edit1: TEdit;
    Label3: TLabel;
    Button14: TButton;
    Button15: TButton;
    Button16: TButton;
    Label4: TLabel;
    Label5: TLabel;
    Label6: TLabel;
    Label7: TLabel;
    Edit2: TEdit;
    Edit3: TEdit;
    Edit4: TEdit;
    Edit5: TEdit;
    Edit6: TEdit;
    Edit7: TEdit;
    CheckBox2: TCheckBox;
    CheckBox3: TCheckBox;
    RadioButton4: TRadioButton;
    RadioButton5: TRadioButton;
    RadioGroup1: TRadioGroup;
    Button2: TButton;
    Button13: TButton;
    //deklarace všech použitých procedur
      procedure FormCreate(Sender: TObject);
      procedure FormDestroy(Sender: TObject);
    procedure Button6Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button5Click(Sender: TObject);
    procedure Button8Click(Sender: TObject);
    procedure BitBtn2Click(Sender: TObject);
    procedure BitBtn1Click(Sender: TObject);
    procedure Button9Click(Sender: TObject);
    procedure Button10Click(Sender: TObject);
    procedure Button12Click(Sender: TObject);
    procedure Button11Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure Button14Click(Sender: TObject);
    procedure Button16Click(Sender: TObject);
    procedure Button15Click(Sender: TObject);
    procedure Button7Click(Sender: TObject);
    procedure RadioButton4Click(Sender: TObject);
    procedure RadioButton5Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button13Click(Sender: TObject);
   private
      FBufferIn:TBufferIn;
      FBufferOut:TBufferOut;
      function USBEvent(var Msg: TMessage): Boolean;
   public
   end;

var
  Form1: TForm1;    //hlavní okno
  a:integer=10;     //promena hlidajici posuv
  b:integer=0;      //promena pro cislo posledniho vzorku
  //q:real=0;
  barr:integer=0;       //    cislo stimulace
  vel:integer=1000000;       //velikost datoveho pole
  pomvel:integer=1;           //
  barv:integer=1;             // typ stimulace
  c:array of Integer;             // nefiltrovana data
  d:array of Real;                   //data filtrovaná FIR
  e:array of Real;                   //data filtrovaná prumerovacim filtrem
  bar:array of SmallInt;              //   pomocna promena pro nacitani stimulací
  cas:array of Integer;               //  cas stimulace
  krok,maxu,maxg,minu,ming,max:real;     //promene pro nastaveni os
  fvz:real=125;                           //vzorkovací frekvence
  opak:real=100;                           //pomocná proměná pro mazání chybových hodnot
  hh:real;                                   //pomocná proměná pro mazání chybových hodnot
  pomocna:string;                             //pomocna promena pro přefiltrování signálu

implementation

uses
   cUSBInterface,
   cUSBInterfaceTypes;

const

   // Nastaveni Verdon a PRoduct ID (stejné jako v modulu)
   VENDOR_ID           = 1121;
   PRODUCT_ID          = 32;

{$R *.DFM}

{
****************************************************************************
* Name    : Create                                                         *
* Purpose : Create the main form                                           *
****************************************************************************
}
procedure TForm1.FormCreate(Sender: TObject);
begin
   Application.HookMainWindow(USBEvent);      //zahajeni komunikace
   Connect(Application.Handle);
   krok:=2000/fvz;                          //velikost časove osy
   maxu:=70;                                 //maximum y osy pro U
   minu:=-90;                                 //minimum y osy  pro U
   maxg:=200;                                 //maximum y osy pro G
   ming:=0;                                    //minimum y osy  pro G
   max:=maxu;                                  //nastavení posouvaciho kroku 
 // Number of points deleted when scrolling chart
    Series1.AutoRepaint := False;             //vypnuti překreslovábí
Series1.XValues.Order := loNone;
Chart1.LeftAxis.SetMinMax(minu,maxu);                    //nastaveni os
 Chart1.BottomAxis.SetMinMax(0,krok);
 Chart1.Canvas.ReferenceCanvas.Pen.OwnerCriticalSection := nil;
 Series1.LinePen.OwnerCriticalSection := nil;
 Setlength(c,vel);                                   //nastavení datových polí
 Setlength(d,vel);
 Setlength(e,vel);
 Setlength(bar,100);                          //nastavení polí záznamu stimulací
 Setlength(cas,100);

 b:=21;
end;
{
****************************************************************************
* Name    : Destroy                                                        *
* Purpose : Free the main form                                             *
****************************************************************************
}
procedure TForm1.FormDestroy(Sender: TObject);
begin
   Application.UnHookMainWindow(USBEvent);
end;
{
****************************************************************************
* Name    : USBEvent                                                       *
* Purpose : DLL message handler hook                                       *
****************************************************************************
}
function TForm1.USBEvent(var Msg: TMessage): Boolean;   //vygenerovaná funkce pro komunikaci s USB
var
   DevHandle:cardinal;
     o:integer;                                     //lokalni pomocné proměnné
     p:integer;
//   TextBuffer:array[0..255] of char;
begin
  result := False;
  if Msg.Msg = WM_HID_EVENT then
  begin
     case Msg.WParam of

        NOTIFY_PLUGGED :              //zařízení připojeno
        begin
           DevHandle := Msg.LParam;
           if (GetVendorID(DevHandle) = VENDOR_ID) and (GetProductID(DevHandle) = PRODUCT_ID) then      //pokud odpovídá VID a PID
           begin
              Label2.Caption:='Připojeno';       //vypsat nápis připojeno
              Label2.Font.Color:=clGreen;        //nápis zelenou barvou
           end;
           result := true;
        end;

        // a HID device has been device removed...
        NOTIFY_UNPLUGGED :   //zařízení nepripojeno
        begin

           // is it our HID device...
           DevHandle := Msg.LParam; // handle of HID device in this message
           if (GetVendorID(DevHandle) = VENDOR_ID) and (GetProductID(DevHandle) = PRODUCT_ID) then           //pokud zařízení neodpovídá
           begin
              Label2.Caption:='Odpojeno';     //vypsat nnápis odpojeno
              Label2.Font.Color:=clRed        //nápis červenou barvou
           end;
           result := true;
        end;

        // a HID device has been attached or removed. This event is fired after
        // either NotifyPlugged or NotifyUnplugged.
        NOTIFY_CHANGED :
        begin
           // get the handle of the device we are interested in
           // and set it's read notification flag to true...
           DevHandle := GetHandle(VENDOR_ID,PRODUCT_ID);
           SetReadNotify(DevHandle,true);
           result := true;
        end;

        // a HID device has sent some data..
        NOTIFY_READ :
        begin
           DevHandle := Msg.LParam; // handle of HID device in this message
           if (GetVendorID(DevHandle) = VENDOR_ID) and (GetProductID(DevHandle) = PRODUCT_ID) then
           begin
               // read the data - remember that first byte is report ID...
               Read(DevHandle,@FBufferIn);

             Read(DevHandle,@FBufferIn);
             if Button1.Caption='Pauza' then        // vykreslovíní grafu pokud neni zapauzováno
             begin
               c[b]:=FBufferIn[1]+(FBufferIn[2])*256;     //nacteni dat
               hh:=Abs(c[b-1]-c[b]);                      //mazani chybocých hodnot    (v signálu se občas vyskytuje impulzí chyba neznámého původu)
               if hh>30 then                              //pokud se hodnota liší více než o 30 --chybová hodnota
               begin
               if opak<1 then
               begin
               c[b]:=c[b-1];                              //prřemazat chybovou hodnotu předchozí hodnotou
               opak:=2 ;                                  //pojistka pro případ opakované chyby(skokové změny v signálu)
               end;
               end;
               opak:=opak-1;
               if CheckBox3.Checked=True then                    //pokud je zapnuta průměrovací filtrace
               // násobení vzorků impulzní charakteristikou Lynnova FIR filtru vygenerovaného v programu Matlab
               d[b]:=c[b-20]*(-0.00244824236588929)+c[b-19]*(-0.00360028834464409)+c[b-18]*(-0.00520205823350302)+c[b-17]*(-0.00456252215557739)+c[b-16]*(0.00267420585573567)+c[b-15]*(0.0204268094300300)+c[b-14]*(0.0496526206802802)+c[b-13]*(0.0867497795848974)+c[b-12]*(0.123909463767098)+c[b-11]*(0.151528274131286)+c[b-10]*(0.161743915300573)+c[b-9]*(0.151528274131286)+c[b-8]*(0.123909463767098)+c[b-7]*(0.0867497795848974)+c[b-6]*(0.0496526206802802)+c[b-5]*(0.0204268094300300)+c[b-4]*(0.00267420585573567)+c[b-3]*(-0.00456252215557739)+c[b-2]*(-0.00520205823350302)+c[b-1]*(-0.00360028834464409)+c[b]*(-0.00244824236588929);
               if CheckBox2.Checked=True then  //pokud je zapnuta FIR filtrace
               begin
                //průměrovací a FIR
                if CheckBox3.Checked=True then e[b]:=(d[b-30]+d[b-29]+d[b-28]+d[b-27]+d[b-26]+d[b-25]++d[b-24]+d[b-23]+d[b-22]+d[b-21]+d[b-20]+d[b-19]+d[b-18]+d[b-17]+d[b-16]+d[b-15]+d[b-14]+d[b-13]+d[b-12]+d[b-11]+d[b-10]+d[b-9]+d[b-8]+d[b-7]+d[b-6]+d[b-5]+d[b-4]+d[b-3]+d[b-2]+d[b-1]+d[b])/31
                else e[b]:=(c[b-30]+c[b-29]+c[b-28]+c[b-27]+c[b-26]+c[b-25]+c[b-24]+c[b-23]+c[b-22]+c[b-21]+c[b-20]+c[b-19]+c[b-18]+c[b-17]+c[b-16]+c[b-15]+c[b-14]+c[b-13]+c[b-12]+c[b-11]+c[b-10]+c[b-9]+c[b-8]+c[b-7]+c[b-6]+c[b-5]+c[b-4]+c[b-3]+c[b-2]+c[b-1]+c[b])/31;
                  if RadioButton4.Checked=True then   //průměrovací, FIR, potenciál
                Series1.AddXY((b)/fvz,(e[b]-2232)*0.030666)   //přepočet a vykresleni pro potenciál s obema filtry -- konstanty zjištěny při kalibrování
                else    //průměrovací, FIR, vodivost
                Series1.AddXY((b)/fvz,1000*(4.88-(e[b]-2050)*0.001191406*0.639166)/(510*(e[b]-2050)*0.001191406*0.639166));     //přepočet a vykresleni pro vodivost s obema filtry--konstanty zjištěny při kalibrování
               end
               else     //ne průměrovací filtrace
                begin
                if CheckBox3.Checked=True then //s FIR
                begin
                if RadioButton4.Checked=True then   // FIR, ne průměrovací, potenciál
                Series1.AddXY((b)/fvz,(d[b]-2232)*0.030666)  //přepočet a vykresleni pro potenciál s FIR filtrem
                else    //FIR, ne prumerovaci, vodivost
                Series1.AddXY((b)/fvz,1000*(4.88-(d[b]-2050)*0.001191406*0.639166)/(510*(d[b]-2050)*0.001191406*0.639166));           //přepočet a vykresleni pro vodivost s FIR filtrem
                end
                else           //ne FIR  (ani průměrovací)
                begin
                  if RadioButton4.Checked=True then
                Series1.AddXY((b)/fvz,(c[b]-2232)*0.030666)   //přepočet a vykresleni pro potenciál bez filtrace
                else
                Series1.AddXY((b)/fvz,1000*(4.88-(c[b]-2050)*0.001191406*0.639166)/(510*(c[b]-2050)*0.001191406*0.639166));   //přepočet a vykresleni pro vodivost  bez filtrace
                end
                end;
               a:=a+1;      //navýšení pomocné proměnné pro posuv
               b:=b+1;     //navýšení čísla vzorku
               if(a>Abs(Chart1.BottomAxis.Maximum-Chart1.BottomAxis.Minimum)*fvz) then    //pokud je pomocná proměnná větší než rozsah časové osy
               begin
                  a:=0;              //vynulovat pomocnou promenou pro psuv
                  if CheckBox1.Checked=True then    //automatický posuv casu zapnuto
                  Series1.GetHorizAxis.SetMinMax(b/fvz,b/fvz+Abs(Chart1.BottomAxis.Maximum-Chart1.BottomAxis.Minimum));  //posunout časovou osu o nastaveny rozzsah
               end;
               end;
           end;
           result := true;
        end;
     end;
  end;
end;

//případné odeslání dat do zařízení--nevyužito, ale ponecháno pro možnost rozšíření
(*
   if you want to write some data to the USB device, then
   try using something like this...

   // first element is report ID, set to 0...
   FBufferOut[0] := $0;

   // fill the buffer with some data...
   for index := 1 to BufferOutSize do
      FBufferOut[index] := index;

   DevHandle := GetHandle(VendorID, ProductID);
   Write(DevHandle,@FBufferOut);
*)

procedure TForm1.Button6Click(Sender: TObject);    //tlačítko zapsat stimul (vykreslí stimulaci a uloži ho do datové proměnné pro stimulace)
begin
if RadioGroup1.ItemIndex=0 then  //nastvena zelená stimulace
begin
barv:=1;                      //pomocná proměnná pro typ stimulace nastavena na zelenou(1)
//vykreslení na místo poslendího datového vzorku--podle typu dat(potenciál/vodivost) a filtrace
//stejný výpočet jako pro vykreslení běžných dat -- pry bližší popis odkazuji na řádek 250!!
               if CheckBox2.Checked=True then
                begin
                if RadioButton4.Checked=True then
                  Series2.AddXY((b-1)/fvz,(e[b-1]-2232)*0.030666)
                else
                  Series2.AddXY((b-1)/fvz,1000*(4.88-(e[b-1]-2050)*0.001191406*0.639166)/(510*(e[b-1]-2050)*0.001191406*0.639166))
                end
               else
                begin
                if CheckBox3.Checked=True then
                  begin
                  if RadioButton4.Checked=True then
                    Series2.AddXY((b-1)/fvz,(d[b-1]-2232)*0.030666)
                  else
                    Series2.AddXY((b-1)/fvz,1000*(4.88-(d[b-1]-2050)*0.001191406*0.639166)/(510*(d[b-1]-2050)*0.001191406*0.639166));
                  end
                else
                  begin
                  if RadioButton4.Checked=True then
                    Series2.AddXY((b-1)/fvz,(c[b-1]-2232)*0.030666)
                  else
                    Series2.AddXY((b-1)/fvz,1000*(4.88-(c[b-1]-2050)*0.001191406*0.639166)/(510*(c[b-1]-2050)*0.001191406*0.639166));
                  end
               end;
end;

if RadioGroup1.ItemIndex=1 then // typ stimulace nastaven na žllutou

 begin
barv:=2;         //pomocná proměnná pro typ stimulace--žlutá =2
//vykreslení na místo poslendího datového vzorku--podle typu dat(potenciál/vodivost) a filtrace
//stejný výpočet jako pro vykreslení běžných dat -- pry bližší popis odkazuji na řádek 250!!
               if CheckBox2.Checked=True then
                begin
                if RadioButton4.Checked=True then
                  Series3.AddXY((b-1)/fvz,(e[b-1]-2232)*0.030666)
                else
                  Series3.AddXY((b-1)/fvz,1000*(4.88-(e[b-1]-2050)*0.001191406*0.639166)/(510*(e[b-1]-2050)*0.001191406*0.639166))
                end
               else
                begin
                if CheckBox3.Checked=True then
                  begin
                  if RadioButton4.Checked=True then
                    Series3.AddXY((b-1)/fvz,(d[b-1]-2232)*0.030666)
                  else
                    Series3.AddXY((b-1)/fvz,1000*(4.88-(d[b-1]-2050)*0.001191406*0.639166)/(510*(d[b-1]-2050)*0.001191406*0.639166));
                  end
                  else
                    begin
                      if RadioButton4.Checked=True then
                        Series3.AddXY((b-1)/fvz,(c[b-1]-2232)*0.030666)
                  else
                    Series3.AddXY((b-1)/fvz,1000*(4.88-(c[b-1]-2050)*0.001191406*0.639166)/(510*(c[b-1]-2050)*0.001191406*0.639166));
                  end
                end;
 end;


if RadioGroup1.ItemIndex=2 then          //typ stimulace nastaven na modrá
 begin
barv:=3;                 // pomocná proměnná pro typ stimulace 3=modrá
//vykreslení na místo poslendího datového vzorku--podle typu dat(potenciál/vodivost) a filtrace
//stejný výpočet jako pro vykreslení běžných dat -- pry bližší popis odkazuji na řádek 250!!
               if CheckBox2.Checked=True then
                begin
                if RadioButton4.Checked=True then
                  Series4.AddXY((b-1)/fvz,(e[b-1]-2232)*0.030666)
                else
                  Series4.AddXY((b-1)/fvz,1000*(4.88-(e[b-1]-2050)*0.001191406*0.639166)/(510*(e[b-1]-2050)*0.001191406*0.639166))
                end
               else
                begin
                if CheckBox3.Checked=True then
                  begin
                  if RadioButton4.Checked=True then
                    Series4.AddXY((b-1)/fvz,(d[b-1]-2232)*0.030666)
                  else
                    Series4.AddXY((b-1)/fvz,1000*(4.88-(d[b-1]-2050)*0.001191406*0.639166)/(510*(d[b-1]-2050)*0.001191406*0.639166));
                  end
                  else
                    begin
                      if RadioButton4.Checked=True then
                        Series4.AddXY((b-1)/fvz,(c[b-1]-2232)*0.030666)
                  else
                    Series4.AddXY((b-1)/fvz,1000*(4.88-(c[b-1]-2050)*0.001191406*0.639166)/(510*(c[b-1]-2050)*0.001191406*0.639166));
                  end
                end;
 end;


bar[barr]:=barv;       //typ stimulace
cas[barr]:=b;          //cas stimulace
barr:=barr+1;          //zvýšit čísloslo stimulace
end;
procedure TForm1.Button1Click(Sender: TObject);  //pauzovaci tlacitko
begin
if Button1.Caption='Start' then     //změna nápisu při stisku tlačítka
Button1.Caption:='Pauza'
else
Button1.Caption:='Start';
end;

procedure TForm1.Button3Click(Sender: TObject);      //vymazani grafu
begin
Series1.Clear;              //vymazání grafu
Series2.Clear;
Series3.Clear;
Series4.Clear;
a:=0;
b:=21;
Setlength(c,0);                 //vymazání datových polí
Setlength(c,vel);
Setlength(bar,0);
Setlength(bar,100);
Setlength(cas,0);
Setlength(cas,100);
CheckBox1.Checked:=True;
//nastavení rozsahu os
Series1.GetHorizAxis.SetMinMax(0,krok);  //nastavení časové osy na začátek
if RadioButton4.Checked=True then
Series1.GetVertAxis.SetMinMax(minu,maxu) //nastavení hodnotové osy pro potenciál
else
Series1.GetVertAxis.SetMinMax(ming,maxg);    //nastavení hodnotové osy pro vodivost
end;

/////////////////zoomovaci a posouvaci tlacitka

procedure TForm1.Button5Click(Sender: TObject);  //posunití časové osy doleva
begin
//zmenšení maxima i minima o pětinu rozsahu
Series1.GetHorizAxis.SetMinMax(Chart1.BottomAxis.Minimum-Abs(Chart1.BottomAxis.Maximum-Chart1.BottomAxis.Minimum)/5,Chart1.BottomAxis.Maximum-Abs(Chart1.BottomAxis.Maximum-Chart1.BottomAxis.Minimum)/5);
end;

procedure TForm1.Button8Click(Sender: TObject); //posunutí časové osy doprava
begin
//zvýšení maxima i minima o pětinu rozsahu
Series1.GetHorizAxis.SetMinMax(Chart1.BottomAxis.Minimum+Abs(Chart1.BottomAxis.Maximum-Chart1.BottomAxis.Minimum)/5,Chart1.BottomAxis.Maximum+Abs(Chart1.BottomAxis.Maximum-Chart1.BottomAxis.Minimum)/5);
end;

procedure TForm1.BitBtn2Click(Sender: TObject); //posunutí hodnotové osy nahoru
begin
//zvýšení maxima i minima o pětinu rozsahu
Series1.GetVertAxis.SetMinMax(Chart1.LeftAxis.Minimum+Abs(Chart1.LeftAxis.Maximum-Chart1.LeftAxis.Minimum)/5,Chart1.LeftAxis.Maximum+Abs(Chart1.LeftAxis.Maximum-Chart1.LeftAxis.Minimum)/5);
end;

procedure TForm1.BitBtn1Click(Sender: TObject); //posun hodnotove osy dolu
begin
//snížení maxima i minima o pětinu rozsahu
Series1.GetVertAxis.SetMinMax(Chart1.LeftAxis.Minimum-Abs(Chart1.LeftAxis.Maximum-Chart1.LeftAxis.Minimum)/5,Chart1.LeftAxis.Maximum-Abs(Chart1.LeftAxis.Maximum-Chart1.LeftAxis.Minimum)/5);
end;

procedure TForm1.Button9Click(Sender: TObject); //+ zoom časové osy
begin      // o jednu desitinu rozsahu se posune dolni hranice nahoru a hornni hranice dolu
Series1.GetHorizAxis.SetMinMax(Chart1.BottomAxis.Minimum+0.1*Abs(Chart1.BottomAxis.Maximum-Chart1.BottomAxis.Minimum),Chart1.BottomAxis.Minimum+Abs(Chart1.BottomAxis.Maximum-Chart1.BottomAxis.Minimum)*0.9);
end;

procedure TForm1.Button10Click(Sender: TObject);  //- zoom časové osy
begin      // o jednu desitinu rozsahu se posune dolni hranice dolu a hornni hranice nahoru
Series1.GetHorizAxis.SetMinMax(Chart1.BottomAxis.Minimum-0.1*Abs(Chart1.BottomAxis.Maximum-Chart1.BottomAxis.Minimum),Chart1.BottomAxis.Minimum+Abs(Chart1.BottomAxis.Maximum-Chart1.BottomAxis.Minimum)*1.1);
end;

procedure TForm1.Button11Click(Sender: TObject);  //+ zoom hodnotové osy
begin     // o jednu desitinu rozsahu se posune dolni hranice nahoru a hornni hranice dolu
Series1.GetVertAxis.SetMinMax(Chart1.LeftAxis.Minimum+0.1*Abs(Chart1.LeftAxis.Maximum-Chart1.LeftAxis.Minimum),Chart1.LeftAxis.Minimum+Abs(Chart1.LeftAxis.Maximum-Chart1.LeftAxis.Minimum)*0.9);
end;

procedure TForm1.Button12Click(Sender: TObject);   //- zoom hodnotové osy
begin        // o jednu desitinu rozsahu se posune dolni hranice dolu a hornni hranice nahoru
Series1.GetVertAxis.SetMinMax(Chart1.LeftAxis.Minimum-0.1*Abs(Chart1.LeftAxis.Maximum-Chart1.LeftAxis.Minimum),Chart1.LeftAxis.Minimum+Abs(Chart1.LeftAxis.Maximum-Chart1.LeftAxis.Minimum)*1.1);
end;

procedure TForm1.Button4Click(Sender: TObject);    //ukladani
var f:TExtFile;   //promena pro nazev souboru
  i,nast:integer;                //pomocna promena, promena pro nastaveni(filtrů a typu dat)
begin
  AssignFile(f, Edit6.Text+'.txt');  // spojí souborovou proměnnou se jménem souboru
  try
    Rewrite(f); // vytvoří nový soubor
    WriteLn(f,'2. ř.=poznámka, 3. ř.=fvz; 4. ř.=počet stimulů(x), 5.ř.=počet vzorků, 6. - (x+5). ř. = typ stimulu (x+6).-(2x+5).ř. = časy stimulů,(2x+6)ř. = nastavení,(2x+7)- N.ř.=data'); //popis textoveho souboru
    WriteLn(f,Edit1.Text); //ukladani poznamy
    WriteLn(f,FloatToStr(fvz));  //ulozeni fvz
    WriteLn(f,IntToStr(barr));   //ulozeni poctu stimulaci
    WriteLn(f,IntToStr(b));      //ulozeni delky dat
    for i := 0 to barr do      //ulozeni typu stimulaci
    begin
    WriteLn(f,bar[i]); // zapíše do souboru řádku textu
    end;
    for i := 0 to barr do       //ulozeni casu stimulaci
    begin
    WriteLn(f,cas[i]); // zapíše do souboru řádku textu
    end;
    if RadioButton4.Checked=True then //potenciál          //ulozeni nastaveni filtrů a typu dat
    begin                                      //vodivost/potenciál + FIR/bezFIR + prumerovací/bezprumerovacího =>8 kombinací
      If CheckBox2.Checked=True then  //prumerovaci
      begin
        If CheckBox3.Checked=True then   //FIR
          nast:=1                      //pot+prum+FIR
        else
        nast:=3;                      //pot+prum+bezFIR
      end
      else
      begin
        If CheckBox3.Checked=True then    //FIR
          nast:=2                   //pot+bez prum+FIR
        else
          nast:=7;                  //pot+bez prum+bez FIR
      end
    end
    else                               ///vodivost
    begin
      If CheckBox2.Checked=True then       //pruměrovací
      begin
        If CheckBox3.Checked=True then       //FIR
          nast:=4                          //vod + prum +FIR
        else
        nast:=6;                         //vod + prum + bez FIR
      end
      else
      begin
        If CheckBox3.Checked=True then
          nast:=5                          //vod + bez prum + FIR
        else
          nast:=8;                      ////vod + bez prum + bez FIR
      end;
    end;
WriteLn(f,IntToStr(nast));


    for i := 0 to b do          //ulozeni dat
    begin
    WriteLn(f, c[i]); // zapíše do souboru řádku textu
    end;
  finally
    CloseFile(f); // ukončí práci se souborem
end;
end;
procedure TForm1.Button14Click(Sender: TObject);        //zobrazeni celeho rozsahu(srovnani os)
begin
Series1.GetHorizAxis.SetMinMax(b/fvz-krok/2,b/fvz+krok/2); //na konec signálu
//Chart1.LeftAxis.Minimum:=0;
//Chart1.LeftAxis.Maximum:=max;
if RadioButton4.Checked=True then      //rozsah hodnot prodle typu signálu(vodivost/potenciál)
Series1.GetVertAxis.SetMinMax(minu,maxu)
else
Series1.GetVertAxis.SetMinMax(ming,maxg);
end;

procedure TForm1.Button16Click(Sender: TObject);   //zoom x zadanim ciselnych hodnot
begin
if StrToFloat(Edit2.Text)>StrToFloat(Edit3.Text) then
Series1.GetHorizAxis.SetMinMax(StrToFloat(Edit3.Text),StrToFloat(Edit2.Text));
end;

procedure TForm1.Button15Click(Sender: TObject);   //zoom y zadanim ciselnych hodnot
begin
if StrToFloat(Edit5.Text)>StrToFloat(Edit4.Text) then
begin
max:=StrToFloat(Edit5.Text)-StrToFloat(Edit4.Text);
//Chart1.LeftAxis.Minimum:=StrToFloat(Edit4.Text);
//Chart1.LeftAxis.Maximum:=StrToFloat(Edit5.Text);
Series1.GetVertAxis.SetMinMax(StrToFloat(Edit4.Text),StrToFloat(Edit5.Text));
end
end;

procedure TForm1.Button7Click(Sender: TObject); //nacitani dat
var f:TExtFile;
  i:integer;                //pomocna promena   for cyklu
  j:string;                 //pomocna promena  retezec
  k:integer;                //pomocna promena  for cyklu
  l,nast:integer;
begin
k:=0;
Series1.Clear;         //vymazani předchozich dat
Series2.Clear;
Series3.Clear;
Series4.Clear;
a:=0;                //vymazani pomocne promene pro posuv
b:=0;                 //vymazani promene pro cislo aktualniho vzorku
Setlength(c,0);            //vynulováni datových polí
Setlength(c,vel);
Setlength(bar,0);
Setlength(bar,100);
Setlength(cas,0);
Setlength(cas,100);
CheckBox1.Checked:=True;
if RadioButton4.Checked=True then                      //nastaveni rozsahu os podle G/U
Series1.GetVertAxis.SetMinMax(minu,maxu)
else
Series1.GetVertAxis.SetMinMax(ming,maxg);

AssignFile(f, Edit6.Text+'.txt');         //nazev souboru
try
Reset(f);              //zacatak nacitani
ReadLn(f);             //informacni pozmka se nepouziva
ReadLn(f,j);
Edit1.Text:=j;      //nacteni poznamky
ReadLn(f,j);
fvz:=StrToFloat(j);    //nacteni fvz
ReadLn(f,j);
barr:= StrToInt(j);       //nacteni poctu stimulu
ReadLn(f,j);
k:= StrToInt(j);              //nacteni typu stimulu
for i:=0 to barr do
begin
ReadLn(f,j);
bar[i]:= StrToInt(j);
end;
for i:=0 to barr do          //nacteni casu stimulu
begin
ReadLn(f,j);
cas[i]:= StrToInt(j);
end;

ReadLn(f,j);                         //nacteni nastaveni
nast:= StrToInt(j);
if nast=1 then                          //nastavit filtry a typ signalu dle nastaveni
begin                                   ///vyznam cisel nastaveni viz řádek 512 --ukládání nataveni
RadioButton4.Checked:=True;
RadioButton5.Checked:=False;
CheckBox2.Checked:=True;
CheckBox3.Checked:=True;
end;
if nast=2 then
begin
RadioButton4.Checked:=True;
RadioButton5.Checked:=False;
CheckBox2.Checked:=False;
CheckBox3.Checked:=True;
end;
if nast=3 then
begin
RadioButton4.Checked:=True;
RadioButton5.Checked:=False;
CheckBox2.Checked:=True;
CheckBox3.Checked:=False;
end;
if nast=4 then
begin
RadioButton4.Checked:=False;
RadioButton5.Checked:=True;
CheckBox2.Checked:=True;
CheckBox3.Checked:=True;
end;
if nast=5 then
begin
RadioButton4.Checked:=False;
RadioButton5.Checked:=True;
CheckBox2.Checked:=False;
CheckBox3.Checked:=True;
end;
if nast=6 then
begin
RadioButton4.Checked:=False;
RadioButton5.Checked:=True;
CheckBox2.Checked:=True;
CheckBox3.Checked:=False;
end;
if nast=7 then
begin
RadioButton4.Checked:=True;
RadioButton5.Checked:=False;
CheckBox2.Checked:=False;
CheckBox3.Checked:=False;
end ;
if nast=8 then
begin
RadioButton4.Checked:=False;
RadioButton5.Checked:=True;
CheckBox2.Checked:=False;
CheckBox3.Checked:=False;
end ;
if RadioButton4.Checked=True  then          //nastavení sprívné jedhotky dle nastavení
begin
Chart1.LeftAxis.Title.Caption:='U [mV]';
max:=maxu;
end
else
begin
Chart1.LeftAxis.Title.Caption:='G [uS]';
max:=maxg;
end;

a:=0;
b:=21;

for i:=1 to k  do           ///nacteni signalu s vykresleni (jako pro bezne nahravani)
begin
    ReadLn(f, j);
    c[b]:=StrToInt(j);
               c[b]:=FBufferIn[1]+(FBufferIn[2])*256;     //nacteni dat
               hh:=Abs(c[b-1]-c[b]);                      //mazani chybocých hodnot    (v signálu se občas vyskytuje impulzí chyba neznámého původu)
               if hh>30 then                              //pokud se hodnota liší více než o 30 --chybová hodnota
               begin
               if opak<1 then
               begin
               c[b]:=c[b-1];                              //prřemazat chybovou hodnotu předchozí hodnotou
               opak:=2 ;                                  //pojistka pro případ opakované chyby(skokové změny v signálu)
               end;
               end;
               opak:=opak-1;
               if CheckBox3.Checked=True then                    //pokud je zapnuta průměrovací filtrace
               // násobení vzorků impulzní charakteristikou Lynnova FIR filtru vygenerovaného v programu Matlab
               d[b]:=c[b-20]*(-0.00244824236588929)+c[b-19]*(-0.00360028834464409)+c[b-18]*(-0.00520205823350302)+c[b-17]*(-0.00456252215557739)+c[b-16]*(0.00267420585573567)+c[b-15]*(0.0204268094300300)+c[b-14]*(0.0496526206802802)+c[b-13]*(0.0867497795848974)+c[b-12]*(0.123909463767098)+c[b-11]*(0.151528274131286)+c[b-10]*(0.161743915300573)+c[b-9]*(0.151528274131286)+c[b-8]*(0.123909463767098)+c[b-7]*(0.0867497795848974)+c[b-6]*(0.0496526206802802)+c[b-5]*(0.0204268094300300)+c[b-4]*(0.00267420585573567)+c[b-3]*(-0.00456252215557739)+c[b-2]*(-0.00520205823350302)+c[b-1]*(-0.00360028834464409)+c[b]*(-0.00244824236588929);
               if CheckBox2.Checked=True then  //pokud je zapnuta FIR filtrace
               begin
                //průměrovací a FIR
                if CheckBox3.Checked=True then e[b]:=(d[b-30]+d[b-29]+d[b-28]+d[b-27]+d[b-26]+d[b-25]++d[b-24]+d[b-23]+d[b-22]+d[b-21]+d[b-20]+d[b-19]+d[b-18]+d[b-17]+d[b-16]+d[b-15]+d[b-14]+d[b-13]+d[b-12]+d[b-11]+d[b-10]+d[b-9]+d[b-8]+d[b-7]+d[b-6]+d[b-5]+d[b-4]+d[b-3]+d[b-2]+d[b-1]+d[b])/31
                else e[b]:=(c[b-30]+c[b-29]+c[b-28]+c[b-27]+c[b-26]+c[b-25]+c[b-24]+c[b-23]+c[b-22]+c[b-21]+c[b-20]+c[b-19]+c[b-18]+c[b-17]+c[b-16]+c[b-15]+c[b-14]+c[b-13]+c[b-12]+c[b-11]+c[b-10]+c[b-9]+c[b-8]+c[b-7]+c[b-6]+c[b-5]+c[b-4]+c[b-3]+c[b-2]+c[b-1]+c[b])/31;
                  if RadioButton4.Checked=True then   //průměrovací, FIR, potenciál
                Series1.AddXY((b)/fvz,(e[b]-2232)*0.030666)   //přepočet a vykresleni pro potenciál s obema filtry -- konstanty zjištěny při kalibrování
                else    //průměrovací, FIR, vodivost
                Series1.AddXY((b)/fvz,1000*(4.88-(e[b]-2050)*0.001191406*0.639166)/(510*(e[b]-2050)*0.001191406*0.639166));     //přepočet a vykresleni pro vodivost s obema filtry--konstanty zjištěny při kalibrování
               end
               else     //ne průměrovací filtrace
                begin
                if CheckBox3.Checked=True then //s FIR
                begin
                if RadioButton4.Checked=True then   // FIR, ne průměrovací, potenciál
                Series1.AddXY((b)/fvz,(d[b]-2232)*0.030666)  //přepočet a vykresleni pro potenciál s FIR filtrem
                else    //FIR, ne prumerovaci, vodivost
                Series1.AddXY((b)/fvz,1000*(4.88-(d[b]-2050)*0.001191406*0.639166)/(510*(d[b]-2050)*0.001191406*0.639166));           //přepočet a vykresleni pro vodivost s FIR filtrem
                end
                else           //ne FIR  (ani průměrovací)
                begin
                  if RadioButton4.Checked=True then
                Series1.AddXY((b)/fvz,(c[b]-2232)*0.030666)   //přepočet a vykresleni pro potenciál bez filtrace
                else
                Series1.AddXY((b)/fvz,1000*(4.88-(c[b]-2050)*0.001191406*0.639166)/(510*(c[b]-2050)*0.001191406*0.639166));   //přepočet a vykresleni pro vodivost  bez filtrace
                end
                end;
               a:=a+1;      //navýšení pomocné proměnné pro posuv
               b:=b+1;     //navýšení čísla vzorku
               if(a>Abs(Chart1.BottomAxis.Maximum-Chart1.BottomAxis.Minimum)*fvz) then    //pokud je pomocná proměnná větší než rozsah časové osy
               begin
                  a:=0;              //vynulovat pomocnou promenou pro psuv
                  if CheckBox1.Checked=True then    //automatický posuv casu zapnuto
                  Series1.GetHorizAxis.SetMinMax(b/fvz,b/fvz+Abs(Chart1.BottomAxis.Maximum-Chart1.BottomAxis.Minimum));  //posunout časovou osu o nastaveny rozzsah
               end;
               end;
for i:=0 to barr do     //vykresleni stimulací (jako pri jejich zapisu)
begin                   //aby se vykreslili do signálu musi se jejich pozice vypočítat podle filtrace a typu signálu jako při vykreslení samotného vzorku
if bar[i]=1 then         /// byližší popis je  od řádku 708!!!

if CheckBox2.Checked=True then
                begin
                if RadioButton4.Checked=True then
                  Series2.AddXY((cas[i]-1)/fvz,(e[cas[i]-1]-2232)*0.030666)
                else
                  Series2.AddXY((cas[i]-1)/fvz,1000*(4.88-(e[cas[i]-1]-2050)*0.001191406*0.639166)/(510*(e[cas[i]-1]-2050)*0.001191406*0.639166))
                end
               else
                begin
                if CheckBox3.Checked=True then
                  begin
                  if RadioButton4.Checked=True then
                    Series2.AddXY((cas[i]-1)/fvz,(d[cas[i]-1]-2232)*0.030666)
                  else
                    Series2.AddXY((cas[i]-1)/fvz,1000*(4.88-(d[cas[i]-1]-2050)*0.001191406*0.639166)/(510*(d[cas[i]-1]-2050)*0.001191406*0.639166));
                  end
                else
                  begin
                  if RadioButton4.Checked=True then
                    Series2.AddXY((cas[i]-1)/fvz,(c[cas[i]-1]-2232)*0.030666)
                  else
                    Series2.AddXY((cas[i]-1)/fvz,1000*(4.88-(c[cas[i]-1]-2050)*0.001191406*0.639166)/(510*(c[cas[i]-1]-2050)*0.001191406*0.639166));
                  end
               end;
if bar[i]=2 then
if CheckBox2.Checked=True then
                begin
                if RadioButton4.Checked=True then
                  Series3.AddXY((cas[i]-1)/fvz,(e[cas[i]-1]-2232)*0.030666)
                else
                  Series3.AddXY((cas[i]-1)/fvz,1000*(4.88-(e[cas[i]-1]-2050)*0.001191406*0.639166)/(510*(e[cas[i]-1]-2050)*0.001191406*0.639166))
                end
               else
                begin
                if CheckBox3.Checked=True then
                  begin
                  if RadioButton4.Checked=True then
                    Series3.AddXY((cas[i]-1)/fvz,(d[cas[i]-1]-2232)*0.030666)
                  else
                    Series3.AddXY((cas[i]-1)/fvz,1000*(4.88-(d[cas[i]-1]-2050)*0.001191406*0.639166)/(510*(d[cas[i]-1]-2050)*0.001191406*0.639166));
                  end
                else
                  begin
                  if RadioButton4.Checked=True then
                    Series3.AddXY((cas[i]-1)/fvz,(c[cas[i]-1]-2232)*0.030666)
                  else
                    Series3.AddXY((cas[i]-1)/fvz,1000*(4.88-(c[cas[i]-1]-2050)*0.001191406*0.639166)/(510*(c[cas[i]-1]-2050)*0.001191406*0.639166));
                  end
               end;
if bar[i]=3 then
if CheckBox2.Checked=True then
                begin
                if RadioButton4.Checked=True then
                  Series4.AddXY((cas[i]-1)/fvz,(e[cas[i]-1]-2232)*0.030666)
                else
                  Series4.AddXY((cas[i]-1)/fvz,1000*(4.88-(e[cas[i]-1]-2050)*0.001191406*0.639166)/(510*(e[cas[i]-1]-2050)*0.001191406*0.639166))
                end
               else
                begin
                if CheckBox3.Checked=True then
                  begin
                  if RadioButton4.Checked=True then
                    Series4.AddXY((cas[i]-1)/fvz,(d[cas[i]-1]-2232)*0.030666)
                  else
                    Series4.AddXY((cas[i]-1)/fvz,1000*(4.88-(d[cas[i]-1]-2050)*0.001191406*0.639166)/(510*(d[cas[i]-1]-2050)*0.001191406*0.639166));
                  end
                else
                  begin
                  if RadioButton4.Checked=True then
                    Series4.AddXY((cas[i]-1)/fvz,(c[cas[i]-1]-2232)*0.030666)
                  else
                    Series4.AddXY((cas[i]-1)/fvz,1000*(4.88-(c[cas[i]-1]-2050)*0.001191406*0.639166)/(510*(c[cas[i]-1]-2050)*0.001191406*0.639166));
                  end
               end;
end;

  finally
    CloseFile(f); //ukončení načítání dat
end;
end;

procedure TForm1.RadioButton4Click(Sender: TObject);  //prepnuti na mereni napeti
begin
RadioButton4.Checked:=True;  //zaškrtnout napeti
RadioButton5.Checked:=False;    //odškrtnout vodivost
max:=maxu;
Chart1.LeftAxis.Title.Caption:='U [mV]';   //zmena popisu osy
if RadioButton4.Checked=True then             //zmena rozsahu
Series1.GetVertAxis.SetMinMax(minu,maxu)
else
Series1.GetVertAxis.SetMinMax(ming,maxg);
end;

procedure TForm1.RadioButton5Click(Sender: TObject);  //prepnuti na  mereni vodivosti
begin
RadioButton5.Checked:=True;        //zaškrtnout vodivost
RadioButton4.Checked:=False;         //odškrtnout napeti
max:=maxg;
Chart1.LeftAxis.Title.Caption:='G [uS]';    //zmena popisu osy
if RadioButton4.Checked=True then            //zmena rozsahu osy
Series1.GetVertAxis.SetMinMax(minu,maxu)
else
Series1.GetVertAxis.SetMinMax(ming,maxg);
end;

procedure TForm1.Button2Click(Sender: TObject);     //autoscale +-5 k poslenimu vzorku
begin                   //u hodnot je nutné vzít v úvahu nastavenou filtraci (kterou datovou proměnnou použít)
                   if CheckBox2.Checked=True then
                begin
                if RadioButton4.Checked=True then
                  Series1.GetVertAxis.SetMinMax((e[b-1]-2232)*0.030666-5,(e[b-1]-2232)*0.030666+5)
                else
                  Series1.GetVertAxis.SetMinMax((1000*(4.88-(e[b-1]-2050)*0.001191406*0.639166)/(510*(e[b-1]-2050)*0.001191406*0.639166)-5),(1000*(4.88-(e[b-1]-2050)*0.001191406*0.639166)/(510*(e[b-1]-2050)*0.001191406*0.639166)+5))
                end
               else
                begin
                if CheckBox3.Checked=True then
                  begin
                  if RadioButton4.Checked=True then
                    Series1.GetVertAxis.SetMinMax((d[b-1]-2232)*0.030666-5,(d[b-1]-2232)*0.030666+5)
                  else
                    Series1.GetVertAxis.SetMinMax((1000*(4.88-(d[b-1]-2050)*0.001191406*0.639166)/(510*(d[b-1]-2050)*0.001191406*0.639166)-5),(1000*(4.88-(d[b-1]-2050)*0.001191406*0.639166)/(510*(d[b-1]-2050)*0.001191406*0.639166)+5))
                  end
                  else
                    begin
                      if RadioButton4.Checked=True then
                        Series1.GetVertAxis.SetMinMax((c[b-1]-2232)*0.030666-5,(c[b-1]-2232)*0.030666+5)
                  else
                    Series1.GetVertAxis.SetMinMax((1000*(4.88-(c[b-1]-2050)*0.001191406*0.639166)/(510*(c[b-1]-2050)*0.001191406*0.639166)-5),(1000*(4.88-(c[b-1]-2050)*0.001191406*0.639166)/(510*(c[b-1]-2050)*0.001191406*0.639166)+5))
                  end
                end;

end;

procedure TForm1.Button13Click(Sender: TObject);   //přefiltrování signálu uložením do textoveho souboru pomocna a načtením(s timto nastavenim filtru nebo napeti/vodivost)
begin     //ukládá se i nastavení filru, takže při zpetném načtení se vsechna data vykreslí s aktuálními filtry
pomocna:=Edit6.text;    //ulození nastaveného názvu souboru
Edit6.text:='pomocna';      //prepis názvu souboru na pomocna
Button4Click(nil);        //ulozeni do pomocna.txt
Button7Click(nil);         //načtení z pomocna.txt
Edit6.text:=pomocna;       //zapsání předchozího názvu souboru
end;

end.


