NFC NDEF library

Dependents:   Nucleo_NFC_Example I2C_NFC_Master Print_Entire_Nucleo_NFC01A1_Memory

Fork of lib_NDEF by Enrico Gregoratto

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

Who changed what in which revision?

UserRevisionLine numberNew contents of line
EnricoG 0:3b093bd0819e 1 /**
EnricoG 0:3b093bd0819e 2 ******************************************************************************
EnricoG 0:3b093bd0819e 3 * @file lib_NDEF_AAR.c
EnricoG 0:3b093bd0819e 4 * @author MMY Application Team
EnricoG 0:3b093bd0819e 5 * @version V1.0.0
EnricoG 0:3b093bd0819e 6 * @date 20-November-2013
EnricoG 0:3b093bd0819e 7 * @brief This file help to add AAR to NDEF file.
EnricoG 0:3b093bd0819e 8 ******************************************************************************
EnricoG 0:3b093bd0819e 9 * @attention
EnricoG 0:3b093bd0819e 10 *
EnricoG 0:3b093bd0819e 11 * <h2><center>&copy; COPYRIGHT 2014 STMicroelectronics</center></h2>
EnricoG 0:3b093bd0819e 12 *
EnricoG 0:3b093bd0819e 13 * Licensed under MMY-ST Liberty SW License Agreement V2, (the "License");
EnricoG 0:3b093bd0819e 14 * You may not use this file except in compliance with the License.
EnricoG 0:3b093bd0819e 15 * You may obtain a copy of the License at:
EnricoG 0:3b093bd0819e 16 *
EnricoG 0:3b093bd0819e 17 * http://www.st.com/software_license_agreement_liberty_v2
EnricoG 0:3b093bd0819e 18 *
EnricoG 0:3b093bd0819e 19 * Unless required by applicable law or agreed to in writing, software
EnricoG 0:3b093bd0819e 20 * distributed under the License is distributed on an "AS IS" BASIS,
EnricoG 0:3b093bd0819e 21 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
EnricoG 0:3b093bd0819e 22 * See the License for the specific language governing permissions and
EnricoG 0:3b093bd0819e 23 * limitations under the License.
EnricoG 0:3b093bd0819e 24 *
EnricoG 0:3b093bd0819e 25 ******************************************************************************
EnricoG 0:3b093bd0819e 26 */
EnricoG 0:3b093bd0819e 27 /* Includes ------------------------------------------------------------------*/
EnricoG 0:3b093bd0819e 28 #include "lib_NDEF_AAR.h"
EnricoG 0:3b093bd0819e 29
EnricoG 0:3b093bd0819e 30 /** @addtogroup NFC_libraries
EnricoG 0:3b093bd0819e 31 * @{
EnricoG 0:3b093bd0819e 32 * @brief <b>This is the library used to manage the content of the TAG (data)
EnricoG 0:3b093bd0819e 33 * But also the specific feature of the tag, for instance
EnricoG 0:3b093bd0819e 34 * password, gpo... </b>
EnricoG 0:3b093bd0819e 35 */
EnricoG 0:3b093bd0819e 36
EnricoG 0:3b093bd0819e 37
EnricoG 0:3b093bd0819e 38 /** @addtogroup libNFC_FORUM
EnricoG 0:3b093bd0819e 39 * @{
EnricoG 0:3b093bd0819e 40 * @brief This part of the library manage data which follow NFC forum organisation.
EnricoG 0:3b093bd0819e 41 */
EnricoG 0:3b093bd0819e 42
EnricoG 0:3b093bd0819e 43 /**
EnricoG 0:3b093bd0819e 44 * @brief This buffer contains the data send/received by TAG
EnricoG 0:3b093bd0819e 45 */
EnricoG 0:3b093bd0819e 46 extern uint8_t NDEF_Buffer [NDEF_MAX_SIZE];
EnricoG 0:3b093bd0819e 47
EnricoG 0:3b093bd0819e 48 /** @defgroup libAAR_Private_Functions
EnricoG 0:3b093bd0819e 49 * @{
EnricoG 0:3b093bd0819e 50 */
EnricoG 0:3b093bd0819e 51
EnricoG 0:3b093bd0819e 52 /**
EnricoG 0:3b093bd0819e 53 * @}
EnricoG 0:3b093bd0819e 54 */
EnricoG 0:3b093bd0819e 55
EnricoG 0:3b093bd0819e 56 /** @defgroup libAAR_Public_Functions
EnricoG 0:3b093bd0819e 57 * @{
EnricoG 0:3b093bd0819e 58 * @brief This file is used to manage AAR (stored or loaded in tag)
EnricoG 0:3b093bd0819e 59 */
EnricoG 0:3b093bd0819e 60
EnricoG 0:3b093bd0819e 61
EnricoG 0:3b093bd0819e 62 /**
EnricoG 0:3b093bd0819e 63 * @brief This fonction add AAR (Android Application Record) in the tag
EnricoG 0:3b093bd0819e 64 * @param pAARStruct : pointer on structure that contain AAR information
EnricoG 0:3b093bd0819e 65 * @retval SUCCESS : AAR added
EnricoG 0:3b093bd0819e 66 * @retval ERROR : Not able to add AAR
EnricoG 0:3b093bd0819e 67 */
EnricoG 0:3b093bd0819e 68 uint16_t NDEF_AddAAR ( sAARInfo *pAARStruct )
EnricoG 0:3b093bd0819e 69 {
EnricoG 0:3b093bd0819e 70 uint16_t status = ERROR;
EnricoG 0:3b093bd0819e 71 uint16_t DataSize;
EnricoG 0:3b093bd0819e 72 uint16_t Offset=0;
EnricoG 0:3b093bd0819e 73 uint32_t AAROffset = 0;
EnricoG 0:3b093bd0819e 74 uint16_t NDEF_Size = 0;
EnricoG 0:3b093bd0819e 75 uint8_t RecordFlag=0;
EnricoG 0:3b093bd0819e 76 uint8_t AARRecordFlag;
EnricoG 0:3b093bd0819e 77
EnricoG 0:3b093bd0819e 78 /* AAR: External Type Record Header */
EnricoG 0:3b093bd0819e 79 /************************************/
EnricoG 0:3b093bd0819e 80 /* 7 | 6 | 5 | 4 | 3 | 2 1 0 */
EnricoG 0:3b093bd0819e 81 /*----------------------------------*/
EnricoG 0:3b093bd0819e 82 /* MB ME CF SR IL TNF */ /* <---- IL=0, CF=0 and SR=1 TNF=4 NFC Forum external type*/
EnricoG 0:3b093bd0819e 83 /*----------------------------------*/
EnricoG 0:3b093bd0819e 84 /* TYPE LENGTH */
EnricoG 0:3b093bd0819e 85 /*----------------------------------*/
EnricoG 0:3b093bd0819e 86 /* PAYLOAD LENGTH 3 */ /* <---- Not Used */
EnricoG 0:3b093bd0819e 87 /*----------------------------------*/
EnricoG 0:3b093bd0819e 88 /* PAYLOAD LENGTH 2 */ /* <---- Not Used */
EnricoG 0:3b093bd0819e 89 /*----------------------------------*/
EnricoG 0:3b093bd0819e 90 /* PAYLOAD LENGTH 1 */ /* <---- Not Used */
EnricoG 0:3b093bd0819e 91 /*----------------------------------*/
EnricoG 0:3b093bd0819e 92 /* PAYLOAD LENGTH 0 */
EnricoG 0:3b093bd0819e 93 /*----------------------------------*/
EnricoG 0:3b093bd0819e 94 /* ID LENGTH */ /* <---- Not Used */
EnricoG 0:3b093bd0819e 95 /*----------------------------------*/
EnricoG 0:3b093bd0819e 96 /* TYPE */ /* android.com:pkg */
EnricoG 0:3b093bd0819e 97 /*----------------------------------*/
EnricoG 0:3b093bd0819e 98 /* ID */ /* <---- Not Used */
EnricoG 0:3b093bd0819e 99 /************************************/
EnricoG 0:3b093bd0819e 100
EnricoG 0:3b093bd0819e 101 /* Do we have to add AAR to an existing NDEF message */
EnricoG 0:3b093bd0819e 102 /* retrieve current NDEF size and current record flag*/
EnricoG 0:3b093bd0819e 103 status = ForceReadData( 0 , 3 , NDEF_Buffer);
EnricoG 0:3b093bd0819e 104
EnricoG 0:3b093bd0819e 105 if( status == NDEF_ACTION_COMPLETED)
EnricoG 0:3b093bd0819e 106 {
EnricoG 0:3b093bd0819e 107 NDEF_Size = (uint16_t) (NDEF_Buffer[0] << 8);
EnricoG 0:3b093bd0819e 108 NDEF_Size = NDEF_Size | (uint16_t) (NDEF_Buffer[1]);
EnricoG 0:3b093bd0819e 109 RecordFlag = NDEF_Buffer[2];
EnricoG 0:3b093bd0819e 110 }
EnricoG 0:3b093bd0819e 111
EnricoG 0:3b093bd0819e 112 if( NDEF_Size != 0)
EnricoG 0:3b093bd0819e 113 {
EnricoG 0:3b093bd0819e 114 AAROffset = NDEF_Size +2;
EnricoG 0:3b093bd0819e 115 RecordFlag &= 0xBF; /* remove ME flag on NDEF */
EnricoG 0:3b093bd0819e 116 AARRecordFlag = 0x54; /* don't put MB flag */
EnricoG 0:3b093bd0819e 117 }
EnricoG 0:3b093bd0819e 118 else
EnricoG 0:3b093bd0819e 119 {
EnricoG 0:3b093bd0819e 120 AAROffset = 2;
EnricoG 0:3b093bd0819e 121 AARRecordFlag = 0xD4; /* put MB and ME flag */
EnricoG 0:3b093bd0819e 122 }
EnricoG 0:3b093bd0819e 123
EnricoG 0:3b093bd0819e 124 /* fill AAR record header */
EnricoG 0:3b093bd0819e 125 Offset = 0;
EnricoG 0:3b093bd0819e 126 NDEF_Buffer[Offset++] = AARRecordFlag; /* Record Flag */
EnricoG 0:3b093bd0819e 127 NDEF_Buffer[Offset++] = AAR_TYPE_STRING_LENGTH;
EnricoG 0:3b093bd0819e 128 NDEF_Buffer[Offset++] = 0x00; /* Will be filled at the end when payload size is known */
EnricoG 0:3b093bd0819e 129
EnricoG 0:3b093bd0819e 130 memcpy(&NDEF_Buffer[Offset], AAR_TYPE_STRING, AAR_TYPE_STRING_LENGTH);
EnricoG 0:3b093bd0819e 131
EnricoG 0:3b093bd0819e 132 /* fill AAR payload */
EnricoG 0:3b093bd0819e 133 memcpy( &NDEF_Buffer[Offset + AAR_TYPE_STRING_LENGTH], pAARStruct->PakageName,strlen(pAARStruct->PakageName));
EnricoG 0:3b093bd0819e 134
EnricoG 0:3b093bd0819e 135 NDEF_Buffer[2] = strlen(pAARStruct->PakageName);
EnricoG 0:3b093bd0819e 136
EnricoG 0:3b093bd0819e 137 DataSize = Offset + AAR_TYPE_STRING_LENGTH + strlen(pAARStruct->PakageName);
EnricoG 0:3b093bd0819e 138
EnricoG 0:3b093bd0819e 139 /* Write NDEF */
EnricoG 0:3b093bd0819e 140 status = WriteData ( AAROffset , DataSize , NDEF_Buffer);
EnricoG 0:3b093bd0819e 141
EnricoG 0:3b093bd0819e 142 /* Write NDEF size to complete*/
EnricoG 0:3b093bd0819e 143 if( status == NDEF_ACTION_COMPLETED)
EnricoG 0:3b093bd0819e 144 {
EnricoG 0:3b093bd0819e 145 DataSize = NDEF_Size + DataSize; /* Must add to the NDEF size the size of the AAR record*/
EnricoG 0:3b093bd0819e 146 NDEF_Buffer[0] = (DataSize & 0xFF00)>>8;
EnricoG 0:3b093bd0819e 147 NDEF_Buffer[1] = (DataSize & 0x00FF);
EnricoG 0:3b093bd0819e 148 if( NDEF_Size != 0)
EnricoG 0:3b093bd0819e 149 {
EnricoG 0:3b093bd0819e 150 NDEF_Buffer[2] = RecordFlag;
EnricoG 0:3b093bd0819e 151 status = WriteData ( 0x00 , 3 , NDEF_Buffer);
EnricoG 0:3b093bd0819e 152 }
EnricoG 0:3b093bd0819e 153 else
EnricoG 0:3b093bd0819e 154 status = WriteData ( 0x00 , 2 , NDEF_Buffer);
EnricoG 0:3b093bd0819e 155 }
EnricoG 0:3b093bd0819e 156
EnricoG 0:3b093bd0819e 157
EnricoG 0:3b093bd0819e 158 if( status == NDEF_ACTION_COMPLETED)
EnricoG 0:3b093bd0819e 159 return SUCCESS;
EnricoG 0:3b093bd0819e 160 else
EnricoG 0:3b093bd0819e 161 return ERROR;
EnricoG 0:3b093bd0819e 162 }
EnricoG 0:3b093bd0819e 163
EnricoG 0:3b093bd0819e 164
EnricoG 0:3b093bd0819e 165 /**
EnricoG 0:3b093bd0819e 166 * @}
EnricoG 0:3b093bd0819e 167 */
EnricoG 0:3b093bd0819e 168
EnricoG 0:3b093bd0819e 169 /**
EnricoG 0:3b093bd0819e 170 * @}
EnricoG 0:3b093bd0819e 171 */
EnricoG 0:3b093bd0819e 172
EnricoG 0:3b093bd0819e 173 /**
EnricoG 0:3b093bd0819e 174 * @}
EnricoG 0:3b093bd0819e 175 */
EnricoG 0:3b093bd0819e 176
EnricoG 0:3b093bd0819e 177 /******************* (C) COPYRIGHT 2013 STMicroelectronics *****END OF FILE****/
EnricoG 0:3b093bd0819e 178
EnricoG 0:3b093bd0819e 179