1 /* 2 * Copyright (C) 2012 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 /* 18 * Tag-reading, tag-writing operations. 19 */ 20 21 #pragma once 22 #include "SyncEvent.h" 23 #include "NfcJniUtil.h" 24 #include <vector> 25 extern "C" 26 { 27 #include "nfa_rw_api.h" 28 } 29 30 31 class NfcTag 32 { 33 public: 34 enum ActivationState {Idle, Sleep, Active}; 35 static const int MAX_NUM_TECHNOLOGY = 11; //max number of technologies supported by one or more tags 36 int mTechList [MAX_NUM_TECHNOLOGY]; //array of NFC technologies according to NFC service 37 int mTechHandles [MAX_NUM_TECHNOLOGY]; //array of tag handles according to NFC service 38 int mTechLibNfcTypes [MAX_NUM_TECHNOLOGY]; //array of detailed tag types according to NFC service 39 int mNumTechList; //current number of NFC technologies in the list 40 41 /******************************************************************************* 42 ** 43 ** Function: NfcTag 44 ** 45 ** Description: Initialize member variables. 46 ** 47 ** Returns: None 48 ** 49 *******************************************************************************/ 50 NfcTag (); 51 52 53 /******************************************************************************* 54 ** 55 ** Function: getInstance 56 ** 57 ** Description: Get a reference to the singleton NfcTag object. 58 ** 59 ** Returns: Reference to NfcTag object. 60 ** 61 *******************************************************************************/ 62 static NfcTag& getInstance (); 63 64 65 /******************************************************************************* 66 ** 67 ** Function: initialize 68 ** 69 ** Description: Reset member variables. 70 ** native: Native data. 71 ** Returns: None 72 ** 73 *******************************************************************************/ 74 void initialize (nfc_jni_native_data* native); 75 76 77 /******************************************************************************* 78 ** 79 ** Function: abort 80 ** 81 ** Description: Unblock all operations. 82 ** 83 ** Returns: None 84 ** 85 *******************************************************************************/ 86 void abort (); 87 88 89 /******************************************************************************* 90 ** 91 ** Function: connectionEventHandler 92 ** 93 ** Description: Handle connection-related events. 94 ** event: event code. 95 ** data: pointer to event data. 96 ** 97 ** Returns: None 98 ** 99 *******************************************************************************/ 100 void connectionEventHandler (UINT8 event, tNFA_CONN_EVT_DATA* data); 101 102 103 /******************************************************************************* 104 ** 105 ** Function: isActivated 106 ** 107 ** Description: Is tag activated? 108 ** 109 ** Returns: True if tag is activated. 110 ** 111 *******************************************************************************/ 112 bool isActivated (); 113 114 115 /******************************************************************************* 116 ** 117 ** Function: getActivationState 118 ** 119 ** Description: What is the current state: Idle, Sleep, or Activated. 120 ** 121 ** Returns: Idle, Sleep, or Activated. 122 ** 123 *******************************************************************************/ 124 ActivationState getActivationState (); 125 126 127 /******************************************************************************* 128 ** 129 ** Function: setDeactivationState 130 ** 131 ** Description: Set the current state: Idle or Sleep. 132 ** deactivated: state of deactivation. 133 ** 134 ** Returns: None. 135 ** 136 *******************************************************************************/ 137 void setDeactivationState (tNFA_DEACTIVATED& deactivated); 138 139 140 /******************************************************************************* 141 ** 142 ** Function: setActivationState 143 ** 144 ** Description: Set the current state to Active. 145 ** 146 ** Returns: None. 147 ** 148 *******************************************************************************/ 149 void setActivationState (); 150 151 /******************************************************************************* 152 ** 153 ** Function: getProtocol 154 ** 155 ** Description: Get the protocol of the current tag. 156 ** 157 ** Returns: Protocol number. 158 ** 159 *******************************************************************************/ 160 tNFC_PROTOCOL getProtocol (); 161 162 163 /******************************************************************************* 164 ** 165 ** Function: isP2pDiscovered 166 ** 167 ** Description: Does the peer support P2P? 168 ** 169 ** Returns: True if the peer supports P2P. 170 ** 171 *******************************************************************************/ 172 bool isP2pDiscovered (); 173 174 175 /******************************************************************************* 176 ** 177 ** Function: selectP2p 178 ** 179 ** Description: Select the preferred P2P technology if there is a choice. 180 ** 181 ** Returns: None 182 ** 183 *******************************************************************************/ 184 void selectP2p (); 185 186 187 /******************************************************************************* 188 ** 189 ** Function: selectFirstTag 190 ** 191 ** Description: When multiple tags are discovered, just select the first one to activate. 192 ** 193 ** Returns: None 194 ** 195 *******************************************************************************/ 196 void selectFirstTag (); 197 198 199 /******************************************************************************* 200 ** 201 ** Function: getT1tMaxMessageSize 202 ** 203 ** Description: Get the maximum size (octet) that a T1T can store. 204 ** 205 ** Returns: Maximum size in octets. 206 ** 207 *******************************************************************************/ 208 int getT1tMaxMessageSize (); 209 210 211 /******************************************************************************* 212 ** 213 ** Function: isMifareUltralight 214 ** 215 ** Description: Whether the currently activated tag is Mifare Ultralight. 216 ** 217 ** Returns: True if tag is Mifare Ultralight. 218 ** 219 *******************************************************************************/ 220 bool isMifareUltralight (); 221 222 223 /******************************************************************************* 224 ** 225 ** Function: isFelicaLite 226 ** 227 ** Description: Whether the currently activated tag is Felica Lite. 228 ** 229 ** Returns: True if tag is Felica Lite. 230 ** 231 *******************************************************************************/ 232 bool isFelicaLite (); 233 234 235 /******************************************************************************* 236 ** 237 ** Function: isT2tNackResponse 238 ** 239 ** Description: Whether the response is a T2T NACK response. 240 ** See NFC Digital Protocol Technical Specification (2010-11-17). 241 ** Chapter 9 (Type 2 Tag Platform), section 9.6 (READ). 242 ** response: buffer contains T2T response. 243 ** responseLen: length of the response. 244 ** 245 ** Returns: True if the response is NACK 246 ** 247 *******************************************************************************/ 248 bool isT2tNackResponse (const UINT8* response, UINT32 responseLen); 249 250 /******************************************************************************* 251 ** 252 ** Function: isNdefDetectionTimedOut 253 ** 254 ** Description: Whether NDEF-detection algorithm has timed out. 255 ** 256 ** Returns: True if NDEF-detection algorithm timed out. 257 ** 258 *******************************************************************************/ 259 bool isNdefDetectionTimedOut (); 260 261 262 /******************************************************************************* 263 ** 264 ** Function setActive 265 ** 266 ** Description Sets the active state for the object 267 ** 268 ** Returns None. 269 ** 270 *******************************************************************************/ 271 void setActive(bool active); 272 273 /******************************************************************************* 274 ** 275 ** Function: isDynamicTagId 276 ** 277 ** Description: Whether a tag has a dynamic tag ID. 278 ** 279 ** Returns: True if ID is dynamic. 280 ** 281 *******************************************************************************/ 282 bool isDynamicTagId (); 283 284 285 /******************************************************************************* 286 ** 287 ** Function: resetAllTransceiveTimeouts 288 ** 289 ** Description: Reset all timeouts for all technologies to default values. 290 ** 291 ** Returns: none 292 ** 293 *******************************************************************************/ 294 void resetAllTransceiveTimeouts (); 295 296 297 /******************************************************************************* 298 ** 299 ** Function: isDefaultTransceiveTimeout 300 ** 301 ** Description: Is the timeout value for a technology the default value? 302 ** techId: one of the values in TARGET_TYPE_* defined in NfcJniUtil.h. 303 ** timeout: Check this value against the default value. 304 ** 305 ** Returns: True if timeout is equal to the default value. 306 ** 307 *******************************************************************************/ 308 bool isDefaultTransceiveTimeout (int techId, int timeout); 309 310 311 /******************************************************************************* 312 ** 313 ** Function: getTransceiveTimeout 314 ** 315 ** Description: Get the timeout value for one technology. 316 ** techId: one of the values in TARGET_TYPE_* defined in NfcJniUtil.h 317 ** 318 ** Returns: Timeout value in millisecond. 319 ** 320 *******************************************************************************/ 321 int getTransceiveTimeout (int techId); 322 323 324 /******************************************************************************* 325 ** 326 ** Function: setTransceiveTimeout 327 ** 328 ** Description: Set the timeout value for one technology. 329 ** techId: one of the values in TARGET_TYPE_* defined in NfcJniUtil.h 330 ** timeout: timeout value in millisecond. 331 ** 332 ** Returns: Timeout value. 333 ** 334 *******************************************************************************/ 335 void setTransceiveTimeout (int techId, int timeout); 336 337 338 /******************************************************************************* 339 ** 340 ** Function: getPresenceCheckAlgorithm 341 ** 342 ** Description: Get presence-check algorithm from .conf file. 343 ** 344 ** Returns: Presence-check algorithm. 345 ** 346 *******************************************************************************/ 347 tNFA_RW_PRES_CHK_OPTION getPresenceCheckAlgorithm (); 348 349 350 /******************************************************************************* 351 ** 352 ** Function: isInfineonMyDMove 353 ** 354 ** Description: Whether the currently activated tag is Infineon My-D Move. 355 ** 356 ** Returns: True if tag is Infineon My-D Move. 357 ** 358 *******************************************************************************/ 359 bool isInfineonMyDMove (); 360 361 362 /******************************************************************************* 363 ** 364 ** Function: isKovioType2Tag 365 ** 366 ** Description: Whether the currently activated tag is Kovio 2Kb RFID tag. 367 ** It is a NFC Forum type-2 tag. 368 ** 369 ** Returns: True if tag is Kovio 2Kb RFID tag. 370 ** 371 *******************************************************************************/ 372 bool isKovioType2Tag (); 373 374 375 private: 376 std::vector<int> mTechnologyTimeoutsTable; 377 std::vector<int> mTechnologyDefaultTimeoutsTable; 378 nfc_jni_native_data* mNativeData; 379 bool mIsActivated; 380 ActivationState mActivationState; 381 tNFC_PROTOCOL mProtocol; 382 int mtT1tMaxMessageSize; //T1T max NDEF message size 383 tNFA_STATUS mReadCompletedStatus; 384 int mLastKovioUidLen; // len of uid of last Kovio tag activated 385 bool mNdefDetectionTimedOut; // whether NDEF detection algorithm timed out 386 tNFC_RF_TECH_PARAMS mTechParams [MAX_NUM_TECHNOLOGY]; //array of technology parameters 387 SyncEvent mReadCompleteEvent; 388 struct timespec mLastKovioTime; // time of last Kovio tag activation 389 UINT8 mLastKovioUid[NFC_KOVIO_MAX_LEN]; // uid of last Kovio tag activated 390 bool mIsDynamicTagId; // whether the tag has dynamic tag ID 391 tNFA_RW_PRES_CHK_OPTION mPresenceCheckAlgorithm; 392 bool mIsFelicaLite; 393 394 /******************************************************************************* 395 ** 396 ** Function: IsSameKovio 397 ** 398 ** Description: Checks if tag activate is the same (UID) Kovio tag previously 399 ** activated. This is needed due to a problem with some Kovio 400 ** tags re-activating multiple times. 401 ** activationData: data from activation. 402 ** 403 ** Returns: true if the activation is from the same tag previously 404 ** activated, false otherwise 405 ** 406 *******************************************************************************/ 407 bool IsSameKovio(tNFA_ACTIVATED& activationData); 408 409 /******************************************************************************* 410 ** 411 ** Function: discoverTechnologies 412 ** 413 ** Description: Discover the technologies that NFC service needs by interpreting 414 ** the data strucutures from the stack. 415 ** activationData: data from activation. 416 ** 417 ** Returns: None 418 ** 419 *******************************************************************************/ 420 void discoverTechnologies (tNFA_ACTIVATED& activationData); 421 422 423 /******************************************************************************* 424 ** 425 ** Function: discoverTechnologies 426 ** 427 ** Description: Discover the technologies that NFC service needs by interpreting 428 ** the data strucutures from the stack. 429 ** discoveryData: data from discovery events(s). 430 ** 431 ** Returns: None 432 ** 433 *******************************************************************************/ 434 void discoverTechnologies (tNFA_DISC_RESULT& discoveryData); 435 436 437 /******************************************************************************* 438 ** 439 ** Function: createNativeNfcTag 440 ** 441 ** Description: Create a brand new Java NativeNfcTag object; 442 ** fill the objects's member variables with data; 443 ** notify NFC service; 444 ** activationData: data from activation. 445 ** 446 ** Returns: None 447 ** 448 *******************************************************************************/ 449 void createNativeNfcTag (tNFA_ACTIVATED& activationData); 450 451 452 /******************************************************************************* 453 ** 454 ** Function: fillNativeNfcTagMembers1 455 ** 456 ** Description: Fill NativeNfcTag's members: mProtocols, mTechList, mTechHandles, mTechLibNfcTypes. 457 ** e: JVM environment. 458 ** tag_cls: Java NativeNfcTag class. 459 ** tag: Java NativeNfcTag object. 460 ** 461 ** Returns: None 462 ** 463 *******************************************************************************/ 464 void fillNativeNfcTagMembers1 (JNIEnv* e, jclass tag_cls, jobject tag); 465 466 467 /******************************************************************************* 468 ** 469 ** Function: fillNativeNfcTagMembers2 470 ** 471 ** Description: Fill NativeNfcTag's members: mConnectedTechIndex or mConnectedTechnology. 472 ** The original Google's implementation is in set_target_pollBytes( 473 ** in com_android_nfc_NativeNfcTag.cpp; 474 ** e: JVM environment. 475 ** tag_cls: Java NativeNfcTag class. 476 ** tag: Java NativeNfcTag object. 477 ** activationData: data from activation. 478 ** 479 ** Returns: None 480 ** 481 *******************************************************************************/ 482 void fillNativeNfcTagMembers2 (JNIEnv* e, jclass tag_cls, jobject tag, tNFA_ACTIVATED& activationData); 483 484 485 /******************************************************************************* 486 ** 487 ** Function: fillNativeNfcTagMembers3 488 ** 489 ** Description: Fill NativeNfcTag's members: mTechPollBytes. 490 ** The original Google's implementation is in set_target_pollBytes( 491 ** in com_android_nfc_NativeNfcTag.cpp; 492 ** e: JVM environment. 493 ** tag_cls: Java NativeNfcTag class. 494 ** tag: Java NativeNfcTag object. 495 ** activationData: data from activation. 496 ** 497 ** Returns: None 498 ** 499 *******************************************************************************/ 500 void fillNativeNfcTagMembers3 (JNIEnv* e, jclass tag_cls, jobject tag, tNFA_ACTIVATED& activationData); 501 502 503 /******************************************************************************* 504 ** 505 ** Function: fillNativeNfcTagMembers4 506 ** 507 ** Description: Fill NativeNfcTag's members: mTechActBytes. 508 ** The original Google's implementation is in set_target_activationBytes() 509 ** in com_android_nfc_NativeNfcTag.cpp; 510 ** e: JVM environment. 511 ** tag_cls: Java NativeNfcTag class. 512 ** tag: Java NativeNfcTag object. 513 ** activationData: data from activation. 514 ** 515 ** Returns: None 516 ** 517 *******************************************************************************/ 518 void fillNativeNfcTagMembers4 (JNIEnv* e, jclass tag_cls, jobject tag, tNFA_ACTIVATED& activationData); 519 520 521 /******************************************************************************* 522 ** 523 ** Function: fillNativeNfcTagMembers5 524 ** 525 ** Description: Fill NativeNfcTag's members: mUid. 526 ** The original Google's implementation is in nfc_jni_Discovery_notification_callback() 527 ** in com_android_nfc_NativeNfcManager.cpp; 528 ** e: JVM environment. 529 ** tag_cls: Java NativeNfcTag class. 530 ** tag: Java NativeNfcTag object. 531 ** activationData: data from activation. 532 ** 533 ** Returns: None 534 ** 535 *******************************************************************************/ 536 void fillNativeNfcTagMembers5 (JNIEnv* e, jclass tag_cls, jobject tag, tNFA_ACTIVATED& activationData); 537 538 539 /******************************************************************************* 540 ** 541 ** Function: resetTechnologies 542 ** 543 ** Description: Clear all data related to the technology, protocol of the tag. 544 ** 545 ** Returns: None 546 ** 547 *******************************************************************************/ 548 void resetTechnologies (); 549 550 551 /******************************************************************************* 552 ** 553 ** Function: calculateT1tMaxMessageSize 554 ** 555 ** Description: Calculate type-1 tag's max message size based on header ROM bytes. 556 ** activate: reference to activation data. 557 ** 558 ** Returns: None 559 ** 560 *******************************************************************************/ 561 void calculateT1tMaxMessageSize (tNFA_ACTIVATED& activate); 562 }; 563 564