mirror of
https://github.com/bluekitchen/btstack.git
synced 2025-03-28 08:37:22 +00:00
handle CTRL+C
This commit is contained in:
parent
c91d150bff
commit
5a78d89951
@ -48,7 +48,6 @@
|
|||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
|
|
||||||
#include <btstack/hci_cmds.h>
|
#include <btstack/hci_cmds.h>
|
||||||
#include <btstack/run_loop.h>
|
#include <btstack/run_loop.h>
|
||||||
|
|
||||||
@ -80,7 +79,6 @@ static uint8_t channel_nr = 0;
|
|||||||
|
|
||||||
static uint16_t mtu;
|
static uint16_t mtu;
|
||||||
static uint16_t rfcomm_cid = 0;
|
static uint16_t rfcomm_cid = 0;
|
||||||
|
|
||||||
static uint16_t sco_handle = 0;
|
static uint16_t sco_handle = 0;
|
||||||
static uint16_t rfcomm_handle = 0;
|
static uint16_t rfcomm_handle = 0;
|
||||||
|
|
||||||
@ -92,9 +90,7 @@ static uint8_t ag_ring = 0;
|
|||||||
static uint8_t ag_send_ok = 0;
|
static uint8_t ag_send_ok = 0;
|
||||||
static uint8_t ag_send_error = 0;
|
static uint8_t ag_send_error = 0;
|
||||||
|
|
||||||
static uint8_t spp_service_buffer[150];
|
static uint8_t hsp_service_buffer[150];
|
||||||
|
|
||||||
static void hsp_run();
|
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
HSP_IDLE,
|
HSP_IDLE,
|
||||||
@ -106,10 +102,25 @@ typedef enum {
|
|||||||
} hsp_state_t;
|
} hsp_state_t;
|
||||||
|
|
||||||
static hsp_state_t hsp_state = HSP_IDLE;
|
static hsp_state_t hsp_state = HSP_IDLE;
|
||||||
|
static void hsp_run();
|
||||||
|
|
||||||
// remote audio volume control
|
// remote audio volume control
|
||||||
// AG +VGM=13 [0..15] ; HS AT+VGM=6 | AG OK
|
// AG +VGM=13 [0..15] ; HS AT+VGM=6 | AG OK
|
||||||
|
|
||||||
|
void hsp_ag_init(){
|
||||||
|
hsp_state = HSP_IDLE;
|
||||||
|
|
||||||
|
rfcomm_cid = 0;
|
||||||
|
rfcomm_handle = 0;
|
||||||
|
sco_handle = 0;
|
||||||
|
|
||||||
|
ag_send_ok = 0;
|
||||||
|
ag_send_error = 0;
|
||||||
|
ag_ring = 0;
|
||||||
|
ag_microphone_gain = -1;
|
||||||
|
ag_speaker_gain = -1;
|
||||||
|
}
|
||||||
|
|
||||||
void hsp_ag_connect(bd_addr_t bd_addr){
|
void hsp_ag_connect(bd_addr_t bd_addr){
|
||||||
if (hsp_state != HSP_IDLE) return;
|
if (hsp_state != HSP_IDLE) return;
|
||||||
hsp_state = HSP_AG_QUERY_SDP_CHANNEL;
|
hsp_state = HSP_AG_QUERY_SDP_CHANNEL;
|
||||||
@ -163,19 +174,19 @@ static void hsp_run(){
|
|||||||
|
|
||||||
switch (hsp_state){
|
switch (hsp_state){
|
||||||
case HSP_AG_QUERY_SDP_CHANNEL:
|
case HSP_AG_QUERY_SDP_CHANNEL:
|
||||||
|
hsp_state = HSP_AG_W2_CONNECT_SCO;
|
||||||
printf("Start SDP RFCOMM Query for UUID 0x%02x\n", SDP_HSP);
|
printf("Start SDP RFCOMM Query for UUID 0x%02x\n", SDP_HSP);
|
||||||
sdp_query_rfcomm_channel_and_name_for_uuid(remote, SDP_HSP);
|
sdp_query_rfcomm_channel_and_name_for_uuid(remote, SDP_HSP);
|
||||||
hsp_state = HSP_AG_W2_CONNECT_SCO;
|
|
||||||
break;
|
break;
|
||||||
case HSP_AG_W2_CONNECT_SCO:
|
case HSP_AG_W2_CONNECT_SCO:
|
||||||
if (!hci_can_send_command_packet_now()) break;
|
if (!hci_can_send_command_packet_now()) break;
|
||||||
hci_send_cmd(&hci_setup_synchronous_connection_command, rfcomm_handle, 8000, 8000, 0xFFFF, 0x0060, 0xFF, 0x003F);
|
|
||||||
hsp_state = HSP_AG_W4_SCO_CONNECTED;
|
hsp_state = HSP_AG_W4_SCO_CONNECTED;
|
||||||
|
hci_send_cmd(&hci_setup_synchronous_connection_command, rfcomm_handle, 8000, 8000, 0xFFFF, 0x0060, 0xFF, 0x003F);
|
||||||
break;
|
break;
|
||||||
case HSP_AG_SEND_DISCONNECT:
|
case HSP_AG_SEND_DISCONNECT:
|
||||||
|
hsp_state = HSP_IDLE;
|
||||||
rfcomm_disconnect_internal(rfcomm_cid);
|
rfcomm_disconnect_internal(rfcomm_cid);
|
||||||
rfcomm_cid = 0;
|
rfcomm_cid = 0;
|
||||||
hsp_state = HSP_IDLE;
|
|
||||||
break;
|
break;
|
||||||
case HSP_AG_ACTIVE:
|
case HSP_AG_ACTIVE:
|
||||||
if (ag_send_ok){
|
if (ag_send_ok){
|
||||||
@ -226,7 +237,7 @@ static void packet_handler (void * connection, uint8_t packet_type, uint16_t cha
|
|||||||
strncmp((char *)packet, HSP_HS_SPEAKER_GAIN, 7) == 0){
|
strncmp((char *)packet, HSP_HS_SPEAKER_GAIN, 7) == 0){
|
||||||
// uint8_t gain = packet[8];
|
// uint8_t gain = packet[8];
|
||||||
// TODO: parse gain
|
// TODO: parse gain
|
||||||
// printf("Received changed gain info %c\n", gain);
|
printf("Received changed gain info %c\n", packet[8]);
|
||||||
ag_send_ok = 1;
|
ag_send_ok = 1;
|
||||||
} else if (strncmp((char *)packet, "AT+", 3) == 0){
|
} else if (strncmp((char *)packet, "AT+", 3) == 0){
|
||||||
//ag_send_error = 1;
|
//ag_send_error = 1;
|
||||||
@ -309,6 +320,7 @@ static void packet_handler (void * connection, uint8_t packet_type, uint16_t cha
|
|||||||
|
|
||||||
case RFCOMM_EVENT_INCOMING_CONNECTION:
|
case RFCOMM_EVENT_INCOMING_CONNECTION:
|
||||||
// data: event (8), len(8), address(48), channel (8), rfcomm_cid (16)
|
// data: event (8), len(8), address(48), channel (8), rfcomm_cid (16)
|
||||||
|
if (hsp_state != HSP_IDLE) return;
|
||||||
bt_flip_addr(event_addr, &packet[2]);
|
bt_flip_addr(event_addr, &packet[2]);
|
||||||
rfcomm_cid = READ_BT_16(packet, 9);
|
rfcomm_cid = READ_BT_16(packet, 9);
|
||||||
printf("RFCOMM channel %u requested for %s\n", packet[8], bd_addr_to_str(event_addr));
|
printf("RFCOMM channel %u requested for %s\n", packet[8], bd_addr_to_str(event_addr));
|
||||||
@ -344,16 +356,12 @@ static void packet_handler (void * connection, uint8_t packet_type, uint16_t cha
|
|||||||
case RFCOMM_EVENT_CREDITS:
|
case RFCOMM_EVENT_CREDITS:
|
||||||
if (!rfcomm_cid) {
|
if (!rfcomm_cid) {
|
||||||
hsp_state = HSP_IDLE;
|
hsp_state = HSP_IDLE;
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case RFCOMM_EVENT_CHANNEL_CLOSED:
|
case RFCOMM_EVENT_CHANNEL_CLOSED:
|
||||||
printf("RFCOMM channel closed\n");
|
printf("RFCOMM channel closed\n");
|
||||||
hsp_state = HSP_IDLE;
|
hsp_ag_init();
|
||||||
rfcomm_cid = 0;
|
|
||||||
rfcomm_handle = 0;
|
|
||||||
sco_handle = 0;
|
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
@ -539,11 +547,10 @@ int btstack_main(int argc, const char * argv[]){
|
|||||||
|
|
||||||
// init SDP, create record for SPP and register with SDP
|
// init SDP, create record for SPP and register with SDP
|
||||||
sdp_init();
|
sdp_init();
|
||||||
memset(spp_service_buffer, 0, sizeof(spp_service_buffer));
|
memset(hsp_service_buffer, 0, sizeof(hsp_service_buffer));
|
||||||
// TODO: create hsp hs record or ag sdp record;
|
// hsp_hs_create_service(hsp_service_buffer, RFCOMM_SERVER_CHANNEL, NULL, 0);
|
||||||
|
hsp_ag_create_service(hsp_service_buffer, RFCOMM_SERVER_CHANNEL, NULL);
|
||||||
// printf("SDP service record size: %u\n", de_get_len(spp_service_buffer));
|
sdp_register_service_internal(NULL, hsp_service_buffer);
|
||||||
// sdp_register_service_internal(NULL, spp_service_buffer);
|
|
||||||
|
|
||||||
sdp_query_rfcomm_register_callback(handle_query_rfcomm_event, NULL);
|
sdp_query_rfcomm_register_callback(handle_query_rfcomm_event, NULL);
|
||||||
|
|
||||||
|
@ -45,6 +45,7 @@
|
|||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
#include <signal.h>
|
||||||
|
|
||||||
#include "btstack-config.h"
|
#include "btstack-config.h"
|
||||||
|
|
||||||
@ -57,6 +58,14 @@
|
|||||||
|
|
||||||
int btstack_main(int argc, const char * argv[]);
|
int btstack_main(int argc, const char * argv[]);
|
||||||
|
|
||||||
|
static void sigint_handler(int param){
|
||||||
|
log_info(" <= SIGINT received, shutting down..\n");
|
||||||
|
hci_power_control(HCI_POWER_OFF);
|
||||||
|
hci_close();
|
||||||
|
log_info("Good bye, see you.\n");
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
|
||||||
int main(int argc, const char * argv[]){
|
int main(int argc, const char * argv[]){
|
||||||
|
|
||||||
/// GET STARTED with BTstack ///
|
/// GET STARTED with BTstack ///
|
||||||
@ -73,6 +82,9 @@ int main(int argc, const char * argv[]){
|
|||||||
remote_device_db_t * remote_db = (remote_device_db_t *) &remote_device_db_fs;
|
remote_device_db_t * remote_db = (remote_device_db_t *) &remote_device_db_fs;
|
||||||
|
|
||||||
hci_init(transport, config, control, remote_db);
|
hci_init(transport, config, control, remote_db);
|
||||||
|
|
||||||
|
// handle CTRL-c
|
||||||
|
signal(SIGINT, sigint_handler);
|
||||||
|
|
||||||
btstack_main(argc, argv);
|
btstack_main(argc, argv);
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user