lib/iec_std_lib.h
changeset 715 134f110060db
parent 714 91fe96900800
child 799 214c9dced257
equal deleted inserted replaced
714:91fe96900800 715:134f110060db
   650 }
   650 }
   651 
   651 
   652     /*****************/
   652     /*****************/
   653     /*  FROM/TO BCD  */
   653     /*  FROM/TO BCD  */
   654     /*****************/
   654     /*****************/
   655 #define __bcd_digit(fac)
   655 
       
   656 static inline BOOL __test_bcd(LWORD IN) {
       
   657 	while (IN) {
       
   658 		if ((IN & 0xf) > 9) return 1;
       
   659 		IN >>= 4;
       
   660 	}
       
   661 	return 0;
       
   662 }
       
   663 
   656 static inline ULINT __bcd_to_uint(LWORD IN){
   664 static inline ULINT __bcd_to_uint(LWORD IN){
   657     ULINT res;
   665     ULINT res = IN & 0xf;
   658     ULINT i;
   666     ULINT factor = 10ULL;
   659 
   667 
   660     res = IN & 0xf;
   668     while (IN >>= 4) {
   661     for(i = 10ULL; i <= 1000000000000000ULL; i *= 10){
   669         res += (IN & 0xf) * factor;
   662         if(!(IN >>= 4))
   670         factor *= 10;
   663             break;
       
   664         res += (IN & 0xf) * i;
       
   665     }
   671     }
   666     return res;
   672     return res;
   667 }
   673 }
   668 
   674 
   669 static inline LWORD __uint_to_bcd(ULINT IN){
   675 static inline LWORD __uint_to_bcd(ULINT IN){
   670     LWORD res;
   676     LWORD res = IN % 10;
   671     USINT i;
   677     USINT shift = 4;
   672 
   678 
   673     res = IN % 10;
   679     while (IN /= 10) {
   674     for(i = 4; i<=60; i += 4){
   680         res |= (IN % 10) << shift;
   675         if(!(IN /= 10))
   681         shift += 4;
   676             break;
       
   677         res |= (IN % 10) << i;
       
   678     }
   682     }
   679     return res;
   683     return res;
   680 }
   684 }
   681 
   685 
   682 
   686 
   980 
   984 
   981 
   985 
   982 /********   BCD_TO_   ************/
   986 /********   BCD_TO_   ************/
   983 #define __iec_(to_TYPENAME,from_TYPENAME) \
   987 #define __iec_(to_TYPENAME,from_TYPENAME) \
   984 static inline to_TYPENAME from_TYPENAME##_BCD_TO_##to_TYPENAME(EN_ENO_PARAMS, from_TYPENAME op){\
   988 static inline to_TYPENAME from_TYPENAME##_BCD_TO_##to_TYPENAME(EN_ENO_PARAMS, from_TYPENAME op){\
   985   TEST_EN(to_TYPENAME)\
   989   TEST_EN_COND(to_TYPENAME, __test_bcd(op))\
   986   return (to_TYPENAME)__bcd_to_uint(op);\
   990   return (to_TYPENAME)__bcd_to_uint(op);\
   987 }\
   991 }\
   988 static inline to_TYPENAME BCD_TO_##to_TYPENAME##__##to_TYPENAME##__##from_TYPENAME(EN_ENO_PARAMS, from_TYPENAME op){\
   992 static inline to_TYPENAME BCD_TO_##to_TYPENAME##__##to_TYPENAME##__##from_TYPENAME(EN_ENO_PARAMS, from_TYPENAME op){\
   989   return from_TYPENAME##_BCD_TO_##to_TYPENAME(EN_ENO, op);\
   993   return from_TYPENAME##_BCD_TO_##to_TYPENAME(EN_ENO, op);\
   990 }
   994 }