/*
 * Copyright (C) 2012 The Android Open Source Project
 *
 * 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.
 */

#ifndef ANDROID_INCLUDE_BT_HF_H
#define ANDROID_INCLUDE_BT_HF_H

__BEGIN_DECLS

/* AT response code - OK/Error */
typedef enum {
    BTHF_AT_RESPONSE_ERROR = 0,
    BTHF_AT_RESPONSE_OK
} bthf_at_response_t;

typedef enum {
    BTHF_CONNECTION_STATE_DISCONNECTED = 0,
    BTHF_CONNECTION_STATE_CONNECTING,
    BTHF_CONNECTION_STATE_CONNECTED,
    BTHF_CONNECTION_STATE_SLC_CONNECTED,
    BTHF_CONNECTION_STATE_DISCONNECTING
} bthf_connection_state_t;

typedef enum {
    BTHF_AUDIO_STATE_DISCONNECTED = 0,
    BTHF_AUDIO_STATE_CONNECTING,
    BTHF_AUDIO_STATE_CONNECTED,
    BTHF_AUDIO_STATE_DISCONNECTING
} bthf_audio_state_t;

typedef enum {
    BTHF_VR_STATE_STOPPED = 0,
    BTHF_VR_STATE_STARTED
} bthf_vr_state_t;

typedef enum {
    BTHF_VOLUME_TYPE_SPK = 0,
    BTHF_VOLUME_TYPE_MIC
} bthf_volume_type_t;

/* Noise Reduction and Echo Cancellation */
typedef enum
{
    BTHF_NREC_STOP,
    BTHF_NREC_START
} bthf_nrec_t;

/* WBS codec setting */
typedef enum
{
   BTHF_WBS_NONE,
   BTHF_WBS_NO,
   BTHF_WBS_YES
}bthf_wbs_config_t;

/* CHLD - Call held handling */
typedef enum
{
    BTHF_CHLD_TYPE_RELEASEHELD,              // Terminate all held or set UDUB("busy") to a waiting call
    BTHF_CHLD_TYPE_RELEASEACTIVE_ACCEPTHELD, // Terminate all active calls and accepts a waiting/held call
    BTHF_CHLD_TYPE_HOLDACTIVE_ACCEPTHELD,    // Hold all active calls and accepts a waiting/held call
    BTHF_CHLD_TYPE_ADDHELDTOCONF,            // Add all held calls to a conference
} bthf_chld_type_t;

/** Callback for connection state change.
 *  state will have one of the values from BtHfConnectionState
 */
typedef void (* bthf_connection_state_callback)(bthf_connection_state_t state, bt_bdaddr_t *bd_addr);

/** Callback for audio connection state change.
 *  state will have one of the values from BtHfAudioState
 */
typedef void (* bthf_audio_state_callback)(bthf_audio_state_t state, bt_bdaddr_t *bd_addr);

/** Callback for VR connection state change.
 *  state will have one of the values from BtHfVRState
 */
typedef void (* bthf_vr_cmd_callback)(bthf_vr_state_t state, bt_bdaddr_t *bd_addr);

/** Callback for answer incoming call (ATA)
 */
typedef void (* bthf_answer_call_cmd_callback)(bt_bdaddr_t *bd_addr);

/** Callback for disconnect call (AT+CHUP)
 */
typedef void (* bthf_hangup_call_cmd_callback)(bt_bdaddr_t *bd_addr);

/** Callback for disconnect call (AT+CHUP)
 *  type will denote Speaker/Mic gain (BtHfVolumeControl).
 */
typedef void (* bthf_volume_cmd_callback)(bthf_volume_type_t type, int volume, bt_bdaddr_t *bd_addr);

/** Callback for dialing an outgoing call
 *  If number is NULL, redial
 */
typedef void (* bthf_dial_call_cmd_callback)(char *number, bt_bdaddr_t *bd_addr);

/** Callback for sending DTMF tones
 *  tone contains the dtmf character to be sent
 */
typedef void (* bthf_dtmf_cmd_callback)(char tone, bt_bdaddr_t *bd_addr);

/** Callback for enabling/disabling noise reduction/echo cancellation
 *  value will be 1 to enable, 0 to disable
 */
typedef void (* bthf_nrec_cmd_callback)(bthf_nrec_t nrec, bt_bdaddr_t *bd_addr);

/** Callback for AT+BCS and event from BAC
 *  WBS enable, WBS disable
 */
typedef void (* bthf_wbs_callback)(bthf_wbs_config_t wbs, bt_bdaddr_t *bd_addr);

/** Callback for call hold handling (AT+CHLD)
 *  value will contain the call hold command (0, 1, 2, 3)
 */
typedef void (* bthf_chld_cmd_callback)(bthf_chld_type_t chld, bt_bdaddr_t *bd_addr);

/** Callback for CNUM (subscriber number)
 */
typedef void (* bthf_cnum_cmd_callback)(bt_bdaddr_t *bd_addr);

/** Callback for indicators (CIND)
 */
typedef void (* bthf_cind_cmd_callback)(bt_bdaddr_t *bd_addr);

/** Callback for operator selection (COPS)
 */
typedef void (* bthf_cops_cmd_callback)(bt_bdaddr_t *bd_addr);

/** Callback for call list (AT+CLCC)
 */
typedef void (* bthf_clcc_cmd_callback) (bt_bdaddr_t *bd_addr);

/** Callback for unknown AT command recd from HF
 *  at_string will contain the unparsed AT string
 */
typedef void (* bthf_unknown_at_cmd_callback)(char *at_string, bt_bdaddr_t *bd_addr);

/** Callback for keypressed (HSP) event.
 */
typedef void (* bthf_key_pressed_cmd_callback)(bt_bdaddr_t *bd_addr);

/** BT-HF callback structure. */
typedef struct {
    /** set to sizeof(BtHfCallbacks) */
    size_t      size;
    bthf_connection_state_callback  connection_state_cb;
    bthf_audio_state_callback       audio_state_cb;
    bthf_vr_cmd_callback            vr_cmd_cb;
    bthf_answer_call_cmd_callback   answer_call_cmd_cb;
    bthf_hangup_call_cmd_callback   hangup_call_cmd_cb;
    bthf_volume_cmd_callback        volume_cmd_cb;
    bthf_dial_call_cmd_callback     dial_call_cmd_cb;
    bthf_dtmf_cmd_callback          dtmf_cmd_cb;
    bthf_nrec_cmd_callback          nrec_cmd_cb;
    bthf_wbs_callback               wbs_cb;
    bthf_chld_cmd_callback          chld_cmd_cb;
    bthf_cnum_cmd_callback          cnum_cmd_cb;
    bthf_cind_cmd_callback          cind_cmd_cb;
    bthf_cops_cmd_callback          cops_cmd_cb;
    bthf_clcc_cmd_callback          clcc_cmd_cb;
    bthf_unknown_at_cmd_callback    unknown_at_cmd_cb;
    bthf_key_pressed_cmd_callback   key_pressed_cmd_cb;
} bthf_callbacks_t;

/** Network Status */
typedef enum
{
    BTHF_NETWORK_STATE_NOT_AVAILABLE = 0,
    BTHF_NETWORK_STATE_AVAILABLE
} bthf_network_state_t;

/** Service type */
typedef enum
{
    BTHF_SERVICE_TYPE_HOME = 0,
    BTHF_SERVICE_TYPE_ROAMING
} bthf_service_type_t;

typedef enum {
    BTHF_CALL_STATE_ACTIVE = 0,
    BTHF_CALL_STATE_HELD,
    BTHF_CALL_STATE_DIALING,
    BTHF_CALL_STATE_ALERTING,
    BTHF_CALL_STATE_INCOMING,
    BTHF_CALL_STATE_WAITING,
    BTHF_CALL_STATE_IDLE
} bthf_call_state_t;

typedef enum {
    BTHF_CALL_DIRECTION_OUTGOING = 0,
    BTHF_CALL_DIRECTION_INCOMING
} bthf_call_direction_t;

typedef enum {
    BTHF_CALL_TYPE_VOICE = 0,
    BTHF_CALL_TYPE_DATA,
    BTHF_CALL_TYPE_FAX
} bthf_call_mode_t;

typedef enum {
    BTHF_CALL_MPTY_TYPE_SINGLE = 0,
    BTHF_CALL_MPTY_TYPE_MULTI
} bthf_call_mpty_type_t;

typedef enum {
    BTHF_CALL_ADDRTYPE_UNKNOWN = 0x81,
    BTHF_CALL_ADDRTYPE_INTERNATIONAL = 0x91
} bthf_call_addrtype_t;
/** Represents the standard BT-HF interface. */
typedef struct {

    /** set to sizeof(BtHfInterface) */
    size_t          size;
    /**
     * Register the BtHf callbacks
     */
    bt_status_t (*init)( bthf_callbacks_t* callbacks, int max_hf_clients);

    /** connect to headset */
    bt_status_t (*connect)( bt_bdaddr_t *bd_addr );

    /** dis-connect from headset */
    bt_status_t (*disconnect)( bt_bdaddr_t *bd_addr );

    /** create an audio connection */
    bt_status_t (*connect_audio)( bt_bdaddr_t *bd_addr );

    /** close the audio connection */
    bt_status_t (*disconnect_audio)( bt_bdaddr_t *bd_addr );

    /** start voice recognition */
    bt_status_t (*start_voice_recognition)( bt_bdaddr_t *bd_addr );

    /** stop voice recognition */
    bt_status_t (*stop_voice_recognition)( bt_bdaddr_t *bd_addr );

    /** volume control */
    bt_status_t (*volume_control) (bthf_volume_type_t type, int volume, bt_bdaddr_t *bd_addr );

    /** Combined device status change notification */
    bt_status_t (*device_status_notification)(bthf_network_state_t ntk_state, bthf_service_type_t svc_type, int signal,
                           int batt_chg);

    /** Response for COPS command */
    bt_status_t (*cops_response)(const char *cops, bt_bdaddr_t *bd_addr );

    /** Response for CIND command */
    bt_status_t (*cind_response)(int svc, int num_active, int num_held, bthf_call_state_t call_setup_state,
                                 int signal, int roam, int batt_chg, bt_bdaddr_t *bd_addr );

    /** Pre-formatted AT response, typically in response to unknown AT cmd */
    bt_status_t (*formatted_at_response)(const char *rsp, bt_bdaddr_t *bd_addr );

    /** ok/error response
     *  ERROR (0)
     *  OK    (1)
     */
    bt_status_t (*at_response) (bthf_at_response_t response_code, int error_code, bt_bdaddr_t *bd_addr );

    /** response for CLCC command 
     *  Can be iteratively called for each call index
     *  Call index of 0 will be treated as NULL termination (Completes response)
     */
    bt_status_t (*clcc_response) (int index, bthf_call_direction_t dir,
                                bthf_call_state_t state, bthf_call_mode_t mode,
                                bthf_call_mpty_type_t mpty, const char *number,
                                bthf_call_addrtype_t type, bt_bdaddr_t *bd_addr );

    /** notify of a call state change
     *  Each update notifies 
     *    1. Number of active/held/ringing calls
     *    2. call_state: This denotes the state change that triggered this msg
     *                   This will take one of the values from BtHfCallState
     *    3. number & type: valid only for incoming & waiting call
    */
    bt_status_t (*phone_state_change) (int num_active, int num_held, bthf_call_state_t call_setup_state,
                                       const char *number, bthf_call_addrtype_t type);

    /** Closes the interface. */
    void  (*cleanup)( void );

    /** configureation for the SCO codec */
    bt_status_t (*configure_wbs)( bt_bdaddr_t *bd_addr ,bthf_wbs_config_t config );
} bthf_interface_t;

__END_DECLS

#endif /* ANDROID_INCLUDE_BT_HF_H */
