From eed8f8865ca3c1071c4f4e28bf7ddd11ccf79a85 Mon Sep 17 00:00:00 2001 From: Ji-hoon Lee Date: Tue, 23 Oct 2018 15:56:24 +0900 Subject: [PATCH] Send change_assistant request to panel on wakeup event Change-Id: I60c91cd2aad89eed3bdaaf930aee9c0eb4e4620a --- inc/multi_assistant_main.h | 1 + inc/multi_assistant_service.h | 2 ++ src/multi_assistant_dbus.c | 40 ++++++++++++++++++++++++++ src/multi_assistant_dbus.h | 2 ++ src/multi_assistant_service.c | 43 ++++++++++++++++++++++++++-- src/multi_assistant_service_plugin.c | 5 +++- 6 files changed, 89 insertions(+), 4 deletions(-) diff --git a/inc/multi_assistant_main.h b/inc/multi_assistant_main.h index 3394f87..7ba7fcb 100644 --- a/inc/multi_assistant_main.h +++ b/inc/multi_assistant_main.h @@ -68,6 +68,7 @@ #define MAS_UI_METHOD_SEND_ASR_RESULT "mas_ui_method_send_asr_result" #define MAS_UI_METHOD_SEND_RESULT "mas_ui_method_send_result" +#define MAS_UI_METHOD_CHANGE_ASSISTANT "mas_ui_method_change_assistant" #define MAS_UI_METHOD_ERROR "mas_ui_method_error" diff --git a/inc/multi_assistant_service.h b/inc/multi_assistant_service.h index 009ee7c..017ec20 100644 --- a/inc/multi_assistant_service.h +++ b/inc/multi_assistant_service.h @@ -51,6 +51,8 @@ int mas_get_client_pid_by_wakeup_word(const char *wakeup_word); int mas_get_client_pid_by_appid(const char *appid); +const char* mas_get_client_appid_by_pid(int pid); + int mas_set_current_client_by_wakeup_word(const char *wakeup_word); int mas_set_current_client_by_appid(const char *appid); diff --git a/src/multi_assistant_dbus.c b/src/multi_assistant_dbus.c index b020b7a..fa6aa54 100644 --- a/src/multi_assistant_dbus.c +++ b/src/multi_assistant_dbus.c @@ -449,6 +449,46 @@ int masc_ui_dbus_send_result(int pid, const char* display_text, const char* utte return 0; } +int masc_ui_dbus_change_assistant(char* app_id) +{ + if (0 != __dbus_check()) { + return -1; //MAS_ERROR_OPERATION_FAILED; + } + + if (NULL == app_id) { + MAS_LOGE("@@ Request multi-assistant send change assistant request : Fail to make message"); + return -1; //MA_ERROR_OPERATION_FAILED; + } else { + MAS_LOGD("[DEBUG] multi-assistant send change assistant request app_id(%s)", app_id); + } + + DBusMessage* msg; + + msg = dbus_message_new_method_call( + MA_UI_CLIENT_SERVICE_NAME, + MA_UI_CLIENT_SERVICE_OBJECT_PATH, + MA_UI_CLIENT_SERVICE_INTERFACE, + MAS_UI_METHOD_CHANGE_ASSISTANT); + + dbus_message_append_args(msg, + DBUS_TYPE_STRING, &app_id, + DBUS_TYPE_INVALID); + + dbus_message_set_no_reply(msg, TRUE); + + if (1 != dbus_connection_send(g_conn_sender, msg, NULL)) { + MAS_LOGE("[Dbus ERROR] Fail to Send"); + return -1; // MAS_ERROR_OPERATION_FAILED; + } else { + MAS_LOGD("[Dbus DEBUG] Success to Send change assistant request"); + dbus_connection_flush(g_conn_sender); + } + + dbus_message_unref(msg); + + return 0; +} + int masc_ui_dbus_send_error_message(int reason, const char* err_msg) { if (NULL == g_conn_sender) { diff --git a/src/multi_assistant_dbus.h b/src/multi_assistant_dbus.h index 3b54aa4..76af068 100644 --- a/src/multi_assistant_dbus.h +++ b/src/multi_assistant_dbus.h @@ -37,6 +37,8 @@ int masc_ui_dbus_send_asr_result(int pid, int event, char* asr_result); int masc_ui_dbus_send_result(int pid, const char* display_text, const char* utterance_text, const char* result_json); +int masc_ui_dbus_change_assistant(char* app_id); + int masc_ui_dbus_send_error_message(int reason, const char* err_msg); diff --git a/src/multi_assistant_service.c b/src/multi_assistant_service.c index 62e3a9a..c35f94b 100644 --- a/src/multi_assistant_service.c +++ b/src/multi_assistant_service.c @@ -510,7 +510,7 @@ static const char* __get_client_appid_by_wakeup_word(const char *wakeup_word) if (NULL == wakeup_word) return NULL; - for (loop = 0; loop < MAX_MACLIENT_INFO_NUM && appid == NULL; loop++) { + for (loop = 0; loop < MAX_MACLIENT_INFO_NUM && NULL == appid; loop++) { if (g_maclient_info[loop].used && strlen(g_maclient_info[loop].appid) > 0) { for (int inner_loop = 0; inner_loop < MAX_WAKEUP_WORDS_NUM; inner_loop++) { @@ -525,7 +525,7 @@ static const char* __get_client_appid_by_wakeup_word(const char *wakeup_word) /* Perform extended search, by eliminating blank characters */ if (NULL == appid) { - for (loop = 0; loop < MAX_MACLIENT_INFO_NUM && appid == NULL; loop++) { + for (loop = 0; loop < MAX_MACLIENT_INFO_NUM && NULL == appid; loop++) { if (g_maclient_info[loop].used && strlen(g_maclient_info[loop].appid) > 0) { for (int inner_loop = 0; inner_loop < MAX_WAKEUP_WORDS_NUM; inner_loop++) { @@ -577,6 +577,17 @@ int mas_get_client_pid_by_appid(const char *appid) return ret; } +const char* mas_get_client_appid_by_pid(int pid) +{ + const char *ret = NULL; + ma_client_s *client = NULL; + client = ma_client_find_by_pid(pid); + if (client) { + ret = client->appid; + } + return ret; +} + int mas_get_client_pid_by_wakeup_word(const char *wakeup_word) { const char *appid = __get_client_appid_by_wakeup_word(wakeup_word); @@ -585,20 +596,46 @@ int mas_get_client_pid_by_wakeup_word(const char *wakeup_word) int mas_set_current_client_by_wakeup_word(const char *wakeup_word) { + int loop; int ret = -1; - for (int loop = 0; loop < MAX_MACLIENT_INFO_NUM; loop++) { + for (loop = 0; loop < MAX_MACLIENT_INFO_NUM && -1 == ret; loop++) { if (g_maclient_info[loop].used && strlen(g_maclient_info[loop].appid) > 0) { for (int inner_loop = 0; inner_loop < MAX_WAKEUP_WORDS_NUM; inner_loop++) { if (strlen(g_maclient_info[loop].wakeup_word[inner_loop]) > 0) { if (0 == strncmp(wakeup_word, g_maclient_info[loop].wakeup_word[inner_loop], MAX_WAKEUP_WORD_LEN)) { g_current_maclient_info = loop; + ret = 0; + } + } + } + } + } + /* Perform extended search, by eliminating blank characters */ + if (ret == -1) { + for (loop = 0; loop < MAX_MACLIENT_INFO_NUM && -1 == ret; loop++) { + if (g_maclient_info[loop].used && + strlen(g_maclient_info[loop].appid) > 0) { + for (int inner_loop = 0; inner_loop < MAX_WAKEUP_WORDS_NUM; inner_loop++) { + if (strlen(g_maclient_info[loop].wakeup_word[inner_loop]) > 0) { + char comparand[MAX_WAKEUP_WORD_LEN]; + int comparand_index = 0; + for (int index = 0; index < MAX_WAKEUP_WORD_LEN; index++) { + if (' ' != g_maclient_info[loop].wakeup_word[inner_loop][index]) { + comparand[comparand_index++] = g_maclient_info[loop].wakeup_word[inner_loop][index]; + } + } + if (0 == strncmp(wakeup_word, comparand, MAX_WAKEUP_WORD_LEN)) { + g_current_maclient_info = loop; + ret = 0; + } } } } } } + return ret; } diff --git a/src/multi_assistant_service_plugin.c b/src/multi_assistant_service_plugin.c index 229b2c9..1e4a7f7 100644 --- a/src/multi_assistant_service_plugin.c +++ b/src/multi_assistant_service_plugin.c @@ -81,11 +81,14 @@ Eina_Bool __request_speech_data(void *data) { MAS_LOGD("[ENTER]"); + int pid = -1; char *wakeup_word = (char*)data; + if (!wakeup_word) return EINA_FALSE; mas_set_current_client_by_wakeup_word(wakeup_word); - if (mas_get_client_pid_by_wakeup_word(wakeup_word) != -1) { + if ((pid = mas_get_client_pid_by_wakeup_word(wakeup_word)) != -1) { MAS_LOGD("MA Client with wakeup word %s exists, requesting speech data", (wakeup_word ? wakeup_word : "NULL")); + masc_ui_dbus_change_assistant(mas_get_client_appid_by_pid(pid)); ma_client_set_temp_speech_data_requested(1); int ret = wakeup_service_request_speech_data(); if (0 != ret) { -- 2.34.1