NFC API for mbed using the MicroNFCBoard as a peripheral
Dependents: MicroNFCBoardAPI_P2P_Client MicroNFCBoardAPI_Blink MicroNFCBoardAPI_Tag_Emulator MicroNFCBoardAPI_Tag_Reader ... more
Diff: micronfcboard.cpp
- Revision:
- 2:9b0733b8fa95
- Parent:
- 1:1d246e0872c6
--- a/micronfcboard.cpp Fri Apr 24 12:59:31 2015 +0000
+++ b/micronfcboard.cpp Thu May 14 16:41:27 2015 +0000
@@ -26,9 +26,12 @@
#define STATUS_NDEF_BUSY (1 << 5)
#define STATUS_NDEF_SUCCESS (1 << 6)
-#define STATUS_TYPE_MASK (0xFF << 8)
-#define STATUS_TYPE2 (2 << 8)
-#define STATUS_P2P (8 << 8)
+#define STATUS_TYPE_MASK (0xFFUL << 8)
+#define STATUS_TYPE2 (2UL << 8)
+#define STATUS_TYPE4 (4UL << 8)
+#define STATUS_P2P (8UL << 8)
+
+#define STATUS_INITIATOR (1UL << 16)
#define RECORD_URI 1
#define RECORD_TEXT 2
@@ -64,10 +67,16 @@
return _status & STATUS_CONNECTED;
}
-bool MicroNFCBoard::type2()
+bool MicroNFCBoard::type2Tag()
{
updateStatus();
- return (_status & STATUS_TYPE_MASK) == STATUS_TYPE2;
+ return ((_status & STATUS_TYPE_MASK) == STATUS_TYPE2) && (_status & STATUS_INITIATOR);
+}
+
+bool MicroNFCBoard::type4Emulator()
+{
+ updateStatus();
+ return ((_status & STATUS_TYPE_MASK) == STATUS_TYPE4) && !(_status & STATUS_INITIATOR);
}
bool MicroNFCBoard::p2p()
@@ -112,14 +121,14 @@
return _status & STATUS_NDEF_SUCCESS;
}
-void MicroNFCBoard::startPolling()
+void MicroNFCBoard::startPolling(bool readerWriter, bool emulator, bool p2p)
{
- _transport.nfcPoll(true);
+ _transport.nfcPoll(readerWriter, emulator, p2p);
}
void MicroNFCBoard::stopPolling()
{
- _transport.nfcPoll(false);
+ _transport.nfcPoll(false, false, false);
}
void MicroNFCBoard::ndefRead()
@@ -142,7 +151,6 @@
size_t recordCount = 0;
_transport.nfcGetMessageInfo(&recordCount);
-
size_t recordNumber = 0;
uint16_t info[4];
uint16_t type;
@@ -260,5 +268,91 @@
return true;
}
+void MicroNFCBoard::writeNdefUri(const char* uri)
+{
+ _transport.nfcPrepareMessage(true, false);
+
+ size_t uriPrefixLength = strlen(uri);
+ if( uriPrefixLength > 36 )
+ {
+ uriPrefixLength = 36;
+ }
+
+ uint8_t prefix = 0;
+
+ _transport.nfcEncodePrefix(&prefix, uri, &uriPrefixLength);
+
+ if( uriPrefixLength > strlen(uri) )
+ {
+ uriPrefixLength = 0;
+ }
+
+ size_t uriLength = strlen(uri) - uriPrefixLength;
+ uri += uriPrefixLength;
+
+ const uint16_t info[] = {prefix, uriLength};
+ _transport.nfcSetRecordInfo(0, RECORD_URI, info, 2);
+
+ _transport.nfcSetMessageInfo(1);
+ _transport.nfcPrepareMessage(false, true);
+
+ size_t off = 0;
+ while(uriLength > 0)
+ {
+ size_t cpyLength = uriLength;
+ if(cpyLength > 32)
+ {
+ cpyLength = 32;
+ }
+ _transport.nfcSetRecordData(0, 0, off, (uint8_t*)uri, cpyLength);
+ uriLength -= cpyLength;
+ off += cpyLength;
+ uri += cpyLength;
+ }
+}
+
+void MicroNFCBoard::writeNdefText(const char* lang, const char* text)
+{
+ _transport.nfcPrepareMessage(true, false);
+
+ size_t langLength = strlen(lang);
+ size_t textLength = strlen(text);
+
+ const uint16_t info[] = {0 /* UTF-8 */, langLength, textLength};
+ _transport.nfcSetRecordInfo(0, RECORD_TEXT, info, 3);
+
+ _transport.nfcSetMessageInfo(1);
+ _transport.nfcPrepareMessage(false, true);
+
+ size_t off = 0;
+ while(langLength > 0)
+ {
+ size_t cpyLength = langLength;
+ if(cpyLength > 32)
+ {
+ cpyLength = 32;
+ }
+ _transport.nfcSetRecordData(0, 0, off, (uint8_t*)lang, cpyLength);
+ langLength -= cpyLength;
+ off += cpyLength;
+ lang += cpyLength;
+ }
+
+ off = 0;
+ while(textLength > 0)
+ {
+ size_t cpyLength = textLength;
+ if(cpyLength > 32)
+ {
+ cpyLength = 32;
+ }
+ _transport.nfcSetRecordData(0, 1, off, (uint8_t*)text, cpyLength);
+ textLength -= cpyLength;
+ off += cpyLength;
+ text += cpyLength;
+ }
+
+}
+