13deb3ec6SMatthias Ringwald /* 23deb3ec6SMatthias Ringwald * Copyright (C) 2014 BlueKitchen GmbH 33deb3ec6SMatthias Ringwald * 43deb3ec6SMatthias Ringwald * Redistribution and use in source and binary forms, with or without 53deb3ec6SMatthias Ringwald * modification, are permitted provided that the following conditions 63deb3ec6SMatthias Ringwald * are met: 73deb3ec6SMatthias Ringwald * 83deb3ec6SMatthias Ringwald * 1. Redistributions of source code must retain the above copyright 93deb3ec6SMatthias Ringwald * notice, this list of conditions and the following disclaimer. 103deb3ec6SMatthias Ringwald * 2. Redistributions in binary form must reproduce the above copyright 113deb3ec6SMatthias Ringwald * notice, this list of conditions and the following disclaimer in the 123deb3ec6SMatthias Ringwald * documentation and/or other materials provided with the distribution. 133deb3ec6SMatthias Ringwald * 3. Neither the name of the copyright holders nor the names of 143deb3ec6SMatthias Ringwald * contributors may be used to endorse or promote products derived 153deb3ec6SMatthias Ringwald * from this software without specific prior written permission. 163deb3ec6SMatthias Ringwald * 4. Any redistribution, use, or modification is done solely for 173deb3ec6SMatthias Ringwald * personal benefit and not for any commercial purpose or for 183deb3ec6SMatthias Ringwald * monetary gain. 193deb3ec6SMatthias Ringwald * 203deb3ec6SMatthias Ringwald * THIS SOFTWARE IS PROVIDED BY BLUEKITCHEN GMBH AND CONTRIBUTORS 213deb3ec6SMatthias Ringwald * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 223deb3ec6SMatthias Ringwald * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 233deb3ec6SMatthias Ringwald * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL MATTHIAS 243deb3ec6SMatthias Ringwald * RINGWALD OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 253deb3ec6SMatthias Ringwald * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 263deb3ec6SMatthias Ringwald * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS 273deb3ec6SMatthias Ringwald * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 283deb3ec6SMatthias Ringwald * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 293deb3ec6SMatthias Ringwald * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF 303deb3ec6SMatthias Ringwald * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 313deb3ec6SMatthias Ringwald * SUCH DAMAGE. 323deb3ec6SMatthias Ringwald * 333deb3ec6SMatthias Ringwald * Please inquire about commercial licensing options at 343deb3ec6SMatthias Ringwald * [email protected] 353deb3ec6SMatthias Ringwald * 363deb3ec6SMatthias Ringwald */ 373deb3ec6SMatthias Ringwald 383deb3ec6SMatthias Ringwald // ***************************************************************************** 393deb3ec6SMatthias Ringwald // 403deb3ec6SMatthias Ringwald // HFP Hands-Free (HF) unit and Audio-Gateway Commons 413deb3ec6SMatthias Ringwald // 423deb3ec6SMatthias Ringwald // ***************************************************************************** 433deb3ec6SMatthias Ringwald 443deb3ec6SMatthias Ringwald 453deb3ec6SMatthias Ringwald #ifndef btstack_hfp_h 463deb3ec6SMatthias Ringwald #define btstack_hfp_h 473deb3ec6SMatthias Ringwald 483deb3ec6SMatthias Ringwald #include "hci.h" 49*3edc84c5SMatthias Ringwald #include "classic/sdp_query_rfcomm.h" 503deb3ec6SMatthias Ringwald 513deb3ec6SMatthias Ringwald #if defined __cplusplus 523deb3ec6SMatthias Ringwald extern "C" { 533deb3ec6SMatthias Ringwald #endif 543deb3ec6SMatthias Ringwald 553deb3ec6SMatthias Ringwald 563deb3ec6SMatthias Ringwald /* HF Supported Features: 573deb3ec6SMatthias Ringwald 0: EC and/or NR function 583deb3ec6SMatthias Ringwald 1: Three-way calling 593deb3ec6SMatthias Ringwald 2: CLI presentation capability 603deb3ec6SMatthias Ringwald 3: Voice recognition activation 613deb3ec6SMatthias Ringwald 4: Remote volume control 623deb3ec6SMatthias Ringwald 5: Enhanced call status 633deb3ec6SMatthias Ringwald 6: Enhanced call control 643deb3ec6SMatthias Ringwald 7: Codec negotiation 653deb3ec6SMatthias Ringwald 8: HF Indicators 663deb3ec6SMatthias Ringwald 9: eSCO S4 (and T2) Settings Supported 673deb3ec6SMatthias Ringwald 10-31: Reserved for future definition 683deb3ec6SMatthias Ringwald */ 693deb3ec6SMatthias Ringwald #define HFP_HFSF_THREE_WAY_CALLING 1 703deb3ec6SMatthias Ringwald #define HFP_HFSF_EC_NR_FUNCTION 0 713deb3ec6SMatthias Ringwald #define HFP_HFSF_CODEC_NEGOTIATION 7 723deb3ec6SMatthias Ringwald #define HFP_HFSF_HF_INDICATORS 8 733deb3ec6SMatthias Ringwald #define HFP_HFSF_ESCO 9 743deb3ec6SMatthias Ringwald 753deb3ec6SMatthias Ringwald /* AG Supported Features: 763deb3ec6SMatthias Ringwald 0: Three-way calling 773deb3ec6SMatthias Ringwald 1: EC and/or NR function 783deb3ec6SMatthias Ringwald 2: Voice recognition function 793deb3ec6SMatthias Ringwald 3: In-band ring tone capability 803deb3ec6SMatthias Ringwald 4: Attach a number to a voice tag 813deb3ec6SMatthias Ringwald 5: Ability to reject a call 823deb3ec6SMatthias Ringwald 6: Enhanced call status 833deb3ec6SMatthias Ringwald 7: Enhanced call control 843deb3ec6SMatthias Ringwald 8: Extended Error Result Codes 853deb3ec6SMatthias Ringwald 9: Codec negotiation 863deb3ec6SMatthias Ringwald 10: HF Indicators 873deb3ec6SMatthias Ringwald 11: eSCO S4 (and T2) Settings Supported 883deb3ec6SMatthias Ringwald 12-31: Reserved for future definition 893deb3ec6SMatthias Ringwald */ 903deb3ec6SMatthias Ringwald #define HFP_AGSF_THREE_WAY_CALLING 0 913deb3ec6SMatthias Ringwald #define HFP_AGSF_EC_NR_FUNCTION 1 923deb3ec6SMatthias Ringwald #define HFP_AGSF_CODEC_NEGOTIATION 9 933deb3ec6SMatthias Ringwald #define HFP_AGSF_HF_INDICATORS 10 943deb3ec6SMatthias Ringwald #define HFP_AGSF_ESCO 11 953deb3ec6SMatthias Ringwald 963deb3ec6SMatthias Ringwald #define HFP_DEFAULT_HF_SUPPORTED_FEATURES 0x0000 973deb3ec6SMatthias Ringwald #define HFP_DEFAULT_AG_SUPPORTED_FEATURES 0x0009 983deb3ec6SMatthias Ringwald 993deb3ec6SMatthias Ringwald #define HFP_MAX_NUM_CODECS 20 1003deb3ec6SMatthias Ringwald #define HFP_MAX_NUM_AG_INDICATORS 20 1013deb3ec6SMatthias Ringwald #define HFP_MAX_NUM_HF_INDICATORS 20 1023deb3ec6SMatthias Ringwald #define HFP_MAX_INDICATOR_DESC_SIZE 20 1033deb3ec6SMatthias Ringwald 1043deb3ec6SMatthias Ringwald #define HFP_SUPPORTED_FEATURES "+BRSF" 1053deb3ec6SMatthias Ringwald #define HFP_AVAILABLE_CODECS "+BAC" 1063deb3ec6SMatthias Ringwald #define HFP_INDICATOR "+CIND" 1073deb3ec6SMatthias Ringwald #define HFP_ENABLE_STATUS_UPDATE_FOR_AG_INDICATORS "+CMER" 1083deb3ec6SMatthias Ringwald #define HFP_UPDATE_ENABLE_STATUS_FOR_INDIVIDUAL_AG_INDICATORS "+BIA" // +BIA:<enabled>,,<enabled>,,,<enabled> 1093deb3ec6SMatthias Ringwald #define HFP_SUPPORT_CALL_HOLD_AND_MULTIPARTY_SERVICES "+CHLD" 1103deb3ec6SMatthias Ringwald #define HFP_GENERIC_STATUS_INDICATOR "+BIND" 1113deb3ec6SMatthias Ringwald #define HFP_TRANSFER_AG_INDICATOR_STATUS "+CIEV" // +CIEV: <index>,<value> 1123deb3ec6SMatthias Ringwald #define HFP_QUERY_OPERATOR_SELECTION "+COPS" // +COPS: <mode>,0,<opearator> 1133deb3ec6SMatthias Ringwald #define HFP_ENABLE_EXTENDED_AUDIO_GATEWAY_ERROR "+CMEE" 1143deb3ec6SMatthias Ringwald #define HFP_EXTENDED_AUDIO_GATEWAY_ERROR "+CME ERROR" 1153deb3ec6SMatthias Ringwald #define HFP_TRIGGER_CODEC_CONNECTION_SETUP "+BCC" 1163deb3ec6SMatthias Ringwald #define HFP_CONFIRM_COMMON_CODEC "+BCS" 1173deb3ec6SMatthias Ringwald 1183deb3ec6SMatthias Ringwald #define HFP_OK "OK" 1193deb3ec6SMatthias Ringwald #define HFP_ERROR "ERROR" 1203deb3ec6SMatthias Ringwald 1213deb3ec6SMatthias Ringwald // Codecs 1223deb3ec6SMatthias Ringwald #define HFP_CODEC_CVSD 0x01 1233deb3ec6SMatthias Ringwald #define HFP_CODEC_MSBC 0x02 1243deb3ec6SMatthias Ringwald 1253deb3ec6SMatthias Ringwald typedef enum { 1263deb3ec6SMatthias Ringwald HFP_CMD_NONE = 0, 1273deb3ec6SMatthias Ringwald HFP_CMD_ERROR, 1283deb3ec6SMatthias Ringwald HFP_CMD_OK, 1293deb3ec6SMatthias Ringwald HFP_CMD_SUPPORTED_FEATURES, 1303deb3ec6SMatthias Ringwald HFP_CMD_AVAILABLE_CODECS, 1313deb3ec6SMatthias Ringwald HFP_CMD_INDICATOR, // 5 1323deb3ec6SMatthias Ringwald HFP_CMD_ENABLE_INDICATOR_STATUS_UPDATE, 1333deb3ec6SMatthias Ringwald HFP_CMD_ENABLE_INDIVIDUAL_AG_INDICATOR_STATUS_UPDATE, 1343deb3ec6SMatthias Ringwald HFP_CMD_SUPPORT_CALL_HOLD_AND_MULTIPARTY_SERVICES, 1353deb3ec6SMatthias Ringwald 1363deb3ec6SMatthias Ringwald HFP_CMD_GENERIC_STATUS_INDICATOR, 1373deb3ec6SMatthias Ringwald 1383deb3ec6SMatthias Ringwald HFP_CMD_TRANSFER_AG_INDICATOR_STATUS, 1393deb3ec6SMatthias Ringwald HFP_CMD_QUERY_OPERATOR_SELECTION, 1403deb3ec6SMatthias Ringwald 1413deb3ec6SMatthias Ringwald HFP_CMD_ENABLE_EXTENDED_AUDIO_GATEWAY_ERROR, 1423deb3ec6SMatthias Ringwald HFP_CMD_EXTENDED_AUDIO_GATEWAY_ERROR, 1433deb3ec6SMatthias Ringwald HFP_CMD_TRIGGER_CODEC_CONNECTION_SETUP, 1443deb3ec6SMatthias Ringwald HFP_CMD_AG_SUGGESTED_CODEC, 1453deb3ec6SMatthias Ringwald HFP_CMD_HF_CONFIRMED_CODEC 1463deb3ec6SMatthias Ringwald 1473deb3ec6SMatthias Ringwald } hfp_command_t; 1483deb3ec6SMatthias Ringwald 1493deb3ec6SMatthias Ringwald typedef enum { 1503deb3ec6SMatthias Ringwald HFP_CME_ERROR_AG_FAILURE = 0, 1513deb3ec6SMatthias Ringwald HFP_CME_ERROR_NO_CONNECTION_TO_PHONE, 1523deb3ec6SMatthias Ringwald HFP_CME_ERROR_2, 1533deb3ec6SMatthias Ringwald HFP_CME_ERROR_OPERATION_NOT_ALLOWED, 1543deb3ec6SMatthias Ringwald HFP_CME_ERROR_OPERATION_NOT_SUPPORTED, 1553deb3ec6SMatthias Ringwald HFP_CME_ERROR_PH_SIM_PIN_REQUIRED, 1563deb3ec6SMatthias Ringwald HFP_CME_ERROR_6, 1573deb3ec6SMatthias Ringwald HFP_CME_ERROR_7, 1583deb3ec6SMatthias Ringwald HFP_CME_ERROR_8, 1593deb3ec6SMatthias Ringwald HFP_CME_ERROR_9, 1603deb3ec6SMatthias Ringwald HFP_CME_ERROR_SIM_NOT_INSERTED, 1613deb3ec6SMatthias Ringwald HFP_CME_ERROR_SIM_PIN_REQUIRED, 1623deb3ec6SMatthias Ringwald HFP_CME_ERROR_SIM_PUK_REQUIRED, 1633deb3ec6SMatthias Ringwald HFP_CME_ERROR_SIM_FAILURE, 1643deb3ec6SMatthias Ringwald HFP_CME_ERROR_SIM_BUSY, 1653deb3ec6SMatthias Ringwald HFP_CME_ERROR_15, 1663deb3ec6SMatthias Ringwald HFP_CME_ERROR_INCORRECT_PASSWORD, 1673deb3ec6SMatthias Ringwald HFP_CME_ERROR_SIM_PIN2_REQUIRED, 1683deb3ec6SMatthias Ringwald HFP_CME_ERROR_SIM_PUK2_REQUIRED, 1693deb3ec6SMatthias Ringwald HFP_CME_ERROR_19, 1703deb3ec6SMatthias Ringwald HFP_CME_ERROR_MEMORY_FULL, 1713deb3ec6SMatthias Ringwald HFP_CME_ERROR_INVALID_INDEX, 1723deb3ec6SMatthias Ringwald HFP_CME_ERROR_22, 1733deb3ec6SMatthias Ringwald HFP_CME_ERROR_MEMORY_FAILURE, 1743deb3ec6SMatthias Ringwald HFP_CME_ERROR_TEXT_STRING_TOO_LONG, 1753deb3ec6SMatthias Ringwald HFP_CME_ERROR_INVALID_CHARACTERS_IN_TEXT_STRING, 1763deb3ec6SMatthias Ringwald HFP_CME_ERROR_DIAL_STRING_TOO_LONG, 1773deb3ec6SMatthias Ringwald HFP_CME_ERROR_INVALID_CHARACTERS_IN_DIAL_STRING, 1783deb3ec6SMatthias Ringwald HFP_CME_ERROR_28, 1793deb3ec6SMatthias Ringwald HFP_CME_ERROR_29, 1803deb3ec6SMatthias Ringwald HFP_CME_ERROR_NO_NETWORK_SERVICE, 1813deb3ec6SMatthias Ringwald HFP_CME_ERROR_NETWORK_TIMEOUT, 1823deb3ec6SMatthias Ringwald HFP_CME_ERROR_NETWORK_NOT_ALLOWED_EMERGENCY_CALLS_ONLY 1833deb3ec6SMatthias Ringwald } hfp_cme_error_t; 1843deb3ec6SMatthias Ringwald 1853deb3ec6SMatthias Ringwald typedef enum { 1863deb3ec6SMatthias Ringwald HFP_CALL_STATUS_NO_HELD_OR_ACTIVE_CALLS = 0, 1873deb3ec6SMatthias Ringwald HFP_CALL_STATUS_ACTIVE_OR_HELD_CALL_IS_PRESENT 1883deb3ec6SMatthias Ringwald } hfp_call_status_t; 1893deb3ec6SMatthias Ringwald 1903deb3ec6SMatthias Ringwald typedef enum { 1913deb3ec6SMatthias Ringwald HFP_CALLSETUP_STATUS_NO_CALL_SETUP_IN_PROGRESS = 0, 1923deb3ec6SMatthias Ringwald HFP_CALLSETUP_STATUS_INCOMING_CALL_SETUP_IN_PROGRESS, 1933deb3ec6SMatthias Ringwald HFP_CALLSETUP_STATUS_OUTGOING_CALL_SETUP_IN_DIALING_STATE, 1943deb3ec6SMatthias Ringwald HFP_CALLSETUP_STATUS_OUTGOING_CALL_SETUP_IN_ALERTING_STATE 1953deb3ec6SMatthias Ringwald } hfp_callsetup_status_t; 1963deb3ec6SMatthias Ringwald 1973deb3ec6SMatthias Ringwald typedef enum { 1983deb3ec6SMatthias Ringwald HFP_HELDCALL_STATUS_NO_CALLS_HELD = 0, 1993deb3ec6SMatthias Ringwald HFP_HELDCALL_STATUS_CALL_ON_HOLD_OR_SWAPPED, 2003deb3ec6SMatthias Ringwald HFP_HELDCALL_STATUS_CALL_ON_HOLD_AND_NO_ACTIVE_CALLS 2013deb3ec6SMatthias Ringwald } hfp_callheld_status_t; 2023deb3ec6SMatthias Ringwald 2033deb3ec6SMatthias Ringwald typedef enum { 2043deb3ec6SMatthias Ringwald HFP_PARSER_CMD_HEADER = 0, 2053deb3ec6SMatthias Ringwald HFP_PARSER_CMD_SEQUENCE, 2063deb3ec6SMatthias Ringwald HFP_PARSER_SECOND_ITEM, 2073deb3ec6SMatthias Ringwald HFP_PARSER_THIRD_ITEM 2083deb3ec6SMatthias Ringwald } hfp_parser_state_t; 2093deb3ec6SMatthias Ringwald 2103deb3ec6SMatthias Ringwald 2113deb3ec6SMatthias Ringwald typedef enum { 2123deb3ec6SMatthias Ringwald HFP_IDLE = 0, //0 2133deb3ec6SMatthias Ringwald HFP_SDP_QUERY_RFCOMM_CHANNEL, 2143deb3ec6SMatthias Ringwald HFP_W4_SDP_QUERY_COMPLETE, 2153deb3ec6SMatthias Ringwald HFP_W4_RFCOMM_CONNECTED, 2163deb3ec6SMatthias Ringwald 2173deb3ec6SMatthias Ringwald HFP_EXCHANGE_SUPPORTED_FEATURES, 2183deb3ec6SMatthias Ringwald HFP_W4_EXCHANGE_SUPPORTED_FEATURES, // 5 2193deb3ec6SMatthias Ringwald 2203deb3ec6SMatthias Ringwald HFP_NOTIFY_ON_CODECS, 2213deb3ec6SMatthias Ringwald HFP_W4_NOTIFY_ON_CODECS, 2223deb3ec6SMatthias Ringwald 2233deb3ec6SMatthias Ringwald HFP_RETRIEVE_INDICATORS, 2243deb3ec6SMatthias Ringwald HFP_W4_RETRIEVE_INDICATORS, 2253deb3ec6SMatthias Ringwald 2263deb3ec6SMatthias Ringwald HFP_RETRIEVE_INDICATORS_STATUS, // 10 2273deb3ec6SMatthias Ringwald HFP_W4_RETRIEVE_INDICATORS_STATUS, 2283deb3ec6SMatthias Ringwald 2293deb3ec6SMatthias Ringwald HFP_ENABLE_INDICATORS_STATUS_UPDATE, 2303deb3ec6SMatthias Ringwald HFP_W4_ENABLE_INDICATORS_STATUS_UPDATE, 2313deb3ec6SMatthias Ringwald 2323deb3ec6SMatthias Ringwald HFP_RETRIEVE_CAN_HOLD_CALL, 2333deb3ec6SMatthias Ringwald HFP_W4_RETRIEVE_CAN_HOLD_CALL, // 15 2343deb3ec6SMatthias Ringwald 2353deb3ec6SMatthias Ringwald HFP_LIST_GENERIC_STATUS_INDICATORS, 2363deb3ec6SMatthias Ringwald HFP_W4_LIST_GENERIC_STATUS_INDICATORS, 2373deb3ec6SMatthias Ringwald 2383deb3ec6SMatthias Ringwald HFP_RETRIEVE_GENERIC_STATUS_INDICATORS, 2393deb3ec6SMatthias Ringwald HFP_W4_RETRIEVE_GENERIC_STATUS_INDICATORS, 2403deb3ec6SMatthias Ringwald 2413deb3ec6SMatthias Ringwald HFP_RETRIEVE_INITITAL_STATE_GENERIC_STATUS_INDICATORS, // 20 2423deb3ec6SMatthias Ringwald HFP_W4_RETRIEVE_INITITAL_STATE_GENERIC_STATUS_INDICATORS, 2433deb3ec6SMatthias Ringwald 2443deb3ec6SMatthias Ringwald HFP_SERVICE_LEVEL_CONNECTION_ESTABLISHED, // 22 2453deb3ec6SMatthias Ringwald 2463deb3ec6SMatthias Ringwald HFP_SLE_W2_EXCHANGE_COMMON_CODEC, 2473deb3ec6SMatthias Ringwald HFP_SLE_W4_EXCHANGE_COMMON_CODEC, 2483deb3ec6SMatthias Ringwald 2493deb3ec6SMatthias Ringwald HFP_CODECS_CONNECTION_ESTABLISHED, // 25 2503deb3ec6SMatthias Ringwald 2513deb3ec6SMatthias Ringwald HFP_CCE_W2_ESTABLISH_SCO, 2523deb3ec6SMatthias Ringwald HFP_CCE_W4_SCO_CONNECTION_ESTABLISHED, 2533deb3ec6SMatthias Ringwald 2543deb3ec6SMatthias Ringwald HFP_AUDIO_CONNECTION_ESTABLISHED, 2553deb3ec6SMatthias Ringwald 2563deb3ec6SMatthias Ringwald HFP_W2_DISCONNECT_SCO, 2573deb3ec6SMatthias Ringwald HFP_W4_SCO_DISCONNECTED, // 30 2583deb3ec6SMatthias Ringwald 2593deb3ec6SMatthias Ringwald HFP_W2_DISCONNECT_RFCOMM, 2603deb3ec6SMatthias Ringwald HFP_W4_RFCOMM_DISCONNECTED, 2613deb3ec6SMatthias Ringwald HFP_W4_RFCOMM_DISCONNECTED_AND_RESTART, 2623deb3ec6SMatthias Ringwald HFP_W4_CONNECTION_ESTABLISHED_TO_SHUTDOWN 2633deb3ec6SMatthias Ringwald } hfp_state_t; 2643deb3ec6SMatthias Ringwald 2653deb3ec6SMatthias Ringwald typedef void (*hfp_callback_t)(uint8_t * event, uint16_t event_size); 2663deb3ec6SMatthias Ringwald 2673deb3ec6SMatthias Ringwald typedef struct{ 2683deb3ec6SMatthias Ringwald uint16_t uuid; 2693deb3ec6SMatthias Ringwald uint8_t state; // enabled 2703deb3ec6SMatthias Ringwald } hfp_generic_status_indicator_t; 2713deb3ec6SMatthias Ringwald 2723deb3ec6SMatthias Ringwald typedef struct{ 2733deb3ec6SMatthias Ringwald uint8_t index; 2743deb3ec6SMatthias Ringwald char name[HFP_MAX_INDICATOR_DESC_SIZE]; 2753deb3ec6SMatthias Ringwald uint8_t min_range; 2763deb3ec6SMatthias Ringwald uint8_t max_range; 2773deb3ec6SMatthias Ringwald uint8_t status; 2783deb3ec6SMatthias Ringwald uint8_t mandatory; 2793deb3ec6SMatthias Ringwald uint8_t enabled; 2803deb3ec6SMatthias Ringwald uint8_t status_changed; 2813deb3ec6SMatthias Ringwald } hfp_ag_indicator_t; 2823deb3ec6SMatthias Ringwald 2833deb3ec6SMatthias Ringwald typedef struct{ 2843deb3ec6SMatthias Ringwald char name[3]; 2853deb3ec6SMatthias Ringwald } hfp_call_service_t; 2863deb3ec6SMatthias Ringwald 2873deb3ec6SMatthias Ringwald 2883deb3ec6SMatthias Ringwald typedef struct{ 2893deb3ec6SMatthias Ringwald uint8_t mode; 2903deb3ec6SMatthias Ringwald uint8_t format; 2913deb3ec6SMatthias Ringwald char name[17]; // enabled 2923deb3ec6SMatthias Ringwald } hfp_network_opearator_t; 2933deb3ec6SMatthias Ringwald 2943deb3ec6SMatthias Ringwald 2953deb3ec6SMatthias Ringwald typedef struct hfp_connection { 2963deb3ec6SMatthias Ringwald linked_item_t item; 2973deb3ec6SMatthias Ringwald 2983deb3ec6SMatthias Ringwald bd_addr_t remote_addr; 2993deb3ec6SMatthias Ringwald uint16_t con_handle; 3003deb3ec6SMatthias Ringwald uint16_t sco_handle; 3013deb3ec6SMatthias Ringwald uint16_t rfcomm_channel_nr; 3023deb3ec6SMatthias Ringwald uint16_t rfcomm_cid; 3033deb3ec6SMatthias Ringwald 3043deb3ec6SMatthias Ringwald hfp_state_t state; 3053deb3ec6SMatthias Ringwald // needed for reestablishing connection 3063deb3ec6SMatthias Ringwald uint16_t service_uuid; 3073deb3ec6SMatthias Ringwald 3083deb3ec6SMatthias Ringwald // used during service level connection establishment 3093deb3ec6SMatthias Ringwald hfp_command_t command; 3103deb3ec6SMatthias Ringwald hfp_parser_state_t parser_state; 3113deb3ec6SMatthias Ringwald int parser_item_index; 3123deb3ec6SMatthias Ringwald uint8_t line_buffer[HFP_MAX_INDICATOR_DESC_SIZE]; 3133deb3ec6SMatthias Ringwald int line_size; 3143deb3ec6SMatthias Ringwald 3153deb3ec6SMatthias Ringwald uint32_t remote_supported_features; 3163deb3ec6SMatthias Ringwald 3173deb3ec6SMatthias Ringwald // TODO: rename into hf_codecs_nr 3183deb3ec6SMatthias Ringwald int remote_codecs_nr; 3193deb3ec6SMatthias Ringwald uint16_t remote_codecs[HFP_MAX_INDICATOR_DESC_SIZE]; 3203deb3ec6SMatthias Ringwald int ag_indicators_nr; 3213deb3ec6SMatthias Ringwald hfp_ag_indicator_t ag_indicators[HFP_MAX_INDICATOR_DESC_SIZE]; 3223deb3ec6SMatthias Ringwald int remote_call_services_nr; 3233deb3ec6SMatthias Ringwald hfp_call_service_t remote_call_services[HFP_MAX_INDICATOR_DESC_SIZE]; 3243deb3ec6SMatthias Ringwald 3253deb3ec6SMatthias Ringwald // TODO: use bitmap. 3263deb3ec6SMatthias Ringwald int generic_status_indicators_nr; 3273deb3ec6SMatthias Ringwald hfp_generic_status_indicator_t generic_status_indicators[HFP_MAX_INDICATOR_DESC_SIZE]; 3283deb3ec6SMatthias Ringwald uint8_t enable_status_update_for_ag_indicators; 3293deb3ec6SMatthias Ringwald 3303deb3ec6SMatthias Ringwald uint32_t ag_indicators_status_update_bitmap; 3313deb3ec6SMatthias Ringwald hfp_network_opearator_t network_operator; 3323deb3ec6SMatthias Ringwald 3333deb3ec6SMatthias Ringwald // Retrieved during service level connection establishment, not used yet 3343deb3ec6SMatthias Ringwald uint8_t negotiated_codec; 3353deb3ec6SMatthias Ringwald 3363deb3ec6SMatthias Ringwald // TODO: put these bit flags in a bitmap 3373deb3ec6SMatthias Ringwald uint8_t wait_ok; 3383deb3ec6SMatthias Ringwald uint8_t send_ok; 3393deb3ec6SMatthias Ringwald uint8_t send_error; 3403deb3ec6SMatthias Ringwald 3413deb3ec6SMatthias Ringwald uint8_t keep_separator; 3423deb3ec6SMatthias Ringwald 3433deb3ec6SMatthias Ringwald uint8_t retrieve_ag_indicators; // HFP_CMD_INDICATOR, check if needed 3443deb3ec6SMatthias Ringwald uint8_t retrieve_ag_indicators_status; 3453deb3ec6SMatthias Ringwald 3463deb3ec6SMatthias Ringwald uint8_t list_generic_status_indicators; // HFP_CMD_LIST_GENERIC_STATUS_INDICATOR 3473deb3ec6SMatthias Ringwald uint8_t retrieve_generic_status_indicators; // HFP_CMD_GENERIC_STATUS_INDICATOR 3483deb3ec6SMatthias Ringwald uint8_t retrieve_generic_status_indicators_state; // HFP_CMD_GENERIC_STATUS_INDICATOR_STATE 3493deb3ec6SMatthias Ringwald 3503deb3ec6SMatthias Ringwald uint8_t change_status_update_for_individual_ag_indicators; 3513deb3ec6SMatthias Ringwald 3523deb3ec6SMatthias Ringwald uint8_t operator_name_format; 3533deb3ec6SMatthias Ringwald uint8_t operator_name; 3543deb3ec6SMatthias Ringwald uint8_t operator_name_changed; 3553deb3ec6SMatthias Ringwald 3563deb3ec6SMatthias Ringwald uint8_t enable_extended_audio_gateway_error_report; 3573deb3ec6SMatthias Ringwald uint8_t extended_audio_gateway_error; 3583deb3ec6SMatthias Ringwald 3593deb3ec6SMatthias Ringwald // can come any time (here taken into account only after SLE), 3603deb3ec6SMatthias Ringwald // if codec negotiation feature is set 3613deb3ec6SMatthias Ringwald uint8_t notify_ag_on_new_codecs; 3623deb3ec6SMatthias Ringwald 3633deb3ec6SMatthias Ringwald // establish codecs connection 3643deb3ec6SMatthias Ringwald uint8_t hf_trigger_codec_connection_setup; 3653deb3ec6SMatthias Ringwald uint8_t ag_trigger_codec_connection_setup; 3663deb3ec6SMatthias Ringwald uint8_t ag_ready_for_codecs_connection_setup; 3673deb3ec6SMatthias Ringwald uint8_t suggested_codec; 3683deb3ec6SMatthias Ringwald uint8_t codec_confirmed; 3693deb3ec6SMatthias Ringwald 3703deb3ec6SMatthias Ringwald uint8_t establish_audio_connection; 3713deb3ec6SMatthias Ringwald uint8_t release_audio_connection; 3723deb3ec6SMatthias Ringwald 3733deb3ec6SMatthias Ringwald } hfp_connection_t; 3743deb3ec6SMatthias Ringwald 3753deb3ec6SMatthias Ringwald // UTILS_START : TODO move to utils 3763deb3ec6SMatthias Ringwald int send_str_over_rfcomm(uint16_t cid, char * command); 3773deb3ec6SMatthias Ringwald int join(char * buffer, int buffer_size, uint8_t * values, int values_nr); 3783deb3ec6SMatthias Ringwald int join_bitmap(char * buffer, int buffer_size, uint32_t values, int values_nr); 3793deb3ec6SMatthias Ringwald int get_bit(uint16_t bitmap, int position); 3803deb3ec6SMatthias Ringwald int store_bit(uint32_t bitmap, int position, uint8_t value); 3813deb3ec6SMatthias Ringwald // UTILS_END 3823deb3ec6SMatthias Ringwald 3833deb3ec6SMatthias Ringwald void hfp_create_sdp_record(uint8_t * service, uint16_t service_uuid, int rfcomm_channel_nr, const char * name, uint16_t supported_features); 3843deb3ec6SMatthias Ringwald void hfp_handle_hci_event(hfp_callback_t callback, uint8_t packet_type, uint8_t *packet, uint16_t size); 3853deb3ec6SMatthias Ringwald void hfp_emit_event(hfp_callback_t callback, uint8_t event_subtype, uint8_t value); 3863deb3ec6SMatthias Ringwald hfp_connection_t * get_hfp_connection_context_for_rfcomm_cid(uint16_t cid); 3873deb3ec6SMatthias Ringwald hfp_connection_t * get_hfp_connection_context_for_bd_addr(bd_addr_t bd_addr); 3883deb3ec6SMatthias Ringwald int get_hfp_generic_status_indicators_nr(void); 3893deb3ec6SMatthias Ringwald hfp_generic_status_indicator_t * get_hfp_generic_status_indicators(void); 3903deb3ec6SMatthias Ringwald void set_hfp_generic_status_indicators(hfp_generic_status_indicator_t * indicators, int indicator_nr); 3913deb3ec6SMatthias Ringwald 3923deb3ec6SMatthias Ringwald linked_list_t * hfp_get_connections(void); 3933deb3ec6SMatthias Ringwald void hfp_parse(hfp_connection_t * context, uint8_t byte); 3943deb3ec6SMatthias Ringwald 3953deb3ec6SMatthias Ringwald void hfp_init(uint16_t rfcomm_channel_nr); 3963deb3ec6SMatthias Ringwald void hfp_establish_service_level_connection(bd_addr_t bd_addr, uint16_t service_uuid); 3973deb3ec6SMatthias Ringwald void hfp_release_service_level_connection(hfp_connection_t * connection); 3983deb3ec6SMatthias Ringwald void hfp_reset_context_flags(hfp_connection_t * context); 3993deb3ec6SMatthias Ringwald 4003deb3ec6SMatthias Ringwald void hfp_release_audio_connection(hfp_connection_t * context); 4013deb3ec6SMatthias Ringwald 4023deb3ec6SMatthias Ringwald const char * hfp_hf_feature(int index); 4033deb3ec6SMatthias Ringwald const char * hfp_ag_feature(int index); 4043deb3ec6SMatthias Ringwald 4053deb3ec6SMatthias Ringwald #if defined __cplusplus 4063deb3ec6SMatthias Ringwald } 4073deb3ec6SMatthias Ringwald #endif 4083deb3ec6SMatthias Ringwald 4093deb3ec6SMatthias Ringwald #endif