STMicroelectronics' M24SR NFC Dynamic Tag Library.

Dependencies:   ST_INTERFACES

Dependents:   X_NUCLEO_NFC01A1

Fork of M24SR by ST Expansion SW Team

M24SR series Dynamic NFC Tags

The M24SR series provides an NFC forum tag type 4 RF interface and supports the NFC data exchange format (NDEF). This enables NFC use cases such as simple Bluetooth pairing and other connection handovers, automatic links to URLs, storage of Vcard and other types of information. It can be used in a wide variety of applications, including consumer electronics, computer peripherals, home appliances, industrial automation and healthcare products.

  • NFC forum tag type 4 based on ISO 14443 RF interface
  • 1 MHz I²C serial interface operating from 2.7 to 5.5 V
  • EEPROM memory density from 2 Kbits to 64 Kbits with built-in NDEF message support
  • RF disable pin allowing the application to control RF access from NFC phones
  • 128-bit password protection
  • General-purpose output pin allowing flexibility for the applications (wake up on several types of events)
  • Simple antenna design, backward compatible with M24LR series

For further information and ordering please refer to the ST Page.

HelloWorld application

Import programHelloWorld_Async_M24SR

M24SR NFC example. Simple application to asynchronously write and read an URL from a M24SR tag.

Committer:
nikapov
Date:
Mon Jul 31 12:26:02 2017 +0000
Revision:
0:11161008d77a
First revision.

Who changed what in which revision?

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