Firmware library for the X-NUCLEO-NFC01A1 Dynamic NFC Tag board.

Dependencies:   M24SR

Dependents:   NFC M2M_2016_STM32 MyongjiElec_capstone1 IDW01M1_Cloud_IBM ... more

Fork of X_NUCLEO_NFC01A1 by ST Expansion SW Team

X-NUCLEO-NFC01A1 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-NFC01A1 Dynamic NFC Tag Expansion Board based on M24SR.

Firmware Library

Class X_NUCLEO_NFC01A1 is intended to represent the Dynamic NFC Tag Expansion Board with the same name.
It provides an API to access to the M24SR component and to the three onboard LEDs.
It is intentionally implemented as a singleton because only one X_NUCLEO_NFC01A1 at a time might be deployed in a HW component stack.
The library also provides an implementation of the NDEF library API for M24SR, providing an simple way to read/write NDEF formatted messages from/to the M24SR dynamic NFC tag.

Example applications

1. Hello World
2. Asynchronous Hello World

Committer:
giovannivisentini
Date:
Thu Oct 27 07:38:00 2016 +0000
Revision:
28:e0d4ffa90f8b
Parent:
27:3881985097bb
manage the case of pins configured as "Not Connected"

Who changed what in which revision?

UserRevisionLine numberNew contents of line
giovannivisentini 0:969a2be49f41 1 /**
giovannivisentini 0:969a2be49f41 2 ******************************************************************************
giovannivisentini 0:969a2be49f41 3 * @file m24sr_class.h
giovannivisentini 6:96389fb79676 4 * @author ST Central Labs
giovannivisentini 27:3881985097bb 5 * @version V1.1.0
giovannivisentini 27:3881985097bb 6 * @date 30 Set 2016
giovannivisentini 0:969a2be49f41 7 * @brief This file provides a set of functions to interface with the M24SR
giovannivisentini 0:969a2be49f41 8 * device.
giovannivisentini 0:969a2be49f41 9 ******************************************************************************
giovannivisentini 0:969a2be49f41 10 * @attention
giovannivisentini 0:969a2be49f41 11 *
giovannivisentini 1:15d4a123ef6b 12 * <h2><center>&copy; COPYRIGHT(c) 2015 STMicroelectronics</center></h2>
giovannivisentini 0:969a2be49f41 13 *
giovannivisentini 0:969a2be49f41 14 * Redistribution and use in source and binary forms, with or without modification,
giovannivisentini 0:969a2be49f41 15 * are permitted provided that the following conditions are met:
giovannivisentini 0:969a2be49f41 16 * 1. Redistributions of source code must retain the above copyright notice,
giovannivisentini 0:969a2be49f41 17 * this list of conditions and the following disclaimer.
giovannivisentini 0:969a2be49f41 18 * 2. Redistributions in binary form must reproduce the above copyright notice,
giovannivisentini 0:969a2be49f41 19 * this list of conditions and the following disclaimer in the documentation
giovannivisentini 0:969a2be49f41 20 * and/or other materials provided with the distribution.
giovannivisentini 0:969a2be49f41 21 * 3. Neither the name of STMicroelectronics nor the names of its contributors
giovannivisentini 0:969a2be49f41 22 * may be used to endorse or promote products derived from this software
giovannivisentini 0:969a2be49f41 23 * without specific prior written permission.
giovannivisentini 0:969a2be49f41 24 *
giovannivisentini 0:969a2be49f41 25 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
giovannivisentini 0:969a2be49f41 26 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
giovannivisentini 0:969a2be49f41 27 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
giovannivisentini 0:969a2be49f41 28 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
giovannivisentini 0:969a2be49f41 29 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
giovannivisentini 0:969a2be49f41 30 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
giovannivisentini 0:969a2be49f41 31 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
giovannivisentini 0:969a2be49f41 32 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
giovannivisentini 0:969a2be49f41 33 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
giovannivisentini 0:969a2be49f41 34 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
giovannivisentini 0:969a2be49f41 35 *
giovannivisentini 0:969a2be49f41 36 ******************************************************************************
giovannivisentini 0:969a2be49f41 37 */
giovannivisentini 0:969a2be49f41 38
giovannivisentini 0:969a2be49f41 39 /* Revision ------------------------------------------------------------------*/
giovannivisentini 0:969a2be49f41 40 /*
giovannivisentini 0:969a2be49f41 41 Based on: X-CUBE-MEMS1/trunk/Drivers/BSP/Components/m24sr/m24sr.h
giovannivisentini 0:969a2be49f41 42 Revision: M24SR Driver V1.0.0
giovannivisentini 0:969a2be49f41 43 */
giovannivisentini 0:969a2be49f41 44
giovannivisentini 0:969a2be49f41 45 /* Define to prevent recursive inclusion -------------------------------------*/
giovannivisentini 0:969a2be49f41 46
giovannivisentini 0:969a2be49f41 47 #ifndef __M24SR_CLASS_H
giovannivisentini 0:969a2be49f41 48 #define __M24SR_CLASS_H
giovannivisentini 0:969a2be49f41 49
giovannivisentini 0:969a2be49f41 50 /* Includes ------------------------------------------------------------------*/
giovannivisentini 0:969a2be49f41 51
giovannivisentini 0:969a2be49f41 52 #include "mbed.h"
giovannivisentini 0:969a2be49f41 53 #include "I2C.h"
giovannivisentini 0:969a2be49f41 54
giovannivisentini 0:969a2be49f41 55 #include "m24sr.h"
giovannivisentini 27:3881985097bb 56 #include "Nfc.h"
giovannivisentini 27:3881985097bb 57
giovannivisentini 27:3881985097bb 58 #include "NDefLib/NDefNfcTag.h"
giovannivisentini 27:3881985097bb 59 class NDefNfcTagM24SR;
giovannivisentini 0:969a2be49f41 60
giovannivisentini 0:969a2be49f41 61 /* Classes -------------------------------------------------------------------*/
giovannivisentini 0:969a2be49f41 62
giovannivisentini 9:9f2e2e68d695 63 /**
giovannivisentini 27:3881985097bb 64 * Class representing a M24SR component.
giovannivisentini 27:3881985097bb 65 * This component has two operation modes, sync or async.
giovannivisentini 27:3881985097bb 66 * In sync mode each function call returns only after the command has completed.
giovannivisentini 27:3881985097bb 67 * In async mode each function call returns immediately and the answer will be notified
giovannivisentini 27:3881985097bb 68 * through a callback.
giovannivisentini 27:3881985097bb 69 * The default behavior is sync mode.
giovannivisentini 27:3881985097bb 70 * To enable the async mode ManageI2CGPO(I2C_ANSWER_READY) function must be called.
giovannivisentini 27:3881985097bb 71 * When the component notifies an interrupt user must call {@link ManageEvent} function.
giovannivisentini 27:3881985097bb 72 * Note that passing a parameter other than I2C_ANSWER_READY to ManageI2CGPO initialize the component in sync mode.
giovannivisentini 0:969a2be49f41 73 */
giovannivisentini 0:969a2be49f41 74 class M24SR: public Nfc {
giovannivisentini 0:969a2be49f41 75
giovannivisentini 0:969a2be49f41 76 public:
giovannivisentini 0:969a2be49f41 77
giovannivisentini 27:3881985097bb 78 typedef enum {
giovannivisentini 27:3881985097bb 79 M24SR_SUCCESS=NFC_SUCCESS,
giovannivisentini 27:3881985097bb 80 M24SR_ERROR=0x6F00,
giovannivisentini 27:3881985097bb 81 M24SR_FILE_OVERFLOW_LE = 0x6280,
giovannivisentini 27:3881985097bb 82 M24SR_EOF = 0x6282,
giovannivisentini 27:3881985097bb 83 M24SR_PASSWORD_REQUIRED = 0x6300,
giovannivisentini 27:3881985097bb 84 M24SR_PASSWORD_INCORRECT = 0x63C0,
giovannivisentini 27:3881985097bb 85 M24SR_PASSWORD_INCORRECT1RETRY = 0x63C1,
giovannivisentini 27:3881985097bb 86 M24SR_PASSWORD_INCORRECT2RETRY = 0x63C2,
giovannivisentini 27:3881985097bb 87 M24SR_WRONG_LENGHT = 0x6700,
giovannivisentini 27:3881985097bb 88 M24SR_UNSUCESSFUL_UPDATING = 0x6581,
giovannivisentini 27:3881985097bb 89 M24SR_INCOPATIBLE_COMMAND= 0x6981,
giovannivisentini 27:3881985097bb 90 M24SR_SECURITY_UNSATISFIED = 0x6982,
giovannivisentini 27:3881985097bb 91 M24SR_REFERENCE_DATA_NOT_USABLE = 0x6984,
giovannivisentini 27:3881985097bb 92
giovannivisentini 27:3881985097bb 93 M24SR_INCORRECT_PARAMETER = 0x6a80,
giovannivisentini 27:3881985097bb 94 M24SR_FILE_NOT_FOUND=0x6a82,
giovannivisentini 27:3881985097bb 95 M24SR_FILE_OVERFLOW_LC = 0x6A84, //TODO difference with Le??
giovannivisentini 27:3881985097bb 96
giovannivisentini 27:3881985097bb 97 M24SR_INCORRECT_P1_OR_P2 = 0x6A86, //TODO better name?
giovannivisentini 27:3881985097bb 98 M24SR_RF_SESSION_KILLED=0x6500,
giovannivisentini 27:3881985097bb 99 M24SR_INS_NOT_SUPPORTED=0x6D00,
giovannivisentini 27:3881985097bb 100 M24SR_CLASS_NOT_SUPPORTED=0x6E00,
giovannivisentini 27:3881985097bb 101
giovannivisentini 27:3881985097bb 102 //IOError
giovannivisentini 27:3881985097bb 103 M24SR_IO_ERROR_I2CTIMEOUT=0x0011,
giovannivisentini 27:3881985097bb 104 M24SR_IO_ERROR_CRC=0x0012,
giovannivisentini 27:3881985097bb 105 M24SR_IO_ERROR_NACK=0x0013,
giovannivisentini 27:3881985097bb 106 M24SR_IO_ERROR_PARAMETER=0x0014,
giovannivisentini 27:3881985097bb 107 M24SR_IO_ERROR_NBATEMPT=0x0015,
giovannivisentini 28:e0d4ffa90f8b 108 M24SR_IO_NOACKNOWLEDGE=0x0016,
giovannivisentini 28:e0d4ffa90f8b 109 M24SR_IO_PIN_NOT_CONNECTED=0x0017
giovannivisentini 27:3881985097bb 110 } StatusTypeDef;
giovannivisentini 27:3881985097bb 111
giovannivisentini 27:3881985097bb 112 /**
giovannivisentini 27:3881985097bb 113 * @brief GPO state structure
giovannivisentini 27:3881985097bb 114 */
giovannivisentini 27:3881985097bb 115 typedef enum {
giovannivisentini 27:3881985097bb 116 HIGH_IMPEDANCE = 0,
giovannivisentini 27:3881985097bb 117 SESSION_OPENED =1,
giovannivisentini 27:3881985097bb 118 WIP=2,
giovannivisentini 27:3881985097bb 119 I2C_ANSWER_READY=3,
giovannivisentini 27:3881985097bb 120 INTERRUPT=4,
giovannivisentini 27:3881985097bb 121 STATE_CONTROL=5
giovannivisentini 27:3881985097bb 122 } NFC_GPO_MGMT;
giovannivisentini 27:3881985097bb 123
giovannivisentini 27:3881985097bb 124 /**
giovannivisentini 27:3881985097bb 125 * Possible password to set.
giovannivisentini 27:3881985097bb 126 */
giovannivisentini 27:3881985097bb 127 typedef enum{
giovannivisentini 27:3881985097bb 128 ReadPwd, //!< Password to use before reading the tag
giovannivisentini 27:3881985097bb 129 WritePwd, //!< Password to use before writing the tag
giovannivisentini 27:3881985097bb 130 I2CPwd, //!< Root password, used only through nfc
giovannivisentini 27:3881985097bb 131 }PasswordType_t;
giovannivisentini 27:3881985097bb 132
giovannivisentini 7:19fc04b8fec6 133 /**
giovannivisentini 9:9f2e2e68d695 134 * Default password used to change the write/read permission
giovannivisentini 7:19fc04b8fec6 135 */
giovannivisentini 0:969a2be49f41 136 static const uint8_t DEFAULT_PASSWORD[16];
giovannivisentini 19:0b65a5813059 137
giovannivisentini 19:0b65a5813059 138 /**
giovannivisentini 23:d07138541feb 139 * Default gpo status -> the gpo will remain high
giovannivisentini 19:0b65a5813059 140 */
giovannivisentini 19:0b65a5813059 141 static const NFC_GPO_MGMT DEFAULT_GPO_STATUS=HIGH_IMPEDANCE;
giovannivisentini 19:0b65a5813059 142
giovannivisentini 27:3881985097bb 143
giovannivisentini 27:3881985097bb 144 /**
giovannivisentini 27:3881985097bb 145 * Function that will be called when an interrupt is fired,
giovannivisentini 27:3881985097bb 146 * this function must be set if you want use the component in async mode.
giovannivisentini 27:3881985097bb 147 */
giovannivisentini 27:3881985097bb 148 typedef void(*gpoEventCallback)(void);
giovannivisentini 27:3881985097bb 149
giovannivisentini 27:3881985097bb 150 /**
giovannivisentini 27:3881985097bb 151 * Object that contains all the callbacks fired by this class, each command has its own callback.
giovannivisentini 27:3881985097bb 152 * The callback default implementation is an empty function.
giovannivisentini 27:3881985097bb 153 */
giovannivisentini 27:3881985097bb 154 class Callbacks{
giovannivisentini 27:3881985097bb 155 public:
giovannivisentini 27:3881985097bb 156
giovannivisentini 27:3881985097bb 157 /** called when GetSession or ForceGetSession completes
giovannivisentini 27:3881985097bb 158 * @see M24SR#GetSession
giovannivisentini 27:3881985097bb 159 * @see M24SR#ForceGetSession */
giovannivisentini 27:3881985097bb 160 virtual void onSessionOpen(M24SR *nfc,StatusTypeDef status){
giovannivisentini 27:3881985097bb 161 (void)nfc; (void)status;
giovannivisentini 27:3881985097bb 162 }
giovannivisentini 27:3881985097bb 163
giovannivisentini 27:3881985097bb 164 /** called when Deselect completes
giovannivisentini 27:3881985097bb 165 * @see M24SR#Deselect */
giovannivisentini 27:3881985097bb 166 virtual void onDeselect(M24SR *nfc,StatusTypeDef status){
giovannivisentini 27:3881985097bb 167 (void)nfc; (void)status;
giovannivisentini 27:3881985097bb 168 }
giovannivisentini 27:3881985097bb 169
giovannivisentini 27:3881985097bb 170 /** called when SelectedApplication completes
giovannivisentini 27:3881985097bb 171 * @see M24SR#SelectedApplication */
giovannivisentini 27:3881985097bb 172 virtual void onSelectedApplication(M24SR *nfc,StatusTypeDef status){
giovannivisentini 27:3881985097bb 173 (void)nfc; (void)status;
giovannivisentini 27:3881985097bb 174 }
giovannivisentini 27:3881985097bb 175
giovannivisentini 27:3881985097bb 176 /** called when SelectedCCFile completes
giovannivisentini 27:3881985097bb 177 * @see M24SR#SelectedCCFile */
giovannivisentini 27:3881985097bb 178 virtual void onSelectedCCFile(M24SR *nfc,StatusTypeDef status){
giovannivisentini 27:3881985097bb 179 (void)nfc; (void)status;
giovannivisentini 27:3881985097bb 180 }
giovannivisentini 27:3881985097bb 181
giovannivisentini 27:3881985097bb 182 /** called when SelectedNDEFFile completes
giovannivisentini 27:3881985097bb 183 * @see M24SR#SelectedNDEFFile */
giovannivisentini 27:3881985097bb 184 virtual void onSelectedNDEFFile(M24SR *nfc,StatusTypeDef status){
giovannivisentini 27:3881985097bb 185 (void)nfc; (void)status;
giovannivisentini 27:3881985097bb 186 }
giovannivisentini 27:3881985097bb 187
giovannivisentini 27:3881985097bb 188 /** called when SelectedSystemFile completes
giovannivisentini 27:3881985097bb 189 * @see M24SR#SelectedSystemFile */
giovannivisentini 27:3881985097bb 190 virtual void onSelectedSystemFile(M24SR *nfc,StatusTypeDef status){
giovannivisentini 27:3881985097bb 191 (void)nfc; (void)status;
giovannivisentini 27:3881985097bb 192 }
giovannivisentini 27:3881985097bb 193
giovannivisentini 27:3881985097bb 194 /** called when ReadBinary or STReadBinary completes
giovannivisentini 27:3881985097bb 195 * @see M24SR#ReadBinary
giovannivisentini 27:3881985097bb 196 * @see M24SR#STReadBinary */
giovannivisentini 27:3881985097bb 197 virtual void onReadByte(M24SR *nfc,StatusTypeDef status,
giovannivisentini 27:3881985097bb 198 uint16_t offset,uint8_t *readByte, uint16_t nReadByte){
giovannivisentini 27:3881985097bb 199 (void)nfc; (void)status;(void)offset; (void)readByte; (void)nReadByte;
giovannivisentini 27:3881985097bb 200 }
giovannivisentini 27:3881985097bb 201
giovannivisentini 27:3881985097bb 202 /** called when UpdatedBinary completes
giovannivisentini 27:3881985097bb 203 * @see M24SR#UpdatedBinary */
giovannivisentini 27:3881985097bb 204 virtual void onUpdatedBinary(M24SR *nfc,StatusTypeDef status,uint16_t offset,
giovannivisentini 27:3881985097bb 205 uint8_t *writeByte,uint16_t nWriteByte){
giovannivisentini 27:3881985097bb 206 (void)nfc; (void)status; (void)writeByte; (void)nWriteByte; (void)offset;
giovannivisentini 27:3881985097bb 207 }
giovannivisentini 27:3881985097bb 208
giovannivisentini 27:3881985097bb 209 /** called when Verify completes
giovannivisentini 27:3881985097bb 210 * @see M24SR#Verify */
giovannivisentini 27:3881985097bb 211 virtual void onVerified(M24SR *nfc,StatusTypeDef status,PasswordType_t uPwdId,
giovannivisentini 27:3881985097bb 212 const uint8_t *pwd){
giovannivisentini 27:3881985097bb 213 (void)nfc; (void)status;(void)uPwdId;(void)pwd;
giovannivisentini 27:3881985097bb 214 }
giovannivisentini 27:3881985097bb 215
giovannivisentini 27:3881985097bb 216 /** called when ManageI2CGPO completes
giovannivisentini 27:3881985097bb 217 * @see M24SR#ManageI2CGPO */
giovannivisentini 27:3881985097bb 218 virtual void onManageI2CGPO(M24SR *nfc,StatusTypeDef status,NFC_GPO_MGMT newStatus){
giovannivisentini 27:3881985097bb 219 (void)nfc; (void)status;(void)newStatus;
giovannivisentini 27:3881985097bb 220 }
giovannivisentini 27:3881985097bb 221
giovannivisentini 27:3881985097bb 222 /** called when ManageRFGPO completes
giovannivisentini 27:3881985097bb 223 * @see M24SR#ManageRFGPO */
giovannivisentini 27:3881985097bb 224 virtual void onManageRFGPO(M24SR *nfc,StatusTypeDef status,NFC_GPO_MGMT newStatus){
giovannivisentini 27:3881985097bb 225 (void)nfc; (void)status;(void)newStatus;
giovannivisentini 27:3881985097bb 226 }
giovannivisentini 27:3881985097bb 227
giovannivisentini 27:3881985097bb 228 /** called when ChangeReferenceData completes
giovannivisentini 27:3881985097bb 229 * @see M24SR#ChangeReferenceData */
giovannivisentini 27:3881985097bb 230 virtual void onChangeReferenceData(M24SR *nfc ,StatusTypeDef status,PasswordType_t type,
giovannivisentini 27:3881985097bb 231 uint8_t *data){
giovannivisentini 27:3881985097bb 232 (void)nfc; (void)status;(void)type;(void)data;
giovannivisentini 27:3881985097bb 233 }
giovannivisentini 27:3881985097bb 234
giovannivisentini 27:3881985097bb 235 /** called when EnableVerificationRequirement completes
giovannivisentini 27:3881985097bb 236 * @see M24SR#EnableVerificationRequirement */
giovannivisentini 27:3881985097bb 237 virtual void onEnableVerificationRequirement(M24SR *nfc ,StatusTypeDef status,PasswordType_t type){
giovannivisentini 27:3881985097bb 238 (void)nfc; (void)status;(void)type;
giovannivisentini 27:3881985097bb 239 }
giovannivisentini 27:3881985097bb 240
giovannivisentini 27:3881985097bb 241 /** called when DisableVerificationRequirement completes
giovannivisentini 27:3881985097bb 242 * @see M24SR#DisableVerificationRequirement */
giovannivisentini 27:3881985097bb 243 virtual void onDisableVerificationRequirement(M24SR *nfc , StatusTypeDef status,PasswordType_t type){
giovannivisentini 27:3881985097bb 244 (void)nfc; (void)status;(void)type;
giovannivisentini 27:3881985097bb 245 }
giovannivisentini 27:3881985097bb 246
giovannivisentini 27:3881985097bb 247 /** called when EnablePermanentState completes
giovannivisentini 27:3881985097bb 248 * @see M24SR#EnablePermanentState */
giovannivisentini 27:3881985097bb 249 virtual void onEnablePermanentState(M24SR *nfc, StatusTypeDef status, PasswordType_t type){
giovannivisentini 27:3881985097bb 250 (void)nfc; (void)status;(void)type;
giovannivisentini 27:3881985097bb 251 }
giovannivisentini 27:3881985097bb 252
giovannivisentini 27:3881985097bb 253 /** called when DisablePermanentState completes
giovannivisentini 27:3881985097bb 254 * @see M24SR#DisablePermanentState */
giovannivisentini 27:3881985097bb 255 virtual void onDisablePermanentState(M24SR *nfc, StatusTypeDef status, PasswordType_t type){
giovannivisentini 27:3881985097bb 256 (void)nfc; (void)status;(void)type;
giovannivisentini 27:3881985097bb 257 }
giovannivisentini 27:3881985097bb 258
giovannivisentini 27:3881985097bb 259 /** called when ReadId completes
giovannivisentini 27:3881985097bb 260 * @see M24SR#ReadId */
giovannivisentini 27:3881985097bb 261 virtual void onReadId(M24SR *nfc, StatusTypeDef status, uint8_t *id){
giovannivisentini 27:3881985097bb 262 (void)nfc; (void)status;(void)id;
giovannivisentini 27:3881985097bb 263 }
giovannivisentini 27:3881985097bb 264
giovannivisentini 27:3881985097bb 265 /** called when EnableReadPassword completes
giovannivisentini 27:3881985097bb 266 * @see M24SR#EnableReadPassword */
giovannivisentini 27:3881985097bb 267 virtual void onEnableReadPassword(M24SR *nfc, StatusTypeDef status,const uint8_t *newPwd){
giovannivisentini 27:3881985097bb 268 (void)nfc; (void)status;(void)newPwd;
giovannivisentini 27:3881985097bb 269 }
giovannivisentini 27:3881985097bb 270
giovannivisentini 27:3881985097bb 271 /** called when EnableWritePassword completes
giovannivisentini 27:3881985097bb 272 * @see M24SR#EnableWritePassword */
giovannivisentini 27:3881985097bb 273 virtual void onEnableWritePassword(M24SR *nfc, StatusTypeDef status,const uint8_t *newPwd){
giovannivisentini 27:3881985097bb 274 (void)nfc; (void)status;(void)newPwd;
giovannivisentini 27:3881985097bb 275 }
giovannivisentini 27:3881985097bb 276
giovannivisentini 27:3881985097bb 277 /** called when DisableReadPassword completes
giovannivisentini 27:3881985097bb 278 * @see M24SR#DisableReadPassword */
giovannivisentini 27:3881985097bb 279 virtual void onDisableReadPassword(M24SR *nfc, StatusTypeDef status){
giovannivisentini 27:3881985097bb 280 (void)nfc; (void)status;
giovannivisentini 27:3881985097bb 281 }
giovannivisentini 27:3881985097bb 282
giovannivisentini 27:3881985097bb 283 /** called when DisableWritePassword completes
giovannivisentini 27:3881985097bb 284 * @see M24SR#DisableWritePassword */
giovannivisentini 27:3881985097bb 285 virtual void onDisableWritePassword(M24SR *nfc, StatusTypeDef status){
giovannivisentini 27:3881985097bb 286 (void)nfc; (void)status;
giovannivisentini 27:3881985097bb 287 }
giovannivisentini 27:3881985097bb 288
giovannivisentini 27:3881985097bb 289 /** called when DisableAllPassword completes
giovannivisentini 27:3881985097bb 290 * @see M24SR#DisableAllPassword */
giovannivisentini 27:3881985097bb 291 virtual void onDisableAllPassword(M24SR *nfc, StatusTypeDef status){
giovannivisentini 27:3881985097bb 292 (void)nfc; (void)status;
giovannivisentini 27:3881985097bb 293 }
giovannivisentini 27:3881985097bb 294
giovannivisentini 27:3881985097bb 295
giovannivisentini 27:3881985097bb 296 /** called when EnableReadOnly completes
giovannivisentini 27:3881985097bb 297 * @see M24SR#EnableReadOnly */
giovannivisentini 27:3881985097bb 298 virtual void onEnableReadOnly(M24SR *nfc,StatusTypeDef status){
giovannivisentini 27:3881985097bb 299 (void)nfc; (void)status;
giovannivisentini 27:3881985097bb 300 }
giovannivisentini 27:3881985097bb 301
giovannivisentini 27:3881985097bb 302 /** called when EnableWriteOnly completes
giovannivisentini 27:3881985097bb 303 * @see M24SR#EnableWriteOnly */
giovannivisentini 27:3881985097bb 304 virtual void onEnableWriteOnly(M24SR *nfc,StatusTypeDef status){
giovannivisentini 27:3881985097bb 305 (void)nfc; (void)status;
giovannivisentini 27:3881985097bb 306 }
giovannivisentini 27:3881985097bb 307
giovannivisentini 27:3881985097bb 308
giovannivisentini 27:3881985097bb 309 /** called when DisableReadOnly completes
giovannivisentini 27:3881985097bb 310 * @see M24SR#DisableReadOnly */
giovannivisentini 27:3881985097bb 311 virtual void onDisableReadOnly(M24SR *nfc,StatusTypeDef status){
giovannivisentini 27:3881985097bb 312 (void)nfc; (void)status;
giovannivisentini 27:3881985097bb 313 }
giovannivisentini 27:3881985097bb 314
giovannivisentini 27:3881985097bb 315 /** called when DisableWriteOnly completes
giovannivisentini 27:3881985097bb 316 * @see M24SR#DisableWriteOnly */
giovannivisentini 27:3881985097bb 317 virtual void onDisableWriteOnly(M24SR *nfc,StatusTypeDef status){
giovannivisentini 27:3881985097bb 318 (void)nfc; (void)status;
giovannivisentini 27:3881985097bb 319 }
giovannivisentini 27:3881985097bb 320
giovannivisentini 27:3881985097bb 321 virtual ~Callbacks(){};
giovannivisentini 27:3881985097bb 322 };
giovannivisentini 27:3881985097bb 323
giovannivisentini 0:969a2be49f41 324 /*** Constructor and Destructor Methods ***/
giovannivisentini 0:969a2be49f41 325
giovannivisentini 0:969a2be49f41 326 /**
giovannivisentini 0:969a2be49f41 327 * @brief Constructor.
giovannivisentini 0:969a2be49f41 328 * @param address I2C address of the component.
giovannivisentini 9:9f2e2e68d695 329 * @param I2C I2C device to be used for communication.
giovannivisentini 24:9f98eafa2d39 330 * @param eventCallback Function that will be called when the gpo pin status changes.
giovannivisentini 9:9f2e2e68d695 331 * @param GPOPinName Pin used as GPIO.
giovannivisentini 9:9f2e2e68d695 332 * @param RFDISPinName Pin used to disable the RF function.
giovannivisentini 0:969a2be49f41 333 */
giovannivisentini 19:0b65a5813059 334 M24SR(const uint8_t address, I2C &I2C,gpoEventCallback eventCallback, const PinName& GPOPinName,
giovannivisentini 27:3881985097bb 335 const PinName& RFDISPinName);
giovannivisentini 0:969a2be49f41 336
giovannivisentini 0:969a2be49f41 337 /**
giovannivisentini 0:969a2be49f41 338 * @brief Destructor.
giovannivisentini 0:969a2be49f41 339 */
giovannivisentini 27:3881985097bb 340 virtual ~M24SR(void);
giovannivisentini 0:969a2be49f41 341
giovannivisentini 0:969a2be49f41 342 /*** Public Component Related Methods ***/
giovannivisentini 7:19fc04b8fec6 343
giovannivisentini 7:19fc04b8fec6 344 /**
giovannivisentini 9:9f2e2e68d695 345 * @brief This function initializes the M24SR device.
giovannivisentini 9:9f2e2e68d695 346 * @param ptr Configure parameters, not used.
giovannivisentini 27:3881985097bb 347 * @return M24SR_SUCCESS if no errors
giovannivisentini 7:19fc04b8fec6 348 */
giovannivisentini 0:969a2be49f41 349 virtual int Init(void *ptr) {
giovannivisentini 27:3881985097bb 350 return (StatusTypeDef) M24SR_Init((M24SR_InitTypeDef*)ptr);
giovannivisentini 0:969a2be49f41 351 }
giovannivisentini 0:969a2be49f41 352
giovannivisentini 0:969a2be49f41 353 virtual int ReadID(uint8_t *id) {
giovannivisentini 27:3881985097bb 354 return (StatusTypeDef) M24SR_ReadID((uint8_t *) id);
giovannivisentini 0:969a2be49f41 355 }
giovannivisentini 0:969a2be49f41 356
giovannivisentini 0:969a2be49f41 357 /** lock the tag channel */
giovannivisentini 27:3881985097bb 358 virtual StatusTypeDef GetSession(void) {
giovannivisentini 27:3881985097bb 359 return (StatusTypeDef) M24SR_GetSession();
giovannivisentini 0:969a2be49f41 360 }
giovannivisentini 0:969a2be49f41 361
giovannivisentini 27:3881985097bb 362 /**
giovannivisentini 27:3881985097bb 363 * Force to open an I2C connection , abort the RF connection.
giovannivisentini 27:3881985097bb 364 * @return M24SR_SUCCESS if the session is acquired
giovannivisentini 27:3881985097bb 365 */
giovannivisentini 27:3881985097bb 366 StatusTypeDef ForceGetSession(void) {
giovannivisentini 27:3881985097bb 367 return (StatusTypeDef) M24SR_ForceSession();
giovannivisentini 0:969a2be49f41 368 }
giovannivisentini 0:969a2be49f41 369
giovannivisentini 27:3881985097bb 370 virtual StatusTypeDef Deselect(void) {
giovannivisentini 27:3881985097bb 371 return (StatusTypeDef) M24SR_Deselect();
giovannivisentini 0:969a2be49f41 372 }
giovannivisentini 0:969a2be49f41 373
giovannivisentini 7:19fc04b8fec6 374 ////////// tag4 command ////////////////////
giovannivisentini 7:19fc04b8fec6 375
giovannivisentini 27:3881985097bb 376 /**
giovannivisentini 27:3881985097bb 377 * Select the application file.
giovannivisentini 27:3881985097bb 378 * @return M24SR_SUCCESS if the application is selected
giovannivisentini 27:3881985097bb 379 */
giovannivisentini 27:3881985097bb 380 StatusTypeDef SelectApplication(void) {
giovannivisentini 19:0b65a5813059 381 return M24SR_SendSelectApplication();
giovannivisentini 0:969a2be49f41 382 }
giovannivisentini 0:969a2be49f41 383
giovannivisentini 27:3881985097bb 384 /**
giovannivisentini 27:3881985097bb 385 * Select the CC file.
giovannivisentini 27:3881985097bb 386 * @return M24SR_SUCCESS if the CC file is selected.
giovannivisentini 27:3881985097bb 387 */
giovannivisentini 27:3881985097bb 388 StatusTypeDef SelectCCfile(void) {
giovannivisentini 19:0b65a5813059 389 return M24SR_SendSelectCCfile();
giovannivisentini 0:969a2be49f41 390 }
giovannivisentini 0:969a2be49f41 391
giovannivisentini 27:3881985097bb 392 /**
giovannivisentini 27:3881985097bb 393 * Select the NDEF file.
giovannivisentini 27:3881985097bb 394 * @param NDEFfileId File id to open.
giovannivisentini 27:3881985097bb 395 * @return M24SR_SUCCESS if the file is selected
giovannivisentini 27:3881985097bb 396 */
giovannivisentini 27:3881985097bb 397 StatusTypeDef SelectNDEFfile(uint16_t NDEFfileId) {
giovannivisentini 19:0b65a5813059 398 return M24SR_SendSelectNDEFfile(NDEFfileId);
giovannivisentini 0:969a2be49f41 399 }
giovannivisentini 0:969a2be49f41 400
giovannivisentini 27:3881985097bb 401 /**
giovannivisentini 27:3881985097bb 402 * Select the system file.
giovannivisentini 27:3881985097bb 403 * @return M24SR_SUCCESS if the system file is selected
giovannivisentini 27:3881985097bb 404 */
giovannivisentini 27:3881985097bb 405 StatusTypeDef SelectSystemfile(void) {
giovannivisentini 19:0b65a5813059 406 return M24SR_SendSelectSystemfile();
giovannivisentini 0:969a2be49f41 407 }
giovannivisentini 0:969a2be49f41 408
giovannivisentini 27:3881985097bb 409 virtual int ReadBinary(uint16_t Offset, uint8_t NbByteToRead,
giovannivisentini 0:969a2be49f41 410 uint8_t *pBufferRead) {
giovannivisentini 27:3881985097bb 411 return (StatusTypeDef) M24SR_SendReadBinary((uint16_t) Offset,
giovannivisentini 0:969a2be49f41 412 (uint8_t) NbByteToRead, (uint8_t *) pBufferRead);
giovannivisentini 0:969a2be49f41 413 }
giovannivisentini 0:969a2be49f41 414
giovannivisentini 27:3881985097bb 415 virtual int UpdateBinary(uint16_t Offset,
giovannivisentini 19:0b65a5813059 416 uint8_t NbByteToWrite,uint8_t *pDataToWrite) {
giovannivisentini 27:3881985097bb 417 return (StatusTypeDef) M24SR_SendUpdateBinary((uint16_t) Offset,
giovannivisentini 0:969a2be49f41 418 (uint8_t) NbByteToWrite, (uint8_t *) pDataToWrite);
giovannivisentini 0:969a2be49f41 419 }
giovannivisentini 0:969a2be49f41 420
giovannivisentini 7:19fc04b8fec6 421 /////////////////// iso 7816-4 commands //////////////////////////
giovannivisentini 7:19fc04b8fec6 422
giovannivisentini 27:3881985097bb 423 virtual StatusTypeDef Verify(PasswordType_t pwdId, uint8_t NbPwdByte,
giovannivisentini 0:969a2be49f41 424 const uint8_t *pPwd) {
giovannivisentini 27:3881985097bb 425 return (StatusTypeDef) M24SR_SendVerify(passwordTypeToConst(pwdId),
giovannivisentini 0:969a2be49f41 426 (uint8_t) NbPwdByte, pPwd);
giovannivisentini 0:969a2be49f41 427 }
giovannivisentini 0:969a2be49f41 428
giovannivisentini 27:3881985097bb 429 virtual StatusTypeDef ChangeReferenceData(PasswordType_t pwdId,
giovannivisentini 0:969a2be49f41 430 const uint8_t *pPwd) {
giovannivisentini 27:3881985097bb 431 return (StatusTypeDef) M24SR_SendChangeReferenceData(passwordTypeToConst(pwdId),
giovannivisentini 0:969a2be49f41 432 (uint8_t *) pPwd);
giovannivisentini 0:969a2be49f41 433 }
giovannivisentini 0:969a2be49f41 434
giovannivisentini 27:3881985097bb 435 virtual StatusTypeDef EnableVerificationRequirement(
giovannivisentini 0:969a2be49f41 436 PasswordType_t uReadOrWrite) {
giovannivisentini 27:3881985097bb 437 return (StatusTypeDef) M24SR_SendEnableVerificationRequirement(
giovannivisentini 12:d1f5eaa85deb 438 passwordTypeToConst(uReadOrWrite));
giovannivisentini 0:969a2be49f41 439 }
giovannivisentini 0:969a2be49f41 440
giovannivisentini 27:3881985097bb 441 virtual StatusTypeDef DisableVerificationRequirement(
giovannivisentini 0:969a2be49f41 442 PasswordType_t uReadOrWrite) {
giovannivisentini 27:3881985097bb 443 return (StatusTypeDef) M24SR_SendDisableVerificationRequirement(
giovannivisentini 12:d1f5eaa85deb 444 passwordTypeToConst(uReadOrWrite));
giovannivisentini 0:969a2be49f41 445 }
giovannivisentini 0:969a2be49f41 446
giovannivisentini 7:19fc04b8fec6 447 ////////////////////// ST proprietary //////////////////////////////////
giovannivisentini 9:9f2e2e68d695 448
giovannivisentini 27:3881985097bb 449 /**
giovannivisentini 27:3881985097bb 450 * Same as {@link NFC#ReadBinary}, however permitting to read more bytes than available.
giovannivisentini 27:3881985097bb 451 * @param Offset read offset.
giovannivisentini 27:3881985097bb 452 * @param NbByteToRead Number of bytes to read.
giovannivisentini 27:3881985097bb 453 * @param[out] pBufferRead Buffer to store the read data into.
giovannivisentini 27:3881985097bb 454 * @return M24SR_SUCCESS if no errors
giovannivisentini 27:3881985097bb 455 */
giovannivisentini 27:3881985097bb 456 StatusTypeDef STReadBinary(uint16_t Offset,
giovannivisentini 0:969a2be49f41 457 uint8_t NbByteToRead, uint8_t *pBufferRead) {
giovannivisentini 27:3881985097bb 458 return (StatusTypeDef) M24SR_SendSTReadBinary((uint16_t) Offset,
giovannivisentini 0:969a2be49f41 459 (uint8_t) NbByteToRead, (uint8_t *) pBufferRead);
giovannivisentini 0:969a2be49f41 460 }
giovannivisentini 0:969a2be49f41 461
giovannivisentini 27:3881985097bb 462 virtual StatusTypeDef EnablePermanentState(PasswordType_t uReadOrWrite) {
giovannivisentini 27:3881985097bb 463 return (StatusTypeDef) M24SR_SendEnablePermanentState(
giovannivisentini 12:d1f5eaa85deb 464 passwordTypeToConst(uReadOrWrite));
giovannivisentini 0:969a2be49f41 465 }
giovannivisentini 0:969a2be49f41 466
giovannivisentini 27:3881985097bb 467 virtual StatusTypeDef DisablePermanentState(PasswordType_t uReadOrWrite) {
giovannivisentini 27:3881985097bb 468 return (StatusTypeDef) M24SR_SendDisablePermanentState(
giovannivisentini 12:d1f5eaa85deb 469 passwordTypeToConst(uReadOrWrite));
giovannivisentini 0:969a2be49f41 470 }
giovannivisentini 0:969a2be49f41 471
giovannivisentini 7:19fc04b8fec6 472 ///////////////////// chip configuration /////////////////////////////////
giovannivisentini 27:3881985097bb 473 /**
giovannivisentini 27:3881985097bb 474 * Set the gpo output pin.
giovannivisentini 27:3881985097bb 475 * @param uSetOrReset New pin status.
giovannivisentini 27:3881985097bb 476 * @return M24SR_SUCCESS if no errors
giovannivisentini 27:3881985097bb 477 */
giovannivisentini 27:3881985097bb 478 StatusTypeDef StateControl(uint8_t uSetOrReset) {
giovannivisentini 27:3881985097bb 479 return (StatusTypeDef) M24SR_StateControl((uint8_t) uSetOrReset);
giovannivisentini 0:969a2be49f41 480 }
giovannivisentini 0:969a2be49f41 481
giovannivisentini 27:3881985097bb 482 /**
giovannivisentini 27:3881985097bb 483 * @brief This function configures GPO for I2C session.
giovannivisentini 27:3881985097bb 484 * @param GPO_I2Cconfig GPO configuration to set.
giovannivisentini 27:3881985097bb 485 * @return M24SR_SUCCESS if no errors
giovannivisentini 27:3881985097bb 486 * @par if the configuration is I2C_ANSWER_READY, the component will start to work
giovannivisentini 27:3881985097bb 487 * in async mode.
giovannivisentini 27:3881985097bb 488 */
giovannivisentini 27:3881985097bb 489 StatusTypeDef ManageI2CGPO(NFC_GPO_MGMT GPO_I2Cconfig) {
giovannivisentini 27:3881985097bb 490 return (StatusTypeDef) M24SR_ManageI2CGPO(GPO_I2Cconfig);
giovannivisentini 0:969a2be49f41 491 }
giovannivisentini 0:969a2be49f41 492
giovannivisentini 27:3881985097bb 493
giovannivisentini 27:3881985097bb 494 /**
giovannivisentini 27:3881985097bb 495 * @brief This function configures GPO for RF session.
giovannivisentini 27:3881985097bb 496 * @param GPO_RFconfig GPO configuration to set.
giovannivisentini 27:3881985097bb 497 * @return M24SR_SUCCESS if no errors
giovannivisentini 27:3881985097bb 498 */
giovannivisentini 27:3881985097bb 499 StatusTypeDef ManageRFGPO(uint8_t GPO_RFconfig) {
giovannivisentini 27:3881985097bb 500 return (StatusTypeDef) M24SR_ManageRFGPO(
giovannivisentini 19:0b65a5813059 501 (NFC_GPO_MGMT) GPO_RFconfig);
giovannivisentini 0:969a2be49f41 502 }
giovannivisentini 0:969a2be49f41 503
giovannivisentini 27:3881985097bb 504
giovannivisentini 27:3881985097bb 505 /**
giovannivisentini 27:3881985097bb 506 * @brief This function enables or disables the RF communication.
giovannivisentini 27:3881985097bb 507 * @param OnOffChoice GPO configuration to set.
giovannivisentini 27:3881985097bb 508 * @return M24SR_SUCCESS if no errors
giovannivisentini 27:3881985097bb 509 */
giovannivisentini 27:3881985097bb 510
giovannivisentini 27:3881985097bb 511 StatusTypeDef RFConfig(uint8_t OnOffChoice) {
giovannivisentini 27:3881985097bb 512 return (StatusTypeDef) M24SR_RFConfig((uint8_t) OnOffChoice);
giovannivisentini 27:3881985097bb 513 }
giovannivisentini 27:3881985097bb 514
giovannivisentini 27:3881985097bb 515
giovannivisentini 27:3881985097bb 516 /**
giovannivisentini 27:3881985097bb 517 * Generates a negative pulse on the GPO pin.
giovannivisentini 27:3881985097bb 518 * Pulse starts immediately after the command is issued and ends at the end of the RF response.
giovannivisentini 27:3881985097bb 519 * @return M24SR_SUCCESS if no errors
giovannivisentini 27:3881985097bb 520 */
giovannivisentini 27:3881985097bb 521 StatusTypeDef SendInterrupt(void) {
giovannivisentini 27:3881985097bb 522 return (StatusTypeDef) M24SR_SendInterrupt();
giovannivisentini 27:3881985097bb 523 }
giovannivisentini 27:3881985097bb 524
giovannivisentini 27:3881985097bb 525
giovannivisentini 27:3881985097bb 526 /**
giovannivisentini 27:3881985097bb 527 * Function to call when the component fire an interrupt.
giovannivisentini 27:3881985097bb 528 * @return last operation status
giovannivisentini 27:3881985097bb 529 */
giovannivisentini 27:3881985097bb 530 StatusTypeDef ManageEvent();
giovannivisentini 27:3881985097bb 531
giovannivisentini 27:3881985097bb 532 /**
giovannivisentini 27:3881985097bb 533 * Change the function to call when a command ends.
giovannivisentini 27:3881985097bb 534 * @param commandCallback Object containing the callback, if NULL it will use empty callback
giovannivisentini 27:3881985097bb 535 */
giovannivisentini 27:3881985097bb 536 void SetCallback(Callbacks *commandCallback){
giovannivisentini 27:3881985097bb 537 if(commandCallback!=NULL)
giovannivisentini 27:3881985097bb 538 mCallback = commandCallback;
giovannivisentini 27:3881985097bb 539 else
giovannivisentini 27:3881985097bb 540 mCallback = &defaultCallback;
giovannivisentini 0:969a2be49f41 541 }
giovannivisentini 0:969a2be49f41 542
giovannivisentini 19:0b65a5813059 543
giovannivisentini 27:3881985097bb 544 /////////////////// hight level/utility function /////////////////////
giovannivisentini 27:3881985097bb 545
giovannivisentini 27:3881985097bb 546
giovannivisentini 27:3881985097bb 547 /**
giovannivisentini 27:3881985097bb 548 * Enable the request of a password before reading the tag.
giovannivisentini 27:3881985097bb 549 * @param pCurrentWritePassword Current password
giovannivisentini 27:3881985097bb 550 * @param pNewPassword Password to request before reading the tag.
giovannivisentini 27:3881985097bb 551 * @return return M24SR_SUCCESS if no errors
giovannivisentini 27:3881985097bb 552 * @par The password must have a length of 16 chars.
giovannivisentini 27:3881985097bb 553 */
giovannivisentini 27:3881985097bb 554 StatusTypeDef EnableReadPassword(const uint8_t* pCurrentWritePassword,
giovannivisentini 27:3881985097bb 555 const uint8_t* pNewPassword) {
giovannivisentini 27:3881985097bb 556
giovannivisentini 27:3881985097bb 557 //enable the callback for change the gpo
giovannivisentini 27:3881985097bb 558 mComponentCallback = &mChangePasswordRequestStatusCallback;
giovannivisentini 27:3881985097bb 559 mChangePasswordRequestStatusCallback.setTask(ReadPwd,pNewPassword);
giovannivisentini 27:3881985097bb 560
giovannivisentini 27:3881985097bb 561 return Verify(M24SR::WritePwd, 0x10, pCurrentWritePassword);
giovannivisentini 27:3881985097bb 562 }
giovannivisentini 27:3881985097bb 563
giovannivisentini 27:3881985097bb 564 /**
giovannivisentini 27:3881985097bb 565 * Disable the request of a password before reading the tag.
giovannivisentini 27:3881985097bb 566 * @param pCurrentWritePassword Current password
giovannivisentini 27:3881985097bb 567 * @return return M24SR_SUCCESS if no errors
giovannivisentini 27:3881985097bb 568 * @par The password must have a length of 16 chars.
giovannivisentini 27:3881985097bb 569 */
giovannivisentini 27:3881985097bb 570 StatusTypeDef DisableReadPassword(const uint8_t* pCurrentWritePassword) {
giovannivisentini 27:3881985097bb 571 mComponentCallback = &mChangePasswordRequestStatusCallback;
giovannivisentini 27:3881985097bb 572 mChangePasswordRequestStatusCallback.setTask(ReadPwd,NULL);
giovannivisentini 27:3881985097bb 573
giovannivisentini 27:3881985097bb 574 return Verify(M24SR::WritePwd, 0x10, pCurrentWritePassword);
giovannivisentini 27:3881985097bb 575 }
giovannivisentini 27:3881985097bb 576
giovannivisentini 27:3881985097bb 577 /**
giovannivisentini 27:3881985097bb 578 * Enable the request of a password before writing to the tag.
giovannivisentini 27:3881985097bb 579 * @param pCurrentWritePassword Current password
giovannivisentini 27:3881985097bb 580 * @param pNewPassword Password to request before reading the tag.
giovannivisentini 27:3881985097bb 581 * @return return M24SR_SUCCESS if no errors
giovannivisentini 27:3881985097bb 582 * @par The password must have a length of 16 chars.
giovannivisentini 27:3881985097bb 583 */
giovannivisentini 27:3881985097bb 584 StatusTypeDef EnableWritePassword(const uint8_t* pCurrentWritePassword,
giovannivisentini 27:3881985097bb 585 uint8_t* pNewPassword) {
giovannivisentini 27:3881985097bb 586 //enable the callback for change the gpo
giovannivisentini 27:3881985097bb 587 mComponentCallback = &mChangePasswordRequestStatusCallback;
giovannivisentini 27:3881985097bb 588 mChangePasswordRequestStatusCallback.setTask(WritePwd,pNewPassword);
giovannivisentini 27:3881985097bb 589
giovannivisentini 27:3881985097bb 590 return Verify(M24SR::WritePwd, 0x10, pCurrentWritePassword);
giovannivisentini 27:3881985097bb 591 }
giovannivisentini 27:3881985097bb 592
giovannivisentini 27:3881985097bb 593 /**
giovannivisentini 27:3881985097bb 594 * Disable the request of a password before writing the tag.
giovannivisentini 27:3881985097bb 595 * @param pCurrentWritePassword Current password.
giovannivisentini 27:3881985097bb 596 * @return return M24SR_SUCCESS if no errors
giovannivisentini 27:3881985097bb 597 * @par The password must have a length of 16 chars.
giovannivisentini 27:3881985097bb 598 */
giovannivisentini 27:3881985097bb 599 StatusTypeDef DisableWritePassword(const uint8_t* pCurrentWritePassword) {
giovannivisentini 27:3881985097bb 600 mComponentCallback = &mChangePasswordRequestStatusCallback;
giovannivisentini 27:3881985097bb 601 mChangePasswordRequestStatusCallback.setTask(WritePwd,NULL);
giovannivisentini 27:3881985097bb 602
giovannivisentini 27:3881985097bb 603 return Verify(M24SR::WritePwd, 0x10, pCurrentWritePassword);
giovannivisentini 0:969a2be49f41 604 }
giovannivisentini 0:969a2be49f41 605
giovannivisentini 27:3881985097bb 606 /**
giovannivisentini 27:3881985097bb 607 * @brief This function disables both read and write passwords.
giovannivisentini 27:3881985097bb 608 * @param pSuperUserPassword I2C super user password.
giovannivisentini 27:3881985097bb 609 * @return return M24SR_SUCCESS if no errors
giovannivisentini 27:3881985097bb 610 * @par The password must have a length of 16 chars.
giovannivisentini 27:3881985097bb 611 */
giovannivisentini 27:3881985097bb 612 StatusTypeDef DisableAllPassword(const uint8_t* pSuperUserPassword){
giovannivisentini 27:3881985097bb 613 mComponentCallback = &mRemoveAllPasswordCallback;
giovannivisentini 27:3881985097bb 614 return Verify(M24SR::I2CPwd, 0x10, pSuperUserPassword);
giovannivisentini 27:3881985097bb 615 }
giovannivisentini 27:3881985097bb 616
giovannivisentini 27:3881985097bb 617 /**
giovannivisentini 27:3881985097bb 618 * @brief This function enables read only mode.
giovannivisentini 27:3881985097bb 619 * @param pCurrentWritePassword Write password is needed to enable read only mode.
giovannivisentini 27:3881985097bb 620 * @return return M24SR_SUCCESS if no errors
giovannivisentini 27:3881985097bb 621 * @par The password must have a length of 16 chars.
giovannivisentini 27:3881985097bb 622 */
giovannivisentini 27:3881985097bb 623 StatusTypeDef EnableReadOnly(const uint8_t* pCurrentWritePassword){
giovannivisentini 27:3881985097bb 624
giovannivisentini 27:3881985097bb 625 mComponentCallback = &mChangeAccessStateCallback;
giovannivisentini 27:3881985097bb 626 //disable write = read only
giovannivisentini 27:3881985097bb 627 mChangeAccessStateCallback.changeAccessState(ChangeAccessStateCallback::WRITE,false);
giovannivisentini 27:3881985097bb 628
giovannivisentini 27:3881985097bb 629 return Verify(M24SR::WritePwd, 0x10, pCurrentWritePassword);
giovannivisentini 27:3881985097bb 630 }
giovannivisentini 21:ccc4f3fed4b3 631
giovannivisentini 27:3881985097bb 632 /**
giovannivisentini 27:3881985097bb 633 * @brief This function disables read only mode.
giovannivisentini 27:3881985097bb 634 * @param pCurrentWritePassword Write password is needed to disable read only mode.
giovannivisentini 27:3881985097bb 635 * @return return M24SR_SUCCESS if no errors
giovannivisentini 27:3881985097bb 636 * @par The password must have a length of 16 chars.
giovannivisentini 27:3881985097bb 637 */
giovannivisentini 27:3881985097bb 638 StatusTypeDef DisableReadOnly(const uint8_t* pCurrentWritePassword) {
giovannivisentini 27:3881985097bb 639 mComponentCallback = &mChangeAccessStateCallback;
giovannivisentini 27:3881985097bb 640 mChangeAccessStateCallback.changeAccessState(ChangeAccessStateCallback::WRITE,true);
giovannivisentini 27:3881985097bb 641 return Verify(M24SR::I2CPwd, 0x10,pCurrentWritePassword);
giovannivisentini 27:3881985097bb 642 }
giovannivisentini 27:3881985097bb 643
giovannivisentini 27:3881985097bb 644
giovannivisentini 27:3881985097bb 645 /**
giovannivisentini 27:3881985097bb 646 * @brief This function enables write only mode.
giovannivisentini 27:3881985097bb 647 * @param pCurrentWritePassword Write password is needed to enable write only mode.
giovannivisentini 27:3881985097bb 648 * @return return M24SR_SUCCESS if no errors
giovannivisentini 27:3881985097bb 649 * @par The password must have a length of 16 chars.
giovannivisentini 27:3881985097bb 650 */
giovannivisentini 27:3881985097bb 651 StatusTypeDef EnableWriteOnly(const uint8_t* pCurrentWritePassword) {
giovannivisentini 27:3881985097bb 652
giovannivisentini 27:3881985097bb 653 mComponentCallback = &mChangeAccessStateCallback;
giovannivisentini 27:3881985097bb 654 //disable read = enable write only
giovannivisentini 27:3881985097bb 655 mChangeAccessStateCallback.changeAccessState(ChangeAccessStateCallback::READ,false);
giovannivisentini 27:3881985097bb 656
giovannivisentini 27:3881985097bb 657 return Verify(M24SR::WritePwd, 0x10, pCurrentWritePassword);
giovannivisentini 27:3881985097bb 658
giovannivisentini 27:3881985097bb 659 }
giovannivisentini 27:3881985097bb 660
giovannivisentini 27:3881985097bb 661 /**
giovannivisentini 27:3881985097bb 662 * @brief This function disables write only mode.
giovannivisentini 27:3881985097bb 663 * @param pCurrentWritePassword Write password is needed to disable write only mode.
giovannivisentini 27:3881985097bb 664 * @return return M24SR_SUCCESS if no errors
giovannivisentini 27:3881985097bb 665 * @par The password must have a length of 16 chars.
giovannivisentini 27:3881985097bb 666 */
giovannivisentini 27:3881985097bb 667 StatusTypeDef DisableWriteOnly(const uint8_t* pCurrentWritePassword) {
giovannivisentini 27:3881985097bb 668 mComponentCallback = &mChangeAccessStateCallback;
giovannivisentini 27:3881985097bb 669 mChangeAccessStateCallback.changeAccessState(ChangeAccessStateCallback::READ,true);
giovannivisentini 27:3881985097bb 670 return Verify(M24SR::I2CPwd, 0x10, pCurrentWritePassword);
giovannivisentini 27:3881985097bb 671 }
giovannivisentini 27:3881985097bb 672
giovannivisentini 6:96389fb79676 673
giovannivisentini 7:19fc04b8fec6 674 /**
giovannivisentini 9:9f2e2e68d695 675 * Get an implementation of NDefNfcTag to use the library NDefLib.
giovannivisentini 9:9f2e2e68d695 676 * @return an object of type NdefNfcTag
giovannivisentini 7:19fc04b8fec6 677 */
giovannivisentini 27:3881985097bb 678 NDefLib::NDefNfcTag& getNDefTag();
giovannivisentini 6:96389fb79676 679
giovannivisentini 6:96389fb79676 680
giovannivisentini 0:969a2be49f41 681 protected:
giovannivisentini 0:969a2be49f41 682
giovannivisentini 0:969a2be49f41 683 /*** Protected Component Related Methods ***/
giovannivisentini 0:969a2be49f41 684
giovannivisentini 27:3881985097bb 685 StatusTypeDef M24SR_Init(M24SR_InitTypeDef *);
giovannivisentini 27:3881985097bb 686 StatusTypeDef M24SR_ReadID(uint8_t *nfc_id);
giovannivisentini 27:3881985097bb 687 StatusTypeDef M24SR_GetSession(void);
giovannivisentini 27:3881985097bb 688 StatusTypeDef M24SR_ForceSession(void);
giovannivisentini 23:d07138541feb 689
giovannivisentini 23:d07138541feb 690
giovannivisentini 19:0b65a5813059 691
giovannivisentini 27:3881985097bb 692 StatusTypeDef M24SR_Deselect(void);
giovannivisentini 27:3881985097bb 693 StatusTypeDef M24SR_ReceiveDeselect(void);
giovannivisentini 19:0b65a5813059 694
giovannivisentini 27:3881985097bb 695 StatusTypeDef M24SR_SendSelectApplication(void);
giovannivisentini 27:3881985097bb 696 StatusTypeDef M24SR_ReceiveSelectApplication(void);
giovannivisentini 19:0b65a5813059 697
giovannivisentini 27:3881985097bb 698 StatusTypeDef M24SR_SendSelectCCfile(void);
giovannivisentini 27:3881985097bb 699 StatusTypeDef M24SR_ReceiveSelectCCfile(void);
giovannivisentini 19:0b65a5813059 700
giovannivisentini 27:3881985097bb 701 StatusTypeDef M24SR_SendSelectNDEFfile(uint16_t NDEFfileId);
giovannivisentini 27:3881985097bb 702 StatusTypeDef M24SR_ReceiveSelectNDEFfile();
giovannivisentini 19:0b65a5813059 703
giovannivisentini 27:3881985097bb 704 StatusTypeDef M24SR_SendSelectSystemfile(void);
giovannivisentini 27:3881985097bb 705 StatusTypeDef M24SR_ReceiveSelectSystemfile(void);
giovannivisentini 19:0b65a5813059 706
giovannivisentini 27:3881985097bb 707 StatusTypeDef M24SR_SendReadBinary(uint16_t Offset, uint8_t NbByteToRead,
giovannivisentini 0:969a2be49f41 708 uint8_t *pBufferRead);
giovannivisentini 27:3881985097bb 709 StatusTypeDef M24SR_SendSTReadBinary(uint16_t Offset, uint8_t NbByteToRead,
giovannivisentini 19:0b65a5813059 710 uint8_t *pBufferRead);
giovannivisentini 27:3881985097bb 711 StatusTypeDef M24SR_ReceiveReadBinary(void);
giovannivisentini 19:0b65a5813059 712
giovannivisentini 27:3881985097bb 713 StatusTypeDef M24SR_SendUpdateBinary(uint16_t Offset, uint8_t NbByteToWrite,
giovannivisentini 0:969a2be49f41 714 uint8_t *pDataToWrite);
giovannivisentini 27:3881985097bb 715 StatusTypeDef M24SR_ReceiveUpdateBinary();
giovannivisentini 19:0b65a5813059 716
giovannivisentini 27:3881985097bb 717 StatusTypeDef M24SR_SendVerify(uint16_t uPwdId, uint8_t NbPwdByte,
giovannivisentini 0:969a2be49f41 718 const uint8_t *pPwd);
giovannivisentini 27:3881985097bb 719 StatusTypeDef M24SR_ReceiveVerify();
giovannivisentini 19:0b65a5813059 720
giovannivisentini 27:3881985097bb 721 StatusTypeDef M24SR_SendChangeReferenceData(uint16_t uPwdId, uint8_t *pPwd);
giovannivisentini 27:3881985097bb 722 StatusTypeDef M24SR_ReceiveChangeReferenceData();
giovannivisentini 19:0b65a5813059 723
giovannivisentini 27:3881985097bb 724 StatusTypeDef M24SR_SendEnableVerificationRequirement(
giovannivisentini 0:969a2be49f41 725 uint16_t uReadOrWrite);
giovannivisentini 27:3881985097bb 726 StatusTypeDef M24SR_ReceiveEnableVerificationRequirement();
giovannivisentini 19:0b65a5813059 727
giovannivisentini 27:3881985097bb 728 StatusTypeDef M24SR_SendDisableVerificationRequirement(
giovannivisentini 0:969a2be49f41 729 uint16_t uReadOrWrite);
giovannivisentini 27:3881985097bb 730 StatusTypeDef M24SR_ReceiveDisableVerificationRequirement();
giovannivisentini 19:0b65a5813059 731
giovannivisentini 27:3881985097bb 732 StatusTypeDef M24SR_SendEnablePermanentState(uint16_t uReadOrWrite);
giovannivisentini 27:3881985097bb 733 StatusTypeDef M24SR_ReceiveEnablePermanentState();
giovannivisentini 19:0b65a5813059 734
giovannivisentini 27:3881985097bb 735 StatusTypeDef M24SR_SendDisablePermanentState(uint16_t uReadOrWrite);
giovannivisentini 27:3881985097bb 736 StatusTypeDef M24SR_ReceiveDisablePermanentState();
giovannivisentini 19:0b65a5813059 737
giovannivisentini 27:3881985097bb 738 StatusTypeDef M24SR_SendInterrupt(void);
giovannivisentini 27:3881985097bb 739 StatusTypeDef M24SR_StateControl(uint8_t uSetOrReset);
giovannivisentini 19:0b65a5813059 740
giovannivisentini 27:3881985097bb 741 StatusTypeDef M24SR_ManageI2CGPO(NFC_GPO_MGMT GPO_I2Cconfig);
giovannivisentini 27:3881985097bb 742 StatusTypeDef M24SR_ManageRFGPO(NFC_GPO_MGMT GPO_RFconfig);
giovannivisentini 0:969a2be49f41 743
giovannivisentini 27:3881985097bb 744 StatusTypeDef M24SR_RFConfig(uint8_t OnOffChoice);
giovannivisentini 27:3881985097bb 745 StatusTypeDef M24SR_SendFWTExtension(uint8_t FWTbyte);
giovannivisentini 19:0b65a5813059 746
giovannivisentini 7:19fc04b8fec6 747
giovannivisentini 7:19fc04b8fec6 748 /**
giovannivisentini 9:9f2e2e68d695 749 * Send a command to the component.
giovannivisentini 19:0b65a5813059 750 * @param NbByte Length of the command.
giovannivisentini 9:9f2e2e68d695 751 * @param pBuffer Buffer containing the command.
giovannivisentini 27:3881985097bb 752 * @return M24SR_SUCCESS if no errors
giovannivisentini 7:19fc04b8fec6 753 */
giovannivisentini 27:3881985097bb 754 StatusTypeDef M24SR_IO_SendI2Ccommand(uint8_t NbByte, uint8_t *pBuffer);
giovannivisentini 7:19fc04b8fec6 755
giovannivisentini 7:19fc04b8fec6 756 /**
giovannivisentini 9:9f2e2e68d695 757 * Read a command response.
giovannivisentini 9:9f2e2e68d695 758 * @param NbByte Number of bytes to read.
giovannivisentini 9:9f2e2e68d695 759 * @param pBuffer Buffer to store the response into.
giovannivisentini 27:3881985097bb 760 * @return M24SR_SUCCESS if no errors
giovannivisentini 7:19fc04b8fec6 761 */
giovannivisentini 27:3881985097bb 762 StatusTypeDef M24SR_IO_ReceiveI2Cresponse(uint8_t NbByte,
giovannivisentini 0:969a2be49f41 763 uint8_t *pBuffer);
giovannivisentini 0:969a2be49f41 764
giovannivisentini 7:19fc04b8fec6 765 /**
giovannivisentini 9:9f2e2e68d695 766 * Do an active polling on the I2C bus until the answer is ready.
giovannivisentini 27:3881985097bb 767 * @return M24SR_SUCCESS if no errors
giovannivisentini 7:19fc04b8fec6 768 */
giovannivisentini 27:3881985097bb 769 StatusTypeDef M24SR_IO_PollI2C(void);
giovannivisentini 0:969a2be49f41 770
giovannivisentini 7:19fc04b8fec6 771 /**
giovannivisentini 9:9f2e2e68d695 772 * Read the gpo pin.
giovannivisentini 9:9f2e2e68d695 773 * @param[out] pPinState Variable to store the pin state into.
giovannivisentini 7:19fc04b8fec6 774 */
giovannivisentini 13:840a9c7f90b9 775 void M24SR_IO_GPO_ReadPin(uint8_t *pPinState) {
giovannivisentini 13:840a9c7f90b9 776 *pPinState= GPOPin.read();
giovannivisentini 0:969a2be49f41 777 }
giovannivisentini 0:969a2be49f41 778
giovannivisentini 7:19fc04b8fec6 779 /**
giovannivisentini 9:9f2e2e68d695 780 * Write the gpo pin.
giovannivisentini 9:9f2e2e68d695 781 * @param pPinState Pin state to write.
giovannivisentini 7:19fc04b8fec6 782 */
giovannivisentini 13:840a9c7f90b9 783 void M24SR_IO_RFDIS_WritePin(uint8_t PinState) {
giovannivisentini 13:840a9c7f90b9 784 if (PinState == 0)
giovannivisentini 0:969a2be49f41 785 RFDisablePin = 0;
giovannivisentini 0:969a2be49f41 786 else
giovannivisentini 0:969a2be49f41 787 RFDisablePin = 1;
giovannivisentini 0:969a2be49f41 788 }
giovannivisentini 0:969a2be49f41 789
giovannivisentini 0:969a2be49f41 790 /*** Component's Instance Variables ***/
giovannivisentini 0:969a2be49f41 791
giovannivisentini 0:969a2be49f41 792 /* Identity */
giovannivisentini 0:969a2be49f41 793 uint8_t who_am_i;
giovannivisentini 0:969a2be49f41 794
giovannivisentini 9:9f2e2e68d695 795 /* Type */
giovannivisentini 0:969a2be49f41 796 uint8_t type;
giovannivisentini 0:969a2be49f41 797
giovannivisentini 0:969a2be49f41 798 /* I2C address */
giovannivisentini 0:969a2be49f41 799 uint8_t address;
giovannivisentini 0:969a2be49f41 800
giovannivisentini 0:969a2be49f41 801 /* IO Device. */
giovannivisentini 9:9f2e2e68d695 802 I2C &dev_I2C;
giovannivisentini 0:969a2be49f41 803
giovannivisentini 0:969a2be49f41 804 /* GPIO */
giovannivisentini 0:969a2be49f41 805 DigitalIn GPOPin;
giovannivisentini 0:969a2be49f41 806
giovannivisentini 0:969a2be49f41 807 /**
giovannivisentini 9:9f2e2e68d695 808 * Pin used to disable the rf chip functionality.
giovannivisentini 0:969a2be49f41 809 */
giovannivisentini 0:969a2be49f41 810 DigitalOut RFDisablePin;
giovannivisentini 0:969a2be49f41 811
giovannivisentini 0:969a2be49f41 812 /**
giovannivisentini 9:9f2e2e68d695 813 * Buffer used to build the command to send to the chip.
giovannivisentini 0:969a2be49f41 814 */
giovannivisentini 9:9f2e2e68d695 815 uint8_t uM24SRbuffer[0xFF];//max command length is 255
giovannivisentini 0:969a2be49f41 816
giovannivisentini 0:969a2be49f41 817 /**
giovannivisentini 0:969a2be49f41 818 * ???
giovannivisentini 0:969a2be49f41 819 */
giovannivisentini 0:969a2be49f41 820 uint8_t uDIDbyte;
giovannivisentini 0:969a2be49f41 821
giovannivisentini 19:0b65a5813059 822
giovannivisentini 19:0b65a5813059 823 /**
giovannivisentini 23:d07138541feb 824 * Command that the component can accept
giovannivisentini 19:0b65a5813059 825 */
giovannivisentini 19:0b65a5813059 826 typedef enum{
giovannivisentini 19:0b65a5813059 827 NONE, //!< NONE
giovannivisentini 19:0b65a5813059 828 DESELECT, //!< DESELECT
giovannivisentini 19:0b65a5813059 829 SELECT_APPLICATION, //!< SELECT_APPLICATION
giovannivisentini 19:0b65a5813059 830 SELECT_CC_FILE, //!< SELECT_CC_FILE
giovannivisentini 19:0b65a5813059 831 SELECT_NDEF_FILE, //!< SELECT_NDEF_FILE
giovannivisentini 19:0b65a5813059 832 SELECT_SYSTEM_FILE, //!< SELECT_SYSTEM_FILE
giovannivisentini 19:0b65a5813059 833 READ, //!< READ
giovannivisentini 19:0b65a5813059 834 UPDATE, //!< UPDATE
giovannivisentini 19:0b65a5813059 835 VERIFY, //!< VERIFY
giovannivisentini 19:0b65a5813059 836 MANAGE_I2C_GPO, //!< MANAGE_I2C_GPO
giovannivisentini 19:0b65a5813059 837 MANAGE_RF_GPO, //!< MANAGE_RF_GPO
giovannivisentini 19:0b65a5813059 838 CHANGE_REFERENCE_DATA, //!< CHANGE_REFERENCE_DATA
giovannivisentini 19:0b65a5813059 839 ENABLE_VERIFICATION_REQUIREMENT, //!< ENABLE_VERIFICATION_REQUIREMENT
giovannivisentini 19:0b65a5813059 840 DISABLE_VERIFICATION_REQUIREMENT,//!< DISABLE_VERIFICATION_REQUIREMENT
giovannivisentini 19:0b65a5813059 841 ENABLE_PERMANET_STATE, //!< ENABLE_PERMANET_STATE
giovannivisentini 19:0b65a5813059 842 DISABLE_PERMANET_STATE, //!< DISABLE_PERMANET_STATE
giovannivisentini 19:0b65a5813059 843 }M24SR_command_t;
giovannivisentini 19:0b65a5813059 844
giovannivisentini 19:0b65a5813059 845 /**
giovannivisentini 24:9f98eafa2d39 846 * User parameter used to invoke a command,
giovannivisentini 24:9f98eafa2d39 847 * it is used to provide the data back with the response
giovannivisentini 19:0b65a5813059 848 */
giovannivisentini 19:0b65a5813059 849 typedef struct{
giovannivisentini 19:0b65a5813059 850 uint8_t *data; //!< data
giovannivisentini 24:9f98eafa2d39 851 uint16_t length; //!< number of bytes in the data array
giovannivisentini 19:0b65a5813059 852 uint16_t offset; //!< offset parameter used in the read/write command
giovannivisentini 19:0b65a5813059 853 }M24SR_command_data_t;
giovannivisentini 19:0b65a5813059 854
giovannivisentini 19:0b65a5813059 855 /**
giovannivisentini 23:d07138541feb 856 * Communication mode used by this device
giovannivisentini 19:0b65a5813059 857 */
giovannivisentini 19:0b65a5813059 858 typedef enum{
giovannivisentini 24:9f98eafa2d39 859 SYNC,//!< SYNC wait the command response before returning
giovannivisentini 24:9f98eafa2d39 860 ASYNC//!< ASYNC use a callback to notify the end of a command
giovannivisentini 19:0b65a5813059 861 }M24SR_communication_t;
giovannivisentini 19:0b65a5813059 862
giovannivisentini 19:0b65a5813059 863 /**
giovannivisentini 24:9f98eafa2d39 864 * Type of communication being used
giovannivisentini 19:0b65a5813059 865 */
giovannivisentini 19:0b65a5813059 866 M24SR_communication_t mCommunicationType;
giovannivisentini 19:0b65a5813059 867
giovannivisentini 19:0b65a5813059 868 /**
giovannivisentini 24:9f98eafa2d39 869 * Last pending command
giovannivisentini 19:0b65a5813059 870 */
giovannivisentini 19:0b65a5813059 871 M24SR_command_t mLastCommandSend;
giovannivisentini 19:0b65a5813059 872
giovannivisentini 19:0b65a5813059 873 /**
giovannivisentini 24:9f98eafa2d39 874 * Parameter used to invoke the last command
giovannivisentini 19:0b65a5813059 875 */
giovannivisentini 19:0b65a5813059 876 M24SR_command_data_t mLastCommandData;
giovannivisentini 19:0b65a5813059 877
giovannivisentini 23:d07138541feb 878 /**
giovannivisentini 24:9f98eafa2d39 879 * Interrupt object fired when the gpo status changes
giovannivisentini 23:d07138541feb 880 */
giovannivisentini 19:0b65a5813059 881 InterruptIn mGpoEventInterrupt;
giovannivisentini 27:3881985097bb 882
giovannivisentini 27:3881985097bb 883 /** object containing the callbacks to use*/
giovannivisentini 27:3881985097bb 884 Callbacks *mCallback;
giovannivisentini 27:3881985097bb 885
giovannivisentini 27:3881985097bb 886 /**
giovannivisentini 27:3881985097bb 887 * Object with private callbacks used to hide high level commands each
giovannivisentini 27:3881985097bb 888 * calling multiple low level commands. This callbacks object has
giovannivisentini 27:3881985097bb 889 * higher priority comparing to the user callbacks.
giovannivisentini 27:3881985097bb 890 */
giovannivisentini 27:3881985097bb 891 Callbacks *mComponentCallback;
giovannivisentini 27:3881985097bb 892
giovannivisentini 27:3881985097bb 893 /**
giovannivisentini 27:3881985097bb 894 * Object implementing the interface to use the NDefLib.
giovannivisentini 27:3881985097bb 895 */
giovannivisentini 27:3881985097bb 896 NDefNfcTagM24SR *mNDefTagUtil;
giovannivisentini 27:3881985097bb 897
giovannivisentini 27:3881985097bb 898 /**
giovannivisentini 27:3881985097bb 899 * get the callback object to use
giovannivisentini 27:3881985097bb 900 * @return callback object to use
giovannivisentini 27:3881985097bb 901 */
giovannivisentini 27:3881985097bb 902 Callbacks * getCallback(){
giovannivisentini 27:3881985097bb 903 if(mComponentCallback!=NULL)
giovannivisentini 27:3881985097bb 904 return mComponentCallback;
giovannivisentini 27:3881985097bb 905 return mCallback;
giovannivisentini 27:3881985097bb 906 }//getCallback
giovannivisentini 27:3881985097bb 907
giovannivisentini 12:d1f5eaa85deb 908 private:
giovannivisentini 27:3881985097bb 909 /** object containing empty callback to use in the default case*/
giovannivisentini 27:3881985097bb 910 Callbacks defaultCallback;
giovannivisentini 27:3881985097bb 911
giovannivisentini 27:3881985097bb 912
giovannivisentini 27:3881985097bb 913 /**
giovannivisentini 27:3881985097bb 914 * This class permits to enable/disable the password request to read/write into the tag
giovannivisentini 27:3881985097bb 915 * This class is equivalent to calling the methods:
giovannivisentini 27:3881985097bb 916 * To enable the request:
giovannivisentini 27:3881985097bb 917 * <ul>
giovannivisentini 27:3881985097bb 918 * <li> Verify </li>
giovannivisentini 27:3881985097bb 919 * <li> ChangeReferenceData </li>
giovannivisentini 27:3881985097bb 920 * <li> EnablePermanentState </li>
giovannivisentini 27:3881985097bb 921 * </ul>
giovannivisentini 27:3881985097bb 922 * To disable the request:
giovannivisentini 27:3881985097bb 923 * <ul>
giovannivisentini 27:3881985097bb 924 * <li> Verify </li>
giovannivisentini 27:3881985097bb 925 * <li> DisableVerificationRequirement </li>
giovannivisentini 27:3881985097bb 926 * </ul>
giovannivisentini 27:3881985097bb 927 */
giovannivisentini 27:3881985097bb 928 class ChangePasswordRequestStatusCallback : public Callbacks{
giovannivisentini 27:3881985097bb 929
giovannivisentini 27:3881985097bb 930 public:
giovannivisentini 27:3881985097bb 931
giovannivisentini 27:3881985097bb 932 /**
giovannivisentini 27:3881985097bb 933 * Build the chain of callbacks.
giovannivisentini 27:3881985097bb 934 */
giovannivisentini 27:3881985097bb 935 ChangePasswordRequestStatusCallback():
giovannivisentini 27:3881985097bb 936 mNewPwd(NULL),mType(I2CPwd),mEnable(false){}
giovannivisentini 27:3881985097bb 937
giovannivisentini 27:3881985097bb 938 /**
giovannivisentini 27:3881985097bb 939 * Set the password to enable/disable.
giovannivisentini 27:3881985097bb 940 * @param type Type of password to enable/disable.
giovannivisentini 27:3881985097bb 941 * @param newPwd Array of 16bytes with the new password, if null the request will be disabled.
giovannivisentini 27:3881985097bb 942 */
giovannivisentini 27:3881985097bb 943 void setTask(PasswordType_t type, const uint8_t *newPwd){
giovannivisentini 27:3881985097bb 944 mNewPwd=newPwd;
giovannivisentini 27:3881985097bb 945 mType=type;
giovannivisentini 27:3881985097bb 946 mEnable=newPwd!=NULL;
giovannivisentini 27:3881985097bb 947 }//setTask
giovannivisentini 27:3881985097bb 948
giovannivisentini 27:3881985097bb 949 virtual void onVerified(M24SR *nfc, StatusTypeDef status,PasswordType_t ,
giovannivisentini 27:3881985097bb 950 const uint8_t *){
giovannivisentini 27:3881985097bb 951 if(status!=M24SR_SUCCESS)
giovannivisentini 27:3881985097bb 952 return onFinishCommand(nfc,status);
giovannivisentini 27:3881985097bb 953 if(mEnable)
giovannivisentini 27:3881985097bb 954 nfc->ChangeReferenceData(mType,mNewPwd);
giovannivisentini 27:3881985097bb 955 else
giovannivisentini 27:3881985097bb 956 nfc->DisableVerificationRequirement(mType);
giovannivisentini 27:3881985097bb 957 }
giovannivisentini 27:3881985097bb 958
giovannivisentini 27:3881985097bb 959 virtual void onDisableVerificationRequirement(M24SR *nfc,
giovannivisentini 27:3881985097bb 960 StatusTypeDef status, PasswordType_t ){
giovannivisentini 27:3881985097bb 961 onFinishCommand(nfc,status);
giovannivisentini 27:3881985097bb 962 }
giovannivisentini 27:3881985097bb 963
giovannivisentini 27:3881985097bb 964 virtual void onChangeReferenceData(M24SR *nfc, StatusTypeDef status,
giovannivisentini 27:3881985097bb 965 PasswordType_t type,
giovannivisentini 27:3881985097bb 966 uint8_t *){
giovannivisentini 27:3881985097bb 967 if(status==M24SR_SUCCESS)
giovannivisentini 27:3881985097bb 968 nfc->EnablePermanentState(type);
giovannivisentini 27:3881985097bb 969 else
giovannivisentini 27:3881985097bb 970 onFinishCommand(nfc,status);
giovannivisentini 27:3881985097bb 971 }
giovannivisentini 27:3881985097bb 972
giovannivisentini 27:3881985097bb 973 virtual void onEnablePermanentState(M24SR *nfc, StatusTypeDef status,
giovannivisentini 27:3881985097bb 974 PasswordType_t ){
giovannivisentini 27:3881985097bb 975 onFinishCommand(nfc,status);
giovannivisentini 27:3881985097bb 976 }
giovannivisentini 27:3881985097bb 977
giovannivisentini 27:3881985097bb 978
giovannivisentini 27:3881985097bb 979 private:
giovannivisentini 27:3881985097bb 980
giovannivisentini 27:3881985097bb 981 /**
giovannivisentini 27:3881985097bb 982 * Remove the private callbacks and call the user callback.
giovannivisentini 27:3881985097bb 983 * @param nfc Object triggering the command.
giovannivisentini 27:3881985097bb 984 * @param status Command status.
giovannivisentini 27:3881985097bb 985 */
giovannivisentini 27:3881985097bb 986 void onFinishCommand(M24SR *nfc,StatusTypeDef status){
giovannivisentini 27:3881985097bb 987 nfc->mComponentCallback=NULL;
giovannivisentini 27:3881985097bb 988
giovannivisentini 27:3881985097bb 989 if(mEnable){
giovannivisentini 27:3881985097bb 990 if(mType==ReadPwd){
giovannivisentini 27:3881985097bb 991 nfc->getCallback()->onEnableReadPassword(nfc,status,mNewPwd);
giovannivisentini 27:3881985097bb 992 }else
giovannivisentini 27:3881985097bb 993 nfc->getCallback()->onEnableWritePassword(nfc,status,mNewPwd);
giovannivisentini 27:3881985097bb 994 }else{
giovannivisentini 27:3881985097bb 995 if(mType==ReadPwd){
giovannivisentini 27:3881985097bb 996 nfc->getCallback()->onDisableReadPassword(nfc,status);
giovannivisentini 27:3881985097bb 997 }else
giovannivisentini 27:3881985097bb 998 nfc->getCallback()->onDisableWritePassword(nfc,status);
giovannivisentini 27:3881985097bb 999 }//if-else enable
giovannivisentini 27:3881985097bb 1000 }//onFinish
giovannivisentini 27:3881985097bb 1001
giovannivisentini 27:3881985097bb 1002 const uint8_t *mNewPwd;
giovannivisentini 27:3881985097bb 1003 PasswordType_t mType;
giovannivisentini 27:3881985097bb 1004 bool mEnable;
giovannivisentini 27:3881985097bb 1005
giovannivisentini 27:3881985097bb 1006 };
giovannivisentini 27:3881985097bb 1007
giovannivisentini 27:3881985097bb 1008
giovannivisentini 27:3881985097bb 1009 /**
giovannivisentini 27:3881985097bb 1010 * Object containing the callback chain needed to change the password request
giovannivisentini 27:3881985097bb 1011 */
giovannivisentini 27:3881985097bb 1012 ChangePasswordRequestStatusCallback mChangePasswordRequestStatusCallback;
giovannivisentini 27:3881985097bb 1013 friend class ChangePasswordRequestStatusCallback;
giovannivisentini 27:3881985097bb 1014
giovannivisentini 27:3881985097bb 1015 /**
giovannivisentini 27:3881985097bb 1016 * This class permits to disable all the password requests to read/write into the tag
giovannivisentini 27:3881985097bb 1017 * This class is equivalent to calling the methods:
giovannivisentini 27:3881985097bb 1018 * <ul>
giovannivisentini 27:3881985097bb 1019 * <li> Verify(i2c) </li>
giovannivisentini 27:3881985097bb 1020 * <li> DisablePermanentState(Read) </li>
giovannivisentini 27:3881985097bb 1021 * <li> DisablePermanentState(write) </li>
giovannivisentini 27:3881985097bb 1022 * <li> DisableVerificationRequirement(Read) </li>
giovannivisentini 27:3881985097bb 1023 * <li> DisableVerificationRequirement(write) </li>
giovannivisentini 27:3881985097bb 1024 * <li> ChangeReferenceData(Read) </li>
giovannivisentini 27:3881985097bb 1025 * <li> ChangeReferenceData(write) </li>
giovannivisentini 27:3881985097bb 1026 * </ul>
giovannivisentini 27:3881985097bb 1027 */
giovannivisentini 27:3881985097bb 1028 class RemoveAllPasswordCallback : public Callbacks{
giovannivisentini 27:3881985097bb 1029
giovannivisentini 27:3881985097bb 1030 /**
giovannivisentini 27:3881985097bb 1031 * Store the default password used for open a super user session
giovannivisentini 27:3881985097bb 1032 * it will be set as default read/write password
giovannivisentini 27:3881985097bb 1033 */
giovannivisentini 27:3881985097bb 1034 const uint8_t *mI2CPwd;
giovannivisentini 27:3881985097bb 1035
giovannivisentini 27:3881985097bb 1036 public:
giovannivisentini 27:3881985097bb 1037
giovannivisentini 27:3881985097bb 1038 /**
giovannivisentini 27:3881985097bb 1039 * Build the chain of callbacks.
giovannivisentini 27:3881985097bb 1040 */
giovannivisentini 27:3881985097bb 1041 RemoveAllPasswordCallback():mI2CPwd(NULL){}
giovannivisentini 27:3881985097bb 1042
giovannivisentini 27:3881985097bb 1043 virtual void onVerified(M24SR *nfc,StatusTypeDef status,
giovannivisentini 27:3881985097bb 1044 PasswordType_t,const uint8_t* data){
giovannivisentini 27:3881985097bb 1045 if(status!=M24SR_SUCCESS)
giovannivisentini 27:3881985097bb 1046 return onFinishCommand(nfc,status);
giovannivisentini 27:3881985097bb 1047 mI2CPwd = data;
giovannivisentini 27:3881985097bb 1048 nfc->DisablePermanentState(ReadPwd);
giovannivisentini 27:3881985097bb 1049 }
giovannivisentini 27:3881985097bb 1050
giovannivisentini 27:3881985097bb 1051 virtual void onDisablePermanentState(M24SR *nfc , StatusTypeDef status,
giovannivisentini 27:3881985097bb 1052 PasswordType_t type){
giovannivisentini 27:3881985097bb 1053 if(status!=M24SR_SUCCESS)
giovannivisentini 27:3881985097bb 1054 return onFinishCommand(nfc,status);
giovannivisentini 27:3881985097bb 1055 if(type==ReadPwd)
giovannivisentini 27:3881985097bb 1056 nfc->DisablePermanentState(WritePwd);
giovannivisentini 27:3881985097bb 1057 else
giovannivisentini 27:3881985097bb 1058 nfc->DisableVerificationRequirement(ReadPwd);
giovannivisentini 27:3881985097bb 1059 }
giovannivisentini 27:3881985097bb 1060
giovannivisentini 27:3881985097bb 1061 virtual void onDisableVerificationRequirement(M24SR *nfc ,
giovannivisentini 27:3881985097bb 1062 StatusTypeDef status,PasswordType_t type){
giovannivisentini 27:3881985097bb 1063 if(status!=M24SR_SUCCESS)
giovannivisentini 27:3881985097bb 1064 return onFinishCommand(nfc,status);
giovannivisentini 27:3881985097bb 1065 if(type==ReadPwd)
giovannivisentini 27:3881985097bb 1066 nfc->DisableVerificationRequirement(WritePwd);
giovannivisentini 27:3881985097bb 1067 else
giovannivisentini 27:3881985097bb 1068 nfc->ChangeReferenceData(ReadPwd,mI2CPwd);
giovannivisentini 27:3881985097bb 1069 }
giovannivisentini 27:3881985097bb 1070
giovannivisentini 27:3881985097bb 1071 virtual void onChangeReferenceData(M24SR *nfc ,StatusTypeDef status,PasswordType_t type,
giovannivisentini 27:3881985097bb 1072 uint8_t *data){
giovannivisentini 27:3881985097bb 1073 if(status!=M24SR_SUCCESS)
giovannivisentini 27:3881985097bb 1074 return onFinishCommand(nfc,status);
giovannivisentini 27:3881985097bb 1075 if(type==ReadPwd)
giovannivisentini 27:3881985097bb 1076 nfc->ChangeReferenceData(WritePwd,data);
giovannivisentini 27:3881985097bb 1077 else
giovannivisentini 27:3881985097bb 1078 onFinishCommand(nfc,status);
giovannivisentini 27:3881985097bb 1079 }
giovannivisentini 27:3881985097bb 1080
giovannivisentini 27:3881985097bb 1081 private:
giovannivisentini 27:3881985097bb 1082
giovannivisentini 27:3881985097bb 1083 /**
giovannivisentini 27:3881985097bb 1084 * Remove the private callback and call the onDisableAllPassword callback.
giovannivisentini 27:3881985097bb 1085 * @param nfc Object triggering the command.
giovannivisentini 27:3881985097bb 1086 * @param status Command status.
giovannivisentini 27:3881985097bb 1087 */
giovannivisentini 27:3881985097bb 1088 void onFinishCommand(M24SR *nfc,StatusTypeDef status){
giovannivisentini 27:3881985097bb 1089 nfc->mComponentCallback=NULL;
giovannivisentini 27:3881985097bb 1090 mI2CPwd=NULL;
giovannivisentini 27:3881985097bb 1091 nfc->getCallback()->onDisableAllPassword(nfc,status);
giovannivisentini 27:3881985097bb 1092 }//onFinish
giovannivisentini 27:3881985097bb 1093
giovannivisentini 27:3881985097bb 1094 };
giovannivisentini 27:3881985097bb 1095
giovannivisentini 27:3881985097bb 1096
giovannivisentini 27:3881985097bb 1097 /**
giovannivisentini 27:3881985097bb 1098 * Object containing the callback chain needed to remove the password request
giovannivisentini 27:3881985097bb 1099 */
giovannivisentini 27:3881985097bb 1100 RemoveAllPasswordCallback mRemoveAllPasswordCallback;
giovannivisentini 27:3881985097bb 1101 friend class RemoveAllPasswordCallback;
giovannivisentini 27:3881985097bb 1102
giovannivisentini 27:3881985097bb 1103 /**
giovannivisentini 27:3881985097bb 1104 * This class permits to set the tag as read/write only
giovannivisentini 27:3881985097bb 1105 * This class is equivalent to calling the methods:
giovannivisentini 27:3881985097bb 1106 * <ul>
giovannivisentini 27:3881985097bb 1107 * <li> Verify(i2c) </li>
giovannivisentini 27:3881985097bb 1108 * <li> EnablePermanentState(Read/write) </li>
giovannivisentini 27:3881985097bb 1109 * </ul>
giovannivisentini 27:3881985097bb 1110 * or:
giovannivisentini 27:3881985097bb 1111 * <ul>
giovannivisentini 27:3881985097bb 1112 * <li> Verify(i2c) </li>
giovannivisentini 27:3881985097bb 1113 * <li> DisablePermanentState</li>
giovannivisentini 27:3881985097bb 1114 * <li> DisableVerificationRequirement(Read/write) </li>
giovannivisentini 27:3881985097bb 1115 * </ul>
giovannivisentini 27:3881985097bb 1116 */
giovannivisentini 27:3881985097bb 1117 class ChangeAccessStateCallback : public Callbacks{
giovannivisentini 27:3881985097bb 1118
giovannivisentini 27:3881985097bb 1119 public:
giovannivisentini 27:3881985097bb 1120
giovannivisentini 27:3881985097bb 1121 typedef enum{
giovannivisentini 27:3881985097bb 1122 WRITE,
giovannivisentini 27:3881985097bb 1123 READ
giovannivisentini 27:3881985097bb 1124 }AccessType_t;
giovannivisentini 27:3881985097bb 1125
giovannivisentini 27:3881985097bb 1126 /**
giovannivisentini 27:3881985097bb 1127 * Build the chain of callbacks.
giovannivisentini 27:3881985097bb 1128 */
giovannivisentini 27:3881985097bb 1129 ChangeAccessStateCallback():mType(WRITE),mEnable(false){}
giovannivisentini 27:3881985097bb 1130
giovannivisentini 27:3881985097bb 1131 /**
giovannivisentini 27:3881985097bb 1132 * Set the access to enable/disable an access type.
giovannivisentini 27:3881985097bb 1133 * @param type Access type.
giovannivisentini 27:3881985097bb 1134 * @param enable True to enable the state, False to disable it.
giovannivisentini 27:3881985097bb 1135 */
giovannivisentini 27:3881985097bb 1136 void changeAccessState(AccessType_t type,bool enable){
giovannivisentini 27:3881985097bb 1137 mType=type;
giovannivisentini 27:3881985097bb 1138 mEnable=enable;
giovannivisentini 27:3881985097bb 1139 }
giovannivisentini 27:3881985097bb 1140
giovannivisentini 27:3881985097bb 1141 virtual void onVerified(M24SR *nfc,StatusTypeDef status,
giovannivisentini 27:3881985097bb 1142 PasswordType_t,const uint8_t*){
giovannivisentini 27:3881985097bb 1143 if(status!=M24SR_SUCCESS)
giovannivisentini 27:3881985097bb 1144 return onFinishCommand(nfc,status);
giovannivisentini 27:3881985097bb 1145
giovannivisentini 27:3881985097bb 1146 if(mEnable){
giovannivisentini 27:3881985097bb 1147 nfc->DisablePermanentState(mType==WRITE? WritePwd : ReadPwd);
giovannivisentini 27:3881985097bb 1148 }else
giovannivisentini 27:3881985097bb 1149 nfc->EnablePermanentState(mType==WRITE? WritePwd : ReadPwd);
giovannivisentini 27:3881985097bb 1150
giovannivisentini 27:3881985097bb 1151 }
giovannivisentini 27:3881985097bb 1152
giovannivisentini 27:3881985097bb 1153 virtual void onDisablePermanentState(M24SR *nfc, StatusTypeDef status,
giovannivisentini 27:3881985097bb 1154 PasswordType_t type ){
giovannivisentini 27:3881985097bb 1155 if(status!=M24SR_SUCCESS)
giovannivisentini 27:3881985097bb 1156 return onFinishCommand(nfc,status);
giovannivisentini 27:3881985097bb 1157
giovannivisentini 27:3881985097bb 1158 nfc->DisableVerificationRequirement(type);
giovannivisentini 27:3881985097bb 1159 }
giovannivisentini 27:3881985097bb 1160
giovannivisentini 27:3881985097bb 1161 virtual void onDisableVerificationRequirement(M24SR *nfc , StatusTypeDef status,
giovannivisentini 27:3881985097bb 1162 PasswordType_t ){
giovannivisentini 27:3881985097bb 1163 onFinishCommand(nfc,status);
giovannivisentini 27:3881985097bb 1164 }
giovannivisentini 27:3881985097bb 1165
giovannivisentini 27:3881985097bb 1166 virtual void onEnablePermanentState(M24SR *nfc ,StatusTypeDef status,PasswordType_t ){
giovannivisentini 27:3881985097bb 1167 onFinishCommand(nfc,status);
giovannivisentini 27:3881985097bb 1168 }
giovannivisentini 27:3881985097bb 1169
giovannivisentini 27:3881985097bb 1170
giovannivisentini 27:3881985097bb 1171 private:
giovannivisentini 27:3881985097bb 1172
giovannivisentini 27:3881985097bb 1173 /**
giovannivisentini 27:3881985097bb 1174 * Remove the private callback and call the user callback.
giovannivisentini 27:3881985097bb 1175 * @param nfc Object triggering the command.
giovannivisentini 27:3881985097bb 1176 * @param status Command status.
giovannivisentini 27:3881985097bb 1177 */
giovannivisentini 27:3881985097bb 1178 void onFinishCommand(M24SR *nfc,StatusTypeDef status){
giovannivisentini 27:3881985097bb 1179 nfc->mComponentCallback=NULL;
giovannivisentini 27:3881985097bb 1180 if(mEnable){
giovannivisentini 27:3881985097bb 1181 if(mType==READ){
giovannivisentini 27:3881985097bb 1182 //enable read = disable write only
giovannivisentini 27:3881985097bb 1183 nfc->getCallback()->onDisableWriteOnly(nfc,status);
giovannivisentini 27:3881985097bb 1184 }else
giovannivisentini 27:3881985097bb 1185 //enable write = disable read only
giovannivisentini 27:3881985097bb 1186 nfc->getCallback()->onDisableReadOnly(nfc,status);
giovannivisentini 27:3881985097bb 1187 }else{
giovannivisentini 27:3881985097bb 1188 if(mType==WRITE){
giovannivisentini 27:3881985097bb 1189 //disable write = enable read only
giovannivisentini 27:3881985097bb 1190 nfc->getCallback()->onEnableReadOnly(nfc,status);
giovannivisentini 27:3881985097bb 1191 }else{
giovannivisentini 27:3881985097bb 1192 //
giovannivisentini 27:3881985097bb 1193 nfc->getCallback()->onEnableWriteOnly(nfc,status);
giovannivisentini 27:3881985097bb 1194 }
giovannivisentini 27:3881985097bb 1195 }//if-else enable
giovannivisentini 27:3881985097bb 1196 }//onFinish
giovannivisentini 27:3881985097bb 1197
giovannivisentini 27:3881985097bb 1198 AccessType_t mType;
giovannivisentini 27:3881985097bb 1199 bool mEnable;
giovannivisentini 27:3881985097bb 1200
giovannivisentini 27:3881985097bb 1201 };
giovannivisentini 27:3881985097bb 1202
giovannivisentini 27:3881985097bb 1203
giovannivisentini 27:3881985097bb 1204 /**
giovannivisentini 27:3881985097bb 1205 * Object containing the callback chain needed to change the access state
giovannivisentini 27:3881985097bb 1206 */
giovannivisentini 27:3881985097bb 1207 ChangeAccessStateCallback mChangeAccessStateCallback;
giovannivisentini 27:3881985097bb 1208 friend class ChangeAccessStateCallback;
giovannivisentini 27:3881985097bb 1209
giovannivisentini 19:0b65a5813059 1210
giovannivisentini 19:0b65a5813059 1211 /**
giovannivisentini 19:0b65a5813059 1212 * Object with the callback used to send a ManageGPO command.
giovannivisentini 24:9f98eafa2d39 1213 * This class is equivalent to calling the methods:
giovannivisentini 19:0b65a5813059 1214 * <ul>
giovannivisentini 19:0b65a5813059 1215 * <li> SelectedApplication </li>
giovannivisentini 19:0b65a5813059 1216 * <li> SelectSystemfile </li>
giovannivisentini 19:0b65a5813059 1217 * <li> ReadBinar: read the old value </li>
giovannivisentini 24:9f98eafa2d39 1218 * <li> onVerified </li>
giovannivisentini 19:0b65a5813059 1219 * <li> onUpdatedBinary: write the new value</li>
giovannivisentini 19:0b65a5813059 1220 * </ul>
giovannivisentini 19:0b65a5813059 1221 */
giovannivisentini 27:3881985097bb 1222 class ManageGPOCallback : public Callbacks{
giovannivisentini 19:0b65a5813059 1223
giovannivisentini 19:0b65a5813059 1224 public:
giovannivisentini 19:0b65a5813059 1225
giovannivisentini 19:0b65a5813059 1226 /**
giovannivisentini 24:9f98eafa2d39 1227 * Build the chain of callbacks.
giovannivisentini 24:9f98eafa2d39 1228 * @param parent Parent component to run the command on.
giovannivisentini 19:0b65a5813059 1229 */
giovannivisentini 19:0b65a5813059 1230 ManageGPOCallback(M24SR &parent):mParent(parent),
giovannivisentini 19:0b65a5813059 1231 mGpoConfig(HIGH_IMPEDANCE),mReadGpoConfig(0),mI2CGpo(true){}
giovannivisentini 19:0b65a5813059 1232
giovannivisentini 19:0b65a5813059 1233
giovannivisentini 19:0b65a5813059 1234 /**
giovannivisentini 24:9f98eafa2d39 1235 * Command parameters.
giovannivisentini 24:9f98eafa2d39 1236 * @param i2cGpo true to change the i2c gpo, false for the rf gpo.
giovannivisentini 19:0b65a5813059 1237 * @param newConfig new gpo function.
giovannivisentini 19:0b65a5813059 1238 */
giovannivisentini 19:0b65a5813059 1239 void setNewGpoConfig(bool i2cGpo,NFC_GPO_MGMT newConfig){
giovannivisentini 19:0b65a5813059 1240 mGpoConfig=newConfig;
giovannivisentini 19:0b65a5813059 1241 mI2CGpo =i2cGpo;
giovannivisentini 19:0b65a5813059 1242 }
giovannivisentini 19:0b65a5813059 1243
giovannivisentini 27:3881985097bb 1244 virtual void onSelectedApplication(M24SR *nfc,StatusTypeDef status){
giovannivisentini 27:3881985097bb 1245 if(status==M24SR_SUCCESS)
giovannivisentini 19:0b65a5813059 1246 nfc->SelectSystemfile();
giovannivisentini 19:0b65a5813059 1247 else
giovannivisentini 19:0b65a5813059 1248 onFinishCommand(nfc,status);
giovannivisentini 19:0b65a5813059 1249 }
giovannivisentini 19:0b65a5813059 1250
giovannivisentini 27:3881985097bb 1251 virtual void onSelectedSystemFile(M24SR *nfc,StatusTypeDef status){
giovannivisentini 27:3881985097bb 1252 if(status==M24SR_SUCCESS)
giovannivisentini 19:0b65a5813059 1253 nfc->ReadBinary(0x0004, 0x01, &mReadGpoConfig);
giovannivisentini 19:0b65a5813059 1254 else
giovannivisentini 19:0b65a5813059 1255 onFinishCommand(nfc,status);
giovannivisentini 19:0b65a5813059 1256 }
giovannivisentini 19:0b65a5813059 1257
giovannivisentini 27:3881985097bb 1258 virtual void onReadByte(M24SR *nfc,StatusTypeDef status,
giovannivisentini 19:0b65a5813059 1259 uint16_t,uint8_t*, uint16_t ){
giovannivisentini 27:3881985097bb 1260 if(status==M24SR_SUCCESS)
giovannivisentini 19:0b65a5813059 1261 nfc->Verify(M24SR::I2CPwd, 0x10, M24SR::DEFAULT_PASSWORD);
giovannivisentini 19:0b65a5813059 1262 else
giovannivisentini 19:0b65a5813059 1263 onFinishCommand(nfc,status);
giovannivisentini 19:0b65a5813059 1264 }
giovannivisentini 19:0b65a5813059 1265
giovannivisentini 27:3881985097bb 1266 virtual void onVerified(M24SR *nfc,StatusTypeDef status,PasswordType_t, const uint8_t*){
giovannivisentini 27:3881985097bb 1267 if(status!=M24SR_SUCCESS)
giovannivisentini 19:0b65a5813059 1268 return onFinishCommand(nfc,status);
giovannivisentini 19:0b65a5813059 1269
giovannivisentini 19:0b65a5813059 1270 if(mI2CGpo)
giovannivisentini 19:0b65a5813059 1271 mReadGpoConfig = (mReadGpoConfig & 0xF0) | (uint8_t)mGpoConfig;
giovannivisentini 19:0b65a5813059 1272 else
giovannivisentini 19:0b65a5813059 1273 mReadGpoConfig = (mReadGpoConfig & 0x0F) | (((uint8_t)mGpoConfig)<<4);
giovannivisentini 19:0b65a5813059 1274
giovannivisentini 19:0b65a5813059 1275 nfc->UpdateBinary(0x0004, 0x01, &mReadGpoConfig);
giovannivisentini 19:0b65a5813059 1276 }
giovannivisentini 19:0b65a5813059 1277
giovannivisentini 27:3881985097bb 1278 virtual void onUpdatedBinary(M24SR *nfc,StatusTypeDef status,
giovannivisentini 19:0b65a5813059 1279 uint16_t , uint8_t*, uint16_t ){
giovannivisentini 19:0b65a5813059 1280
giovannivisentini 27:3881985097bb 1281 if(status==M24SR_SUCCESS){
giovannivisentini 19:0b65a5813059 1282 if (mGpoConfig == I2C_ANSWER_READY){
giovannivisentini 19:0b65a5813059 1283 mParent.mCommunicationType = ASYNC;
giovannivisentini 19:0b65a5813059 1284 }else{
giovannivisentini 19:0b65a5813059 1285 mParent.mCommunicationType = SYNC;
giovannivisentini 19:0b65a5813059 1286 }//if-else
giovannivisentini 19:0b65a5813059 1287 }//status
giovannivisentini 19:0b65a5813059 1288 onFinishCommand(nfc,status);
giovannivisentini 19:0b65a5813059 1289 }
giovannivisentini 19:0b65a5813059 1290
giovannivisentini 19:0b65a5813059 1291 private:
giovannivisentini 19:0b65a5813059 1292
giovannivisentini 19:0b65a5813059 1293 /**
giovannivisentini 24:9f98eafa2d39 1294 * Remove the private callback and call the user callback.
giovannivisentini 25:caa16fd0e50b 1295 * @param nfc Object where the command was send to.
giovannivisentini 24:9f98eafa2d39 1296 * @param status Command status.
giovannivisentini 19:0b65a5813059 1297 */
giovannivisentini 27:3881985097bb 1298 void onFinishCommand(M24SR *nfc,StatusTypeDef status){
giovannivisentini 19:0b65a5813059 1299 mParent.mComponentCallback=NULL;
giovannivisentini 19:0b65a5813059 1300 if(mI2CGpo){
giovannivisentini 19:0b65a5813059 1301 mParent.mCallback->onManageI2CGPO(nfc,status,mGpoConfig);
giovannivisentini 19:0b65a5813059 1302 }else{
giovannivisentini 19:0b65a5813059 1303 mParent.mCallback->onManageRFGPO(nfc,status,mGpoConfig);
giovannivisentini 19:0b65a5813059 1304 }//if-else
giovannivisentini 19:0b65a5813059 1305 }//onFinishCommand
giovannivisentini 19:0b65a5813059 1306
giovannivisentini 19:0b65a5813059 1307 /**
giovannivisentini 24:9f98eafa2d39 1308 * Component where send the commands
giovannivisentini 19:0b65a5813059 1309 */
giovannivisentini 19:0b65a5813059 1310 M24SR &mParent;
giovannivisentini 19:0b65a5813059 1311
giovannivisentini 19:0b65a5813059 1312 /** new gpo function that this class has to write */
giovannivisentini 19:0b65a5813059 1313 NFC_GPO_MGMT mGpoConfig;
giovannivisentini 19:0b65a5813059 1314
giovannivisentini 19:0b65a5813059 1315 /**
giovannivisentini 24:9f98eafa2d39 1316 * variable where storeing the read gpo configuration
giovannivisentini 19:0b65a5813059 1317 */
giovannivisentini 19:0b65a5813059 1318 uint8_t mReadGpoConfig;
giovannivisentini 19:0b65a5813059 1319
giovannivisentini 19:0b65a5813059 1320 /**
giovannivisentini 24:9f98eafa2d39 1321 * true to change the i2c gpo, false to change the rf gpo
giovannivisentini 19:0b65a5813059 1322 */
giovannivisentini 19:0b65a5813059 1323 bool mI2CGpo;
giovannivisentini 19:0b65a5813059 1324
giovannivisentini 19:0b65a5813059 1325 };
giovannivisentini 19:0b65a5813059 1326
giovannivisentini 19:0b65a5813059 1327 /**
giovannivisentini 19:0b65a5813059 1328 * Object containing the callback chain needed to change the gpo function
giovannivisentini 19:0b65a5813059 1329 */
giovannivisentini 19:0b65a5813059 1330 ManageGPOCallback mManageGPOCallback;
giovannivisentini 19:0b65a5813059 1331
giovannivisentini 19:0b65a5813059 1332
giovannivisentini 19:0b65a5813059 1333 /**
giovannivisentini 19:0b65a5813059 1334 * Object with the callback used to read the component ID
giovannivisentini 24:9f98eafa2d39 1335 * This class is equivalent to calling the methods:
giovannivisentini 19:0b65a5813059 1336 * <ul>
giovannivisentini 19:0b65a5813059 1337 * <li> SelectedApplication </li>
giovannivisentini 19:0b65a5813059 1338 * <li> SelectSystemfile </li>
giovannivisentini 19:0b65a5813059 1339 * <li> ReadBinary </li>
giovannivisentini 19:0b65a5813059 1340 * </ul>
giovannivisentini 19:0b65a5813059 1341 */
giovannivisentini 27:3881985097bb 1342 class ReadIDCallback : public Callbacks{
giovannivisentini 19:0b65a5813059 1343
giovannivisentini 19:0b65a5813059 1344 public:
giovannivisentini 19:0b65a5813059 1345
giovannivisentini 19:0b65a5813059 1346 /**
giovannivisentini 24:9f98eafa2d39 1347 * Build the chain of callbacks.
giovannivisentini 24:9f98eafa2d39 1348 * @param parent object where to send the command to.
giovannivisentini 19:0b65a5813059 1349 */
giovannivisentini 19:0b65a5813059 1350 ReadIDCallback(M24SR &parent):mParent(parent),mIdPtr(NULL){}
giovannivisentini 19:0b65a5813059 1351
giovannivisentini 19:0b65a5813059 1352 /**
giovannivisentini 24:9f98eafa2d39 1353 * Set the variable containing the result
giovannivisentini 19:0b65a5813059 1354 * @param idPtr
giovannivisentini 19:0b65a5813059 1355 */
giovannivisentini 19:0b65a5813059 1356 void readIdOn(uint8_t *idPtr){
giovannivisentini 19:0b65a5813059 1357 mIdPtr=idPtr;
giovannivisentini 19:0b65a5813059 1358 }
giovannivisentini 19:0b65a5813059 1359
giovannivisentini 27:3881985097bb 1360 virtual void onSelectedApplication(M24SR *nfc,StatusTypeDef status){
giovannivisentini 27:3881985097bb 1361 if(status==M24SR_SUCCESS){
giovannivisentini 19:0b65a5813059 1362 nfc->SelectSystemfile();
giovannivisentini 19:0b65a5813059 1363 }else
giovannivisentini 19:0b65a5813059 1364 onFinishCommand(nfc,status);
giovannivisentini 19:0b65a5813059 1365
giovannivisentini 19:0b65a5813059 1366 }
giovannivisentini 19:0b65a5813059 1367
giovannivisentini 27:3881985097bb 1368 virtual void onSelectedSystemFile(M24SR *nfc,StatusTypeDef status){
giovannivisentini 27:3881985097bb 1369 if(status==M24SR_SUCCESS){
giovannivisentini 19:0b65a5813059 1370 nfc->ReadBinary(0x0011, 0x01, mIdPtr);
giovannivisentini 19:0b65a5813059 1371 }else
giovannivisentini 19:0b65a5813059 1372 onFinishCommand(nfc,status);
giovannivisentini 19:0b65a5813059 1373 }
giovannivisentini 19:0b65a5813059 1374
giovannivisentini 27:3881985097bb 1375 virtual void onReadByte(M24SR *nfc,StatusTypeDef status,
giovannivisentini 19:0b65a5813059 1376 uint16_t ,uint8_t *, uint16_t ){
giovannivisentini 19:0b65a5813059 1377 onFinishCommand(nfc,status);
giovannivisentini 19:0b65a5813059 1378 }
giovannivisentini 19:0b65a5813059 1379
giovannivisentini 19:0b65a5813059 1380 private:
giovannivisentini 19:0b65a5813059 1381
giovannivisentini 19:0b65a5813059 1382 /**
giovannivisentini 24:9f98eafa2d39 1383 * Remove the private callback and call the user onReadId function.
giovannivisentini 24:9f98eafa2d39 1384 * @param nfc Object where the command was send.
giovannivisentini 24:9f98eafa2d39 1385 * @param status Command status.
giovannivisentini 19:0b65a5813059 1386 */
giovannivisentini 27:3881985097bb 1387 void onFinishCommand(M24SR *nfc,StatusTypeDef status){
giovannivisentini 19:0b65a5813059 1388 mParent.mComponentCallback=NULL;
giovannivisentini 19:0b65a5813059 1389 mParent.getCallback()->onReadId(nfc,status,mIdPtr);
giovannivisentini 19:0b65a5813059 1390 }
giovannivisentini 19:0b65a5813059 1391
giovannivisentini 21:ccc4f3fed4b3 1392 M24SR& mParent;
giovannivisentini 19:0b65a5813059 1393
giovannivisentini 19:0b65a5813059 1394 /**
giovannivisentini 24:9f98eafa2d39 1395 * pointer to read id
giovannivisentini 19:0b65a5813059 1396 */
giovannivisentini 19:0b65a5813059 1397 uint8_t *mIdPtr;
giovannivisentini 19:0b65a5813059 1398 };
giovannivisentini 19:0b65a5813059 1399
giovannivisentini 24:9f98eafa2d39 1400
giovannivisentini 19:0b65a5813059 1401 /**
giovannivisentini 19:0b65a5813059 1402 * Object containing the callback chain needed to read the component id
giovannivisentini 19:0b65a5813059 1403 */
giovannivisentini 19:0b65a5813059 1404 ReadIDCallback mReadIDCallback;
giovannivisentini 24:9f98eafa2d39 1405 friend class ReadIDCallback;
giovannivisentini 19:0b65a5813059 1406
giovannivisentini 19:0b65a5813059 1407 /**
giovannivisentini 12:d1f5eaa85deb 1408 * Convert a generic enum to the value used by the M24SR chip.
giovannivisentini 12:d1f5eaa85deb 1409 * @param type Password type.
giovannivisentini 12:d1f5eaa85deb 1410 * @return equivalent value used inside the m24sr chip */
giovannivisentini 12:d1f5eaa85deb 1411 uint16_t passwordTypeToConst(const PasswordType_t &type)const{
giovannivisentini 12:d1f5eaa85deb 1412 switch(type){
giovannivisentini 12:d1f5eaa85deb 1413 case ReadPwd:
giovannivisentini 12:d1f5eaa85deb 1414 return READ_PWD;
giovannivisentini 12:d1f5eaa85deb 1415 case WritePwd:
giovannivisentini 12:d1f5eaa85deb 1416 return WRITE_PWD;
giovannivisentini 12:d1f5eaa85deb 1417 case I2CPwd:
giovannivisentini 12:d1f5eaa85deb 1418 default:
giovannivisentini 12:d1f5eaa85deb 1419 return I2C_PWD;
giovannivisentini 19:0b65a5813059 1420 }//switch
giovannivisentini 12:d1f5eaa85deb 1421 }//passwordTypeToConst
giovannivisentini 12:d1f5eaa85deb 1422
giovannivisentini 19:0b65a5813059 1423 /**
giovannivisentini 19:0b65a5813059 1424 * convert a uint16 into an enum value
giovannivisentini 19:0b65a5813059 1425 * @param type
giovannivisentini 19:0b65a5813059 1426 * @return
giovannivisentini 19:0b65a5813059 1427 */
giovannivisentini 19:0b65a5813059 1428 PasswordType_t constToPasswordType(const uint16_t type)const{
giovannivisentini 19:0b65a5813059 1429 switch(type){
giovannivisentini 19:0b65a5813059 1430 case READ_PWD:
giovannivisentini 19:0b65a5813059 1431 return ReadPwd;
giovannivisentini 19:0b65a5813059 1432 case WRITE_PWD:
giovannivisentini 19:0b65a5813059 1433 return WritePwd;
giovannivisentini 19:0b65a5813059 1434 case I2C_PWD:
giovannivisentini 19:0b65a5813059 1435 default:
giovannivisentini 19:0b65a5813059 1436 return I2CPwd;
giovannivisentini 19:0b65a5813059 1437 }//switch
giovannivisentini 19:0b65a5813059 1438 }//passwordTypeToConst
giovannivisentini 0:969a2be49f41 1439 };
giovannivisentini 0:969a2be49f41 1440
giovannivisentini 0:969a2be49f41 1441 #endif // __M24SR_CLASS_H
giovannivisentini 0:969a2be49f41 1442
giovannivisentini 0:969a2be49f41 1443 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/