unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Menus, ExtCtrls, QCCom32, ComCtrls, Registry;

type
  TForm1 = class(TForm)
    MainMenu1: TMainMenu;
    Hilfe1: TMenuItem;
    Info1: TMenuItem;
    SaveDialog1: TSaveDialog;
    Datei1: TMenuItem;
    ListentoGPI1: TMenuItem;
    N2: TMenuItem;
    Beenden1: TMenuItem;
    GroupBox1: TGroupBox;
    GroupBox2: TGroupBox;
    RadioGroup1: TRadioGroup;
    RadioGroup2: TRadioGroup;
    RadioGroup3: TRadioGroup;
    RadioGroup4: TRadioGroup;
    Panel1: TPanel;
    Button7: TButton;
    Memo1: TMemo;
    QCCom321: TQCCom32;
    Panel10: TPanel;
    Panel11: TPanel;
    Panel12: TPanel;
    Panel13: TPanel;
    Panel14: TPanel;
    Panel15: TPanel;
    Panel16: TPanel;
    Panel17: TPanel;
    Panel18: TPanel;
    Panel19: TPanel;
    Panel20: TPanel;
    Panel21: TPanel;
    Panel22: TPanel;
    Panel23: TPanel;
    Panel24: TPanel;
    Panel25: TPanel;
    Panel26: TPanel;
    Panel27: TPanel;
    Panel28: TPanel;
    Panel29: TPanel;
    Panel30: TPanel;
    Panel31: TPanel;
    Panel32: TPanel;
    Panel33: TPanel;
    Panel34: TPanel;
    Panel35: TPanel;
    Panel36: TPanel;
    Panel37: TPanel;
    Panel38: TPanel;
    Panel39: TPanel;
    Panel40: TPanel;
    Panel41: TPanel;
    RadioGroup5: TRadioGroup;
    Panel2: TPanel;
    Panel3: TPanel;
    Panel4: TPanel;
    Panel5: TPanel;
    Panel6: TPanel;
    Panel7: TPanel;
    Panel8: TPanel;
    Panel9: TPanel;
    GroupBox3: TGroupBox;
    RadioGroup6: TRadioGroup;
    Baudrate: TRadioGroup;
    RadioGroup7: TRadioGroup;
    procedure Konvertieren(Sender: TObject);
    procedure Beenden1Click(Sender: TObject);
    procedure Button7Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Info1Click(Sender: TObject);
    procedure SaveReg(Sender: TObject);
    procedure LoadReg(Sender: TObject);
  private
    { Private declarations }
  public
    Output:String;
    RegSaveEnabled:Boolean;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Konvertieren(Sender: TObject);
var
  i,l:integer;
  HPGL:String;
  Zeichen1,Zeichen2:String;
  ZweiZeichen:String;
  IP_Zaehler:Integer;
  MyByte:Byte;
  MyBytes:Array[0..16383] of Byte; //16KB Pufferspeicher
  f:File of Byte;
  Transferred:Integer;
begin
  HPGL:='';
  Zeichen2:='';
  IP_Zaehler:=0;
  i:=0;
  assignfile(f,'hpgl.tmp');
  reset(f);
  while not EOF(f) do
    begin
  Memo1.Lines.Text:=Memo1.Lines.Text+'.';
      BlockRead(f,MyBytes,16384,Transferred);
    Application.ProcessMessages;
    for i:=0 to Transferred-1 do begin //Memo1.Lines.Count do begin
    Zeichen1:=Zeichen2;
    Zeichen2:=chr(MyBytes[i]);//Output[l];//Memo1.Lines[i][l];
      ZweiZeichen:=Zeichen1+Zeichen2;

      if ZweiZeichen='LB' then
        begin
          //Zeichenausgabe, CorelDraw schreibt normalerweise alle Zeichen übereinander
          Zeichen1:='SP'+inttostr(RadioGroup1.ItemIndex+1)+';PR150,0;LB';
          Zeichen2:='';
        end else
      if ZweiZeichen='IP' then
        begin
        if IP_Zaehler=0 then
          begin
            //Jetzt beginnt die Rasterdarstellung
            Zeichen1:='SP'+inttostr(RadioGroup2.ItemIndex+1)+';IP';
            Zeichen2:='';
            IP_Zaehler:=1;
          end else
        if IP_Zaehler=1 then
          begin
            //Jetzt beginnt die Kurvendarstellung1
            Zeichen1:='SP'+inttostr(RadioGroup3.ItemIndex+1)+';IP';
            Zeichen2:='';
            IP_Zaehler:=2;
          end else
        if IP_Zaehler>=2 then //2 oder 3
          begin
            //Jetzt beginnen die Messlinien
            Zeichen1:='SP'+inttostr(RadioGroup5.ItemIndex+1)+';IP';
            Zeichen2:='';
            IP_Zaehler:=4;
          end;
        end else
      if ((IP_Zaehler=2) and (ZweiZeichen='PU')) then
        begin
          //Jetzt beginnt die Kurvendarstellung2
          Zeichen1:='SP'+inttostr(RadioGroup4.ItemIndex+1)+';PU';
          Zeichen2:='';
          IP_Zaehler:=3;
        end; //if
      if Zeichen1<>' ' then HPGL := HPGL + Zeichen1;
    end; //for l
  end; //for
  closefile(f);
  HPGL := HPGL + Zeichen2;
  SaveDialog1.DefaultExt:='hpgl';
  if SaveDialog1.Execute then
    begin
      assignfile(f,SaveDialog1.FileName);
      rewrite(f);
      Memo1.Lines.Add('saving '+SaveDialog1.FileName);
      Application.ProcessMessages;
      for i:=1 to Length(HPGL) do
        begin
          write(f,BYTE(HPGL[i]));
        end;
      closefile(f);
      SaveReg(Self); //Filename für den nächsten Start der Applikation merken
    end;
end;

procedure TForm1.Beenden1Click(Sender: TObject);
begin
  Close;
end;

procedure TForm1.Button7Click(Sender: TObject);
var
  Test:String;
  Timeout:Integer;
  StatusGelb:Boolean;
  f:File of Byte;
  i:Integer;
begin
  Button7.Enabled:=False;
  GroupBox1.Cursor:=crHourGlass;
  Cursor:=crHourGlass;
  Panel1.Caption:='';
  case RadioGroup6.ItemIndex of
    0: QCCOM321.Port:=1; //COM1
    1: QCCOM321.Port:=2; //COM2
    2: QCCOM321.Port:=3; //COM3
    3: QCCOM321.Port:=4; //COM4
  end; //case
  case baudrate.ItemIndex of
    0: QCCOM321.Baud:=19200;
    1: QCCOM321.Baud:=38400;
    2: QCCOM321.Baud:=57600;
    3: QCCOM321.Baud:=115200;
  end; //case
  case RadioGroup7.ItemIndex of
    0: QCCOM321.Handshaking:=hsNone;
    1: QCCOM321.Handshaking:=hsHardware;
  end; //case
  QCCOM321.Open;
  Output:='';
  Timeout:=0;
  StatusGelb:=True;
  Memo1.Lines.Add('waiting for data...');
  Panel1.Color:=clGreen;
  Application.ProcessMessages;
  QCCOM321.Flush;
  while (Timeout<10) do begin
    Test:=QCCOM321.Read;
    if (Test='')
      then
        begin
          Timeout:=Timeout+1;
        end
      else
        begin
          Timeout:=9;
          Panel1.Caption:=inttostr(Length(Test)*2)+' bytes/s';
        end;
    if ((StatusGelb) and (Test<>'')) then
      begin
        Memo1.Lines.Add('receiving data...');
        Panel1.Color:=clLime;
        StatusGelb:=False;
      end;
    sleep(500);
    Application.ProcessMessages;
    Output:=Output+Test;
  end; //while

  QCCOM321.Close;
  Panel1.Color:=clSilver;
  Panel1.Caption:='';

  if Output='' then
    begin
      Memo1.Lines.Add('no data received.');
    end
  else
    begin
      Memo1.Lines.Add('received '+inttostr(Length(Output))+' bytes.');
      assignfile(f,'hpgl.tmp');
      rewrite(f);
      for i:=1 to Length(Output) do
        begin
          write(f,BYTE(Output[i]));
        end; //for
      closefile(f);
      Application.ProcessMessages;
      Memo1.Lines.Text:=Memo1.Lines.Text+'converting';
      Konvertieren(Self);
      Memo1.Lines.Add('done.');
    end;
    Cursor:=crDefault;
    GroupBox1.Cursor:=crDefault;
    Button7.Enabled:=True;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  RegSaveEnabled:=False;
  Panel1.Caption:='';
end;

procedure TForm1.Info1Click(Sender: TObject);
begin
  Memo1.Lines.Clear;
  Memo1.Lines.Add('GPIB-Grabber V0.95  -  (c) 2003 by Oliver Dahlmann');
  Memo1.Lines.Add('');
  Memo1.Lines.Add('behaves like a Listen-Only GPIB device and receives HPGL-Data from a HITACHI VC-6x65 DSO via a IEEE-488-to-RS-232-Converter');
end;

procedure TForm1.SaveReg(Sender: TObject);
var
  Reg:TRegIniFile;
begin
  if RegSaveEnabled then
    begin
      Reg:=TregIniFile.Create('Software\dahlmann\ieee488');
      Reg.WriteInteger('colors','text',RadioGroup1.ItemIndex);
      Reg.WriteInteger('colors','mesh',RadioGroup2.ItemIndex);
      Reg.WriteInteger('colors','trace1',RadioGroup3.ItemIndex);
      Reg.WriteInteger('colors','trace2',RadioGroup4.ItemIndex);
      Reg.WriteInteger('colors','delimit',RadioGroup5.ItemIndex);
      Reg.WriteInteger('comport','comx',RadioGroup6.ItemIndex);
      Reg.WriteInteger('comport','baudrate',Baudrate.ItemIndex);
      Reg.WriteInteger('comport','handshake',RadioGroup7.ItemIndex);
      Reg.WriteString('lastfile','filename',SaveDialog1.Filename);
      Reg.Free;
    end; //if
end;

procedure TForm1.LoadReg(Sender: TObject);
var
  Reg:TRegIniFile;
begin
  RegSaveEnabled:=False;
  Reg:=TregIniFile.Create('Software\dahlmann\ieee488');
  RadioGroup1.ItemIndex:=Reg.ReadInteger('colors','text',0);
  RadioGroup2.ItemIndex:=Reg.ReadInteger('colors','mesh',6);
  RadioGroup3.ItemIndex:=Reg.ReadInteger('colors','trace1',3);
  RadioGroup4.ItemIndex:=Reg.ReadInteger('colors','trace2',2);
  RadioGroup5.ItemIndex:=Reg.ReadInteger('colors','delimit',0);
  RadioGroup6.ItemIndex:=Reg.ReadInteger('comport','comx',0);
  Baudrate.ItemIndex:=Reg.ReadInteger('comport','baudrate',3);
  RadioGroup7.ItemIndex:=Reg.ReadInteger('comport','handshake',0);
  SaveDialog1.Filename:=Reg.ReadString('lastfile','filename','');
  Reg.Free;
  RegSaveEnabled:=True;
end;

end.