mirror of
https://github.com/bluekitchen/btstack.git
synced 2025-02-21 21:41:13 +00:00
Merge branch 'master' into ble-api-cleanup
This commit is contained in:
commit
f5054c0028
@ -410,7 +410,8 @@ BD_ADDR_TYPE BD_ADDR::getAddressType(void){
|
|||||||
BLEAdvertisement::BLEAdvertisement(uint8_t * event_packet) :
|
BLEAdvertisement::BLEAdvertisement(uint8_t * event_packet) :
|
||||||
advertising_event_type(event_packet[2]),
|
advertising_event_type(event_packet[2]),
|
||||||
rssi(event_packet[10]),
|
rssi(event_packet[10]),
|
||||||
data_length(event_packet[11])
|
data_length(event_packet[11]),
|
||||||
|
iBeacon_UUID(NULL)
|
||||||
{
|
{
|
||||||
bd_addr_t addr;
|
bd_addr_t addr;
|
||||||
bt_flip_addr(addr, &event_packet[4]);
|
bt_flip_addr(addr, &event_packet[4]);
|
||||||
@ -418,6 +419,10 @@ data_length(event_packet[11])
|
|||||||
memcpy(data, &event_packet[12], LE_ADVERTISING_DATA_SIZE);
|
memcpy(data, &event_packet[12], LE_ADVERTISING_DATA_SIZE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
BLEAdvertisement::~BLEAdvertisement(){
|
||||||
|
if (iBeacon_UUID) delete(iBeacon_UUID);
|
||||||
|
}
|
||||||
|
|
||||||
const uint8_t * BLEAdvertisement::getAdvData(void){
|
const uint8_t * BLEAdvertisement::getAdvData(void){
|
||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
@ -462,15 +467,18 @@ bool BLEAdvertisement::isIBeacon(void){
|
|||||||
}
|
}
|
||||||
|
|
||||||
const UUID * BLEAdvertisement::getIBeaconUUID(void){
|
const UUID * BLEAdvertisement::getIBeaconUUID(void){
|
||||||
return new UUID(&data[9]);
|
if (!iBeacon_UUID){
|
||||||
|
iBeacon_UUID = new UUID(&data[9]);
|
||||||
|
}
|
||||||
|
return iBeacon_UUID;
|
||||||
};
|
};
|
||||||
uint16_t BLEAdvertisement::getIBeaconMajorID(void){
|
uint16_t BLEAdvertisement::getIBeaconMajorID(void){
|
||||||
return READ_NET_16(data, 25);
|
return READ_NET_16(data, 25);
|
||||||
};
|
};
|
||||||
uint16_t BLEAdvertisement::getIBecaonMinorID(void){
|
uint16_t BLEAdvertisement::getIBecaonMinorID(void){
|
||||||
return READ_NET_16(data, 27);
|
return READ_NET_16(data, 27);
|
||||||
};
|
};
|
||||||
uint8_t BLEAdvertisement::getiBeaconMeasuredPower(void){
|
uint8_t BLEAdvertisement::getiBeaconMeasuredPower(void){
|
||||||
return data[29];
|
return data[29];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -57,8 +57,10 @@ private:
|
|||||||
uint8_t data_length;
|
uint8_t data_length;
|
||||||
uint8_t data[10 + LE_ADVERTISING_DATA_SIZE];
|
uint8_t data[10 + LE_ADVERTISING_DATA_SIZE];
|
||||||
BD_ADDR bd_addr;
|
BD_ADDR bd_addr;
|
||||||
|
UUID * iBeacon_UUID;
|
||||||
public:
|
public:
|
||||||
BLEAdvertisement(uint8_t * event_packet);
|
BLEAdvertisement(uint8_t * event_packet);
|
||||||
|
~BLEAdvertisement();
|
||||||
BD_ADDR * getBdAddr();
|
BD_ADDR * getBdAddr();
|
||||||
BD_ADDR_TYPE getBdAddrType();
|
BD_ADDR_TYPE getBdAddrType();
|
||||||
int getRssi();
|
int getRssi();
|
||||||
|
@ -663,14 +663,14 @@
|
|||||||
|
|
||||||
#define HCI_EVENT_HSP_META 0xE8
|
#define HCI_EVENT_HSP_META 0xE8
|
||||||
|
|
||||||
#define HSP_SUBEVENT_AUDIO_CONNECTION_COMPLETE 0x01
|
#define HSP_SUBEVENT_ERROR 0x01
|
||||||
#define HSP_SUBEVENT_AUDIO_DISCONNECTION_COMPLETE 0x02
|
#define HSP_SUBEVENT_AUDIO_CONNECTION_COMPLETE 0x02
|
||||||
#define HSP_SUBEVENT_MICROPHONE_GAIN_CHANGED 0x03
|
#define HSP_SUBEVENT_AUDIO_DISCONNECTION_COMPLETE 0x03
|
||||||
#define HSP_SUBEVENT_SPEAKER_GAIN_CHANGED 0x04
|
#define HSP_SUBEVENT_RING 0x04
|
||||||
#define HSP_SUBEVENT_HS_COMMAND 0x05
|
#define HSP_SUBEVENT_MICROPHONE_GAIN_CHANGED 0x05
|
||||||
#define HSP_SUBEVENT_AG_INDICATION 0x06
|
#define HSP_SUBEVENT_SPEAKER_GAIN_CHANGED 0x06
|
||||||
#define HSP_SUBEVENT_ERROR 0x07
|
#define HSP_SUBEVENT_HS_COMMAND 0x07
|
||||||
#define HSP_SUBEVENT_RING 0x08
|
#define HSP_SUBEVENT_AG_INDICATION 0x08
|
||||||
|
|
||||||
#define HCI_EVENT_HFP_META 0xE9
|
#define HCI_EVENT_HFP_META 0xE9
|
||||||
|
|
||||||
|
@ -67,7 +67,6 @@
|
|||||||
#define HSP_MICROPHONE_GAIN "+VGM="
|
#define HSP_MICROPHONE_GAIN "+VGM="
|
||||||
#define HSP_SPEAKER_GAIN "+VGS="
|
#define HSP_SPEAKER_GAIN "+VGS="
|
||||||
|
|
||||||
#define HSP_HS_BUTTON_PRESS "AT+CKPD=200\r\n"
|
|
||||||
#define HSP_HS_AT_CKPD "AT+CKPD=200\r\n"
|
#define HSP_HS_AT_CKPD "AT+CKPD=200\r\n"
|
||||||
#define HSP_HS_MICROPHONE_GAIN "AT+VGM"
|
#define HSP_HS_MICROPHONE_GAIN "AT+VGM"
|
||||||
#define HSP_HS_SPEAKER_GAIN "AT+VGS"
|
#define HSP_HS_SPEAKER_GAIN "AT+VGS"
|
||||||
@ -88,10 +87,8 @@ static int hs_microphone_gain = -1;
|
|||||||
static int hs_speaker_gain = -1;
|
static int hs_speaker_gain = -1;
|
||||||
|
|
||||||
static uint8_t hs_send_button_press = 0;
|
static uint8_t hs_send_button_press = 0;
|
||||||
static uint8_t hs_ok_received = 0;
|
|
||||||
static uint8_t hs_ring_received = 0;
|
|
||||||
static uint8_t hs_support_custom_indications = 0;
|
static uint8_t hs_support_custom_indications = 0;
|
||||||
|
static uint8_t hs_outgoing_connection = 0;
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
HSP_IDLE,
|
HSP_IDLE,
|
||||||
@ -242,8 +239,6 @@ static void hsp_hs_reset_state(void){
|
|||||||
hs_speaker_gain = -1;
|
hs_speaker_gain = -1;
|
||||||
|
|
||||||
hs_send_button_press = 0;
|
hs_send_button_press = 0;
|
||||||
hs_ok_received = 0;
|
|
||||||
hs_ring_received = 0;
|
|
||||||
hs_support_custom_indications = 0;
|
hs_support_custom_indications = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -264,6 +259,7 @@ void hsp_hs_init(uint8_t rfcomm_channel_nr){
|
|||||||
|
|
||||||
void hsp_hs_connect(bd_addr_t bd_addr){
|
void hsp_hs_connect(bd_addr_t bd_addr){
|
||||||
if (hsp_state != HSP_IDLE) return;
|
if (hsp_state != HSP_IDLE) return;
|
||||||
|
hs_outgoing_connection = 1;
|
||||||
hsp_state = HSP_SDP_QUERY_RFCOMM_CHANNEL;
|
hsp_state = HSP_SDP_QUERY_RFCOMM_CHANNEL;
|
||||||
memcpy(remote, bd_addr, 6);
|
memcpy(remote, bd_addr, 6);
|
||||||
hsp_run();
|
hsp_run();
|
||||||
@ -309,22 +305,10 @@ void hsp_hs_set_speaker_gain(uint8_t gain){
|
|||||||
|
|
||||||
static void hsp_run(void){
|
static void hsp_run(void){
|
||||||
int err;
|
int err;
|
||||||
if (hs_ring_received){
|
|
||||||
hs_ring_received = 0;
|
|
||||||
hs_send_button_press = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (hs_ok_received){
|
|
||||||
hs_ok_received = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (hs_send_button_press){
|
if (hs_send_button_press){
|
||||||
hs_send_button_press = 0;
|
hs_send_button_press = 0;
|
||||||
if (hsp_state == HSP_W4_USER_ACTION){
|
err = hsp_hs_send_str_over_rfcomm(rfcomm_cid, HSP_HS_AT_CKPD);
|
||||||
err = hsp_hs_send_str_over_rfcomm(rfcomm_cid, HSP_HS_AT_CKPD);
|
|
||||||
} else {
|
|
||||||
err = hsp_hs_send_str_over_rfcomm(rfcomm_cid, HSP_HS_BUTTON_PRESS);
|
|
||||||
}
|
|
||||||
if (err) {
|
if (err) {
|
||||||
hs_send_button_press = 1;
|
hs_send_button_press = 1;
|
||||||
}
|
}
|
||||||
@ -346,7 +330,6 @@ static void hsp_run(void){
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case HSP_ACTIVE:
|
case HSP_ACTIVE:
|
||||||
if (hs_ok_received) break;
|
|
||||||
|
|
||||||
if (hs_microphone_gain >= 0){
|
if (hs_microphone_gain >= 0){
|
||||||
int gain = hs_microphone_gain;
|
int gain = hs_microphone_gain;
|
||||||
@ -382,14 +365,15 @@ static void hsp_run(void){
|
|||||||
static void packet_handler (uint8_t packet_type, uint16_t channel, uint8_t *packet, uint16_t size){
|
static void packet_handler (uint8_t packet_type, uint16_t channel, uint8_t *packet, uint16_t size){
|
||||||
// printf("packet_handler type %u, packet[0] %x\n", packet_type, packet[0]);
|
// printf("packet_handler type %u, packet[0] %x\n", packet_type, packet[0]);
|
||||||
if (packet_type == RFCOMM_DATA_PACKET){
|
if (packet_type == RFCOMM_DATA_PACKET){
|
||||||
|
// skip over leading newline
|
||||||
while (size > 0 && (packet[0] == '\n' || packet[0] == '\r')){
|
while (size > 0 && (packet[0] == '\n' || packet[0] == '\r')){
|
||||||
size--;
|
size--;
|
||||||
packet++;
|
packet++;
|
||||||
}
|
}
|
||||||
if (strncmp((char *)packet, HSP_AG_RING, strlen(HSP_AG_RING)) == 0){
|
if (strncmp((char *)packet, HSP_AG_RING, strlen(HSP_AG_RING)) == 0){
|
||||||
hs_ring_received = 1;
|
emit_event(HSP_SUBEVENT_RING, 0);
|
||||||
} if (strncmp((char *)packet, HSP_AG_OK, strlen(HSP_AG_OK)) == 0){
|
} else if (strncmp((char *)packet, HSP_AG_OK, strlen(HSP_AG_OK)) == 0){
|
||||||
hs_ok_received = 1;
|
printf("OK RECEIVED\n");
|
||||||
switch (hsp_state){
|
switch (hsp_state){
|
||||||
case HSP_W4_RFCOMM_CONNECTED:
|
case HSP_W4_RFCOMM_CONNECTED:
|
||||||
hsp_state = HSP_W2_CONNECT_SCO;
|
hsp_state = HSP_W2_CONNECT_SCO;
|
||||||
@ -409,6 +393,12 @@ static void packet_handler (uint8_t packet_type, uint16_t channel, uint8_t *pack
|
|||||||
emit_event(HSP_SUBEVENT_SPEAKER_GAIN_CHANGED, gain);
|
emit_event(HSP_SUBEVENT_SPEAKER_GAIN_CHANGED, gain);
|
||||||
} else {
|
} else {
|
||||||
if (!hsp_hs_callback) return;
|
if (!hsp_hs_callback) return;
|
||||||
|
// strip trailing newline
|
||||||
|
while (size > 0 && (packet[size-1] == '\n' || packet[size-1] == '\r')){
|
||||||
|
size--;
|
||||||
|
}
|
||||||
|
// add trailing \0
|
||||||
|
packet[size] = 0;
|
||||||
// re-use incoming buffer to avoid reserving large buffers - ugly but efficient
|
// re-use incoming buffer to avoid reserving large buffers - ugly but efficient
|
||||||
uint8_t * event = packet - 3;
|
uint8_t * event = packet - 3;
|
||||||
event[0] = HCI_EVENT_HSP_META;
|
event[0] = HCI_EVENT_HSP_META;
|
||||||
@ -503,7 +493,6 @@ static void packet_handler (uint8_t packet_type, uint16_t channel, uint8_t *pack
|
|||||||
rfcomm_accept_connection_internal(rfcomm_cid);
|
rfcomm_accept_connection_internal(rfcomm_cid);
|
||||||
|
|
||||||
hsp_state = HSP_W4_RFCOMM_CONNECTED;
|
hsp_state = HSP_W4_RFCOMM_CONNECTED;
|
||||||
hs_send_button_press = 1;
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case RFCOMM_EVENT_OPEN_CHANNEL_COMPLETE:
|
case RFCOMM_EVENT_OPEN_CHANNEL_COMPLETE:
|
||||||
@ -513,6 +502,7 @@ static void packet_handler (uint8_t packet_type, uint16_t channel, uint8_t *pack
|
|||||||
printf("RFCOMM channel open failed, status %u\n", packet[2]);
|
printf("RFCOMM channel open failed, status %u\n", packet[2]);
|
||||||
hsp_hs_reset_state();
|
hsp_hs_reset_state();
|
||||||
emit_event(HSP_SUBEVENT_AUDIO_CONNECTION_COMPLETE, packet[2]);
|
emit_event(HSP_SUBEVENT_AUDIO_CONNECTION_COMPLETE, packet[2]);
|
||||||
|
hs_outgoing_connection = 0;
|
||||||
} else {
|
} else {
|
||||||
// data: event(8) , len(8), status (8), address (48), handle (16), server channel(8), rfcomm_cid(16), max frame size(16)
|
// data: event(8) , len(8), status (8), address (48), handle (16), server channel(8), rfcomm_cid(16), max frame size(16)
|
||||||
rfcomm_handle = READ_BT_16(packet, 9);
|
rfcomm_handle = READ_BT_16(packet, 9);
|
||||||
@ -520,10 +510,14 @@ static void packet_handler (uint8_t packet_type, uint16_t channel, uint8_t *pack
|
|||||||
mtu = READ_BT_16(packet, 14);
|
mtu = READ_BT_16(packet, 14);
|
||||||
printf("RFCOMM channel open succeeded. New RFCOMM Channel ID %u, max frame size %u\n", rfcomm_cid, mtu);
|
printf("RFCOMM channel open succeeded. New RFCOMM Channel ID %u, max frame size %u\n", rfcomm_cid, mtu);
|
||||||
|
|
||||||
|
if (hs_outgoing_connection){
|
||||||
|
hs_outgoing_connection = 0;
|
||||||
|
hs_send_button_press = 1;
|
||||||
|
}
|
||||||
|
|
||||||
switch (hsp_state){
|
switch (hsp_state){
|
||||||
case HSP_W4_RFCOMM_CONNECTED:
|
case HSP_W4_RFCOMM_CONNECTED:
|
||||||
hsp_state = HSP_W2_CONNECT_SCO;
|
hsp_state = HSP_W2_CONNECT_SCO;
|
||||||
hs_send_button_press = 1;
|
|
||||||
break;
|
break;
|
||||||
case HSP_W4_CONNECTION_ESTABLISHED_TO_SHUTDOWN:
|
case HSP_W4_CONNECTION_ESTABLISHED_TO_SHUTDOWN:
|
||||||
hsp_state = HSP_W2_DISCONNECT_RFCOMM;
|
hsp_state = HSP_W2_DISCONNECT_RFCOMM;
|
||||||
@ -541,9 +535,9 @@ static void packet_handler (uint8_t packet_type, uint16_t channel, uint8_t *pack
|
|||||||
|
|
||||||
case HCI_EVENT_DISCONNECTION_COMPLETE:
|
case HCI_EVENT_DISCONNECTION_COMPLETE:
|
||||||
printf("HCI_EVENT_DISCONNECTION_COMPLETE \n");
|
printf("HCI_EVENT_DISCONNECTION_COMPLETE \n");
|
||||||
if (hsp_state != HSP_W4_SCO_DISCONNECTED){
|
// if (hsp_state != HSP_W4_SCO_DISCONNECTED){
|
||||||
printf("received gap disconnect in wrong hsp state\n");
|
// printf("received gap disconnect in wrong hsp state\n");
|
||||||
}
|
// }
|
||||||
handle = READ_BT_16(packet,3);
|
handle = READ_BT_16(packet,3);
|
||||||
if (handle == sco_handle){
|
if (handle == sco_handle){
|
||||||
sco_handle = 0;
|
sco_handle = 0;
|
||||||
@ -554,9 +548,9 @@ static void packet_handler (uint8_t packet_type, uint16_t channel, uint8_t *pack
|
|||||||
break;
|
break;
|
||||||
case RFCOMM_EVENT_CHANNEL_CLOSED:
|
case RFCOMM_EVENT_CHANNEL_CLOSED:
|
||||||
printf("RFCOMM_EVENT_CHANNEL_CLOSED\n");
|
printf("RFCOMM_EVENT_CHANNEL_CLOSED\n");
|
||||||
if (hsp_state != HSP_W4_RFCOMM_DISCONNECTED){
|
// if (hsp_state != HSP_W4_RFCOMM_DISCONNECTED){
|
||||||
printf("received RFCOMM disconnect in wrong hsp state\n");
|
// printf("received RFCOMM disconnect in wrong hsp state\n");
|
||||||
}
|
// }
|
||||||
printf("RFCOMM channel closed\n");
|
printf("RFCOMM channel closed\n");
|
||||||
hsp_hs_reset_state();
|
hsp_hs_reset_state();
|
||||||
emit_event(HSP_SUBEVENT_AUDIO_DISCONNECTION_COMPLETE,0);
|
emit_event(HSP_SUBEVENT_AUDIO_DISCONNECTION_COMPLETE,0);
|
||||||
@ -593,5 +587,11 @@ static void handle_query_rfcomm_event(sdp_query_event_t * event, void * context)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void hsp_hs_press_button(void){
|
||||||
|
hs_send_button_press = 1;
|
||||||
|
hsp_run();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -68,6 +68,8 @@ void hsp_hs_set_speaker_gain(uint8_t gain);
|
|||||||
|
|
||||||
void hsp_hs_support_custom_indications(int enable);
|
void hsp_hs_support_custom_indications(int enable);
|
||||||
|
|
||||||
|
void hsp_hs_press_button(void);
|
||||||
|
|
||||||
// When support custom commands is enabled, AG will send HSP_SUBEVENT_AG_INDICATION.
|
// When support custom commands is enabled, AG will send HSP_SUBEVENT_AG_INDICATION.
|
||||||
// On occurance of this event, client's packet handler must send the result back
|
// On occurance of this event, client's packet handler must send the result back
|
||||||
// by calling hsp_hs_send_result function.
|
// by calling hsp_hs_send_result function.
|
||||||
|
@ -176,6 +176,7 @@ static void show_usage(void){
|
|||||||
printf("p - establish audio connection to PTS module\n");
|
printf("p - establish audio connection to PTS module\n");
|
||||||
printf("e - establish audio connection to local mac\n");
|
printf("e - establish audio connection to local mac\n");
|
||||||
printf("d - release audio connection from Bluetooth Speaker\n");
|
printf("d - release audio connection from Bluetooth Speaker\n");
|
||||||
|
printf("b - press user button\n");
|
||||||
printf("z - set microphone gain 0\n");
|
printf("z - set microphone gain 0\n");
|
||||||
printf("m - set microphone gain 8\n");
|
printf("m - set microphone gain 8\n");
|
||||||
printf("M - set microphone gain 15\n");
|
printf("M - set microphone gain 15\n");
|
||||||
@ -230,6 +231,10 @@ static int stdin_process(struct data_source *ds){
|
|||||||
printf("Setting speaker gain 15\n");
|
printf("Setting speaker gain 15\n");
|
||||||
hsp_hs_set_speaker_gain(15);
|
hsp_hs_set_speaker_gain(15);
|
||||||
break;
|
break;
|
||||||
|
case 'b':
|
||||||
|
printf("Press user button\n");
|
||||||
|
hsp_hs_press_button();
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
show_usage();
|
show_usage();
|
||||||
break;
|
break;
|
||||||
@ -244,6 +249,7 @@ static void packet_handler(uint8_t * event, uint16_t event_size){
|
|||||||
switch (event[0]) {
|
switch (event[0]) {
|
||||||
case BTSTACK_EVENT_STATE:
|
case BTSTACK_EVENT_STATE:
|
||||||
if (event[2] != HCI_STATE_WORKING) break;
|
if (event[2] != HCI_STATE_WORKING) break;
|
||||||
|
show_usage();
|
||||||
// request loopback mode
|
// request loopback mode
|
||||||
hci_send_cmd(&hci_write_synchronous_flow_control_enable, 1);
|
hci_send_cmd(&hci_write_synchronous_flow_control_enable, 1);
|
||||||
break;
|
break;
|
||||||
@ -284,6 +290,9 @@ static void packet_handler(uint8_t * event, uint16_t event_size){
|
|||||||
case HSP_SUBEVENT_SPEAKER_GAIN_CHANGED:
|
case HSP_SUBEVENT_SPEAKER_GAIN_CHANGED:
|
||||||
printf("Received speaker gain change %d\n", event[3]);
|
printf("Received speaker gain change %d\n", event[3]);
|
||||||
break;
|
break;
|
||||||
|
case HSP_SUBEVENT_RING:
|
||||||
|
printf("HS: RING RING!\n");
|
||||||
|
break;
|
||||||
case HSP_SUBEVENT_AG_INDICATION:
|
case HSP_SUBEVENT_AG_INDICATION:
|
||||||
memset(hs_cmd_buffer, 0, sizeof(hs_cmd_buffer));
|
memset(hs_cmd_buffer, 0, sizeof(hs_cmd_buffer));
|
||||||
int size = event_size <= sizeof(hs_cmd_buffer)? event_size : sizeof(hs_cmd_buffer);
|
int size = event_size <= sizeof(hs_cmd_buffer)? event_size : sizeof(hs_cmd_buffer);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user