(*
*******************************************************************************
*         Copyright (C) SofCon 2002 All Rights Reserved                       *
*******************************************************************************
*
*    project:     Ukazka vizualizace pomoci TheKing
*
*    title:       KitKing.pas
*
*******************************************************************************
*
*    description: hlavni telo prikladu vizualizace pomoci TheKing
*
*    version:     1.0
*    language:    Borland Pascal
*
*    author:      Hvozdovic
*    history:     date      sign   remark
*                 8.02      hv     start of development
*****************************************************************************
*)
{$I sets.inc}


program KitKing;
uses
  LastExit,            { jednotka zajistujici podporu DPMI a zachyceni chyby }
 {$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} 
  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 dvemi archivy bez podpory grafu }
 {$endif}
 {$ifdef ARCHIVE2}
  Archive2,            { priklad s jednim archivem podporujicim graf }
 {$endif}
  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 NAM=PRT LSB=2500 DNOD=$10 NOD=';
 {$ifdef COM}
  {$ifdef VerPC}
    cCommParam = 'NAM=COM COM=1 IRQ=4 BD=38400 BIT=8 PAR=N STO=2 LRB=2500 ';
  {$else}
    cCommParam = 'NAM=COM COM=2 IRQ=3 BD=38400 BIT=8 PAR=N STO=2 LRB=2500 ';
  {$endif}
 {$endif}
 {$ifdef V40}
   cCommParam = 'NAM=V40_ 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
  strComm:String;
  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}


{ Procedura implementujici proces sa zapisy dat do archivu }
procedure ExecWriteToArchive; far;
const
  Write_Name  = 'Write';
  Write_Stack = 8000;
  Write_SPrio = 90;
  Write_SPrioF= 200;
  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;



begin
  { nastaveni verze aplikace a jeji identifikace }
  strAppVer:=$010B;
  strAppName:='KitKing ver ' + ByteStrDec(strAppVer shr 8, 0) + '.' + ByteStrDec(strAppVer and $FF, 0);

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

  { otevreni kom. kanalu }
  strComm:=cCommHead+ByteStrHex(1)+' '+cCommParam;
  if TheWinCom.Open(strComm)<>Res_Ok then
  begin
   {$ifdef Deb_crt}
    writeln('Nepodarilo se otevrit komunikacni kanal');
   {$endif}
    RunError(255);
  end;

  { inicializace objektu vizualizace a jeho pridani do komunikacniho objektu }
 {$ifdef FILE1}
  pTheFile1:=new(PFile1, Init);
  pTheFile1^.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);
  pTheFile2^.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);
  pTheLoader^.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);
  pTheParam^.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);
  pTheArchive1^.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);
  pTheArchive2^.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}

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

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

  { uzavreni komunikacniho kanalu }
  TheWinCom.Close;

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

  { ukonceni hlavniho procesu }
  TerminateMain;
end.

