diff --git a/src/hfp.c b/src/hfp.c index 540f1174a..e98452fbc 100644 --- a/src/hfp.c +++ b/src/hfp.c @@ -605,127 +605,122 @@ void hfp_parse(hfp_connection_t * context, uint8_t byte){ case HFP_PARSER_CMD_SEQUENCE: // parse comma separated sequence, ignore breacktes if (byte == '"'){ // indicators context->parser_state = HFP_PARSER_CMD_INDICATOR_NAME; - context->line_size = 0; break; } - - if (byte == '(' ){ // tuple separated mit comma + + if (!hfp_parser_found_separator(context, byte)){ + hfp_parser_store_byte(context, byte); break; } - - if (byte == ',' || byte == '\n' || byte == '\r' || byte == ')'){ - context->line_buffer[context->line_size] = 0; - - switch (context->command){ - case HFP_CMD_SUPPORTED_FEATURES: - context->remote_supported_features = atoi((char*)context->line_buffer); - printf("Parsed supported feature %d\n", context->remote_supported_features); - context->parser_state = HFP_PARSER_CMD_HEADER; - break; - case HFP_CMD_AVAILABLE_CODECS: - printf("Parsed codec %s\n", context->line_buffer); - context->remote_codecs[context->parser_item_index] = (uint16_t)atoi((char*)context->line_buffer); - context->parser_item_index++; - context->remote_codecs_nr = context->parser_item_index; - break; - case HFP_CMD_INDICATOR: - if (context->retrieve_ag_indicators_status == 0) break; - printf("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: - if (context->parser_item_index == 3){ - printf("Parsed Enable indicators: %s\n", context->line_buffer); - value = atoi((char *)&context->line_buffer[0]); - context->enable_status_update_for_ag_indicators = (uint8_t) value; - } else { - context->parser_item_index++; - } - break; - case HFP_CMD_SUPPORT_CALL_HOLD_AND_MULTIPARTY_SERVICES: - printf("Parsed Support call hold: %s\n", context->line_buffer); - if (context->line_size > 2 ) break; - strcpy((char *)context->remote_call_services[context->remote_call_services_nr].name, (char *)context->line_buffer); - context->remote_call_services_nr++; - - if (byte == ')'){ - context->parser_state = HFP_PARSER_CMD_HEADER; - context->parser_item_index = 0; - } - break; - case HFP_CMD_GENERIC_STATUS_INDICATOR: - printf("parser HFP_CMD_GENERIC_STATUS_INDICATOR 1 (%d, %d, %d)\n", - context->list_generic_status_indicators, - context->retrieve_generic_status_indicators, - context->retrieve_generic_status_indicators_state); - if (context->retrieve_generic_status_indicators == 1 || context->list_generic_status_indicators == 1){ - printf("Parsed Generic status indicator: %s\n", context->line_buffer); - context->generic_status_indicators[context->parser_item_index].uuid = (uint16_t)atoi((char*)context->line_buffer); - context->parser_item_index++; - context->generic_status_indicators_nr = context->parser_item_index; - break; - } - printf("parser HFP_CMD_GENERIC_STATUS_INDICATOR 2\n"); - if (context->retrieve_generic_status_indicators_state == 1){ - // HF parses inital AG gen. ind. state - printf("Parsed List generic status indicator %s state: ", context->line_buffer); - context->parser_state = HFP_PARSER_SECOND_ITEM; - context->parser_item_index = (uint8_t)atoi((char*)context->line_buffer); - break; - } - break; - - case HFP_CMD_ENABLE_INDIVIDUAL_AG_INDICATOR_STATUS_UPDATE: - // AG parses new gen. ind. state - printf("Parsed Enable ag indicator state: %s\n", context->line_buffer); - value = atoi((char *)&context->line_buffer[0]); - if (!context->ag_indicators[context->parser_item_index].mandatory){ - context->ag_indicators[context->parser_item_index].enabled = value; - } - context->parser_item_index++; - break; - case HFP_CMD_TRANSFER_AG_INDICATOR_STATUS: - // indicators are indexed starting with 1 - context->parser_item_index = atoi((char *)&context->line_buffer[0]) - 1; - context->parser_state = HFP_PARSER_SECOND_ITEM; - printf("Parsed status of the AG indicator %d, status ", context->parser_item_index); - break; - case HFP_CMD_QUERY_OPERATOR_SELECTION: - context->parser_state = HFP_PARSER_SECOND_ITEM; - context->line_size = 0; - - if (context->operator_name_format == 1){ - if (context->line_buffer[0] == '3'){ - printf("Parsed Set network operator format : %s, ", context->line_buffer); - break; - } - // TODO emit ERROR, wrong format - printf("ERROR Set network operator format: index %s not supported\n", context->line_buffer); - break; - } - - if (context->operator_name == 1) { - context->network_operator.mode = atoi((char *)&context->line_buffer[0]); - printf("Parsed network operator mode: %d, ", context->network_operator.mode); - break; - } - - break; - - default: - break; - } - context->line_size = 0; - - if (byte == '\n' || byte == '\r'){ + if (hfp_parser_buffer_empty(context)) break; + + switch (context->command){ + case HFP_CMD_SUPPORTED_FEATURES: + context->remote_supported_features = atoi((char*)context->line_buffer); + printf("Parsed supported feature %d\n", context->remote_supported_features); context->parser_state = HFP_PARSER_CMD_HEADER; - context->parser_item_index = 0; break; - } + case HFP_CMD_AVAILABLE_CODECS: + printf("Parsed codec %s\n", context->line_buffer); + context->remote_codecs[context->parser_item_index] = (uint16_t)atoi((char*)context->line_buffer); + context->parser_item_index++; + context->remote_codecs_nr = context->parser_item_index; + break; + case HFP_CMD_INDICATOR: + if (context->retrieve_ag_indicators_status == 0) break; + printf("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: + if (context->parser_item_index == 3){ + printf("Parsed Enable indicators: %s\n", context->line_buffer); + value = atoi((char *)&context->line_buffer[0]); + context->enable_status_update_for_ag_indicators = (uint8_t) value; + } else { + context->parser_item_index++; + } + break; + case HFP_CMD_SUPPORT_CALL_HOLD_AND_MULTIPARTY_SERVICES: + printf("Parsed Support call hold: %s\n", context->line_buffer); + if (context->line_size > 2 ) break; + strcpy((char *)context->remote_call_services[context->remote_call_services_nr].name, (char *)context->line_buffer); + context->remote_call_services_nr++; + + if (byte == ')'){ + context->parser_state = HFP_PARSER_CMD_HEADER; + context->parser_item_index = 0; + } + break; + case HFP_CMD_GENERIC_STATUS_INDICATOR: + printf("parser HFP_CMD_GENERIC_STATUS_INDICATOR 1 (%d, %d, %d)\n", + context->list_generic_status_indicators, + context->retrieve_generic_status_indicators, + context->retrieve_generic_status_indicators_state); + if (context->retrieve_generic_status_indicators == 1 || context->list_generic_status_indicators == 1){ + printf("Parsed Generic status indicator: %s\n", context->line_buffer); + context->generic_status_indicators[context->parser_item_index].uuid = (uint16_t)atoi((char*)context->line_buffer); + context->parser_item_index++; + context->generic_status_indicators_nr = context->parser_item_index; + break; + } + printf("parser HFP_CMD_GENERIC_STATUS_INDICATOR 2\n"); + if (context->retrieve_generic_status_indicators_state == 1){ + // HF parses inital AG gen. ind. state + printf("Parsed List generic status indicator %s state: ", context->line_buffer); + context->parser_state = HFP_PARSER_SECOND_ITEM; + context->parser_item_index = (uint8_t)atoi((char*)context->line_buffer); + break; + } + break; + + case HFP_CMD_ENABLE_INDIVIDUAL_AG_INDICATOR_STATUS_UPDATE: + // AG parses new gen. ind. state + printf("Parsed Enable ag indicator state: %s\n", context->line_buffer); + value = atoi((char *)&context->line_buffer[0]); + if (!context->ag_indicators[context->parser_item_index].mandatory){ + context->ag_indicators[context->parser_item_index].enabled = value; + } + context->parser_item_index++; + break; + case HFP_CMD_TRANSFER_AG_INDICATOR_STATUS: + // indicators are indexed starting with 1 + context->parser_item_index = atoi((char *)&context->line_buffer[0]) - 1; + context->parser_state = HFP_PARSER_SECOND_ITEM; + printf("Parsed status of the AG indicator %d, status ", context->parser_item_index); + break; + case HFP_CMD_QUERY_OPERATOR_SELECTION: + context->parser_state = HFP_PARSER_SECOND_ITEM; + context->line_size = 0; + + if (context->operator_name_format == 1){ + if (context->line_buffer[0] == '3'){ + printf("Parsed Set network operator format : %s, ", context->line_buffer); + break; + } + // TODO emit ERROR, wrong format + printf("ERROR Set network operator format: index %s not supported\n", context->line_buffer); + break; + } + + if (context->operator_name == 1) { + context->network_operator.mode = atoi((char *)&context->line_buffer[0]); + printf("Parsed network operator mode: %d, ", context->network_operator.mode); + break; + } + + break; + + default: + break; + } + + context->line_size = 0; + if (byte == '\n' || byte == '\r'){ + context->parser_state = HFP_PARSER_CMD_HEADER; + context->parser_item_index = 0; break; } - context->line_buffer[context->line_size++] = byte; break; case HFP_PARSER_SECOND_ITEM: