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