/***************************************************************************
 *
 * Copyright 2015-2019 BES.
 * All rights reserved. All unpublished rights reserved.
 *
 * No part of this work may be used or reproduced in any form or by any
 * means, or stored in a database or retrieval system, without prior written
 * permission of BES.
 *
 * Use of this work is governed by a license granted by BES.
 * This work contains confidential and proprietary information of
 * BES. which is protected by copyright, trade secret,
 * trademark and other intellectual property rights.
 *
 ****************************************************************************/
#ifndef _HSHF_API_H
#define _HSHF_API_H

#include "btlib_type.h"
#include "rfcomm_api.h"

//#define PRO_PCDEMO
/////////////////////////////////////////////////////////////////
///common
#define HF_RECVDATA_BUF_SIZE  50
#define HS_RECVDATA_BUF_SIZE  48
/* notify upper layer */
enum hshf_event_t {
    /* user command event */
    HSHF_ENTER_PAIRING = 1,
    HSHF_EXIT_PAIRING,
    HF_DIAL_NUM_REQ,
    HF_ANSWER_REQ,
    HF_REJECT_REQ,
    HF_ENDCALL_REQ,
    HF_TRANSFER_REQ,
    HF_DIAL_LASTNUM_REQ,
    HF_TRANSMIT_DTMF,
    HF_VOICE_DIAL_REQ,          //10
    HF_VOICE_DIAL_CANCEL_REQ,
    HSHF_CONNECT_REQ,
    HF_DISCONNECT_REQ,
    HSHF_SPK_VOL_UP,
    HSHF_SPK_VOL_DOWN,
    HSHF_TOGGLE_MIC,
    HSHF_TOGGLE_LED,
    HSHF_TOGGLE_VOLBTN,
    HF_ANSWER_ENDCALL_CONN,     //  answer @ ring, end @ talking, connect@idle
    HF_REJ_REDIAL_TRANS_CONN,   // reject @ ring, redial @ connected, transfer @ talking, connect@idle
    HF_RELEASE_HOLD_REJECT_WAIT_REQ,    //21
    HF_RELEASE_ACTVIE_ACCEPT_OTHER_REQ,
    HF_HOLD_ACTIVE_ACCEPT_OTHER_REQ,
    HF_CONFERENCE_REQ,

    HSHF_SET_PB_STORAGE,
    HSHF_GET_PB_ITEM,
    /* internal event */
    HSHF_EVNT_BEGIN,            //27
    HSHF_RFCOMM_OPENED,         //28
    HSHF_CONN_OPENED,           
    HSHF_CONN_CLOSED,
    HSHF_CONN_REQ_FAIL,
    HF_AG_SUPPORTED_FEATURE_IND,
    HF_AG_SUPPORTED_INDICATOR_IND,
    HF_AG_CURRENT_INDICATOR_IND,
    HF_INDICATOR_EVENT_IND,
    HF_CIEV_CALL_IND,
    HF_CIEV_SERVICE_IND,
    HF_CIEV_CALLSETUP_IND,
    HF_CALLER_ID_IND,
    HF_VOICE_IND,
    HSHF_RING_IND,              //40
    HSHF_AUDIOCONN_OPENED,
    HSHF_AUDIOCONN_CLOSED,
    HSHF_SPK_VOL_IND,
    HSHF_MIC_VOL_IND,
    HF_IN_BAND_RING_IND,
    HSHF_PAIR_OK,               //46
    HSHF_PAIR_TOUT,
    HSHF_PAIR_FAILED,
    //// NEW for three way call
    HF_CIEW_CALLHELD_IND,
    HF_CCWA_IND,
    HF_VOICE_REQ,
    // for enter pairing and test mode by combkey
    HSHF_ENTER_TESTMODE,
    HSHF_CALL_IND,
    HF_EVENT_AT_RESULT_DATA,
};

enum hshf_callsetup_enum {
    CALL_SETUP_NONE,
    CALL_SETUP_INCOMING,
    CALL_SETUP_OUTGOING,

    CALL_SETUP_REMOTE_ALERT,
    CALL_SETUP_ESTABLISHED
};

enum hshf_call_enum {
    CALL_NONE = 0,
    CALL_ESTABLISHED
};

enum hshf_profile_enum {
    PRO_BOTH = 0,
    PRO_HEADSET,
    PRO_HANDSFREE,
    PRO_EXIT,
    PRO_SHOW
};

enum hshf_conn_state_enum {
    STOP,
    STANDBY = 1,
    PAIRING,
    LISTENING,                  //ready
    CONNECTING,
    AT_EXCHANGING,
    CONNECTED,
    SCOCONNECTED
};

/////////////hdzhu added--20090505---
enum hshf_pb_location_enum {
    LOCATION_SM = 0,
    LOCATION_ME,
    LOCATION_MT,
    LOCATION_DC,
    LOCATION_RC,
    LOCATION_MC,
    LOCATION_LD
};

enum hshf_pb_action_enum {
    ACTION_PREV = 0,
    ACTION_NEXT
};

#define MAX_DIAL_NUM_SIZE     0x10
#define MAX_SAVED_CALL_NUM    4

struct hshf_control_t {

    struct bdaddr_t remote;

    uint8 rfcomm_handle;

    uint8 listen_channel;

    uint8 disc_reason;

    uint8 profile_set;          /*0~2 *//* 0 - both, if set to both, profile_use depends on AG */

    uint8 profile_use;          /*1~2 *//* 1 - headset only */

    /* 2 - handsfree only */

    uint8 idxCall;              /* Phone status info - index "call"in +CIND - call    */

    uint8 idxService;           /* Phone status info - service index in +CIND - service */

    uint8 idxCallSetup;         /* Phone status info - Bluetooth proprietary call setup status from +CIND - callsetup */

    uint8 idxCallHeld;          /* Phone status info - BLuetooth proprietary call hold status from +CIND - callheld */

    uint8 statusCall;           /* Phone status info - call */

    uint8 statusService;        /* Phone status info - service */

    uint8 statusCallSetup;      /* Phone status info - callsetup */

    uint8 statusCallHeld;       /* Phone status info - callheld */

    int8 hfSupportedFeature;    /*hf supported feature bitmap:            */

    /* bit 0 - EC/NR function                */
    /*     1 - Call waiting and 3-way calling */
    /*     2 - CLI presentation capability   */
    /*     3 - Voice recognition activation   */
    /*     4 - Remote volume control         */
    /*     5 - Enhance call status            */
    /*     6 - Enhanced call control         */
    int16 agSupportedFeature;   /* AG supported feature bitmap  */

    /* bit0 - 3-way calling      */
    /*    1 - EC/NR function    */
    /*    2 - Voice recognition  */
    /*    3 - In-band ring tone */
    /*    4 - Attach a number to a voice tag */
    /*    5 - Ablility to reject a call */
    /*    6 - Enhanced call status     */
    /*    7 - Enhanced call control     */
    /*    8 - extended error result codes */

    enum hshf_conn_state_enum state;    /*check if it is connecting now, if it is connecting,the hf_connect_req will not work */

    uint32 isDialNumPending:1;  /* setup slc connection before dial */

    uint32 isDialLastNumPending:1;  /* setup slc connection before dial */

    uint32 isTransferPending:1; /* setup slc connection before transfer */

    uint32 isBvraPending:1;

    uint32 inbandRingEnabled:1; /*0-disable; 1-enable */

    uint32 bvraEnabled:1;

    uint32 brsf:1;

    uint32 isPBStorage:1;

    uint32 isPBItem:1;

    uint32 isDialedCallHistory:1;

    uint32 isReceivedCallHistory:1;

    uint32 isMissedCallHistory:1;

    uint32 unused:20;

    uint8 statusRing;           /* ring status info */

    uint8 dialNum[MAX_DIAL_NUM_SIZE];   /* dialed number 0-9, *, #, + */

    char dtmf;                  /* dtmf character, 0-9,*,#,A-D */

    uint8 spkVol;               /* should be implemented in hardware */

    uint8 micVol;               /* should be implemented in hardware */

    uint8 pb_storage;

    uint8 pb_prev_next;

    uint16 idx_pb;

    char callerId[MAX_DIAL_NUM_SIZE];   /* incoming caller id */

    char *recvBuf;

    void (*indicate) (uint8 event, void *pData);

};

extern struct hshf_control_t hshf_ctl;

// control list node
struct hshf_control_t_list_node {

    struct hshf_control_t hshf_ctrl;

    struct hshf_control_t_list_node *p_next;

};

// control list head
//extern struct hshf_control_t_list_node* p_hshf_ctrl_list_head = NULL;
/*---- hshf_app.c ----*/
void app_callback(uint8 event, void *pData);

/*----hshf.c----*/
enum hshf_conn_state_enum hshf_getState(void);

void hshf_setState(enum hshf_conn_state_enum state);

int8 hshf_connectReq(void);

int8 hshf_sendCmd(const char *data, uint32 len);

int8 hshf_atCmdParse(void);

int8 hshf_turnOn(void);

int8 hshf_turnOff(void);

int8 hshf_enterPairing(void);

int8 hshf_readPBReq(uint8 direction);

int8 hshf_selectPBReq(uint8 location);

//void hshf_setAutoAnswer(BOOLEAN flag);
//void hshf_setAutoConn(BOOLEAN flag);
uint8 hshf_getAutoAnswer(void);

uint8 hshf_getAutoConn(void);

void hshf_returnCallHistory2Host(uint8 location);

void hshf_cleanCallHistory(void);

void hshf_multi_dev_switch(void);

/*----volume.c----*/
int8 hshf_getSpkVol(void);

int8 hshf_getMicVol(void);

void hshf_setSpkVol(int8 vol);

void hshf_setMicVol(int8 vol);

int8 hshf_spkVolDown(void);

int8 hshf_spkVolUp(void);

void hshf_toggleMic(void);

void hshf_enableMic(void);

void hshf_disableMic(void);

#ifdef PRO_PCDEMO
/* ----profile.c----*/
uint8 hshf_showProfile(void);

#endif /* 
        */
int8 hshf_setProfile(uint8 profile);

uint8 hshf_showProUse(void);

/////////////////////////////////////////////////////////
/////handsfree
typedef struct {

    uint8 length;

    char *caller_id;

} hf_caller_id_ind_t;

/*---- hfp.c ----*/
uint16 hf_getAgSupportedFeature(void);

int8 hf_releaseSCO(struct bdaddr_t *bdaddr, uint8 reason);

/*----connect.c----*/
int8 hf_disconnectReq(void);

int8 hshf_exit_sniff(void);

/*---- call.c ----*/
int8 hf_answer(void);

int8 hf_reject(void);

int8 hf_endCall(void);

int8 hf_transferReq(void);

uint8 hf_isTransferPending(void);

int8 hf_callerIdInd(hf_caller_id_ind_t * ind);

uint8 hf_getCallStatus(void);

uint8 hf_getServiceStatus(void);

uint8 hf_getCallSetupStatus(void);

uint8 hf_acceptSecondCall(uint8 h_type);

/*---- dial.c ----*/
#ifdef PRO_PCDEMO
int8 hf_dialMemory(const uint8 * mem, uint8 length);

void hf_setDialNum(uint8 * num, uint8 len);

void hf_setDialMemory(uint8 * mem, uint8 len);

#endif /* 
        */
int8 hf_dialNum(const uint8 * dialNum, uint8 numLen);

//uint8 hf_isDialNumPending( void );
int8 hf_dialLastNum(void);

uint8 hf_isDialLastNumPending(void);

int8 hf_dialVoice(uint8 enable);

/*---- dtmf.c ----*/
int8 hf_transmitDtmf(char dtmf);

#ifdef PRO_PCDEMO
void hf_setDtmf(char dtmf);

/*---- nrec.c ----*/
//int8 hf_disableNrec( void );
#endif /* 
        */
/*---- ring.c ----*/
uint8 hf_isInbandRing(void);

void hshf_ring(void);

uint8 hshf_getRingStatus(void);

////////////////////////////////////////////////////////////////////////////////
//////headset

int8 hs_button_req(void);

#endif /* */
