static int stdin_process(struct data_source *ds){ read(ds->fd, &cmd, 1); switch (cmd){ case 'a': memcpy(device_addr, pts_addr, 6); log_info("USER:\'%c\'", cmd); printf("Establish HFP service level connection to PTS module %s...\n", bd_addr_to_str(device_addr)); hfp_ag_establish_service_level_connection(device_addr); break; case 'A': log_info("USER:\'%c\'", cmd); printf("Release HFP service level connection.\n"); hfp_ag_release_service_level_connection(device_addr); break; case 'z': memcpy(device_addr, speaker_addr, 6); log_info("USER:\'%c\'", cmd); printf("Establish HFP service level connection to %s...\n", bd_addr_to_str(device_addr)); hfp_ag_establish_service_level_connection(device_addr); break; case 'Z': log_info("USER:\'%c\'", cmd); printf("Release HFP service level connection to %s...\n", bd_addr_to_str(device_addr)); hfp_ag_release_service_level_connection(device_addr); break; case 'b': log_info("USER:\'%c\'", cmd); printf("Establish Audio connection %s...\n", bd_addr_to_str(device_addr)); hfp_ag_establish_audio_connection(device_addr); break; case 'B': log_info("USER:\'%c\'", cmd); printf("Release Audio connection.\n"); hfp_ag_release_audio_connection(device_addr); break; case 'c': log_info("USER:\'%c\'", cmd); printf("Simulate incoming call from 1234567\n"); hfp_ag_set_clip(129, "1234567"); hfp_ag_incoming_call(); break; case 'm': log_info("USER:\'%c\'", cmd); printf("Simulate incoming call from 7654321\n"); hfp_ag_set_clip(129, "7654321"); hfp_ag_incoming_call(); break; case 'C': log_info("USER:\'%c\'", cmd); printf("Simulate terminate call\n"); hfp_ag_call_dropped(); break; case 'd': log_info("USER:\'%c\'", cmd); printf("Report AG failure\n"); hfp_ag_report_extended_audio_gateway_error_result_code(device_addr, HFP_CME_ERROR_AG_FAILURE); break; case 'e': log_info("USER:\'%c\'", cmd); printf("Answer call on AG\n"); hfp_ag_answer_incoming_call(); break; case 'E': log_info("USER:\'%c\'", cmd); printf("Reject call on AG\n"); hfp_ag_terminate_call(); break; case 'f': log_info("USER:\'%c\'", cmd); printf("Disable cellular network\n"); hfp_ag_set_registration_status(0); break; case 'F': log_info("USER:\'%c\'", cmd); printf("Enable cellular network\n"); hfp_ag_set_registration_status(1); break; case 'g': log_info("USER:\'%c\'", cmd); printf("Set signal strength to 0\n"); hfp_ag_set_signal_strength(0); break; case 'G': log_info("USER:\'%c\'", cmd); printf("Set signal strength to 5\n"); hfp_ag_set_signal_strength(5); break; case 'h': log_info("USER:\'%c\'", cmd); printf("Disable roaming\n"); hfp_ag_set_roaming_status(0); break; case 'H': log_info("USER:\'%c\'", cmd); printf("Enable roaming\n"); hfp_ag_set_roaming_status(1); break; case 'i': log_info("USER:\'%c\'", cmd); printf("Set battery level to 3\n"); hfp_ag_set_battery_level(3); break; case 'I': log_info("USER:\'%c\'", cmd); printf("Set battery level to 5\n"); hfp_ag_set_battery_level(5); break; case 'j': log_info("USER:\'%c\'", cmd); printf("Answering call on remote side\n"); hfp_ag_outgoing_call_established(); break; case 'r': log_info("USER:\'%c\'", cmd); printf("Disable in-band ring tone\n"); hfp_ag_set_use_in_band_ring_tone(0); break; case 'k': log_info("USER:\'%c\'", cmd); printf("Memory 1 cleared\n"); memory_1_enabled = 0; break; case 'K': log_info("USER:\'%c\'", cmd); printf("Memory 1 set\n"); memory_1_enabled = 1; break; case 'l': log_info("USER:\'%c\'", cmd); printf("Last dialed number cleared\n"); hfp_ag_clear_last_dialed_number(); break; case 'L': log_info("USER:\'%c\'", cmd); printf("Outgoing call connected, ringing\n"); hfp_ag_outgoing_call_ringing(); break; case 'n': log_info("USER:\'%c\'", cmd); printf("Disable Voice Recognition\n"); hfp_ag_activate_voice_recognition(device_addr, 0); break; case 'N': log_info("USER:\'%c\'", cmd); printf("Enable Voice Recognition\n"); hfp_ag_activate_voice_recognition(device_addr, 1); break; case 'o': log_info("USER:\'%c\'", cmd); printf("Set speaker gain to 0 (minimum)\n"); hfp_ag_set_speaker_gain(device_addr, 0); break; case 'O': log_info("USER:\'%c\'", cmd); printf("Set speaker gain to 9 (default)\n"); hfp_ag_set_speaker_gain(device_addr, 9); break; case 'p': log_info("USER:\'%c\'", cmd); printf("Set speaker gain to 12 (higher)\n"); hfp_ag_set_speaker_gain(device_addr, 12); break; case 'P': log_info("USER:\'%c\'", cmd); printf("Set speaker gain to 15 (maximum)\n"); hfp_ag_set_speaker_gain(device_addr, 15); break; case 'q': log_info("USER:\'%c\'", cmd); printf("Set microphone gain to 0\n"); hfp_ag_set_microphone_gain(device_addr, 0); break; case 'Q': log_info("USER:\'%c\'", cmd); printf("Set microphone gain to 9\n"); hfp_ag_set_microphone_gain(device_addr, 9); break; case 's': log_info("USER:\'%c\'", cmd); printf("Set microphone gain to 12\n"); hfp_ag_set_microphone_gain(device_addr, 12); break; case 'S': log_info("USER:\'%c\'", cmd); printf("Set microphone gain to 15\n"); hfp_ag_set_microphone_gain(device_addr, 15); break; case 'R': log_info("USER:\'%c\'", cmd); printf("Enable in-band ring tone\n"); hfp_ag_set_use_in_band_ring_tone(1); break; case 't': log_info("USER:\'%c\'", cmd); printf("Terminate HCI connection.\n"); gap_disconnect(handle); break; case 'u': log_info("USER:\'%c\'", cmd); printf("Join held call\n"); hfp_ag_join_held_call(); break; case 'v': start_scan(); break; case 'w': log_info("USER:\'%c\'", cmd); printf("AG: Put incoming call on hold (Response and Hold)\n"); hfp_ag_hold_incoming_call(); break; case 'x': log_info("USER:\'%c\'", cmd); printf("AG: Accept held incoming call (Response and Hold)\n"); hfp_ag_accept_held_incoming_call(); break; case 'X': log_info("USER:\'%c\'", cmd); printf("AG: Reject held incoming call (Response and Hold)\n"); hfp_ag_reject_held_incoming_call(); break; default: show_usage(); break; } return 0; }
static void user_command(char cmd){ switch (cmd){ case 'a': memcpy(device_addr, pts_addr, 6); printf("Establish HFP service level connection to PTS module %s...\n", bd_addr_to_str(device_addr)); hfp_ag_establish_service_level_connection(device_addr); break; case 'A': printf("Release HFP service level connection.\n"); hfp_ag_release_service_level_connection(device_addr); break; case 'Z': printf("Release HFP service level connection to %s...\n", bd_addr_to_str(device_addr)); hfp_ag_release_service_level_connection(device_addr); break; case 'b': printf("Establish Audio connection %s...\n", bd_addr_to_str(device_addr)); hfp_ag_establish_audio_connection(device_addr); break; case 'B': printf("Release Audio connection.\n"); hfp_ag_release_audio_connection(device_addr); break; case 'c': printf("Simulate incoming call from 1234567\n"); current_call_exists_a = 1; current_call_status_a = HFP_ENHANCED_CALL_STATUS_INCOMING; current_call_dir = HFP_ENHANCED_CALL_DIR_INCOMING; hfp_ag_set_clip(129, "1234567"); hfp_ag_incoming_call(); break; case 'm': printf("Simulate incoming call from 7654321\n"); current_call_exists_b = 1; current_call_status_b = HFP_ENHANCED_CALL_STATUS_INCOMING; current_call_dir = HFP_ENHANCED_CALL_DIR_INCOMING; hfp_ag_set_clip(129, "7654321"); hfp_ag_incoming_call(); break; case 'C': printf("Simulate terminate call\n"); hfp_ag_call_dropped(); break; case 'd': printf("Report AG failure\n"); hfp_ag_report_extended_audio_gateway_error_result_code(device_addr, HFP_CME_ERROR_AG_FAILURE); break; case 'e': printf("Answer call on AG\n"); if (current_call_status_a == HFP_ENHANCED_CALL_STATUS_INCOMING){ current_call_status_a = HFP_ENHANCED_CALL_STATUS_ACTIVE; } if (current_call_status_b == HFP_ENHANCED_CALL_STATUS_INCOMING){ current_call_status_b = HFP_ENHANCED_CALL_STATUS_ACTIVE; current_call_status_a = HFP_ENHANCED_CALL_STATUS_HELD; } hfp_ag_answer_incoming_call(); break; case 'E': printf("Reject call on AG\n"); hfp_ag_terminate_call(); break; case 'f': printf("Disable cellular network\n"); hfp_ag_set_registration_status(0); break; case 'F': printf("Enable cellular network\n"); hfp_ag_set_registration_status(1); break; case 'g': printf("Set signal strength to 0\n"); hfp_ag_set_signal_strength(0); break; case 'G': printf("Set signal strength to 5\n"); hfp_ag_set_signal_strength(5); break; case 'h': printf("Disable roaming\n"); hfp_ag_set_roaming_status(0); break; case 'H': printf("Enable roaming\n"); hfp_ag_set_roaming_status(1); break; case 'i': printf("Set battery level to 3\n"); hfp_ag_set_battery_level(3); break; case 'I': printf("Set battery level to 5\n"); hfp_ag_set_battery_level(5); break; case 'j': printf("Answering call on remote side\n"); hfp_ag_outgoing_call_established(); break; case 'r': printf("Disable in-band ring tone\n"); hfp_ag_set_use_in_band_ring_tone(0); break; case 'k': printf("Memory 1 cleared\n"); memory_1_enabled = 0; break; case 'K': printf("Memory 1 set\n"); memory_1_enabled = 1; break; case 'l': printf("Last dialed number cleared\n"); last_number_exists = 0; break; case 'L': printf("Last dialed number set\n"); last_number_exists = 1; break; case 'n': printf("Disable Voice Recognition\n"); hfp_ag_activate_voice_recognition(device_addr, 0); break; case 'N': printf("Enable Voice Recognition\n"); hfp_ag_activate_voice_recognition(device_addr, 1); break; case 'o': printf("Set speaker gain to 0 (minimum)\n"); hfp_ag_set_speaker_gain(device_addr, 0); break; case 'O': printf("Set speaker gain to 9 (default)\n"); hfp_ag_set_speaker_gain(device_addr, 9); break; case 'p': printf("Set speaker gain to 12 (higher)\n"); hfp_ag_set_speaker_gain(device_addr, 12); break; case 'P': printf("Set speaker gain to 15 (maximum)\n"); hfp_ag_set_speaker_gain(device_addr, 15); break; case 'q': printf("Set microphone gain to 0\n"); hfp_ag_set_microphone_gain(device_addr, 0); break; case 'Q': printf("Set microphone gain to 9\n"); hfp_ag_set_microphone_gain(device_addr, 9); break; case 's': printf("Set microphone gain to 12\n"); hfp_ag_set_microphone_gain(device_addr, 12); break; case 'S': printf("Set microphone gain to 15\n"); hfp_ag_set_microphone_gain(device_addr, 15); break; case 'R': printf("Enable in-band ring tone\n"); hfp_ag_set_use_in_band_ring_tone(1); break; case 't': printf("Terminate HCI connection.\n"); gap_disconnect(handle); break; case 'u': printf("Join held call\n"); current_call_mpty = HFP_ENHANCED_CALL_MPTY_CONFERENCE_CALL; hfp_ag_join_held_call(); break; case 'v': printf("Starting inquiry scan..\n"); // hci_send_cmd(&hci_inquiry, HCI_INQUIRY_LAP, INQUIRY_INTERVAL, 0); break; case 'w': printf("AG: Put incoming call on hold (Response and Hold)\n"); hfp_ag_hold_incoming_call(); break; case 'x': printf("AG: Accept held incoming call (Response and Hold)\n"); hfp_ag_accept_held_incoming_call(); break; case 'X': printf("AG: Reject held incoming call (Response and Hold)\n"); hfp_ag_reject_held_incoming_call(); break; default: break; } }
static int incoming_call_state_machine(hfp_connection_t * context){ if (!context->run_call_state_machine) return 0; if (context->state < HFP_SERVICE_LEVEL_CONNECTION_ESTABLISHED) return 0; // printf(" -> State machine: Incoming Call\n"); hfp_ag_indicator_t * indicator; if (context->command == HFP_CMD_HANG_UP_CALL){ context->terminate_call = 1; hfp_ag_ok(context->rfcomm_cid); return 1; } if (context->terminate_call){ printf(" -> State machine: Terminate Incoming Call\n"); indicator = get_ag_indicator_for_name("call"); if (!indicator) return 0; indicator->status = HFP_CALLSETUP_STATUS_NO_CALL_SETUP_IN_PROGRESS; context->terminate_call = 0; context->run_call_state_machine = 0; hfp_emit_event(hfp_callback, HFP_SUBEVENT_CALL_TERMINATED, 0); hfp_ag_transfer_ag_indicators_status_cmd(context->rfcomm_cid, indicator); return 1; } int done = 0; switch (context->call_state){ case HFP_CALL_IDLE: //printf(" HFP_CALL_TRIGGER_AUDIO_CONNECTION \n"); indicator = get_ag_indicator_for_name("callsetup"); if (!indicator) return 0; indicator->status = HFP_CALLSETUP_STATUS_INCOMING_CALL_SETUP_IN_PROGRESS; hfp_ag_transfer_ag_indicators_status_cmd(context->rfcomm_cid, indicator); if (use_in_band_tone(context)){ context->call_state = HFP_CALL_TRIGGER_AUDIO_CONNECTION; } else { context->call_state = HFP_CALL_RING;; hfp_emit_event(hfp_callback, HFP_SUBEVENT_START_RINGINIG, 0); } return 1; case HFP_CALL_RING: //printf(" HFP_CALL_RING \n"); context->call_state = HFP_CALL_W4_ANSWER; hfp_ag_ring(context->rfcomm_cid); return 1; case HFP_CALL_W4_ANSWER: //printf(" HFP_CALL_W4_ANSWER, cmd %d \n", context->command); if (context->command != HFP_CMD_CALL_ANSWERED) return 0; context->call_state = HFP_CALL_TRANSFER_CALL_STATUS; hfp_emit_event(hfp_callback, HFP_SUBEVENT_STOP_RINGINIG, 0); hfp_ag_ok(context->rfcomm_cid); return 1; case HFP_CALL_TRANSFER_CALL_STATUS: //printf(" HFP_CALL_TRANSFER_CALL_STATUS \n"); context->call_state = HFP_CALL_TRANSFER_CALLSETUP_STATUS; indicator = get_ag_indicator_for_name("call"); indicator->status = HFP_CALL_STATUS_ACTIVE_OR_HELD_CALL_IS_PRESENT; hfp_ag_transfer_ag_indicators_status_cmd(context->rfcomm_cid, indicator); return 1; case HFP_CALL_TRANSFER_CALLSETUP_STATUS: //printf(" HFP_CALL_TRANSFER_CALLSETUP_STATUS \n"); if (use_in_band_tone(context)){ context->call_state = HFP_CALL_ACTIVE; } else { context->call_state = HFP_CALL_TRIGGER_AUDIO_CONNECTION; } indicator = get_ag_indicator_for_name("callsetup"); indicator->status = HFP_HELDCALL_STATUS_NO_CALLS_HELD; hfp_ag_transfer_ag_indicators_status_cmd(context->rfcomm_cid, indicator); return 1; case HFP_CALL_TRIGGER_AUDIO_CONNECTION: //printf(" HFP_CALL_TRIGGER_AUDIO_CONNECTION \n"); context->call_state = HFP_CALL_W4_AUDIO_CONNECTION; hfp_ag_establish_audio_connection(context->remote_addr); break; case HFP_CALL_W4_AUDIO_CONNECTION: //printf(" HFP_CALL_W4_AUDIO_CONNECTION \n"); if (context->state < HFP_AUDIO_CONNECTION_ESTABLISHED) return 0; if (use_in_band_tone(context)){ context->call_state = HFP_CALL_W4_ANSWER; hfp_emit_event(hfp_callback, HFP_SUBEVENT_START_RINGINIG, 0); } else { context->call_state = HFP_CALL_ACTIVE; } return 0; case HFP_CALL_ACTIVE: printf(" HFP_CALL_ACTIVE \n"); break; default: break; } return done; }