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 .

Type4NfcTagSTM24SR.cpp

Committer:
giovannivisentini
Date:
2015-12-01
Revision:
2:0648c1561eb2
Parent:
1:6d202b62ed68

File content as of revision 2:0648c1561eb2:

/*
 * Type4NfcTagSTM24SR.cpp
 *
 *  Created on: Nov 5, 2015
 *      Author: giovanni visentini
 */

#include <Type4NfcTagSTM24SR.h>

/* wait 1sec, driver is configured to let 200ms for command to complete */
/* which is enough for all commands except GetSession if RF session is already opened */
/* Smartphone generaly release the session within the second, but customer can modify this value */
#define OPENSESSION_NTRIALS 5

#define CC_FILE_LENGTH_BYTE 15

bool Type4NfcTagSTM24SR::openSession(bool force) {

	if (isSessionOpen())
		return true;
	//else
	if (force)
		mDevice.KillSession();

	int8_t nTrials = OPENSESSION_NTRIALS;
	NFC_StatusTypeDef status = NFC_ERROR;
	while (status != NFC_SUCCESS && nTrials) {
		status = mDevice.GetSession();
		nTrials--;
	}

	if (status != NFC_SUCCESS) {
		return false;
	} //else

	//Select the NFC type 4 application
	if (mDevice.SelectApplication() != NFC_SUCCESS)
		return false;

	if (mDevice.SelectCCfile() != NFC_SUCCESS)
		return false;

	uint8_t CCFile[CC_FILE_LENGTH_BYTE];
	/* read the first 15 bytes of the CC file */
	if (mDevice.ReadBinary(0x0000, CC_FILE_LENGTH_BYTE, CCFile) != NFC_SUCCESS)
		return false;

	//read the ndefFileId
	uint16_t ndefFileId = (uint16_t) ((CCFile[0x09] << 8) | CCFile[0x0A]);
	mMaxReadBytes = (uint16_t) ((CCFile[0x03] << 8) | CCFile[0x04]);
	mMaxWriteBytes = (uint16_t) ((CCFile[0x05] << 8) | CCFile[0x06]);

	//openit
	if (mDevice.SelectNDEFfile(ndefFileId) != NFC_SUCCESS)
		return false;

	Type4NfcTag::openSession();
	return true;
}

bool Type4NfcTagSTM24SR::closeSession() {

	//no open session
	if (!isSessionOpen())
		return true;

	//close the CC file
	if (mDevice.Deselect() != NFC_SUCCESS)
		return false;

	Type4NfcTag::closeSession();
	return true;
}

bool Type4NfcTagSTM24SR::writeByte(const uint8_t *buffer, uint16_t length, uint16_t offset) {

	NFC_StatusTypeDef status = NFC_SUCCESS;
	bool prevSessionStatus = isSessionOpen();
	if (!prevSessionStatus) {
		//try to acquire a session or fail
		if (openSession(false))
			return false;
	} //if

	if (length > mMaxWriteBytes) {
		do {
			status = mDevice.UpdateBinary(offset, mMaxWriteBytes,(uint8_t*) buffer);
			offset += mMaxWriteBytes;
			buffer += mMaxWriteBytes;
			length -= mMaxWriteBytes;
		} while (length > mMaxWriteBytes && status == NFC_SUCCESS);
	} //if

	//finish to write the buffer
	if (status == NFC_SUCCESS && mMaxWriteBytes)
		status = mDevice.UpdateBinary(offset, length,(uint8_t*) buffer);

	if (status == NFC_SUCCESS) {
		if (!prevSessionStatus) // if the session was closed, try close it
			return closeSession();
		else
			return true;
	} else
		return false;
}

bool Type4NfcTagSTM24SR::readByte(uint16_t byteOffset, uint16_t byteLength,
		uint8_t *buffer) {
	NFC_StatusTypeDef status = NFC_SUCCESS;
	uint16_t offset = byteOffset;
	if (byteLength > mMaxReadBytes) {
		do {
			status = mDevice.ReadBinary(offset, mMaxReadBytes, buffer);
			offset += mMaxReadBytes;
			buffer += mMaxReadBytes;
			byteLength -= mMaxReadBytes;
		} while (byteLength > mMaxWriteBytes && status == NFC_SUCCESS);
	} //if
	  //finish to write the buffer
	if (status == NFC_SUCCESS && mMaxWriteBytes)
		status = mDevice.ReadBinary(offset, byteLength, buffer);

	return status == NFC_SUCCESS;
}