1
0
mirror of https://github.com/bluekitchen/btstack.git synced 2025-04-01 13:20:50 +00:00
This commit is contained in:
Matthias Ringwald 2015-11-26 14:11:17 +01:00
commit f20d01a700
4 changed files with 85 additions and 28 deletions

@ -897,15 +897,17 @@ void hfp_parse(hfp_connection_t * context, uint8_t byte, int isHandsFree){
if (!hfp_parser_found_separator(context, byte)){ if (!hfp_parser_found_separator(context, byte)){
hfp_parser_store_byte(context, byte); hfp_parser_store_byte(context, byte);
return; return;
} }
if (hfp_parser_is_end_of_line(byte)) {
if (hfp_parser_is_buffer_empty(context)){ if (context->command != HFP_CMD_ENABLE_INDIVIDUAL_AG_INDICATOR_STATUS_UPDATE){
context->parser_state = HFP_PARSER_CMD_HEADER; if (hfp_parser_is_end_of_line(byte)) {
if (hfp_parser_is_buffer_empty(context)){
context->parser_state = HFP_PARSER_CMD_HEADER;
}
} }
if (hfp_parser_is_buffer_empty(context)) return;
} }
if (hfp_parser_is_buffer_empty(context)) return;
switch (context->parser_state){ switch (context->parser_state){
case HFP_PARSER_CMD_HEADER: // header case HFP_PARSER_CMD_HEADER: // header
if (byte == '='){ if (byte == '='){
@ -950,7 +952,7 @@ void hfp_parse(hfp_connection_t * context, uint8_t byte, int isHandsFree){
} }
break; break;
case HFP_PARSER_CMD_SEQUENCE: // parse comma separated sequence, ignore breacktes case HFP_PARSER_CMD_SEQUENCE:
switch (context->command){ switch (context->command){
case HFP_CMD_SET_MICROPHONE_GAIN: case HFP_CMD_SET_MICROPHONE_GAIN:
value = atoi((char *)&context->line_buffer[0]); value = atoi((char *)&context->line_buffer[0]);
@ -1046,7 +1048,7 @@ void hfp_parse(hfp_connection_t * context, uint8_t byte, int isHandsFree){
case HFP_CMD_TRANSFER_AG_INDICATOR_STATUS: case HFP_CMD_TRANSFER_AG_INDICATOR_STATUS:
// indicators are indexed starting with 1 // indicators are indexed starting with 1
context->parser_item_index = atoi((char *)&context->line_buffer[0]) - 1; context->parser_item_index = atoi((char *)&context->line_buffer[0]) - 1;
printf("Parsed status of the AG indicator %d, status ", context->parser_item_index); log_info("Parsed status of the AG indicator %d, status ", context->parser_item_index);
break; break;
case HFP_CMD_QUERY_OPERATOR_SELECTION_NAME: case HFP_CMD_QUERY_OPERATOR_SELECTION_NAME:
context->network_operator.mode = atoi((char *)&context->line_buffer[0]); context->network_operator.mode = atoi((char *)&context->line_buffer[0]);
@ -1078,11 +1080,11 @@ void hfp_parse(hfp_connection_t * context, uint8_t byte, int isHandsFree){
case HFP_PARSER_SECOND_ITEM: case HFP_PARSER_SECOND_ITEM:
switch (context->command){ switch (context->command){
case HFP_CMD_QUERY_OPERATOR_SELECTION_NAME: case HFP_CMD_QUERY_OPERATOR_SELECTION_NAME:
printf("format %s, ", context->line_buffer); log_info("format %s, ", context->line_buffer);
context->network_operator.format = atoi((char *)&context->line_buffer[0]); context->network_operator.format = atoi((char *)&context->line_buffer[0]);
break; break;
case HFP_CMD_QUERY_OPERATOR_SELECTION_NAME_FORMAT: case HFP_CMD_QUERY_OPERATOR_SELECTION_NAME_FORMAT:
printf("format %s \n", context->line_buffer); log_info("format %s \n", context->line_buffer);
context->network_operator.format = atoi((char *)&context->line_buffer[0]); context->network_operator.format = atoi((char *)&context->line_buffer[0]);
break; break;
case HFP_CMD_LIST_GENERIC_STATUS_INDICATORS: case HFP_CMD_LIST_GENERIC_STATUS_INDICATORS:
@ -1092,7 +1094,7 @@ void hfp_parse(hfp_connection_t * context, uint8_t byte, int isHandsFree){
break; break;
case HFP_CMD_TRANSFER_AG_INDICATOR_STATUS: case HFP_CMD_TRANSFER_AG_INDICATOR_STATUS:
context->ag_indicators[context->parser_item_index].status = (uint8_t)atoi((char*)context->line_buffer); context->ag_indicators[context->parser_item_index].status = (uint8_t)atoi((char*)context->line_buffer);
printf("%d \n", context->ag_indicators[context->parser_item_index].status); log_info("%d \n", context->ag_indicators[context->parser_item_index].status);
context->ag_indicators[context->parser_item_index].status_changed = 1; context->ag_indicators[context->parser_item_index].status_changed = 1;
break; break;
case HFP_CMD_RETRIEVE_AG_INDICATORS: case HFP_CMD_RETRIEVE_AG_INDICATORS:

@ -397,6 +397,24 @@ static int codecs_exchange_state_machine(hfp_connection_t * context){
return 0; return 0;
} }
static int hfp_hf_run_for_audio_connection(hfp_connection_t * context){
if (context->state < HFP_SERVICE_LEVEL_CONNECTION_ESTABLISHED ||
context->state > HFP_W2_DISCONNECT_SCO) return 0;
if (context->state == HFP_AUDIO_CONNECTION_ESTABLISHED && context->release_audio_connection){
context->state = HFP_W4_SCO_DISCONNECTED;
context->release_audio_connection = 0;
gap_disconnect(context->sco_handle);
return 1;
}
if (context->state == HFP_AUDIO_CONNECTION_ESTABLISHED) return 0;
// run codecs exchange
return codecs_exchange_state_machine(context);
}
static void hfp_run_for_context(hfp_connection_t * context){ static void hfp_run_for_context(hfp_connection_t * context){
if (!context) return; if (!context) return;
if (!rfcomm_can_send_packet_now(context->rfcomm_cid)) return; if (!rfcomm_can_send_packet_now(context->rfcomm_cid)) return;
@ -406,7 +424,7 @@ static void hfp_run_for_context(hfp_connection_t * context){
done = hfp_hf_run_for_context_service_level_connection_queries(context); done = hfp_hf_run_for_context_service_level_connection_queries(context);
} }
if (!done){ if (!done){
done = codecs_exchange_state_machine(context); done = hfp_hf_run_for_audio_connection(context);
} }
if (done) return; if (done) return;

@ -167,19 +167,58 @@ TEST(HFPParser, HFP_AG_ENABLE_INDIVIDUAL_INDICATOR_STATUS_UPDATE){
CHECK_EQUAL(context.ag_indicators[pos].enabled, 0); CHECK_EQUAL(context.ag_indicators[pos].enabled, 0);
} }
} }
}
// sprintf(packet, "\r\nAT%s=1,,,1,1,1,\r\n", TEST(HFPParser, HFP_AG_ENABLE_INDIVIDUAL_INDICATOR_STATUS_UPDATE_OPT_VALUES2){
// HFP_UPDATE_ENABLE_STATUS_FOR_INDIVIDUAL_AG_INDICATORS); set_hfp_ag_indicators((hfp_ag_indicator_t *)&hfp_ag_indicators, hfp_ag_indicators_nr);
// for (pos = 0; pos < strlen(packet); pos++){ context.ag_indicators_nr = hfp_ag_indicators_nr;
// hfp_parse(&context, packet[pos], 0); memcpy(context.ag_indicators, hfp_ag_indicators, hfp_ag_indicators_nr * sizeof(hfp_ag_indicator_t));
// }
for (pos = 0; pos < hfp_ag_indicators_nr; pos++){
CHECK_EQUAL(get_hfp_ag_indicators(&context)[pos].index, hfp_ag_indicators[pos].index);
CHECK_EQUAL(get_hfp_ag_indicators(&context)[pos].enabled, hfp_ag_indicators[pos].enabled);
CHECK_EQUAL(context.ag_indicators[pos].index, hfp_ag_indicators[pos].index);
CHECK_EQUAL(context.ag_indicators[pos].enabled, hfp_ag_indicators[pos].enabled);
}
sprintf(packet, "\r\nAT%s=1,,,1,1,1,\r\n",
HFP_UPDATE_ENABLE_STATUS_FOR_INDIVIDUAL_AG_INDICATORS);
for (pos = 0; pos < strlen(packet); pos++){
hfp_parse(&context, packet[pos], 0);
}
// CHECK_EQUAL(HFP_CMD_ENABLE_INDIVIDUAL_AG_INDICATOR_STATUS_UPDATE, context.command); CHECK_EQUAL(HFP_CMD_ENABLE_INDIVIDUAL_AG_INDICATOR_STATUS_UPDATE, context.command);
// for (pos = 0; pos < hfp_ag_indicators_nr; pos++){ for (pos = 0; pos < hfp_ag_indicators_nr; pos++){
// CHECK_EQUAL(get_hfp_ag_indicators(&context)[pos].enabled, 1); CHECK_EQUAL(get_hfp_ag_indicators(&context)[pos].enabled, 1);
// CHECK_EQUAL(context.ag_indicators[pos].enabled, 1); CHECK_EQUAL(context.ag_indicators[pos].enabled, 1);
// } }
}
TEST(HFPParser, HFP_AG_ENABLE_INDIVIDUAL_INDICATOR_STATUS_UPDATE_OPT_VALUES1){
set_hfp_ag_indicators((hfp_ag_indicator_t *)&hfp_ag_indicators, hfp_ag_indicators_nr);
context.ag_indicators_nr = hfp_ag_indicators_nr;
memcpy(context.ag_indicators, hfp_ag_indicators, hfp_ag_indicators_nr * sizeof(hfp_ag_indicator_t));
for (pos = 0; pos < hfp_ag_indicators_nr; pos++){
CHECK_EQUAL(get_hfp_ag_indicators(&context)[pos].index, hfp_ag_indicators[pos].index);
CHECK_EQUAL(get_hfp_ag_indicators(&context)[pos].enabled, hfp_ag_indicators[pos].enabled);
CHECK_EQUAL(context.ag_indicators[pos].index, hfp_ag_indicators[pos].index);
CHECK_EQUAL(context.ag_indicators[pos].enabled, hfp_ag_indicators[pos].enabled);
}
sprintf(packet, "\r\nAT%s=1,,,1,1,,1\r\n",
HFP_UPDATE_ENABLE_STATUS_FOR_INDIVIDUAL_AG_INDICATORS);
for (pos = 0; pos < strlen(packet); pos++){
hfp_parse(&context, packet[pos], 0);
}
CHECK_EQUAL(HFP_CMD_ENABLE_INDIVIDUAL_AG_INDICATOR_STATUS_UPDATE, context.command);
for (pos = 0; pos < hfp_ag_indicators_nr; pos++){
CHECK_EQUAL(get_hfp_ag_indicators(&context)[pos].enabled, 1);
CHECK_EQUAL(context.ag_indicators[pos].enabled, 1);
}
} }
TEST(HFPParser, HFP_AG_HF_QUERY_OPERATOR_SELECTION){ TEST(HFPParser, HFP_AG_HF_QUERY_OPERATOR_SELECTION){

@ -237,11 +237,9 @@ TEST(HFPClient, HFAudioConnectionEstablishedWithoutCodecNegotiation){
setup_hfp_codecs_connection(default_cc_setup(), default_cc_setup_size()); setup_hfp_codecs_connection(default_cc_setup(), default_cc_setup_size());
CHECK_EQUAL(codecs_connection_established, 1); CHECK_EQUAL(codecs_connection_established, 1);
// hfp_hf_establish_audio_connection(device_addr); hfp_hf_establish_audio_connection(device_addr);
// CHECK_EQUAL(audio_connection_established, 1); hfp_hf_release_audio_connection(device_addr);
CHECK_EQUAL(audio_connection_established, 0);
// hfp_hf_release_audio_connection(device_addr);
// CHECK_EQUAL(audio_connection_established, 0);
} }
TEST(HFPClient, HFCodecsConnectionEstablished){ TEST(HFPClient, HFCodecsConnectionEstablished){