unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, FT_D2XX, ExtCtrls, Math, Grids, TeEngine, Series, TeeProcs,
  Chart, DbChart, ComCtrls, Menus;

type
  TForm1 = class(TForm)
    MainMenu1: TMainMenu;
    USB1: TMenuItem;
    Connect1: TMenuItem;
    Disconnect1: TMenuItem;
    EEPROM1: TMenuItem;
    Read1: TMenuItem;
    Showingraph1: TMenuItem;
    imeSync1: TMenuItem;
    GroupBox1: TGroupBox;
    Label4: TLabel;
    Label1: TLabel;
    PageControl1: TPageControl;
    TabSheet1: TTabSheet;
    DBChart1: TDBChart;
    Series1: TLineSeries;
    procedure FormCreate(Sender: TObject);
    procedure Disconnect1Click(Sender: TObject);
    procedure Connect1Click(Sender: TObject);
    procedure imeSync1Click(Sender: TObject);
    procedure Read1Click(Sender: TObject);
    procedure Showingraph1Click(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    USB: TUSB_Driver;
    procedure Receive(Sender: TObject; DataPtr: pointer; DataSize: integer);
    procedure ZpracovatZnak(zn: byte);
  end;

var
  znak:integer; pom:string; teplBIN,teplBIN2:real;
  t1, t2, t3, e1, e2, e3, k1, prv, prv1,jednotka:boolean; sloup:integer;
  T:array [1..2048] of double; i:integer;
  Form1: TForm1;

implementation


{$R *.DFM}

{*************************************************************************************************}

procedure TForm1.Receive(Sender: TObject; DataPtr: pointer; DataSize: integer); //příjem bytu
type
  tarr = array[0..0] of byte;
  parr = ^tarr;
var
  i: integer;
begin
  for i := 0 to DataSize - 1 do
    ZpracovatZnak(parr(DataPtr)^[i]);
end;

{*************************************************************************************************}

function IntToBin(Num: cardinal; Length: integer): string;  //prevod integer cisla na binární
var
  i: cardinal;
begin
  i := 1;
  Result := '';
  while (i <= Num) or (system.Length(Result) < Length) do begin
    if Num and i = i then
      Result := '1' + Result
    else
      Result := '0' + Result;
    i := i * 2;
  end;
end;

function BinToInt( Binary: String ):Integer;  // prevod binarniho cisla na integer
var
  i, j: Integer;
begin
  Result := 0;
  j := 1;
  for i := Length( Binary ) downTo 1 do
  begin
    Result := Result + StrToInt( Binary[i] ) * j;
    j := j*2;
  end;
end;

procedure TForm1.ZpracovatZnak(zn: byte);  //zpracování přijatého bytu
var
j,k:integer; teplEEP:integer;
begin
    if (t2=true) then
      begin
        if (prv=false) then
          begin
            prv:=true;
            pom:=(IntToBin(zn,8));  // ulozeni spodniho bytu v binarni hodnote
          end
        else
          begin
            t1 := false; t2 := false; prv := false;
            teplBIN:=bintoint(pom+IntToBin(zn,8));  // slouceni spodniho a horniho bytu a prevod na integer
            IF teplBIN > 32768 then teplBIN:=(teplBin-32768)*-1;
            Label4.Caption:=(floattostr((teplBIN)/10)+' '+'°C');  // zobrazeni aktualne merene teploty
          end;
      end;

    if (e2=true) then
      begin
        if (prv1=false) then
          begin
            prv1:=true;
            pom:=(IntToBin(zn,8));
            e1:= false; e2 := false;
          end
        else
          begin
            teplEEP:=(bintoint(IntToBin(zn,8)+pom));
            IF teplEEP > 32768 then teplEEP:=(teplEEP-32768)*-1;
            prv1:=false; e1:= false; e2 := false;
            t[i]:=teplEEP;  // ukladani hodnot nactenych z EEPROM
            pom:='';
            inc(i);
            Label4.caption:='Načítám';  //zobrazeni stavu
            imeSync1.Visible:=false;
            EEPROM1.Visible:=false;
            USB1.Visible:=false;
          end;
      end;

    if (zn=84) then t1:=true;       // identifikacni byte pro teplotu
    if ((zn=69) and (t1=true)) then t2:=true;

    if (zn=80) then e1:=true;       // identifikacni byte pro EEPROM
    if ((zn=65) and (e1=true)) then
        begin
          e2:=true;
        end;

    if (zn=75) then k1:=true;       // identifikacni byte pro konec vysílání
    if ((zn=79) and (k1=true)) then
        begin
          prv1:=false; e1:= false; e2 := false; pom:=''; i:=1;
          imeSync1.Visible:=true;
          EEPROM1.Visible:=true;
          USB1.Visible:=true;
          series1.Clear;
          pagecontrol1.Visible:=true;
          series1.Clear;
          form1.Showingraph1Click(self);
        end;
end;

{*************************************************************************************************}

procedure TForm1.FormCreate(Sender: TObject);  // nastaveni parametru pri vytvareni formulare
var j:integer;
begin
  tabsheet1.Caption:='Graf';
  pagecontrol1.Visible:=false;
  sloup:=0; t1:=false; t2:=false; t3:=false; prv:=false; e1:=false; e2:=false; e3:=false; prv1:=false; I:=1; jednotka:=false;
  Label4.Caption:='Odpojeno';
end;


{*************************************************************************************************}

procedure TForm1.Disconnect1Click(Sender: TObject);  // uvolneni USB portu
begin
  t1 := false; t2 := false; t3 := false; prv := false;
  USB.Close_USB_Device;
  Label4.Caption:='Odpojeno';
end;



procedure TForm1.Connect1Click(Sender: TObject);  // otevreni USB portu
begin
  USB := TUSB_Driver.Create(self);
  USB.BaudRate := FT_BAUD_9600;     // prenosova rychlost 9600 bit/s
  USB.DataBits := FT_DATA_BITS_8;   // 8 datovych bitu
  USB.StopBits := FT_STOP_BITS_2;   // start bit a stop bit
  USB.Parity := FT_PARITY_NONE;     // zadny paritni bit
  USB.OnReceiveData := Receive;     // udalost od prijatého znaku

  USB.Close_USB_Device;             // uvolneni USB portu
  USB.Open_USB_Device;              // otevreni USB portu
  if not (USB.Connected) then       // osetreni otevreni portu
    ShowMessage('Chyba inicializace USB');
  if (USB.Connected) then
      ShowMessage('Spojeno');
end;

procedure TForm1.imeSync1Click(Sender: TObject);  // casova synchronizace
var  Hour, Min, Sec, MSec : Word;  j:integer; cas:string;
begin
if not (USB.Connected) then         // osetreni otevreni portu
  ShowMessage('USB zařízení není připojené');
cas := (TimeToStr(Time));
DecodeTime(Time, Hour, Min, Sec, MSec);
USB.SendByte(168);                  // identifikacni byte pro vyslani hodin
SLEEP(100);
USB.SendByte(hour);                 // vyslani hodin
SLEEP(100);
USB.SendByte(87);                   // identifikacni byte pro vyslani minut
SLEEP(100);
USB.SendByte(min);                  // vyslani minut
SLEEP(100);
USB.SendByte(175);                  // identifikacni byte pro vyslani sekund
SLEEP(100);
USB.SendByte(sec);                  // vyslani sekund
SLEEP(100);
end;

procedure TForm1.Read1Click(Sender: TObject); // cteni z EEPROM
var J:integer;
begin
if not (USB.Connected) then         // osetreni otevreni portu
  ShowMessage('USB zařízení není připojené');
USB.SendByte(210);                  // vyslani identifikacniho bytu pro prijem hodnot z EEPROM
SLEEP(100);
for j:=1 to length(t) do            // vymazani naplneneho pole
  begin
    t[j]:=65536
  end;
end;
procedure TForm1.Showingraph1Click(Sender: TObject);  // vykresleni nactenych hodnot do grafu
var j:integer;
begin
PageControl1.TabIndex:=0;
series1.Title:='Historie teplot  nečtených z paměti EEPROM';
series1.Clear;
for j:=1 to length(t) do
  begin
    if (t[j]=65536) and (t[j+1]=65536) then break
    else
      begin
        series1.Add(t[j]/10);
      end;
  end;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  USB.Close_USB_Device;           // uvolneni USB portu po ukonceni aplikace
end;

end.
