hsp_hs.c (99a1006758b1c3699c20f18ef38ff35741fe6eb2) hsp_hs.c (fffdd288575b1b4b1bf0e7fec3011e209f5de43f)
1/*
2 * Copyright (C) 2014 BlueKitchen GmbH
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
6 * are met:
7 *
8 * 1. Redistributions of source code must retain the above copyright

--- 98 unchanged lines hidden (view full) ---

107 HSP_W4_SCO_CONNECTED,
108
109 HSP_AUDIO_CONNECTION_ESTABLISHED,
110
111 HSP_W2_DISCONNECT_SCO,
112 HSP_W4_SCO_DISCONNECTED,
113
114 HSP_W2_DISCONNECT_RFCOMM,
1/*
2 * Copyright (C) 2014 BlueKitchen GmbH
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
6 * are met:
7 *
8 * 1. Redistributions of source code must retain the above copyright

--- 98 unchanged lines hidden (view full) ---

107 HSP_W4_SCO_CONNECTED,
108
109 HSP_AUDIO_CONNECTION_ESTABLISHED,
110
111 HSP_W2_DISCONNECT_SCO,
112 HSP_W4_SCO_DISCONNECTED,
113
114 HSP_W2_DISCONNECT_RFCOMM,
115 HSP_W4_RFCOMM_DISCONNECTED,
116 HSP_W4_RFCOMM_DISCONNECTED_AND_RESTART,
115 HSP_W4_RFCOMM_DISCONNECTED,
117 HSP_W4_CONNECTION_ESTABLISHED_TO_SHUTDOWN
118} hsp_state_t;
119
120static hsp_state_t hsp_state = HSP_IDLE;
121
122static void hsp_run(void);
123static void packet_handler (uint8_t packet_type, uint16_t channel, uint8_t *packet, uint16_t size);
124static void handle_query_rfcomm_event(uint8_t packet_type, uint16_t channel, uint8_t *packet, uint16_t size);

--- 135 unchanged lines hidden (view full) ---

260static void hsp_hs_reset_state(void){
261 hsp_state = HSP_IDLE;
262 hs_microphone_gain = -1;
263 hs_speaker_gain = -1;
264
265 hs_send_button_press = 0;
266 wait_ok = 0;
267 hs_support_custom_indications = 0;
116 HSP_W4_CONNECTION_ESTABLISHED_TO_SHUTDOWN
117} hsp_state_t;
118
119static hsp_state_t hsp_state = HSP_IDLE;
120
121static void hsp_run(void);
122static void packet_handler (uint8_t packet_type, uint16_t channel, uint8_t *packet, uint16_t size);
123static void handle_query_rfcomm_event(uint8_t packet_type, uint16_t channel, uint8_t *packet, uint16_t size);

--- 135 unchanged lines hidden (view full) ---

259static void hsp_hs_reset_state(void){
260 hsp_state = HSP_IDLE;
261 hs_microphone_gain = -1;
262 hs_speaker_gain = -1;
263
264 hs_send_button_press = 0;
265 wait_ok = 0;
266 hs_support_custom_indications = 0;
267
268 hsp_disconnect_rfcomm = 0;
269 hsp_establish_audio_connection = 0;
270 hsp_release_audio_connection = 0;
268}
269
270void hsp_hs_init(uint8_t rfcomm_channel_nr){
271 // register for HCI events
272 hci_event_callback_registration.callback = &packet_handler;
273 hci_add_event_handler(&hci_event_callback_registration);
274
275 // init L2CAP

--- 26 unchanged lines hidden (view full) ---

302 return;
303 }
304
305 if (hsp_state < HSP_W4_SCO_CONNECTED){
306 hsp_state = HSP_W2_DISCONNECT_RFCOMM;
307 return;
308 }
309
271}
272
273void hsp_hs_init(uint8_t rfcomm_channel_nr){
274 // register for HCI events
275 hci_event_callback_registration.callback = &packet_handler;
276 hci_add_event_handler(&hci_event_callback_registration);
277
278 // init L2CAP

--- 26 unchanged lines hidden (view full) ---

305 return;
306 }
307
308 if (hsp_state < HSP_W4_SCO_CONNECTED){
309 hsp_state = HSP_W2_DISCONNECT_RFCOMM;
310 return;
311 }
312
310 if (hsp_state < HSP_W4_SCO_DISCONNECTED){
311 hsp_state = HSP_W2_DISCONNECT_SCO;
312 return;
313 }
314 hsp_disconnect_rfcomm = 1;
315 hsp_run();
316}
317
318
319void hsp_hs_establish_audio_connection(void){
320 switch (hsp_state){
321 case HSP_RFCOMM_CONNECTION_ESTABLISHED:

--- 70 unchanged lines hidden (view full) ---

392
393 switch (hsp_state){
394 case HSP_SDP_QUERY_RFCOMM_CHANNEL:
395 hsp_state = HSP_W4_SDP_QUERY_COMPLETE;
396 sdp_client_query_rfcomm_channel_and_name_for_uuid(&handle_query_rfcomm_event, remote, SDP_Headset_AG);
397 break;
398
399 case HSP_AUDIO_CONNECTION_ESTABLISHED:
313 hsp_disconnect_rfcomm = 1;
314 hsp_run();
315}
316
317
318void hsp_hs_establish_audio_connection(void){
319 switch (hsp_state){
320 case HSP_RFCOMM_CONNECTION_ESTABLISHED:

--- 70 unchanged lines hidden (view full) ---

391
392 switch (hsp_state){
393 case HSP_SDP_QUERY_RFCOMM_CHANNEL:
394 hsp_state = HSP_W4_SDP_QUERY_COMPLETE;
395 sdp_client_query_rfcomm_channel_and_name_for_uuid(&handle_query_rfcomm_event, remote, SDP_Headset_AG);
396 break;
397
398 case HSP_AUDIO_CONNECTION_ESTABLISHED:
400 case HSP_RFCOMM_CONNECTION_ESTABLISHED :
399 case HSP_RFCOMM_CONNECTION_ESTABLISHED:
401
402 if (hs_microphone_gain >= 0){
403 char buffer[20];
404 sprintf(buffer, "%s=%d\r\n", HSP_HS_MICROPHONE_GAIN, hs_microphone_gain);
405 hsp_hs_send_str_over_rfcomm(rfcomm_cid, buffer);
406 hs_microphone_gain = -1;
407 break;
408 }

--- 145 unchanged lines hidden (view full) ---

554 case RFCOMM_EVENT_CAN_SEND_NOW:
555 hsp_hs_callback(packet, size);
556 break;
557
558 case HCI_EVENT_DISCONNECTION_COMPLETE:
559 handle = little_endian_read_16(packet,3);
560 if (handle == sco_handle){
561 sco_handle = 0;
400
401 if (hs_microphone_gain >= 0){
402 char buffer[20];
403 sprintf(buffer, "%s=%d\r\n", HSP_HS_MICROPHONE_GAIN, hs_microphone_gain);
404 hsp_hs_send_str_over_rfcomm(rfcomm_cid, buffer);
405 hs_microphone_gain = -1;
406 break;
407 }

--- 145 unchanged lines hidden (view full) ---

553 case RFCOMM_EVENT_CAN_SEND_NOW:
554 hsp_hs_callback(packet, size);
555 break;
556
557 case HCI_EVENT_DISCONNECTION_COMPLETE:
558 handle = little_endian_read_16(packet,3);
559 if (handle == sco_handle){
560 sco_handle = 0;
562 hsp_state = HSP_RFCOMM_CONNECTION_ESTABLISHED ;
563 hsp_hs_reset_state();
561 hsp_state = HSP_RFCOMM_CONNECTION_ESTABLISHED;
564 emit_event(HSP_SUBEVENT_AUDIO_DISCONNECTION_COMPLETE,0);
565 break;
566 }
567 if (handle == rfcomm_handle) {
568 rfcomm_handle = 0;
569 hsp_state = HSP_IDLE;
562 emit_event(HSP_SUBEVENT_AUDIO_DISCONNECTION_COMPLETE,0);
563 break;
564 }
565 if (handle == rfcomm_handle) {
566 rfcomm_handle = 0;
567 hsp_state = HSP_IDLE;
570 hsp_hs_callback(packet, size);
568 emit_event(HSP_SUBEVENT_RFCOMM_DISCONNECTION_COMPLETE,0);
571 hsp_hs_reset_state();
572 }
573 break;
574 case RFCOMM_EVENT_CHANNEL_CLOSED:
575 hsp_hs_reset_state();
576 hsp_hs_callback(packet, size);
577 break;
578 default:

--- 29 unchanged lines hidden ---
569 hsp_hs_reset_state();
570 }
571 break;
572 case RFCOMM_EVENT_CHANNEL_CLOSED:
573 hsp_hs_reset_state();
574 hsp_hs_callback(packet, size);
575 break;
576 default:

--- 29 unchanged lines hidden ---