unit uMenuIni;

{==========================================================}
{                                                          }
{  unit uMenuIni                       11/12/2003          }
{                                      Verze 1.2           }
{                                                          }
{  Skelet aplikace s terminalem Touch 33                   }
{                                                          }
{  Inicializace stromu komponent aplikace a procesu        }
{  vizualizace                                             }
{                                                          }
{  (C)2003, SofCon, Stresovicka 49, 160 00 Praha 6         }
{                                                          }
{                                                          }
{==========================================================}

{$I SETS.INC} { Nastaveni prekladu }

interface

{-------------------------
{ StartMenuProcess
{---
{ Spusteni procesu me menu
{ StopFlag je odkaz na promennou, kterou bude po uzavreni
{ aplikace nastavena na True a zpusobi ukonceni pripadnych
{ ostatnich procesu
{---
{ Tuto funkci je mozne volat v pri vytvareni procesu aplikace napr.
{ v tele hlavniho podprogramu.
}

procedure StartMenuProcess( var AStopFlag: Boolean );


implementation

uses
  Objects,    { Standardni knihovna             }
  Kernel,     { ReTOs                           }
  IoDrv,      { Obecne I/O ovladace terminalu   }
{ Bitmaps,    { Spravce bitmap                  }
  Fonts,      { Spravce fontu                   }

{$IFDEF MCP}
  Tick,       { Obsluha preruseni casovace      }
  TPDrv,      { Ovladac dotykoveho panelu       }
{$IFDEF COLOR}
  T33CDrv,    { Ovladac terminalu T33 Color     }
{$ELSE}
  T33MDrv,    { Ovladac terminalu T33 Mono      }
{$ENDIF}
{$ENDIF}

{$IFDEF DOS}
{$IFDEF TERMEMU}
  Crt,
  TEDrv,      { Ovladace pro emulator terminalu }
{$ELSE}
  PCDrv,      { Ovladace pro simulator na PC    }
{$ENDIF}
{$ENDIF}

  Controls,   { Zakladni komponenty             }
{$IFDEF COLOR}
  T33CCus,    { Konfigurace pro T33 Color	}
{$ELSE}
  T33MCus,    { Konfigurace pro T33 Mono	}
{$ENDIF}

  FoSS20,     { Font Sans Serife 20             }
  StdRSCZ,    { Standardni resource stringy     }
  uMemory,    { Struktury v rezervovane pameti  }
  uMenuDef;   { Definice aplikacniho stromu     }

{$IFDEF MCP}
const
  ioTouch33 = $2300; { Bazova adresa I/O portu terminalu T33   }
  mmTouch33 = $C000; { Bazova adresa videopameti terminalu T33 }
{$ENDIF}

const

  cMenuStatPri   = 100;   { Staticka priorita procesu menu              }
  cMenuDynPri    = 254;   { Dynamicka pririta procesu menu              }
  cMenuWaitCount = 1;     { Pocet waitu jadra pri necinnosti uzivatele  }
  cMenuStackSize = 8192;  { Velikost zasobniku procesu menu             }


{-------------------------
{ AppIdle
{--
{ Funkce volana pri necinnosti uzivatele
{--
}

procedure AppIdle; far;
begin
  {$IFDEF TERMEMU}
  { Pokud pouzivame emulator terminalu, aplikaci lze ukoncit
  { bud stiskem ALT+X v emulatoru, nebo stiskem libovolne klavesy
  { v DOSovem okne }
  if KeyPressed then Application^.EndModal( mrOk );
  {$ENDIF}

  { Pri necinnosti uspime proces menu na zadany pocet tiku kernelu }
  Wait( cMenuWaitCount );
end;

{-------------------------
{ InitMenu
{--
{ Inicialize Funkce volana pri necinnosti uzivatele
{--
}

procedure InitMenu;
var
  App : PApplication;
begin
  RegisterCustomizeProc( AppCustomizeProc, 2000 );

{$IFDEF MCP}
  { Obsluzna rutina ovladac dotykoveho panelu volana z preruseni od
  { casovace (minimalne jednou za 10ms) }
  UserTick1 := TCDInterruptProc;
{$ENDIF}

{$IFDEF DOS}

{$IFDEF TERMEMU}

  { Inicializace ovladacu a korenu stromu komponent
    pro verzi DOS s pouzitim emulatoru terminalu }
  App :=
    New( PApplication, Init (
      New( PInputDriver, Init(
        New( PTEKeybDriver, Init ),
        New( PTEMouseDriver, Init )
      )),
      New( PTEDispDriver, Init( 640, 480 ) )
      , @g_AppSettings
    ));

{$ELSE}

  { Inicializace ovladacu a korenu stromu komponent pro verzi DOS }
  App :=
    New( PApplication, Init (
      New( PInputDriver, Init(
        New( PPCKeybDriver, Init ),
        New( PPCMouseDriver, Init )
      )),
    {$ifdef USEVESA}
      New( PVesaDriver, Init( 640, 480 ) )
    {$else}
      New( PVgaMonoDriver, Init( 640, 480 ) )
    {$endif}
      , @g_AppSettings
    ));

{$ENDIF}
{$ENDIF}


{$IFDEF MCP}
  { Inicializace ovladacu a korenu stromu komponent pro verzi MCP }
  App :=
    New( PApplication, Init (
      New( PInputDriver, Init(
        nil,
        New( PTouchPanelDriver, Init( ioTouch33 )) )),
    {$IFDEF COLOR}
      New( PT33ColorDispDriver, Init( ioTouch33, mmTouch33 ) )
    {$ELSE}
      New( PT33MonoDispDriver, Init( ioTouch33, mmTouch33 ) )
    {$ENDIF}
      , @g_AppSettings
    ));
{$ENDIF}

  App^.Customize( ccApplication );

  { Nasteveni Idle procedury - volana pri necinnosti uzivatele }
  App^.OnIdle := AppIdle;

  { Implicitni font aplikace }
  App^.Font := fidSS20;

  { Vytvoreni vsech stranek aplikace }
  CreateAppPages;
end;


{-------------------------
{ RunMenu
{--
{ Spusteni
{--
}

procedure RunMenu;
begin
  if Application <> nil then Application^.Run;
end;

{-------------------------
{ DoneMenu
{--
{ Uvoleni komponent z pameti
{--
}

procedure DoneMenu;
begin
{$IFDEF MCP}
  UserTick1 := Nic;
{$ENDIF}
  if Application <> nil then Application^.Free;
end;


{-------------------------
{ StartMenuProcess
{---
{ Spusteni procesu me menu
{ StopFlag je odkaz na promennou, kterou bude po uzavreni
{ aplikace nastavena na True a zpusobi ukonceni pripadnych
{ ostatnich procesu
{---
{ Tuto funkci je mozne volat v pri vytvareni procesu aplikace napr.
{ v tele hlavniho podprogramu.
}

procedure StartMenuProcess( var AStopFlag: Boolean );
begin
  { Inicializace menu }
  InitMenu;

  { Spusteni procesu menu }

  Start( 'Menu', cMenuStackSize, cMenuStatPri, cMenuDynPri ); Exit;
  repeat
    RunMenu;
    AStopFlag := True;
  until AStopFlag;

  { Uvoleni menu z pameti }
  DoneMenu;
end;


end.