diff options
author | nxpandroid <srikrishna.pramoda@nxp.com> | 2017-10-16 15:13:03 +0530 |
---|---|---|
committer | nxpandroid <srikrishna.pramoda@nxp.com> | 2017-10-16 15:13:03 +0530 |
commit | b7194d6863d714078d65ccd9d14dc66d28bbe926 (patch) | |
tree | adf9e5621b9a86ead80c2d8d3fd3107f55e88a63 | |
parent | e67b679e8d719b11d25c5e39a8d6e211ed0cb57c (diff) | |
download | android_vendor_nxp_opensource_packages_apps_Nfc-b7194d6863d714078d65ccd9d14dc66d28bbe926.tar.gz android_vendor_nxp_opensource_packages_apps_Nfc-b7194d6863d714078d65ccd9d14dc66d28bbe926.tar.bz2 android_vendor_nxp_opensource_packages_apps_Nfc-b7194d6863d714078d65ccd9d14dc66d28bbe926.zip |
NFC died issue seen during screen off in between ETSI transaction
-rw-r--r-- | nci/jni/IntervalTimer.cpp | 14 | ||||
-rwxr-xr-x | nci/jni/IntervalTimer.h | 1 | ||||
-rwxr-xr-x | nci/jni/NativeNfcManager.cpp | 7 | ||||
-rwxr-xr-x[-rw-r--r--] | nci/jni/TransactionController.cpp | 64 | ||||
-rwxr-xr-x[-rw-r--r--] | nci/jni/TransactionController.h | 2 |
5 files changed, 73 insertions, 15 deletions
diff --git a/nci/jni/IntervalTimer.cpp b/nci/jni/IntervalTimer.cpp index e5644bdf..5f034f42 100644 --- a/nci/jni/IntervalTimer.cpp +++ b/nci/jni/IntervalTimer.cpp @@ -118,3 +118,17 @@ bool IntervalTimer::create(TIMER_FUNC cb) ALOGE("fail create timer"); return stat == 0; } + +bool IntervalTimer::isRunning(void) +{ + if (mTimerId == 0) + return false; + + int stat = 0; + struct itimerspec ts; + + stat = timer_gettime(mTimerId, &ts); + if (stat != 0) + return false; + return ((ts.it_value.tv_sec > 0 || ts.it_value.tv_nsec > 0) ? true : false); +} diff --git a/nci/jni/IntervalTimer.h b/nci/jni/IntervalTimer.h index 66e345d3..b6bbd5a9 100755 --- a/nci/jni/IntervalTimer.h +++ b/nci/jni/IntervalTimer.h @@ -31,6 +31,7 @@ public: bool set(int ms, TIMER_FUNC cb); void kill(); bool create(TIMER_FUNC ); + bool isRunning(void); //This function returns true if a valid timer is running(curTime > 0) private: timer_t mTimerId; diff --git a/nci/jni/NativeNfcManager.cpp b/nci/jni/NativeNfcManager.cpp index b221d8c2..b58d8356 100755 --- a/nci/jni/NativeNfcManager.cpp +++ b/nci/jni/NativeNfcManager.cpp @@ -6453,12 +6453,7 @@ void *enableThread(void *arg) if(nfcFL.chipType != pn547C2) { set_AGC_process_state(false); } -#if (NXP_EXTNS == TRUE) - if(!pTransactionController->transactionTerminate(TRANSACTION_REQUESTOR(exec_pending_req))) - { - ALOGE("%s: Transaction in progress. Can not reset", __func__); - } -#endif + bool screen_lock_flag = false; bool disable_discovery = false; diff --git a/nci/jni/TransactionController.cpp b/nci/jni/TransactionController.cpp index 7250523d..e2e745f2 100644..100755 --- a/nci/jni/TransactionController.cpp +++ b/nci/jni/TransactionController.cpp @@ -61,7 +61,24 @@ void transactionController::lastRequestResume(void) pthread_attr_destroy(&attr); pTransactionDetail->current_transcation_state = NFA_TRANS_DM_RF_TRANS_END; } +/******************************************************************************* + ** + ** Function: transactionHandlePendingCb + ** + ** Description: This is a callback function registered against + ** pendingTransHandleTimer timer. This timer handler + ** triggers enable_thread for handling pending transactions + ** + ** Returns: None + ** + *******************************************************************************/ + +extern "C" void transactionController::transactionHandlePendingCb(union sigval) +{ + ALOGD("Inside %s", __FUNCTION__); + pInstance->lastRequestResume(); +} /******************************************************************************* ** ** Function: transactionAbortTimerCb @@ -76,7 +93,8 @@ extern "C" void transactionController::transactionAbortTimerCb(union sigval) { ALOGD("Inside %s", __FUNCTION__); - pInstance->lastRequestResume(); + pInstance->transactionTerminate(TRANSACTION_REQUESTOR(exec_pending_req)); + } /******************************************************************************* @@ -97,6 +115,7 @@ transactionController::transactionController(void) pTransactionDetail = android::nfcManager_transactionDetail(); abortTimer = new IntervalTimer(); + pendingTransHandleTimer = new IntervalTimer(); requestor = NULL; } /******************************************************************************* @@ -139,6 +158,11 @@ bool transactionController::transactionAttempt(const char* transactionRequestor, sem_getvalue(&barrier, &semVal); ALOGD ("%s: Transaction attempted : %s when barrier is: %d", __FUNCTION__, transactionRequestor, semVal); + if(pendingTransHandleTimer->isRunning()) + { + ALOGD ("%s: Transaction denied due to pending transaction: %s ", __FUNCTION__, transactionRequestor); + return false; + } //Block wait on barrier if(sem_timedwait(&barrier, &timeout) != 0) { @@ -177,6 +201,12 @@ bool transactionController::transactionAttempt(const char* transactionRequestor) sem_getvalue(&barrier, &semVal); ALOGD ("%s: Transaction attempted : %s when barrier is: %d", __FUNCTION__, transactionRequestor, semVal); + if(pendingTransHandleTimer->isRunning()) + { + ALOGD ("%s: Transaction denied due to pending transaction: %s ", __FUNCTION__, transactionRequestor); + return false; + } + if(sem_trywait(&barrier) == 0) { pTransactionDetail->trans_in_progress = true; @@ -210,13 +240,14 @@ void transactionController::transactionEnd(const char* transactionRequestor) if(requestor == transactionRequestor) { + /*If any abort timer is running for this transaction then stop it*/ + if(abortTimer != NULL && abortTimer->isRunning()) + { + ALOGD ("%s: Transaction control timer killed", __FUNCTION__); + killAbortTimer(); + } pTransactionDetail->trans_in_progress = false; - sem_getvalue(&barrier, &val); - - if(!val) - sem_post(&barrier); - ALOGD ("%s: Transaction ended : %s ", __FUNCTION__, transactionRequestor); /* @@ -224,9 +255,12 @@ void transactionController::transactionEnd(const char* transactionRequestor) **/ if(android::nfcManager_isRequestPending()) { - abortTimer->set(5, transactionAbortTimerCb); + pendingTransHandleTimer->set(1, transactionHandlePendingCb); } + sem_getvalue(&barrier, &val); + if(!val) + sem_post(&barrier); } } /******************************************************************************* @@ -249,7 +283,12 @@ bool transactionController::transactionTerminate(const char* transactionRequest (requestor == transactionRequestor || !strcmp(transactionRequestor,"exec_pending_req"))) { pTransactionDetail->trans_in_progress = false; - abortTimer->kill(); + killAbortTimer(); + + if(android::nfcManager_isRequestPending()) + { + pendingTransHandleTimer->set(1, transactionHandlePendingCb); + } sem_getvalue(&barrier, &val); if(!val) @@ -308,6 +347,10 @@ transactionController* transactionController::controller(void) pInstance->requestor = NULL; pInstance->abortTimer->kill(); + pInstance->pendingTransHandleTimer->kill(); + + pInstance->abortTimer = new IntervalTimer(); + pInstance->pendingTransHandleTimer = new IntervalTimer(); sem_destroy(&pInstance->barrier); @@ -332,7 +375,10 @@ void transactionController::killAbortTimer(void) ALOGD ("%s: transaction controller abort timer killed", __FUNCTION__); if(transactionInProgress()) + { abortTimer->kill(); + abortTimer = new IntervalTimer(); + } } /******************************************************************************* ** @@ -349,4 +395,4 @@ void transactionController::setAbortTimer(unsigned int msec) if(transactionInProgress()) abortTimer->set(msec, transactionAbortTimerCb); -}
\ No newline at end of file +} diff --git a/nci/jni/TransactionController.h b/nci/jni/TransactionController.h index d3965dd9..8402db28 100644..100755 --- a/nci/jni/TransactionController.h +++ b/nci/jni/TransactionController.h @@ -76,6 +76,7 @@ class transactionController static transactionController* pInstance; //Reference to controller
sem_t barrier; //barrier: Guard for controlling access to NFCC when profile switch happening
IntervalTimer* abortTimer; //abortTimer: Used for aborting a stuck transaction
+ IntervalTimer* pendingTransHandleTimer; //pendingTransHandleTimer: Used to schedule pending transaction handler thread
Transcation_Check_t* pTransactionDetail; //transactionDetail: holds last transaction detail
const char* requestor; //requestor: Identifier of transaction trigger
@@ -91,6 +92,7 @@ class transactionController void killAbortTimer(void);
void setAbortTimer(unsigned int msec);
static void transactionAbortTimerCb(union sigval);
+ static void transactionHandlePendingCb(union sigval);
static transactionController* controller(void);
static transactionController* getInstance(void);
};
|