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_SMS.c
EnricoG 0:3b093bd0819e 4 * @author MMY Application Team
EnricoG 0:3b093bd0819e 5 * @version V1.0.0
EnricoG 0:3b093bd0819e 6 * @date 19-March-2014
EnricoG 0:3b093bd0819e 7 * @brief This file help to manage NDEF file that represent SMS.
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_SMS.h"
EnricoG 0:3b093bd0819e 30
EnricoG 0:3b093bd0819e 31
EnricoG 0:3b093bd0819e 32 /** @addtogroup NFC_libraries
EnricoG 0:3b093bd0819e 33 * @{
EnricoG 0:3b093bd0819e 34 * @brief <b>This is the library used to manage the content of the TAG (data)
EnricoG 0:3b093bd0819e 35 * But also the specific feature of the tag, for instance
EnricoG 0:3b093bd0819e 36 * password, gpo... </b>
EnricoG 0:3b093bd0819e 37 */
EnricoG 0:3b093bd0819e 38
EnricoG 0:3b093bd0819e 39
EnricoG 0:3b093bd0819e 40 /** @addtogroup libNFC_FORUM
EnricoG 0:3b093bd0819e 41 * @{
EnricoG 0:3b093bd0819e 42 * @brief This part of the library manage data which follow NFC forum organisation.
EnricoG 0:3b093bd0819e 43 */
EnricoG 0:3b093bd0819e 44
EnricoG 0:3b093bd0819e 45 /**
EnricoG 0:3b093bd0819e 46 * @brief This buffer contains the data send/received by TAG
EnricoG 0:3b093bd0819e 47 */
EnricoG 0:3b093bd0819e 48 extern uint8_t NDEF_Buffer [NDEF_MAX_SIZE];
EnricoG 0:3b093bd0819e 49
EnricoG 0:3b093bd0819e 50 /** @defgroup libSMS_Private_Functions
EnricoG 0:3b093bd0819e 51 * @{
EnricoG 0:3b093bd0819e 52 */
EnricoG 0:3b093bd0819e 53
EnricoG 0:3b093bd0819e 54 static void NDEF_FillSMSStruct( uint8_t* pPayload, uint32_t PayloadSize, sSMSInfo *pSMSStruct);
EnricoG 0:3b093bd0819e 55 static void NDEF_ReadURI_SMS ( sRecordInfo *pRecordStruct, sSMSInfo *pSMSStruct );
EnricoG 0:3b093bd0819e 56
EnricoG 0:3b093bd0819e 57 /**
EnricoG 0:3b093bd0819e 58 * @brief This fonction fill SMS 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 pSMSStruct : pointer on the structure to fill
EnricoG 0:3b093bd0819e 62 * @retval NONE
EnricoG 0:3b093bd0819e 63 */
EnricoG 0:3b093bd0819e 64 static void NDEF_FillSMSStruct( uint8_t* pPayload, uint32_t PayloadSize, sSMSInfo *pSMSStruct)
EnricoG 0:3b093bd0819e 65 {
EnricoG 0:3b093bd0819e 66 uint8_t* pLastByteAdd, *pLook4Word, *pEndString ;
EnricoG 0:3b093bd0819e 67 char* pKeyWord;
EnricoG 0:3b093bd0819e 68 uint32_t SizeOfKeyWord;
EnricoG 0:3b093bd0819e 69
EnricoG 0:3b093bd0819e 70 pKeyWord = SMS_TYPE_STRING;
EnricoG 0:3b093bd0819e 71 SizeOfKeyWord = SMS_TYPE_STRING_LENGTH;
EnricoG 0:3b093bd0819e 72
EnricoG 0:3b093bd0819e 73 /* First charactere force to NULL in case not matching found */
EnricoG 0:3b093bd0819e 74 *pSMSStruct->PhoneNumber = 0;
EnricoG 0:3b093bd0819e 75 *pSMSStruct->Message = 0;
EnricoG 0:3b093bd0819e 76
EnricoG 0:3b093bd0819e 77 /* Interresting information are stored before picture if any */
EnricoG 0:3b093bd0819e 78 /* Moreover picture is not used in this demonstration SW */
EnricoG 0:3b093bd0819e 79 pLastByteAdd = (uint8_t*)(pPayload + PayloadSize);
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 pEndString = pLook4Word;
EnricoG 0:3b093bd0819e 88 /* Retrieve phone number */
EnricoG 0:3b093bd0819e 89 if( pLook4Word != pLastByteAdd)
EnricoG 0:3b093bd0819e 90 {
EnricoG 0:3b093bd0819e 91 pLook4Word += SizeOfKeyWord;
EnricoG 0:3b093bd0819e 92 while( memcmp( pEndString, URI_FIRST_DATA_END, URI_FIRST_DATA_END_LENGTH) && 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( pSMSStruct->PhoneNumber, pLook4Word, pEndString-pLook4Word);
EnricoG 0:3b093bd0819e 99 /* add end of string charactere */
EnricoG 0:3b093bd0819e 100 pSMSStruct->PhoneNumber[pEndString-pLook4Word] = 0;
EnricoG 0:3b093bd0819e 101 }
EnricoG 0:3b093bd0819e 102 }
EnricoG 0:3b093bd0819e 103 pEndString += URI_FIRST_DATA_END_LENGTH;
EnricoG 0:3b093bd0819e 104 pLook4Word = pEndString;
EnricoG 0:3b093bd0819e 105
EnricoG 0:3b093bd0819e 106 /* check if e-mail subject is present */
EnricoG 0:3b093bd0819e 107 if(!memcmp( pLook4Word, MESSAGE_BEGIN_STRING, MESSAGE_BEGIN_STRING_LENGTH))
EnricoG 0:3b093bd0819e 108 {
EnricoG 0:3b093bd0819e 109 pEndString += MESSAGE_BEGIN_STRING_LENGTH;
EnricoG 0:3b093bd0819e 110 /* Retrieve message */
EnricoG 0:3b093bd0819e 111 memcpy( pSMSStruct->Message, pEndString, PayloadSize-(pEndString-pPayload));
EnricoG 0:3b093bd0819e 112 /* add end of string charactere */
EnricoG 0:3b093bd0819e 113 pSMSStruct->Message[PayloadSize-(pEndString-pPayload)] = 0;
EnricoG 0:3b093bd0819e 114 }
EnricoG 0:3b093bd0819e 115 }
EnricoG 0:3b093bd0819e 116
EnricoG 0:3b093bd0819e 117 /**
EnricoG 0:3b093bd0819e 118 * @brief This fonction read the SMS and store data in a structure
EnricoG 0:3b093bd0819e 119 * @param pRecordStruct : Pointer on the record structure
EnricoG 0:3b093bd0819e 120 * @param pSMSStruct : pointer on the structure to fill
EnricoG 0:3b093bd0819e 121 * @retval NONE
EnricoG 0:3b093bd0819e 122 */
EnricoG 0:3b093bd0819e 123 static void NDEF_ReadURI_SMS ( sRecordInfo *pRecordStruct, sSMSInfo *pSMSStruct )
EnricoG 0:3b093bd0819e 124 {
EnricoG 0:3b093bd0819e 125 uint8_t* pPayload;
EnricoG 0:3b093bd0819e 126 uint32_t PayloadSize;
EnricoG 0:3b093bd0819e 127
EnricoG 0:3b093bd0819e 128 PayloadSize = ((uint32_t)(pRecordStruct->PayloadLength3)<<24) | ((uint32_t)(pRecordStruct->PayloadLength2)<<16) |
EnricoG 0:3b093bd0819e 129 ((uint32_t)(pRecordStruct->PayloadLength1)<<8) | pRecordStruct->PayloadLength0;
EnricoG 0:3b093bd0819e 130
EnricoG 0:3b093bd0819e 131 /* Read record header */
EnricoG 0:3b093bd0819e 132 pPayload = (uint8_t*)(pRecordStruct->PayloadBufferAdd);
EnricoG 0:3b093bd0819e 133
EnricoG 0:3b093bd0819e 134 if( pRecordStruct->NDEF_Type == URI_SMS_TYPE)
EnricoG 0:3b093bd0819e 135 NDEF_FillSMSStruct(pPayload , PayloadSize, pSMSStruct);
EnricoG 0:3b093bd0819e 136
EnricoG 0:3b093bd0819e 137 }
EnricoG 0:3b093bd0819e 138
EnricoG 0:3b093bd0819e 139 /**
EnricoG 0:3b093bd0819e 140 * @}
EnricoG 0:3b093bd0819e 141 */
EnricoG 0:3b093bd0819e 142
EnricoG 0:3b093bd0819e 143 /** @defgroup libSMS_Public_Functions
EnricoG 0:3b093bd0819e 144 * @{
EnricoG 0:3b093bd0819e 145 * @brief This file is used to manage SMS (stored or loaded in tag)
EnricoG 0:3b093bd0819e 146 */
EnricoG 0:3b093bd0819e 147
EnricoG 0:3b093bd0819e 148 /**
EnricoG 0:3b093bd0819e 149 * @brief This fonction read NDEF and retrieve SMS information if any
EnricoG 0:3b093bd0819e 150 * @param pRecordStruct : Pointer on the record structure
EnricoG 0:3b093bd0819e 151 * @param pSMSStruct : pointer on the structure to fill
EnricoG 0:3b093bd0819e 152 * @retval SUCCESS : SMS information from NDEF have been retrieve
EnricoG 0:3b093bd0819e 153 * @retval ERROR : Not able to retrieve SMS information
EnricoG 0:3b093bd0819e 154 */
EnricoG 0:3b093bd0819e 155 uint16_t NDEF_ReadSMS(sRecordInfo *pRecordStruct, sSMSInfo *pSMSStruct)
EnricoG 0:3b093bd0819e 156 {
EnricoG 0:3b093bd0819e 157 uint16_t status = ERROR;
EnricoG 0:3b093bd0819e 158 uint16_t FileId=0;
EnricoG 0:3b093bd0819e 159 sRecordInfo *pSPRecordStruct;
EnricoG 0:3b093bd0819e 160 uint32_t PayloadSize, RecordPosition;
EnricoG 0:3b093bd0819e 161 uint8_t* pData;
EnricoG 0:3b093bd0819e 162
EnricoG 0:3b093bd0819e 163 if( pRecordStruct->NDEF_Type == URI_SMS_TYPE )
EnricoG 0:3b093bd0819e 164 {
EnricoG 0:3b093bd0819e 165 NDEF_ReadURI_SMS(pRecordStruct, pSMSStruct );
EnricoG 0:3b093bd0819e 166 status = SUCCESS;
EnricoG 0:3b093bd0819e 167 }
EnricoG 0:3b093bd0819e 168 else if( pRecordStruct->NDEF_Type == SMARTPOSTER_TYPE)
EnricoG 0:3b093bd0819e 169 {
EnricoG 0:3b093bd0819e 170 for (RecordPosition = 0; RecordPosition<pRecordStruct->NbOfRecordInSPPayload; RecordPosition++)
EnricoG 0:3b093bd0819e 171 {
EnricoG 0:3b093bd0819e 172 pSPRecordStruct = (sRecordInfo *)(pRecordStruct->SPRecordStructAdd[RecordPosition]);
EnricoG 0:3b093bd0819e 173 if(pSPRecordStruct->NDEF_Type == URI_SMS_TYPE )
EnricoG 0:3b093bd0819e 174 {
EnricoG 0:3b093bd0819e 175 NDEF_ReadURI_SMS(pSPRecordStruct, pSMSStruct );
EnricoG 0:3b093bd0819e 176 status = SUCCESS;
EnricoG 0:3b093bd0819e 177 }
EnricoG 0:3b093bd0819e 178 if(pSPRecordStruct->NDEF_Type == TEXT_TYPE )
EnricoG 0:3b093bd0819e 179 {
EnricoG 0:3b093bd0819e 180 PayloadSize = ((uint32_t)(pSPRecordStruct->PayloadLength3)<<24) | ((uint32_t)(pSPRecordStruct->PayloadLength2)<<16) |
EnricoG 0:3b093bd0819e 181 ((uint32_t)(pSPRecordStruct->PayloadLength1)<<8) | pSPRecordStruct->PayloadLength0;
EnricoG 0:3b093bd0819e 182
EnricoG 0:3b093bd0819e 183 /* The instruction content the UTF-8 language code that is not used here */
EnricoG 0:3b093bd0819e 184 pData = (uint8_t*)pSPRecordStruct->PayloadBufferAdd;
EnricoG 0:3b093bd0819e 185 PayloadSize -= *pData+1; /* remove not usefull data */
EnricoG 0:3b093bd0819e 186 pData += *pData+1; /* set pointer on usefull data */
EnricoG 0:3b093bd0819e 187
EnricoG 0:3b093bd0819e 188 memcpy(pSMSStruct->Information, pData, PayloadSize);
EnricoG 0:3b093bd0819e 189 /* add end of string charactere */
EnricoG 0:3b093bd0819e 190 pSMSStruct->Information[PayloadSize] = 0;
EnricoG 0:3b093bd0819e 191 }
EnricoG 0:3b093bd0819e 192 }
EnricoG 0:3b093bd0819e 193 }
EnricoG 0:3b093bd0819e 194
EnricoG 0:3b093bd0819e 195 CloseNDEFSession(FileId);
EnricoG 0:3b093bd0819e 196
EnricoG 0:3b093bd0819e 197 return status;
EnricoG 0:3b093bd0819e 198 }
EnricoG 0:3b093bd0819e 199
EnricoG 0:3b093bd0819e 200 /**
EnricoG 0:3b093bd0819e 201 * @brief This fonction write the NDEF file with the SMS data given in the structure
EnricoG 0:3b093bd0819e 202 * @param pSMSStruct : pointer on structure that contain the SMS information
EnricoG 0:3b093bd0819e 203 * @retval SUCCESS : the function is succesful
EnricoG 0:3b093bd0819e 204 * @retval ERROR : Not able to store NDEF file inside tag.
EnricoG 0:3b093bd0819e 205 */
EnricoG 0:3b093bd0819e 206 uint16_t NDEF_WriteSMS ( sSMSInfo *pSMSStruct )
EnricoG 0:3b093bd0819e 207 {
EnricoG 0:3b093bd0819e 208 uint16_t status = ERROR;
EnricoG 0:3b093bd0819e 209 uint32_t smsSize, infoSize, totalSize, Offset = 0;
EnricoG 0:3b093bd0819e 210
EnricoG 0:3b093bd0819e 211 /* SMS is an URI but can be included in a smart poster to add text to give instruction to user for instance */
EnricoG 0:3b093bd0819e 212
EnricoG 0:3b093bd0819e 213 /* SMS (smart poster) Record Header */
EnricoG 0:3b093bd0819e 214 /************************************/
EnricoG 0:3b093bd0819e 215 /* 7 | 6 | 5 | 4 | 3 | 2 1 0 */
EnricoG 0:3b093bd0819e 216 /*----------------------------------*/
EnricoG 0:3b093bd0819e 217 /* MB ME CF SR IL TNF */ /* <---- CF=0, IL=0 and SR=1 TNF=1 NFC Forum Well-known type*/
EnricoG 0:3b093bd0819e 218 /*----------------------------------*/
EnricoG 0:3b093bd0819e 219 /* TYPE LENGTH */
EnricoG 0:3b093bd0819e 220 /*----------------------------------*/
EnricoG 0:3b093bd0819e 221 /* PAYLOAD LENGTH 3 */ /* <---- Used only if SR=0 */
EnricoG 0:3b093bd0819e 222 /*----------------------------------*/
EnricoG 0:3b093bd0819e 223 /* PAYLOAD LENGTH 2 */ /* <---- Used only if SR=0 */
EnricoG 0:3b093bd0819e 224 /*----------------------------------*/
EnricoG 0:3b093bd0819e 225 /* PAYLOAD LENGTH 1 */ /* <---- Used only if SR=0 */
EnricoG 0:3b093bd0819e 226 /*----------------------------------*/
EnricoG 0:3b093bd0819e 227 /* PAYLOAD LENGTH 0 */
EnricoG 0:3b093bd0819e 228 /*----------------------------------*/
EnricoG 0:3b093bd0819e 229 /* ID LENGTH */ /* <---- Not Used */
EnricoG 0:3b093bd0819e 230 /*----------------------------------*/
EnricoG 0:3b093bd0819e 231 /* TYPE */
EnricoG 0:3b093bd0819e 232 /*----------------------------------*/
EnricoG 0:3b093bd0819e 233 /* ID */ /* <---- Not Used */
EnricoG 0:3b093bd0819e 234 /************************************/
EnricoG 0:3b093bd0819e 235
EnricoG 0:3b093bd0819e 236 NDEF_Buffer[0] = 0;
EnricoG 0:3b093bd0819e 237 NDEF_Buffer[1] = 0;
EnricoG 0:3b093bd0819e 238 Offset = FIRST_RECORD_OFFSET;
EnricoG 0:3b093bd0819e 239 infoSize = 0;
EnricoG 0:3b093bd0819e 240
EnricoG 0:3b093bd0819e 241 /* SMS : 1+sms:+tel+1+body=+message */
EnricoG 0:3b093bd0819e 242 smsSize = 1+SMS_TYPE_STRING_LENGTH+strlen(pSMSStruct->PhoneNumber)+URI_FIRST_DATA_END_LENGTH+MESSAGE_BEGIN_STRING_LENGTH+strlen(pSMSStruct->Message);
EnricoG 0:3b093bd0819e 243
EnricoG 0:3b093bd0819e 244 /* Check if a Smart poster is needed */
EnricoG 0:3b093bd0819e 245 if (pSMSStruct->Information[0] != '\0')
EnricoG 0:3b093bd0819e 246 {
EnricoG 0:3b093bd0819e 247 /* Info : 1+2+info */
EnricoG 0:3b093bd0819e 248 infoSize = 1+ISO_ENGLISH_CODE_STRING_LENGTH+strlen(pSMSStruct->Information);
EnricoG 0:3b093bd0819e 249 /* Total */
EnricoG 0:3b093bd0819e 250 totalSize = 4+smsSize+4+infoSize;
EnricoG 0:3b093bd0819e 251 if (smsSize > 255) totalSize+=3; /* Normal SMS size */
EnricoG 0:3b093bd0819e 252 if (infoSize > 255) totalSize+=3; /* Normal Info size */
EnricoG 0:3b093bd0819e 253
EnricoG 0:3b093bd0819e 254 /* SmartPoster header */
EnricoG 0:3b093bd0819e 255 if (totalSize > 255)
EnricoG 0:3b093bd0819e 256 {
EnricoG 0:3b093bd0819e 257 NDEF_Buffer[Offset++] = 0xC1;
EnricoG 0:3b093bd0819e 258 NDEF_Buffer[Offset++] = SMART_POSTER_TYPE_STRING_LENGTH;
EnricoG 0:3b093bd0819e 259 NDEF_Buffer[Offset++] = (totalSize & 0xFF000000)>>24;
EnricoG 0:3b093bd0819e 260 NDEF_Buffer[Offset++] = (totalSize & 0x00FF0000)>>16;
EnricoG 0:3b093bd0819e 261 NDEF_Buffer[Offset++] = (totalSize & 0x0000FF00)>>8;
EnricoG 0:3b093bd0819e 262 NDEF_Buffer[Offset++] = (totalSize & 0x000000FF);
EnricoG 0:3b093bd0819e 263 }
EnricoG 0:3b093bd0819e 264 else
EnricoG 0:3b093bd0819e 265 {
EnricoG 0:3b093bd0819e 266 NDEF_Buffer[Offset++] = 0xD1;
EnricoG 0:3b093bd0819e 267 NDEF_Buffer[Offset++] = SMART_POSTER_TYPE_STRING_LENGTH;
EnricoG 0:3b093bd0819e 268 NDEF_Buffer[Offset++] = (uint8_t)totalSize;
EnricoG 0:3b093bd0819e 269 }
EnricoG 0:3b093bd0819e 270 memcpy(&NDEF_Buffer[Offset], SMART_POSTER_TYPE_STRING, SMART_POSTER_TYPE_STRING_LENGTH);
EnricoG 0:3b093bd0819e 271 Offset+=SMART_POSTER_TYPE_STRING_LENGTH;
EnricoG 0:3b093bd0819e 272 }
EnricoG 0:3b093bd0819e 273
EnricoG 0:3b093bd0819e 274 /* SMS header */
EnricoG 0:3b093bd0819e 275 NDEF_Buffer[Offset] = 0x81;
EnricoG 0:3b093bd0819e 276 if (smsSize < 256) NDEF_Buffer[Offset] |= 0x10; // Set the SR bit
EnricoG 0:3b093bd0819e 277 if (pSMSStruct->Information[0] == '\0') NDEF_Buffer[Offset] |= 0x40; // Set the ME bit
EnricoG 0:3b093bd0819e 278 Offset++;
EnricoG 0:3b093bd0819e 279
EnricoG 0:3b093bd0819e 280 NDEF_Buffer[Offset++] = URI_TYPE_STRING_LENGTH;
EnricoG 0:3b093bd0819e 281 if (smsSize > 255)
EnricoG 0:3b093bd0819e 282 {
EnricoG 0:3b093bd0819e 283 NDEF_Buffer[Offset++] = (smsSize & 0xFF000000)>>24;
EnricoG 0:3b093bd0819e 284 NDEF_Buffer[Offset++] = (smsSize & 0x00FF0000)>>16;
EnricoG 0:3b093bd0819e 285 NDEF_Buffer[Offset++] = (smsSize & 0x0000FF00)>>8;
EnricoG 0:3b093bd0819e 286 NDEF_Buffer[Offset++] = (smsSize & 0x000000FF);
EnricoG 0:3b093bd0819e 287 }
EnricoG 0:3b093bd0819e 288 else
EnricoG 0:3b093bd0819e 289 {
EnricoG 0:3b093bd0819e 290 NDEF_Buffer[Offset++] = (uint8_t)smsSize;
EnricoG 0:3b093bd0819e 291 }
EnricoG 0:3b093bd0819e 292 memcpy(&NDEF_Buffer[Offset], URI_TYPE_STRING, URI_TYPE_STRING_LENGTH);
EnricoG 0:3b093bd0819e 293 Offset+=URI_TYPE_STRING_LENGTH;
EnricoG 0:3b093bd0819e 294
EnricoG 0:3b093bd0819e 295 /* SMS payload */
EnricoG 0:3b093bd0819e 296 NDEF_Buffer[Offset++] = URI_ID_0x00; /* URI identifier no abbreviation */
EnricoG 0:3b093bd0819e 297 memcpy(&NDEF_Buffer[Offset], SMS_TYPE_STRING, SMS_TYPE_STRING_LENGTH);
EnricoG 0:3b093bd0819e 298 Offset += SMS_TYPE_STRING_LENGTH;
EnricoG 0:3b093bd0819e 299 memcpy( &NDEF_Buffer[Offset], pSMSStruct->PhoneNumber,strlen(pSMSStruct->PhoneNumber));
EnricoG 0:3b093bd0819e 300 Offset += strlen(pSMSStruct->PhoneNumber);
EnricoG 0:3b093bd0819e 301 memcpy( &NDEF_Buffer[Offset], URI_FIRST_DATA_END,URI_FIRST_DATA_END_LENGTH);
EnricoG 0:3b093bd0819e 302 Offset += URI_FIRST_DATA_END_LENGTH;
EnricoG 0:3b093bd0819e 303
EnricoG 0:3b093bd0819e 304 memcpy( &NDEF_Buffer[Offset], MESSAGE_BEGIN_STRING, MESSAGE_BEGIN_STRING_LENGTH);
EnricoG 0:3b093bd0819e 305 Offset += MESSAGE_BEGIN_STRING_LENGTH;
EnricoG 0:3b093bd0819e 306 memcpy( &NDEF_Buffer[Offset], pSMSStruct->Message, strlen(pSMSStruct->Message));
EnricoG 0:3b093bd0819e 307 Offset += strlen(pSMSStruct->Message);
EnricoG 0:3b093bd0819e 308
EnricoG 0:3b093bd0819e 309 /* Information header */
EnricoG 0:3b093bd0819e 310 if (pSMSStruct->Information[0] != '\0')
EnricoG 0:3b093bd0819e 311 {
EnricoG 0:3b093bd0819e 312 if (infoSize > 255)
EnricoG 0:3b093bd0819e 313 {
EnricoG 0:3b093bd0819e 314 NDEF_Buffer[Offset++] = 0x41;
EnricoG 0:3b093bd0819e 315 NDEF_Buffer[Offset++] = TEXT_TYPE_STRING_LENGTH;
EnricoG 0:3b093bd0819e 316 NDEF_Buffer[Offset++] = (infoSize & 0xFF000000)>>24;
EnricoG 0:3b093bd0819e 317 NDEF_Buffer[Offset++] = (infoSize & 0x00FF0000)>>16;
EnricoG 0:3b093bd0819e 318 NDEF_Buffer[Offset++] = (infoSize & 0x0000FF00)>>8;
EnricoG 0:3b093bd0819e 319 NDEF_Buffer[Offset++] = (infoSize & 0x000000FF);
EnricoG 0:3b093bd0819e 320 }
EnricoG 0:3b093bd0819e 321 else
EnricoG 0:3b093bd0819e 322 {
EnricoG 0:3b093bd0819e 323 NDEF_Buffer[Offset++] = 0x51;
EnricoG 0:3b093bd0819e 324 NDEF_Buffer[Offset++] = TEXT_TYPE_STRING_LENGTH;
EnricoG 0:3b093bd0819e 325 NDEF_Buffer[Offset++] = (uint8_t)infoSize;
EnricoG 0:3b093bd0819e 326 }
EnricoG 0:3b093bd0819e 327
EnricoG 0:3b093bd0819e 328 memcpy(&NDEF_Buffer[Offset], TEXT_TYPE_STRING, TEXT_TYPE_STRING_LENGTH);
EnricoG 0:3b093bd0819e 329 Offset+=TEXT_TYPE_STRING_LENGTH;
EnricoG 0:3b093bd0819e 330 NDEF_Buffer[Offset++] = ISO_ENGLISH_CODE_STRING_LENGTH; /* UTF-8 with x byte language code */
EnricoG 0:3b093bd0819e 331 memcpy(&NDEF_Buffer[Offset], ISO_ENGLISH_CODE_STRING, ISO_ENGLISH_CODE_STRING_LENGTH);
EnricoG 0:3b093bd0819e 332 Offset+=ISO_ENGLISH_CODE_STRING_LENGTH;
EnricoG 0:3b093bd0819e 333
EnricoG 0:3b093bd0819e 334 /* Information payload */
EnricoG 0:3b093bd0819e 335 memcpy( &NDEF_Buffer[Offset], pSMSStruct->Information,strlen(pSMSStruct->Information));
EnricoG 0:3b093bd0819e 336 Offset += strlen(pSMSStruct->Information);
EnricoG 0:3b093bd0819e 337 }
EnricoG 0:3b093bd0819e 338
EnricoG 0:3b093bd0819e 339 /* Write NDEF */
EnricoG 0:3b093bd0819e 340 status = WriteData ( 0x00 , Offset , NDEF_Buffer);
EnricoG 0:3b093bd0819e 341
EnricoG 0:3b093bd0819e 342 /* Write NDEF size to complete*/
EnricoG 0:3b093bd0819e 343 if( status == NDEF_ACTION_COMPLETED)
EnricoG 0:3b093bd0819e 344 {
EnricoG 0:3b093bd0819e 345 Offset -= 2; /* Must not count the 2 byte that represent the NDEF size */
EnricoG 0:3b093bd0819e 346 NDEF_Buffer[0] = (Offset & 0xFF00)>>8;
EnricoG 0:3b093bd0819e 347 NDEF_Buffer[1] = (Offset & 0x00FF);
EnricoG 0:3b093bd0819e 348
EnricoG 0:3b093bd0819e 349 status = WriteData ( 0x00 , 2 , NDEF_Buffer);
EnricoG 0:3b093bd0819e 350 }
EnricoG 0:3b093bd0819e 351
EnricoG 0:3b093bd0819e 352 if( status == NDEF_ACTION_COMPLETED)
EnricoG 0:3b093bd0819e 353 return SUCCESS;
EnricoG 0:3b093bd0819e 354 else
EnricoG 0:3b093bd0819e 355 return ERROR;
EnricoG 0:3b093bd0819e 356 }
EnricoG 0:3b093bd0819e 357
EnricoG 0:3b093bd0819e 358
EnricoG 0:3b093bd0819e 359 /**
EnricoG 0:3b093bd0819e 360 * @}
EnricoG 0:3b093bd0819e 361 */
EnricoG 0:3b093bd0819e 362
EnricoG 0:3b093bd0819e 363 /**
EnricoG 0:3b093bd0819e 364 * @}
EnricoG 0:3b093bd0819e 365 */
EnricoG 0:3b093bd0819e 366
EnricoG 0:3b093bd0819e 367 /**
EnricoG 0:3b093bd0819e 368 * @}
EnricoG 0:3b093bd0819e 369 */
EnricoG 0:3b093bd0819e 370
EnricoG 0:3b093bd0819e 371 /******************* (C) COPYRIGHT 2013 STMicroelectronics *****END OF FILE****/
EnricoG 0:3b093bd0819e 372
EnricoG 0:3b093bd0819e 373