(*
*******************************************************************************
*         Copyright (C) SofCon 2002 All Rights Reserved                       *
*******************************************************************************
*
*    project:     Ukazka vizualizace pomoci TheKing
*
*    title:       KitKing.pas
*
*******************************************************************************
*
*    description: hlavni telo prikladu vizualizace pomoci TheKing
*
*    version:     2.02 (viz konstanta cAplicationVer v unite AppDesc)
*    language:    Borland Pascal 7.0
*
*    author:      Hvozdovic
*    history:     date      sign   remark
*                 8.02      hv     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 a DF2
*                03.03      bi     pridan konfig. retezec pro komunikaci s
*                                  KITem pres COM2 na desce IOPCOM
*****************************************************************************
*)
{$I sets.inc}


program KitKing;
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 }
 {$ifdef FILE1}
  File1,               { priklad s implementaci dvou malych souboru }
 {$endif}
 {$ifdef FILE2}
  File2,               { priklad s implementaci dvou velkych souboru }
 {$endif}
 {$ifdef LOADER}
  Loader,              { priklad s aplikaci LOADER }
 {$endif}
 {$ifdef PARAM}
  Param,               { priklad s prenosem jednotlivych parametru,
                         blokovym prenosem parametru a parametru jako prikazu }
 {$endif}
 {$ifdef ARCHIVE1}
  Archive1,            { priklad s dvema archivy bez podpory grafu }
 {$endif}
 {$ifdef ARCHIVE2}
  Archive2,            { priklad s jednim archivem podporujicim graf }
 {$endif}
  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 COM}
  {$ifdef VerPC}
    {PC COM1}
    cCommParam = 'NAM=COM COM=1 IRQ=4 BD=38400 BIT=8 PAR=N STO=2 LRB=2500';
  {$else}
    {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}
 {$endif}
 {$ifdef V40}
   cCommParam = 'NAM=V40_ 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 }
 {$ifdef FILE1}
  pTheFile1:PFile1;   { objekt s implementaci dvou malych souboru }
 {$endif}
 {$ifdef FILE2}
  pTheFile2:PFile2;   { objekt s implementaci dvou velkych souboru }
 {$endif}
 {$ifdef LOADER}
  pTheLoader:PLoader; { objekt s implementaci podpory pro aplikaci LOADER }
 {$endif}
 {$ifdef PARAM}
  pTheParam:PParam;   { objekt s implementaci prenosu jednotlivych parametru,
                        blokovych prenosu parametru a parametru jako prikazu }
 {$endif}
 {$ifdef ARCHIVE1}
  pTheArchive1:PArchive1;  { objekt s implementaci dvou archivu bez podpory grafu }
 {$endif}
 {$ifdef ARCHIVE2}
  pTheArchive2:PArchive2;  { objekt s implementaci jednoho archivu podporujicim grafy }
 {$endif}

const
  Write_Name  = 'Write';

{ Procedura implementujici proces sa zapisy dat do archivu }
procedure ExecWriteToArchive; far;
const
  Write_Stack = 8000;
  Write_SPrio = 90;
  Write_DPrio = 254;

begin
{$ifdef Deb_crt}
  writeln('Spusteni zapisovaciho procesu.', Write_Name);
{$endif}

  { ++++++++++++++++ }
  { spusteni procesu }
  { ++++++++++++++++ }
  Start(Write_Name, Write_Stack, Write_SPrio, Write_DPrio); Exit;

 {$ifdef ARCHIVE1}
  WriteToArchive;
 {$endif}
 {$ifdef ARCHIVE2}
  WriteToArchive;
 {$endif}

{$ifdef Deb_crt}
  writeln('Ukonceni zapisovaciho procesu.', Write_Name);
{$endif}
  Terminate;
end;

{ zruseni procesu zapisujici do archivu }
procedure DestructWriteToArchive; far;
begin
  if not TestKernel then exit;
  Abort(Write_Name);
end;


{ telo hlavniho programu }
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;

  { inicializace objektu vizualizace a jeho pridani do komunikacniho objektu }
 {$ifdef FILE1}
  pTheFile1:=new(PFile1, Init);
  if not TheWinCom.Register(pTheFile1) then
  begin
   {$ifdef Deb_crt}
    Writeln('Objekt vizualizace nelze pridat do smycky zpracovani');
   {$endif}
    RunError(255);
  end;
 {$endif}
 {$ifdef FILE2}
  pTheFile2:=new(PFile2, Init);
  if not TheWinCom.Register(pTheFile2) then
  begin
   {$ifdef Deb_crt}
    Writeln('Objekt vizualizace nelze pridat do smycky zpracovani');
   {$endif}
    RunError(255);
  end;
 {$endif}
 {$ifdef LOADER}
  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;
 {$endif}
 {$ifdef PARAM}
  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;
 {$endif}
 {$ifdef ARCHIVE1}
  pTheArchive1:=new(PArchive1, Init);
  if not TheWinCom.Register(pTheArchive1) then
  begin
   {$ifdef Deb_crt}
    Writeln('Objekt vizualizace nelze pridat do smycky zpracovani');
   {$endif}
    RunError(255);
  end;
 {$endif}
 {$ifdef ARCHIVE2}
  pTheArchive2:=new(PArchive2, Init);
  if not TheWinCom.Register(pTheArchive2) then
  begin
   {$ifdef Deb_crt}
    Writeln('Objekt vizualizace nelze pridat do smycky zpracovani');
   {$endif}
    RunError(255);
  end;
 {$endif}

  { spusteni procesu zapisujiciho do archivu }
  ExecWriteToArchive;

  { 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}
  repeat
   {$ifdef Deb_crt}
    if KeyPressed then
    begin
      key:=ReadKey;

      case key of
      '1': ShowState;
      end;
      writeln('Pro ukonceni programu - [x/X]');
    end;
   {$endif}
    Wait(1);
  until UpCase(key)='X';
 {$else}
  { ukonceni se provede bud RESET nebo pomoci prikazu LOADER }
  repeat
  until false;
 {$endif}

  { zruseni komunikacniho procesu }
 {$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;

  { odpojeni objektu vizualizace }
 {$ifdef FILE1}
  if not TheWinCom.UnRegister(pTheFile1) then
  begin
   {$ifdef Deb_crt}
    writeln('Objekt nelze vyjmout ze smycky zpracovani');
   {$endif}
    RunError(255);
  end;
  Dispose(pTheFile1, Done);
 {$endif}
 {$ifdef FILE2}
  if not TheWinCom.UnRegister(pTheFile2) then
  begin
   {$ifdef Deb_crt}
    writeln('Objekt nelze vyjmout ze smycky zpracovani');
   {$endif}
    RunError(255);
  end;
  Dispose(pTheFile2, Done);
 {$endif}
 {$ifdef LOADER}
  if not TheWinCom.UnRegister(pTheLoader) then
  begin
   {$ifdef Deb_crt}
    writeln('Objekt nelze vyjmout ze smycky zpracovani');
   {$endif}
    RunError(255);
  end;
  Dispose(pTheLoader, Done);
 {$endif}
 {$ifdef PARAM}
  if not TheWinCom.UnRegister(pTheParam) then
  begin
   {$ifdef Deb_crt}
    writeln('Objekt nelze vyjmout ze smycky zpracovani');
   {$endif}
    RunError(255);
  end;
  Dispose(pTheParam, Done);
 {$endif}
 {$ifdef ARCHIVE1}
  if not TheWinCom.UnRegister(pTheArchive1) then
  begin
   {$ifdef Deb_crt}
    writeln('Objekt nelze vyjmout ze smycky zpracovani');
   {$endif}
    RunError(255);
  end;
  Dispose(pTheArchive1, Done);
 {$endif}
 {$ifdef ARCHIVE2}
  if not TheWinCom.UnRegister(pTheArchive2) then
  begin
   {$ifdef Deb_crt}
    writeln('Objekt nelze vyjmout ze smycky zpracovani');
   {$endif}
    RunError(255);
  end;
  Dispose(pTheArchive2, Done);
 {$endif}

  { 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.
