/* Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 */

#ifndef CRAS_HFP_SLC_H_
#define CRAS_HFP_SLC_H_

struct hfp_slc_handle;
struct cras_bt_device;

/*
 * Hands-free HFP and AG supported features bits definition.
 * Per HFP 1.7.1 specification section 4.34.1, command
 * AT+BRSF (Bluetooth Retrieve Supported Features)
 */
#define HF_EC_ANDOR_NR 0x0001
#define HF_THREE_WAY_CALLING 0x0002
#define HF_CLI_PRESENTATION_CAP 0x0004
#define HF_VOICE_RECOGNITION 0x0008
#define HF_REMOTE_VOLUME_CONTROL 0x0010
#define HF_ENHANCED_CALL_STATUS 0x0020
#define HF_ENHANCED_CALL_CONTROL 0x0040
#define HF_CODEC_NEGOTIATION 0x0080
#define HF_HF_INDICATORS 0x0100
#define HF_ESCO_S4_T2_SETTINGS 0x0200

#define AG_THREE_WAY_CALLING 0x0001
#define AG_EC_ANDOR_NR 0x0002
#define AG_VOICE_RECOGNITION 0x0004
#define AG_INBAND_RINGTONE 0x0008
#define AG_ATTACH_NUMBER_TO_VOICETAG 0x0010
#define AG_REJECT_A_CALL 0x0020
#define AG_ENHANCED_CALL_STATUS 0x0040
#define AG_ENHANCED_CALL_CONTROL 0x0080
#define AG_EXTENDED_ERROR_RESULT_CODES 0x0100
#define AG_CODEC_NEGOTIATION 0x0200
#define AG_HF_INDICATORS 0x0400
#define AG_ESCO_S4_T2_SETTINGS 0x0800

/*
 * Apple specific bluetooth commands that extend accessory capabilities.
 * Per Accessory Design Guidelines for Apple devices, command AT+XAPL
 */

#define APL_RESERVED 0x01
#define APL_BATTERY 0x02
#define APL_DOCKED_OR_POWERED 0x04
#define APL_SIRI 0x08
#define APL_NOISE_REDUCTION 0x10

#define CRAS_APL_SUPPORTED_FEATURES (APL_BATTERY)

/* Codec ids for codec negotiation, per HFP 1.7.1 spec appendix B. */
#define HFP_CODEC_UNUSED 0
#define HFP_CODEC_ID_CVSD 1
#define HFP_CODEC_ID_MSBC 2
#define HFP_MAX_CODECS 3

/* Hands-free HFP supported battery indicator bit definition.
 * This is currently only used for logging purpose. */
#define CRAS_HFP_BATTERY_INDICATOR_NONE 0x0
#define CRAS_HFP_BATTERY_INDICATOR_HFP 0x1
#define CRAS_HFP_BATTERY_INDICATOR_APPLE 0x2

/* Callback to call when service level connection initialized. */
typedef int (*hfp_slc_init_cb)(struct hfp_slc_handle *handle);

/* Callback to call when service level connection disconnected. */
typedef int (*hfp_slc_disconnect_cb)(struct hfp_slc_handle *handle);

/* Creates an hfp_slc_handle to poll the RFCOMM file descriptor
 * to read and handle received AT commands.
 * Args:
 *    fd - the rfcomm fd used to initialize service level connection
 *    is_hsp - if the slc handle is created for headset profile
 *    ag_supported_features - Supported AG features bitmap.
 *    device - The bt device associated with the created slc object
 *    init_cb - the callback function to be triggered when a service level
 *        connection is initialized.
 *    disconnect_cb - the callback function to be triggered when the service
 *        level connection is disconnected.
 */
struct hfp_slc_handle *hfp_slc_create(int fd, int is_hsp,
				      int ag_supported_features,
				      struct cras_bt_device *device,
				      hfp_slc_init_cb init_cb,
				      hfp_slc_disconnect_cb disconnect_cb);

/* Destroys an hfp_slc_handle. */
void hfp_slc_destroy(struct hfp_slc_handle *handle);

/* Returns true if this SLC is created for headset profile(HSP), false
 * means it's created for hands-free profile(HFP).
 */
int hfp_slc_is_hsp(struct hfp_slc_handle *handle);

/* Sets the call status to notify handsfree device. */
int hfp_set_call_status(struct hfp_slc_handle *handle, int call);

/* Fakes the incoming call event for qualification test. */
int hfp_event_incoming_call(struct hfp_slc_handle *handle, const char *number,
			    int type);

/* Handles the call status changed event.
 * AG will send notification to HF accordingly. */
int hfp_event_update_call(struct hfp_slc_handle *handle);

/* Handles the call setup status changed event.
 * AG will send notification to HF accordingly. */
int hfp_event_update_callsetup(struct hfp_slc_handle *handle);

/* Handles the call held status changed event.
 * AG will send notification to HF accordingly. */
int hfp_event_update_callheld(struct hfp_slc_handle *handle);

/* Sets battery level which is required for qualification test. */
int hfp_event_set_battery(struct hfp_slc_handle *handle, int value);

/* Sets signal strength which is required for qualification test. */
int hfp_event_set_signal(struct hfp_slc_handle *handle, int value);

/* Sets service availability which is required for qualification test. */
int hfp_event_set_service(struct hfp_slc_handle *handle, int value);

/* Sets speaker gain value to headsfree device. */
int hfp_event_speaker_gain(struct hfp_slc_handle *handle, int gain);

/* Gets the selected codec for HFP, mSBC or CVSD. */
int hfp_slc_get_selected_codec(struct hfp_slc_handle *handle);

/* Gets if the remote HF supports codec negotiation. */
int hfp_slc_get_hf_codec_negotiation_supported(struct hfp_slc_handle *handle);

/* Gets if the remote HF supports HF indicator. */
int hfp_slc_get_hf_hf_indicators_supported(struct hfp_slc_handle *handle);

/* Gets if the HF side supports wideband speech. */
bool hfp_slc_get_wideband_speech_supported(struct hfp_slc_handle *handle);

/* Gets if the AG side supports codec negotiation. */
int hfp_slc_get_ag_codec_negotiation_supported(struct hfp_slc_handle *handle);

/* Gets an enum representing which spec the HF supports battery indicator.
 * Apple, HFP, none, or both. */
int hfp_slc_get_hf_supports_battery_indicator(struct hfp_slc_handle *handle);

/* Gets the battery level for the HF. The data ranges 0 ~ 100. Use -1 for no
 * battery level reported.*/
int hfp_slc_get_hf_battery_level(struct hfp_slc_handle *handle);

/* Init the codec negotiation process if needed. */
int hfp_slc_codec_connection_setup(struct hfp_slc_handle *handle);

// Expose internal AT command handling for fuzzing.
int handle_at_command_for_test(struct hfp_slc_handle *slc_handle,
			       const char *cmd);

#endif /* CRAS_HFP_SLC_H_ */
