mbed OS 5 example application using X-NUCLEO-NFC02A1

Dependencies:   NDefLib X_NUCLEO_NFC02A1

Fork of HelloWorld_NFC02A1 by ST

Committer:
rosarium
Date:
Tue Aug 30 09:18:50 2016 +0000
Revision:
1:11ae12d41082
Child:
2:6f1b1f7f8d12
NDefLib middle-ware library ported on HelloWorld_NFC02A1. Now NFC02A1 using the same middle-ware library as NFC01A1.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
rosarium 1:11ae12d41082 1 /**
rosarium 1:11ae12d41082 2 ******************************************************************************
rosarium 1:11ae12d41082 3 * @file NdefNfcTagM24LR.cpp
rosarium 1:11ae12d41082 4 * @author AMG Central Lab
rosarium 1:11ae12d41082 5 * @version V1.0.0
rosarium 1:11ae12d41082 6 * @date 30 Aug 2016
rosarium 1:11ae12d41082 7 * @brief Wrapper class of the NDefLib library to write/read NDEF messages.
rosarium 1:11ae12d41082 8 ******************************************************************************
rosarium 1:11ae12d41082 9 * @attention
rosarium 1:11ae12d41082 10 *
rosarium 1:11ae12d41082 11 * <h2><center>&copy; COPYRIGHT(c) 2016 STMicroelectronics</center></h2>
rosarium 1:11ae12d41082 12 *
rosarium 1:11ae12d41082 13 * Redistribution and use in source and binary forms, with or without modification,
rosarium 1:11ae12d41082 14 * are permitted provided that the following conditions are met:
rosarium 1:11ae12d41082 15 * 1. Redistributions of source code must retain the above copyright notice,
rosarium 1:11ae12d41082 16 * this list of conditions and the following disclaimer.
rosarium 1:11ae12d41082 17 * 2. Redistributions in binary form must reproduce the above copyright notice,
rosarium 1:11ae12d41082 18 * this list of conditions and the following disclaimer in the documentation
rosarium 1:11ae12d41082 19 * and/or other materials provided with the distribution.
rosarium 1:11ae12d41082 20 * 3. Neither the name of STMicroelectronics nor the names of its contributors
rosarium 1:11ae12d41082 21 * may be used to endorse or promote products derived from this software
rosarium 1:11ae12d41082 22 * without specific prior written permission.
rosarium 1:11ae12d41082 23 *
rosarium 1:11ae12d41082 24 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
rosarium 1:11ae12d41082 25 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
rosarium 1:11ae12d41082 26 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
rosarium 1:11ae12d41082 27 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
rosarium 1:11ae12d41082 28 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
rosarium 1:11ae12d41082 29 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
rosarium 1:11ae12d41082 30 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
rosarium 1:11ae12d41082 31 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
rosarium 1:11ae12d41082 32 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
rosarium 1:11ae12d41082 33 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
rosarium 1:11ae12d41082 34 *
rosarium 1:11ae12d41082 35 ******************************************************************************
rosarium 1:11ae12d41082 36 */
rosarium 1:11ae12d41082 37
rosarium 1:11ae12d41082 38
rosarium 1:11ae12d41082 39 #include <cmath>
rosarium 1:11ae12d41082 40
rosarium 1:11ae12d41082 41 #include "NDefNfcTagM24LR.h"
rosarium 1:11ae12d41082 42
rosarium 1:11ae12d41082 43
rosarium 1:11ae12d41082 44 /* wait 1sec, driver is configured to let 200ms for command to complete */
rosarium 1:11ae12d41082 45 /* which is enough for all commands except GetSession if RF session is already opened */
rosarium 1:11ae12d41082 46 /* Smartphone generally releases the session within the second, anyway the user can modify this value */
rosarium 1:11ae12d41082 47 #define OPENSESSION_NTRIALS 5
rosarium 1:11ae12d41082 48
rosarium 1:11ae12d41082 49 #define CC_FILE_LENGTH_BYTE 15
rosarium 1:11ae12d41082 50
rosarium 1:11ae12d41082 51
rosarium 1:11ae12d41082 52 /**
rosarium 1:11ae12d41082 53 * @brief This function read the data stored in NDEF file at defined offset.
rosarium 1:11ae12d41082 54 * @param Offset : Offset in the NDEF file.
rosarium 1:11ae12d41082 55 * @param DataSize : Number of byte to read.
rosarium 1:11ae12d41082 56 * @param pData : pointer on buffer to store read data.
rosarium 1:11ae12d41082 57 * @retval NDEF_ERROR_MEMORY_INTERNAL : Size not compatible with memory.
rosarium 1:11ae12d41082 58 * @retval NDEF_ERROR_NOT_FORMATED : CCFile data not supported.
rosarium 1:11ae12d41082 59 * @retval NDEF_ERROR : No NDEF in the tag.
rosarium 1:11ae12d41082 60 * @retval NDEF_OK : The operation is completed.
rosarium 1:11ae12d41082 61 */
rosarium 1:11ae12d41082 62 uint16_t NDefNfcTagM24LR::ReadData( uint16_t Offset , uint16_t DataSize , uint8_t* pData )
rosarium 1:11ae12d41082 63 {
rosarium 1:11ae12d41082 64 uint16_t status = NDEF_ERROR;
rosarium 1:11ae12d41082 65 uint8_t atlv_detect[4];
rosarium 1:11ae12d41082 66 uint8_t index = 0;
rosarium 1:11ae12d41082 67
rosarium 1:11ae12d41082 68 /* Do not include length bytes */
rosarium 1:11ae12d41082 69 DataSize -= FIRST_RECORD_OFFSET;
rosarium 1:11ae12d41082 70
rosarium 1:11ae12d41082 71 /* If too many data to write return error */
rosarium 1:11ae12d41082 72 if( DataSize > NDEF_MAX_SIZE )
rosarium 1:11ae12d41082 73 {
rosarium 1:11ae12d41082 74 return NDEF_ERROR_MEMORY_INTERNAL;
rosarium 1:11ae12d41082 75 }
rosarium 1:11ae12d41082 76
rosarium 1:11ae12d41082 77 /* Detect NDEF message in memory */
rosarium 1:11ae12d41082 78 status = NfcType5_NDEFDetection( );
rosarium 1:11ae12d41082 79 if( status != NDEF_OK )
rosarium 1:11ae12d41082 80 {
rosarium 1:11ae12d41082 81 return status;
rosarium 1:11ae12d41082 82 }
rosarium 1:11ae12d41082 83
rosarium 1:11ae12d41082 84 /* Read TL of Type 5 */
rosarium 1:11ae12d41082 85 status = NDefReadByte(CCFileStruct.NDEF_offset, 4, atlv_detect);
rosarium 1:11ae12d41082 86 if( status != NDEF_OK )
rosarium 1:11ae12d41082 87 {
rosarium 1:11ae12d41082 88 return status;
rosarium 1:11ae12d41082 89 }
rosarium 1:11ae12d41082 90
rosarium 1:11ae12d41082 91 /* Check if L is on 3 or 1 byte and update length in buffer */
rosarium 1:11ae12d41082 92 if( atlv_detect[1] == NFCT5_3_BYTES_L_TLV )
rosarium 1:11ae12d41082 93 {
rosarium 1:11ae12d41082 94 pData[0] = atlv_detect[2];
rosarium 1:11ae12d41082 95 pData[1] = atlv_detect[3];
rosarium 1:11ae12d41082 96 index += 4;
rosarium 1:11ae12d41082 97 }
rosarium 1:11ae12d41082 98 else
rosarium 1:11ae12d41082 99 {
rosarium 1:11ae12d41082 100 pData[0] = 0x00;
rosarium 1:11ae12d41082 101 pData[1] = atlv_detect[1];
rosarium 1:11ae12d41082 102 index += 2;
rosarium 1:11ae12d41082 103 }
rosarium 1:11ae12d41082 104
rosarium 1:11ae12d41082 105 /* Check CC file is in the correct mode to proceed */
rosarium 1:11ae12d41082 106 if( CCFileStruct.State == TT5_INITIALIZED )
rosarium 1:11ae12d41082 107 {
rosarium 1:11ae12d41082 108 return NDEF_ERROR;
rosarium 1:11ae12d41082 109 }
rosarium 1:11ae12d41082 110
rosarium 1:11ae12d41082 111 if( ((Offset == 0) && (DataSize > 0)) || (Offset > 0) )
rosarium 1:11ae12d41082 112 {
rosarium 1:11ae12d41082 113 /* Read NDEF */
rosarium 1:11ae12d41082 114 if( NDefReadByte(CCFileStruct.NDEF_offset + index + Offset, DataSize, (pData + FIRST_RECORD_OFFSET)) != NFC_OK )
rosarium 1:11ae12d41082 115 {
rosarium 1:11ae12d41082 116 return NDEF_ERROR;
rosarium 1:11ae12d41082 117 }
rosarium 1:11ae12d41082 118 }
rosarium 1:11ae12d41082 119
rosarium 1:11ae12d41082 120 return NDEF_OK;
rosarium 1:11ae12d41082 121 }
rosarium 1:11ae12d41082 122
rosarium 1:11ae12d41082 123 /**
rosarium 1:11ae12d41082 124 * @brief This function writes data in NDEF file at defined offset.
rosarium 1:11ae12d41082 125 * @param Offset : Offset in the NDEF file.
rosarium 1:11ae12d41082 126 * @param DataSize : Number of byte to write.
rosarium 1:11ae12d41082 127 * @param pData : pointer on buffer to copy.
rosarium 1:11ae12d41082 128 * @retval NDEF_ERROR_MEMORY_INTERNAL : Size not compatible with memory.
rosarium 1:11ae12d41082 129 * @retval NDEF_ERROR_NOT_FORMATED : CCFile data not supported.
rosarium 1:11ae12d41082 130 * @retval NDEF_ERROR : No NDEF in the tag.
rosarium 1:11ae12d41082 131 * @retval NDEF_OK : The operation is completed.
rosarium 1:11ae12d41082 132 */
rosarium 1:11ae12d41082 133 uint16_t NDefNfcTagM24LR::WriteData( uint16_t Offset , uint32_t DataSize , uint8_t *pData )
rosarium 1:11ae12d41082 134 {
rosarium 1:11ae12d41082 135 uint8_t atlv[4];
rosarium 1:11ae12d41082 136 uint8_t index = 0;
rosarium 1:11ae12d41082 137 uint16_t NDEF_Size = 0;
rosarium 1:11ae12d41082 138 bool status;
rosarium 1:11ae12d41082 139
rosarium 1:11ae12d41082 140 /* Do not include length bytes */
rosarium 1:11ae12d41082 141 DataSize -= FIRST_RECORD_OFFSET;
rosarium 1:11ae12d41082 142
rosarium 1:11ae12d41082 143 /* If too many data to write return error */
rosarium 1:11ae12d41082 144 if( DataSize > NDEF_MAX_SIZE )
rosarium 1:11ae12d41082 145 {
rosarium 1:11ae12d41082 146 return NDEF_ERROR_MEMORY_INTERNAL;
rosarium 1:11ae12d41082 147 }
rosarium 1:11ae12d41082 148
rosarium 1:11ae12d41082 149 /* Detect NDEF message in memory */
rosarium 1:11ae12d41082 150 if( NfcType5_NDEFDetection( ) != NDEF_OK )
rosarium 1:11ae12d41082 151 {
rosarium 1:11ae12d41082 152 return NDEF_ERROR;
rosarium 1:11ae12d41082 153 }
rosarium 1:11ae12d41082 154
rosarium 1:11ae12d41082 155 /* Extract NDEF Size from buffer */
rosarium 1:11ae12d41082 156 NDEF_Size = (uint16_t)(pData[0] << 8);
rosarium 1:11ae12d41082 157 NDEF_Size = NDEF_Size | (uint16_t)(pData[1] );
rosarium 1:11ae12d41082 158
rosarium 1:11ae12d41082 159 /* If entire NDEF is written, update Length of Type 5 */
rosarium 1:11ae12d41082 160 if( DataSize == NDEF_Size )
rosarium 1:11ae12d41082 161 {
rosarium 1:11ae12d41082 162 /* Check if L is on 3 or 1 byte */
rosarium 1:11ae12d41082 163 if( NDEF_Size >= NFCT5_3_BYTES_L_TLV )
rosarium 1:11ae12d41082 164 {
rosarium 1:11ae12d41082 165 /* First init L with 0, will be updated at the end */
rosarium 1:11ae12d41082 166 atlv[1] = 0x00;
rosarium 1:11ae12d41082 167 atlv[2] = 0x00;
rosarium 1:11ae12d41082 168 atlv[3] = 0x00;
rosarium 1:11ae12d41082 169
rosarium 1:11ae12d41082 170 status = NDefWriteByte( (atlv + 1), 3, (CCFileStruct.NDEF_offset + 1));
rosarium 1:11ae12d41082 171
rosarium 1:11ae12d41082 172 index += 4;
rosarium 1:11ae12d41082 173 }
rosarium 1:11ae12d41082 174 else
rosarium 1:11ae12d41082 175 {
rosarium 1:11ae12d41082 176 /* First inti L with 0, will be updated at the end */
rosarium 1:11ae12d41082 177 atlv[1] = 0x00;
rosarium 1:11ae12d41082 178
rosarium 1:11ae12d41082 179 status = NDefWriteByte( (atlv + 1), 1, (CCFileStruct.NDEF_offset + 1));
rosarium 1:11ae12d41082 180
rosarium 1:11ae12d41082 181 index += 2;
rosarium 1:11ae12d41082 182 }
rosarium 1:11ae12d41082 183 }
rosarium 1:11ae12d41082 184
rosarium 1:11ae12d41082 185 /* Start write NDEF message to EEPROM */
rosarium 1:11ae12d41082 186 status = NDefWriteByte( (pData + FIRST_RECORD_OFFSET), DataSize, CCFileStruct.NDEF_offset + index + Offset);
rosarium 1:11ae12d41082 187 if( status != NFC_OK )
rosarium 1:11ae12d41082 188 {
rosarium 1:11ae12d41082 189 return NDEF_ERROR;
rosarium 1:11ae12d41082 190 }
rosarium 1:11ae12d41082 191
rosarium 1:11ae12d41082 192 /* If entire NDEF is written, update Length of Type 5 */
rosarium 1:11ae12d41082 193 if( DataSize == NDEF_Size )
rosarium 1:11ae12d41082 194 {
rosarium 1:11ae12d41082 195 /* Check if L is on 3 or 1 byte */
rosarium 1:11ae12d41082 196 if( NDEF_Size >= NFCT5_3_BYTES_L_TLV )
rosarium 1:11ae12d41082 197 {
rosarium 1:11ae12d41082 198 /* Update Length value */
rosarium 1:11ae12d41082 199 atlv[1] = NFCT5_3_BYTES_L_TLV;
rosarium 1:11ae12d41082 200 atlv[2] = pData[0];
rosarium 1:11ae12d41082 201 atlv[3] = pData[1];
rosarium 1:11ae12d41082 202
rosarium 1:11ae12d41082 203 status = NDefWriteByte( (atlv + 1), 3, (CCFileStruct.NDEF_offset + 1));
rosarium 1:11ae12d41082 204 }
rosarium 1:11ae12d41082 205 else
rosarium 1:11ae12d41082 206 {
rosarium 1:11ae12d41082 207 /* Update Length value */
rosarium 1:11ae12d41082 208 atlv[1] = pData[1];
rosarium 1:11ae12d41082 209
rosarium 1:11ae12d41082 210 status = NDefWriteByte( (atlv + 1), 1, (CCFileStruct.NDEF_offset + 1));
rosarium 1:11ae12d41082 211 }
rosarium 1:11ae12d41082 212
rosarium 1:11ae12d41082 213 /* Write Terminator TLV */
rosarium 1:11ae12d41082 214 atlv[0] = NFCT5_TERMINATOR_TLV;
rosarium 1:11ae12d41082 215 status = NDefWriteByte( atlv, 1, CCFileStruct.NDEF_offset + index + NDEF_Size);
rosarium 1:11ae12d41082 216 }
rosarium 1:11ae12d41082 217
rosarium 1:11ae12d41082 218 return NDEF_OK;
rosarium 1:11ae12d41082 219 }
rosarium 1:11ae12d41082 220
rosarium 1:11ae12d41082 221 /**
rosarium 1:11ae12d41082 222 * @brief This functions writes CCFile in EEPROM.
rosarium 1:11ae12d41082 223 * @Param pCCBuffer : pointer on the buffer containnig CC file.
rosarium 1:11ae12d41082 224 * @retval NFCTAG status.
rosarium 1:11ae12d41082 225 */
rosarium 1:11ae12d41082 226 uint16_t NDefNfcTagM24LR::NfcType5_WriteCCFile( const uint8_t * const pCCBuffer )
rosarium 1:11ae12d41082 227 {
rosarium 1:11ae12d41082 228 bool ret_value;
rosarium 1:11ae12d41082 229
rosarium 1:11ae12d41082 230 /* Write first block of CCFile */
rosarium 1:11ae12d41082 231 ret_value = NDefWriteByte( pCCBuffer, 0x4, 0x00);
rosarium 1:11ae12d41082 232
rosarium 1:11ae12d41082 233 /* If extended memory writes the next 4 bytes */
rosarium 1:11ae12d41082 234 if( (pCCBuffer[2] == 0x00) && (ret_value == NFC_OK) )
rosarium 1:11ae12d41082 235 {
rosarium 1:11ae12d41082 236 ret_value = NDefWriteByte( pCCBuffer + 4, 4, 0x04);
rosarium 1:11ae12d41082 237 }
rosarium 1:11ae12d41082 238
rosarium 1:11ae12d41082 239 if( ret_value != NFC_OK )
rosarium 1:11ae12d41082 240 {
rosarium 1:11ae12d41082 241 return NDEF_ERROR;
rosarium 1:11ae12d41082 242 }
rosarium 1:11ae12d41082 243
rosarium 1:11ae12d41082 244 return NDEF_OK;
rosarium 1:11ae12d41082 245 }
rosarium 1:11ae12d41082 246
rosarium 1:11ae12d41082 247
rosarium 1:11ae12d41082 248
rosarium 1:11ae12d41082 249
rosarium 1:11ae12d41082 250 uint16_t NDefNfcTagM24LR::NfcType5_ReadCCFile( uint8_t * const pCCBuffer )
rosarium 1:11ae12d41082 251 {
rosarium 1:11ae12d41082 252 bool ret_value;
rosarium 1:11ae12d41082 253
rosarium 1:11ae12d41082 254 /* Read 4 bytes of CC File */
rosarium 1:11ae12d41082 255 ret_value = NDefReadByte(0x00, 4, pCCBuffer);
rosarium 1:11ae12d41082 256
rosarium 1:11ae12d41082 257 /* If extended memory reads the next 4 bytes */
rosarium 1:11ae12d41082 258 if( (pCCBuffer[2] == 0x00) && (ret_value == NFC_OK) )
rosarium 1:11ae12d41082 259 {
rosarium 1:11ae12d41082 260 ret_value = NDefReadByte(0x04, 4, pCCBuffer + 4 );
rosarium 1:11ae12d41082 261 }
rosarium 1:11ae12d41082 262
rosarium 1:11ae12d41082 263 if( ret_value != NFC_OK )
rosarium 1:11ae12d41082 264 {
rosarium 1:11ae12d41082 265 return NDEF_ERROR;
rosarium 1:11ae12d41082 266 }
rosarium 1:11ae12d41082 267
rosarium 1:11ae12d41082 268 return NDEF_OK;
rosarium 1:11ae12d41082 269 }
rosarium 1:11ae12d41082 270 uint16_t NDefNfcTagM24LR::NfcType5_TT5Init( void )
rosarium 1:11ae12d41082 271 {
rosarium 1:11ae12d41082 272 bool ret_value = NFC_OK;
rosarium 1:11ae12d41082 273 uint16_t status;
rosarium 1:11ae12d41082 274 uint8_t accbuffer[8];
rosarium 1:11ae12d41082 275 uint8_t cdata;
rosarium 1:11ae12d41082 276
rosarium 1:11ae12d41082 277 /* Prepare buffer to update CCFile */
rosarium 1:11ae12d41082 278 accbuffer[0] = CCFileStruct.MagicNumber;
rosarium 1:11ae12d41082 279 accbuffer[1] = CCFileStruct.Version;
rosarium 1:11ae12d41082 280 accbuffer[2] = CCFileStruct.MemorySize;
rosarium 1:11ae12d41082 281 accbuffer[3] = CCFileStruct.TT5Tag;
rosarium 1:11ae12d41082 282 CCFileStruct.NDEF_offset = 0x04;
rosarium 1:11ae12d41082 283
rosarium 1:11ae12d41082 284 /* If extended memory prepare the length bytes */
rosarium 1:11ae12d41082 285 if( CCFileStruct.MemorySize == NFCT5_EXTENDED_CCFILE )
rosarium 1:11ae12d41082 286 {
rosarium 1:11ae12d41082 287 accbuffer[6] = (uint8_t)(CCFileStruct.ExtMemorySize >> 8);
rosarium 1:11ae12d41082 288 accbuffer[7] = (uint8_t)(CCFileStruct.ExtMemorySize & 0xFF);
rosarium 1:11ae12d41082 289 CCFileStruct.NDEF_offset = 0x08;
rosarium 1:11ae12d41082 290 }
rosarium 1:11ae12d41082 291
rosarium 1:11ae12d41082 292 /* Update CCFile */
rosarium 1:11ae12d41082 293 status = NfcType5_WriteCCFile( accbuffer );
rosarium 1:11ae12d41082 294 if( status != NDEF_OK )
rosarium 1:11ae12d41082 295 {
rosarium 1:11ae12d41082 296 return status;
rosarium 1:11ae12d41082 297 }
rosarium 1:11ae12d41082 298
rosarium 1:11ae12d41082 299 /* Update NDEF TLV for INITIALIZED state */
rosarium 1:11ae12d41082 300 /* Update T */
rosarium 1:11ae12d41082 301 cdata = NFCT5_NDEF_MSG_TLV;
rosarium 1:11ae12d41082 302 ret_value = NDefWriteByte( &cdata, 1, CCFileStruct.NDEF_offset);
rosarium 1:11ae12d41082 303 if( ret_value != NFC_OK )
rosarium 1:11ae12d41082 304 {
rosarium 1:11ae12d41082 305 return NDEF_ERROR;
rosarium 1:11ae12d41082 306 }
rosarium 1:11ae12d41082 307
rosarium 1:11ae12d41082 308 /* Update L */
rosarium 1:11ae12d41082 309 cdata = 0x00;
rosarium 1:11ae12d41082 310 ret_value = NDefWriteByte( &cdata, 1, (CCFileStruct.NDEF_offset + 1));
rosarium 1:11ae12d41082 311 if( ret_value != NFC_OK )
rosarium 1:11ae12d41082 312 {
rosarium 1:11ae12d41082 313 return NDEF_ERROR;
rosarium 1:11ae12d41082 314 }
rosarium 1:11ae12d41082 315
rosarium 1:11ae12d41082 316 return NDEF_OK;
rosarium 1:11ae12d41082 317 }
rosarium 1:11ae12d41082 318
rosarium 1:11ae12d41082 319
rosarium 1:11ae12d41082 320 uint16_t NDefNfcTagM24LR::NfcType5_NDEFDetection( void )
rosarium 1:11ae12d41082 321 {
rosarium 1:11ae12d41082 322 uint8_t acc_buffer[8];
rosarium 1:11ae12d41082 323 uint8_t atlv_detect[4];
rosarium 1:11ae12d41082 324 uint16_t status;
rosarium 1:11ae12d41082 325 uint32_t memory_size;
rosarium 1:11ae12d41082 326
rosarium 1:11ae12d41082 327 CCFileStruct.State = TT5_NO_NDEF;
rosarium 1:11ae12d41082 328
rosarium 1:11ae12d41082 329 /* Read CCFile */
rosarium 1:11ae12d41082 330 status = NfcType5_ReadCCFile( acc_buffer );
rosarium 1:11ae12d41082 331 if( status != NDEF_OK )
rosarium 1:11ae12d41082 332 {
rosarium 1:11ae12d41082 333 return status;
rosarium 1:11ae12d41082 334 }
rosarium 1:11ae12d41082 335
rosarium 1:11ae12d41082 336 /* Check Byte 0 is equal to magic number */
rosarium 1:11ae12d41082 337 if( ( acc_buffer[0] != NFCT5_MAGICNUMBER_E1_CCFILE ) && ( acc_buffer[0] != NFCT5_MAGICNUMBER_E2_CCFILE ) )
rosarium 1:11ae12d41082 338 {
rosarium 1:11ae12d41082 339 return NDEF_ERROR_NOT_FORMATED;
rosarium 1:11ae12d41082 340 }
rosarium 1:11ae12d41082 341 /* Check Version number */
rosarium 1:11ae12d41082 342 else if( ( (acc_buffer[1]&0xFC) != 0x40 ) )
rosarium 1:11ae12d41082 343 {
rosarium 1:11ae12d41082 344 return NDEF_ERROR_NOT_FORMATED;
rosarium 1:11ae12d41082 345 }
rosarium 1:11ae12d41082 346
rosarium 1:11ae12d41082 347 /* Check if CCFile is on 4 Bytes or 8 Bytes */
rosarium 1:11ae12d41082 348 if( acc_buffer[2] == 0x00 )
rosarium 1:11ae12d41082 349 {
rosarium 1:11ae12d41082 350 /* Update CCFIle structure */
rosarium 1:11ae12d41082 351 CCFileStruct.MemorySize = 0x0;
rosarium 1:11ae12d41082 352 CCFileStruct.ExtMemorySize = (uint16_t)acc_buffer[6];
rosarium 1:11ae12d41082 353 CCFileStruct.ExtMemorySize = ( CCFileStruct.ExtMemorySize << 8 ) | acc_buffer[7];
rosarium 1:11ae12d41082 354 memory_size = CCFileStruct.ExtMemorySize;
rosarium 1:11ae12d41082 355 CCFileStruct.NDEF_offset = 8;
rosarium 1:11ae12d41082 356 }
rosarium 1:11ae12d41082 357 else
rosarium 1:11ae12d41082 358 {
rosarium 1:11ae12d41082 359 /* Update CCFIle structure */
rosarium 1:11ae12d41082 360 CCFileStruct.MemorySize = acc_buffer[2];
rosarium 1:11ae12d41082 361 CCFileStruct.ExtMemorySize = 0x0;
rosarium 1:11ae12d41082 362 memory_size = CCFileStruct.MemorySize;
rosarium 1:11ae12d41082 363 CCFileStruct.NDEF_offset = 4;
rosarium 1:11ae12d41082 364 }
rosarium 1:11ae12d41082 365
rosarium 1:11ae12d41082 366 /* Update CCFIle structure */
rosarium 1:11ae12d41082 367 CCFileStruct.MagicNumber = acc_buffer[0];
rosarium 1:11ae12d41082 368 CCFileStruct.Version = acc_buffer[1];
rosarium 1:11ae12d41082 369 CCFileStruct.TT5Tag = acc_buffer[3];
rosarium 1:11ae12d41082 370
rosarium 1:11ae12d41082 371 /* Search for position of NDEF TLV in memory and tag status */
rosarium 1:11ae12d41082 372 while( ( NDefReadByte(CCFileStruct.NDEF_offset, 4, atlv_detect) == NFC_OK ) && ( CCFileStruct.NDEF_offset < memory_size ) )
rosarium 1:11ae12d41082 373 {
rosarium 1:11ae12d41082 374 /* Detect first NDEF Message in memory */
rosarium 1:11ae12d41082 375 if( atlv_detect[0] == NFCT5_NDEF_MSG_TLV )
rosarium 1:11ae12d41082 376 {
rosarium 1:11ae12d41082 377 if( atlv_detect[1] == 0x00 )
rosarium 1:11ae12d41082 378 {
rosarium 1:11ae12d41082 379 CCFileStruct.State = TT5_INITIALIZED;
rosarium 1:11ae12d41082 380 }
rosarium 1:11ae12d41082 381 else
rosarium 1:11ae12d41082 382 {
rosarium 1:11ae12d41082 383 if( CCFileStruct.Version & 0x3 )
rosarium 1:11ae12d41082 384 {
rosarium 1:11ae12d41082 385 CCFileStruct.State = TT5_READ;
rosarium 1:11ae12d41082 386 }
rosarium 1:11ae12d41082 387 else
rosarium 1:11ae12d41082 388 {
rosarium 1:11ae12d41082 389 CCFileStruct.State = TT5_READ_WRITE;
rosarium 1:11ae12d41082 390 }
rosarium 1:11ae12d41082 391 }
rosarium 1:11ae12d41082 392 return NDEF_OK;
rosarium 1:11ae12d41082 393 }
rosarium 1:11ae12d41082 394 /* If Proprietary NDEF jump to end of proprietary message */
rosarium 1:11ae12d41082 395 else if( atlv_detect[0] == NFCT5_PROPRIETARY_TLV )
rosarium 1:11ae12d41082 396 {
rosarium 1:11ae12d41082 397 if( atlv_detect[1] == NFCT5_3_BYTES_L_TLV )
rosarium 1:11ae12d41082 398 {
rosarium 1:11ae12d41082 399 CCFileStruct.NDEF_offset = CCFileStruct.NDEF_offset + ( (uint32_t)atlv_detect[2] << 8 ) + atlv_detect[3];
rosarium 1:11ae12d41082 400 continue;
rosarium 1:11ae12d41082 401 }
rosarium 1:11ae12d41082 402 else
rosarium 1:11ae12d41082 403 {
rosarium 1:11ae12d41082 404 CCFileStruct.NDEF_offset = CCFileStruct.NDEF_offset + atlv_detect[1];
rosarium 1:11ae12d41082 405 continue;
rosarium 1:11ae12d41082 406 }
rosarium 1:11ae12d41082 407 }
rosarium 1:11ae12d41082 408 /* if Terminator no NDEF detected */
rosarium 1:11ae12d41082 409 else if( atlv_detect[0] == NFCT5_TERMINATOR_TLV )
rosarium 1:11ae12d41082 410 {
rosarium 1:11ae12d41082 411 return NDEF_ERROR_NOT_FORMATED;
rosarium 1:11ae12d41082 412 }
rosarium 1:11ae12d41082 413
rosarium 1:11ae12d41082 414 CCFileStruct.NDEF_offset++;
rosarium 1:11ae12d41082 415 }
rosarium 1:11ae12d41082 416
rosarium 1:11ae12d41082 417 return NDEF_ERROR_NOT_FORMATED;
rosarium 1:11ae12d41082 418 }
rosarium 1:11ae12d41082 419
rosarium 1:11ae12d41082 420 bool NDefNfcTagM24LR::openSession(bool force) {
rosarium 1:11ae12d41082 421 bool status;
rosarium 1:11ae12d41082 422 // if (isSessionOpen()){
rosarium 1:11ae12d41082 423 // mCallBack->onSessionOpen(this,true);
rosarium 1:11ae12d41082 424 // return true;
rosarium 1:11ae12d41082 425 // }
rosarium 1:11ae12d41082 426 //
rosarium 1:11ae12d41082 427 // mDevice.SetCallback(&mOpenSessionCallback);
rosarium 1:11ae12d41082 428 // if(force)
rosarium 1:11ae12d41082 429 // return mDevice.ForceGetSession() == NFC_SUCCESS;
rosarium 1:11ae12d41082 430 // else
rosarium 1:11ae12d41082 431 // return mDevice.GetSession() == NFC_SUCCESS;
rosarium 1:11ae12d41082 432
rosarium 1:11ae12d41082 433 status = NfcType5_NDEFDetection();
rosarium 1:11ae12d41082 434 if ( status != NFC_SUCCESS )
rosarium 1:11ae12d41082 435 {
rosarium 1:11ae12d41082 436 CCFileStruct.MagicNumber = NFCT5_MAGICNUMBER_E1_CCFILE;
rosarium 1:11ae12d41082 437 CCFileStruct.Version = NFCT5_VERSION_V1_0;
rosarium 1:11ae12d41082 438 CCFileStruct.MemorySize = ( M24LR_MAX_SIZE / 8 ) & 0xFF;
rosarium 1:11ae12d41082 439 CCFileStruct.TT5Tag = 0x05;
rosarium 1:11ae12d41082 440 /* Init of the Type Tag 5 component (M24LR) */
rosarium 1:11ae12d41082 441 while( NfcType5_TT5Init( ) != NFC_OK );
rosarium 1:11ae12d41082 442 }
rosarium 1:11ae12d41082 443 mIsSessionOpen = 1;
rosarium 1:11ae12d41082 444 return NFC_SUCCESS;
rosarium 1:11ae12d41082 445
rosarium 1:11ae12d41082 446 }
rosarium 1:11ae12d41082 447
rosarium 1:11ae12d41082 448 bool NDefNfcTagM24LR::closeSession() {
rosarium 1:11ae12d41082 449
rosarium 1:11ae12d41082 450 return NFC_SUCCESS;
rosarium 1:11ae12d41082 451 }
rosarium 1:11ae12d41082 452 bool NDefNfcTagM24LR::writeByte(const uint8_t *buffer, uint16_t length,uint16_t offset,
rosarium 1:11ae12d41082 453 byteOperationCallback_t callback,CallbackStatus_t *callbackStatus){
rosarium 1:11ae12d41082 454 return WriteData(offset + FIRST_RECORD_OFFSET, length, (uint8_t*)buffer);
rosarium 1:11ae12d41082 455 }
rosarium 1:11ae12d41082 456 bool NDefNfcTagM24LR::readByte(const uint16_t byteOffset, const uint16_t length,
rosarium 1:11ae12d41082 457 uint8_t *buffer, byteOperationCallback_t callback,CallbackStatus_t *callbackStatus){
rosarium 1:11ae12d41082 458 return ReadData(byteOffset, length, (uint8_t*)buffer);
rosarium 1:11ae12d41082 459 }
rosarium 1:11ae12d41082 460
rosarium 1:11ae12d41082 461 bool NDefNfcTagM24LR::NDefWriteByte(const uint8_t *buffer, uint16_t length,uint16_t offset){
rosarium 1:11ae12d41082 462 return mDevice.UpdateBinary(offset, length, (uint8_t*)buffer);
rosarium 1:11ae12d41082 463 }
rosarium 1:11ae12d41082 464
rosarium 1:11ae12d41082 465
rosarium 1:11ae12d41082 466 bool NDefNfcTagM24LR::NDefReadByte(const uint16_t byteOffset, const uint16_t length, uint8_t *buffer){
rosarium 1:11ae12d41082 467 return mDevice.ReadBinary(byteOffset, length, (uint8_t*)buffer);
rosarium 1:11ae12d41082 468 }