beike
authorCCC <2393524978@qq.com>
Thu, 2 Nov 2023 01:20:07 +0000 (09:20 +0800)
committerCCC <2393524978@qq.com>
Thu, 2 Nov 2023 01:20:07 +0000 (09:20 +0800)
19 files changed:
2.sdk/project/Z5_K7/gui/lv_watch/resource/png/primary_function/ICON_AI_TALK.png [new file with mode: 0644]
2.sdk/sdk/gui/lv_watch/framework/language/lang_ch.c
2.sdk/sdk/gui/lv_watch/framework/language/lang_en.c
2.sdk/sdk/gui/lv_watch/framework/message/mmi_msg_zhsx.c
2.sdk/sdk/gui/lv_watch/framework/message/watch_msg_handle.c
2.sdk/sdk/gui/lv_watch/framework/message/watch_msg_handle.h
2.sdk/sdk/gui/lv_watch/include/ui_activity_id.h
2.sdk/sdk/gui/lv_watch/include/ui_textid.h
2.sdk/sdk/gui/lv_watch/lv_apps/custom_function/bei_ke_rui_sheng.c [new file with mode: 0644]
2.sdk/sdk/gui/lv_watch/lv_apps/custom_function/bei_ke_rui_sheng.h [new file with mode: 0644]
2.sdk/sdk/gui/lv_watch/lv_apps/custom_function/bei_ke_rui_sheng_data.c [new file with mode: 0644]
2.sdk/sdk/gui/lv_watch/lv_apps/custom_function/bei_ke_rui_sheng_data.h [new file with mode: 0644]
2.sdk/sdk/gui/lv_watch/lv_apps/custom_function/bei_ke_rui_sheng_socket.c [new file with mode: 0644]
2.sdk/sdk/gui/lv_watch/lv_apps/custom_function/bei_ke_rui_sheng_socket.h [new file with mode: 0644]
2.sdk/sdk/gui/lv_watch/lv_apps/custom_function/custom_function.c
2.sdk/sdk/gui/lv_watch/lv_apps/custom_function/custom_function.h
2.sdk/sdk/gui/lv_watch/lv_apps/primary_menu/primary_menu.c
2.sdk/sdk/gui/lv_watch/lv_apps/primary_menu/primary_menu_data.c
2.sdk/sdk/gui/lv_watch/lv_watch_res.h

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 (file)
index 0000000..9f513b3
Binary files /dev/null and b/2.sdk/project/Z5_K7/gui/lv_watch/resource/png/primary_function/ICON_AI_TALK.png differ
index f1fdcbd..7880036 100644 (file)
@@ -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
index c631bc2..8f9c60d 100644 (file)
@@ -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
index d4ac76d..555ba66 100644 (file)
@@ -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
 
 
 
index aaddeba..f407dee 100644 (file)
@@ -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
index cb42577..3225479 100644 (file)
@@ -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
index 491571a..456d351 100644 (file)
@@ -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,
index 65b171e..6cea8b1 100644 (file)
@@ -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 (file)
index 0000000..c93635d
--- /dev/null
@@ -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 (file)
index 0000000..dfd2407
--- /dev/null
@@ -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 (file)
index 0000000..5bf96b7
--- /dev/null
@@ -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 (file)
index 0000000..c7757e9
--- /dev/null
@@ -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 (file)
index 0000000..e51555d
--- /dev/null
@@ -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 (file)
index 0000000..0c2394f
--- /dev/null
@@ -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
index a306c07..4471f5b 100644 (file)
@@ -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
 
 
 
index c97a84b..05fa888 100644 (file)
@@ -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
index 0afe65b..ec47902 100644 (file)
@@ -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;
 }
 
index da6e9c9..f02f107 100644 (file)
@@ -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
index 7d047d8..fd29150 100644 (file)
@@ -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