Complete mbed library/workspace for HelloWorld_NFC02A1

Dependencies:   NDefLib X_NUCLEO_NFC02A1 mbed

Fork of HelloWorld_NFC02A1 by ST Expansion SW Team

X-NUCLEO-NFC02A1 Dynamic NFC Tag Expansion Board Firmware Package

Introduction

This firmware package includes Components Device Drivers, Board Support Package and example applications for STMicroelectronics X-NUCLEO-NFC02A1 Dynamic NFC Tag Expansion Board based on M24LR.

Example Application

This is just a simple "hello world" style program for the X-NUCLEO-NFC02A1 Dynamic NFC Tag Expansion Board. The program writes a URI link to the M24LR dynamic tag using the synchronous programming model. It then reads back the URI from the tag to display it on terminal. The URI can also be retrieved from an NFC enabled smartphone/tablet.

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****/