1525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/*
2525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project * Copyright (C) 2012 The Android Open Source Project
3525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project *
4525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
5525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project * you may not use this file except in compliance with the License.
6525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project * You may obtain a copy of the License at
7525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project *
8525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
9525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project *
10525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
11525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
12525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project * See the License for the specific language governing permissions and
14525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project * limitations under the License.
15525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project */
16525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
17525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/*
18525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project *  Tag-reading, tag-writing operations.
19525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project */
20525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project#include "OverrideLog.h"
21525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project#include "NfcTag.h"
22525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project#include "JavaClassConstants.h"
23b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen#include "config.h"
242534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes#include <ScopedLocalRef.h>
252534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes#include <ScopedPrimitiveArray.h>
262534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes
27525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectextern "C"
28525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{
29525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    #include "rw_int.h"
30525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project}
31525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
32525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
33525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/*******************************************************************************
34525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
35525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function:        NfcTag
36525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
37525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description:     Initialize member variables.
38525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
39525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns:         None
40525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
41525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/
42525c260303268a83da4c3413b953d13c9084e834The Android Open Source ProjectNfcTag::NfcTag ()
43a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu:   mNumTechList (0),
44a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu    mTechnologyTimeoutsTable (MAX_NUM_TECHNOLOGY),
45a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu    mNativeData (NULL),
46a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu    mIsActivated (false),
47525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    mActivationState (Idle),
48525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    mProtocol(NFC_PROTOCOL_UNKNOWN),
49525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    mtT1tMaxMessageSize (0),
50525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    mReadCompletedStatus (NFA_STATUS_OK),
51525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    mLastKovioUidLen (0),
52b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen    mNdefDetectionTimedOut (false),
53b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen    mIsDynamicTagId (false),
54b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen    mPresenceCheckAlgorithm (NFA_RW_PRES_CHK_DEFAULT),
55b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen    mIsFelicaLite(false)
56525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{
57525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    memset (mTechList, 0, sizeof(mTechList));
58525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    memset (mTechHandles, 0, sizeof(mTechHandles));
59525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    memset (mTechLibNfcTypes, 0, sizeof(mTechLibNfcTypes));
60525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    memset (mTechParams, 0, sizeof(mTechParams));
61525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    memset(mLastKovioUid, 0, NFC_KOVIO_MAX_LEN);
62525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project}
63525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
64525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
65525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/*******************************************************************************
66525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
67525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function:        getInstance
68525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
69525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description:     Get a reference to the singleton NfcTag object.
70525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
71525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns:         Reference to NfcTag object.
72525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
73525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/
74525c260303268a83da4c3413b953d13c9084e834The Android Open Source ProjectNfcTag& NfcTag::getInstance ()
75525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{
76525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    static NfcTag tag;
77525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    return tag;
78525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project}
79525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
80525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
81525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/*******************************************************************************
82525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
83525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function:        initialize
84525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
85525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description:     Reset member variables.
86525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  native: Native data.
87525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
88525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns:         None
89525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
90525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/
91525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectvoid NfcTag::initialize (nfc_jni_native_data* native)
92525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{
93b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen    long num = 0;
94b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen
95525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    mNativeData = native;
96a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu    mIsActivated = false;
97525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    mActivationState = Idle;
98525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    mProtocol = NFC_PROTOCOL_UNKNOWN;
99525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    mNumTechList = 0;
100525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    mtT1tMaxMessageSize = 0;
101525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    mReadCompletedStatus = NFA_STATUS_OK;
102525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    resetTechnologies ();
103b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen    if (GetNumValue(NAME_PRESENCE_CHECK_ALGORITHM, &num, sizeof(num)))
104b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen        mPresenceCheckAlgorithm = num;
105525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project}
106525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
107525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
108525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/*******************************************************************************
109525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
110525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function:        abort
111525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
112525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description:     Unblock all operations.
113525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
114525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns:         None
115525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
116525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/
117525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectvoid NfcTag::abort ()
118525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{
119525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    SyncEventGuard g (mReadCompleteEvent);
120525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    mReadCompleteEvent.notifyOne ();
121525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project}
122525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
123525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
124525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/*******************************************************************************
125525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
126525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function:        getActivationState
127525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
128525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description:     What is the current state: Idle, Sleep, or Activated.
129525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
130525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns:         Idle, Sleep, or Activated.
131525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
132525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/
133525c260303268a83da4c3413b953d13c9084e834The Android Open Source ProjectNfcTag::ActivationState NfcTag::getActivationState ()
134525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{
135525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    return mActivationState;
136525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project}
137525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
138525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
139525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/*******************************************************************************
140525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
141525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function:        setDeactivationState
142525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
143525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description:     Set the current state: Idle or Sleep.
144525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  deactivated: state of deactivation.
145525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
146525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns:         None.
147525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
148525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/
149525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectvoid NfcTag::setDeactivationState (tNFA_DEACTIVATED& deactivated)
150525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{
151525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    static const char fn [] = "NfcTag::setDeactivationState";
152525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    mActivationState = Idle;
153525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    mNdefDetectionTimedOut = false;
154525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    if (deactivated.type == NFA_DEACTIVATE_TYPE_SLEEP)
155525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        mActivationState = Sleep;
156525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    ALOGD ("%s: state=%u", fn, mActivationState);
157525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project}
158525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
159525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
160525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/*******************************************************************************
161525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
162525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function:        setActivationState
163525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
164525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description:     Set the current state to Active.
165525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
166525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns:         None.
167525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
168525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/
169525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectvoid NfcTag::setActivationState ()
170525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{
171525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    static const char fn [] = "NfcTag::setActivationState";
172525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    mNdefDetectionTimedOut = false;
173525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    mActivationState = Active;
174525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    ALOGD ("%s: state=%u", fn, mActivationState);
175525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project}
176525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
177a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu/*******************************************************************************
178a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu**
179a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu** Function:        isActivated
180a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu**
181a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu** Description:     Is tag activated?
182a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu**
183a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu** Returns:         True if tag is activated.
184a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu**
185a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu*******************************************************************************/
186a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chubool NfcTag::isActivated ()
187a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu{
188a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu    return mIsActivated;
189a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu}
190a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu
191525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
192525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/*******************************************************************************
193525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
194525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function:        getProtocol
195525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
196525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description:     Get the protocol of the current tag.
197525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
198525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns:         Protocol number.
199525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
200525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/
201525c260303268a83da4c3413b953d13c9084e834The Android Open Source ProjecttNFC_PROTOCOL NfcTag::getProtocol()
202525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{
203525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    return mProtocol;
204525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project}
205525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
206525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/*******************************************************************************
207525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
208525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function         TimeDiff
209525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
210525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description      Computes time difference in milliseconds.
211525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
212525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns          Time difference in milliseconds
213525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
214525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/
215525c260303268a83da4c3413b953d13c9084e834The Android Open Source ProjectUINT32 TimeDiff(timespec start, timespec end)
216525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{
217525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    timespec temp;
218525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    if ((end.tv_nsec-start.tv_nsec)<0)
219525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {
220525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        temp.tv_sec = end.tv_sec-start.tv_sec-1;
221525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        temp.tv_nsec = 1000000000+end.tv_nsec-start.tv_nsec;
222525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
223525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    else
224525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {
225525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        temp.tv_sec = end.tv_sec-start.tv_sec;
226525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        temp.tv_nsec = end.tv_nsec-start.tv_nsec;
227525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
228525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
229525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    return (temp.tv_sec * 1000) + (temp.tv_nsec / 1000000);
230525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project}
231525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
232525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/*******************************************************************************
233525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
234525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function:        IsSameKovio
235525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
236525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description:     Checks if tag activate is the same (UID) Kovio tag previously
237525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  activated.  This is needed due to a problem with some Kovio
238525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  tags re-activating multiple times.
239525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  activationData: data from activation.
240525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
241525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns:         true if the activation is from the same tag previously
242525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  activated, false otherwise
243525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
244525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/
245525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectbool NfcTag::IsSameKovio(tNFA_ACTIVATED& activationData)
246525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{
247525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    static const char fn [] = "NfcTag::IsSameKovio";
248525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    ALOGD ("%s: enter", fn);
249525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    tNFC_ACTIVATE_DEVT& rfDetail = activationData.activate_ntf;
250525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
251525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    if (rfDetail.protocol != NFC_PROTOCOL_KOVIO)
252525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        return false;
253525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
254525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    memcpy (&(mTechParams[0]), &(rfDetail.rf_tech_param), sizeof(rfDetail.rf_tech_param));
255525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    if (mTechParams [0].mode != NFC_DISCOVERY_TYPE_POLL_KOVIO)
256525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        return false;
257525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
258525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    struct timespec now;
259525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    clock_gettime(CLOCK_REALTIME, &now);
260525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
261525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    bool rVal = false;
262525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    if (mTechParams[0].param.pk.uid_len == mLastKovioUidLen)
263525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {
264525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        if (memcmp(mLastKovioUid, &mTechParams [0].param.pk.uid, mTechParams[0].param.pk.uid_len) == 0)
265525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        {
266525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            //same tag
267525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            if (TimeDiff(mLastKovioTime, now) < 500)
268525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            {
269525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                // same tag within 500 ms, ignore activation
270525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                rVal = true;
271525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            }
272525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        }
273525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
274525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
275525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    // save Kovio tag info
276525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    if (!rVal)
277525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {
278525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        if ((mLastKovioUidLen = mTechParams[0].param.pk.uid_len) > NFC_KOVIO_MAX_LEN)
279525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            mLastKovioUidLen = NFC_KOVIO_MAX_LEN;
280525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        memcpy(mLastKovioUid, mTechParams[0].param.pk.uid, mLastKovioUidLen);
281525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
282525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    mLastKovioTime = now;
283525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    ALOGD ("%s: exit, is same Kovio=%d", fn, rVal);
284525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    return rVal;
285525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project}
286525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
287525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/*******************************************************************************
288525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
289525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function:        discoverTechnologies
290525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
291525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description:     Discover the technologies that NFC service needs by interpreting
292a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu**                  the data structures from the stack.
293525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  activationData: data from activation.
294525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
295525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns:         None
296525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
297525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/
298525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectvoid NfcTag::discoverTechnologies (tNFA_ACTIVATED& activationData)
299525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{
300525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    static const char fn [] = "NfcTag::discoverTechnologies (activation)";
301525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    ALOGD ("%s: enter", fn);
302525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    tNFC_ACTIVATE_DEVT& rfDetail = activationData.activate_ntf;
303525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
304525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    mNumTechList = 0;
305525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    mTechHandles [mNumTechList] = rfDetail.rf_disc_id;
306525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    mTechLibNfcTypes [mNumTechList] = rfDetail.protocol;
307525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
308525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    //save the stack's data structure for interpretation later
309525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    memcpy (&(mTechParams[mNumTechList]), &(rfDetail.rf_tech_param), sizeof(rfDetail.rf_tech_param));
310525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
311525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    switch (rfDetail.protocol)
312525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {
313525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    case NFC_PROTOCOL_T1T:
314525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        mTechList [mNumTechList] = TARGET_TYPE_ISO14443_3A; //is TagTechnology.NFC_A by Java API
315525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        break;
316525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
317525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    case NFC_PROTOCOL_T2T:
318525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        mTechList [mNumTechList] = TARGET_TYPE_ISO14443_3A;  //is TagTechnology.NFC_A by Java API
319525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        // could be MifFare UL or Classic or Kovio
320525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        {
321b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen            // need to look at first byte of uid to find Manufacture Byte
322525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            tNFC_RF_TECH_PARAMS tech_params;
323525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            memcpy (&tech_params, &(rfDetail.rf_tech_param), sizeof(rfDetail.rf_tech_param));
324525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
325525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            if ((tech_params.param.pa.nfcid1[0] == 0x04 && rfDetail.rf_tech_param.param.pa.sel_rsp == 0) ||
326525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                rfDetail.rf_tech_param.param.pa.sel_rsp == 0x18 ||
327525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                rfDetail.rf_tech_param.param.pa.sel_rsp == 0x08)
328525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            {
329525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                if (rfDetail.rf_tech_param.param.pa.sel_rsp == 0)
330525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                {
331525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                    mNumTechList++;
332525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                    mTechHandles [mNumTechList] = rfDetail.rf_disc_id;
333525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                    mTechLibNfcTypes [mNumTechList] = rfDetail.protocol;
334525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                    //save the stack's data structure for interpretation later
335525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                    memcpy (&(mTechParams[mNumTechList]), &(rfDetail.rf_tech_param), sizeof(rfDetail.rf_tech_param));
336525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                    mTechList [mNumTechList] = TARGET_TYPE_MIFARE_UL; //is TagTechnology.MIFARE_ULTRALIGHT by Java API
337525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                }
338525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            }
339525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        }
340525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        break;
341525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
342525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    case NFC_PROTOCOL_T3T:
343b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen        {
344b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen            UINT8 xx = 0;
345b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen
346b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen            mTechList [mNumTechList] = TARGET_TYPE_FELICA;
347b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen
348b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen            //see if it is Felica Lite.
349b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen            while (xx < activationData.params.t3t.num_system_codes)
350b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen            {
351b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen                if (activationData.params.t3t.p_system_codes[xx++] == T3T_SYSTEM_CODE_FELICA_LITE)
352b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen                {
353b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen                    mIsFelicaLite = true;
354b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen                    break;
355b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen                }
356b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen            }
357b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen        }
358525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        break;
359525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
360525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    case NFC_PROTOCOL_ISO_DEP: //type-4 tag uses technology ISO-DEP and technology A or B
361525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        mTechList [mNumTechList] = TARGET_TYPE_ISO14443_4; //is TagTechnology.ISO_DEP by Java API
362525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        if ( (rfDetail.rf_tech_param.mode == NFC_DISCOVERY_TYPE_POLL_A) ||
363525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                (rfDetail.rf_tech_param.mode == NFC_DISCOVERY_TYPE_POLL_A_ACTIVE) ||
364525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                (rfDetail.rf_tech_param.mode == NFC_DISCOVERY_TYPE_LISTEN_A) ||
365525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                (rfDetail.rf_tech_param.mode == NFC_DISCOVERY_TYPE_LISTEN_A_ACTIVE) )
366525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        {
367525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            mNumTechList++;
368525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            mTechHandles [mNumTechList] = rfDetail.rf_disc_id;
369525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            mTechLibNfcTypes [mNumTechList] = rfDetail.protocol;
370525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            mTechList [mNumTechList] = TARGET_TYPE_ISO14443_3A; //is TagTechnology.NFC_A by Java API
371525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            //save the stack's data structure for interpretation later
372525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            memcpy (&(mTechParams[mNumTechList]), &(rfDetail.rf_tech_param), sizeof(rfDetail.rf_tech_param));
373525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        }
374525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        else if ( (rfDetail.rf_tech_param.mode == NFC_DISCOVERY_TYPE_POLL_B) ||
375525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                (rfDetail.rf_tech_param.mode == NFC_DISCOVERY_TYPE_POLL_B_PRIME) ||
376525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                (rfDetail.rf_tech_param.mode == NFC_DISCOVERY_TYPE_LISTEN_B) ||
377525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                (rfDetail.rf_tech_param.mode == NFC_DISCOVERY_TYPE_LISTEN_B_PRIME) )
378525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        {
379525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            mNumTechList++;
380525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            mTechHandles [mNumTechList] = rfDetail.rf_disc_id;
381525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            mTechLibNfcTypes [mNumTechList] = rfDetail.protocol;
382525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            mTechList [mNumTechList] = TARGET_TYPE_ISO14443_3B; //is TagTechnology.NFC_B by Java API
383525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            //save the stack's data structure for interpretation later
384525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            memcpy (&(mTechParams[mNumTechList]), &(rfDetail.rf_tech_param), sizeof(rfDetail.rf_tech_param));
385525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        }
386525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        break;
387525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
388525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    case NFC_PROTOCOL_15693: //is TagTechnology.NFC_V by Java API
389525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        mTechList [mNumTechList] = TARGET_TYPE_ISO15693;
390525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        break;
391525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
392525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    case NFC_PROTOCOL_KOVIO:
39397a71fe90493efd5947bb6f18c7b58a7e795c1ddEvan Chu        ALOGD ("%s: Kovio", fn);
39497a71fe90493efd5947bb6f18c7b58a7e795c1ddEvan Chu        mTechList [mNumTechList] = TARGET_TYPE_KOVIO_BARCODE;
395525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        break;
396b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen
397525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    default:
398525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        ALOGE ("%s: unknown protocol ????", fn);
399525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        mTechList [mNumTechList] = TARGET_TYPE_UNKNOWN;
400525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        break;
401525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
402525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
403525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    mNumTechList++;
404525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    for (int i=0; i < mNumTechList; i++)
405525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {
406525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        ALOGD ("%s: index=%d; tech=%d; handle=%d; nfc type=%d", fn,
407525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                i, mTechList[i], mTechHandles[i], mTechLibNfcTypes[i]);
408525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
409525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    ALOGD ("%s: exit", fn);
410525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project}
411525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
412525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
413525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/*******************************************************************************
414525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
415525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function:        discoverTechnologies
416525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
417525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description:     Discover the technologies that NFC service needs by interpreting
418a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu**                  the data structures from the stack.
419525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  discoveryData: data from discovery events(s).
420525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
421525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns:         None
422525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
423525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/
424525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectvoid NfcTag::discoverTechnologies (tNFA_DISC_RESULT& discoveryData)
425525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{
426525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    static const char fn [] = "NfcTag::discoverTechnologies (discovery)";
427525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    tNFC_RESULT_DEVT& discovery_ntf = discoveryData.discovery_ntf;
428525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
429525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    ALOGD ("%s: enter: rf disc. id=%u; protocol=%u, mNumTechList=%u", fn, discovery_ntf.rf_disc_id, discovery_ntf.protocol, mNumTechList);
430525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    if (mNumTechList >= MAX_NUM_TECHNOLOGY)
431525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {
432525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        ALOGE ("%s: exceed max=%d", fn, MAX_NUM_TECHNOLOGY);
433525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        goto TheEnd;
434525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
435525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    mTechHandles [mNumTechList] = discovery_ntf.rf_disc_id;
436525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    mTechLibNfcTypes [mNumTechList] = discovery_ntf.protocol;
437525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
438525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    //save the stack's data structure for interpretation later
439525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    memcpy (&(mTechParams[mNumTechList]), &(discovery_ntf.rf_tech_param), sizeof(discovery_ntf.rf_tech_param));
440525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
441525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    switch (discovery_ntf.protocol)
442525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {
443525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    case NFC_PROTOCOL_T1T:
444525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        mTechList [mNumTechList] = TARGET_TYPE_ISO14443_3A; //is TagTechnology.NFC_A by Java API
445525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        break;
446525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
447525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    case NFC_PROTOCOL_T2T:
448525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        mTechList [mNumTechList] = TARGET_TYPE_ISO14443_3A;  //is TagTechnology.NFC_A by Java API
449b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen        //type-2 tags are identical to Mifare Ultralight, so Ultralight is also discovered
450a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu        if ((discovery_ntf.rf_tech_param.param.pa.sel_rsp == 0) &&
451a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu                (mNumTechList < (MAX_NUM_TECHNOLOGY-1)))
452525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        {
453b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen            // Mifare Ultralight
454525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            mNumTechList++;
455525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            mTechHandles [mNumTechList] = discovery_ntf.rf_disc_id;
456525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            mTechLibNfcTypes [mNumTechList] = discovery_ntf.protocol;
457525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            mTechList [mNumTechList] = TARGET_TYPE_MIFARE_UL; //is TagTechnology.MIFARE_ULTRALIGHT by Java API
458525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        }
459525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
460525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        //save the stack's data structure for interpretation later
461525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        memcpy (&(mTechParams[mNumTechList]), &(discovery_ntf.rf_tech_param), sizeof(discovery_ntf.rf_tech_param));
462525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        break;
463525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
464525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    case NFC_PROTOCOL_T3T:
465525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        mTechList [mNumTechList] = TARGET_TYPE_FELICA;
466525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        break;
467525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
468525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    case NFC_PROTOCOL_ISO_DEP: //type-4 tag uses technology ISO-DEP and technology A or B
469525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        mTechList [mNumTechList] = TARGET_TYPE_ISO14443_4; //is TagTechnology.ISO_DEP by Java API
470525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        if ( (discovery_ntf.rf_tech_param.mode == NFC_DISCOVERY_TYPE_POLL_A) ||
471525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                (discovery_ntf.rf_tech_param.mode == NFC_DISCOVERY_TYPE_POLL_A_ACTIVE) ||
472525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                (discovery_ntf.rf_tech_param.mode == NFC_DISCOVERY_TYPE_LISTEN_A) ||
473525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                (discovery_ntf.rf_tech_param.mode == NFC_DISCOVERY_TYPE_LISTEN_A_ACTIVE) )
474525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        {
475a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu            if (mNumTechList < (MAX_NUM_TECHNOLOGY-1))
476a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu            {
477a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu                mNumTechList++;
478a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu                mTechHandles [mNumTechList] = discovery_ntf.rf_disc_id;
479a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu                mTechLibNfcTypes [mNumTechList] = discovery_ntf.protocol;
480a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu                mTechList [mNumTechList] = TARGET_TYPE_ISO14443_3A; //is TagTechnology.NFC_A by Java API
481a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu                //save the stack's data structure for interpretation later
482a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu                memcpy (&(mTechParams[mNumTechList]), &(discovery_ntf.rf_tech_param), sizeof(discovery_ntf.rf_tech_param));
483a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu            }
484525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        }
485525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        else if ( (discovery_ntf.rf_tech_param.mode == NFC_DISCOVERY_TYPE_POLL_B) ||
486525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                (discovery_ntf.rf_tech_param.mode == NFC_DISCOVERY_TYPE_POLL_B_PRIME) ||
487525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                (discovery_ntf.rf_tech_param.mode == NFC_DISCOVERY_TYPE_LISTEN_B) ||
488525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                (discovery_ntf.rf_tech_param.mode == NFC_DISCOVERY_TYPE_LISTEN_B_PRIME) )
489525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        {
490a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu            if (mNumTechList < (MAX_NUM_TECHNOLOGY-1))
491a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu            {
492a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu                mNumTechList++;
493a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu                mTechHandles [mNumTechList] = discovery_ntf.rf_disc_id;
494a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu                mTechLibNfcTypes [mNumTechList] = discovery_ntf.protocol;
495a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu                mTechList [mNumTechList] = TARGET_TYPE_ISO14443_3B; //is TagTechnology.NFC_B by Java API
496a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu                //save the stack's data structure for interpretation later
497a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu                memcpy (&(mTechParams[mNumTechList]), &(discovery_ntf.rf_tech_param), sizeof(discovery_ntf.rf_tech_param));
498a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu            }
499525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        }
500525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        break;
501525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
502525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    case NFC_PROTOCOL_15693: //is TagTechnology.NFC_V by Java API
503525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        mTechList [mNumTechList] = TARGET_TYPE_ISO15693;
504525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        break;
505b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen
506525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    default:
507525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        ALOGE ("%s: unknown protocol ????", fn);
508525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        mTechList [mNumTechList] = TARGET_TYPE_UNKNOWN;
509525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        break;
510525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
511525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
512525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    mNumTechList++;
513525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    if (discovery_ntf.more == FALSE)
514525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {
515525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        for (int i=0; i < mNumTechList; i++)
516525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        {
517525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            ALOGD ("%s: index=%d; tech=%d; handle=%d; nfc type=%d", fn,
518525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                    i, mTechList[i], mTechHandles[i], mTechLibNfcTypes[i]);
519525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        }
520525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
521525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
522525c260303268a83da4c3413b953d13c9084e834The Android Open Source ProjectTheEnd:
523525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    ALOGD ("%s: exit", fn);
524525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project}
525525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
526525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
527525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/*******************************************************************************
528525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
529525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function:        createNativeNfcTag
530525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
531525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description:     Create a brand new Java NativeNfcTag object;
532525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  fill the objects's member variables with data;
533525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  notify NFC service;
534525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  activationData: data from activation.
535525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
536525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns:         None
537525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
538525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/
539525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectvoid NfcTag::createNativeNfcTag (tNFA_ACTIVATED& activationData)
540525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{
541525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    static const char fn [] = "NfcTag::createNativeNfcTag";
542525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    ALOGD ("%s: enter", fn);
543525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
5442534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes    JNIEnv* e = NULL;
5452534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes    ScopedAttach attach(mNativeData->vm, &e);
546a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu    if (e == NULL)
547a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu    {
548525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        ALOGE("%s: jni env is null", fn);
5492534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes        return;
550525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
551525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
5522534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes    ScopedLocalRef<jclass> tag_cls(e, e->GetObjectClass(mNativeData->cached_NfcTag));
553a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu    if (e->ExceptionCheck())
554a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu    {
555525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        e->ExceptionClear();
556525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        ALOGE("%s: failed to get class", fn);
5572534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes        return;
558525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
559525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
560525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    //create a new Java NativeNfcTag object
5612534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes    jmethodID ctor = e->GetMethodID(tag_cls.get(), "<init>", "()V");
5622534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes    ScopedLocalRef<jobject> tag(e, e->NewObject(tag_cls.get(), ctor));
563525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
564525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    //fill NativeNfcTag's mProtocols, mTechList, mTechHandles, mTechLibNfcTypes
5652534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes    fillNativeNfcTagMembers1(e, tag_cls.get(), tag.get());
566525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
567525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    //fill NativeNfcTag's members: mHandle, mConnectedTechnology
5682534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes    fillNativeNfcTagMembers2(e, tag_cls.get(), tag.get(), activationData);
569525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
570525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    //fill NativeNfcTag's members: mTechPollBytes
5712534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes    fillNativeNfcTagMembers3(e, tag_cls.get(), tag.get(), activationData);
572525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
573525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    //fill NativeNfcTag's members: mTechActBytes
5742534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes    fillNativeNfcTagMembers4(e, tag_cls.get(), tag.get(), activationData);
575525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
576525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    //fill NativeNfcTag's members: mUid
5772534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes    fillNativeNfcTagMembers5(e, tag_cls.get(), tag.get(), activationData);
578525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
579a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu    if (mNativeData->tag != NULL)
580a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu    {
5812534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes        e->DeleteGlobalRef(mNativeData->tag);
582525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
5832534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes    mNativeData->tag = e->NewGlobalRef(tag.get());
584525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
585525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    //notify NFC service about this new tag
586525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    ALOGD ("%s: try notify nfc service", fn);
5872534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes    e->CallVoidMethod(mNativeData->manager, android::gCachedNfcManagerNotifyNdefMessageListeners, tag.get());
588a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu    if (e->ExceptionCheck())
589a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu    {
590525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        e->ExceptionClear();
591525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        ALOGE ("%s: fail notify nfc service", fn);
592525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
593525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
594525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    ALOGD ("%s: exit", fn);
595525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project}
596525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
597525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
598525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/*******************************************************************************
599525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
600525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function:        fillNativeNfcTagMembers1
601525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
602525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description:     Fill NativeNfcTag's members: mProtocols, mTechList, mTechHandles, mTechLibNfcTypes.
603525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  e: JVM environment.
604525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  tag_cls: Java NativeNfcTag class.
605525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  tag: Java NativeNfcTag object.
606525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
607525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns:         None
608525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
609525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/
610525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectvoid NfcTag::fillNativeNfcTagMembers1 (JNIEnv* e, jclass tag_cls, jobject tag)
611525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{
612525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    static const char fn [] = "NfcTag::fillNativeNfcTagMembers1";
613525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    ALOGD ("%s", fn);
614525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
615525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    //create objects that represent NativeNfcTag's member variables
6162534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes    ScopedLocalRef<jintArray> techList(e, e->NewIntArray(mNumTechList));
6172534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes    ScopedLocalRef<jintArray> handleList(e, e->NewIntArray(mNumTechList));
6182534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes    ScopedLocalRef<jintArray> typeList(e, e->NewIntArray(mNumTechList));
619525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
620525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {
6212534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes        ScopedIntArrayRW technologies(e, techList.get());
6222534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes        ScopedIntArrayRW handles(e, handleList.get());
6232534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes        ScopedIntArrayRW types(e, typeList.get());
6242534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes        for (int i = 0; i < mNumTechList; i++) {
6252534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes            mNativeData->tProtocols [i] = mTechLibNfcTypes [i];
6262534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes            mNativeData->handles [i] = mTechHandles [i];
6272534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes            technologies [i] = mTechList [i];
6282534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes            handles [i]      = mTechHandles [i];
6292534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes            types [i]        = mTechLibNfcTypes [i];
6302534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes        }
631525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
632525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
6332534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes    jfieldID f = NULL;
6342534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes
6352534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes    f = e->GetFieldID(tag_cls, "mTechList", "[I");
6362534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes    e->SetObjectField(tag, f, techList.get());
637525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
6382534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes    f = e->GetFieldID(tag_cls, "mTechHandles", "[I");
6392534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes    e->SetObjectField(tag, f, handleList.get());
640525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
6412534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes    f = e->GetFieldID(tag_cls, "mTechLibNfcTypes", "[I");
6422534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes    e->SetObjectField(tag, f, typeList.get());
643525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project}
644525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
645525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
646525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/*******************************************************************************
647525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
648525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function:        fillNativeNfcTagMembers2
649525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
650525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description:     Fill NativeNfcTag's members: mConnectedTechIndex or mConnectedTechnology.
651525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  The original Google's implementation is in set_target_pollBytes(
652525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  in com_android_nfc_NativeNfcTag.cpp;
653525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  e: JVM environment.
654525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  tag_cls: Java NativeNfcTag class.
655525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  tag: Java NativeNfcTag object.
656525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  activationData: data from activation.
657525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
658525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns:         None
659525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
660525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/
6612534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughesvoid NfcTag::fillNativeNfcTagMembers2 (JNIEnv* e, jclass tag_cls, jobject tag, tNFA_ACTIVATED& /*activationData*/)
662525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{
663525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    static const char fn [] = "NfcTag::fillNativeNfcTagMembers2";
664525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    ALOGD ("%s", fn);
6652534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes    jfieldID f = e->GetFieldID(tag_cls, "mConnectedTechIndex", "I");
6662534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes    e->SetIntField(tag, f, (jint) 0);
667525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project}
668525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
669525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
670525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/*******************************************************************************
671525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
672525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function:        fillNativeNfcTagMembers3
673525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
674525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description:     Fill NativeNfcTag's members: mTechPollBytes.
675525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  The original Google's implementation is in set_target_pollBytes(
676525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  in com_android_nfc_NativeNfcTag.cpp;
677525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  e: JVM environment.
678525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  tag_cls: Java NativeNfcTag class.
679525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  tag: Java NativeNfcTag object.
680525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  activationData: data from activation.
681525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
682525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns:         None
683525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
684525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/
685525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectvoid NfcTag::fillNativeNfcTagMembers3 (JNIEnv* e, jclass tag_cls, jobject tag, tNFA_ACTIVATED& activationData)
686525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{
687525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    static const char fn [] = "NfcTag::fillNativeNfcTagMembers3";
6882534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes    ScopedLocalRef<jbyteArray> pollBytes(e, e->NewByteArray(0));
6892534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes    ScopedLocalRef<jclass> byteArrayClass(e, e->GetObjectClass(pollBytes.get()));
6902534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes    ScopedLocalRef<jobjectArray> techPollBytes(e, e->NewObjectArray(mNumTechList, byteArrayClass.get(), 0));
691525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    int len = 0;
692525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
693525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    for (int i = 0; i < mNumTechList; i++)
694525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {
695525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        ALOGD ("%s: index=%d; rf tech params mode=%u", fn, i, mTechParams [i].mode);
696525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        switch (mTechParams [i].mode)
697525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        {
698525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        case NFC_DISCOVERY_TYPE_POLL_A:
699525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        case NFC_DISCOVERY_TYPE_POLL_A_ACTIVE:
700525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        case NFC_DISCOVERY_TYPE_LISTEN_A:
701525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        case NFC_DISCOVERY_TYPE_LISTEN_A_ACTIVE:
702525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            ALOGD ("%s: tech A", fn);
7032534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes            pollBytes.reset(e->NewByteArray(2));
7042534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes            e->SetByteArrayRegion(pollBytes.get(), 0, 2, (jbyte*) mTechParams [i].param.pa.sens_res);
705525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            break;
706525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
707525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        case NFC_DISCOVERY_TYPE_POLL_B:
708525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        case NFC_DISCOVERY_TYPE_POLL_B_PRIME:
709525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        case NFC_DISCOVERY_TYPE_LISTEN_B:
710525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        case NFC_DISCOVERY_TYPE_LISTEN_B_PRIME:
711525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            if (mTechList [i] == TARGET_TYPE_ISO14443_3B) //is TagTechnology.NFC_B by Java API
712525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            {
713525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                /*****************
714525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                see NFC Forum Digital Protocol specification; section 5.6.2;
715525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                in SENSB_RES response, byte 6 through 9 is Application Data, byte 10-12 or 13 is Protocol Info;
716525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                used by public API: NfcB.getApplicationData(), NfcB.getProtocolInfo();
717525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                *****************/
718525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                ALOGD ("%s: tech B; TARGET_TYPE_ISO14443_3B", fn);
719525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                len = mTechParams [i].param.pb.sensb_res_len;
720525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                len = len - 4; //subtract 4 bytes for NFCID0 at byte 2 through 5
7212534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes                pollBytes.reset(e->NewByteArray(len));
7222534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes                e->SetByteArrayRegion(pollBytes.get(), 0, len, (jbyte*) (mTechParams [i].param.pb.sensb_res+4));
723a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu            }
724a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu            else
725a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu            {
7262534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes                pollBytes.reset(e->NewByteArray(0));
727525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            }
728525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            break;
729525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
730525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        case NFC_DISCOVERY_TYPE_POLL_F:
731525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        case NFC_DISCOVERY_TYPE_POLL_F_ACTIVE:
732525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        case NFC_DISCOVERY_TYPE_LISTEN_F:
733525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        case NFC_DISCOVERY_TYPE_LISTEN_F_ACTIVE:
734525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            {
735525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                /****************
736525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                see NFC Forum Type 3 Tag Operation Specification; sections 2.3.2, 2.3.1.2;
737525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                see NFC Forum Digital Protocol Specification; sections 6.6.2;
738525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                PMm: manufacture parameter; 8 bytes;
739525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                System Code: 2 bytes;
740525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                ****************/
741525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                ALOGD ("%s: tech F", fn);
742525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                UINT8 result [10]; //return result to NFC service
743525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                memset (result, 0, sizeof(result));
744525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                len =  10;
745525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
746525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                /****
747525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                for (int ii = 0; ii < mTechParams [i].param.pf.sensf_res_len; ii++)
748525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                {
749525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                    ALOGD ("%s: tech F, sendf_res[%d]=%d (0x%x)",
750525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                          fn, ii, mTechParams [i].param.pf.sensf_res[ii],mTechParams [i].param.pf.sensf_res[ii]);
751525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                }
752525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                ***/
753525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                memcpy (result, mTechParams [i].param.pf.sensf_res + 8, 8); //copy PMm
754525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                if (activationData.params.t3t.num_system_codes > 0) //copy the first System Code
755525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                {
756525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                    UINT16 systemCode = *(activationData.params.t3t.p_system_codes);
757525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                    result [8] = (UINT8) (systemCode >> 8);
758525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                    result [9] = (UINT8) systemCode;
759525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                    ALOGD ("%s: tech F; sys code=0x%X 0x%X", fn, result [8], result [9]);
760525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                }
7612534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes                pollBytes.reset(e->NewByteArray(len));
7622534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes                e->SetByteArrayRegion(pollBytes.get(), 0, len, (jbyte*) result);
7632534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes            }
764525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            break;
765525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
766525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        case NFC_DISCOVERY_TYPE_POLL_ISO15693:
767525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        case NFC_DISCOVERY_TYPE_LISTEN_ISO15693:
768525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            {
769525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                ALOGD ("%s: tech iso 15693", fn);
770525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                //iso 15693 response flags: 1 octet
771525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                //iso 15693 Data Structure Format Identifier (DSF ID): 1 octet
772525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                //used by public API: NfcV.getDsfId(), NfcV.getResponseFlags();
773525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                uint8_t data [2]= {activationData.params.i93.afi, activationData.params.i93.dsfid};
7742534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes                pollBytes.reset(e->NewByteArray(2));
7752534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes                e->SetByteArrayRegion(pollBytes.get(), 0, 2, (jbyte *) data);
776525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            }
777525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            break;
778525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
779525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        default:
780525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            ALOGE ("%s: tech unknown ????", fn);
7812534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes            pollBytes.reset(e->NewByteArray(0));
782525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            break;
783525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        } //switch: every type of technology
7842534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes        e->SetObjectArrayElement(techPollBytes.get(), i, pollBytes.get());
785525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    } //for: every technology in the array
7862534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes    jfieldID f = e->GetFieldID(tag_cls, "mTechPollBytes", "[[B");
7872534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes    e->SetObjectField(tag, f, techPollBytes.get());
788525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project}
789525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
790525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
791525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/*******************************************************************************
792525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
793525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function:        fillNativeNfcTagMembers4
794525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
795525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description:     Fill NativeNfcTag's members: mTechActBytes.
796525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  The original Google's implementation is in set_target_activationBytes()
797525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  in com_android_nfc_NativeNfcTag.cpp;
798525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  e: JVM environment.
799525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  tag_cls: Java NativeNfcTag class.
800525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  tag: Java NativeNfcTag object.
801525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  activationData: data from activation.
802525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
803525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns:         None
804525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
805525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/
806525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectvoid NfcTag::fillNativeNfcTagMembers4 (JNIEnv* e, jclass tag_cls, jobject tag, tNFA_ACTIVATED& activationData)
807525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{
808525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    static const char fn [] = "NfcTag::fillNativeNfcTagMembers4";
8092534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes    ScopedLocalRef<jbyteArray> actBytes(e, e->NewByteArray(0));
8102534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes    ScopedLocalRef<jclass> byteArrayClass(e, e->GetObjectClass(actBytes.get()));
8112534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes    ScopedLocalRef<jobjectArray> techActBytes(e, e->NewObjectArray(mNumTechList, byteArrayClass.get(), 0));
812525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
813525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    for (int i = 0; i < mNumTechList; i++)
814525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {
815525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        ALOGD ("%s: index=%d", fn, i);
816525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        switch (mTechLibNfcTypes[i])
817525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        {
818525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        case NFC_PROTOCOL_T1T:
819a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu        case NFC_PROTOCOL_T2T:
820525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            {
821a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu                if (mTechLibNfcTypes[i] == NFC_PROTOCOL_T1T)
822a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu                    ALOGD ("%s: T1T; tech A", fn);
823a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu                else if (mTechLibNfcTypes[i] == NFC_PROTOCOL_T2T)
824a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu                    ALOGD ("%s: T2T; tech A", fn);
8252534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes                actBytes.reset(e->NewByteArray(1));
8262534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes                e->SetByteArrayRegion(actBytes.get(), 0, 1, (jbyte*) &mTechParams [i].param.pa.sel_rsp);
827525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            }
828525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            break;
829525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
830525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        case NFC_PROTOCOL_T3T: //felica
831525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            {
832525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                ALOGD ("%s: T3T; felica; tech F", fn);
833525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                //really, there is no data
8342534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes                actBytes.reset(e->NewByteArray(0));
835525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            }
836525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            break;
837525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
838525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        case NFC_PROTOCOL_ISO_DEP: //t4t
839525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            {
840525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                if (mTechList [i] == TARGET_TYPE_ISO14443_4) //is TagTechnology.ISO_DEP by Java API
841525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                {
842525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                    if ( (mTechParams[i].mode == NFC_DISCOVERY_TYPE_POLL_A) ||
843525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                            (mTechParams[i].mode == NFC_DISCOVERY_TYPE_POLL_A_ACTIVE) ||
844525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                            (mTechParams[i].mode == NFC_DISCOVERY_TYPE_LISTEN_A) ||
845525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                            (mTechParams[i].mode == NFC_DISCOVERY_TYPE_LISTEN_A_ACTIVE) )
846525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                    {
847525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                        //see NFC Forum Digital Protocol specification, section 11.6.2, "RATS Response"; search for "historical bytes";
848525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                        //copy historical bytes into Java object;
849525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                        //the public API, IsoDep.getHistoricalBytes(), returns this data;
850525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                        if (activationData.activate_ntf.intf_param.type == NFC_INTERFACE_ISO_DEP)
851525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                        {
852525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                            tNFC_INTF_PA_ISO_DEP& pa_iso = activationData.activate_ntf.intf_param.intf_param.pa_iso;
853525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                            ALOGD ("%s: T4T; ISO_DEP for tech A; copy historical bytes; len=%u", fn, pa_iso.his_byte_len);
8542534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes                            actBytes.reset(e->NewByteArray(pa_iso.his_byte_len));
855525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                            if (pa_iso.his_byte_len > 0)
8562534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes                                e->SetByteArrayRegion(actBytes.get(), 0, pa_iso.his_byte_len, (jbyte*) (pa_iso.his_byte));
857525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                        }
858525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                        else
859525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                        {
860525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                            ALOGE ("%s: T4T; ISO_DEP for tech A; wrong interface=%u", fn, activationData.activate_ntf.intf_param.type);
8612534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes                            actBytes.reset(e->NewByteArray(0));
862525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                        }
863525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                    }
864525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                    else if ( (mTechParams[i].mode == NFC_DISCOVERY_TYPE_POLL_B) ||
865525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                            (mTechParams[i].mode == NFC_DISCOVERY_TYPE_POLL_B_PRIME) ||
866525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                            (mTechParams[i].mode == NFC_DISCOVERY_TYPE_LISTEN_B) ||
867525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                            (mTechParams[i].mode == NFC_DISCOVERY_TYPE_LISTEN_B_PRIME) )
868525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                    {
869525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                        //see NFC Forum Digital Protocol specification, section 12.6.2, "ATTRIB Response";
870525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                        //copy higher-layer response bytes into Java object;
871525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                        //the public API, IsoDep.getHiLayerResponse(), returns this data;
872525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                        if (activationData.activate_ntf.intf_param.type == NFC_INTERFACE_ISO_DEP)
873525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                        {
874525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                            tNFC_INTF_PB_ISO_DEP& pb_iso = activationData.activate_ntf.intf_param.intf_param.pb_iso;
875525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                            ALOGD ("%s: T4T; ISO_DEP for tech B; copy response bytes; len=%u", fn, pb_iso.hi_info_len);
8762534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes                            actBytes.reset(e->NewByteArray(pb_iso.hi_info_len));
877525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                            if (pb_iso.hi_info_len > 0)
8782534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes                                e->SetByteArrayRegion(actBytes.get(), 0, pb_iso.hi_info_len, (jbyte*) (pb_iso.hi_info));
879525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                        }
880525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                        else
881525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                        {
882525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                            ALOGE ("%s: T4T; ISO_DEP for tech B; wrong interface=%u", fn, activationData.activate_ntf.intf_param.type);
8832534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes                            actBytes.reset(e->NewByteArray(0));
884525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                        }
885525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                    }
886525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                }
887525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                else if (mTechList [i] == TARGET_TYPE_ISO14443_3A) //is TagTechnology.NFC_A by Java API
888525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                {
889525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                    ALOGD ("%s: T4T; tech A", fn);
8902534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes                    actBytes.reset(e->NewByteArray(1));
8912534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes                    e->SetByteArrayRegion(actBytes.get(), 0, 1, (jbyte*) &mTechParams [i].param.pa.sel_rsp);
892525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                }
893525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                else
894525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                {
8952534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes                    actBytes.reset(e->NewByteArray(0));
896525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                }
897525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            } //case NFC_PROTOCOL_ISO_DEP: //t4t
898525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            break;
899525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
900525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        case NFC_PROTOCOL_15693:
901525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            {
902525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                ALOGD ("%s: tech iso 15693", fn);
903525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                //iso 15693 response flags: 1 octet
904525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                //iso 15693 Data Structure Format Identifier (DSF ID): 1 octet
905525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                //used by public API: NfcV.getDsfId(), NfcV.getResponseFlags();
906525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                uint8_t data [2]= {activationData.params.i93.afi, activationData.params.i93.dsfid};
9072534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes                actBytes.reset(e->NewByteArray(2));
9082534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes                e->SetByteArrayRegion(actBytes.get(), 0, 2, (jbyte *) data);
909525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            }
910525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            break;
911525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
912525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        default:
913525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            ALOGD ("%s: tech unknown ????", fn);
9142534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes            actBytes.reset(e->NewByteArray(0));
915525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            break;
916525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        }//switch
9172534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes        e->SetObjectArrayElement(techActBytes.get(), i, actBytes.get());
918525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    } //for: every technology in the array
9192534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes    jfieldID f = e->GetFieldID (tag_cls, "mTechActBytes", "[[B");
9202534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes    e->SetObjectField(tag, f, techActBytes.get());
921525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project}
922525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
923525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
924525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/*******************************************************************************
925525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
926525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function:        fillNativeNfcTagMembers5
927525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
928525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description:     Fill NativeNfcTag's members: mUid.
929525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  The original Google's implementation is in nfc_jni_Discovery_notification_callback()
930525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  in com_android_nfc_NativeNfcManager.cpp;
931525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  e: JVM environment.
932525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  tag_cls: Java NativeNfcTag class.
933525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  tag: Java NativeNfcTag object.
934525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  activationData: data from activation.
935525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
936525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns:         None
937525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
938525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/
939525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectvoid NfcTag::fillNativeNfcTagMembers5 (JNIEnv* e, jclass tag_cls, jobject tag, tNFA_ACTIVATED& activationData)
940525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{
941525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    static const char fn [] = "NfcTag::fillNativeNfcTagMembers5";
942525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    int len = 0;
9432534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes    ScopedLocalRef<jbyteArray> uid(e, NULL);
944525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
945525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    switch (mTechParams [0].mode)
946525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {
947525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    case NFC_DISCOVERY_TYPE_POLL_KOVIO:
948525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        ALOGD ("%s: Kovio", fn);
949525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        len = mTechParams [0].param.pk.uid_len;
9502534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes        uid.reset(e->NewByteArray(len));
9512534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes        e->SetByteArrayRegion(uid.get(), 0, len,
952525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                (jbyte*) &mTechParams [0].param.pk.uid);
953525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        break;
954525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
955525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    case NFC_DISCOVERY_TYPE_POLL_A:
956525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    case NFC_DISCOVERY_TYPE_POLL_A_ACTIVE:
957525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    case NFC_DISCOVERY_TYPE_LISTEN_A:
958525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    case NFC_DISCOVERY_TYPE_LISTEN_A_ACTIVE:
959525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        ALOGD ("%s: tech A", fn);
960525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        len = mTechParams [0].param.pa.nfcid1_len;
9612534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes        uid.reset(e->NewByteArray(len));
9622534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes        e->SetByteArrayRegion(uid.get(), 0, len,
963525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                (jbyte*) &mTechParams [0].param.pa.nfcid1);
964b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen        //a tag's NFCID1 can change dynamically at each activation;
965b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen        //only the first byte (0x08) is constant; a dynamic NFCID1's length
966b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen        //must be 4 bytes (see NFC Digitial Protocol,
967b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen        //section 4.7.2 SDD_RES Response, Requirements 20).
968b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen        mIsDynamicTagId = (mTechParams [0].param.pa.nfcid1_len == 4) &&
969b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen                (mTechParams [0].param.pa.nfcid1 [0] == 0x08);
970525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        break;
971525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
972525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    case NFC_DISCOVERY_TYPE_POLL_B:
973525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    case NFC_DISCOVERY_TYPE_POLL_B_PRIME:
974525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    case NFC_DISCOVERY_TYPE_LISTEN_B:
975525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    case NFC_DISCOVERY_TYPE_LISTEN_B_PRIME:
976525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        ALOGD ("%s: tech B", fn);
9772534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes        uid.reset(e->NewByteArray(NFC_NFCID0_MAX_LEN));
9782534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes        e->SetByteArrayRegion(uid.get(), 0, NFC_NFCID0_MAX_LEN,
979525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                (jbyte*) &mTechParams [0].param.pb.nfcid0);
980525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        break;
981525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
982525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    case NFC_DISCOVERY_TYPE_POLL_F:
983525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    case NFC_DISCOVERY_TYPE_POLL_F_ACTIVE:
984525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    case NFC_DISCOVERY_TYPE_LISTEN_F:
985525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    case NFC_DISCOVERY_TYPE_LISTEN_F_ACTIVE:
9862534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes        uid.reset(e->NewByteArray(NFC_NFCID2_LEN));
9872534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes        e->SetByteArrayRegion(uid.get(), 0, NFC_NFCID2_LEN,
988525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                (jbyte*) &mTechParams [0].param.pf.nfcid2);
989a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu        ALOGD ("%s: tech F", fn);
990525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        break;
991525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
992525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    case NFC_DISCOVERY_TYPE_POLL_ISO15693:
993525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    case NFC_DISCOVERY_TYPE_LISTEN_ISO15693:
994525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        {
995525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            ALOGD ("%s: tech iso 15693", fn);
996525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            jbyte data [I93_UID_BYTE_LEN];  //8 bytes
997525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            for (int i=0; i<I93_UID_BYTE_LEN; ++i) //reverse the ID
998525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                data[i] = activationData.params.i93.uid [I93_UID_BYTE_LEN - i - 1];
9992534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes            uid.reset(e->NewByteArray(I93_UID_BYTE_LEN));
10002534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes            e->SetByteArrayRegion(uid.get(), 0, I93_UID_BYTE_LEN, data);
1001525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        }
1002525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        break;
1003525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1004525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    default:
1005525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        ALOGE ("%s: tech unknown ????", fn);
10062534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes        uid.reset(e->NewByteArray(0));
1007525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        break;
10082534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes    }
10092534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes    jfieldID f = e->GetFieldID(tag_cls, "mUid", "[B");
10102534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes    e->SetObjectField(tag, f, uid.get());
1011525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project}
1012525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1013525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1014525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/*******************************************************************************
1015525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1016525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function:        isP2pDiscovered
1017525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1018525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description:     Does the peer support P2P?
1019525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1020525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns:         True if the peer supports P2P.
1021525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1022525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/
1023525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectbool NfcTag::isP2pDiscovered ()
1024525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{
1025525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    static const char fn [] = "NfcTag::isP2pDiscovered";
1026525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    bool retval = false;
1027525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1028525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    for (int i = 0; i < mNumTechList; i++)
1029525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {
1030525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        if (mTechLibNfcTypes[i] == NFA_PROTOCOL_NFC_DEP)
1031525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        {
1032525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            //if remote device supports P2P
1033525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            ALOGD ("%s: discovered P2P", fn);
1034525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            retval = true;
1035525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            break;
1036525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        }
1037525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
1038525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    ALOGD ("%s: return=%u", fn, retval);
1039525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    return retval;
1040525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project}
1041525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1042525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1043525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/*******************************************************************************
1044525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1045525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function:        selectP2p
1046525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1047525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description:     Select the preferred P2P technology if there is a choice.
1048525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1049525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns:         None
1050525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1051525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/
1052525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectvoid NfcTag::selectP2p()
1053525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{
1054525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    static const char fn [] = "NfcTag::selectP2p";
1055525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    UINT8 rfDiscoveryId = 0;
1056525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1057525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    for (int i = 0; i < mNumTechList; i++)
1058525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {
1059525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        //if remote device does not support P2P, just skip it
1060525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        if (mTechLibNfcTypes[i] != NFA_PROTOCOL_NFC_DEP)
1061525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            continue;
1062525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1063525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        //if remote device supports tech F;
1064525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        //tech F is preferred because it is faster than tech A
1065525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        if ( (mTechParams[i].mode == NFC_DISCOVERY_TYPE_POLL_F) ||
1066525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project             (mTechParams[i].mode == NFC_DISCOVERY_TYPE_POLL_F_ACTIVE) )
1067525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        {
1068525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            rfDiscoveryId = mTechHandles[i];
1069525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            break; //no need to search further
1070525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        }
1071525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        else if ( (mTechParams[i].mode == NFC_DISCOVERY_TYPE_POLL_A) ||
1072525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                (mTechParams[i].mode == NFC_DISCOVERY_TYPE_POLL_A_ACTIVE) )
1073525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        {
1074525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            //only choose tech A if tech F is unavailable
1075525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            if (rfDiscoveryId == 0)
1076525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                rfDiscoveryId = mTechHandles[i];
1077525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        }
1078525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
1079525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1080525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    if (rfDiscoveryId > 0)
1081525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {
1082525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        ALOGD ("%s: select P2P; target rf discov id=0x%X", fn, rfDiscoveryId);
1083525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        tNFA_STATUS stat = NFA_Select (rfDiscoveryId, NFA_PROTOCOL_NFC_DEP, NFA_INTERFACE_NFC_DEP);
1084525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        if (stat != NFA_STATUS_OK)
1085525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            ALOGE ("%s: fail select P2P; error=0x%X", fn, stat);
1086525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
1087525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    else
1088525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        ALOGE ("%s: cannot find P2P", fn);
1089525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    resetTechnologies ();
1090525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project}
1091525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1092525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1093525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/*******************************************************************************
1094525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1095525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function:        resetTechnologies
1096525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1097525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description:     Clear all data related to the technology, protocol of the tag.
1098525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1099525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns:         None
1100525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1101525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/
1102525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectvoid NfcTag::resetTechnologies ()
1103525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{
1104525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    static const char fn [] = "NfcTag::resetTechnologies";
1105525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    ALOGD ("%s", fn);
1106525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project   	mNumTechList = 0;
1107525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    memset (mTechList, 0, sizeof(mTechList));
1108525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    memset (mTechHandles, 0, sizeof(mTechHandles));
1109525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    memset (mTechLibNfcTypes, 0, sizeof(mTechLibNfcTypes));
1110525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    memset (mTechParams, 0, sizeof(mTechParams));
1111b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen    mIsDynamicTagId = false;
1112b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen    mIsFelicaLite = false;
1113a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu    resetAllTransceiveTimeouts ();
1114525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project}
1115525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1116525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1117525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/*******************************************************************************
1118525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1119525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function:        selectFirstTag
1120525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1121525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description:     When multiple tags are discovered, just select the first one to activate.
1122525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1123525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns:         None
1124525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1125525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/
1126525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectvoid NfcTag::selectFirstTag ()
1127525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{
1128525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    static const char fn [] = "NfcTag::selectFirstTag";
1129c4e4277a71c70e96198cb760676ad3b40f9e0e3dMartijn Coenen    int foundIdx = -1;
1130c4e4277a71c70e96198cb760676ad3b40f9e0e3dMartijn Coenen    tNFA_INTF_TYPE rf_intf = NFA_INTERFACE_FRAME;
1131c4e4277a71c70e96198cb760676ad3b40f9e0e3dMartijn Coenen
1132c4e4277a71c70e96198cb760676ad3b40f9e0e3dMartijn Coenen    for (int i = 0; i < mNumTechList; i++)
1133c4e4277a71c70e96198cb760676ad3b40f9e0e3dMartijn Coenen    {
1134c4e4277a71c70e96198cb760676ad3b40f9e0e3dMartijn Coenen        ALOGD ("%s: nfa target idx=%d h=0x%X; protocol=0x%X",
1135c4e4277a71c70e96198cb760676ad3b40f9e0e3dMartijn Coenen                fn, i, mTechHandles [i], mTechLibNfcTypes [i]);
1136c4e4277a71c70e96198cb760676ad3b40f9e0e3dMartijn Coenen        if (mTechLibNfcTypes[i] != NFA_PROTOCOL_NFC_DEP)
1137c4e4277a71c70e96198cb760676ad3b40f9e0e3dMartijn Coenen        {
1138c4e4277a71c70e96198cb760676ad3b40f9e0e3dMartijn Coenen            foundIdx = i;
1139c4e4277a71c70e96198cb760676ad3b40f9e0e3dMartijn Coenen            break;
1140c4e4277a71c70e96198cb760676ad3b40f9e0e3dMartijn Coenen        }
1141c4e4277a71c70e96198cb760676ad3b40f9e0e3dMartijn Coenen    }
1142c4e4277a71c70e96198cb760676ad3b40f9e0e3dMartijn Coenen
1143c4e4277a71c70e96198cb760676ad3b40f9e0e3dMartijn Coenen    if (foundIdx != -1)
1144c4e4277a71c70e96198cb760676ad3b40f9e0e3dMartijn Coenen    {
1145c4e4277a71c70e96198cb760676ad3b40f9e0e3dMartijn Coenen        if (mTechLibNfcTypes [foundIdx] == NFA_PROTOCOL_ISO_DEP)
1146c4e4277a71c70e96198cb760676ad3b40f9e0e3dMartijn Coenen        {
1147c4e4277a71c70e96198cb760676ad3b40f9e0e3dMartijn Coenen            rf_intf = NFA_INTERFACE_ISO_DEP;
1148c4e4277a71c70e96198cb760676ad3b40f9e0e3dMartijn Coenen        }
1149c4e4277a71c70e96198cb760676ad3b40f9e0e3dMartijn Coenen        else
1150c4e4277a71c70e96198cb760676ad3b40f9e0e3dMartijn Coenen            rf_intf = NFA_INTERFACE_FRAME;
1151c4e4277a71c70e96198cb760676ad3b40f9e0e3dMartijn Coenen
1152c4e4277a71c70e96198cb760676ad3b40f9e0e3dMartijn Coenen        tNFA_STATUS stat = NFA_Select (mTechHandles [foundIdx], mTechLibNfcTypes [foundIdx], rf_intf);
1153c4e4277a71c70e96198cb760676ad3b40f9e0e3dMartijn Coenen        if (stat != NFA_STATUS_OK)
1154c4e4277a71c70e96198cb760676ad3b40f9e0e3dMartijn Coenen            ALOGE ("%s: fail select; error=0x%X", fn, stat);
1155c4e4277a71c70e96198cb760676ad3b40f9e0e3dMartijn Coenen    }
1156c4e4277a71c70e96198cb760676ad3b40f9e0e3dMartijn Coenen    else
1157c4e4277a71c70e96198cb760676ad3b40f9e0e3dMartijn Coenen        ALOGE ("%s: only found NFC-DEP technology.", fn);
1158525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project}
1159525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1160525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1161525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/*******************************************************************************
1162525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1163525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function:        getT1tMaxMessageSize
1164525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1165525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description:     Get the maximum size (octet) that a T1T can store.
1166525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1167525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns:         Maximum size in octets.
1168525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1169525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/
1170525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectint NfcTag::getT1tMaxMessageSize ()
1171525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{
1172525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    static const char fn [] = "NfcTag::getT1tMaxMessageSize";
1173525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1174525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    if (mProtocol != NFC_PROTOCOL_T1T)
1175525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {
1176525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        ALOGE ("%s: wrong protocol %u", fn, mProtocol);
1177525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        return 0;
1178525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
1179525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    return mtT1tMaxMessageSize;
1180525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project}
1181525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1182525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1183525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/*******************************************************************************
1184525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1185525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function:        calculateT1tMaxMessageSize
1186525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1187525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description:     Calculate type-1 tag's max message size based on header ROM bytes.
1188525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  activate: reference to activation data.
1189525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1190525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns:         None
1191525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1192525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/
1193525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectvoid NfcTag::calculateT1tMaxMessageSize (tNFA_ACTIVATED& activate)
1194525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{
1195525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    static const char fn [] = "NfcTag::calculateT1tMaxMessageSize";
1196525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1197525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    //make sure the tag is type-1
1198525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    if (activate.activate_ntf.protocol != NFC_PROTOCOL_T1T)
1199525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {
1200525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        mtT1tMaxMessageSize = 0;
1201525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        return;
1202525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
1203525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1204525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    //examine the first byte of header ROM bytes
1205525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    switch (activate.params.t1t.hr[0])
1206525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {
1207525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    case RW_T1T_IS_TOPAZ96:
1208525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        mtT1tMaxMessageSize = 90;
1209525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        break;
1210525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    case RW_T1T_IS_TOPAZ512:
1211525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        mtT1tMaxMessageSize = 462;
1212525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        break;
1213525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    default:
1214525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        ALOGE ("%s: unknown T1T HR0=%u", fn, activate.params.t1t.hr[0]);
1215525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        mtT1tMaxMessageSize = 0;
1216525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        break;
1217525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
1218525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project}
1219525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1220525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1221525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/*******************************************************************************
1222525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1223525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function:        isMifareUltralight
1224525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1225525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description:     Whether the currently activated tag is Mifare Ultralight.
1226525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1227525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns:         True if tag is Mifare Ultralight.
1228525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1229525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/
1230525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectbool NfcTag::isMifareUltralight ()
1231525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{
1232525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    static const char fn [] = "NfcTag::isMifareUltralight";
1233525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    bool retval = false;
1234525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1235525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    for (int i =0; i < mNumTechList; i++)
1236525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {
1237b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen        if (mTechParams[i].mode == NFC_DISCOVERY_TYPE_POLL_A)
1238525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        {
1239525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            //see NFC Digital Protocol, section 4.6.3 (SENS_RES); section 4.8.2 (SEL_RES).
1240b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen            //see "MF0ICU1 Functional specification MIFARE Ultralight", Rev. 3.4 - 4 February 2008,
1241b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen            //section 6.7.
1242525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            if ( (mTechParams[i].param.pa.sens_res[0] == 0x44) &&
1243b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen                 (mTechParams[i].param.pa.sens_res[1] == 0) &&
1244b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen                 ( (mTechParams[i].param.pa.sel_rsp == 0) || (mTechParams[i].param.pa.sel_rsp == 0x04) ) &&
1245b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen                 (mTechParams[i].param.pa.nfcid1[0] == 0x04) )
1246525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            {
1247525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                retval = true;
1248525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            }
1249525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            break;
1250525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        }
1251525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
1252525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    ALOGD ("%s: return=%u", fn, retval);
1253525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    return retval;
1254525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project}
1255525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1256525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1257525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/*******************************************************************************
1258525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1259b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen** Function:        isFelicaLite
1260b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen**
1261b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen** Description:     Whether the currently activated tag is Felica Lite.
1262b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen**
1263b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen** Returns:         True if tag is Felica Lite.
1264b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen**
1265b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen*******************************************************************************/
1266b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen
1267b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenenbool NfcTag::isFelicaLite ()
1268b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen{
1269b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen    return mIsFelicaLite;
1270b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen}
1271b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen
1272b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen
1273b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen/*******************************************************************************
1274b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen**
1275525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function:        isT2tNackResponse
1276525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1277525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description:     Whether the response is a T2T NACK response.
1278525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  See NFC Digital Protocol Technical Specification (2010-11-17).
1279525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  Chapter 9 (Type 2 Tag Platform), section 9.6 (READ).
1280525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  response: buffer contains T2T response.
1281525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  responseLen: length of the response.
1282525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1283525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns:         True if the response is NACK
1284525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1285525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/
1286525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectbool NfcTag::isT2tNackResponse (const UINT8* response, UINT32 responseLen)
1287525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{
1288525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    static const char fn [] = "NfcTag::isT2tNackResponse";
1289525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    bool isNack = false;
1290525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1291525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    if (responseLen == 1)
1292525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {
1293525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        if (response[0] == 0xA)
1294525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            isNack = false; //an ACK response, so definitely not a NACK
1295525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        else
1296525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            isNack = true; //assume every value is a NACK
1297525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
1298525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    ALOGD ("%s: return %u", fn, isNack);
1299525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    return isNack;
1300525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project}
1301525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1302525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1303525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/*******************************************************************************
1304525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1305525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function:        isNdefDetectionTimedOut
1306525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1307525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description:     Whether NDEF-detection algorithm timed out.
1308525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1309525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns:         True if NDEF-detection algorithm timed out.
1310525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1311525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/
1312525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectbool NfcTag::isNdefDetectionTimedOut ()
1313525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{
1314525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    return mNdefDetectionTimedOut;
1315525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project}
1316525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1317525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1318525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/*******************************************************************************
1319525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1320525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function:        connectionEventHandler
1321525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1322525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description:     Handle connection-related events.
1323525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  event: event code.
1324525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  data: pointer to event data.
1325525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1326525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns:         None
1327525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1328525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/
1329525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectvoid NfcTag::connectionEventHandler (UINT8 event, tNFA_CONN_EVT_DATA* data)
1330525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{
1331525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    static const char fn [] = "NfcTag::connectionEventHandler";
1332525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1333525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    switch (event)
1334525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {
1335525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    case NFA_DISC_RESULT_EVT:
1336525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        {
1337525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            tNFA_DISC_RESULT& disc_result = data->disc_result;
1338525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            if (disc_result.status == NFA_STATUS_OK)
1339525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            {
1340525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                discoverTechnologies (disc_result);
1341525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            }
1342525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        }
1343525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        break;
1344525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1345525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    case NFA_ACTIVATED_EVT:
1346525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        // Only do tag detection if we are polling and it is not 'EE Direct RF' activation
1347525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        // (which may happen when we are activated as a tag).
1348525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        if (data->activated.activate_ntf.rf_tech_param.mode < NCI_DISCOVERY_TYPE_LISTEN_A
1349525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            && data->activated.activate_ntf.intf_param.type != NFC_INTERFACE_EE_DIRECT_RF)
1350525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        {
1351525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            tNFA_ACTIVATED& activated = data->activated;
1352525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            if (IsSameKovio(activated))
1353525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                break;
1354a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu            mIsActivated = true;
1355525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            mProtocol = activated.activate_ntf.protocol;
1356525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            calculateT1tMaxMessageSize (activated);
1357525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            discoverTechnologies (activated);
1358525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            createNativeNfcTag (activated);
1359525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        }
1360525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        break;
1361525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1362525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    case NFA_DEACTIVATED_EVT:
1363a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu        mIsActivated = false;
1364525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        mProtocol = NFC_PROTOCOL_UNKNOWN;
1365525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        resetTechnologies ();
1366525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        break;
1367525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1368525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    case NFA_READ_CPLT_EVT:
1369525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        {
1370525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            SyncEventGuard g (mReadCompleteEvent);
1371525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            mReadCompletedStatus = data->status;
1372525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            mReadCompleteEvent.notifyOne ();
1373525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        }
1374525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        break;
1375525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1376525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    case NFA_NDEF_DETECT_EVT:
1377525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        {
1378525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            tNFA_NDEF_DETECT& ndef_detect = data->ndef_detect;
1379525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            mNdefDetectionTimedOut = ndef_detect.status == NFA_STATUS_TIMEOUT;
1380525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            if (mNdefDetectionTimedOut)
1381525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                ALOGE ("%s: NDEF detection timed out", fn);
1382525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        }
1383525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
1384525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project}
1385a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu
1386b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen
1387a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu/*******************************************************************************
1388a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu**
1389a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu** Function         setActive
1390a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu**
1391a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu** Description      Sets the active state for the object
1392a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu**
1393a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu** Returns          None.
1394a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu**
1395a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu*******************************************************************************/
1396a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chuvoid NfcTag::setActive(bool active)
1397a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu{
1398a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu    mIsActivated = active;
1399a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu}
1400a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu
1401a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu
1402a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu/*******************************************************************************
1403a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu**
1404b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen** Function:        isDynamicTagId
1405b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen**
1406b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen** Description:     Whether a tag has a dynamic tag ID.
1407b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen**
1408b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen** Returns:         True if ID is dynamic.
1409b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen**
1410b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen*******************************************************************************/
1411b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenenbool NfcTag::isDynamicTagId ()
1412b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen{
1413b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen    return mIsDynamicTagId &&
1414b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen            (mTechList [0] == TARGET_TYPE_ISO14443_4) &&  //type-4 tag
1415b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen            (mTechList [1] == TARGET_TYPE_ISO14443_3A);  //tech A
1416b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen}
1417b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen
1418b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen
1419b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen/*******************************************************************************
1420b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen**
1421a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu** Function:        resetAllTransceiveTimeouts
1422a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu**
1423a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu** Description:     Reset all timeouts for all technologies to default values.
1424a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu**
1425a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu** Returns:         none
1426a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu**
1427a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu*******************************************************************************/
1428a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chuvoid NfcTag::resetAllTransceiveTimeouts ()
1429a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu{
1430133f3b8b4e88a2ab66840c67e26e167bc4cd14d5Martijn Coenen    mTechnologyTimeoutsTable [TARGET_TYPE_ISO14443_3A] = 618; //NfcA
1431133f3b8b4e88a2ab66840c67e26e167bc4cd14d5Martijn Coenen    mTechnologyTimeoutsTable [TARGET_TYPE_ISO14443_3B] = 1000; //NfcB
1432133f3b8b4e88a2ab66840c67e26e167bc4cd14d5Martijn Coenen    mTechnologyTimeoutsTable [TARGET_TYPE_ISO14443_4] = 309; //ISO-DEP
1433133f3b8b4e88a2ab66840c67e26e167bc4cd14d5Martijn Coenen    mTechnologyTimeoutsTable [TARGET_TYPE_FELICA] = 255; //Felica
1434133f3b8b4e88a2ab66840c67e26e167bc4cd14d5Martijn Coenen    mTechnologyTimeoutsTable [TARGET_TYPE_ISO15693] = 1000;//NfcV
1435133f3b8b4e88a2ab66840c67e26e167bc4cd14d5Martijn Coenen    mTechnologyTimeoutsTable [TARGET_TYPE_NDEF] = 1000;
1436133f3b8b4e88a2ab66840c67e26e167bc4cd14d5Martijn Coenen    mTechnologyTimeoutsTable [TARGET_TYPE_NDEF_FORMATABLE] = 1000;
1437133f3b8b4e88a2ab66840c67e26e167bc4cd14d5Martijn Coenen    mTechnologyTimeoutsTable [TARGET_TYPE_MIFARE_CLASSIC] = 618; //MifareClassic
1438133f3b8b4e88a2ab66840c67e26e167bc4cd14d5Martijn Coenen    mTechnologyTimeoutsTable [TARGET_TYPE_MIFARE_UL] = 618; //MifareUltralight
1439133f3b8b4e88a2ab66840c67e26e167bc4cd14d5Martijn Coenen    mTechnologyTimeoutsTable [TARGET_TYPE_KOVIO_BARCODE] = 1000; //NfcBarcode
1440b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen}
1441b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen
1442b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen/*******************************************************************************
1443b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen**
1444a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu** Function:        getTransceiveTimeout
1445a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu**
1446a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu** Description:     Get the timeout value for one technology.
1447a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu**                  techId: one of the values in TARGET_TYPE_* defined in NfcJniUtil.h
1448a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu**
1449a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu** Returns:         Timeout value in millisecond.
1450a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu**
1451a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu*******************************************************************************/
1452a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chuint NfcTag::getTransceiveTimeout (int techId)
1453a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu{
1454a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu    static const char fn [] = "NfcTag::getTransceiveTimeout";
1455a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu    int retval = 1000;
1456b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen    if ((techId > 0) && (techId < (int) mTechnologyTimeoutsTable.size()))
1457a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu        retval = mTechnologyTimeoutsTable [techId];
1458a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu    else
1459a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu        ALOGE ("%s: invalid tech=%d", fn, techId);
1460a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu    return retval;
1461a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu}
1462a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu
1463a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu
1464a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu/*******************************************************************************
1465a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu**
1466a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu** Function:        setTransceiveTimeout
1467a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu**
1468a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu** Description:     Set the timeout value for one technology.
1469a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu**                  techId: one of the values in TARGET_TYPE_* defined in NfcJniUtil.h
1470a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu**                  timeout: timeout value in millisecond.
1471a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu**
1472a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu** Returns:         Timeout value.
1473a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu**
1474a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu*******************************************************************************/
1475a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chuvoid NfcTag::setTransceiveTimeout (int techId, int timeout)
1476a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu{
1477a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu    static const char fn [] = "NfcTag::setTransceiveTimeout";
1478a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu    if ((techId >= 0) && (techId < (int) mTechnologyTimeoutsTable.size()))
1479a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu        mTechnologyTimeoutsTable [techId] = timeout;
1480a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu    else
1481a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu        ALOGE ("%s: invalid tech=%d", fn, techId);
1482a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu}
1483b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen
1484b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen
1485b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen/*******************************************************************************
1486b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen**
1487b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen** Function:        getPresenceCheckAlgorithm
1488b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen**
1489b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen** Description:     Get presence-check algorithm from .conf file.
1490b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen**
1491b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen** Returns:         Presence-check algorithm.
1492b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen**
1493b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen*******************************************************************************/
1494b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn CoenentNFA_RW_PRES_CHK_OPTION NfcTag::getPresenceCheckAlgorithm ()
1495b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen{
1496b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen    return mPresenceCheckAlgorithm;
1497b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen}
1498b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen
1499b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen
1500b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen/*******************************************************************************
1501b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen**
1502b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen** Function:        isInfineonMyDMove
1503b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen**
1504b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen** Description:     Whether the currently activated tag is Infineon My-D Move.
1505b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen**
1506b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen** Returns:         True if tag is Infineon My-D Move.
1507b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen**
1508b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen*******************************************************************************/
1509b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenenbool NfcTag::isInfineonMyDMove ()
1510b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen{
1511b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen    static const char fn [] = "NfcTag::isInfineonMyDMove";
1512b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen    bool retval = false;
1513b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen
1514b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen    for (int i =0; i < mNumTechList; i++)
1515b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen    {
1516b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen        if (mTechParams[i].mode == NFC_DISCOVERY_TYPE_POLL_A)
1517b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen        {
1518b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen            //see Infineon my-d move, my-d move NFC, SLE 66R01P, SLE 66R01PN,
1519b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen            //Short Product Information, 2011-11-24, section 3.5
1520b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen            if (mTechParams[i].param.pa.nfcid1[0] == 0x05)
1521b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen            {
1522b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen                UINT8 highNibble = mTechParams[i].param.pa.nfcid1[1] & 0xF0;
1523b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen                if (highNibble == 0x30)
1524b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen                    retval = true;
1525b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen            }
1526b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen            break;
1527b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen        }
1528b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen    }
1529b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen    ALOGD ("%s: return=%u", fn, retval);
1530b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen    return retval;
1531b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen}
1532b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen
1533b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen
1534b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen/*******************************************************************************
1535b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen**
1536b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen** Function:        isKovioType2Tag
1537b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen**
1538b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen** Description:     Whether the currently activated tag is Kovio Type-2 tag.
1539b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen**
1540b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen** Returns:         True if tag is Kovio Type-2 tag.
1541b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen**
1542b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen*******************************************************************************/
1543b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenenbool NfcTag::isKovioType2Tag ()
1544b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen{
1545b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen    static const char fn [] = "NfcTag::isKovioType2Tag";
1546b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen    bool retval = false;
1547b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen
1548b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen    for (int i =0; i < mNumTechList; i++)
1549b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen    {
1550b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen        if (mTechParams[i].mode == NFC_DISCOVERY_TYPE_POLL_A)
1551b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen        {
1552b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen            //Kovio 2Kb RFID Tag, Functional Specification,
1553b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen            //March 2, 2012, v2.0, section 8.3.
1554b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen            if (mTechParams[i].param.pa.nfcid1[0] == 0x37)
1555b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen                retval = true;
1556b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen            break;
1557b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen        }
1558b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen    }
1559b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen    ALOGD ("%s: return=%u", fn, retval);
1560b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen    return retval;
1561b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen}
1562