# Fonction PCODE ID = 860026233
REGISTRE ENTIER unite
REGISTRE ENTIER longueur
REGISTRE ENTIER ic_num
REGISTRE ARTOBJ artobj

################################################################################
# Module : CtrlDCB.src
#          controle des champs de valeur DCB
#          
################################################################################


REGISTRE ENTIER code_erreur
REGISTRE ENTIER erreur

# indices du champ dede
REGISTRE ENTIER index
REGISTRE ENTIER valeur
REGISTRE ENTIER valeurHexa
REGISTRE ENTIER quartetFort
REGISTRE ENTIER quartetFaible

# codes de rejet
DEFINITION ERR_SYNTAX   1
DEFINITION ERR_SEMANT   2
DEFINITION ERR_EXCLUSIF 3
DEFINITION ERR_TRANSAC  4
DEFINITION UNIT_OCTET   0


#
# recuperation des valeurs d'entree
#

unite = depilerENTIER()
longueur = depilerENTIER()
ic_num = depilerENTIER()
artobj = depilerARTOBJ()
          trace1("Debut CtrlDCB ic_num %d", ic_num)
          trace1("Debut CtrlDCB longueur %d", longueur)
# code_erreur initialise a 0 (pas d'erreur)
code_erreur = TRAIT_OK



###################################################################################
#  Codage DCB sur un octet
###################################################################################

SI ( unite == UNIT_OCTET )
ALORS
     #
     # Si ce n'est pas un tableau numerique, la valeur de longueur est
     # la valeur de l'octet a tester
     # 
     valeurHexa = i_get_art_field(artobj, ic_num)

     trace1("Octet valeurHexa %d", valeurHexa)
FINSI

index = 0

POINT BOUCLE

trace1("index %d", index)
SI ( index < longueur )
ALORS
     SI ( unite == UNIT_OCTET )
     ALORS
	  valeur = ( ( valeurHexa >> index*8 ) & 0xFF )
          trace1("Octet valeur %d", valeur)
     SINON
          valeur = i_get_art_fieldtab(artobj, ic_num, index)
          trace1("DCB valeur %d", valeur)
     FINSI
 
          quartetFort   = (valeur & 0xF0) >> 4
          quartetFaible = valeur & 0x0F

          ##############################################################################
          #  Tester quartet de poid fort
          ##############################################################################

          SI ( ( quartetFort > 9 ) || ( ( quartetFaible != 0x0F ) && ( quartetFaible > 9 ) ) )
          ALORS
               trace1("Mauvais codage du numero demande %d incorrect", valeur)
               erreur = i_PlvMessEmettre(7502,1,artobj,"",0,0,0,0)
               code_erreur = ERR_SEMANT
          SINON
               index = index + 1
               SAUT BOUCLE
          FINSI

FINSI

RETOUR code_erreur


