mirror of
https://github.com/bluekitchen/btstack.git
synced 2025-03-28 08:37:22 +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";
|
||||
|
||||
#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
|
||||
|
||||
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;
|
||||
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;
|
||||
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]);
|
||||
|
@ -1140,10 +1140,15 @@ typedef uint8_t sm_key_t[16];
|
||||
#define HFP_SUBEVENT_COMPLETE 0x05
|
||||
|
||||
/**
|
||||
* @format 111T
|
||||
* @format 11111111T
|
||||
* @param subevent_code
|
||||
* @param indicator_index
|
||||
* @param indicator_status
|
||||
* @param indicator_min_range
|
||||
* @param indicator_max_range
|
||||
* @param indicator_mandatory
|
||||
* @param indicator_enabled
|
||||
* @param indicator_status_changed
|
||||
* @param indicator_name
|
||||
*/
|
||||
#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){
|
||||
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
|
||||
* @param event packet
|
||||
@ -3754,7 +3799,7 @@ static inline uint8_t hfp_subevent_ag_indicator_status_changed_get_indicator_sta
|
||||
* @note: btstack_type T
|
||||
*/
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (strncmp(line_buffer+offset, "AT+", 3) == 0){
|
||||
log_info("process unknown HF command %s \n", line_buffer);
|
||||
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 == '=';
|
||||
return found_separator;
|
||||
}
|
||||
|
||||
static void hfp_parser_next_state(hfp_connection_t * hfp_connection, uint8_t byte){
|
||||
hfp_connection->line_size = 0;
|
||||
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:
|
||||
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->ag_indicators_nr = hfp_connection->parser_item_index;
|
||||
hfp_connection->ag_indicators_nr++;
|
||||
log_info("%s)\n", hfp_connection->line_buffer);
|
||||
break;
|
||||
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){
|
||||
if (!callback) return;
|
||||
uint8_t event[5+HFP_MAX_INDICATOR_DESC_SIZE+1];
|
||||
event[0] = HCI_EVENT_HFP_META;
|
||||
event[1] = sizeof(event) - 2;
|
||||
event[2] = HFP_SUBEVENT_AG_INDICATOR_STATUS_CHANGED;
|
||||
event[3] = indicator.index;
|
||||
event[4] = indicator.status;
|
||||
strncpy((char*)&event[5], indicator.name, HFP_MAX_INDICATOR_DESC_SIZE);
|
||||
event[5+HFP_MAX_INDICATOR_DESC_SIZE] = 0;
|
||||
uint8_t event[10+HFP_MAX_INDICATOR_DESC_SIZE+1];
|
||||
int pos = 0;
|
||||
event[pos++] = HCI_EVENT_HFP_META;
|
||||
event[pos++] = sizeof(event) - 2;
|
||||
event[pos++] = HFP_SUBEVENT_AG_INDICATOR_STATUS_CHANGED;
|
||||
event[pos++] = indicator.index;
|
||||
event[pos++] = indicator.status;
|
||||
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));
|
||||
}
|
||||
|
||||
@ -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){
|
||||
UNUSED(packet_type); // ok: only called with RFCOMM_DATA_PACKET
|
||||
|
||||
// assertion: size >= 1 as rfcomm.c does not deliver empty packets
|
||||
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
|
||||
int pos;
|
||||
for (pos = 0; pos < size ; pos++){
|
||||
for (pos = 0; pos < size; pos++){
|
||||
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;
|
||||
|
||||
|
||||
int value;
|
||||
int i;
|
||||
switch (hfp_connection->command){
|
||||
@ -1083,6 +1089,13 @@ static void hfp_hf_handle_rfcomm_event(uint8_t packet_type, uint16_t channel, ui
|
||||
}
|
||||
}
|
||||
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:
|
||||
break;
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user