/**
* Check for target presence.
* Checks given target is present in RF filed or not
*/
NFCSTATUS phLibNfc_RemoteDev_CheckPresence( phLibNfc_Handle     hTargetDev,
        pphLibNfc_RspCb_t   pPresenceChk_RspCb,
        void*               pRspCbCtx
                                          )
{
    NFCSTATUS RetVal = NFCSTATUS_FAILED;
    phHal_sRemoteDevInformation_t *ps_rem_dev_info = NULL;
    /* Check for valid sate */
    if((NULL == gpphLibContext) ||
            (gpphLibContext->LibNfcState.cur_state
             == eLibNfcHalStateShutdown))
    {
        RetVal = NFCSTATUS_NOT_INITIALISED;
    }
    /* Check for valid parameters*/
    else if((NULL == pRspCbCtx) || (NULL == pPresenceChk_RspCb)
            || (hTargetDev == 0) )
    {
        RetVal= NFCSTATUS_INVALID_PARAMETER;
    }
    /* Check for DeInit call*/
    else if(gpphLibContext->LibNfcState.next_state
            == eLibNfcHalStateShutdown)
    {
        RetVal = NFCSTATUS_SHUTDOWN;
    }
    /* Check target is connected or not */
    else if( gpphLibContext->Connected_handle == 0)
    {
        RetVal = NFCSTATUS_TARGET_NOT_CONNECTED;
    }
    /* Check given handle is valid or not*/
    else if(hTargetDev != gpphLibContext->Connected_handle)
    {
        RetVal = NFCSTATUS_INVALID_HANDLE;
    }
#ifdef LLCP_TRANSACT_CHANGES
    else if ((LLCP_STATE_RESET_INIT != gpphLibContext->llcp_cntx.sLlcpContext.state)
             && (LLCP_STATE_CHECKED != gpphLibContext->llcp_cntx.sLlcpContext.state))
    {
        RetVal= NFCSTATUS_BUSY;
    }
#endif /* #ifdef LLCP_TRANSACT_CHANGES */
    else
    {
        ps_rem_dev_info = (phHal_sRemoteDevInformation_t *)
                          gpphLibContext->Connected_handle;
        if((phHal_eMifare_PICC == ps_rem_dev_info->RemDevType)
                &&(0 != ps_rem_dev_info->RemoteDevInfo.Iso14443A_Info.Sak)
                &&(TRUE == gpphLibContext->LastTrancvSuccess))
        {
            /* Call HAL4 API */
            RetVal =  phHal4Nfc_Transceive(
                          gpphLibContext->psHwReference,
                          gpphLibContext->psBufferedAuth,
                          (phHal_sRemoteDevInformation_t *)
                          gpphLibContext->Connected_handle,
                          (pphHal4Nfc_TransceiveCallback_t )
                          phLibNfc_ChkPresence_Trcv_Cb,
                          (void *)gpphLibContext
                      );

        }
        else
        {
            /* Call lower layer PresenceCheck function */
            RetVal = phHal4Nfc_PresenceCheck(gpphLibContext->psHwReference,
                                             phLibNfc_RemoteDev_CheckPresence_Cb,
                                             (void *)gpphLibContext);
        }
        if( NFCSTATUS_PENDING == PHNFCSTATUS(RetVal))
        {
            gpphLibContext->CBInfo.pClientPresChkCb = pPresenceChk_RspCb;
            gpphLibContext->CBInfo.pClientPresChkCntx = pRspCbCtx;
            /* Mark General callback pending status as TRUE*/
            gpphLibContext->status.GenCb_pending_status = TRUE;

            /* Update the state machine*/
            gpphLibContext->LibNfcState.next_state = eLibNfcHalStatePresenceChk;
        }
        else /* If return value is internal error(other than pending ) return NFCSTATUS_FAILED*/
        {
            RetVal = NFCSTATUS_FAILED;
        }
    }
    return RetVal;
}
NFCSTATUS phFriNfc_OvrHal_Transceive(phFriNfc_OvrHal_t              *OvrHal,
                                     phFriNfc_CplRt_t               *CompletionInfo,
                                     phHal_sRemoteDevInformation_t  *RemoteDevInfo,
                                     phHal_uCmdList_t                Cmd,
                                     phHal_sDepAdditionalInfo_t     *DepAdditionalInfo,
                                     uint8_t                        *SendBuf,
                                     uint16_t                        SendLength,
                                     uint8_t                        *RecvBuf,
                                     uint16_t                       *RecvLength)
{
    NFCSTATUS status = NFCSTATUS_PENDING;
    uint8_t i = 0;
    uint32_t length = SendLength;

    /* To remove "warning (VS C4100) : unreferenced formal parameter" */
    PHNFC_UNUSED_VARIABLE(DepAdditionalInfo);

    /* Check the Input Parameters */
    if ((NULL == OvrHal) || (NULL == CompletionInfo) || (NULL == RemoteDevInfo)
        || (NULL == (void*)SendBuf) || (NULL == RecvBuf) || (NULL == RecvLength) 
        || ((phHal_eJewel_PICC != RemoteDevInfo->RemDevType) && (0 == SendLength)))

    {
        status = PHNFCSTVAL(CID_FRI_NFC_OVR_HAL, NFCSTATUS_INVALID_PARAMETER);
    }
    else
    {
        /* 16 is the maximum data, that can be sent to the mifare standard */
        static uint8_t      mif_send_buf[MAX_MIF_PACKET_LEN] = {0};
        /* Populate the Transfer info structure */
        OvrHal->TranceiveInfo.cmd = Cmd;
     
        /* Populate the Send Buffer Info */
        if((phHal_eMifare_PICC == RemoteDevInfo->RemDevType) 
            || (phHal_eISO14443_3A_PICC == RemoteDevInfo->RemDevType))
        {
            OvrHal->TranceiveInfo.addr = SendBuf[i++];
            length = (SendLength - i);

            if ((phHal_eMifareAuthentA == Cmd.MfCmd) 
                || (phHal_eMifareAuthentB == Cmd.MfCmd))
            {
                uint8_t     uid_index = 0;
                /* Authentication requires UID in the send buffer */
                uint8_t     uid_len = 
                        RemoteDevInfo->RemoteDevInfo.Iso14443A_Info.UidLength;
                OvrHal->TranceiveInfo.sSendData.buffer = mif_send_buf;

                switch (uid_len)
                {
                    case MIFARE_PLUS_UID_LENGTH:
                    {
                        uid_index = MIFARE_PLUS_UID_INDEX_TO_COPY;
                        uid_len = MIFARE_UID_LEN_TO_COPY;
                        break;
                    }

                    case MIFARE_CLASSIC_UID_LENGTH:
                    {
                        uid_index = 0;
                        break;
                    }

                    default:
                    {
                        status = PHNFCSTVAL (CID_FRI_NFC_OVR_HAL, 
                                            NFCSTATUS_READ_FAILED);                                            
                        break;
                    }
                }

                if (NFCSTATUS_PENDING == status)
                {
                    /* copy uid to the send buffer for the authentication */
                    (void)memcpy ((void *)mif_send_buf, 
                        (void *)&RemoteDevInfo->RemoteDevInfo.Iso14443A_Info.Uid[uid_index], 
                        uid_len);

                    (void)memcpy((mif_send_buf + uid_len), &(SendBuf[i]), length);
                    length += uid_len;
                }
            }
            else
            {
                OvrHal->TranceiveInfo.sSendData.buffer = &SendBuf[i++];         
            }           
            OvrHal->TranceiveInfo.sSendData.length = length;
        }
        else
        {
            OvrHal->TranceiveInfo.sSendData.buffer = &SendBuf[i++];
            OvrHal->TranceiveInfo.sSendData.length = length;
        }
        
        if (NFCSTATUS_PENDING == status)
        {
            /* Populate the Receive buffer */
            OvrHal->TranceiveInfo.sRecvData.buffer = RecvBuf;
            OvrHal->TranceiveInfo.sRecvData.length = *RecvLength;
            OvrHal->pndef_recv_length = RecvLength;
            phFriNfc_OvrHal_SetComplInfo(OvrHal,CompletionInfo, PH_FRINFC_OVRHAL_TRX);
            
            /* Call the HAL 4.0 Transceive Function */
            status = phHal4Nfc_Transceive (OvrHal->psHwReference, 
                                            &OvrHal->TranceiveInfo, RemoteDevInfo, 
                                            phFriNfc_OvrHal_CB_Transceive, (void *)OvrHal);
        }

    }
    return status;  

}