1 #ifndef __MLPIPARAMETERHELPER_H__ 2 #define __MLPIPARAMETERHELPER_H__ 95 #define MLPI_CONVERT_VALUE_TO_WCHAR16_BUFFER_STACK_SIZE (128) 97 const CHAR MLPI_VALUE_SEPARATOR_UTF8 =
' ';
98 const WCHAR16 MLPI_VALUE_SEPARATOR_UTF16 = (
WCHAR16) MLPI_VALUE_SEPARATOR_UTF8;
99 const WCHAR16 MLPI_BOOLEAN_VALUE_TRUE[] = {
'T',
'R',
'U',
'E',
'\0' };
100 const WCHAR16 MLPI_BOOLEAN_VALUE_FALSE[] = {
'F',
'A',
'L',
'S',
'E',
'\0' };
101 const ULONG MLPI_SIZEOF_BOOLEAN_VALUE_TRUE =
sizeof(MLPI_BOOLEAN_VALUE_TRUE);
102 const ULONG MLPI_SIZEOF_BOOLEAN_VALUE_FALSE =
sizeof(MLPI_BOOLEAN_VALUE_FALSE);
105 #define PARAM_MAX_NUMBER_PARAMETER (4096) 106 #define PARAM_LIST_ALL_C MLPI_SIDN_C(110) 107 #define PARAM_LIST_ALL_A MLPI_SIDN_A(10) 108 #define PARAM_LIST_ALL_K MLPI_SIDN_K(10) 109 #define PARAM_LIST_ALL_O MLPI_SIDN_O(10) 110 #define PARAM_LIST_ALL_M MLPI_SIDN_M(10) 111 #define PARAM_LIST_ALL_N MLPI_SIDN_N(10) 112 #define PARAM_LIST_ALL_SP MLPI_SIDN_S(17) 122 #define PARAM_ATTR_DATA_TYPE ( 0x00700000 ) // data type and display format mask (Bit 20-22) 123 #define PARAM_ATTR_DATA_TYPE_BINARY ( 0x00000000 ) 124 #define PARAM_ATTR_DATA_TYPE_UINT_DEC ( 0x00100000 ) 125 #define PARAM_ATTR_DATA_TYPE_INT_DEC ( 0x00200000 ) 126 #define PARAM_ATTR_DATA_TYPE_UINT_HEX ( 0x00300000 ) 127 #define PARAM_ATTR_DATA_TYPE_TEXT ( 0x00400000 ) 128 #define PARAM_ATTR_DATA_TYPE_UINT_IDN ( 0x00500000 ) 129 #define PARAM_ATTR_DATA_TYPE_FLOAT ( 0x00600000 ) 130 #define PARAM_ATTR_DATA_TYPE_MLC_IDN ( 0x00700000 ) 132 #define PARAM_ATTR_DATA_LENGTH ( 0x00070000 ) // data length mask (Bit 16-18) 133 #define PARAM_ATTR_DATA_LENGTH_1BYTE ( 0x00000000 ) 134 #define PARAM_ATTR_DATA_LENGTH_2BYTE ( 0x00010000 ) 135 #define PARAM_ATTR_DATA_LENGTH_4BYTE ( 0x00020000 ) 136 #define PARAM_ATTR_DATA_LENGTH_8BYTE ( 0x00030000 ) 137 #define PARAM_ATTR_DATA_LENGTH_1BYTE_VAR ( 0x00040000 ) 138 #define PARAM_ATTR_DATA_LENGTH_2BYTE_VAR ( 0x00050000 ) 139 #define PARAM_ATTR_DATA_LENGTH_4BYTE_VAR ( 0x00060000 ) 140 #define PARAM_ATTR_DATA_LENGTH_8BYTE_VAR ( 0x00070000 ) 141 #define PARAM_ATTR_DATA_LENGTH_LIST ( 0x00040000 ) 142 #define PARAM_ATTR_DATA_LENGTH_NO_LIST ( 0x00030000 ) 144 #define PARAM_ATTR_FUNCTION ( 0x00080000 ) // function mask (Bit 19) 145 #define PARAM_ATTR_FUNCTION_PARAMETER ( 0x00000000 ) // parameter 146 #define PARAM_ATTR_FUNCTION_COMMAND ( 0x00080000 ) // command 148 #define PARAM_ATTR_DECIMAL_POINT ( 0x0F000000 ) // decimal point mask (Bit 24-27) 149 #define PARAM_ATTR_DECIMAL_POINT_00PLACES ( 0x00000000 ) 150 #define PARAM_ATTR_DECIMAL_POINT_01PLACES ( 0x01000000 ) 151 #define PARAM_ATTR_DECIMAL_POINT_02PLACES ( 0x02000000 ) 152 #define PARAM_ATTR_DECIMAL_POINT_03PLACES ( 0x03000000 ) 153 #define PARAM_ATTR_DECIMAL_POINT_04PLACES ( 0x04000000 ) 154 #define PARAM_ATTR_DECIMAL_POINT_05PLACES ( 0x05000000 ) 155 #define PARAM_ATTR_DECIMAL_POINT_06PLACES ( 0x06000000 ) 156 #define PARAM_ATTR_DECIMAL_POINT_07PLACES ( 0x07000000 ) 157 #define PARAM_ATTR_DECIMAL_POINT_08PLACES ( 0x08000000 ) 158 #define PARAM_ATTR_DECIMAL_POINT_09PLACES ( 0x09000000 ) 159 #define PARAM_ATTR_DECIMAL_POINT_10PLACES ( 0x0A000000 ) 160 #define PARAM_ATTR_DECIMAL_POINT_11PLACES ( 0x0B000000 ) 161 #define PARAM_ATTR_DECIMAL_POINT_12PLACES ( 0x0C000000 ) 162 #define PARAM_ATTR_DECIMAL_POINT_13PLACES ( 0x0D000000 ) 163 #define PARAM_ATTR_DECIMAL_POINT_14PLACES ( 0x0E000000 ) 164 #define PARAM_ATTR_DECIMAL_POINT_15PLACES ( 0x0F000000 ) 166 #define PARAM_ATTR_WRITE_PROTECTION ( 0x70000000 ) // write protection mask (Bit 28-30) 167 #define PARAM_ATTR_WRITE_PROTECTION_NONE ( 0x00000000 ) // write protected none, writeable P0..P4 168 #define PARAM_ATTR_WRITE_PROTECTION_P0_P1_P2 ( 0x10000000 ) // write protected in P0..P2, writeable P3..P4 169 #define PARAM_ATTR_WRITE_PROTECTION_P3 ( 0x20000000 ) // write protected in P3, writeable P0..2, P4 (do not use, use NONE instead!) 170 #define PARAM_ATTR_WRITE_PROTECTION_P0_P1_P2_P3 ( 0x30000000 ) // write protected in P0..P3, writeable P4 (do not use, use P0_P1_P2 instead!) 171 #define PARAM_ATTR_WRITE_PROTECTION_P4 ( 0x40000000 ) // write protected in P4, writeable P0..P3 (do not use, use P3_P4 instead!) 172 #define PARAM_ATTR_WRITE_PROTECTION_P0_P1_P2_P4 ( 0x50000000 ) // write protected in P0..P2, P4, writeable P3 (do not use, use READ_ONLY instead!) 173 #define PARAM_ATTR_WRITE_PROTECTION_P3_P4 ( 0x60000000 ) // write protected in P3..P4, writeable P0..P2 174 #define PARAM_ATTR_WRITE_PROTECTION_READ_ONLY ( 0x70000000 ) // write protected in P0..P4, writeable none 176 #define PARAM_MAX_IDN_STRING_LENGTH ( 24 ) 177 #define PARAM_SERCOS_TIME_STRING_LENGTH ( 31 ) 179 typedef enum ParamWriteProtection
181 PARAM_WRITE_PROTECTION_NONE = 0,
182 PARAM_WRITE_PROTECTION_P0_P1_P2 = 1,
183 PARAM_WRITE_PROTECTION_P3 = 2,
184 PARAM_WRITE_PROTECTION_P0_P1_P2_P3 = 3,
185 PARAM_WRITE_PROTECTION_P4 = 4,
186 PARAM_WRITE_PROTECTION_P0_P1_P2_P4 = 5,
187 PARAM_WRITE_PROTECTION_P3_P4 = 6,
188 PARAM_WRITE_PROTECTION_READ_ONLY = 7
189 }ParamWriteProtection;
194 #define PARAM_ATTR_IS_TYPE_CHAR(a) \ 195 ( ( (((a) & PARAM_ATTR_DATA_TYPE) == PARAM_ATTR_DATA_TYPE_INT_DEC) ) && \ 196 (((a) & PARAM_ATTR_DATA_LENGTH_NO_LIST) == PARAM_ATTR_DATA_LENGTH_1BYTE) ) 198 #define PARAM_ATTR_IS_TYPE_UCHAR(a) \ 199 ( ( (((a) & PARAM_ATTR_DATA_TYPE) == PARAM_ATTR_DATA_TYPE_UINT_DEC) || \ 200 (((a) & PARAM_ATTR_DATA_TYPE) == PARAM_ATTR_DATA_TYPE_UINT_HEX) || \ 201 (((a) & PARAM_ATTR_DATA_TYPE) == PARAM_ATTR_DATA_TYPE_BINARY) ) && \ 202 (((a) & PARAM_ATTR_DATA_LENGTH_NO_LIST) == PARAM_ATTR_DATA_LENGTH_1BYTE) ) 204 #define PARAM_ATTR_IS_TYPE_SHORT(a) \ 205 ( ( (((a) & PARAM_ATTR_DATA_TYPE) == PARAM_ATTR_DATA_TYPE_INT_DEC) ) && \ 206 (((a) & PARAM_ATTR_DATA_LENGTH_NO_LIST) == PARAM_ATTR_DATA_LENGTH_2BYTE) ) 208 #define PARAM_ATTR_IS_TYPE_USHORT(a) \ 209 ( ( (((a) & PARAM_ATTR_DATA_TYPE) == PARAM_ATTR_DATA_TYPE_UINT_DEC) || \ 210 (((a) & PARAM_ATTR_DATA_TYPE) == PARAM_ATTR_DATA_TYPE_UINT_HEX) || \ 211 (((a) & PARAM_ATTR_DATA_TYPE) == PARAM_ATTR_DATA_TYPE_UINT_IDN) || \ 212 (((a) & PARAM_ATTR_DATA_TYPE) == PARAM_ATTR_DATA_TYPE_BINARY) ) && \ 213 (((a) & PARAM_ATTR_DATA_LENGTH_NO_LIST) == PARAM_ATTR_DATA_LENGTH_2BYTE) ) 215 #define PARAM_ATTR_IS_TYPE_LONG(a) \ 216 ( ( (((a) & PARAM_ATTR_DATA_TYPE) == PARAM_ATTR_DATA_TYPE_INT_DEC) ) && \ 217 (((a) & PARAM_ATTR_DATA_LENGTH_NO_LIST) == PARAM_ATTR_DATA_LENGTH_4BYTE) ) 219 #define PARAM_ATTR_IS_TYPE_ULONG(a) \ 220 ( ( (((a) & PARAM_ATTR_DATA_TYPE) == PARAM_ATTR_DATA_TYPE_UINT_DEC) || \ 221 (((a) & PARAM_ATTR_DATA_TYPE) == PARAM_ATTR_DATA_TYPE_UINT_HEX) || \ 222 (((a) & PARAM_ATTR_DATA_TYPE) == PARAM_ATTR_DATA_TYPE_UINT_IDN) || \ 223 (((a) & PARAM_ATTR_DATA_TYPE) == PARAM_ATTR_DATA_TYPE_MLC_IDN) || \ 224 (((a) & PARAM_ATTR_DATA_TYPE) == PARAM_ATTR_DATA_TYPE_BINARY) ) && \ 225 (((a) & PARAM_ATTR_DATA_LENGTH_NO_LIST) == PARAM_ATTR_DATA_LENGTH_4BYTE) ) 227 #define PARAM_ATTR_IS_TYPE_LLONG(a) \ 228 ( ( (((a) & PARAM_ATTR_DATA_TYPE) == PARAM_ATTR_DATA_TYPE_INT_DEC) ) && \ 229 (((a) & PARAM_ATTR_DATA_LENGTH_NO_LIST) == PARAM_ATTR_DATA_LENGTH_8BYTE) ) 231 #define PARAM_ATTR_IS_TYPE_ULLONG(a) \ 232 ( ( (((a) & PARAM_ATTR_DATA_TYPE) == PARAM_ATTR_DATA_TYPE_UINT_DEC) || \ 233 (((a) & PARAM_ATTR_DATA_TYPE) == PARAM_ATTR_DATA_TYPE_UINT_HEX) || \ 234 (((a) & PARAM_ATTR_DATA_TYPE) == PARAM_ATTR_DATA_TYPE_MLC_IDN) || \ 235 (((a) & PARAM_ATTR_DATA_TYPE) == PARAM_ATTR_DATA_TYPE_BINARY) ) && \ 236 (((a) & PARAM_ATTR_DATA_LENGTH_NO_LIST) == PARAM_ATTR_DATA_LENGTH_8BYTE) ) 238 #define PARAM_ATTR_IS_TYPE_FLOAT(a) \ 239 ( ( (((a) & PARAM_ATTR_DATA_TYPE) == PARAM_ATTR_DATA_TYPE_FLOAT) ) && \ 240 (((a) & PARAM_ATTR_DATA_LENGTH_NO_LIST) == PARAM_ATTR_DATA_LENGTH_4BYTE) ) 242 #define PARAM_ATTR_IS_TYPE_DOUBLE(a) \ 243 ( ( (((a) & PARAM_ATTR_DATA_TYPE) == PARAM_ATTR_DATA_TYPE_FLOAT) ) && \ 244 (((a) & PARAM_ATTR_DATA_LENGTH_NO_LIST) == PARAM_ATTR_DATA_LENGTH_8BYTE) ) 246 #define PARAM_ATTR_IS_TYPE_STRING(a) \ 247 ( ( (((a) & PARAM_ATTR_DATA_TYPE) == PARAM_ATTR_DATA_TYPE_TEXT) ) && \ 248 (((a) & PARAM_ATTR_DATA_LENGTH) == PARAM_ATTR_DATA_LENGTH_1BYTE_VAR) ) 250 #define PARAM_ATTR_IS_FIXED_LENGTH(a) \ 251 ( (((a) & PARAM_ATTR_DATA_LENGTH) == PARAM_ATTR_DATA_LENGTH_1BYTE) || \ 252 (((a) & PARAM_ATTR_DATA_LENGTH) == PARAM_ATTR_DATA_LENGTH_2BYTE) || \ 253 (((a) & PARAM_ATTR_DATA_LENGTH) == PARAM_ATTR_DATA_LENGTH_4BYTE) || \ 254 (((a) & PARAM_ATTR_DATA_LENGTH) == PARAM_ATTR_DATA_LENGTH_8BYTE) ) 256 #define PARAM_ATTR_IS_VARIABLE_LENGTH(a) ( !PARAM_ATTR_IS_FIXED_LENGTH(a) ) 266 switch(attribute & PARAM_ATTR_DATA_TYPE)
268 case PARAM_ATTR_DATA_TYPE_INT_DEC: mlpiResult =
MLPI_S_OK;
break;
269 default: mlpiResult = errorCode;
break;
277 switch(attribute & PARAM_ATTR_DATA_TYPE)
279 case PARAM_ATTR_DATA_TYPE_BINARY: mlpiResult =
MLPI_S_OK;
break;
280 case PARAM_ATTR_DATA_TYPE_UINT_DEC: mlpiResult =
MLPI_S_OK;
break;
281 case PARAM_ATTR_DATA_TYPE_UINT_HEX: mlpiResult =
MLPI_S_OK;
break;
282 case PARAM_ATTR_DATA_TYPE_UINT_IDN: mlpiResult =
MLPI_S_OK;
break;
283 case PARAM_ATTR_DATA_TYPE_MLC_IDN: mlpiResult =
MLPI_S_OK;
break;
284 default: mlpiResult = errorCode;
break;
292 switch(attribute & PARAM_ATTR_DATA_TYPE)
294 case PARAM_ATTR_DATA_TYPE_FLOAT: mlpiResult =
MLPI_S_OK;
break;
295 default: mlpiResult = errorCode;
break;
303 switch(attribute & PARAM_ATTR_DATA_TYPE)
305 case PARAM_ATTR_DATA_TYPE_TEXT: mlpiResult =
MLPI_S_OK;
break;
306 default: mlpiResult = errorCode;
break;
404 if (PARAM_ATTR_IS_VARIABLE_LENGTH(attribute))
406 if (PARAM_ATTR_IS_TYPE_UCHAR(attribute))
408 if (PARAM_ATTR_IS_TYPE_USHORT(attribute))
410 if (PARAM_ATTR_IS_TYPE_SHORT(attribute))
412 if (PARAM_ATTR_IS_TYPE_ULONG(attribute))
414 if (PARAM_ATTR_IS_TYPE_LONG(attribute))
416 if (PARAM_ATTR_IS_TYPE_ULLONG(attribute))
418 if (PARAM_ATTR_IS_TYPE_LLONG(attribute))
420 if (PARAM_ATTR_IS_TYPE_FLOAT(attribute))
422 if (PARAM_ATTR_IS_TYPE_DOUBLE(attribute))
424 if (PARAM_ATTR_IS_TYPE_STRING(attribute))
429 if (PARAM_ATTR_IS_TYPE_UCHAR(attribute))
431 if (PARAM_ATTR_IS_TYPE_CHAR(attribute))
433 if (PARAM_ATTR_IS_TYPE_USHORT(attribute))
435 if (PARAM_ATTR_IS_TYPE_SHORT(attribute))
437 if (PARAM_ATTR_IS_TYPE_ULONG(attribute))
439 if (PARAM_ATTR_IS_TYPE_LONG(attribute))
441 if (PARAM_ATTR_IS_TYPE_ULLONG(attribute))
443 if (PARAM_ATTR_IS_TYPE_LLONG(attribute))
445 if (PARAM_ATTR_IS_TYPE_FLOAT(attribute))
447 if (PARAM_ATTR_IS_TYPE_DOUBLE(attribute))
449 if (PARAM_ATTR_IS_TYPE_STRING(attribute))
455 #define PARAM_ADD_ELEMENT_TO_SIDN(sidn, element) ( (ULLONG)( \ 457 ((ULLONG)(element & (SZ_PSP_ELEMENT-1)) << 40) )) 466 switch (attribute & PARAM_ATTR_FUNCTION)
468 case PARAM_ATTR_FUNCTION_PARAMETER: cmd =
false;
break;
469 case PARAM_ATTR_FUNCTION_COMMAND: cmd =
true;
break;
480 SHORT decimalPoint = 0;
481 switch (attribute & PARAM_ATTR_DECIMAL_POINT)
483 case PARAM_ATTR_DECIMAL_POINT_00PLACES: decimalPoint = 0;
break;
484 case PARAM_ATTR_DECIMAL_POINT_01PLACES: decimalPoint = 1;
break;
485 case PARAM_ATTR_DECIMAL_POINT_02PLACES: decimalPoint = 2;
break;
486 case PARAM_ATTR_DECIMAL_POINT_03PLACES: decimalPoint = 3;
break;
487 case PARAM_ATTR_DECIMAL_POINT_04PLACES: decimalPoint = 4;
break;
488 case PARAM_ATTR_DECIMAL_POINT_05PLACES: decimalPoint = 5;
break;
489 case PARAM_ATTR_DECIMAL_POINT_06PLACES: decimalPoint = 6;
break;
490 case PARAM_ATTR_DECIMAL_POINT_07PLACES: decimalPoint = 7;
break;
491 case PARAM_ATTR_DECIMAL_POINT_08PLACES: decimalPoint = 8;
break;
492 case PARAM_ATTR_DECIMAL_POINT_09PLACES: decimalPoint = 9;
break;
493 case PARAM_ATTR_DECIMAL_POINT_10PLACES: decimalPoint = 10;
break;
494 case PARAM_ATTR_DECIMAL_POINT_11PLACES: decimalPoint = 11;
break;
495 case PARAM_ATTR_DECIMAL_POINT_12PLACES: decimalPoint = 12;
break;
496 case PARAM_ATTR_DECIMAL_POINT_13PLACES: decimalPoint = 13;
break;
497 case PARAM_ATTR_DECIMAL_POINT_14PLACES: decimalPoint = 14;
break;
498 case PARAM_ATTR_DECIMAL_POINT_15PLACES: decimalPoint = 15;
break;
509 ParamWriteProtection writeProtection = (ParamWriteProtection)PARAM_ATTR_WRITE_PROTECTION_READ_ONLY;
510 switch (attribute & PARAM_ATTR_WRITE_PROTECTION)
512 case PARAM_ATTR_WRITE_PROTECTION_NONE: writeProtection = PARAM_WRITE_PROTECTION_NONE;
break;
513 case PARAM_ATTR_WRITE_PROTECTION_P0_P1_P2: writeProtection = PARAM_WRITE_PROTECTION_P0_P1_P2;
break;
514 case PARAM_ATTR_WRITE_PROTECTION_P3: writeProtection = PARAM_WRITE_PROTECTION_P3;
break;
515 case PARAM_ATTR_WRITE_PROTECTION_P0_P1_P2_P3: writeProtection = PARAM_WRITE_PROTECTION_P0_P1_P2_P3;
break;
516 case PARAM_ATTR_WRITE_PROTECTION_P4: writeProtection = PARAM_WRITE_PROTECTION_P4;
break;
517 case PARAM_ATTR_WRITE_PROTECTION_P0_P1_P2_P4: writeProtection = PARAM_WRITE_PROTECTION_P0_P1_P2_P4;
break;
518 case PARAM_ATTR_WRITE_PROTECTION_P3_P4: writeProtection = PARAM_WRITE_PROTECTION_P3_P4;
break;
519 case PARAM_ATTR_WRITE_PROTECTION_READ_ONLY: writeProtection = PARAM_WRITE_PROTECTION_READ_ONLY;
break;
521 return writeProtection;
545 ULLONG _type=0, _set=0, _block=0, _si=0, _se=0;
551 while( !(((idn[i]>=
'0') && (idn[i]<=
'9')) || (idn[i]==L
':')) )
554 _address =
wtoi16(&idn[i]);
556 while( !(idn[i]==L
':') )
603 if ( (
wcslen16(&idn[i])>=1) && (idn[i+0]!=
'-') && (idn[i+0]>=
'0') && (idn[i+0]<=
'9') )
605 _block =
wtoi16(&idn[i+0]);
607 while( (idn[i]>=
'0') && (idn[i]<=
'9') )
612 if ( (
wcslen16(&idn[i])>=3) && (idn[i+0]==
'-') && (idn[i+1]>=
'0') && (idn[i+1]<=
'7') && (idn[i+2]==
'-') )
614 _set = idn[i+1] -
'0';
619 if ( (
wcslen16(&idn[i])>=2) && (idn[i+0]==
'-') && (idn[i+1]>=
'0') && (idn[i+1]<=
'9') )
621 _block =
wtoi16(&idn[i+1]);
623 while( (idn[i]>=
'0') && (idn[i]<=
'9') )
628 if ( (
wcslen16(&idn[i])>=2) && (idn[i+0]==
'.') && (idn[i+1]>=
'0') && (idn[i+1]<=
'9') )
632 while( (idn[i]>=
'0') && (idn[i]<=
'9') )
637 if ( (
wcslen16(&idn[i])>=2) && (idn[i+0]==
'.') && (idn[i+1]>=
'0') && (idn[i+1]<=
'9') )
641 while( (idn[i]>=
'0') && (idn[i]<=
'9') )
660 while(idn[i]==MLPI_VALUE_SEPARATOR_UTF16)
664 *idnNxt =
const_cast<WCHAR16*
>(&idn[i]);
686 ULLONG _type=0, _set=0, _block=0, _si=0, _se=0;
694 *idnValue =
MLPI_SIDN(_type, _set, _block, _si, _se);
723 _address = (
ULONG) ((sidn & (~_mask)) >> 56);
763 R_SIDN *_sidn = (R_SIDN*) &sidn;
766 *address = _sidn->address;
770 *block = _sidn->block;
772 *spFlag = _sidn->flag;
800 ULONG _address=0, _type=0, _block=0, _spFlag=0, _set=0, _si=0, _se=0, i=0;
850 sprintf(_helper,
"%01u", (
UCHAR)((_set>0x7)?0:_set));
855 sprintf(_helper,
"%04u", (
USHORT)((_block>0xFFF)?0:_block));
862 sprintf(_helper,
"%03u", (
UCHAR)((_si>0xFF)?0:_si));
869 sprintf(_helper,
"%03u", (
UCHAR)((_se>0xFF)?0:_se));
921 if (seconds==0xFFFFFFFF)
922 seconds = 0xFFFFFFFE;
924 if(nanoseconds>999999999) {
925 nanoseconds = 999999999;
928 #if defined(TARGET_OS_WINCE32) 929 #pragma message ("not supported on TARGET_OS_WINCE32") 931 #elif defined(TARGET_OS_WINNT) 933 memset(&timeBuffer, 0,
sizeof(timeBuffer));
935 gmtime_s(&timeBuffer, (time_t*) &seconds);
937 len = (
ULONG) strftime(time, numElements,
"%Y-%m-%dT%H:%M:%S", &timeBuffer);
938 len += sprintf(time+len,
".%09uZ", nanoseconds);
942 memset(&timeBuffer, 0,
sizeof(timeBuffer));
944 gmtime_r((time_t*) &seconds, &timeBuffer);
946 len = (
ULONG) strftime(time, numElements,
"%Y-%m-%dT%H:%M:%S", &timeBuffer);
947 len += sprintf(time+len,
".%09luZ", nanoseconds);
952 if(numElementsRet != NULL)
953 *numElementsRet = len;
987 if(numElementsRet != NULL)
988 *numElementsRet = len;
1022 ULONG nanoseconds = 0;
1026 else if (timeStamp==NULL)
1031 CHAR *localDataUtf8Tmp = localDataUtf8;
1032 ULONG numElements = 0;
1035 while( (*time!=
'\0') && (*time!=separator) ) {
1037 localDataUtf8Tmp[numElements++] = (
CHAR) *time++;
1049 while(*time==MLPI_VALUE_SEPARATOR_UTF8)
1052 *timeNext =
const_cast<CHAR*
>(time);
1057 localDataUtf8Tmp[numElements++] =
'\0';
1058 localDataUtf8Tmp = localDataUtf8;
1072 for(
ULONG i=0; i<4; i++, localDataUtf8Tmp++)
1073 if( (*localDataUtf8Tmp<
'0') || (*localDataUtf8Tmp>
'9') )
1077 if(*localDataUtf8Tmp++!=
'-')
1081 for(
ULONG i=0; i<2; i++, localDataUtf8Tmp++)
1082 if( (*localDataUtf8Tmp<
'0') || (*localDataUtf8Tmp>
'9') )
1086 if(*localDataUtf8Tmp++!=
'-')
1090 for(
ULONG i=0; i<2; i++, localDataUtf8Tmp++)
1091 if( (*localDataUtf8Tmp<
'0') || (*localDataUtf8Tmp>
'9') )
1095 if(*localDataUtf8Tmp++!=
'T')
1099 for(
ULONG i=0; i<2; i++, localDataUtf8Tmp++)
1100 if( (*localDataUtf8Tmp<
'0') || (*localDataUtf8Tmp>
'9') )
1104 if(*localDataUtf8Tmp++!=
':')
1108 for(
ULONG i=0; i<2; i++, localDataUtf8Tmp++)
1109 if( (*localDataUtf8Tmp<
'0') || (*localDataUtf8Tmp>
'9') )
1113 if(*localDataUtf8Tmp++!=
':')
1117 for(
ULONG i=0; i<2; i++, localDataUtf8Tmp++)
1118 if( (*localDataUtf8Tmp<
'0') || (*localDataUtf8Tmp>
'9') )
1122 if(*localDataUtf8Tmp++==
'.') {
1123 if( (*localDataUtf8Tmp<
'0') || (*localDataUtf8Tmp>
'9') )
1127 for(
ULONG i=0; i<9; i++, localDataUtf8Tmp++) {
1128 if( (*localDataUtf8Tmp<
'0') || (*localDataUtf8Tmp>
'9') ) {
1129 if ( (*localDataUtf8Tmp++!=
'Z') || (*localDataUtf8Tmp!=
'\0') )
1138 else if ( (*localDataUtf8Tmp++!=
'Z') || (*localDataUtf8Tmp!=
'\0') )
1150 year = strtoul(&localDataUtf8[0], NULL, 10);
1151 month = strtoul(&localDataUtf8[5], NULL, 10);
1152 day = strtoul(&localDataUtf8[8], NULL, 10);
1153 hour = strtoul(&localDataUtf8[11], NULL, 10);
1154 minute = strtoul(&localDataUtf8[14], NULL, 10);
1155 seconds = strtoul(&localDataUtf8[17], NULL, 10);
1156 nanoseconds = strtoul(&localDataUtf8[20], NULL, 10);
1167 if( (year==2106) && (month==2) && (day==7) && (hour>6) ) mlpiResult =
MLPI_E_INVALIDARG;
1168 if( (year==2106) && (month==2) && (day==7) && (hour==6) && (minute>28) ) mlpiResult =
MLPI_E_INVALIDARG;
1169 if( (year==2106) && (month==2) && (day==7) && (hour==6) && (minute==28) && (seconds>15) ) mlpiResult =
MLPI_E_INVALIDARG;
1170 if( (year==2106) && (month==2) && (day==7) && (hour==6) && (minute==28) && (seconds==15) ) seconds = 14;
1175 time_t timeSeconds=0;
1177 memset(&timeBuffer, 0,
sizeof(timeBuffer));
1179 timeBuffer.tm_year = year - 1970 + 70;
1180 timeBuffer.tm_mon = month - 1;
1181 timeBuffer.tm_mday = day;
1182 timeBuffer.tm_hour = hour;
1183 timeBuffer.tm_min = minute;
1184 timeBuffer.tm_sec = seconds;
1187 #if defined(TARGET_OS_WINCE32) 1188 #pragma message ("not supported on TARGET_OS_WINCE32") 1193 struct tm * timeinfo;
1194 LLONG CorrectSeconds = 0;
1196 rawtime = 23 * 60 * 60;
1197 timeinfo = localtime (&rawtime);
1199 if(timeinfo->tm_mday == 1)
1202 CorrectSeconds =(timeinfo->tm_hour - 23) * 60 * 60;
1207 CorrectSeconds = timeinfo->tm_hour * 60 * 60 + 60 * 60;
1210 if( (timeSeconds = mktime( &timeBuffer )) != ((time_t)-1) )
1212 *timeStamp = ((((
ULLONG) timeSeconds) + CorrectSeconds)<<32 ) | ((
ULLONG) nanoseconds);
1248 else if (timeStamp==NULL)
1253 CHAR *localDataUtf8Tmp = localDataUtf8;
1254 ULONG numElements = 0;
1257 while( (*time!=
'\0') && (*time!=separator) ) {
1259 localDataUtf8Tmp[numElements++] = (
CHAR) *time++;
1270 *timeNext =
const_cast<WCHAR16*
>(time);
1274 localDataUtf8Tmp[numElements++] =
'\0';
1275 localDataUtf8Tmp = localDataUtf8;
1292 #define DATA_STATUS_OP_DATA_INVALID (0x0100) 1293 #define DATA_IS_INVALID(index) ((index > _numElements) || _argInvalid) 1294 #define DATA_IS_VALID(index) ((index <= _numElements) && !_argInvalid) 1295 #define VALID_ELEMENT_ACCESS(name, bit) bool name(const ULONG index) const {return (DATA_IS_VALID(index) && (_readEverything[index].validElements & (1<<bit))) ? true : false;} 1299 : _readEverything(readEverything)
1301 , _numElements(numElements)
1302 , _dataSize(dataSize)
1303 , _argInvalid(( (NULL == readEverything) || (NULL == data) || (0 == numElements) || (0 == dataSize) ) ?
true :
false)
1309 VALID_ELEMENT_ACCESS(isValid_DataStatus , 0);
1310 VALID_ELEMENT_ACCESS(isValid_Name , 1);
1311 VALID_ELEMENT_ACCESS(isValid_Attribute , 2);
1312 VALID_ELEMENT_ACCESS(isValid_Unit , 3);
1313 VALID_ELEMENT_ACCESS(isValid_MinimumValue, 4);
1314 VALID_ELEMENT_ACCESS(isValid_MaximumValue, 5);
1315 VALID_ELEMENT_ACCESS(isValid_Data , 6);
1318 return isValid_Name(index) ?
reinterpret_cast<const WCHAR16*
>(_data + _readEverything[index].nameOffset) : L
"";
1322 return isValid_Unit(index) ?
reinterpret_cast<const WCHAR16*
>(_data + _readEverything[index].unitOffset) : L
"";
1325 const UCHAR* getData(
const ULONG index)
const {
1326 return isValid_Data(index) ? (_data + _readEverything[index].dataOffset) : 0;
1330 const T* getData(
const ULONG index)
const {
1331 return isValid_Data(index) ?
reinterpret_cast<const T*
>(_data + _readEverything[index].dataOffset) : 0;
1334 ULONG getNumDataElements(
const ULONG index)
const {
1335 return isValid_Data(index) ? (_readEverything[index].dataLength ? (_readEverything[index].dataSize / _readEverything[index].dataLength) : 0) : 0;
1338 const UCHAR* getMinimumValue(
const ULONG index)
const {
1339 return isValid_MinimumValue(index) ? (_data + _readEverything[index].minOffset) : 0;
1343 const T* getMinimumValue(
const ULONG index)
const {
1344 return isValid_MinimumValue(index) ?
reinterpret_cast<const T*
>(_data + _readEverything[index].minOffset) : 0;
1347 const UCHAR* getMaximumValue(
const ULONG index)
const {
1348 return isValid_MaximumValue(index) ? (_data + _readEverything[index].maxOffset) : 0;
1352 const T* getMaximumValue(
const ULONG index)
const {
1353 return isValid_MaximumValue(index) ?
reinterpret_cast<const T*
>(_data + _readEverything[index].maxOffset) : 0;
1356 ULONG getAttribute(
const ULONG index)
const {
1357 return isValid_Attribute(index) ? (_readEverything[index].attribute) : 0;
1360 ULONG getValidElements(
const ULONG index)
const {
1361 return (_readEverything[index].validElements);
1364 ULONG getDataStatus(
const ULONG index)
const {
1365 return isValid_DataStatus(index) ? _readEverything[index].dataStatus : DATA_STATUS_OP_DATA_INVALID;
1369 ULONG status = getDataStatus(index);
1373 BOOL8 isDataStatusValid(
const ULONG index)
const {
1374 return ((getDataStatus(index) & DATA_STATUS_OP_DATA_INVALID) ? FALSE : TRUE);
1378 if( DATA_IS_INVALID(index) )
1384 if( DATA_IS_INVALID(index) )
1386 return (_readEverything[index].result);
1391 const UCHAR*
const _data;
1392 const ULONG _numElements;
1393 const ULONG _dataSize;
1394 const bool _argInvalid;
1398 template <
typename T>
1403 if(dataUtf16==NULL) {
1409 ULONG numElementsRetLocal = 0;
1413 numElementsRetLocal = MLPI_SIZEOF_BOOLEAN_VALUE_TRUE;
1414 memcpy(dataUtf16, MLPI_BOOLEAN_VALUE_TRUE, numElementsLocal<numElementsRetLocal?numElementsLocal:numElementsRetLocal);
1417 numElementsRetLocal = MLPI_SIZEOF_BOOLEAN_VALUE_FALSE;
1418 memcpy(dataUtf16, MLPI_BOOLEAN_VALUE_FALSE, numElementsLocal<numElementsRetLocal?numElementsLocal:numElementsRetLocal);
1422 if(numElementsRet != NULL)
1423 *numElementsRet = numElementsRetLocal/
sizeof(
WCHAR16);
1425 if(numElements != 0)
1426 dataUtf16[numElements-1] = 0;
1427 if(numElementsLocal < numElementsRetLocal)
1434 template <
typename T>
1439 if(dataUtf16==NULL) {
1444 const ULONG dataBuffLen = MLPI_CONVERT_VALUE_TO_WCHAR16_BUFFER_STACK_SIZE;
1445 CHAR dataUtf8[dataBuffLen];
1446 ULONG dataBuffCnt = 0;
1449 dataBuffCnt = sprintf(&dataUtf8[dataBuffCnt],
"0b");
1450 for(
LONG j=(
sizeof(data)*8)-1; j>=0 ; j--) {
1451 dataBuffCnt += sprintf(&dataUtf8[dataBuffCnt],
"%01u", (
USHORT) ((data>>j) & 1));
1452 if (((j%4)==0) && j!=0)
1453 dataBuffCnt += sprintf(&dataUtf8[dataBuffCnt],
".");
1457 if(numElementsRet != NULL)
1458 *numElementsRet = dataBuffCnt+1;
1461 mbstowcs16(dataUtf16, dataUtf8, numElements);
1462 if(numElements != 0)
1463 dataUtf16[numElements-1] = 0;
1464 if( dataBuffCnt >= numElements )
1474 template <
typename T>
1475 inline ULONG mlpiConvertUintDecDataToUtf16ConvertLine(
char* dst, T data ) {
return sprintf(dst,
"%llu", data); }
1476 template <>
inline ULONG mlpiConvertUintDecDataToUtf16ConvertLine(
char* dst,
ULLONG data ) {
return sprintf(dst,
"%llu", data); }
1477 template <>
inline ULONG mlpiConvertUintDecDataToUtf16ConvertLine(
char* dst,
ULONG data ) {
return sprintf(dst,
"%lu", data); }
1478 template <>
inline ULONG mlpiConvertUintDecDataToUtf16ConvertLine(
char* dst,
USHORT data ) {
return sprintf(dst,
"%hu", data); }
1479 template <>
inline ULONG mlpiConvertUintDecDataToUtf16ConvertLine(
char* dst,
UCHAR data ) {
return sprintf(dst,
"%hhu", data); }
1481 template <
typename T>
1486 if(dataUtf16==NULL) {
1491 const ULONG dataBuffLen = MLPI_CONVERT_VALUE_TO_WCHAR16_BUFFER_STACK_SIZE;
1492 CHAR dataUtf8[dataBuffLen] =
"";
1493 ULONG dataBuffCnt = 0;
1496 dataBuffCnt = mlpiConvertUintDecDataToUtf16ConvertLine(dataUtf8, data);
1499 if(numElementsRet != NULL)
1500 *numElementsRet = dataBuffCnt+1;
1503 mbstowcs16(dataUtf16, dataUtf8, numElements);
1504 if(numElements != 0)
1505 dataUtf16[numElements-1] = 0;
1506 if( dataBuffCnt >= numElements )
1516 template <
typename T>
1517 inline ULONG mlpiConvertIntDecDataToUtf16ConvertLine(
char* dst, T data ) {
return sprintf(dst,
"%lld", data); }
1518 template <>
inline ULONG mlpiConvertIntDecDataToUtf16ConvertLine(
char* dst,
LLONG data ) {
return sprintf(dst,
"%lld", data); }
1519 template <>
inline ULONG mlpiConvertIntDecDataToUtf16ConvertLine(
char* dst,
LONG data ) {
return sprintf(dst,
"%ld", data); }
1520 template <>
inline ULONG mlpiConvertIntDecDataToUtf16ConvertLine(
char* dst,
SHORT data ) {
return sprintf(dst,
"%hd", data); }
1521 template <>
inline ULONG mlpiConvertIntDecDataToUtf16ConvertLine(
char* dst,
CHAR data ) {
return sprintf(dst,
"%hhd", data); }
1523 template <
typename T>
1528 if(dataUtf16==NULL) {
1533 const ULONG dataBuffLen = MLPI_CONVERT_VALUE_TO_WCHAR16_BUFFER_STACK_SIZE;
1534 CHAR dataUtf8[dataBuffLen] =
"";
1535 ULONG dataBuffCnt = 0;
1538 dataBuffCnt = mlpiConvertIntDecDataToUtf16ConvertLine(dataUtf8, data);
1541 if(numElementsRet != NULL)
1542 *numElementsRet = dataBuffCnt+1;
1545 mbstowcs16(dataUtf16, dataUtf8, numElements);
1546 if(numElements != 0)
1547 dataUtf16[numElements-1] = 0;
1548 if( dataBuffCnt >= numElements )
1558 template <
typename T>
1559 inline ULONG mlpiConvertUintHexDataToUtf16ConvertLine(
char* dst, T data ) {
return sprintf(dst,
"0x%08X%08X", ((
ULONG)(((
ULLONG)data)>>32)), ((
ULONG)(data))); }
1560 template <>
inline ULONG mlpiConvertUintHexDataToUtf16ConvertLine(
char* dst,
ULLONG data ) {
return sprintf(dst,
"0x%08lX%08lX", ((
ULONG)(((
ULLONG)data)>>32)), ((
ULONG)(data))); }
1561 template <>
inline ULONG mlpiConvertUintHexDataToUtf16ConvertLine(
char* dst,
ULONG data ) {
return sprintf(dst,
"0x%08lX", data); }
1562 template <>
inline ULONG mlpiConvertUintHexDataToUtf16ConvertLine(
char* dst,
USHORT data ) {
return sprintf(dst,
"0x%04X", data); }
1563 template <>
inline ULONG mlpiConvertUintHexDataToUtf16ConvertLine(
char* dst,
UCHAR data ) {
return sprintf(dst,
"0x%02X", data); }
1565 template <
typename T>
1570 if(dataUtf16==NULL) {
1575 const ULONG dataBuffLen = MLPI_CONVERT_VALUE_TO_WCHAR16_BUFFER_STACK_SIZE;
1576 CHAR dataUtf8[dataBuffLen] =
"";
1577 ULONG dataBuffCnt = 0;
1580 dataBuffCnt = mlpiConvertUintHexDataToUtf16ConvertLine(dataUtf8, data);
1583 if(numElementsRet != NULL)
1584 *numElementsRet = dataBuffCnt+1;
1587 mbstowcs16(dataUtf16, dataUtf8, numElements);
1588 if(numElements != 0)
1589 dataUtf16[numElements-1] = 0;
1590 if( dataBuffCnt >= numElements )
1599 template <
typename T>
1604 if(dataUtf16==NULL) {
1609 const ULONG dataBuffLen = MLPI_CONVERT_VALUE_TO_WCHAR16_BUFFER_STACK_SIZE;
1610 CHAR dataUtf8[dataBuffLen] =
"";
1611 ULONG dataBuffCnt = 0;
1617 case sizeof(
ULLONG): dataBuffCnt = sprintf(dataUtf8,
"0x%08X%08X", (static_cast<int>(((
ULLONG)data)>>32)), (
static_cast<int>(data)));
break;
1618 case sizeof(
UCHAR): dataBuffCnt = sprintf(dataUtf8,
"0x%02X", static_cast<int>(data));
break;
1629 if (data & 0x00008000)
1638 if(numElementsRet != NULL)
1639 *numElementsRet = dataBuffCnt+1;
1642 mbstowcs16(dataUtf16, dataUtf8, numElements);
1643 if(numElements != 0)
1644 dataUtf16[numElements-1] = 0;
1645 if( dataBuffCnt >= numElements )
1655 template <
typename T>
1656 inline ULONG mlpiConvertMlcIdnDataToUtf16ConvertLine(
char* dst, T data ) {
return sprintf(dst,
"0x%08X%08X", ((
ULONG)(((
ULLONG)data)>>32)), ((
ULONG)(data))); }
1657 template <>
inline ULONG mlpiConvertMlcIdnDataToUtf16ConvertLine(
char* dst,
UCHAR data ) {
return sprintf(dst,
"0x%02X", data); }
1658 template <>
inline ULONG mlpiConvertMlcIdnDataToUtf16ConvertLine(
char* dst,
USHORT data ) {
return sprintf(dst,
"0x%04X", data); }
1659 template <>
inline ULONG mlpiConvertMlcIdnDataToUtf16ConvertLine(
char* dst,
ULONG data ) {
return sprintf(dst,
"0x%08lX", data); }
1660 template <>
inline ULONG mlpiConvertMlcIdnDataToUtf16ConvertLine(
char* dst,
ULLONG data )
1664 default:
return sprintf(dst,
"0x%08lX%08lX", ((
ULONG)(((
ULLONG)data)>>32)), ((
ULONG)(data)));
1676 template <
typename T>
1681 if(dataUtf16==NULL) {
1686 const ULONG dataBuffLen = MLPI_CONVERT_VALUE_TO_WCHAR16_BUFFER_STACK_SIZE;
1687 CHAR dataUtf8[dataBuffLen] =
"";
1688 ULONG dataBuffCnt = 0;
1691 dataBuffCnt = mlpiConvertMlcIdnDataToUtf16ConvertLine(dataUtf8, data);
1694 if(numElementsRet != NULL)
1695 *numElementsRet = dataBuffCnt+1;
1698 mbstowcs16(dataUtf16, dataUtf8, numElements);
1699 if(numElements != 0)
1700 dataUtf16[numElements-1] = 0;
1701 if( dataBuffCnt >= numElements )
1710 template <
typename T>
1715 if(dataUtf16==NULL) {
1720 const ULONG dataBuffLen = MLPI_CONVERT_VALUE_TO_WCHAR16_BUFFER_STACK_SIZE;
1721 CHAR dataUtf8[dataBuffLen] =
"";
1722 ULONG dataBuffCnt = 0;
1727 default: dataBuffCnt = sprintf(dataUtf8,
"0x%08X%08X", (static_cast<int>(((
ULLONG)data)>>32)), (static_cast<int>(data)));
1728 case sizeof(
DOUBLE): dataBuffCnt = sprintf(dataUtf8,
"%lf", data);
break;
1729 case sizeof(
FLOAT): dataBuffCnt = sprintf(dataUtf8,
"%f", data);
break;
1734 *numElementsRet = dataBuffCnt+1;
1737 mbstowcs16(dataUtf16, dataUtf8, numElements);
1738 if(numElements != 0)
1739 dataUtf16[numElements-1] = 0;
1740 if( dataBuffCnt >= numElements )
1748 template <
typename T>
1749 inline ULONG mlpiConvertSercosTimeDataToUtf16ConvertLine(
char* dst, T data ) {
return sprintf(dst,
"0x%08X%08X", ((
ULONG)(((
ULLONG)data)>>32)), ((
ULONG)(data))); }
1750 template <>
inline ULONG mlpiConvertSercosTimeDataToUtf16ConvertLine(
char* dst,
UCHAR data ) {
return sprintf(dst,
"0x%02X", data); }
1751 template <>
inline ULONG mlpiConvertSercosTimeDataToUtf16ConvertLine(
char* dst,
USHORT data ) {
return sprintf(dst,
"0x%04X", data); }
1752 template <>
inline ULONG mlpiConvertSercosTimeDataToUtf16ConvertLine(
char* dst,
ULONG data ) {
return sprintf(dst,
"0x%08lX", data); }
1753 template <>
inline ULONG mlpiConvertSercosTimeDataToUtf16ConvertLine(
char* dst,
ULLONG data )
1755 ULONG dataBuffCnt = 0;
1757 if(dataBuffCnt!=0) dataBuffCnt--;
1761 template <
typename T>
1766 if(dataUtf16==NULL) {
1771 const ULONG dataBuffLen = MLPI_CONVERT_VALUE_TO_WCHAR16_BUFFER_STACK_SIZE;
1772 CHAR dataUtf8[dataBuffLen] =
"";
1773 ULONG dataBuffCnt = 0;
1776 dataBuffCnt = mlpiConvertSercosTimeDataToUtf16ConvertLine(dataUtf8, data);
1780 *numElementsRet = dataBuffCnt+1;
1783 mbstowcs16(dataUtf16, dataUtf8, numElements);
1784 if(numElements != 0)
1785 dataUtf16[numElements-1] = 0;
1786 if( dataBuffCnt >= numElements )
1798 if(dataUtf16==NULL) {
1803 const ULONG dataBuffLen = MLPI_CONVERT_VALUE_TO_WCHAR16_BUFFER_STACK_SIZE;
1804 CHAR dataUtf8[dataBuffLen] =
"";
1805 ULONG dataBuffCnt = 0;
1808 ULONG timeMs = dataValue % 1000; dataValue /= 1000;
1809 ULONG timeS = dataValue % 60; dataValue /= 60;
1810 ULONG timeM = dataValue % 60; dataValue /= 60;
1811 ULONG timeH = dataValue % 24; dataValue /= 24;
1812 ULONG timeD = dataValue;
1814 if(timeD) dataBuffCnt += sprintf(&dataUtf8[dataBuffCnt],
"%lud", timeD);
1815 if(timeH) dataBuffCnt += sprintf(&dataUtf8[dataBuffCnt],
"%luh", timeH);
1816 if(timeM) dataBuffCnt += sprintf(&dataUtf8[dataBuffCnt],
"%lum", timeM);
1817 if(timeS) dataBuffCnt += sprintf(&dataUtf8[dataBuffCnt],
"%lus", timeS);
1818 if(timeMs) dataBuffCnt += sprintf(&dataUtf8[dataBuffCnt],
"%lums", timeMs);
1822 *numElementsRet = dataBuffCnt+1;
1825 mbstowcs16(dataUtf16, dataUtf8, numElements);
1826 if(numElements != 0)
1827 dataUtf16[numElements-1] = 0;
1828 if( dataBuffCnt >= numElements )
1838 if(dataUtf16==NULL) {
1843 const ULONG dataBuffLen = MLPI_CONVERT_VALUE_TO_WCHAR16_BUFFER_STACK_SIZE;
1844 CHAR dataUtf8[dataBuffLen] =
"";
1845 ULONG dataBuffCnt = 0;
1847 #if defined(TARGET_OS_WINCE32) 1848 #pragma message ("not supported on TARGET_OS_WINCE32") 1850 #elif defined(TARGET_OS_WINNT) 1852 memset(&timeBuffer, 0,
sizeof(timeBuffer));
1854 gmtime_s(&timeBuffer, (time_t*) &dataValue);
1856 dataBuffCnt = (
ULONG) strftime(dataUtf8, numElements,
"%Y-%m-%d", &timeBuffer);
1859 memset(&timeBuffer, 0,
sizeof(timeBuffer));
1861 gmtime_r((time_t*) &dataValue, &timeBuffer);
1863 dataBuffCnt = (
ULONG) strftime(dataUtf8, numElements,
"%Y-%m-%d", &timeBuffer);
1868 *numElementsRet = dataBuffCnt+1;
1871 mbstowcs16(dataUtf16, dataUtf8, numElements);
1872 if(numElements != 0)
1873 dataUtf16[numElements-1] = 0;
1874 if( dataBuffCnt >= numElements )
1884 if(dataUtf16==NULL) {
1889 const ULONG dataBuffLen = MLPI_CONVERT_VALUE_TO_WCHAR16_BUFFER_STACK_SIZE;
1890 CHAR dataUtf8[dataBuffLen] =
"";
1891 ULONG dataBuffCnt = 0;
1893 #if defined(TARGET_OS_WINCE32) 1894 #pragma message ("not supported on TARGET_OS_WINCE32") 1896 #elif defined(TARGET_OS_WINNT) 1898 memset(&timeBuffer, 0,
sizeof(timeBuffer));
1900 gmtime_s(&timeBuffer, (time_t*) &dataValue);
1902 dataBuffCnt = (
ULONG) strftime(dataUtf8, numElements,
"%Y-%m-%d-%H:%M:%S", &timeBuffer);
1905 memset(&timeBuffer, 0,
sizeof(timeBuffer));
1907 gmtime_r((time_t*) &dataValue, &timeBuffer);
1909 dataBuffCnt = (
ULONG) strftime(dataUtf8, numElements,
"%Y-%m-%d-%H:%M:%S", &timeBuffer);
1914 *numElementsRet = dataBuffCnt+1;
1917 mbstowcs16(dataUtf16, dataUtf8, numElements);
1918 if(numElements != 0)
1919 dataUtf16[numElements-1] = 0;
1920 if( dataBuffCnt >= numElements )
1930 if(dataUtf16==NULL) {
1935 const ULONG dataBuffLen = MLPI_CONVERT_VALUE_TO_WCHAR16_BUFFER_STACK_SIZE;
1936 CHAR dataUtf8[dataBuffLen] =
"";
1937 ULONG dataBuffCnt = 0;
1940 ULONG timeMs = dataValue % 1000; dataValue /= 1000;
1941 ULONG timeS = dataValue % 60; dataValue /= 60;
1942 ULONG timeM = dataValue % 60; dataValue /= 60;
1943 ULONG timeH = dataValue % 24; dataValue /= 24;
1945 dataBuffCnt = sprintf(dataUtf8,
"%02lu:%02lu:%02lu", timeH, timeM, timeS);
1946 if(timeMs) dataBuffCnt += sprintf(&dataUtf8[dataBuffCnt],
".%lu", timeMs);
1950 *numElementsRet = dataBuffCnt+1;
1953 mbstowcs16(dataUtf16, dataUtf8, numElements);
1954 if(numElements != 0)
1955 dataUtf16[numElements-1] = 0;
1956 if( dataBuffCnt >= numElements )
1963 template <
typename T>
1968 if(dataUtf16==NULL) {
1971 else if(data==NULL) {
1976 const ULONG dataBuffLenTemp1 = MLPI_SIZEOF_BOOLEAN_VALUE_TRUE>MLPI_SIZEOF_BOOLEAN_VALUE_FALSE?MLPI_SIZEOF_BOOLEAN_VALUE_TRUE:MLPI_SIZEOF_BOOLEAN_VALUE_FALSE;
1977 const ULONG dataBuffLen = (MLPI_CONVERT_VALUE_TO_WCHAR16_BUFFER_STACK_SIZE<dataBuffLenTemp1?MLPI_CONVERT_VALUE_TO_WCHAR16_BUFFER_STACK_SIZE:dataBuffLenTemp1) /
sizeof(
WCHAR16);
1978 WCHAR16 dataUtf16Local[dataBuffLen];
1981 while(*dataUtf16==MLPI_VALUE_SEPARATOR_UTF16)
1984 memcpy(dataUtf16Local, dataUtf16, dataBuffLen*
sizeof(
WCHAR16));
1985 dataUtf16Local[dataBuffLen-1] = 0;
1987 for(
ULONG idx=0; idx<dataBuffLen; idx++, dataUtf16++) {
1988 if(!dataUtf16Local[idx])
break;
1989 if(dataUtf16Local[idx]==MLPI_VALUE_SEPARATOR_UTF16) {
1990 dataUtf16Local[idx--] = 0;
1994 if (wcscmp16_(MLPI_BOOLEAN_VALUE_TRUE, dataUtf16Local)==0)
1996 else if (wcscmp16_(MLPI_BOOLEAN_VALUE_FALSE, dataUtf16Local)==0)
2002 while(*dataUtf16==MLPI_VALUE_SEPARATOR_UTF16)
2005 if(dataUtf16Next!=NULL)
2006 *dataUtf16Next =
const_cast<WCHAR16*
>(dataUtf16);
2011 template <
typename T>
2016 if(dataUtf16==NULL) {
2019 else if(data==NULL) {
2027 while(*dataUtf16==MLPI_VALUE_SEPARATOR_UTF16)
2031 while( (*dataUtf16==
'0') || (*dataUtf16==
'+') )
2042 for(dataUtf16++; (*dataUtf16!=0) && (*dataUtf16!=MLPI_VALUE_SEPARATOR_UTF16); dataUtf16++)
2046 if( (*dataUtf16==
'0') || (*dataUtf16==
'1') )
2047 data_ = (data_ << 1) | (*dataUtf16==
'1');
2059 for(dataUtf16++; (*dataUtf16!=0) && (*dataUtf16!=MLPI_VALUE_SEPARATOR_UTF16); dataUtf16++)
2063 if( (*dataUtf16>=
'0') && (*dataUtf16<=
'9') )
2064 data_ = data_*16 + (*dataUtf16-
'0');
2065 else if ( (*dataUtf16>=
'a') && (*dataUtf16<=
'f') )
2066 data_ = data_*16 + (*dataUtf16-
'a'+10);
2067 else if ( (*dataUtf16>=
'A') && (*dataUtf16<=
'F') )
2068 data_ = data_*16 + (*dataUtf16-
'A'+10);
2080 for(dataUtf16++; (*dataUtf16!=0) && (*dataUtf16!=MLPI_VALUE_SEPARATOR_UTF16); dataUtf16++)
2084 if( (*dataUtf16>=
'0') && (*dataUtf16<=
'7') )
2085 data_ = data_*8 + (*dataUtf16-
'0');
2096 for( ; (*dataUtf16!=0) && (*dataUtf16!=MLPI_VALUE_SEPARATOR_UTF16); dataUtf16++)
2098 if(*dataUtf16==
'.') {
2102 if( (*dataUtf16>=
'0') && (*dataUtf16<=
'9') )
2103 data_ = data_*10 + (*dataUtf16-
'0');
2118 while(*dataUtf16==MLPI_VALUE_SEPARATOR_UTF16)
2121 if(dataUtf16Next!=NULL)
2122 *dataUtf16Next =
const_cast<WCHAR16*
>(dataUtf16);
2130 template <
typename T>
2135 if(dataUtf16==NULL) {
2138 else if(data==NULL) {
2143 BOOL8 signFlag = FALSE;
2147 while(*dataUtf16==MLPI_VALUE_SEPARATOR_UTF16)
2151 while( (*dataUtf16==
'0') || (*dataUtf16==
'+') )
2155 if(*dataUtf16==
'-') {
2161 for( ; (*dataUtf16!=0) && (*dataUtf16!=MLPI_VALUE_SEPARATOR_UTF16); dataUtf16++)
2163 if(*dataUtf16==
'.') {
2167 if( (*dataUtf16>=
'0') && (*dataUtf16<=
'9') )
2168 data_ = data_*10 + (*dataUtf16-
'0');
2184 while(*dataUtf16==MLPI_VALUE_SEPARATOR_UTF16)
2187 if(dataUtf16Next!=NULL)
2188 *dataUtf16Next =
const_cast<WCHAR16*
>(dataUtf16);
2200 template <
typename T>
2205 if(dataUtf16==NULL) {
2208 else if(data==NULL) {
2213 const ULONG dataBuffLen = MLPI_CONVERT_VALUE_TO_WCHAR16_BUFFER_STACK_SIZE;
2214 CHAR dataUtf8[dataBuffLen] =
"";
2215 CHAR* dataUtf8End = NULL;
2218 while(*dataUtf16==MLPI_VALUE_SEPARATOR_UTF16)
2221 wcstombs16(dataUtf8, dataUtf16, MLPI_CONVERT_VALUE_TO_WCHAR16_BUFFER_STACK_SIZE);
2222 dataUtf8[MLPI_CONVERT_VALUE_TO_WCHAR16_BUFFER_STACK_SIZE-1] = 0;
2224 DOUBLE data_ = strtod(dataUtf8, &dataUtf8End);
2226 if(dataUtf8End==&dataUtf8[MLPI_CONVERT_VALUE_TO_WCHAR16_BUFFER_STACK_SIZE-1]) {
2232 if( (*dataUtf8End==0) || (*dataUtf8End==MLPI_VALUE_SEPARATOR_UTF8) )
2239 case sizeof(
FLOAT): *data = (T) data_;
break;
2240 case sizeof(
DOUBLE): *data = (T) data_;
break;
2246 while(*dataUtf8End==MLPI_VALUE_SEPARATOR_UTF8)
2248 if(dataUtf16Next!=NULL)
2249 *dataUtf16Next =
const_cast<WCHAR16*
>(&dataUtf16[dataUtf8End-dataUtf8]);
2261 template <
typename T>
2266 if(dataUtf16==NULL) {
2269 else if(data==NULL) {
2275 ULLONG type = 0,
set = 0, block = 0, si = 0, se = 0;
2278 while(*dataUtf16==MLPI_VALUE_SEPARATOR_UTF16)
2281 mlpiResult =
utilParameterParseIdn(dataUtf16, &address, &type, &
set, &block, &si, &se, dataUtf16Next);
2293 case sizeof(
ULONG): *data = (T)
MLPI_SIDN(type,
set, block, si, se);
break;
2305 template <
typename T>
2310 if(dataUtf16==NULL) {
2313 else if(data==NULL) {
2319 ULLONG type = 0,
set = 0, block = 0, si = 0, se = 0;
2322 while(*dataUtf16==MLPI_VALUE_SEPARATOR_UTF16)
2325 mlpiResult =
utilParameterParseIdn(dataUtf16, &address, &type, &
set, &block, &si, &se, dataUtf16Next);
2339 case sizeof(
ULLONG): *data = (T) (((T)
MLPI_SIDN(type,
set, block, si, se)) | (((
ULLONG) address) << 56));
break;
2350 template <
typename T>
2355 if(dataUtf16==NULL) {
2358 else if(data==NULL) {
2364 while(*dataUtf16==MLPI_VALUE_SEPARATOR_UTF16)
2378 *data = (T) (data_);
#define MLPI_SIDN_TYPE_POSLIMSWITCH
This definition represents the valid type of an N parameter ident.
#define MLPI_S_OK
Return code "everything okay".
unsigned char UCHAR
1 byte unsigned integer
string with 2 bytes per character
invalid or not supported type
#define MLPI_SIDN_SI_MASK
This definition masks the element SI of a parameter ident.
4 byte signed integer array
unsigned long long ULLONG
8 byte unsigned integer
int LONG
4 byte signed integer
#define MLPI_SIDN_SI(sidn)
This macro splits an EIDN SI like <TYPE-SET-BLOCK>.<SI>.<SE>
size_t wcstombs16(char *dst, const WCHAR16 *src, size_t len)
Function translates WCHAR16 characters from the sequence pointed by src to the multibyte equivalent s...
char CHAR
1 byte signed integer
MLPIRESULT utilParameterParseStringToSercosTime(const CHAR *time, const CHAR separator, ULLONG *timeStamp, CHAR **timeNext=NULL)
This function parse a sercos time string (CHAR) and returns a 64-bit sercos time value. Structure of sercos time Bit 63-32: seconds since 1970-01-01, 00:00:00 Nit 31-00: nanoseconds up to 999.999.999.
signed char BOOL8
1 byte boolean
MlpiParameterCommandStatus
This enumeration defines the status of a command execution using mlpiParameterReadCommandStatus.
#define MLPI_SIDN_SET(sidn)
This macro splits an EIDN set like <TYPE-SET-BLOCK>.<SI>.<SE>
unsigned short USHORT
2 byte unsigned integer
2 byte unsigned integer array
size_t mbstowcs16(WCHAR16 *dst, const char *src, size_t len)
Function converts a sequence of multibyte characters to a corresponding sequence of WCHAR16 character...
MLPIRESULT utilParameterParseIdn(const WCHAR16 *idn, ULONG *address, ULLONG *type, ULLONG *set, ULLONG *block, ULLONG *si, ULLONG *se, WCHAR16 **idnNxt=NULL)
This function parses a Sercos IDN string and returns its properties. These can be used to build a bin...
#define MLPI_SIDN_SE(sidn)
This macro splits an EIDN SE like <TYPE-SET-BLOCK>.<SI>.<SE>
#define MLPI_SIDN_TYPE_DRIVE_S
This definition represents the valid type of an S parameter ident.
#define MLPI_SIDN_BLOCK_MASK
This definition masks the element block of a parameter ident.
#define MLPI_E_INVALIDARG
Invalid argument given to method.
short SHORT
2 byte signed integer
ParamWriteProtection utilParameterGetWriteProtectionFromAttribute(const ULONG attribute)
This Function extracts the write protection of a parameter in certain states which is coded in Sercos...
#define MLPI_SIDN_INST(sidn)
This macro splits an EIDN address like <INSTANCE>:<TYPE-SET-BLOCK>.<SI>.<SE>
#define MLPI_SIDN_SET_MASK
This definition masks the element set of a parameter ident.
This class helps to access the data read via the 'mlpiParameterReadEverything' function.
BOOL8 utilParameterGetProcedureCmdFromAttribute(const ULONG attribute)
This Function extracts the 'procedure command' property which is coded in Sercos attribute.
#define MLPI_E_INVALIDSIGNATURE
Invalid signature.
wchar_t WCHAR16
UTF16 string.
unsigned int ULONG
4 byte unsigned integer
8 byte signed integer array
#define MLPI_SUCCEEDED(hr)
Returns true if given error code was successful.
4 byte floating point array
#define MLPI_E_NOTSUPPORTED
The given function is not supported yet.
#define MLPI_SIDN_TYPE_AXIS
This definition represents the valid type of an A parameter ident.
8 byte floating point array
#define MLPI_SIDN_TYPE_PROBE
This definition represents the valid type of an M parameter ident.
#define MLPI_SIDN_TYPE_OSCILLOSCOPE
This definition represents the valid type of an O parameter ident.
#define MLPI_SIDN_TYPE_DRIVE_P
This definition represents the valid type of a P parameter ident.
#define MLPI_E_UNIMPLEMENTED
The given function is not implemented on this specific device.
#define MLPI_SIDN_SE_MASK
This definition masks the element SE of a parameter ident.
4 byte unsigned integer array
Error, command status invalid.
MLPIRESULT utilParameterParseSercosTimeToString(const ULLONG timeStamp, CHAR *time, const ULONG numElements, ULONG *numElementsRet=NULL)
This function parse a 64-bit sercos time value and returns a sercos time string (CHAR). Structure of sercos time Bit 63-32: seconds since 1970-01-01, 00:00:00 Nit 31-00: nanoseconds up to 999.999.999.
WCHAR16 * wcschr16(const WCHAR16 *src, WCHAR16 character)
Function searches a WCHAR16 character in a WCHAR16 string.
#define MLPI_E_LIMIT_MAX
The maximum of a limitation is exceeded.
#define MLPI_SIDN_TYPE_CONTROL
This definition represents the valid type of a C parameter ident.
struct MlpiReadEverything MlpiReadEverything
This structure defines the information returned using mlpiParameterReadEverything.
int wtoi16(const WCHAR16 *src)
Function converts a WCHAR16 string to integer.
MlpiType
This enumeration defines the basic types of as used by the MLPI.
#define MLPI_E_BUFFERTOOSHORT
Given buffer is too short.
2 byte signed integer array
MlpiType utilParameterGetDataTypeFromAttribute(const ULONG attribute)
This Function extracts the data type which is coded in Sercos attribute and translates it the an MLPI...
long long LLONG
8 byte signed integer
WCHAR16 * wcscat16(WCHAR16 *dst, const WCHAR16 *src)
Function appends a WCHAR16 string to another.
float FLOAT
4 byte floating point
SHORT utilParameterGetDecimalPointFromAttribute(const ULONG attribute)
This Function extracts the places after decimal point which is coded in Sercos attribute.
#define MLPI_SIDN_BLOCK(sidn)
This macro splits an EIDN block like <TYPE-SET-BLOCK>.<SI>.<SE>
double DOUBLE
8 byte floating point
#define MLPI_E_SYSTEMERROR
System error during execution.
8 byte unsigned integer array
WCHAR16 * wcscpy16(WCHAR16 *dst, const WCHAR16 *src)
Function copies a WCHAR16 string.
#define PARAM_SERCOS_TIME_STRING_LENGTH
Maximum length of sercos time string.
#define MLPI_SIDN_TYPE_MASK
This definition masks the element type of a parameter ident.
#define MLPI_SIDN_TYPE_KINEMATIC
This definition represents the valid type of a K parameter ident.
MLPIRESULT utilParameterSplitSidn(const ULLONG sidn, ULLONG *idn, ULONG *address)
Some SIDNs contain the address field in the upper byte of the reserved space. Use this function to cu...
#define MLPI_SIDN(type, set, block, si, se)
This macro creates the 64-bit value of an EIDN like <TYPE-SET-BLOCK>.<SI>.<SE> using all elements of ...
int MLPIRESULT
common MLPI-API return value
size_t wcslen16(const WCHAR16 *src)
1 byte unsigned integer array
#define PARAM_MAX_IDN_STRING_LENGTH
Maximum length of parameter ident string.