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:59:31 2015 +0000
Revision:
1:1d246e0872c6
Parent:
0:07fa9c0dd549
Child:
2:9b0733b8fa95
Set license to Apache 2

Who changed what in which revision?

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