(*
*******************************************************************************
*         Copyright (C) SofCon 2002 All Rights Reserved                       *
*******************************************************************************
*
*    project:     priklad s implementaci online parameteru
*
*    title:       Aplikace
*
*******************************************************************************
*
*    description: hlavni telo prikladu
*
*    version:     2.01 (viz konstanta cAplicationVer v unite AppDesc)
*    language:    Borland Pascal 7.0
*
*    author:
*    history:     date      sign   remark
*                 10.02     bi     zacatek vyvoje
*                 11.02     hv     prvni release
*	 	  11.02     hv	   oprava inicializace objektu (Init)
*    	  	 		   upravy volani objektu TWinCom
*                 12.02     hv     pridana knihovna ChnPrt
*                                  moznost prenosu dat pomoci DF1 nebo DF2
*****************************************************************************
*)
{$I sets.inc}


program Aplikace;
uses
  _1stUnit,            { jednotka zajistujici podporu DPMI a zachyceni chyby }
  LibVer,              { definice formatu verze }
 {$ifdef Deb_crt}
  Crt,                 { podpora vystupu }
 {$endif}
 {$ifdef V40}
  ChnV40_,	       { objekt pracujici s komunikacnim portem na procesoru V40 }
 {$endif}
 {$ifdef COM}
  ChnCom,	       { objekt pracujici se standardnim komunikacnim portem }
 {$endif}
  ChnPrt,              { prenos dat pomoci PRT }
  ChnVirt,             { virtualni kanal }
  WinCom,              { komunikacni objekt spravujici objekty vizualizace }
  Loader,              { priklad s aplikaci LOADER }
  Param,               { priklad s prenosem jednotlivych parametru,
                         blokovym prenosem parametru a parametru jako prikazu }
  uxDesc,              { nastaveni sdilenych promennych s LOADER }
  AppDesc,             { jednotka definujici kompletni rozlozeni pameti
                         v aplikaci LOADER, pouziva xDesc
                         Dale v teto jednotce muzou byt aplikacne zavisle
                         struktury a konstanty }
  Kernel,              { jadro os ReTOS }
  NumToStr             { prace s retezci }
  ;



const
  cCommHead   = 'NAM=SOFS2 LRB=2500 LSB=3000 DF2=1 NAM=PRT LSB=2500 DNOD=$10 NOD=';
 {$ifdef VerMC}
   {$ifdef V40}
    cCommParam  = 'NAM=V40_ BD=38400 BIT=8 PAR=N STO=2 LRB=2500 ';
   {$endif}
   {$ifdef COM}
   {KIT IOPCOM - COM2}
    {cCommParam  = 'NAM=COM ADD=$2320 IRQ=4 BD=38400 BIT=8 PAR=N STO=2 LRB=2500 ';}
   {KIT386EXR  - COM1}
    cCommParam  = 'NAM=COM COM=1 IRQ=4 BD=38400 BIT=8 PAR=N STO=2 LRB=2500 ';
   {$endif}
 {$else}
  cCommParam  = 'NAM=COM COM=1 IRQ=4 BD=38400 BIT=8 PAR=N STO=2 LRB=2500 ';
{  cCommParam  = 'NAM=COM COM=2 IRQ=3 BD=38400 BIT=8 PAR=N STO=2 LRB=2500 ';}
 {$endif}

  key:Char = #0;      { pomocna klavesa v hlavnim procesu pro ukonceni aplikace }

var
  TheWinCom:TWinCom;  { komunikacni objekt spravujici jednotlive objekty
                        vizualizace - soubory, archivy, prenos parametru
                        a aplikaci LOADER }
  pTheLoader:PLoader; { objekt s implementaci podpory pro aplikaci LOADER }
  pTheParam:PParam;   { objekt s implementaci prenosu jednotlivych parametru,
                        blokovych prenosu parametru a parametru jako prikazu }


begin
  AdaptToMyApp;

  { inicializace struktur popisujici pamet }
  fnAppInit;

 {$ifdef Deb_crt}
  clrscr;
  writeln('Spusteni a inicializace jadra');
 {$endif}
  { spusteni a inicializace jadra ReTOS - vytvoreni hlavniho procesu }
  StartMain(200, 254);
  InitInterruptStack(1,254);
  StartTimeSlicing(8);

  { inicializace komunikacniho kanalu }
  TheWinCom.Init;

  { vytvoreni retezce komunikacnich objektu odvozenych od ChnVirt
    V teto dobe jeste neexistuji objekty odvozene od CoBase }
  if TheWinCom.CreateChn(cCommHead+ByteStrHex(1)+' '+cCommParam)<>Res_Ok then
  begin
   {$ifdef Deb_crt}
    writeln('Nepodarilo se vytvorit komunikacni kanal: ', TheWinCom.m_ChnDesc.pChannel^.ChGetParam(''));
   {$endif}
    RunError(255);
  end;

  { otevreni kom. kanalu }
  if TheWinCom.Open<>Res_Ok then
  begin
   {$ifdef Deb_crt}
    writeln('Nepodarilo se otevrit komunikacni kanal: ', TheWinCom.m_ChnDesc.pChannel^.ChGetParam(''));
   {$endif}
    RunError(255);
  end;

  pTheLoader:=new(PLoader, Init);
  if not TheWinCom.Register(pTheLoader) then
  begin
   {$ifdef Deb_crt}
    Writeln('Objekt vizualizace nelze pridat do smycky zpracovani');
   {$endif}
    RunError(255);
  end;
  pTheParam:=new(PParam, Init);
  if not TheWinCom.Register(pTheParam) then
  begin
   {$ifdef Deb_crt}
    Writeln('Objekt vizualizace nelze pridat do smycky zpracovani');
   {$endif}
    RunError(255);
  end;

  { spusteni komunikacniho procesu }
  if not TheWinCom.CreateProcess then
  begin
   {$ifdef Deb_crt}
    Writeln('Komunikacni objekt nemuze byt vytvoren');
   {$endif}
    RunError(255);
  end;

  { snizeni priority hlavniho procesu }
  SetPriority(50, 254);

 {$ifNdef VerMC}
 {$ifdef Deb_Crt}
  writeln('Ukonceni programu - (x/X)');
 {$endif}
  repeat
   {$ifdef Deb_crt}
    if KeyPressed then
    begin
      key:=ReadKey;
      case key of
      '1': ShowState;
      end;
      writeln('Ukonceni programu - (x/X)');
    end;
    gotoxy(1,5);
    Writeln('Aplikace spustena: $', LongIntStrHex(GetPackTime));
   {$endif}
    Wait(1);
  until UpCase(key)='X';
 {$else}
  { ukonceni se provede bud RESET nebo pomoci prikazu LOADER }
  repeat
   {$ifdef Deb_Crt}
    gotoxy(1,5);
    Writeln('Aplikace spustena: $', LongIntStrHex(GetPackTime));
    Delay(1000);
   {$endif}
  until false;
 {$endif}

  { odpojeni objektu vizualizace }
  if not TheWinCom.UnRegister(pTheLoader) then
  begin
   {$ifdef Deb_crt}
    writeln('Objekt nelze vyjmout ze smycky zpracovani');
   {$endif}
    RunError(255);
  end;
  Dispose(pTheLoader, Done);
  if not TheWinCom.UnRegister(pTheParam) then
  begin
   {$ifdef Deb_crt}
    writeln('Objekt nelze vyjmout ze smycky zpracovani');
   {$endif}
    RunError(255);
  end;
  Dispose(pTheParam, Done);

  { zruseni komunikacniho objektu }
 {$ifdef Deb_crt}
  writeln('Prosim pockejte na ukonceni procesu');
 {$endif}
  if not TheWinCom.DestroyProcess then
  begin
   {$ifdef Deb_crt}
    Writeln('Proces nelze zrusit');
   {$endif}
    RunError(255);
  end;

  { uzavreni komunikacniho kanalu }
  TheWinCom.Close;

  { zruseni retezce komunikacnich objektu }
  TheWinCom.DestroyChn;

  { ukonceni vsech procesu }
  Abort('*');

  { ukonceni hlavniho procesu }
  TerminateMain;

  { uvolneni struktur potrebnych pro beh aplikace }
  fnAppDone;
end.

