hfp: emit ag indicator status

This commit is contained in:
Milanka Ringwald 2018-12-14 10:41:37 +01:00
parent 9700d53b49
commit c741b03209
5 changed files with 86 additions and 19 deletions

View File

@ -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]);

View File

@ -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

View File

@ -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];
}
/**

View File

@ -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:

View File

@ -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;
}