hfp: place call with number

This commit is contained in:
Milanka Ringwald 2015-11-20 17:29:41 +01:00
parent 25ec4d39d5
commit daf14d5808
4 changed files with 31 additions and 3 deletions

View File

@ -640,7 +640,7 @@ extern "C" {
#define HFP_SUBEVENT_START_RINGINIG 0x0A
#define HFP_SUBEVENT_STOP_RINGINIG 0x0B
#define HFP_SUBEVENT_CALL_TERMINATED 0x0C
#define HFP_SUBEVENT_PLACE_CALL_WITH_NUMBER 0x0D

View File

@ -204,6 +204,17 @@ void hfp_emit_event(hfp_callback_t callback, uint8_t event_subtype, uint8_t valu
(*callback)(event, sizeof(event));
}
void hfp_emit_string_event(hfp_callback_t callback, uint8_t event_subtype, const char * value){
if (!callback) return;
uint8_t event[24];
event[0] = HCI_EVENT_HFP_META;
event[1] = sizeof(event) - 2;
event[2] = event_subtype;
int size = sizeof(value) < sizeof(event) - 4? sizeof(value) : sizeof(event) - 4;
strncpy((char*)&event[3], value, size);
(*callback)(event, sizeof(event));
}
static void hfp_emit_audio_connection_established_event(hfp_callback_t callback, uint8_t value, uint16_t sco_handle){
if (!callback) return;
uint8_t event[6];
@ -613,6 +624,10 @@ static hfp_command_t parse_command(const char * line_buffer, int isHandsFree){
return HFP_CMD_CALL_ANSWERED;
}
if (strncmp(line_buffer+offset, HFP_CALL_PHONE_NUMBER, strlen(HFP_CALL_PHONE_NUMBER)) == 0){
return HFP_CMD_CALL_PHONE_NUMBER;
}
if (strncmp(line_buffer+offset, HFP_CHANGE_IN_BAND_RING_TONE_SETTING, strlen(HFP_CHANGE_IN_BAND_RING_TONE_SETTING)) == 0){
return HFP_CMD_CHANGE_IN_BAND_RING_TONE_SETTING;
}
@ -861,6 +876,10 @@ void hfp_parse(hfp_connection_t * context, uint8_t byte, int isHandsFree){
case HFP_PARSER_CMD_SEQUENCE: // parse comma separated sequence, ignore breacktes
switch (context->command){
case HFP_CMD_CALL_PHONE_NUMBER:
context->place_call_with_number = (char *)context->line_buffer;
log_info("hfp parse HFP_CMD_CALL_PHONE_NUMBER %s", context->place_call_with_number);
break;
case HFP_CMD_CHANGE_IN_BAND_RING_TONE_SETTING:
value = atoi((char *)&context->line_buffer[0]);
context->remote_supported_features = store_bit(context->remote_supported_features, HFP_AGSF_IN_BAND_RING_TONE, value);

View File

@ -118,6 +118,7 @@ extern "C" {
#define HFP_CALL_ANSWERED "ATA"
#define HFP_HANG_UP_CALL "+CHUP"
#define HFP_CHANGE_IN_BAND_RING_TONE_SETTING "+BSIR"
#define HFP_CALL_PHONE_NUMBER "ATD"
#define HFP_OK "OK"
#define HFP_ERROR "ERROR"
@ -159,7 +160,8 @@ typedef enum {
HFP_CMD_CALL_ANSWERED,
HFP_CMD_AG_ANSWER_CALL,
HFP_CMD_HANG_UP_CALL,
HFP_CMD_CHANGE_IN_BAND_RING_TONE_SETTING
HFP_CMD_CHANGE_IN_BAND_RING_TONE_SETTING,
HFP_CMD_CALL_PHONE_NUMBER
} hfp_command_t;
typedef enum {
@ -411,8 +413,11 @@ typedef struct hfp_connection {
uint8_t run_call_state_machine;
uint8_t change_in_band_ring_tone_setting;
uint8_t ag_ring;
char * place_call_with_number;
timer_source_t hfp_timeout;
} hfp_connection_t;
// UTILS_START : TODO move to utils
@ -426,6 +431,7 @@ int store_bit(uint32_t bitmap, int position, uint8_t value);
void hfp_create_sdp_record(uint8_t * service, uint16_t service_uuid, int rfcomm_channel_nr, const char * name);
void hfp_handle_hci_event(hfp_callback_t callback, uint8_t packet_type, uint8_t *packet, uint16_t size);
void hfp_emit_event(hfp_callback_t callback, uint8_t event_subtype, uint8_t value);
void hfp_emit_string_event(hfp_callback_t callback, uint8_t event_subtype, const char * value);
hfp_connection_t * get_hfp_connection_context_for_rfcomm_cid(uint16_t cid);
hfp_connection_t * get_hfp_connection_context_for_bd_addr(bd_addr_t bd_addr);

View File

@ -1007,10 +1007,13 @@ static void hfp_handle_rfcomm_data(uint8_t packet_type, uint16_t channel, uint8_
context->command = HFP_CMD_NONE;
hfp_ag_call_sm(HFP_AG_INCOMING_CALL_ACCEPTED_BY_HF, context);
break;
case HFP_CMD_HANG_UP_CALL:
case HFP_CMD_HANG_UP_CALL:
context->command = HFP_CMD_NONE;
context->ok_pending = 1;
hfp_ag_call_sm(HFP_AG_TERMINATE_CALL_BY_HF, context);
case HFP_CMD_CALL_PHONE_NUMBER:
hfp_emit_string_event(hfp_callback, HFP_SUBEVENT_PLACE_CALL_WITH_NUMBER, context->place_call_with_number);
break;
default:
break;
}