Home | History | Annotate | Download | only in jni
      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_t 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:        isMifareDESFire
    226     **
    227     ** Description:     Whether the currently activated tag is Mifare DESFire.
    228     **
    229     ** Returns:         True if tag is Mifare DESFire.
    230     **
    231     *******************************************************************************/
    232     bool isMifareDESFire ();
    233 
    234 
    235     /*******************************************************************************
    236     **
    237     ** Function:        isFelicaLite
    238     **
    239     ** Description:     Whether the currently activated tag is Felica Lite.
    240     **
    241     ** Returns:         True if tag is Felica Lite.
    242     **
    243     *******************************************************************************/
    244     bool isFelicaLite ();
    245 
    246 
    247     /*******************************************************************************
    248     **
    249     ** Function:        isT2tNackResponse
    250     **
    251     ** Description:     Whether the response is a T2T NACK response.
    252     **                  See NFC Digital Protocol Technical Specification (2010-11-17).
    253     **                  Chapter 9 (Type 2 Tag Platform), section 9.6 (READ).
    254     **                  response: buffer contains T2T response.
    255     **                  responseLen: length of the response.
    256     **
    257     ** Returns:         True if the response is NACK
    258     **
    259     *******************************************************************************/
    260     bool isT2tNackResponse (const uint8_t* response, uint32_t responseLen);
    261 
    262     /*******************************************************************************
    263     **
    264     ** Function:        isNdefDetectionTimedOut
    265     **
    266     ** Description:     Whether NDEF-detection algorithm has timed out.
    267     **
    268     ** Returns:         True if NDEF-detection algorithm timed out.
    269     **
    270     *******************************************************************************/
    271     bool isNdefDetectionTimedOut ();
    272 
    273 
    274     /*******************************************************************************
    275     **
    276     ** Function         setActive
    277     **
    278     ** Description      Sets the active state for the object
    279     **
    280     ** Returns          None.
    281     **
    282     *******************************************************************************/
    283     void setActive(bool active);
    284 
    285     /*******************************************************************************
    286     **
    287     ** Function:        isDynamicTagId
    288     **
    289     ** Description:     Whether a tag has a dynamic tag ID.
    290     **
    291     ** Returns:         True if ID is dynamic.
    292     **
    293     *******************************************************************************/
    294     bool isDynamicTagId ();
    295 
    296 
    297     /*******************************************************************************
    298     **
    299     ** Function:        resetAllTransceiveTimeouts
    300     **
    301     ** Description:     Reset all timeouts for all technologies to default values.
    302     **
    303     ** Returns:         none
    304     **
    305     *******************************************************************************/
    306     void resetAllTransceiveTimeouts ();
    307 
    308 
    309     /*******************************************************************************
    310     **
    311     ** Function:        isDefaultTransceiveTimeout
    312     **
    313     ** Description:     Is the timeout value for a technology the default value?
    314     **                  techId: one of the values in TARGET_TYPE_* defined in NfcJniUtil.h.
    315     **                  timeout: Check this value against the default value.
    316     **
    317     ** Returns:         True if timeout is equal to the default value.
    318     **
    319     *******************************************************************************/
    320     bool isDefaultTransceiveTimeout (int techId, int timeout);
    321 
    322 
    323     /*******************************************************************************
    324     **
    325     ** Function:        getTransceiveTimeout
    326     **
    327     ** Description:     Get the timeout value for one technology.
    328     **                  techId: one of the values in TARGET_TYPE_* defined in NfcJniUtil.h
    329     **
    330     ** Returns:         Timeout value in millisecond.
    331     **
    332     *******************************************************************************/
    333     int getTransceiveTimeout (int techId);
    334 
    335 
    336     /*******************************************************************************
    337     **
    338     ** Function:        setTransceiveTimeout
    339     **
    340     ** Description:     Set the timeout value for one technology.
    341     **                  techId: one of the values in TARGET_TYPE_* defined in NfcJniUtil.h
    342     **                  timeout: timeout value in millisecond.
    343     **
    344     ** Returns:         Timeout value.
    345     **
    346     *******************************************************************************/
    347     void setTransceiveTimeout (int techId, int timeout);
    348 
    349 
    350     /*******************************************************************************
    351     **
    352     ** Function:        getPresenceCheckAlgorithm
    353     **
    354     ** Description:     Get presence-check algorithm from .conf file.
    355     **
    356     ** Returns:         Presence-check algorithm.
    357     **
    358     *******************************************************************************/
    359     tNFA_RW_PRES_CHK_OPTION getPresenceCheckAlgorithm ();
    360 
    361 
    362     /*******************************************************************************
    363     **
    364     ** Function:        isInfineonMyDMove
    365     **
    366     ** Description:     Whether the currently activated tag is Infineon My-D Move.
    367     **
    368     ** Returns:         True if tag is Infineon My-D Move.
    369     **
    370     *******************************************************************************/
    371     bool isInfineonMyDMove ();
    372 
    373 
    374     /*******************************************************************************
    375     **
    376     ** Function:        isKovioType2Tag
    377     **
    378     ** Description:     Whether the currently activated tag is Kovio 2Kb RFID tag.
    379     **                  It is a NFC Forum type-2 tag.
    380     **
    381     ** Returns:         True if tag is Kovio 2Kb RFID tag.
    382     **
    383     *******************************************************************************/
    384     bool isKovioType2Tag ();
    385 
    386 
    387 private:
    388     std::vector<int> mTechnologyTimeoutsTable;
    389     std::vector<int> mTechnologyDefaultTimeoutsTable;
    390     nfc_jni_native_data* mNativeData;
    391     bool mIsActivated;
    392     ActivationState mActivationState;
    393     tNFC_PROTOCOL mProtocol;
    394     int mtT1tMaxMessageSize; //T1T max NDEF message size
    395     tNFA_STATUS mReadCompletedStatus;
    396     int mLastKovioUidLen;   // len of uid of last Kovio tag activated
    397     bool mNdefDetectionTimedOut; // whether NDEF detection algorithm timed out
    398     tNFC_RF_TECH_PARAMS mTechParams [MAX_NUM_TECHNOLOGY]; //array of technology parameters
    399     SyncEvent mReadCompleteEvent;
    400     struct timespec mLastKovioTime; // time of last Kovio tag activation
    401     uint8_t mLastKovioUid[NFC_KOVIO_MAX_LEN]; // uid of last Kovio tag activated
    402     bool mIsDynamicTagId; // whether the tag has dynamic tag ID
    403     tNFA_RW_PRES_CHK_OPTION mPresenceCheckAlgorithm;
    404     bool mIsFelicaLite;
    405 
    406     /*******************************************************************************
    407     **
    408     ** Function:        IsSameKovio
    409     **
    410     ** Description:     Checks if tag activate is the same (UID) Kovio tag previously
    411     **                  activated.  This is needed due to a problem with some Kovio
    412     **                  tags re-activating multiple times.
    413     **                  activationData: data from activation.
    414     **
    415     ** Returns:         true if the activation is from the same tag previously
    416     **                  activated, false otherwise
    417     **
    418     *******************************************************************************/
    419     bool IsSameKovio(tNFA_ACTIVATED& activationData);
    420 
    421     /*******************************************************************************
    422     **
    423     ** Function:        discoverTechnologies
    424     **
    425     ** Description:     Discover the technologies that NFC service needs by interpreting
    426     **                  the data strucutures from the stack.
    427     **                  activationData: data from activation.
    428     **
    429     ** Returns:         None
    430     **
    431     *******************************************************************************/
    432     void discoverTechnologies (tNFA_ACTIVATED& activationData);
    433 
    434 
    435     /*******************************************************************************
    436     **
    437     ** Function:        discoverTechnologies
    438     **
    439     ** Description:     Discover the technologies that NFC service needs by interpreting
    440     **                  the data strucutures from the stack.
    441     **                  discoveryData: data from discovery events(s).
    442     **
    443     ** Returns:         None
    444     **
    445     *******************************************************************************/
    446     void discoverTechnologies (tNFA_DISC_RESULT& discoveryData);
    447 
    448 
    449     /*******************************************************************************
    450     **
    451     ** Function:        createNativeNfcTag
    452     **
    453     ** Description:     Create a brand new Java NativeNfcTag object;
    454     **                  fill the objects's member variables with data;
    455     **                  notify NFC service;
    456     **                  activationData: data from activation.
    457     **
    458     ** Returns:         None
    459     **
    460     *******************************************************************************/
    461     void createNativeNfcTag (tNFA_ACTIVATED& activationData);
    462 
    463 
    464     /*******************************************************************************
    465     **
    466     ** Function:        fillNativeNfcTagMembers1
    467     **
    468     ** Description:     Fill NativeNfcTag's members: mProtocols, mTechList, mTechHandles, mTechLibNfcTypes.
    469     **                  e: JVM environment.
    470     **                  tag_cls: Java NativeNfcTag class.
    471     **                  tag: Java NativeNfcTag object.
    472     **
    473     ** Returns:         None
    474     **
    475     *******************************************************************************/
    476     void fillNativeNfcTagMembers1 (JNIEnv* e, jclass tag_cls, jobject tag);
    477 
    478 
    479     /*******************************************************************************
    480     **
    481     ** Function:        fillNativeNfcTagMembers2
    482     **
    483     ** Description:     Fill NativeNfcTag's members: mConnectedTechIndex or mConnectedTechnology.
    484     **                  The original Google's implementation is in set_target_pollBytes(
    485     **                  in com_android_nfc_NativeNfcTag.cpp;
    486     **                  e: JVM environment.
    487     **                  tag_cls: Java NativeNfcTag class.
    488     **                  tag: Java NativeNfcTag object.
    489     **                  activationData: data from activation.
    490     **
    491     ** Returns:         None
    492     **
    493     *******************************************************************************/
    494     void fillNativeNfcTagMembers2 (JNIEnv* e, jclass tag_cls, jobject tag, tNFA_ACTIVATED& activationData);
    495 
    496 
    497     /*******************************************************************************
    498     **
    499     ** Function:        fillNativeNfcTagMembers3
    500     **
    501     ** Description:     Fill NativeNfcTag's members: mTechPollBytes.
    502     **                  The original Google's implementation is in set_target_pollBytes(
    503     **                  in com_android_nfc_NativeNfcTag.cpp;
    504     **                  e: JVM environment.
    505     **                  tag_cls: Java NativeNfcTag class.
    506     **                  tag: Java NativeNfcTag object.
    507     **                  activationData: data from activation.
    508     **
    509     ** Returns:         None
    510     **
    511     *******************************************************************************/
    512     void fillNativeNfcTagMembers3 (JNIEnv* e, jclass tag_cls, jobject tag, tNFA_ACTIVATED& activationData);
    513 
    514 
    515     /*******************************************************************************
    516     **
    517     ** Function:        fillNativeNfcTagMembers4
    518     **
    519     ** Description:     Fill NativeNfcTag's members: mTechActBytes.
    520     **                  The original Google's implementation is in set_target_activationBytes()
    521     **                  in com_android_nfc_NativeNfcTag.cpp;
    522     **                  e: JVM environment.
    523     **                  tag_cls: Java NativeNfcTag class.
    524     **                  tag: Java NativeNfcTag object.
    525     **                  activationData: data from activation.
    526     **
    527     ** Returns:         None
    528     **
    529     *******************************************************************************/
    530     void fillNativeNfcTagMembers4 (JNIEnv* e, jclass tag_cls, jobject tag, tNFA_ACTIVATED& activationData);
    531 
    532 
    533     /*******************************************************************************
    534     **
    535     ** Function:        fillNativeNfcTagMembers5
    536     **
    537     ** Description:     Fill NativeNfcTag's members: mUid.
    538     **                  The original Google's implementation is in nfc_jni_Discovery_notification_callback()
    539     **                  in com_android_nfc_NativeNfcManager.cpp;
    540     **                  e: JVM environment.
    541     **                  tag_cls: Java NativeNfcTag class.
    542     **                  tag: Java NativeNfcTag object.
    543     **                  activationData: data from activation.
    544     **
    545     ** Returns:         None
    546     **
    547     *******************************************************************************/
    548     void fillNativeNfcTagMembers5 (JNIEnv* e, jclass tag_cls, jobject tag, tNFA_ACTIVATED& activationData);
    549 
    550 
    551     /*******************************************************************************
    552     **
    553     ** Function:        resetTechnologies
    554     **
    555     ** Description:     Clear all data related to the technology, protocol of the tag.
    556     **
    557     ** Returns:         None
    558     **
    559     *******************************************************************************/
    560     void resetTechnologies ();
    561 
    562 
    563     /*******************************************************************************
    564     **
    565     ** Function:        calculateT1tMaxMessageSize
    566     **
    567     ** Description:     Calculate type-1 tag's max message size based on header ROM bytes.
    568     **                  activate: reference to activation data.
    569     **
    570     ** Returns:         None
    571     **
    572     *******************************************************************************/
    573     void calculateT1tMaxMessageSize (tNFA_ACTIVATED& activate);
    574 };
    575 
    576