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_MyApp.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 manage the NDEF file of a private application.
EnricoG 0:3b093bd0819e 8 ******************************************************************************
EnricoG 0:3b093bd0819e 9 * @attention
EnricoG 0:3b093bd0819e 10 *
EnricoG 0:3b093bd0819e 11 * <h2><center>&copy; COPYRIGHT 2014 STMicroelectronics</center></h2>
EnricoG 0:3b093bd0819e 12 *
EnricoG 0:3b093bd0819e 13 * Licensed under MMY-ST Liberty SW License Agreement V2, (the "License");
EnricoG 0:3b093bd0819e 14 * You may not use this file except in compliance with the License.
EnricoG 0:3b093bd0819e 15 * You may obtain a copy of the License at:
EnricoG 0:3b093bd0819e 16 *
EnricoG 0:3b093bd0819e 17 * http://www.st.com/software_license_agreement_liberty_v2
EnricoG 0:3b093bd0819e 18 *
EnricoG 0:3b093bd0819e 19 * Unless required by applicable law or agreed to in writing, software
EnricoG 0:3b093bd0819e 20 * distributed under the License is distributed on an "AS IS" BASIS,
EnricoG 0:3b093bd0819e 21 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
EnricoG 0:3b093bd0819e 22 * See the License for the specific language governing permissions and
EnricoG 0:3b093bd0819e 23 * limitations under the License.
EnricoG 0:3b093bd0819e 24 *
EnricoG 0:3b093bd0819e 25 ******************************************************************************
EnricoG 0:3b093bd0819e 26 */
EnricoG 0:3b093bd0819e 27
EnricoG 0:3b093bd0819e 28 /* Includes ------------------------------------------------------------------*/
EnricoG 0:3b093bd0819e 29 #include "lib_NDEF_MyApp.h"
EnricoG 0:3b093bd0819e 30
EnricoG 0:3b093bd0819e 31
EnricoG 0:3b093bd0819e 32 /** @addtogroup NFC_libraries
EnricoG 0:3b093bd0819e 33 * @{
EnricoG 0:3b093bd0819e 34 * @brief <b>This is the library used to manage the content of the TAG (data)
EnricoG 0:3b093bd0819e 35 * But also the specific feature of the tag, for instance
EnricoG 0:3b093bd0819e 36 * password, gpio... </b>
EnricoG 0:3b093bd0819e 37 */
EnricoG 0:3b093bd0819e 38
EnricoG 0:3b093bd0819e 39
EnricoG 0:3b093bd0819e 40 /** @addtogroup libNFC_FORUM
EnricoG 0:3b093bd0819e 41 * @{
EnricoG 0:3b093bd0819e 42 * @brief This part of the library manage data which follow NFC forum organisation.
EnricoG 0:3b093bd0819e 43 */
EnricoG 0:3b093bd0819e 44
EnricoG 0:3b093bd0819e 45 /**
EnricoG 0:3b093bd0819e 46 * @brief This buffer contains the data send/received by TAG
EnricoG 0:3b093bd0819e 47 */
EnricoG 0:3b093bd0819e 48 extern uint8_t NDEF_Buffer [NDEF_MAX_SIZE];
EnricoG 0:3b093bd0819e 49
EnricoG 0:3b093bd0819e 50 /** @defgroup libMyApp_Private_Functions
EnricoG 0:3b093bd0819e 51 * @{
EnricoG 0:3b093bd0819e 52 */
EnricoG 0:3b093bd0819e 53
EnricoG 0:3b093bd0819e 54 static void NDEF_Extract_M24SRDiscoveryApp_Input ( sRecordInfo *pRecordStruct, sMyAppInfo *pMyAppStruct );
EnricoG 0:3b093bd0819e 55
EnricoG 0:3b093bd0819e 56 /**
EnricoG 0:3b093bd0819e 57 * @brief This fonction read the NDEF file and store application data in a structure
EnricoG 0:3b093bd0819e 58 * @param pRecordStruct : Pointer on the record structure
EnricoG 0:3b093bd0819e 59 * @param pMyAppStruct : pointer on the structure to fill
EnricoG 0:3b093bd0819e 60 * @retval NONE
EnricoG 0:3b093bd0819e 61 */
EnricoG 0:3b093bd0819e 62 static void NDEF_Extract_M24SRDiscoveryApp_Input ( sRecordInfo *pRecordStruct, sMyAppInfo *pMyAppStruct )
EnricoG 0:3b093bd0819e 63 {
EnricoG 0:3b093bd0819e 64 uint8_t* pPayload;
EnricoG 0:3b093bd0819e 65 uint8_t* pLook4Word;
EnricoG 0:3b093bd0819e 66 uint16_t BackGroundColor, FontColor;
EnricoG 0:3b093bd0819e 67 uint8_t i;
EnricoG 0:3b093bd0819e 68
EnricoG 0:3b093bd0819e 69 /* Read record header */
EnricoG 0:3b093bd0819e 70 pPayload = (uint8_t*)(pRecordStruct->PayloadBufferAdd);
EnricoG 0:3b093bd0819e 71
EnricoG 0:3b093bd0819e 72 /* initialize struct in case not matching found */
EnricoG 0:3b093bd0819e 73 for(i=0; i<8; i++)
EnricoG 0:3b093bd0819e 74 {
EnricoG 0:3b093bd0819e 75 /* Set the Back Color */
EnricoG 0:3b093bd0819e 76 pMyAppStruct->LineX[i].BackGroundColor = 0xFFFF;
EnricoG 0:3b093bd0819e 77 /* Set the Text Color */
EnricoG 0:3b093bd0819e 78 pMyAppStruct->LineX[i].FontColor = 0x0000;
EnricoG 0:3b093bd0819e 79 /* Set the line number */
EnricoG 0:3b093bd0819e 80 pMyAppStruct->LineX[i].LineNb = i+1;
EnricoG 0:3b093bd0819e 81 /* Set the line content */
EnricoG 0:3b093bd0819e 82 memcpy(pMyAppStruct->LineX[i].String , " ",20);
EnricoG 0:3b093bd0819e 83 }
EnricoG 0:3b093bd0819e 84
EnricoG 0:3b093bd0819e 85 pLook4Word = pPayload;
EnricoG 0:3b093bd0819e 86
EnricoG 0:3b093bd0819e 87 for(i=0; i<4; i++)
EnricoG 0:3b093bd0819e 88 {
EnricoG 0:3b093bd0819e 89 pMyAppStruct->LedBlinkConf.LedConf[i] = *pLook4Word;
EnricoG 0:3b093bd0819e 90 pLook4Word++;
EnricoG 0:3b093bd0819e 91 }
EnricoG 0:3b093bd0819e 92 pMyAppStruct->LedBlinkConf.Speed = *pLook4Word;
EnricoG 0:3b093bd0819e 93 pLook4Word++;
EnricoG 0:3b093bd0819e 94
EnricoG 0:3b093bd0819e 95 for(i=0; i<8; i++)
EnricoG 0:3b093bd0819e 96 {
EnricoG 0:3b093bd0819e 97 /* Set the line number */
EnricoG 0:3b093bd0819e 98 pMyAppStruct->LineX[i].LineNb = *pLook4Word;
EnricoG 0:3b093bd0819e 99 pLook4Word++;
EnricoG 0:3b093bd0819e 100 /* Set the Back Color */
EnricoG 0:3b093bd0819e 101 BackGroundColor = (uint16_t) (*pLook4Word << 8);
EnricoG 0:3b093bd0819e 102 BackGroundColor = BackGroundColor | (uint16_t) (*++pLook4Word );
EnricoG 0:3b093bd0819e 103 pMyAppStruct->LineX[i].BackGroundColor = BackGroundColor;
EnricoG 0:3b093bd0819e 104 pLook4Word++;
EnricoG 0:3b093bd0819e 105 /* Set the Text Color */
EnricoG 0:3b093bd0819e 106 FontColor = (uint16_t) (*pLook4Word << 8);
EnricoG 0:3b093bd0819e 107 FontColor = FontColor | (uint16_t) (*++pLook4Word );
EnricoG 0:3b093bd0819e 108 pMyAppStruct->LineX[i].FontColor = FontColor;
EnricoG 0:3b093bd0819e 109 pLook4Word++;
EnricoG 0:3b093bd0819e 110 /* Set the line content */
EnricoG 0:3b093bd0819e 111 memcpy(pMyAppStruct->LineX[i].String, (char*) pLook4Word, 20);
EnricoG 0:3b093bd0819e 112 pLook4Word += 20;
EnricoG 0:3b093bd0819e 113 }
EnricoG 0:3b093bd0819e 114
EnricoG 0:3b093bd0819e 115 }
EnricoG 0:3b093bd0819e 116
EnricoG 0:3b093bd0819e 117 /**
EnricoG 0:3b093bd0819e 118 * @}
EnricoG 0:3b093bd0819e 119 */
EnricoG 0:3b093bd0819e 120
EnricoG 0:3b093bd0819e 121 /** @defgroup libMyApp_Public_Functions
EnricoG 0:3b093bd0819e 122 * @{
EnricoG 0:3b093bd0819e 123 * @brief This file is used to manage proprietary NDEF (stored or loaded in tag)
EnricoG 0:3b093bd0819e 124 */
EnricoG 0:3b093bd0819e 125
EnricoG 0:3b093bd0819e 126 /**
EnricoG 0:3b093bd0819e 127 * @brief This fonction read NDEF and retrieve Application information if any
EnricoG 0:3b093bd0819e 128 * @param pRecordStruct : Pointer on the record structure
EnricoG 0:3b093bd0819e 129 * @param pMyAppStruct : pointer on the structure to fill
EnricoG 0:3b093bd0819e 130 * @retval SUCCESS : Application information from NDEF have been retrieved
EnricoG 0:3b093bd0819e 131 * @retval ERROR : Not able to retrieve Application information
EnricoG 0:3b093bd0819e 132 */
EnricoG 0:3b093bd0819e 133 uint16_t NDEF_ReadMyApp(sRecordInfo *pRecordStruct, sMyAppInfo *pMyAppStruct)
EnricoG 0:3b093bd0819e 134 {
EnricoG 0:3b093bd0819e 135 uint16_t status = ERROR;
EnricoG 0:3b093bd0819e 136
EnricoG 0:3b093bd0819e 137 if( pRecordStruct->NDEF_Type == M24SR_DISCOVERY_APP_TYPE )
EnricoG 0:3b093bd0819e 138 {
EnricoG 0:3b093bd0819e 139 NDEF_Extract_M24SRDiscoveryApp_Input(pRecordStruct, pMyAppStruct );
EnricoG 0:3b093bd0819e 140 status = SUCCESS;
EnricoG 0:3b093bd0819e 141 }
EnricoG 0:3b093bd0819e 142 else
EnricoG 0:3b093bd0819e 143 {
EnricoG 0:3b093bd0819e 144 status = ERROR;
EnricoG 0:3b093bd0819e 145 }
EnricoG 0:3b093bd0819e 146
EnricoG 0:3b093bd0819e 147 return status;
EnricoG 0:3b093bd0819e 148 }
EnricoG 0:3b093bd0819e 149
EnricoG 0:3b093bd0819e 150 /**
EnricoG 0:3b093bd0819e 151 * @brief This fonction write the NDEF file with the Application data given in the structure
EnricoG 0:3b093bd0819e 152 * @brief Only used for debug purpose in this firmware version
EnricoG 0:3b093bd0819e 153 * @param pMyAppStruct : pointer on structure that contain the application information
EnricoG 0:3b093bd0819e 154 * @retval SUCCESS : the function is succesful
EnricoG 0:3b093bd0819e 155 * @retval ERROR : Not able to store NDEF file inside tag.
EnricoG 0:3b093bd0819e 156 */
EnricoG 0:3b093bd0819e 157 uint16_t NDEF_WriteMyApp(sMyAppInfo *pMyAppStruct)
EnricoG 0:3b093bd0819e 158 {
EnricoG 0:3b093bd0819e 159 uint16_t status = ERROR;
EnricoG 0:3b093bd0819e 160 uint16_t DataSize;
EnricoG 0:3b093bd0819e 161 uint32_t PayloadSize;
EnricoG 0:3b093bd0819e 162 uint8_t i;
EnricoG 0:3b093bd0819e 163 uint8_t* pPayload;
EnricoG 0:3b093bd0819e 164
EnricoG 0:3b093bd0819e 165
EnricoG 0:3b093bd0819e 166 /* External Type Record Header */
EnricoG 0:3b093bd0819e 167 /************************************/
EnricoG 0:3b093bd0819e 168 /* 7 | 6 | 5 | 4 | 3 | 2 1 0 */
EnricoG 0:3b093bd0819e 169 /*----------------------------------*/
EnricoG 0:3b093bd0819e 170 /* MB ME CF SR IL TNF */ /* <---- IL=0, CF=0 and SR=1 TNF=4 NFC Forum external type*/
EnricoG 0:3b093bd0819e 171 /*----------------------------------*/
EnricoG 0:3b093bd0819e 172 /* TYPE LENGTH */
EnricoG 0:3b093bd0819e 173 /*----------------------------------*/
EnricoG 0:3b093bd0819e 174 /* PAYLOAD LENGTH 3 */ /* <---- Not Used */
EnricoG 0:3b093bd0819e 175 /*----------------------------------*/
EnricoG 0:3b093bd0819e 176 /* PAYLOAD LENGTH 2 */ /* <---- Not Used */
EnricoG 0:3b093bd0819e 177 /*----------------------------------*/
EnricoG 0:3b093bd0819e 178 /* PAYLOAD LENGTH 1 */ /* <---- Not Used */
EnricoG 0:3b093bd0819e 179 /*----------------------------------*/
EnricoG 0:3b093bd0819e 180 /* PAYLOAD LENGTH 0 */ /* The payload will always be 5 + 25*8=205 bytes for this application */
EnricoG 0:3b093bd0819e 181 /*----------------------------------*/
EnricoG 0:3b093bd0819e 182 /* ID LENGTH */ /* <---- Not Used */
EnricoG 0:3b093bd0819e 183 /*----------------------------------*/
EnricoG 0:3b093bd0819e 184 /* TYPE */ /* st.com:m24sr_discovery_democtrl */
EnricoG 0:3b093bd0819e 185 /*----------------------------------*/
EnricoG 0:3b093bd0819e 186 /* ID */ /* <---- Not Used */
EnricoG 0:3b093bd0819e 187 /************************************/
EnricoG 0:3b093bd0819e 188
EnricoG 0:3b093bd0819e 189 /* NDEF file must be written in 2 phases, first phase NDEF size is Null */
EnricoG 0:3b093bd0819e 190 NDEF_Buffer[NDEF_SIZE_OFFSET] = 0x00;
EnricoG 0:3b093bd0819e 191 NDEF_Buffer[NDEF_SIZE_OFFSET+1] = 0x00;
EnricoG 0:3b093bd0819e 192
EnricoG 0:3b093bd0819e 193 /* fill URI record header */
EnricoG 0:3b093bd0819e 194 NDEF_Buffer[FIRST_RECORD_OFFSET] = 0xD4; /* Record Flag */
EnricoG 0:3b093bd0819e 195 NDEF_Buffer[FIRST_RECORD_OFFSET+1] = M24SR_DISCOVERY_APP_STRING_LENGTH;
EnricoG 0:3b093bd0819e 196 NDEF_Buffer[FIRST_RECORD_OFFSET+2] = 0x00; /* Will be filled at the end when payload size is known */
EnricoG 0:3b093bd0819e 197
EnricoG 0:3b093bd0819e 198 memcpy(&NDEF_Buffer[FIRST_RECORD_OFFSET+3], M24SR_DISCOVERY_APP_STRING, M24SR_DISCOVERY_APP_STRING_LENGTH);
EnricoG 0:3b093bd0819e 199
EnricoG 0:3b093bd0819e 200 pPayload = &NDEF_Buffer[FIRST_RECORD_OFFSET+3+M24SR_DISCOVERY_APP_STRING_LENGTH];
EnricoG 0:3b093bd0819e 201 PayloadSize = 0;
EnricoG 0:3b093bd0819e 202
EnricoG 0:3b093bd0819e 203 /**************************************************************/
EnricoG 0:3b093bd0819e 204 /* BLINK CONFIG data */
EnricoG 0:3b093bd0819e 205
EnricoG 0:3b093bd0819e 206 /* led 1 blinking */
EnricoG 0:3b093bd0819e 207 *pPayload = 0x03;
EnricoG 0:3b093bd0819e 208 pPayload++;
EnricoG 0:3b093bd0819e 209 /* led 2 blinking */
EnricoG 0:3b093bd0819e 210 *pPayload = 0x02;
EnricoG 0:3b093bd0819e 211 pPayload++;
EnricoG 0:3b093bd0819e 212 /* led 3 blinking */
EnricoG 0:3b093bd0819e 213 *pPayload = 0x02;
EnricoG 0:3b093bd0819e 214 pPayload++;
EnricoG 0:3b093bd0819e 215 /* led 4 blinking */
EnricoG 0:3b093bd0819e 216 *pPayload = 0x03;
EnricoG 0:3b093bd0819e 217 pPayload++;
EnricoG 0:3b093bd0819e 218 /* speed */
EnricoG 0:3b093bd0819e 219 *pPayload = 0x03;
EnricoG 0:3b093bd0819e 220 pPayload++;
EnricoG 0:3b093bd0819e 221
EnricoG 0:3b093bd0819e 222 PayloadSize += 5;
EnricoG 0:3b093bd0819e 223
EnricoG 0:3b093bd0819e 224 /**************************************************************/
EnricoG 0:3b093bd0819e 225
EnricoG 0:3b093bd0819e 226 /**************************************************************/
EnricoG 0:3b093bd0819e 227 /* SCREEN config data */
EnricoG 0:3b093bd0819e 228 for(i=0; i<8; i++)
EnricoG 0:3b093bd0819e 229 {
EnricoG 0:3b093bd0819e 230 /* Line number */
EnricoG 0:3b093bd0819e 231 *pPayload = (uint8_t)(i+1);
EnricoG 0:3b093bd0819e 232 pPayload++;
EnricoG 0:3b093bd0819e 233 /* Background color */
EnricoG 0:3b093bd0819e 234 *pPayload = 0xFF;
EnricoG 0:3b093bd0819e 235 pPayload++;
EnricoG 0:3b093bd0819e 236 *pPayload = 0xFF;
EnricoG 0:3b093bd0819e 237 pPayload++;
EnricoG 0:3b093bd0819e 238 /* Font Color */
EnricoG 0:3b093bd0819e 239 *pPayload = 0x00;
EnricoG 0:3b093bd0819e 240 pPayload++;
EnricoG 0:3b093bd0819e 241 *pPayload = 0x00;
EnricoG 0:3b093bd0819e 242 pPayload++;
EnricoG 0:3b093bd0819e 243 /* String */
EnricoG 0:3b093bd0819e 244 memcpy(pPayload, "ABCDEFGHIJKLMNOPQRST",20);
EnricoG 0:3b093bd0819e 245 pPayload += 20;
EnricoG 0:3b093bd0819e 246
EnricoG 0:3b093bd0819e 247 PayloadSize += 25;
EnricoG 0:3b093bd0819e 248
EnricoG 0:3b093bd0819e 249 }
EnricoG 0:3b093bd0819e 250
EnricoG 0:3b093bd0819e 251 NDEF_Buffer[FIRST_RECORD_OFFSET+2] = (PayloadSize & 0x000000FF);
EnricoG 0:3b093bd0819e 252
EnricoG 0:3b093bd0819e 253 DataSize = PayloadSize + 5 + M24SR_DISCOVERY_APP_STRING_LENGTH;
EnricoG 0:3b093bd0819e 254
EnricoG 0:3b093bd0819e 255 /* Write NDEF */
EnricoG 0:3b093bd0819e 256 status = WriteData ( 0x00 , DataSize , NDEF_Buffer);
EnricoG 0:3b093bd0819e 257
EnricoG 0:3b093bd0819e 258 /* Write NDEF size to complete*/
EnricoG 0:3b093bd0819e 259 if( status == NDEF_ACTION_COMPLETED)
EnricoG 0:3b093bd0819e 260 {
EnricoG 0:3b093bd0819e 261 DataSize -= 2; /* Must not count the 2 byte that represent the NDEF size */
EnricoG 0:3b093bd0819e 262 NDEF_Buffer[0] = (DataSize & 0xFF00)>>8;
EnricoG 0:3b093bd0819e 263 NDEF_Buffer[1] = (DataSize & 0x00FF);
EnricoG 0:3b093bd0819e 264
EnricoG 0:3b093bd0819e 265 status = WriteData ( 0x00 , 2 , NDEF_Buffer);
EnricoG 0:3b093bd0819e 266 }
EnricoG 0:3b093bd0819e 267
EnricoG 0:3b093bd0819e 268 if( status == NDEF_ACTION_COMPLETED)
EnricoG 0:3b093bd0819e 269 return SUCCESS;
EnricoG 0:3b093bd0819e 270 else
EnricoG 0:3b093bd0819e 271 return ERROR;
EnricoG 0:3b093bd0819e 272 }
EnricoG 0:3b093bd0819e 273
EnricoG 0:3b093bd0819e 274
EnricoG 0:3b093bd0819e 275 /**
EnricoG 0:3b093bd0819e 276 * @}
EnricoG 0:3b093bd0819e 277 */
EnricoG 0:3b093bd0819e 278
EnricoG 0:3b093bd0819e 279 /**
EnricoG 0:3b093bd0819e 280 * @}
EnricoG 0:3b093bd0819e 281 */
EnricoG 0:3b093bd0819e 282
EnricoG 0:3b093bd0819e 283 /**
EnricoG 0:3b093bd0819e 284 * @}
EnricoG 0:3b093bd0819e 285 */
EnricoG 0:3b093bd0819e 286
EnricoG 0:3b093bd0819e 287 /******************* (C) COPYRIGHT 2013 STMicroelectronics *****END OF FILE****/
EnricoG 0:3b093bd0819e 288
EnricoG 0:3b093bd0819e 289