(*
*******************************************************************************
*         Copyright (C) SofCon 2004 All Rights Reserved                       *
*******************************************************************************
*
*    project:     DEMO LOADER, ktery modifikuje nastaveni pameti
*                 a retezce popisujici verzi LOADER
*
*    title:       Loader
*
*******************************************************************************
*
*
*    description: hlavni telo LOADER
*
*    version:     3.00 (nutno upravit i strLdrVer)
*    language:    Borland Pascal 7.0
*
*    author:      Jan Hvozdovic
*    history:     date      sign   remark
*                 6.02      hv     zacatek vyvoje
*                11.02      hv     prvni release
*                12.02      hv     pridana knihovna ChnPrt
*                                  moznost prenosu dat pomoci DF1 nebo DF2
*                                          (nastaveni "DF1")
*                 2.03      hv     optimalizace kodu
*                                  zruseni nastavovani strLdrVer v knihovne
*                 8.03      hv     pridano nastavovani strLdrVer
*                12.03      hv     oprava prefixu u konstatny wExecNo->bExecNo
*                 1.04      hv     uprava prace s procesorem V40
*				   zrychleni prace s AtmFlash pouzitim fUseMemCmp
*                                  optimalizace prace s retezcem
*                                  nastaveni verze systemovych knihoven
*                                  zakomentovani zobrazovani behu LOADER
*                                  doplnen podmineny preklad nastaveni wExecTime
*                                          pro V40
*******************************************************************************
*)
program Loader;
{$I sets.inc}

uses
   _1stUnit           { !! jednotka musi byt prvni }
  ,LibVer             { definice formatu verzi }
  ,xDesc              { definice konstant, typu a funkci sdilenych
                        s uzivatelskou aplikaci }
  ,uxDesc             { uzivatelsky kod, ktery modifikuje nastaveni pameti }
  ,LdrPrg             { vykonna cast LOADER }
  ,NumToStr           { jednotka pro praci s retezci }
  ,LdrDesc            { struktury LOADER - aplikacne nezavisle }
  ,ChnPrt             { komunikacni protokol Prt }
 {$ifdef VerMC}
  ,AtmFlash           { prace s ATMFlash }
 {$endif}
 {$ifdef V40}
  ,ChnV40_            { HW komunikace pres seriovy port na procesoru V40 }
 {$endif}
 {$ifdef COM}
  ,ChnCom             { HW komunikace pres seriovy Com }
 {$endif}
  ;



{ Pomoci teto funkce muzete upravit chovani programu LOADER
  a predevsim zde urcujete prenosovy kanal - COM1, V40 apod. }
procedure LdrAdapt;
const
  {adresa stanice}
  cNode = '1';

  { parametry komunikacni linky }
  cHlavaStrCom = 'NAM=SOFS2 LRB=2500 LSB=1500 DF2=0 '+
                 'NAM=PRT LSB=1500 DNOD=$10 NOD='+cNode+' ';
 {$ifdef VerMC}
  {$ifdef V40}
   cParamStrCom = 'NAM=V40_ BD=38400 BIT=8 PAR=N STO=2 LRB=3000';
  {$endif}
  {$ifdef COM}
   { standardni COM na procesoru I386 }
   cParamStrCom = 'NAM=COM COM=2 IRQ=3 BD=38400 BIT=8 PAR=N STO=2 LRB=3000';
   { COM A na desce IPCOM s bazovou adresou 2300h }
   {cParamStrCom = 'NAM=COM ADD=$2310 IRQ=3 BD=38400 BIT=8 PAR=N STO=2 LRB=3000';}
  {$endif}
 {$else}
  { simulace na PC }
  cParamStrCom = 'NAM=COM COM=1 IRQ=4 BD=38400 BIT=8 PAR=N STO=2 LRB=3000';
 {$endif}

begin
  {+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
  {+++++++++++++++ verze a identifikacni retezce LOADER ++++++++++++++}
  {+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
  { nastaveni verze aplikace LOADER }
  strLdrVer:=$0300;{BCD format - verze 03.00}
  { nastaveni verze a identifikacniho retezce pro vizualizaci }
  strLdrName := 'LDR(DF1) ver '+VerNoToStr(strLdrVer);

(*
  Zde se zpravidla provadi signalizace chodu LOADER,
  napr. rozsvicenim nejake LED. Vlastni ridici aplikace potom
  svuj chod muze signalizovat na teze LED periodickym blikanim.
*)

 {+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
 {+++++++++++++ prizpusobeni LOADER pozadavkum aplikace +++++++++++++}
 {+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
  { hodnota bExecNo udava kolikrat se musi aplikace spustit resp. spadnout
    v zadanem case wExecTime, aby se spustilo cekani na komunikaci. Tyto
    hodnoty osetruji padani aplikace napr. v dusledku nejakeho RunTime Error
    nebo pri zapisu do pameti FLASH. Pokud se do vyprseni TIMEOUT (liTimeoutToAppRun)
    nenavaze komunikace s nadrizenym systemem, opet se spusti ridici aplikace. }
 {$ifdef V40}
  wExecTime  := 180; {[s]}
 {$else}
  wExecTime  := 90;  {[s]}
 {$endif}
  bExecNo    := 5;  {krat}

  { sledovani komunikace pomoci SW funkce WatchDog }
  wWinComWD  := 20; { 55ms * 20 = 1100ms }

  { timeout pro spusteni aplikace }
  liTimeoutToAppRun  := 60000;  {60s}
  { timeout pro prechod komunikace do stavu READY }
  liTimeoutToReady   := 10000;  {10s}
  { cas pro okamzite odeslani odpovedi nadrazenemu PC}
  liTimeoutToImmediateSend := 2500; {2.5s}

 {$ifdef VerMC}
  { pri zapisu do pameti FLASH se data nejdrive porovnaji,
    pokud se lisi provede se zapis. V opacnem pripade se nic neprovede. }
  ATMFlash.fUseMemCmp:=TRUE;
 {$endif}

 {+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
 {+++++++++++++++++ nastaveni komunikacniho retezce +++++++++++++++++}
 {+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
  strCOM:=cHlavaStrCOM + cParamStrCOM;
end;

{ hlavni telo programu LOADER }
Begin
  { funkce nastavi systemove promenne LOADER a prenosovy kanal }
  LdrAdapt;

  { funkce nastavi promenne, ktere jsou sdileny s aplikaci.
    Tyto promenne a struktury jsou definovany v souboru xDesc.pas }
  { Tato funkce se zavola pozdeji pomoci funkce fnRunLoader }
  fnAdaptToUserApp:=AdaptToMyApp;

  { spusteni LOADER }
  fnRunLoader;
End.