NFC NDEF library

Dependents:   Nucleo_NFC_Example I2C_NFC_Master Print_Entire_Nucleo_NFC01A1_Memory

Fork of lib_NDEF by Enrico Gregoratto

Committer:
EnricoG
Date:
Mon Dec 15 19:41:36 2014 +0000
Revision:
0:3b093bd0819e
Initial commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
EnricoG 0:3b093bd0819e 1 /**
EnricoG 0:3b093bd0819e 2 ******************************************************************************
EnricoG 0:3b093bd0819e 3 * @file lib_NDEF_Vcard.c
EnricoG 0:3b093bd0819e 4 * @author MMY Application Team
EnricoG 0:3b093bd0819e 5 * @version V1.0.0
EnricoG 0:3b093bd0819e 6 * @date 20-November-2013
EnricoG 0:3b093bd0819e 7 * @brief This file help to manage NDEF file that represent Vcard.
EnricoG 0:3b093bd0819e 8 ******************************************************************************
EnricoG 0:3b093bd0819e 9 * @attention
EnricoG 0:3b093bd0819e 10 *
EnricoG 0:3b093bd0819e 11 * <h2><center>&copy; COPYRIGHT 2014 STMicroelectronics</center></h2>
EnricoG 0:3b093bd0819e 12 *
EnricoG 0:3b093bd0819e 13 * Licensed under MMY-ST Liberty SW License Agreement V2, (the "License");
EnricoG 0:3b093bd0819e 14 * You may not use this file except in compliance with the License.
EnricoG 0:3b093bd0819e 15 * You may obtain a copy of the License at:
EnricoG 0:3b093bd0819e 16 *
EnricoG 0:3b093bd0819e 17 * http://www.st.com/software_license_agreement_liberty_v2
EnricoG 0:3b093bd0819e 18 *
EnricoG 0:3b093bd0819e 19 * Unless required by applicable law or agreed to in writing, software
EnricoG 0:3b093bd0819e 20 * distributed under the License is distributed on an "AS IS" BASIS,
EnricoG 0:3b093bd0819e 21 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
EnricoG 0:3b093bd0819e 22 * See the License for the specific language governing permissions and
EnricoG 0:3b093bd0819e 23 * limitations under the License.
EnricoG 0:3b093bd0819e 24 *
EnricoG 0:3b093bd0819e 25 ******************************************************************************
EnricoG 0:3b093bd0819e 26 */
EnricoG 0:3b093bd0819e 27
EnricoG 0:3b093bd0819e 28 /* Includes ------------------------------------------------------------------*/
EnricoG 0:3b093bd0819e 29 #include "lib_NDEF_Vcard.h"
EnricoG 0:3b093bd0819e 30
EnricoG 0:3b093bd0819e 31 /** @addtogroup NFC_libraries
EnricoG 0:3b093bd0819e 32 * @{
EnricoG 0:3b093bd0819e 33 * @brief <b>This is the library used to manage the content of the TAG (data)
EnricoG 0:3b093bd0819e 34 * But also the specific feature of the tag, for instance
EnricoG 0:3b093bd0819e 35 * password, gpo... </b>
EnricoG 0:3b093bd0819e 36 */
EnricoG 0:3b093bd0819e 37
EnricoG 0:3b093bd0819e 38
EnricoG 0:3b093bd0819e 39 /** @addtogroup libNFC_FORUM
EnricoG 0:3b093bd0819e 40 * @{
EnricoG 0:3b093bd0819e 41 * @brief This part of the library manage data which follow NFC forum organisation.
EnricoG 0:3b093bd0819e 42 */
EnricoG 0:3b093bd0819e 43
EnricoG 0:3b093bd0819e 44 /**
EnricoG 0:3b093bd0819e 45 * @brief This buffer contains the data send/received by TAG
EnricoG 0:3b093bd0819e 46 */
EnricoG 0:3b093bd0819e 47 extern uint8_t NDEF_Buffer [NDEF_MAX_SIZE];
EnricoG 0:3b093bd0819e 48
EnricoG 0:3b093bd0819e 49 /** @defgroup libVcard_Private_Functions
EnricoG 0:3b093bd0819e 50 * @{
EnricoG 0:3b093bd0819e 51 */
EnricoG 0:3b093bd0819e 52
EnricoG 0:3b093bd0819e 53
EnricoG 0:3b093bd0819e 54 static void NDEF_FillVcardStruct( uint8_t* pPayload, uint32_t PayloadSize, char* pKeyWord, uint32_t SizeOfKeyWord, uint8_t* pString);
EnricoG 0:3b093bd0819e 55 static void NDEF_ExtractVcard ( sRecordInfo *pRecordStruct, sVcardInfo *pVcardStruct );
EnricoG 0:3b093bd0819e 56
EnricoG 0:3b093bd0819e 57 /**
EnricoG 0:3b093bd0819e 58 * @brief This fonction fill Vcard structure with information of NDEF message
EnricoG 0:3b093bd0819e 59 * @param pPayload : pointer on the payload data of the NDEF message
EnricoG 0:3b093bd0819e 60 * @param PayloadSize : number of data in the payload
EnricoG 0:3b093bd0819e 61 * @param pKeyWord : pointer on the keyword to look for.
EnricoG 0:3b093bd0819e 62 * @param SizeOfKeyWord : number of byte of the keyword we are looking for
EnricoG 0:3b093bd0819e 63 * @param pString : Pointer on the data string to fill
EnricoG 0:3b093bd0819e 64 * @retval NONE
EnricoG 0:3b093bd0819e 65 */
EnricoG 0:3b093bd0819e 66 static void NDEF_FillVcardStruct( uint8_t* pPayload, uint32_t PayloadSize, char* pKeyWord, uint32_t SizeOfKeyWord, uint8_t* pString)
EnricoG 0:3b093bd0819e 67 {
EnricoG 0:3b093bd0819e 68 uint8_t* pLastByteAdd, *pLook4Word, *pEndString ;
EnricoG 0:3b093bd0819e 69
EnricoG 0:3b093bd0819e 70 /* First charactere force to NULL in case not matching found */
EnricoG 0:3b093bd0819e 71 *pString = 0;
EnricoG 0:3b093bd0819e 72
EnricoG 0:3b093bd0819e 73 /* Interresting information are stored before picture if any */
EnricoG 0:3b093bd0819e 74 /* Moreover picture is not used in this demonstration SW */
EnricoG 0:3b093bd0819e 75 pLastByteAdd = pPayload;
EnricoG 0:3b093bd0819e 76 while( memcmp( pLastByteAdd, JPEG, JPEG_STRING_SIZE) && pLastByteAdd<(pPayload+PayloadSize) )
EnricoG 0:3b093bd0819e 77 {
EnricoG 0:3b093bd0819e 78 pLastByteAdd++;
EnricoG 0:3b093bd0819e 79 }
EnricoG 0:3b093bd0819e 80
EnricoG 0:3b093bd0819e 81 pLook4Word = pPayload;
EnricoG 0:3b093bd0819e 82 while( memcmp( pLook4Word, pKeyWord, SizeOfKeyWord) && pLook4Word<pLastByteAdd )
EnricoG 0:3b093bd0819e 83 {
EnricoG 0:3b093bd0819e 84 pLook4Word++;
EnricoG 0:3b093bd0819e 85 }
EnricoG 0:3b093bd0819e 86
EnricoG 0:3b093bd0819e 87 /* Word found */
EnricoG 0:3b093bd0819e 88 if( pLook4Word != pLastByteAdd)
EnricoG 0:3b093bd0819e 89 {
EnricoG 0:3b093bd0819e 90 pLook4Word += SizeOfKeyWord;
EnricoG 0:3b093bd0819e 91 pEndString = pLook4Word;
EnricoG 0:3b093bd0819e 92 while( memcmp( pEndString, LIMIT, LIMIT_STRING_SIZE) && pEndString<pLastByteAdd )
EnricoG 0:3b093bd0819e 93 {
EnricoG 0:3b093bd0819e 94 pEndString++;
EnricoG 0:3b093bd0819e 95 }
EnricoG 0:3b093bd0819e 96 if( pEndString != pLastByteAdd)
EnricoG 0:3b093bd0819e 97 {
EnricoG 0:3b093bd0819e 98 memcpy( pString, pLook4Word, pEndString-pLook4Word);
EnricoG 0:3b093bd0819e 99 /* add end of string charactere */
EnricoG 0:3b093bd0819e 100 pString += pEndString-pLook4Word;
EnricoG 0:3b093bd0819e 101 *pString = '\0';
EnricoG 0:3b093bd0819e 102 }
EnricoG 0:3b093bd0819e 103 }
EnricoG 0:3b093bd0819e 104 }
EnricoG 0:3b093bd0819e 105
EnricoG 0:3b093bd0819e 106 /**
EnricoG 0:3b093bd0819e 107 * @brief This fonction read the Vcard and store data in a structure
EnricoG 0:3b093bd0819e 108 * @param pRecordStruct : Pointer on the record structure
EnricoG 0:3b093bd0819e 109 * @param pSMSStruct : pointer on the structure to fill
EnricoG 0:3b093bd0819e 110 * @retval NONE
EnricoG 0:3b093bd0819e 111 */
EnricoG 0:3b093bd0819e 112 static void NDEF_ExtractVcard ( sRecordInfo *pRecordStruct, sVcardInfo *pVcardStruct )
EnricoG 0:3b093bd0819e 113 {
EnricoG 0:3b093bd0819e 114 uint32_t PayloadSize;
EnricoG 0:3b093bd0819e 115 uint8_t* pPayload;
EnricoG 0:3b093bd0819e 116
EnricoG 0:3b093bd0819e 117
EnricoG 0:3b093bd0819e 118 PayloadSize = ((uint32_t)(pRecordStruct->PayloadLength3)<<24) | ((uint32_t)(pRecordStruct->PayloadLength2)<<16) |
EnricoG 0:3b093bd0819e 119 ((uint32_t)(pRecordStruct->PayloadLength1)<<8) | pRecordStruct->PayloadLength0;
EnricoG 0:3b093bd0819e 120
EnricoG 0:3b093bd0819e 121 /* Read record header */
EnricoG 0:3b093bd0819e 122 pPayload = (uint8_t*)(pRecordStruct->PayloadBufferAdd);
EnricoG 0:3b093bd0819e 123
EnricoG 0:3b093bd0819e 124 NDEF_FillVcardStruct(pPayload , PayloadSize,VERSION, VERSION_STRING_SIZE, (uint8_t*)(pVcardStruct->Version));
EnricoG 0:3b093bd0819e 125 if( !memcmp(pVcardStruct->Version, VCARD_VERSION_2_1, VCARD_VERSION_2_1_SIZE))
EnricoG 0:3b093bd0819e 126 {
EnricoG 0:3b093bd0819e 127 NDEF_FillVcardStruct(pPayload , PayloadSize,FIRSTNAME, FIRSTNAME_STRING_SIZE, (uint8_t*)(pVcardStruct->FirstName));
EnricoG 0:3b093bd0819e 128 NDEF_FillVcardStruct(pPayload , PayloadSize,TITLE, TITLE_STRING_SIZE, (uint8_t*)(pVcardStruct->Title));
EnricoG 0:3b093bd0819e 129 NDEF_FillVcardStruct(pPayload , PayloadSize,ORG, ORG_STRING_SIZE, (uint8_t*)(pVcardStruct->Org));
EnricoG 0:3b093bd0819e 130 NDEF_FillVcardStruct(pPayload , PayloadSize,HOME_ADDRESS, HOME_ADDRESS_STRING_SIZE, (uint8_t*)(pVcardStruct->HomeAddress));
EnricoG 0:3b093bd0819e 131 NDEF_FillVcardStruct(pPayload , PayloadSize,WORK_ADDRESS, WORK_ADDRESS_STRING_SIZE, (uint8_t*)(pVcardStruct->WorkAddress));
EnricoG 0:3b093bd0819e 132 NDEF_FillVcardStruct(pPayload , PayloadSize,HOME_TEL, HOME_TEL_STRING_SIZE, (uint8_t*)(pVcardStruct->HomeTel));
EnricoG 0:3b093bd0819e 133 NDEF_FillVcardStruct(pPayload , PayloadSize,WORK_TEL, WORK_TEL_STRING_SIZE, (uint8_t*)(pVcardStruct->WorkTel));
EnricoG 0:3b093bd0819e 134 NDEF_FillVcardStruct(pPayload , PayloadSize,CELL_TEL, CELL_TEL_STRING_SIZE, (uint8_t*)(pVcardStruct->CellTel));
EnricoG 0:3b093bd0819e 135 NDEF_FillVcardStruct(pPayload , PayloadSize,HOME_EMAIL, HOME_EMAIL_STRING_SIZE, (uint8_t*)(pVcardStruct->HomeEmail));
EnricoG 0:3b093bd0819e 136 NDEF_FillVcardStruct(pPayload , PayloadSize,WORK_EMAIL, WORK_EMAIL_STRING_SIZE, (uint8_t*)(pVcardStruct->WorkEmail));
EnricoG 0:3b093bd0819e 137 }
EnricoG 0:3b093bd0819e 138 else if( !memcmp(pVcardStruct->Version, VCARD_VERSION_3_0, VCARD_VERSION_3_0_SIZE))
EnricoG 0:3b093bd0819e 139 {
EnricoG 0:3b093bd0819e 140 /* need to be implemented */
EnricoG 0:3b093bd0819e 141 }
EnricoG 0:3b093bd0819e 142 else
EnricoG 0:3b093bd0819e 143 {
EnricoG 0:3b093bd0819e 144 /* maybe new version but not supported in this sw */
EnricoG 0:3b093bd0819e 145 }
EnricoG 0:3b093bd0819e 146
EnricoG 0:3b093bd0819e 147 }
EnricoG 0:3b093bd0819e 148
EnricoG 0:3b093bd0819e 149 /**
EnricoG 0:3b093bd0819e 150 * @}
EnricoG 0:3b093bd0819e 151 */
EnricoG 0:3b093bd0819e 152
EnricoG 0:3b093bd0819e 153 /** @defgroup libVcard_Public_Functions
EnricoG 0:3b093bd0819e 154 * @{
EnricoG 0:3b093bd0819e 155 * @brief This file is used to manage Vcard (stored or loaded in tag)
EnricoG 0:3b093bd0819e 156 */
EnricoG 0:3b093bd0819e 157
EnricoG 0:3b093bd0819e 158 /**
EnricoG 0:3b093bd0819e 159 * @brief This fonction read NDEF and retrieve Vcard information if any
EnricoG 0:3b093bd0819e 160 * @param pRecordStruct : Pointer on the record structure
EnricoG 0:3b093bd0819e 161 * @param pVcardStruct : pointer on the structure to fill
EnricoG 0:3b093bd0819e 162 * @retval SUCCESS : Vcard information from NDEF have been retrieved
EnricoG 0:3b093bd0819e 163 * @retval ERROR : Not able to retrieve Vcard information
EnricoG 0:3b093bd0819e 164 */
EnricoG 0:3b093bd0819e 165 uint16_t NDEF_ReadVcard ( sRecordInfo *pRecordStruct, sVcardInfo *pVcardStruct )
EnricoG 0:3b093bd0819e 166 {
EnricoG 0:3b093bd0819e 167 uint16_t status = ERROR;
EnricoG 0:3b093bd0819e 168
EnricoG 0:3b093bd0819e 169 if( pRecordStruct->NDEF_Type == VCARD_TYPE)
EnricoG 0:3b093bd0819e 170 {
EnricoG 0:3b093bd0819e 171 NDEF_ExtractVcard(pRecordStruct, pVcardStruct );
EnricoG 0:3b093bd0819e 172 status = SUCCESS;
EnricoG 0:3b093bd0819e 173 }
EnricoG 0:3b093bd0819e 174
EnricoG 0:3b093bd0819e 175 return status;
EnricoG 0:3b093bd0819e 176 }
EnricoG 0:3b093bd0819e 177
EnricoG 0:3b093bd0819e 178 /**
EnricoG 0:3b093bd0819e 179 * @brief This fonction write the NDEF file with the Vcard data given in the structure
EnricoG 0:3b093bd0819e 180 * @param pVcardStruct : pointer on structure that contain the Vcard information
EnricoG 0:3b093bd0819e 181 * @retval SUCCESS : the function is succesful
EnricoG 0:3b093bd0819e 182 * @retval ERROR : Not able to store NDEF file inside tag.
EnricoG 0:3b093bd0819e 183 */
EnricoG 0:3b093bd0819e 184 uint16_t NDEF_WriteVcard ( sVcardInfo *pVcardStruct )
EnricoG 0:3b093bd0819e 185 {
EnricoG 0:3b093bd0819e 186 uint16_t status = ERROR;
EnricoG 0:3b093bd0819e 187 uint16_t DataSize;
EnricoG 0:3b093bd0819e 188 uint32_t PayloadSize = 0;
EnricoG 0:3b093bd0819e 189
EnricoG 0:3b093bd0819e 190 /* Vcard Record Header */
EnricoG 0:3b093bd0819e 191 /************************************/
EnricoG 0:3b093bd0819e 192 /* 7 | 6 | 5 | 4 | 3 | 2 1 0 */
EnricoG 0:3b093bd0819e 193 /*----------------------------------*/
EnricoG 0:3b093bd0819e 194 /* MB ME CF SR IL TNF */ /* <---- CF=0, IL=0 and SR=0 TNF=2 NFC Forum Media type*/
EnricoG 0:3b093bd0819e 195 /*----------------------------------*/
EnricoG 0:3b093bd0819e 196 /* TYPE LENGTH */
EnricoG 0:3b093bd0819e 197 /*----------------------------------*/
EnricoG 0:3b093bd0819e 198 /* PAYLOAD LENGTH 3 */
EnricoG 0:3b093bd0819e 199 /*----------------------------------*/
EnricoG 0:3b093bd0819e 200 /* PAYLOAD LENGTH 2 */
EnricoG 0:3b093bd0819e 201 /*----------------------------------*/
EnricoG 0:3b093bd0819e 202 /* PAYLOAD LENGTH 1 */
EnricoG 0:3b093bd0819e 203 /*----------------------------------*/
EnricoG 0:3b093bd0819e 204 /* PAYLOAD LENGTH 0 */
EnricoG 0:3b093bd0819e 205 /*----------------------------------*/
EnricoG 0:3b093bd0819e 206 /* ID LENGTH */ /* <---- Not Used */
EnricoG 0:3b093bd0819e 207 /*----------------------------------*/
EnricoG 0:3b093bd0819e 208 /* TYPE */
EnricoG 0:3b093bd0819e 209 /*----------------------------------*/
EnricoG 0:3b093bd0819e 210 /* ID */ /* <---- Not Used */
EnricoG 0:3b093bd0819e 211 /************************************/
EnricoG 0:3b093bd0819e 212
EnricoG 0:3b093bd0819e 213 /* As we don't have embedded a jpeg encoder/decoder in this firmware */
EnricoG 0:3b093bd0819e 214 /* We have made the choice to manage only string content of the vCard */
EnricoG 0:3b093bd0819e 215 /* For demonstration purpose in order to fill the 8kB of the M24SR */
EnricoG 0:3b093bd0819e 216 /* We have embedded a NDEF vCard in the STM32 to be able to fill M24SR */
EnricoG 0:3b093bd0819e 217
EnricoG 0:3b093bd0819e 218
EnricoG 0:3b093bd0819e 219 /* NDEF file must be written in 2 phases, first phase NDEF size is Null */
EnricoG 0:3b093bd0819e 220 NDEF_Buffer[NDEF_SIZE_OFFSET] = 0x00;
EnricoG 0:3b093bd0819e 221 NDEF_Buffer[NDEF_SIZE_OFFSET+1] = 0x00;
EnricoG 0:3b093bd0819e 222
EnricoG 0:3b093bd0819e 223 /* fill record header */
EnricoG 0:3b093bd0819e 224 NDEF_Buffer[FIRST_RECORD_OFFSET] = 0xC2; /* Record Flag */
EnricoG 0:3b093bd0819e 225 NDEF_Buffer[FIRST_RECORD_OFFSET+1] = VCARD_TYPE_STRING_LENGTH;
EnricoG 0:3b093bd0819e 226 NDEF_Buffer[FIRST_RECORD_OFFSET+2] = 0x00; /* Will be filled at the end when payload size is known */
EnricoG 0:3b093bd0819e 227 NDEF_Buffer[FIRST_RECORD_OFFSET+3] = 0x00;
EnricoG 0:3b093bd0819e 228 NDEF_Buffer[FIRST_RECORD_OFFSET+4] = 0x00;
EnricoG 0:3b093bd0819e 229 NDEF_Buffer[FIRST_RECORD_OFFSET+5] = 0x00;
EnricoG 0:3b093bd0819e 230 memcpy(&NDEF_Buffer[FIRST_RECORD_OFFSET+6], VCARD_TYPE_STRING, VCARD_TYPE_STRING_LENGTH);
EnricoG 0:3b093bd0819e 231
EnricoG 0:3b093bd0819e 232 /* Payload is positionned in the NDEF after record header */
EnricoG 0:3b093bd0819e 233 PayloadSize = FIRST_RECORD_OFFSET+6+VCARD_TYPE_STRING_LENGTH;
EnricoG 0:3b093bd0819e 234
EnricoG 0:3b093bd0819e 235 /* "BEGIN:VCARD\r\n" */
EnricoG 0:3b093bd0819e 236 memcpy(&NDEF_Buffer[PayloadSize], BEGIN, BEGIN_STRING_SIZE);
EnricoG 0:3b093bd0819e 237 PayloadSize += BEGIN_STRING_SIZE;
EnricoG 0:3b093bd0819e 238 memcpy( &NDEF_Buffer[PayloadSize], VCARD,VCARD_STRING_SIZE);
EnricoG 0:3b093bd0819e 239 PayloadSize += VCARD_STRING_SIZE;
EnricoG 0:3b093bd0819e 240 memcpy( &NDEF_Buffer[PayloadSize], LIMIT, LIMIT_STRING_SIZE);
EnricoG 0:3b093bd0819e 241 PayloadSize += LIMIT_STRING_SIZE;
EnricoG 0:3b093bd0819e 242
EnricoG 0:3b093bd0819e 243 /* "VERSION:2.1\r\n" */
EnricoG 0:3b093bd0819e 244 memcpy(&NDEF_Buffer[PayloadSize], VERSION, VERSION_STRING_SIZE);
EnricoG 0:3b093bd0819e 245 PayloadSize += VERSION_STRING_SIZE;
EnricoG 0:3b093bd0819e 246 memcpy( &NDEF_Buffer[PayloadSize], VCARD_VERSION_2_1,VCARD_VERSION_2_1_SIZE);
EnricoG 0:3b093bd0819e 247 PayloadSize += VCARD_VERSION_2_1_SIZE;
EnricoG 0:3b093bd0819e 248 memcpy( &NDEF_Buffer[PayloadSize], LIMIT, LIMIT_STRING_SIZE);
EnricoG 0:3b093bd0819e 249 PayloadSize += LIMIT_STRING_SIZE;
EnricoG 0:3b093bd0819e 250
EnricoG 0:3b093bd0819e 251 /* "FN:\r\n" */
EnricoG 0:3b093bd0819e 252 memcpy(&NDEF_Buffer[PayloadSize], FIRSTNAME, FIRSTNAME_STRING_SIZE);
EnricoG 0:3b093bd0819e 253 PayloadSize += FIRSTNAME_STRING_SIZE;
EnricoG 0:3b093bd0819e 254 memcpy( &NDEF_Buffer[PayloadSize], pVcardStruct->FirstName,strlen(pVcardStruct->FirstName));
EnricoG 0:3b093bd0819e 255 PayloadSize += strlen(pVcardStruct->FirstName);
EnricoG 0:3b093bd0819e 256 memcpy( &NDEF_Buffer[PayloadSize], LIMIT, LIMIT_STRING_SIZE);
EnricoG 0:3b093bd0819e 257 PayloadSize += LIMIT_STRING_SIZE;
EnricoG 0:3b093bd0819e 258
EnricoG 0:3b093bd0819e 259 /* "TITLE:\r\n" */
EnricoG 0:3b093bd0819e 260 memcpy(&NDEF_Buffer[PayloadSize], TITLE,TITLE_STRING_SIZE);
EnricoG 0:3b093bd0819e 261 PayloadSize += TITLE_STRING_SIZE;
EnricoG 0:3b093bd0819e 262 memcpy( &NDEF_Buffer[PayloadSize], pVcardStruct->Title,strlen(pVcardStruct->Title));
EnricoG 0:3b093bd0819e 263 PayloadSize += strlen(pVcardStruct->Title);
EnricoG 0:3b093bd0819e 264 memcpy( &NDEF_Buffer[PayloadSize], LIMIT, LIMIT_STRING_SIZE);
EnricoG 0:3b093bd0819e 265 PayloadSize += LIMIT_STRING_SIZE;
EnricoG 0:3b093bd0819e 266
EnricoG 0:3b093bd0819e 267 /* "ORG:\r\n" */
EnricoG 0:3b093bd0819e 268 memcpy(&NDEF_Buffer[PayloadSize], ORG,ORG_STRING_SIZE);
EnricoG 0:3b093bd0819e 269 PayloadSize += ORG_STRING_SIZE;
EnricoG 0:3b093bd0819e 270 memcpy( &NDEF_Buffer[PayloadSize], pVcardStruct->Org,strlen(pVcardStruct->Org));
EnricoG 0:3b093bd0819e 271 PayloadSize += strlen(pVcardStruct->Org);
EnricoG 0:3b093bd0819e 272 memcpy( &NDEF_Buffer[PayloadSize], LIMIT, LIMIT_STRING_SIZE);
EnricoG 0:3b093bd0819e 273 PayloadSize += LIMIT_STRING_SIZE;
EnricoG 0:3b093bd0819e 274
EnricoG 0:3b093bd0819e 275 /* "ADR;HOME:\r\n" */
EnricoG 0:3b093bd0819e 276 memcpy(&NDEF_Buffer[PayloadSize], HOME_ADDRESS,HOME_ADDRESS_STRING_SIZE);
EnricoG 0:3b093bd0819e 277 PayloadSize += HOME_ADDRESS_STRING_SIZE;
EnricoG 0:3b093bd0819e 278 memcpy( &NDEF_Buffer[PayloadSize], pVcardStruct->HomeAddress,strlen(pVcardStruct->HomeAddress));
EnricoG 0:3b093bd0819e 279 PayloadSize += strlen(pVcardStruct->HomeAddress);
EnricoG 0:3b093bd0819e 280 memcpy( &NDEF_Buffer[PayloadSize], LIMIT, LIMIT_STRING_SIZE);
EnricoG 0:3b093bd0819e 281 PayloadSize += LIMIT_STRING_SIZE;
EnricoG 0:3b093bd0819e 282
EnricoG 0:3b093bd0819e 283 /* "ADR;WORK:\r\n" */
EnricoG 0:3b093bd0819e 284 memcpy(&NDEF_Buffer[PayloadSize], WORK_ADDRESS,WORK_ADDRESS_STRING_SIZE);
EnricoG 0:3b093bd0819e 285 PayloadSize += WORK_ADDRESS_STRING_SIZE;
EnricoG 0:3b093bd0819e 286 memcpy( &NDEF_Buffer[PayloadSize], pVcardStruct->WorkAddress,strlen(pVcardStruct->WorkAddress));
EnricoG 0:3b093bd0819e 287 PayloadSize += strlen(pVcardStruct->WorkAddress);
EnricoG 0:3b093bd0819e 288 memcpy( &NDEF_Buffer[PayloadSize], LIMIT, LIMIT_STRING_SIZE);
EnricoG 0:3b093bd0819e 289 PayloadSize += LIMIT_STRING_SIZE;
EnricoG 0:3b093bd0819e 290
EnricoG 0:3b093bd0819e 291 /* "TEL;HOME:\r\n" */
EnricoG 0:3b093bd0819e 292 memcpy(&NDEF_Buffer[PayloadSize], HOME_TEL, HOME_TEL_STRING_SIZE);
EnricoG 0:3b093bd0819e 293 PayloadSize += HOME_TEL_STRING_SIZE;
EnricoG 0:3b093bd0819e 294 memcpy( &NDEF_Buffer[PayloadSize], pVcardStruct->HomeTel,strlen(pVcardStruct->HomeTel));
EnricoG 0:3b093bd0819e 295 PayloadSize += strlen(pVcardStruct->HomeTel);
EnricoG 0:3b093bd0819e 296 memcpy( &NDEF_Buffer[PayloadSize], LIMIT, LIMIT_STRING_SIZE);
EnricoG 0:3b093bd0819e 297 PayloadSize += LIMIT_STRING_SIZE;
EnricoG 0:3b093bd0819e 298
EnricoG 0:3b093bd0819e 299 /* "TEL;WORK:\r\n" */
EnricoG 0:3b093bd0819e 300 memcpy(&NDEF_Buffer[PayloadSize], WORK_TEL, WORK_TEL_STRING_SIZE);
EnricoG 0:3b093bd0819e 301 PayloadSize += WORK_TEL_STRING_SIZE;
EnricoG 0:3b093bd0819e 302 memcpy( &NDEF_Buffer[PayloadSize], pVcardStruct->WorkTel,strlen(pVcardStruct->WorkTel));
EnricoG 0:3b093bd0819e 303 PayloadSize += strlen(pVcardStruct->WorkTel);
EnricoG 0:3b093bd0819e 304 memcpy( &NDEF_Buffer[PayloadSize], LIMIT, LIMIT_STRING_SIZE);
EnricoG 0:3b093bd0819e 305 PayloadSize += LIMIT_STRING_SIZE;
EnricoG 0:3b093bd0819e 306
EnricoG 0:3b093bd0819e 307 /* "TEL;CELL:\r\n" */
EnricoG 0:3b093bd0819e 308 memcpy(&NDEF_Buffer[PayloadSize], CELL_TEL, CELL_TEL_STRING_SIZE);
EnricoG 0:3b093bd0819e 309 PayloadSize += CELL_TEL_STRING_SIZE;
EnricoG 0:3b093bd0819e 310 memcpy( &NDEF_Buffer[PayloadSize], pVcardStruct->CellTel,strlen(pVcardStruct->CellTel));
EnricoG 0:3b093bd0819e 311 PayloadSize += strlen(pVcardStruct->CellTel);
EnricoG 0:3b093bd0819e 312 memcpy( &NDEF_Buffer[PayloadSize], LIMIT, LIMIT_STRING_SIZE);
EnricoG 0:3b093bd0819e 313 PayloadSize += LIMIT_STRING_SIZE;
EnricoG 0:3b093bd0819e 314
EnricoG 0:3b093bd0819e 315 /* "EMAIL;HOME:\r\n" */
EnricoG 0:3b093bd0819e 316 memcpy(&NDEF_Buffer[PayloadSize], HOME_EMAIL, HOME_EMAIL_STRING_SIZE);
EnricoG 0:3b093bd0819e 317 PayloadSize += HOME_EMAIL_STRING_SIZE;
EnricoG 0:3b093bd0819e 318 memcpy( &NDEF_Buffer[PayloadSize], pVcardStruct->HomeEmail,strlen(pVcardStruct->HomeEmail));
EnricoG 0:3b093bd0819e 319 PayloadSize += strlen(pVcardStruct->HomeEmail);
EnricoG 0:3b093bd0819e 320 memcpy( &NDEF_Buffer[PayloadSize], LIMIT, LIMIT_STRING_SIZE);
EnricoG 0:3b093bd0819e 321 PayloadSize += LIMIT_STRING_SIZE;
EnricoG 0:3b093bd0819e 322
EnricoG 0:3b093bd0819e 323 /* "EMAIL;WORK:\r\n" */
EnricoG 0:3b093bd0819e 324 memcpy(&NDEF_Buffer[PayloadSize], WORK_EMAIL, WORK_EMAIL_STRING_SIZE);
EnricoG 0:3b093bd0819e 325 PayloadSize += WORK_EMAIL_STRING_SIZE;
EnricoG 0:3b093bd0819e 326 memcpy( &NDEF_Buffer[PayloadSize], pVcardStruct->WorkEmail,strlen(pVcardStruct->WorkEmail));
EnricoG 0:3b093bd0819e 327 PayloadSize += strlen(pVcardStruct->WorkEmail);
EnricoG 0:3b093bd0819e 328 memcpy( &NDEF_Buffer[PayloadSize], LIMIT, LIMIT_STRING_SIZE);
EnricoG 0:3b093bd0819e 329 PayloadSize += LIMIT_STRING_SIZE;
EnricoG 0:3b093bd0819e 330
EnricoG 0:3b093bd0819e 331 /* "END:VCARD\r\n" */
EnricoG 0:3b093bd0819e 332 memcpy(&NDEF_Buffer[PayloadSize], END,END_STRING_SIZE);
EnricoG 0:3b093bd0819e 333 PayloadSize += END_STRING_SIZE;
EnricoG 0:3b093bd0819e 334 memcpy( &NDEF_Buffer[PayloadSize], VCARD,VCARD_STRING_SIZE);
EnricoG 0:3b093bd0819e 335 PayloadSize += VCARD_STRING_SIZE;
EnricoG 0:3b093bd0819e 336 memcpy( &NDEF_Buffer[PayloadSize], LIMIT, LIMIT_STRING_SIZE);
EnricoG 0:3b093bd0819e 337 PayloadSize += LIMIT_STRING_SIZE;
EnricoG 0:3b093bd0819e 338
EnricoG 0:3b093bd0819e 339 DataSize = (uint16_t)(PayloadSize); /* Must not count the 2 byte that represent the NDEF size */
EnricoG 0:3b093bd0819e 340 PayloadSize -= FIRST_RECORD_OFFSET+6+VCARD_TYPE_STRING_LENGTH;
EnricoG 0:3b093bd0819e 341
EnricoG 0:3b093bd0819e 342 NDEF_Buffer[FIRST_RECORD_OFFSET+2] = (PayloadSize & 0xFF000000)>>24;
EnricoG 0:3b093bd0819e 343 NDEF_Buffer[FIRST_RECORD_OFFSET+3] = (PayloadSize & 0x00FF0000)>>16;
EnricoG 0:3b093bd0819e 344 NDEF_Buffer[FIRST_RECORD_OFFSET+4] = (PayloadSize & 0x0000FF00)>>8;
EnricoG 0:3b093bd0819e 345 NDEF_Buffer[FIRST_RECORD_OFFSET+5] = (PayloadSize & 0x000000FF);
EnricoG 0:3b093bd0819e 346
EnricoG 0:3b093bd0819e 347
EnricoG 0:3b093bd0819e 348 /* Write NDEF */
EnricoG 0:3b093bd0819e 349 status = WriteData ( 0x00 , DataSize , NDEF_Buffer);
EnricoG 0:3b093bd0819e 350
EnricoG 0:3b093bd0819e 351 /* Write NDEF size to complete*/
EnricoG 0:3b093bd0819e 352 if( status == NDEF_ACTION_COMPLETED)
EnricoG 0:3b093bd0819e 353 {
EnricoG 0:3b093bd0819e 354 DataSize -= 2; /* Must not count the 2 byte that represent the NDEF size */
EnricoG 0:3b093bd0819e 355 NDEF_Buffer[0] = (DataSize & 0xFF00)>>8;
EnricoG 0:3b093bd0819e 356 NDEF_Buffer[1] = (DataSize & 0x00FF);
EnricoG 0:3b093bd0819e 357
EnricoG 0:3b093bd0819e 358 status = WriteData ( 0x00 , 2 , NDEF_Buffer);
EnricoG 0:3b093bd0819e 359 }
EnricoG 0:3b093bd0819e 360
EnricoG 0:3b093bd0819e 361
EnricoG 0:3b093bd0819e 362 if( status == NDEF_ACTION_COMPLETED)
EnricoG 0:3b093bd0819e 363 return SUCCESS;
EnricoG 0:3b093bd0819e 364 else
EnricoG 0:3b093bd0819e 365 return ERROR;
EnricoG 0:3b093bd0819e 366 }
EnricoG 0:3b093bd0819e 367
EnricoG 0:3b093bd0819e 368
EnricoG 0:3b093bd0819e 369 /**
EnricoG 0:3b093bd0819e 370 * @}
EnricoG 0:3b093bd0819e 371 */
EnricoG 0:3b093bd0819e 372
EnricoG 0:3b093bd0819e 373 /**
EnricoG 0:3b093bd0819e 374 * @}
EnricoG 0:3b093bd0819e 375 */
EnricoG 0:3b093bd0819e 376
EnricoG 0:3b093bd0819e 377 /**
EnricoG 0:3b093bd0819e 378 * @}
EnricoG 0:3b093bd0819e 379 */
EnricoG 0:3b093bd0819e 380
EnricoG 0:3b093bd0819e 381 /******************* (C) COPYRIGHT 2013 STMicroelectronics *****END OF FILE****/
EnricoG 0:3b093bd0819e 382
EnricoG 0:3b093bd0819e 383
EnricoG 0:3b093bd0819e 384