/******************************************************************************
 *
 *  Copyright (C) 2010-2014 Broadcom Corporation
 *
 *  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.
 *
 ******************************************************************************/


/******************************************************************************
 *
 *  This is the public interface file for NFA Connection Handover,
 *  Broadcom's NFC application layer for mobile phones.
 *
 ******************************************************************************/
#ifndef NFA_CHO_API_H
#define NFA_CHO_API_H

#include "nfa_api.h"
#include "ndef_utils.h"

/*****************************************************************************
**  Constants and data types
*****************************************************************************/

/* Handover version */
#define NFA_CHO_VERSION             0x12    /* version 1.2 */
#define NFA_CHO_GET_MAJOR_VERSION(x) ((UINT8)(x) >> 4)
#define NFA_CHO_GET_MINOR_VERSION(x) ((UINT8)(x) & 0x0F)

/*
** NFA Connection Handover callback events
*/
#define NFA_CHO_REG_EVT             0x00    /* Registered                       */
#define NFA_CHO_ACTIVATED_EVT       0x01    /* LLCP link activated              */
#define NFA_CHO_DEACTIVATED_EVT     0x02    /* LLCP link deactivated            */
#define NFA_CHO_CONNECTED_EVT       0x03    /* data link connected              */
#define NFA_CHO_DISCONNECTED_EVT    0x04    /* data link disconnected           */
#define NFA_CHO_REQUEST_EVT         0x05    /* AC information in "Hr" record    */
#define NFA_CHO_SELECT_EVT          0x06    /* AC information in "Hs" record    */
#define NFA_CHO_SEL_ERR_EVT         0x07    /* Received select with error       */
#define NFA_CHO_TX_FAIL_EVT         0x08    /* Cannot send message to peer      */

typedef UINT8 tNFA_CHO_EVT;

/*
** Data for NFA_CHO_ACTIVATED_EVT
*/
typedef struct
{
    BOOLEAN         is_initiator;   /* TRUE if local LLCP is initiator */
} tNFA_CHO_ACTIVATED;

/* NFA Connection Handover Carrier Power State */
#define NFA_CHO_CPS_INACTIVE        0x00    /* Carrier is currently off         */
#define NFA_CHO_CPS_ACTIVE          0x01    /* Carrier is currently on          */
#define NFA_CHO_CPS_ACTIVATING      0x02    /* Activating carrier               */
#define NFA_CHO_CPS_UNKNOWN         0x03    /* Unknown                          */

typedef UINT8 tNFA_CHO_CPS;

/* Data for Alternative Carrier Information */
typedef struct
{
    tNFA_CHO_CPS        cps;            /* carrier power state                      */
    UINT8               num_aux_data;   /* number of Auxiliary NDEF records         */
} tNFA_CHO_AC_INFO;

/* Device Role of Handover */
#define NFA_CHO_ROLE_REQUESTER  0
#define NFA_CHO_ROLE_SELECTOR   1
#define NFA_CHO_ROLE_UNDECIDED  2

typedef UINT8 tNFA_CHO_ROLE_TYPE;

/*
** Data for NFA_CHO_CONNECTED_EVT
*/
typedef struct
{
    tNFA_CHO_ROLE_TYPE  initial_role;   /* NFA_CHO_ROLE_REQUESTER if local initiated */
                                        /* NFA_CHO_ROLE_SELECTOR if remote initiated */
} tNFA_CHO_CONNECTED;

/* Disconnected reason */
#define NFA_CHO_DISC_REASON_API_REQUEST         0
#define NFA_CHO_DISC_REASON_ALEADY_CONNECTED    1
#define NFA_CHO_DISC_REASON_CONNECTION_FAIL     2
#define NFA_CHO_DISC_REASON_PEER_REQUEST        3
#define NFA_CHO_DISC_REASON_LINK_DEACTIVATED    4
#define NFA_CHO_DISC_REASON_TIMEOUT             5
#define NFA_CHO_DISC_REASON_UNKNOWN_MSG         6
#define NFA_CHO_DISC_REASON_INVALID_MSG         7
#define NFA_CHO_DISC_REASON_SEMANTIC_ERROR      8
#define NFA_CHO_DISC_REASON_INTERNAL_ERROR      9

typedef UINT8 tNFA_CHO_DISC_REASON;

/*
** Data for NFA_CHO_DISCONNECTED_EVT
*/
typedef struct
{
    tNFA_CHO_DISC_REASON    reason;     /* disconnected reason */
} tNFA_CHO_DISCONNECTED;

/* Reference ID */
typedef struct
{
    UINT8               ref_len;
    UINT8               ref_name[NFA_CHO_MAX_REF_NAME_LEN];
} tNFA_CHO_REF_ID;

/* Alternative Carrier records including carrier power state, carrier data reference and aux data reference */
typedef struct
{
    tNFA_CHO_CPS        cps;                                      /* carrier power state    */
    tNFA_CHO_REF_ID     carrier_data_ref;                         /* carrier data reference */
    UINT8               aux_data_ref_count;                       /* number of aux data     */
    tNFA_CHO_REF_ID     aux_data_ref[NFA_CHO_MAX_AUX_DATA_COUNT]; /* aux data reference     */
} tNFA_CHO_AC_REC;

/*
** Data for NFA_CHO_REQUEST_EVT
** Application may receive it while waiting for NFA_CHO_SELECT_EVT because of handover collision.
*/
typedef struct
{
    tNFA_STATUS         status;
    UINT8               num_ac_rec;                     /* number of Alternative Carrier records*/
    tNFA_CHO_AC_REC     ac_rec[NFA_CHO_MAX_AC_INFO];    /* Alternative Carrier records          */
    UINT8               *p_ref_ndef;                    /* pointer of NDEF including AC records */
    UINT32              ref_ndef_len;                   /* length of NDEF                       */
} tNFA_CHO_REQUEST;

/*
** Data for NFA_CHO_SELECT_EVT
*/
typedef struct
{
    tNFA_STATUS         status;
    UINT8               num_ac_rec;                     /* number of Alternative Carrier records*/
    tNFA_CHO_AC_REC     ac_rec[NFA_CHO_MAX_AC_INFO];    /* Alternative Carrier records          */
    UINT8               *p_ref_ndef;                    /* pointer of NDEF including AC records */
    UINT32              ref_ndef_len;                   /* length of NDEF                       */
} tNFA_CHO_SELECT;

/* Error reason */
#define NFA_CHO_ERROR_TEMP_MEM  0x01
#define NFA_CHO_ERROR_PERM_MEM  0x02
#define NFA_CHO_ERROR_CARRIER   0x03

/*
** Data for NFA_CHO_SEL_ERR_EVT
*/
typedef struct
{
    UINT8               error_reason;   /* Error reason          */
    UINT32              error_data;     /* Error Data per reason */
} tNFA_CHO_SEL_ERR;

/* Union of all Connection Handover callback structures */
typedef union
{
    tNFA_STATUS             status;         /* NFA_CHO_REG_EVT          */
                                            /* NFA_CHO_DEACTIVATED_EVT  */
                                            /* NFA_CHO_TX_FAIL_EVT      */
    tNFA_CHO_ACTIVATED      activated;      /* NFA_CHO_ACTIVATED_EVT    */
    tNFA_CHO_CONNECTED      connected;      /* NFA_CHO_CONNECTED_EVT    */
    tNFA_CHO_DISCONNECTED   disconnected;   /* NFA_CHO_DISCONNECTED_EVT */
    tNFA_CHO_SELECT         select;         /* NFA_CHO_SELECT_EVT       */
    tNFA_CHO_REQUEST        request;        /* NFA_CHO_REQUEST_EVT      */
    tNFA_CHO_SEL_ERR        sel_err;        /* NFA_CHO_SEL_ERR_EVT      */
} tNFA_CHO_EVT_DATA;

/* NFA Connection Handover callback */
typedef void (tNFA_CHO_CBACK) (tNFA_CHO_EVT event, tNFA_CHO_EVT_DATA *p_data);

/*****************************************************************************
**  External Function Declarations
*****************************************************************************/
#ifdef __cplusplus
extern "C"
{
#endif

/*******************************************************************************
**
** Function         NFA_ChoRegister
**
** Description      This function is called to register callback function to receive
**                  connection handover events.
**
**                  On this registration, "urn:nfc:sn:handover" server will be
**                  registered on LLCP if enable_server is TRUE.
**
**                  The result of the registration is reported with NFA_CHO_REG_EVT.
**
** Note:            If RF discovery is started, NFA_StopRfDiscovery()/NFA_RF_DISCOVERY_STOPPED_EVT
**                  should happen before calling this function
**
** Returns          NFA_STATUS_OK if successfully initiated
**                  NFA_STATUS_FAILED otherwise
**
*******************************************************************************/
NFC_API extern tNFA_STATUS NFA_ChoRegister (BOOLEAN        enable_server,
                                            tNFA_CHO_CBACK *p_cback);

/*******************************************************************************
**
** Function         NFA_ChoDeregister
**
** Description      This function is called to deregister callback function from NFA
**                  Connection Handover Application.
**
**                  If this is the valid deregistration, NFA Connection Handover
**                  Application will close the service with "urn:nfc:sn:handover"
**                  on LLCP and deregister NDEF type handler if any.
**
** Note:            If RF discovery is started, NFA_StopRfDiscovery()/NFA_RF_DISCOVERY_STOPPED_EVT
**                  should happen before calling this function
**
** Returns          NFA_STATUS_OK if successfully initiated
**                  NFA_STATUS_FAILED otherwise
**
*******************************************************************************/
NFC_API extern tNFA_STATUS NFA_ChoDeregister (void);

/*******************************************************************************
**
** Function         NFA_ChoConnect
**
** Description      This function is called to create data link connection to
**                  Connection Handover server on peer device.
**
**                  It must be called after receiving NFA_CHO_ACTIVATED_EVT.
**                  NFA_CHO_CONNECTED_EVT will be returned if successful.
**                  Otherwise, NFA_CHO_DISCONNECTED_EVT will be returned.
**
** Returns          NFA_STATUS_OK if successfully initiated
**                  NFA_STATUS_FAILED otherwise
**
*******************************************************************************/
NFC_API extern tNFA_STATUS NFA_ChoConnect (void);

/*******************************************************************************
**
** Function         NFA_ChoDisconnect
**
** Description      This function is called to disconnect data link connection with
**                  Connection Handover server on peer device.
**
**                  NFA_CHO_DISCONNECTED_EVT will be returned.
**
** Returns          NFA_STATUS_OK if successfully initiated
**                  NFA_STATUS_FAILED otherwise
**
*******************************************************************************/
NFC_API extern tNFA_STATUS NFA_ChoDisconnect (void);

/*******************************************************************************
**
** Function         NFA_ChoSendHr
**
** Description      This function is called to send Handover Request Message with
**                  Handover Carrier records or Alternative Carrier records.
**
**                  It must be called after receiving NFA_CHO_CONNECTED_EVT.
**
**                  NDEF may include one or more Handover Carrier records or Alternative
**                  Carrier records with auxiliary data.
**                  The records in NDEF must be matched with tNFA_CHO_AC_INFO in order.
**                  Payload ID must be unique and Payload ID length must be less than
**                  or equal to NFA_CHO_MAX_REF_NAME_LEN.
**
**                  The alternative carrier information of Handover Select record
**                  will be sent to application by NFA_CHO_SELECT_EVT. Application
**                  may receive NFA_CHO_REQUEST_EVT because of handover collision.
**
** Returns          NFA_STATUS_OK if successfully initiated
**                  NFA_STATUS_FAILED otherwise
**
*******************************************************************************/
NFC_API extern tNFA_STATUS NFA_ChoSendHr (UINT8             num_ac_info,
                                          tNFA_CHO_AC_INFO *p_ac_info,
                                          UINT8            *p_ndef,
                                          UINT32            ndef_len);

/*******************************************************************************
**
** Function         NFA_ChoSendHs
**
** Description      This function is called to send Handover Select message with
**                  Alternative Carrier records as response to Handover Request
**                  message.
**
**                  NDEF may include one or more Alternative Carrier records with
**                  auxiliary data.
**                  The records in NDEF must be matched with tNFA_CHO_AC_INFO in order.
**                  Payload ID must be unique and Payload ID length must be less than
**                  or equal to NFA_CHO_MAX_REF_NAME_LEN.
**
** Returns          NFA_STATUS_OK if successfully initiated
**                  NFA_STATUS_FAILED otherwise
**
*******************************************************************************/
NFC_API extern tNFA_STATUS NFA_ChoSendHs (UINT8             num_ac_info,
                                          tNFA_CHO_AC_INFO *p_ac_info,
                                          UINT8            *p_ndef,
                                          UINT32            ndef_len);

/*******************************************************************************
**
** Function         NFA_ChoSendSelectError
**
** Description      This function is called to send Error record to indicate failure
**                  to process the most recently received Handover Request message.
**
**                  error_reason : NFA_CHO_ERROR_TEMP_MEM
**                                 NFA_CHO_ERROR_PERM_MEM
**                                 NFA_CHO_ERROR_CARRIER
**
** Returns          NFA_STATUS_OK if successfully initiated
**                  NFA_STATUS_FAILED otherwise
**
*******************************************************************************/
NFC_API extern tNFA_STATUS NFA_ChoSendSelectError (UINT8  error_reason,
                                                   UINT32 error_data);

/*******************************************************************************
**
** Function         NFA_ChoSetTraceLevel
**
** Description      This function sets the trace level for CHO.  If called with
**                  a value of 0xFF, it simply returns the current trace level.
**
** Returns          The new or current trace level
**
*******************************************************************************/
NFC_API extern UINT8 NFA_ChoSetTraceLevel (UINT8 new_level);

#if (defined (NFA_CHO_TEST_INCLUDED) && (NFA_CHO_TEST_INCLUDED == TRUE))

#define NFA_CHO_TEST_VERSION    0x01
#define NFA_CHO_TEST_RANDOM     0x02
/*******************************************************************************
**
** Function         NFA_ChoSetTestParam
**
** Description      This function is called to set test parameters.
**
*******************************************************************************/
NFC_API extern void NFA_ChoSetTestParam (UINT8  test_enable,
                                         UINT8  test_version,
                                         UINT16 test_random_number);
#endif

#ifdef __cplusplus
}
#endif

#endif /* NFA_CHO_API_H */

