xref: /btstack/src/classic/hfp.h (revision 3deb3ec68039c68a16974dffc53343233662f909)
1*3deb3ec6SMatthias Ringwald /*
2*3deb3ec6SMatthias Ringwald  * Copyright (C) 2014 BlueKitchen GmbH
3*3deb3ec6SMatthias Ringwald  *
4*3deb3ec6SMatthias Ringwald  * Redistribution and use in source and binary forms, with or without
5*3deb3ec6SMatthias Ringwald  * modification, are permitted provided that the following conditions
6*3deb3ec6SMatthias Ringwald  * are met:
7*3deb3ec6SMatthias Ringwald  *
8*3deb3ec6SMatthias Ringwald  * 1. Redistributions of source code must retain the above copyright
9*3deb3ec6SMatthias Ringwald  *    notice, this list of conditions and the following disclaimer.
10*3deb3ec6SMatthias Ringwald  * 2. Redistributions in binary form must reproduce the above copyright
11*3deb3ec6SMatthias Ringwald  *    notice, this list of conditions and the following disclaimer in the
12*3deb3ec6SMatthias Ringwald  *    documentation and/or other materials provided with the distribution.
13*3deb3ec6SMatthias Ringwald  * 3. Neither the name of the copyright holders nor the names of
14*3deb3ec6SMatthias Ringwald  *    contributors may be used to endorse or promote products derived
15*3deb3ec6SMatthias Ringwald  *    from this software without specific prior written permission.
16*3deb3ec6SMatthias Ringwald  * 4. Any redistribution, use, or modification is done solely for
17*3deb3ec6SMatthias Ringwald  *    personal benefit and not for any commercial purpose or for
18*3deb3ec6SMatthias Ringwald  *    monetary gain.
19*3deb3ec6SMatthias Ringwald  *
20*3deb3ec6SMatthias Ringwald  * THIS SOFTWARE IS PROVIDED BY BLUEKITCHEN GMBH AND CONTRIBUTORS
21*3deb3ec6SMatthias Ringwald  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22*3deb3ec6SMatthias Ringwald  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
23*3deb3ec6SMatthias Ringwald  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL MATTHIAS
24*3deb3ec6SMatthias Ringwald  * RINGWALD OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
25*3deb3ec6SMatthias Ringwald  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
26*3deb3ec6SMatthias Ringwald  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
27*3deb3ec6SMatthias Ringwald  * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
28*3deb3ec6SMatthias Ringwald  * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
29*3deb3ec6SMatthias Ringwald  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
30*3deb3ec6SMatthias Ringwald  * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31*3deb3ec6SMatthias Ringwald  * SUCH DAMAGE.
32*3deb3ec6SMatthias Ringwald  *
33*3deb3ec6SMatthias Ringwald  * Please inquire about commercial licensing options at
34*3deb3ec6SMatthias Ringwald  * [email protected]
35*3deb3ec6SMatthias Ringwald  *
36*3deb3ec6SMatthias Ringwald  */
37*3deb3ec6SMatthias Ringwald 
38*3deb3ec6SMatthias Ringwald // *****************************************************************************
39*3deb3ec6SMatthias Ringwald //
40*3deb3ec6SMatthias Ringwald //  HFP Hands-Free (HF) unit and Audio-Gateway Commons
41*3deb3ec6SMatthias Ringwald //
42*3deb3ec6SMatthias Ringwald // *****************************************************************************
43*3deb3ec6SMatthias Ringwald 
44*3deb3ec6SMatthias Ringwald 
45*3deb3ec6SMatthias Ringwald #ifndef btstack_hfp_h
46*3deb3ec6SMatthias Ringwald #define btstack_hfp_h
47*3deb3ec6SMatthias Ringwald 
48*3deb3ec6SMatthias Ringwald #include "hci.h"
49*3deb3ec6SMatthias Ringwald #include "sdp_query_rfcomm.h"
50*3deb3ec6SMatthias Ringwald 
51*3deb3ec6SMatthias Ringwald #if defined __cplusplus
52*3deb3ec6SMatthias Ringwald extern "C" {
53*3deb3ec6SMatthias Ringwald #endif
54*3deb3ec6SMatthias Ringwald 
55*3deb3ec6SMatthias Ringwald 
56*3deb3ec6SMatthias Ringwald /* HF Supported Features:
57*3deb3ec6SMatthias Ringwald 0: EC and/or NR function
58*3deb3ec6SMatthias Ringwald 1: Three-way calling
59*3deb3ec6SMatthias Ringwald 2: CLI presentation capability
60*3deb3ec6SMatthias Ringwald 3: Voice recognition activation
61*3deb3ec6SMatthias Ringwald 4: Remote volume control
62*3deb3ec6SMatthias Ringwald 5: Enhanced call status
63*3deb3ec6SMatthias Ringwald 6: Enhanced call control
64*3deb3ec6SMatthias Ringwald 7: Codec negotiation
65*3deb3ec6SMatthias Ringwald 8: HF Indicators
66*3deb3ec6SMatthias Ringwald 9: eSCO S4 (and T2) Settings Supported
67*3deb3ec6SMatthias Ringwald 10-31: Reserved for future definition
68*3deb3ec6SMatthias Ringwald */
69*3deb3ec6SMatthias Ringwald #define HFP_HFSF_THREE_WAY_CALLING  1
70*3deb3ec6SMatthias Ringwald #define HFP_HFSF_EC_NR_FUNCTION     0
71*3deb3ec6SMatthias Ringwald #define HFP_HFSF_CODEC_NEGOTIATION  7
72*3deb3ec6SMatthias Ringwald #define HFP_HFSF_HF_INDICATORS      8
73*3deb3ec6SMatthias Ringwald #define HFP_HFSF_ESCO               9
74*3deb3ec6SMatthias Ringwald 
75*3deb3ec6SMatthias Ringwald /* AG Supported Features:
76*3deb3ec6SMatthias Ringwald 0: Three-way calling
77*3deb3ec6SMatthias Ringwald 1: EC and/or NR function
78*3deb3ec6SMatthias Ringwald 2: Voice recognition function
79*3deb3ec6SMatthias Ringwald 3: In-band ring tone capability
80*3deb3ec6SMatthias Ringwald 4: Attach a number to a voice tag
81*3deb3ec6SMatthias Ringwald 5: Ability to reject a call
82*3deb3ec6SMatthias Ringwald 6: Enhanced call status
83*3deb3ec6SMatthias Ringwald 7: Enhanced call control
84*3deb3ec6SMatthias Ringwald 8: Extended Error Result Codes
85*3deb3ec6SMatthias Ringwald 9: Codec negotiation
86*3deb3ec6SMatthias Ringwald 10: HF Indicators
87*3deb3ec6SMatthias Ringwald 11: eSCO S4 (and T2) Settings Supported
88*3deb3ec6SMatthias Ringwald 12-31: Reserved for future definition
89*3deb3ec6SMatthias Ringwald */
90*3deb3ec6SMatthias Ringwald #define HFP_AGSF_THREE_WAY_CALLING  0
91*3deb3ec6SMatthias Ringwald #define HFP_AGSF_EC_NR_FUNCTION     1
92*3deb3ec6SMatthias Ringwald #define HFP_AGSF_CODEC_NEGOTIATION  9
93*3deb3ec6SMatthias Ringwald #define HFP_AGSF_HF_INDICATORS      10
94*3deb3ec6SMatthias Ringwald #define HFP_AGSF_ESCO               11
95*3deb3ec6SMatthias Ringwald 
96*3deb3ec6SMatthias Ringwald #define HFP_DEFAULT_HF_SUPPORTED_FEATURES 0x0000
97*3deb3ec6SMatthias Ringwald #define HFP_DEFAULT_AG_SUPPORTED_FEATURES 0x0009
98*3deb3ec6SMatthias Ringwald 
99*3deb3ec6SMatthias Ringwald #define HFP_MAX_NUM_CODECS 20
100*3deb3ec6SMatthias Ringwald #define HFP_MAX_NUM_AG_INDICATORS 20
101*3deb3ec6SMatthias Ringwald #define HFP_MAX_NUM_HF_INDICATORS 20
102*3deb3ec6SMatthias Ringwald #define HFP_MAX_INDICATOR_DESC_SIZE 20
103*3deb3ec6SMatthias Ringwald 
104*3deb3ec6SMatthias Ringwald #define HFP_SUPPORTED_FEATURES "+BRSF"
105*3deb3ec6SMatthias Ringwald #define HFP_AVAILABLE_CODECS "+BAC"
106*3deb3ec6SMatthias Ringwald #define HFP_INDICATOR "+CIND"
107*3deb3ec6SMatthias Ringwald #define HFP_ENABLE_STATUS_UPDATE_FOR_AG_INDICATORS "+CMER"
108*3deb3ec6SMatthias Ringwald #define HFP_UPDATE_ENABLE_STATUS_FOR_INDIVIDUAL_AG_INDICATORS "+BIA" // +BIA:<enabled>,,<enabled>,,,<enabled>
109*3deb3ec6SMatthias Ringwald #define HFP_SUPPORT_CALL_HOLD_AND_MULTIPARTY_SERVICES "+CHLD"
110*3deb3ec6SMatthias Ringwald #define HFP_GENERIC_STATUS_INDICATOR "+BIND"
111*3deb3ec6SMatthias Ringwald #define HFP_TRANSFER_AG_INDICATOR_STATUS "+CIEV" // +CIEV: <index>,<value>
112*3deb3ec6SMatthias Ringwald #define HFP_QUERY_OPERATOR_SELECTION "+COPS"     // +COPS: <mode>,0,<opearator>
113*3deb3ec6SMatthias Ringwald #define HFP_ENABLE_EXTENDED_AUDIO_GATEWAY_ERROR "+CMEE"
114*3deb3ec6SMatthias Ringwald #define HFP_EXTENDED_AUDIO_GATEWAY_ERROR "+CME ERROR"
115*3deb3ec6SMatthias Ringwald #define HFP_TRIGGER_CODEC_CONNECTION_SETUP "+BCC"
116*3deb3ec6SMatthias Ringwald #define HFP_CONFIRM_COMMON_CODEC "+BCS"
117*3deb3ec6SMatthias Ringwald 
118*3deb3ec6SMatthias Ringwald #define HFP_OK "OK"
119*3deb3ec6SMatthias Ringwald #define HFP_ERROR "ERROR"
120*3deb3ec6SMatthias Ringwald 
121*3deb3ec6SMatthias Ringwald // Codecs
122*3deb3ec6SMatthias Ringwald #define HFP_CODEC_CVSD 0x01
123*3deb3ec6SMatthias Ringwald #define HFP_CODEC_MSBC 0x02
124*3deb3ec6SMatthias Ringwald 
125*3deb3ec6SMatthias Ringwald typedef enum {
126*3deb3ec6SMatthias Ringwald     HFP_CMD_NONE = 0,
127*3deb3ec6SMatthias Ringwald     HFP_CMD_ERROR,
128*3deb3ec6SMatthias Ringwald     HFP_CMD_OK,
129*3deb3ec6SMatthias Ringwald     HFP_CMD_SUPPORTED_FEATURES,
130*3deb3ec6SMatthias Ringwald     HFP_CMD_AVAILABLE_CODECS,
131*3deb3ec6SMatthias Ringwald     HFP_CMD_INDICATOR, // 5
132*3deb3ec6SMatthias Ringwald     HFP_CMD_ENABLE_INDICATOR_STATUS_UPDATE,
133*3deb3ec6SMatthias Ringwald     HFP_CMD_ENABLE_INDIVIDUAL_AG_INDICATOR_STATUS_UPDATE,
134*3deb3ec6SMatthias Ringwald     HFP_CMD_SUPPORT_CALL_HOLD_AND_MULTIPARTY_SERVICES,
135*3deb3ec6SMatthias Ringwald 
136*3deb3ec6SMatthias Ringwald     HFP_CMD_GENERIC_STATUS_INDICATOR,
137*3deb3ec6SMatthias Ringwald 
138*3deb3ec6SMatthias Ringwald     HFP_CMD_TRANSFER_AG_INDICATOR_STATUS,
139*3deb3ec6SMatthias Ringwald     HFP_CMD_QUERY_OPERATOR_SELECTION,
140*3deb3ec6SMatthias Ringwald 
141*3deb3ec6SMatthias Ringwald     HFP_CMD_ENABLE_EXTENDED_AUDIO_GATEWAY_ERROR,
142*3deb3ec6SMatthias Ringwald     HFP_CMD_EXTENDED_AUDIO_GATEWAY_ERROR,
143*3deb3ec6SMatthias Ringwald     HFP_CMD_TRIGGER_CODEC_CONNECTION_SETUP,
144*3deb3ec6SMatthias Ringwald     HFP_CMD_AG_SUGGESTED_CODEC,
145*3deb3ec6SMatthias Ringwald     HFP_CMD_HF_CONFIRMED_CODEC
146*3deb3ec6SMatthias Ringwald 
147*3deb3ec6SMatthias Ringwald } hfp_command_t;
148*3deb3ec6SMatthias Ringwald 
149*3deb3ec6SMatthias Ringwald typedef enum {
150*3deb3ec6SMatthias Ringwald     HFP_CME_ERROR_AG_FAILURE = 0,
151*3deb3ec6SMatthias Ringwald     HFP_CME_ERROR_NO_CONNECTION_TO_PHONE,
152*3deb3ec6SMatthias Ringwald     HFP_CME_ERROR_2,
153*3deb3ec6SMatthias Ringwald     HFP_CME_ERROR_OPERATION_NOT_ALLOWED,
154*3deb3ec6SMatthias Ringwald     HFP_CME_ERROR_OPERATION_NOT_SUPPORTED,
155*3deb3ec6SMatthias Ringwald     HFP_CME_ERROR_PH_SIM_PIN_REQUIRED,
156*3deb3ec6SMatthias Ringwald     HFP_CME_ERROR_6,
157*3deb3ec6SMatthias Ringwald     HFP_CME_ERROR_7,
158*3deb3ec6SMatthias Ringwald     HFP_CME_ERROR_8,
159*3deb3ec6SMatthias Ringwald     HFP_CME_ERROR_9,
160*3deb3ec6SMatthias Ringwald     HFP_CME_ERROR_SIM_NOT_INSERTED,
161*3deb3ec6SMatthias Ringwald     HFP_CME_ERROR_SIM_PIN_REQUIRED,
162*3deb3ec6SMatthias Ringwald     HFP_CME_ERROR_SIM_PUK_REQUIRED,
163*3deb3ec6SMatthias Ringwald     HFP_CME_ERROR_SIM_FAILURE,
164*3deb3ec6SMatthias Ringwald     HFP_CME_ERROR_SIM_BUSY,
165*3deb3ec6SMatthias Ringwald     HFP_CME_ERROR_15,
166*3deb3ec6SMatthias Ringwald     HFP_CME_ERROR_INCORRECT_PASSWORD,
167*3deb3ec6SMatthias Ringwald     HFP_CME_ERROR_SIM_PIN2_REQUIRED,
168*3deb3ec6SMatthias Ringwald     HFP_CME_ERROR_SIM_PUK2_REQUIRED,
169*3deb3ec6SMatthias Ringwald     HFP_CME_ERROR_19,
170*3deb3ec6SMatthias Ringwald     HFP_CME_ERROR_MEMORY_FULL,
171*3deb3ec6SMatthias Ringwald     HFP_CME_ERROR_INVALID_INDEX,
172*3deb3ec6SMatthias Ringwald     HFP_CME_ERROR_22,
173*3deb3ec6SMatthias Ringwald     HFP_CME_ERROR_MEMORY_FAILURE,
174*3deb3ec6SMatthias Ringwald     HFP_CME_ERROR_TEXT_STRING_TOO_LONG,
175*3deb3ec6SMatthias Ringwald     HFP_CME_ERROR_INVALID_CHARACTERS_IN_TEXT_STRING,
176*3deb3ec6SMatthias Ringwald     HFP_CME_ERROR_DIAL_STRING_TOO_LONG,
177*3deb3ec6SMatthias Ringwald     HFP_CME_ERROR_INVALID_CHARACTERS_IN_DIAL_STRING,
178*3deb3ec6SMatthias Ringwald     HFP_CME_ERROR_28,
179*3deb3ec6SMatthias Ringwald     HFP_CME_ERROR_29,
180*3deb3ec6SMatthias Ringwald     HFP_CME_ERROR_NO_NETWORK_SERVICE,
181*3deb3ec6SMatthias Ringwald     HFP_CME_ERROR_NETWORK_TIMEOUT,
182*3deb3ec6SMatthias Ringwald     HFP_CME_ERROR_NETWORK_NOT_ALLOWED_EMERGENCY_CALLS_ONLY
183*3deb3ec6SMatthias Ringwald } hfp_cme_error_t;
184*3deb3ec6SMatthias Ringwald 
185*3deb3ec6SMatthias Ringwald typedef enum {
186*3deb3ec6SMatthias Ringwald     HFP_CALL_STATUS_NO_HELD_OR_ACTIVE_CALLS = 0,
187*3deb3ec6SMatthias Ringwald     HFP_CALL_STATUS_ACTIVE_OR_HELD_CALL_IS_PRESENT
188*3deb3ec6SMatthias Ringwald } hfp_call_status_t;
189*3deb3ec6SMatthias Ringwald 
190*3deb3ec6SMatthias Ringwald typedef enum {
191*3deb3ec6SMatthias Ringwald     HFP_CALLSETUP_STATUS_NO_CALL_SETUP_IN_PROGRESS = 0,
192*3deb3ec6SMatthias Ringwald     HFP_CALLSETUP_STATUS_INCOMING_CALL_SETUP_IN_PROGRESS,
193*3deb3ec6SMatthias Ringwald     HFP_CALLSETUP_STATUS_OUTGOING_CALL_SETUP_IN_DIALING_STATE,
194*3deb3ec6SMatthias Ringwald     HFP_CALLSETUP_STATUS_OUTGOING_CALL_SETUP_IN_ALERTING_STATE
195*3deb3ec6SMatthias Ringwald } hfp_callsetup_status_t;
196*3deb3ec6SMatthias Ringwald 
197*3deb3ec6SMatthias Ringwald typedef enum {
198*3deb3ec6SMatthias Ringwald     HFP_HELDCALL_STATUS_NO_CALLS_HELD = 0,
199*3deb3ec6SMatthias Ringwald     HFP_HELDCALL_STATUS_CALL_ON_HOLD_OR_SWAPPED,
200*3deb3ec6SMatthias Ringwald     HFP_HELDCALL_STATUS_CALL_ON_HOLD_AND_NO_ACTIVE_CALLS
201*3deb3ec6SMatthias Ringwald } hfp_callheld_status_t;
202*3deb3ec6SMatthias Ringwald 
203*3deb3ec6SMatthias Ringwald typedef enum {
204*3deb3ec6SMatthias Ringwald     HFP_PARSER_CMD_HEADER = 0,
205*3deb3ec6SMatthias Ringwald     HFP_PARSER_CMD_SEQUENCE,
206*3deb3ec6SMatthias Ringwald     HFP_PARSER_SECOND_ITEM,
207*3deb3ec6SMatthias Ringwald     HFP_PARSER_THIRD_ITEM
208*3deb3ec6SMatthias Ringwald } hfp_parser_state_t;
209*3deb3ec6SMatthias Ringwald 
210*3deb3ec6SMatthias Ringwald 
211*3deb3ec6SMatthias Ringwald typedef enum {
212*3deb3ec6SMatthias Ringwald     HFP_IDLE = 0, //0
213*3deb3ec6SMatthias Ringwald     HFP_SDP_QUERY_RFCOMM_CHANNEL,
214*3deb3ec6SMatthias Ringwald     HFP_W4_SDP_QUERY_COMPLETE,
215*3deb3ec6SMatthias Ringwald     HFP_W4_RFCOMM_CONNECTED,
216*3deb3ec6SMatthias Ringwald 
217*3deb3ec6SMatthias Ringwald     HFP_EXCHANGE_SUPPORTED_FEATURES,
218*3deb3ec6SMatthias Ringwald     HFP_W4_EXCHANGE_SUPPORTED_FEATURES, // 5
219*3deb3ec6SMatthias Ringwald 
220*3deb3ec6SMatthias Ringwald     HFP_NOTIFY_ON_CODECS,
221*3deb3ec6SMatthias Ringwald     HFP_W4_NOTIFY_ON_CODECS,
222*3deb3ec6SMatthias Ringwald 
223*3deb3ec6SMatthias Ringwald     HFP_RETRIEVE_INDICATORS,
224*3deb3ec6SMatthias Ringwald     HFP_W4_RETRIEVE_INDICATORS,
225*3deb3ec6SMatthias Ringwald 
226*3deb3ec6SMatthias Ringwald     HFP_RETRIEVE_INDICATORS_STATUS, // 10
227*3deb3ec6SMatthias Ringwald     HFP_W4_RETRIEVE_INDICATORS_STATUS,
228*3deb3ec6SMatthias Ringwald 
229*3deb3ec6SMatthias Ringwald     HFP_ENABLE_INDICATORS_STATUS_UPDATE,
230*3deb3ec6SMatthias Ringwald     HFP_W4_ENABLE_INDICATORS_STATUS_UPDATE,
231*3deb3ec6SMatthias Ringwald 
232*3deb3ec6SMatthias Ringwald     HFP_RETRIEVE_CAN_HOLD_CALL,
233*3deb3ec6SMatthias Ringwald     HFP_W4_RETRIEVE_CAN_HOLD_CALL, // 15
234*3deb3ec6SMatthias Ringwald 
235*3deb3ec6SMatthias Ringwald     HFP_LIST_GENERIC_STATUS_INDICATORS,
236*3deb3ec6SMatthias Ringwald     HFP_W4_LIST_GENERIC_STATUS_INDICATORS,
237*3deb3ec6SMatthias Ringwald 
238*3deb3ec6SMatthias Ringwald     HFP_RETRIEVE_GENERIC_STATUS_INDICATORS,
239*3deb3ec6SMatthias Ringwald     HFP_W4_RETRIEVE_GENERIC_STATUS_INDICATORS,
240*3deb3ec6SMatthias Ringwald 
241*3deb3ec6SMatthias Ringwald     HFP_RETRIEVE_INITITAL_STATE_GENERIC_STATUS_INDICATORS, // 20
242*3deb3ec6SMatthias Ringwald     HFP_W4_RETRIEVE_INITITAL_STATE_GENERIC_STATUS_INDICATORS,
243*3deb3ec6SMatthias Ringwald 
244*3deb3ec6SMatthias Ringwald     HFP_SERVICE_LEVEL_CONNECTION_ESTABLISHED, // 22
245*3deb3ec6SMatthias Ringwald 
246*3deb3ec6SMatthias Ringwald     HFP_SLE_W2_EXCHANGE_COMMON_CODEC,
247*3deb3ec6SMatthias Ringwald     HFP_SLE_W4_EXCHANGE_COMMON_CODEC,
248*3deb3ec6SMatthias Ringwald 
249*3deb3ec6SMatthias Ringwald     HFP_CODECS_CONNECTION_ESTABLISHED, // 25
250*3deb3ec6SMatthias Ringwald 
251*3deb3ec6SMatthias Ringwald     HFP_CCE_W2_ESTABLISH_SCO,
252*3deb3ec6SMatthias Ringwald     HFP_CCE_W4_SCO_CONNECTION_ESTABLISHED,
253*3deb3ec6SMatthias Ringwald 
254*3deb3ec6SMatthias Ringwald     HFP_AUDIO_CONNECTION_ESTABLISHED,
255*3deb3ec6SMatthias Ringwald 
256*3deb3ec6SMatthias Ringwald     HFP_W2_DISCONNECT_SCO,
257*3deb3ec6SMatthias Ringwald     HFP_W4_SCO_DISCONNECTED, // 30
258*3deb3ec6SMatthias Ringwald 
259*3deb3ec6SMatthias Ringwald     HFP_W2_DISCONNECT_RFCOMM,
260*3deb3ec6SMatthias Ringwald     HFP_W4_RFCOMM_DISCONNECTED,
261*3deb3ec6SMatthias Ringwald     HFP_W4_RFCOMM_DISCONNECTED_AND_RESTART,
262*3deb3ec6SMatthias Ringwald     HFP_W4_CONNECTION_ESTABLISHED_TO_SHUTDOWN
263*3deb3ec6SMatthias Ringwald } hfp_state_t;
264*3deb3ec6SMatthias Ringwald 
265*3deb3ec6SMatthias Ringwald typedef void (*hfp_callback_t)(uint8_t * event, uint16_t event_size);
266*3deb3ec6SMatthias Ringwald 
267*3deb3ec6SMatthias Ringwald typedef struct{
268*3deb3ec6SMatthias Ringwald     uint16_t uuid;
269*3deb3ec6SMatthias Ringwald     uint8_t state; // enabled
270*3deb3ec6SMatthias Ringwald } hfp_generic_status_indicator_t;
271*3deb3ec6SMatthias Ringwald 
272*3deb3ec6SMatthias Ringwald typedef struct{
273*3deb3ec6SMatthias Ringwald     uint8_t index;
274*3deb3ec6SMatthias Ringwald     char name[HFP_MAX_INDICATOR_DESC_SIZE];
275*3deb3ec6SMatthias Ringwald     uint8_t min_range;
276*3deb3ec6SMatthias Ringwald     uint8_t max_range;
277*3deb3ec6SMatthias Ringwald     uint8_t status;
278*3deb3ec6SMatthias Ringwald     uint8_t mandatory;
279*3deb3ec6SMatthias Ringwald     uint8_t enabled;
280*3deb3ec6SMatthias Ringwald     uint8_t status_changed;
281*3deb3ec6SMatthias Ringwald } hfp_ag_indicator_t;
282*3deb3ec6SMatthias Ringwald 
283*3deb3ec6SMatthias Ringwald typedef struct{
284*3deb3ec6SMatthias Ringwald     char name[3];
285*3deb3ec6SMatthias Ringwald } hfp_call_service_t;
286*3deb3ec6SMatthias Ringwald 
287*3deb3ec6SMatthias Ringwald 
288*3deb3ec6SMatthias Ringwald typedef struct{
289*3deb3ec6SMatthias Ringwald     uint8_t mode;
290*3deb3ec6SMatthias Ringwald     uint8_t format;
291*3deb3ec6SMatthias Ringwald     char name[17]; // enabled
292*3deb3ec6SMatthias Ringwald } hfp_network_opearator_t;
293*3deb3ec6SMatthias Ringwald 
294*3deb3ec6SMatthias Ringwald 
295*3deb3ec6SMatthias Ringwald typedef struct hfp_connection {
296*3deb3ec6SMatthias Ringwald     linked_item_t    item;
297*3deb3ec6SMatthias Ringwald 
298*3deb3ec6SMatthias Ringwald     bd_addr_t remote_addr;
299*3deb3ec6SMatthias Ringwald     uint16_t con_handle;
300*3deb3ec6SMatthias Ringwald     uint16_t sco_handle;
301*3deb3ec6SMatthias Ringwald     uint16_t rfcomm_channel_nr;
302*3deb3ec6SMatthias Ringwald     uint16_t rfcomm_cid;
303*3deb3ec6SMatthias Ringwald 
304*3deb3ec6SMatthias Ringwald     hfp_state_t state;
305*3deb3ec6SMatthias Ringwald     // needed for reestablishing connection
306*3deb3ec6SMatthias Ringwald     uint16_t service_uuid;
307*3deb3ec6SMatthias Ringwald 
308*3deb3ec6SMatthias Ringwald     // used during service level connection establishment
309*3deb3ec6SMatthias Ringwald     hfp_command_t command;
310*3deb3ec6SMatthias Ringwald     hfp_parser_state_t parser_state;
311*3deb3ec6SMatthias Ringwald     int      parser_item_index;
312*3deb3ec6SMatthias Ringwald     uint8_t  line_buffer[HFP_MAX_INDICATOR_DESC_SIZE];
313*3deb3ec6SMatthias Ringwald     int      line_size;
314*3deb3ec6SMatthias Ringwald 
315*3deb3ec6SMatthias Ringwald     uint32_t remote_supported_features;
316*3deb3ec6SMatthias Ringwald 
317*3deb3ec6SMatthias Ringwald     // TODO: rename into hf_codecs_nr
318*3deb3ec6SMatthias Ringwald     int      remote_codecs_nr;
319*3deb3ec6SMatthias Ringwald     uint16_t remote_codecs[HFP_MAX_INDICATOR_DESC_SIZE];
320*3deb3ec6SMatthias Ringwald     int      ag_indicators_nr;
321*3deb3ec6SMatthias Ringwald     hfp_ag_indicator_t ag_indicators[HFP_MAX_INDICATOR_DESC_SIZE];
322*3deb3ec6SMatthias Ringwald     int      remote_call_services_nr;
323*3deb3ec6SMatthias Ringwald     hfp_call_service_t remote_call_services[HFP_MAX_INDICATOR_DESC_SIZE];
324*3deb3ec6SMatthias Ringwald 
325*3deb3ec6SMatthias Ringwald     // TODO: use bitmap.
326*3deb3ec6SMatthias Ringwald     int      generic_status_indicators_nr;
327*3deb3ec6SMatthias Ringwald     hfp_generic_status_indicator_t generic_status_indicators[HFP_MAX_INDICATOR_DESC_SIZE];
328*3deb3ec6SMatthias Ringwald     uint8_t  enable_status_update_for_ag_indicators;
329*3deb3ec6SMatthias Ringwald 
330*3deb3ec6SMatthias Ringwald     uint32_t ag_indicators_status_update_bitmap;
331*3deb3ec6SMatthias Ringwald     hfp_network_opearator_t network_operator;
332*3deb3ec6SMatthias Ringwald 
333*3deb3ec6SMatthias Ringwald     // Retrieved during service level connection establishment, not used yet
334*3deb3ec6SMatthias Ringwald     uint8_t  negotiated_codec;
335*3deb3ec6SMatthias Ringwald 
336*3deb3ec6SMatthias Ringwald     // TODO: put these bit flags in a bitmap
337*3deb3ec6SMatthias Ringwald     uint8_t wait_ok;
338*3deb3ec6SMatthias Ringwald     uint8_t send_ok;
339*3deb3ec6SMatthias Ringwald     uint8_t send_error;
340*3deb3ec6SMatthias Ringwald 
341*3deb3ec6SMatthias Ringwald     uint8_t keep_separator;
342*3deb3ec6SMatthias Ringwald 
343*3deb3ec6SMatthias Ringwald     uint8_t retrieve_ag_indicators;        // HFP_CMD_INDICATOR, check if needed
344*3deb3ec6SMatthias Ringwald     uint8_t retrieve_ag_indicators_status;
345*3deb3ec6SMatthias Ringwald 
346*3deb3ec6SMatthias Ringwald     uint8_t list_generic_status_indicators;           // HFP_CMD_LIST_GENERIC_STATUS_INDICATOR
347*3deb3ec6SMatthias Ringwald     uint8_t retrieve_generic_status_indicators;       // HFP_CMD_GENERIC_STATUS_INDICATOR
348*3deb3ec6SMatthias Ringwald     uint8_t retrieve_generic_status_indicators_state; // HFP_CMD_GENERIC_STATUS_INDICATOR_STATE
349*3deb3ec6SMatthias Ringwald 
350*3deb3ec6SMatthias Ringwald     uint8_t change_status_update_for_individual_ag_indicators;
351*3deb3ec6SMatthias Ringwald 
352*3deb3ec6SMatthias Ringwald     uint8_t operator_name_format;
353*3deb3ec6SMatthias Ringwald     uint8_t operator_name;
354*3deb3ec6SMatthias Ringwald     uint8_t operator_name_changed;
355*3deb3ec6SMatthias Ringwald 
356*3deb3ec6SMatthias Ringwald     uint8_t enable_extended_audio_gateway_error_report;
357*3deb3ec6SMatthias Ringwald     uint8_t extended_audio_gateway_error;
358*3deb3ec6SMatthias Ringwald 
359*3deb3ec6SMatthias Ringwald     // can come any time (here taken into account only after SLE),
360*3deb3ec6SMatthias Ringwald     // if codec negotiation feature is set
361*3deb3ec6SMatthias Ringwald     uint8_t notify_ag_on_new_codecs;
362*3deb3ec6SMatthias Ringwald 
363*3deb3ec6SMatthias Ringwald     // establish codecs connection
364*3deb3ec6SMatthias Ringwald     uint8_t hf_trigger_codec_connection_setup;
365*3deb3ec6SMatthias Ringwald     uint8_t ag_trigger_codec_connection_setup;
366*3deb3ec6SMatthias Ringwald     uint8_t ag_ready_for_codecs_connection_setup;
367*3deb3ec6SMatthias Ringwald     uint8_t suggested_codec;
368*3deb3ec6SMatthias Ringwald     uint8_t codec_confirmed;
369*3deb3ec6SMatthias Ringwald 
370*3deb3ec6SMatthias Ringwald     uint8_t establish_audio_connection;
371*3deb3ec6SMatthias Ringwald     uint8_t release_audio_connection;
372*3deb3ec6SMatthias Ringwald 
373*3deb3ec6SMatthias Ringwald } hfp_connection_t;
374*3deb3ec6SMatthias Ringwald 
375*3deb3ec6SMatthias Ringwald // UTILS_START : TODO move to utils
376*3deb3ec6SMatthias Ringwald int send_str_over_rfcomm(uint16_t cid, char * command);
377*3deb3ec6SMatthias Ringwald int join(char * buffer, int buffer_size, uint8_t * values, int values_nr);
378*3deb3ec6SMatthias Ringwald int join_bitmap(char * buffer, int buffer_size, uint32_t values, int values_nr);
379*3deb3ec6SMatthias Ringwald int get_bit(uint16_t bitmap, int position);
380*3deb3ec6SMatthias Ringwald int store_bit(uint32_t bitmap, int position, uint8_t value);
381*3deb3ec6SMatthias Ringwald // UTILS_END
382*3deb3ec6SMatthias Ringwald 
383*3deb3ec6SMatthias Ringwald void hfp_create_sdp_record(uint8_t * service, uint16_t service_uuid, int rfcomm_channel_nr, const char * name, uint16_t supported_features);
384*3deb3ec6SMatthias Ringwald void hfp_handle_hci_event(hfp_callback_t callback, uint8_t packet_type, uint8_t *packet, uint16_t size);
385*3deb3ec6SMatthias Ringwald void hfp_emit_event(hfp_callback_t callback, uint8_t event_subtype, uint8_t value);
386*3deb3ec6SMatthias Ringwald hfp_connection_t * get_hfp_connection_context_for_rfcomm_cid(uint16_t cid);
387*3deb3ec6SMatthias Ringwald hfp_connection_t * get_hfp_connection_context_for_bd_addr(bd_addr_t bd_addr);
388*3deb3ec6SMatthias Ringwald int get_hfp_generic_status_indicators_nr(void);
389*3deb3ec6SMatthias Ringwald hfp_generic_status_indicator_t * get_hfp_generic_status_indicators(void);
390*3deb3ec6SMatthias Ringwald void set_hfp_generic_status_indicators(hfp_generic_status_indicator_t * indicators, int indicator_nr);
391*3deb3ec6SMatthias Ringwald 
392*3deb3ec6SMatthias Ringwald linked_list_t * hfp_get_connections(void);
393*3deb3ec6SMatthias Ringwald void hfp_parse(hfp_connection_t * context, uint8_t byte);
394*3deb3ec6SMatthias Ringwald 
395*3deb3ec6SMatthias Ringwald void hfp_init(uint16_t rfcomm_channel_nr);
396*3deb3ec6SMatthias Ringwald void hfp_establish_service_level_connection(bd_addr_t bd_addr, uint16_t service_uuid);
397*3deb3ec6SMatthias Ringwald void hfp_release_service_level_connection(hfp_connection_t * connection);
398*3deb3ec6SMatthias Ringwald void hfp_reset_context_flags(hfp_connection_t * context);
399*3deb3ec6SMatthias Ringwald 
400*3deb3ec6SMatthias Ringwald void hfp_release_audio_connection(hfp_connection_t * context);
401*3deb3ec6SMatthias Ringwald 
402*3deb3ec6SMatthias Ringwald const char * hfp_hf_feature(int index);
403*3deb3ec6SMatthias Ringwald const char * hfp_ag_feature(int index);
404*3deb3ec6SMatthias Ringwald 
405*3deb3ec6SMatthias Ringwald #if defined __cplusplus
406*3deb3ec6SMatthias Ringwald }
407*3deb3ec6SMatthias Ringwald #endif
408*3deb3ec6SMatthias Ringwald 
409*3deb3ec6SMatthias Ringwald #endif