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
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;
}
