mbed OS 5 example application using X-NUCLEO-NFC02A1

Dependencies:   NDefLib X_NUCLEO_NFC02A1

Fork of HelloWorld_NFC02A1 by ST

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