FreeCalypso > hg > fc-magnetite
view src/aci2/aci/cmh_phbf.c @ 636:57e67ca2e1cb
pcmdata.c: default +CGMI to "FreeCalypso" and +CGMM to model
The present change has no effect whatsoever on Falconia-made and Openmoko-made
devices on which /pcm/CGMI and /pcm/CGMM files have been programmed in FFS
with sensible ID strings by the respective factories, but what should AT+CGMI
and AT+CGMM queries return when the device is a Huawei GTM900 or Tango modem
that has been converted to FreeCalypso with a firmware change? Before the
present change they would return compiled-in defaults of "<manufacturer>" and
"<model>", respectively; with the present change the firmware will self-identify
as "FreeCalypso GTM900-FC" or "FreeCalypso Tango" on the two respective targets.
This firmware identification will become important if someone incorporates an
FC-converted GTM900 or Tango modem into a ZeroPhone-style smartphone where some
high-level software like ofono will be talking to the modem and will need to
properly identify this modem as FreeCalypso, as opposed to some other AT command
modem flavor with different quirks.
In technical terms, the compiled-in default for the AT+CGMI query (which will
always be overridden by the /pcm/CGMI file in FFS if one is present) is now
"FreeCalypso" in all configs on all targets; the compiled-in default for the
AT+CGMM query (likewise always overridden by /pcm/CGMM if present) is
"GTM900-FC" if CONFIG_TARGET_GTM900 or "Tango" if CONFIG_TARGET_TANGO or the
original default of "<model>" otherwise.
| author | Mychaela Falconia <falcon@freecalypso.org> |
|---|---|
| date | Sun, 19 Jan 2020 20:14:58 +0000 |
| parents | 93999a60b835 |
| children |
line wrap: on
line source
/* +----------------------------------------------------------------------------- | Project : GSM-PS (6147) | Modul : CMH_PHBF +----------------------------------------------------------------------------- | Copyright 2002 Texas Instruments Berlin, AG | All rights reserved. | | This file is confidential and a trade secret of Texas | Instruments Berlin, AG | The receipt of or possession of this file does not convey | any rights to reproduce or disclose its contents or to | manufacture, use, or sell anything it may describe, in | whole, or in part, without the specific written consent of | Texas Instruments Berlin, AG. +----------------------------------------------------------------------------- | Purpose : This module defines the functions used by the command | handler for the phonebook management. +----------------------------------------------------------------------------- */ #ifndef CMH_PHBF_C #define CMH_PHBF_C #endif #include "aci_all.h" /*==== INCLUDES ===================================================*/ #include "aci_cmh.h" #include "ati_cmd.h" #include "aci_cmd.h" #ifdef FAX_AND_DATA #include "aci_fd.h" #endif /* of #ifdef FAX_AND_DATA */ #include "aci.h" #include "psa.h" #include "phb.h" #include "cmh.h" #include "cmh_phb.h" /*==== CONSTANTS ==================================================*/ #define PHB_CMH_INVALID_TAG_ENTRY 0xFF /* fill up a tag */ #define PHB_CMH_INVALID_BCD_ENTRY 0xF /* fill up a BCD number */ #define PHB_CMH_YEAR_INVLD (255) /* invalid year */ #define PHB_CMH_MONTH_INVLD (255) /* invalid month */ #define PHB_CMH_DAY_INVLD (255) /* invalid day */ #define PHB_CMH_HOUR_INVLD (255) /* invalid hour */ #define PHB_CMH_MINUTE_INVLD (255) /* invalid minute */ #define PHB_CMH_SECOND_INVLD (255) /* invalid second */ /*==== TYPES ======================================================*/ /*==== EXPORT =====================================================*/ /*==== VARIABLES ==================================================*/ /*==== FUNCTIONS ==================================================*/ /* +-------------------------------------------------------------------+ | PROJECT : GSM-PS (6147) MODULE : CMH_PHBF | | STATE : code ROUTINE : cmhPHB_rplcIntnl | +-------------------------------------------------------------------+ PURPOSE : */ GLOBAL BOOL cmhPHB_rplcIntnl ( CHAR* inNumber, CHAR* outNumber, UBYTE inCnt ) { USHORT inIdx = 0; USHORT outIdx = 0; UBYTE actCnt = 0; BOOL international = FALSE; while ( inNumber[inIdx] NEQ '\0' ) { /* *--------------------------------------------------------------- * international indicator "+" *--------------------------------------------------------------- */ if ( inNumber[inIdx] EQ '+' AND inNumber[inIdx-1] EQ '*' ) { if ( actCnt EQ inCnt OR inCnt EQ 0xFF ) { international = TRUE; } else { outNumber[outIdx++] = inNumber[inIdx]; } } /* PATCH LE 12.05.00 * 00 is used in china as national number * checked against competitor phone * now ACI has the same behaviour */ /* *--------------------------------------------------------------- * international indicator "00" *--------------------------------------------------------------- */ /* else if ( inNumber[inIdx+1] EQ '0' AND inNumber[inIdx] EQ '0' AND inNumber[inIdx-1] EQ '*' ) { if ( actCnt EQ inCnt OR inCnt EQ 0xFF ) { international = TRUE; inIdx++; } else { outNumber[outIdx++] = inNumber[inIdx++]; outNumber[outIdx++] = inNumber[inIdx]; } } */ /* END PATCH LE 12.05.00 */ /* *--------------------------------------------------------------- * national indicator *--------------------------------------------------------------- */ else { if ( inNumber[inIdx] EQ '*' ) { actCnt++; } outNumber[outIdx++] = inNumber[inIdx]; } inIdx++; } outNumber[outIdx] = '\0'; return international; } /* +-------------------------------------------------------------------+ | PROJECT : GSM-PS (6147) MODULE : CMH_PHBF | | STATE : code ROUTINE : cmhPHB_cvtPhbType | +-------------------------------------------------------------------+ PURPOSE : This function is used to convert the type of phonebook used by ACI to the type of phonebook used by phonebook management. */ GLOBAL BOOL cmhPHB_cvtPhbType ( T_ACI_PB_STOR inMem, T_PHB_TYPE* outMem ) { switch ( inMem ) { case ( PB_STOR_Fd ): *outMem = FDN; break; case ( PB_STOR_Ld ): *outMem = LDN; break; case ( PB_STOR_Ed ): *outMem = ECC; break; case ( PB_STOR_Ad ): *outMem = ADN; break; case ( PB_STOR_Bd ): *outMem = BDN; break; case ( PB_STOR_Lr ): *outMem = LRN; break; case ( PB_STOR_Sd ): *outMem = SDN; break; case ( PB_STOR_Lm ): *outMem = LMN; break; case ( PB_STOR_Ud ): *outMem = UPN; break; case ( PB_STOR_Af ): /* Not supported anymore */ default: return ( FALSE ); } return ( TRUE ); } /* +-------------------------------------------------------------------+ | PROJECT : GSM-PS (6147) MODULE : CMH_PHBF | | STATE : code ROUTINE : cmhPHB_cvtPhbPsaType | +-------------------------------------------------------------------+ PURPOSE : This function is used to convert the type of phonebook used by phonebook management to the type of phonebook used by ACI. */ GLOBAL BOOL cmhPHB_cvtPhbPsaType ( T_PHB_TYPE inMem, T_ACI_PB_STOR* outMem ) { switch ( inMem ) { case ( FDN ): *outMem = PB_STOR_Fd; break; case ( LDN ): *outMem = PB_STOR_Ld; break; case ( ECC ): *outMem = PB_STOR_Ed; break; case ( ADN ): *outMem = PB_STOR_Ad; break; case ( BDN ): *outMem = PB_STOR_Bd; break; case ( LRN ): *outMem = PB_STOR_Lr; break; case ( SDN ): *outMem = PB_STOR_Sd; break; case ( LMN ): *outMem = PB_STOR_Lm; break; case ( UPN ): *outMem = PB_STOR_Ud; break; default: *outMem = PB_STOR_NotPresent; return ( FALSE ); } return ( TRUE ); } /* +--------------------------------------------------------------------+ | PROJECT : GSM-PS (6147) MODULE : CMH_PHBF | | STATE : code ROUTINE : cmhPHB_toaMrg | +--------------------------------------------------------------------+ PURPOSE : This function is used to build the type of address octet from T_ACI_TOA structure. */ GLOBAL void cmhPHB_toaMrg ( T_ACI_TOA* type, UBYTE* octet ) { *octet = ( ( ( type -> ton << 4 ) & 0xF0 ) + ( type -> npi & 0x0F ) ) | 0x80; } /* +--------------------------------------------------------------------+ | PROJECT : GSM-PS (6147) MODULE : CMH_PHBF | | STATE : code ROUTINE : cmhPHB_toaDmrg | +--------------------------------------------------------------------+ PURPOSE : This function is used to build the T_ACI_TOA structure from the type of address octet. */ GLOBAL void cmhPHB_toaDmrg ( UBYTE octet, T_ACI_TOA* type ) { if ( octet EQ 0xFF ) { type -> ton = TON_NotPresent; type -> npi = NPI_NotPresent; } else { type -> ton = ( octet & 0x70 ) >> 4; type -> npi = octet & 0x0F; } } /* +--------------------------------------------------------------------+ | PROJECT : GSM-PS (6147) MODULE : CMH_PHBF | | STATE : code ROUTINE : cmhPHB_getAdrStr | +--------------------------------------------------------------------+ PURPOSE : This function is used to convert the phone number in BCD to the phone number as a string. BCD Note: Two digits are stored in one byte. +-------+-------+-------+-------+ BCD: | 1 - 0 | 3 - 2 | F - 4 | F - F | +-------+-------+-------+-------+ STRING: "01234" */ GLOBAL CHAR cmhPHB_convertBCD2char( UBYTE bcd ) { switch ( bcd ) { case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7: case 8: case 9: return (bcd + '0'); case 0x0a: return ('*'); case 0x0b: return ('#'); case 0x0c: return (PHB_DIAL_PAUSE); /* 'P' */ case 0x0d: return (PHB_DIAL_WAIT); /* 'W' */ case 0x0e: return (PHB_EXP_DIGIT); /* 'E' */ default: return ('\0'); } } GLOBAL UBYTE cmhPHB_getAdrStr ( CHAR* pStr, UBYTE maxIdx, const UBYTE* pBcd, UBYTE numDigits ) { BOOL highNibble = FALSE; UBYTE bcdIdx = 0; UBYTE strIdx = 0; UBYTE bcd; char digit; BOOL ignore_next = FALSE; while ( bcdIdx < numDigits AND strIdx < maxIdx ) { if ( highNibble ) { bcd = ( pBcd[bcdIdx] & 0xF0 ) >> 4; bcdIdx++; } else { bcd = pBcd[bcdIdx] & 0x0F; } highNibble = ! highNibble; if(bcd EQ PHB_CMH_INVALID_BCD_ENTRY) { break; } digit = cmhPHB_convertBCD2char( bcd ); if (ignore_next EQ TRUE) { ; /* skip the digit following on an extension flag since we do not support it */ ignore_next = FALSE; /* reset flag */ } else if (digit EQ PHB_EXP_DIGIT) { ignore_next = TRUE; /* we currently do not support Expansion Digit so skip next digit */ } else { pStr[strIdx++] = cmhPHB_convertBCD2char( bcd ); /* normal and supported digit */ } } pStr[strIdx] = '\0'; return ( strIdx ); } /* +--------------------------------------------------------------------+ | PROJECT : GSM-PS (6147) MODULE : CMH_PHBF | | STATE : code ROUTINE : cmhPHB_getAdrBcd | +--------------------------------------------------------------------+ PURPOSE : This function is used to convert the phone number as a string to the phone number in BCD. STRING: "01234" BCD Note: Two digits are stored in one byte. +-------+-------+-------+-------+ BCD: | 1 - 0 | 3 - 2 | F - 4 | F - F | +-------+-------+-------+-------+ */ GLOBAL void cmhPHB_getAdrBcd ( UBYTE* pBcd, UBYTE* pNumDigits, UBYTE maxDigits, CHAR* pStr ) { BOOL highNibble = FALSE; UBYTE bcdIdx = 0; UBYTE strIdx; SHORT restLen; UBYTE bcd; for(strIdx = 0; bcdIdx < maxDigits AND pStr[strIdx] NEQ '\0'; strIdx++) { switch ( pStr[strIdx] ) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': bcd = pStr[strIdx] - '0'; break; case '*': bcd = 0x0a; break; case '#': bcd = 0x0b; break; case 'p': case 'P': bcd = 0x0c; break; case 'w': case 'W': bcd = 0x0d; break; case 'E': bcd = 0x0e; break; default: continue; } if ( highNibble ) { pBcd[bcdIdx] += ( bcd << 4 ); bcdIdx++; } else pBcd[bcdIdx] = bcd; highNibble = ! highNibble; } /* *----------------------------------------------------------------- * The last byte of the phone number is filled up with 'F' if * necessary *----------------------------------------------------------------- */ if ( highNibble ) { pBcd[bcdIdx] += ( PHB_CMH_INVALID_BCD_ENTRY << 4 ); bcdIdx++; } *pNumDigits = bcdIdx; /* *----------------------------------------------------------------- * The rest of the phone number is filled up with 'FF' *----------------------------------------------------------------- */ restLen = maxDigits - bcdIdx; if ( restLen > 0 ) memset ( &pBcd[bcdIdx], (PHB_CMH_INVALID_BCD_ENTRY << 4) + PHB_CMH_INVALID_BCD_ENTRY, restLen ); } /* +--------------------------------------------------------------------+ | PROJECT : GSM-PS (6147) MODULE : CMH_PHBF | | STATE : code ROUTINE : cmhPHB_cpyRecEntr | +--------------------------------------------------------------------+ PURPOSE : This function is used to copy the relevant data from the T_PHB_RECORD structure to the T_ACI_PB_ENTR structure. */ GLOBAL void cmhPHB_cpyRecEntr ( T_ACI_PB_ENTR* entry, #ifdef TI_PS_FFS_PHB T_PHB_TYPE book, #endif const T_PHB_RECORD* record ) { #ifdef TI_PS_FFS_PHB entry -> index = record->phy_recno; #else entry -> index = ( SHORT ) record -> index; #endif cmhPHB_getAdrStr ( entry -> number, MAX_PHB_NUM_LEN - 1, record -> number, record -> len ); cmhPHB_toaDmrg ( record -> ton_npi, &entry -> type ); cmhPHB_getMfwTagNt ( record -> tag, record -> tag_len, entry -> text.data, &entry -> text.len ); entry -> text.cs = CS_Sim; #ifdef TI_PS_FFS_PHB cmhPHB_cvtPhbPsaType ( book, &entry -> book ); #else cmhPHB_cvtPhbPsaType ( record -> book, &entry -> book ); #endif cmhPHB_cpyPhbDateTime ( record, &entry -> dateTime ); } /* +--------------------------------------------------------------------+ | PROJECT : GSM-PS (6147) MODULE : CMH_PHBF | | STATE : code ROUTINE : cmhPHB_invldEntr | +--------------------------------------------------------------------+ PURPOSE : This function is used to invalidate the elements of a T_ACI_PB_ENTR structure. */ GLOBAL void cmhPHB_invldEntr ( T_ACI_PB_ENTR* entry ) { entry -> index = ACI_NumParmNotPresent; entry -> number[0] = '\0'; entry -> type.ton = TON_Unknown; entry -> type.npi = NPI_IsdnTelephony; entry -> text.len = 0; entry -> book = PB_STOR_NotPresent; cmhPHB_invldCmhDateTime ( &entry -> dateTime); } /* +--------------------------------------------------------------------+ | PROJECT : GSM-PS (6147) MODULE : CMH_PHBF | | STATE : code ROUTINE : cmhPHB_getTagNt | +--------------------------------------------------------------------+ PURPOSE : This function converts the actual tag in the format used when storing it on the SIM into a null terminated string. */ GLOBAL void cmhPHB_getTagNt ( UBYTE* inTag, UBYTE maxInLen, CHAR* outTag, UBYTE maxOutLen ) { UBYTE i = 0; while ( i < maxOutLen - 1 AND i < maxInLen AND inTag[i] NEQ PHB_CMH_INVALID_TAG_ENTRY ) { /* *----------------------------------------------------------------- * Convert from default GSM to internal GSM alphabet *----------------------------------------------------------------- */ outTag[i] = ( CHAR ) inTag[i] | 0x80; i++; } outTag[i] = '\0'; } /* +--------------------------------------------------------------------+ | PROJECT : GSM-PS (6147) MODULE : CMH_PHBF | | STATE : code ROUTINE : cmhPHB_getMfwTagNt | +--------------------------------------------------------------------+ PURPOSE : This function copy the actual tag . */ GLOBAL void cmhPHB_getMfwTagNt ( const UBYTE* inTag, UBYTE maxInLen, UBYTE* outTag, UBYTE* maxOutLen ) { UBYTE i = 0; UBYTE len; if(maxInLen EQ 0) { memset(outTag, 0, MAX_ALPHA_LEN); /* we need to set out tag to 0 to prevent to be recognized by UCS2 decoder */ *maxOutLen = 0; return; } len = pb_get_entry_len(inTag, maxInLen); if (len >= MAX_ALPHA_LEN) { len = MAX_ALPHA_LEN; } memcpy(outTag, inTag, len); *maxOutLen = len; } /* +--------------------------------------------------------------------+ | PROJECT : GSM-PS (6147) MODULE : CMH_PHBF | | STATE : code ROUTINE : cmhPHB_getTagSim | +--------------------------------------------------------------------+ PURPOSE : This function converts the actual tag as a null terminated string in the format used when storing it on the SIM. */ GLOBAL void cmhPHB_getTagSim ( T_ACI_PB_TEXT *inTag, UBYTE *outTag, UBYTE maxOutLen ) { UBYTE inLen = inTag->len; UBYTE i = MINIMUM ( maxOutLen, inLen); SHORT restLen = maxOutLen - inLen; UBYTE j; /* *----------------------------------------------------------------- * Convert from internal GSM to default GSM alphabet *----------------------------------------------------------------- */ for ( j = 0; j < i; j++ ) outTag[j] = inTag->data[j] & 0x7F; if ( restLen > 0 ) memset ( &outTag[i], PHB_CMH_INVALID_TAG_ENTRY, restLen); } /* +--------------------------------------------------------------------+ | PROJECT : GSM-PS (6147) MODULE : CMH_PHBF | | STATE : code ROUTINE : cmhPHB_getMfwTagSim | +--------------------------------------------------------------------+ PURPOSE : This function converts the actual tag string in the format used when storing it on the SIM. */ GLOBAL void cmhPHB_getMfwTagSim ( T_ACI_PB_TEXT* inTag, UBYTE* outTag, UBYTE* outTagLen, UBYTE maxOutLen ) { UBYTE i = MINIMUM ( maxOutLen, inTag->len); SHORT restLen = maxOutLen - inTag->len; UBYTE j; /* *----------------------------------------------------------------- * Convert from internal GSM to default GSM alphabet *----------------------------------------------------------------- */ for ( j = 0; j < i; j++ ) outTag[j] = inTag->data[j]; *outTagLen = i; if ( restLen > 0 ) memset ( &outTag[i], PHB_CMH_INVALID_TAG_ENTRY, restLen); } /* +-------------------------------------------------------------------+ | PROJECT : GSM-PS (6147) MODULE : CMH_PHBF | | STATE : code ROUTINE : cmhPHB_invldPhbDateTime | +-------------------------------------------------------------------+ PURPOSE : This function is used to invalidate the date and time of a phonebook entry. */ GLOBAL void cmhPHB_invldPhbDateTime ( T_PHB_RECORD* record ) { #ifdef TI_PS_FFS_PHB record->v_time = FALSE; /* Backward compatibility. Setting v_time to FALSE would be sufficient */ record->time.year = PHB_CMH_YEAR_INVLD; record->time.month = PHB_CMH_MONTH_INVLD; record->time.day = PHB_CMH_DAY_INVLD; record->time.hour = PHB_CMH_HOUR_INVLD; record->time.minute = PHB_CMH_MINUTE_INVLD; record->time.second = PHB_CMH_SECOND_INVLD; #else record -> year = PHB_CMH_YEAR_INVLD; record -> month = PHB_CMH_MONTH_INVLD; record -> day = PHB_CMH_DAY_INVLD; record -> hour = PHB_CMH_HOUR_INVLD; record -> minute = PHB_CMH_MINUTE_INVLD; record -> second = PHB_CMH_SECOND_INVLD; #endif } /* +-------------------------------------------------------------------+ | PROJECT : GSM-PS (6147) MODULE : CMH_PHBF | | STATE : code ROUTINE : cmhPHB_invldCmhDateTime | +-------------------------------------------------------------------+ PURPOSE : This function is used to invalidate the date and time of a phonebook entry. */ GLOBAL void cmhPHB_invldCmhDateTime ( T_ACI_VP_ABS* dateTime ) { dateTime -> year [0] = PHB_CMH_INVALID_BCD_ENTRY; dateTime -> year [1] = PHB_CMH_INVALID_BCD_ENTRY; dateTime -> month [0] = PHB_CMH_INVALID_BCD_ENTRY; dateTime -> month [1] = PHB_CMH_INVALID_BCD_ENTRY; dateTime -> day [0] = PHB_CMH_INVALID_BCD_ENTRY; dateTime -> day [1] = PHB_CMH_INVALID_BCD_ENTRY; dateTime -> hour [0] = PHB_CMH_INVALID_BCD_ENTRY; dateTime -> hour [1] = PHB_CMH_INVALID_BCD_ENTRY; dateTime -> minute[0] = PHB_CMH_INVALID_BCD_ENTRY; dateTime -> minute[1] = PHB_CMH_INVALID_BCD_ENTRY; dateTime -> second[0] = PHB_CMH_INVALID_BCD_ENTRY; dateTime -> second[1] = PHB_CMH_INVALID_BCD_ENTRY; } /* +-------------------------------------------------------------------+ | PROJECT : GSM-PS (6147) MODULE : CMH_PHBF | | STATE : code ROUTINE : cmhPHB_cpyCmhDateTime | +-------------------------------------------------------------------+ PURPOSE : This function is used to convert the date and time used within the command handler to the format used in the phonebook management. */ GLOBAL void cmhPHB_cpyCmhDateTime ( const T_ACI_VP_ABS* dateTime, T_PHB_RECORD* record ) { #ifdef TI_PS_FFS_PHB record->time.year = (UBYTE)(dateTime -> year [0] << 4) + dateTime -> year [1]; record->time.month = (UBYTE)(dateTime -> month [0] << 4) + dateTime -> month [1]; record->time.day = (UBYTE)(dateTime -> day [0] << 4) + dateTime -> day [1]; record->time.hour = (UBYTE)(dateTime -> hour [0] << 4) + dateTime -> hour [1]; record->time.minute = (UBYTE)(dateTime -> minute[0] << 4) + dateTime -> minute[1]; record->time.second = (UBYTE)(dateTime -> second[0] << 4) + dateTime -> second[1]; record->v_time = (record->time.year NEQ 0xff); #else record -> year = (UBYTE)(dateTime -> year [0] << 4) + dateTime -> year [1]; record -> month = (UBYTE)(dateTime -> month [0] << 4) + dateTime -> month [1]; record -> day = (UBYTE)(dateTime -> day [0] << 4) + dateTime -> day [1]; record -> hour = (UBYTE)(dateTime -> hour [0] << 4) + dateTime -> hour [1]; record -> minute = (UBYTE)(dateTime -> minute[0] << 4) + dateTime -> minute[1]; record -> second = (UBYTE)(dateTime -> second[0] << 4) + dateTime -> second[1]; #endif } /* +-------------------------------------------------------------------+ | PROJECT : GSM-PS (6147) MODULE : CMH_PHBF | | STATE : code ROUTINE : cmhPHB_cpyPhbDateTime | +-------------------------------------------------------------------+ PURPOSE : This function is used to convert the date and time used within the phonebook management to the format used in the command handler. */ GLOBAL void cmhPHB_cpyPhbDateTime ( const T_PHB_RECORD* record, T_ACI_VP_ABS* dateTime ) { #ifdef TI_PS_FFS_PHB dateTime -> year [0] = ( record->time.year ) >> 4; dateTime -> year [1] = record->time.year & 0x0F; dateTime -> month [0] = ( record->time.month ) >> 4; dateTime -> month [1] = record->time.month & 0x0F; dateTime -> day [0] = ( record->time.day ) >> 4; dateTime -> day [1] = record->time.day & 0x0F; dateTime -> hour [0] = ( record->time.hour ) >> 4; dateTime -> hour [1] = record->time.hour & 0x0F; dateTime -> minute[0] = ( record->time.minute ) >> 4; dateTime -> minute[1] = record->time.minute & 0x0F; dateTime -> second[0] = ( record->time.second ) >> 4; dateTime -> second[1] = record->time.second & 0x0F; #else dateTime -> year [0] = ( record -> year ) >> 4; dateTime -> year [1] = record -> year & 0x0F; dateTime -> month [0] = ( record -> month ) >> 4; dateTime -> month [1] = record -> month & 0x0F; dateTime -> day [0] = ( record -> day ) >> 4; dateTime -> day [1] = record -> day & 0x0F; dateTime -> hour [0] = ( record -> hour ) >> 4; dateTime -> hour [1] = record -> hour & 0x0F; dateTime -> minute[0] = ( record -> minute ) >> 4; dateTime -> minute[1] = record -> minute & 0x0F; dateTime -> second[0] = ( record -> second ) >> 4; dateTime -> second[1] = record -> second & 0x0F; #endif } /*==== EOF ========================================================*/
