unit BBCE_unit;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls, Buttons, Serial,IniFiles;

type
  TForm1 = class(TForm)
    Panel1: TPanel;
    Label1: TLabel;
    Edit1: TEdit;
    Button1: TButton;
    GroupBox1: TGroupBox;
    Memo1: TMemo;
    GroupBox2: TGroupBox;
    GroupBox3: TGroupBox;
    LabeledEdit1: TLabeledEdit;
    LabeledEdit2: TLabeledEdit;
    LabeledEdit3: TLabeledEdit;
    Label6: TLabel;
    ComboBox1: TComboBox;
    Button2: TButton;
    Label7: TLabel;
    Label8: TLabel;
    ComboBox3: TComboBox;
    Label9: TLabel;
    GroupBox4: TGroupBox;
    Button4: TButton;
    Panel2: TPanel;
    Button5: TButton;
    Label10: TLabel;
    Label11: TLabel;
    Label12: TLabel;
    Label13: TLabel;
    CheckBox1: TCheckBox;
    CheckBox2: TCheckBox;
    CheckBox3: TCheckBox;
    CheckBox4: TCheckBox;
    CheckBox5: TCheckBox;
    CheckBox6: TCheckBox;
    CheckBox7: TCheckBox;
    CheckBox8: TCheckBox;
    CheckBox9: TCheckBox;
    ComboBox4: TComboBox;
    ComboBox5: TComboBox;
    ComboBox6: TComboBox;
    ComboBox7: TComboBox;
    CheckBox10: TCheckBox;
    Edit2: TEdit;
    procedure Button5Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    function mocnina(a:integer; b: integer): real;
    procedure FormCreate(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    Port:TSerial;
    ini:TIniFile;
  public
    { Public declarations }
  end;

var                                                                             // deklarování globálných proměnných
  Form1: TForm1;
  hv,rl,l,c,u0,ur,o,lv,nasobek1,nasobek2,nasobek3,frek,cz: real;
  dc,dv,n,nasobek: integer;
  dcj,dvj,czj,fh,fd:integer;
  banka: array[0..7] of real;
  number,prenos,data,pamet,material: integer;

implementation

{$R *.dfm}

function TForm1.mocnina(a: integer; b: integer): real;                          //vytvoření funkce pro výpočet mocniny
 var vysledek: real;i: integer;
 begin
   vysledek:=a;
   b:=abs(b);
   for i:=2 to b do
       vysledek:=vysledek*a;
   result:=1/vysledek;
end;

procedure TForm1.Button5Click(Sender: TObject);                                 // Tlačítko pro ukončení programu
begin
  Close;
end;

procedure TForm1.Button1Click(Sender: TObject);                                 //Tlačítko pro výpočet hodnot
var  rv,mezi:real;i,chyba:integer;ss:string;
begin

      lv:=PI*dc*nasobek1;                                                       //výpočet délky smyčky
      ss:=Form1.Edit1.Text;
      val(ss,frek,chyba);
      case Form1.ComboBox4.ItemIndex of                                //volba jednotek
                  0:  nasobek:= 1000000000;                                     //GHz
                  1:  nasobek:= 1000000;                                        //MHz
                  2:  nasobek:= 1000;                                           //kHz
                  3:  nasobek:= 1;                                              //Hz
               end;

      if (chyba<>0) then                                                        //testování hodnoty zadávacího pole
        Application.MessageBox('Byla zadána patně hodnota frekvence','Chyba zadávání',MB_ICONHAND)
      else
        begin
          frek:=StrToInt(Form1.Edit1.Text);
          frek:= frek*nasobek;
          if ((frek>fh) or (frek<fd)) then
            Application.MessageBox('Byla zadána patně hodnota frekvence','Chyba zadávání',MB_ICONHAND)
          else
            begin
          //vypocet kapacity obvodu

                  rv:= ((dv*nasobek2)/2);
                  hv := SQRT(2/(2*PI*frek*ur*u0*o));
                  rl := lv / (2*PI*rv*o*hv);
                  l  := ur*u0*((dc*nasobek1)/2)*(ln((8*((dc*nasobek1)/2))/rv)-(7/4));
                  c  := 1/(4*sqr(PI)*sqr(frek)*l);

           //rozdelení kapacity na jednotlivé prvky banky
                  mezi:= c-(cz*nasobek3);
                  data:= 0;
                      for i:= 0 to 7 do
                          begin
                               if (mezi/banka[7-i]>1) or (mezi/banka[7-i]=1) then
                                  begin
                                       mezi:=mezi - banka[7-i];
                                       case (7-i) of

                                        0:  begin
                                              Form1.CheckBox2.Checked:= true;
                                              data:=data+1;
                                            end;
                                        1:  begin
                                              Form1.CheckBox3.Checked:= true;
                                              data:=data+2;
                                            end;
                                        2:  begin
                                              Form1.CheckBox4.Checked:= true;
                                              data:=data+4;
                                            end;
                                        3:  begin
                                              Form1.CheckBox5.Checked:= true;
                                              data:=data+8;
                                            end;
                                        4:  begin
                                              Form1.CheckBox6.Checked:= true;
                                              data:=data+16;
                                            end;
                                        5:  begin
                                              Form1.CheckBox7.Checked:= true;
                                              data:=data+32;
                                            end;
                                        6:  begin
                                              Form1.CheckBox8.Checked:= true;
                                              data:=data+64;
                                            end;
                                        7:  begin
                                              Form1.CheckBox9.Checked:= true;
                                              data:=data+128;
                                            end;

                                       end;
                                  end
                               else
                                    case (7-i) of
                                        0: Form1.CheckBox2.Checked:= false;
                                        1: Form1.CheckBox3.Checked:= false;
                                        2: Form1.CheckBox4.Checked:= false;
                                        3: Form1.CheckBox5.Checked:= false;
                                        4: Form1.CheckBox6.Checked:= false;
                                        5: Form1.CheckBox7.Checked:= false;
                                        6: Form1.CheckBox8.Checked:= false;
                                        7: Form1.CheckBox9.Checked:= false;
                                    end;



           //zobrazeni vysledku
              Form1.Memo1.Lines[0]:='Zadaná frekvence:           ' + FloatToStr(frek) + ' Hz';
              Form1.Memo1.Lines[1]:='';
              Form1.Memo1.Lines[2]:='Parametry antény:';
              Form1.Memo1.Lines[3]:='';
              Form1.Memo1.Lines[4]:='     Průměr cívky:          ' + IntToStr(dc) + Form1.ComboBox5.Text;
              Form1.Memo1.Lines[5]:='     Průměr vodiče:         ' + IntToStr(dv) + Form1.ComboBox6.Text;
              Form1.Memo1.Lines[6]:='     Počet závitů:          ' + IntToStr(n);
              Form1.Memo1.Lines[7]:='     Parazitní kapacita:    ' + FloatToStr(cz) + Form1.ComboBox7.Text;
              Form1.Memo1.Lines[8]:='';
              Form1.Memo1.Lines[9]:='Materiál:                   ' + Form1.ComboBox1.Text;
             Form1.Memo1.Lines[10]:='     ur:                    ' + FloatToStr(ur);
             Form1.Memo1.Lines[11]:='     u0:                    ' + FloatToStr(u0) + '  H.m-1';
             Form1.Memo1.Lines[12]:='     Konduktivita:          ' + FloatToStr(o) + '  S.m-1';
             Form1.Memo1.Lines[13]:='';
             Form1.Memo1.Lines[14]:='Výpočet:';
             Form1.Memo1.Lines[15]:='';
             Form1.Memo1.Lines[16]:='     Délka vodiče:          ' + FloatToStr(lv) + '  m';
             Form1.Memo1.Lines[17]:='     Hloubka vniku:         ' + FloatToStr(hv);
             Form1.Memo1.Lines[18]:='     Odpor vodiče:          ' + FloatToStr(rl) + '  Ohm';
             Form1.Memo1.Lines[19]:='     Indukčnost:            ' + FloatToStr(l) + '  H';
             Form1.Memo1.Lines[20]:='     Kapacita:              ' + FloatToStr(c) + '  F';
             Form1.Memo1.Lines[21]:='';
          end;

          end;
end;
      Port.Free;                                                                //uzavření otevřených portů
      Port:=TSerial.Create(number,prenos);                                      //otevření nového portu dle zadaných parametrů
if pamet=1 then                                                                 //testování volby automatického odesílání
                          begin
                              try
                                Port.WriteByte(data);                           //odeslání dat
                              except
                                on E: Exception do
                                begin
                                  Application.MessageBox(PChar(E.Message),'Chyba',MB_ICONHAND);
                                  Application.Terminate;
                                end;
                              end;
                          end;

end;


procedure TForm1.FormCreate(Sender: TObject);
begin
  
  n:= 1;
  u0:= 4*PI/10000000;
//cteni nastaveni ze souboru
  ini:=TIniFile.Create(GetCurrentDir+'\nastaveni.ini');
  number:= ini.ReadInteger('PORT','Port',2);
  prenos:= ini.ReadInteger('PORT','Rychlost',9600);
  pamet:= ini.ReadInteger('PORT','Pamet',1);
  dc:= ini.ReadInteger('Antena','Prumer smycky',47);
  dcj:= ini.ReadInteger('Antena','Prumer smycky jednotka',2);
  dv:= ini.ReadInteger('Antena','Prumer vodice',4);
  dvj:= ini.ReadInteger('Antena','Prumer vodice jednotka',3);
  material:= ini.ReadInteger('Antena','Material',0);
  cz:= ini.ReadInteger('Ladici cast','Parazitni kapacita',0);
  czj:= ini.ReadInteger('Ladici cast','Parazitni kapacita jednotka',4);
  fh:= ini.ReadInteger('Meze frekvence','Horní kmitocet',30000000);
  fd:= ini.ReadInteger('Meze frekvence','Dolni kmitocet',30);
  ini.Free;

  //nastavení materiálu
  if material=0 then
    begin
      ur:=0.99999;
      o:=56000000;
      Form1.ComboBox1.ItemIndex:=0;
    end
  else
    begin
      ur:=1.000023;
      o:=37000000;
      Form1.ComboBox1.ItemIndex:=1;
    end;


  // nastaveni hodnot
  Form1.LabeledEdit3.Text:= FloatToStr(cz);
  Form1.LabeledEdit1.Text:= FloatToStr(dc);
  Form1.LabeledEdit2.Text:= FloatToStr(dv);

  // definování hodnot banky

  banka[0]:=4*mocnina(10,-12);
  banka[1]:=8*mocnina(10,-12);
  banka[2]:=16*mocnina(10,-12);
  banka[3]:=32*mocnina(10,-12);
  banka[4]:=64*mocnina(10,-12);
  banka[5]:=128*mocnina(10,-12);
  banka[6]:=256*mocnina(10,-12);
  banka[7]:=512*mocnina(10,-12);

  //nastavení portu
  Form1.Edit2.Text:= IntToStr(number);
  case prenos of
    110:        Form1.ComboBox3.ItemIndex:= 0;
    150:        Form1.ComboBox3.ItemIndex:= 1;
    300:        Form1.ComboBox3.ItemIndex:= 2;
    600:        Form1.ComboBox3.ItemIndex:= 3;
    1200:       Form1.ComboBox3.ItemIndex:= 4;
    2400:       Form1.ComboBox3.ItemIndex:= 5;
    4800:       Form1.ComboBox3.ItemIndex:= 6;
    9600:       Form1.ComboBox3.ItemIndex:= 7;
    19200:      Form1.ComboBox3.ItemIndex:= 8;
    115200:     Form1.ComboBox3.ItemIndex:= 9;
  end;
  if pamet=1 then
    Form1.CheckBox10.Checked:=true
  else
    Form1.CheckBox10.Checked:=False;

  //nastavení jednotek
 Case dcj of
  0:  begin
        Form1.ComboBox5.ItemIndex:=0;
        nasobek1:= 1;                   //m
      end;
  1:  begin
        Form1.ComboBox5.ItemIndex:=1;
        nasobek1:= 1*mocnina(10,-1);   //dm
      end;
  2:  begin
        Form1.ComboBox5.ItemIndex:=2;
        nasobek1:= 1*mocnina(10,-2);    //cm
      end;
  3:  begin
        Form1.ComboBox5.ItemIndex:=3;
        nasobek1:= 1*mocnina(10,-3);    //mm
      end;
end;
Case dvj of
  0:  begin
        Form1.ComboBox6.ItemIndex:=0;
        nasobek2:= 1;                   //m
      end;
  1:  begin
        Form1.ComboBox6.ItemIndex:=1;
        nasobek2:= 1*mocnina(10,-1);   //dm
      end;
  2:  begin
        Form1.ComboBox6.ItemIndex:=2;
        nasobek2:= 1*mocnina(10,-2);    //cm
      end;
  3:  begin
        Form1.ComboBox6.ItemIndex:=3;
        nasobek2:= 1*mocnina(10,-3);    //mm
      end;
end;
Case czj of
  0:  begin
        Form1.ComboBox7.ItemIndex:=0;
        nasobek3:= 1;                   //F
      end;
  1:  begin
        Form1.ComboBox7.ItemIndex:=1;
        nasobek3:= 1*mocnina(10,-3);   //mF
      end;
  2:  begin
        Form1.ComboBox7.ItemIndex:=2;
        nasobek3:= 1*mocnina(10,-6);    //uF
      end;
  3:  begin
        Form1.ComboBox7.ItemIndex:=3;
        nasobek3:= 1*mocnina(10,-9);    //nF
      end;
  4:  begin
        Form1.ComboBox7.ItemIndex:=4;
        nasobek3:= 1*mocnina(10,-12);    //pF
      end;
end;





end;

procedure TForm1.Button2Click(Sender: TObject);                                 //Tlačítko pro změnu parametrů
var p1,p2,p3: string;ch1,ch2,ch3,i1,i2,i3:integer;
begin
p1:= Form1.LabeledEdit1.Text;
p2:= Form1.LabeledEdit2.Text;
p3:= Form1.LabeledEdit3.Text;
val(p1,i1,ch1);
val(p2,i2,ch2);
val(p3,i3,ch3);

Case Form1.ComboBox5.ItemIndex of                                               //určení jednotek
  0:  begin
        dcj:=0;
        nasobek1:= 1;                   //m
      end;
  1:  begin
        dcj:=1;
        nasobek1:= 1*mocnina(10,-1);   //dm
      end;
  2:  begin
        dcj:=2;
        nasobek1:= 1*mocnina(10,-2);    //cm
      end;
  3:  begin
        dcj:=3;
        nasobek1:= 1*mocnina(10,-3);    //mm
      end;
end;
Case Form1.ComboBox6.ItemIndex of                                               //určení jednotek
  0:  begin
        dvj:=0;
        nasobek2:= 1;                   //m
      end;
  1:  begin
        dvj:=1;
        nasobek2:= 1*mocnina(10,-1);   //dm
      end;
  2:  begin
        dvj:=2;
        nasobek2:= 1*mocnina(10,-2);    //cm
      end;
  3:  begin
        dvj:=3;
        nasobek2:= 1*mocnina(10,-3);    //mm
      end;
end;
Case Form1.ComboBox7.ItemIndex of                                               //určení jednotek
  0:  begin
        czj:=0;
        nasobek3:= 1;                   //F
      end;
  1:  begin
        czj:=1;
        nasobek3:= 1*mocnina(10,-3);   //mF
      end;
  2:  begin
        czj:=2;
        nasobek3:= 1*mocnina(10,-6);    //uF
      end;
  3:  begin
        czj:=3;
        nasobek3:= 1*mocnina(10,-9);    //nF
      end;
  4:  begin
        czj:=4;
        nasobek3:= 1*mocnina(10,-12);    //pF
      end;
end;






if (ch1<>0) or (ch2<>0) or (ch3<>0) then                                        //testování hodnoty zadávacího pole
  Application.MessageBox('Parametry antény byly patně zadány.','Chyba zadávání parametrů',MB_ICONHAND)
else
begin
  dc:= StrToInt(Form1.LabeledEdit1.Text);
  dv:= StrToInt(Form1.LabeledEdit2.Text);
  cz:= StrToInt(Form1.LabeledEdit3.Text);

  if Form1.ComboBox1.ItemIndex=1 then
     begin
          ur:=1.000023;
          o:=37000000;
          material:=1;
     end;
  if Form1.ComboBox1.ItemIndex=0 then
     begin
          ur:=0.99999;
          o:=56000000;
          material:=0;
     end;
end;

    number:= StrToInt(Form1.Edit2.Text);
    prenos:= StrToInt(Form1.ComboBox3.Text);

if Form1.CheckBox10.Checked=true then
      pamet:=1
    else
      pamet:=0;

//zápis hodnot do souboru
ini:=TIniFile.Create(GetCurrentDir+'\nastaveni.ini');
  ini.WriteInteger('PORT','Port',number);
  ini.WriteInteger('PORT','Rychlost',prenos);
  ini.WriteInteger('PORT','Pamet',pamet);
  ini.WriteInteger('Antena','Prumer smycky',dc);
  ini.WriteInteger('Antena','Prumer smycky jednotka',dcj);
  ini.WriteInteger('Antena','Prumer vodice',dv);
  ini.WriteInteger('Antena','Prumer vodice jednotka',dvj);
  ini.WriteInteger('Antena','Material',material);
  ini.WriteFloat('Ladici cast','Parazitni kapacita',cz);
  ini.WriteInteger('Ladici cast','Parazitni kapacita jednotka',czj);
  ini.WriteInteger('Meze frekvence','Horní kmitocet',fh);
  ini.WriteInteger('Meze frekvence','Dolni kmitocet',fd);
  ini.Free;
  

end;

procedure TForm1.Button4Click(Sender: TObject);                                 //Tlačítko nastavení procesoru
begin
//data:= (data + (255 -data)*2)-255; inverze hodnot

try

    Port.WriteByte(data);                                                       //odeslání dat
  except
    on E: Exception do begin
      Application.MessageBox(
        PChar(E.Message),
        'Chyba',
        MB_ICONHAND);
      Application.Terminate;
    end;
  end;

end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
 Port.Free;                                                                     //uzavření portu
end;

end.
