(*
*******************************************************************************
*         Copyright (C) SofCon 2003 All Rights Reserved                       *
*******************************************************************************
*
*    project:     vizualizace
*
*    title:       Param.pas
*
*******************************************************************************
*
*    description: priklad podpory s prenosu parametru a zasilani prikazu
*
*    version:     1.04
*    language:    Borland Pascal
*
*    author:      Hvozdovic
*    history:     date      sign   remark
*                 9.02      bi     zacatek vyvoje
*                11.02      hv     prvni release
*		 12.02	    hv	   uprava zapisu a cteni parametru
*					(zruseni MOVE, protoze se obchazely
*					 typove kontroly - tezko odhalitelne
*					 chyby)
*                     	    hv     zruseni odkazu na ChnPrt, ChnVirt,
*                                  ChnSofs2, ChnSofT
*                03.03      bi     doplnena obsluha systemoveho parametru
*				   LA_firmwareAppVer, dalsich on-line parametru
*                 9.03      hv     zruseni odkazu na ExCrc16
*				   Zruseno konstanta cName
*				   Pridana konstanta cVerNo a cVer upravena
*					do standardizovaneho formatu
*****************************************************************************
*)
{$I sets.inc}

unit Param;
interface
uses
   Objects            { objekty }
  ,Xtking_1           { definice typu a konstant pro praci s vizualizaci }
  ,WTVirt             { virtualni predek vsech vizualizacnich objektu }
  ,WTErr              { definice chybovych kodu funkcnich objektu vizualizace }
  ,Kernel             { ReTOS }
  ,NumToStr           { prace s retezci }
  ,WTPar              { objekt s implementaci podpory prenosu parametru }
  ,XCrExam2           { definice konstant pro prenos parametru -
                        na zaklade techto definic se generuje CSV soubor
                        pro vizualizaci }
  ;

type
  { objekt pracujici s uzivatelskymi daty }
  PParam = ^TParam;
  TParam = object(TWinTickParam)
    constructor Init;
    destructor Done; virtual;

    function fnGetParamVal(var LA:Word; var Data):Word; virtual;
    function fnPutParamVal(var LA:Word; var Data):Word; virtual;
    { obsluha blokovych prenosu se provadi v predku prenosu parametru }
    function fnGetParamSize(LA:Word):Word; virtual;
    { cast online parametru na urovni firmware jsou obslouzeny v predku.
      Nektere z techto parametru se ale musi obslouzit az ve vlastni
      aplikaci. }
    function  fnGetFirmwareParamVal(var LA:Word; var Data):Word; virtual;
    function  fnPutFirmwareParamVal(var LA:Word; var Data):Word; virtual;
  end;

  { procedura pro zobrazeni stavu promennych - zobrazi se bud stiskem
    klavesy "1" nebo stiskem tlacitka "Zobraz parametry"
    ve vizualizacnim SW }
  procedure ShowState;


var
  bByte1:Byte;
  bByte2:Byte;
  bByte3:Byte;


implementation
uses
   Strings
  ,xDesc
  ,AppDesc;



constructor TParam.Init;
begin
  inherited Init;

  { inicializace uzivatelskych dat }
  bByte1:=0;
  bByte2:=$AA;
  bByte3:=68;
end;

destructor TParam.Done;
begin
  inherited Done;
end;

function TParam.fnGetParamVal(var LA:Word; var Data):Word;
var
  fLock:Boolean;
begin
 { synchronizace promennych - zamknuti jadra proti prepnuti
   procesu.
   Tato synchronizace je dostatecna pokud k promennym pristupuji
   ruzne procesy. V pripade pristupu k promennym z prerusovaci
   obsluhy by zde musela byt pouzito zakazani preruseni (pushf cli) }
 fLock:=ExLockKernel;
  { nastaveni datoveho bufferu dle dotazovane promenne prostrednictvim LA.
    Definice LA je uvedena v souboru xCrExam1 }
  fnGetParamVal:=rc_Ok;
  case LA of
    LA_VersionGlb_Ver: Real(Data) := 1.01;
    LA_Byte1: Byte(Data):=bByte1;
    LA_Byte2: Byte(Data):=bByte2;

    LA_Byte3: Byte(Data):=bByte3;
  else
    fnGetParamVal:=rc_NotImplemented;
  end;
 { synchronizace promennych - odemknuti jadra, viz. vyse }
 if not fLock then UnLockKernel;
end;

function TParam.fnPutParamVal(var LA:Word; var Data):Word;
var
  fLock:Boolean;
begin
 { synchronizace promennych - zamknuti jadra proti prepnuti
   procesu.
   Tato synchronizace je dostatecna pokud k promennym pristupuji
   ruzne procesy. V pripade pristupu k promennym z prerusovaci
   obsluhy by zde musela byt pouzito zakazani preruseni (pushf cli) }
 fLock:=ExLockKernel;
  { nastaveni promenne urcene prostrednictvim LA na hodnotu v datovem
    bufferu
    Definice LA je uvedena v souboru xCrExam1 }
  fnPutParamVal:=rc_Ok;
  case LA of
    LA_Byte1: bByte1:=Byte(Data);
    LA_Byte2: bByte2:=Byte(Data);
    LA_Byte3: ShowState;

  else
    fnPutParamVal:=rc_NotImplemented;
  end;
 { synchronizace promennych - odemknuti jadra, viz. vyse }
 if not fLock then UnLockKernel;
end;

function TParam.fnGetParamSize(LA:Word):Word;
begin
(*
  { pri malem mnozstvi parametru lze pouzit CASE }
  fnGetParamSize:=0;
  case LA of
    LA_DemoByte1,
    LA_DemoByte2: fnGetParamSize:=sizeof(Byte);

    LA_DemoWord1,
    LA_DemoSmallInt1:
                  fnGetParamSize:=sizeof(Word);

    LA_DemoLongInt1: fnGetParamSize:=sizeof(LongInt);
    LA_DemoRealp1: fnGetParamSize:=sizeof(Real);
  end;
*)

  { Pri velkem mnozstvi parametru doporucujeme pouzivat tabulku.
    Tabulka se v tomto pripade nastavuje v souboru XCrExam1
    a vytvari se manualne pri definici jednotlivych parametru. }
  fnGetParamSize:=GetOnLineParSize(LA);
end;

function TParam.fnGetFirmwareParamVal(var LA:Word; var Data):Word;
var
  wRet:Word;
begin
  wRet:=inherited fnGetFirmwareParamVal(LA, Data);

  if wRet = rc_NotImplemented then
  begin
    case LA of
      LA_RstStruct: { cteni ErrDescArray }
        begin
          with tRstStruct(Addr(Data)^), gpAppRstDesc^ do
          begin
            Verse:=wAppVer;
            RstCt:=wRunErrCnt;
            ARst:=bIxWrittenAt;
            Rst:=ErrDescArray;
          end;
          wRet:=rc_Ok;
        end;
      LA_firmwareAppVer: begin
                           tappverstr(addr(data)^) := 'Example2 02.01';
                           wRet := rc_OK;
                         end;
    end;
  end;
  fnGetFirmwareParamVal:=wRet;
end;

function TParam.fnPutFirmwareParamVal(var LA:Word; var Data):Word;
var
  wRet:Word;
begin
  wRet:=inherited fnPutFirmwareParamVal(LA, Data);

  if wRet = rc_NotImplemented then
  begin
    case LA of
      LA_ClrRstStruct: { inicializace struktur LdrDesc a AppRstDesc }
        begin
          InitLdrDesc(gpLdrDesc);
          InitAppRstDesc(gpAppRstDesc);
          wRet:=rc_Ok;
        end;
    end;
  end;
  fnPutFirmwareParamVal:=wRet;
end;

procedure ShowState;
var
  fLock:Boolean;
begin
  { synchronizace promennych - zamknuti jadra proti prepnuti
    procesu.
    Tato synchronizace je dostatecna pokud k promennym pristupuji
    ruzne procesy. V pripade pristupu k promennym z prerusovaci
    obsluhy by zde musela byt pouzito zakazani preruseni (pushf cli) }
  fLock:=ExLockKernel;
  { zobrazeni uzivatelskych dat}
   writeln('Byte1: ', ByteStrDec(bByte1,3));
   writeln('Byte2: ', ByteStrDec(bByte2,3));
   writeln('Byte3(konstanta): ', ByteStrDec(bByte3,3));
  { synchronizace promennych - odemknuti jadra, viz. vyse }
  if not fLock then UnLockKernel;
end;

end.
