mbed OS 5 example application using X-NUCLEO-NFC02A1

Dependencies:   NDefLib X_NUCLEO_NFC02A1

Fork of HelloWorld_NFC02A1 by ST

Committer:
rosarium
Date:
Wed Jul 27 09:25:33 2016 +0000
Revision:
0:892175366555
first release of the complete mbed library for HelloWorld_NFC02A1

Who changed what in which revision?

UserRevisionLine numberNew contents of line
rosarium 0:892175366555 1 /**
rosarium 0:892175366555 2 ******************************************************************************
rosarium 0:892175366555 3 * @file lib_NDEF.c
rosarium 0:892175366555 4 * @author MMY Application Team
rosarium 0:892175366555 5 * @version $Revision: 1583 $
rosarium 0:892175366555 6 * @date $Date: 2016-02-03 15:06:51 +0100 (Wed, 03 Feb 2016) $
rosarium 0:892175366555 7 * @brief This file help to manage NDEF file, to parse and identify them.
rosarium 0:892175366555 8 ******************************************************************************
rosarium 0:892175366555 9 * @attention
rosarium 0:892175366555 10 *
rosarium 0:892175366555 11 * <h2><center>&copy; COPYRIGHT 2015 STMicroelectronics</center></h2>
rosarium 0:892175366555 12 *
rosarium 0:892175366555 13 * Licensed under ST MYLIBERTY SOFTWARE LICENSE AGREEMENT (the "License");
rosarium 0:892175366555 14 * You may not use this file except in compliance with the License.
rosarium 0:892175366555 15 * You may obtain a copy of the License at:
rosarium 0:892175366555 16 *
rosarium 0:892175366555 17 * http://www.st.com/myliberty
rosarium 0:892175366555 18 *
rosarium 0:892175366555 19 * Unless required by applicable law or agreed to in writing, software
rosarium 0:892175366555 20 * distributed under the License is distributed on an "AS IS" BASIS,
rosarium 0:892175366555 21 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied,
rosarium 0:892175366555 22 * AND SPECIFICALLY DISCLAIMING THE IMPLIED WARRANTIES OF MERCHANTABILITY,
rosarium 0:892175366555 23 * FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT.
rosarium 0:892175366555 24 * See the License for the specific language governing permissions and
rosarium 0:892175366555 25 * limitations under the License.
rosarium 0:892175366555 26 *
rosarium 0:892175366555 27 ******************************************************************************
rosarium 0:892175366555 28 */
rosarium 0:892175366555 29
rosarium 0:892175366555 30 /* Includes ------------------------------------------------------------------*/
rosarium 0:892175366555 31 #include "lib_NDEF.h"
rosarium 0:892175366555 32 #include <stdint.h>
rosarium 0:892175366555 33 #include <string.h>
rosarium 0:892175366555 34 /** @addtogroup NFC_libraries
rosarium 0:892175366555 35 * @{
rosarium 0:892175366555 36 * @brief <b>This is the library used to manage the content of the TAG (data)
rosarium 0:892175366555 37 * But also the specific feature of the tag, for instance
rosarium 0:892175366555 38 * password, gpo... </b>
rosarium 0:892175366555 39 */
rosarium 0:892175366555 40
rosarium 0:892175366555 41
rosarium 0:892175366555 42 /** @addtogroup libNFC_FORUM
rosarium 0:892175366555 43 * @{
rosarium 0:892175366555 44 * @brief This part of the library manage data which follow NFC forum organisation.
rosarium 0:892175366555 45 */
rosarium 0:892175366555 46
rosarium 0:892175366555 47 /** @defgroup libNDEF_Private_Functions
rosarium 0:892175366555 48 * @{
rosarium 0:892175366555 49 */
rosarium 0:892175366555 50
rosarium 0:892175366555 51
rosarium 0:892175366555 52
rosarium 0:892175366555 53 /**
rosarium 0:892175366555 54 * @brief This function check that the tag contain a NDEF message.
rosarium 0:892175366555 55 * @retval NDEF_OK : There is a NDEF file stored in tag.
rosarium 0:892175366555 56 * @retval NDEF_ERROR : No NDEF in the tag.
rosarium 0:892175366555 57 */
rosarium 0:892175366555 58 uint16_t NDEF::NDEF_IsNDEFPresent( void )
rosarium 0:892175366555 59 {
rosarium 0:892175366555 60 uint16_t FileSize;
rosarium 0:892175366555 61 uint8_t uNDEFHeader [0x2];
rosarium 0:892175366555 62
rosarium 0:892175366555 63 /* Check NDEF existence */
rosarium 0:892175366555 64 ReadData( NDEF_SIZE_OFFSET, 2, uNDEFHeader );
rosarium 0:892175366555 65 FileSize = (uint16_t)( (uNDEFHeader[0x00]<<8) | uNDEFHeader[0x01] );
rosarium 0:892175366555 66
rosarium 0:892175366555 67 if( FileSize != 0 )
rosarium 0:892175366555 68 return NDEF_OK;
rosarium 0:892175366555 69 else
rosarium 0:892175366555 70 return NDEF_ERROR;
rosarium 0:892175366555 71 }
rosarium 0:892175366555 72
rosarium 0:892175366555 73 /**
rosarium 0:892175366555 74 * @brief This function identify the type of record.
rosarium 0:892175366555 75 * @param pRecordStruct : pointer on the record structure to fill.
rosarium 0:892175366555 76 * @param pPayload : pointer on the payload.
rosarium 0:892175366555 77 * @retval Status : Status of the operation.
rosarium 0:892175366555 78 */
rosarium 0:892175366555 79 uint16_t NDEF::NDEF_IdentifySPRecord( sRecordInfo *pRecordStruct, uint8_t* pPayload )
rosarium 0:892175366555 80 {
rosarium 0:892175366555 81 uint16_t status = NDEF_ERROR;
rosarium 0:892175366555 82 uint16_t SizeOfRecordHeader, TypeNbByte, PayloadLengthField, IDLengthField, IDNbByte;
rosarium 0:892175366555 83
rosarium 0:892175366555 84 /* Is ID length field present */
rosarium 0:892175366555 85 if( (*pPayload) & IL_Mask )
rosarium 0:892175366555 86 {
rosarium 0:892175366555 87 IDLengthField = ID_LENGTH_FIELD;
rosarium 0:892175366555 88 }
rosarium 0:892175366555 89 else
rosarium 0:892175366555 90 {
rosarium 0:892175366555 91 IDLengthField = 0;
rosarium 0:892175366555 92 }
rosarium 0:892175366555 93
rosarium 0:892175366555 94 /* it's a SR */
rosarium 0:892175366555 95 if( (*pPayload) & SR_Mask )
rosarium 0:892175366555 96 {
rosarium 0:892175366555 97 TypeNbByte = pPayload[1];
rosarium 0:892175366555 98 PayloadLengthField = 1;
rosarium 0:892175366555 99 if( IDLengthField == ID_LENGTH_FIELD )
rosarium 0:892175366555 100 IDNbByte = pPayload[3];
rosarium 0:892175366555 101 else
rosarium 0:892175366555 102 IDNbByte = 0;
rosarium 0:892175366555 103 }
rosarium 0:892175366555 104 else
rosarium 0:892175366555 105 {
rosarium 0:892175366555 106 TypeNbByte = pPayload[1];
rosarium 0:892175366555 107 PayloadLengthField = 4;
rosarium 0:892175366555 108 if( IDLengthField == ID_LENGTH_FIELD )
rosarium 0:892175366555 109 IDNbByte = pPayload[6];
rosarium 0:892175366555 110 else
rosarium 0:892175366555 111 IDNbByte = 0;
rosarium 0:892175366555 112 }
rosarium 0:892175366555 113
rosarium 0:892175366555 114 SizeOfRecordHeader = RECORD_FLAG_FIELD + TYPE_LENGTH_FIELD + PayloadLengthField + IDLengthField + TypeNbByte + IDNbByte;
rosarium 0:892175366555 115
rosarium 0:892175366555 116 /* it's a SR */
rosarium 0:892175366555 117 if( pPayload[0] & SR_Mask )
rosarium 0:892175366555 118 {
rosarium 0:892175366555 119 pRecordStruct->RecordFlags = pPayload[0];
rosarium 0:892175366555 120 pRecordStruct->TypeLength = TypeNbByte;
rosarium 0:892175366555 121 pRecordStruct->PayloadLength3 = 0;
rosarium 0:892175366555 122 pRecordStruct->PayloadLength2 = 0;
rosarium 0:892175366555 123 pRecordStruct->PayloadLength1 = 0;
rosarium 0:892175366555 124 pRecordStruct->PayloadLength0 = pPayload[2];
rosarium 0:892175366555 125 pRecordStruct->IDLength = IDNbByte;
rosarium 0:892175366555 126 memcpy( pRecordStruct->Type, &pPayload[3+IDNbByte], TypeNbByte );
rosarium 0:892175366555 127 memcpy( pRecordStruct->ID, &pPayload[3+IDNbByte+TypeNbByte], IDNbByte );
rosarium 0:892175366555 128 pRecordStruct->PayloadOffset = SizeOfRecordHeader;
rosarium 0:892175366555 129 }
rosarium 0:892175366555 130 else
rosarium 0:892175366555 131 {
rosarium 0:892175366555 132 pRecordStruct->RecordFlags = pPayload[0];
rosarium 0:892175366555 133 pRecordStruct->TypeLength = TypeNbByte;
rosarium 0:892175366555 134 pRecordStruct->PayloadLength3 = pPayload[2];
rosarium 0:892175366555 135 pRecordStruct->PayloadLength2 = pPayload[3];
rosarium 0:892175366555 136 pRecordStruct->PayloadLength1 = pPayload[4];
rosarium 0:892175366555 137 pRecordStruct->PayloadLength0 = pPayload[5];
rosarium 0:892175366555 138 pRecordStruct->IDLength = IDNbByte;
rosarium 0:892175366555 139 memcpy( pRecordStruct->Type, &pPayload[6+IDNbByte], TypeNbByte );
rosarium 0:892175366555 140 memcpy( pRecordStruct->ID, &pPayload[6+IDNbByte+TypeNbByte], IDNbByte );
rosarium 0:892175366555 141 pRecordStruct->PayloadOffset = SizeOfRecordHeader;
rosarium 0:892175366555 142 }
rosarium 0:892175366555 143
rosarium 0:892175366555 144 pRecordStruct->PayloadBufferAdd = (uint32_t)( pPayload + SizeOfRecordHeader );
rosarium 0:892175366555 145
rosarium 0:892175366555 146 status = NDEF_ParseRecordHeader( pRecordStruct );
rosarium 0:892175366555 147
rosarium 0:892175366555 148 return status;
rosarium 0:892175366555 149 }
rosarium 0:892175366555 150
rosarium 0:892175366555 151 /**
rosarium 0:892175366555 152 * @brief This function parse the record header and dispatch regarding TNF value.
rosarium 0:892175366555 153 * @param pRecordStruct : pointer on the record structure to fill.
rosarium 0:892175366555 154 * @retval NDEF_OK : record identified and structure filled.
rosarium 0:892175366555 155 * @retval NDEF_ERROR : Not supported.
rosarium 0:892175366555 156 */
rosarium 0:892175366555 157 uint16_t NDEF::NDEF_ParseRecordHeader( sRecordInfo *pRecordStruct )
rosarium 0:892175366555 158 {
rosarium 0:892175366555 159 uint16_t status = NDEF_OK;
rosarium 0:892175366555 160
rosarium 0:892175366555 161 switch( (pRecordStruct->RecordFlags & TNF_Mask) )
rosarium 0:892175366555 162 {
rosarium 0:892175366555 163 case TNF_WellKnown:
rosarium 0:892175366555 164 NDEF_ParseWellKnownType( pRecordStruct );
rosarium 0:892175366555 165 break;
rosarium 0:892175366555 166
rosarium 0:892175366555 167 case TNF_MediaType:
rosarium 0:892175366555 168 NDEF_ParseMediaType( pRecordStruct );
rosarium 0:892175366555 169 break;
rosarium 0:892175366555 170
rosarium 0:892175366555 171 case TNF_NFCForumExternal:
rosarium 0:892175366555 172 NDEF_ParseForumExternalType( pRecordStruct);
rosarium 0:892175366555 173 break;
rosarium 0:892175366555 174
rosarium 0:892175366555 175 default:
rosarium 0:892175366555 176 /* currently not supported or unknown*/
rosarium 0:892175366555 177 pRecordStruct->NDEF_Type = UNKNOWN_TYPE;
rosarium 0:892175366555 178 status = NDEF_ERROR;
rosarium 0:892175366555 179 }
rosarium 0:892175366555 180 return status;
rosarium 0:892175366555 181 }
rosarium 0:892175366555 182
rosarium 0:892175366555 183 /**
rosarium 0:892175366555 184 * @brief This function parse the Well Known type record.
rosarium 0:892175366555 185 * @param pRecordStruct : pointer on the record structure to fill.
rosarium 0:892175366555 186 */
rosarium 0:892175366555 187 void NDEF::NDEF_ParseWellKnownType( sRecordInfo *pRecordStruct )
rosarium 0:892175366555 188 {
rosarium 0:892175366555 189 uint8_t* pPayload;
rosarium 0:892175366555 190
rosarium 0:892175366555 191 pPayload = (uint8_t*)( pRecordStruct->PayloadBufferAdd );
rosarium 0:892175366555 192
rosarium 0:892175366555 193 if( !memcmp( &(pRecordStruct->Type), SMART_POSTER_TYPE_STRING, pRecordStruct->TypeLength ) )
rosarium 0:892175366555 194 {
rosarium 0:892175366555 195 /* special case where we have to parse others records */
rosarium 0:892175366555 196 pRecordStruct->NDEF_Type = SMARTPOSTER_TYPE;
rosarium 0:892175366555 197 NDEF_ParseSP( pRecordStruct );
rosarium 0:892175366555 198 }
rosarium 0:892175366555 199
rosarium 0:892175366555 200 else if( !memcmp( &(pRecordStruct->Type), URI_TYPE_STRING, pRecordStruct->TypeLength ) )
rosarium 0:892175366555 201 {
rosarium 0:892175366555 202 /* it's an URI Type check if it's an URL or SMS or ... */
rosarium 0:892175366555 203 /* check identifier */
rosarium 0:892175366555 204 if( *pPayload == URI_ID_0x00 )
rosarium 0:892175366555 205 {
rosarium 0:892175366555 206 NDEF_ParseURI( pRecordStruct );
rosarium 0:892175366555 207 }
rosarium 0:892175366555 208 else if( (*pPayload > URI_ID_0x00) && (*pPayload < URI_RFU) )
rosarium 0:892175366555 209 {
rosarium 0:892175366555 210 /* email special case */
rosarium 0:892175366555 211 if( *pPayload == (uint8_t) URI_ID_0x06 )
rosarium 0:892175366555 212 {
rosarium 0:892175366555 213 pRecordStruct->NDEF_Type = URI_EMAIL_TYPE;
rosarium 0:892175366555 214 }
rosarium 0:892175366555 215 else
rosarium 0:892175366555 216 {
rosarium 0:892175366555 217 pRecordStruct->NDEF_Type = WELL_KNOWN_ABRIDGED_URI_TYPE;
rosarium 0:892175366555 218 }
rosarium 0:892175366555 219 }
rosarium 0:892175366555 220 else
rosarium 0:892175366555 221 {
rosarium 0:892175366555 222 pRecordStruct->NDEF_Type = UNKNOWN_TYPE;
rosarium 0:892175366555 223 }
rosarium 0:892175366555 224 }
rosarium 0:892175366555 225
rosarium 0:892175366555 226 else if( !memcmp( &(pRecordStruct->Type), TEXT_TYPE_STRING, pRecordStruct->TypeLength ) )
rosarium 0:892175366555 227 {
rosarium 0:892175366555 228 pRecordStruct->NDEF_Type = TEXT_TYPE;
rosarium 0:892175366555 229 }
rosarium 0:892175366555 230 else
rosarium 0:892175366555 231 pRecordStruct->NDEF_Type = UNKNOWN_TYPE;
rosarium 0:892175366555 232 }
rosarium 0:892175366555 233
rosarium 0:892175366555 234 /**
rosarium 0:892175366555 235 * @brief This function parse the Media type record.
rosarium 0:892175366555 236 * @param pRecordStruct : pointer on the record structure to fill.
rosarium 0:892175366555 237 */
rosarium 0:892175366555 238 void NDEF::NDEF_ParseMediaType( sRecordInfo *pRecordStruct )
rosarium 0:892175366555 239 {
rosarium 0:892175366555 240 if( !memcmp( &(pRecordStruct->Type), VCARD_TYPE_STRING, pRecordStruct->TypeLength ) )
rosarium 0:892175366555 241 pRecordStruct->NDEF_Type = VCARD_TYPE;
rosarium 0:892175366555 242 else if( !memcmp( &(pRecordStruct->Type), XVCARD_TYPE_STRING, pRecordStruct->TypeLength ) )
rosarium 0:892175366555 243 pRecordStruct->NDEF_Type = VCARD_TYPE;
rosarium 0:892175366555 244 else if( !memcmp( &(pRecordStruct->Type), XVCARD2_TYPE_STRING, pRecordStruct->TypeLength ) )
rosarium 0:892175366555 245 pRecordStruct->NDEF_Type = VCARD_TYPE;
rosarium 0:892175366555 246 else
rosarium 0:892175366555 247 pRecordStruct->NDEF_Type = UNKNOWN_TYPE;
rosarium 0:892175366555 248 }
rosarium 0:892175366555 249
rosarium 0:892175366555 250 /**
rosarium 0:892175366555 251 * @brief This function parse the Forum External type record.
rosarium 0:892175366555 252 * @param pRecordStruct : pointer on the record structure to fill.
rosarium 0:892175366555 253 */
rosarium 0:892175366555 254 void NDEF::NDEF_ParseForumExternalType( sRecordInfo *pRecordStruct )
rosarium 0:892175366555 255 {
rosarium 0:892175366555 256 if( !memcmp( &(pRecordStruct->Type), M24SR_DISCOVERY_APP_STRING, pRecordStruct->TypeLength ) )
rosarium 0:892175366555 257 pRecordStruct->NDEF_Type = M24SR_DISCOVERY_APP_TYPE;
rosarium 0:892175366555 258 else
rosarium 0:892175366555 259 pRecordStruct->NDEF_Type = UNKNOWN_TYPE;
rosarium 0:892175366555 260 }
rosarium 0:892175366555 261
rosarium 0:892175366555 262 /**
rosarium 0:892175366555 263 * @brief This function parse the URI type record.
rosarium 0:892175366555 264 * @param pRecordStruct : pointer on the record structure to fill.
rosarium 0:892175366555 265 */
rosarium 0:892175366555 266 void NDEF::NDEF_ParseURI( sRecordInfo *pRecordStruct )
rosarium 0:892175366555 267 {
rosarium 0:892175366555 268 uint8_t* pPayload;
rosarium 0:892175366555 269
rosarium 0:892175366555 270 pPayload = (uint8_t*)( pRecordStruct->PayloadBufferAdd );
rosarium 0:892175366555 271 pPayload++; /* to skip URI identifier first URI payload byte */
rosarium 0:892175366555 272
rosarium 0:892175366555 273 if( !memcmp( pPayload, SMS_TYPE_STRING, strlen(SMS_TYPE_STRING) ) )
rosarium 0:892175366555 274 {
rosarium 0:892175366555 275 pRecordStruct->NDEF_Type = URI_SMS_TYPE;
rosarium 0:892175366555 276 }
rosarium 0:892175366555 277 else if( !memcmp( pPayload, GEO_TYPE_STRING, strlen(GEO_TYPE_STRING) ) )
rosarium 0:892175366555 278 {
rosarium 0:892175366555 279 pRecordStruct->NDEF_Type = URI_GEO_TYPE;
rosarium 0:892175366555 280 }
rosarium 0:892175366555 281 else
rosarium 0:892175366555 282 pRecordStruct->NDEF_Type = UNKNOWN_TYPE;
rosarium 0:892175366555 283 }
rosarium 0:892175366555 284
rosarium 0:892175366555 285 /**
rosarium 0:892175366555 286 * @brief This function parse the Smart Poster.
rosarium 0:892175366555 287 * @param pRecordStruct : pointer on the record structure to fill.
rosarium 0:892175366555 288 */
rosarium 0:892175366555 289 void NDEF::NDEF_ParseSP( sRecordInfo *pRecordStruct )
rosarium 0:892175366555 290 {
rosarium 0:892175366555 291 uint8_t* pPayload;
rosarium 0:892175366555 292 uint32_t PayloadSize = 0;
rosarium 0:892175366555 293 uint32_t SPPayloadSize = 0;
rosarium 0:892175366555 294 uint32_t OffsetInSPPayload = 0;
rosarium 0:892175366555 295 uint32_t RecordPosition = 0;
rosarium 0:892175366555 296 sRecordInfo *pSPRecordStruct;
rosarium 0:892175366555 297
rosarium 0:892175366555 298 /* initialize variable with size of the payload and poiter on data */
rosarium 0:892175366555 299 PayloadSize = ((uint32_t)(pRecordStruct->PayloadLength3) << 24) | ((uint32_t)(pRecordStruct->PayloadLength2) << 16) |
rosarium 0:892175366555 300 ((uint32_t)(pRecordStruct->PayloadLength1) << 8) | pRecordStruct->PayloadLength0;
rosarium 0:892175366555 301
rosarium 0:892175366555 302 pPayload = (uint8_t*)( pRecordStruct->PayloadBufferAdd );
rosarium 0:892175366555 303
rosarium 0:892175366555 304 pSPRecordStruct = SPRecordStructAdd[0];
rosarium 0:892175366555 305
rosarium 0:892175366555 306 /* Initailize the number of record find in the SP payload */
rosarium 0:892175366555 307 pRecordStruct->NbOfRecordInSPPayload = 0;
rosarium 0:892175366555 308
rosarium 0:892175366555 309 do
rosarium 0:892175366555 310 {
rosarium 0:892175366555 311 pSPRecordStruct = SPRecordStructAdd[RecordPosition];
rosarium 0:892175366555 312 /* identify the record in the SP payload */
rosarium 0:892175366555 313 if( NDEF_IdentifySPRecord( pSPRecordStruct, pPayload ) == NDEF_OK )
rosarium 0:892175366555 314 {
rosarium 0:892175366555 315 /* store add of structure that will contain the other record information */
rosarium 0:892175366555 316 pRecordStruct->NbOfRecordInSPPayload++;
rosarium 0:892175366555 317 pRecordStruct->SPRecordStructAdd[RecordPosition] = pSPRecordStruct;
rosarium 0:892175366555 318
rosarium 0:892175366555 319 /* After SPRecord + First Record check if we are at the end of NDEF file */
rosarium 0:892175366555 320 SPPayloadSize = ((uint32_t)(pSPRecordStruct->PayloadLength3) << 24) | ((uint32_t)(pSPRecordStruct->PayloadLength2) << 16) |
rosarium 0:892175366555 321 ((uint32_t)(pSPRecordStruct->PayloadLength1) << 8) | pSPRecordStruct->PayloadLength0;
rosarium 0:892175366555 322
rosarium 0:892175366555 323 OffsetInSPPayload += pSPRecordStruct->PayloadOffset + SPPayloadSize;
rosarium 0:892175366555 324 pPayload += OffsetInSPPayload;
rosarium 0:892175366555 325 }
rosarium 0:892175366555 326 else /* Recommended Action Record for example */
rosarium 0:892175366555 327 {
rosarium 0:892175366555 328 SPPayloadSize = 0;
rosarium 0:892175366555 329 }
rosarium 0:892175366555 330 RecordPosition++;
rosarium 0:892175366555 331 }
rosarium 0:892175366555 332 while( (OffsetInSPPayload < PayloadSize) && RecordPosition<SP_MAX_RECORD); /* there is another record */
rosarium 0:892175366555 333 }
rosarium 0:892175366555 334
rosarium 0:892175366555 335 /**
rosarium 0:892175366555 336 * @}
rosarium 0:892175366555 337 */
rosarium 0:892175366555 338
rosarium 0:892175366555 339 /** @defgroup libNDEF_Public_Functions
rosarium 0:892175366555 340 * @{
rosarium 0:892175366555 341 */
rosarium 0:892175366555 342
rosarium 0:892175366555 343
rosarium 0:892175366555 344 /**
rosarium 0:892175366555 345 * @brief This function identify the NDEF message stored in tag.
rosarium 0:892175366555 346 * @param pRecordStruct : Structure to fill with record information.
rosarium 0:892175366555 347 * @param pNDEF : pointer on the NDEF message data.
rosarium 0:892175366555 348 * @retval NDEF_OK : record struct filled.
rosarium 0:892175366555 349 * @retval NDEF_ERROR : record struct not updated.
rosarium 0:892175366555 350 */
rosarium 0:892175366555 351 uint16_t NDEF::NDEF_IdentifyNDEF( sRecordInfo *pRecordStruct, uint8_t* pNDEF )
rosarium 0:892175366555 352 {
rosarium 0:892175366555 353 uint16_t status = NDEF_ERROR;
rosarium 0:892175366555 354 uint16_t SizeOfRecordHeader, TypeNbByte, PayloadLengthField, IDLengthField, IDNbByte;
rosarium 0:892175366555 355 uint32_t PayloadSize;
rosarium 0:892175366555 356
rosarium 0:892175366555 357 /* check NDEF present */
rosarium 0:892175366555 358 if( NDEF_IsNDEFPresent() != NDEF_OK )
rosarium 0:892175366555 359 {
rosarium 0:892175366555 360 return NDEF_ERROR;
rosarium 0:892175366555 361 }
rosarium 0:892175366555 362
rosarium 0:892175366555 363 /* Analyse record layout */
rosarium 0:892175366555 364 ReadData( FIRST_RECORD_OFFSET, 1, pNDEF );
rosarium 0:892175366555 365
rosarium 0:892175366555 366 /* Is ID length field present */
rosarium 0:892175366555 367 if( (*pNDEF) & IL_Mask )
rosarium 0:892175366555 368 {
rosarium 0:892175366555 369 IDLengthField = ID_LENGTH_FIELD;
rosarium 0:892175366555 370 }
rosarium 0:892175366555 371 else
rosarium 0:892175366555 372 {
rosarium 0:892175366555 373 IDLengthField = 0;
rosarium 0:892175366555 374 }
rosarium 0:892175366555 375
rosarium 0:892175366555 376 /* it's a SR */
rosarium 0:892175366555 377 if( (*pNDEF) & SR_Mask )
rosarium 0:892175366555 378 {
rosarium 0:892175366555 379 /* Analyse short record layout */
rosarium 0:892175366555 380 ReadData( FIRST_RECORD_OFFSET, 4, pNDEF );
rosarium 0:892175366555 381 TypeNbByte = pNDEF[1];
rosarium 0:892175366555 382 PayloadLengthField = 1;
rosarium 0:892175366555 383 if( IDLengthField == ID_LENGTH_FIELD )
rosarium 0:892175366555 384 IDNbByte = pNDEF[3];
rosarium 0:892175366555 385 else
rosarium 0:892175366555 386 IDNbByte = 0;
rosarium 0:892175366555 387 }
rosarium 0:892175366555 388 else
rosarium 0:892175366555 389 {
rosarium 0:892175366555 390 /* Analyse normal record layout */
rosarium 0:892175366555 391 ReadData( FIRST_RECORD_OFFSET, 7, pNDEF );
rosarium 0:892175366555 392 TypeNbByte = pNDEF[1];
rosarium 0:892175366555 393 PayloadLengthField = 4;
rosarium 0:892175366555 394 if( IDLengthField == ID_LENGTH_FIELD )
rosarium 0:892175366555 395 IDNbByte = pNDEF[6];
rosarium 0:892175366555 396 else
rosarium 0:892175366555 397 IDNbByte = 0;
rosarium 0:892175366555 398 }
rosarium 0:892175366555 399
rosarium 0:892175366555 400 SizeOfRecordHeader = RECORD_FLAG_FIELD + TYPE_LENGTH_FIELD + PayloadLengthField + IDLengthField + TypeNbByte + IDNbByte;
rosarium 0:892175366555 401
rosarium 0:892175366555 402 /* Read record header */
rosarium 0:892175366555 403 ReadData( FIRST_RECORD_OFFSET, SizeOfRecordHeader, pNDEF );
rosarium 0:892175366555 404 /* it's a SR */
rosarium 0:892175366555 405 if( pNDEF[0] & SR_Mask )
rosarium 0:892175366555 406 {
rosarium 0:892175366555 407 pRecordStruct->RecordFlags = pNDEF[0];
rosarium 0:892175366555 408 pRecordStruct->TypeLength = TypeNbByte;
rosarium 0:892175366555 409 pRecordStruct->PayloadLength3 = 0;
rosarium 0:892175366555 410 pRecordStruct->PayloadLength2 = 0;
rosarium 0:892175366555 411 pRecordStruct->PayloadLength1 = 0;
rosarium 0:892175366555 412 pRecordStruct->PayloadLength0 = pNDEF[2];
rosarium 0:892175366555 413 pRecordStruct->IDLength = IDNbByte;
rosarium 0:892175366555 414 memcpy( pRecordStruct->Type, &pNDEF[3+IDNbByte], TypeNbByte );
rosarium 0:892175366555 415 memcpy( pRecordStruct->ID, &pNDEF[3+IDNbByte+TypeNbByte], IDNbByte );
rosarium 0:892175366555 416 pRecordStruct->PayloadOffset = SizeOfRecordHeader;
rosarium 0:892175366555 417 }
rosarium 0:892175366555 418 else
rosarium 0:892175366555 419 {
rosarium 0:892175366555 420 pRecordStruct->RecordFlags = pNDEF[0];
rosarium 0:892175366555 421 pRecordStruct->TypeLength = TypeNbByte;
rosarium 0:892175366555 422 pRecordStruct->PayloadLength3 = pNDEF[2];
rosarium 0:892175366555 423 pRecordStruct->PayloadLength2 = pNDEF[3];
rosarium 0:892175366555 424 pRecordStruct->PayloadLength1 = pNDEF[4];
rosarium 0:892175366555 425 pRecordStruct->PayloadLength0 = pNDEF[5];
rosarium 0:892175366555 426 pRecordStruct->IDLength = IDNbByte;
rosarium 0:892175366555 427 memcpy( pRecordStruct->Type, &pNDEF[6+IDNbByte], TypeNbByte );
rosarium 0:892175366555 428 memcpy( pRecordStruct->ID, &pNDEF[6+IDNbByte+TypeNbByte], IDNbByte );
rosarium 0:892175366555 429 pRecordStruct->PayloadOffset = SizeOfRecordHeader;
rosarium 0:892175366555 430 }
rosarium 0:892175366555 431
rosarium 0:892175366555 432 PayloadSize = ((uint32_t)(pRecordStruct->PayloadLength3) << 24) | ((uint32_t)(pRecordStruct->PayloadLength2) << 16) |
rosarium 0:892175366555 433 ((uint32_t)(pRecordStruct->PayloadLength1) << 8) | pRecordStruct->PayloadLength0;
rosarium 0:892175366555 434
rosarium 0:892175366555 435 /* read Payload */
rosarium 0:892175366555 436 status = ReadData( (uint16_t)((FIRST_RECORD_OFFSET) + pRecordStruct->PayloadOffset) , PayloadSize , pNDEF );
rosarium 0:892175366555 437
rosarium 0:892175366555 438 if( status != NDEF_OK )
rosarium 0:892175366555 439 return NDEF_ERROR;
rosarium 0:892175366555 440 else
rosarium 0:892175366555 441 pRecordStruct->PayloadBufferAdd = (uint32_t)(pNDEF);
rosarium 0:892175366555 442
rosarium 0:892175366555 443 NDEF_ParseRecordHeader( pRecordStruct );
rosarium 0:892175366555 444
rosarium 0:892175366555 445 return NDEF_OK;
rosarium 0:892175366555 446 }
rosarium 0:892175366555 447
rosarium 0:892175366555 448 /**
rosarium 0:892175366555 449 * @brief This function read the NDEF content of the TAG.
rosarium 0:892175366555 450 * @param pNDEF : pointer on the buffer to store NDEF data.
rosarium 0:892175366555 451 * @retval NDEF_OK : NDEF file data retrieve and store in the buffer.
rosarium 0:892175366555 452 * @retval NDEF_ERROR : not able to read NDEF from tag.
rosarium 0:892175366555 453 * @retval NDEF_ERROR_MEMORY_INTERNAL : Cannot read tag.
rosarium 0:892175366555 454 * @retval NDEF_ERROR_NOT_FORMATED : CCFile data not supported or not present.
rosarium 0:892175366555 455 * @retval NDEF_ERROR_MEMORY_TAG : Size not compatible with memory.
rosarium 0:892175366555 456 * @retval NDEF_ERROR_LOCKED : Tag locked, cannot be read.
rosarium 0:892175366555 457 */
rosarium 0:892175366555 458 uint16_t NDEF::NDEF_ReadNDEF( uint8_t* pNDEF )
rosarium 0:892175366555 459 {
rosarium 0:892175366555 460 uint16_t status = NDEF_ERROR;
rosarium 0:892175366555 461 uint16_t NDEF_Size = 0;
rosarium 0:892175366555 462
rosarium 0:892175366555 463 status = ReadData( 0, 2, pNDEF );
rosarium 0:892175366555 464
rosarium 0:892175366555 465 if( status == NDEF_OK )
rosarium 0:892175366555 466 {
rosarium 0:892175366555 467 NDEF_Size = (uint16_t)(*pNDEF << 8);
rosarium 0:892175366555 468 NDEF_Size = NDEF_Size | (uint16_t)(*++pNDEF );
rosarium 0:892175366555 469
rosarium 0:892175366555 470 status = ReadData( 0, NDEF_Size + 2, --pNDEF );
rosarium 0:892175366555 471 }
rosarium 0:892175366555 472
rosarium 0:892175366555 473 return status;
rosarium 0:892175366555 474 }
rosarium 0:892175366555 475
rosarium 0:892175366555 476 /**
rosarium 0:892175366555 477 * @brief This function write the NDEF in the TAG.
rosarium 0:892175366555 478 * @param pNDEF : pointer on the buffer containing the NDEF data.
rosarium 0:892175366555 479 * @retval NDEF_OK : NDEF file data written in the tag.
rosarium 0:892175366555 480 * @retval NDEF_ERROR : not able to store NDEF in tag.
rosarium 0:892175366555 481 * @retval NDEF_ERROR_MEMORY_INTERNAL : Cannot write to tag.
rosarium 0:892175366555 482 * @retval NDEF_ERROR_NOT_FORMATED : CCFile data not supported or not present.
rosarium 0:892175366555 483 * @retval NDEF_ERROR_MEMORY_TAG : Size not compatible with memory.
rosarium 0:892175366555 484 * @retval NDEF_ERROR_LOCKED : Tag locked, cannot be write.
rosarium 0:892175366555 485 */
rosarium 0:892175366555 486 uint16_t NDEF::NDEF_WriteNDEF( uint8_t *pNDEF )
rosarium 0:892175366555 487 {
rosarium 0:892175366555 488 uint16_t status = NDEF_ERROR;
rosarium 0:892175366555 489 uint16_t NDEF_Size = 0;
rosarium 0:892175366555 490
rosarium 0:892175366555 491 NDEF_Size = (uint16_t)(*pNDEF << 8);
rosarium 0:892175366555 492 NDEF_Size = NDEF_Size | (uint16_t)(*++pNDEF );
rosarium 0:892175366555 493
rosarium 0:892175366555 494 status = WriteData( 0, NDEF_Size + 2, --pNDEF );
rosarium 0:892175366555 495
rosarium 0:892175366555 496 return status;
rosarium 0:892175366555 497 }
rosarium 0:892175366555 498
rosarium 0:892175366555 499 /**
rosarium 0:892175366555 500 * @brief This function identify the NDEF message stored in tag.
rosarium 0:892175366555 501 * @param pRecordStruct : Structure to fill with record information.
rosarium 0:892175366555 502 * @param pNDEF : pointer on the NDEF message data.
rosarium 0:892175366555 503 * @retval NDEF_OK : record struct filled.
rosarium 0:892175366555 504 * @retval NDEF_ERROR : record struct not updated.
rosarium 0:892175366555 505 */
rosarium 0:892175366555 506 uint16_t NDEF::NDEF_IdentifyBuffer( sRecordInfo *pRecordStruct, uint8_t* pNDEF )
rosarium 0:892175366555 507 {
rosarium 0:892175366555 508 uint16_t SizeOfRecordHeader, TypeNbByte, PayloadLengthField, IDLengthField, IDNbByte;
rosarium 0:892175366555 509
rosarium 0:892175366555 510 /* Is ID length field present */
rosarium 0:892175366555 511 if( (*pNDEF) & IL_Mask )
rosarium 0:892175366555 512 {
rosarium 0:892175366555 513 IDLengthField = ID_LENGTH_FIELD;
rosarium 0:892175366555 514 }
rosarium 0:892175366555 515 else
rosarium 0:892175366555 516 {
rosarium 0:892175366555 517 IDLengthField = 0;
rosarium 0:892175366555 518 }
rosarium 0:892175366555 519
rosarium 0:892175366555 520 /* it's a SR */
rosarium 0:892175366555 521 if( (*pNDEF) & SR_Mask )
rosarium 0:892175366555 522 {
rosarium 0:892175366555 523 /* Analyse short record layout */
rosarium 0:892175366555 524 TypeNbByte = pNDEF[1];
rosarium 0:892175366555 525 PayloadLengthField = 1;
rosarium 0:892175366555 526 if( IDLengthField == ID_LENGTH_FIELD )
rosarium 0:892175366555 527 IDNbByte = pNDEF[3];
rosarium 0:892175366555 528 else
rosarium 0:892175366555 529 IDNbByte = 0;
rosarium 0:892175366555 530 }
rosarium 0:892175366555 531 else
rosarium 0:892175366555 532 {
rosarium 0:892175366555 533 /* Analyse normal record layout */
rosarium 0:892175366555 534 TypeNbByte = pNDEF[1];
rosarium 0:892175366555 535 PayloadLengthField = 4;
rosarium 0:892175366555 536 if( IDLengthField == ID_LENGTH_FIELD )
rosarium 0:892175366555 537 IDNbByte = pNDEF[6];
rosarium 0:892175366555 538 else
rosarium 0:892175366555 539 IDNbByte = 0;
rosarium 0:892175366555 540 }
rosarium 0:892175366555 541
rosarium 0:892175366555 542 SizeOfRecordHeader = RECORD_FLAG_FIELD + TYPE_LENGTH_FIELD + PayloadLengthField + IDLengthField + TypeNbByte + IDNbByte;
rosarium 0:892175366555 543
rosarium 0:892175366555 544 /* it's a SR */
rosarium 0:892175366555 545 if( pNDEF[0] & SR_Mask )
rosarium 0:892175366555 546 {
rosarium 0:892175366555 547 pRecordStruct->RecordFlags = pNDEF[0];
rosarium 0:892175366555 548 pRecordStruct->TypeLength = TypeNbByte;
rosarium 0:892175366555 549 pRecordStruct->PayloadLength3 = 0;
rosarium 0:892175366555 550 pRecordStruct->PayloadLength2 = 0;
rosarium 0:892175366555 551 pRecordStruct->PayloadLength1 = 0;
rosarium 0:892175366555 552 pRecordStruct->PayloadLength0 = pNDEF[2];
rosarium 0:892175366555 553 pRecordStruct->IDLength = IDNbByte;
rosarium 0:892175366555 554 memcpy( pRecordStruct->Type, &pNDEF[3+IDNbByte], TypeNbByte );
rosarium 0:892175366555 555 memcpy( pRecordStruct->ID, &pNDEF[3+IDNbByte+TypeNbByte], IDNbByte );
rosarium 0:892175366555 556 pRecordStruct->PayloadOffset = SizeOfRecordHeader;
rosarium 0:892175366555 557 }
rosarium 0:892175366555 558 else
rosarium 0:892175366555 559 {
rosarium 0:892175366555 560 pRecordStruct->RecordFlags = pNDEF[0];
rosarium 0:892175366555 561 pRecordStruct->TypeLength = TypeNbByte;
rosarium 0:892175366555 562 pRecordStruct->PayloadLength3 = pNDEF[2];
rosarium 0:892175366555 563 pRecordStruct->PayloadLength2 = pNDEF[3];
rosarium 0:892175366555 564 pRecordStruct->PayloadLength1 = pNDEF[4];
rosarium 0:892175366555 565 pRecordStruct->PayloadLength0 = pNDEF[5];
rosarium 0:892175366555 566 pRecordStruct->IDLength = IDNbByte;
rosarium 0:892175366555 567 memcpy( pRecordStruct->Type, &pNDEF[6+IDNbByte], TypeNbByte );
rosarium 0:892175366555 568 memcpy( pRecordStruct->ID, &pNDEF[6+IDNbByte+TypeNbByte], IDNbByte );
rosarium 0:892175366555 569 pRecordStruct->PayloadOffset = SizeOfRecordHeader;
rosarium 0:892175366555 570 }
rosarium 0:892175366555 571
rosarium 0:892175366555 572 pRecordStruct->PayloadBufferAdd = (uint32_t)(&pNDEF[pRecordStruct->PayloadOffset]);
rosarium 0:892175366555 573
rosarium 0:892175366555 574 NDEF_ParseRecordHeader( pRecordStruct );
rosarium 0:892175366555 575
rosarium 0:892175366555 576 return NDEF_OK;
rosarium 0:892175366555 577 }
rosarium 0:892175366555 578
rosarium 0:892175366555 579 /**
rosarium 0:892175366555 580 * @}
rosarium 0:892175366555 581 */
rosarium 0:892175366555 582
rosarium 0:892175366555 583 /**
rosarium 0:892175366555 584 * @}
rosarium 0:892175366555 585 */
rosarium 0:892175366555 586
rosarium 0:892175366555 587 /**
rosarium 0:892175366555 588 * @}
rosarium 0:892175366555 589 */
rosarium 0:892175366555 590
rosarium 0:892175366555 591 /******************* (C) COPYRIGHT 2016 STMicroelectronics *****END OF FILE****/