/*
 * Copyright (C) 2010 NXP Semiconductors
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */


/**
 * \file  phFriNfc_LlcpMac.h
 * \brief NFC LLCP MAC Mappings For Different RF Technologies.
 *
 * Project: NFC-FRI
 *
 */

#ifndef PHFRINFC_LLCPMAC_H
#define PHFRINFC_LLCPMAC_H


/*include files*/
#include <phNfcTypes.h>
#include <phNfcLlcpTypes.h>
#include <phNfcStatus.h>
#include <phFriNfc.h>

#include <phFriNfc_OvrHal.h>

/** 
 * \name LLCP MAC Mapping
 *
 * File: \ref phFriNfc_LlcpMac.h
 *
 */


/** \defgroup grp_fri_nfc_llcp_mac LLCP MAC Mapping Component
 *
 *  This component implements the different MAC mapping for a Logical Link Control Protocol communication,
 *  as defined by the NFC Forum LLCP specifications.\n
 *  The MAC component handles the mapping for the different technologies supported by LLCP
 *..This component provides an API to the upper layer with the following features:\n\n
 *  - Reset the MAC mapping component
 *      - \ref phFriNfc_LlcpMac_ChkLlcp
 *      .
 *  - Check the LLCP Compliancy
 *      - \ref phFriNfc_LlcpMac_ChkLlcp
 *      .
 *  - Activate the LLCP link
 *      - \ref phFriNfc_LlcpMac_Activate
 *      .
 *  - Deactivate the LLCP link
 *      - \ref phFriNfc_LlcpMac_Deactivate
 *      .
 *  - Register the MAC component Interface with a specific technologie (NFCIP/ISO14443)
 *      - \ref phFriNfc_LlcpMac_Register
 *      .
 *  - Send packets through the LLCP link
 *      - \ref phFriNfc_LlcpMac_Send
 *      .
  *  - Receive packets through the LLCP link
 *      - \ref phFriNfc_LlcpMac_Receive
 *  
 */

/**
 * \ingroup grp_fri_nfc_llcp_mac
 * \brief Declaration of a MAC type
 */
struct phFriNfc_LlcpMac;
typedef struct phFriNfc_LlcpMac phFriNfc_LlcpMac_t;

/**
 *  \ingroup grp_fri_nfc_llcp_mac
 *
 */
/*========== ENUMERATES ===========*/

/* Enum reperesents the different MAC mapping*/
typedef enum phFriNfc_LlcpMac_eType
{
   phFriNfc_LlcpMac_eTypeNfcip,
   phFriNfc_LlcpMac_eTypeIso14443   
}phFriNfc_LlcpMac_eType_t;

/* Enum reperesents the different Peer type for a LLCP communication*/
typedef enum phFriNfc_LlcpMac_ePeerType
{
   phFriNfc_LlcpMac_ePeerTypeInitiator,
   phFriNfc_LlcpMac_ePeerTypeTarget
}phFriNfc_LlcpMac_ePeerType_t;






/*========== CALLBACKS ===========*/

typedef void (*phFriNfc_LlcpMac_Chk_CB_t) (void        *pContext,
                                           NFCSTATUS   status);

typedef void (*phFriNfc_LlcpMac_LinkStatus_CB_t) (void                             *pContext,
                                                  phFriNfc_LlcpMac_eLinkStatus_t   eLinkStatus,
                                                  phNfc_sData_t                    *psData,
                                                  phFriNfc_LlcpMac_ePeerType_t     PeerRemoteDevType);

typedef void (*phFriNfc_LlcpMac_Send_CB_t) (void            *pContext,
                                            NFCSTATUS       status);


typedef void (*phFriNfc_LlcpMac_Reveive_CB_t) (void               *pContext,
                                               NFCSTATUS          status,
                                               phNfc_sData_t      *psData);


/*========== FUNCTIONS TYPES ===========*/

typedef NFCSTATUS (*pphFriNfcLlpcMac_Chk_t) ( phFriNfc_LlcpMac_t               *LlcpMac,
                                              phFriNfc_LlcpMac_Chk_CB_t        ChkLlcpMac_Cb,
                                              void                             *pContext);

typedef NFCSTATUS (*pphFriNfcLlpcMac_Activate_t) (phFriNfc_LlcpMac_t                   *LlcpMac);

typedef NFCSTATUS (*pphFriNfcLlpcMac_Deactivate_t) (phFriNfc_LlcpMac_t                 *LlcpMac);

typedef NFCSTATUS (*pphFriNfcLlpcMac_Send_t) (phFriNfc_LlcpMac_t               *LlcpMac,
                                              phNfc_sData_t                    *psData,
                                              phFriNfc_LlcpMac_Send_CB_t       LlcpMacSend_Cb,
                                              void                             *pContext);

typedef NFCSTATUS (*pphFriNfcLlpcMac_Receive_t) (phFriNfc_LlcpMac_t               *LlcpMac,
                                                 phNfc_sData_t                    *psData,
                                                 phFriNfc_LlcpMac_Reveive_CB_t    LlcpMacReceive_Cb,
                                                 void                             *pContext);

/*========== STRUCTURES ===========*/

/**
 * \ingroup grp_fri_nfc_llcp_mac
 * \brief Generic Interface structure with the Lower Layer
 */
typedef struct phFriNfc_LlcpMac_Interface
{
   pphFriNfcLlpcMac_Chk_t              chk;
   pphFriNfcLlpcMac_Activate_t         activate;
   pphFriNfcLlpcMac_Deactivate_t       deactivate;
   pphFriNfcLlpcMac_Send_t             send;
   pphFriNfcLlpcMac_Receive_t          receive;
} phFriNfc_LlcpMac_Interface_t;

/**
 * \ingroup grp_fri_nfc_llcp_mac
 * \brief Definition of the MAC type
 */
struct phFriNfc_LlcpMac 
{
   phFriNfc_LlcpMac_eLinkStatus_t      LinkState;
   phHal_sRemoteDevInformation_t       *psRemoteDevInfo;
   phFriNfc_LlcpMac_LinkStatus_CB_t    LinkStatus_Cb;
   void                                *LinkStatus_Context;
   phFriNfc_LlcpMac_Interface_t        LlcpMacInterface; 
   phFriNfc_LlcpMac_ePeerType_t        PeerRemoteDevType;
   phFriNfc_LlcpMac_eType_t            MacType;

   /**<\internal Holds the completion routine informations of the Map Layer*/
   phFriNfc_CplRt_t                   MacCompletionInfo;
   void                               *LowerDevice;
   phFriNfc_LlcpMac_Send_CB_t         MacSend_Cb;
   void                               *MacSend_Context;
   phFriNfc_LlcpMac_Reveive_CB_t      MacReceive_Cb;
   void                               *MacReceive_Context;
   phNfc_sData_t                      *psReceiveBuffer;
   phNfc_sData_t                      *psSendBuffer;
   phNfc_sData_t                      sConfigParam;
   uint8_t                            RecvPending;
   uint8_t                            SendPending;
   uint8_t                            RecvStatus;
   phHal_uCmdList_t                   Cmd;
   phHal_sDepAdditionalInfo_t         psDepAdditionalInfo;
} ;


/*
################################################################################
********************** MAC Interface Function Prototype  ***********************
################################################################################
*/

/**
 * \ingroup grp_fri_nfc_llcp_mac
 * \brief
 */
NFCSTATUS phFriNfc_LlcpMac_Reset (phFriNfc_LlcpMac_t                 *LlcpMac,
                                  void                               *LowerDevice,
                                  phFriNfc_LlcpMac_LinkStatus_CB_t   LinkStatus_Cb,
                                  void                               *pContext);
/**
 * \ingroup grp_fri_nfc_llcp_mac
 * \brief
 */
NFCSTATUS phFriNfc_LlcpMac_ChkLlcp (phFriNfc_LlcpMac_t                  *LlcpMac, 
                                    phHal_sRemoteDevInformation_t       *psRemoteDevInfo,
                                    phFriNfc_LlcpMac_Chk_CB_t           ChkLlcpMac_Cb,
                                    void                                *pContext);

/**
 * \ingroup grp_fri_nfc_llcp_mac
 * \brief
 */
NFCSTATUS phFriNfc_LlcpMac_Activate (phFriNfc_LlcpMac_t                   *LlcpMac);

/**
 * \ingroup grp_fri_nfc_llcp_mac
 * \brief
 */
NFCSTATUS phFriNfc_LlcpMac_Deactivate (phFriNfc_LlcpMac_t                 *LlcpMac);

/**
 * \ingroup grp_fri_nfc_llcp_mac
 * \brief
 */
NFCSTATUS phFriNfc_LlcpMac_Send (phFriNfc_LlcpMac_t               *LlcpMac, 
                                 phNfc_sData_t                    *psData,
                                 phFriNfc_LlcpMac_Send_CB_t       LlcpMacSend_Cb,
                                 void                             *pContext);

/**
 * \ingroup grp_fri_nfc_llcp_mac
 * \brief
 */
NFCSTATUS phFriNfc_LlcpMac_Receive (phFriNfc_LlcpMac_t               *LlcpMac,
                                    phNfc_sData_t                    *psData,
                                    phFriNfc_LlcpMac_Reveive_CB_t    ReceiveLlcpMac_Cb,
                                    void                             *pContext);

#endif /* PHFRINFC_LLCPMAC_H */