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_URI.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 that represent URI.
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 /* Includes ------------------------------------------------------------------*/
rosarium 0:892175366555 30 #include "lib_NDEF_URI.h"
rosarium 0:892175366555 31 #include <string.h>
rosarium 0:892175366555 32
rosarium 0:892175366555 33 /** @addtogroup NFC_libraries
rosarium 0:892175366555 34 * @{
rosarium 0:892175366555 35 * @brief <b>This is the library used to manage the content of the TAG (data)
rosarium 0:892175366555 36 * But also the specific feature of the tag, for instance
rosarium 0:892175366555 37 * password, gpo... </b>
rosarium 0:892175366555 38 */
rosarium 0:892175366555 39
rosarium 0:892175366555 40
rosarium 0:892175366555 41 /** @addtogroup libNFC_FORUM
rosarium 0:892175366555 42 * @{
rosarium 0:892175366555 43 * @brief This part of the library manage data which follow NFC forum organisation.
rosarium 0:892175366555 44 */
rosarium 0:892175366555 45
rosarium 0:892175366555 46 /**
rosarium 0:892175366555 47 * @brief This buffer contains the data send/received by TAG
rosarium 0:892175366555 48 */
rosarium 0:892175366555 49 extern uint8_t NDEF_Buffer [];
rosarium 0:892175366555 50
rosarium 0:892175366555 51
rosarium 0:892175366555 52
rosarium 0:892175366555 53 /**
rosarium 0:892175366555 54 * @brief This function read the URI information and store data in a structure.
rosarium 0:892175366555 55 * @param pRecordStruct : Pointer on the record structure.
rosarium 0:892175366555 56 * @param pURI : pointer on the structure to fill.
rosarium 0:892175366555 57 */
rosarium 0:892175366555 58 void NDEF_URI::NDEF_Parse_WellKnowType( sRecordInfo *pRecordStruct, sURI_Info* pURI )
rosarium 0:892175366555 59 {
rosarium 0:892175366555 60 uint32_t PayloadSize;
rosarium 0:892175366555 61 uint8_t Offset;
rosarium 0:892175366555 62 uint8_t* pPayload;
rosarium 0:892175366555 63
rosarium 0:892175366555 64 pPayload = (uint8_t*)(pRecordStruct->PayloadBufferAdd);
rosarium 0:892175366555 65
rosarium 0:892175366555 66 switch( *pPayload )
rosarium 0:892175366555 67 {
rosarium 0:892175366555 68 case URI_ID_0x01:
rosarium 0:892175366555 69 memcpy( pURI->protocol, URI_ID_0x01_STRING, strlen(URI_ID_0x01_STRING) );
rosarium 0:892175366555 70 Offset = strlen( URI_ID_0x01_STRING );
rosarium 0:892175366555 71 break;
rosarium 0:892175366555 72
rosarium 0:892175366555 73 case URI_ID_0x02:
rosarium 0:892175366555 74 memcpy( pURI->protocol, URI_ID_0x02_STRING, strlen(URI_ID_0x02_STRING) );
rosarium 0:892175366555 75 Offset = strlen( URI_ID_0x02_STRING );
rosarium 0:892175366555 76 break;
rosarium 0:892175366555 77
rosarium 0:892175366555 78 case URI_ID_0x03:
rosarium 0:892175366555 79 memcpy( pURI->protocol, URI_ID_0x03_STRING, strlen(URI_ID_0x03_STRING) );
rosarium 0:892175366555 80 Offset = strlen( URI_ID_0x03_STRING );
rosarium 0:892175366555 81 break;
rosarium 0:892175366555 82
rosarium 0:892175366555 83 case URI_ID_0x04:
rosarium 0:892175366555 84 memcpy( pURI->protocol, URI_ID_0x04_STRING, strlen(URI_ID_0x04_STRING) );
rosarium 0:892175366555 85 Offset = strlen( URI_ID_0x04_STRING );
rosarium 0:892175366555 86 break;
rosarium 0:892175366555 87
rosarium 0:892175366555 88 case URI_ID_0x05:
rosarium 0:892175366555 89 memcpy( pURI->protocol, URI_ID_0x05_STRING, strlen(URI_ID_0x05_STRING) );
rosarium 0:892175366555 90 Offset = strlen( URI_ID_0x05_STRING );
rosarium 0:892175366555 91 break;
rosarium 0:892175366555 92
rosarium 0:892175366555 93 case URI_ID_0x06:
rosarium 0:892175366555 94 memcpy( pURI->protocol, URI_ID_0x06_STRING, strlen(URI_ID_0x06_STRING) );
rosarium 0:892175366555 95 Offset = strlen( URI_ID_0x06_STRING );
rosarium 0:892175366555 96 break;
rosarium 0:892175366555 97
rosarium 0:892175366555 98 case URI_ID_0x07:
rosarium 0:892175366555 99 memcpy( pURI->protocol, URI_ID_0x07_STRING, strlen(URI_ID_0x07_STRING) );
rosarium 0:892175366555 100 Offset = strlen( URI_ID_0x07_STRING );
rosarium 0:892175366555 101 break;
rosarium 0:892175366555 102
rosarium 0:892175366555 103 case URI_ID_0x08:
rosarium 0:892175366555 104 memcpy( pURI->protocol, URI_ID_0x08_STRING, strlen(URI_ID_0x08_STRING) );
rosarium 0:892175366555 105 Offset = strlen( URI_ID_0x08_STRING );
rosarium 0:892175366555 106 break;
rosarium 0:892175366555 107
rosarium 0:892175366555 108 case URI_ID_0x09:
rosarium 0:892175366555 109 memcpy( pURI->protocol, URI_ID_0x09_STRING, strlen(URI_ID_0x09_STRING) );
rosarium 0:892175366555 110 Offset = strlen( URI_ID_0x09_STRING );
rosarium 0:892175366555 111 break;
rosarium 0:892175366555 112
rosarium 0:892175366555 113 case URI_ID_0x0A:
rosarium 0:892175366555 114 memcpy( pURI->protocol, URI_ID_0x0A_STRING, strlen(URI_ID_0x0A_STRING) );
rosarium 0:892175366555 115 Offset = strlen( URI_ID_0x0A_STRING );
rosarium 0:892175366555 116 break;
rosarium 0:892175366555 117
rosarium 0:892175366555 118 case URI_ID_0x0B:
rosarium 0:892175366555 119 memcpy( pURI->protocol, URI_ID_0x0B_STRING, strlen(URI_ID_0x0B_STRING) );
rosarium 0:892175366555 120 Offset = strlen( URI_ID_0x0B_STRING );
rosarium 0:892175366555 121 break;
rosarium 0:892175366555 122
rosarium 0:892175366555 123 case URI_ID_0x0C:
rosarium 0:892175366555 124 memcpy( pURI->protocol, URI_ID_0x0C_STRING, strlen(URI_ID_0x0C_STRING) );
rosarium 0:892175366555 125 Offset = strlen( URI_ID_0x0C_STRING );
rosarium 0:892175366555 126 break;
rosarium 0:892175366555 127
rosarium 0:892175366555 128 case URI_ID_0x0D:
rosarium 0:892175366555 129 memcpy( pURI->protocol, URI_ID_0x0D_STRING, strlen(URI_ID_0x0D_STRING) );
rosarium 0:892175366555 130 Offset = strlen( URI_ID_0x0D_STRING );
rosarium 0:892175366555 131 break;
rosarium 0:892175366555 132
rosarium 0:892175366555 133 case URI_ID_0x0E:
rosarium 0:892175366555 134 memcpy( pURI->protocol, URI_ID_0x0E_STRING, strlen(URI_ID_0x0E_STRING) );
rosarium 0:892175366555 135 Offset = strlen( URI_ID_0x0E_STRING );
rosarium 0:892175366555 136 break;
rosarium 0:892175366555 137
rosarium 0:892175366555 138 case URI_ID_0x0F:
rosarium 0:892175366555 139 memcpy( pURI->protocol, URI_ID_0x0F_STRING, strlen(URI_ID_0x0F_STRING) );
rosarium 0:892175366555 140 Offset = strlen( URI_ID_0x0F_STRING );
rosarium 0:892175366555 141 break;
rosarium 0:892175366555 142
rosarium 0:892175366555 143 case URI_ID_0x10:
rosarium 0:892175366555 144 memcpy( pURI->protocol, URI_ID_0x10_STRING, strlen(URI_ID_0x10_STRING) );
rosarium 0:892175366555 145 Offset = strlen( URI_ID_0x10_STRING );
rosarium 0:892175366555 146 break;
rosarium 0:892175366555 147
rosarium 0:892175366555 148 case URI_ID_0x11:
rosarium 0:892175366555 149 memcpy( pURI->protocol, URI_ID_0x11_STRING, strlen(URI_ID_0x11_STRING) );
rosarium 0:892175366555 150 Offset = strlen( URI_ID_0x11_STRING );
rosarium 0:892175366555 151 break;
rosarium 0:892175366555 152
rosarium 0:892175366555 153 case URI_ID_0x12:
rosarium 0:892175366555 154 memcpy( pURI->protocol, URI_ID_0x12_STRING, strlen(URI_ID_0x12_STRING) );
rosarium 0:892175366555 155 Offset = strlen( URI_ID_0x12_STRING );
rosarium 0:892175366555 156 break;
rosarium 0:892175366555 157
rosarium 0:892175366555 158 case URI_ID_0x13:
rosarium 0:892175366555 159 memcpy( pURI->protocol, URI_ID_0x13_STRING, strlen(URI_ID_0x13_STRING) );
rosarium 0:892175366555 160 Offset = strlen( URI_ID_0x13_STRING );
rosarium 0:892175366555 161 break;
rosarium 0:892175366555 162
rosarium 0:892175366555 163 case URI_ID_0x14:
rosarium 0:892175366555 164 memcpy( pURI->protocol, URI_ID_0x14_STRING, strlen(URI_ID_0x14_STRING) );
rosarium 0:892175366555 165 Offset = strlen( URI_ID_0x14_STRING );
rosarium 0:892175366555 166 break;
rosarium 0:892175366555 167
rosarium 0:892175366555 168 case URI_ID_0x15:
rosarium 0:892175366555 169 memcpy( pURI->protocol, URI_ID_0x15_STRING, strlen(URI_ID_0x15_STRING) );
rosarium 0:892175366555 170 Offset = strlen( URI_ID_0x15_STRING );
rosarium 0:892175366555 171 break;
rosarium 0:892175366555 172
rosarium 0:892175366555 173 case URI_ID_0x16:
rosarium 0:892175366555 174 memcpy( pURI->protocol, URI_ID_0x16_STRING, strlen(URI_ID_0x16_STRING) );
rosarium 0:892175366555 175 Offset = strlen( URI_ID_0x16_STRING );
rosarium 0:892175366555 176 break;
rosarium 0:892175366555 177
rosarium 0:892175366555 178 case URI_ID_0x17:
rosarium 0:892175366555 179 memcpy( pURI->protocol, URI_ID_0x17_STRING, strlen(URI_ID_0x17_STRING) );
rosarium 0:892175366555 180 Offset = strlen( URI_ID_0x17_STRING );
rosarium 0:892175366555 181 break;
rosarium 0:892175366555 182
rosarium 0:892175366555 183 case URI_ID_0x18:
rosarium 0:892175366555 184 memcpy( pURI->protocol, URI_ID_0x18_STRING, strlen(URI_ID_0x18_STRING) );
rosarium 0:892175366555 185 Offset = strlen( URI_ID_0x18_STRING );
rosarium 0:892175366555 186 break;
rosarium 0:892175366555 187
rosarium 0:892175366555 188 case URI_ID_0x19:
rosarium 0:892175366555 189 memcpy( pURI->protocol, URI_ID_0x19_STRING, strlen(URI_ID_0x19_STRING) );
rosarium 0:892175366555 190 Offset = strlen( URI_ID_0x19_STRING );
rosarium 0:892175366555 191 break;
rosarium 0:892175366555 192
rosarium 0:892175366555 193 case URI_ID_0x1A:
rosarium 0:892175366555 194 memcpy( pURI->protocol, URI_ID_0x1A_STRING, strlen(URI_ID_0x1A_STRING) );
rosarium 0:892175366555 195 Offset = strlen( URI_ID_0x1A_STRING );
rosarium 0:892175366555 196 break;
rosarium 0:892175366555 197
rosarium 0:892175366555 198 case URI_ID_0x1B:
rosarium 0:892175366555 199 memcpy( pURI->protocol, URI_ID_0x1B_STRING, strlen(URI_ID_0x1B_STRING) );
rosarium 0:892175366555 200 Offset = strlen( URI_ID_0x1B_STRING );
rosarium 0:892175366555 201 break;
rosarium 0:892175366555 202
rosarium 0:892175366555 203 case URI_ID_0x1C:
rosarium 0:892175366555 204 memcpy( pURI->protocol, URI_ID_0x1C_STRING, strlen(URI_ID_0x1C_STRING) );
rosarium 0:892175366555 205 Offset = strlen( URI_ID_0x1C_STRING );
rosarium 0:892175366555 206 break;
rosarium 0:892175366555 207
rosarium 0:892175366555 208 case URI_ID_0x1D:
rosarium 0:892175366555 209 memcpy( pURI->protocol, URI_ID_0x1D_STRING, strlen(URI_ID_0x1D_STRING) );
rosarium 0:892175366555 210 Offset = strlen( URI_ID_0x1D_STRING );
rosarium 0:892175366555 211 break;
rosarium 0:892175366555 212
rosarium 0:892175366555 213 case URI_ID_0x1E:
rosarium 0:892175366555 214 memcpy( pURI->protocol, URI_ID_0x1E_STRING, strlen(URI_ID_0x1E_STRING) );
rosarium 0:892175366555 215 Offset = strlen( URI_ID_0x1E_STRING );
rosarium 0:892175366555 216 break;
rosarium 0:892175366555 217
rosarium 0:892175366555 218 case URI_ID_0x1F:
rosarium 0:892175366555 219 memcpy( pURI->protocol, URI_ID_0x1F_STRING, strlen(URI_ID_0x1F_STRING) );
rosarium 0:892175366555 220 Offset = strlen( URI_ID_0x1F_STRING );
rosarium 0:892175366555 221 break;
rosarium 0:892175366555 222
rosarium 0:892175366555 223 case URI_ID_0x20:
rosarium 0:892175366555 224 memcpy( pURI->protocol, URI_ID_0x20_STRING, strlen(URI_ID_0x20_STRING) );
rosarium 0:892175366555 225 Offset = strlen( URI_ID_0x20_STRING );
rosarium 0:892175366555 226 break;
rosarium 0:892175366555 227
rosarium 0:892175366555 228 case URI_ID_0x21:
rosarium 0:892175366555 229 memcpy( pURI->protocol, URI_ID_0x21_STRING, strlen(URI_ID_0x21_STRING) );
rosarium 0:892175366555 230 Offset = strlen( URI_ID_0x21_STRING );
rosarium 0:892175366555 231 break;
rosarium 0:892175366555 232
rosarium 0:892175366555 233 case URI_ID_0x22:
rosarium 0:892175366555 234 memcpy( pURI->protocol, URI_ID_0x22_STRING, strlen(URI_ID_0x22_STRING) );
rosarium 0:892175366555 235 Offset = strlen( URI_ID_0x22_STRING );
rosarium 0:892175366555 236 break;
rosarium 0:892175366555 237
rosarium 0:892175366555 238 case URI_ID_0x23:
rosarium 0:892175366555 239 memcpy( pURI->protocol, URI_ID_0x23_STRING, strlen(URI_ID_0x23_STRING) );
rosarium 0:892175366555 240 Offset = strlen( URI_ID_0x23_STRING );
rosarium 0:892175366555 241 break;
rosarium 0:892175366555 242
rosarium 0:892175366555 243 default:
rosarium 0:892175366555 244 Offset = 0;
rosarium 0:892175366555 245 /* Should not happened */
rosarium 0:892175366555 246 break;
rosarium 0:892175366555 247 }
rosarium 0:892175366555 248 /* add end of string character */
rosarium 0:892175366555 249 pURI->protocol[Offset] = '\0';
rosarium 0:892175366555 250
rosarium 0:892175366555 251 pPayload++; /* go after well know byte */
rosarium 0:892175366555 252
rosarium 0:892175366555 253 PayloadSize = ((uint32_t)(pRecordStruct->PayloadLength3) << 24) | ((uint32_t)(pRecordStruct->PayloadLength2) << 16) |
rosarium 0:892175366555 254 ((uint32_t)(pRecordStruct->PayloadLength1) << 8) | pRecordStruct->PayloadLength0;
rosarium 0:892175366555 255
rosarium 0:892175366555 256 PayloadSize = PayloadSize - 1; /* remove well know byte */
rosarium 0:892175366555 257
rosarium 0:892175366555 258 memcpy( pURI->URI_Message, pPayload, PayloadSize );
rosarium 0:892175366555 259 /* add end of string character */
rosarium 0:892175366555 260 pURI->URI_Message[PayloadSize] = '\0';
rosarium 0:892175366555 261
rosarium 0:892175366555 262 }
rosarium 0:892175366555 263
rosarium 0:892175366555 264 /**
rosarium 0:892175366555 265 * @}
rosarium 0:892175366555 266 */
rosarium 0:892175366555 267
rosarium 0:892175366555 268 /** @defgroup libURI_Public_Functions
rosarium 0:892175366555 269 * @{
rosarium 0:892175366555 270 * @brief This file is used to manage URI (stored or loaded in tag)
rosarium 0:892175366555 271 */
rosarium 0:892175366555 272
rosarium 0:892175366555 273 /**
rosarium 0:892175366555 274 * @brief This function read NDEF and retrieve URI information if any.
rosarium 0:892175366555 275 * @param pRecordStruct : Pointer on the record structure.
rosarium 0:892175366555 276 * @param pURI : pointer on the structure to fill.
rosarium 0:892175366555 277 * @retval NDEF_OK : URI information from NDEF have been retrieved.
rosarium 0:892175366555 278 * @retval NDEF_ERROR : Not able to retrieve URI information.
rosarium 0:892175366555 279 */
rosarium 0:892175366555 280 uint16_t NDEF_URI::NDEF_ReadURI( sRecordInfo *pRecordStruct, sURI_Info *pURI )
rosarium 0:892175366555 281 {
rosarium 0:892175366555 282 uint16_t status = NDEF_ERROR;
rosarium 0:892175366555 283 sRecordInfo *pSPRecordStruct;
rosarium 0:892175366555 284 uint32_t PayloadSize, RecordPosition;
rosarium 0:892175366555 285 uint8_t* pData;
rosarium 0:892175366555 286
rosarium 0:892175366555 287 if( pRecordStruct->NDEF_Type == WELL_KNOWN_ABRIDGED_URI_TYPE )
rosarium 0:892175366555 288 {
rosarium 0:892175366555 289 NDEF_Parse_WellKnowType( pRecordStruct, pURI );
rosarium 0:892175366555 290 status = NDEF_OK;
rosarium 0:892175366555 291 }
rosarium 0:892175366555 292 else if( pRecordStruct->NDEF_Type == SMARTPOSTER_TYPE )
rosarium 0:892175366555 293 {
rosarium 0:892175366555 294 for( RecordPosition = 0; RecordPosition < pRecordStruct->NbOfRecordInSPPayload; RecordPosition++ )
rosarium 0:892175366555 295 {
rosarium 0:892175366555 296 pSPRecordStruct = pRecordStruct->SPRecordStructAdd[RecordPosition];
rosarium 0:892175366555 297 if( pSPRecordStruct->NDEF_Type == WELL_KNOWN_ABRIDGED_URI_TYPE )
rosarium 0:892175366555 298 {
rosarium 0:892175366555 299 NDEF_Parse_WellKnowType( pSPRecordStruct, pURI );
rosarium 0:892175366555 300 status = NDEF_OK;
rosarium 0:892175366555 301 }
rosarium 0:892175366555 302 if( pSPRecordStruct->NDEF_Type == TEXT_TYPE )
rosarium 0:892175366555 303 {
rosarium 0:892175366555 304 PayloadSize = ((uint32_t)(pSPRecordStruct->PayloadLength3) << 24) | ((uint32_t)(pSPRecordStruct->PayloadLength2) << 16) |
rosarium 0:892175366555 305 ((uint32_t)(pSPRecordStruct->PayloadLength1) << 8) | pSPRecordStruct->PayloadLength0;
rosarium 0:892175366555 306
rosarium 0:892175366555 307 /* The instruction content the UTF-8 language code that is not used here */
rosarium 0:892175366555 308 pData = (uint8_t*)pSPRecordStruct->PayloadBufferAdd;
rosarium 0:892175366555 309 PayloadSize -= *pData + 1; /* remove not usefull data */
rosarium 0:892175366555 310 pData += *pData + 1;
rosarium 0:892175366555 311
rosarium 0:892175366555 312 memcpy( pURI->Information, pData, PayloadSize );
rosarium 0:892175366555 313 }
rosarium 0:892175366555 314 }
rosarium 0:892175366555 315 }
rosarium 0:892175366555 316 else
rosarium 0:892175366555 317 {
rosarium 0:892175366555 318 status = NDEF_ERROR;
rosarium 0:892175366555 319 }
rosarium 0:892175366555 320
rosarium 0:892175366555 321 return status;
rosarium 0:892175366555 322 }
rosarium 0:892175366555 323
rosarium 0:892175366555 324 /**
rosarium 0:892175366555 325 * @brief This function prepare the NDEF message with the URI data given in the structure.
rosarium 0:892175366555 326 * @param pURI : pointer on structure that contain the URI information.
rosarium 0:892175366555 327 * @param pNDEFMessage : pointer on the NDEF message.
rosarium 0:892175366555 328 * @param size : to store the size of the NDEF message generated.
rosarium 0:892175366555 329 */
rosarium 0:892175366555 330 void NDEF_URI::NDEF_PrepareURIMessage( sURI_Info *pURI, uint8_t *pNDEFMessage, uint16_t *size )
rosarium 0:892175366555 331 {
rosarium 0:892175366555 332 uint32_t uriSize, totalSize, Offset = 0;
rosarium 0:892175366555 333 uint32_t infoSize = 0;
rosarium 0:892175366555 334 char type;
rosarium 0:892175366555 335
rosarium 0:892175366555 336 /* An URI can be included in a smart poster to add text to give instruction to user for instance */
rosarium 0:892175366555 337
rosarium 0:892175366555 338 /* URI (smart poster) Record Header */
rosarium 0:892175366555 339 /************************************/
rosarium 0:892175366555 340 /* 7 | 6 | 5 | 4 | 3 | 2 1 0 */
rosarium 0:892175366555 341 /*----------------------------------*/
rosarium 0:892175366555 342 /* MB ME CF SR IL TNF */ /* <---- CF=0, IL=0 and SR=1 TNF=1 NFC Forum Well-known type*/
rosarium 0:892175366555 343 /*----------------------------------*/
rosarium 0:892175366555 344 /* TYPE LENGTH */
rosarium 0:892175366555 345 /*----------------------------------*/
rosarium 0:892175366555 346 /* PAYLOAD LENGTH 3 */ /* <---- Used only if SR=0 */
rosarium 0:892175366555 347 /*----------------------------------*/
rosarium 0:892175366555 348 /* PAYLOAD LENGTH 2 */ /* <---- Used only if SR=0 */
rosarium 0:892175366555 349 /*----------------------------------*/
rosarium 0:892175366555 350 /* PAYLOAD LENGTH 1 */ /* <---- Used only if SR=0 */
rosarium 0:892175366555 351 /*----------------------------------*/
rosarium 0:892175366555 352 /* PAYLOAD LENGTH 0 */
rosarium 0:892175366555 353 /*----------------------------------*/
rosarium 0:892175366555 354 /* ID LENGTH */ /* <---- Not Used */
rosarium 0:892175366555 355 /*----------------------------------*/
rosarium 0:892175366555 356 /* TYPE */
rosarium 0:892175366555 357 /*----------------------------------*/
rosarium 0:892175366555 358 /* ID */ /* <---- Not Used */
rosarium 0:892175366555 359 /************************************/
rosarium 0:892175366555 360
rosarium 0:892175366555 361 /* We need to know the URI type in order to define if an abreviation is available */
rosarium 0:892175366555 362 type = getUriType( pURI->protocol );
rosarium 0:892175366555 363
rosarium 0:892175366555 364 /* URI : 1+URI for abreviate protocol*/
rosarium 0:892175366555 365 if( type != URI_ID_0x00 )
rosarium 0:892175366555 366 uriSize = 1 + strlen(pURI->URI_Message);
rosarium 0:892175366555 367 else /*: 1+protocol+URI else*/
rosarium 0:892175366555 368 uriSize = 1 + strlen(pURI->protocol) + strlen(pURI->URI_Message);
rosarium 0:892175366555 369
rosarium 0:892175366555 370 /* Check if a Smart poster is needed */
rosarium 0:892175366555 371 if( pURI->Information[0] != '\0' )
rosarium 0:892175366555 372 {
rosarium 0:892175366555 373 /* Info : 1+2+info */
rosarium 0:892175366555 374 infoSize = 1 + ISO_ENGLISH_CODE_STRING_LENGTH + strlen(pURI->Information);
rosarium 0:892175366555 375 /* Total */
rosarium 0:892175366555 376 totalSize = 4 + uriSize + 4 + infoSize;
rosarium 0:892175366555 377 if( uriSize > 255 ) totalSize += 3; /* Normal URI size */
rosarium 0:892175366555 378 if( infoSize > 255 ) totalSize += 3; /* Normal Info size */
rosarium 0:892175366555 379
rosarium 0:892175366555 380 /* SmartPoster header */
rosarium 0:892175366555 381 if( totalSize > 255 )
rosarium 0:892175366555 382 {
rosarium 0:892175366555 383 pNDEFMessage[Offset++] = 0xC1;
rosarium 0:892175366555 384 pNDEFMessage[Offset++] = SMART_POSTER_TYPE_STRING_LENGTH;
rosarium 0:892175366555 385 pNDEFMessage[Offset++] = (totalSize & 0xFF000000) >> 24;
rosarium 0:892175366555 386 pNDEFMessage[Offset++] = (totalSize & 0x00FF0000) >> 16;
rosarium 0:892175366555 387 pNDEFMessage[Offset++] = (totalSize & 0x0000FF00) >> 8;
rosarium 0:892175366555 388 pNDEFMessage[Offset++] = totalSize & 0x000000FF;
rosarium 0:892175366555 389 }
rosarium 0:892175366555 390 else
rosarium 0:892175366555 391 {
rosarium 0:892175366555 392 pNDEFMessage[Offset++] = 0xD1;
rosarium 0:892175366555 393 pNDEFMessage[Offset++] = SMART_POSTER_TYPE_STRING_LENGTH;
rosarium 0:892175366555 394 pNDEFMessage[Offset++] = (uint8_t)totalSize;
rosarium 0:892175366555 395 }
rosarium 0:892175366555 396 memcpy( &pNDEFMessage[Offset], SMART_POSTER_TYPE_STRING, SMART_POSTER_TYPE_STRING_LENGTH );
rosarium 0:892175366555 397 Offset += SMART_POSTER_TYPE_STRING_LENGTH;
rosarium 0:892175366555 398 }
rosarium 0:892175366555 399
rosarium 0:892175366555 400 /* URI header */
rosarium 0:892175366555 401 pNDEFMessage[Offset] = 0x81;
rosarium 0:892175366555 402 if( uriSize < 256 ) pNDEFMessage[Offset] |= 0x10; // Set the SR bit
rosarium 0:892175366555 403 if( pURI->Information[0] == '\0' ) pNDEFMessage[Offset] |= 0x40; // Set the ME bit
rosarium 0:892175366555 404 Offset++;
rosarium 0:892175366555 405
rosarium 0:892175366555 406 pNDEFMessage[Offset++] = URI_TYPE_STRING_LENGTH;
rosarium 0:892175366555 407 if( uriSize > 255 )
rosarium 0:892175366555 408 {
rosarium 0:892175366555 409 pNDEFMessage[Offset++] = (uriSize & 0xFF000000) >> 24;
rosarium 0:892175366555 410 pNDEFMessage[Offset++] = (uriSize & 0x00FF0000) >> 16;
rosarium 0:892175366555 411 pNDEFMessage[Offset++] = (uriSize & 0x0000FF00) >> 8;
rosarium 0:892175366555 412 pNDEFMessage[Offset++] = uriSize & 0x000000FF;
rosarium 0:892175366555 413 }
rosarium 0:892175366555 414 else
rosarium 0:892175366555 415 {
rosarium 0:892175366555 416 pNDEFMessage[Offset++] = (uint8_t)uriSize;
rosarium 0:892175366555 417 }
rosarium 0:892175366555 418 memcpy( &pNDEFMessage[Offset], URI_TYPE_STRING, URI_TYPE_STRING_LENGTH );
rosarium 0:892175366555 419 Offset += URI_TYPE_STRING_LENGTH;
rosarium 0:892175366555 420
rosarium 0:892175366555 421 pNDEFMessage[Offset++] = type;
rosarium 0:892175366555 422 if( type == URI_ID_0x00 ) // No abreviation
rosarium 0:892175366555 423 {
rosarium 0:892175366555 424 memcpy( &pNDEFMessage[Offset], pURI->protocol, strlen(pURI->protocol) );
rosarium 0:892175366555 425 Offset += strlen(pURI->protocol);
rosarium 0:892175366555 426 }
rosarium 0:892175366555 427
rosarium 0:892175366555 428 memcpy( &pNDEFMessage[Offset], pURI->URI_Message, strlen(pURI->URI_Message) );
rosarium 0:892175366555 429 Offset += strlen(pURI->URI_Message);
rosarium 0:892175366555 430
rosarium 0:892175366555 431 /* Information header */
rosarium 0:892175366555 432 if( pURI->Information[0] != '\0' )
rosarium 0:892175366555 433 {
rosarium 0:892175366555 434 if( infoSize > 255 )
rosarium 0:892175366555 435 {
rosarium 0:892175366555 436 pNDEFMessage[Offset++] = 0x41;
rosarium 0:892175366555 437 pNDEFMessage[Offset++] = TEXT_TYPE_STRING_LENGTH;
rosarium 0:892175366555 438 pNDEFMessage[Offset++] = (infoSize & 0xFF000000) >> 24;
rosarium 0:892175366555 439 pNDEFMessage[Offset++] = (infoSize & 0x00FF0000) >> 16;
rosarium 0:892175366555 440 pNDEFMessage[Offset++] = (infoSize & 0x0000FF00) >> 8;
rosarium 0:892175366555 441 pNDEFMessage[Offset++] = infoSize & 0x000000FF;
rosarium 0:892175366555 442 }
rosarium 0:892175366555 443 else
rosarium 0:892175366555 444 {
rosarium 0:892175366555 445 pNDEFMessage[Offset++] = 0x51;
rosarium 0:892175366555 446 pNDEFMessage[Offset++] = TEXT_TYPE_STRING_LENGTH;
rosarium 0:892175366555 447 pNDEFMessage[Offset++] = (uint8_t)infoSize;
rosarium 0:892175366555 448 }
rosarium 0:892175366555 449
rosarium 0:892175366555 450 memcpy( &pNDEFMessage[Offset], TEXT_TYPE_STRING, TEXT_TYPE_STRING_LENGTH );
rosarium 0:892175366555 451 Offset+=TEXT_TYPE_STRING_LENGTH;
rosarium 0:892175366555 452 pNDEFMessage[Offset++] = ISO_ENGLISH_CODE_STRING_LENGTH; /* UTF-8 with x byte language code */
rosarium 0:892175366555 453 memcpy( &pNDEFMessage[Offset], ISO_ENGLISH_CODE_STRING, ISO_ENGLISH_CODE_STRING_LENGTH );
rosarium 0:892175366555 454 Offset += ISO_ENGLISH_CODE_STRING_LENGTH;
rosarium 0:892175366555 455
rosarium 0:892175366555 456 /* Information payload */
rosarium 0:892175366555 457 memcpy( &pNDEFMessage[Offset], pURI->Information, strlen(pURI->Information) );
rosarium 0:892175366555 458 Offset += strlen(pURI->Information);
rosarium 0:892175366555 459 }
rosarium 0:892175366555 460
rosarium 0:892175366555 461 *size = Offset;
rosarium 0:892175366555 462
rosarium 0:892175366555 463 }
rosarium 0:892175366555 464 /**
rosarium 0:892175366555 465 * @brief This function write the NDEF file with the URI data given in the structure.
rosarium 0:892175366555 466 * @param pURI : pointer on structure that contain the URI information.
rosarium 0:892175366555 467 * @retval NDEF_OK : NDEF file data written in the tag.
rosarium 0:892175366555 468 * @retval NDEF_ERROR : not able to store NDEF in tag.
rosarium 0:892175366555 469 * @retval NDEF_ERROR_MEMORY_INTERNAL : Cannot write to tag.
rosarium 0:892175366555 470 * @retval NDEF_ERROR_NOT_FORMATED : CCFile data not supported or not present.
rosarium 0:892175366555 471 * @retval NDEF_ERROR_MEMORY_TAG : Size not compatible with memory.
rosarium 0:892175366555 472 * @retval NDEF_ERROR_LOCKED : Tag locked, cannot be write.
rosarium 0:892175366555 473 */
rosarium 0:892175366555 474 uint16_t NDEF_URI::NDEF_WriteURI( sURI_Info *pURI )
rosarium 0:892175366555 475 {
rosarium 0:892175366555 476 uint16_t status = NDEF_ERROR, Offset = 0;
rosarium 0:892175366555 477
rosarium 0:892175366555 478 NDEF_PrepareURIMessage( pURI, &NDEF_Buffer[FIRST_RECORD_OFFSET], &Offset );
rosarium 0:892175366555 479
rosarium 0:892175366555 480 /* Write NDEF */
rosarium 0:892175366555 481 NDEF_Buffer[0] = (Offset & 0xFF00) >> 8;
rosarium 0:892175366555 482 NDEF_Buffer[1] = Offset & 0x00FF;
rosarium 0:892175366555 483
rosarium 0:892175366555 484 status = WriteData( 0x00, Offset + FIRST_RECORD_OFFSET, NDEF_Buffer );
rosarium 0:892175366555 485
rosarium 0:892175366555 486 return status;
rosarium 0:892175366555 487 }
rosarium 0:892175366555 488
rosarium 0:892175366555 489 char NDEF_URI::getUriType( char *protocol )
rosarium 0:892175366555 490 {
rosarium 0:892175366555 491 if( !memcmp( protocol, URI_ID_0x01_STRING, strlen(URI_ID_0x01_STRING) ) ) return URI_ID_0x01;
rosarium 0:892175366555 492 else if( !memcmp( protocol, URI_ID_0x02_STRING, strlen(URI_ID_0x02_STRING) ) ) return URI_ID_0x02;
rosarium 0:892175366555 493 else if( !memcmp( protocol, URI_ID_0x03_STRING, strlen(URI_ID_0x03_STRING) ) ) return URI_ID_0x03;
rosarium 0:892175366555 494 else if( !memcmp( protocol, URI_ID_0x04_STRING, strlen(URI_ID_0x04_STRING) ) ) return URI_ID_0x04;
rosarium 0:892175366555 495 else if( !memcmp( protocol, URI_ID_0x05_STRING, strlen(URI_ID_0x05_STRING) ) ) return URI_ID_0x05;
rosarium 0:892175366555 496 else if( !memcmp( protocol, URI_ID_0x06_STRING, strlen(URI_ID_0x06_STRING) ) ) return URI_ID_0x06;
rosarium 0:892175366555 497 else if( !memcmp( protocol, URI_ID_0x07_STRING, strlen(URI_ID_0x07_STRING) ) ) return URI_ID_0x07;
rosarium 0:892175366555 498 else if( !memcmp( protocol, URI_ID_0x08_STRING, strlen(URI_ID_0x08_STRING) ) ) return URI_ID_0x08;
rosarium 0:892175366555 499 else if( !memcmp( protocol, URI_ID_0x09_STRING, strlen(URI_ID_0x09_STRING) ) ) return URI_ID_0x09;
rosarium 0:892175366555 500 else if( !memcmp( protocol, URI_ID_0x0A_STRING, strlen(URI_ID_0x0A_STRING) ) ) return URI_ID_0x0A;
rosarium 0:892175366555 501 else if( !memcmp( protocol, URI_ID_0x0B_STRING, strlen(URI_ID_0x0B_STRING) ) ) return URI_ID_0x0B;
rosarium 0:892175366555 502 else if( !memcmp( protocol, URI_ID_0x0C_STRING, strlen(URI_ID_0x0C_STRING) ) ) return URI_ID_0x0C;
rosarium 0:892175366555 503 else if( !memcmp( protocol, URI_ID_0x0D_STRING, strlen(URI_ID_0x0D_STRING) ) ) return URI_ID_0x0D;
rosarium 0:892175366555 504 else if( !memcmp( protocol, URI_ID_0x0E_STRING, strlen(URI_ID_0x0E_STRING) ) ) return URI_ID_0x0E;
rosarium 0:892175366555 505 else if( !memcmp( protocol, URI_ID_0x0F_STRING, strlen(URI_ID_0x0F_STRING) ) ) return URI_ID_0x0F;
rosarium 0:892175366555 506 else if( !memcmp( protocol, URI_ID_0x10_STRING, strlen(URI_ID_0x10_STRING) ) ) return URI_ID_0x10;
rosarium 0:892175366555 507 else if( !memcmp( protocol, URI_ID_0x11_STRING, strlen(URI_ID_0x11_STRING) ) ) return URI_ID_0x11;
rosarium 0:892175366555 508 else if( !memcmp( protocol, URI_ID_0x12_STRING, strlen(URI_ID_0x12_STRING) ) ) return URI_ID_0x12;
rosarium 0:892175366555 509 else if( !memcmp( protocol, URI_ID_0x13_STRING, strlen(URI_ID_0x13_STRING) ) ) return URI_ID_0x13;
rosarium 0:892175366555 510 else if( !memcmp( protocol, URI_ID_0x14_STRING, strlen(URI_ID_0x14_STRING) ) ) return URI_ID_0x14;
rosarium 0:892175366555 511 else if( !memcmp( protocol, URI_ID_0x15_STRING, strlen(URI_ID_0x15_STRING) ) ) return URI_ID_0x15;
rosarium 0:892175366555 512 else if( !memcmp( protocol, URI_ID_0x16_STRING, strlen(URI_ID_0x16_STRING) ) ) return URI_ID_0x16;
rosarium 0:892175366555 513 else if( !memcmp( protocol, URI_ID_0x17_STRING, strlen(URI_ID_0x17_STRING) ) ) return URI_ID_0x17;
rosarium 0:892175366555 514 else if( !memcmp( protocol, URI_ID_0x18_STRING, strlen(URI_ID_0x18_STRING) ) ) return URI_ID_0x18;
rosarium 0:892175366555 515 else if( !memcmp( protocol, URI_ID_0x19_STRING, strlen(URI_ID_0x19_STRING) ) ) return URI_ID_0x19;
rosarium 0:892175366555 516 else if( !memcmp( protocol, URI_ID_0x1A_STRING, strlen(URI_ID_0x1A_STRING) ) ) return URI_ID_0x1A;
rosarium 0:892175366555 517 else if( !memcmp( protocol, URI_ID_0x1B_STRING, strlen(URI_ID_0x1B_STRING) ) ) return URI_ID_0x1B;
rosarium 0:892175366555 518 else if( !memcmp( protocol, URI_ID_0x1C_STRING, strlen(URI_ID_0x1C_STRING) ) ) return URI_ID_0x1C;
rosarium 0:892175366555 519 else if( !memcmp( protocol, URI_ID_0x1D_STRING, strlen(URI_ID_0x1D_STRING) ) ) return URI_ID_0x1D;
rosarium 0:892175366555 520 else if( !memcmp( protocol, URI_ID_0x1E_STRING, strlen(URI_ID_0x1E_STRING) ) ) return URI_ID_0x1E;
rosarium 0:892175366555 521 else if( !memcmp( protocol, URI_ID_0x1F_STRING, strlen(URI_ID_0x1F_STRING) ) ) return URI_ID_0x1F;
rosarium 0:892175366555 522 else if( !memcmp( protocol, URI_ID_0x20_STRING, strlen(URI_ID_0x20_STRING) ) ) return URI_ID_0x20;
rosarium 0:892175366555 523 else if( !memcmp( protocol, URI_ID_0x21_STRING, strlen(URI_ID_0x21_STRING) ) ) return URI_ID_0x21;
rosarium 0:892175366555 524 else if( !memcmp( protocol, URI_ID_0x22_STRING, strlen(URI_ID_0x22_STRING) ) ) return URI_ID_0x22;
rosarium 0:892175366555 525 else if( !memcmp( protocol, URI_ID_0x23_STRING, strlen(URI_ID_0x23_STRING) ) ) return URI_ID_0x23;
rosarium 0:892175366555 526 else return URI_ID_0x00; // No abreviation for this protocol
rosarium 0:892175366555 527 }
rosarium 0:892175366555 528
rosarium 0:892175366555 529 NFCTAG_StatusTypeDef NDEF_URI::NFCTAG_ReadData( uint8_t * const pData, const uint16_t TarAddr, const uint16_t Size )
rosarium 0:892175366555 530 {
rosarium 0:892175366555 531 return(mM24LRp->i2c_ReadData(pData, TarAddr, Size ));
rosarium 0:892175366555 532 }
rosarium 0:892175366555 533 NFCTAG_StatusTypeDef NDEF_URI::NFCTAG_WriteData( const uint8_t * const pData, const uint16_t TarAddr, const uint16_t Size )
rosarium 0:892175366555 534 {
rosarium 0:892175366555 535 return(mM24LRp->i2c_WriteData( pData, TarAddr, Size ));
rosarium 0:892175366555 536 }
rosarium 0:892175366555 537
rosarium 0:892175366555 538 /**
rosarium 0:892175366555 539 * @}
rosarium 0:892175366555 540 */
rosarium 0:892175366555 541
rosarium 0:892175366555 542 /**
rosarium 0:892175366555 543 * @}
rosarium 0:892175366555 544 */
rosarium 0:892175366555 545
rosarium 0:892175366555 546 /**
rosarium 0:892175366555 547 * @}
rosarium 0:892175366555 548 */
rosarium 0:892175366555 549
rosarium 0:892175366555 550 /******************* (C) COPYRIGHT 2016 STMicroelectronics *****END OF FILE****/