This application provides a set of demos with X-NUCLEO-NFC01A1 expansion board.

Dependencies:   NDefLib X_NUCLEO_NFC01A1 mbed

Fork of X-MBED-NFC1 by Giovanni Visentini

This application provides a set of demos with X-NUCLEO-NFC01A1 expansion board.

The available demos are:

  • SAMPLE_WRITE_URL: write a tag with the ST home page URL
  • SAMPLE_COUNT_CLICK: create a custom tag to count and report the user button clicks.
  • SAMPLE_WRITE_AND_CHANGE_ALL: write a tag with all the supported records and update the tag contents when the user button is pressed.
  • SAMPLE_LOCK_TAG_CONTENT: use the M24SR component API to set the NFC tag as read-only.

To enable the different demos comment/uncomment the SAMPLE_* macros provided in main.cpp .

Committer:
giovannivisentini
Date:
Tue Dec 01 08:30:54 2015 +0000
Revision:
2:0648c1561eb2
Parent:
1:6d202b62ed68
change the tag content when the user press the button

Who changed what in which revision?

UserRevisionLine numberNew contents of line
giovannivisentini 0:674813bd5ec9 1 /*
giovannivisentini 0:674813bd5ec9 2 * Type4NfcTagSTM24SR.h
giovannivisentini 0:674813bd5ec9 3 *
giovannivisentini 0:674813bd5ec9 4 * Created on: Nov 5, 2015
giovannivisentini 0:674813bd5ec9 5 * Author: giovanni visentini
giovannivisentini 0:674813bd5ec9 6 */
giovannivisentini 0:674813bd5ec9 7
giovannivisentini 0:674813bd5ec9 8 #ifndef TYPE4NFCTAGSTM24SR_H_
giovannivisentini 0:674813bd5ec9 9 #define TYPE4NFCTAGSTM24SR_H_
giovannivisentini 0:674813bd5ec9 10 #include <stdint.h>
giovannivisentini 0:674813bd5ec9 11 #include "m24sr/m24sr_class.h"
giovannivisentini 0:674813bd5ec9 12
giovannivisentini 1:6d202b62ed68 13 #include "NDefLib/Type4NfcTag.h"
giovannivisentini 0:674813bd5ec9 14
giovannivisentini 2:0648c1561eb2 15 /**
giovannivisentini 2:0648c1561eb2 16 * implement the abstract method for use the NDefLib
giovannivisentini 2:0648c1561eb2 17 */
giovannivisentini 1:6d202b62ed68 18 class Type4NfcTagSTM24SR: public NDefLib::Type4NfcTag {
giovannivisentini 0:674813bd5ec9 19
giovannivisentini 0:674813bd5ec9 20 public:
giovannivisentini 2:0648c1561eb2 21 /**
giovannivisentini 2:0648c1561eb2 22 *
giovannivisentini 2:0648c1561eb2 23 * @param device device where write the Ndef tags
giovannivisentini 2:0648c1561eb2 24 */
giovannivisentini 1:6d202b62ed68 25 Type4NfcTagSTM24SR(M24SR &device) :
giovannivisentini 2:0648c1561eb2 26 mDevice(device), mMaxReadBytes(0xFF), mMaxWriteBytes(
giovannivisentini 1:6d202b62ed68 27 0xFF) {
giovannivisentini 1:6d202b62ed68 28 }
giovannivisentini 0:674813bd5ec9 29
giovannivisentini 2:0648c1561eb2 30
giovannivisentini 1:6d202b62ed68 31 virtual bool openSession(bool force = false);
giovannivisentini 0:674813bd5ec9 32 virtual bool closeSession();
giovannivisentini 0:674813bd5ec9 33
giovannivisentini 2:0648c1561eb2 34 /**
giovannivisentini 2:0648c1561eb2 35 * close the open session
giovannivisentini 2:0648c1561eb2 36 */
giovannivisentini 1:6d202b62ed68 37 virtual ~Type4NfcTagSTM24SR() {
giovannivisentini 2:0648c1561eb2 38 if(isSessionOpen())
giovannivisentini 1:6d202b62ed68 39 closeSession();
giovannivisentini 2:0648c1561eb2 40 }//~Type4NfcTagSTM24SR
giovannivisentini 1:6d202b62ed68 41
giovannivisentini 1:6d202b62ed68 42 bool enableReadPassword(const uint8_t* pCurrentWritePassword,
giovannivisentini 1:6d202b62ed68 43 const uint8_t* pNewPassword) {
giovannivisentini 2:0648c1561eb2 44 if (!isSessionOpen())
giovannivisentini 1:6d202b62ed68 45 return false;
giovannivisentini 1:6d202b62ed68 46
giovannivisentini 1:6d202b62ed68 47 if (mDevice.Verify(M24SR::WritePwd, 0x10, pCurrentWritePassword)
giovannivisentini 1:6d202b62ed68 48 == NFC_SUCCESS) {
giovannivisentini 1:6d202b62ed68 49 /* Set new password */
giovannivisentini 1:6d202b62ed68 50 if (mDevice.ChangeReferenceData(M24SR::ReadPwd, pNewPassword)
giovannivisentini 1:6d202b62ed68 51 == NFC_SUCCESS)
giovannivisentini 1:6d202b62ed68 52 return mDevice.EnableVerificationRequirement(M24SR::ReadPwd)
giovannivisentini 1:6d202b62ed68 53 == NFC_SUCCESS;
giovannivisentini 1:6d202b62ed68 54 } //else
giovannivisentini 1:6d202b62ed68 55 /* M24SR already lock but password not known */
giovannivisentini 1:6d202b62ed68 56 return false;
giovannivisentini 1:6d202b62ed68 57
giovannivisentini 1:6d202b62ed68 58 }
giovannivisentini 1:6d202b62ed68 59
giovannivisentini 1:6d202b62ed68 60 bool disableReadPassword(const uint8_t* pCurrentWritePassword) {
giovannivisentini 2:0648c1561eb2 61 if (!isSessionOpen())
giovannivisentini 1:6d202b62ed68 62 return false;
giovannivisentini 1:6d202b62ed68 63
giovannivisentini 1:6d202b62ed68 64 if (mDevice.Verify(M24SR::WritePwd, 0x10, pCurrentWritePassword)
giovannivisentini 1:6d202b62ed68 65 == NFC_SUCCESS) {
giovannivisentini 1:6d202b62ed68 66 /* Set new password */
giovannivisentini 1:6d202b62ed68 67 return mDevice.DisableVerificationRequirement(M24SR::ReadPwd)
giovannivisentini 1:6d202b62ed68 68 == NFC_SUCCESS;
giovannivisentini 1:6d202b62ed68 69 } else {
giovannivisentini 1:6d202b62ed68 70 /* M24SR already lock but password not known */
giovannivisentini 1:6d202b62ed68 71 return false;
giovannivisentini 1:6d202b62ed68 72 }
giovannivisentini 1:6d202b62ed68 73 }
giovannivisentini 1:6d202b62ed68 74
giovannivisentini 1:6d202b62ed68 75 bool enableWritePassword(const uint8_t* pCurrentWritePassword,
giovannivisentini 1:6d202b62ed68 76 uint8_t* pNewPassword) {
giovannivisentini 2:0648c1561eb2 77 if (!isSessionOpen())
giovannivisentini 1:6d202b62ed68 78 return false;
giovannivisentini 1:6d202b62ed68 79
giovannivisentini 1:6d202b62ed68 80 /* check we have the good password */
giovannivisentini 1:6d202b62ed68 81 if (mDevice.Verify(M24SR::WritePwd, 0x10, pCurrentWritePassword)
giovannivisentini 1:6d202b62ed68 82 == NFC_SUCCESS) {
giovannivisentini 1:6d202b62ed68 83 /* Set new password */
giovannivisentini 1:6d202b62ed68 84 if (mDevice.ChangeReferenceData(M24SR::WritePwd, pNewPassword)
giovannivisentini 1:6d202b62ed68 85 == NFC_SUCCESS)
giovannivisentini 1:6d202b62ed68 86 return mDevice.EnableVerificationRequirement(M24SR::WritePwd)
giovannivisentini 1:6d202b62ed68 87 == NFC_SUCCESS;
giovannivisentini 1:6d202b62ed68 88 }
giovannivisentini 1:6d202b62ed68 89 return false;
giovannivisentini 1:6d202b62ed68 90 }
giovannivisentini 1:6d202b62ed68 91
giovannivisentini 1:6d202b62ed68 92 bool disableWritePassword(const uint8_t* pCurrentWritePassword) {
giovannivisentini 2:0648c1561eb2 93 if (!isSessionOpen())
giovannivisentini 1:6d202b62ed68 94 return false;
giovannivisentini 1:6d202b62ed68 95
giovannivisentini 1:6d202b62ed68 96 if (mDevice.Verify(M24SR::WritePwd, 0x10, pCurrentWritePassword)
giovannivisentini 1:6d202b62ed68 97 == NFC_SUCCESS)
giovannivisentini 1:6d202b62ed68 98 return mDevice.DisableVerificationRequirement(M24SR::WritePwd)
giovannivisentini 1:6d202b62ed68 99 == NFC_SUCCESS;
giovannivisentini 1:6d202b62ed68 100 return false;
giovannivisentini 1:6d202b62ed68 101 }
giovannivisentini 1:6d202b62ed68 102
giovannivisentini 1:6d202b62ed68 103 /**
giovannivisentini 1:6d202b62ed68 104 * @brief This fonction desactivate the need of read and write password for next access
giovannivisentini 1:6d202b62ed68 105 * @param pSuperUserPassword : I2C super user password to overwrite read and write password
giovannivisentini 1:6d202b62ed68 106 * @retval SUCCESS : M24SR access is now free (no password needed)
giovannivisentini 1:6d202b62ed68 107 * @retval ERROR : operation does not complete
giovannivisentini 1:6d202b62ed68 108 */
giovannivisentini 1:6d202b62ed68 109 bool disableAllPassword(const uint8_t* pSuperUserPassword) {
giovannivisentini 2:0648c1561eb2 110 if (!isSessionOpen())
giovannivisentini 1:6d202b62ed68 111 return false;
giovannivisentini 1:6d202b62ed68 112
giovannivisentini 1:6d202b62ed68 113 if (mDevice.Verify(M24SR::WritePwd, 0x10, pSuperUserPassword)
giovannivisentini 1:6d202b62ed68 114 == NFC_SUCCESS) {
giovannivisentini 1:6d202b62ed68 115 mDevice.DisablePermanentState(M24SR::ReadPwd);
giovannivisentini 1:6d202b62ed68 116 mDevice.DisablePermanentState(M24SR::WritePwd);
giovannivisentini 1:6d202b62ed68 117
giovannivisentini 1:6d202b62ed68 118 mDevice.DisableVerificationRequirement(M24SR::ReadPwd);
giovannivisentini 1:6d202b62ed68 119 mDevice.DisableVerificationRequirement(M24SR::WritePwd);
giovannivisentini 1:6d202b62ed68 120
giovannivisentini 1:6d202b62ed68 121 /* reset password */
giovannivisentini 1:6d202b62ed68 122 mDevice.ChangeReferenceData(M24SR::ReadPwd, pSuperUserPassword);
giovannivisentini 1:6d202b62ed68 123 mDevice.ChangeReferenceData(M24SR::WritePwd, pSuperUserPassword);
giovannivisentini 1:6d202b62ed68 124 return true;
giovannivisentini 1:6d202b62ed68 125 }
giovannivisentini 1:6d202b62ed68 126 return false;
giovannivisentini 1:6d202b62ed68 127 }
giovannivisentini 1:6d202b62ed68 128
giovannivisentini 1:6d202b62ed68 129 /**
giovannivisentini 1:6d202b62ed68 130 * @brief This fonction enable read only mode
giovannivisentini 1:6d202b62ed68 131 * @param pCurrentWritePassword : Write password is needed to have right to enable read only mode
giovannivisentini 1:6d202b62ed68 132 * @retval SUCCESS : M24SR access is now forbidden in write mode
giovannivisentini 1:6d202b62ed68 133 * @retval ERROR : operation does not complete
giovannivisentini 1:6d202b62ed68 134 */
giovannivisentini 1:6d202b62ed68 135 bool enableReadOnly(const uint8_t* pCurrentWritePassword) {
giovannivisentini 2:0648c1561eb2 136 if (!isSessionOpen())
giovannivisentini 1:6d202b62ed68 137 return false;
giovannivisentini 1:6d202b62ed68 138
giovannivisentini 1:6d202b62ed68 139 if (mDevice.Verify(M24SR::WritePwd, 0x10, pCurrentWritePassword)
giovannivisentini 1:6d202b62ed68 140 == NFC_SUCCESS) {
giovannivisentini 1:6d202b62ed68 141 /* lock write to have read only */
giovannivisentini 1:6d202b62ed68 142 return mDevice.EnablePermanentState(M24SR::WritePwd) == NFC_SUCCESS;
giovannivisentini 1:6d202b62ed68 143 }
giovannivisentini 1:6d202b62ed68 144 return false;
giovannivisentini 1:6d202b62ed68 145 }
giovannivisentini 1:6d202b62ed68 146
giovannivisentini 1:6d202b62ed68 147 /**
giovannivisentini 1:6d202b62ed68 148 * @brief This fonction disable read only mode
giovannivisentini 1:6d202b62ed68 149 * @param pCurrentWritePassword : Write password is needed to have right to disable read only mode
giovannivisentini 1:6d202b62ed68 150 * @retval SUCCESS : M24SR write access is now allowed
giovannivisentini 1:6d202b62ed68 151 * @retval ERROR : operation does not complete
giovannivisentini 1:6d202b62ed68 152 */
giovannivisentini 1:6d202b62ed68 153 bool disableReadOnly() {
giovannivisentini 2:0648c1561eb2 154 if (!isSessionOpen())
giovannivisentini 1:6d202b62ed68 155 return false;
giovannivisentini 1:6d202b62ed68 156
giovannivisentini 1:6d202b62ed68 157 if (mDevice.Verify(M24SR::I2CPwd, 0x10, M24SR::DEFAULT_PASSWORD)
giovannivisentini 1:6d202b62ed68 158 == NFC_SUCCESS) {
giovannivisentini 1:6d202b62ed68 159 /* disable write protection to disable read only mode */
giovannivisentini 1:6d202b62ed68 160 if (mDevice.DisablePermanentState(M24SR::WritePwd) == NFC_SUCCESS)
giovannivisentini 1:6d202b62ed68 161 return mDevice.DisableVerificationRequirement(M24SR::WritePwd)
giovannivisentini 1:6d202b62ed68 162 == NFC_SUCCESS;
giovannivisentini 1:6d202b62ed68 163 } //if
giovannivisentini 1:6d202b62ed68 164 return false;
giovannivisentini 1:6d202b62ed68 165 }
giovannivisentini 1:6d202b62ed68 166
giovannivisentini 1:6d202b62ed68 167 /**
giovannivisentini 1:6d202b62ed68 168 * @brief This fonction enable write only mode
giovannivisentini 1:6d202b62ed68 169 * @param pCurrentWritePassword : Write password is needed to have right to enable write only mode
giovannivisentini 1:6d202b62ed68 170 * @retval SUCCESS : M24SR access is now forbidden in read mode
giovannivisentini 1:6d202b62ed68 171 * @retval ERROR : operation does not complete
giovannivisentini 1:6d202b62ed68 172 */
giovannivisentini 1:6d202b62ed68 173 bool enableWriteOnly(const uint8_t* pCurrentWritePassword) {
giovannivisentini 2:0648c1561eb2 174 if (!isSessionOpen())
giovannivisentini 1:6d202b62ed68 175 return false;
giovannivisentini 1:6d202b62ed68 176
giovannivisentini 1:6d202b62ed68 177 if (mDevice.Verify(M24SR::WritePwd, 0x10, pCurrentWritePassword)
giovannivisentini 1:6d202b62ed68 178 == NFC_SUCCESS) {
giovannivisentini 1:6d202b62ed68 179 /* disable read access and keep write */
giovannivisentini 1:6d202b62ed68 180 return mDevice.EnablePermanentState(M24SR::ReadPwd) == NFC_SUCCESS;
giovannivisentini 1:6d202b62ed68 181 }
giovannivisentini 1:6d202b62ed68 182 return false;
giovannivisentini 1:6d202b62ed68 183 }
giovannivisentini 1:6d202b62ed68 184
giovannivisentini 1:6d202b62ed68 185 /**
giovannivisentini 1:6d202b62ed68 186 * @brief This fonction disable write only mode
giovannivisentini 1:6d202b62ed68 187 * @param pCurrentWritePassword : Write password is needed to have right to disable write only mode
giovannivisentini 1:6d202b62ed68 188 * @retval SUCCESS : M24SR read access is now allowed
giovannivisentini 1:6d202b62ed68 189 * @retval ERROR : operation does not complete
giovannivisentini 1:6d202b62ed68 190 */
giovannivisentini 1:6d202b62ed68 191 bool disableWriteOnly() {
giovannivisentini 2:0648c1561eb2 192 if (!isSessionOpen())
giovannivisentini 1:6d202b62ed68 193 return false;
giovannivisentini 1:6d202b62ed68 194
giovannivisentini 1:6d202b62ed68 195 if (mDevice.Verify(M24SR::I2CPwd, 0x10, M24SR::DEFAULT_PASSWORD)
giovannivisentini 1:6d202b62ed68 196 == NFC_SUCCESS) {
giovannivisentini 1:6d202b62ed68 197 /* disable write only -> enable write acces */
giovannivisentini 1:6d202b62ed68 198 if (mDevice.DisablePermanentState(M24SR::ReadPwd) == NFC_SUCCESS)
giovannivisentini 1:6d202b62ed68 199 return mDevice.DisableVerificationRequirement(M24SR::ReadPwd)
giovannivisentini 1:6d202b62ed68 200 == NFC_SUCCESS;
giovannivisentini 1:6d202b62ed68 201 }
giovannivisentini 1:6d202b62ed68 202 return false;
giovannivisentini 1:6d202b62ed68 203 }
giovannivisentini 0:674813bd5ec9 204
giovannivisentini 0:674813bd5ec9 205 protected:
giovannivisentini 2:0648c1561eb2 206 virtual bool writeByte(const uint8_t *buffer, const uint16_t length, uint16_t offset);
giovannivisentini 1:6d202b62ed68 207 virtual bool readByte(const uint16_t byteOffset, const uint16_t byteLength,
giovannivisentini 1:6d202b62ed68 208 uint8_t *buffer);
giovannivisentini 0:674813bd5ec9 209
giovannivisentini 0:674813bd5ec9 210 private:
giovannivisentini 0:674813bd5ec9 211
giovannivisentini 0:674813bd5ec9 212 M24SR &mDevice;
giovannivisentini 2:0648c1561eb2 213
giovannivisentini 2:0648c1561eb2 214 /**
giovannivisentini 2:0648c1561eb2 215 * max length for a read operation
giovannivisentini 2:0648c1561eb2 216 */
giovannivisentini 0:674813bd5ec9 217 uint16_t mMaxReadBytes;
giovannivisentini 2:0648c1561eb2 218
giovannivisentini 2:0648c1561eb2 219 /**
giovannivisentini 2:0648c1561eb2 220 * max length for a write operation
giovannivisentini 2:0648c1561eb2 221 */
giovannivisentini 0:674813bd5ec9 222 uint16_t mMaxWriteBytes;
giovannivisentini 0:674813bd5ec9 223 };
giovannivisentini 0:674813bd5ec9 224
giovannivisentini 0:674813bd5ec9 225 #endif /* TYPE4NFCTAGSTM24SR_H_ */