• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2022 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include "nfcc_nci_adapter.h"
17 
18 #include <unistd.h>
19 
20 #include "loghelper.h"
21 #include "nfc_config.h"
22 #include "nfc_sdk_common.h"
23 #include "routing_manager.h"
24 #include "securec.h"
25 #include "tag_nci_adapter_ntf.h"
26 #include "tag_nci_adapter_common.h"
27 
28 using namespace OHOS::NFC;
29 namespace OHOS {
30 namespace NFC {
31 namespace NCI {
32 // values for SAK28 issue
33 static unsigned int g_isoMifareBitMap = 0;
34 static bool g_isIsoMifareFlag = false;
35 static uint8_t isoMifareUid[NCI_NFCID1_MAX_LEN] = { 0 };
36 const uint8_t NCI_RF_DISCOVER_NTF_FIRST_ID = 0x01;
37 const uint8_t NCI_RF_DISCOVER_NTF_SECOND_ID = 0x02;
38 const unsigned int FLAG_MULTI_TAG_ISO_DEP = 0x01;
39 const unsigned int FLAG_MULTI_TAG_MIFARE = 0x02;
40 // wait nci event 2000 ms
41 const unsigned int NCI_EVT_WAIT_TIMEOUT = 2000;
42 const uint16_t RAWDATA_MAX_LEN = 1000;
43 
44 NfccNciAdapter::NfccNciAdapter() = default;
45 NfccNciAdapter::~NfccNciAdapter() = default;
46 
GetInstance()47 NfccNciAdapter& NfccNciAdapter::GetInstance()
48 {
49     static NfccNciAdapter nfccNciAdapter;
50     return nfccNciAdapter;
51 }
52 
53 /**
54  * @brief whether nfc is enabled or disabled.
55  * @return true/false - nfc is enabled/disabled.
56  */
IsNfcActive()57 bool NfccNciAdapter::IsNfcActive()
58 {
59     bool isActive = (isNfcEnabled_ && !isDisabling_);
60     return isActive;
61 }
62 
63 /**
64  * @brief whether tag is active.
65  * @return True/false tag is active/deactive.
66  */
IsTagActive() const67 bool NfccNciAdapter::IsTagActive() const
68 {
69     return isTagActive_;
70 }
71 
72 /**
73  * @brief Set card emulation listener to receive field on/off event.
74  * @param listener The listener to receive field on/off event.
75  */
SetCeHostListener(std::weak_ptr<INciCeInterface::ICeHostListener> listener)76 void NfccNciAdapter::SetCeHostListener(std::weak_ptr<INciCeInterface::ICeHostListener> listener)
77 {
78     cardEmulationListener_ = listener;
79 }
80 
81 /**
82  * @brief Start or stop rf discovery.
83  * @param isStart True/false start/stop rf discovery.
84  */
StartRfDiscovery(bool isStart)85 void NfccNciAdapter::StartRfDiscovery(bool isStart)
86 {
87     DebugLog("NfccNciAdapter::StartRfDiscovery: isStart= %{public}d", isStart);
88     tNFA_STATUS status = NFA_STATUS_FAILED;
89     if (isStart) {
90         status = NFA_StartRfDiscovery();
91     } else {
92         status = NFA_StopRfDiscovery();
93     }
94     if (status == NFA_STATUS_OK) {
95         if (nfcStartStopPollingEvent_.Wait(NCI_EVT_WAIT_TIMEOUT) == false) {
96             ErrorLog("NfccNciAdapter::StartRfDiscovery timeout. isStart = %{public}d", isStart);
97             return;
98         }
99         rfEnabled_ = isStart;
100     } else {
101         ErrorLog("NfccNciAdapter::StartRfDiscovery: Failed to start/stop RF discovery; error=0x%{public}X", status);
102     }
103 }
104 
StartPolling(tNFA_TECHNOLOGY_MASK techMask)105 tNFA_STATUS NfccNciAdapter::StartPolling(tNFA_TECHNOLOGY_MASK techMask)
106 {
107     DebugLog("NfccNciAdapter::StartPolling, techMask = 0x%{public}02X", techMask);
108     tNFA_STATUS status = NFA_EnablePolling(techMask);
109     if (status == NFA_STATUS_OK) {
110         DebugLog("StartPolling: wait for enable event");
111         // wait for NFA_POLL_ENABLED_EVT
112         if (nfcStartStopPollingEvent_.Wait(NCI_EVT_WAIT_TIMEOUT) == false) {
113             ErrorLog("NfccNciAdapter::StartPolling timeout.");
114             return status;
115         }
116         pollingEnabled_ = true;
117     } else {
118         ErrorLog("NfccNciAdapter::StartPolling: fail enable polling; error = 0x%{public}X", status);
119     }
120     return status;
121 }
122 
StopPolling()123 tNFA_STATUS NfccNciAdapter::StopPolling()
124 {
125     DebugLog("NfccNciAdapter::StopPolling");
126     tNFA_STATUS status = NFA_DisablePolling();
127     if (status == NFA_STATUS_OK) {
128         pollingEnabled_ = false;
129         // wait for NFA_POLL_DISABLED_EVT
130         if (nfcStartStopPollingEvent_.Wait(NCI_EVT_WAIT_TIMEOUT) == false) {
131             ErrorLog("NfccNciAdapter::StopPolling timeout.");
132         }
133     } else {
134         ErrorLog("NfccNciAdapter::StopPolling: fail disable polling; error = 0x%{public}X", status);
135     }
136     return status;
137 }
138 
IsDiscTypeListen(tNFC_ACTIVATE_DEVT & actNtf)139 bool NfccNciAdapter::IsDiscTypeListen(tNFC_ACTIVATE_DEVT& actNtf)
140 {
141     return ((actNtf.rf_tech_param.mode == NFC_DISCOVERY_TYPE_LISTEN_A) ||
142             (actNtf.rf_tech_param.mode == NFC_DISCOVERY_TYPE_LISTEN_B) ||
143             (actNtf.rf_tech_param.mode == NFC_DISCOVERY_TYPE_LISTEN_F) ||
144             (actNtf.rf_tech_param.mode == NFC_DISCOVERY_TYPE_LISTEN_A_ACTIVE) ||
145             (actNtf.rf_tech_param.mode == NFC_DISCOVERY_TYPE_LISTEN_F_ACTIVE) ||
146             (actNtf.rf_tech_param.mode == NFC_DISCOVERY_TYPE_LISTEN_ISO15693) ||
147             (actNtf.rf_tech_param.mode == NFC_DISCOVERY_TYPE_LISTEN_B_PRIME) ||
148             (actNtf.intf_param.type == NFC_INTERFACE_EE_DIRECT_RF));
149 }
150 
DoNfaActivatedEvt(tNFA_CONN_EVT_DATA * eventData)151 void NfccNciAdapter::DoNfaActivatedEvt(tNFA_CONN_EVT_DATA* eventData)
152 {
153     uint8_t actProto = (tNFA_INTF_TYPE)eventData->activated.activate_ntf.protocol;
154     if (actProto == NFC_PROTOCOL_T5T && TagNciAdapterNtf::GetInstance().GetDiscRstEvtNum()) {
155         // protocol T5T only support single protocol detection
156         InfoLog("DoNfaActivatedEvt, NFC_PROTOCOL_T5T not support multi tag.");
157         TagNciAdapterNtf::GetInstance().SetDiscRstEvtNum(0);
158     }
159 #if (NXP_EXTNS == TRUE)
160     TagNciAdapterCommon::GetInstance().isIsoDepDhReqFailed_ = false;
161 #endif
162     // logic for SAK28 issue
163     if (g_isIsoMifareFlag) {
164         InfoLog("DoNfaActivatedEvt(SAK28) - ISOMIFARE data cleanup");
165         g_isIsoMifareFlag = false;
166         g_isoMifareBitMap = 0;
167         (void)memset_s(isoMifareUid, sizeof(isoMifareUid), 0, sizeof(isoMifareUid));
168     }
169 
170     // sync activated iface and proto
171     if ((actProto != NFA_PROTOCOL_NFC_DEP) && !IsDiscTypeListen(eventData->activated.activate_ntf)) {
172         TagNciAdapterNtf::GetInstance().SetCurrRfInterface(
173             (tNFA_INTF_TYPE)eventData->activated.activate_ntf.intf_param.type);
174         TagNciAdapterNtf::GetInstance().SetCurrRfProtocol(actProto);
175 #if (NXP_EXTNS == TRUE)
176         uint8_t mode = eventData->activated.activate_ntf.rf_tech_param.mode;
177         TagNciAdapterNtf::GetInstance().SetCurrRfMode(mode);
178         if (mode == NFC_DISCOVERY_TYPE_POLL_B || mode == NFC_DISCOVERY_TYPE_POLL_B_PRIME) {
179             TagNciAdapterNtf::GetInstance().SetNfcID0ForTypeB(
180                 eventData->activated.activate_ntf.rf_tech_param.param.pb.nfcid0);
181         }
182 #endif
183     }
184 
185 #if (NXP_EXTNS == TRUE)
186     //clear MulitProto Mifare Tag state on single proto tag activation
187     if (!TagNciAdapterNtf::GetInstance().GetIsMultiTag() &&
188         TagNciAdapterNtf::GetInstance().IsMultiMFCTag()) {
189         TagNciAdapterNtf::GetInstance().ClearMultiMFCTagState();
190     }
191 #endif
192 
193     // handle ActivatedResult for Mifare tag
194     if (Extns::GetInstance().EXTNS_GetConnectFlag() == true) {
195         TagNciAdapterNtf::GetInstance().SetTagActivated();
196         TagNciAdapterNtf::GetInstance().SetConnectStatus(true);
197         return;
198     }
199 
200     // handle ActivationResult for normal tags
201     if (isDisabling_ || !isNfcEnabled_) {
202         return;
203     }
204     isTagActive_ = true;
205     if (TagNciAdapterNtf::GetInstance().IsSwitchingRfIface()) {
206 #if (NXP_EXTNS == TRUE)
207         if (TagNciAdapterNtf::GetInstance().IsExpectedActRfProtocol(actProto)) {
208             TagNciAdapterNtf::GetInstance().SetTagActivated();
209         }
210 #else
211         TagNciAdapterNtf::GetInstance().SetTagActivated();
212 #endif
213         TagNciAdapterNtf::GetInstance().SetConnectStatus(true);
214         return;
215     }
216     TagNciAdapterNtf::GetInstance().SetTagActivated();
217     TagNciAdapterNtf::GetInstance().ResetTagFieldOnFlag();
218 
219     if (actProto == NFA_PROTOCOL_NFC_DEP) {
220         // we do not support peer to peer
221     } else {
222         TagNciAdapterNtf::GetInstance().HandleActivatedResult(eventData);
223         if (TagNciAdapterNtf::GetInstance().GetDiscRstEvtNum()) {
224             // do deactivate to sleep and wait for reselect for multi tag
225             NFA_Deactivate(true);
226         }
227         // skipped notify secureelement
228     }
229 }
230 
DoNfaDeactivatedEvt(tNFA_CONN_EVT_DATA * eventData)231 void NfccNciAdapter::DoNfaDeactivatedEvt(tNFA_CONN_EVT_DATA* eventData)
232 {
233     tNFA_DEACTIVATE_TYPE type = eventData->deactivated.type;
234     TagNciAdapterNtf::GetInstance().SetTagDeactivated((type == NFA_DEACTIVATE_TYPE_SLEEP));
235     TagNciAdapterNtf::GetInstance().SelectTheNextTag();
236     if (eventData->deactivated.type != NFA_DEACTIVATE_TYPE_SLEEP) {
237         isTagActive_ = false;
238 #if (NXP_EXTNS == TRUE)
239         TagNciAdapterNtf::GetInstance().SetDiscRstEvtNum(0);
240 #endif
241         TagNciAdapterNtf::GetInstance().ResetTagFieldOnFlag();
242 #if (NXP_EXTNS == TRUE)
243         if (!TagNciAdapterNtf::GetInstance().IsSwitchingRfIface()) {
244             TagNciAdapterNtf::GetInstance().HandleDeactivatedResult(type);
245             TagNciAdapterNtf::GetInstance().AbortWait();
246         }
247 #else
248         TagNciAdapterNtf::GetInstance().HandleDeactivatedResult(type);
249         TagNciAdapterNtf::GetInstance().AbortWait();
250 #endif
251         TagNciAdapterNtf::GetInstance().SetIsMultiTag(false);
252     } else if (TagNciAdapterNtf::GetInstance().IsTagDeactivating() ||
253                Extns::GetInstance().EXTNS_GetDeactivateFlag()) {
254         TagNciAdapterNtf::GetInstance().SetDeactivatedStatus();
255     }
256     // skipped special process for Secure Element transaction
257 }
258 
DoNfaDiscResultEvt(tNFA_CONN_EVT_DATA * eventData)259 void NfccNciAdapter::DoNfaDiscResultEvt(tNFA_CONN_EVT_DATA* eventData)
260 {
261     static tNFA_STATUS status = eventData->disc_result.status;
262     DebugLog("DoNfaDiscResultEvt: status = 0x%{public}X", status);
263 #if (NXP_EXTNS == TRUE)
264     static uint8_t prevMoreVal = 0x00;
265     uint8_t curMoreVal = eventData->disc_result.discovery_ntf.more;
266     bool isMoreValid = true;
267     // 01 means the last notification due to nfcc reaching resource limit
268     // 02 means more notification
269     if ((curMoreVal == 0x01) && (prevMoreVal != 0x02)) {
270         ErrorLog("DoNfaDiscResultEvt: invalid more value");
271         isMoreValid = false;
272     } else {
273         DebugLog("DoNfaDiscResultEvt: valid more value");
274         isMoreValid = true;
275         prevMoreVal = curMoreVal;
276     }
277 #endif
278     if (!isMoreValid) {
279         TagNciAdapterNtf::GetInstance().SetDiscRstEvtNum(0);
280     } else {
281         TagNciAdapterNtf::GetInstance().HandleDiscResult(eventData);
282         HandleDiscNtf(&eventData->disc_result.discovery_ntf);
283     }
284 }
285 
HandleDiscNtf(tNFC_RESULT_DEVT * discNtf)286 void NfccNciAdapter::HandleDiscNtf(tNFC_RESULT_DEVT* discNtf)
287 {
288     // logic for SAK28 issue
289     if (discNtf->rf_disc_id == NCI_RF_DISCOVER_NTF_FIRST_ID) {
290         (void)memset_s(isoMifareUid, sizeof(isoMifareUid), 0, sizeof(isoMifareUid));
291         g_isoMifareBitMap = 0;
292         errno_t err = EOK;
293         if (discNtf->rf_tech_param.mode == NFC_DISCOVERY_TYPE_POLL_A) {
294             err = memcpy_s(isoMifareUid, sizeof(isoMifareUid),
295                            discNtf->rf_tech_param.param.pa.nfcid1,
296                            discNtf->rf_tech_param.param.pa.nfcid1_len);
297             if (err != EOK) {
298                 ErrorLog("HandleDiscNtf:(SAK28) memcpy_s first uid failed, err = %{public}d", err);
299             }
300             if (discNtf->protocol == NFC_PROTOCOL_ISO_DEP) {
301                 g_isoMifareBitMap |= FLAG_MULTI_TAG_ISO_DEP;
302             } else if (discNtf->protocol == NFC_PROTOCOL_MIFARE) {
303                 g_isoMifareBitMap |= FLAG_MULTI_TAG_MIFARE;
304             }
305         }
306     } else if (discNtf->rf_disc_id == NCI_RF_DISCOVER_NTF_SECOND_ID) {
307         if (discNtf->rf_tech_param.mode == NFC_DISCOVERY_TYPE_POLL_A) {
308             if (memcmp(isoMifareUid, discNtf->rf_tech_param.param.pa.nfcid1,
309                        discNtf->rf_tech_param.param.pa.nfcid1_len) == 0) {
310                 InfoLog("HandleDiscNtf:(SAK28) multicard with same uid");
311                 if (discNtf->protocol == NFC_PROTOCOL_ISO_DEP) {
312                     g_isoMifareBitMap |= FLAG_MULTI_TAG_ISO_DEP;
313                 } else if (discNtf->protocol == NFC_PROTOCOL_MIFARE) {
314                     g_isoMifareBitMap |= FLAG_MULTI_TAG_MIFARE;
315                 }
316             }
317         }
318     }
319     InfoLog("HandleDiscNtf:(SAK28) g_isoMifareBitMap = 0x%{public}02X, g_isIsoMifareFlag = %{public}d",
320             g_isoMifareBitMap, g_isIsoMifareFlag);
321     if ((g_isoMifareBitMap & FLAG_MULTI_TAG_ISO_DEP) && (g_isoMifareBitMap & FLAG_MULTI_TAG_MIFARE) &&
322          g_isIsoMifareFlag && readerModeEnabled_ == false) {
323         InfoLog("HandleDiscNtf:(SAK28) same tag discovered twice, skip Mifare detection");
324         g_isoMifareBitMap = 0;
325         TagNciAdapterNtf::GetInstance().SetSkipMifareInterface();
326     }
327 
328     // logic for normal tag
329     if (discNtf->more == NCI_DISCOVER_NTF_MORE) {
330         // there is more discovery notification coming
331         TagNciAdapterNtf::GetInstance().SetDiscRstEvtNum(TagNciAdapterNtf::GetInstance().GetDiscRstEvtNum() + 1);
332         return;
333     }
334     if (TagNciAdapterNtf::GetInstance().GetDiscRstEvtNum() > 0) {
335         TagNciAdapterNtf::GetInstance().SetIsMultiTag(true);
336     }
337     // select the first tag of multiple tags that is discovered
338     TagNciAdapterNtf::GetInstance().SelectTheFirstTag();
339 }
340 
DoNfaSelectResultEvt(uint8_t status)341 void NfccNciAdapter::DoNfaSelectResultEvt(uint8_t status)
342 {
343     TagNciAdapterNtf::GetInstance().HandleSelectResult(status);
344 }
345 
DoNfaPresenceEvt(tNFA_CONN_EVT_DATA * eventData)346 void NfccNciAdapter::DoNfaPresenceEvt(tNFA_CONN_EVT_DATA* eventData)
347 {
348     static tNFA_STATUS curStatus = NFA_STATUS_FAILED;
349     if (eventData->status != curStatus) {
350         curStatus = eventData->status;
351     }
352     TagNciAdapterNtf::GetInstance().HandleFieldCheckResult(curStatus);
353 
354     // logic for SAK28 issue
355     if (curStatus != NFA_STATUS_OK) {
356         if ((g_isoMifareBitMap & FLAG_MULTI_TAG_ISO_DEP) && (g_isoMifareBitMap & FLAG_MULTI_TAG_MIFARE)) {
357             InfoLog("DoNfaPresenceEvt:(SAK28) set g_isIsoMifareFlag");
358             g_isIsoMifareFlag = true;
359         }
360         g_isoMifareBitMap = 0;
361     }
362 }
363 
NfcConnectionCallback(uint8_t connEvent,tNFA_CONN_EVT_DATA * eventData)364 void NfccNciAdapter::NfcConnectionCallback(uint8_t connEvent, tNFA_CONN_EVT_DATA* eventData)
365 {
366     if (eventData == nullptr) {
367         ErrorLog("NfcConnectionCallback, eventData is null. connEvent = %{public}X", connEvent);
368         return;
369     }
370     switch (connEvent) {
371         /* whether polling successfully started */
372         case NFA_POLL_ENABLED_EVT: {
373             DebugLog("NfaConnectionCallback: NFA_POLL_ENABLED_EVT: status = %{public}u", eventData->status);
374             NfccNciAdapter::GetInstance().DoNfaPollEnabledDisabledEvt();
375             break;
376         }
377         /* Listening/Polling stopped */
378         case NFA_POLL_DISABLED_EVT: {
379             DebugLog("NfaConnectionCallback: NFA_POLL_DISABLED_EVT: status = %{public}u", eventData->status);
380             NfccNciAdapter::GetInstance().DoNfaPollEnabledDisabledEvt();
381             break;
382         }
383         /* RF Discovery started event */
384         case NFA_RF_DISCOVERY_STARTED_EVT: {
385             DebugLog("NfaConnectionCallback: NFA_RF_DISCOVERY_STARTED_EVT: status = %{public}u", eventData->status);
386             NfccNciAdapter::GetInstance().DoNfaPollEnabledDisabledEvt();
387             break;
388         }
389         /* RF Discovery stopped event */
390         case NFA_RF_DISCOVERY_STOPPED_EVT: {
391             DebugLog("NfaConnectionCallback: NFA_RF_DISCOVERY_STOPPED_EVT: status = %{public}u", eventData->status);
392             NfccNciAdapter::GetInstance().DoNfaPollEnabledDisabledEvt();
393             break;
394         }
395         /* NFC deactivate failed event */
396         case NFA_DEACTIVATE_FAIL_EVT: {
397             DebugLog("NfaConnectionCallback: NFA_DEACTIVATE_FAIL_EVT: status = %{public}u", eventData->status);
398 #if (NXP_EXTNS == TRUE)
399             if (eventData->status == NFC_DEACTIVATE_REASON_DH_REQ_FAILED) {
400                 TagNciAdapterCommon::GetInstance().isIsoDepDhReqFailed_ = true;
401             }
402 #endif
403             break;
404         }
405         /* NFC link/protocol activated */
406         case NFA_ACTIVATED_EVT: {
407             DebugLog("NfaConnectionCallback: NFA_ACTIVATED_EVT");
408             NfccNciAdapter::GetInstance().DoNfaActivatedEvt(eventData);
409             break;
410         }
411         /* NFC link/protocol deactivated */
412         case NFA_DEACTIVATED_EVT: {
413             DebugLog("NfaConnectionCallback: NFA_DEACTIVATED_EVT");
414             NfccNciAdapter::GetInstance().DoNfaDeactivatedEvt(eventData);
415             break;
416         }
417         case NFA_DISC_RESULT_EVT: {
418             DebugLog("NfaConnectionCallback: NFA_DISC_RESULT_EVT");
419             NfccNciAdapter::GetInstance().DoNfaDiscResultEvt(eventData);
420             break;
421         }
422         case NFA_SELECT_RESULT_EVT: {
423             DebugLog("NfaConnectionCallback: NFA_SELECT_RESULT_EVT: status = 0x%{public}X", eventData->status);
424             NfccNciAdapter::GetInstance().DoNfaSelectResultEvt(eventData->status);
425             break;
426         }
427         /* Data message received (for non-NDEF reads) */
428         case NFA_DATA_EVT: {
429             DebugLog("NfaConnectionCallback: NFA_DATA_EVT: status = 0x%{public}X, len = %{public}d",
430                 eventData->status, eventData->data.len);
431             TagNciAdapterNtf::GetInstance().HandleTranceiveData(eventData->status, eventData->data.p_data,
432                 eventData->data.len);
433             break;
434         }
435         case NFA_PRESENCE_CHECK_EVT: {
436             NfccNciAdapter::GetInstance().DoNfaPresenceEvt(eventData);
437             break;
438         }
439         case NFA_READ_CPLT_EVT: {
440             DebugLog("NfaConnectionCallback: NFA_READ_CPLT_EVT: status = 0x%{public}X", eventData->status);
441             TagNciAdapterNtf::GetInstance().HandleReadComplete(eventData->status);
442             break;
443         }
444         case NFA_WRITE_CPLT_EVT: {
445             DebugLog("NfaConnectionCallback: NFA_WRITE_CPLT_EVT: status = 0x%{public}X", eventData->status);
446             TagNciAdapterNtf::GetInstance().HandleWriteComplete(eventData->status);
447             break;
448         }
449         case NFA_FORMAT_CPLT_EVT: {
450             DebugLog("NfaConnectionCallback: NFA_FORMAT_CPLT_EVT: status = 0x%{public}X", eventData->status);
451             TagNciAdapterNtf::GetInstance().HandleFormatComplete(eventData->status);
452             break;
453         }
454         case NFA_NDEF_DETECT_EVT: {
455             DebugLog("NfaConnectionCallback: NFA_NDEF_DETECT_EVT: status = 0x%{public}X, protocol = 0x%{public}X,"
456                 " max_size = %{public}u, cur_size = %{public}u, flags = 0x%{public}X",
457                 eventData->ndef_detect.status, eventData->ndef_detect.protocol,
458                 static_cast<uint32_t>(eventData->ndef_detect.max_size),
459                 static_cast<uint32_t>(eventData->ndef_detect.cur_size), eventData->ndef_detect.flags);
460             TagNciAdapterNtf::GetInstance().HandleNdefCheckResult(eventData->ndef_detect.status,
461                 eventData->ndef_detect.cur_size, eventData->ndef_detect.flags, eventData->ndef_detect.max_size);
462             break;
463         }
464         case NFA_SET_TAG_RO_EVT: {
465             DebugLog("NfaDeviceManagementCallback: NFA_SET_TAG_RO_EVT; status = 0x%{public}X", eventData->status);
466             TagNciAdapterNtf::GetInstance().HandleSetReadOnlyResult(eventData->status);
467             break;
468         }
469         default: {
470             DebugLog("NfaConnectionCallback: unknown event %{public}u", connEvent);
471             break;
472         }
473     }
474 }
475 
476 /* method for SAK28 issue */
SendActEvtForSak28Tag(uint8_t connEvent,tNFA_CONN_EVT_DATA * eventData)477 void NfccNciAdapter::SendActEvtForSak28Tag(uint8_t connEvent, tNFA_CONN_EVT_DATA* eventData)
478 {
479     NfcConnectionCallback(connEvent, eventData);
480 }
481 
DoNfaPollEnabledDisabledEvt()482 void NfccNciAdapter::DoNfaPollEnabledDisabledEvt()
483 {
484     SynchronizeGuard guard(nfcStartStopPollingEvent_);
485     nfcStartStopPollingEvent_.NotifyOne();
486 }
487 
DoNfaDmEnableEvt(tNFA_DM_CBACK_DATA * eventData)488 void NfccNciAdapter::DoNfaDmEnableEvt(tNFA_DM_CBACK_DATA* eventData)
489 {
490     SynchronizeGuard guard(nfcEnableEvent_);
491     isNfcEnabled_ = (eventData->status == NFA_STATUS_OK);
492     isDisabling_ = false;
493     nfcEnableEvent_.NotifyOne();
494 }
495 
DoNfaDmDisableEvt(tNFA_DM_CBACK_DATA * eventData)496 void NfccNciAdapter::DoNfaDmDisableEvt(tNFA_DM_CBACK_DATA* eventData)
497 {
498     SynchronizeGuard guard(nfcDisableEvent_);
499     isNfcEnabled_ = false;
500     isDisabling_ = false;
501     nfcDisableEvent_.NotifyOne();
502 }
503 
504 /**
505  * @brief Whether rf field is on or off.
506  * @return True/false to be field on/off.
507  */
isRfFieldOn()508 bool NfccNciAdapter::isRfFieldOn()
509 {
510     if (isRfFieldOn_) {
511         return true;
512     }
513     uint64_t currTime = KITS::NfcSdkCommon::GetCurrentTime();
514     // If it is less than 50ms before fieldoff, then it is considered field on;
515     if ((currTime - lastRfFieldTime) < 50) {
516         return true;
517     }
518     return false;
519 }
520 
DoNfaDmRfFieldEvt(tNFA_DM_CBACK_DATA * eventData)521 void NfccNciAdapter::DoNfaDmRfFieldEvt(tNFA_DM_CBACK_DATA* eventData)
522 {
523     lastRfFieldTime = 0;
524     isRfFieldOn_ = false;
525     if (cardEmulationListener_.expired()) {
526         ErrorLog("DoNfaDmRfFieldEvt: cardEmulationListener_ is null");
527         return;
528     }
529     if (eventData->rf_field.status == NFA_STATUS_OK) {
530         lastRfFieldTime = KITS::NfcSdkCommon::GetCurrentTime();
531         // notify field on/off event to nfc service.
532         if (eventData->rf_field.rf_field_status == NFA_DM_RF_FIELD_ON) {
533             isRfFieldOn_ = true;
534             cardEmulationListener_.lock()->FieldActivated();
535         } else {
536             isRfFieldOn_ = false;
537             cardEmulationListener_.lock()->FieldDeactivated();
538         }
539     }
540 }
541 
DoNfaDmSetConfig()542 void NfccNciAdapter::DoNfaDmSetConfig()
543 {
544     SynchronizeGuard guard(nfcSetConfigEvent_);
545     DebugLog("NfaDeviceManagementCallback: NFA_DM_SET_CONFIG_EVT");
546     nfcSetConfigEvent_.NotifyOne();
547 }
DoNfaSetPowerSubState()548 void NfccNciAdapter::DoNfaSetPowerSubState()
549 {
550     SynchronizeGuard guard(nfcSetPowerSubStateEvent_);
551     nfcSetPowerSubStateEvent_.NotifyOne();
552 }
553 
DoNfaDmNfccTimeoutEvt(tNFA_DM_CBACK_DATA * eventData)554 void NfccNciAdapter::DoNfaDmNfccTimeoutEvt(tNFA_DM_CBACK_DATA* eventData)
555 {
556     {
557         SynchronizeGuard guard(nfcEnableEvent_);
558         nfcEnableEvent_.NotifyOne();
559     }
560     {
561         SynchronizeGuard guard(nfcDisableEvent_);
562         nfcDisableEvent_.NotifyOne();
563     }
564     {
565         SynchronizeGuard guard(nfcStartStopPollingEvent_);
566         nfcStartStopPollingEvent_.NotifyOne();
567     }
568     discoveryEnabled_ = false;
569     pollingEnabled_ = false;
570 
571     if (IsNfcActive()) {
572         NFA_Disable(FALSE);
573         isDisabling_ = true;
574     } else {
575         isNfcEnabled_ = false;
576         isDisabling_ = false;
577     }
578 }
579 
NfcDeviceManagementCallback(uint8_t dmEvent,tNFA_DM_CBACK_DATA * eventData)580 void NfccNciAdapter::NfcDeviceManagementCallback(uint8_t dmEvent, tNFA_DM_CBACK_DATA* eventData)
581 {
582     if (eventData == nullptr) {
583         ErrorLog("NfcDeviceManagementCallback, eventData is null. dmEvent = %{public}X", dmEvent);
584         return;
585     }
586     DebugLog("NfaDeviceManagementCallback: event= %{public}u", dmEvent);
587 
588     switch (dmEvent) {
589         /* Result of NFA_Enable */
590         case NFA_DM_ENABLE_EVT: {
591             DebugLog("NfaDeviceManagementCallback: NFA_DM_ENABLE_EVT; status = 0x%{public}X", eventData->status);
592             NfccNciAdapter::GetInstance().DoNfaDmEnableEvt(eventData);
593             break;
594         }
595         /* Result of NFA_Disable */
596         case NFA_DM_DISABLE_EVT: {
597             DebugLog("NfaDeviceManagementCallback: NFA_DM_DISABLE_EVT");
598             NfccNciAdapter::GetInstance().DoNfaDmDisableEvt(eventData);
599             break;
600         }
601 
602         case NFA_DM_RF_FIELD_EVT: {
603             DebugLog("NfaDeviceManagementCallback: NFA_DM_RF_FIELD_EVT; status = 0x%{public}X; field status = "
604                 "%{public}u", eventData->rf_field.status, eventData->rf_field.rf_field_status);
605             NfccNciAdapter::GetInstance().DoNfaDmRfFieldEvt(eventData);
606             break;
607         }
608 
609         case NFA_DM_NFCC_TRANSPORT_ERR_EVT:
610         case NFA_DM_NFCC_TIMEOUT_EVT: {
611             NfccNciAdapter::GetInstance().DoNfaDmNfccTimeoutEvt(eventData);
612             break;
613         }
614 
615         case NFA_DM_SET_CONFIG_EVT: {
616             NfccNciAdapter::GetInstance().DoNfaDmSetConfig();
617             break;
618         }
619 
620         case NFA_DM_SET_POWER_SUB_STATE_EVT: {
621             DebugLog("NfaDeviceManagementCallback: NFA_DM_SET_POWER_SUB_STATE_EVT; status=0x%{public}X",
622                      eventData->power_mode.status);
623             NfccNciAdapter::GetInstance().DoNfaSetPowerSubState();
624             break;
625         }
626 
627         case NFA_SET_TAG_RO_EVT: {
628             DebugLog("NfaDeviceManagementCallback: NFA_SET_TAG_RO_EVT; status = 0x%{public}X", eventData->status);
629             TagNciAdapterNtf::GetInstance().HandleSetReadOnlyResult(eventData->status);
630             break;
631         }
632         default: {
633             ErrorLog("NfaDeviceManagementCallback: unknown event %{public}d", dmEvent);
634             break;
635         }
636     }
637 }
638 
NfaRegVSCback(bool isRegster,tNFA_VSC_CBACK * vscCback)639 tNFA_STATUS NfccNciAdapter::NfaRegVSCback(bool isRegster, tNFA_VSC_CBACK* vscCback)
640 {
641     return NFA_STATUS_OK;
642 }
643 
PrivateNciCallback(uint8_t event,uint16_t paramLen,uint8_t * param)644 void NfccNciAdapter::PrivateNciCallback(uint8_t event, uint16_t paramLen, uint8_t *param)
645 {
646 }
647 
648 /**
649  * @brief Initialize nfc.
650  * @return true/false - initialize is successful or not successful.
651  */
Initialize()652 bool NfccNciAdapter::Initialize()
653 {
654     DebugLog("NfccNciAdapter::Initialize");
655     tNFA_STATUS status = NFA_STATUS_FAILED;
656     if (isNfcEnabled_) {
657         WarnLog("NfccNciAdapter::Initialize: already enabled");
658         return isNfcEnabled_;
659     }
660 
661     NfcAdaptation::GetInstance().Initialize();  // start GKI, NCI task, NFC task
662     SynchronizeGuard guard(nfcEnableEvent_);
663     tHAL_NFC_ENTRY* halFuncEntries = NfcAdaptation::GetInstance().GetHalEntryFuncs();
664 
665     NFA_Init(halFuncEntries);
666     status = NFA_Enable(NfcDeviceManagementCallback, NfcConnectionCallback);
667     if (status == NFA_STATUS_OK) {
668         if (nfcEnableEvent_.Wait(NCI_EVT_WAIT_TIMEOUT) == false) {
669             ErrorLog("NfccNciAdapter::Initialize : Enable nfc timeout");
670         }
671     }
672     Extns::GetInstance().EXTNS_Init(NfcDeviceManagementCallback, NfcConnectionCallback);
673     NfaRegVSCback(true, PrivateNciCallback);
674 
675     if (status == NFA_STATUS_OK) {
676         // sIsNfaEnabled indicates whether stack started successfully
677         if (isNfcEnabled_) {
678 #ifdef _NFC_SERVICE_HCE_
679             NciBalCe::GetInstance().InitializeCe();
680             HciManager::GetInstance().Initialize();
681 #endif
682             isRoutingInited_ = RoutingManager::GetInstance().Initialize();
683             TagNciAdapterNtf::GetInstance().RegisterNdefHandler();
684             discoveryDuration_ = DEFAULT_DISCOVERY_DURATION;
685             NFA_SetRfDiscoveryDuration(static_cast<uint16_t>(discoveryDuration_));
686             DebugLog("NfccNciAdapter::Initialize: nfc enabled = %{public}d", isNfcEnabled_);
687             return isNfcEnabled_;
688         }
689     }
690     ErrorLog("NfccNciAdapter::Initialize: fail nfa enable; error = %{public}d", status);
691     if (isNfcEnabled_) {
692         Extns::GetInstance().EXTNS_Close();
693         status = NFA_Disable(false);
694         DebugLog("NfccNciAdapter::Initialize: status = %{public}d", status);
695     }
696     NfcAdaptation::GetInstance().Finalize();
697     DebugLog("NfccNciAdapter::Initialize: nfc enabled = %{public}d", isNfcEnabled_);
698     return isNfcEnabled_;
699 }
700 
701 /**
702  * @brief Deinitialize nfc.
703  * @return true/false - deinitialize is successful or not successful.
704  */
Deinitialize()705 bool NfccNciAdapter::Deinitialize()
706 {
707     DebugLog("NfccNciAdapter::Deinitialize");
708     if (!IsNfcActive()) {
709         WarnLog("NfccNciAdapter::Deinitialize: Nfc not initialized");
710         return NFA_STATUS_OK;
711     }
712 
713     tNFA_STATUS status = NFA_STATUS_OK;
714     isDisabling_ = true;
715 
716 #ifdef _NFC_SERVICE_HCE_
717     NciBalCe::GetInstance().Deinitialize();
718 #endif
719     RoutingManager::GetInstance().Deinitialize();
720 
721     if (isNfcEnabled_) {
722         SynchronizeGuard guard(nfcDisableEvent_);
723         Extns::GetInstance().EXTNS_Close();
724         status = NFA_Disable(true);
725         if (status == NFA_STATUS_OK) {
726             if (nfcDisableEvent_.Wait(NCI_EVT_WAIT_TIMEOUT) == false) {
727                 ErrorLog("NfccNciAdapter::Deinitialize : disable nfc timeout");
728             } else {
729                 DebugLog("NfccNciAdapter::Deinitialize: wait for completion");
730             }
731         } else {
732             ErrorLog("NfccNciAdapter::Deinitialize: fail disable; error = 0x%{public}X", status);
733         }
734     }
735     isNfcEnabled_ = false;
736     isRoutingInited_ = false;
737     discoveryEnabled_ = false;
738     isDisabling_ = false;
739     pollingEnabled_ = false;
740 
741     NfcAdaptation::GetInstance().Finalize();
742     NfaRegVSCback(false, PrivateNciCallback);
743     DebugLog("NfccNciAdapter::Deinitialize: exit");
744     return (status == NFA_STATUS_OK);
745 }
746 
747 /**
748  * @brief whether to enable discovery for nfc.
749  * @param techMask Supported rf technology for nfc.
750  * @param enableReaderMode True/false to enable/disable reader mode
751  * @param enableHostRouting True/false to enable/disable host routing
752  * @param restart True/false to restart or not restart
753  */
EnableDiscovery(uint16_t techMask,bool enableReaderMode,bool enableHostRouting,bool restart)754 void NfccNciAdapter::EnableDiscovery(uint16_t techMask, bool enableReaderMode, bool enableHostRouting, bool restart)
755 {
756     DebugLog("NfccNciAdapter::EnableDiscovery");
757     if (!IsNfcActive()) {
758         ErrorLog("NfccNciAdapter::EnableDiscovery: Nfc not initialized.");
759         return;
760     }
761 
762     if (discoveryEnabled_ && !restart) {
763         WarnLog("NfccNciAdapter::EnableDiscovery: already discovering");
764         return;
765     }
766 
767     if (rfEnabled_) {
768         // Stop RF discovery to reconfigure
769         StartRfDiscovery(false);
770     }
771 
772     tNFA_TECHNOLOGY_MASK technologyMask = techMask & DEFAULT_TECH_MASK;
773     if (technologyMask != 0) {
774         StopPolling();
775         StartPolling(technologyMask);
776         if (pollingEnabled_) {
777             if (enableReaderMode && !readerModeEnabled_) {
778                 readerModeEnabled_ = true;
779                 NFA_DisableListening();
780                 NFA_SetRfDiscoveryDuration(DISCOVERY_DURATION);
781             } else if (!enableReaderMode && readerModeEnabled_) {
782                 readerModeEnabled_ = false;
783                 NFA_EnableListening();
784                 NFA_SetRfDiscoveryDuration(DISCOVERY_DURATION);
785             }
786         }
787     } else {
788         StopPolling();
789     }
790 #ifdef _NFC_SERVICE_HCE_
791     NciBalCe::GetInstance().EnableHostRouting(enableHostRouting);
792     NciBalCe::GetInstance().CommitRouting();
793 #endif
794 
795     StartRfDiscovery(true);
796     discoveryEnabled_ = true;
797     DebugLog("NfccNciAdapter::EnableDiscovery: exit");
798 }
799 
800 /**
801  * @brief Disable discovery for nfc.
802  */
DisableDiscovery()803 void NfccNciAdapter::DisableDiscovery()
804 {
805     DebugLog("NfccNciAdapter::DisableDiscovery");
806     if (!IsNfcActive()) {
807         ErrorLog("NfccNciAdapter::DisableDiscovery: Nfc not initialized.");
808         return;
809     }
810     if (!discoveryEnabled_) {
811         WarnLog("NfccNciAdapter::DisableDiscovery: already disabled");
812         return;
813     }
814     // Stop RF Discovery.
815     StartRfDiscovery(false);
816     if (pollingEnabled_) {
817         StopPolling();
818     }
819     discoveryEnabled_ = false;
820     readerModeEnabled_ = false;
821     DebugLog("NfccNciAdapter::DisableDiscovery: exit");
822 }
823 
824 /**
825  * @brief Send raw data.
826  * @param rawData Data needed to send
827  * @return True/false to successful/failed to send
828  */
SendRawFrame(std::string & rawData)829 bool NfccNciAdapter::SendRawFrame(std::string& rawData)
830 {
831     uint16_t length = KITS::NfcSdkCommon::GetHexStrBytesLen(rawData);
832     if (length > RAWDATA_MAX_LEN) {
833         ErrorLog("NfccNciAdapter::SendRawFrame rawdatalen invalid. length = %{public}d", length);
834         return false;
835     }
836     uint8_t data[length];
837     for (uint16_t i = 0; i < length; i++) {
838         data[i] = KITS::NfcSdkCommon::GetByteFromHexStr(rawData, i);
839     }
840     tNFA_STATUS status = NFA_SendRawFrame(data, length, 0);
841     InfoLog("SendRawFrame status = %{public}d", status);
842     if (status != NFA_STATUS_OK) {
843         ErrorLog("NfccNciAdapter::SendRawFrame failed. status = %{public}X", status);
844     }
845     return status == NFA_STATUS_OK;
846 }
847 
GetDiscovryParam(unsigned char screenState,unsigned char screenStateMask)848 uint8_t NfccNciAdapter::GetDiscovryParam(unsigned char screenState, unsigned char screenStateMask)
849 {
850     // discocery parameters for SCREEN OFF_LOCKED or OFF_UNLOCKED
851     if (screenState == NFA_SCREEN_STATE_OFF_LOCKED || screenState == NFA_SCREEN_STATE_OFF_UNLOCKED) {
852         return (NCI_POLLING_DH_DISABLE_MASK | NCI_LISTEN_DH_NFCEE_DISABLE_MASK);
853     }
854 
855     // discocery parameters for SCREEN ON_LOCKED
856     if (screenState == NFA_SCREEN_STATE_ON_LOCKED) {
857         return (screenStateMask & NFA_SCREEN_POLLING_TAG_MASK)
858                 ? (NCI_POLLING_DH_ENABLE_MASK | NCI_LISTEN_DH_NFCEE_ENABLE_MASK)
859                 : (NCI_POLLING_DH_DISABLE_MASK | NCI_LISTEN_DH_NFCEE_ENABLE_MASK);
860     }
861 
862     // discocery parameters for SCREEN ON_UNLOCKED
863     if (screenState == NFA_SCREEN_STATE_ON_UNLOCKED) {
864         return (NCI_POLLING_DH_ENABLE_MASK | NCI_LISTEN_DH_NFCEE_ENABLE_MASK);
865     }
866 
867     // default discocery parameters
868     return (NCI_POLLING_DH_ENABLE_MASK | NCI_LISTEN_DH_NFCEE_ENABLE_MASK);
869 }
870 
871 /**
872  * @brief Send the status of screen.
873  * @param screenStateMask The state of screen
874  */
SetScreenStatus(unsigned char screenStateMask)875 void NfccNciAdapter::SetScreenStatus(unsigned char screenStateMask)
876 {
877     DebugLog("NfccNciAdapter::SetScreenStatus");
878     if (!IsNfcActive()) {
879         DebugLog("Do not handle Screen state change when NFC is not active");
880         return;
881     }
882     unsigned char screenState = screenStateMask & NFA_SCREEN_STATE_MASK;
883     if (curScreenState_ == screenState) {
884         WarnLog("Screen state not changed");
885         return;
886     }
887     if (GetNciVersion() != NCI_VERSION_2_0) {
888         WarnLog("only update curScreenState when NCI version under 2.0");
889         curScreenState_ = screenState;
890         return;
891     }
892 
893     // set power state for screen state.
894     tNFA_STATUS status = NFA_STATUS_FAILED;
895     unsigned char curScreenState = NFA_SCREEN_STATE_OFF_LOCKED | NFA_SCREEN_STATE_OFF_UNLOCKED |
896         NFA_SCREEN_STATE_ON_LOCKED | NFA_SCREEN_STATE_UNKNOWN;
897     if ((curScreenState_ & curScreenState) != 0) {
898         SynchronizeGuard guard(nfcSetPowerSubStateEvent_);
899         status = NFA_SetPowerSubStateForScreenState(screenState);
900         if (status != NFA_STATUS_OK) {
901             ErrorLog("NFA_SetPowerSubStateForScreenState fail, error=0x%{public}X, screenState = %{public}X,\
902                 curScreenState_ = %{public}X", status, screenState, curScreenState_);
903             return;
904         }
905         if (nfcSetPowerSubStateEvent_.Wait(NCI_EVT_WAIT_TIMEOUT) == false) {
906             ErrorLog("NfccNciAdapter::SetScreenStatus : SetScreenStatus nfc timeout");
907         }
908     }
909 
910     uint8_t discParam = GetDiscovryParam(screenState, screenStateMask);
911     SynchronizeGuard guard(nfcSetConfigEvent_);
912     status = NFA_SetConfig(NCI_PARAM_ID_CON_DISCOVERY_PARAM,
913         NCI_PARAM_LEN_CON_DISCOVERY_PARAM, &discParam);
914     if (status != NFA_STATUS_OK) {
915         ErrorLog("NFA_SetConfig fail, error=0x%{public}X", status);
916         return;
917     }
918     if (nfcSetConfigEvent_.Wait(NCI_EVT_WAIT_TIMEOUT) == false) {
919         ErrorLog("NfccNciAdapter::SetScreenStatus : nfcSetConfigEvent_ nfc timeout");
920     }
921 
922     if (curScreenState_ == NFA_SCREEN_STATE_ON_UNLOCKED) {
923         SynchronizeGuard guard(nfcSetPowerSubStateEvent_);
924         status = NFA_SetPowerSubStateForScreenState(screenState);
925         if (status != NFA_STATUS_OK) {
926             ErrorLog("NFA_SetPowerSubStateForScreenState fail, error=0x%{public}X", status);
927             return;
928         }
929         if (nfcSetPowerSubStateEvent_.Wait(NCI_EVT_WAIT_TIMEOUT) == false) {
930             ErrorLog("NfccNciAdapter::SetScreenStatus : SetScreenStatus nfc timeout");
931         }
932     }
933     curScreenState_ = screenState;
934     return;
935 }
936 
937 /**
938  * @brief Get nci version.
939  * @return Nci version
940  */
GetNciVersion() const941 uint32_t NfccNciAdapter::GetNciVersion() const
942 {
943     DebugLog("NfccNciAdapter::GetNciVersion");
944     uint8_t version = NFC_GetNCIVersion();
945     return version;
946 }
947 
RegisterT3tIdentifier(const std::string & t3tIdentifier) const948 bool NfccNciAdapter::RegisterT3tIdentifier(const std::string& t3tIdentifier) const
949 {
950     DebugLog("NfccNciAdapter::RegisterT3tIdentifier");
951     return true;
952 }
953 
DeregisterT3tIdentifier(uint32_t handle) const954 void NfccNciAdapter::DeregisterT3tIdentifier(uint32_t handle) const
955 {
956     DebugLog("NfccNciAdapter::DeregisterT3tIdentifier");
957 }
958 
ClearT3tIdentifiersCache()959 void NfccNciAdapter::ClearT3tIdentifiersCache()
960 {
961     DebugLog("NfccNciAdapter::ClearT3tIdentifiersCache");
962 }
963 
GetLfT3tMax()964 uint32_t NfccNciAdapter::GetLfT3tMax()
965 {
966     DebugLog("NfccNciAdapter::GetLfT3tMax");
967     return 0;
968 }
969 
GetLastError()970 uint32_t NfccNciAdapter::GetLastError()
971 {
972     DebugLog("NfccNciAdapter::GetLastError");
973     return 0;
974 }
975 
Abort()976 void NfccNciAdapter::Abort()
977 {
978     InfoLog("NfccNciAdapter::Abort");
979     _exit(0);
980 }
981 
982 /**
983  * @brief Check whether to load firmware.
984  * @return True/false to success/fail to load firmware.
985  */
CheckFirmware()986 bool NfccNciAdapter::CheckFirmware()
987 {
988     DebugLog("NfccNciAdapter::CheckFirmware");
989     NfcAdaptation::GetInstance().Initialize();
990     NfcAdaptation::GetInstance().DownloadFirmware(nullptr, true);
991     NfcAdaptation::GetInstance().Finalize();
992     return true;
993 }
994 
995 /**
996  * @brief Dump debug info for nfc.
997  * @param fd File descriptor to store debug info.
998  */
Dump(uint32_t fd) const999 void NfccNciAdapter::Dump(uint32_t fd) const
1000 {
1001     DebugLog("NfccNciAdapter::Dump, fd=%{public}d", fd);
1002     NfcAdaptation::GetInstance().Dump(fd);
1003 }
1004 
1005 /**
1006  * @brief Reset nfc chip.
1007  */
FactoryReset() const1008 void NfccNciAdapter::FactoryReset() const
1009 {
1010     DebugLog("NfccNciAdapter::FactoryReset");
1011     NfcAdaptation::GetInstance().FactoryReset();
1012 }
1013 
1014 /**
1015  * @brief Close nfc.
1016  */
Shutdown() const1017 void NfccNciAdapter::Shutdown() const
1018 {
1019     DebugLog("NfccNciAdapter::Shutdown");
1020     NfcAdaptation::GetInstance().DeviceShutdown();
1021 }
1022 
1023 /**
1024  * @brief Query whether to start rf discovery.
1025  * @return True/false to start/stop rf discovery.
1026  */
IsRfEbabled()1027 bool NfccNciAdapter::IsRfEbabled()
1028 {
1029     return rfEnabled_;
1030 }
1031 
1032 /**
1033  * @brief Config commit routing table for nfc.
1034  * @return True/false to be successful/failed to config routing table.
1035  */
CommitRouting()1036 bool NfccNciAdapter::CommitRouting()
1037 {
1038     return RoutingManager::GetInstance().CommitRouting();
1039 }
1040 
1041 /**
1042  * @brief Computer routing params.
1043  * @return True/false to be successful/failed to computer params.
1044  */
ComputeRoutingParams(int defaultPaymentType)1045 bool NfccNciAdapter::ComputeRoutingParams(int defaultPaymentType)
1046 {
1047     return RoutingManager::GetInstance().ComputeRoutingParams(defaultPaymentType);
1048 }
1049 
OnCardEmulationData(const std::vector<uint8_t> & data)1050 void NfccNciAdapter::OnCardEmulationData(const std::vector<uint8_t> &data)
1051 {
1052     DebugLog("NfccNciAdapter::OnCardEmulationData");
1053     if (cardEmulationListener_.expired()) {
1054         ErrorLog("cardEmulationListener_ is null");
1055         return;
1056     }
1057     cardEmulationListener_.lock()->OnCardEmulationData(data);
1058 }
1059 
OnCardEmulationActivated()1060 void NfccNciAdapter::OnCardEmulationActivated()
1061 {
1062     DebugLog("NfccNciAdapter::OnCardEmulationActivated");
1063     if (cardEmulationListener_.expired()) {
1064         ErrorLog("cardEmulationListener_ is null");
1065         return;
1066     }
1067     cardEmulationListener_.lock()->OnCardEmulationActivated();
1068 }
OnCardEmulationDeactivated()1069 void  NfccNciAdapter::OnCardEmulationDeactivated()
1070 {
1071     DebugLog("NfccNciAdapter::OnCardEmulationDeactivated");
1072     if (cardEmulationListener_.expired()) {
1073         ErrorLog("cardEmulationListener_ is null");
1074         return;
1075     }
1076     cardEmulationListener_.lock()->OnCardEmulationDeactivated();
1077 }
1078 }  // namespace NCI
1079 }  // namespace NFC
1080 }  // namespace OHOS
1081