program Diag;

uses
  ppar, i2c, crt;
  
const
  PAR_ADDR = $378;
  OkBad: array [false..true] of string[5] = ('Bad', 'Ok');
  
var
  cmd: char;
  parp: par_port;
  i2cp: i2c_port;
  
procedure TestDataSquare;
var
  b: byte;
begin
  b := 0;
  parp.Initialize(PAR_ADDR);
  repeat
    parp.SetData(b);
    inc(b);
  until keypressed;
  parp.Release;
end;

procedure TestSelect;
begin
  parp.Initialize(PAR_ADDR);
  repeat
    parp.SetControlBit(PPAR_SELECT, true);
    parp.SetControlBit(PPAR_SELECT, false);
  until keypressed;
  parp.Release;
end;

procedure TestLevels;
var
  cmd: char;
  sda, scl: boolean;
begin
  sda := true;
  scl := true;
  i2cp.Initialize(PAR_ADDR);
  repeat
    i2cp.SetSDA(sda);
    i2cp.SetSCL(scl);
    cmd := readkey;
    case cmd of
      'd': sda := false;
      'D': sda := true;
      'c': scl := false;
      'C': scl := true;
    end;
  until cmd in ['q', 'Q'];
end;

procedure TestFeedback;
var
  scl0_ok, scl1_ok,
  sda0_ok, sda1_ok: boolean;
begin
  i2cp.Initialize(PAR_ADDR);
  repeat
    i2cp.SetSDA(true);
    sda1_ok := i2cp.GetSDA;
    i2cp.SetSDA(false);
    sda0_ok := not i2cp.GetSDA;
    
    i2cp.SetSCL(true);
    i2cp.SetSCL(false);
    i2cp.SetSCL(true);
    scl1_ok := i2cp.GetSCL;
    i2cp.SetSCL(false);
    scl0_ok := not i2cp.GetSCL;
    
    write('SCL Low: ', OkBad[scl0_ok]:5, 
           '  High: ', OkBad[scl1_ok]:5,
      '    SDA Low: ', OkBad[sda0_ok]:5, 
           '  High: ', OkBad[sda1_ok]:5, #13);
  until keypressed;
  i2cp.release;
end;
  
begin
  writeln('Diagnostics for i2c/parport driver');
  repeat
    writeln;
    writeln('[D] Test data port (square wave)');
    writeln('[C] Test the SELECT control output');
    writeln('[L] Level test SDA and SCL (use d/D and c/C to change levels)');
    writeln('[F] Test feedback via the interface (1 pulse SDA, 2 on SCL)');
    writeln('[Q] Salir del programa');
    writeln;
    write('Command - ');
    cmd := upcase(readkey);
    writeln(cmd);
    case cmd of
      'Q': ;
      'D': TestDataSquare;
      'C': TestSelect;
      'L': TestLevels;
      'F': TestFeedback;
    end;
  until cmd = 'Q';
end.
