Merge "Correct behavior after FW update."
diff --git a/st21nfc/hal/hal_fd.cc b/st21nfc/hal/hal_fd.cc
index 8937ecc..ffc6b50 100644
--- a/st21nfc/hal/hal_fd.cc
+++ b/st21nfc/hal/hal_fd.cc
@@ -31,8 +31,9 @@
 fpos_t mPos;
 fpos_t mPosInit;
 uint8_t mBinData[260];
-bool mRetry = TRUE;
-bool mCustomParamFailed = FALSE;
+bool mRetry = true;
+bool mCustomParamFailed = false;
+bool mCustomParamDone = false;
 uint8_t *pCmd;
 int mFWRecovCount = 0;
 const char *FwType = "generic";
@@ -53,6 +54,7 @@
 
 hal_fd_state_e mHalFDState = HAL_FD_STATE_AUTHENTICATE;
 void SendExitLoadMode(HALHANDLE mmHalHandle);
+extern void hal_wrapper_update_complete();
 
 /**
  * Send a HW reset and decode NCI_CORE_RESET_NTF information
@@ -157,7 +159,7 @@
 
 void hal_fd_close() {
   STLOG_HAL_D("  %s -enter", __func__);
-  mCustomParamFailed = FALSE;
+  mCustomParamFailed = false;
   if (mFWInfo != NULL) free(mFWInfo);
   if (mFwFileBin != NULL) fclose(mFwFileBin);
   if (mCustomFileBin != NULL) fclose(mCustomFileBin);
@@ -391,7 +393,7 @@
       STLOG_HAL_D("%s - mHalFDState = HAL_FD_STATE_SEND_RAW_APDU", __func__);
       if ((p_data[0] == 0x4f) && (p_data[1] == 0x04)) {
         if ((p_data[data_len - 2] == 0x90) && (p_data[data_len - 1] == 0x00)) {
-          mRetry = TRUE;
+          mRetry = true;
 
           fgetpos(mFwFileBin, &mPos);  // save current position in stream
           if ((fread(mBinData, sizeof(uint8_t), 3, mFwFileBin) == 3) &&
@@ -405,9 +407,9 @@
             STLOG_HAL_D("%s - EOF of FW binary", __func__);
             SendExitLoadMode(mHalHandle);
           }
-        } else if (mRetry == TRUE) {
+        } else if (mRetry == true) {
           STLOG_HAL_D("%s - Last Tx was NOK. Retry", __func__);
-          mRetry = FALSE;
+          mRetry = false;
           fsetpos(mFwFileBin, &mPos);
           if ((fread(mBinData, sizeof(uint8_t), 3, mFwFileBin) == 3) &&
               (fread(mBinData + 3, sizeof(uint8_t), mBinData[2], mFwFileBin) ==
@@ -464,47 +466,65 @@
       if ((p_data[1] == 0x0) && (p_data[3] == 0x0)) {
         // do nothing
       } else if ((p_data[1] == 0x1) && (p_data[3] == 0x0)) {
-        // CORE_INIT_RSP
-        if ((fread(mBinData, sizeof(uint8_t), 3, mCustomFileBin)) &&
-            (fread(mBinData + 3, sizeof(uint8_t), mBinData[2],
-                   mCustomFileBin))) {
-          if (!HalSendDownstream(mHalHandle, mBinData, mBinData[2] + 3)) {
+        if (mFWInfo->hibernate_exited == 0) {
+          // Send a NFC mode on .
+          if (!HalSendDownstream(mHalHandle, propNfcModeSetCmdOn,
+                                 sizeof(propNfcModeSetCmdOn))) {
             STLOG_HAL_E("%s - SendDownstream failed", __func__);
           }
+          // CORE_INIT_RSP
+        } else if (mFWInfo->hibernate_exited == 1) {
+          if ((fread(mBinData, sizeof(uint8_t), 3, mCustomFileBin)) &&
+              (fread(mBinData + 3, sizeof(uint8_t), mBinData[2],
+                     mCustomFileBin))) {
+            if (!HalSendDownstream(mHalHandle, mBinData, mBinData[2] + 3)) {
+              STLOG_HAL_E("%s - SendDownstream failed", __func__);
+            }
+          }
         }
+
       } else {
         STLOG_HAL_D("%s - Error in custom param application", __func__);
-        mCustomParamFailed = TRUE;
+        mCustomParamFailed = true;
         I2cResetPulse();
         hal_wrapper_set_state(HAL_WRAPPER_STATE_OPEN);
       }
       break;
 
     case 0x4f:
-      if ((fread(mBinData, sizeof(uint8_t), 3, mCustomFileBin) == 3) &&
-          (fread(mBinData + 3, sizeof(uint8_t), mBinData[2], mCustomFileBin) ==
-           mBinData[2])) {
-        if (!HalSendDownstream(mHalHandle, mBinData, mBinData[2] + 3)) {
-          STLOG_HAL_E("%s - SendDownstream failed", __func__);
+      if (mFWInfo->hibernate_exited == 1) {
+        if ((fread(mBinData, sizeof(uint8_t), 3, mCustomFileBin) == 3) &&
+            (fread(mBinData + 3, sizeof(uint8_t), mBinData[2],
+                   mCustomFileBin) == mBinData[2])) {
+          if (!HalSendDownstream(mHalHandle, mBinData, mBinData[2] + 3)) {
+            STLOG_HAL_E("%s - SendDownstream failed", __func__);
+          }
+        } else {
+          STLOG_HAL_D("%s - EOF of custom file", __func__);
+          mCustomParamDone = true;
+          I2cResetPulse();
         }
-      } else {
-        STLOG_HAL_D("%s - EOF of custom file", __func__);
-        I2cResetPulse();
-        hal_wrapper_set_state(HAL_WRAPPER_STATE_OPEN);
-      }
 
-      // Check if an error has occured for PROP_SET_CONFIG_CMD
-      // Only log a warning, do not exit code
-      if (p_data[3] != 0x00) {
-        STLOG_HAL_D("%s - Error in custom file, continue anyway", __func__);
+        // Check if an error has occured for PROP_SET_CONFIG_CMD
+        // Only log a warning, do not exit code
+        if (p_data[3] != 0x00) {
+          STLOG_HAL_D("%s - Error in custom file, continue anyway", __func__);
+        }
       }
       break;
 
     case 0x60:  //
       if (p_data[1] == 0x0) {
+        if (p_data[3] == 0xa0) {
+          mFWInfo->hibernate_exited = 1;
+        }
         if (!HalSendDownstream(mHalHandle, coreInitCmd, sizeof(coreInitCmd))) {
           STLOG_HAL_E("%s - SendDownstream failed", __func__);
         }
+
+      } else if ((p_data[1] == 0x6) && mCustomParamDone) {
+        mCustomParamDone = false;
+        hal_wrapper_update_complete();
       }
       break;
   }
diff --git a/st21nfc/hal_wrapper.cc b/st21nfc/hal_wrapper.cc
index 1d42540..ba0e6cc 100644
--- a/st21nfc/hal_wrapper.cc
+++ b/st21nfc/hal_wrapper.cc
@@ -188,6 +188,12 @@
   mfactoryReset = true;
   STLOG_HAL_V("%s - mfactoryReset = %d", __func__, mfactoryReset);
 }
+
+void hal_wrapper_update_complete() {
+  STLOG_HAL_V("%s ", __func__);
+  mHalWrapperCallback(HAL_NFC_OPEN_CPLT_EVT, HAL_NFC_STATUS_OK);
+  mHalWrapperState = HAL_WRAPPER_STATE_OPEN_CPLT;
+}
 void halWrapperDataCallback(uint16_t data_len, uint8_t* p_data) {
   uint8_t propNfcModeSetCmdOn[] = {0x2f, 0x02, 0x02, 0x02, 0x01};
   uint8_t coreInitCmd[] = {0x20, 0x01, 0x02, 0x00, 0x00};
@@ -463,6 +469,7 @@
     case HAL_WRAPPER_STATE_CLOSING:  // 6
       STLOG_HAL_V("%s - mHalWrapperState = HAL_WRAPPER_STATE_CLOSING",
                   __func__);
+      hal_fd_close();
       if ((p_data[0] == 0x4f) && (p_data[1] == 0x02)) {
         // intercept this expected message, don t forward.
         mHalWrapperState = HAL_WRAPPER_STATE_CLOSED;