diff --git a/example/hfp_hf_demo.c b/example/hfp_hf_demo.c index 71a192dd1..6f84ecc04 100644 --- a/example/hfp_hf_demo.c +++ b/example/hfp_hf_demo.c @@ -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]); diff --git a/src/btstack_defines.h b/src/btstack_defines.h index 2c98abfe7..acadc98ee 100644 --- a/src/btstack_defines.h +++ b/src/btstack_defines.h @@ -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 diff --git a/src/btstack_event.h b/src/btstack_event.h index 128181962..09af10f11 100644 --- a/src/btstack_event.h +++ b/src/btstack_event.h @@ -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]; } /** diff --git a/src/classic/hfp.c b/src/classic/hfp.c index f82b14538..8c10246af 100644 --- a/src/classic/hfp.c +++ b/src/classic/hfp.c @@ -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: diff --git a/src/classic/hfp_hf.c b/src/classic/hfp_hf.c index 4e657f889..71a82798d 100644 --- a/src/classic/hfp_hf.c +++ b/src/classic/hfp_hf.c @@ -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; }