mirror of
https://github.com/bluekitchen/btstack.git
synced 2025-03-31 01:20:44 +00:00
hfp: emit ag indicator status
This commit is contained in:
parent
9700d53b49
commit
c741b03209
@ -67,7 +67,7 @@ const uint8_t rfcomm_channel_nr = 1;
|
|||||||
const char hfp_hf_service_name[] = "HFP HF Demo";
|
const char hfp_hf_service_name[] = "HFP HF Demo";
|
||||||
|
|
||||||
#ifdef HAVE_BTSTACK_STDIN
|
#ifdef HAVE_BTSTACK_STDIN
|
||||||
static const char * device_addr_string = "00:1B:DC:08:0A:A5";
|
static const char * device_addr_string = "6C:72:E7:10:22:EE";
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static bd_addr_t device_addr;
|
static bd_addr_t device_addr;
|
||||||
@ -507,7 +507,12 @@ static void packet_handler(uint8_t packet_type, uint16_t channel, uint8_t * even
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case HFP_SUBEVENT_AG_INDICATOR_STATUS_CHANGED:
|
case HFP_SUBEVENT_AG_INDICATOR_STATUS_CHANGED:
|
||||||
printf("AG_INDICATOR_STATUS_CHANGED, AG indicator '%s' (index: %d) to: %d\n", (const char*) &event[5], event[3], event[4]);
|
printf("AG_INDICATOR_STATUS_CHANGED, AG indicator (index: %d) to: %d of range [%d, %d], name '%s'\n",
|
||||||
|
hfp_subevent_ag_indicator_status_changed_get_indicator_index(event),
|
||||||
|
hfp_subevent_ag_indicator_status_changed_get_indicator_status(event),
|
||||||
|
hfp_subevent_ag_indicator_status_changed_get_indicator_min_range(event),
|
||||||
|
hfp_subevent_ag_indicator_status_changed_get_indicator_max_range(event),
|
||||||
|
(const char*) hfp_subevent_ag_indicator_status_changed_get_indicator_name(event));
|
||||||
break;
|
break;
|
||||||
case HFP_SUBEVENT_NETWORK_OPERATOR_CHANGED:
|
case HFP_SUBEVENT_NETWORK_OPERATOR_CHANGED:
|
||||||
printf("NETWORK_OPERATOR_CHANGED, operator mode: %d, format: %d, name: %s\n", event[3], event[4], (char *) &event[5]);
|
printf("NETWORK_OPERATOR_CHANGED, operator mode: %d, format: %d, name: %s\n", event[3], event[4], (char *) &event[5]);
|
||||||
|
@ -1140,10 +1140,15 @@ typedef uint8_t sm_key_t[16];
|
|||||||
#define HFP_SUBEVENT_COMPLETE 0x05
|
#define HFP_SUBEVENT_COMPLETE 0x05
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @format 111T
|
* @format 11111111T
|
||||||
* @param subevent_code
|
* @param subevent_code
|
||||||
* @param indicator_index
|
* @param indicator_index
|
||||||
* @param indicator_status
|
* @param indicator_status
|
||||||
|
* @param indicator_min_range
|
||||||
|
* @param indicator_max_range
|
||||||
|
* @param indicator_mandatory
|
||||||
|
* @param indicator_enabled
|
||||||
|
* @param indicator_status_changed
|
||||||
* @param indicator_name
|
* @param indicator_name
|
||||||
*/
|
*/
|
||||||
#define HFP_SUBEVENT_AG_INDICATOR_STATUS_CHANGED 0x06
|
#define HFP_SUBEVENT_AG_INDICATOR_STATUS_CHANGED 0x06
|
||||||
|
@ -3747,6 +3747,51 @@ static inline uint8_t hfp_subevent_ag_indicator_status_changed_get_indicator_ind
|
|||||||
static inline uint8_t hfp_subevent_ag_indicator_status_changed_get_indicator_status(const uint8_t * event){
|
static inline uint8_t hfp_subevent_ag_indicator_status_changed_get_indicator_status(const uint8_t * event){
|
||||||
return event[4];
|
return event[4];
|
||||||
}
|
}
|
||||||
|
/**
|
||||||
|
* @brief Get field indicator_min_range from event HFP_SUBEVENT_AG_INDICATOR_STATUS_CHANGED
|
||||||
|
* @param event packet
|
||||||
|
* @return indicator_min_range
|
||||||
|
* @note: btstack_type 1
|
||||||
|
*/
|
||||||
|
static inline uint8_t hfp_subevent_ag_indicator_status_changed_get_indicator_min_range(const uint8_t * event){
|
||||||
|
return event[5];
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* @brief Get field indicator_max_range from event HFP_SUBEVENT_AG_INDICATOR_STATUS_CHANGED
|
||||||
|
* @param event packet
|
||||||
|
* @return indicator_max_range
|
||||||
|
* @note: btstack_type 1
|
||||||
|
*/
|
||||||
|
static inline uint8_t hfp_subevent_ag_indicator_status_changed_get_indicator_max_range(const uint8_t * event){
|
||||||
|
return event[6];
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* @brief Get field indicator_mandatory from event HFP_SUBEVENT_AG_INDICATOR_STATUS_CHANGED
|
||||||
|
* @param event packet
|
||||||
|
* @return indicator_mandatory
|
||||||
|
* @note: btstack_type 1
|
||||||
|
*/
|
||||||
|
static inline uint8_t hfp_subevent_ag_indicator_status_changed_get_indicator_mandatory(const uint8_t * event){
|
||||||
|
return event[7];
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* @brief Get field indicator_enabled from event HFP_SUBEVENT_AG_INDICATOR_STATUS_CHANGED
|
||||||
|
* @param event packet
|
||||||
|
* @return indicator_enabled
|
||||||
|
* @note: btstack_type 1
|
||||||
|
*/
|
||||||
|
static inline uint8_t hfp_subevent_ag_indicator_status_changed_get_indicator_enabled(const uint8_t * event){
|
||||||
|
return event[8];
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* @brief Get field indicator_status_changed from event HFP_SUBEVENT_AG_INDICATOR_STATUS_CHANGED
|
||||||
|
* @param event packet
|
||||||
|
* @return indicator_status_changed
|
||||||
|
* @note: btstack_type 1
|
||||||
|
*/
|
||||||
|
static inline uint8_t hfp_subevent_ag_indicator_status_changed_get_indicator_status_changed(const uint8_t * event){
|
||||||
|
return event[9];
|
||||||
|
}
|
||||||
/**
|
/**
|
||||||
* @brief Get field indicator_name from event HFP_SUBEVENT_AG_INDICATOR_STATUS_CHANGED
|
* @brief Get field indicator_name from event HFP_SUBEVENT_AG_INDICATOR_STATUS_CHANGED
|
||||||
* @param event packet
|
* @param event packet
|
||||||
@ -3754,7 +3799,7 @@ static inline uint8_t hfp_subevent_ag_indicator_status_changed_get_indicator_sta
|
|||||||
* @note: btstack_type T
|
* @note: btstack_type T
|
||||||
*/
|
*/
|
||||||
static inline const char * hfp_subevent_ag_indicator_status_changed_get_indicator_name(const uint8_t * event){
|
static inline const char * hfp_subevent_ag_indicator_status_changed_get_indicator_name(const uint8_t * event){
|
||||||
return (const char *) &event[5];
|
return (const char *) &event[10];
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -962,7 +962,7 @@ static hfp_command_t parse_command(const char * line_buffer, int isHandsFree){
|
|||||||
return HFP_CMD_HF_CONFIRMED_CODEC;
|
return HFP_CMD_HF_CONFIRMED_CODEC;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (strncmp(line_buffer+offset, "AT+", 3) == 0){
|
if (strncmp(line_buffer+offset, "AT+", 3) == 0){
|
||||||
log_info("process unknown HF command %s \n", line_buffer);
|
log_info("process unknown HF command %s \n", line_buffer);
|
||||||
return HFP_CMD_UNKNOWN;
|
return HFP_CMD_UNKNOWN;
|
||||||
@ -1006,7 +1006,6 @@ static int hfp_parser_found_separator(hfp_connection_t * hfp_connection, uint8_t
|
|||||||
byte == '-' || byte == '"' || byte == '?'|| byte == '=';
|
byte == '-' || byte == '"' || byte == '?'|| byte == '=';
|
||||||
return found_separator;
|
return found_separator;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void hfp_parser_next_state(hfp_connection_t * hfp_connection, uint8_t byte){
|
static void hfp_parser_next_state(hfp_connection_t * hfp_connection, uint8_t byte){
|
||||||
hfp_connection->line_size = 0;
|
hfp_connection->line_size = 0;
|
||||||
if (hfp_parser_is_end_of_line(byte)){
|
if (hfp_parser_is_end_of_line(byte)){
|
||||||
@ -1187,7 +1186,7 @@ void hfp_parse(hfp_connection_t * hfp_connection, uint8_t byte, int isHandsFree)
|
|||||||
case HFP_CMD_RETRIEVE_AG_INDICATORS:
|
case HFP_CMD_RETRIEVE_AG_INDICATORS:
|
||||||
hfp_connection->ag_indicators[hfp_connection->parser_item_index].max_range = btstack_atoi((char *)hfp_connection->line_buffer);
|
hfp_connection->ag_indicators[hfp_connection->parser_item_index].max_range = btstack_atoi((char *)hfp_connection->line_buffer);
|
||||||
hfp_connection->parser_item_index++;
|
hfp_connection->parser_item_index++;
|
||||||
hfp_connection->ag_indicators_nr = hfp_connection->parser_item_index;
|
hfp_connection->ag_indicators_nr++;
|
||||||
log_info("%s)\n", hfp_connection->line_buffer);
|
log_info("%s)\n", hfp_connection->line_buffer);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
@ -360,14 +360,21 @@ static int hfp_hf_send_clcc(uint16_t cid){
|
|||||||
|
|
||||||
static void hfp_emit_ag_indicator_event(btstack_packet_handler_t callback, hfp_ag_indicator_t indicator){
|
static void hfp_emit_ag_indicator_event(btstack_packet_handler_t callback, hfp_ag_indicator_t indicator){
|
||||||
if (!callback) return;
|
if (!callback) return;
|
||||||
uint8_t event[5+HFP_MAX_INDICATOR_DESC_SIZE+1];
|
uint8_t event[10+HFP_MAX_INDICATOR_DESC_SIZE+1];
|
||||||
event[0] = HCI_EVENT_HFP_META;
|
int pos = 0;
|
||||||
event[1] = sizeof(event) - 2;
|
event[pos++] = HCI_EVENT_HFP_META;
|
||||||
event[2] = HFP_SUBEVENT_AG_INDICATOR_STATUS_CHANGED;
|
event[pos++] = sizeof(event) - 2;
|
||||||
event[3] = indicator.index;
|
event[pos++] = HFP_SUBEVENT_AG_INDICATOR_STATUS_CHANGED;
|
||||||
event[4] = indicator.status;
|
event[pos++] = indicator.index;
|
||||||
strncpy((char*)&event[5], indicator.name, HFP_MAX_INDICATOR_DESC_SIZE);
|
event[pos++] = indicator.status;
|
||||||
event[5+HFP_MAX_INDICATOR_DESC_SIZE] = 0;
|
event[pos++] = indicator.min_range;
|
||||||
|
event[pos++] = indicator.max_range;
|
||||||
|
event[pos++] = indicator.mandatory;
|
||||||
|
event[pos++] = indicator.enabled;
|
||||||
|
event[pos++] = indicator.status_changed;
|
||||||
|
strncpy((char*)&event[pos], indicator.name, HFP_MAX_INDICATOR_DESC_SIZE);
|
||||||
|
pos += HFP_MAX_INDICATOR_DESC_SIZE;
|
||||||
|
event[pos] = 0;
|
||||||
(*callback)(HCI_EVENT_PACKET, 0, event, sizeof(event));
|
(*callback)(HCI_EVENT_PACKET, 0, event, sizeof(event));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -989,7 +996,6 @@ static int hfp_parser_is_end_of_line(uint8_t byte){
|
|||||||
|
|
||||||
static void hfp_hf_handle_rfcomm_event(uint8_t packet_type, uint16_t channel, uint8_t *packet, uint16_t size){
|
static void hfp_hf_handle_rfcomm_event(uint8_t packet_type, uint16_t channel, uint8_t *packet, uint16_t size){
|
||||||
UNUSED(packet_type); // ok: only called with RFCOMM_DATA_PACKET
|
UNUSED(packet_type); // ok: only called with RFCOMM_DATA_PACKET
|
||||||
|
|
||||||
// assertion: size >= 1 as rfcomm.c does not deliver empty packets
|
// assertion: size >= 1 as rfcomm.c does not deliver empty packets
|
||||||
if (size < 1) return;
|
if (size < 1) return;
|
||||||
|
|
||||||
@ -1000,12 +1006,12 @@ static void hfp_hf_handle_rfcomm_event(uint8_t packet_type, uint16_t channel, ui
|
|||||||
|
|
||||||
// process messages byte-wise
|
// process messages byte-wise
|
||||||
int pos;
|
int pos;
|
||||||
for (pos = 0; pos < size ; pos++){
|
for (pos = 0; pos < size; pos++){
|
||||||
hfp_parse(hfp_connection, packet[pos], 1);
|
hfp_parse(hfp_connection, packet[pos], 1);
|
||||||
|
|
||||||
// parse until end of line
|
// parse until end of line "\r\n"
|
||||||
if (!hfp_parser_is_end_of_line(packet[pos])) continue;
|
if (!hfp_parser_is_end_of_line(packet[pos])) continue;
|
||||||
|
|
||||||
int value;
|
int value;
|
||||||
int i;
|
int i;
|
||||||
switch (hfp_connection->command){
|
switch (hfp_connection->command){
|
||||||
@ -1083,6 +1089,13 @@ static void hfp_hf_handle_rfcomm_event(uint8_t packet_type, uint16_t channel, ui
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case HFP_CMD_RETRIEVE_AG_INDICATORS_STATUS:
|
||||||
|
case HFP_CMD_RETRIEVE_AG_INDICATORS:
|
||||||
|
for (i = 0; i < hfp_connection->ag_indicators_nr; i++){
|
||||||
|
hfp_emit_ag_indicator_event(hfp_hf_callback, hfp_connection->ag_indicators[i]);
|
||||||
|
}
|
||||||
|
hfp_connection->command = HFP_CMD_NONE;
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user