void RoutingManager::handleData (const UINT8* data, UINT32 dataLen, tNFA_STATUS status) { tNFA_STATUS nfaStat = NFA_STATUS_OK; if (dataLen <= 0) { NXPLOG_API_E("no data"); goto TheEnd; } if (status == NFA_STATUS_CONTINUE) { memcpy((mRxDataBuffer + mRxDataBufferLen), data, dataLen); mRxDataBufferLen += dataLen; return; //expect another NFA_CE_DATA_EVT to come } else if (status == NFA_STATUS_OK) { memcpy(mRxDataBuffer, data, dataLen); mRxDataBufferLen = dataLen; //entire data packet has been received; no more NFA_CE_DATA_EVT } else if (status == NFA_STATUS_FAILED) { NXPLOG_API_E("RoutingManager::handleData: read data fail"); goto TheEnd; } if (mSkipCheckNDEF && mRxDataBufferLen == T4T_CHECK_NDEF_APDU_LENGTH && memcmp(mRxDataBuffer, T4T_CHECK_NDEF_APDU, T4T_CHECK_NDEF_APDU_LENGTH) == 0) { //ignore check Ndef command, interop with PN544 nfaStat = NFA_Deactivate (FALSE); if (nfaStat != NFA_STATUS_OK) { NXPLOG_API_E ("RoutingManager::handleData: deactivate failed; error=0x%X", nfaStat); } goto TheEnd; } if (nativeNfcManager_isNfcActive()) { if (mCallback && (NULL != mCallback->onDataReceived)) { mCallback->onDataReceived(mRxDataBuffer, mRxDataBufferLen); } } TheEnd: memset(mRxDataBuffer, 0, MAX_CE_RX_BUFFER_SIZE); mRxDataBufferLen = 0; }
/******************************************************************************* ** ** Function: nativeNfcTag_doDisconnect ** ** Description: Deactivate the RF field. ** e: JVM environment. ** o: Java object. ** ** Returns: True if ok. ** *******************************************************************************/ static jboolean nativeNfcTag_doDisconnect (JNIEnv*, jobject) { ALOGD ("%s: enter", __FUNCTION__); tNFA_STATUS nfaStat = NFA_STATUS_OK; NfcTag::getInstance().resetAllTransceiveTimeouts (); if (NfcTag::getInstance ().getActivationState () != NfcTag::Active) { ALOGE ("%s: tag already deactivated", __FUNCTION__); goto TheEnd; } nfaStat = NFA_Deactivate (FALSE); if (nfaStat != NFA_STATUS_OK) ALOGE ("%s: deactivate failed; error=0x%X", __FUNCTION__, nfaStat); TheEnd: ALOGD ("%s: exit", __FUNCTION__); return (nfaStat == NFA_STATUS_OK) ? JNI_TRUE : JNI_FALSE; }
/******************************************************************************* ** ** Function: reSelect ** ** Description: Deactivates the tag and re-selects it with the specified ** rf interface. ** ** Returns: status code, 0 on success, 1 on failure, ** 146 (defined in service) on tag lost ** *******************************************************************************/ static int reSelect (tNFA_INTF_TYPE rfInterface, bool fSwitchIfNeeded) { ALOGD ("%s: enter; rf intf = %d, current intf = %d", __FUNCTION__, rfInterface, sCurrentRfInterface); sRfInterfaceMutex.lock (); if (fSwitchIfNeeded && (rfInterface == sCurrentRfInterface)) { // already in the requested interface sRfInterfaceMutex.unlock (); return 0; // success } NfcTag& natTag = NfcTag::getInstance (); tNFA_STATUS status; int rVal = 1; do { //if tag has shutdown, abort this method if (NfcTag::getInstance ().isNdefDetectionTimedOut()) { ALOGD ("%s: ndef detection timeout; break", __FUNCTION__); rVal = STATUS_CODE_TARGET_LOST; break; } { SyncEventGuard g (sReconnectEvent); gIsTagDeactivating = true; sGotDeactivate = false; ALOGD ("%s: deactivate to sleep", __FUNCTION__); if (NFA_STATUS_OK != (status = NFA_Deactivate (TRUE))) //deactivate to sleep state { ALOGE ("%s: deactivate failed, status = %d", __FUNCTION__, status); break; } if (sReconnectEvent.wait (1000) == false) //if timeout occurred { ALOGE ("%s: timeout waiting for deactivate", __FUNCTION__); } } if (!sGotDeactivate) { rVal = STATUS_CODE_TARGET_LOST; break; } if (NfcTag::getInstance ().getActivationState () != NfcTag::Sleep) { ALOGE ("%s: tag is not in sleep", __FUNCTION__); rVal = STATUS_CODE_TARGET_LOST; break; } gIsTagDeactivating = false; { SyncEventGuard g2 (sReconnectEvent); sConnectWaitingForComplete = JNI_TRUE; ALOGD ("%s: select interface %u", __FUNCTION__, rfInterface); gIsSelectingRfInterface = true; if (NFA_STATUS_OK != (status = NFA_Select (natTag.mTechHandles[0], natTag.mTechLibNfcTypes[0], rfInterface))) { ALOGE ("%s: NFA_Select failed, status = %d", __FUNCTION__, status); break; } sConnectOk = false; if (sReconnectEvent.wait (1000) == false) //if timeout occured { ALOGE ("%s: timeout waiting for select", __FUNCTION__); break; } } ALOGD("%s: select completed; sConnectOk=%d", __FUNCTION__, sConnectOk); if (NfcTag::getInstance ().getActivationState () != NfcTag::Active) { ALOGE("%s: tag is not active", __FUNCTION__); rVal = STATUS_CODE_TARGET_LOST; break; } if (sConnectOk) { rVal = 0; // success sCurrentRfInterface = rfInterface; } else { rVal = 1; } } while (0); sConnectWaitingForComplete = JNI_FALSE; gIsTagDeactivating = false; gIsSelectingRfInterface = false; sRfInterfaceMutex.unlock (); ALOGD ("%s: exit; status=%d", __FUNCTION__, rVal); return rVal; }