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-11-19
Revision:
0:674813bd5ec9
Child:
1:6d202b62ed68

File content as of revision 0:674813bd5ec9:

/*
 * 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(mSessionIsOpen)
		return true;
	//else
	if(force)
		mDevice.KillSession();


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

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

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

	if(mDevice.SelectCCfile()!=NFC_OK)
		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_OK)
		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_OK)
		return false;

	mSessionIsOpen=true;
	return true;
}


bool Type4NfcTagSTM24SR::closeSession(){

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

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

	mSessionIsOpen=false;
	return true;
}

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

	NFC_StatusTypeDef status=NFC_OK;
	uint16_t offset=0;
	bool prevSessionStatus = mSessionIsOpen;
	if(!prevSessionStatus){
		//try to acquire a session or fail
		if(openSession(false))
			return false;
	}//if

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

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

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

}