From: CCC <2393524978@qq.com> Date: Thu, 2 Nov 2023 01:20:07 +0000 (+0800) Subject: beike X-Git-Url: http://git.snicker.com.cn/?a=commitdiff_plain;h=56cdf2098b2f08d21c954903e01db66eb7ad1316;p=mirrors%2FASR3603_Z5.git beike --- diff --git a/2.sdk/project/Z5_K7/gui/lv_watch/resource/png/primary_function/ICON_AI_TALK.png b/2.sdk/project/Z5_K7/gui/lv_watch/resource/png/primary_function/ICON_AI_TALK.png new file mode 100644 index 00000000..9f513b3b Binary files /dev/null and b/2.sdk/project/Z5_K7/gui/lv_watch/resource/png/primary_function/ICON_AI_TALK.png differ diff --git a/2.sdk/sdk/gui/lv_watch/framework/language/lang_ch.c b/2.sdk/sdk/gui/lv_watch/framework/language/lang_ch.c index f1fdcbd8..78800367 100644 --- a/2.sdk/sdk/gui/lv_watch/framework/language/lang_ch.c +++ b/2.sdk/sdk/gui/lv_watch/framework/language/lang_ch.c @@ -883,6 +883,9 @@ const void * lang_text_ch[] = { "上传照片?", // WATCH_TEXT_ID_UPLOAD_PHOTO_Q, "发送", // WATCH_TEXT_ID_COMMON_SEND, "重拍", // WATCH_TEXT_ID_RECAPTURE, + "AI语音", // WATCH_TEXT_ID_AI_TALK, + "请按住说话", // WATCH_TEXT_ID_PRESS_TO_TALK, + "正在录音", // WATCH_TEXT_ID_AUDIO_RECORDING, //CHENG_MODIFY diff --git a/2.sdk/sdk/gui/lv_watch/framework/language/lang_en.c b/2.sdk/sdk/gui/lv_watch/framework/language/lang_en.c index c631bc21..8f9c60d5 100644 --- a/2.sdk/sdk/gui/lv_watch/framework/language/lang_en.c +++ b/2.sdk/sdk/gui/lv_watch/framework/language/lang_en.c @@ -883,6 +883,9 @@ const void * lang_text_en[] = { "Upload photo?", // WATCH_TEXT_ID_UPLOAD_PHOTO_Q, "Send", // WATCH_TEXT_ID_COMMON_SEND, "Re-capture", // WATCH_TEXT_ID_RECAPTURE, + "AI talk", // WATCH_TEXT_ID_AI_TALK, + "Press to talk", // WATCH_TEXT_ID_PRESS_TO_TALK, + "Recording", // WATCH_TEXT_ID_AUDIO_RECORDING, //CHENG_MODIFY diff --git a/2.sdk/sdk/gui/lv_watch/framework/message/mmi_msg_zhsx.c b/2.sdk/sdk/gui/lv_watch/framework/message/mmi_msg_zhsx.c index d4ac76d9..555ba669 100644 --- a/2.sdk/sdk/gui/lv_watch/framework/message/mmi_msg_zhsx.c +++ b/2.sdk/sdk/gui/lv_watch/framework/message/mmi_msg_zhsx.c @@ -131,6 +131,12 @@ void mmi_ui_msg_action_heng_ai_wake_now(void) mmi_ui_msg_action_no_para_msg(MMI_MSG_HENG_AI_WAKE_NOW); } #endif +#ifdef __MMI_CUSTOM_BEI_KE_RUI_SHENG__ +void mmi_ui_msg_action_ai_talk_incoming(void) +{ + mmi_ui_msg_action_no_para_msg(MMI_MSG_AI_TALK_INCOMING); +} +#endif diff --git a/2.sdk/sdk/gui/lv_watch/framework/message/watch_msg_handle.c b/2.sdk/sdk/gui/lv_watch/framework/message/watch_msg_handle.c index aaddeba8..f407dee9 100644 --- a/2.sdk/sdk/gui/lv_watch/framework/message/watch_msg_handle.c +++ b/2.sdk/sdk/gui/lv_watch/framework/message/watch_msg_handle.c @@ -435,7 +435,11 @@ void watch_ui_message_handle(uint16_t msgid, void * msg) mmi_ui_msg_update_heng_ai_wake_now(); break; #endif - + #ifdef __MMI_CUSTOM_BEI_KE_RUI_SHENG__ + case MMI_MSG_AI_TALK_INCOMING: + mmi_ai_talk_receive_update_ui(); + break; + #endif #endif diff --git a/2.sdk/sdk/gui/lv_watch/framework/message/watch_msg_handle.h b/2.sdk/sdk/gui/lv_watch/framework/message/watch_msg_handle.h index cb425775..32254792 100644 --- a/2.sdk/sdk/gui/lv_watch/framework/message/watch_msg_handle.h +++ b/2.sdk/sdk/gui/lv_watch/framework/message/watch_msg_handle.h @@ -125,6 +125,9 @@ enum #ifdef __MMI_CUSTOM_HENG_AI__ MMI_MSG_HENG_AI_WAKE_NOW, #endif +#ifdef __MMI_CUSTOM_BEI_KE_RUI_SHENG__ + MMI_MSG_AI_TALK_INCOMING, +#endif #endif diff --git a/2.sdk/sdk/gui/lv_watch/include/ui_activity_id.h b/2.sdk/sdk/gui/lv_watch/include/ui_activity_id.h index 491571a6..456d3519 100644 --- a/2.sdk/sdk/gui/lv_watch/include/ui_activity_id.h +++ b/2.sdk/sdk/gui/lv_watch/include/ui_activity_id.h @@ -208,6 +208,11 @@ enum ACT_ID_WEATHER_MENU, #endif ACT_ID_REMIND, +#ifdef __MMI_CUSTOM_BEI_KE_RUI_SHENG__ + ACT_ID_AI_TALK, + ACT_ID_AI_TALK_RECORDING, + ACT_ID_AI_TALK_SENDING, +#endif ACT_ID_MAX, diff --git a/2.sdk/sdk/gui/lv_watch/include/ui_textid.h b/2.sdk/sdk/gui/lv_watch/include/ui_textid.h index 65b171e0..6cea8b1e 100644 --- a/2.sdk/sdk/gui/lv_watch/include/ui_textid.h +++ b/2.sdk/sdk/gui/lv_watch/include/ui_textid.h @@ -890,6 +890,9 @@ enum WATCH_TEXT_ID_UPLOAD_PHOTO_Q, /* "上传照片?" "Upload photo?" */ WATCH_TEXT_ID_COMMON_SEND, /* "发送" "Send" */ WATCH_TEXT_ID_RECAPTURE, /* "重拍" "Re-capture" */ + WATCH_TEXT_ID_AI_TALK, /* "AI语音" "AI talk" */ + WATCH_TEXT_ID_PRESS_TO_TALK, /* "请按住说话" "Press to talk" */ + WATCH_TEXT_ID_AUDIO_RECORDING, /* "正在录音" "Recording"*/ //CHENG_MODIFY diff --git a/2.sdk/sdk/gui/lv_watch/lv_apps/custom_function/bei_ke_rui_sheng.c b/2.sdk/sdk/gui/lv_watch/lv_apps/custom_function/bei_ke_rui_sheng.c new file mode 100644 index 00000000..c93635d5 --- /dev/null +++ b/2.sdk/sdk/gui/lv_watch/lv_apps/custom_function/bei_ke_rui_sheng.c @@ -0,0 +1,2034 @@ + + + +#include "lv_watch.h" + +#ifdef __MMI_CUSTOM_BEI_KE_RUI_SHENG__ + +#define AI_TALK_AUDIO_FORMAT_TYPE (7) // 3-amr +#define AI_TALK_AUDIO_FORMAT_STR (".wav") // ".amr" + +static lv_signal_cb_t ancient_scrl_signal; + +static uint8_t s_ai_talk_init_flag = 0; +static nv_watch_wechat_msg_info_t * s_ai_talk_info = NULL; +static nv_watch_wechat_msg_item_info_t s_ai_talk_item_info = {0}; +static uint8_t s_ai_talk_play_anim_count = 0; +static char s_ai_talk_selected_item_index = -1; +static bool s_item_receive_playing = false; +static uint32_t s_ai_talk_recording_sent_size = 0; + + +void mmi_ai_talk_info_init(void) +{ + if(NULL == s_ai_talk_info) + { + uint32_t nv_data_length = sizeof(nv_watch_wechat_msg_info_t); + + s_ai_talk_info = (nv_watch_wechat_msg_info_t *)lv_mem_alloc(nv_data_length); + if(NULL == s_ai_talk_info) + { + printf("[@CHENG_DEBUG][%s][%d]: memory alloc fail\n", __FUNCTION__, __LINE__); + return; + } + _lv_memset_00(s_ai_talk_info, nv_data_length); + } + else + { + //mmi_ai_talk_info_all_item_delete(); + } +} + +uint8_t mmi_ai_talk_info_count_get(void) +{ + uint8_t msg_count = s_ai_talk_info->msg_count; + + return msg_count; +} + +uint8_t mmi_ai_talk_info_index_item_msg_from_get(uint8_t msg_index) +{ + // 0-slef; 1-other + uint8_t msg_from = s_ai_talk_info->msg_item[msg_index].msg_from; + + return msg_from; +} + +void mmi_ai_talk_info_index_item_get(uint8_t msg_index, nv_watch_wechat_msg_item_info_t ** msg_item) +{ + *msg_item = &(s_ai_talk_info->msg_item[msg_index]); +} + +void mmi_ai_talk_info_index_item_delete(uint8_t msg_index) +{ + if(msg_index >= s_ai_talk_info->msg_count) + return; + + uint8_t i = 0; + uint32_t msg_item_info_size = sizeof(nv_watch_wechat_msg_item_info_t); + + lv_fs_remove(s_ai_talk_info->msg_item[msg_index].msg_data_full_file_name); + _lv_memset_00(&(s_ai_talk_info->msg_item[msg_index]), msg_item_info_size); + + if(msg_index < s_ai_talk_info->msg_count - 1) + { + for(i = msg_index; i < s_ai_talk_info->msg_count; i++) + { + _lv_memcpy(&(s_ai_talk_info->msg_item[i]), &(s_ai_talk_info->msg_item[i + 1]), msg_item_info_size); + } + } + s_ai_talk_info->msg_count--; +} + +void mmi_ai_talk_info_all_item_delete(void) +{ + uint8_t i = 0; + uint32_t msg_item_info_size = sizeof(nv_watch_wechat_msg_item_info_t); + + for(i = 0; i < s_ai_talk_info->msg_count; i++) + { + lv_fs_remove(s_ai_talk_info->msg_item[i].msg_data_full_file_name); + _lv_memset_00(&(s_ai_talk_info->msg_item[i]), msg_item_info_size); + } + s_ai_talk_info->msg_count = 0; +} + +void mmi_ai_talk_info_new_item_add(nv_watch_wechat_msg_item_info_t * msg_item) +{ + uint32_t msg_item_info_size = sizeof(nv_watch_wechat_msg_item_info_t); + + printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__); + + if(NV_WATCH_WECHAT_NUM_MAX <= s_ai_talk_info->msg_count) + { + lv_fs_remove(s_ai_talk_info->msg_item[0].msg_data_full_file_name); + //_lv_memset_00(&(s_ai_talk_info->msg_item[0]), msg_item_info_size); + + uint8_t i = 0; + for(i = 0; i < NV_WATCH_WECHAT_NUM_MAX - 1; i++) + { + _lv_memcpy(&(s_ai_talk_info->msg_item[i]), &(s_ai_talk_info->msg_item[i + 1]), msg_item_info_size); + } + s_ai_talk_info->msg_count--; + } + + printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__); + + s_ai_talk_info->msg_count++; + _lv_memcpy(&(s_ai_talk_info->msg_item[s_ai_talk_info->msg_count - 1]), msg_item, msg_item_info_size); +} + +void * mmi_ai_talk_actId_ext_get(lv_watch_Activity_Id_t actId) +{ + lv_obj_t * activity_obj = lv_watch_get_activity_obj(actId); + if(NULL == activity_obj) + return NULL; + + lv_obj_t * watch_obj = NULL; + lv_watch_get_child_obj(activity_obj, lv_watch_obj_signal, &watch_obj); + if(NULL != watch_obj) + { + void * ext = lv_obj_get_ext_attr(watch_obj); + return ext; + } + + return NULL; +} + +static lv_obj_t * mmi_ai_talk_main_get_obj(void) +{ + lv_obj_t * watch_obj = NULL; + + lv_obj_t * activity_obj = lv_watch_get_activity_obj(ACT_ID_AI_TALK); + if(NULL != activity_obj) + { + lv_watch_get_child_obj(activity_obj, lv_watch_obj_signal, &watch_obj); + } + + return watch_obj; +} + +void mmi_ai_talk_prepare_destory(lv_obj_t * activity_obj) +{ + printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__); + + lv_watch_png_cache_all_free(); + + lv_ai_talk_ext_t * ext = mmi_ai_talk_actId_ext_get(ACT_ID_AI_TALK); + if(NULL == ext) + return ; + + printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__); + if(NULL != ext->delete_timer_id) + { + Hal_Timer_Stop(ext->delete_timer_id); + ext->delete_timer_id = NULL; + } + + mmi_ai_talk_voice_item_playing_stop(ext); + mmi_ai_talk_list_msg_item_style_reset(ext); + + // + Hal_NFFS_File_Play_End(); + Hal_Audio_Manage_End_Ind(AUDIO_CTRL_PRIORITY_5); + Hal_Vibrator_Play_End(); + s_item_receive_playing = false; + + mmi_ai_talk_tcp_disconnect_msg(NULL); + + printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__); +} + +static void mmi_ai_talk_list_set_slide_enable(lv_watch_obj_ext_t * ext, bool enable) +{ + if(enable) + { + ext->slide_enable = 1; /*enable to slide to the right*/ + } + else + { + ext->slide_enable = 0; /*disable to slide to the right*/ + } +} + +bool mmi_ai_talk_voice_is_playing(void) +{ + bool result = false; + + lv_ai_talk_ext_t * ext = mmi_ai_talk_actId_ext_get(ACT_ID_AI_TALK); + if(NULL != ext && NULL != ext->list) + { + lv_ai_talk_list_ext_t * list_page_ext = lv_obj_get_ext_attr(ext->list); + if(NULL != list_page_ext->voice_playing_anim.var) + { + result = true; + } + } + + return result; +} + +bool mmi_ai_talk_voice_is_recording(void) +{ + bool result = false; + + if(lv_watch_get_activity_obj(ACT_ID_AI_TALK_RECORDING)) + { + result = true; + } + + return result; +} + +bool mmi_ai_talk_item_is_sending(void) +{ + bool result = false; + + if(lv_watch_get_activity_obj(ACT_ID_AI_TALK_SENDING)) + { + result = true; + } + + return result; +} + +void mmi_ai_talk_receive_audio_play_audio_ctrl_callback(AUDIO_CTRL_PRIORITY priority) +{ + printf("[@CHENG_DEBUG][%s][%d]: priority=%d\n", __FUNCTION__, __LINE__, priority); + + if(AUDIO_CTRL_PRIORITY_5 == priority) + { + + } + else if(AUDIO_CTRL_PRIORITY_5 > priority) + { + Hal_NFFS_File_Play_End(); + Hal_Audio_Manage_End_Ind(AUDIO_CTRL_PRIORITY_5); + Hal_Vibrator_Play_End(); + s_item_receive_playing = false; + } +} + +void mmi_ai_talk_receive_audio_play_over_cb(void *para) +{ + printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__); + + Hal_NFFS_File_Play_End(); + Hal_Audio_Manage_End_Ind(AUDIO_CTRL_PRIORITY_5); + Hal_Vibrator_Play_End(); + s_item_receive_playing = false; +} + +static bool mmi_ai_talk_item_info_write_to_file(char * file_path, char * file_buf, uint32_t file_size) +{ + lv_fs_file_t file_p; + lv_fs_res_t res; + uint32_t bytes_write = 0; + + res = lv_fs_open(&file_p, file_path, LV_FS_MODE_WR); + if(LV_FS_RES_OK != res) + { + printf("[@CHENG_DEBUG][%s][%d]: errno=%d\n", __FUNCTION__, __LINE__, res); + lv_fs_close(&file_p); + return false; + } + res = lv_fs_write(&file_p, file_buf, file_size, &bytes_write); + lv_fs_close(&file_p); + if(LV_FS_RES_OK != res) + { + printf("[@CHENG_DEBUG][%s][%d]: errno=%d\n", __FUNCTION__, __LINE__, res); + return false; + } + printf("[@CHENG_DEBUG][%s][%d]: file_size=%d,write_size=%d\n", __FUNCTION__, __LINE__, file_size, bytes_write); + + return true; +} + +void mmi_ai_talk_receive_update_ui(void) +{ + printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__); + + if(AUDIO_CTRL_PRIORITY_5 == Hal_Audio_Manage_Start_Req(AUDIO_CTRL_PRIORITY_5, mmi_ai_talk_receive_audio_play_audio_ctrl_callback)) + { + if(false == s_item_receive_playing) + { + s_item_receive_playing = true; + + //Hal_NFFS_File_Play_Onetime(AUDIO_WECHAT_RECEIVE, (HAL_SPEAKER_GAIN)query_current_volume(), mmi_ai_talk_receive_audio_play_over_cb, NULL); + //Hal_Vibrator_Play_Onetime(NULL, 1000); + } + + if(lv_watch_get_activity_obj(ACT_ID_AI_TALK)) + { + mmi_ai_talk_main_screen_refresh(); + } + else + { + //mmi_ai_talk_create_event_cb(NULL, LV_EVENT_CLICKED); + } + } +} + +bool mmi_ai_talk_receive_from_server(char * data_buff, int data_buff_len, nv_wechat_msg_type_e type) +{ + if(NULL == data_buff || 0 == data_buff_len) + { + printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__); + return false; + } + if(WECHAT_MSG_TYPE_MAX <= type) + { + printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__); + return false; + } + + nv_watch_wechat_msg_item_info_t mmi_ai_talk_item_info = {0}; + hal_rtc_t cur_time = {0}; + char * t_file_ext[WECHAT_MSG_TYPE_MAX] = {AI_TALK_AUDIO_FORMAT_STR, "txt", "png", "png"}; // match nv_wechat_msg_type_e + + Hal_Rtc_Gettime(&cur_time); + _lv_memcpy(&(s_ai_talk_item_info.msg_time), &cur_time, sizeof(hal_rtc_t)); + + s_ai_talk_item_info.msg_from = 1; + s_ai_talk_item_info.unread_flag = 1; + s_ai_talk_item_info.msg_type = type; // WECHAT_MSG_TYPE_VOICE; + s_ai_talk_item_info.msg_data_size = data_buff_len; + sprintf(s_ai_talk_item_info.msg_data_full_file_name, "C:/wechat_r%04d%02d%02d_%02d%02d%02d.%s", /*WECHAT_MSG_DATA_FILE_PATH, */ + s_ai_talk_item_info.msg_time.tm_year, + s_ai_talk_item_info.msg_time.tm_mon, + s_ai_talk_item_info.msg_time.tm_mday, + s_ai_talk_item_info.msg_time.tm_hour, + s_ai_talk_item_info.msg_time.tm_min, + s_ai_talk_item_info.msg_time.tm_sec, + t_file_ext[type]); + + if(false == mmi_ai_talk_item_info_write_to_file(s_ai_talk_item_info.msg_data_full_file_name, data_buff, data_buff_len)) + { + printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__); + return false; + } + +// lv_ai_talk_ext_t * ext = mmi_ai_talk_actId_ext_get(ACT_ID_AI_TALK); +// if(NULL != ext) +// { +// mmi_ai_talk_voice_item_playing_stop(ext); +// } + + mmi_ai_talk_info_new_item_add(&s_ai_talk_item_info); + + // ui + if(false == mmi_active_screen_is_prohibit_interrupted() + && false == mmi_health_measure_state_is_ui_measure() +// && false == mmi_ai_talk_voice_is_playing() + && false == mmi_ai_talk_voice_is_recording() + && false == mmi_ai_talk_item_is_sending() + #ifdef __MMI_ZHSX_SUPPORT_DO_NOT_DISTURB__ + && false == mmi_watch_is_in_do_not_disturb_time() + #endif + ) + { + printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__); + + mmi_watch_wake_up(); + mmi_ui_msg_action_ai_talk_incoming(); + } + + return true; +} + +bool mmi_ai_talk_send_to_server(void) +{ + bool result = false; // true-success; false-fail + + lv_ai_talk_ext_t * ext = (lv_ai_talk_ext_t *)mmi_ai_talk_actId_ext_get(ACT_ID_AI_TALK); + if(NULL == ext) + { + printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__); + return false; + } + +#if 20 + + printf("[@CHENG_DEBUG][%s][%d]: size=%d, buf=0x%x\n", __FUNCTION__, __LINE__, ext->record_size, ext->record_buffer); + + uint32_t file_size = ext->record_size - s_ai_talk_recording_sent_size; + if(0 >= file_size) + { + printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__); + return false; + } + char * file_buf = lv_mem_alloc(file_size + 1); + if(NULL == file_buf) + { + printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__); + + lv_mem_free(ext->record_buffer); + ext->record_buffer = NULL; + ext->record_size = 0; + return false; + } + _lv_memset_00(file_buf, file_size + 1); + _lv_memcpy(file_buf, ext->record_buffer + s_ai_talk_recording_sent_size, file_size); + lv_mem_free(ext->record_buffer); + ext->record_buffer = NULL; + + if(true == mmi_ai_talk_audio_data_send(file_buf, file_size)) + { + result = true; + } + lv_mem_free(file_buf); + s_ai_talk_recording_sent_size = 0; + +#else + +#if 10 + printf("[@CHENG_DEBUG][%s][%d]: size=%d, buf=0x%x\n", __FUNCTION__, __LINE__, ext->record_size, ext->record_buffer); + + uint32_t file_size = ext->record_size; + char * file_buf = lv_mem_alloc(file_size + 1); + if(NULL == file_buf || MMI_AI_TALK_DATA_WAV_HEAD_SIZE >= file_size) + { + printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__); + + lv_mem_free(ext->record_buffer); + ext->record_buffer = NULL; + ext->record_size = 0; + return false; + } + _lv_memset_00(file_buf, file_size + 1); + _lv_memcpy(file_buf, ext->record_buffer, file_size); + + lv_mem_free(ext->record_buffer); + ext->record_buffer = NULL; + +#else + + lv_mem_free(ext->record_buffer); + ext->record_buffer = NULL; + + + lv_fs_file_t file_p; + lv_fs_res_t res; + uint32_t file_size = 0, bytes_read = 0; + char * file_buf = NULL; + + res = lv_fs_open(&file_p, "C:/111.pcm", LV_FS_MODE_RD); + if(LV_FS_RES_OK != res) + { + printf("[@CHENG_DEBUG][%s][%d]: errno=%d\n", __FUNCTION__, __LINE__, res); + lv_fs_close(&file_p); + return false; + } + + lv_fs_size(&file_p, &file_size); + file_buf = (char *)lv_mem_alloc(file_size + 1); + _lv_memset_00(file_buf, file_size + 1); + res = lv_fs_read(&file_p, file_buf, file_size, &bytes_read); + lv_fs_close(&file_p); + if(LV_FS_RES_OK != res) + { + printf("[@CHENG_DEBUG][%s][%d]: errno=%d\n", __FUNCTION__, __LINE__, res); + lv_mem_free(file_buf); + return false; + } + printf("[@CHENG_DEBUG][%s][%d]: %d,%d,%s\n", __FUNCTION__, __LINE__, file_size, bytes_read, file_buf); + +#endif + + + + if(true == mmi_ai_talk_item_info_write_to_file(s_ai_talk_item_info.msg_data_full_file_name, file_buf, file_size)) + { + if(true == mmi_ai_talk_audio_data_send(file_buf, file_size)) + { + s_ai_talk_item_info.msg_data_size = file_size; + mmi_ai_talk_info_new_item_add(&s_ai_talk_item_info); + result = true; + } + else + { + lv_fs_remove(s_ai_talk_item_info.msg_data_full_file_name); + } + } + + lv_mem_free(file_buf); + _lv_memset_00(&s_ai_talk_item_info, sizeof(nv_watch_wechat_msg_item_info_t)); +#endif + + return result; +} + +void mmi_ai_talk_item_delete_success_timer_cb(void *para) +{ + //lv_ai_talk_ext_t * ext = (lv_ai_talk_ext_t *)para; + + mmi_ai_talk_main_screen_refresh(); +} + +void mmi_ai_talk_item_delete_ok_btn_event_cb(lv_obj_t * obj, lv_event_t e) +{ + if(LV_EVENT_CLICKED == e) + { + lv_ai_talk_ext_t * ext = (lv_ai_talk_ext_t *)mmi_ai_talk_actId_ext_get(ACT_ID_AI_TALK); + if(NULL != ext && NULL != ext->delete_bg) + { + uint32_t value = lv_watch_get_free_num(obj); + if(0 == value) + mmi_ai_talk_info_index_item_delete(s_ai_talk_selected_item_index); + else if(1 == value) + mmi_ai_talk_info_all_item_delete(); + + lv_obj_clean(ext->delete_bg); + + lv_obj_t * label_prompt = lv_label_create(ext->delete_bg, NULL); + lv_obj_add_style(label_prompt, LV_LABEL_PART_MAIN, &lv_watch_font26_black); + lv_label_set_text_id(label_prompt, WATCH_TEXT_ID_DEL_SUCCESS); + lv_obj_align(label_prompt, ext->delete_bg, LV_ALIGN_CENTER, 0, -10); + + //ext->delete_timer_id = Hal_Timer_Start(1500, mmi_ai_talk_item_delete_success_timer_cb, ext, false); + ext->delete_timer_id = Hal_Timer_Start(1500, mmi_ai_talk_item_delete_success_timer_cb, NULL, false); + } + } +} + +void mmi_ai_talk_item_delete_cancel_btn_event_cb(lv_obj_t * obj, lv_event_t e) +{ + if(LV_EVENT_CLICKED == e) + { + lv_ai_talk_ext_t * ext = (lv_ai_talk_ext_t *)mmi_ai_talk_actId_ext_get(ACT_ID_AI_TALK); + if(NULL != ext && NULL != ext->delete_bg) + { + lv_obj_del(ext->delete_bg); + ext->delete_bg = NULL; + } + } +} + +void mmi_ai_talk_item_delete_select_btn_event_cb(lv_obj_t * obj, lv_event_t e) +{ + if(LV_EVENT_CLICKED != e) + { + return; + } + + lv_ai_talk_ext_t * ext = (lv_ai_talk_ext_t *)mmi_ai_talk_actId_ext_get(ACT_ID_AI_TALK); + if(NULL != ext) + { + uint32_t value = lv_watch_get_free_num(obj); + + lv_obj_set_hidden(ext->delete_current, true); + lv_obj_set_hidden(ext->delete_all, true); + lv_obj_set_hidden(ext->delete_back, true); + + lv_obj_set_hidden(ext->delete_label_prompt, false); + lv_obj_set_hidden(ext->delete_btn_cancel, false); + lv_obj_set_hidden(ext->delete_btn_ok, false); + lv_watch_set_free_num(ext->delete_btn_ok, value); + } +} + +void mmi_ai_talk_list_msg_item_delete_create(void) +{ + lv_ai_talk_ext_t * ext = (lv_ai_talk_ext_t *)mmi_ai_talk_actId_ext_get(ACT_ID_AI_TALK); + if(NULL != ext && NULL != ext->cont) + { + ext->delete_bg = lv_cont_create(ext->cont, NULL); + lv_obj_set_size(ext->delete_bg, LV_HOR_RES, LV_VER_RES); + lv_obj_set_style_local_bg_color(ext->delete_bg, LV_CONT_PART_MAIN, LV_STATE_DEFAULT, lv_color_make(0xB6, 0xF7, 0xFF)); + + // current + lv_obj_t * btn_delete_current = lv_cont_create(ext->delete_bg, NULL); + lv_obj_set_size(btn_delete_current, LV_HOR_RES - 40, 56); + lv_obj_set_style_local_bg_color(btn_delete_current, LV_OBJ_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_MAKE(0xB9, 0x86, 0xFF)); + lv_obj_set_style_local_radius(btn_delete_current, LV_OBJ_PART_MAIN, LV_STATE_DEFAULT, 10); + lv_obj_set_click(btn_delete_current, true); + lv_obj_set_event_cb(btn_delete_current, mmi_ai_talk_item_delete_select_btn_event_cb); + lv_obj_align(btn_delete_current, NULL, LV_ALIGN_IN_TOP_MID, 0, 40); + lv_watch_set_free_num(btn_delete_current, 0); + ext->delete_current = btn_delete_current; + + lv_obj_t * label_delete_current = lv_label_create(btn_delete_current, NULL); + lv_obj_add_style(label_delete_current, LV_LABEL_PART_MAIN, &lv_watch_font26); + lv_label_set_text_id(label_delete_current, WATCH_TEXT_ID_DELETE_CURRENT_ITEM); + lv_label_set_align(label_delete_current, LV_LABEL_ALIGN_CENTER); + lv_obj_align(label_delete_current, btn_delete_current, LV_ALIGN_CENTER, 0, 0); + + // all + lv_obj_t * btn_delete_all = lv_cont_create(ext->delete_bg, btn_delete_current); + lv_obj_set_style_local_bg_color(btn_delete_all, LV_OBJ_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_MAKE(0xFF, 0x6F, 0x91)); + lv_obj_align(btn_delete_all, btn_delete_current, LV_ALIGN_OUT_BOTTOM_MID, 0, 20); + lv_watch_set_free_num(btn_delete_all, 1); + ext->delete_all = btn_delete_all; + + lv_obj_t * label_delete_all = lv_label_create(btn_delete_all, NULL); + lv_obj_add_style(label_delete_all, LV_LABEL_PART_MAIN, &lv_watch_font26); + lv_label_set_text_id(label_delete_all, WATCH_TEXT_ID_DELETE_ALL_ITEM); + lv_label_set_align(label_delete_all, LV_LABEL_ALIGN_CENTER); + lv_obj_align(label_delete_all, btn_delete_all, LV_ALIGN_CENTER, 0, 0); + + // back + lv_obj_t * btn_delete_back = lv_cont_create(ext->delete_bg, btn_delete_current); + lv_obj_set_style_local_bg_color(btn_delete_back, LV_OBJ_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_MAKE(0x47, 0xA6, 0xFF)); + lv_obj_set_event_cb(btn_delete_back, mmi_ai_talk_item_delete_cancel_btn_event_cb); + lv_obj_align(btn_delete_back, btn_delete_all, LV_ALIGN_OUT_BOTTOM_MID, 0, 20); + ext->delete_back = btn_delete_back; + + lv_obj_t * label_delete_back = lv_label_create(btn_delete_back, NULL); + lv_obj_add_style(label_delete_back, LV_LABEL_PART_MAIN, &lv_watch_font26); + lv_label_set_text_id(label_delete_back, WATCH_TEXT_ID_CANCEL); + lv_label_set_align(label_delete_back, LV_LABEL_ALIGN_CENTER); + lv_obj_align(label_delete_back, btn_delete_back, LV_ALIGN_CENTER, 0, 0); + + + lv_obj_t * label_prompt = lv_label_create(ext->delete_bg, NULL); + lv_obj_add_style(label_prompt, LV_LABEL_PART_MAIN, &lv_watch_font26_black); + lv_label_set_text_id(label_prompt, WATCH_TEXT_ID_DEL_Q); + lv_obj_align(label_prompt, ext->delete_bg, LV_ALIGN_CENTER, 0, -30); + ext->delete_label_prompt = label_prompt; + + lv_obj_t * btn_cancel = lv_btn_create(ext->delete_bg, NULL); + lv_obj_set_size(btn_cancel, 100, 56); + lv_obj_set_style_local_bg_color(btn_cancel, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, lv_color_make(0x47, 0xA6, 0xFF)); + lv_obj_set_style_local_radius(btn_cancel, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, 30); + lv_obj_set_style_local_bg_color(btn_cancel, LV_BTN_PART_MAIN, LV_STATE_PRESSED, lv_color_make(0x47, 0xA6, 0xFF)); + lv_obj_set_style_local_radius(btn_cancel, LV_BTN_PART_MAIN, LV_STATE_PRESSED, 30); + lv_obj_align(btn_cancel, NULL, LV_ALIGN_IN_BOTTOM_LEFT, 10, -20); + lv_obj_set_event_cb(btn_cancel, mmi_ai_talk_item_delete_cancel_btn_event_cb); + ext->delete_btn_cancel = btn_cancel; + + lv_obj_t * label_cancel = lv_label_create(btn_cancel, NULL); + lv_obj_add_style(label_cancel, LV_LABEL_PART_MAIN, &lv_watch_font26); + lv_label_set_text_id(label_cancel, WATCH_TEXT_ID_CANCEL); + + lv_obj_t * btn_ok = lv_btn_create(ext->delete_bg, btn_cancel); + lv_obj_set_style_local_bg_color(btn_ok, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, lv_color_make(0xFF, 0x6F, 0x91)); + lv_obj_set_style_local_bg_color(btn_ok, LV_BTN_PART_MAIN, LV_STATE_PRESSED, lv_color_make(0xFF, 0x6F, 0x91)); + lv_obj_align(btn_ok, NULL, LV_ALIGN_IN_BOTTOM_RIGHT, -10, -20); + lv_obj_set_event_cb(btn_ok, mmi_ai_talk_item_delete_ok_btn_event_cb); + ext->delete_btn_ok = btn_ok; + + lv_obj_t * label_ok = lv_label_create(btn_ok, label_cancel); + lv_label_set_text_id(label_ok, WATCH_TEXT_ID_OK); + + // display + lv_obj_set_hidden(label_prompt, true); + lv_obj_set_hidden(btn_cancel, true); + lv_obj_set_hidden(btn_ok, true); + } +} + +void mmi_ai_talk_sending_anim_cb(lv_anim_t * a) +{ + lv_obj_t * img = a->var; + + switch(s_ai_talk_play_anim_count % 3) + { + case 0: + lv_img_set_src(img, ICON_WECHAT_SENDING_PROMPT1); + break; + + case 1: + lv_img_set_src(img, ICON_WECHAT_SENDING_PROMPT2); + break; + + case 2: + lv_img_set_src(img, ICON_WECHAT_SENDING_PROMPT3); + break; + + default: + break; + } + s_ai_talk_play_anim_count++; +} + +void mmi_ai_talk_sending_result_screen_timeout(void *para) +{ + printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__); + + mmi_ai_talk_sending_screen_prepare_destory(NULL); + + //delete sending screen + //lv_watch_del_interface(ACT_ID_AI_TALK_SENDING); + lv_obj_t * obj = lv_watch_get_activity_obj(ACT_ID_AI_TALK_SENDING); + if(NULL != obj) + { + printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__); + lv_obj_del(obj); + } + + //return main list screen + mmi_ai_talk_main_screen_refresh(); +} + +void mmi_ai_talk_sending_screen_timeout(void *para) +{ + lv_ai_talk_sending_ext_t * sending_ext = (lv_ai_talk_sending_ext_t *)para; + + printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__); + + if(NULL != sending_ext->sending_timer_id) + { + Hal_Timer_Stop(sending_ext->sending_timer_id); + sending_ext->sending_timer_id = NULL; + } + + if(NULL != sending_ext->sending_anim.var) + { + lv_obj_t * img_bkg = lv_obj_get_parent(sending_ext->sending_anim.var); + lv_img_set_src(img_bkg, ((true == sending_ext->send_result) ? ICON_WECHAT_SENDING_SUCC : ICON_WECHAT_SENDING_FAILED)); + + lv_anim_del(sending_ext->sending_anim.var, NULL); + lv_obj_del(sending_ext->sending_anim.var); + sending_ext->sending_anim.var = NULL; + } + + sending_ext->result_timer_id = Hal_Timer_Start(1500, mmi_ai_talk_sending_result_screen_timeout, sending_ext, FALSE); +} + +void mmi_ai_talk_sending_screen_prepare_destory(lv_obj_t * activity_obj) +{ + printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__); + + mmi_ai_talk_audio_data_send_end_char(); + + lv_watch_png_cache_all_free(); + + lv_ai_talk_sending_ext_t * sending_ext = (lv_ai_talk_sending_ext_t *)mmi_ai_talk_actId_ext_get(ACT_ID_AI_TALK_SENDING); + if(NULL != sending_ext) + { + if(NULL != sending_ext->sending_timer_id) + { + Hal_Timer_Stop(sending_ext->sending_timer_id); + sending_ext->sending_timer_id = NULL; + } + if(NULL != sending_ext->result_timer_id) + { + Hal_Timer_Stop(sending_ext->result_timer_id); + sending_ext->result_timer_id = NULL; + } + } +} + +lv_obj_t * mmi_ai_talk_sending_screen_create(lv_obj_t * activity_obj) +{ + printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__); + + if(NULL == activity_obj) + { + lv_watch_activity_ext_t activity_ext = {0}; + + activity_ext.actId = ACT_ID_AI_TALK_SENDING; + activity_ext.create = (lv_watch_activity_create_f_t)mmi_ai_talk_sending_screen_create; + activity_ext.prepare_destory = mmi_ai_talk_sending_screen_prepare_destory; + activity_obj = lv_watch_creat_activity_obj(&activity_ext); + if(NULL == activity_obj) + return NULL; + } + + lv_obj_t * obj = lv_watch_obj_create(activity_obj); + if(NULL == obj) + return NULL; + lv_ai_talk_sending_ext_t * sending_ext = (lv_ai_talk_sending_ext_t *)lv_obj_allocate_ext_attr(obj, sizeof(lv_ai_talk_sending_ext_t)); + if(NULL == sending_ext) + return NULL; + + mmi_ai_talk_list_set_slide_enable(&sending_ext->old_ext, false); /*prevent to slide out while recording*/ + _lv_memset_00(&(sending_ext->sending_anim), sizeof(lv_anim_t)); + sending_ext->send_result = mmi_ai_talk_send_to_server(); + sending_ext->sending_timer_id = Hal_Timer_Start(1000 * 3, mmi_ai_talk_sending_screen_timeout, sending_ext, FALSE); + sending_ext->result_timer_id = NULL; + + lv_obj_t * img_bkg = lv_img_create(obj, NULL); + lv_img_set_src(img_bkg, ICON_WECHAT_SENDING_BG); + lv_obj_align(img_bkg, obj, LV_ALIGN_CENTER, 0, 0); + + lv_obj_t * img_sending = lv_img_create(img_bkg, NULL); + lv_img_set_src(img_sending, ICON_WECHAT_SENDING_PROMPT3); +#if USE_LV_WATCH_UI_240_320 + lv_obj_align(img_sending, img_bkg, LV_ALIGN_IN_BOTTOM_MID, 0, -20); +#elif USE_LV_WATCH_UI_240_280 + lv_obj_align(img_sending, img_bkg, LV_ALIGN_IN_BOTTOM_MID, 0, -40); +#else + lv_obj_align(img_sending, img_bkg, LV_ALIGN_IN_BOTTOM_MID, 0, -20); +#endif + + lv_anim_t * a = &(sending_ext->sending_anim); + lv_anim_init(a); + lv_anim_set_var(a, img_sending); + //lv_anim_set_exec_cb(a, (lv_anim_exec_xcb_t)wechat_msg_sending_anim_exec_cb); + lv_anim_set_start_cb(a, (lv_anim_ready_cb_t)mmi_ai_talk_sending_anim_cb); + lv_anim_set_repeat_count(a, LV_ANIM_REPEAT_INFINITE); + lv_anim_set_repeat_delay(a, 500); + lv_anim_start(a); + s_ai_talk_play_anim_count = 0; + + return obj; +} + +void mmi_ai_talk_recording_release_event_cb(lv_obj_t * obj, lv_event_t e) +{ + printf("[@CHENG_DEBUG][%s][%d]: event=%d\n", __FUNCTION__, __LINE__, e); + +#if 0 + if(LV_EVENT_RELEASED == e) //(LV_EVENT_CLICKED == e) + { + printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__); + + lv_watch_del_interface(ACT_ID_AI_TALK_RECORDING); + mmi_ai_talk_sending_screen_create(NULL); + } +#endif +} + +void mmi_ai_talk_recording_anim(lv_anim_t * a) +{ + s_ai_talk_play_anim_count++; + if(0 == (s_ai_talk_play_anim_count % 4)) + { + int8_t count_down = MMI_AI_TALK_DATA_RECORD_DURATION_MAX - s_ai_talk_play_anim_count / 4; + printf("[@CHENG_DEBUG][%s][%d]: count down=%d\n", __FUNCTION__, __LINE__, count_down); + + if(0 < count_down) + { + lv_obj_t * label_time = a->var; + const char * content = lv_lang_get_text(WATCH_TEXT_ID_AUDIO_RECORDING); // WATCH_TEXT_ID_RELEASE_SENDING); + uint8_t len = strlen(content) + 8; + char * text = (char *)lv_mem_alloc(len); + snprintf(text, len, "%s %d", content, count_down); + lv_label_set_text(label_time, text); + lv_mem_free(text); + } + } +} + +bool mmi_ai_talk_recording_stop(bool is_cancel) +{ + uint32_t duration_ms = 0; + uint32_t size = 0; + + Hal_Record_Buffer_Stop_Req(&size, &duration_ms); + Hal_Audio_Manage_End_Ind(AUDIO_CTRL_PRIORITY_5); + + lv_ai_talk_ext_t * ext = (lv_ai_talk_ext_t *)mmi_ai_talk_actId_ext_get(ACT_ID_AI_TALK); + if(NULL == ext) + return false; + + if(true == is_cancel) + { + printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__); + lv_mem_free(ext->record_buffer); + ext->record_buffer = NULL; + ext->record_size = 0; + return false; + } + + if(MMI_AI_TALK_DATA_WAV_HEAD_SIZE >= size) + { + printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__); + lv_mem_free(ext->record_buffer); + ext->record_buffer = NULL; + ext->record_size = 0; + return false; + } + ext->record_size = size; + + return true; +} + +void mmi_ai_talk_recording_audio_ctrl_callback(AUDIO_CTRL_PRIORITY priority) +{ + printf("[@CHENG_DEBUG][%s][%d]: priority=%d\n", __FUNCTION__, __LINE__, priority); + + if(AUDIO_CTRL_PRIORITY_5 == priority) + { + if(false == watch_is_ready()) + { + printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__); + return; + } + } + else if(AUDIO_CTRL_PRIORITY_5 > priority) + { + mmi_ai_talk_recording_stop(true); + + //lv_watch_del_interface(ACT_ID_AI_TALK_RECORDING); + lv_obj_t * activity_obj = lv_watch_get_activity_obj(ACT_ID_AI_TALK_RECORDING); + if(NULL != activity_obj) + { + lv_obj_del(activity_obj); + } + } +} + +void mmi_ai_talk_recording_task_cb(lv_task_t * task) +{ + lv_ai_talk_ext_t * ext = (lv_ai_talk_ext_t *)mmi_ai_talk_actId_ext_get(ACT_ID_AI_TALK); + if(NULL == ext) + return ; + + if(0 == ext->old_ext.element_click_en) + { + /*sliding to the right, not click button*/ + return; + } + + lv_obj_t * activity_obj; + MCI_EVNET_T event = (MCI_EVNET_T) (task->user_data); + printf("[@CHENG_DEBUG][%s][%d]: event=%d\n", __FUNCTION__, __LINE__, event); + + switch(event) + { + case MCI_EVENT_EOS: + printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__); + + mmi_ai_talk_recording_stop(false); + activity_obj = lv_watch_get_activity_obj(ACT_ID_AI_TALK_RECORDING); + if(NULL != activity_obj) + { + lv_obj_del(activity_obj); + } + mmi_ai_talk_sending_screen_create(NULL); + break; + + case MCI_EVENT_ERROR: + printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__); + + mmi_ai_talk_recording_stop(true); + activity_obj = lv_watch_get_activity_obj(ACT_ID_AI_TALK_RECORDING); + if(NULL != activity_obj) + { + lv_obj_del(activity_obj); + } + break; + + //case MCI_EVENT_INFO: + // break; + + default: + break; + } +} + +void mmi_ai_talk_recording_cb(MCI_EVNET_T event, MCI_INFO_T info_type, int32_t value) +{ + printf("[@CHENG_DEBUG][%s][%d]: event=%d,type=%d,value=%d\n", __FUNCTION__, __LINE__, event, info_type, value); + + if(MCI_EVENT_INFO != event) + { + //recording_ext->event = event; + lv_task_t * record_task = lv_task_create(mmi_ai_talk_recording_task_cb, 10, LV_TASK_PRIO_HIGH, event); + lv_task_once(record_task); + } + else // MCI_EVENT_INFO == event + { + if(MCI_INFO_RECORDER_CUR_SIZE == info_type) + { + lv_ai_talk_ext_t * ext = (lv_ai_talk_ext_t *)mmi_ai_talk_actId_ext_get(ACT_ID_AI_TALK); + if(NULL == ext) + { + printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__); + return; + } + + uint32_t sending_size = value - s_ai_talk_recording_sent_size; + if(0 >= sending_size) + { + printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__); + return; + } + + char * sending_buf = lv_mem_alloc(sending_size + 1); + if(NULL == sending_buf) + { + printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__); + return; + } + _lv_memset_00(sending_buf, sending_size + 1); + _lv_memcpy(sending_buf, ext->record_buffer + s_ai_talk_recording_sent_size, sending_size); + + mmi_ai_talk_audio_data_send(sending_buf, sending_size); + + lv_mem_free(sending_buf); + s_ai_talk_recording_sent_size += sending_size; + } + } +} + + +void mmi_ai_talk_recording_screen_prepare_destory(lv_obj_t * activity_obj) +{ + printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__); + + lv_watch_png_cache_all_free(); + + //mmi_ai_talk_recording_stop(true); + uint32_t duration_ms = 0; + uint32_t size = 0; + + Hal_Record_Buffer_Stop_Req(&size, &duration_ms); + Hal_Audio_Manage_End_Ind(AUDIO_CTRL_PRIORITY_5); +} + +lv_obj_t * mmi_ai_talk_recording_screen_create(lv_obj_t * activity_obj) +{ + printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__); + + if(NULL == activity_obj) + { + lv_watch_activity_ext_t activity_ext = {0}; + + activity_ext.actId = ACT_ID_AI_TALK_RECORDING; + activity_ext.create = mmi_ai_talk_recording_screen_create; + activity_ext.prepare_destory = mmi_ai_talk_recording_screen_prepare_destory; + activity_obj = lv_watch_creat_activity_obj(&activity_ext); + if(NULL == activity_obj) + return NULL; + } + + lv_obj_t * obj = lv_watch_obj_create(activity_obj); + LV_ASSERT_MEM(obj); + + lv_ai_talk_recording_ext_t * recording_ext = lv_obj_allocate_ext_attr(obj, sizeof(lv_ai_talk_recording_ext_t)); + LV_ASSERT_MEM(recording_ext); + + lv_obj_t * cont = lv_cont_create(obj, NULL); + lv_obj_set_size(cont, lv_obj_get_width(obj), lv_obj_get_height(obj)); + lv_obj_align(cont, obj, LV_ALIGN_CENTER, 0, 0); + lv_obj_set_style_local_bg_color(cont, LV_CONT_PART_MAIN, LV_STATE_DEFAULT, lv_color_make(194, 252, 252)); + //lv_obj_set_click(cont, true); + //lv_obj_set_event_cb(cont, mmi_ai_talk_recording_release_event_cb); + //lv_obj_add_protect(cont, LV_PROTECT_PRESS_LOST); + + //lv_obj_t * label_warning = lv_label_create(cont, NULL); + //lv_obj_set_style_local_text_font(label_warning, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, LV_THEME_WATCH_NIGHT_FONT_SMALL); + //lv_obj_set_style_local_text_color(label_warning, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_RED); + //lv_obj_add_style(label_warning, LV_LABEL_PART_MAIN, &lv_watch_font26_black); + //lv_label_set_long_mode(label_warning, LV_LABEL_LONG_BREAK); + //lv_obj_set_width(label_warning, lv_obj_get_width(obj) * 2 / 3); + //lv_label_set_text_id(label_warning, WATCH_TEXT_ID_SLIDE_UP_WARNING); + //lv_label_set_align(label_warning, LV_LABEL_ALIGN_CENTER); + //lv_obj_align(label_warning, cont, LV_ALIGN_IN_TOP_MID, 0, 50); + + lv_obj_t * label_time = lv_label_create(cont, NULL); + lv_obj_add_style(label_time, LV_LABEL_PART_MAIN, &lv_watch_font26_black); + const char * rel_snd = lv_lang_get_text(WATCH_TEXT_ID_AUDIO_RECORDING); // WATCH_TEXT_ID_RELEASE_SENDING); + uint8_t len = strlen(rel_snd) + 4; + char * text = (char *)lv_mem_alloc(len); + snprintf(text, len, "%s %d", rel_snd, MMI_AI_TALK_DATA_RECORD_DURATION_MAX); + lv_label_set_text(label_time, text); + lv_mem_free(text); + //lv_obj_align(label_time, label_warning, LV_ALIGN_OUT_BOTTOM_MID, 0, 30); + lv_obj_align(label_time, cont, LV_ALIGN_IN_TOP_MID, 0, 75); + recording_ext->label = label_time; + + lv_obj_t * img_release_snd = lv_img_create(cont, NULL); + lv_img_set_src(img_release_snd, ICON_WECHAT_RECORD_BUTTON_PRESSED); + lv_obj_align(img_release_snd, cont, LV_ALIGN_IN_BOTTOM_MID, 0, -8); + + lv_anim_t a; + lv_anim_init(&a); + lv_anim_set_var(&a, label_time); + lv_anim_set_start_cb(&a, (lv_anim_ready_cb_t)mmi_ai_talk_recording_anim); + lv_anim_set_repeat_count(&a, LV_ANIM_REPEAT_INFINITE); + lv_anim_set_time(&a, 249); + lv_anim_start(&a); + s_ai_talk_play_anim_count = 0; + + lv_ai_talk_ext_t * ext = (lv_ai_talk_ext_t *)mmi_ai_talk_actId_ext_get(ACT_ID_AI_TALK); + if(NULL == ext) + return NULL; + + if(NULL != ext->record_buffer) + { + lv_mem_free(ext->record_buffer); + ext->record_buffer = NULL; + } + ext->record_buffer = (uint8_t *)lv_mem_alloc(MMI_AI_TALK_DATA_RECORD_SIZE_MAX); + if(NULL != ext->record_buffer) + { + _lv_memset_00(ext->record_buffer, MMI_AI_TALK_DATA_RECORD_SIZE_MAX); + + if(AUDIO_CTRL_PRIORITY_5 == Hal_Audio_Manage_Start_Req(AUDIO_CTRL_PRIORITY_5, mmi_ai_talk_recording_audio_ctrl_callback)) + { + //Hal_Record_Buffer_Start_Req(ext->record_buffer, + // MMI_AI_TALK_DATA_RECORD_SIZE_MAX, + // MMI_AI_TALK_DATA_RECORD_DURATION_MAX * 1000, + // mmi_ai_talk_recording_cb); + + s_ai_talk_recording_sent_size = 0; + Hal_Record_Buffer_With_Format_Req(ext->record_buffer, + MMI_AI_TALK_DATA_RECORD_SIZE_MAX, + MMI_AI_TALK_DATA_RECORD_DURATION_MAX * 1000, + mmi_ai_talk_recording_cb, + (mci_type_enum)AI_TALK_AUDIO_FORMAT_TYPE); + } + } + + return obj; +} + +void mmi_ai_talk_record_button_event_cb(lv_obj_t * obj, lv_event_t e) +{ + if(LV_EVENT_LONG_PRESSED == e) + { + printf("[@CHENG_DEBUG][%s][%d]: event=%d\n", __FUNCTION__, __LINE__, e); + + lv_ai_talk_ext_t * ext = mmi_ai_talk_actId_ext_get(ACT_ID_AI_TALK); + if(NULL == ext) + return ; + + mmi_ai_talk_list_set_slide_enable(&ext->old_ext, true); /*reset slide_enable at the end of recording*/ + + if(0 == ext->old_ext.element_click_en) + { + /*sliding to the right, not click button*/ + return; + } + + mmi_ai_talk_list_set_slide_enable(&ext->old_ext, false); /*prevent to slide out while recording*/ + mmi_ai_talk_recording_screen_create(NULL); + } + else if(LV_EVENT_CLICKED == e || LV_EVENT_PRESS_LOST == e) + { + printf("[@CHENG_DEBUG][%s][%d]: event=%d\n", __FUNCTION__, __LINE__, e); + + lv_obj_t * activity_obj = lv_watch_get_activity_obj(ACT_ID_AI_TALK_RECORDING); + if(NULL != activity_obj) + { + lv_ai_talk_ext_t * ext = mmi_ai_talk_actId_ext_get(ACT_ID_AI_TALK); + if(NULL == ext) + return ; + + lv_ai_talk_recording_ext_t * recording_ext = (lv_ai_talk_recording_ext_t *)mmi_ai_talk_actId_ext_get(ACT_ID_AI_TALK_RECORDING); + if(NULL == recording_ext) + return NULL; + + printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__); + mmi_ai_talk_list_set_slide_enable(&ext->old_ext, true); /*reset slide_enable at the end of recording*/ + + #if 0 + lv_indev_t * indev = lv_indev_get_act(); + if(indev) + { + lv_coord_t point_y = indev->proc.types.pointer.last_point.y; + lv_coord_t img_record_top = obj->coords.y1; + if(30 < img_record_top - point_y) // (point_y < (img_record_top - 20)) + { + printf("[@CHENG_DEBUG][%s][%d]: indev_y=%d, img_y=%d\n", __FUNCTION__, __LINE__, point_y, img_record_top); + mmi_ai_talk_recording_stop(true); + lv_obj_del(activity_obj); + //return main list screen + mmi_ai_talk_main_screen_refresh(); + + return; + } + } + #endif + + printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__); + mmi_ai_talk_recording_stop(false); + lv_obj_del(activity_obj); + mmi_ai_talk_sending_screen_create(NULL); + } + } + else if(LV_EVENT_PRESSED == e) + { + printf("[@CHENG_DEBUG][%s][%d]: event=%d\n", __FUNCTION__, __LINE__, e); + + lv_ai_talk_ext_t * ext = mmi_ai_talk_actId_ext_get(ACT_ID_AI_TALK); + if(NULL == ext) + return ; + + // + Hal_NFFS_File_Play_End(); + Hal_Audio_Manage_End_Ind(AUDIO_CTRL_PRIORITY_5); + Hal_Vibrator_Play_End(); + + mmi_ai_talk_voice_item_playing_stop(ext); + } +} + +void mmi_ai_talk_voice_item_reset_play_state(lv_ai_talk_list_ext_t * list_page_ext) +{ + printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__); + + if(NULL == list_page_ext || NULL == list_page_ext->voice_playing_anim.var) + { + printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__); + return; + } + + uint8_t msg_from = list_page_ext->voice_playing_msg_from; + + lv_anim_del(list_page_ext->voice_playing_anim.var, NULL); + lv_img_set_src(list_page_ext->voice_playing_anim.var, ((0 == msg_from) ? ICON_WECHAT_MY_VOICE_ITEM_PLAYING3 : ICON_WECHAT_OTHER_VOICE_ITEM_PLAYING3)); + list_page_ext->voice_playing_anim.var = NULL; +} + +void mmi_ai_talk_voice_item_playing_stop(lv_ai_talk_ext_t * ext) +{ + printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__); + return; + +/* + if(NULL == ext || NULL == ext->list) + { + printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__); + return; + } + + lv_ai_talk_list_ext_t * list_page_ext = (lv_ai_talk_list_ext_t *)lv_obj_get_ext_attr(ext->list); + if(NULL == list_page_ext || NULL == list_page_ext->voice_playing_anim.var) + { + printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__); + return; + } + + Hal_File_Play_End(); + Hal_Audio_Manage_End_Ind(AUDIO_CTRL_PRIORITY_5); + mmi_ai_talk_voice_item_reset_play_state(list_page_ext); +*/ +} + +void mmi_ai_talk_list_msg_item_style_reset(lv_ai_talk_ext_t * ext) +{ + if(NULL == ext || NULL == ext->list) + return; + + lv_ai_talk_list_ext_t * list_page_ext = lv_obj_get_ext_attr(ext->list); + if(NULL == list_page_ext) + return; + + lv_style_reset(&(list_page_ext->style_cont_self)); + lv_style_reset(&(list_page_ext->style_cont_other)); + lv_style_reset(&(list_page_ext->style_label_time)); + //lv_style_reset(&(list_page_ext->style_text)); + lv_style_reset(&(list_page_ext->style_label_len_self)); + lv_style_reset(&(list_page_ext->style_label_len_other)); +} + +void mmi_ai_talk_list_msg_item_time(char * time_str, hal_rtc_t * cur_time, hal_rtc_t * msg_time, hal_rtc_t * last_msg_time) +{ + printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__); + + if(0 == last_msg_time->tm_year) + { + sprintf(time_str, "%d/%d/%d %02d:%02d", msg_time->tm_year, msg_time->tm_mon, msg_time->tm_mday, + msg_time->tm_hour, msg_time->tm_min); + + return; + } + + uint32_t msg_sec = time_to_seconds(msg_time); + uint32_t last_msg_sec = time_to_seconds(last_msg_time); + if(msg_sec < last_msg_sec) + { + sprintf(time_str, "%d/%d/%d %02d:%02d", msg_time->tm_year, msg_time->tm_mon, + msg_time->tm_mday, msg_time->tm_hour, msg_time->tm_min); + } + else if(msg_sec > (last_msg_sec + MMI_AI_TALK_CHAT_TIME_INTERVAL)) + { + uint32_t cur_sec = time_to_seconds(cur_time); + if((msg_sec > cur_sec) || (msg_time->tm_year < cur_time->tm_year)) + { + sprintf(time_str, "%d/%d/%d %02d:%02d", msg_time->tm_year, msg_time->tm_mon, + msg_time->tm_mday, msg_time->tm_hour, msg_time->tm_min); + } + else + { + uint32_t today_sec = cur_sec - cur_time->tm_hour * 3600 - cur_time->tm_min * 60 - cur_time->tm_sec; + + if(msg_sec >= today_sec) + { + /*today*/ + sprintf(time_str, "%02d:%02d", msg_time->tm_hour, msg_time->tm_min); + } + else if(msg_sec >= (today_sec - 24 * 3600)) + { + /*yesterday*/ + const char * yesterday = lv_lang_get_text(WATCH_TEXT_ID_YESTERDAY); + + sprintf(time_str, "%s %02d:%02d", yesterday, msg_time->tm_hour, msg_time->tm_min); + } + else + { + uint8_t wday; + if(0 == cur_time->tm_wday) + { + /*today is Sunday*/ + wday = 6; + } + else + { + wday = cur_time->tm_wday - 1; + } + /*the start of a week is monday, the end is sunday*/ + if(msg_sec >= (today_sec - wday * 24 * 3600)) { + /*current week before yesterday*/ + const char * wday_str; + switch(rtc_calc_weekday(msg_time)) + { + case 1: + /*Monday*/ + wday_str = lv_lang_get_text(WATCH_TEXT_ID_MONDAY); + break; + case 2: + /*Tuesday*/ + wday_str = lv_lang_get_text(WATCH_TEXT_ID_TUESDAY); + break; + case 3: + /*Wednesday*/ + wday_str = lv_lang_get_text(WATCH_TEXT_ID_WEDNESDAY); + break; + case 4: + /*Thursday*/ + wday_str = lv_lang_get_text(WATCH_TEXT_ID_THURSDAY); + break; + case 5: + /*Friday*/ + wday_str = lv_lang_get_text(WATCH_TEXT_ID_FRIDAY); + break; + default: + printf("%s: week error\n", __FUNCTION__); + break; + } + + sprintf(time_str, "%s %02d:%02d", wday_str, msg_time->tm_hour, msg_time->tm_min); + } + else + { + sprintf(time_str, "%d/%d %02d:%02d", msg_time->tm_mon, msg_time->tm_mday, msg_time->tm_hour, msg_time->tm_min); + } + } + } + } +} + +void mmi_ai_talk_list_voice_item_playing_anim_cb(lv_anim_t * a) +{ + lv_obj_t * play_img = (lv_obj_t *)a->var; + uint8_t msg_from = mmi_ai_talk_info_index_item_msg_from_get(s_ai_talk_selected_item_index); + + printf("[@CHENG_DEBUG][%s][%d]: msg_from=%d\n", __FUNCTION__, __LINE__, msg_from); + + switch(s_ai_talk_play_anim_count % 3) + { + case 0: + lv_img_set_src(play_img, ((0 == msg_from) ? ICON_WECHAT_MY_VOICE_ITEM_PLAYING1 : ICON_WECHAT_OTHER_VOICE_ITEM_PLAYING1)); + break; + + case 1: + lv_img_set_src(play_img, ((0 == msg_from) ? ICON_WECHAT_MY_VOICE_ITEM_PLAYING2 : ICON_WECHAT_OTHER_VOICE_ITEM_PLAYING2)); + break; + + case 2: + lv_img_set_src(play_img, ((0 == msg_from) ? ICON_WECHAT_MY_VOICE_ITEM_PLAYING3 : ICON_WECHAT_OTHER_VOICE_ITEM_PLAYING3)); + break; + + default: + break; + } + s_ai_talk_play_anim_count++; +} + +void mmi_ai_talk_list_voice_item_playing_audio_ctrl_callback(AUDIO_CTRL_PRIORITY priority) +{ + printf("[@CHENG_DEBUG][%s][%d]: priority=%d\n", __FUNCTION__, __LINE__, priority); + + if(AUDIO_CTRL_PRIORITY_5 == priority) + { + if(false == watch_is_ready()) + { + printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__); + return; + } + } + else if(AUDIO_CTRL_PRIORITY_5 > priority) + { + lv_ai_talk_ext_t * ext = mmi_ai_talk_actId_ext_get(ACT_ID_AI_TALK); + if(NULL != ext) + { + mmi_ai_talk_voice_item_playing_stop(ext); + } + } +} + +void mmi_ai_talk_list_voice_item_play_over_cb(void * para) +{ + printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__); + + Hal_File_Play_End(); + Hal_Audio_Manage_End_Ind(AUDIO_CTRL_PRIORITY_5); + + lv_ai_talk_list_ext_t * list_page_ext = (lv_ai_talk_list_ext_t *)para; + if(NULL == list_page_ext || NULL == list_page_ext->voice_playing_anim.var) + { + printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__); + return; + } + mmi_ai_talk_voice_item_reset_play_state(list_page_ext); +} + +void mmi_ai_talk_list_voice_item_play_action(lv_ai_talk_list_ext_t * list_page_ext, lv_obj_t * play_img, lv_obj_t * unread_img) +{ + printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__); + + //display ui + lv_anim_t * a = &(list_page_ext->voice_playing_anim); + + lv_anim_init(a); + lv_anim_set_var(a, play_img); + lv_anim_set_start_cb(a, (lv_anim_ready_cb_t)mmi_ai_talk_list_voice_item_playing_anim_cb); + lv_anim_set_repeat_count(a, LV_ANIM_REPEAT_INFINITE); + lv_anim_set_time(a, 400); + lv_anim_start(a); + s_ai_talk_play_anim_count = 1; + + nv_watch_wechat_msg_item_info_t * msg_item = NULL; + mmi_ai_talk_info_index_item_get(s_ai_talk_selected_item_index, &msg_item); + msg_item->unread_flag = 0; + if(NULL != unread_img) + { + lv_obj_del(unread_img); + unread_img = NULL; + } + list_page_ext->voice_playing_msg_from = msg_item->msg_from; + + //play voice + if(AUDIO_CTRL_PRIORITY_5 == Hal_Audio_Manage_Start_Req(AUDIO_CTRL_PRIORITY_5, mmi_ai_talk_list_voice_item_playing_audio_ctrl_callback)) + { + printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__); + Hal_File_Play_Onetime(msg_item->msg_data_full_file_name, query_current_volume(), mmi_ai_talk_list_voice_item_play_over_cb, list_page_ext, 0); + } +} + +void mmi_ai_talk_list_voice_item_event_cb(lv_obj_t * cont, lv_event_t e) +{ + lv_ai_talk_list_item_ext_t * list_item_ext = (lv_ai_talk_list_item_ext_t *)lv_obj_get_ext_attr(cont); + if(NULL == list_item_ext) + return; + + s_ai_talk_selected_item_index = list_item_ext->item_index; + + lv_obj_t * scrl = lv_obj_get_parent(cont); + lv_obj_t * list_page = lv_obj_get_parent(scrl); + //lv_obj_t * scrl = lv_page_get_scrl(list_page); + + lv_ai_talk_list_ext_t * list_page_ext = (lv_ai_talk_list_ext_t *)lv_obj_get_ext_attr(list_page); + if(NULL == list_page_ext) + return; + + if(LV_EVENT_PRESSED == e) + { + list_page_ext->pressing = true; + } + else if((LV_EVENT_LONG_PRESSED == e) && (true == list_page_ext->pressing)) // delete msg item + { + list_page_ext->pressing = false; + + mmi_ai_talk_list_msg_item_delete_create(); + } + else if((LV_EVENT_CLICKED == e) && (true == list_page_ext->pressing)) // playing voice msg + { + list_page_ext->pressing = false; + + nv_watch_wechat_msg_item_info_t * msg_item = NULL; + mmi_ai_talk_info_index_item_get(s_ai_talk_selected_item_index, &msg_item); + + if(0 != msg_item->msg_data_size) + { + if(NULL != list_page_ext->voice_playing_anim.var) // exist voice playing + { + printf("[@CHENG_DEBUG][%s][%d]: index=%d\n", __FUNCTION__, __LINE__, list_item_ext->item_index); + + //stop item voice + Hal_File_Play_End(); + Hal_Audio_Manage_End_Ind(AUDIO_CTRL_PRIORITY_5); + mmi_ai_talk_voice_item_reset_play_state(list_page_ext); + } + else if(NULL != msg_item->msg_data_full_file_name) + { + printf("[@CHENG_DEBUG][%s][%d]: index=%d\n", __FUNCTION__, __LINE__, list_item_ext->item_index); + + lv_obj_t * play_img = lv_obj_get_child_back(cont, NULL); + mmi_ai_talk_list_voice_item_play_action(list_page_ext, play_img, ((1 == msg_item->unread_flag) ? list_item_ext->unread_img : NULL)); + } + } + } +} + +void mmi_ai_talk_list_text_item_event_cb(lv_obj_t * cont, lv_event_t e) +{ + lv_ai_talk_list_item_ext_t * list_item_ext = (lv_ai_talk_list_item_ext_t *)lv_obj_get_ext_attr(cont); + if(NULL == list_item_ext) + return; + + s_ai_talk_selected_item_index = list_item_ext->item_index; + + lv_obj_t * scrl = lv_obj_get_parent(cont); + lv_obj_t * list_page = lv_obj_get_parent(scrl); + //lv_obj_t * scrl = lv_page_get_scrl(list_page); + + lv_ai_talk_list_ext_t * list_page_ext = (lv_ai_talk_list_ext_t *)lv_obj_get_ext_attr(list_page); + if(NULL == list_page_ext) + return; + + if(LV_EVENT_PRESSED == e) + { + list_page_ext->pressing = true; + } + else if((LV_EVENT_LONG_PRESSED == e) && (true == list_page_ext->pressing)) // delete msg item + { + list_page_ext->pressing = false; + + mmi_ai_talk_list_msg_item_delete_create(); + } + else if((LV_EVENT_CLICKED == e) && (true == list_page_ext->pressing)) // display text msg + { + list_page_ext->pressing = false; + } +} + +//display time & content +lv_obj_t * mmi_ai_talk_list_msg_item_add(lv_obj_t * list_page, nv_watch_wechat_msg_item_info_t * msg_item, char * time_str, uint8_t i) +{ + printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__); + + lv_obj_t * obj = NULL; + lv_ai_talk_list_item_ext_t * list_item_ext = NULL; + lv_ai_talk_list_ext_t * list_page_ext = lv_obj_get_ext_attr(list_page); + lv_obj_t * scrl = lv_page_get_scrl(list_page); + lv_obj_t * last_obj = lv_obj_get_child(scrl, NULL); + lv_coord_t obj_y = 0; + + if(NULL != last_obj) + { + obj_y = lv_obj_get_y(last_obj) + lv_obj_get_height(last_obj) + lv_obj_get_style_pad_inner(scrl, LV_STATE_DEFAULT); + } + else + { + obj_y = lv_obj_get_style_pad_top(scrl, LV_STATE_DEFAULT); + } + + if(0 != strlen(time_str)) + { + obj = lv_label_create(list_page, NULL); + + //lv_obj_set_base_dir(obj, LV_BIDI_DIR_LTR); + lv_label_set_text(obj, time_str); + lv_obj_add_style(obj, LV_LABEL_PART_MAIN, &list_page_ext->style_label_time); + lv_obj_align(obj, scrl, LV_ALIGN_IN_TOP_MID, 0, obj_y); + + last_obj = obj; + obj_y = lv_obj_get_y(last_obj) + lv_obj_get_height(last_obj) + lv_obj_get_style_pad_inner(scrl, LV_STATE_DEFAULT); + } + + printf("[@CHENG_DEBUG][%s][%d]: msg_type=%d,file=%s,size=%d,obj_y=%d\n", __FUNCTION__, __LINE__, + msg_item->msg_type, msg_item->msg_data_full_file_name, msg_item->msg_data_size, obj_y); + + switch(msg_item->msg_type) + { + case WECHAT_MSG_TYPE_VOICE: + lv_obj_t * unread_img = lv_img_create(list_page, NULL); + //obj = lv_img_create(list_page, NULL); + obj = lv_cont_create(list_page, NULL); + list_item_ext = lv_obj_allocate_ext_attr(obj, sizeof(lv_ai_talk_list_item_ext_t)); + list_item_ext->item_index = i; + list_item_ext->unread_img = NULL; + lv_obj_set_size(obj, LV_HOR_RES * 2 / 3, 50); + lv_cont_set_fit4(obj, LV_FIT_NONE, LV_FIT_NONE, LV_FIT_NONE, LV_FIT_TIGHT); + + lv_obj_t * play_img = lv_img_create(obj, NULL); + lv_obj_t * len_label = lv_label_create(obj, NULL); + uint32_t duration = 0; + + if(LV_FS_RES_OK != Hal_File_Get_AudioDurationTime((const char *)msg_item->msg_data_full_file_name, &duration)) + { + printf("[@CHENG_DEBUG][%s][%d]: read file error. %s\n", __FUNCTION__, __LINE__, msg_item->msg_data_full_file_name); + } + else + { + duration = (duration + 999) / 1000; + } + + if(0 == duration) + { + /*invalid voice*/ + lv_img_set_src(play_img, ICON_WECHAT_VOICE_ITEM_DAMAGE); + lv_label_set_text(len_label, ""); + } + else + { + char len_str[8] = {0}; + + if(MMI_AI_TALK_DATA_RECORD_DURATION_MAX < duration) + duration = MMI_AI_TALK_DATA_RECORD_DURATION_MAX; + + sprintf(len_str, "%d\"", duration); + lv_label_set_text(len_label, len_str); + } + + if(0 == msg_item->msg_from) // msg from slef + { + lv_obj_add_style(len_label, LV_LABEL_PART_MAIN, &list_page_ext->style_label_len_self); + //lv_img_set_src(obj, ICON_WECHAT_MY_VOICE_ITEM_BG); + lv_obj_add_style(obj, LV_CONT_PART_MAIN, &(list_page_ext->style_cont_self)); + lv_obj_align(obj, scrl, LV_ALIGN_IN_TOP_RIGHT, -10, obj_y); + if(0 < duration) + { + lv_img_set_src(play_img, ICON_WECHAT_MY_VOICE_ITEM_PLAYING3); + } + lv_obj_align(play_img, obj, LV_ALIGN_IN_LEFT_MID, 15, 0); + lv_obj_align(len_label, play_img, LV_ALIGN_OUT_RIGHT_MID, 10, 0); + lv_obj_del(unread_img); + } + else // msg from other + { + lv_obj_add_style(len_label, LV_LABEL_PART_MAIN, &list_page_ext->style_label_len_other); + //lv_img_set_src(obj, ICON_WECHAT_OTHER_VOICE_ITEM_BG); + lv_obj_add_style(obj, LV_CONT_PART_MAIN, &(list_page_ext->style_cont_other)); + lv_obj_align(obj, scrl, LV_ALIGN_IN_TOP_LEFT, 10, obj_y); + if(0 < duration) + { + lv_img_set_src(play_img, ICON_WECHAT_OTHER_VOICE_ITEM_PLAYING3); + } + lv_obj_align(play_img, obj, LV_ALIGN_IN_RIGHT_MID, -15, 0); + lv_obj_align(len_label, play_img, LV_ALIGN_OUT_LEFT_MID, -10, 0); + if(1 == msg_item->unread_flag) + { + lv_img_set_src(unread_img, ICON_WECHAT_UNREAD_FLAG); + lv_obj_align(unread_img, obj, LV_ALIGN_OUT_RIGHT_MID, 5, 0); + list_item_ext->unread_img = unread_img; + } + else + { + lv_obj_del(unread_img); + } + } + + lv_obj_set_click(obj, true); + lv_obj_set_event_cb(obj, mmi_ai_talk_list_voice_item_event_cb); + lv_obj_set_adv_hittest(obj, false); + lv_page_focus(list_page, obj, 0); + lv_page_glue_obj(obj, true); + lv_watch_obj_add_element(obj); + break; + + case WECHAT_MSG_TYPE_TEXT: + obj = lv_cont_create(list_page, NULL); + list_item_ext = lv_obj_allocate_ext_attr(obj, sizeof(lv_ai_talk_list_item_ext_t)); + list_item_ext->item_index = i; + list_item_ext->unread_img = NULL; + #if 1 + lv_obj_set_size(obj, LV_HOR_RES - 30, 50); //lv_obj_set_size(obj, 153, 53); // same with voice item + lv_cont_set_fit4(obj, LV_FIT_NONE, LV_FIT_NONE, LV_FIT_NONE, LV_FIT_TIGHT); + //lv_cont_set_layout(obj, LV_LAYOUT_COLUMN_LEFT); + lv_obj_add_style(obj, LV_CONT_PART_MAIN, &(list_page_ext->style_cont_other)); + lv_obj_align(obj, scrl, LV_ALIGN_IN_TOP_MID, 0, obj_y); + #else + lv_obj_set_size(obj, LV_HOR_RES * 2 / 3, 50); //lv_obj_set_size(obj, 153, 53); // same with voice item + lv_cont_set_fit4(obj, LV_FIT_NONE, LV_FIT_NONE, LV_FIT_NONE, LV_FIT_TIGHT); + //lv_cont_set_layout(obj, LV_LAYOUT_COLUMN_LEFT); + lv_obj_add_style(obj, LV_CONT_PART_MAIN, &(list_page_ext->style_cont_other)); + lv_obj_align(obj, scrl, LV_ALIGN_IN_TOP_LEFT, 10, obj_y); + #endif + + lv_fs_file_t file_p; + lv_fs_res_t res; + uint32_t file_size = 0, bytes_read = 0; + char * file_buf = NULL; + + res = lv_fs_open(&file_p, msg_item->msg_data_full_file_name, LV_FS_MODE_RD); + if(LV_FS_RES_OK != res) + { + printf("[@CHENG_DEBUG][%s][%d]: errno=%d\n", __FUNCTION__, __LINE__, res); + lv_fs_close(&file_p); + break; + } + + lv_fs_size(&file_p, &file_size); + file_buf = (char *)lv_mem_alloc(file_size + 1); + _lv_memset_00(file_buf, file_size + 1); + res = lv_fs_read(&file_p, file_buf, file_size, &bytes_read); + lv_fs_close(&file_p); + if(LV_FS_RES_OK != res) + { + printf("[@CHENG_DEBUG][%s][%d]: errno=%d\n", __FUNCTION__, __LINE__, res); + lv_mem_free(file_buf); + break; + } + printf("[@CHENG_DEBUG][%s][%d]: %d,%d,%s\n", __FUNCTION__, __LINE__, file_size, bytes_read, file_buf); + + lv_obj_t * label_text = lv_label_create(obj, NULL); + lv_obj_add_style(label_text, LV_LABEL_PART_MAIN, &(list_page_ext->style_label_len_other)); + lv_label_set_align(label_text, LV_LABEL_ALIGN_CENTER); + lv_label_set_long_mode(label_text, LV_LABEL_LONG_BREAK); + lv_obj_set_width(label_text, lv_obj_get_width(obj) - 20); + lv_label_set_text(label_text, file_buf); + lv_obj_align(label_text, obj, LV_ALIGN_IN_LEFT_MID, 10, 0); + + lv_obj_set_click(obj, true); + lv_obj_set_event_cb(obj, mmi_ai_talk_list_text_item_event_cb); + lv_obj_set_adv_hittest(obj, false); + lv_page_focus(list_page, obj, 0); + lv_page_glue_obj(obj, true); + lv_watch_obj_add_element(obj); + + lv_mem_free(file_buf); + break; + + case WECHAT_MSG_TYPE_EXPRESSION: + case WECHAT_MSG_TYPE_IMAGE: + #if 0 + obj = lv_img_create(list, NULL); + + lv_watch_obj_add_element(obj); + #endif + break; + + default: + break; + } + + return obj; +} + +lv_res_t mmi_ai_talk_list_scrl_signal(lv_obj_t * scrl, lv_signal_t sign, void * param) +{ + lv_res_t res; + + /* Include the ancient signal function */ + res = ancient_scrl_signal(scrl, sign, param); + if(res != LV_RES_OK) + return res; + + if(LV_SIGNAL_COORD_CHG == sign) + { + lv_obj_t * list_page = lv_obj_get_parent(scrl); + lv_ai_talk_list_ext_t * list_page_ext = (lv_ai_talk_list_ext_t *)lv_obj_get_ext_attr(list_page); + if(NULL == list_page_ext) + return; + + if(true == list_page_ext->pressing) + { + list_page_ext->pressing = false; + } + } + + return LV_RES_OK; +} + +void mmi_ai_talk_list_create(lv_obj_t * obj, lv_ai_talk_ext_t * ext) +{ + printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__); + + lv_obj_t * list_page = lv_page_create(obj, NULL); + lv_ai_talk_list_ext_t * list_page_ext = lv_obj_allocate_ext_attr(list_page, sizeof(lv_ai_talk_list_ext_t)); + if(NULL == ext) + return; + + lv_obj_set_size(list_page, lv_obj_get_width(obj), lv_obj_get_height(obj) - 5 - lv_obj_get_height(ext->img_record) - 8); + lv_page_set_scrollbar_mode(list_page, LV_SCROLLBAR_MODE_OFF); + lv_obj_set_style_local_bg_opa(list_page, LV_PAGE_PART_BG, LV_STATE_DEFAULT, LV_OPA_0); + lv_obj_set_style_local_border_opa(list_page, LV_PAGE_PART_BG, LV_STATE_DEFAULT, LV_OPA_0); + lv_obj_set_style_local_outline_width(list_page, LV_PAGE_PART_BG, LV_STATE_DEFAULT, 0); + //lv_obj_set_style_local_pad_bottom(list_page, LV_PAGE_PART_SCROLLABLE, LV_STATE_DEFAULT, 4); + //lv_obj_set_style_local_pad_top(list_page, LV_PAGE_PART_SCROLLABLE, LV_STATE_DEFAULT, 2); + //lv_obj_set_style_local_pad_inner(list_page, LV_PAGE_PART_SCROLLABLE, LV_STATE_DEFAULT, 8); + //lv_obj_set_style_local_bg_color(list_page, LV_PAGE_PART_SCROLLBAR, LV_STATE_DEFAULT, lv_color_make(16, 112, 194)); + //lv_obj_set_style_local_pad_inner(list_page, LV_PAGE_PART_SCROLLBAR, LV_STATE_DEFAULT, LV_DPI / 20); + //lv_obj_set_style_local_pad_left(list_page, LV_PAGE_PART_SCROLLBAR, LV_STATE_DEFAULT, 0); + //lv_obj_set_style_local_pad_right(list_page, LV_PAGE_PART_SCROLLBAR, LV_STATE_DEFAULT, 0); + //lv_obj_set_style_local_radius(list_page, LV_PAGE_PART_SCROLLBAR, LV_STATE_DEFAULT, 0); + + lv_page_set_scrl_layout(list_page, LV_LAYOUT_OFF); + lv_page_set_scrollable_fit2(list_page, LV_FIT_NONE, LV_FIT_TIGHT); + + lv_obj_t * scrl = lv_page_get_scrollable(list_page); + ancient_scrl_signal = lv_obj_get_signal_cb(scrl); + lv_obj_set_signal_cb(scrl, mmi_ai_talk_list_scrl_signal); + + lv_watch_obj_add_element(list_page); + lv_watch_obj_add_element(scrl); + + lv_style_init(&(list_page_ext->style_label_time)); + lv_style_copy(&(list_page_ext->style_label_time), &lv_watch_font20); + lv_style_set_text_color(&(list_page_ext->style_label_time), LV_STATE_DEFAULT, lv_color_make(20, 187, 242)); + + //lv_style_init(&(list_page_ext->style_text)); + //lv_style_copy(&(list_page_ext->style_text), &lv_style_pretty); + //lv_style_set_bg_color(&(list_page_ext->style_text), LV_STATE_DEFAULT, lv_color_make(0xFF, 0xE1, 0xE1)); + //lv_style_set_border_width(&(list_page_ext->style_text), LV_STATE_DEFAULT, 0); + //lv_style_set_shadow_width(&(list_page_ext->style_text), LV_STATE_DEFAULT, 0); + + lv_style_init(&(list_page_ext->style_label_len_other)); + lv_style_copy(&(list_page_ext->style_label_len_other), &lv_watch_font26); + lv_style_set_text_color(&(list_page_ext->style_label_len_other), LV_STATE_DEFAULT, lv_color_make(202, 134, 255)); + + lv_style_init(&(list_page_ext->style_label_len_self)); + lv_style_copy(&(list_page_ext->style_label_len_self), &lv_watch_font26); + lv_style_set_text_color(&(list_page_ext->style_label_len_self), LV_STATE_DEFAULT, lv_color_make(108, 189, 5)); + + lv_style_init(&(list_page_ext->style_cont_self)); + lv_style_set_bg_color(&(list_page_ext->style_cont_self), LV_STATE_DEFAULT, LV_COLOR_MAKE(175, 242, 89)); + lv_style_set_radius(&(list_page_ext->style_cont_self), LV_STATE_DEFAULT, 15); // 30 + lv_style_set_pad_top(&(list_page_ext->style_cont_self), LV_STATE_DEFAULT, 10); // 8 + lv_style_set_pad_bottom(&(list_page_ext->style_cont_self), LV_STATE_DEFAULT, 10); // 8 + lv_style_set_pad_left(&(list_page_ext->style_cont_self), LV_STATE_DEFAULT, 5); // 8 + lv_style_set_pad_right(&(list_page_ext->style_cont_self), LV_STATE_DEFAULT, 5); // 8 + + lv_style_init(&(list_page_ext->style_cont_other)); + lv_style_set_bg_color(&(list_page_ext->style_cont_other), LV_STATE_DEFAULT, LV_COLOR_MAKE(0xE2, 0xBD, 0xFF)); + lv_style_set_radius(&(list_page_ext->style_cont_other), LV_STATE_DEFAULT, 15); + lv_style_set_pad_top(&(list_page_ext->style_cont_other), LV_STATE_DEFAULT, 10); + lv_style_set_pad_bottom(&(list_page_ext->style_cont_other), LV_STATE_DEFAULT, 10); + lv_style_set_pad_left(&(list_page_ext->style_cont_other), LV_STATE_DEFAULT, 5); + lv_style_set_pad_right(&(list_page_ext->style_cont_other), LV_STATE_DEFAULT, 5); + + _lv_memset_00(&(list_page_ext->voice_playing_anim), sizeof(lv_anim_t)); + list_page_ext->voice_playing_msg_from = 0; + list_page_ext->pressing = false; + ext->list = list_page; + + uint8_t i = 0; + uint8_t msg_count = mmi_ai_talk_info_count_get(); + hal_rtc_t cur_time = {0}, last_msg_item_time = {0}, msg_time = {0}; + + Hal_Rtc_Gettime(&cur_time); + for(i = 0; i < msg_count; i++) + { + printf("[@CHENG_DEBUG][%s][%d]: i=%d, msg_count=%d\n", __FUNCTION__, __LINE__, i, msg_count); + + char time_str[32] = {0}; + nv_watch_wechat_msg_item_info_t * msg_item = NULL; + + mmi_ai_talk_info_index_item_get(i, &msg_item); + _lv_memcpy(&msg_time, &(msg_item->msg_time), sizeof(hal_rtc_t)); + mmi_ai_talk_list_msg_item_time(time_str, &cur_time, &msg_time, &last_msg_item_time); + _lv_memcpy(&last_msg_item_time, &(msg_item->msg_time), sizeof(hal_rtc_t)); + + mmi_ai_talk_list_msg_item_add(list_page, msg_item, time_str, i); + } + + if((lv_obj_get_height(list_page) - lv_obj_get_style_pad_top(list_page, LV_LIST_PART_BG) * 2) > lv_obj_get_height(scrl)) + { + lv_cont_set_layout(scrl, LV_LAYOUT_OFF); + } +} + +void mmi_ai_talk_main_screen_refresh(void) +{ + printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__); + + lv_ai_talk_ext_t * ext = mmi_ai_talk_actId_ext_get(ACT_ID_AI_TALK); + if(NULL == ext) + return; + + printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__); + + mmi_ai_talk_list_set_slide_enable(&ext->old_ext, true); + + mmi_ai_talk_voice_item_playing_stop(ext); + + mmi_ai_talk_list_msg_item_style_reset(ext); + if(NULL != ext->list) + { + lv_obj_del(ext->list); + ext->list = NULL; + } + + printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__); + if(NULL != ext->delete_timer_id) + { + Hal_Timer_Stop(ext->delete_timer_id); + ext->delete_timer_id = NULL; + } + printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__); + if(NULL != ext->delete_bg) + { + lv_obj_del(ext->delete_bg); + ext->delete_bg = NULL; + } + + printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__); + + uint8_t msg_count = mmi_ai_talk_info_count_get(); + if(0 == msg_count) + { + + printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__); + + lv_obj_set_hidden(ext->label_no_msg, false); + } + else + { + + printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__); + + lv_obj_set_hidden(ext->label_no_msg, true); + + mmi_ai_talk_list_create(ext->cont, ext); + } +} + +lv_obj_t * mmi_ai_talk_create(lv_obj_t * activity_obj) +{ + printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__); + + if(activity_obj == NULL) + { + lv_watch_activity_ext_t activity_ext; + + _lv_memset_00(&activity_ext, sizeof(lv_watch_activity_ext_t)); + activity_ext.actId = ACT_ID_AI_TALK; + activity_ext.create = (lv_watch_activity_create_f_t)mmi_ai_talk_create; //NULL; + activity_ext.prepare_destory = mmi_ai_talk_prepare_destory; + activity_obj = lv_watch_creat_activity_obj(&activity_ext); + LV_ASSERT_MEM(activity_obj); + } + + lv_obj_t * obj = lv_watch_obj_create(activity_obj); + if(NULL == obj) + return NULL; + /*Allocate the tab type specific extended data*/ + lv_ai_talk_ext_t * ext = lv_obj_allocate_ext_attr(obj, sizeof(lv_ai_talk_ext_t)); + if(NULL == ext) + return NULL; + + ext->cont = NULL; + ext->list = NULL; + ext->delete_timer_id = NULL; + ext->delete_bg = NULL; + ext->record_buffer = NULL; + ext->record_size = 0; + + lv_obj_t * cont = lv_cont_create(obj, NULL); + lv_obj_set_size(cont, lv_obj_get_width(obj), lv_obj_get_height(obj)); + lv_obj_align(cont, obj, LV_ALIGN_CENTER, 0, 0); + lv_obj_set_style_local_bg_color(cont, LV_CONT_PART_MAIN, LV_STATE_DEFAULT, lv_color_make(194, 252, 252)); + lv_watch_obj_add_element(cont); + ext->cont = cont; + + if(false == watch_modem_sim_present_check_req() + //|| (MMI_MODEM_SIGNAL_BAR_0 == watch_modem_get_signal_bar_req()) + ) + { + // no network + lv_obj_t * label = lv_label_create(cont, NULL); + lv_obj_add_style(label, LV_LABEL_PART_MAIN, &lv_watch_font26_black); + lv_label_set_text_id(label, WATCH_TEXT_ID_DEVICE_NO_NETWORK); + lv_label_set_align(label, LV_LABEL_ALIGN_CENTER); + lv_obj_align(label, cont, LV_ALIGN_CENTER, 0, -10); + + return obj; + } +/* + else if(true != mmi_watch_tcp_connect_state_get() + || true != mmi_protocol_watch_bind_state_get() + ) + { + // not bind + lv_obj_t * label = lv_label_create(cont, NULL); + lv_obj_add_style(label, LV_LABEL_PART_MAIN, &lv_watch_font26_black); + lv_label_set_text_id(label, WATCH_TEXT_ID_DEVICE_NOT_BIND); + lv_label_set_align(label, LV_LABEL_ALIGN_CENTER); + lv_obj_align(label, cont, LV_ALIGN_CENTER, 0, -10); + + return obj; + } +*/ + + //create no msg label + ext->label_no_msg = lv_label_create(cont, NULL); + lv_obj_add_style(ext->label_no_msg, LV_LABEL_PART_MAIN, &lv_watch_font26_black); + lv_label_set_text_id(ext->label_no_msg, WATCH_TEXT_ID_PRESS_TO_TALK); + //lv_label_set_align(ext->label_no_msg, LV_LABEL_ALIGN_CENTER); + lv_obj_align(ext->label_no_msg, cont, LV_ALIGN_CENTER, 0, -10); + + ext->img_record = lv_img_create(cont, NULL); + lv_img_set_src(ext->img_record, ICON_WECHAT_RECORD_BUTTON); + lv_obj_set_click(ext->img_record, true); + lv_obj_set_event_cb(ext->img_record, mmi_ai_talk_record_button_event_cb); + lv_obj_set_adv_hittest(ext->img_record, false); + lv_obj_add_protect(ext->img_record, LV_PROTECT_PRESS_LOST); + lv_watch_obj_add_element(ext->img_record); + lv_obj_align(ext->img_record, cont, LV_ALIGN_IN_BOTTOM_MID, 0, -8); + + uint8_t msg_count = mmi_ai_talk_info_count_get(); + if(0 == msg_count) + { + lv_obj_set_hidden(ext->label_no_msg, false); + } + else + { + lv_obj_set_hidden(ext->label_no_msg, true); + + mmi_ai_talk_list_create(cont, ext); + } + + return obj; +} + +void mmi_ai_talk_create_event_cb(lv_obj_t * btn, lv_event_t e) +{ + if(LV_EVENT_CLICKED == e) + { + // + static uint8_t task_init_flag = 0; + if(0 == task_init_flag) + { + mm_ai_talk_task_init(); + task_init_flag = 1; + } + mmi_ai_talk_tcp_connect_msg(NULL); + + // + mmi_ai_talk_info_init(); + + lv_watch_png_cache_all_free(); + lv_obj_t * obj = mmi_ai_talk_create(NULL); + LV_ASSERT_MEM(obj); + } +} + +#endif diff --git a/2.sdk/sdk/gui/lv_watch/lv_apps/custom_function/bei_ke_rui_sheng.h b/2.sdk/sdk/gui/lv_watch/lv_apps/custom_function/bei_ke_rui_sheng.h new file mode 100644 index 00000000..dfd24070 --- /dev/null +++ b/2.sdk/sdk/gui/lv_watch/lv_apps/custom_function/bei_ke_rui_sheng.h @@ -0,0 +1,100 @@ + + + +#ifndef __BEI_KE_RUI_SHENG_H__ +#define __BEI_KE_RUI_SHENG_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef LV_CONF_INCLUDE_SIMPLE +#include "lvgl.h" +#include "lv_watch_conf.h" +#else +#include "../../../lvgl/lvgl.h" +#include "../../../lv_watch_conf.h" +#endif + +#ifdef __MMI_CUSTOM_BEI_KE_RUI_SHENG__ + + +//#define MMI_AI_TALK_DATA_AMR_HEAD_SIZE (6) +//#define MMI_AI_TALK_DATA_RECORD_DURATION_MAX (15) // seconds +//#define MMI_AI_TALK_DATA_RECORD_SIZE_MAX (MMI_AI_TALK_DATA_RECORD_DURATION_MAX * HAL_AMR_BUFSIZE_PER_SECOND + MMI_AI_TALK_DATA_AMR_HEAD_SIZE) +#define MMI_AI_TALK_DATA_WAV_HEAD_SIZE (44) +#define MMI_AI_TALK_DATA_RECORD_DURATION_MAX (10) // seconds +#define MMI_AI_TALK_DATA_RECORD_SIZE_MAX (MMI_AI_TALK_DATA_RECORD_DURATION_MAX * 16000 + MMI_AI_TALK_DATA_WAV_HEAD_SIZE) + +#define MMI_AI_TALK_CHAT_TIME_INTERVAL (3 * 60) /*display the time of current chat msg if more than 3 mins from the previous chat msgs*/ + + + +typedef struct +{ + lv_watch_obj_ext_t old_ext; + lv_anim_t sending_anim; + TIMER_ID sending_timer_id, result_timer_id; + bool send_result; +} lv_ai_talk_sending_ext_t; + +typedef struct +{ + lv_watch_obj_ext_t old_ext; + lv_obj_t * label; +} lv_ai_talk_recording_ext_t; + +typedef struct +{ + lv_watch_obj_ext_t old_ext; + lv_obj_t * unread_img; + uint8_t item_index; +} lv_ai_talk_list_item_ext_t; + +typedef struct { + lv_page_ext_t old_ext; + lv_anim_t voice_playing_anim; + uint8_t voice_playing_msg_from; // 0-slef; 1-other + bool pressing; + lv_style_t style_cont_self; + lv_style_t style_cont_other; + lv_style_t style_label_time; + lv_style_t style_label_len_other; + lv_style_t style_label_len_self; +} lv_ai_talk_list_ext_t; + +typedef struct +{ + lv_watch_obj_ext_t old_ext; + lv_obj_t * cont; + lv_obj_t * list; // chat list + lv_obj_t * label_no_msg; // mo msg prompt + //lv_obj_t * img_emo; + lv_obj_t * img_record; // record button + + lv_obj_t * delete_bg; // delete msg + lv_obj_t * delete_current; + lv_obj_t * delete_all; + lv_obj_t * delete_back; + lv_obj_t * delete_label_prompt; + lv_obj_t * delete_btn_cancel; + lv_obj_t * delete_btn_ok; + TIMER_ID delete_timer_id; + + MCI_EVNET_T event; + uint8_t * record_buffer; + uint32_t record_size; +}lv_ai_talk_ext_t; + + + +void mmi_ai_talk_create_event_cb(lv_obj_t * btn, lv_event_t e); + +#endif + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif + diff --git a/2.sdk/sdk/gui/lv_watch/lv_apps/custom_function/bei_ke_rui_sheng_data.c b/2.sdk/sdk/gui/lv_watch/lv_apps/custom_function/bei_ke_rui_sheng_data.c new file mode 100644 index 00000000..5bf96b7c --- /dev/null +++ b/2.sdk/sdk/gui/lv_watch/lv_apps/custom_function/bei_ke_rui_sheng_data.c @@ -0,0 +1,292 @@ + + + +#include "lv_watch.h" + +#ifdef __MMI_CUSTOM_BEI_KE_RUI_SHENG__ + +//#include "../../../../../product/craneg_modem/pcac/video_call/re/include/Re_hmac.h" +#include "hal/dm/cJSON.h" + + +static void * s_ai_talk_send_space_ptr[MMI_AI_TALK_ACTION_MAX] = {NULL}; +static uint32_t s_ai_talk_send_space_size[MMI_AI_TALK_ACTION_MAX] = {0}; + +void mm_ai_talk_send_space_free(MMI_AI_TALK_ACTION_CMD_E action_cmd) +{ + if (NULL != s_ai_talk_send_space_ptr[action_cmd]) + { + lv_mem_free(s_ai_talk_send_space_ptr[action_cmd]); + s_ai_talk_send_space_ptr[action_cmd] = NULL; + s_ai_talk_send_space_size[action_cmd] = 0; + } +} + +void * mm_ai_talk_send_space_ptr_get(MMI_AI_TALK_ACTION_CMD_E action_cmd) +{ + return s_ai_talk_send_space_ptr[action_cmd]; +} + +uint32_t mm_ai_talk_send_space_size_get(MMI_AI_TALK_ACTION_CMD_E action_cmd) +{ + return s_ai_talk_send_space_size[action_cmd]; +} + +static bool mm_ai_talk_send_action(MMI_AI_TALK_ACTION_CMD_E action_cmd, unsigned char * content_ptr, int content_len) +{ + if((false == watch_modem_sim_present_check_req()) + || (MMI_MODEM_SIGNAL_BAR_0 == watch_modem_get_signal_bar_req()) + || (false == mmi_watch_tcp_connect_state_get()) + ) + { + printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__); + return false; + } + + if(NULL == content_ptr) + { + content_len = 0; + } + + //init send space + s_ai_talk_send_space_size[action_cmd] = content_len; + s_ai_talk_send_space_ptr[action_cmd] = lv_mem_alloc(s_ai_talk_send_space_size[action_cmd]); + if(NULL == s_ai_talk_send_space_ptr[action_cmd]) + { + printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__); + return false; + } + _lv_memset_00(s_ai_talk_send_space_ptr[action_cmd], s_ai_talk_send_space_size[action_cmd]); + _lv_memcpy(s_ai_talk_send_space_ptr[action_cmd], content_ptr, content_len); + + mm_ai_talk_send_task_msg_send(action_cmd); + + return true; +} + + +// signatureÉú³ÉÂß¼­£º¶Ôsecret_idºÍtimestampÒÔ¡°&&¡±½øÐÐÆ´½Ó³É×Ö·û´®£¬ÔÚÒÔhmacsha1Ϊ¼ÓÃÜ·½·¨£¬ +// ÒÔapi_keyΪhmacsha1µÄkey¶ÔÉÏÃæÆ´½Ó¶ø³ÉµÄ×Ö·û´®½øÐмÓÃܼ´¿ÉµÃ¡£ +bool mm_ai_talk_login_action(void) +{ + return false; + + + bool result = false; + MMI_AI_TALK_ACTION_CMD_E action_cmd = MMI_AI_TALK_ACTION_LOGIN; + unsigned char content_buff[512] = {0}; + unsigned int content_lenth = 0; + + char * secret_id = "Q4NPLBLyidvRc4TAUByUhcVfRFM1kQBi"; + char * api_key = "P7vNsYTv"; + uint32_t cur_timestamp = 0; + + uint8_t signature_in[128] = {0}; + uint8_t signature_out[20] = {0}; + + Hal_Rtc_Gettime_Count(&cur_timestamp); + sprintf(signature_in, "%s&&%d", secret_id, cur_timestamp); + + +// re_hmac_sha1(api_key, strlen(api_key), +// signature_in, strlen(signature_in), +// signature_out, sizeof(signature_out)); + + + // {"secret_id":"Q4NPLBLyidvRc4TAUByUhcVfRFM1kQBi","signature":"77ee9dd69a6a9e5f3c9f28f5754cf7ea03d2fd00","timestamp":"1698046396"} + sprintf(content_buff, "{\"secret_id\":\"%s\",\"signature\":\"%s\",\"timestamp\":\"%d\"}", + secret_id, signature_out, cur_timestamp); + content_lenth = strlen(content_buff); + result = mm_ai_talk_send_action(action_cmd, content_buff, content_lenth); + + return result; +} + +bool mmi_ai_talk_audio_data_send(char * data_buff, int data_buff_len) +{ + bool result = false; + MMI_AI_TALK_ACTION_CMD_E action_cmd = MMI_AI_TALK_ACTION_AUDIO_DATA; + unsigned char * content_buff = NULL; + unsigned int content_lenth = 0; + + if(NULL == data_buff || 0 == data_buff_len) + { + printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__); + return false; + } + + content_lenth = data_buff_len; + content_buff = lv_mem_alloc(content_lenth); + if(NULL == content_buff) + { + printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__); + return false; + } + _lv_memset_00(content_buff, content_lenth); + _lv_memcpy(content_buff, data_buff, data_buff_len); + + result = mm_ai_talk_send_action(action_cmd, content_buff, content_lenth); + lv_mem_free(content_buff); + + return result; +} + +void mmi_ai_talk_audio_data_send_end_char(void) +{ + bool result = false; + MMI_AI_TALK_ACTION_CMD_E action_cmd = MMI_AI_TALK_ACTION_AUDIO_DATA_END; + unsigned char * content_buff = NULL; + unsigned int content_lenth = 16; + + content_buff = lv_mem_alloc(content_lenth); + if(NULL == content_buff) + { + printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__); + return false; + } + _lv_memset_00(content_buff, content_lenth); + sprintf(content_buff, "paused"); // ",paused"); + content_lenth = strlen(content_buff); + + result = mm_ai_talk_send_action(action_cmd, content_buff, content_lenth); + lv_mem_free(content_buff); + + return result; +} + + + +#define BEI_KE_RECEIVE_FILE "C:/bei_ke.txt" +#define BEI_KE_RECEIVE_TEXT_FILE "C:/bei_ke_result.txt" +bool mmi_receive_info_write_to_file(char * path, char * info_buf, uint32_t info_size) +{ + lv_fs_file_t file_p; + lv_fs_res_t res; + uint32_t bytes_write = 0; + + res = lv_fs_open(&file_p, path, LV_FS_MODE_WR | LV_FS_MODE_APPEND); + if(LV_FS_RES_OK != res) + { + printf("[@CHENG_DEBUG][%s][%d]: errno=%d\n", __FUNCTION__, __LINE__, res); + lv_fs_close(&file_p); + return false; + } + + hal_rtc_t cur_time = {0}; + char str_time[24] = {0}; + + Hal_Rtc_Gettime(&cur_time); + sprintf(str_time, "\n[%04d%02d%02d_%02d%02d%02d]", + cur_time.tm_year, + cur_time.tm_mon, + cur_time.tm_mday, + cur_time.tm_hour, + cur_time.tm_min, + cur_time.tm_sec); + + //lv_fs_seek + res = lv_fs_write(&file_p, str_time, strlen(str_time), &bytes_write); + if(LV_FS_RES_OK != res) + { + printf("[@CHENG_DEBUG][%s][%d]: errno=%d\n", __FUNCTION__, __LINE__, res); + lv_fs_close(&file_p); + return false; + } + + res = lv_fs_write(&file_p, info_buf, info_size, &bytes_write); + lv_fs_close(&file_p); + if(LV_FS_RES_OK != res) + { + printf("[@CHENG_DEBUG][%s][%d]: errno=%d\n", __FUNCTION__, __LINE__, res); + return false; + } + printf("[@CHENG_DEBUG][%s][%d]: file_size=%d,write_size=%d\n", __FUNCTION__, __LINE__, info_size, bytes_write); + + return true; +} + + +bool mmi_ai_talk_data_receive(unsigned char * next_buff, unsigned int next_buff_len) +{ + bool result = false; + cJSON * json_root = NULL; + int is_final = 0; + char * type_str = NULL; + char * result_str = NULL; + uint16_t result_str_len = 0; + + if(NULL == next_buff || 0 == next_buff_len) + { + printf("[@CHENG_DEBUG][%s][%d]: no data\n", __FUNCTION__, __LINE__); + goto exit_free_res; + } + + + // write to file +// mmi_receive_info_write_to_file(BEI_KE_RECEIVE_FILE, next_buff, next_buff_len); + + lv_obj_t * activity_obj = lv_watch_get_activity_obj(ACT_ID_AI_TALK); + if(NULL == activity_obj) + { + printf("[@CHENG_DEBUG][%s][%d]: not in ai talk\n", __FUNCTION__, __LINE__); + goto exit_free_res; + } + + + json_root = cJSON_Parse(next_buff); + if(NULL == json_root) + { + printf("[@CHENG_DEBUG][%s][%d]: json parse error\n", __FUNCTION__, __LINE__); + goto exit_free_res; + } + //Hal_Mem_Free(next_buff); + //next_buff = NULL; + + is_final = cJSON_GetIntValue(cJSON_GetObjectItem(json_root, "is_final")); + if(1 != is_final) + { + printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__); + goto exit_free_res; + } + + type_str = cJSON_GetStringValue(cJSON_GetObjectItem(json_root, "type")); + if(NULL == type_str) + { + printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__); + goto exit_free_res; + } + if(0 != strncmp(type_str, "real_asr", strlen("real_asr"))) + { + printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__); + goto exit_free_res; + } + + result_str = cJSON_GetStringValue(cJSON_GetObjectItem(json_root, "results")); + if(NULL == result_str) + { + printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__); + goto exit_free_res; + } + result_str_len = strlen(result_str); + result = mmi_ai_talk_receive_from_server(result_str, result_str_len, WECHAT_MSG_TYPE_TEXT); + +exit_free_res: + //if(NULL != next_buff) + //{ + // printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__); + // Hal_Mem_Free(next_buff); + // next_buff = NULL; + //} + + if(NULL != json_root) + { + printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__); + cJSON_Delete(json_root); + json_root = NULL; + } + + return result; +} + +#endif + diff --git a/2.sdk/sdk/gui/lv_watch/lv_apps/custom_function/bei_ke_rui_sheng_data.h b/2.sdk/sdk/gui/lv_watch/lv_apps/custom_function/bei_ke_rui_sheng_data.h new file mode 100644 index 00000000..c7757e96 --- /dev/null +++ b/2.sdk/sdk/gui/lv_watch/lv_apps/custom_function/bei_ke_rui_sheng_data.h @@ -0,0 +1,47 @@ + + + +#ifndef __BEI_KE_RUI_SHENG_DATA_H__ +#define __BEI_KE_RUI_SHENG_DATA_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef LV_CONF_INCLUDE_SIMPLE +#include "lvgl.h" +#include "lv_watch_conf.h" +#else +#include "../../../lvgl/lvgl.h" +#include "../../../lv_watch_conf.h" +#endif + +#ifdef __MMI_CUSTOM_BEI_KE_RUI_SHENG__ + + +typedef enum +{ + MMI_AI_TALK_ACTION_NONE, + + MMI_AI_TALK_ACTION_LOGIN = MMI_AI_TALK_ACTION_NONE, + MMI_AI_TALK_ACTION_AUDIO_DATA, + MMI_AI_TALK_ACTION_AUDIO_DATA_END, + + MMI_AI_TALK_ACTION_MAX +}MMI_AI_TALK_ACTION_CMD_E; + + +void mm_ai_talk_send_space_free(MMI_AI_TALK_ACTION_CMD_E action_cmd); +void * mm_ai_talk_send_space_ptr_get(MMI_AI_TALK_ACTION_CMD_E action_cmd); +uint32_t mm_ai_talk_send_space_size_get(MMI_AI_TALK_ACTION_CMD_E action_cmd); +bool mm_ai_talk_login_action(void); +bool mmi_ai_talk_audio_data_send(char * data_buff, int data_buff_len); +bool mmi_ai_talk_data_receive(unsigned char * next_buff, unsigned int next_buff_len); + +#endif + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif diff --git a/2.sdk/sdk/gui/lv_watch/lv_apps/custom_function/bei_ke_rui_sheng_socket.c b/2.sdk/sdk/gui/lv_watch/lv_apps/custom_function/bei_ke_rui_sheng_socket.c new file mode 100644 index 00000000..e51555d4 --- /dev/null +++ b/2.sdk/sdk/gui/lv_watch/lv_apps/custom_function/bei_ke_rui_sheng_socket.c @@ -0,0 +1,450 @@ + + + +#include "lv_watch.h" + +#ifdef __MMI_CUSTOM_BEI_KE_RUI_SHENG__ + +#define MMI_AI_TALK_TCP_TASK_PRIORITY 220 +#define MMI_AI_TALK_SEND_TASK_PRIORITY 220 + +#define MMI_AI_TALK_TCP_TASK_STACK_SIZE (32 * 1024) +#define MMI_AI_TALK_SEND_TASK_STACK_SIZE (16 * 1024) + +TASK_HANDLE * s_ai_talk_tcp_task_id = NULL; +TASK_HANDLE * s_ai_talk_send_task_id = NULL; + +#define AI_TALK_RECEIVE_BUFF_LEN (6 * 1024) // (26 * 1024) + + +static mmi_ai_talk_tcp_info_t s_ai_talk_tcp_info = {0}; + + +// tcp task +void mmi_ai_talk_tcp_task_msg_send(MMI_AI_TALK_TCP_MSG_ID_E msg_id, void * param) +{ + printf("[@CHENG_DEBUG][%s][%d]: msg_id=%d\n",__FUNCTION__,__LINE__, msg_id); + + if(NULL != s_ai_talk_tcp_task_id) + { + if((64 - 1) < Hal_Get_Message_Count(s_ai_talk_tcp_task_id)) + { + printf("[@CHENG_DEBUG][%s][%d]: msg queue full\n",__FUNCTION__,__LINE__); + return; + } + + printf("[@CHENG_DEBUG][%s][%d]: \n",__FUNCTION__,__LINE__); + + mmi_ai_talk_task_msg_t * msg = Hal_Mem_Alloc(sizeof(mmi_ai_talk_task_msg_t)); + msg->cmd_type = msg_id; + msg->cmd_param = param; + + Hal_Send_Message((TASK_ID)s_ai_talk_tcp_task_id, (void *)msg); + } +} + +void mmi_ai_talk_tcp_connect_msg(void * param) +{ + mmi_ai_talk_tcp_task_msg_send(MMI_AI_TALK_TCP_MSG_CONNECT, param); +} + +void mmi_ai_talk_tcp_reconnect_msg(void * param) +{ + mmi_ai_talk_tcp_task_msg_send(MMI_AI_TALK_TCP_MSG_RECONNECT, param); +} + +void mmi_ai_talk_tcp_disconnect_msg(void * param) +{ + mmi_ai_talk_tcp_task_msg_send(MMI_AI_TALK_TCP_MSG_DISCONNECT, param); +} + +void mmi_ai_talk_tcp_read_msg(void * param) +{ + mmi_ai_talk_tcp_task_msg_send(MMI_AI_TALK_TCP_MSG_READ, param); +} + + +static void mmi_ai_talk_socket_callback(int sfd, int event, unsigned int len) +{ + printf("[@CHENG_DEBUG][%s][%d]: sfd=%d, event=0x%x, len=%d\n",__FUNCTION__, __LINE__, sfd, event, len); + + switch (event) + { + case NETCONN_EVT_CONNECTED: + printf("[@CHENG_DEBUG][%s][%d]: socket connected\n",__FUNCTION__,__LINE__); + break; + + case NETCONN_EVT_CLOSE_NORMAL: + printf("[@CHENG_DEBUG][%s][%d]: socket close normal\n",__FUNCTION__,__LINE__); + break; + + case NETCONN_EVT_RCVPLUS: + printf("[@CHENG_DEBUG][%s][%d]: socket rcv plus\n",__FUNCTION__,__LINE__); + ValSetDataTransFlag(1); + if(len > 0) // && false == mmi_ai_talk_voice_is_recording()) + { + mmi_ai_talk_socket_fd_t * data_info = (mmi_ai_talk_socket_fd_t *)Hal_Mem_Alloc(sizeof(mmi_ai_talk_socket_fd_t)); + data_info->socket_fd = sfd; + data_info->len = len; + mmi_ai_talk_tcp_read_msg(data_info); + } + break; + + case NETCONN_EVT_RCVMINUS: + printf("dt rcv minus event\n"); + break; + + case NETCONN_EVT_SENDPLUS: + ValSetDataTransFlag(1); + printf("[@CHENG_DEBUG][%s][%d]: socket send plus\n",__FUNCTION__,__LINE__); + break; + + case NETCONN_EVT_SENDACKED: + printf("[@CHENG_DEBUG][%s][%d]: socket send ack\n",__FUNCTION__,__LINE__); + break; + + case NETCONN_EVT_ERROR_RST: + case NETCONN_EVT_ERROR_ABRT: + case NETCONN_EVT_CLOSE_WAIT: + ValSetDataTransFlag(1); + printf("dt socket error or close event = %02x\n",event); + printf("LH reconnect\n"); + //if(Hal_Get_Message_Count((TASK_ID)modem_tcp_task_id) < UOS_TCP_TASK_MSG_QSIZE) + //{ + // send_task_msg_tcp_reconnect(NULL); + //} + break; + + default: + printf("dt other event\n"); + break; + } +} + +void mmi_ai_talk_tcp_connect(void * param) +{ + int res = -1; + if(FALSE == watch_modem_sim_present_check_req()) + { + printf("[@CHENG_DEBUG][%s][%d]: \n",__FUNCTION__,__LINE__); + goto go_reconnect; + } + + if(s_ai_talk_tcp_info.first_connect_flag == false) + { + s_ai_talk_tcp_info.first_connect_flag = true; + printf("[@CHENG_DEBUG][%s][%d]: \n",__FUNCTION__,__LINE__); + } + + if(s_ai_talk_tcp_info.connect_flag == true) + { + printf("[@CHENG_DEBUG][%s][%d]: \n",__FUNCTION__,__LINE__); + return; + } + + if(s_ai_talk_tcp_info.connecting_flag) + { + printf("[@CHENG_DEBUG][%s][%d]: \n",__FUNCTION__,__LINE__); + return; + } + else + { + s_ai_talk_tcp_info.connecting_flag = true; + } + + res = ValNetworkSocketInit_with_callback(NULL, MMI_AI_TALK_IP_ADDRESS, MMI_AI_TALK_IP_PORT, (socket_callback)mmi_ai_talk_socket_callback); + printf("[@CHENG_DEBUG][%s][%d]: socket init connect res = %d\n",__FUNCTION__,__LINE__, res); + +go_reconnect : + if(res < 0) + { + int relink_time = 0; + int randnum = 0; + unsigned int time = 0; + + Hal_Rtc_Gettime_Count(&time); + srand(time); + randnum = rand() % 50 + 10; + relink_time = randnum * 1000 / 5; + + uos_timer_stop(s_ai_talk_tcp_info.relink_timer); + uos_timer_start(s_ai_talk_tcp_info.relink_timer, relink_time, + 0, (void (*)(uint32_t))mmi_ai_talk_tcp_reconnect_msg, NULL); + printf("reconnect time = %d\n",(relink_time / 1000 * 5)); + } + else + { + s_ai_talk_tcp_info.sock_fd = res; + mmi_ai_talk_tcp_connected(param); + } +} + +void mmi_ai_talk_tcp_connected(void *param) +{ + printf("[@CHENG_DEBUG][%s][%d]: \n",__FUNCTION__,__LINE__); + + s_ai_talk_tcp_info.connect_flag = true; + s_ai_talk_tcp_info.connecting_flag = false; + + mm_ai_talk_login_action(); +} + +void mmi_ai_talk_tcp_disconnect(void *param) +{ + if(s_ai_talk_tcp_info.relink_timer != NULL) + { + uos_timer_stop(s_ai_talk_tcp_info.relink_timer); + //s_ai_talk_tcp_info.relink_timer = NULL; + } + + s_ai_talk_tcp_info.reconnect_count = 5; + s_ai_talk_tcp_info.connect_flag = false; + s_ai_talk_tcp_info.first_connect_flag = false; + s_ai_talk_tcp_info.connecting_flag = false; + + printf("[@CHENG_DEBUG][%s][%d]: sock_fd=%d\n",__FUNCTION__,__LINE__, s_ai_talk_tcp_info.sock_fd); + if(s_ai_talk_tcp_info.sock_fd > 0) + { + int ret = ValSocketClose(s_ai_talk_tcp_info.sock_fd); + s_ai_talk_tcp_info.sock_fd = -1; + } +} + +void mmi_ai_talk_tcp_reconnect(void *param) +{ + if(false == watch_modem_sim_present_check_req()) + { + return; + } + + mmi_ai_talk_tcp_disconnect(NULL); + + long reconnect_time = (5 * 1000) / 5; + s_ai_talk_tcp_info.reconnect_count--; + if(s_ai_talk_tcp_info.reconnect_count < 0) + { + s_ai_talk_tcp_info.reconnect_count = 5; + } + else + { + reconnect_time = 10 * 1000 / 5; + } + + uos_timer_stop(s_ai_talk_tcp_info.relink_timer); + uos_timer_start(s_ai_talk_tcp_info.relink_timer, reconnect_time , 0, (void (*)(uint32_t))mmi_ai_talk_tcp_connect_msg, NULL); +} + +void mmi_ai_talk_tcp_read_data(void *param) +{ + mmi_ai_talk_socket_fd_t * data_info = (mmi_ai_talk_socket_fd_t *)param; + if((NULL == data_info) || (data_info->socket_fd < 0)) + { + printf("[@CHENG_DEBUG][%s][%d]: \n",__FUNCTION__,__LINE__); + return; + } + + int recv_ret = -1; + int recv_len = 0; + char * recv_buf = (char *)Hal_Mem_Alloc(AI_TALK_RECEIVE_BUFF_LEN); + if(NULL == recv_buf) + { + printf("[@CHENG_DEBUG][%s][%d]: recv_buf alloc fail\n",__FUNCTION__,__LINE__); + return; + } + Hal_Mem_Set(recv_buf , 0x00, AI_TALK_RECEIVE_BUFF_LEN); + recv_ret = ValRecvEx(data_info->socket_fd, AI_TALK_SOCKET_REV_TIMEOUT, recv_buf, AI_TALK_RECEIVE_BUFF_LEN, &recv_len); + printf("[@CHENG_DEBUG][%s][%d]: recv_ret=%d,recv_len=%d,recv_buf=0x%x\n", __FUNCTION__, __LINE__, recv_ret, recv_len, recv_buf); + printf("[@CHENG_DEBUG][%d]: str=%s\n", __LINE__, recv_buf); + if(0 <= recv_ret) + { + mmi_ai_talk_data_receive(recv_buf, recv_len); +// mmi_protocol_receive_data_process(recv_str, recv_len); + } + + if(NULL != recv_buf) + { + printf("[@CHENG_DEBUG][%s][%d]: recv_buf free\n",__FUNCTION__,__LINE__); + Hal_Mem_Free(recv_buf); + recv_buf = NULL; + } +} + +void mm_ai_talk_tcp_task_handle(void * param) +{ + mmi_ai_talk_task_msg_t * msg = (mmi_ai_talk_task_msg_t *)param; + MMI_AI_TALK_TCP_MSG_ID_E msg_id = msg->cmd_type; + void * msg_param = msg->cmd_param; + + printf("[@CHENG_DEBUG][%s][%d]: msg_id=%d\n",__FUNCTION__,__LINE__, msg_id); + switch(msg_id) + { + case MMI_AI_TALK_TCP_MSG_CONNECT: + mmi_ai_talk_tcp_connect(msg_param); + break; + + case MMI_AI_TALK_TCP_MSG_CONNECTED: + mmi_ai_talk_tcp_connected(msg_param); + break; + + case MMI_AI_TALK_TCP_MSG_DISCONNECT: + mmi_ai_talk_tcp_disconnect(msg_param); + break; + + case MMI_AI_TALK_TCP_MSG_RECONNECT: + mmi_ai_talk_tcp_reconnect(msg_param); + break; + + case MMI_AI_TALK_TCP_MSG_READ: + mmi_ai_talk_tcp_read_data(msg_param); + break; + + default: + break; + } +} + +static void mm_ai_talk_tcp_task_entry(void * para) +{ + while(s_ai_talk_tcp_task_id == NULL) + { + uos_sleep(10); + } + + while(1) + { + // receive message + mmi_ai_talk_task_msg_t * msg = (mmi_ai_talk_task_msg_t *)Hal_Receive_Message((TASK_ID)s_ai_talk_tcp_task_id, TRUE); + + mm_ai_talk_tcp_task_handle(msg); + Hal_Mem_Free(msg->cmd_param); + Hal_Mem_Free(msg); + } +} + +static void mm_ai_talk_tcp_task_init(void) +{ + s_ai_talk_tcp_task_id = uos_create_task(mm_ai_talk_tcp_task_entry, NULL, 64, MMI_AI_TALK_TCP_TASK_STACK_SIZE, MMI_AI_TALK_TCP_TASK_PRIORITY, "mm_ai_talk_tcp_task"); + + printf("[@CHENG_DEBUG][%s][%d]: tcp_task_id=0x%x\n",__FUNCTION__,__LINE__, s_ai_talk_tcp_task_id); +} + + +// send task +void mm_ai_talk_send_task_msg_send(MMI_AI_TALK_ACTION_CMD_E action_cmd) +{ + if(NULL != s_ai_talk_send_task_id) + { + mmi_ai_talk_task_msg_t * msg = Hal_Mem_Alloc(sizeof(mmi_ai_talk_task_msg_t)); + msg->cmd_type = action_cmd; + msg->cmd_param = NULL; + + Hal_Send_Message((TASK_ID)s_ai_talk_send_task_id, (void *)msg); + } + else + { + printf("[@CHENG_DEBUG][%s][%d]: \n",__FUNCTION__, __LINE__); + mm_ai_talk_send_space_free(action_cmd); + } +} + +static void mm_ai_talk_send_task_handle(void *param) +{ + MMI_AI_TALK_ACTION_CMD_E action_cmd = ((mmi_ai_talk_task_msg_t *)param)->cmd_type; + + if((false == watch_modem_sim_present_check_req()) + || (MMI_MODEM_SIGNAL_BAR_0 == watch_modem_get_signal_bar_req()) + ) + { + printf("[@CHENG_DEBUG][%s][%d]: \n",__FUNCTION__,__LINE__); + mm_ai_talk_send_space_free(action_cmd); + return; + } + + unsigned char * send_buff = (unsigned char *)mm_ai_talk_send_space_ptr_get(action_cmd); + int send_size = mm_ai_talk_send_space_size_get(action_cmd); + printf("[@CHENG_DEBUG][%s][%d]: len=%d\n", __FUNCTION__, __LINE__, send_size); + printf("[@CHENG_DEBUG][%d]: str=%s\n", __LINE__, send_buff); + + if((NULL != send_buff) && (0 < send_size)) + { + int sockfd = s_ai_talk_tcp_info.sock_fd; + + if(sockfd > 0) + { + int ret = -1; + ret = ValSend(sockfd, AI_TALK_SOCKET_REV_TIMEOUT, send_buff, send_size); + printf("[@CHENG_DEBUG][%s][%d]: sock_fd=%d,ret=%d\n", __FUNCTION__, __LINE__, sockfd, ret); + if(ret < 0) + { + printf("[@CHENG_DEBUG][%s][%d]: ValSend fail\n", __FUNCTION__, __LINE__); + //mmi_ai_talk_tcp_reconnect_msg(NULL); + } + } + else + { + printf("[@CHENG_DEBUG][%s][%d]: sock_fd=%d\n", __FUNCTION__, __LINE__, sockfd); + mmi_ai_talk_tcp_reconnect_msg(NULL); + } + } + + mm_ai_talk_send_space_free(action_cmd); +} + +static void mm_ai_talk_send_task_entry(void *param) +{ + while(NULL == s_ai_talk_send_task_id) + { + uos_sleep(10); + } + + while(1) + { + mmi_ai_talk_task_msg_t * msg = (mmi_ai_talk_task_msg_t *)Hal_Receive_Message((TASK_ID)s_ai_talk_send_task_id, TRUE); + if(!msg) + continue; + + mm_ai_talk_send_task_handle((void *)msg); + Hal_Mem_Free(msg); + } +} + +static void mm_ai_talk_send_task_init(void) +{ + s_ai_talk_send_task_id = uos_create_task(mm_ai_talk_send_task_entry, NULL, 64, MMI_AI_TALK_SEND_TASK_STACK_SIZE, MMI_AI_TALK_SEND_TASK_PRIORITY, "mm_ai_talk_send_task"); + + printf("[@CHENG_DEBUG][%s][%d]: send_task_id=0x%x\n",__FUNCTION__,__LINE__, s_ai_talk_send_task_id); +} + + +void mmi_ai_talk_tcp_info_init(void) +{ + s_ai_talk_tcp_info.sock_fd = -1; + s_ai_talk_tcp_info.connect_flag = false; + s_ai_talk_tcp_info.connecting_flag = false; + s_ai_talk_tcp_info.first_connect_flag = false; + s_ai_talk_tcp_info.reconnect_count = 5; + + if(NULL != s_ai_talk_tcp_info.relink_timer) + { + uos_timer_stop(s_ai_talk_tcp_info.relink_timer); + uos_timer_delete(s_ai_talk_tcp_info.relink_timer); + s_ai_talk_tcp_info.relink_timer = NULL; + } + uos_timer_create(&s_ai_talk_tcp_info.relink_timer); +} + +void mm_ai_talk_task_init(void) +{ + if(false == watch_modem_sim_present_check_req() + //|| (MMI_MODEM_SIGNAL_BAR_0 == watch_modem_get_signal_bar_req()) + ) + { + return; + } + + mmi_ai_talk_tcp_info_init(); + mm_ai_talk_tcp_task_init(); + mm_ai_talk_send_task_init(); +} + +#endif diff --git a/2.sdk/sdk/gui/lv_watch/lv_apps/custom_function/bei_ke_rui_sheng_socket.h b/2.sdk/sdk/gui/lv_watch/lv_apps/custom_function/bei_ke_rui_sheng_socket.h new file mode 100644 index 00000000..0c2394fc --- /dev/null +++ b/2.sdk/sdk/gui/lv_watch/lv_apps/custom_function/bei_ke_rui_sheng_socket.h @@ -0,0 +1,80 @@ + + + +#ifndef __BEI_KE_RUI_SOCKET_H__ +#define __BEI_KE_RUI_SOCKET_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef LV_CONF_INCLUDE_SIMPLE +#include "lvgl.h" +#include "lv_watch_conf.h" +#else +#include "../../../lvgl/lvgl.h" +#include "../../../lv_watch_conf.h" +#endif + +#ifdef __MMI_CUSTOM_BEI_KE_RUI_SHENG__ + +#include "../../../../product/craneg_modem/cust/fit/inc/sdknet.h" + + +#define MMI_AI_TALK_IP_ADDRESS ("ability.raisound.com") +#define MMI_AI_TALK_IP_PORT (8899) + +#define AI_TALK_SOCKET_SEND_TIMEOUT 3 +#define AI_TALK_SOCKET_REV_TIMEOUT 3 + + + +typedef enum +{ + MMI_AI_TALK_TCP_MSG_ID_START, + + MMI_AI_TALK_TCP_MSG_CONNECT, + MMI_AI_TALK_TCP_MSG_CONNECTED, + MMI_AI_TALK_TCP_MSG_DISCONNECT, + MMI_AI_TALK_TCP_MSG_RECONNECT, + MMI_AI_TALK_TCP_MSG_SEND, + MMI_AI_TALK_TCP_MSG_READ, + + MMI_AI_TALK_TCP_MSG_ID_END +}MMI_AI_TALK_TCP_MSG_ID_E; + + +typedef struct { + signed long sock_fd; + unsigned char connect_flag; + unsigned char connecting_flag; + unsigned char first_connect_flag; + char reconnect_count; + + void *relink_timer; +}mmi_ai_talk_tcp_info_t; + + +typedef struct +{ + uint16_t cmd_type; + void * cmd_param; +}mmi_ai_talk_task_msg_t; + +typedef struct +{ + int socket_fd; + int len; +} mmi_ai_talk_socket_fd_t; + + +void mm_ai_talk_task_init(void); + + +#endif + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif diff --git a/2.sdk/sdk/gui/lv_watch/lv_apps/custom_function/custom_function.c b/2.sdk/sdk/gui/lv_watch/lv_apps/custom_function/custom_function.c index a306c07d..4471f5bb 100644 --- a/2.sdk/sdk/gui/lv_watch/lv_apps/custom_function/custom_function.c +++ b/2.sdk/sdk/gui/lv_watch/lv_apps/custom_function/custom_function.c @@ -9,6 +9,11 @@ #include "heng_ai.c" #endif +#ifdef __MMI_CUSTOM_BEI_KE_RUI_SHENG__ +#include "bei_ke_rui_sheng.c" +#include "bei_ke_rui_sheng_data.c" +#include "bei_ke_rui_sheng_socket.c" +#endif diff --git a/2.sdk/sdk/gui/lv_watch/lv_apps/custom_function/custom_function.h b/2.sdk/sdk/gui/lv_watch/lv_apps/custom_function/custom_function.h index c97a84b0..05fa888b 100644 --- a/2.sdk/sdk/gui/lv_watch/lv_apps/custom_function/custom_function.h +++ b/2.sdk/sdk/gui/lv_watch/lv_apps/custom_function/custom_function.h @@ -23,6 +23,11 @@ extern "C" { #include "heng_ai.h" #endif +#ifdef __MMI_CUSTOM_BEI_KE_RUI_SHENG__ +#include "bei_ke_rui_sheng.h" +#include "bei_ke_rui_sheng_data.h" +#include "bei_ke_rui_sheng_socket.h" +#endif #endif diff --git a/2.sdk/sdk/gui/lv_watch/lv_apps/primary_menu/primary_menu.c b/2.sdk/sdk/gui/lv_watch/lv_apps/primary_menu/primary_menu.c index 0afe65b1..ec479029 100644 --- a/2.sdk/sdk/gui/lv_watch/lv_apps/primary_menu/primary_menu.c +++ b/2.sdk/sdk/gui/lv_watch/lv_apps/primary_menu/primary_menu.c @@ -82,7 +82,7 @@ uint8_t mmi_main_menu_app_num_pre_tab_get(void) break; } - printf("[@CHENG_DEBUG][%s][%d]: num=%d\n", __FUNCTION__, __LINE__, num); + // printf("[@CHENG_DEBUG][%s][%d]: num=%d\n", __FUNCTION__, __LINE__, num); return num; } diff --git a/2.sdk/sdk/gui/lv_watch/lv_apps/primary_menu/primary_menu_data.c b/2.sdk/sdk/gui/lv_watch/lv_apps/primary_menu/primary_menu_data.c index da6e9c94..f02f1077 100644 --- a/2.sdk/sdk/gui/lv_watch/lv_apps/primary_menu/primary_menu_data.c +++ b/2.sdk/sdk/gui/lv_watch/lv_apps/primary_menu/primary_menu_data.c @@ -54,6 +54,9 @@ static watch_app_info_t s_main_menu_four_grid[] = { ICON_CALCULATOR, WATCH_TEXT_ID_CALCULATOR, calculator_create_event_cb }, { ICON_CALENDAR, WATCH_TEXT_ID_CALENDER, calendar_create_event_cb }, +#ifdef __MMI_CUSTOM_BEI_KE_RUI_SHENG__ + { ICON_AI_TALK, WATCH_TEXT_ID_AI_TALK, mmi_ai_talk_create_event_cb }, +#endif { ICON_SETTING, WATCH_TEXT_ID_SETTINGS, setting_create_event_cb }, }; #endif diff --git a/2.sdk/sdk/gui/lv_watch/lv_watch_res.h b/2.sdk/sdk/gui/lv_watch/lv_watch_res.h index 7d047d83..fd291503 100644 --- a/2.sdk/sdk/gui/lv_watch/lv_watch_res.h +++ b/2.sdk/sdk/gui/lv_watch/lv_watch_res.h @@ -130,6 +130,9 @@ LV_IMG_DECLARE(img_poweron_logo); #define ICON_ALIPAY "R:/png/primary_function/icon_alipay.png" #define ICON_SMS_MSG "R:/png/primary_function/icon_sms.png" #define ICON_PHONEBOOK "R:/png/primary_function/ICON_PHONEBOOK.png" +#ifdef __MMI_CUSTOM_BEI_KE_RUI_SHENG__ +#define ICON_AI_TALK "R:/png/primary_function/ICON_AI_TALK.png" +#endif #endif