• 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 #include "nfcc_nci_adapter.h"
16 #include "nfcc_host.h"
17 #include "loghelper.h"
18 #include "nfc_config.h"
19 #include "nfc_sdk_common.h"
20 #include "nci_adaptations.h"
21 #include "tag_nci_adapter.h"
22 
23 using namespace OHOS::NFC;
24 namespace OHOS {
25 namespace NFC {
26 namespace NCI {
27 static const int ISO_DEP_MAX_TRANSEIVE_LENGTH = 0xFEFF;
28 
29 OHOS::NFC::SynchronizeEvent NfccNciAdapter::nfcEnableEvent_;
30 OHOS::NFC::SynchronizeEvent NfccNciAdapter::nfcDisableEvent_;
31 
32 bool NfccNciAdapter::isNfcEnabled_ = false;
33 bool NfccNciAdapter::rfEnabled_ = false;
34 bool NfccNciAdapter::discoveryEnabled_ = false;  // is polling or listening
35 bool NfccNciAdapter::pollingEnabled_ = false;    // is polling for tag
36 bool NfccNciAdapter::isDisabling_ = false;
37 bool NfccNciAdapter::readerModeEnabled_ = false;
38 unsigned long NfccNciAdapter::discoveryDuration_;
39 bool NfccNciAdapter::isTagActive_ = false;
40 unsigned char NfccNciAdapter::curScreenState_ = NFA_SCREEN_STATE_OFF_LOCKED;
41 std::shared_ptr<INfcNci> NfccNciAdapter::nciAdaptation_ = std::make_shared<NciAdaptations>();
42 
43 NfccNciAdapter::NfccNciAdapter() = default;
44 
45 NfccNciAdapter::~NfccNciAdapter() = default;
46 
GetInstance()47 NfccNciAdapter& NfccNciAdapter::GetInstance()
48 {
49     static NfccNciAdapter nfccNciAdapter;
50     return nfccNciAdapter;
51 }
52 
IsNfcActive()53 bool NfccNciAdapter::IsNfcActive()
54 {
55     bool isActive = (isNfcEnabled_ && !isDisabling_);
56     return isActive;
57 }
58 
IsTagActive() const59 bool NfccNciAdapter::IsTagActive() const
60 {
61     return isTagActive_;
62 }
63 
SetNciAdaptation(std::shared_ptr<INfcNci> nciAdaptation)64 void NfccNciAdapter::SetNciAdaptation(std::shared_ptr<INfcNci> nciAdaptation)
65 {
66     nciAdaptation_ = nciAdaptation;
67 }
68 
StartRfDiscovery(bool isStart) const69 void NfccNciAdapter::StartRfDiscovery(bool isStart) const
70 {
71     DebugLog("NfccNciAdapter::StartRfDiscovery: isStart= %{public}d", isStart);
72     tNFA_STATUS status;
73     if (isStart) {
74         status = nciAdaptation_->NfaStartRfDiscovery();
75     } else {
76         status = nciAdaptation_->NfaStopRfDiscovery();
77     }
78     if (status == NFA_STATUS_OK) {
79         rfEnabled_ = isStart;
80     } else {
81         DebugLog("NfccNciAdapter::StartRfDiscovery: Failed to start/stop RF discovery; error=0x%{public}X", status);
82     }
83 }
84 
StartPolling(tNFA_TECHNOLOGY_MASK techMask) const85 tNFA_STATUS NfccNciAdapter::StartPolling(tNFA_TECHNOLOGY_MASK techMask) const
86 {
87     DebugLog("NfccNciAdapter::StartPolling, techMask = 0x%{public}02X", techMask);
88     tNFA_STATUS status = nciAdaptation_->NfaEnablePolling(techMask);
89     if (status == NFA_STATUS_OK) {
90         DebugLog("StartPolling: wait for enable event");
91         pollingEnabled_ = true;
92     } else {
93         DebugLog("NfccNciAdapter::StartPolling: fail enable polling; error = 0x%{public}X", status);
94     }
95     return status;
96 }
97 
StopPolling() const98 tNFA_STATUS NfccNciAdapter::StopPolling() const
99 {
100     DebugLog("NfccNciAdapter::StopPolling");
101     tNFA_STATUS status = nciAdaptation_->NfaDisablePolling();
102     if (status == NFA_STATUS_OK) {
103         pollingEnabled_ = false;
104     } else {
105         DebugLog("NfccNciAdapter::StopPolling: fail disable polling; error = 0x%{public}X", status);
106     }
107     return status;
108 }
109 
DoNfaActivatedEvt(tNFA_CONN_EVT_DATA * eventData)110 void NfccNciAdapter::DoNfaActivatedEvt(tNFA_CONN_EVT_DATA* eventData)
111 {
112     if (isDisabling_) {
113         return;
114     }
115     if (eventData->activated.activate_ntf.protocol == NCI_PROTOCOL_NFC_DEP) {
116         DebugLog("Is peer to peer");
117         return;
118     }
119 
120     if (eventData->activated.activate_ntf.rf_tech_param.mode < NCI_DISCOVERY_TYPE_LISTEN_A &&
121         eventData->activated.activate_ntf.intf_param.type != NFC_INTERFACE_EE_DIRECT_RF) {
122         isTagActive_ = true;
123         /* Is polling and is not ee direct rf */
124         if (TagNciAdapter::GetInstance().IsReconnecting()) {
125             DebugLog("isReconnect, %{public}d", TagNciAdapter::GetInstance().IsReconnecting());
126             TagNciAdapter::GetInstance().HandleActivatedResult();
127             return;
128         }
129         TagNciAdapter::GetInstance().ResetTagFieldOnFlag();
130         TagNciAdapter::GetInstance().BuildTagInfo(eventData);
131     }
132     if (TagNciAdapter::GetInstance().GetDiscRstEvtNum() > 0) {
133         NFA_Deactivate(true);
134     }
135 }
136 
DoNfaDeactivatedEvt(tNFA_CONN_EVT_DATA * eventData)137 void NfccNciAdapter::DoNfaDeactivatedEvt(tNFA_CONN_EVT_DATA* eventData)
138 {
139     TagNciAdapter::GetInstance().SelectTheNextTag();
140     if (eventData->deactivated.type == NFA_DEACTIVATE_TYPE_SLEEP) {
141         DebugLog("Enter sleep mode");
142         return;
143     }
144     TagNciAdapter::GetInstance().HandleDeactivatedResult();
145     isTagActive_ = false;
146 }
147 
DoNfaDiscResultEvt(tNFA_CONN_EVT_DATA * eventData)148 void NfccNciAdapter::DoNfaDiscResultEvt(tNFA_CONN_EVT_DATA* eventData)
149 {
150     static tNFA_STATUS status = eventData->disc_result.status;
151     DebugLog("DoNfaDiscResultEvt: status = 0x%{public}X", status);
152     if (status != NFA_STATUS_OK) {
153         TagNciAdapter::GetInstance().SetDiscRstEvtNum(0);
154     } else {
155         TagNciAdapter::GetInstance().GetMultiTagTechsFromData(eventData->disc_result);
156         TagNciAdapter::GetInstance().SetDiscRstEvtNum(TagNciAdapter::GetInstance().GetDiscRstEvtNum() + 1);
157         if (eventData->disc_result.discovery_ntf.more == NCI_DISCOVER_NTF_MORE) {
158             return;
159         }
160         if (TagNciAdapter::GetInstance().GetDiscRstEvtNum() > 1) {
161             TagNciAdapter::GetInstance().SetIsMultiTag(true);
162         }
163         TagNciAdapter::GetInstance().SetDiscRstEvtNum(TagNciAdapter::GetInstance().GetDiscRstEvtNum() - 1);
164         // select the first tag of multiple tags that discovered
165         TagNciAdapter::GetInstance().SelectTheFirstTag();
166     }
167 }
168 
DoNfaPresenceEvt(tNFA_CONN_EVT_DATA * eventData)169 void NfccNciAdapter::DoNfaPresenceEvt(tNFA_CONN_EVT_DATA* eventData)
170 {
171     static tNFA_STATUS curStatus = NFA_STATUS_FAILED;
172     if (eventData->status != curStatus) {
173         curStatus = eventData->status;
174     }
175     TagNciAdapter::GetInstance().HandleFieldCheckResult(curStatus);
176 }
177 
NfcConnectionCallback(uint8_t connEvent,tNFA_CONN_EVT_DATA * eventData)178 void NfccNciAdapter::NfcConnectionCallback(uint8_t connEvent, tNFA_CONN_EVT_DATA* eventData)
179 {
180     switch (connEvent) {
181         /* whether polling successfully started */
182         case NFA_POLL_ENABLED_EVT: {
183             DebugLog("NfaConnectionCallback: NFA_POLL_ENABLED_EVT: status = %{public}u", eventData->status);
184             break;
185         }
186         /* Listening/Polling stopped */
187         case NFA_POLL_DISABLED_EVT: {
188             DebugLog("NfaConnectionCallback: NFA_POLL_DISABLED_EVT: status = %{public}u", eventData->status);
189             break;
190         }
191         /* RF Discovery started event */
192         case NFA_RF_DISCOVERY_STARTED_EVT: {
193             DebugLog("NfaConnectionCallback: NFA_RF_DISCOVERY_STARTED_EVT: status = %{public}u", eventData->status);
194             break;
195         }
196         /* RF Discovery stopped event */
197         case NFA_RF_DISCOVERY_STOPPED_EVT: {
198             DebugLog("NfaConnectionCallback: NFA_RF_DISCOVERY_STOPPED_EVT: status = %{public}u", eventData->status);
199             break;
200         }
201         /* NFC link/protocol activated */
202         case NFA_ACTIVATED_EVT: {
203             DebugLog("NfaConnectionCallback: NFA_ACTIVATED_EVT");
204             DoNfaActivatedEvt(eventData);
205             break;
206         }
207         /* NFC link/protocol deactivated */
208         case NFA_DEACTIVATED_EVT: {
209             DebugLog("NfaConnectionCallback: NFA_DEACTIVATED_EVT");
210             DoNfaDeactivatedEvt(eventData);
211             break;
212         }
213         case NFA_DISC_RESULT_EVT: {
214             DebugLog("NfaConnectionCallback: NFA_DISC_RESULT_EVT");
215             DoNfaDiscResultEvt(eventData);
216             break;
217         }
218         case NFA_SELECT_RESULT_EVT: {
219             DebugLog("NfaConnectionCallback: NFA_SELECT_RESULT_EVT: status = 0x%{public}X", eventData->status);
220             TagNciAdapter::GetInstance().HandleSelectResult();
221             break;
222         }
223         /* Data message received (for non-NDEF reads) */
224         case NFA_DATA_EVT: {
225             DebugLog("NfaConnectionCallback: NFA_DATA_EVT: status = 0x%{public}X, len = %{public}d",
226                 eventData->status, eventData->data.len);
227             TagNciAdapter::GetInstance().HandleTranceiveData(eventData->status, eventData->data.p_data,
228                 eventData->data.len);
229             break;
230         }
231         case NFA_PRESENCE_CHECK_EVT: {
232             DoNfaPresenceEvt(eventData);
233             break;
234         }
235         case NFA_READ_CPLT_EVT: {
236             DebugLog("NfaConnectionCallback: NFA_READ_CPLT_EVT: status = 0x%{public}X", eventData->status);
237             TagNciAdapter::GetInstance().HandleReadComplete(eventData->status);
238             break;
239         }
240         case NFA_WRITE_CPLT_EVT: {
241             DebugLog("NfaConnectionCallback: NFA_WRITE_CPLT_EVT: status = 0x%{public}X", eventData->status);
242             TagNciAdapter::GetInstance().HandleWriteComplete(eventData->status);
243             break;
244         }
245         case NFA_FORMAT_CPLT_EVT: {
246             DebugLog("NfaConnectionCallback: NFA_FORMAT_CPLT_EVT: status = 0x%{public}X", eventData->status);
247             TagNciAdapter::GetInstance().HandleFormatComplete(eventData->status);
248             break;
249         }
250         case NFA_NDEF_DETECT_EVT: {
251             DebugLog("NfaConnectionCallback: NFA_NDEF_DETECT_EVT: status = 0x%{public}X, protocol = 0x%{public}X,"
252                 " max_size = %{public}u, cur_size = %{public}u, flags = 0x%{public}X",
253                 eventData->ndef_detect.status, eventData->ndef_detect.protocol,
254                 static_cast<unsigned int>(eventData->ndef_detect.max_size),
255                 static_cast<unsigned int>(eventData->ndef_detect.cur_size), eventData->ndef_detect.flags);
256             TagNciAdapter::GetInstance().HandleNdefCheckResult(eventData->ndef_detect.status,
257                                                                eventData->ndef_detect.cur_size,
258                                                                eventData->ndef_detect.flags,
259                                                                eventData->ndef_detect.max_size);
260             break;
261         }
262         default: {
263             DebugLog("NfaConnectionCallback: unknown event %{public}u", connEvent);
264             break;
265         }
266     }
267 }
268 
DoNfaDmEnableEvt(tNFA_DM_CBACK_DATA * eventData)269 void NfccNciAdapter::DoNfaDmEnableEvt(tNFA_DM_CBACK_DATA* eventData)
270 {
271     SynchronizeGuard guard(nfcEnableEvent_);
272     isNfcEnabled_ = (eventData->status == NFA_STATUS_OK);
273     isDisabling_ = false;
274     nfcEnableEvent_.NotifyOne();
275 }
276 
DoNfaDmDisableEvt(tNFA_DM_CBACK_DATA * eventData)277 void NfccNciAdapter::DoNfaDmDisableEvt(tNFA_DM_CBACK_DATA* eventData)
278 {
279     isNfcEnabled_ = false;
280     isDisabling_ = false;
281 }
282 
DoNfaDmRfFieldEvt(tNFA_DM_CBACK_DATA * eventData)283 void NfccNciAdapter::DoNfaDmRfFieldEvt(tNFA_DM_CBACK_DATA* eventData)
284 {
285     if (eventData->rf_field.status == NFA_STATUS_OK) {
286         if (eventData->rf_field.rf_field_status == NFA_DM_RF_FIELD_ON) {
287             NfccHost::RemoteFieldActivated();
288         } else {
289             NfccHost::RemoteFieldDeactivated();
290         }
291     }
292 }
293 
DoNfaDmNfccTimeoutEvt(tNFA_DM_CBACK_DATA * eventData)294 void NfccNciAdapter::DoNfaDmNfccTimeoutEvt(tNFA_DM_CBACK_DATA* eventData)
295 {
296     discoveryEnabled_ = false;
297     pollingEnabled_ = false;
298 
299     if (IsNfcActive()) {
300         nciAdaptation_->NfaDisable(FALSE);
301         isDisabling_ = true;
302     } else {
303         isNfcEnabled_ = false;
304         isDisabling_ = false;
305     }
306 }
307 
NfcDeviceManagementCallback(uint8_t dmEvent,tNFA_DM_CBACK_DATA * eventData)308 void NfccNciAdapter::NfcDeviceManagementCallback(uint8_t dmEvent, tNFA_DM_CBACK_DATA* eventData)
309 {
310     DebugLog("NfaDeviceManagementCallback: event= %{public}u", dmEvent);
311 
312     switch (dmEvent) {
313         /* Result of NFA_Enable */
314         case NFA_DM_ENABLE_EVT: {
315             DebugLog("NfaDeviceManagementCallback: NFA_DM_ENABLE_EVT; status = 0x%{public}X", eventData->status);
316             DoNfaDmEnableEvt(eventData);
317             break;
318         }
319         /* Result of NFA_Disable */
320         case NFA_DM_DISABLE_EVT: {
321             DebugLog("NfaDeviceManagementCallback: NFA_DM_DISABLE_EVT");
322             DoNfaDmDisableEvt(eventData);
323             break;
324         }
325 
326         case NFA_DM_RF_FIELD_EVT: {
327             DebugLog("NfaDeviceManagementCallback: NFA_DM_RF_FIELD_EVT; status = 0x%{public}X; field status = "
328                 "%{public}u", eventData->rf_field.status, eventData->rf_field.rf_field_status);
329             DoNfaDmRfFieldEvt(eventData);
330             break;
331         }
332 
333         case NFA_DM_NFCC_TRANSPORT_ERR_EVT:
334         case NFA_DM_NFCC_TIMEOUT_EVT: {
335             DoNfaDmNfccTimeoutEvt(eventData);
336             break;
337         }
338 
339         case NFA_DM_SET_CONFIG_EVT: {
340             DebugLog("NfaDeviceManagementCallback: NFA_DM_SET_CONFIG_EVT");
341             break;
342         }
343 
344         case NFA_DM_SET_POWER_SUB_STATE_EVT: {
345             DebugLog("NfaDeviceManagementCallback: NFA_DM_SET_POWER_SUB_STATE_EVT; status=0x%{public}X",
346                      eventData->power_mode.status);
347             break;
348         }
349 
350         default: {
351             DebugLog("NfaDeviceManagementCallback: unknown event %{public}d", dmEvent);
352             break;
353         }
354     }
355 }
356 
Initialize()357 bool NfccNciAdapter::Initialize()
358 {
359     DebugLog("NfccNciAdapter::Initialize");
360     tNFA_STATUS status;
361     std::lock_guard<std::mutex> lock(mutex_);
362     if (isNfcEnabled_) {
363         DebugLog("NfccNciAdapter::Initialize: already enabled");
364         return isNfcEnabled_;
365     }
366 
367     nciAdaptation_->NfcAdaptationInitialize();  // start GKI, NCI task, NFC task
368     {
369         SynchronizeGuard guard(nfcEnableEvent_);
370         tHAL_NFC_ENTRY* halFuncEntries = nciAdaptation_->NfcAdaptationGetHalEntryFuncs();
371 
372         nciAdaptation_->NfaInit(halFuncEntries);
373         status = nciAdaptation_->NfaEnable(NfcDeviceManagementCallback, NfcConnectionCallback);
374         if (status == NFA_STATUS_OK) {
375             nfcEnableEvent_.Wait();
376         }
377     }
378 
379     if (status == NFA_STATUS_OK) {
380         // sIsNfaEnabled indicates whether stack started successfully
381         if (isNfcEnabled_) {
382 #ifdef _NFC_SERVICE_HCE_
383             NciBalCe::GetInstance().InitializeCe();
384             HciManager::GetInstance().Initialize();
385 #endif
386             TagNciAdapter::GetInstance().RegisterNdefHandler();
387             discoveryDuration_ = DEFAULT_DISCOVERY_DURATION;
388             nciAdaptation_->NfaSetRfDiscoveryDuration((uint16_t)discoveryDuration_);
389             DebugLog("NfccNciAdapter::Initialize: nfc enabled = %{public}d", isNfcEnabled_);
390             return isNfcEnabled_;
391         }
392     }
393     ErrorLog("NfccNciAdapter::Initialize: fail nfa enable; error = %{public}d", status);
394     if (isNfcEnabled_) {
395         /* ungraceful */
396         status = nciAdaptation_->NfaDisable(false);
397         DebugLog("NfccNciAdapter::Initialize: status = %{public}d", status);
398     }
399     nciAdaptation_->NfcAdaptationFinalize();
400     DebugLog("NfccNciAdapter::Initialize: nfc enabled = %{public}d", isNfcEnabled_);
401     return isNfcEnabled_;
402 }
403 
Deinitialize()404 bool NfccNciAdapter::Deinitialize()
405 {
406     DebugLog("NfccNciAdapter::Deinitialize");
407     if (!IsNfcActive()) {
408         DebugLog("NfccNciAdapter::Deinitialize: Nfc not initialized");
409         return NFA_STATUS_OK;
410     }
411 
412     std::lock_guard<std::mutex> lock(mutex_);
413     tNFA_STATUS status = NFA_STATUS_OK;
414     isDisabling_ = true;
415 
416 #ifdef _NFC_SERVICE_HCE_
417     NciBalCe::GetInstance().Deinitialize();
418 #endif
419 
420     if (isNfcEnabled_) {
421         /* graceful */
422         status = nciAdaptation_->NfaDisable(true);
423         if (status == NFA_STATUS_OK) {
424             DebugLog("NfccNciAdapter::Deinitialize: wait for completion");
425         } else {
426             ErrorLog("NfccNciAdapter::Deinitialize: fail disable; error = 0x%{public}X", status);
427         }
428     }
429     isNfcEnabled_ = false;
430     discoveryEnabled_ = false;
431     isDisabling_ = false;
432     pollingEnabled_ = false;
433 
434     nciAdaptation_->NfcAdaptationFinalize();
435     DebugLog("NfccNciAdapter::Deinitialize: exit");
436     return (status == NFA_STATUS_OK);
437 }
438 
EnableDiscovery(uint16_t techMask,bool enableReaderMode,bool enableHostRouting,bool restart)439 void NfccNciAdapter::EnableDiscovery(uint16_t techMask, bool enableReaderMode, bool enableHostRouting, bool restart)
440 {
441     DebugLog("NfccNciAdapter::EnableDiscovery");
442     std::lock_guard<std::mutex> lock(mutex_);
443     if (!IsNfcActive()) {
444         ErrorLog("NfccNciAdapter::EnableDiscovery: Nfc not initialized.");
445         return;
446     }
447 
448     if (discoveryEnabled_ && !restart) {
449         DebugLog("NfccNciAdapter::EnableDiscovery: already discovering");
450         return;
451     }
452 
453     if (rfEnabled_) {
454         // Stop RF discovery to reconfigure
455         StartRfDiscovery(false);
456     }
457 
458     tNFA_TECHNOLOGY_MASK technologyMask = DEFAULT_TECH_MASK;
459     technologyMask = techMask & DEFAULT_TECH_MASK;
460 
461     if (technologyMask != 0) {
462         StopPolling();
463         StartPolling(technologyMask);
464         if (pollingEnabled_) {
465             if (enableReaderMode && !readerModeEnabled_) {
466                 readerModeEnabled_ = true;
467                 nciAdaptation_->NfaDisableListening();
468                 nciAdaptation_->NfaSetRfDiscoveryDuration(DISCOVERY_DURATION);
469             } else if (!enableReaderMode && readerModeEnabled_) {
470                 readerModeEnabled_ = false;
471                 nciAdaptation_->NfaEnableListening();
472                 nciAdaptation_->NfaSetRfDiscoveryDuration(DISCOVERY_DURATION);
473             }
474         }
475     } else {
476         StopPolling();
477     }
478 #ifdef _NFC_SERVICE_HCE_
479     NciBalCe::GetInstance().EnableHostRouting(enableHostRouting);
480     NciBalCe::GetInstance().CommitRouting();
481 #endif
482 
483     StartRfDiscovery(true);
484     discoveryEnabled_ = true;
485     DebugLog("NfccNciAdapter::EnableDiscovery: exit");
486 }
487 
DisableDiscovery()488 void NfccNciAdapter::DisableDiscovery()
489 {
490     DebugLog("NfccNciAdapter::DisableDiscovery");
491     std::lock_guard<std::mutex> lock(mutex_);
492     if (!IsNfcActive()) {
493         ErrorLog("NfccNciAdapter::DisableDiscovery: Nfc not initialized.");
494         return;
495     }
496     if (!discoveryEnabled_) {
497         DebugLog("NfccNciAdapter::DisableDiscovery: already disabled");
498         return;
499     }
500     // Stop RF Discovery.
501     StartRfDiscovery(false);
502     if (pollingEnabled_) {
503         StopPolling();
504     }
505     discoveryEnabled_ = false;
506     readerModeEnabled_ = false;
507     DebugLog("NfccNciAdapter::DisableDiscovery: exit");
508 }
509 
SendRawFrame(std::string & rawData)510 bool NfccNciAdapter::SendRawFrame(std::string& rawData)
511 {
512     DebugLog("NfccNciAdapter::SendRawFrame");
513     std::lock_guard<std::mutex> lock(mutex_);
514     uint16_t length = KITS::NfcSdkCommon::GetHexStrBytesLen(rawData);
515     uint8_t data[length];
516     for (uint32_t i = 0; i < length; i++) {
517         data[i] = KITS::NfcSdkCommon::GetByteFromHexStr(rawData, i);
518     }
519     nciAdaptation_->NfaSendRawFrame(data, length, 0);
520     return true;
521 }
522 
GetDiscovryParam(unsigned char screenState,unsigned char screenStateMask)523 uint8_t NfccNciAdapter::GetDiscovryParam(unsigned char screenState, unsigned char screenStateMask)
524 {
525     // discocery parameters for SCREEN OFF_LOCKED or OFF_UNLOCKED
526     if (screenState == NFA_SCREEN_STATE_OFF_LOCKED || screenState == NFA_SCREEN_STATE_OFF_UNLOCKED) {
527         return (NCI_POLLING_DH_DISABLE_MASK | NCI_LISTEN_DH_NFCEE_ENABLE_MASK);
528     }
529 
530     // discocery parameters for SCREEN ON_LOCKED
531     if (screenState == NFA_SCREEN_STATE_ON_LOCKED) {
532         return (screenStateMask & NFA_SCREEN_POLLING_TAG_MASK)
533                 ? (NCI_POLLING_DH_ENABLE_MASK | NCI_LISTEN_DH_NFCEE_ENABLE_MASK)
534                 : (NCI_POLLING_DH_DISABLE_MASK | NCI_LISTEN_DH_NFCEE_ENABLE_MASK);
535     }
536 
537     // discocery parameters for SCREEN ON_UNLOCKED
538     if (screenState == NFA_SCREEN_STATE_ON_UNLOCKED) {
539         return (NCI_POLLING_DH_ENABLE_MASK | NCI_LISTEN_DH_NFCEE_ENABLE_MASK);
540     }
541 
542     // default discocery parameters
543     return (NCI_POLLING_DH_ENABLE_MASK | NCI_LISTEN_DH_NFCEE_ENABLE_MASK);
544 }
545 
SetScreenStatus(unsigned char screenStateMask) const546 void NfccNciAdapter::SetScreenStatus(unsigned char screenStateMask) const
547 {
548     DebugLog("NfccNciAdapter::SetScreenStatus");
549     unsigned char screenState = screenStateMask & NFA_SCREEN_STATE_MASK;
550     if (curScreenState_ == screenState) {
551         DebugLog("Screen state not changed");
552         return;
553     }
554     if (!IsNfcActive() || GetNciVersion() != NCI_VERSION_2_0) {
555         curScreenState_ = screenState;
556         return;
557     }
558 
559     // set power state for screen state.
560     tNFA_STATUS status;
561     if (curScreenState_ == NFA_SCREEN_STATE_OFF_LOCKED || curScreenState_ == NFA_SCREEN_STATE_OFF_UNLOCKED ||
562         curScreenState_ == NFA_SCREEN_STATE_ON_LOCKED || curScreenState_ == NFA_SCREEN_STATE_UNKNOWN) {
563         status = nciAdaptation_->NfcSetPowerSubStateForScreenState(screenState);
564         if (status != NFA_STATUS_OK) {
565             ErrorLog("NFA_SetPowerSubStateForScreenState fail, error=0x%{public}X", status);
566             return;
567         }
568     }
569 
570     uint8_t discParam = GetDiscovryParam(screenState, screenStateMask);
571     status = nciAdaptation_->NfcSetConfig(NCI_PARAM_ID_CON_DISCOVERY_PARAM,
572         NCI_PARAM_LEN_CON_DISCOVERY_PARAM, &discParam);
573     if (status != NFA_STATUS_OK) {
574         ErrorLog("NFA_SetConfig fail, error=0x%{public}X", status);
575         return;
576     }
577 
578     if (curScreenState_ == NFA_SCREEN_STATE_ON_UNLOCKED) {
579         status = nciAdaptation_->NfcSetPowerSubStateForScreenState(screenState);
580         if (status != NFA_STATUS_OK) {
581             ErrorLog("NFA_SetPowerSubStateForScreenState fail, error=0x%{public}X", status);
582             return;
583         }
584     }
585     curScreenState_ = screenState;
586     return;
587 }
588 
GetNciVersion() const589 int NfccNciAdapter::GetNciVersion() const
590 {
591     DebugLog("NfccNciAdapter::GetNciVersion");
592     unsigned char version = nciAdaptation_->NfcGetNciVersion();
593     return version;
594 }
595 
GetIsoDepMaxTransceiveLength()596 int NfccNciAdapter::GetIsoDepMaxTransceiveLength()
597 {
598     DebugLog("NfccNciAdapter::GetIsoDepMaxTransceiveLength");
599     if (NfcConfig::hasKey(NAME_ISO_DEP_MAX_TRANSCEIVE)) {
600         return NfcConfig::getUnsigned(NAME_ISO_DEP_MAX_TRANSCEIVE);
601     } else {
602         return ISO_DEP_MAX_TRANSEIVE_LENGTH;
603     }
604 }
605 
RegisterT3tIdentifier(const std::string & t3tIdentifier) const606 bool NfccNciAdapter::RegisterT3tIdentifier(const std::string& t3tIdentifier) const
607 {
608     DebugLog("NfccNciAdapter::RegisterT3tIdentifier");
609     if (t3tIdentifier.empty()) {
610     }
611     return false;
612 }
613 
DeregisterT3tIdentifier(int handle) const614 void NfccNciAdapter::DeregisterT3tIdentifier(int handle) const
615 {
616     DebugLog("NfccNciAdapter::DeregisterT3tIdentifier");
617     if (handle < 0) {
618     }
619 }
620 
ClearT3tIdentifiersCache()621 void NfccNciAdapter::ClearT3tIdentifiersCache()
622 {
623     DebugLog("NfccNciAdapter::ClearT3tIdentifiersCache");
624 }
625 
GetLfT3tMax()626 int NfccNciAdapter::GetLfT3tMax()
627 {
628     DebugLog("NfccNciAdapter::GetLfT3tMax");
629     return 0;
630 }
631 
GetLastError()632 int NfccNciAdapter::GetLastError()
633 {
634     DebugLog("NfccNciAdapter::GetLastError");
635     return 0;
636 }
637 
Abort()638 void NfccNciAdapter::Abort()
639 {
640     DebugLog("NfccNciAdapter::Abort");
641 }
642 
CheckFirmware()643 bool NfccNciAdapter::CheckFirmware()
644 {
645     DebugLog("NfccNciAdapter::CheckFirmware");
646     std::lock_guard<std::mutex> lock(mutex_);
647     nciAdaptation_->NfcAdaptationInitialize();
648     nciAdaptation_->NfcAdaptationDownloadFirmware();
649     nciAdaptation_->NfcAdaptationFinalize();
650     return true;
651 }
652 
Dump(int fd) const653 void NfccNciAdapter::Dump(int fd) const
654 {
655     DebugLog("NfccNciAdapter::Dump, fd=%{public}d", fd);
656     nciAdaptation_->NfcAdaptationDump(fd);
657 }
658 
FactoryReset() const659 void NfccNciAdapter::FactoryReset() const
660 {
661     DebugLog("NfccNciAdapter::FactoryReset");
662     nciAdaptation_->NfcAdaptationFactoryReset();
663 }
664 
Shutdown() const665 void NfccNciAdapter::Shutdown() const
666 {
667     DebugLog("NfccNciAdapter::Shutdown");
668     nciAdaptation_->NfcAdaptationDeviceShutdown();
669 }
670 
IsRfEbabled()671 bool NfccNciAdapter::IsRfEbabled()
672 {
673     return rfEnabled_;
674 }
675 }  // namespace NCI
676 }  // namespace NFC
677 }  // namespace OHOS
678