{$A+,B+,D+,E-,F+,I+,L-,N-,O-,R-,S-,V-}
{$M 16384,0,655360}
{ctl-oo}
program setirda;

uses dos,async4u,crt;

{define und undef}

const
  version='V0.1';
  {version 0.1=Test-Programm}

  r00init=$0B;    {Rec. & Trans. enablen, Echo der Ctl-Char}
  r01init=$11;    {load new baudrate}
  r02init=$20;    {1.6us IRDA}
  r03init=$36;    {8 Bits,Startsync.}
  r04init=$41;    {LED1C als Output verwenden}
  r05init=$51;    {1.6us Puls-Empfang}
  r06init=$63;    {Empfindlichkeit:114nA}
  r07init=$74;    {neg. Flanke ignorieren}
  r08init=$81;    {Baudrate divider}
  r09init=$90;    {Baudrate divider}
  r21init=$50;    {Oszillator in HiPower-Mode}

  reg0_15=$D0;    {Zugriff auf untere Register 0-15}
  reg16_31=$D1;   {Zugriff auf obere Register 16-31}
  regvers=$Cf;    {Hardware-Version}

  reg2dir=$28;    {Direktzugriffsmodus}
  reg5dir=$54;    {Direktempfangsmodus}


var
  com:byte;
  err:integer;
  last_char_rec:char;


function dth(x:word):char;

  {wandelt Zahl<16 in Char um (hex)}

begin
  x:=x and $f;
  if x>9 then dth:=chr(55+x) else dth:=chr(48+x);
end;


function dths(x,anz:word):string;

  {wandelt x in Hex-String um mit anz Stellen
  z.B. dths(17,2)='11' dths(17,4)='0011'}

var
  s:string[4];

begin
  s:=dth(x shr 12);
  s:=s+dth(x shr 8);
  s:=s+dth(x shr 4);
  s:=s+dth(x);
  dths:=copy(s,5-anz,5);
end;



procedure getanswer;

{diese routine wartet 0.2s auf zeichen vom IRDA-Chip}

var
  st,mi,se,hu:word;
  timebeg,timenow:longint;

begin
  gettime(st,mi,se,hu);
  timebeg:=st*360000+mi*6000+se*100+hu;
  repeat
    if async_buffer_check(last_char_rec) then write(dths(ord(last_char_rec),2),'  ');
    gettime(st,mi,se,hu);
    timenow:=st*360000+mi*6000+se*100+hu;
    if timenow<timebeg then timenow:=timenow+360000*24;
  until timenow>=timebeg+20;
  writeln;
end;


function initirda:boolean;

var
  test:boolean;

begin
  initirda:=true;
  if uart_16550 then writeln('UART:16550 kompatibel');
  async_send_reset;
  writeln('Device reset!');
  async_send_cmd(reg16_31);
  async_send_cmd(regvers);
  write('Hardware-Version:');
  getanswer;
  if last_char_rec<>#$C2 then begin
    initirda:=false;
    writeln('    Unbekannte Hardwareversion!!!!');
  end;
  async_send_cmd(reg0_15);
  write('Echo,Tx,Rx aktivieren:');
  async_send_cmd(r00init);
  getanswer;

  write('1.6us IRDA:');
  async_send_cmd(r02init);
  getanswer;
{
  write('Direktzugriff:');
  async_send_cmd(reg2dir);
  getanswer;
}
  write('8 Databits, Startsynchronisation:');
  async_send_cmd(r03init);
  getanswer;
  write('LED1C als Ausgang:');
  async_send_cmd(r04init);
  getanswer;

  write('1.6us als Empfangspulsbreite:');
  async_send_cmd(r05init);
  getanswer;
{
  write('Direktempfang:');
  async_send_cmd(reg5dir);
  getanswer;
}
  write('Empf.:114nA  ');
  async_send_cmd(r06init);
  getanswer;
  write('Neg. Flanke ignorieren:');
  async_send_cmd(r07init);
  getanswer;
  write('Baudratedivider auf 115kBit:');
  async_send_cmd(r08init);
  async_send_cmd(r09init);
  getanswer;
  write('Oszillator im HiPower-Mode:');
  async_send_cmd(reg16_31);
  async_send_cmd(r21init);
  getanswer;
  write('Oszillator im HiPower-Mode:');
  async_send_cmd(r07init);
  getanswer;
  write('Baudrate 115kBit:');
  async_send_cmd(reg0_15);
  async_send_cmd(r01init);
  getanswer;
  async_close;
  test:=async_open(com,1,'N',1,8);
end;


begin
  writeln;
  writeln('          * * * SetIRDA  ',version,' * * *');
  writeln('          (c) 97 by L. R. Matzinger');
  writeln;
  com:=1;
  last_char_rec:=' ';
  if paramcount>=1 then begin
    val(paramstr(1),com,err);
    if (err>0) or (com<1) or (com>4) then com:=1;
  end;
  writeln('COM-Port:',com);
  async_init;
  if not async_open(com,9600,'N',1,8) then writeln('COM-Port nicht gefunden!')
  else begin
    if initirda then writeln('Initialisierung beendet') else writeln('Initialisierungsfehler!!!');
  end;
  async_close;
end.

