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.cpp
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 #include <Type4NfcTagSTM24SR.h>
giovannivisentini 0:674813bd5ec9 9
giovannivisentini 0:674813bd5ec9 10 /* wait 1sec, driver is configured to let 200ms for command to complete */
giovannivisentini 0:674813bd5ec9 11 /* which is enough for all commands except GetSession if RF session is already opened */
giovannivisentini 0:674813bd5ec9 12 /* Smartphone generaly release the session within the second, but customer can modify this value */
giovannivisentini 0:674813bd5ec9 13 #define OPENSESSION_NTRIALS 5
giovannivisentini 0:674813bd5ec9 14
giovannivisentini 0:674813bd5ec9 15 #define CC_FILE_LENGTH_BYTE 15
giovannivisentini 0:674813bd5ec9 16
giovannivisentini 1:6d202b62ed68 17 bool Type4NfcTagSTM24SR::openSession(bool force) {
giovannivisentini 0:674813bd5ec9 18
giovannivisentini 2:0648c1561eb2 19 if (isSessionOpen())
giovannivisentini 0:674813bd5ec9 20 return true;
giovannivisentini 0:674813bd5ec9 21 //else
giovannivisentini 1:6d202b62ed68 22 if (force)
giovannivisentini 0:674813bd5ec9 23 mDevice.KillSession();
giovannivisentini 0:674813bd5ec9 24
giovannivisentini 1:6d202b62ed68 25 int8_t nTrials = OPENSESSION_NTRIALS;
giovannivisentini 0:674813bd5ec9 26 NFC_StatusTypeDef status = NFC_ERROR;
giovannivisentini 1:6d202b62ed68 27 while (status != NFC_SUCCESS && nTrials) {
giovannivisentini 1:6d202b62ed68 28 status = mDevice.GetSession();
giovannivisentini 0:674813bd5ec9 29 nTrials--;
giovannivisentini 0:674813bd5ec9 30 }
giovannivisentini 0:674813bd5ec9 31
giovannivisentini 1:6d202b62ed68 32 if (status != NFC_SUCCESS) {
giovannivisentini 0:674813bd5ec9 33 return false;
giovannivisentini 1:6d202b62ed68 34 } //else
giovannivisentini 0:674813bd5ec9 35
giovannivisentini 0:674813bd5ec9 36 //Select the NFC type 4 application
giovannivisentini 1:6d202b62ed68 37 if (mDevice.SelectApplication() != NFC_SUCCESS)
giovannivisentini 0:674813bd5ec9 38 return false;
giovannivisentini 0:674813bd5ec9 39
giovannivisentini 1:6d202b62ed68 40 if (mDevice.SelectCCfile() != NFC_SUCCESS)
giovannivisentini 0:674813bd5ec9 41 return false;
giovannivisentini 0:674813bd5ec9 42
giovannivisentini 0:674813bd5ec9 43 uint8_t CCFile[CC_FILE_LENGTH_BYTE];
giovannivisentini 0:674813bd5ec9 44 /* read the first 15 bytes of the CC file */
giovannivisentini 1:6d202b62ed68 45 if (mDevice.ReadBinary(0x0000, CC_FILE_LENGTH_BYTE, CCFile) != NFC_SUCCESS)
giovannivisentini 0:674813bd5ec9 46 return false;
giovannivisentini 0:674813bd5ec9 47
giovannivisentini 0:674813bd5ec9 48 //read the ndefFileId
giovannivisentini 1:6d202b62ed68 49 uint16_t ndefFileId = (uint16_t) ((CCFile[0x09] << 8) | CCFile[0x0A]);
giovannivisentini 1:6d202b62ed68 50 mMaxReadBytes = (uint16_t) ((CCFile[0x03] << 8) | CCFile[0x04]);
giovannivisentini 1:6d202b62ed68 51 mMaxWriteBytes = (uint16_t) ((CCFile[0x05] << 8) | CCFile[0x06]);
giovannivisentini 0:674813bd5ec9 52
giovannivisentini 0:674813bd5ec9 53 //openit
giovannivisentini 1:6d202b62ed68 54 if (mDevice.SelectNDEFfile(ndefFileId) != NFC_SUCCESS)
giovannivisentini 0:674813bd5ec9 55 return false;
giovannivisentini 0:674813bd5ec9 56
giovannivisentini 2:0648c1561eb2 57 Type4NfcTag::openSession();
giovannivisentini 0:674813bd5ec9 58 return true;
giovannivisentini 0:674813bd5ec9 59 }
giovannivisentini 0:674813bd5ec9 60
giovannivisentini 1:6d202b62ed68 61 bool Type4NfcTagSTM24SR::closeSession() {
giovannivisentini 0:674813bd5ec9 62
giovannivisentini 0:674813bd5ec9 63 //no open session
giovannivisentini 2:0648c1561eb2 64 if (!isSessionOpen())
giovannivisentini 0:674813bd5ec9 65 return true;
giovannivisentini 0:674813bd5ec9 66
giovannivisentini 0:674813bd5ec9 67 //close the CC file
giovannivisentini 1:6d202b62ed68 68 if (mDevice.Deselect() != NFC_SUCCESS)
giovannivisentini 0:674813bd5ec9 69 return false;
giovannivisentini 0:674813bd5ec9 70
giovannivisentini 2:0648c1561eb2 71 Type4NfcTag::closeSession();
giovannivisentini 0:674813bd5ec9 72 return true;
giovannivisentini 0:674813bd5ec9 73 }
giovannivisentini 0:674813bd5ec9 74
giovannivisentini 2:0648c1561eb2 75 bool Type4NfcTagSTM24SR::writeByte(const uint8_t *buffer, uint16_t length, uint16_t offset) {
giovannivisentini 0:674813bd5ec9 76
giovannivisentini 1:6d202b62ed68 77 NFC_StatusTypeDef status = NFC_SUCCESS;
giovannivisentini 2:0648c1561eb2 78 bool prevSessionStatus = isSessionOpen();
giovannivisentini 1:6d202b62ed68 79 if (!prevSessionStatus) {
giovannivisentini 0:674813bd5ec9 80 //try to acquire a session or fail
giovannivisentini 1:6d202b62ed68 81 if (openSession(false))
giovannivisentini 0:674813bd5ec9 82 return false;
giovannivisentini 1:6d202b62ed68 83 } //if
giovannivisentini 0:674813bd5ec9 84
giovannivisentini 1:6d202b62ed68 85 if (length > mMaxWriteBytes) {
giovannivisentini 1:6d202b62ed68 86 do {
giovannivisentini 2:0648c1561eb2 87 status = mDevice.UpdateBinary(offset, mMaxWriteBytes,(uint8_t*) buffer);
giovannivisentini 0:674813bd5ec9 88 offset += mMaxWriteBytes;
giovannivisentini 0:674813bd5ec9 89 buffer += mMaxWriteBytes;
giovannivisentini 0:674813bd5ec9 90 length -= mMaxWriteBytes;
giovannivisentini 1:6d202b62ed68 91 } while (length > mMaxWriteBytes && status == NFC_SUCCESS);
giovannivisentini 1:6d202b62ed68 92 } //if
giovannivisentini 0:674813bd5ec9 93
giovannivisentini 0:674813bd5ec9 94 //finish to write the buffer
giovannivisentini 1:6d202b62ed68 95 if (status == NFC_SUCCESS && mMaxWriteBytes)
giovannivisentini 2:0648c1561eb2 96 status = mDevice.UpdateBinary(offset, length,(uint8_t*) buffer);
giovannivisentini 0:674813bd5ec9 97
giovannivisentini 1:6d202b62ed68 98 if (status == NFC_SUCCESS) {
giovannivisentini 1:6d202b62ed68 99 if (!prevSessionStatus) // if the session was closed, try close it
giovannivisentini 0:674813bd5ec9 100 return closeSession();
giovannivisentini 0:674813bd5ec9 101 else
giovannivisentini 0:674813bd5ec9 102 return true;
giovannivisentini 1:6d202b62ed68 103 } else
giovannivisentini 0:674813bd5ec9 104 return false;
giovannivisentini 0:674813bd5ec9 105 }
giovannivisentini 0:674813bd5ec9 106
giovannivisentini 1:6d202b62ed68 107 bool Type4NfcTagSTM24SR::readByte(uint16_t byteOffset, uint16_t byteLength,
giovannivisentini 1:6d202b62ed68 108 uint8_t *buffer) {
giovannivisentini 1:6d202b62ed68 109 NFC_StatusTypeDef status = NFC_SUCCESS;
giovannivisentini 1:6d202b62ed68 110 uint16_t offset = byteOffset;
giovannivisentini 1:6d202b62ed68 111 if (byteLength > mMaxReadBytes) {
giovannivisentini 1:6d202b62ed68 112 do {
giovannivisentini 1:6d202b62ed68 113 status = mDevice.ReadBinary(offset, mMaxReadBytes, buffer);
giovannivisentini 1:6d202b62ed68 114 offset += mMaxReadBytes;
giovannivisentini 1:6d202b62ed68 115 buffer += mMaxReadBytes;
giovannivisentini 1:6d202b62ed68 116 byteLength -= mMaxReadBytes;
giovannivisentini 1:6d202b62ed68 117 } while (byteLength > mMaxWriteBytes && status == NFC_SUCCESS);
giovannivisentini 1:6d202b62ed68 118 } //if
giovannivisentini 1:6d202b62ed68 119 //finish to write the buffer
giovannivisentini 1:6d202b62ed68 120 if (status == NFC_SUCCESS && mMaxWriteBytes)
giovannivisentini 1:6d202b62ed68 121 status = mDevice.ReadBinary(offset, byteLength, buffer);
giovannivisentini 1:6d202b62ed68 122
giovannivisentini 1:6d202b62ed68 123 return status == NFC_SUCCESS;
giovannivisentini 1:6d202b62ed68 124 }
giovannivisentini 1:6d202b62ed68 125