ST / X_NUCLEO_NFC01A1

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:
Fri Sep 30 12:33:20 2016 +0000
Revision:
27:3881985097bb
Parent:
25:caa16fd0e50b
Child:
28:e0d4ffa90f8b
use ST_INTERFACES instead of internal Nfc_class.h

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