diff --git a/src/hfp.c b/src/hfp.c index 2df34c775..17cbecf3b 100644 --- a/src/hfp.c +++ b/src/hfp.c @@ -263,9 +263,6 @@ void hfp_reset_context_flags(hfp_connection_t * context){ context->keep_separator = 0; - context->retrieve_ag_indicators = 0; // HFP_CMD_INDICATOR, check if needed - context->retrieve_ag_indicators_status = 0; - context->list_generic_status_indicators = 0; // HFP_CMD_LIST_GENERIC_STATUS_INDICATOR context->retrieve_generic_status_indicators = 0; // HFP_CMD_GENERIC_STATUS_INDICATOR context->retrieve_generic_status_indicators_state = 0; // HFP_CMD_GENERIC_STATUS_INDICATOR_STATE @@ -617,7 +614,6 @@ void hfp_handle_hci_event(hfp_callback_t callback, uint8_t packet_type, uint8_t static void process_command(hfp_connection_t * context){ if (context->line_size < 2) return; // printf("process_command %s\n", context->line_buffer); - context->command = HFP_CMD_NONE; int offset = 0; int isHandsFree = 1; @@ -648,16 +644,12 @@ static void process_command(hfp_connection_t * context){ } if (strncmp((char *)context->line_buffer+offset, HFP_INDICATOR, strlen(HFP_INDICATOR)) == 0){ - //printf("parsed HFP_INDICATOR \n"); - context->command = HFP_CMD_INDICATOR; - if (isHandsFree) return; - if (strncmp((char *)context->line_buffer+strlen(HFP_INDICATOR)+offset, "?", 1) == 0){ - context->retrieve_ag_indicators_status = 1; - context->retrieve_ag_indicators = 0; - } else { - context->retrieve_ag_indicators = 1; - context->retrieve_ag_indicators_status = 0; + context->command = HFP_CMD_RETRIEVE_AG_INDICATORS_STATUS; + } + + if (strncmp((char *)context->line_buffer+strlen(HFP_INDICATOR)+offset, "=?", 2) == 0){ + context->command = HFP_CMD_RETRIEVE_AG_INDICATORS; } return; } @@ -760,7 +752,7 @@ static void process_command(hfp_connection_t * context){ context->command = HFP_CMD_NONE; return; } - + context->command = HFP_CMD_NONE; } #if 0 @@ -816,11 +808,8 @@ static void hfp_parser_next_state(hfp_connection_t * context, uint8_t byte){ case HFP_CMD_QUERY_OPERATOR_SELECTION: context->parser_state = HFP_PARSER_SECOND_ITEM; break; - case HFP_CMD_INDICATOR: - if (context->retrieve_ag_indicators == 1){ - context->parser_state = HFP_PARSER_SECOND_ITEM; - break; - } + case HFP_CMD_RETRIEVE_AG_INDICATORS: + context->parser_state = HFP_PARSER_SECOND_ITEM; break; case HFP_CMD_GENERIC_STATUS_INDICATOR: if (context->retrieve_generic_status_indicators_state == 1){ @@ -836,7 +825,7 @@ static void hfp_parser_next_state(hfp_connection_t * context, uint8_t byte){ context->parser_state = HFP_PARSER_THIRD_ITEM; break; case HFP_PARSER_THIRD_ITEM: - if (context->command == HFP_CMD_INDICATOR && context->retrieve_ag_indicators){ + if (context->command == HFP_CMD_RETRIEVE_AG_INDICATORS){ context->parser_state = HFP_PARSER_CMD_SEQUENCE; break; } @@ -903,19 +892,15 @@ void hfp_parse(hfp_connection_t * context, uint8_t byte){ context->parser_item_index++; context->remote_codecs_nr = context->parser_item_index; break; - case HFP_CMD_INDICATOR: - if (context->retrieve_ag_indicators == 1){ - strcpy((char *)context->ag_indicators[context->parser_item_index].name, (char *)context->line_buffer); - context->ag_indicators[context->parser_item_index].index = context->parser_item_index+1; - log_info("Indicator %d: %s (", context->ag_indicators_nr+1, context->line_buffer); - } - - if (context->retrieve_ag_indicators_status == 1){ - log_info("Parsed Indicator %d with status: %s\n", context->parser_item_index+1, context->line_buffer); - context->ag_indicators[context->parser_item_index].status = atoi((char *) context->line_buffer); - context->parser_item_index++; - break; - } + case HFP_CMD_RETRIEVE_AG_INDICATORS: + strcpy((char *)context->ag_indicators[context->parser_item_index].name, (char *)context->line_buffer); + context->ag_indicators[context->parser_item_index].index = context->parser_item_index+1; + log_info("Indicator %d: %s (", context->ag_indicators_nr+1, context->line_buffer); + break; + case HFP_CMD_RETRIEVE_AG_INDICATORS_STATUS: + log_info("Parsed Indicator %d with status: %s\n", context->parser_item_index+1, context->line_buffer); + context->ag_indicators[context->parser_item_index].status = atoi((char *) context->line_buffer); + context->parser_item_index++; break; case HFP_CMD_ENABLE_INDICATOR_STATUS_UPDATE: context->parser_item_index++; @@ -1018,11 +1003,9 @@ void hfp_parse(hfp_connection_t * context, uint8_t byte){ context->ag_indicators[context->parser_item_index].status = (uint8_t)atoi((char*)context->line_buffer); context->ag_indicators[context->parser_item_index].status_changed = 1; break; - case HFP_CMD_INDICATOR: - if (context->retrieve_ag_indicators == 1){ - context->ag_indicators[context->parser_item_index].min_range = atoi((char *)context->line_buffer); - log_info("%s, ", context->line_buffer); - } + case HFP_CMD_RETRIEVE_AG_INDICATORS: + context->ag_indicators[context->parser_item_index].min_range = atoi((char *)context->line_buffer); + log_info("%s, ", context->line_buffer); break; default: break; @@ -1037,13 +1020,11 @@ void hfp_parse(hfp_connection_t * context, uint8_t byte){ log_info("name %s\n", context->line_buffer); } break; - case HFP_CMD_INDICATOR: - if (context->retrieve_ag_indicators == 1){ - context->ag_indicators[context->parser_item_index].max_range = atoi((char *)context->line_buffer); - context->parser_item_index++; - context->ag_indicators_nr = context->parser_item_index; - log_info("%s)\n", context->line_buffer); - } + case HFP_CMD_RETRIEVE_AG_INDICATORS: + context->ag_indicators[context->parser_item_index].max_range = atoi((char *)context->line_buffer); + context->parser_item_index++; + context->ag_indicators_nr = context->parser_item_index; + log_info("%s)\n", context->line_buffer); break; default: break; diff --git a/src/hfp.h b/src/hfp.h index 800d423a6..6e19a63de 100644 --- a/src/hfp.h +++ b/src/hfp.h @@ -131,7 +131,10 @@ typedef enum { HFP_CMD_OK, HFP_CMD_SUPPORTED_FEATURES, HFP_CMD_AVAILABLE_CODECS, - HFP_CMD_INDICATOR, // 5 + + HFP_CMD_RETRIEVE_AG_INDICATORS, + HFP_CMD_RETRIEVE_AG_INDICATORS_STATUS, + HFP_CMD_ENABLE_INDICATOR_STATUS_UPDATE, HFP_CMD_ENABLE_INDIVIDUAL_AG_INDICATOR_STATUS_UPDATE, HFP_CMD_SUPPORT_CALL_HOLD_AND_MULTIPARTY_SERVICES, @@ -375,9 +378,6 @@ typedef struct hfp_connection { uint8_t keep_separator; - uint8_t retrieve_ag_indicators; // HFP_CMD_INDICATOR, check if needed - uint8_t retrieve_ag_indicators_status; - uint8_t list_generic_status_indicators; // HFP_CMD_LIST_GENERIC_STATUS_INDICATOR uint8_t retrieve_generic_status_indicators; // HFP_CMD_GENERIC_STATUS_INDICATOR uint8_t retrieve_generic_status_indicators_state; // HFP_CMD_GENERIC_STATUS_INDICATOR_STATE diff --git a/src/hfp_ag.c b/src/hfp_ag.c index e891ec0d0..b425a9e57 100644 --- a/src/hfp_ag.c +++ b/src/hfp_ag.c @@ -462,24 +462,19 @@ static int hfp_ag_run_for_context_service_level_connection(hfp_connection_t * co context->state = HFP_W4_RETRIEVE_INDICATORS; } break; - case HFP_CMD_INDICATOR: - switch(context->state){ - case HFP_W4_RETRIEVE_INDICATORS: - if (context->retrieve_ag_indicators == 0) break; - hfp_ag_retrieve_indicators_cmd(context->rfcomm_cid, context); - done = 1; - context->state = HFP_W4_RETRIEVE_INDICATORS_STATUS; - break; - case HFP_W4_RETRIEVE_INDICATORS_STATUS: - if (context->retrieve_ag_indicators_status == 0) break; - hfp_ag_retrieve_indicators_status_cmd(context->rfcomm_cid); - done = 1; - context->state = HFP_W4_ENABLE_INDICATORS_STATUS_UPDATE; - break; - default: - break; - } + case HFP_CMD_RETRIEVE_AG_INDICATORS: + if (context->state != HFP_W4_RETRIEVE_INDICATORS) break; + context->state = HFP_W4_RETRIEVE_INDICATORS_STATUS; + done = 1; + hfp_ag_retrieve_indicators_cmd(context->rfcomm_cid, context); break; + case HFP_CMD_RETRIEVE_AG_INDICATORS_STATUS: + if (context->state != HFP_W4_RETRIEVE_INDICATORS_STATUS) break; + context->state = HFP_W4_ENABLE_INDICATORS_STATUS_UPDATE; + done = 1; + hfp_ag_retrieve_indicators_status_cmd(context->rfcomm_cid); + break; + case HFP_CMD_ENABLE_INDICATOR_STATUS_UPDATE: switch(context->state){ case HFP_W4_ENABLE_INDICATORS_STATUS_UPDATE: diff --git a/src/hfp_hf.c b/src/hfp_hf.c index df539593e..991a76cb9 100644 --- a/src/hfp_hf.c +++ b/src/hfp_hf.c @@ -269,15 +269,13 @@ static int hfp_hf_run_for_context_service_level_connection(hfp_connection_t * co hfp_hf_cmd_retrieve_indicators(context->rfcomm_cid); done = 1; context->state = HFP_W4_RETRIEVE_INDICATORS; - context->retrieve_ag_indicators = 1; - context->retrieve_ag_indicators_status = 0; + context->command = HFP_CMD_RETRIEVE_AG_INDICATORS; break; case HFP_RETRIEVE_INDICATORS_STATUS: hfp_hf_cmd_retrieve_indicators_status(context->rfcomm_cid); done = 1; context->state = HFP_W4_RETRIEVE_INDICATORS_STATUS; - context->retrieve_ag_indicators_status = 1; - context->retrieve_ag_indicators = 0; + context->command = HFP_CMD_RETRIEVE_AG_INDICATORS; break; case HFP_ENABLE_INDICATORS_STATUS_UPDATE: hfp_hf_cmd_activate_status_update_for_all_ag_indicators(context->rfcomm_cid, 1); @@ -336,12 +334,10 @@ static void hfp_hf_handle_ok_service_level_connection_establishment(hfp_connecti case HFP_W4_RETRIEVE_INDICATORS: context->state = HFP_RETRIEVE_INDICATORS_STATUS; - context->retrieve_ag_indicators = 0; break; case HFP_W4_RETRIEVE_INDICATORS_STATUS: context->state = HFP_ENABLE_INDICATORS_STATUS_UPDATE; - context->retrieve_ag_indicators_status = 0; break; case HFP_W4_ENABLE_INDICATORS_STATUS_UPDATE: diff --git a/test/hfp/hfp_hf_parser_test.c b/test/hfp/hfp_hf_parser_test.c index 188a19a84..727147f5b 100644 --- a/test/hfp/hfp_hf_parser_test.c +++ b/test/hfp/hfp_hf_parser_test.c @@ -107,8 +107,7 @@ TEST(HFPParser, HFP_HF_INDICATORS){ } offset += snprintf(packet+offset, sizeof(packet)-offset, "\"%s\", (%d, %d)\r\n\r\nOK\r\n", hfp_ag_indicators[pos].name, hfp_ag_indicators[pos].min_range, hfp_ag_indicators[pos].max_range); - context.retrieve_ag_indicators = 1; - context.retrieve_ag_indicators_status = 0; + context.command = HFP_CMD_RETRIEVE_AG_INDICATORS; for (pos = 0; pos < strlen(packet); pos++){ hfp_parse(&context, packet[pos]); @@ -132,10 +131,8 @@ TEST(HFPParser, HFP_HF_INDICATOR_STATUS){ } offset += snprintf(packet+offset, sizeof(packet)-offset, "%d\r\n\r\nOK\r\n", hfp_ag_indicators[pos].status); - context.command = HFP_CMD_INDICATOR; - context.retrieve_ag_indicators_status = 1; - context.retrieve_ag_indicators = 0; - + context.command = HFP_CMD_RETRIEVE_AG_INDICATORS_STATUS; + for (pos = 0; pos < strlen(packet); pos++){ hfp_parse(&context, packet[pos]); }