Procedure LCDbusy;
var busy : boolean;
begin
{$X-}
  LCD_DI:= false;
  LCD_DDR:= 0;                             // all input
  LCD_RW:= true;
  LCD_EN:= true;
  NOP;
  NOP;
  Repeat
    // enable hightime > 450nsec
    busy:= LCD_busy;
  until not busy;
  LCD_EN:= false;
{$X+}
end;

Procedure WriteLCD( b : Byte; code : Boolean);
begin
{$X-}
  LCDbusy;
  LCD_DI:= code;
  LCD_RW:= false;
  LCD_DDR:= $FF;                           // all output
  LCD_DatWR := b;
  LCD_EN:= true;
  // enable hightime > 450nsec
  NOP;
  NOP;
  NOP;
  LCD_EN:= false;
{$X+}
end;

Procedure GraphInit;
begin
{$X-}
  {write init values controller 2}
  LCD_CS2:= true;
  NOP;
  LCD_CS1:= false;
  LCDbusy;
  WriteLCD(%00111111, false);
  WriteLCD(%11000000, false);
  WriteLCD(%10111000, false);
  WriteLCD(%01000000, false);
  {write init values controller 1}
  LCD_CS1:= true;
  NOP;
  LCD_CS2:= false;
  LCDbusy;
  WriteLCD(%00111111, false);
  WriteLCD(%11000000, false);
  WriteLCD(%10111000, false);
  WriteLCD(%01000000, false);
  {clear display}
{$X+}
  gclrscr(0);
  gdisprefresh;
end;

UserDevice GraphIOS(cmd : byte; arg : byte);
begin
{$X-}
  (* Display Refresh with "GraphIOS" *)
  (* cmd = 0   arg = rowaddr    set rowaddr to arg *)
  (* cmd = 1   arg = pixels     write data byte    *)
  if cmd = 0 then
    // set row addr
    CurRow:= arg;
    LCD_CS1:= true;
    NOP;
    LCD_CS2:= false;
    LCDbusy;
//      uDelay(1);
    WriteLCD(%10111000 + CurRow, false);
    WriteLCD(%01000000, false);
    col:= 0;
  else
    if col = 64 then
      {if column = 64 then switch to controller 2}
      {and set start values for controller 2}
      LCD_CS2:= true;
      NOP;
      LCD_CS1:= false;
      LCDbusy;
//      uDelay(1);
      WriteLCD(%10111000 + CurRow, false);
      WriteLCD(%01000000, false);
      WriteLCD(arg, true);
      inc(col);
    else
      WriteLCD(arg, true);
      inc(col);
    endif;
  endif;
{$X+}
end;

{--------------------------------------------------------------}
Procedure GraphSplashScreen;
begin
  gFillRect(15, 6, 110, 56, $FF);
  gSetTextJustify(alHorCenter, alVertBottom);
  gSetTextBkGnd(bkNormal);
  gSetTextMode(wmClrPix);
  gDrawString(60, 25, 2, 2, TxtRot0, Vers3Str);
  gdrawbitmap(25, 35, @ctbitmap, wmclrpix);
  gDrawString(72, 40, 1, 1, TxtRot0, 'C.Meyer');
  gDrawString(72, 50, 1, 1, TxtRot0, '10/2008');
  gSetTextMode(wmSetPix);
  gDrawString(122, 30, 1, 1, TxtRot90, 'c''t Lab');
  gSetTextJustify(alHorLeft, alVertBottom);
  gdisprefresh;
  mdelay(1000);
end;
{--------------------------------------------------------------}

procedure NeedleParamToStr;
var myNachkomma:byte;
begin
  myNachkomma:=4;
  if abs(Param)>=10 then
    myNachkomma:=3;
  endif;
  if abs(Param)>=100 then
    myNachkomma:=2;
  endif;
  if abs(Param)>=1000 then
    myNachkomma:=1;
  endif;
  ParamStr:=floatToStr(Param:0:myNachkomma);
end;
{--------------------------------------------------------------}

procedure BuildNeedle(legendStr:String[10]);
//Zeiger nachbilden
var angle: Integer;
  Pxe,Pye,Pxs,Pys:Integer;
begin
//Skala aufbauen
//  gOpenView(1,0,0,127,63);
  gDrawRect(0, 9, 127, 63, $ff);
  gSetLineMode(wmsetPix);
  gDrawCircle(64,100,80,$ff);
  gFillCircle(64,100,54,$ff);
  gSetTextJustify(alHorCenter, alVertBottom);
  gSetTextMode(wmsetPix);
  gDrawString(63, 40, 1, 1, TxtRot0, legendStr);
  angle:=0;
  repeat
    RotatePntI(angle, -63, -63, Pxe, Pye);
    RotatePntI(angle, -54, -54, Pxs, Pys);
    Pxe:=Pxe+64;
    Pye:=Pye+100;
    Pxs:=Pxs+64;
    Pys:=Pys+100;
    gdrawline(Pxs,Pys, Pxe,Pye,$ff);
    angle:=angle+18;
  until angle>90;
  angle:=9;
  repeat
    RotatePntI(angle, -59, -59, Pxe, Pye);
    RotatePntI(angle, -54, -54, Pxs, Pys);
    Pxe:=Pxe+64;
    Pye:=Pye+100;
    Pxs:=Pxs+64;
    Pys:=Pys+100;
    gdrawline(Pxs,Pys, Pxe,Pye,$ff);
    angle:=angle+18;
  until angle>90;
end;

procedure ParamNeedle(myParam:float);
//Zeiger nachbilden
var angle: Integer;
  Pxe,Pye,Pxs,Pys:Integer;
begin
  gSetTextJustify(alHorCenter, alVertBottom);
  gSetTextMode(wmclrPix);
  gSetLineMode(wmsetPix);
//  gFillRect(38, 53, 90, 62, $ff); // Digital-Anzeige löschen
  gSetLineMode(wmxorPix);
  Param:=myParam;
  NeedleParamToStr;
  gDrawString(63, 62, 1, 1, TxtRot0, ParamStr);
  gSetTextMode(wmsetPix);
  Param:=Param*NeedleScale;
  angle:=integer(Param*89)+1; // 1 = 90° = Vollausschlag
  RotatePntI(angle, -63, -63, Pxe, Pye);
  RotatePntI(angle, -40, -40, Pxs, Pys);
  Pxe:=Pxe+64;
  Pye:=Pye+100;
  Pxs:=Pxs+64;
  Pys:=Pys+100;
  gdrawline(Pxs,Pys, Pxe,Pye,$aa);
  gdisprefresh;
  gdrawline(Pxs,Pys, Pxe,Pye,$aa); // gleich wieder löschen
  gSetTextJustify(alHorLeft, alVertBottom);
end;

procedure ParamBar1(myParam:float);
//Balkenanzeige nachbilden
var
  Px, blen:Integer;
begin
//  Param:=myParam;
//  NeedleParamToStr;
//  ParamStr:=padright(ParamStr,8);
//  gDrawString(0, ParamLine-14, 1, 2, TxtRot0, ParamStr);
  gSetLineMode(wmsetPix);
  gFillRect(0, ParamLine-12, 127, ParamLine, $00); // Bargraph
  gDrawRect(0, ParamLine-12, 127, ParamLine, $AA); // Bargraph
  for Px:= 11 to 120 do
    gDrawLine (Px, ParamLine-11, Px, ParamLine-1,$55);
    Px:=Px+12;
  endfor;
  myParam:=myParam*BarScale;
  blen:=integer(myParam*127); // 1 = 127 = Vollausschlag
  gSetLineMode(wmxorPix);
  gFillRect(0, ParamLine-11, blen, ParamLine-1, $ff); // Bargraph
  gdisprefresh;
  gSetLineMode(wmsetPix);
end;

{--------------------------------------------------------------}

