NFC API for mbed using the MicroNFCBoard as a peripheral

Dependents:   MicroNFCBoardAPI_P2P_Client MicroNFCBoardAPI_Blink MicroNFCBoardAPI_Tag_Emulator MicroNFCBoardAPI_Tag_Reader ... more

Committer:
AppNearMe
Date:
Fri Apr 24 12:57:23 2015 +0000
Revision:
0:07fa9c0dd549
Child:
1:1d246e0872c6
Initial commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
AppNearMe 0:07fa9c0dd549 1 /**
AppNearMe 0:07fa9c0dd549 2 * \file micronfcboard.cpp
AppNearMe 0:07fa9c0dd549 3 * \copyright Copyright (c) AppNearMe Ltd 2015
AppNearMe 0:07fa9c0dd549 4 * \author Donatien Garnier
AppNearMe 0:07fa9c0dd549 5 */
AppNearMe 0:07fa9c0dd549 6
AppNearMe 0:07fa9c0dd549 7 #include "micronfcboard.h"
AppNearMe 0:07fa9c0dd549 8
AppNearMe 0:07fa9c0dd549 9 #define STATUS_POLLING (1 << 0)
AppNearMe 0:07fa9c0dd549 10 #define STATUS_CONNECTED (1 << 1)
AppNearMe 0:07fa9c0dd549 11 #define STATUS_NDEF_PRESENT (1 << 2)
AppNearMe 0:07fa9c0dd549 12 #define STATUS_NDEF_READABLE (1 << 3)
AppNearMe 0:07fa9c0dd549 13 #define STATUS_NDEF_WRITEABLE (1 << 4)
AppNearMe 0:07fa9c0dd549 14 #define STATUS_NDEF_BUSY (1 << 5)
AppNearMe 0:07fa9c0dd549 15 #define STATUS_NDEF_SUCCESS (1 << 6)
AppNearMe 0:07fa9c0dd549 16
AppNearMe 0:07fa9c0dd549 17 #define STATUS_TYPE_MASK (0xFF << 8)
AppNearMe 0:07fa9c0dd549 18 #define STATUS_TYPE2 (2 << 8)
AppNearMe 0:07fa9c0dd549 19 #define STATUS_P2P (8 << 8)
AppNearMe 0:07fa9c0dd549 20
AppNearMe 0:07fa9c0dd549 21 #define RECORD_URI 1
AppNearMe 0:07fa9c0dd549 22 #define RECORD_TEXT 2
AppNearMe 0:07fa9c0dd549 23 #define RECORD_SP 3
AppNearMe 0:07fa9c0dd549 24
AppNearMe 0:07fa9c0dd549 25 MicroNFCBoard::MicroNFCBoard(PinName mosi, PinName miso, PinName sck, PinName cs, PinName irq) : _transport(mosi, miso, sck, cs, irq)
AppNearMe 0:07fa9c0dd549 26 {
AppNearMe 0:07fa9c0dd549 27
AppNearMe 0:07fa9c0dd549 28 }
AppNearMe 0:07fa9c0dd549 29
AppNearMe 0:07fa9c0dd549 30 void MicroNFCBoard::init()
AppNearMe 0:07fa9c0dd549 31 {
AppNearMe 0:07fa9c0dd549 32 _transport.init();
AppNearMe 0:07fa9c0dd549 33 _status = _transport.status();
AppNearMe 0:07fa9c0dd549 34 }
AppNearMe 0:07fa9c0dd549 35
AppNearMe 0:07fa9c0dd549 36 void MicroNFCBoard::setLeds(bool led1, bool led2)
AppNearMe 0:07fa9c0dd549 37 {
AppNearMe 0:07fa9c0dd549 38 _transport.leds(led1, led2);
AppNearMe 0:07fa9c0dd549 39 }
AppNearMe 0:07fa9c0dd549 40
AppNearMe 0:07fa9c0dd549 41 void MicroNFCBoard::updateStatus()
AppNearMe 0:07fa9c0dd549 42 {
AppNearMe 0:07fa9c0dd549 43 if(_transport.statusChanged())
AppNearMe 0:07fa9c0dd549 44 {
AppNearMe 0:07fa9c0dd549 45 _status = _transport.status();
AppNearMe 0:07fa9c0dd549 46 }
AppNearMe 0:07fa9c0dd549 47 }
AppNearMe 0:07fa9c0dd549 48
AppNearMe 0:07fa9c0dd549 49 bool MicroNFCBoard::connected()
AppNearMe 0:07fa9c0dd549 50 {
AppNearMe 0:07fa9c0dd549 51 updateStatus();
AppNearMe 0:07fa9c0dd549 52 return _status & STATUS_CONNECTED;
AppNearMe 0:07fa9c0dd549 53 }
AppNearMe 0:07fa9c0dd549 54
AppNearMe 0:07fa9c0dd549 55 bool MicroNFCBoard::type2()
AppNearMe 0:07fa9c0dd549 56 {
AppNearMe 0:07fa9c0dd549 57 updateStatus();
AppNearMe 0:07fa9c0dd549 58 return (_status & STATUS_TYPE_MASK) == STATUS_TYPE2;
AppNearMe 0:07fa9c0dd549 59 }
AppNearMe 0:07fa9c0dd549 60
AppNearMe 0:07fa9c0dd549 61 bool MicroNFCBoard::p2p()
AppNearMe 0:07fa9c0dd549 62 {
AppNearMe 0:07fa9c0dd549 63 updateStatus();
AppNearMe 0:07fa9c0dd549 64 return (_status & STATUS_TYPE_MASK) == STATUS_P2P;
AppNearMe 0:07fa9c0dd549 65 }
AppNearMe 0:07fa9c0dd549 66
AppNearMe 0:07fa9c0dd549 67 bool MicroNFCBoard::polling()
AppNearMe 0:07fa9c0dd549 68 {
AppNearMe 0:07fa9c0dd549 69 updateStatus();
AppNearMe 0:07fa9c0dd549 70 return _status & STATUS_POLLING;
AppNearMe 0:07fa9c0dd549 71 }
AppNearMe 0:07fa9c0dd549 72
AppNearMe 0:07fa9c0dd549 73 bool MicroNFCBoard::ndefReadable()
AppNearMe 0:07fa9c0dd549 74 {
AppNearMe 0:07fa9c0dd549 75 updateStatus();
AppNearMe 0:07fa9c0dd549 76 return _status & STATUS_NDEF_READABLE;
AppNearMe 0:07fa9c0dd549 77 }
AppNearMe 0:07fa9c0dd549 78
AppNearMe 0:07fa9c0dd549 79 bool MicroNFCBoard::ndefWriteable()
AppNearMe 0:07fa9c0dd549 80 {
AppNearMe 0:07fa9c0dd549 81 updateStatus();
AppNearMe 0:07fa9c0dd549 82 return _status & STATUS_NDEF_WRITEABLE;
AppNearMe 0:07fa9c0dd549 83 }
AppNearMe 0:07fa9c0dd549 84
AppNearMe 0:07fa9c0dd549 85 bool MicroNFCBoard::ndefPresent()
AppNearMe 0:07fa9c0dd549 86 {
AppNearMe 0:07fa9c0dd549 87 updateStatus();
AppNearMe 0:07fa9c0dd549 88 return _status & STATUS_NDEF_PRESENT;
AppNearMe 0:07fa9c0dd549 89 }
AppNearMe 0:07fa9c0dd549 90
AppNearMe 0:07fa9c0dd549 91 bool MicroNFCBoard::ndefBusy()
AppNearMe 0:07fa9c0dd549 92 {
AppNearMe 0:07fa9c0dd549 93 updateStatus();
AppNearMe 0:07fa9c0dd549 94 return _status & STATUS_NDEF_BUSY;
AppNearMe 0:07fa9c0dd549 95 }
AppNearMe 0:07fa9c0dd549 96
AppNearMe 0:07fa9c0dd549 97 bool MicroNFCBoard::ndefSuccess()
AppNearMe 0:07fa9c0dd549 98 {
AppNearMe 0:07fa9c0dd549 99 updateStatus();
AppNearMe 0:07fa9c0dd549 100 return _status & STATUS_NDEF_SUCCESS;
AppNearMe 0:07fa9c0dd549 101 }
AppNearMe 0:07fa9c0dd549 102
AppNearMe 0:07fa9c0dd549 103 void MicroNFCBoard::startPolling()
AppNearMe 0:07fa9c0dd549 104 {
AppNearMe 0:07fa9c0dd549 105 _transport.nfcPoll(true);
AppNearMe 0:07fa9c0dd549 106 }
AppNearMe 0:07fa9c0dd549 107
AppNearMe 0:07fa9c0dd549 108 void MicroNFCBoard::stopPolling()
AppNearMe 0:07fa9c0dd549 109 {
AppNearMe 0:07fa9c0dd549 110 _transport.nfcPoll(false);
AppNearMe 0:07fa9c0dd549 111 }
AppNearMe 0:07fa9c0dd549 112
AppNearMe 0:07fa9c0dd549 113 void MicroNFCBoard::ndefRead()
AppNearMe 0:07fa9c0dd549 114 {
AppNearMe 0:07fa9c0dd549 115 _transport.nfcOperation(true, false);
AppNearMe 0:07fa9c0dd549 116 }
AppNearMe 0:07fa9c0dd549 117
AppNearMe 0:07fa9c0dd549 118 void MicroNFCBoard::ndefWrite()
AppNearMe 0:07fa9c0dd549 119 {
AppNearMe 0:07fa9c0dd549 120 _transport.nfcOperation(false, true);
AppNearMe 0:07fa9c0dd549 121 }
AppNearMe 0:07fa9c0dd549 122
AppNearMe 0:07fa9c0dd549 123 bool MicroNFCBoard::readNdefUri(char* uri, size_t maxUriLength)
AppNearMe 0:07fa9c0dd549 124 {
AppNearMe 0:07fa9c0dd549 125 if(!ndefPresent())
AppNearMe 0:07fa9c0dd549 126 {
AppNearMe 0:07fa9c0dd549 127 return false;
AppNearMe 0:07fa9c0dd549 128 }
AppNearMe 0:07fa9c0dd549 129
AppNearMe 0:07fa9c0dd549 130 size_t recordCount = 0;
AppNearMe 0:07fa9c0dd549 131 _transport.nfcGetMessageInfo(&recordCount);
AppNearMe 0:07fa9c0dd549 132
AppNearMe 0:07fa9c0dd549 133
AppNearMe 0:07fa9c0dd549 134 size_t recordNumber = 0;
AppNearMe 0:07fa9c0dd549 135 uint16_t info[4];
AppNearMe 0:07fa9c0dd549 136 uint16_t type;
AppNearMe 0:07fa9c0dd549 137 size_t infoCount = 4;
AppNearMe 0:07fa9c0dd549 138
AppNearMe 0:07fa9c0dd549 139 for(recordNumber = 0; recordNumber < recordCount; recordNumber++)
AppNearMe 0:07fa9c0dd549 140 {
AppNearMe 0:07fa9c0dd549 141 _transport.nfcGetRecordInfo(recordNumber, &type, info, infoCount);
AppNearMe 0:07fa9c0dd549 142 if(type == RECORD_URI)
AppNearMe 0:07fa9c0dd549 143 {
AppNearMe 0:07fa9c0dd549 144 break;
AppNearMe 0:07fa9c0dd549 145 }
AppNearMe 0:07fa9c0dd549 146 if(type == RECORD_SP)
AppNearMe 0:07fa9c0dd549 147 {
AppNearMe 0:07fa9c0dd549 148 recordCount += info[1];
AppNearMe 0:07fa9c0dd549 149 }
AppNearMe 0:07fa9c0dd549 150 }
AppNearMe 0:07fa9c0dd549 151 if(recordNumber == recordCount)
AppNearMe 0:07fa9c0dd549 152 {
AppNearMe 0:07fa9c0dd549 153 return false;
AppNearMe 0:07fa9c0dd549 154 }
AppNearMe 0:07fa9c0dd549 155
AppNearMe 0:07fa9c0dd549 156 //Recover prefix
AppNearMe 0:07fa9c0dd549 157 size_t length = maxUriLength - 1;
AppNearMe 0:07fa9c0dd549 158 _transport.nfcDecodePrefix(info[0], uri, &length);
AppNearMe 0:07fa9c0dd549 159
AppNearMe 0:07fa9c0dd549 160 maxUriLength -= length;
AppNearMe 0:07fa9c0dd549 161 uri += length;
AppNearMe 0:07fa9c0dd549 162
AppNearMe 0:07fa9c0dd549 163 if(maxUriLength <= 1)
AppNearMe 0:07fa9c0dd549 164 {
AppNearMe 0:07fa9c0dd549 165 return false;
AppNearMe 0:07fa9c0dd549 166 }
AppNearMe 0:07fa9c0dd549 167
AppNearMe 0:07fa9c0dd549 168 length = info[1];
AppNearMe 0:07fa9c0dd549 169 if(length > maxUriLength - 1)
AppNearMe 0:07fa9c0dd549 170 {
AppNearMe 0:07fa9c0dd549 171 return false;
AppNearMe 0:07fa9c0dd549 172 }
AppNearMe 0:07fa9c0dd549 173
AppNearMe 0:07fa9c0dd549 174 size_t off = 0;
AppNearMe 0:07fa9c0dd549 175 while(length > 0)
AppNearMe 0:07fa9c0dd549 176 {
AppNearMe 0:07fa9c0dd549 177 size_t cpyLength = length;
AppNearMe 0:07fa9c0dd549 178 if(cpyLength > 32)
AppNearMe 0:07fa9c0dd549 179 {
AppNearMe 0:07fa9c0dd549 180 cpyLength = 32;
AppNearMe 0:07fa9c0dd549 181 }
AppNearMe 0:07fa9c0dd549 182 _transport.nfcGetRecordData(recordNumber, 0, off, (uint8_t*)uri, cpyLength);
AppNearMe 0:07fa9c0dd549 183 length -= cpyLength;
AppNearMe 0:07fa9c0dd549 184 off += cpyLength;
AppNearMe 0:07fa9c0dd549 185 uri += cpyLength;
AppNearMe 0:07fa9c0dd549 186 }
AppNearMe 0:07fa9c0dd549 187
AppNearMe 0:07fa9c0dd549 188 uri[0] = '\0';
AppNearMe 0:07fa9c0dd549 189
AppNearMe 0:07fa9c0dd549 190 return true;
AppNearMe 0:07fa9c0dd549 191 }
AppNearMe 0:07fa9c0dd549 192
AppNearMe 0:07fa9c0dd549 193 bool MicroNFCBoard::readNdefText(char* text, size_t maxTextLength)
AppNearMe 0:07fa9c0dd549 194 {
AppNearMe 0:07fa9c0dd549 195 if(!ndefPresent())
AppNearMe 0:07fa9c0dd549 196 {
AppNearMe 0:07fa9c0dd549 197 return false;
AppNearMe 0:07fa9c0dd549 198 }
AppNearMe 0:07fa9c0dd549 199
AppNearMe 0:07fa9c0dd549 200 size_t recordCount = 0;
AppNearMe 0:07fa9c0dd549 201 _transport.nfcGetMessageInfo(&recordCount);
AppNearMe 0:07fa9c0dd549 202
AppNearMe 0:07fa9c0dd549 203
AppNearMe 0:07fa9c0dd549 204 size_t recordNumber = 0;
AppNearMe 0:07fa9c0dd549 205 uint16_t info[4];
AppNearMe 0:07fa9c0dd549 206 uint16_t type;
AppNearMe 0:07fa9c0dd549 207 size_t infoCount = 4;
AppNearMe 0:07fa9c0dd549 208
AppNearMe 0:07fa9c0dd549 209 for(recordNumber = 0; recordNumber < recordCount; recordNumber++)
AppNearMe 0:07fa9c0dd549 210 {
AppNearMe 0:07fa9c0dd549 211 _transport.nfcGetRecordInfo(recordNumber, &type, info, infoCount);
AppNearMe 0:07fa9c0dd549 212 if(type == RECORD_TEXT)
AppNearMe 0:07fa9c0dd549 213 {
AppNearMe 0:07fa9c0dd549 214 break;
AppNearMe 0:07fa9c0dd549 215 }
AppNearMe 0:07fa9c0dd549 216 if(type == RECORD_SP)
AppNearMe 0:07fa9c0dd549 217 {
AppNearMe 0:07fa9c0dd549 218 recordCount += info[1];
AppNearMe 0:07fa9c0dd549 219 }
AppNearMe 0:07fa9c0dd549 220 }
AppNearMe 0:07fa9c0dd549 221 if(recordNumber == recordCount)
AppNearMe 0:07fa9c0dd549 222 {
AppNearMe 0:07fa9c0dd549 223 return false;
AppNearMe 0:07fa9c0dd549 224 }
AppNearMe 0:07fa9c0dd549 225
AppNearMe 0:07fa9c0dd549 226 size_t length = info[2];
AppNearMe 0:07fa9c0dd549 227 if(length > maxTextLength - 1)
AppNearMe 0:07fa9c0dd549 228 {
AppNearMe 0:07fa9c0dd549 229 return false;
AppNearMe 0:07fa9c0dd549 230 }
AppNearMe 0:07fa9c0dd549 231
AppNearMe 0:07fa9c0dd549 232 size_t off = 0;
AppNearMe 0:07fa9c0dd549 233 while(length > 0)
AppNearMe 0:07fa9c0dd549 234 {
AppNearMe 0:07fa9c0dd549 235 size_t cpyLength = length;
AppNearMe 0:07fa9c0dd549 236 if(cpyLength > 32)
AppNearMe 0:07fa9c0dd549 237 {
AppNearMe 0:07fa9c0dd549 238 cpyLength = 32;
AppNearMe 0:07fa9c0dd549 239 }
AppNearMe 0:07fa9c0dd549 240 _transport.nfcGetRecordData(recordNumber, 1, off, (uint8_t*)text, cpyLength);
AppNearMe 0:07fa9c0dd549 241 length -= cpyLength;
AppNearMe 0:07fa9c0dd549 242 off += cpyLength;
AppNearMe 0:07fa9c0dd549 243 text += cpyLength;
AppNearMe 0:07fa9c0dd549 244 }
AppNearMe 0:07fa9c0dd549 245
AppNearMe 0:07fa9c0dd549 246 text[0] = '\0';
AppNearMe 0:07fa9c0dd549 247
AppNearMe 0:07fa9c0dd549 248 return true;
AppNearMe 0:07fa9c0dd549 249 }
AppNearMe 0:07fa9c0dd549 250
AppNearMe 0:07fa9c0dd549 251
AppNearMe 0:07fa9c0dd549 252