xref: /btstack/src/classic/hfp_gsm_model.c (revision 7bbeb3ad8cec0c1816689843bf9383cf4c644ef8)
174386ee0SMatthias Ringwald /*
274386ee0SMatthias Ringwald  * Copyright (C) 2014 BlueKitchen GmbH
374386ee0SMatthias Ringwald  *
474386ee0SMatthias Ringwald  * Redistribution and use in source and binary forms, with or without
574386ee0SMatthias Ringwald  * modification, are permitted provided that the following conditions
674386ee0SMatthias Ringwald  * are met:
774386ee0SMatthias Ringwald  *
874386ee0SMatthias Ringwald  * 1. Redistributions of source code must retain the above copyright
974386ee0SMatthias Ringwald  *    notice, this list of conditions and the following disclaimer.
1074386ee0SMatthias Ringwald  * 2. Redistributions in binary form must reproduce the above copyright
1174386ee0SMatthias Ringwald  *    notice, this list of conditions and the following disclaimer in the
1274386ee0SMatthias Ringwald  *    documentation and/or other materials provided with the distribution.
1374386ee0SMatthias Ringwald  * 3. Neither the name of the copyright holders nor the names of
1474386ee0SMatthias Ringwald  *    contributors may be used to endorse or promote products derived
1574386ee0SMatthias Ringwald  *    from this software without specific prior written permission.
1674386ee0SMatthias Ringwald  * 4. Any redistribution, use, or modification is done solely for
1774386ee0SMatthias Ringwald  *    personal benefit and not for any commercial purpose or for
1874386ee0SMatthias Ringwald  *    monetary gain.
1974386ee0SMatthias Ringwald  *
2074386ee0SMatthias Ringwald  * THIS SOFTWARE IS PROVIDED BY BLUEKITCHEN GMBH AND CONTRIBUTORS
2174386ee0SMatthias Ringwald  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
2274386ee0SMatthias Ringwald  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
2374386ee0SMatthias Ringwald  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL MATTHIAS
2474386ee0SMatthias Ringwald  * RINGWALD OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
2574386ee0SMatthias Ringwald  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
2674386ee0SMatthias Ringwald  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
2774386ee0SMatthias Ringwald  * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
2874386ee0SMatthias Ringwald  * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
2974386ee0SMatthias Ringwald  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
3074386ee0SMatthias Ringwald  * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
3174386ee0SMatthias Ringwald  * SUCH DAMAGE.
3274386ee0SMatthias Ringwald  *
3374386ee0SMatthias Ringwald  * Please inquire about commercial licensing options at
3474386ee0SMatthias Ringwald  * [email protected]
3574386ee0SMatthias Ringwald  *
3674386ee0SMatthias Ringwald  */
37ab2c6ae4SMatthias Ringwald 
38e501bae0SMatthias Ringwald #define BTSTACK_FILE__ "hfp_gsm_model.c"
3974386ee0SMatthias Ringwald 
4074386ee0SMatthias Ringwald // *****************************************************************************
4174386ee0SMatthias Ringwald //
429cae807eSMatthias Ringwald // GSM Model
4374386ee0SMatthias Ringwald //
4474386ee0SMatthias Ringwald // *****************************************************************************
4574386ee0SMatthias Ringwald 
467907f069SMatthias Ringwald #include "btstack_config.h"
4774386ee0SMatthias Ringwald 
4874386ee0SMatthias Ringwald #include <stdint.h>
4974386ee0SMatthias Ringwald #include <string.h>
5074386ee0SMatthias Ringwald 
5174386ee0SMatthias Ringwald #include "btstack_memory.h"
5259c6af15SMatthias Ringwald #include "classic/core.h"
5374386ee0SMatthias Ringwald #include "classic/hfp.h"
5474386ee0SMatthias Ringwald #include "classic/hfp_gsm_model.h"
55746ccb7eSMatthias Ringwald #include "classic/sdp_server.h"
56efda0b48SMatthias Ringwald #include "classic/sdp_client_rfcomm.h"
5716ece135SMatthias Ringwald #include "btstack_debug.h"
5874386ee0SMatthias Ringwald #include "hci.h"
5956042629SMatthias Ringwald #include "hci_cmd.h"
6074386ee0SMatthias Ringwald #include "hci_dump.h"
6174386ee0SMatthias Ringwald #include "l2cap.h"
6282636622SMatthias Ringwald #include "btstack_run_loop.h"
6374386ee0SMatthias Ringwald 
6474386ee0SMatthias Ringwald #define HFP_GSM_MAX_NR_CALLS 3
659cae807eSMatthias Ringwald #define HFP_GSM_MAX_CALL_NUMBER_SIZE 25
6674386ee0SMatthias Ringwald 
6774386ee0SMatthias Ringwald static hfp_gsm_call_t gsm_calls[HFP_GSM_MAX_NR_CALLS];
6874386ee0SMatthias Ringwald static hfp_callsetup_status_t callsetup_status = HFP_CALLSETUP_STATUS_NO_CALL_SETUP_IN_PROGRESS;
6974386ee0SMatthias Ringwald 
70d0c20769SMatthias Ringwald static uint8_t clip_type;
719cae807eSMatthias Ringwald static char clip_number[HFP_GSM_MAX_CALL_NUMBER_SIZE];
729cae807eSMatthias Ringwald static char last_dialed_number[HFP_GSM_MAX_CALL_NUMBER_SIZE];
73d0c20769SMatthias Ringwald 
74d0c20769SMatthias Ringwald static void hfp_gsm_handler(hfp_ag_call_event_t event, uint8_t index, uint8_t type, const char * number);
7566a048abSMatthias Ringwald static inline int get_number_active_calls(void);
7666a048abSMatthias Ringwald 
7766a048abSMatthias Ringwald static void set_callsetup_status(hfp_callsetup_status_t status){
7866a048abSMatthias Ringwald     callsetup_status = status;
7966a048abSMatthias Ringwald     if (callsetup_status != HFP_CALLSETUP_STATUS_OUTGOING_CALL_SETUP_IN_ALERTING_STATE) return;
8066a048abSMatthias Ringwald 
8166a048abSMatthias Ringwald     int i ;
8266a048abSMatthias Ringwald     for (i = 0; i < HFP_GSM_MAX_NR_CALLS; i++){
8366a048abSMatthias Ringwald         if (gsm_calls[i].direction == HFP_ENHANCED_CALL_DIR_OUTGOING){
8466a048abSMatthias Ringwald             gsm_calls[i].enhanced_status = HFP_ENHANCED_CALL_STATUS_OUTGOING_ALERTING;
8566a048abSMatthias Ringwald         }
8666a048abSMatthias Ringwald     }
8766a048abSMatthias Ringwald }
8866a048abSMatthias Ringwald 
8966a048abSMatthias Ringwald static inline void set_enhanced_call_status_active(int index_in_table){
90a9a12719SMatthias Ringwald     if ((index_in_table < 0) || (index_in_table > HFP_GSM_MAX_NR_CALLS)) return;
9166a048abSMatthias Ringwald     gsm_calls[index_in_table].enhanced_status = HFP_ENHANCED_CALL_STATUS_ACTIVE;
9266a048abSMatthias Ringwald     gsm_calls[index_in_table].used_slot = 1;
9366a048abSMatthias Ringwald }
9466a048abSMatthias Ringwald 
9566a048abSMatthias Ringwald static inline void set_enhanced_call_status_held(int index_in_table){
96a9a12719SMatthias Ringwald     if ((index_in_table < 0) || (index_in_table > HFP_GSM_MAX_NR_CALLS)) return;
9766a048abSMatthias Ringwald     gsm_calls[index_in_table].enhanced_status = HFP_ENHANCED_CALL_STATUS_HELD;
9866a048abSMatthias Ringwald     gsm_calls[index_in_table].used_slot = 1;
9966a048abSMatthias Ringwald }
10066a048abSMatthias Ringwald 
10166a048abSMatthias Ringwald static inline void set_enhanced_call_status_response_hold(int index_in_table){
102a9a12719SMatthias Ringwald     if ((index_in_table < 0) || (index_in_table > HFP_GSM_MAX_NR_CALLS)) return;
10366a048abSMatthias Ringwald     gsm_calls[index_in_table].enhanced_status = HFP_ENHANCED_CALL_STATUS_CALL_HELD_BY_RESPONSE_AND_HOLD;
10466a048abSMatthias Ringwald     gsm_calls[index_in_table].used_slot = 1;
10566a048abSMatthias Ringwald }
10666a048abSMatthias Ringwald 
10766a048abSMatthias Ringwald static inline void set_enhanced_call_status_initiated(int index_in_table){
108a9a12719SMatthias Ringwald     if ((index_in_table < 0) || (index_in_table > HFP_GSM_MAX_NR_CALLS)) return;
10966a048abSMatthias Ringwald     if (gsm_calls[index_in_table].direction == HFP_ENHANCED_CALL_DIR_OUTGOING){
11066a048abSMatthias Ringwald         gsm_calls[index_in_table].enhanced_status = HFP_ENHANCED_CALL_STATUS_OUTGOING_DIALING;
11166a048abSMatthias Ringwald     } else {
11266a048abSMatthias Ringwald         if (get_number_active_calls() > 0){
11366a048abSMatthias Ringwald             gsm_calls[index_in_table].enhanced_status = HFP_ENHANCED_CALL_STATUS_INCOMING_WAITING;
11466a048abSMatthias Ringwald         } else {
11566a048abSMatthias Ringwald             gsm_calls[index_in_table].enhanced_status = HFP_ENHANCED_CALL_STATUS_INCOMING;
11666a048abSMatthias Ringwald         }
11766a048abSMatthias Ringwald     }
11866a048abSMatthias Ringwald     gsm_calls[index_in_table].used_slot = 1;
11966a048abSMatthias Ringwald }
12066a048abSMatthias Ringwald 
12166a048abSMatthias Ringwald static int get_enhanced_call_status(int index_in_table){
122a9a12719SMatthias Ringwald     if ((index_in_table < 0) || (index_in_table > HFP_GSM_MAX_NR_CALLS)) return -1;
12366a048abSMatthias Ringwald     if (!gsm_calls[index_in_table].used_slot) return -1;
12466a048abSMatthias Ringwald     return gsm_calls[index_in_table].enhanced_status;
12566a048abSMatthias Ringwald }
12666a048abSMatthias Ringwald 
12766a048abSMatthias Ringwald static inline int is_enhanced_call_status_active(int index_in_table){
128a9a12719SMatthias Ringwald     if ((index_in_table < 0) || (index_in_table > HFP_GSM_MAX_NR_CALLS)) return 0;
12966a048abSMatthias Ringwald     return get_enhanced_call_status(index_in_table) == HFP_ENHANCED_CALL_STATUS_ACTIVE;
13066a048abSMatthias Ringwald }
13166a048abSMatthias Ringwald 
13266a048abSMatthias Ringwald static inline int is_enhanced_call_status_initiated(int index_in_table){
133a9a12719SMatthias Ringwald     if ((index_in_table < 0) || (index_in_table > HFP_GSM_MAX_NR_CALLS)) return 0;
13466a048abSMatthias Ringwald     switch (get_enhanced_call_status(index_in_table)){
13566a048abSMatthias Ringwald         case HFP_ENHANCED_CALL_STATUS_OUTGOING_DIALING:
13666a048abSMatthias Ringwald         case HFP_ENHANCED_CALL_STATUS_OUTGOING_ALERTING:
13766a048abSMatthias Ringwald         case HFP_ENHANCED_CALL_STATUS_INCOMING:
13866a048abSMatthias Ringwald         case HFP_ENHANCED_CALL_STATUS_INCOMING_WAITING:
13966a048abSMatthias Ringwald             return 1;
14066a048abSMatthias Ringwald         default:
14166a048abSMatthias Ringwald             return 0;
14266a048abSMatthias Ringwald     }
14366a048abSMatthias Ringwald }
14466a048abSMatthias Ringwald 
14566a048abSMatthias Ringwald static void free_call_slot(int index_in_table){
146a9a12719SMatthias Ringwald     if ((index_in_table < 0) || (index_in_table > HFP_GSM_MAX_NR_CALLS)) return;
14766a048abSMatthias Ringwald     gsm_calls[index_in_table].used_slot = 0;
14866a048abSMatthias Ringwald }
149d0c20769SMatthias Ringwald 
150d210d9c4SMatthias Ringwald void hfp_gsm_init(void){
15166a048abSMatthias Ringwald     set_callsetup_status(HFP_CALLSETUP_STATUS_NO_CALL_SETUP_IN_PROGRESS);
152d0c20769SMatthias Ringwald     clip_type = 0;
153d0c20769SMatthias Ringwald     memset(clip_number, 0, sizeof(clip_number));
1549cae807eSMatthias Ringwald     memset(last_dialed_number, 0, sizeof(last_dialed_number));
155d210d9c4SMatthias Ringwald     memset(gsm_calls, 0, sizeof(gsm_calls));
156d210d9c4SMatthias Ringwald     int i;
157d210d9c4SMatthias Ringwald     for (i = 0; i < HFP_GSM_MAX_NR_CALLS; i++){
15866a048abSMatthias Ringwald         free_call_slot(i);
159d210d9c4SMatthias Ringwald     }
160d210d9c4SMatthias Ringwald }
16174386ee0SMatthias Ringwald 
16266a048abSMatthias Ringwald static int get_number_calls_with_enhanced_status(hfp_enhanced_call_status_t enhanced_status){
16374386ee0SMatthias Ringwald     int i, count = 0;
16474386ee0SMatthias Ringwald     for (i = 0; i < HFP_GSM_MAX_NR_CALLS; i++){
165fdfcab43SMatthias Ringwald         if (get_enhanced_call_status(i) == (int) enhanced_status) count++;
16674386ee0SMatthias Ringwald     }
16774386ee0SMatthias Ringwald     return count;
16874386ee0SMatthias Ringwald }
16974386ee0SMatthias Ringwald 
17066a048abSMatthias Ringwald static int get_call_index_with_enhanced_status(hfp_enhanced_call_status_t enhanced_status){
17174386ee0SMatthias Ringwald     int i ;
17274386ee0SMatthias Ringwald     for (i = 0; i < HFP_GSM_MAX_NR_CALLS; i++){
173fdfcab43SMatthias Ringwald         if (get_enhanced_call_status(i) == (int) enhanced_status) return i;
17466a048abSMatthias Ringwald     }
17566a048abSMatthias Ringwald     return -1;
17666a048abSMatthias Ringwald }
17766a048abSMatthias Ringwald 
17866a048abSMatthias Ringwald static inline int get_initiated_call_index(void){
17966a048abSMatthias Ringwald     int i ;
18066a048abSMatthias Ringwald     for (i = 0; i < HFP_GSM_MAX_NR_CALLS; i++){
18166a048abSMatthias Ringwald         if (is_enhanced_call_status_initiated(i)) return i;
18274386ee0SMatthias Ringwald     }
18374386ee0SMatthias Ringwald     return -1;
18474386ee0SMatthias Ringwald }
18574386ee0SMatthias Ringwald 
1869cae807eSMatthias Ringwald static inline int get_next_free_slot(void){
18766a048abSMatthias Ringwald     int i ;
18866a048abSMatthias Ringwald     for (i = 0; i < HFP_GSM_MAX_NR_CALLS; i++){
18966a048abSMatthias Ringwald         if (!gsm_calls[i].used_slot) return i;
19066a048abSMatthias Ringwald     }
19166a048abSMatthias Ringwald     return -1;
19274386ee0SMatthias Ringwald }
19374386ee0SMatthias Ringwald 
1949cae807eSMatthias Ringwald static inline int get_active_call_index(void){
19566a048abSMatthias Ringwald     return get_call_index_with_enhanced_status(HFP_ENHANCED_CALL_STATUS_ACTIVE);
196d210d9c4SMatthias Ringwald }
197d210d9c4SMatthias Ringwald 
1989cae807eSMatthias Ringwald static inline int get_held_call_index(void){
19966a048abSMatthias Ringwald     return get_call_index_with_enhanced_status(HFP_ENHANCED_CALL_STATUS_HELD);
200d210d9c4SMatthias Ringwald }
201d210d9c4SMatthias Ringwald 
2029cae807eSMatthias Ringwald static inline int get_response_held_call_index(void){
20366a048abSMatthias Ringwald     return get_call_index_with_enhanced_status(HFP_ENHANCED_CALL_STATUS_CALL_HELD_BY_RESPONSE_AND_HOLD);
204d210d9c4SMatthias Ringwald }
205d210d9c4SMatthias Ringwald 
2069cae807eSMatthias Ringwald static inline int get_number_none_calls(void){
20766a048abSMatthias Ringwald     int i, count = 0;
20866a048abSMatthias Ringwald     for (i = 0; i < HFP_GSM_MAX_NR_CALLS; i++){
20966a048abSMatthias Ringwald         if (!gsm_calls[i].used_slot) count++;
21066a048abSMatthias Ringwald     }
21166a048abSMatthias Ringwald     return count;
212d210d9c4SMatthias Ringwald }
21374386ee0SMatthias Ringwald 
2149cae807eSMatthias Ringwald static inline int get_number_active_calls(void){
21566a048abSMatthias Ringwald     return get_number_calls_with_enhanced_status(HFP_ENHANCED_CALL_STATUS_ACTIVE);
21674386ee0SMatthias Ringwald }
21774386ee0SMatthias Ringwald 
2189cae807eSMatthias Ringwald static inline int get_number_held_calls(void){
21966a048abSMatthias Ringwald     return get_number_calls_with_enhanced_status(HFP_ENHANCED_CALL_STATUS_HELD);
22074386ee0SMatthias Ringwald }
22174386ee0SMatthias Ringwald 
2229cae807eSMatthias Ringwald static inline int get_number_response_held_calls(void){
22366a048abSMatthias Ringwald     return get_number_calls_with_enhanced_status(HFP_ENHANCED_CALL_STATUS_CALL_HELD_BY_RESPONSE_AND_HOLD);
224d210d9c4SMatthias Ringwald }
225d210d9c4SMatthias Ringwald 
2269cae807eSMatthias Ringwald static int next_call_index(void){
227d0c20769SMatthias Ringwald     return HFP_GSM_MAX_NR_CALLS + 1 - get_number_none_calls();
228d0c20769SMatthias Ringwald }
229d0c20769SMatthias Ringwald 
230d0c20769SMatthias Ringwald static void hfp_gsm_set_clip(int index_in_table, uint8_t type, const char * number){
23121791470SMilanka Ringwald     uint16_t number_str_len = (uint16_t) strlen(number);
23221791470SMilanka Ringwald     if (number_str_len == 0) return;
2339cae807eSMatthias Ringwald 
234d0c20769SMatthias Ringwald     gsm_calls[index_in_table].clip_type = type;
23521791470SMilanka Ringwald     int clip_number_size = btstack_min(number_str_len, HFP_GSM_MAX_CALL_NUMBER_SIZE - 1);
236d0c20769SMatthias Ringwald     strncpy(gsm_calls[index_in_table].clip_number, number, clip_number_size);
2379cae807eSMatthias Ringwald     gsm_calls[index_in_table].clip_number[clip_number_size] = '\0';
2389cae807eSMatthias Ringwald     strncpy(last_dialed_number, number, clip_number_size);
2399cae807eSMatthias Ringwald     last_dialed_number[clip_number_size] = '\0';
2409cae807eSMatthias Ringwald 
2419cae807eSMatthias Ringwald     clip_type = 0;
2429cae807eSMatthias Ringwald     memset(clip_number, 0, sizeof(clip_number));
243d0c20769SMatthias Ringwald }
244d0c20769SMatthias Ringwald 
245d0c20769SMatthias Ringwald static void delete_call(int delete_index_in_table){
246d0c20769SMatthias Ringwald     int i ;
247d0c20769SMatthias Ringwald     for (i = 0; i < HFP_GSM_MAX_NR_CALLS; i++){
248d0c20769SMatthias Ringwald         if (gsm_calls[i].index > gsm_calls[delete_index_in_table].index){
249d0c20769SMatthias Ringwald             gsm_calls[i].index--;
250d0c20769SMatthias Ringwald         }
251d0c20769SMatthias Ringwald     }
25266a048abSMatthias Ringwald     free_call_slot(delete_index_in_table);
253d0c20769SMatthias Ringwald 
254d0c20769SMatthias Ringwald     gsm_calls[delete_index_in_table].clip_type = 0;
255d0c20769SMatthias Ringwald     gsm_calls[delete_index_in_table].index = 0;
256d0c20769SMatthias Ringwald     gsm_calls[delete_index_in_table].clip_number[0] = '\0';
2579cae807eSMatthias Ringwald     gsm_calls[delete_index_in_table].mpty = HFP_ENHANCED_CALL_MPTY_NOT_A_CONFERENCE_CALL;
258d0c20769SMatthias Ringwald }
259d0c20769SMatthias Ringwald 
2609cae807eSMatthias Ringwald 
2619cae807eSMatthias Ringwald static void create_call(hfp_enhanced_call_dir_t direction){
262d0c20769SMatthias Ringwald     int next_free_slot = get_next_free_slot();
2639cae807eSMatthias Ringwald     gsm_calls[next_free_slot].direction = direction;
264d0c20769SMatthias Ringwald     gsm_calls[next_free_slot].index = next_call_index();
26566a048abSMatthias Ringwald     set_enhanced_call_status_initiated(next_free_slot);
266d0c20769SMatthias Ringwald     gsm_calls[next_free_slot].clip_type = 0;
267d0c20769SMatthias Ringwald     gsm_calls[next_free_slot].clip_number[0] = '\0';
2689cae807eSMatthias Ringwald     gsm_calls[next_free_slot].mpty = HFP_ENHANCED_CALL_MPTY_NOT_A_CONFERENCE_CALL;
269d0c20769SMatthias Ringwald 
270d0c20769SMatthias Ringwald     hfp_gsm_set_clip(next_free_slot, clip_type, clip_number);
271d0c20769SMatthias Ringwald }
272d0c20769SMatthias Ringwald 
2739cae807eSMatthias Ringwald 
2749cae807eSMatthias Ringwald int hfp_gsm_get_number_of_calls(void){
2759cae807eSMatthias Ringwald     return HFP_GSM_MAX_NR_CALLS - get_number_none_calls();
2769cae807eSMatthias Ringwald }
2779cae807eSMatthias Ringwald 
2789cae807eSMatthias Ringwald void hfp_gsm_clear_last_dialed_number(void){
2799cae807eSMatthias Ringwald     memset(last_dialed_number, 0, sizeof(last_dialed_number));
2809cae807eSMatthias Ringwald }
2819cae807eSMatthias Ringwald 
2829cae807eSMatthias Ringwald char * hfp_gsm_last_dialed_number(void){
2839cae807eSMatthias Ringwald     return &last_dialed_number[0];
2849cae807eSMatthias Ringwald }
2859cae807eSMatthias Ringwald 
2869cae807eSMatthias Ringwald hfp_gsm_call_t * hfp_gsm_call(int call_index){
2879cae807eSMatthias Ringwald     int i;
2889cae807eSMatthias Ringwald 
2899cae807eSMatthias Ringwald     for (i = 0; i < HFP_GSM_MAX_NR_CALLS; i++){
2909cae807eSMatthias Ringwald         hfp_gsm_call_t * call = &gsm_calls[i];
2919cae807eSMatthias Ringwald         if (call->index != call_index) continue;
2929cae807eSMatthias Ringwald         return call;
2939cae807eSMatthias Ringwald     }
2949cae807eSMatthias Ringwald     return NULL;
2959cae807eSMatthias Ringwald }
2969cae807eSMatthias Ringwald 
2979cae807eSMatthias Ringwald uint8_t hfp_gsm_clip_type(void){
298d0c20769SMatthias Ringwald     if (clip_type != 0) return clip_type;
299d0c20769SMatthias Ringwald 
300d0c20769SMatthias Ringwald     int initiated_call_index = get_initiated_call_index();
301d0c20769SMatthias Ringwald     if (initiated_call_index != -1){
302d0c20769SMatthias Ringwald         if (gsm_calls[initiated_call_index].clip_type != 0) {
303d0c20769SMatthias Ringwald             return gsm_calls[initiated_call_index].clip_type;
304d0c20769SMatthias Ringwald         }
305d0c20769SMatthias Ringwald     }
306d0c20769SMatthias Ringwald 
307d0c20769SMatthias Ringwald     int active_call_index = get_active_call_index();
308d0c20769SMatthias Ringwald     if (active_call_index != -1){
309d0c20769SMatthias Ringwald         if (gsm_calls[active_call_index].clip_type != 0) {
310d0c20769SMatthias Ringwald             return gsm_calls[active_call_index].clip_type;
311d0c20769SMatthias Ringwald         }
312d0c20769SMatthias Ringwald     }
313d0c20769SMatthias Ringwald     return 0;
314d0c20769SMatthias Ringwald }
315d0c20769SMatthias Ringwald 
3169cae807eSMatthias Ringwald char *  hfp_gsm_clip_number(void){
3179cae807eSMatthias Ringwald     if (strlen(clip_number) != 0) return clip_number;
318d0c20769SMatthias Ringwald 
319d0c20769SMatthias Ringwald     int initiated_call_index = get_initiated_call_index();
320d0c20769SMatthias Ringwald     if (initiated_call_index != -1){
321d0c20769SMatthias Ringwald         if (gsm_calls[initiated_call_index].clip_type != 0) {
322d0c20769SMatthias Ringwald             return gsm_calls[initiated_call_index].clip_number;
323d0c20769SMatthias Ringwald         }
324d0c20769SMatthias Ringwald     }
325d0c20769SMatthias Ringwald 
326d0c20769SMatthias Ringwald     int active_call_index = get_active_call_index();
327d0c20769SMatthias Ringwald     if (active_call_index != -1){
328d0c20769SMatthias Ringwald         if (gsm_calls[active_call_index].clip_type != 0) {
329d0c20769SMatthias Ringwald             return gsm_calls[active_call_index].clip_number;
330d0c20769SMatthias Ringwald         }
331d0c20769SMatthias Ringwald     }
332d0c20769SMatthias Ringwald     clip_number[0] = 0;
333d0c20769SMatthias Ringwald     return clip_number;
334d0c20769SMatthias Ringwald }
335d0c20769SMatthias Ringwald 
3369cae807eSMatthias Ringwald hfp_call_status_t hfp_gsm_call_status(void){
337d210d9c4SMatthias Ringwald     if (get_number_active_calls() + get_number_held_calls() + get_number_response_held_calls()){
33874386ee0SMatthias Ringwald         return HFP_CALL_STATUS_ACTIVE_OR_HELD_CALL_IS_PRESENT;
33974386ee0SMatthias Ringwald     }
34074386ee0SMatthias Ringwald     return HFP_CALL_STATUS_NO_HELD_OR_ACTIVE_CALLS;
34174386ee0SMatthias Ringwald }
34274386ee0SMatthias Ringwald 
3439cae807eSMatthias Ringwald hfp_callheld_status_t hfp_gsm_callheld_status(void){
34474386ee0SMatthias Ringwald     // @note: order is important
34574386ee0SMatthias Ringwald     if (get_number_held_calls() == 0){
34674386ee0SMatthias Ringwald         return HFP_CALLHELD_STATUS_NO_CALLS_HELD;
34774386ee0SMatthias Ringwald     }
34874386ee0SMatthias Ringwald     if (get_number_active_calls() == 0) {
34974386ee0SMatthias Ringwald         return HFP_CALLHELD_STATUS_CALL_ON_HOLD_AND_NO_ACTIVE_CALLS;
35074386ee0SMatthias Ringwald     }
35174386ee0SMatthias Ringwald     return HFP_CALLHELD_STATUS_CALL_ON_HOLD_OR_SWAPPED;
35274386ee0SMatthias Ringwald }
35374386ee0SMatthias Ringwald 
3549cae807eSMatthias Ringwald hfp_callsetup_status_t hfp_gsm_callsetup_status(void){
35574386ee0SMatthias Ringwald     return callsetup_status;
35674386ee0SMatthias Ringwald }
35774386ee0SMatthias Ringwald 
3589cae807eSMatthias Ringwald static int hfp_gsm_response_held_active(void){
359d210d9c4SMatthias Ringwald     return get_response_held_call_index() != -1 ;
360d210d9c4SMatthias Ringwald }
361d210d9c4SMatthias Ringwald 
362d210d9c4SMatthias Ringwald int hfp_gsm_call_possible(void){
363d210d9c4SMatthias Ringwald     return get_number_none_calls() > 0;
364d210d9c4SMatthias Ringwald }
365d210d9c4SMatthias Ringwald 
36674386ee0SMatthias Ringwald void hfp_gsm_handle_event(hfp_ag_call_event_t event){
367d0c20769SMatthias Ringwald     hfp_gsm_handler(event, 0, 0, NULL);
368d0c20769SMatthias Ringwald }
369d0c20769SMatthias Ringwald 
370d0c20769SMatthias Ringwald void hfp_gsm_handle_event_with_clip(hfp_ag_call_event_t event, uint8_t type, const char * number){
371d0c20769SMatthias Ringwald     hfp_gsm_handler(event, 0, type, number);
372d0c20769SMatthias Ringwald }
373d0c20769SMatthias Ringwald 
374d0c20769SMatthias Ringwald void hfp_gsm_handle_event_with_call_index(hfp_ag_call_event_t event, uint8_t index){
375d0c20769SMatthias Ringwald     hfp_gsm_handler(event, index, 0, NULL);
376d0c20769SMatthias Ringwald }
377d0c20769SMatthias Ringwald 
3789cae807eSMatthias Ringwald void hfp_gsm_handle_event_with_call_number(hfp_ag_call_event_t event, const char * number){
3799cae807eSMatthias Ringwald     hfp_gsm_handler(event, 0, 0, number);
3809cae807eSMatthias Ringwald }
3819cae807eSMatthias Ringwald 
382d0c20769SMatthias Ringwald static void hfp_gsm_handler(hfp_ag_call_event_t event, uint8_t index, uint8_t type, const char * number){
383d0c20769SMatthias Ringwald     int next_free_slot = get_next_free_slot();
38474386ee0SMatthias Ringwald     int current_call_index = get_active_call_index();
385d210d9c4SMatthias Ringwald     int initiated_call_index = get_initiated_call_index();
386d210d9c4SMatthias Ringwald     int held_call_index = get_held_call_index();
387d0c20769SMatthias Ringwald     int i;
388d0c20769SMatthias Ringwald 
38974386ee0SMatthias Ringwald     switch (event){
39074386ee0SMatthias Ringwald         case HFP_AG_OUTGOING_CALL_INITIATED:
39174386ee0SMatthias Ringwald         case HFP_AG_OUTGOING_REDIAL_INITIATED:
39274386ee0SMatthias Ringwald             if (next_free_slot == -1){
393d210d9c4SMatthias Ringwald                 log_error("gsm: max call nr exceeded");
39474386ee0SMatthias Ringwald                 return;
39574386ee0SMatthias Ringwald             }
3969cae807eSMatthias Ringwald             create_call(HFP_ENHANCED_CALL_DIR_OUTGOING);
397d210d9c4SMatthias Ringwald             break;
39874386ee0SMatthias Ringwald 
399d210d9c4SMatthias Ringwald         case HFP_AG_OUTGOING_CALL_REJECTED:
400d210d9c4SMatthias Ringwald             if (current_call_index != -1){
401d0c20769SMatthias Ringwald                 delete_call(current_call_index);
402d210d9c4SMatthias Ringwald             }
40366a048abSMatthias Ringwald             set_callsetup_status(HFP_CALLSETUP_STATUS_NO_CALL_SETUP_IN_PROGRESS);
404d210d9c4SMatthias Ringwald             break;
405d210d9c4SMatthias Ringwald 
406d210d9c4SMatthias Ringwald         case HFP_AG_OUTGOING_CALL_ACCEPTED:
40774386ee0SMatthias Ringwald             if (current_call_index != -1){
40866a048abSMatthias Ringwald                 set_enhanced_call_status_held(current_call_index);
40974386ee0SMatthias Ringwald             }
41066a048abSMatthias Ringwald             set_callsetup_status(HFP_CALLSETUP_STATUS_OUTGOING_CALL_SETUP_IN_DIALING_STATE);
41174386ee0SMatthias Ringwald             break;
412d210d9c4SMatthias Ringwald 
41374386ee0SMatthias Ringwald         case HFP_AG_OUTGOING_CALL_RINGING:
414d210d9c4SMatthias Ringwald             if (current_call_index == -1){
415d210d9c4SMatthias Ringwald                 log_error("gsm: no active call");
416d210d9c4SMatthias Ringwald                 return;
417d210d9c4SMatthias Ringwald             }
41866a048abSMatthias Ringwald             set_callsetup_status(HFP_CALLSETUP_STATUS_OUTGOING_CALL_SETUP_IN_ALERTING_STATE);
41974386ee0SMatthias Ringwald             break;
42074386ee0SMatthias Ringwald         case HFP_AG_OUTGOING_CALL_ESTABLISHED:
42166a048abSMatthias Ringwald             set_callsetup_status(HFP_CALLSETUP_STATUS_NO_CALL_SETUP_IN_PROGRESS);
42266a048abSMatthias Ringwald             set_enhanced_call_status_active(initiated_call_index);
42374386ee0SMatthias Ringwald             break;
424d210d9c4SMatthias Ringwald 
425d210d9c4SMatthias Ringwald         case HFP_AG_INCOMING_CALL:
426d210d9c4SMatthias Ringwald             if (hfp_gsm_callsetup_status() != HFP_CALLSETUP_STATUS_NO_CALL_SETUP_IN_PROGRESS) break;
42766a048abSMatthias Ringwald             set_callsetup_status(HFP_CALLSETUP_STATUS_INCOMING_CALL_SETUP_IN_PROGRESS);
4289cae807eSMatthias Ringwald             create_call(HFP_ENHANCED_CALL_DIR_INCOMING);
429d210d9c4SMatthias Ringwald             break;
430d210d9c4SMatthias Ringwald 
431d210d9c4SMatthias Ringwald         case HFP_AG_INCOMING_CALL_ACCEPTED_BY_AG:
432d210d9c4SMatthias Ringwald             if (hfp_gsm_callsetup_status() != HFP_CALLSETUP_STATUS_INCOMING_CALL_SETUP_IN_PROGRESS) break;
43366a048abSMatthias Ringwald             set_callsetup_status(HFP_CALLSETUP_STATUS_NO_CALL_SETUP_IN_PROGRESS);
434d210d9c4SMatthias Ringwald 
435d210d9c4SMatthias Ringwald             if (hfp_gsm_call_status() == HFP_CALL_STATUS_ACTIVE_OR_HELD_CALL_IS_PRESENT){
43666a048abSMatthias Ringwald                 set_enhanced_call_status_held(current_call_index);
437d210d9c4SMatthias Ringwald             }
43866a048abSMatthias Ringwald             set_enhanced_call_status_active(initiated_call_index);
439d210d9c4SMatthias Ringwald             break;
440d210d9c4SMatthias Ringwald 
441d210d9c4SMatthias Ringwald         case HFP_AG_HELD_CALL_JOINED_BY_AG:
442d210d9c4SMatthias Ringwald             if (hfp_gsm_call_status() != HFP_CALL_STATUS_ACTIVE_OR_HELD_CALL_IS_PRESENT) break;
443d210d9c4SMatthias Ringwald 
444d210d9c4SMatthias Ringwald             // TODO: is following condition correct? Can we join incoming call before it is answered?
445d210d9c4SMatthias Ringwald             if (callsetup_status == HFP_CALLSETUP_STATUS_INCOMING_CALL_SETUP_IN_PROGRESS){
44666a048abSMatthias Ringwald                 set_enhanced_call_status_active(initiated_call_index);
44766a048abSMatthias Ringwald                 set_callsetup_status(HFP_CALLSETUP_STATUS_NO_CALL_SETUP_IN_PROGRESS);
4489cae807eSMatthias Ringwald             } else if (hfp_gsm_callheld_status() == HFP_CALLHELD_STATUS_CALL_ON_HOLD_OR_SWAPPED) {
44966a048abSMatthias Ringwald                 set_enhanced_call_status_active(held_call_index);
450d210d9c4SMatthias Ringwald             }
451d210d9c4SMatthias Ringwald 
4529cae807eSMatthias Ringwald             for (i = 0; i < HFP_GSM_MAX_NR_CALLS; i++){
45366a048abSMatthias Ringwald                 if (is_enhanced_call_status_active(i)){
4549cae807eSMatthias Ringwald                     gsm_calls[i].mpty = HFP_ENHANCED_CALL_MPTY_CONFERENCE_CALL;
4559cae807eSMatthias Ringwald                 }
456d210d9c4SMatthias Ringwald             }
457d210d9c4SMatthias Ringwald             break;
458d210d9c4SMatthias Ringwald 
459d210d9c4SMatthias Ringwald         case HFP_AG_INCOMING_CALL_ACCEPTED_BY_HF:
460d210d9c4SMatthias Ringwald             if (hfp_gsm_callsetup_status() != HFP_CALLSETUP_STATUS_INCOMING_CALL_SETUP_IN_PROGRESS) break;
461d210d9c4SMatthias Ringwald             if (hfp_gsm_call_status() != HFP_CALL_STATUS_NO_HELD_OR_ACTIVE_CALLS) break;
46266a048abSMatthias Ringwald             set_callsetup_status(HFP_CALLSETUP_STATUS_NO_CALL_SETUP_IN_PROGRESS);
46366a048abSMatthias Ringwald             set_enhanced_call_status_active(initiated_call_index);
464d210d9c4SMatthias Ringwald             break;
465d210d9c4SMatthias Ringwald 
466d210d9c4SMatthias Ringwald         case HFP_AG_RESPONSE_AND_HOLD_ACCEPT_INCOMING_CALL_BY_AG:
467d210d9c4SMatthias Ringwald         case HFP_AG_RESPONSE_AND_HOLD_ACCEPT_INCOMING_CALL_BY_HF:
468d210d9c4SMatthias Ringwald             if (hfp_gsm_callsetup_status() != HFP_CALLSETUP_STATUS_INCOMING_CALL_SETUP_IN_PROGRESS) break;
469d210d9c4SMatthias Ringwald             if (hfp_gsm_call_status() != HFP_CALL_STATUS_NO_HELD_OR_ACTIVE_CALLS) break;
47066a048abSMatthias Ringwald             set_callsetup_status(HFP_CALLSETUP_STATUS_NO_CALL_SETUP_IN_PROGRESS);
47166a048abSMatthias Ringwald             set_enhanced_call_status_response_hold(initiated_call_index);
472d210d9c4SMatthias Ringwald             break;
473d210d9c4SMatthias Ringwald 
474d210d9c4SMatthias Ringwald         case HFP_AG_RESPONSE_AND_HOLD_ACCEPT_HELD_CALL_BY_AG:
475d210d9c4SMatthias Ringwald         case HFP_AG_RESPONSE_AND_HOLD_ACCEPT_HELD_CALL_BY_HF:
476d210d9c4SMatthias Ringwald             if (!hfp_gsm_response_held_active()) break;
47766a048abSMatthias Ringwald             set_enhanced_call_status_active(get_response_held_call_index());
478d210d9c4SMatthias Ringwald             break;
479d210d9c4SMatthias Ringwald 
480d210d9c4SMatthias Ringwald         case HFP_AG_RESPONSE_AND_HOLD_REJECT_HELD_CALL_BY_AG:
481d210d9c4SMatthias Ringwald         case HFP_AG_RESPONSE_AND_HOLD_REJECT_HELD_CALL_BY_HF:
482d210d9c4SMatthias Ringwald             if (!hfp_gsm_response_held_active()) break;
483d0c20769SMatthias Ringwald             delete_call(get_response_held_call_index());
484d210d9c4SMatthias Ringwald             break;
485d210d9c4SMatthias Ringwald 
486d210d9c4SMatthias Ringwald 
487d210d9c4SMatthias Ringwald         case HFP_AG_TERMINATE_CALL_BY_HF:
488d210d9c4SMatthias Ringwald             switch (hfp_gsm_call_status()){
489d210d9c4SMatthias Ringwald                 case HFP_CALL_STATUS_NO_HELD_OR_ACTIVE_CALLS:
49066a048abSMatthias Ringwald                     set_callsetup_status(HFP_CALLSETUP_STATUS_NO_CALL_SETUP_IN_PROGRESS);
491d210d9c4SMatthias Ringwald                     break;
492d210d9c4SMatthias Ringwald                 case HFP_CALL_STATUS_ACTIVE_OR_HELD_CALL_IS_PRESENT:
493d0c20769SMatthias Ringwald                     delete_call(current_call_index);
494d210d9c4SMatthias Ringwald                     break;
495*7bbeb3adSMilanka Ringwald                 default:
496*7bbeb3adSMilanka Ringwald                     break;
497d210d9c4SMatthias Ringwald             }
498d210d9c4SMatthias Ringwald             break;
499d210d9c4SMatthias Ringwald 
500d210d9c4SMatthias Ringwald         case HFP_AG_TERMINATE_CALL_BY_AG:
501d210d9c4SMatthias Ringwald             switch (hfp_gsm_call_status()){
502d210d9c4SMatthias Ringwald                 case HFP_CALL_STATUS_NO_HELD_OR_ACTIVE_CALLS:
503d210d9c4SMatthias Ringwald                     if (hfp_gsm_callsetup_status() != HFP_CALLSETUP_STATUS_INCOMING_CALL_SETUP_IN_PROGRESS) break;
50466a048abSMatthias Ringwald                     set_callsetup_status(HFP_CALLSETUP_STATUS_NO_CALL_SETUP_IN_PROGRESS);
505d210d9c4SMatthias Ringwald                     break;
506d210d9c4SMatthias Ringwald                 case HFP_CALL_STATUS_ACTIVE_OR_HELD_CALL_IS_PRESENT:
50766a048abSMatthias Ringwald                     set_callsetup_status(HFP_CALLSETUP_STATUS_NO_CALL_SETUP_IN_PROGRESS);
508d0c20769SMatthias Ringwald                     delete_call(current_call_index);
509d210d9c4SMatthias Ringwald                     break;
510d210d9c4SMatthias Ringwald                 default:
511d210d9c4SMatthias Ringwald                     break;
512d210d9c4SMatthias Ringwald             }
513d210d9c4SMatthias Ringwald             break;
514d210d9c4SMatthias Ringwald 
515d0c20769SMatthias Ringwald         case HFP_AG_CALL_DROPPED:
51666a048abSMatthias Ringwald             set_callsetup_status(HFP_CALLSETUP_STATUS_NO_CALL_SETUP_IN_PROGRESS);
517d210d9c4SMatthias Ringwald             if (hfp_gsm_call_status() != HFP_CALL_STATUS_ACTIVE_OR_HELD_CALL_IS_PRESENT) break;
518d210d9c4SMatthias Ringwald 
519d210d9c4SMatthias Ringwald             for (i = 0; i < HFP_GSM_MAX_NR_CALLS; i++){
520d0c20769SMatthias Ringwald                 delete_call(i);
521d210d9c4SMatthias Ringwald             }
522d210d9c4SMatthias Ringwald             break;
523d0c20769SMatthias Ringwald 
524d210d9c4SMatthias Ringwald         case HFP_AG_CALL_HOLD_USER_BUSY:
525d210d9c4SMatthias Ringwald             // Held or waiting call gets active,
52666a048abSMatthias Ringwald             set_callsetup_status(HFP_CALLSETUP_STATUS_NO_CALL_SETUP_IN_PROGRESS);
52766a048abSMatthias Ringwald             free_call_slot(initiated_call_index);
52866a048abSMatthias Ringwald             set_enhanced_call_status_active(held_call_index);
529d210d9c4SMatthias Ringwald             break;
530d210d9c4SMatthias Ringwald 
531d0c20769SMatthias Ringwald         case HFP_AG_CALL_HOLD_RELEASE_ACTIVE_ACCEPT_HELD_OR_WAITING_CALL:
532c1ab6cc1SMatthias Ringwald             if ((index != 0) && (index <= HFP_GSM_MAX_NR_CALLS) ){
533d0c20769SMatthias Ringwald                 for (i = 0; i < HFP_GSM_MAX_NR_CALLS; i++){
534d0c20769SMatthias Ringwald                     if (gsm_calls[i].index == index){
535d0c20769SMatthias Ringwald                         delete_call(i);
536d0c20769SMatthias Ringwald                         continue;
537d0c20769SMatthias Ringwald                     }
538d0c20769SMatthias Ringwald                 }
539d0c20769SMatthias Ringwald             } else {
540d210d9c4SMatthias Ringwald                 for (i = 0; i < HFP_GSM_MAX_NR_CALLS; i++){
54166a048abSMatthias Ringwald                     if (is_enhanced_call_status_active(i)){
542d0c20769SMatthias Ringwald                         delete_call(i);
543d0c20769SMatthias Ringwald                     }
544d210d9c4SMatthias Ringwald                 }
545d210d9c4SMatthias Ringwald             }
546d210d9c4SMatthias Ringwald 
547d210d9c4SMatthias Ringwald             if (callsetup_status != HFP_CALLSETUP_STATUS_NO_CALL_SETUP_IN_PROGRESS){
54866a048abSMatthias Ringwald                 set_enhanced_call_status_active(initiated_call_index);
549d210d9c4SMatthias Ringwald             } else {
55066a048abSMatthias Ringwald                 set_enhanced_call_status_active(held_call_index);
551d210d9c4SMatthias Ringwald             }
552d0c20769SMatthias Ringwald 
55366a048abSMatthias Ringwald             set_callsetup_status(HFP_CALLSETUP_STATUS_NO_CALL_SETUP_IN_PROGRESS);
554d210d9c4SMatthias Ringwald             break;
555d0c20769SMatthias Ringwald 
556d0c20769SMatthias Ringwald         case HFP_AG_CALL_HOLD_PARK_ACTIVE_ACCEPT_HELD_OR_WAITING_CALL:
557d210d9c4SMatthias Ringwald             for (i = 0; i < HFP_GSM_MAX_NR_CALLS; i++){
558c1ab6cc1SMatthias Ringwald                 if (is_enhanced_call_status_active(i) && (gsm_calls[i].index != index)){
55966a048abSMatthias Ringwald                     set_enhanced_call_status_held(i);
560d210d9c4SMatthias Ringwald                 }
561d210d9c4SMatthias Ringwald             }
562d210d9c4SMatthias Ringwald 
563d210d9c4SMatthias Ringwald             if (callsetup_status != HFP_CALLSETUP_STATUS_NO_CALL_SETUP_IN_PROGRESS){
56466a048abSMatthias Ringwald                 set_enhanced_call_status_active(initiated_call_index);
565d210d9c4SMatthias Ringwald             } else {
56666a048abSMatthias Ringwald                 set_enhanced_call_status_active(held_call_index);
567d210d9c4SMatthias Ringwald             }
56866a048abSMatthias Ringwald             set_callsetup_status(HFP_CALLSETUP_STATUS_NO_CALL_SETUP_IN_PROGRESS);
569d210d9c4SMatthias Ringwald             break;
570d0c20769SMatthias Ringwald 
571d0c20769SMatthias Ringwald         case HFP_AG_CALL_HOLD_ADD_HELD_CALL:
572d210d9c4SMatthias Ringwald             if (hfp_gsm_callheld_status() != HFP_CALLHELD_STATUS_NO_CALLS_HELD){
573d210d9c4SMatthias Ringwald                 for (i = 0; i < HFP_GSM_MAX_NR_CALLS; i++){
57466a048abSMatthias Ringwald                     if (gsm_calls[i].used_slot){
57566a048abSMatthias Ringwald                         set_enhanced_call_status_active(i);
5769cae807eSMatthias Ringwald                         gsm_calls[i].mpty = HFP_ENHANCED_CALL_MPTY_CONFERENCE_CALL;
577d210d9c4SMatthias Ringwald                     }
578d210d9c4SMatthias Ringwald                 }
579d210d9c4SMatthias Ringwald             }
580d210d9c4SMatthias Ringwald             break;
581d0c20769SMatthias Ringwald 
582d0c20769SMatthias Ringwald         case HFP_AG_CALL_HOLD_EXIT_AND_JOIN_CALLS:
583d210d9c4SMatthias Ringwald             for (i = 0; i < HFP_GSM_MAX_NR_CALLS; i++){
584d0c20769SMatthias Ringwald                 delete_call(i);
585d210d9c4SMatthias Ringwald             }
586d0c20769SMatthias Ringwald             break;
587d210d9c4SMatthias Ringwald 
588d0c20769SMatthias Ringwald         case HFP_AG_SET_CLIP:
589d0c20769SMatthias Ringwald             if (initiated_call_index != -1){
590d0c20769SMatthias Ringwald                 hfp_gsm_set_clip(initiated_call_index, type, number);
591d210d9c4SMatthias Ringwald                 break;
592d210d9c4SMatthias Ringwald             }
5939cae807eSMatthias Ringwald 
594d0c20769SMatthias Ringwald             clip_type = type;
595d0c20769SMatthias Ringwald             strncpy(clip_number, number, sizeof(clip_number));
596d0c20769SMatthias Ringwald             clip_number[sizeof(clip_number)-1] = '\0';
597d0c20769SMatthias Ringwald 
598d0c20769SMatthias Ringwald             break;
59974386ee0SMatthias Ringwald         default:
60074386ee0SMatthias Ringwald             break;
60174386ee0SMatthias Ringwald     }
60274386ee0SMatthias Ringwald }
603