#include <iostream>
#include <sstream>
#include <string>
#include <vcl.h>
#include <string.h>
#include <windows.h>
#include <winsock2.h>
#include <tchar.h>
#include "stdio.h"
#include "math.h"
#include "io.h"
#include "fstream.h"
#include "iostream.h"
#include "LBIC_ovladaci_panel.h"
#include "LBIC_scan_solarniho_clanku.h"
#include "LBIC_nastaveni_agilent.h"
//---------------------------------------------------------------------------
#pragma hdrstop
#pragma package(smart_init)
#pragma resource "*.dfm"

TForm1 *Form1;

//---zacatek---
//inicializace globalnich promenych
#define SouborTemp "c:/Scan.txt"
const ZmenaOdstinu = 65793;                                       /*256 odstinu, 1118481 16 odstinu*/ //Hodnota klice, podle ktereho je stupnovana barva
Graphics::TBitmap *pObrazek = new Graphics::TBitmap();                           //ulozeny nascanovany solarni clanek
Graphics::TBitmap *pObrazekPrazdny = new Graphics::TBitmap();
Graphics::TBitmap *pObrazekZOOM = new Graphics::TBitmap();
Graphics::TBitmap *pObrazekVyber = new Graphics::TBitmap();
float **PoleHodnot; // ulozene namerene hodnoty ze solarniho clanku
float **PoleHodnotZOOM;
boolean Smazane=true, Song=true; //zjisteni zda je obrazek vykreslen Smazane=true-je neni vykreslen
TRect VelikostObrazku;
int StartX,StartY,KonecX,KonecY,SouradniceX,SouradniceY,SouradniceXplotr,SouradniceYplotr,KrokX,KrokY;
int Zvetseni,PocMerPresun=1;
int VelikostPoleHodnot=5000, VelikostPoleHodnotZOOM;
bool CanRun, Pripojeno=false;
short vyberClanku=0,vyberMetody=0,vyberPocet;

//inicializace pro měření
#define BUFSIZE 80000                    //buffer pro příjem dat
 float MinHodnota, MaxHodnota;

 WORD wVersionRequested = MAKEWORD(1,1);
 WSADATA data;                           // Struktura s info. o knihovni
 int mySocket;                           // Soket
 string text,ip,pocetVzorku;
 sockaddr_in serverSock;
 int port, size;
 char buf[BUFSIZE];                      // Prijímací buffer
//inicializace pro měření

FILE *pSoubor;

//---konec---
//inicializace globalnich promenych


//---------------------------------------------------------------------------

//---zacatek---
//inicializace pracovniho prostredi
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
  //inicializece zvetseni
  ComboBox1->Enabled=false;
  ComboBox1->Items->Add(1);
  ComboBox1->Items->Add(2);
  ComboBox1->Items->Add(3);
  ComboBox1->Items->Add(4);
  ComboBox1->Items->Add(5);
  ComboBox1->Items->Add(6);
  ComboBox1->Items->Add(7);
  ComboBox1->SelText=1;

  //inicializece pocet kroku
  ComboBox2->Enabled=true;
  ComboBox2->Items->Add(400);
  ComboBox2->Items->Add(800);
  ComboBox2->Items->Add(1200);
  ComboBox2->Items->Add(1600);
  ComboBox2->Items->Add(2000);
  ComboBox2->SelText=400;

  //editace hint
  Edit1->Hint="Zadej počáteční souřadnici X pro scanování článku.";
  Edit1->ShowHint=true;
  Edit2->Hint="Zadej počáteční souřadnici Y pro scanování článku.";
  Edit2->ShowHint=true;
  Edit3->Hint="Zadej konečnou souřadnici X pro scanování článku.";
  Edit3->ShowHint=true;
  Edit4->Hint="Zadej konečnou souřadnici Y pro scanování článku.";
  Edit4->ShowHint=true;
  Edit6->Hint="Zadej počet bodů posunu scaneru ve směru osy Y.";
  Edit6->ShowHint=true;

  //inicializace souradnic posilanych do plotru
  Edit1->Text=7810 ;   //StartX
  Edit2->Text=5360;    //StartY
  Edit3->Text=4600;    //KonecX
  Edit4->Text=4100;    //KonecY
  Edit6->Text=10;      //KrokY
  Form1->Edit9->Text=0; //Minimalani hodnota rozsahu
  Form1->Edit10->Text=3; //Maximalni hodnota rozsahu
  Form1->Edit11->Text=0; //Posun obrazku

  //promena pro ukladani namerenych hodnot
  PoleHodnot=(float **)malloc(VelikostPoleHodnot*sizeof(float*));
  for(int i=0;i<VelikostPoleHodnot;i++)
  PoleHodnot[i]=(float *)malloc(VelikostPoleHodnot*sizeof(float));
  //promena pro ukladani namerenych hodnot

  //inicializace měřícího přístroje
  pocetVzorku =("SYSTem:PRESet\nVOLT:DC:RANGe 10\nVOLT:IMP:AUTO 1\nVOLT:ZERO:AUTO OFF\nVOLT:DC:APER 0.006008188\nTRIG:SOUR IMM\nTRIG:COUN 1\nTRIG:DEL 0\nSAMP:COUN 400\nSAMP:SOUR TIM\nSAMP:TIM 0\n");
}
//---konec---
//inicializace pracovniho prostredi

//---------------------------------------------------------------------------

//---zacatek---
//zjisteni a nastaveni zvetseni
void InicializaceObrazku()
{
  if ((KonecY<=StartY) && (KonecX>=StartX))
  {
    pObrazek->Height=SouradniceY;
    pObrazek->Width=SouradniceX;
    pObrazekZOOM->Height=SouradniceY*Zvetseni;
    pObrazekZOOM->Width=SouradniceX*Zvetseni;
    pObrazekPrazdny->Height=SouradniceY;      //Vymazani obsahu pObrazek
    pObrazekPrazdny->Width=SouradniceX;
    pObrazek->Assign(pObrazekPrazdny);
  }
  else ShowMessage("Nesprávně zadané souřadnice!");
}
//---zacatek---
//zjisteni a nastaveni zvetseni

//---------------------------------------------------------------------------

//---zacatek---
//zjisteni a nastaveni zvetseni
TRect NastavVelikostObrazku()
{
  AnsiString chrZvetseni;
  TRect fVelikostObrazku;

  //vyber zvetseni
  if (Zvetseni!=1)
  {
    chrZvetseni=Form1->ComboBox1->Text;
    Zvetseni=StrToInt(chrZvetseni);
  }
  //vyber zvetseni

  //nastaveni velikosti Form2 a ListBox1
  Form2->Top=0;
  Form2->Left=0;
  Form2->ListBox1->Width=SouradniceX*Zvetseni;
  if (Form2->ListBox1->Width<200) Form2->ListBox1->Width=200;
  Form2->ListBox1->Height=SouradniceY*Zvetseni;
  if (Form2->ListBox1->Width < 850) Form2->Width=Form2->ListBox1->Width+5;
  else Form2->Width=860;
  if (Form2->ListBox1->Height < 850) Form2->Height=Form2->ListBox1->Height+25;
  else Form2->Height=860;
  Form2->Show();
  //nastaveni velikosti Form2 a ListBox1

  //promena pro ukladani namerenych hodnot pro zvetseni
  if (VelikostPoleHodnotZOOM<SouradniceX*Zvetseni)
  {
    VelikostPoleHodnotZOOM=SouradniceX*Zvetseni;
    PoleHodnotZOOM=(float **)malloc(VelikostPoleHodnotZOOM*sizeof(float*));
    for(int i=0;i<VelikostPoleHodnotZOOM;i++)
      PoleHodnotZOOM[i]=(float *)malloc(VelikostPoleHodnotZOOM*sizeof(float));
  }
  //promena pro ukladani namerenych hodnot pro zvetseni

  return fVelikostObrazku = Rect(0,0,SouradniceX*Zvetseni,SouradniceY*Zvetseni);
}
//---konec---
//zjisteni a nastaveni zvetseni

//---------------------------------------------------------------------------

//---zacatek---
//zmena velikosti a vykresleni obrazku
void VykresliObrazek()
{
  Form2->ListBox1->Top=0;
  Form2->ListBox1->Left=0;
  VelikostObrazku=NastavVelikostObrazku(); //nastavi velikost obrazku
  Form2->ListBox1->Refresh(); //smazení ListBox

  if ((Zvetseni*SouradniceX<5000) && (Zvetseni*SouradniceY<5000))
  //kontrola zda je dostatecne velka promenna
  {
    //nacteni hodnot do PoleHodnotZOOM pro zvetseni
    for (int x=0; x<SouradniceX; x++)
      for (int y=0; y<SouradniceY; y++)
        for (int k=0; k<Zvetseni; k++)
          for (int l=0; l<Zvetseni; l++)
            PoleHodnotZOOM[Zvetseni*x+k][Zvetseni*y+l]=PoleHodnot[x][y];
     //nacteni hodnot do PoleHodnotZOOM pro zvetseni

    //kontrola jestli jsou spravne zadane souradnice
    if ((KonecY<=StartY) && (KonecX>=StartX))
    {
      pObrazekZOOM->Height=SouradniceY*Zvetseni;
      pObrazekZOOM->Width=SouradniceX*Zvetseni;
    }
    else ShowMessage("Nesprávně zadané souřadnice!");
    //kontrola jestli jsou spravne zadane souradnice

    //vykresleni obrazku
    Form2->ListBox1->Canvas->StretchDraw(VelikostObrazku,pObrazek);
    for (int i=0;i<pObrazekZOOM->Width;i++)   //prirazeni do promene namerene hodnoty
      for (int j=0;j<pObrazekZOOM->Height;j++)
      {
        pObrazekZOOM->Canvas->Pixels[i][j]=Form2->ListBox1->Canvas->Pixels[i][j];
      }
    Smazane = false;
    //vykresleni obrazku
  }
  else
  {
    //promenna neni dostatecne velka - vykresli ve Zvetseni=1
    ShowMessage("ERROR: Dané zvětšení je příliš velké!");
    Zvetseni=1;
    VelikostObrazku=NastavVelikostObrazku();
    Form2->ListBox1->Refresh();
    Form2->ListBox1->Canvas->Draw(0,0,pObrazek);
    Smazane = false;
    //promenna neni dostatecne velka - vzkresli ve Zvetseni=1
  }
}
//---konec---
//zmena velikosti a vykresleni obrazku

//---------------------------------------------------------------------------
 // funkce pro příjem dat
string PrijataHodnota()
{
  string  prijataHodnota = "";
  int s;
  int velikost;
  char buff[BUFSIZE];
    Sleep(2800);   // čekání na data z měřícího přístroje
    velikost = recv(mySocket, buff, BUFSIZE, 0);
    while (( velikost != 0) && (velikost != -1))
    {
       prijataHodnota += buff;
       s=prijataHodnota.find('\n');
       velikost=-1;
     
     }
        if(s==-1){
              ShowMessage(" Nelze příjmout data z měřícího přístroje Agilentu");
                 }
   return prijataHodnota;
}
//konec funkce pro prijem dat
//---------------------------------------------------------------------------
// inicializace mericiho pristroje
void InicializaceMericihoPristroje()
{
  string posli;
     // Odeslání dat
    if(Song==true)
        posli =("SYST:BEEP\nSYST:BEEP:STAT ON\nDISP:WIND2:TEXT:CLEar\nDISP:WIND1:TEXT:CLEar\n");
    else
      posli =("SYST:BEEP\nSYST:BEEP:STAT OFF\nDISP:WIND2:TEXT:CLEar\nDISP:WIND1:TEXT:CLEar\n");

    if ((send(mySocket, posli.c_str(), posli.size() + 1, 0)) == -1)
    {
         ShowMessage("Problém s odesláním dat");
         WSACleanup();
    }
   posli.erase();

    if ((send(mySocket, pocetVzorku.c_str(), pocetVzorku.size() + 1, 0)) == -1)
    {
         ShowMessage("Problém s odesláním dat");
         WSACleanup();
    }
   //konec odeslani dat
}
// Konec inicializace mericiho pristroje
//---------------------------------------------------------------------------

// funkce pro spouštění měřění
void Mereni()
{
    string  posli ="";
    posli =("INIT\nFETCh?\n");
    if ((send(mySocket, posli.c_str(), posli.size() + 1, 0)) == -1)
    {
         ShowMessage("Problém s odesláním dat");
         WSACleanup();
    }
   posli.erase();

}
// konec funkce pro spouštění měřění
//---------------------------------------------------------------------------

//---zacatek---
//ulozeni obrazku do souboru
void __fastcall TForm1::UlozObrazekClick(TObject *Sender)
{
  SavePictureDialog1->Filter = "Bitmaps (*.bmp)|*.bmp";
  if(SavePictureDialog1->Execute())
    pObrazek->SaveToFile(SavePictureDialog1->FileName+".bmp");
}
//---konec---
//ulozeni obrazku do souboru

//---------------------------------------------------------------------------

//---zacatek---
//nacteni obrazku ze souboru
void __fastcall TForm1::NactiObrazekClick(TObject *Sender)
{
  if(OpenPictureDialog1->Execute())
    pObrazekPrazdny->LoadFromFile(OpenPictureDialog1->FileName);
  if (!pObrazekPrazdny->Empty) //pokud pri nacitani storno,aby se obrazek nevykreslil
  {
    pObrazek->Assign(pObrazekPrazdny);
    pObrazekPrazdny->Dormant();
    pObrazekPrazdny->FreeImage();
    pObrazekPrazdny->ReleaseHandle();
    SouradniceX=pObrazek->Width;
    SouradniceY=pObrazek->Height;
    VykresliObrazek();
    Smazane = true;
  }
  else Form2->Hide();
  ComboBox1->Enabled=true;
}
//---konec---
//nacteni obrazku ze souboru

//---------------------------------------------------------------------------

//---zacatek---
//ulozeni namerenych hodnot do binarniho souboru
void __fastcall TForm1::UlozDataClick(TObject *Sender)
{
  AnsiString NazevSouboru;
  int VelikostSouboru;
  SaveDialog1->Filter = "Lbic soubory (*.lbc)|*.lbc";
  if(SaveDialog1->Execute())
  {
    NazevSouboru=SaveDialog1->FileName+".lbc";
    pSoubor = fopen(NazevSouboru.c_str(),"w+b");
    if  (SouradniceY>SouradniceX) VelikostSouboru=(SouradniceY);
    else VelikostSouboru=SouradniceX;
    for (int i = 0; i < VelikostSouboru; i ++) {
      fwrite(PoleHodnot[i], sizeof(float), VelikostSouboru, pSoubor);
    }
  }
  fclose(pSoubor);
}
//---konec---
//ulozeni namerenych hodnot do binarniho souboru

//---------------------------------------------------------------------------

//---zacatek---
//nacteni namerenych hodnot z binarniho souboru
void __fastcall TForm1::NactiDataClick(TObject *Sender)
{
  //int pr=FileCreate("sata.txt",fmOpenReadWrite);
  //AnsiString abc;
  int Odstin;
  float NamerenaHodnota;

  //otevreni souboru
  MinHodnota=StrToFloat(Form1->Edit9->Text);
  MaxHodnota=StrToFloat(Form1->Edit10->Text);

  Zvetseni=1;
  OpenDialog1->Filter = "Lbic soubory (*.lbc)|*.lbc";
  if(OpenDialog1->Execute())
  {
    pSoubor = fopen(OpenDialog1->FileName.c_str(),"rb");

    //zjisteni velikosti souboru - vypocteni velikosti pole
    int test=open(OpenDialog1->FileName.c_str(),fmOpenRead);
    SouradniceX = (sqrt(filelength(test)))/2;
    SouradniceY=SouradniceX;
    //zjisteni velikosti souboru - vypocteni velikosti pole

    VelikostObrazku=NastavVelikostObrazku();
    InicializaceObrazku();

    for (int i = 0; i < SouradniceX; i ++) {
    fread(PoleHodnot[i], sizeof(float), SouradniceX, pSoubor);
    }
  }
  //otevreni souboru

  //vykresleni obrazku z nactenych dat
  Form1->ProgressBar1->Max=SouradniceY;
  for (int q=0; q<SouradniceY; q++){
    for (int r=0; r<SouradniceX; r++)
    {
     if (PoleHodnot[r][q]<0.001) PoleHodnot[r][q]=0;
     NamerenaHodnota=PoleHodnot[r][q];
     for (int a=0; a<=256; a++)
        {
          if (NamerenaHodnota<(a*((MaxHodnota-MinHodnota)/256)+MinHodnota))
          {
            Odstin=a;
            break;
          }
        }
        Form1->ProgressBar1->Position=q;
        pObrazek->Canvas->Pixels[r][q] = clWhite-Odstin*ZmenaOdstinu;
    }
  //vykresleni obrazku z nactenych dat
  }
  VykresliObrazek();
  ComboBox1->Enabled=true;
  fclose(pSoubor);
}
//---konec---
//nacteni namerenych hodnot z binarniho souboru

//---------------------------------------------------------------------------

//---zacatek---
//uložení hodnot do textového souboru
void __fastcall TForm1::Ulodatatxt1Click(TObject *Sender)
{
   AnsiString NazevSouboru;

  SaveDialog1->Filter = "Textový soubor (*.txt)|*.txt";
  if(SaveDialog1->Execute())
  {
    NazevSouboru=SaveDialog1->FileName+".txt";
    CopyFile(SouborTemp,NazevSouboru.c_str(),false);
    DeleteFile(SouborTemp);
  }
}
//---konec---
//uložení hodnot do textového souboru


//---------------------------------------------------------------------------

//---zacatak---
//nacteni hodnot z textového souboru
void __fastcall TForm1::Otevidatatxt1Click(TObject *Sender)
{
  AnsiString strCislo;
  Char Znak;
  float Cislo, Rozliseni;
  FILE *fTxt;
  bool Vypis;
  int PocetSloupcu=0, PocetRad=0;
  int Odstin;
  float NamerenaHodnota;

  strCislo="";
  MinHodnota=StrToFloat(Form1->Edit9->Text);
  MaxHodnota=StrToFloat(Form1->Edit10->Text);
  Rozliseni=((MaxHodnota-MinHodnota)/256)+MinHodnota;
  Zvetseni=1;

  OpenDialog1->Filter = "Lbic soubory (*.txt)|*.txt";
  if(OpenDialog1->Execute())
  {
    fTxt = fopen(OpenDialog1->FileName.c_str(),"rt");

    Znak='x';
    Vypis=true;
    while (!feof(fTxt))
    {
      if ((int)Znak == 10)
      {
        PocetRad++;
        if (PocetSloupcu > 1)
        {
          Vypis=false;
          SouradniceX=PocetSloupcu;
        }
      }
      if ((((int)Znak == 44) || ((int)Znak == 46)) && Vypis) PocetSloupcu++;
      Znak=fgetc(fTxt);
    }
    SouradniceY=PocetRad-1;

    VelikostObrazku=NastavVelikostObrazku();
    InicializaceObrazku();

    int x=0, y=0, PoziceX=0;
    bool Lichy=true;
    Vypis=false;
    rewind(fTxt);
    Znak='x';
    while (!feof(fTxt))
    {
      Znak=fgetc(fTxt);
      while ((((int)Znak > 47) && ((int)Znak < 58)) || (((int)Znak == 44) || ((int)Znak == 46)))
      {
        if ((int)Znak == 46) Znak = ',';
        strCislo = strCislo + Znak;
        Vypis=true;
        Znak=fgetc(fTxt);
      }
      if (Vypis)
      {
        Vypis=false;
        Cislo=StrToFloat(strCislo);
        PoleHodnot[x][y]=Cislo;

        if (PoleHodnot[x][y]<0.001) PoleHodnot[x][y]=0;
        NamerenaHodnota=PoleHodnot[x][y];
        for (int a=0; a<=256; a++)
          {
            if (NamerenaHodnota < (a*Rozliseni))
            {
              Odstin=a;
              break;
            }
          }
        pObrazek->Canvas->Pixels[x][y] = clWhite-Odstin*ZmenaOdstinu;

        PoziceX++;
        if (Lichy) x++;
        else x--;
        if (PoziceX>=SouradniceX) {PoziceX=0; y++; Lichy=!Lichy;}
      }
      strCislo="";
    }

    VykresliObrazek();
    ComboBox1->Enabled=true;
    fclose(fTxt);
  }
}
//---konec---
//nacteni hodnot z textového souboru

//---------------------------------------------------------------------------


//---zacatek---
//preruseni scanovani solarniho clanku
void __fastcall TForm1::Button1Click(TObject *Sender)
{
 CanRun=false;
}
//---konec---
//preruseni scanovani solarniho clanku

//---------------------------------------------------------------------------

//---zacatek---
//scanovani solarniho clanku
void __fastcall TForm1::Button3Click(TObject *Sender)
{
  vyberMetody=Form1->RadioGroup2->ItemIndex;

  if(Pripojeno== false)
  {
    ShowMessage("Měřící přístroj Agilent není připojen");
  }
  else
  {

  CanRun=true;

  //inicializace promenych
  AnsiString InitPlotr,PosunPlotrDoprava,PosunPlotrDoleva,InitPlotr2,PosunPlotrDoprava2,PosunPlotrDoleva2,NovyRadekPlotr;
  int port;
  float port2=FileCreate(SouborTemp,fmOpenReadWrite); //prumerne namerene hodnoty
  int Odstin,Lichy;
  float NamerenaHodnota;
  AnsiString NH;
  //inicializace promenych

  //ochrana proti spatnemu zadani kroku
  Zvetseni=1;
  if  (Edit6->Text==0){
  Edit6->Text=1;
  }
  //ochrana proti spatnemu zadani kroku

  MinHodnota=StrToFloat(Form1->Edit9->Text);
  MaxHodnota=StrToFloat(Form1->Edit10->Text);

  //nacitani souradnic
  StartX=Form1->Edit1->Text.ToInt();
  StartY=Form1->Edit2->Text.ToInt();
  SouradniceXplotr=Form1->Edit3->Text.ToInt();
  SouradniceYplotr=Form1->Edit4->Text.ToInt();
  //nacitani souradnic

  //nastaveni kroku
  KrokY=StrToInt(Form1->Edit6->Text);
  //nastaveni kroku

  KonecX=(StartX+SouradniceXplotr);
  KonecY=(StartY-SouradniceY);

  SouradniceY=SouradniceYplotr/KrokY;
  Form1->ProgressBar1->Max=SouradniceY;


  InicializaceMericihoPristroje();

  //nastaveni pozice ListBoxu na Form2
  //musi byt zde, jinak se pozice vraci po kazdem posunuti
  Form2->ListBox1->Top=0;
  Form2->ListBox1->Left=0;
  //nastaveni pozice ListBoxu na Form2

  VelikostObrazku=NastavVelikostObrazku(); //fce NastavVelikostObrazku (82)

  Form2->ListBox1->Refresh();//Smaze ListBox
  Form1->Label21->Visible=true;
  Form1->Label20->Visible=true;
  Smazane = false;

  //vlozeni hodnot do promenych pro ovladani plotru
  InitPlotr = "PU;PA"+AnsiString(StartX)+","+AnsiString(StartY)+";PD;";
  InitPlotr2 = "PU;PA"+AnsiString(StartX+SouradniceXplotr)+","+AnsiString(StartY)+";PD;";
  PosunPlotrDoprava = "VS5;PR"+AnsiString(SouradniceXplotr)+",0;";
  PosunPlotrDoprava2 = "VS50;PR"+AnsiString(SouradniceXplotr)+",0;";
  PosunPlotrDoleva = "VS50;PR-"+AnsiString(SouradniceXplotr)+",0;";
  PosunPlotrDoleva2 = "VS5;PR-"+AnsiString(SouradniceXplotr)+",0;";

  NovyRadekPlotr = "VS50;PR0,-"+AnsiString(KrokY)+";";
  //vlozeni hodnot do promenych pro ovladani plotru

  InicializaceObrazku();

  //pohyb plotru, mereni hodnot a vykreslovani
  port = FileOpen("lpt1", fmOpenReadWrite);// !!!aktivovat pro protr!!!

  if(vyberMetody==1){
                 FileWrite(port,InitPlotr2.c_str(),StrLen(InitPlotr2.c_str()));//inicializace plotru
                    }
      else  {
         FileWrite(port,InitPlotr.c_str(),StrLen(InitPlotr.c_str()));//inicializace plotru
            }
    int j=-1;
    Sleep(1000); // čekání na plotr, když se bude muset přesunout

    for(int f=SouradniceYplotr;CanRun&&f>0;f-=KrokY)
    {
    ++j;
    int y=j;
    Form1->ProgressBar1->Position=j;
    Form1->Label20->Caption=(AnsiString(j+1)+" z "+AnsiString(SouradniceY));
    Lichy = fmod(j,2);

    switch(vyberMetody)
    {
     case 0: {   // metoda zprava doleva
            int x=-1;
            text="";
            string znak;

            FileWrite(port,PosunPlotrDoprava.c_str(),StrLen(PosunPlotrDoprava.c_str()));
            Mereni();
            text=PrijataHodnota();
            FileWrite(port,PosunPlotrDoleva.c_str(),StrLen(PosunPlotrDoleva.c_str()));
            istringstream iss(text);

         while(getline(iss, znak, ','))
         {
          x++;
          Form1->ListBox1->Items->Add(AnsiString(znak.c_str()));
          NamerenaHodnota=atof(znak.c_str());
          for (int a=0; a<=256; a++)
          {
            if (NamerenaHodnota<(a*((MaxHodnota-MinHodnota)/256)+MinHodnota))
            {
              Odstin=a;
              break;
            }
          }
          Application->ProcessMessages();
          NH=FloatToStr(NamerenaHodnota)+"   ";
          FileWrite(port2,NH.c_str(),StrLen(NH.c_str()));
          PoleHodnot[x][y] = NamerenaHodnota;
          pObrazek->Canvas->Pixels[x][y] = clWhite-Odstin*ZmenaOdstinu;
          Form2->ListBox1->Canvas->Pixels[x][y] = clWhite-Odstin*ZmenaOdstinu;

         }

            }
       break;

     case 1: {  // metoda zleva doprava
              FileWrite(port,PosunPlotrDoleva2.c_str(),StrLen(PosunPlotrDoleva2.c_str()));
              Mereni();

             int i=-1;
             text="";
             string znak;

            text=PrijataHodnota();
            FileWrite(port,PosunPlotrDoprava2.c_str(),StrLen(PosunPlotrDoprava2.c_str()));
            istringstream iss(text);

         while(getline(iss, znak, ','))
         {
           i++;
           int x=vyberPocet-(i+1);
           Form1->ListBox1->Items->Add(AnsiString(znak.c_str()));
            NamerenaHodnota=atof(znak.c_str());
          for (int a=0; a<=256; a++)
          {
            if (NamerenaHodnota<(a*((MaxHodnota-MinHodnota)/256)+MinHodnota))
            {
              Odstin=a;
              break;
            }
          }
          Application->ProcessMessages();
          NH=FloatToStr(NamerenaHodnota)+"   ";
          FileWrite(port2,NH.c_str(),StrLen(NH.c_str()));
          PoleHodnot[x][y] = NamerenaHodnota;
          pObrazek->Canvas->Pixels[x][y] = clWhite-Odstin*ZmenaOdstinu;
          Form2->ListBox1->Canvas->Pixels[x][y] = clWhite-Odstin*ZmenaOdstinu;

         }

             }
       break;

     case 2: // metoda tam i zpět
     {
        if (Lichy==0)
          {
            int x=-1;
            text="";
            string znak;

            FileWrite(port,PosunPlotrDoprava.c_str(),StrLen(PosunPlotrDoprava.c_str()));
            Mereni();
            text=PrijataHodnota();
            istringstream iss(text);

         while(getline(iss, znak, ','))
         {
          x++;
          Form1->ListBox1->Items->Add(AnsiString(znak.c_str()));
          NamerenaHodnota=atof(znak.c_str());
          for (int a=0; a<=256; a++)
          {
            if (NamerenaHodnota<(a*((MaxHodnota-MinHodnota)/256)+MinHodnota))
            {
              Odstin=a;
              break;
            }
           }
          Application->ProcessMessages();
          NH=FloatToStr(NamerenaHodnota)+"   ";
          FileWrite(port2,NH.c_str(),StrLen(NH.c_str()));
          PoleHodnot[x][y] = NamerenaHodnota;
          pObrazek->Canvas->Pixels[x][y] = clWhite-Odstin*ZmenaOdstinu;
          Form2->ListBox1->Canvas->Pixels[x][y] = clWhite-Odstin*ZmenaOdstinu;

         }
        }
    else
        {
      FileWrite(port,PosunPlotrDoleva2.c_str(),StrLen(PosunPlotrDoleva2.c_str()));
      Mereni();

      int i=-1;
      text="";
      string znak;

      text=PrijataHodnota();
      istringstream iss(text);

      while(getline(iss, znak, ','))
      {
      i++;
      int x=vyberPocet-(i+1);
      Form1->ListBox1->Items->Add(AnsiString(znak.c_str()));
      NamerenaHodnota=atof(znak.c_str());
          for (int a=0; a<=256; a++)
          {
            if (NamerenaHodnota<(a*((MaxHodnota-MinHodnota)/256)+MinHodnota))
            {
              Odstin=a;
              break;
            }
          }
          Application->ProcessMessages();
          NH=FloatToStr(NamerenaHodnota)+"   ";
          FileWrite(port2,NH.c_str(),StrLen(NH.c_str()));
          PoleHodnot[x][y] = NamerenaHodnota;
          pObrazek->Canvas->Pixels[x][y] = clWhite-Odstin*ZmenaOdstinu;
          Form2->ListBox1->Canvas->Pixels[x][y] = clWhite-Odstin*ZmenaOdstinu;
        }
         }
       }
       break;
    };

      Sleep(300);  //čekání na vykreslení
      FileWrite(port,NovyRadekPlotr.c_str(),StrLen(NovyRadekPlotr.c_str()));
      FileWrite(port2, "\n", strlen("\n"));
      Sleep(40);  //čekání na přesun plotteru
     }
  //Konec--pohyb plotru, mereni hodnot a vykreslovani

  Form1->ProgressBar1->Position=Form1->ProgressBar1->Max;
  FileClose(port);
  FileClose(port2);
  Form2->Caption=(" X: -    Y: -   Hodnota: - ");
  ComboBox1->Enabled=true;
  Form2->Show();
  }
}
//---konec---
//scanovani solarniho clanku

//---------------------------------------------------------------------------

//---zacatek---
//smazani obrazku z obrazovky
void __fastcall TForm1::Button4Click(TObject *Sender)
{
  pObrazek->Assign(pObrazekPrazdny);
  Form2->ListBox1->Refresh();//Smaze ListBox
  Form2->Caption=(" X: -    Y: -   Hodnota: - ");
  Form1->ListBox1->Clear();
  Form1->Label20->Visible=false;
  Form1->ProgressBar1->Position=Form1->ProgressBar1->Min;
  Smazane = true;

}
//---konec---
//smazani obrazku z obrazovky

//---------------------------------------------------------------------------

//---zacatek---
//zmena velikosti a vykresleni obrazku
void __fastcall TForm1::ComboBox1Select(TObject *Sender)
{
  Zvetseni=0;
  VykresliObrazek();
}
//---konec---
//zmena velikosti a vykresleni obrazku

//---------------------------------------------------------------------------

//---zacatek---
//prekresleni obrazku
void __fastcall TForm1::Button2Click(TObject *Sender)
{
  int Odstin, Posun, Sudy;
  float NamerenaHodnota;

    MinHodnota=StrToFloat(Form1->Edit9->Text);
    MaxHodnota=StrToFloat(Form1->Edit10->Text);
    for (int q=0; q<SouradniceY; q++){
    for (int r=0; r<SouradniceX; r++)
    {
     if (PoleHodnot[r][q]<0.001) PoleHodnot[r][q]=0;

  //vykresleni obrazku z nactenych dat
     NamerenaHodnota=PoleHodnot[r][q];
     for (int a=0; a<=256; a++)
        {
          if (NamerenaHodnota<(a*((MaxHodnota-MinHodnota)/256)+MinHodnota))
          {
            Odstin=a;
            break;
          }
        }
        Sudy = fmod(q,2);
        if (Sudy==0) Posun=StrToInt(Form1->Edit11->Text);
        else Posun=0;
        pObrazek->Canvas->Pixels[r+Posun][q] = clWhite-Odstin*ZmenaOdstinu;
    }
  //vykresleni obrazku z nactenych dat
  }
  Zvetseni=0;
  VykresliObrazek();
}
//---konec---
//prekresleni obrazku

//---------------------------------------------------------------------------

//---zacatek---
//negativ prekresleni obrazku
void __fastcall TForm1::Button5Click(TObject *Sender)
{
  int Odstin, Posun, Sudy;
  float NamerenaHodnota;

  MinHodnota=StrToFloat(Form1->Edit9->Text);
  MaxHodnota=StrToFloat(Form1->Edit10->Text);
  for (int q=0; q<SouradniceY; q++){
    for (int r=0; r<SouradniceX; r++)
    {
      if (PoleHodnot[r][q]<0.001) PoleHodnot[r][q]=0;

  //vykresleni obrazku z nactenych dat
       NamerenaHodnota=PoleHodnot[r][q];
       for (int a=0; a<=256; a++)
       {
         if (NamerenaHodnota<(a*((MaxHodnota-MinHodnota)/256)+MinHodnota))
         {
           Odstin=a;
           break;
         }
       }
       Sudy = fmod(q,2);
       if (Sudy==0) Posun=StrToInt(Form1->Edit11->Text);
       else Posun=0;
       pObrazek->Canvas->Pixels[r+Posun][q] = clBlack+Odstin*ZmenaOdstinu;
    }
  }
  //vykresleni obrazku z nactenych dat

  Zvetseni=0;
  VykresliObrazek();
}
//---konec---
//negativ prekresleni obrazku

//---------------------------------------------------------------------------

//---zacatek---
//ukonceni programu
void __fastcall TForm1::UkonciprogramClick(TObject *Sender)
{
  CanRun=false;
  DeleteFile(SouborTemp);


 // Odeslání dat
  if(Pripojeno==true)
  {
   text =("SYST:BEEP\nDISP:WIND2:TEXT:CLEar\nDISP:WIND1:TEXT:CLEar\n");
    if ((size = send(mySocket, text.c_str(), text.size() + 1, 0)) == -1)
    {
         ShowMessage("Problém s odesláním dat");
         WSACleanup();
    }
   text.erase();
   //--------------konec odeslani dat
  closesocket(mySocket);  //FK  Uzavreni spojení
  WSACleanup();
  }
  Close();
}
//---konec---
//ukonceni programu

//---------------------------------------------------------------------------

//---zacatek---
//odstraneni obrazku z pameti
void main (void)
{
  delete pObrazek;
  delete pObrazekZOOM;
  delete pObrazekPrazdny;
  delete pObrazekVyber;
  free(PoleHodnot);
  free(PoleHodnotZOOM);
}
//---konec---
//odstraneni obrazku z pameti

//---------------------------------------------------------------------------

// připojení měřícího přístroje Agilent
void __fastcall TForm1::Button6Click(TObject *Sender)
{
     ip=Form3->Edit1->Text.c_str();
     port=Form3->Edit2->Text.ToInt();
     text =("SYST:BEEP\nVOLTage:DC:RANGe 10\nDISP:TEXT \"Connect LBIC...\"\nDISP:WIND2:TEXT \"WAITING FOR DATA...\"\nDISP:WIND2:TEXT?\n");


    // Pripravíme sokety na práci
    if (WSAStartup(wVersionRequested, &data) != 0)
    {
        ShowMessage("Nepodarilo se inicializovat sokety");
        // Podle všeho, zde se WSACleanup volat nemusí.
    }

    // Vytvoríme soket
    if ((mySocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == -1)
    {
        ShowMessage("Nelze vytvorit soket");
        WSACleanup();
    }
    // Zaplníme strukturu sockaddr_in
    // 1) Rodina protokolu
    serverSock.sin_family = AF_INET;
    // 2) Císlo portu, ke kterému se poipojíme
    serverSock.sin_port = htons(port);
    // 3) Nastavení IP adresy, ke které se pripojíme
   serverSock.sin_addr.s_addr=inet_addr(ip.c_str());

    // Pripojení soketu
    if (connect(mySocket, (sockaddr *)&serverSock, sizeof(serverSock)) == -1)
    {
        ShowMessage("Nelze navázat spojení,\n     špatná IP adresa");
        WSACleanup();
        goto konec;
    }

    // Odeslání dat
    if ((size = send(mySocket, text.c_str(), text.size() + 1, 0)) == -1)
    {
         ShowMessage("Problém s odesláním dat");
         WSACleanup();
         goto konec;
    }

    // Príjem dat
    text = "";
    int s;
    size = recv(mySocket, buf, BUFSIZE, 0);
    while (( size != 0) && (size != -1))
    {
             for(int i=0;i<size;i++)
                 {
                 text += buf[i];
                 }

       s=text.find('\n');
       size=-1;
     }
        if(s==-1){
              ShowMessage(" Nelze příjmout data z měřícího přístroje Agilentu");
                 }

          else{


             if("\"WAITING FOR DATA...\"\n"==text)

             ShowMessage("Spojení je navázáno");
               }


    text.erase();
    Pripojeno=true;
    Form1->Edit7->Text="     Připojeno k Agilent";
    Form1->Edit7->Color=clGreen;
    konec:


} // Konec--připojení měřícího přístroje Agilent
//---------------------------------------------------------------------------


void __fastcall TForm1::N1Click(TObject *Sender)
{
       ShowMessage("Nápovědu hledejte v diplomové práci: Softwarové ovládací prostředí pro měřící metodu LBIC \nVerze programu: 2.0");
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Agilent34411A1Click(TObject *Sender)
{                      // nastavení pro zobrazení LAN rozhraní
   Form3->Top=280;
   Form3->Left=578;
   Form3->Width=444;
   Form3->Height=300;
   Form3->CheckBox1->Checked=Song;
   Form3->CheckBox1->Visible=true;
   Form3->Image1->Visible=false;
   Form3->Button1->Visible=true;
   Form3->Button2->Visible=true;
   Form3->StaticText1->Visible=true;
   Form3->StaticText2->Visible=true;
   Form3->Edit1->Visible=true;
   Form3->Edit2->Visible=true;

   Form3->Caption="Nastavení měřícího přístroje";
   Form3->Show();
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Zapojenmchopstroje2Click(TObject *Sender)
{
                         // nastavení pro zobrazení zapojení měřícího přístroje
  Form3->Image1->Picture->LoadFromFile("zapojeni3.bmp");
  Form3->Image1->Visible=true;
  Form3->Button1->Visible=false;
  Form3->Button2->Visible=false;
  Form3->StaticText1->Visible=false;
  Form3->StaticText2->Visible=false;
  Form3->Edit1->Visible=false;
  Form3->Edit2->Visible=false;
  Form3->CheckBox1->Visible=false;
  Form3->Width=480;
  Form3->Height=330;
  Form3->Image1->Width=450;
  Form3->Image1->Height=270;
  Form3->Caption="Zapojení měřícího přístroje";
  Form3->Show();
}
//---------------------------------------------------------------------------
// Vyber velikosti měřeného článku
void __fastcall TForm1::RadioGroup1Click(TObject *Sender)
{
  vyberClanku=Form1->RadioGroup1->ItemIndex;
  Form1->ComboBox2Change(Sender);
  switch (vyberClanku)
  {
    case 0:{
          Edit1->Text=7810 ;   //StartX  7810   8060
          Edit2->Text=5360;   //StartY   4560   5360
          Edit3->Text=4600;   //posun osa x     4600
          Edit4->Text=4100;   //posun osa y
           }
    break;
    case 1:{
           Edit1->Text=6970;   //StartX
           Edit2->Text=6255;   //StartY
           Edit3->Text=5500;  //posun osa x
           Edit4->Text=5000;  //posun osa y
           }
    break;
    case 2:{
           Edit1->Text=5970;   //StartX
           Edit2->Text=7255;   //StartY
           Edit3->Text=6500;   //posun osa x
           Edit4->Text=6000;   //posun osa y
           }
    break;
  } ;

}
//---------------------------------------------------------------------------


void __fastcall TForm1::Zapojenmchopstroje1Click(TObject *Sender)
{
        ShowMessage("U této metody neprobíhá měření bod po bodu, hodnoty jsou měřené během přesunu led diody z jedné strany na druhou.\n Zaleží na výběru metody, buď se měří hodnoty zprava doleva nebo zleva doprava. Pokuď bude vybrána metoda tam i zpět, měří se sudý řádek zprava a lichý zleva. ");
}
//---------------------------------------------------------------------------
//nastavavuje počty vzorků, periodu měření
void __fastcall TForm1::ComboBox2Change(TObject *Sender)
{
  AnsiString pocet;
  pocet=Form1->ComboBox2->Text;
  vyberPocet=StrToInt(pocet);

    switch (vyberPocet)
  {
    case 400:{

    if(vyberClanku==0){
      pocetVzorku =("SYSTem:PRESet\nVOLT:DC:RANGe 10\nVOLT:IMP:AUTO 1\nVOLT:ZERO:AUTO OFF\nVOLT:DC:APER 0.006008188\nTRIG:SOUR IMM\nTRIG:COUN 1\nTRIG:DEL 0\nSAMP:COUN 400\nSAMP:SOUR TIM\nSAMP:TIM 0\n");
      Edit6->Text=10;
                      }
    if(vyberClanku==1){
      pocetVzorku =("SYSTem:PRESet\nVOLT:DC:RANGe 10\nVOLT:IMP:AUTO 1\nVOLT:ZERO:AUTO OFF\nVOLT:DC:APER 0.007522259\nTRIG:SOUR IMM\nTRIG:COUN 1\nTRIG:DEL 0\nSAMP:COUN 400\nSAMP:SOUR TIM\nSAMP:TIM 0\n");
      Edit6->Text=12;
                      }
    if(vyberClanku==2){
      pocetVzorku =("SYSTem:PRESet\nVOLT:DC:RANGe 10\nVOLT:IMP:AUTO 1\nVOLT:ZERO:AUTO OFF\nVOLT:DC:APER 0.009018729\nTRIG:SOUR IMM\nTRIG:COUN 1\nTRIG:DEL 0\nSAMP:COUN 400\nSAMP:SOUR TIM\nSAMP:TIM 0\n");
      Edit6->Text=15;
                      }
      SouradniceX=400;
           }
    break;

    case 800:{
    if(vyberClanku==0){
      pocetVzorku =("SYSTem:PRESet\nVOLT:DC:RANGe 10\nVOLT:IMP:AUTO 1\nVOLT:ZERO:AUTO OFF\nVOLT:DC:APER 0.0030128942\nTRIG:SOUR IMM\nTRIG:COUN 1\nTRIG:DEL 0\nSAMP:COUN 800\nSAMP:SOUR TIM\nSAMP:TIM 0\n");
      Edit6->Text=5;
                      }
    if(vyberClanku==1){
      pocetVzorku =("SYSTem:PRESet\nVOLT:DC:RANGe 10\nVOLT:IMP:AUTO 1\nVOLT:ZERO:AUTO OFF\nVOLT:DC:APER 0.003751153\nTRIG:SOUR IMM\nTRIG:COUN 1\nTRIG:DEL 0\nSAMP:COUN 800\nSAMP:SOUR TIM\nSAMP:TIM 0\n");
      Edit6->Text=6;
                      }
    if(vyberClanku==2){
      pocetVzorku =("SYSTem:PRESet\nVOLT:DC:RANGe 10\nVOLT:IMP:AUTO 1\nVOLT:ZERO:AUTO OFF\nVOLT:DC:APER 0.0045093647\nTRIG:SOUR IMM\nTRIG:COUN 1\nTRIG:DEL 0\nSAMP:COUN 800\nSAMP:SOUR TIM\nSAMP:TIM 0\n");
      Edit6->Text=7;
                      }
      SouradniceX=800;
         }
    break;

    case 1200:{
     if(vyberClanku==0){
      pocetVzorku =("SYSTem:PRESet\nVOLT:DC:RANGe 10\nVOLT:IMP:AUTO 1\nVOLT:ZERO:AUTO OFF\nVOLT:DC:APER 0.002015247\nTRIG:SOUR IMM\nTRIG:COUN 1\nTRIG:DEL 0\nSAMP:COUN 1200\nSAMP:SOUR TIM\nSAMP:TIM 0\n");
      Edit6->Text=3;
                       }
     if(vyberClanku==1){
      pocetVzorku =("SYSTem:PRESet\nVOLT:DC:RANGe 10\nVOLT:IMP:AUTO 1\nVOLT:ZERO:AUTO OFF\nVOLT:DC:APER 0.0025140706\nTRIG:SOUR IMM\nTRIG:COUN 1\nTRIG:DEL 0\nSAMP:COUN 1200\nSAMP:SOUR TIM\nSAMP:TIM 0\n");
      Edit6->Text=4;
                       }
     if(vyberClanku==2){
       pocetVzorku =("SYSTem:PRESet\nVOLT:DC:RANGe 10\nVOLT:IMP:AUTO 1\nVOLT:ZERO:AUTO OFF\nVOLT:DC:APER 0.0030128942\nTRIG:SOUR IMM\nTRIG:COUN 1\nTRIG:DEL 0\nSAMP:COUN 1200\nSAMP:SOUR TIM\nSAMP:TIM 0\n");
       Edit6->Text=5;
                       }
       SouradniceX=1200;
           }
    break;

    case 1600:{
    if(vyberClanku==0){
      pocetVzorku =("SYSTem:PRESet\nVOLT:DC:RANGe 10\nVOLT:IMP:AUTO 1\nVOLT:ZERO:AUTO OFF\nVOLT:DC:APER 0.0015164235\nTRIG:SOUR IMM\nTRIG:COUN 1\nTRIG:DEL 0\nSAMP:COUN 1600\nSAMP:SOUR TIM\nSAMP:TIM 0\n");
      Edit6->Text=3;
                      }
    if(vyberClanku==1){
      pocetVzorku =("SYSTem:PRESet\nVOLT:DC:RANGe 10\nVOLT:IMP:AUTO 1\nVOLT:ZERO:AUTO OFF\nVOLT:DC:APER 0.0018755764\nTRIG:SOUR IMM\nTRIG:COUN 1\nTRIG:DEL 0\nSAMP:COUN 1600\nSAMP:SOUR TIM\nSAMP:TIM 0\n");
      Edit6->Text=3;
                      }
    if(vyberClanku==2){
      pocetVzorku =("SYSTem:PRESet\nVOLT:DC:RANGe 10\nVOLT:IMP:AUTO 1\nVOLT:ZERO:AUTO OFF\nVOLT:DC:APER 0.0022546824\nTRIG:SOUR IMM\nTRIG:COUN 1\nTRIG:DEL 0\nSAMP:COUN 1600\nSAMP:SOUR TIM\nSAMP:TIM 0\n");
      Edit6->Text=4;
                      }
       SouradniceX=1600;
           }
    break;

    case 2000:{
    if(vyberClanku==0){
      pocetVzorku =("SYSTem:PRESet\nVOLT:DC:RANGe 10\nVOLT:IMP:AUTO 1\nVOLT:ZERO:AUTO OFF\nVOLT:DC:APER 0.0012171294\nTRIG:SOUR IMM\nTRIG:COUN 1\nTRIG:DEL 0\nSAMP:COUN 2000\nSAMP:SOUR TIM\nSAMP:TIM 0\n");
      Edit6->Text=2;
                      }
    if(vyberClanku==1){
      pocetVzorku =("SYSTem:PRESet\nVOLT:DC:RANGe 10\nVOLT:IMP:AUTO 1\nVOLT:ZERO:AUTO OFF\nVOLT:DC:APER 0.0015164235\nTRIG:SOUR IMM\nTRIG:COUN 1\nTRIG:DEL 0\nSAMP:COUN 2000\nSAMP:SOUR TIM\nSAMP:TIM 0\n");
      Edit6->Text=2;
                      }
    if(vyberClanku==2){
      pocetVzorku =("SYSTem:PRESet\nVOLT:DC:RANGe 10\nVOLT:IMP:AUTO 1\nVOLT:ZERO:AUTO OFF\nVOLT:DC:APER 0.0018157177\nTRIG:SOUR IMM\nTRIG:COUN 1\nTRIG:DEL 0\nSAMP:COUN 2000\nSAMP:SOUR TIM\nSAMP:TIM 0\n");
      Edit6->Text=3;
                      }
      SouradniceX=2000;
          }
    break;

  };

}
//---------------------------------------------------------------------------


