gengxin
author@CHENG <2393524978@qq.com>
Tue, 18 Jun 2024 02:35:47 +0000 (10:35 +0800)
committer@CHENG <2393524978@qq.com>
Tue, 18 Jun 2024 02:35:47 +0000 (10:35 +0800)
2.sdk/sdk/gui/lv_watch/lv_apps/custom_function/mmi_aigc_data.c
2.sdk/sdk/gui/lv_watch/lv_apps/custom_function/mmi_aigc_data.h
2.sdk/sdk/gui/lv_watch/lv_apps/custom_function/mmi_aigc_ui.c
2.sdk/sdk/gui/lv_watch/lv_apps/custom_function/mmi_aigc_ui.h
2.sdk/sdk/gui/lv_watch/lv_apps/pedometer/pedometer.c

index 5cece51..a00d30d 100644 (file)
 
 #ifdef __MMI_CUSTOM_AIGC_SUPPORT__
 
-//#include "../../../../../product/craneg_modem/pcac/video_call/re/include/Re_hmac.h"
-#include "hal/dm/cJSON.h"
+static void mmi_aigc_recv_trans_text_data_process(void * data_ptr, uint32_t data_len);
+static void mmi_aigc_recv_chat_text_data_process(void * data_ptr, uint32_t data_len);
+static void mmi_aigc_recv_tts_audio_data_process(void * data_ptr, uint32_t data_len);
 
+static void mmi_aigc_send_trans_start_data_process(void * data_ptr, uint32_t data_len);
+static void mmi_aigc_send_trans_audio_data_process(void * data_ptr, uint32_t data_len);
+static void mmi_aigc_send_trans_stop_data_process(void * data_ptr, uint32_t data_len);
+static void mmi_aigc_send_chat_text_data_process(void * data_ptr, uint32_t data_len);
+//static void mmi_aigc_send_tts_start_data_process(void * data_ptr, uint32_t data_len);
+//static void mmi_aigc_send_tts_stop_data_process(void * data_ptr, uint32_t data_len);
+static void mmi_aigc_send_tts_text_data_process(void * data_ptr, uint32_t data_len);
 
-#ifndef MMI_AIGC_DEBUG_TO_FILE
-#define MMI_AIGC_DEBUG_TO_FILE
-#endif
-
-#ifdef MMI_AIGC_DEBUG_TO_FILE
-#define AIGC_RECEIVE_FILE      "C:/aigc.txt"
-#define AIGC_RECEIVE_TEXT_FILE "C:/aigc_text.txt"
-#define AIGC_RECEIVE_TTS_FILE "C:/aigc_tts.txt"
 
-bool mmi_aigc_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;
-       }
+// recv task
+static TASK_HANDLE * s_aigc_data_recv_task_id = NULL;
 
-       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;
-       }
+static void mmi_aigc_data_recv_task_msg_send(MMI_AIGC_DATA_RECV_MSG_ID_E msg_id, void * param, uint32_t param_size)
+{
+       printf("[@CHENG_DEBUG][%s][%d]: msg_id=%d\n",__FUNCTION__,__LINE__, msg_id);
        
-       res = lv_fs_write(&file_p, info_buf, info_size, &bytes_write);
-       lv_fs_close(&file_p);
-       if(LV_FS_RES_OK != res)
+       if(NULL != s_aigc_data_recv_task_id)
        {
-               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;
+               if((64 - 1) < Hal_Get_Message_Count(s_aigc_data_recv_task_id))
+               {
+                       printf("[@CHENG_DEBUG][%s][%d]: msg queue full\n",__FUNCTION__,__LINE__);
+                       return;
+               }
+               
+               printf("[@CHENG_DEBUG][%s][%d]: \n",__FUNCTION__,__LINE__);
+               
+               void * temp_ptr = NULL;
+               if(NULL != param && 0 != param_size)
+               {
+                       temp_ptr = lv_mem_alloc(param_size + 1);
+                       if(NULL == temp_ptr)
+                       {
+                               printf("[@CHENG_DEBUG][%s][%d]: memory alloc fail\n", __FUNCTION__, __LINE__);
+                               return;
+                       }
+                       _lv_memset_00(temp_ptr, param_size + 1);
+                       _lv_memcpy(temp_ptr, param, param_size);
+               }
+                       
+        mmi_aigc_data_task_msg_t * msg = Hal_Mem_Alloc(sizeof(mmi_aigc_data_task_msg_t));
+               msg->cmd_type = msg_id;
+               msg->cmd_param = temp_ptr;
+               msg->param_size = param_size;
+       
+        Hal_Send_Message((TASK_ID)s_aigc_data_recv_task_id, (void *)msg);
+    }
 }
-#endif
 
-
-static char * s_aigc_transcription_result_ptr = NULL;
-static uint32_t s_aigc_transcription_result_size = 0;
-
-
-int mmi_aigc_stop_transcription_send(void)
+static void mm_aigc_data_recv_task_handle(void * param)
 {
-       int ret = 0;
-    char data_ptr[512] = {0};
-       int data_len = 0;
-
-       data_len = sprintf(data_ptr, "{\"header\":{\"event\":\"StopTranscription\",\"trace_id\":\"3fa6b9e6a30b407ea38ad7ae69e6c291\"}}");
+       mmi_aigc_data_task_msg_t * msg = (mmi_aigc_data_task_msg_t *)param;
+       MMI_AIGC_DATA_RECV_MSG_ID_E msg_id = msg->cmd_type;
+       void * msg_param = msg->cmd_param;
+       uint32_t param_size = msg->param_size;
+       
+       printf("[@CHENG_DEBUG][%s][%d]: msg_id=%d\n",__FUNCTION__,__LINE__, msg_id);
+    switch(msg_id)
+       {
+        case MMI_AIGC_MSG_TRANS_TEXT_RECV:
+                       mmi_aigc_recv_trans_text_data_process(msg_param, param_size);
+            break;
 
-       ret = mmi_aigc_trans_websocket_send_text_data(data_ptr, data_len);
+               case MMI_AIGC_MSG_CHAT_TEXT_RECV:
+                       mmi_aigc_recv_chat_text_data_process(msg_param, param_size);
+                       break;
 
-       return ret;
+               case MMI_AIGC_MSG_TTS_AUDIO_RECV:
+                       mmi_aigc_recv_tts_audio_data_process(msg_param, param_size);
+                       break;
+               
+               default:
+                       break;
+    }
 }
 
-int mmi_aigc_start_transcription_send(void)
+static void mm_aigc_data_recv_task_entry(void * para)
 {
-       int ret = 0;
-    char data_ptr[512] = {0};
-       int data_len = 0;
-
-       data_len = sprintf(data_ptr, "{\"header\":{\"event\":\"StartTranscription\",\"trace_id\":\"3fa6b9e6a30b407ea38ad7ae69e6c291\"},\"payload\":{\"format\":\"amr\",\"sample_rate\":8000}}");
+    while(s_aigc_data_recv_task_id == NULL)
+       {
+        uos_sleep(10);
+    }
 
-       ret = mmi_aigc_trans_websocket_send_text_data(data_ptr, data_len);
+    while(1)
+       {
+        // receive message
+        mmi_aigc_data_task_msg_t * msg = (mmi_aigc_data_task_msg_t *)Hal_Receive_Message((TASK_ID)s_aigc_data_recv_task_id, TRUE);
+        if(!msg)
+            continue;
 
-       return ret;
+               mm_aigc_data_recv_task_handle(msg);
+               
+        Hal_Mem_Free(msg->cmd_param);
+        Hal_Mem_Free(msg);
+    }
 }
 
-int mmi_aigc_audio_data_send(char * audio_data_ptr, uint32_t audio_data_len)
+static void mmi_aigc_data_recv_task_create(void)
 {
-       int ret = 0;
-
-       AIGC_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: size=%d,data=%s\n", __FUNCTION__, __LINE__, audio_data_len, audio_data_ptr);
+       if(NULL != s_aigc_data_recv_task_id)
+               return;
        
-       ret = mmi_aigc_trans_websocket_send_binary_data(audio_data_ptr, audio_data_len);
-
-       return ret;
+       s_aigc_data_recv_task_id = uos_create_task(mm_aigc_data_recv_task_entry,
+                                                                                       NULL,
+                                                                                       MMI_AIGC_DATA_RECV_TASK_MSG_QUEUE_SIZE,
+                                                                                       MMI_AIGC_DATA_RECV_TASK_STACK_SIZE,
+                                                                                       MMI_AIGC_DATA_RECV_TASK_PRIORITY,
+                                                                                       "mm_aigc_data_recv_task");
+
+       printf("[@CHENG_DEBUG][%s][%d]: tcp_task_id=0x%x\n",__FUNCTION__,__LINE__, s_aigc_data_recv_task_id);
 }
 
-int __mmi_aigc_audio_data_send(uint8_t index)
+static void mmi_aigc_data_recv_task_delete(void)
 {
-       int ret = 0;
-       lv_fs_file_t file_p;
-       lv_fs_res_t res;
-       uint32_t file_size = 0, bytes_read = 0;
-       char * file_buf = NULL;
-
-       #define AIGC_TEST_AUDIO_0 "C:/aigc_test_0.amr"
-       #define AIGC_TEST_AUDIO_1 "C:/aigc_test_1.amr"
-       
-       if(0 == index)
-               res = lv_fs_open(&file_p, AIGC_TEST_AUDIO_0, LV_FS_MODE_RD);
-       else
-               res = lv_fs_open(&file_p, AIGC_TEST_AUDIO_1, LV_FS_MODE_RD);
-       
-       if(LV_FS_RES_OK != res) 
+       if(NULL != s_aigc_data_recv_task_id)
        {
-               printf("[@CHENG_DEBUG][%s][%d]: errno=%d\n", __FUNCTION__, __LINE__, res);
-               lv_fs_close(&file_p);
-               return;
-       }
-       
-       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;
+               uos_delete_task(s_aigc_data_recv_task_id);
+               s_aigc_data_recv_task_id = NULL;
        }
-       AIGC_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: file_size=%d,bytes_read=%d\n", __FUNCTION__, __LINE__, file_size, bytes_read);
-       
-       ret = mmi_aigc_trans_websocket_send_binary_data(file_buf, file_size);
-
-       lv_mem_free(file_buf);
-
-       return ret;
 }
 
+// send task
+static TASK_HANDLE * s_aigc_data_send_task_id = NULL;
 
-#if 0
-bool mmi_ai_talk_type_tts_info_data_store(unsigned char * next_buff, unsigned int next_buff_len)
+static void mmi_aigc_data_send_task_msg_send(MMI_AIGC_DATA_SEND_MSG_ID_E msg_id, void * param, uint32_t param_size)
 {
-       if(NULL == s_ai_talk_type_tts_info_ptr)
+       printf("[@CHENG_DEBUG][%s][%d]: msg_id=%d\n",__FUNCTION__,__LINE__, msg_id);
+       
+       if(NULL != s_aigc_data_send_task_id)
        {
-               printf("[@CHENG_DEBUG][%s][%d]: \n",__FUNCTION__,__LINE__);
-               
-               s_ai_talk_type_tts_info_ptr = lv_mem_alloc(next_buff_len + 1);
-               if(NULL == s_ai_talk_type_tts_info_ptr)
+               if((64 - 1) < Hal_Get_Message_Count(s_aigc_data_send_task_id))
                {
-                       printf("[@CHENG_DEBUG][%s][%d]: memory alloc fail\n", __FUNCTION__, __LINE__);
-                       return false;
+                       printf("[@CHENG_DEBUG][%s][%d]: msg queue full\n",__FUNCTION__,__LINE__);
+                       return;
                }
-               _lv_memset_00(s_ai_talk_type_tts_info_ptr, next_buff_len + 1);
-               _lv_memcpy(s_ai_talk_type_tts_info_ptr, next_buff, next_buff_len);
-               s_ai_talk_type_tts_info_size = next_buff_len;
-       }
-       else
-       {
+               
                printf("[@CHENG_DEBUG][%s][%d]: \n",__FUNCTION__,__LINE__);
                
-               s_ai_talk_type_tts_info_ptr = lv_mem_realloc(s_ai_talk_type_tts_info_ptr, s_ai_talk_type_tts_info_size + next_buff_len + 1);
-               if(NULL == s_ai_talk_type_tts_info_ptr)
+               void * temp_ptr = NULL;
+               if(NULL != param && 0 != param_size)
                {
-                       printf("[@CHENG_DEBUG][%s][%d]: memory realloc fail\n", __FUNCTION__, __LINE__);
-                       return false;
+                       temp_ptr = lv_mem_alloc(param_size + 1);
+                       if(NULL == temp_ptr)
+                       {
+                               printf("[@CHENG_DEBUG][%s][%d]: memory alloc fail\n", __FUNCTION__, __LINE__);
+                               return;
+                       }
+                       _lv_memset_00(temp_ptr, param_size + 1);
+                       _lv_memcpy(temp_ptr, param, param_size);
                }
-               _lv_memset_00(s_ai_talk_type_tts_info_ptr + s_ai_talk_type_tts_info_size, next_buff_len + 1);
-               _lv_memcpy(s_ai_talk_type_tts_info_ptr + s_ai_talk_type_tts_info_size, next_buff, next_buff_len);
-               s_ai_talk_type_tts_info_size += next_buff_len;
-       }
-
-       return true;
+                       
+        mmi_aigc_data_task_msg_t * msg = Hal_Mem_Alloc(sizeof(mmi_aigc_data_task_msg_t));
+               msg->cmd_type = msg_id;
+               msg->cmd_param = temp_ptr;
+               msg->param_size = param_size;
+       
+        Hal_Send_Message((TASK_ID)s_aigc_data_send_task_id, (void *)msg);
+    }
 }
 
-bool mmi_ai_talk_type_tts_info_data_parse(cJSON * json_type_tts)
+static void mm_aigc_data_send_task_handle(void * param)
 {
-       char t_left_brace = '{';
-       char t_right_brace = '}';
-       char * t_start_ptr = NULL;
-       char * t_end_ptr = NULL;
-       uint32_t t_offset = 0;
-       char * t_head_ptr = NULL;
+       mmi_aigc_data_task_msg_t * msg = (mmi_aigc_data_task_msg_t *)param;
+       MMI_AIGC_DATA_SEND_MSG_ID_E msg_id = msg->cmd_type;
+       void * msg_param = msg->cmd_param;
+       uint32_t param_size = msg->param_size;
+       
+       printf("[@CHENG_DEBUG][%s][%d]: msg_id=%d\n",__FUNCTION__,__LINE__, msg_id);
+    switch(msg_id)
+       {
+               case MMI_AIGC_MSG_TRANS_START_SEND:
+                       mmi_aigc_send_trans_start_data_process(msg_param, param_size);
+                       break;
+                       
+        case MMI_AIGC_MSG_TRANS_AUDIO_SEND:
+                       mmi_aigc_send_trans_audio_data_process(msg_param, param_size);
+            break;
 
-       printf("[@CHENG_DEBUG][%s][%d]: total_size=%d\n", __FUNCTION__, __LINE__, s_ai_talk_type_tts_info_size);
-               
-       t_head_ptr = s_ai_talk_type_tts_info_ptr;
-       while(1)
-       {       
-               if(t_left_brace!=s_ai_talk_type_tts_info_ptr[0])
-               {
-                       printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
-               }
+               case MMI_AIGC_MSG_TRANS_STOP_SEND:
+                       mmi_aigc_send_trans_stop_data_process(msg_param, param_size);
+                       break;
 
-               if(s_ai_talk_type_tts_info_size <= (t_head_ptr - s_ai_talk_type_tts_info_ptr))
-               {
-                       printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
-                       debug_type_ai_talk=1;
-                       return false;
-               }
+               case MMI_AIGC_MSG_CHAT_TEXT_SEND:
+                       mmi_aigc_send_chat_text_data_process(msg_param, param_size);
+                       break;
+
+               case MMI_AIGC_MSG_TTS_START_SEND:
+                       //mmi_aigc_send_tts_start_data_process(msg_param, param_size);
+                       break;
+                       
+               case MMI_AIGC_MSG_TTS_TEXT_SEND:
+                       mmi_aigc_send_tts_text_data_process(msg_param, param_size);
+                       break;
+                               
+               case MMI_AIGC_MSG_TTS_STOP_SEND:
+                       //mmi_aigc_send_tts_stop_data_process(msg_param, param_size);
+                       break;
                
-               t_start_ptr = strchr(t_head_ptr, t_left_brace);
-               t_end_ptr = strchr(t_head_ptr, t_right_brace);
-               t_offset = t_end_ptr - t_start_ptr + 1;
-               t_head_ptr += t_offset;
+               default:
+                       break;
+    }
+}
 
-               printf("[@CHENG_DEBUG][%s][%d]: head=0x%x,start=0x%x,end=0x%x,offset=%d\n",
-                                       __FUNCTION__, __LINE__, t_head_ptr, t_start_ptr, t_end_ptr, t_offset);
+static void mm_aigc_data_send_task_entry(void * para)
+{
+    while(s_aigc_data_send_task_id == NULL)
+       {
+        uos_sleep(10);
+    }
 
-               if(NULL != s_ai_talk_type_tts_info_json_ptr)
-               {
-                       lv_mem_free(s_ai_talk_type_tts_info_json_ptr);
-                       s_ai_talk_type_tts_info_json_ptr = NULL;
-               }
-               s_ai_talk_type_tts_info_json_ptr = lv_mem_alloc(t_offset + 1);
-               if(NULL == s_ai_talk_type_tts_info_json_ptr)
-               {
-                       printf("[@CHENG_DEBUG][%s][%d]: memory alloc fail\n", __FUNCTION__, __LINE__);
-                       debug_type_ai_talk=2;
-                       return false;
-               }
-               _lv_memset_00(s_ai_talk_type_tts_info_json_ptr, t_offset + 1);
-               _lv_memcpy(s_ai_talk_type_tts_info_json_ptr, t_start_ptr, t_offset);
+    while(1)
+       {
+        // receive message
+        mmi_aigc_data_task_msg_t * msg = (mmi_aigc_data_task_msg_t *)Hal_Receive_Message((TASK_ID)s_aigc_data_send_task_id, TRUE);
+        if(!msg)
+            continue;
 
-               if(NULL != json_type_tts)
-               {
-                       cJSON_Delete(json_type_tts);
-                       json_type_tts = NULL;
-               }
-               json_type_tts = cJSON_Parse(s_ai_talk_type_tts_info_json_ptr);
-               if(NULL == json_type_tts)
-               {
-                       printf("[@CHENG_DEBUG][%s][%d]: json parse fail\n", __FUNCTION__, __LINE__);
-                       debug_type_ai_talk=3;
-                       s_ai_talk_type_tts_info_recv_end=false;
-                       mmi_ai_talk_tts_info_result_display(s_ai_talk_type_tts_info_audio_ptr, s_ai_talk_type_tts_info_audio_size);                             
-                       return false;
-               }
+               mm_aigc_data_send_task_handle(msg);
                
-               char * value_type_str = cJSON_GetStringValue(cJSON_GetObjectItem(json_type_tts, KEY_TYPE));
-               if(0 != strncmp(value_type_str, VALUE_TYPE_TTS, strlen(VALUE_TYPE_TTS)))
-               {
-                       printf("[@CHENG_DEBUG][%s][%d]: not tts info json\n", __FUNCTION__, __LINE__);
-                       debug_type_ai_talk=4;
-                       return false;
-               }
+        Hal_Mem_Free(msg->cmd_param);
+        Hal_Mem_Free(msg);
+    }
+}
 
-               int value_type_tts_index = cJSON_GetIntValue(cJSON_GetObjectItem(json_type_tts, KEY_TYPE_TTS_INDEX));
-               if(value_type_tts_index==-1)
-               {
-                       printf("[@CHENG_DEBUG][%s][%d]: tts info end flag\n", __FUNCTION__, __LINE__);
+static void mmi_aigc_data_send_task_create(void)
+{
+       if(NULL != s_aigc_data_send_task_id)
+               return;
+       
+       s_aigc_data_send_task_id = uos_create_task(mm_aigc_data_send_task_entry,
+                                                                                       NULL,
+                                                                                       MMI_AIGC_DATA_SEND_TASK_MSG_QUEUE_SIZE,
+                                                                                       MMI_AIGC_DATA_SEND_TASK_STACK_SIZE,
+                                                                                       MMI_AIGC_DATA_SEND_TASK_PRIORITY,
+                                                                                       "mm_aigc_data_send_task");
+
+       printf("[@CHENG_DEBUG][%s][%d]: tcp_task_id=0x%x\n",__FUNCTION__,__LINE__, s_aigc_data_send_task_id);
+}
 
-       #ifdef MMI_AI_TALK_DEBUG_TO_FILE
-                       // write to file for debug
-                       mmi_ai_talk_receive_info_write_to_file(BEI_KE_RECEIVE_TTS_AUDIO_TOTAL_FILE, s_ai_talk_type_tts_info_audio_ptr, s_ai_talk_type_tts_info_audio_size);
-       #endif
-                       mmi_ai_talk_tts_info_result_display(s_ai_talk_type_tts_info_audio_ptr, s_ai_talk_type_tts_info_audio_size);
-                       break;
-               }
-               else
-               {
-                       printf("[@CHENG_DEBUG][%s][%d]: %d\n", __FUNCTION__, __LINE__,value_type_tts_index);
-                       
-                       char * value_type_tts_result_str = cJSON_GetStringValue(cJSON_GetObjectItem(json_type_tts, KEY_TYPE_TTS_RESULT));
-                       uint32_t value_type_tts_result_len = strlen(value_type_tts_result_str);
-                       debug_type_ai_talk=12;
-                       if(NULL == s_ai_talk_type_tts_info_audio_ptr)
-                       {
-                               s_ai_talk_type_tts_info_audio_ptr = lv_mem_alloc(value_type_tts_result_len + 1);
-                               if(NULL == s_ai_talk_type_tts_info_audio_ptr)
-                               {
-                                       printf("[@CHENG_DEBUG][%s][%d]: memory alloc fail\n", __FUNCTION__, __LINE__);
-                                       debug_type_ai_talk=5;
-                                       return false;
-                               }
-                               _lv_memset_00(s_ai_talk_type_tts_info_audio_ptr, value_type_tts_result_len + 1);
-                               _lv_memcpy(s_ai_talk_type_tts_info_audio_ptr, value_type_tts_result_str, value_type_tts_result_len);
-                               s_ai_talk_type_tts_info_audio_size = value_type_tts_result_len;
-                       }
-                       else
-                       {
-                               s_ai_talk_type_tts_info_audio_ptr = lv_mem_realloc(s_ai_talk_type_tts_info_audio_ptr, s_ai_talk_type_tts_info_audio_size + value_type_tts_result_len + 1);
-                               if(NULL == s_ai_talk_type_tts_info_audio_ptr)
-                               {
-                                       printf("[@CHENG_DEBUG][%s][%d]: memory realloc fail\n", __FUNCTION__, __LINE__);
-                                       debug_type_ai_talk=6;
-                                       return false;
-                               }
-                               _lv_memset_00(s_ai_talk_type_tts_info_audio_ptr + s_ai_talk_type_tts_info_audio_size, value_type_tts_result_len + 1);
-                               _lv_memcpy(s_ai_talk_type_tts_info_audio_ptr + s_ai_talk_type_tts_info_audio_size, value_type_tts_result_str, value_type_tts_result_len);
-                               s_ai_talk_type_tts_info_audio_size += value_type_tts_result_len;
-                       }
-               }
+static void mmi_aigc_data_send_task_delete(void)
+{
+       if(NULL != s_aigc_data_send_task_id)
+       {
+               uos_delete_task(s_aigc_data_send_task_id);
+               s_aigc_data_send_task_id = NULL;
        }
-
-       return true;
 }
 
-bool   mmi_ai_talk_type_tts_info_data_processing(unsigned char * next_buff, unsigned int next_buff_len, cJSON * json_type_tts)
+void mmi_aigc_data_task_create(void)
 {
-       // {"answer_id":"1699511956918t","audio":"8f////D/5f8DA9QChwHe
-       // 7/1YfAQA7/1fAQ/D/5f8DAYADR/9q/+j/AfAQgDR/9/fAQD/5f8DAq/+j/Ag
-       // 6afA5QfAQ5/4U/C5CQQ=","index":0,"type":"tts_info"}
+       mmi_aigc_data_recv_task_create();
+       mmi_aigc_data_send_task_create();
+}
 
-       // {"answer_id":"1699511956918t","audio":"FgD7/1YADR/9q/+j/AgAlAA==","index":2,"type":"tts_info"}
-       // {"answer_id":"1699511956918t","audio":"","index":-1,"type":"tts_info"}
+void mmi_aigc_data_task_delete(void)
+{
+       mmi_aigc_data_recv_task_delete();
+       mmi_aigc_data_send_task_delete();
+}
 
-       printf("[@CHENG_DEBUG][%s][%d]: receive_size=%d\n", __FUNCTION__, __LINE__, next_buff_len);
 
-       // search end flag 
-       char * t_end_str = "\"index\":-1\,\"type\"\:\"tts_info\"\}";
-       //char * t_end_str = "\"type\"\:\"tts_info";
-       if(next_buff[0]!='{')
-       {
-               printf("[@CHENG_DEBUG][%s][%d]: \n",__FUNCTION__,__LINE__);
-       }else
-       {
-               printf("[@CHENG_DEBUG][%s][%d]: \n",__FUNCTION__,__LINE__);
-       }
 
-       if(NULL != strstr(next_buff, t_end_str))
-       {
-               printf("[@CHENG_DEBUG][%s][%d]: \n",__FUNCTION__,__LINE__);
-               
-               s_ai_talk_type_tts_info_recv_end = true;
-       }
-                       
-       // store type tts data
-       if(false == mmi_ai_talk_type_tts_info_data_store(next_buff, next_buff_len))
-       {  
-               printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
-               return false;
-       }
+// trans
+void mmi_aigc_send_trans_start_msg(void * param, uint32_t param_size)
+{
+       mmi_aigc_data_send_task_msg_send(MMI_AIGC_MSG_TRANS_START_SEND, NULL, 0);
+}
 
-       // parse type tts data
-       if(true == s_ai_talk_type_tts_info_recv_end)
-       {
-               if(false == mmi_ai_talk_type_tts_info_data_parse(json_type_tts))
-               {
-                       printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
-                       //return false;
-               }
-               #if ai_test 
-               if(s_ai_talk_type_tts_info_recv_end==false)
-               {
-                       if(NULL != s_ai_talk_type_tts_info_ptr)
-                       {
-                               lv_mem_free(s_ai_talk_type_tts_info_ptr);
-                               s_ai_talk_type_tts_info_ptr = NULL;
-                       }
-                       s_ai_talk_type_tts_info_size = 0;
+void mmi_aigc_send_trans_audio_msg(void * param, uint32_t param_size)
+{
+       mmi_aigc_data_send_task_msg_send(MMI_AIGC_MSG_TRANS_AUDIO_SEND, param, param_size);
+}
 
-               }
-               else
-               {
-                       return false;
-               }
-               #endif
-       }
-       
-       return true;
+void mmi_aigc_send_trans_stop_msg(void * param, uint32_t param_size)
+{
+       mmi_aigc_data_send_task_msg_send(MMI_AIGC_MSG_TRANS_STOP_SEND, NULL, 0);
 }
 
-bool mmi_ai_talk_data_receive(unsigned char * next_buff, unsigned int next_buff_len)
+static void mmi_aigc_send_trans_start_data_process(void * data_ptr, uint32_t data_len)
 {
-       bool result = false;
-       cJSON * json_root = NULL;
-       cJSON * json_type_tts = NULL;
+    char send_ptr[512] = {0};
+       int send_len = 0;
+
+       send_len = sprintf(send_ptr, "{\"header\":{\"event\":\"StartTranscription\",\"trace_id\":\"3fa6b9e6a30b407ea38ad7ae69e6c291\"},\"payload\":{\"format\":\"amr\",\"sample_rate\":8000}}");
 
-       if(NULL == next_buff || 0 == next_buff_len)
+       int ret = mmi_aigc_trans_websocket_send_text_data(send_ptr, send_len);
+       if(0 > ret)
        {
-               printf("[@CHENG_DEBUG][%s][%d]: no data\n", __FUNCTION__, __LINE__);
-               goto exit_free_res;
+               AIGC_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: send fail\n", __FUNCTION__, __LINE__);
        }
+}
 
-#ifdef MMI_AI_TALK_DEBUG_TO_FILE
-       // write to file for debug
-       mmi_ai_talk_receive_info_write_to_file(BEI_KE_RECEIVE_FILE, next_buff, next_buff_len);
-#endif 
+static void mmi_aigc_send_trans_audio_data_process(void * data_ptr, uint32_t data_len)
+{
+       AIGC_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: size=%d,data=%s\n", __FUNCTION__, __LINE__, data_len, data_ptr);
        
-       lv_obj_t * activity_obj = mmi_aigc_activity_obj_get();
-       if(NULL == activity_obj) 
+       int ret = mmi_aigc_trans_websocket_send_binary_data(data_ptr, data_len);
+       if(0 > ret)
        {
-               printf("[@CHENG_DEBUG][%s][%d]: not in ai talk\n", __FUNCTION__, __LINE__);
-               goto exit_free_res;
+               AIGC_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: send fail\n", __FUNCTION__, __LINE__);
        }
+}
 
-       if(false == s_ai_talk_type_tts_info_recv_begin)
-       {
-               result = mmi_ai_talk_not_type_tts_info_data_processing(next_buff, next_buff_len, json_root);
-       }
-       else
-       {
-               result = mmi_ai_talk_type_tts_info_data_processing(next_buff, next_buff_len, json_type_tts);
-       }
+static void mmi_aigc_send_trans_stop_data_process(void * data_ptr, uint32_t data_len)
+{
+    char send_ptr[512] = {0};
+       int send_len = 0;
 
-exit_free_res:
-       if(NULL != s_ai_talk_type_tts_info_json_ptr)
-       {
-               lv_mem_free(s_ai_talk_type_tts_info_json_ptr);
-               s_ai_talk_type_tts_info_json_ptr = NULL;
-       }
-       
-       if(NULL != json_type_tts)
-       {
-               printf("[@CHENG_DEBUG][%s][%d]: free json type tts\n", __FUNCTION__, __LINE__);
-               cJSON_Delete(json_type_tts);
-               json_type_tts = NULL;
-       }
+       send_len = sprintf(send_ptr, "{\"header\":{\"event\":\"StopTranscription\",\"trace_id\":\"3fa6b9e6a30b407ea38ad7ae69e6c291\"}}");
 
-       if(NULL != json_root)
+       int ret = mmi_aigc_trans_websocket_send_text_data(send_ptr, send_len);
+       if(0 > ret)
        {
-               printf("[@CHENG_DEBUG][%s][%d]: free json root\n", __FUNCTION__, __LINE__);
-               cJSON_Delete(json_root);
-               json_root = NULL;
+               AIGC_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: send fail\n", __FUNCTION__, __LINE__);
        }
-//exit_no_free_res:
-       return result;
 }
-#endif
 
-void mmi_aigc_trans_websocket_recv_data_handler(char * data_ptr, int data_len, int payload_len, int payload_offset)
+static void mmi_aigc_trans_text_data_recv_msg(void * param, uint32_t param_size)
 {
-       bool result = false;
-       cJSON * json_root = NULL;
-       cJSON * json_result = NULL;
+       mmi_aigc_data_recv_task_msg_send(MMI_AIGC_MSG_TRANS_TEXT_RECV, param, param_size);
+}
 
-       AIGC_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
-       cplog_printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
-       if(NULL == data_ptr || 0 == data_len)
+static void mmi_aigc_recv_trans_text_data_process(void * data_ptr, uint32_t data_len)
+{
+       AIGC_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: len=%d\n", __FUNCTION__, __LINE__, data_len);
+       cplog_printf("[@CHENG_DEBUG][%s][%d]: len=%d\n", __FUNCTION__, __LINE__, data_len);
+       if(NULL == data_ptr)
        {
-               AIGC_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+               AIGC_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: no data\n", __FUNCTION__, __LINE__);
                return;
        }
 
 #ifdef MMI_AIGC_DEBUG_TO_FILE
-       mmi_aigc_receive_info_write_to_file(AIGC_RECEIVE_FILE, data_ptr, data_len);
+       mmi_debug_info_write_to_file(AIGC_RECV_TRANS_FILE, data_ptr, data_len);
 #endif
 
-       json_root = cJSON_Parse(data_ptr);
+       cJSON * json_root = cJSON_Parse(data_ptr);
        if(NULL != json_root)
        {
-               // "msg"
-               char * value_msg_str = cJSON_GetStringValue(cJSON_GetObjectItem(json_root, "msg"));
-               if(0 != strncmp(value_msg_str, "success", strlen("success")))
-               {
-                       AIGC_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: not success\n", __FUNCTION__, __LINE__);
-                       goto EXIT_AND_FREE;
-               }
+               cplog_printf("[@CHENG_DEBUG][%s][%d]: json root\n", __FUNCTION__, __LINE__);
 
                // "event"
                char * value_event_str = cJSON_GetStringValue(cJSON_GetObjectItem(json_root, "event"));
@@ -470,69 +358,153 @@ void mmi_aigc_trans_websocket_recv_data_handler(char * data_ptr, int data_len, i
                        AIGC_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: transcription start\n", __FUNCTION__, __LINE__);
                        
                }
-               else if(0 == strncmp(value_event_str, "Changed", strlen("Changed")))
-               {
-                       // middle
-                       AIGC_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: transcription middle\n", __FUNCTION__, __LINE__);
-                       json_result = cJSON_GetObjectItem(json_root, "result");
-                       if(NULL != json_result)
-                       {
-
-
-                       }
-               }
                else if(0 == strncmp(value_event_str, "SentenceEnd", strlen("SentenceEnd")))
                {
                        // end
                        AIGC_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: transcription end\n", __FUNCTION__, __LINE__);
-                       json_result = cJSON_GetObjectItem(json_root, "result");
+                       cJSON * json_result = cJSON_GetObjectItem(json_root, "result");
                        if(NULL != json_result)
                        {
                                char * value_result_str = cJSON_GetStringValue(cJSON_GetObjectItem(json_result, "result"));
                                uint32_t value_result_len = strlen(value_result_str);
                                
-                               if(NULL == s_aigc_transcription_result_ptr)
-                               {
-                                       s_aigc_transcription_result_ptr = lv_mem_alloc(value_result_len + 1);
-                                       if(NULL == s_aigc_transcription_result_ptr)
-                                       {
-                                               AIGC_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: memory alloc fail\n", __FUNCTION__, __LINE__);
-                                               goto EXIT_AND_FREE;
-                                       }
-                                       _lv_memset_00(s_aigc_transcription_result_ptr, (value_result_len + 1));
-                                       _lv_memcpy(s_aigc_transcription_result_ptr, value_result_str, value_result_len);
-                                       s_aigc_transcription_result_size = value_result_len;
-                               }
-                               else
+                               if(true == mmi_aigc_trans_result_text_store(value_result_str, value_result_len))
                                {
-                                       //char * temp_ptr = lv_mem_realloc();
-
+                                       // send msg to refresh ui
 
                                }
-
-                               // send msg to refresh ui
-                       
                        }
                }
                else if(0 == strncmp(value_event_str, "TranscriptionCompleted", strlen("TranscriptionCompleted")))
                {
                        // stop
                        AIGC_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: transcription stop\n", __FUNCTION__, __LINE__);
+
+                       // refresh ui
+                       mmi_ui_msg_action_aigc_recv_trans_text_stop();
                        
+                       //
+                       mmi_aigc_chat_text_download_requst();
                }
+       }
 
+EXIT_AND_FREE:
+       if(NULL != json_root)
+       {
+               AIGC_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: free json root\n", __FUNCTION__, __LINE__);
+               cplog_printf("[@CHENG_DEBUG][%s][%d]: free json root\n", __FUNCTION__, __LINE__);
+               cJSON_Delete(json_root);
+               json_root = NULL;
+       }
+}
 
 
+void mmi_aigc_trans_websocket_recv_data_handler(char * data_ptr, int data_len, int payload_len, int payload_offset)
+{
+       AIGC_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: size=%d\n", __FUNCTION__, __LINE__, data_len);
+       //cplog_printf("[@CHENG_DEBUG][%s][%d]: size=%d\n", __FUNCTION__, __LINE__, data_len);
+       
+       mmi_aigc_trans_text_data_recv_msg(data_ptr, data_len);
+}
+
+
+
+// chat
+void mmi_aigc_send_chat_text_msg(void * param, uint32_t param_size)
+{
+       mmi_aigc_data_send_task_msg_send(MMI_AIGC_MSG_CHAT_TEXT_SEND, param, param_size);
+}
+
+static void mmi_aigc_send_chat_text_data_process(void * data_ptr, uint32_t data_len)
+{
+       AIGC_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: size=%d,data=%s\n", __FUNCTION__, __LINE__, data_len, data_ptr);
+       
+       uint32_t temp_len = 0;
+       uint32_t send_buff_len = data_len + 128;
+       char * send_buff_ptr = lv_mem_alloc(send_buff_len);
+       if(NULL == send_buff_ptr)
+       {
+               AIGC_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: memory alloc fail\n", __FUNCTION__, __LINE__);
+               return;
        }
+       _lv_memset_00(send_buff_ptr, send_buff_len);
+       
+       temp_len = sprintf(send_buff_ptr, "{\"type\":\"chat\",\"content\":\"%s\"}", data_ptr);
 
-EXIT_AND_FREE:
-       if(NULL != json_result)
+       AIGC_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: send_len=%d\n", __FUNCTION__, __LINE__, temp_len);
+       int ret = mmi_aigc_chat_websocket_send_text_data(send_buff_ptr, temp_len);
+       if(0 > ret)
+       {
+               AIGC_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: send fail\n", __FUNCTION__, __LINE__);
+       }
+
+       if(NULL != send_buff_ptr)
        {
-               AIGC_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: free json result\n", __FUNCTION__, __LINE__);
-               cplog_printf("[@CHENG_DEBUG][%s][%d]: free json result\n", __FUNCTION__, __LINE__);
-               cJSON_Delete(json_result);
-               json_result = NULL;
+               lv_mem_free(send_buff_ptr);
+               send_buff_ptr = NULL;
        }
+}
+
+static void mmi_aigc_chat_text_data_recv_msg(void * param, uint32_t param_size)
+{
+       mmi_aigc_data_recv_task_msg_send(MMI_AIGC_MSG_CHAT_TEXT_RECV, param, param_size);
+}
+
+static void mmi_aigc_recv_chat_text_data_process(void * data_ptr, uint32_t data_len)
+{
+       AIGC_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: len=%d\n", __FUNCTION__, __LINE__, data_len);
+       cplog_printf("[@CHENG_DEBUG][%s][%d]: len=%d\n", __FUNCTION__, __LINE__, data_len);
+       if(NULL == data_ptr)
+       {
+               AIGC_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: no data\n", __FUNCTION__, __LINE__);
+               return;
+       }
+
+#ifdef MMI_AIGC_DEBUG_TO_FILE
+       mmi_debug_info_write_to_file(AIGC_RECV_CHAT_FILE, data_ptr, data_len);
+#endif
+
+       cJSON * json_root = cJSON_Parse(data_ptr);
+       if(NULL != json_root)
+       {
+               cplog_printf("[@CHENG_DEBUG][%s][%d]: json root\n", __FUNCTION__, __LINE__);
+
+               // "type"
+               char * value_type_str = cJSON_GetStringValue(cJSON_GetObjectItem(json_root, "type"));
+               if(0 == strncmp(value_type_str, "start", strlen("start")))
+               {
+                       // start
+                       AIGC_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: chat start\n", __FUNCTION__, __LINE__);
+                       
+               }
+               else if(0 == strncmp(value_type_str, "middle", strlen("middle")))
+               {
+                       // middle
+                       AIGC_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: chat middle\n", __FUNCTION__, __LINE__);
+
+                       char * value_content_str = cJSON_GetStringValue(cJSON_GetObjectItem(json_root, "content"));
+                       uint32_t value_content_len = strlen(value_content_str);
+                       
+                       if(true == mmi_aigc_chat_result_text_store(value_content_str, value_content_len))
+                       {
+                               // send msg to refresh ui
+
+                       }
+               }
+               else if(0 == strncmp(value_type_str, "end", strlen("end")))
+               {
+                       // stop
+                       AIGC_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: chat stop\n", __FUNCTION__, __LINE__);
+
+                       // send msg to refresh ui
+                       mmi_ui_msg_action_aigc_recv_chat_text_stop();
+
+                       //
+                       mmi_aigc_tts_audio_download_requst();
+               }
+       }
+
+EXIT_AND_FREE:
        if(NULL != json_root)
        {
                AIGC_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: free json root\n", __FUNCTION__, __LINE__);
@@ -542,42 +514,204 @@ EXIT_AND_FREE:
        }
 }
 
+void mmi_aigc_chat_websocket_recv_data_handler(char * data_ptr, int data_len, int payload_len, int payload_offset)
+{
+       AIGC_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: size=%d\n", __FUNCTION__, __LINE__, data_len);
+       //cplog_printf("[@CHENG_DEBUG][%s][%d]: size=%d\n", __FUNCTION__, __LINE__, data_len);
+       
+       mmi_aigc_chat_text_data_recv_msg(data_ptr, data_len);   
+}
 
 
-// chat
-void mmi_aigc_chat_websocket_recv_data_handler(char * data_ptr, int data_len, int payload_len, int payload_offset)
+
+// tts
+#if 0
+void mmi_aigc_send_tts_start_msg(void * param, uint32_t param_size)
+{
+       mmi_aigc_data_send_task_msg_send(MMI_AIGC_MSG_TTS_START_SEND, NULL, 0);
+}
+
+void mmi_aigc_send_tts_stop_msg(void * param, uint32_t param_size)
+{
+       mmi_aigc_data_send_task_msg_send(MMI_AIGC_MSG_TTS_STOP_SEND, NULL, 0);
+}
+
+void mmi_aigc_send_tts_text_msg(void * param, uint32_t param_size)
+{
+       mmi_aigc_data_send_task_msg_send(MMI_AIGC_MSG_TTS_TEXT_SEND, param, param_size);
+}
+
+static void mmi_aigc_send_tts_start_data_process(void * data_ptr, uint32_t data_len)
 {
-       bool result = false;
-       cJSON * json_root = NULL;
-       cJSON * json_result = NULL;
+       AIGC_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: size=%d,data=%s\n", __FUNCTION__, __LINE__, data_len, data_ptr);
+       
+    char send_ptr[512] = {0};
+       int send_len = 0;
+
+       send_len = sprintf(send_ptr, "{\"header\":{\"event\":\"StartSynthesis\",\"trace_id\":\"3fa6b9e6a30b407ea38ad7ae69e6c291\"},\"payload\":{\"voice\":\"zhixiaomei\",\"format\":\"mp3\",\"sample_rate\":8000,\"volume\":50,\"speech_rate\":0}}");
+       //send_len = sprintf(send_ptr, "{\"header\":{\"event\":\"StartSynthesis\",\"trace_id\":\"3fa6b9e6a30b407ea38ad7ae69e6c291\"},\"payload\":{\"voice\":\"xiaoyun\",\"format\":\"WAV\",\"sample_rate\":16000,\"volume\":50,\"speech_rate\":0}}");   
+
+       int ret = mmi_aigc_tts_websocket_send_text_data(send_ptr, send_len);
+       if(0 > ret)
+       {
+               AIGC_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: send fail\n", __FUNCTION__, __LINE__);
+       }
+}
+
+static void mmi_aigc_send_tts_stop_data_process(void * data_ptr, uint32_t data_len)
+{
+       AIGC_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: size=%d,data=%s\n", __FUNCTION__, __LINE__, data_len, data_ptr);
+       
+    char send_ptr[512] = {0};
+       int send_len = 0;
+
+       send_len = sprintf(send_ptr, "{\"header\":{\"event\":\"StopSynthesis\",\"trace_id\":\"3fa6b9e6a30b407ea38ad7ae69e6c291\"}}");
 
-       AIGC_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
-       cplog_printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
-       if(NULL == data_ptr || 0 == data_len)
+       int ret = mmi_aigc_tts_websocket_send_text_data(send_ptr, send_len);
+       if(0 > ret)
        {
-               AIGC_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+               AIGC_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: send fail\n", __FUNCTION__, __LINE__);
+       }
+}
+
+static void mmi_aigc_send_tts_text_data_process(void * data_ptr, uint32_t data_len)
+{
+       AIGC_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: size=%d\n", __FUNCTION__, __LINE__, data_len);
+       AIGC_DEBUG_PRINTF("[@CHENG_DEBUG][%d]: data=%s\n", __LINE__, data_ptr);
+       
+       uint32_t temp_len = 0;
+       uint32_t send_buff_len = data_len + 128;
+       char * send_buff_ptr = lv_mem_alloc(send_buff_len);
+       if(NULL == send_buff_ptr)
+       {
+               AIGC_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: memory alloc fail\n", __FUNCTION__, __LINE__);
                return;
        }
+       _lv_memset_00(send_buff_ptr, send_buff_len);
+       
+#if 0
+       temp_len = 0;
+       temp_len += sprintf(send_buff_ptr + temp_len, "{\"header\":{\"event\": \"LongTextStream\",\"trace_id\": \"3fa6b9e6a30b407ea38ad7ae69e6c291\"},");
+       temp_len += sprintf(send_buff_ptr + temp_len, "\"payload\":{\"voice\":\"xiaoyun\",\"format\":\"amr\",\"sample_rate\":8000,\"volume\":50,\"speech_rate\":0,");
+       temp_len += sprintf(send_buff_ptr + temp_len, "\"text\":\"%s\"}}", data_ptr);
+#else
+       temp_len = 0;
+       temp_len += sprintf(send_buff_ptr + temp_len, "{\"header\":{\"event\":\"RunSynthesis\",\"trace_id\":\"3fa6b9e6a30b407ea38ad7ae69e6c291\"},");
+       temp_len += sprintf(send_buff_ptr + temp_len, "\"payload\":{\"text\":\"%s\"}}", data_ptr);
+#endif
+
+       AIGC_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: send_len=%d\n", __FUNCTION__, __LINE__, temp_len);
+       int ret = mmi_aigc_tts_websocket_send_text_data(send_buff_ptr, temp_len);
+       if(0 > ret)
+       {
+               AIGC_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: send fail\n", __FUNCTION__, __LINE__);
+       }
+
+       if(NULL != send_buff_ptr)
+       {
+               lv_mem_free(send_buff_ptr);
+               send_buff_ptr = NULL;
+       }
+}
+
+#else
+
+void mmi_aigc_send_tts_text_msg(void * param, uint32_t param_size)
+{
+       mmi_aigc_data_send_task_msg_send(MMI_AIGC_MSG_TTS_TEXT_SEND, param, param_size);
+}
+
+static void mmi_aigc_send_tts_text_data_process(void * data_ptr, uint32_t data_len)
+{
+       AIGC_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: size=%d\n", __FUNCTION__, __LINE__, data_len);
+       AIGC_DEBUG_PRINTF("[@CHENG_DEBUG][%d]: data=%s\n", __LINE__, data_ptr);
+       
+       uint32_t temp_len = 0;
+       uint32_t send_buff_len = data_len + 256;
+       char * send_buff_ptr = lv_mem_alloc(send_buff_len);
+       if(NULL == send_buff_ptr)
+       {
+               AIGC_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: memory alloc fail\n", __FUNCTION__, __LINE__);
+               return;
+       }
+       _lv_memset_00(send_buff_ptr, send_buff_len);
+       
+       temp_len = 0;
+       temp_len += sprintf(send_buff_ptr + temp_len, "{\"header\":{\"event\":\"LongTextStream\",\"trace_id\":\"3fa6b9e6a30b407ea38ad7ae69e6c291\"},");
+       temp_len += sprintf(send_buff_ptr + temp_len, "\"payload\":{\"voice\":\"xiaoyun\",\"format\":\"mp3\",\"sample_rate\":8000,\"volume\":50,\"speech_rate\":0,");
+       temp_len += sprintf(send_buff_ptr + temp_len, "\"text\":\"%s\"}}", data_ptr); // 185 + data_len
 
 #ifdef MMI_AIGC_DEBUG_TO_FILE
-       mmi_aigc_receive_info_write_to_file(AIGC_RECEIVE_FILE, data_ptr, data_len);
+       mmi_debug_info_write_to_file(AIGC_SEND_TTS_TEXT_FILE, send_buff_ptr, temp_len);
 #endif
+       AIGC_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: send_len=%d\n", __FUNCTION__, __LINE__, temp_len);
+       int ret = mmi_aigc_tts_websocket_send_text_data(send_buff_ptr, temp_len);
+       if(0 > ret)
+       {
+               AIGC_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: send fail\n", __FUNCTION__, __LINE__);
+       }
 
-       json_root = cJSON_Parse(data_ptr);
-       if(NULL != json_root)
+       if(NULL != send_buff_ptr)
        {
+               lv_mem_free(send_buff_ptr);
+               send_buff_ptr = NULL;
+       }
+}
 
+#endif
 
+static void mmi_aigc_tts_audio_data_recv_msg(void * param, uint32_t param_size)
+{
+       mmi_aigc_data_recv_task_msg_send(MMI_AIGC_MSG_TTS_AUDIO_RECV, param, param_size);
+}
+
+static void mmi_aigc_recv_tts_audio_data_process(void * data_ptr, uint32_t data_len)
+{
+       AIGC_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: len=%d\n", __FUNCTION__, __LINE__, data_len);
+       cplog_printf("[@CHENG_DEBUG][%s][%d]: len=%d\n", __FUNCTION__, __LINE__, data_len);
+       if(NULL == data_ptr)
+       {
+               AIGC_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: no data\n", __FUNCTION__, __LINE__);
+               return;
        }
 
-EXIT_AND_FREE:
-       if(NULL != json_result)
+#ifdef MMI_AIGC_DEBUG_TO_FILE
+       mmi_debug_info_write_to_file(AIGC_RECV_TTS_FILE, data_ptr, data_len);
+#endif
+
+       cJSON * json_root = cJSON_Parse(data_ptr);
+       if(NULL != json_root)
        {
-               AIGC_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: free json result\n", __FUNCTION__, __LINE__);
-               cplog_printf("[@CHENG_DEBUG][%s][%d]: free json result\n", __FUNCTION__, __LINE__);
-               cJSON_Delete(json_result);
-               json_result = NULL;
+               cplog_printf("[@CHENG_DEBUG][%s][%d]: json root\n", __FUNCTION__, __LINE__);
+               AIGC_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: tts json\n", __FUNCTION__, __LINE__);
+
+               cJSON * json_header = cJSON_GetObjectItem(json_root, "header");
+               if(NULL != json_header)
+               {
+                       char * value_event_str = cJSON_GetStringValue(cJSON_GetObjectItem(json_header, "event"));
+                       if(0 == strncmp(value_event_str, "EndSynthesis", strlen("EndSynthesis")))
+                       {
+                               // end
+                               AIGC_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: EndSynthesis\n", __FUNCTION__, __LINE__);
+                               
+                               mmi_aigc_send_tts_text_action_pre();
+                               
+                               // send msg to refresh ui
+                               mmi_aigc_tts_audio_play();
+                       }
+               }
        }
+       else
+       {
+               // tts data
+               AIGC_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: tts data\n", __FUNCTION__, __LINE__);
+
+               if(true == mmi_aigc_tts_audio_store(data_ptr, data_len))
+               {
+               
+               }
+       }
+
        if(NULL != json_root)
        {
                AIGC_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: free json root\n", __FUNCTION__, __LINE__);
@@ -587,6 +721,13 @@ EXIT_AND_FREE:
        }
 }
 
+void mmi_aigc_tts_websocket_recv_data_handler(char * data_ptr, int data_len, int payload_len, int payload_offset)
+{
+       AIGC_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: size=%d\n", __FUNCTION__, __LINE__, data_len);
+       //cplog_printf("[@CHENG_DEBUG][%s][%d]: size=%d\n", __FUNCTION__, __LINE__, data_len);
+       
+       mmi_aigc_tts_audio_data_recv_msg(data_ptr, data_len);   
+}
 
 #endif
 
index 1ac9c26..6e0f061 100644 (file)
@@ -16,41 +16,70 @@ extern "C" {
 #include "../../../lv_watch_conf.h"
 #endif
 
-#if 0 // def __MMI_CUSTOM_AIGC_SUPPORT__
+#ifdef __MMI_CUSTOM_AIGC_SUPPORT__
 
+//#include "../../../../../product/craneg_modem/pcac/video_call/re/include/Re_hmac.h"
+#include "hal/dm/cJSON.h"
+#include "../../../../product/craneg_modem/pcac/wsclient/libwebsockets/inc/mmi_aigc_websocket.h"
 
-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;
+#define MMI_AIGC_DATA_SEND_TASK_PRIORITY 220
+#define MMI_AIGC_DATA_SEND_TASK_MSG_QUEUE_SIZE (16)
+#define MMI_AIGC_DATA_SEND_TASK_STACK_SIZE (16 * 1024)
+
+#define MMI_AIGC_DATA_RECV_TASK_PRIORITY 220
+#define MMI_AIGC_DATA_RECV_TASK_MSG_QUEUE_SIZE (16)
+#define MMI_AIGC_DATA_RECV_TASK_STACK_SIZE (80 * 1024)
+
 
 
 typedef enum
 {
-       MMI_AI_TALK_RECEIVE_TYPE_NONE,
-               
-       MMI_AI_TALK_RECEIVE_TYPE_START,
-       MMI_AI_TALK_RECEIVE_TYPE_TEXT,
-       MMI_AI_TALK_RECEIVE_TYPE_ANSWER,
-       MMI_AI_TALK_RECEIVE_TYPE_TTS,
+       MMI_AIGC_MSG_RECV_ID_START,
+   
+    MMI_AIGC_MSG_TRANS_TEXT_RECV,
+       MMI_AIGC_MSG_CHAT_TEXT_RECV,
+       MMI_AIGC_MSG_TTS_AUDIO_RECV,
+    
+    MMI_AIGC_MSG_RECV_ID_END
+}MMI_AIGC_DATA_RECV_MSG_ID_E;
+
+typedef enum
+{
+       MMI_AIGC_MSG_SEND_ID_START,
+   
+    MMI_AIGC_MSG_TRANS_START_SEND,
+       MMI_AIGC_MSG_TRANS_AUDIO_SEND,
+       MMI_AIGC_MSG_TRANS_STOP_SEND,
+       MMI_AIGC_MSG_CHAT_TEXT_SEND,
+       MMI_AIGC_MSG_TTS_START_SEND,
+       MMI_AIGC_MSG_TTS_TEXT_SEND,
+       MMI_AIGC_MSG_TTS_STOP_SEND,
+    
+    MMI_AIGC_MSG_SEND_ID_END
+}MMI_AIGC_DATA_SEND_MSG_ID_E;
+
+
+
+typedef struct
+{
+       uint16_t cmd_type;
+       void * cmd_param;
+       uint32_t param_size;
+}mmi_aigc_data_task_msg_t;
+
 
-       MMI_AI_TALK_RECEIVE_TYPE_MAX
-}MMI_AI_TALK_RECEIVE_TYPE_E;
 
+// data task
+void mmi_aigc_data_task_create(void);
+void mmi_aigc_data_task_delete(void);
 
+// trans
+void mmi_aigc_send_trans_start_msg(void * param, uint32_t param_size);
+void mmi_aigc_send_trans_audio_msg(void * param, uint32_t param_size);
+void mmi_aigc_send_trans_stop_msg(void * param, uint32_t param_size);
+void mmi_aigc_send_chat_text_msg(void * param, uint32_t param_size);
 
-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 
 
index ac8513c..9637c6a 100644 (file)
 
 static lv_signal_cb_t ancient_scrl_signal;
 
-//static uint8_t s_aigc_init_flag = 0;
-//static mmi_aigc_msg_info_t * s_aigc_info = NULL;
-static mmi_aigc_msg_item_info_t s_aigc_item_info = {0};
-static uint8_t s_aigc_play_anim_count = 0;
-//static char s_aigc_selected_item_index = -1;
-static bool s_item_receive_playing = false;
+static MMI_AIGC_UI_STATE_E s_aigc_ui_state = MMI_AIGC_UI_STATE_NONE;
+static mmi_aigc_msg_info_t s_aigc_info_t = {0};
+static mmi_aigc_msg_info_t * s_aigc_info_p = &s_aigc_info_t;
+static uint8_t s_aigc_current_chat_index = 0; // 1 chat = 2 msg items
+
 static uint32_t s_aigc_recording_sent_size = 0;
-static uint8_t s_aigc_sending_screen_counter = 0;
+static uint32_t s_aigc_tts_text_sent_size = 0;
+static uint8_t s_aigc_thinking_counter = 0;
+static bool s_aigc_tts_audio_playing = false;
 
-static bool mmi_aigc_is_waiting_for_result(void);
-static void mmi_aigc_sending_screen_task_stop(void);
+static lv_ll_t s_aigc_tts_audio_ll = {0};
+static mmi_aigc_tts_audio_ll_t * s_aigc_tts_audio_play_node = NULL;
 
+#define MMI_AIGC_SEND_TTS_TEXT_MAX (150) // 50
+#define MMI_AIGC_SEND_TTS_TEXT_MIN (99) // 33
 
-#include "../../../../product/craneg_modem/pcac/wsclient/libwebsockets/inc/Mmi_aigc_chat_websocket.h"
-#include "../../../../product/craneg_modem/pcac/wsclient/libwebsockets/inc/mmi_aigc_trans_websocket.h"
 
-static uint32_t s_debug_counter = 0;
+static void mmi_aigc_default_screen_display(void);
+static void mmi_aigc_record_button_event_cb(lv_obj_t * obj, lv_event_t e);
 
-static void mmi_aigc_receive_item_info_clean(void)
+static void mmi_aigc_msg_data_clean(void)
 {
-       if(NULL != s_aigc_item_info.msg_data_ptr)
+       AIGC_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+       
+       uint8_t i = 0;
+       for(i = 0; i < s_aigc_info_p->msg_count; i++)
        {
-               AIGC_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
-               lv_mem_free(s_aigc_item_info.msg_data_ptr);
-               s_aigc_item_info.msg_data_ptr = NULL;
-               s_aigc_item_info.msg_data_size = 0;
-       }
+               if(NULL != s_aigc_info_p->msg_item[i].text_data_ptr)
+               {
+                       lv_mem_free(s_aigc_info_p->msg_item[i].text_data_ptr);
+                       s_aigc_info_p->msg_item[i].text_data_ptr = NULL;
+               }
 
-       if(NULL != s_aigc_item_info.msg_voice_data_ptr)
-       {
-               AIGC_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
-               lv_mem_free(s_aigc_item_info.msg_voice_data_ptr);
-               s_aigc_item_info.msg_voice_data_ptr = NULL;
-               s_aigc_item_info.msg_voice_data_size = 0;
+               if(NULL != s_aigc_info_p->msg_item[i].audio_data_ptr)
+               {
+                       lv_mem_free(s_aigc_info_p->msg_item[i].audio_data_ptr);
+                       s_aigc_info_p->msg_item[i].audio_data_ptr = NULL;
+               }
        }
+
+       _lv_memset_00(s_aigc_info_p, sizeof(mmi_aigc_msg_info_t));
 }
 
-uint8_t mmi_aigc_info_count_get(void)
+uint8_t mmi_aigc_msg_count_get(void)
 {
        uint8_t msg_count = 0;
 
-#if 1
-       if(NULL != s_aigc_item_info.msg_data_ptr)
-       {
-               msg_count = 1;
-       }
-#else
-       msg_count = s_aigc_info->msg_count;
-#endif
+       msg_count = s_aigc_info_p->msg_count;
        
        return msg_count;
 }
 
-void * mmi_aigc_actId_ext_get(lv_watch_Activity_Id_t actId)
+char * mmi_aigc_trans_result_text_get(uint32_t * data_len)
 {
-       lv_obj_t * activity_obj = lv_watch_get_activity_obj(actId);
-       if(NULL == activity_obj) 
-               return NULL;
+       mmi_aigc_msg_item_info_t * t_aigc_item_info = &(s_aigc_info_p->msg_item[0]);
        
-       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;
+       * data_len = t_aigc_item_info->text_data_size;
+       return (t_aigc_item_info->text_data_ptr);
 }
 
-lv_obj_t * mmi_aigc_activity_obj_get(void)
+bool mmi_aigc_trans_result_text_store(char * data_buff, uint32_t data_len)
 {
-    lv_obj_t * activity_obj = NULL;
+       if(NULL == data_buff || 0 == data_len)
+       {
+               AIGC_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+               return false;
+       }
 
-    activity_obj = lv_watch_get_activity_obj(ACT_ID_AIGC_MAIN);
-       
-    return activity_obj;
-}
+       mmi_aigc_msg_item_info_t * t_aigc_item_info = &(s_aigc_info_p->msg_item[0]);
 
-void mmi_aigc_main_prepare_destory(lv_obj_t * activity_obj)
-{
-       AIGC_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+       if(NULL == t_aigc_item_info->text_data_ptr)
+       {
+               char * temp_ptr = lv_mem_alloc(data_len + 1);
+               if(NULL == temp_ptr)
+               {
+                       AIGC_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: alloc memory fail\n", __FUNCTION__, __LINE__);
+                       return false;
+               }
+               _lv_memset_00(temp_ptr, data_len + 1);
+               _lv_memcpy(temp_ptr, data_buff, data_len);
 
-       // close
-       mmi_aigc_websocket_app_stop();
-       watch_set_suspend_enable(true, ACT_ID_AIGC_MAIN, 0);
+               t_aigc_item_info->text_data_ptr = temp_ptr;
+               t_aigc_item_info->text_data_size = data_len;
+       }
+       else
+       {
+               char * temp_ptr = lv_mem_realloc(t_aigc_item_info->text_data_ptr, t_aigc_item_info->text_data_size + data_len + 1);
+               if(NULL == temp_ptr)
+               {
+                       AIGC_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: realloc memory fail\n", __FUNCTION__, __LINE__);
+                       return false;
+               }
+               _lv_memset_00(temp_ptr + t_aigc_item_info->text_data_size, data_len + 1);
+               _lv_memcpy(temp_ptr + t_aigc_item_info->text_data_size, data_buff, data_len);
 
-       // free resource
-       //mmi_aigc_data_receive_resource_clean();
-       
-    lv_watch_png_cache_all_free();
+               t_aigc_item_info->text_data_ptr = temp_ptr;
+               t_aigc_item_info->text_data_size += data_len;
+       }
+       t_aigc_item_info->msg_from = 0;
 
-       lv_aigc_ext_t * ext = mmi_aigc_actId_ext_get(ACT_ID_AIGC_MAIN);
-       if(NULL == ext) 
-               return ;
+       s_aigc_info_p->msg_count = 1;
+       
+       AIGC_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: size=%d,ptr=0x%x\n", __FUNCTION__, __LINE__, t_aigc_item_info->text_data_size, t_aigc_item_info->text_data_ptr);
 
-       AIGC_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+#ifdef MMI_AIGC_DEBUG_TO_FILE
+       mmi_debug_info_write_to_file(AIGC_RECV_TRANS_RESULT_FILE, t_aigc_item_info->text_data_ptr, t_aigc_item_info->text_data_size);
+#endif
 
-       mmi_aigc_list_msg_item_style_reset(ext);
+       return true;
+}
 
-       // free buffer
-       mmi_aigc_receive_item_info_clean();
-       
-       //
-       //Hal_NFFS_File_Play_End();
-       Hal_Audio_Manage_End_Ind(AUDIO_CTRL_PRIORITY_5);
-       //Hal_Vibrator_Play_End();
-       s_item_receive_playing = false;
+char * mmi_aigc_chat_result_text_get(uint32_t * data_len)
+{
+       mmi_aigc_msg_item_info_t * t_aigc_item_info = &(s_aigc_info_p->msg_item[1]);
        
-       AIGC_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+       * data_len = t_aigc_item_info->text_data_size;
+       return (t_aigc_item_info->text_data_ptr);
 }
 
-static void mmi_aigc_list_set_slide_enable(lv_watch_obj_ext_t * ext, bool enable)
+bool mmi_aigc_chat_result_text_store(char * data_buff, uint32_t data_len)
 {
-    if(enable) 
-       {
-        ext->slide_enable = 1; /*enable to slide to the right*/
-    } 
-       else 
+       if(NULL == data_buff || 0 == data_len)
        {
-        ext->slide_enable = 0; /*disable to slide to the right*/
-    }
-}
+               printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+               return false;
+       }
 
-bool mmi_aigc_voice_is_playing(void)
-{
-       bool result = false;
+       mmi_aigc_msg_item_info_t * t_aigc_item_info = &(s_aigc_info_p->msg_item[1]);
        
-#if 0
-       lv_aigc_ext_t * ext = mmi_aigc_actId_ext_get(ACT_ID_AIGC_MAIN);
-       if(NULL != ext && NULL != ext->list)
+       if(NULL == t_aigc_item_info->text_data_ptr)
        {
-               lv_aigc_list_ext_t * list_page_ext = lv_obj_get_ext_attr(ext->list);
-               if(NULL != list_page_ext->voice_playing_anim.var)
+               char * temp_ptr = lv_mem_alloc(data_len + 1);
+               if(NULL == temp_ptr)
                {
-                       result = true;
+                       printf("[@CHENG_DEBUG][%s][%d]: alloc memory fail\n", __FUNCTION__, __LINE__);
+                       return false;
                }
+               _lv_memset_00(temp_ptr, data_len + 1);
+               _lv_memcpy(temp_ptr, data_buff, data_len);
+
+               t_aigc_item_info->text_data_ptr = temp_ptr;
+               t_aigc_item_info->text_data_size = data_len;
        }
+       else
+       {
+               char * temp_ptr = lv_mem_realloc(t_aigc_item_info->text_data_ptr, t_aigc_item_info->text_data_size + data_len + 1);
+               if(NULL == temp_ptr)
+               {
+                       printf("[@CHENG_DEBUG][%s][%d]: realloc memory fail\n", __FUNCTION__, __LINE__);
+                       return false;
+               }
+               _lv_memset_00(temp_ptr + t_aigc_item_info->text_data_size, data_len + 1);
+               _lv_memcpy(temp_ptr + t_aigc_item_info->text_data_size, data_buff, data_len);
+
+               t_aigc_item_info->text_data_ptr = temp_ptr;
+               t_aigc_item_info->text_data_size += data_len;
+       }
+       t_aigc_item_info->msg_from = 1;
+
+       s_aigc_info_p->msg_count = 2;
+       
+       printf("[@CHENG_DEBUG][%s][%d]: size=%d,ptr=0x%x\n", __FUNCTION__, __LINE__, t_aigc_item_info->text_data_size, t_aigc_item_info->text_data_ptr);
+
+#ifdef MMI_AIGC_DEBUG_TO_FILE
+       mmi_debug_info_write_to_file(AIGC_RECV_CHAT_RESULT_FILE, t_aigc_item_info->text_data_ptr, t_aigc_item_info->text_data_size);
 #endif
 
-       return result;
+       return true;
 }
 
-bool mmi_aigc_voice_is_recording(void)
+void mmi_aigc_chat_text_download_requst(void)
 {
-       bool result = false;
-       
-       if(lv_watch_get_activity_obj(ACT_ID_AIGC_RECORDING)) 
+       uint32_t data_len = 0;
+       char * data_ptr = mmi_aigc_trans_result_text_get(&data_len);
+
+       if(NULL != data_ptr && 0 != data_len)
        {
-               result = true;
+               mmi_aigc_send_chat_text_msg(data_ptr, data_len);
        }
-
-       return result;
 }
 
-bool mmi_aigc_item_is_sending(void)
+static void mmi_utf8_complete_character_judge(char * data_ptr, uint32_t data_len, uint32_t * output_len)
 {
-       bool result = false;
-       
-       if(lv_watch_get_activity_obj(ACT_ID_AIGC_SENDING)) 
-       {
-               result = true;
+       uint32_t i = 0;
+       uint32_t p = 0;
+       char ch = 0;
+       while(1)
+       {
+               ch = data_ptr[i];
+
+               //#1111110x
+               if(ch >= 252)
+                       p = p + 6;
+               //#111110xx
+               else if(ch >= 248)
+                       p = p + 5;
+               //#11110xxx
+               else if(ch >= 240)
+                       p = p + 4;
+               //#1110xxxx
+               else if(ch >= 224)
+                       p = p + 3;
+               //#110xxxxx
+               else if(ch >= 192)
+                       p = p + 2;
+               else
+                       p = p + 1;
+
+               if(p >= data_len)
+                       break;
+               else
+                       i = p;
        }
 
-       return result;
+       * output_len = i;
+       AIGC_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: output_len=%d\n", __FUNCTION__, __LINE__, *output_len);
 }
 
-void mmi_aigc_receive_audio_play_audio_ctrl_callback(AUDIO_CTRL_PRIORITY priority)
+void mmi_aigc_send_tts_text_seperate(char * data_ptr, uint32_t data_len, uint32_t * output_len)
 {
-       printf("[@CHENG_DEBUG][%s][%d]: priority=%d\n", __FUNCTION__, __LINE__, priority);
+       // cn ,
+       char cn_comma_str[4] = {0};
+       cn_comma_str[0] = 0XEF;
+       cn_comma_str[1] = 0XBC;
+       cn_comma_str[2] = 0X8C;
        
-    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;
-    }
-}
+       // cn .
+       char cn_period_str[4] = {0};
+       cn_period_str[0] = 0XE3;
+       cn_period_str[1] = 0X80;
+       cn_period_str[2] = 0X82;
 
-void mmi_aigc_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;
-}
+       // cn ?
+       char cn_query_str[4] = {0};
+       cn_query_str[0] = 0XEF;
+       cn_query_str[1] = 0XBC;
+       cn_query_str[2] = 0X9F;
 
-static bool mmi_aigc_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;
+       // cn !
+       char cn_mark_str[4] = {0};
+       cn_mark_str[0] = 0XEF;
+       cn_mark_str[1] = 0XBC;
+       cn_mark_str[2] = 0X81;
+
+
+       if(MMI_AIGC_SEND_TTS_TEXT_MAX >= data_len)
+       {
+               * output_len = data_len;
+               AIGC_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: output_len=%d\n", __FUNCTION__, __LINE__, *output_len);
+               return;
+       }
+
+       char * temp_ptr = lv_mem_alloc(MMI_AIGC_SEND_TTS_TEXT_MAX + 1);
+       if(NULL == temp_ptr)
+       {
+               AIGC_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: alloc memory fail\n", __FUNCTION__, __LINE__);
+               return ;
+       }
+       _lv_memset_00(temp_ptr, (MMI_AIGC_SEND_TTS_TEXT_MAX + 1));
+       _lv_memcpy(temp_ptr, data_ptr, MMI_AIGC_SEND_TTS_TEXT_MAX);
        
-       res = lv_fs_open(&file_p, file_path, LV_FS_MODE_WR);
-       if(LV_FS_RES_OK != res) 
+       char * offset_ptr = NULL;
+       offset_ptr = strstr(temp_ptr, cn_comma_str);
+       if(NULL != offset_ptr)
        {
-               printf("[@CHENG_DEBUG][%s][%d]: errno=%d\n", __FUNCTION__, __LINE__, res);
-               lv_fs_close(&file_p);
-               return false;
+               * output_len = offset_ptr - temp_ptr + 2;
+               goto EXIT;
        }
-       res = lv_fs_write(&file_p, file_buf, file_size, &bytes_write);
-       lv_fs_close(&file_p);
-       if(LV_FS_RES_OK != res)
+       
+       offset_ptr = strstr(temp_ptr, cn_period_str);
+       if(NULL != offset_ptr)
        {
-               printf("[@CHENG_DEBUG][%s][%d]: errno=%d\n", __FUNCTION__, __LINE__, res);
-               return false;
+               * output_len = offset_ptr - temp_ptr + 2;
+               goto EXIT;
+       }
+       
+       offset_ptr = strstr(temp_ptr, cn_query_str);
+       if(NULL != offset_ptr)
+       {
+               * output_len = offset_ptr - temp_ptr + 2;
+               goto EXIT;
+       }
+       
+       offset_ptr = strstr(temp_ptr, cn_mark_str);
+       if(NULL != offset_ptr)
+       {
+               * output_len = offset_ptr - temp_ptr + 2;
+               goto EXIT;
+       }
+       
+       if(NULL == offset_ptr)
+       {
+               mmi_utf8_complete_character_judge(temp_ptr, MMI_AIGC_SEND_TTS_TEXT_MIN, output_len);
        }
-       printf("[@CHENG_DEBUG][%s][%d]: file_size=%d,write_size=%d\n", __FUNCTION__, __LINE__, file_size, bytes_write);
 
-       return true;
+EXIT:
+       lv_mem_free(temp_ptr);
+       temp_ptr = NULL;
+       AIGC_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: output_len=%d\n", __FUNCTION__, __LINE__, *output_len);
 }
 
-void mmi_aigc_receive_update_ui(void)
+uint32_t mmi_aigc_send_tts_text_data_escape_character(char * data_buff, int data_len, char * output_data)
 {
-       printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+    if (NULL == data_buff || 0 == data_len)
+               return;
        
-       if(AUDIO_CTRL_PRIORITY_5 == Hal_Audio_Manage_Start_Req(AUDIO_CTRL_PRIORITY_5, mmi_aigc_receive_audio_play_audio_ctrl_callback))
+       uint32_t curr_p = 0, i = 0;
+
+       for(i = 0; i < data_len; i++)
        {
-               if(false == s_item_receive_playing)
+               if(0X0A == data_buff[i]) // 0X0A -> 0X5C 0X6E 
                {
-                       s_item_receive_playing = true;
-               
-                       //Hal_NFFS_File_Play_Onetime(AUDIO_WECHAT_RECEIVE, (HAL_SPEAKER_GAIN)query_current_volume(), mmi_aigc_receive_audio_play_over_cb, NULL);
-                       //Hal_Vibrator_Play_Onetime(NULL, 1000);
+                       output_data[curr_p++] = 0X5C;
+                       output_data[curr_p++] = 0X6E;
                }
-       
-               mmi_aigc_sending_screen_exit();
-               
-               if(lv_watch_get_activity_obj(ACT_ID_AIGC_MAIN)) 
+               else if(0X22 == data_buff[i]) // 0X22 -> 0X5C 0X22
                {
-                       mmi_aigc_main_screen_refresh();
+                       output_data[curr_p++] = 0X5C;
+                       output_data[curr_p++] = 0X22;
                }
                else
                {
-                       //mmi_aigc_create_event_cb(NULL, LV_EVENT_CLICKED);
+                       output_data[curr_p++] = data_buff[i];
                }
        }
+
+       return curr_p;
 }
 
-bool mmi_aigc_model_answer_result_display(char * data_buff, int data_buff_len)
+void mmi_aigc_send_tts_text_action(char * data_ptr, uint32_t data_len)
 {
-       if(NULL == data_buff || 0 == data_buff_len)
+       uint32_t output_len = 0;
+       mmi_aigc_send_tts_text_seperate(data_ptr, data_len, &output_len);
+       
+       uint32_t send_len = 0;
+       char * send_ptr = lv_mem_alloc((output_len + output_len / 9 + 1));
+       if(NULL == send_ptr)
        {
-               printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
-               return false;
+               AIGC_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: alloc memory fail\n", __FUNCTION__, __LINE__);
+               return ;
        }
+       _lv_memset_00(send_ptr, (output_len + output_len / 9 + 1));
+       send_len = mmi_aigc_send_tts_text_data_escape_character(data_ptr, output_len, send_ptr);
 
-       // if(false == mmi_aigc_is_waiting_for_result())
-       // {
-       //      printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);     
-       //      return false;
-       // }
+#if 0
+       AIGC_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: send_len=%d\n", __FUNCTION__, __LINE__, send_len);
+       AIGC_DEBUG_PRINTF("[@CHENG_DEBUG][%d]: %#X %#X %#X %#X %#X %#X %#X %#X %#X %#X\n", __LINE__,
+               send_ptr[0],send_ptr[1],send_ptr[2],send_ptr[3],send_ptr[4],send_ptr[5],send_ptr[6],send_ptr[7],send_ptr[8],send_ptr[9]);
+       AIGC_DEBUG_PRINTF("[@CHENG_DEBUG][%d]: %#X %#X %#X %#X %#X %#X %#X %#X %#X %#X\n", __LINE__,
+               send_ptr[10],send_ptr[11],send_ptr[12],send_ptr[13],send_ptr[14],send_ptr[15],send_ptr[16],send_ptr[17],send_ptr[18],send_ptr[19]);
+       AIGC_DEBUG_PRINTF("[@CHENG_DEBUG][%d]: %#X %#X %#X %#X %#X %#X %#X %#X %#X %#X\n", __LINE__,
+               send_ptr[20],send_ptr[21],send_ptr[22],send_ptr[23],send_ptr[24],send_ptr[25],send_ptr[26],send_ptr[27],send_ptr[28],send_ptr[29]);
+       AIGC_DEBUG_PRINTF("[@CHENG_DEBUG][%d]: %#X %#X %#X %#X %#X %#X %#X %#X %#X %#X\n", __LINE__,
+               send_ptr[30],send_ptr[31],send_ptr[32],send_ptr[33],send_ptr[34],send_ptr[35],send_ptr[36],send_ptr[37],send_ptr[38],send_ptr[39]);
+       AIGC_DEBUG_PRINTF("[@CHENG_DEBUG][%d]: %#X %#X %#X %#X %#X %#X %#X %#X %#X %#X\n", __LINE__,
+               send_ptr[40],send_ptr[41],send_ptr[42],send_ptr[43],send_ptr[44],send_ptr[45],send_ptr[46],send_ptr[47],send_ptr[48],send_ptr[49]);
+       AIGC_DEBUG_PRINTF("[@CHENG_DEBUG][%d]: %#X %#X %#X %#X %#X %#X %#X %#X %#X %#X\n", __LINE__,
+               send_ptr[50],send_ptr[51],send_ptr[52],send_ptr[53],send_ptr[54],send_ptr[55],send_ptr[56],send_ptr[57],send_ptr[58],send_ptr[59]);
+       AIGC_DEBUG_PRINTF("[@CHENG_DEBUG][%d]: %#X %#X %#X %#X %#X %#X %#X %#X %#X %#X\n", __LINE__,
+               send_ptr[60],send_ptr[61],send_ptr[62],send_ptr[63],send_ptr[64],send_ptr[65],send_ptr[66],send_ptr[67],send_ptr[68],send_ptr[69]);
+#endif
 
-       //mmi_aigc_sending_screen_task_stop();        
+       mmi_aigc_send_tts_text_msg(send_ptr, send_len);
+       s_aigc_tts_text_sent_size += output_len;
 
-       if(NULL != s_aigc_item_info.msg_data_ptr)
-       {
-               lv_mem_free(s_aigc_item_info.msg_data_ptr);
-               s_aigc_item_info.msg_data_ptr = NULL;
-       }
-       s_aigc_item_info.msg_data_ptr = lv_mem_alloc(data_buff_len + 1);
-       if(NULL == s_aigc_item_info.msg_data_ptr)
+       lv_mem_free(send_ptr);
+       send_ptr = NULL;
+}
+
+void mmi_aigc_send_tts_text_action_pre(void)
+{
+       uint32_t data_len = 0;
+       char * data_ptr = mmi_aigc_chat_result_text_get(&data_len);
+
+       AIGC_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: data_len=%d\n", __FUNCTION__, __LINE__, data_len);
+       if(NULL != data_ptr && (0 != data_len) && (data_len > s_aigc_tts_text_sent_size))
        {
-               printf("[@CHENG_DEBUG][%s][%d]: alloc memory fail\n", __FUNCTION__, __LINE__);
-               return false;
+               mmi_aigc_tts_audio_ll_new_node();
+               
+               mmi_aigc_send_tts_text_action(data_ptr + s_aigc_tts_text_sent_size, data_len - s_aigc_tts_text_sent_size);
        }
-       _lv_memset_00(s_aigc_item_info.msg_data_ptr, data_buff_len + 1);
-       _lv_memcpy(s_aigc_item_info.msg_data_ptr, data_buff, data_buff_len);
-       s_aigc_item_info.msg_data_size = data_buff_len;
-       
-       printf("[@CHENG_DEBUG][%s][%d]: msg_data_size=%d,msg_data_ptr=0x%x\n", __FUNCTION__, __LINE__, s_aigc_item_info.msg_data_size, s_aigc_item_info.msg_data_ptr);
+}
 
-       return true;
+void mmi_aigc_tts_audio_download_requst(void)
+{
+       AIGC_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+
+       s_aigc_tts_text_sent_size = 0;
+       s_aigc_tts_audio_playing = false;
+       mmi_aigc_tts_audio_ll_clean();
+       mmi_aigc_send_tts_text_action_pre();
 }
 
+#if 1
 
-#define BEI_KE_DEBUG_FILE "C:/bei_ke_debug.txt"
-bool mmi_aigc_debug_info_write_to_file(char * path, char * info_buf, uint32_t info_size)
+void mmi_aigc_tts_audio_ll_init(void)
 {
-       lv_fs_file_t file_p;
-       lv_fs_res_t res;
-       uint32_t bytes_write = 0;
+       _lv_ll_init(&s_aigc_tts_audio_ll, sizeof(mmi_aigc_tts_audio_ll_t));
+}
 
-       res = lv_fs_open(&file_p, path, LV_FS_MODE_WR | LV_FS_MODE_APPEND);
-       if(LV_FS_RES_OK != res) 
+void mmi_aigc_tts_audio_ll_clean(void)
+{
+       mmi_aigc_tts_audio_ll_t * node = NULL;
+    for(node = _lv_ll_get_head(&s_aigc_tts_audio_ll); NULL != node; node = _lv_ll_get_next((&s_aigc_tts_audio_ll), node))
        {
-               printf("[@CHENG_DEBUG][%s][%d]: errno=%d\n", __FUNCTION__, __LINE__, res);
-               lv_fs_close(&file_p);
-               return false;
-       }
+        if(NULL != node->audio_data_ptr)
+       {
+                       lv_mem_free(node->audio_data_ptr);
+                       node->audio_data_ptr = NULL;
+               }
+    }
+
+       _lv_ll_clear(&s_aigc_tts_audio_ll);
+}
 
-       hal_rtc_t cur_time = {0};
-       char str_time[24] = {0};
+mmi_aigc_tts_audio_ll_t * mmi_aigc_tts_audio_ll_new_node(void)
+{
+       AIGC_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+       
+    mmi_aigc_tts_audio_ll_t * node = _lv_ll_ins_tail(&s_aigc_tts_audio_ll);
+       
+       node->audio_data_ptr = NULL;
+       node->audio_data_size = 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);
+       return node;
+}
 
-       //lv_fs_seek
-       res = lv_fs_write(&file_p, str_time, strlen(str_time), &bytes_write);
-       if(LV_FS_RES_OK != res)
+bool mmi_aigc_tts_audio_store(char * data_buff, uint32_t data_len)
+{
+       if(NULL == data_buff || 0 == data_len)
        {
-               printf("[@CHENG_DEBUG][%s][%d]: errno=%d\n", __FUNCTION__, __LINE__, res);
-               lv_fs_close(&file_p);
+               AIGC_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
                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)
+
+       mmi_aigc_tts_audio_ll_t * node = _lv_ll_get_tail(&s_aigc_tts_audio_ll);
+       if(NULL == node)
        {
-               printf("[@CHENG_DEBUG][%s][%d]: errno=%d\n", __FUNCTION__, __LINE__, res);
+               AIGC_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
                return false;
+       }       
+
+       if(NULL == node->audio_data_ptr)
+       {
+               AIGC_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+               char * temp_ptr = lv_mem_alloc(data_len + 1);
+               if(NULL == temp_ptr)
+               {
+                       AIGC_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: alloc memory fail\n", __FUNCTION__, __LINE__);
+                       return false;
+               }
+               _lv_memset_00(temp_ptr, data_len + 1);
+               _lv_memcpy(temp_ptr, data_buff, data_len);
+
+               node->audio_data_ptr = temp_ptr;
+               node->audio_data_size = data_len;
+       }
+       else
+       {
+               AIGC_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+               char * temp_ptr = lv_mem_realloc(node->audio_data_ptr, node->audio_data_size + data_len + 1);
+               if(NULL == temp_ptr)
+               {
+                       AIGC_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: realloc memory fail\n", __FUNCTION__, __LINE__);
+                       return false;
+               }
+               _lv_memset_00(temp_ptr + node->audio_data_size, data_len + 1);
+               _lv_memcpy(temp_ptr + node->audio_data_size, data_buff, data_len);
+
+               node->audio_data_ptr = temp_ptr;
+               node->audio_data_size += data_len;
        }
-       printf("[@CHENG_DEBUG][%s][%d]: file_size=%d,write_size=%d\n", __FUNCTION__, __LINE__, info_size, bytes_write);
+
+       AIGC_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: size=%d,ptr=0x%x\n", __FUNCTION__, __LINE__, node->audio_data_size, node->audio_data_ptr);
 
        return true;
 }
 
+void mmi_aigc_tts_audio_ctrl_callback(AUDIO_CTRL_PRIORITY priority)
+{
+       AIGC_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: priority=%d\n", __FUNCTION__, __LINE__, priority);
+       
+    if(MMI_AIGC_TTS_AUDIO_PRI == priority)
+       {
+
+    }
+       else if(MMI_AIGC_TTS_AUDIO_PRI > priority)
+       {
+               Hal_NFFS_File_Play_End();
+               Hal_Audio_Manage_End_Ind(MMI_AIGC_TTS_AUDIO_PRI);
+               // websocket
+               mmi_aigc_tts_websocket_app_stop();
+               // res
+               mmi_aigc_tts_audio_ll_clean();
+    }
+}
 
-static void mmi_aigc_tts_info_result_play_over_cb(void * para)
+static void mmi_aigc_tts_audio_over_cb(void * para)
 {
-       printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+       AIGC_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+
+       s_aigc_tts_audio_playing = false;
        
-       if(NULL != s_aigc_item_info.msg_voice_data_ptr)
+       mmi_aigc_tts_audio_ll_t * node = _lv_ll_get_next((&s_aigc_tts_audio_ll), s_aigc_tts_audio_play_node);
+       _lv_ll_remove((&s_aigc_tts_audio_ll), s_aigc_tts_audio_play_node);
+       if(NULL != s_aigc_tts_audio_play_node->audio_data_ptr)
        {
-               lv_mem_free(s_aigc_item_info.msg_voice_data_ptr);
-               s_aigc_item_info.msg_voice_data_ptr = NULL;
+               lv_mem_free(s_aigc_tts_audio_play_node->audio_data_ptr);
+               s_aigc_tts_audio_play_node->audio_data_ptr = NULL;
+       }
+       lv_mem_free(s_aigc_tts_audio_play_node);
+       s_aigc_tts_audio_play_node = NULL;
+       
+       if(MMI_AIGC_TTS_AUDIO_PRI == Hal_Audio_Manage_Start_Req(MMI_AIGC_TTS_AUDIO_PRI, mmi_aigc_tts_audio_ctrl_callback))
+       {
+               if(NULL == node || NULL == node->audio_data_ptr)
+               {
+                       AIGC_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+                       return ;
+               }
+               s_aigc_tts_audio_play_node = node;
+               s_aigc_tts_audio_playing = true;
+               
+               uint8_t volume = 0;
+       #ifdef __MMI_USER_PROFILE_SUPPORT__
+               volume = mmi_user_profile_current_mode_remind_volume_get();
+       #else
+               volume = query_current_volume();
+       #endif
+               volume = 1;
+
+               Hal_Tone_Play_Onetime((uint32_t *)node->audio_data_ptr,
+                                                               node->audio_data_size,
+                                                               volume,
+                                                               mmi_aigc_tts_audio_over_cb,
+                                                               NULL);  
        }
-       s_aigc_item_info.msg_voice_data_size = 0;
 }
 
-#define blockAlign_16 1
-int simplest_pcm16le_to_wave(void *pcm_str,int pcm_str_size)
+bool mmi_aigc_tts_audio_play(void)
 {
-       int i=0;
-       int x=0;
-       char buf_str[64]={0};
-    while (1)
+       if(true == s_aigc_tts_audio_playing)
+       {
+               AIGC_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+               return false;
+       }
+       
+       if(MMI_AIGC_TTS_AUDIO_PRI == Hal_Audio_Manage_Start_Req(MMI_AIGC_TTS_AUDIO_PRI, mmi_aigc_tts_audio_ctrl_callback))
        {
-               i++;
+               AIGC_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
                
-               char temp_str[16]={0};
-               if(i==14)
-               {
-                       break;
-               }
-               switch (i)
+               mmi_aigc_tts_audio_ll_t * node = _lv_ll_get_head(&s_aigc_tts_audio_ll);
+               if(NULL == node || NULL == node->audio_data_ptr)
                {
-                       case 1:
-                               sprintf(buf_str,"%s","RIFF"); //4
-                               x=4;
-                               break;
-                       case 2:
-                               for(int i=0;i<4;i++)
-                               {
-                                       char temp=  (pcm_str_size+32)>>(8*i) & 0xff;
-                                       buf_str[x] = temp;
-                                       x++;
-                                       // sprintf(buf_str,"%s%c",buf_str,temp); //8
-                               }
-
-                               break;
-                       case 3:
-                               sprintf(temp_str,"%s","WAVE"); //12
-                               _lv_memcpy(buf_str+x,temp_str,4);
-                               x+=4;
-                               break;
-                       case 4:
-                               sprintf(temp_str,"%s","fmt "); //16
-                               _lv_memcpy(buf_str+x,temp_str,4);
-                               x+=4;
-                               break;
-                       case 5:
-                               sprintf(temp_str,"%c%c%c%c",0x10,0,0,0); // 20
-                               _lv_memcpy(buf_str+x,temp_str,4);
-                               x+=4;
-                               
-                               break;
-                       case 6:
-                               sprintf(temp_str,"%c%c",1,0);//22
-                               _lv_memcpy(buf_str+x,temp_str,2);
-                               x+=2;
-                               break;
-                       case 7:
-                               sprintf(temp_str,"%c%c",1,0);//24
-                               _lv_memcpy(buf_str+x,temp_str,2);
-                               x+=2;
-                               break;
-                       case 8:
-                               sprintf(temp_str,"%c%c%c%c",0x40,0x1f,0x00,0x00);//28
-                               _lv_memcpy(buf_str+x,temp_str,4);
-                               x+=4;
-                               break;
-                       case 9:
-                               #if blockAlign_16
-                                       sprintf(temp_str,"%c%c%c%c",0x80,0x3e,0x00,0x00);//每秒字节数32  3200
-                               #else
-                                       sprintf(temp_str,"%c%c%c%c",0x40,0x1f,0x00,0x00);//28  16000
-                               #endif
-                               
-                               _lv_memcpy(buf_str+x,temp_str,4);
-                               x+=4;
-                               break;
-                       case 10:
-                               #if blockAlign_16
-                                       sprintf(temp_str,"%c%c",0x02,0x00);//每个采样比特数36
-                               #else
-                                       sprintf(temp_str,"%c%c",0x01,0x00);//每个采样字节数32
-                               #endif
-                               _lv_memcpy(buf_str+x,temp_str,2);
-                               x+=2;
-                               break;
-                       case 11:
-                               #if blockAlign_16
-                                       sprintf(temp_str,"%c%c",0x10,0x00);//每个采样比特数36
-                               #else
-                                       sprintf(temp_str,"%c%c",0x08,0x00);//每个采样比特数36
-                               #endif
-                               _lv_memcpy(buf_str+x,temp_str,2);
-                               x+=2;
-                               break;
-                       case 12:
-                               sprintf(temp_str,"%s","data");//40
-                               _lv_memcpy(buf_str+x,temp_str,4);
-                               x+=4;
-                               break;
-                       case 13:
-                               for(int i=0;i<4;i++)
-                               {
-                                       char temp=  (pcm_str_size)>>(8*i) & 0xff;
-                                       buf_str[x] = temp;
-                                       x++;
-                               }
-                               break;
+                       AIGC_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+                       return false;
                }
-       }
+               s_aigc_tts_audio_play_node = node;
+               s_aigc_tts_audio_playing = true;
        
-       void  * new_str=lv_mem_alloc(pcm_str_size +44+ + 1);
-       _lv_memset_00(new_str, pcm_str_size +44+ 1);
-       _lv_memcpy(new_str, buf_str, 44);
-       _lv_memcpy(new_str+44, s_aigc_item_info.msg_voice_data_ptr, pcm_str_size);
+               uint8_t volume = 0;
+       #ifdef __MMI_USER_PROFILE_SUPPORT__
+               volume = mmi_user_profile_current_mode_remind_volume_get();
+       #else
+               volume = query_current_volume();
+       #endif
+               volume = 1;
+
+               Hal_Tone_Play_Onetime((uint32_t *)node->audio_data_ptr,
+                                                               node->audio_data_size,
+                                                               volume,
+                                                               mmi_aigc_tts_audio_over_cb,
+                                                               NULL);  
+       }
 
-       s_aigc_item_info.msg_voice_data_ptr = lv_mem_realloc(s_aigc_item_info.msg_voice_data_ptr, pcm_str_size+44+1);
-       _lv_memcpy(s_aigc_item_info.msg_voice_data_ptr,new_str,pcm_str_size + 44);
-       lv_mem_free(new_str);
+       return true;
+}
 
-       #if 0
-       char * info_buf = "";
-       sprintf(info_buf,"测试次数 ");
-       uint32_t info_size = strlen(info_buf);
+#else
+bool mmi_aigc_tts_audio_store(char * data_buff, uint32_t data_len)
+{
+       if(NULL == data_buff || 0 == data_len)
        {
-               lv_fs_file_t file_p;
-               lv_fs_res_t res;
-               uint32_t bytes_write = 0;
-               
-               res = lv_fs_open(&file_p, "C:/bei_ke_debug_17_06.txt", LV_FS_MODE_WR | LV_FS_MODE_APPEND);
-               if(LV_FS_RES_OK != res) 
+               printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+               return false;
+       }
+
+       mmi_aigc_msg_item_info_t * t_aigc_item_info = &(s_aigc_info_p->msg_item[1]);
+       
+       if(NULL == t_aigc_item_info->audio_data_ptr)
+       {
+               char * temp_ptr = lv_mem_alloc(data_len + 1);
+               if(NULL == temp_ptr)
                {
-                       printf("[@CHENG_DEBUG][%s][%d]: errno=%d\n", __FUNCTION__, __LINE__, res);
-                       lv_fs_close(&file_p);
+                       printf("[@CHENG_DEBUG][%s][%d]: alloc memory fail\n", __FUNCTION__, __LINE__);
                        return false;
                }
-               printf("[@CHENG_DEBUG][%s][%d]:\n", __FUNCTION__, __LINE__);
-               res = lv_fs_write(&file_p, info_buf, info_size, &bytes_write);
-               lv_fs_close(&file_p);
-               if(LV_FS_RES_OK != res)
+               _lv_memset_00(temp_ptr, data_len + 1);
+               _lv_memcpy(temp_ptr, data_buff, data_len);
+
+               t_aigc_item_info->audio_data_ptr = temp_ptr;
+               t_aigc_item_info->audio_data_size = data_len;
+       }
+       else
+       {
+               char * temp_ptr = lv_mem_realloc(t_aigc_item_info->audio_data_ptr, t_aigc_item_info->audio_data_size + data_len + 1);
+               if(NULL == temp_ptr)
                {
-                       printf("[@CHENG_DEBUG][%s][%d]: errno=%d\n", __FUNCTION__, __LINE__, res);
+                       printf("[@CHENG_DEBUG][%s][%d]: realloc memory fail\n", __FUNCTION__, __LINE__);
                        return false;
                }
-               printf("[@CHENG_DEBUG][%s][%d]: file_size=%d,write_size=%d\n", __FUNCTION__, __LINE__, info_size, bytes_write);
-       
-               //return true;
+               _lv_memset_00(temp_ptr + t_aigc_item_info->audio_data_size, data_len + 1);
+               _lv_memcpy(temp_ptr + t_aigc_item_info->audio_data_size, data_buff, data_len);
+
+               t_aigc_item_info->audio_data_ptr = temp_ptr;
+               t_aigc_item_info->audio_data_size += data_len;
        }
-       #endif
-    return 0;
+       
+       printf("[@CHENG_DEBUG][%s][%d]: size=%d,ptr=0x%x\n", __FUNCTION__, __LINE__, t_aigc_item_info->audio_data_size, t_aigc_item_info->audio_data_ptr);
+
+       return true;
 }
 
+void mmi_aigc_tts_audio_ctrl_callback(AUDIO_CTRL_PRIORITY priority)
+{
+       AIGC_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: priority=%d\n", __FUNCTION__, __LINE__, priority);
+       
+    if(MMI_AIGC_TTS_AUDIO_PRI == priority)
+       {
+
+    }
+       else if(MMI_AIGC_TTS_AUDIO_PRI > priority)
+       {
+               Hal_NFFS_File_Play_End();
+               Hal_Audio_Manage_End_Ind(MMI_AIGC_TTS_AUDIO_PRI);
+    }
+}
 
-bool mmi_aigc_tts_info_result_display(char * data_buff, int data_buff_len)
+static void mmi_aigc_tts_audio_over_cb(void * para)
 {
-       uint32_t output_len = 0;
+       AIGC_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+       
+
+}
 
+bool mmi_aigc_tts_audio_play(void)
+{
+/*
        uint32_t fs_total = 0;
        uint32_t fs_free = 0;
        lv_fs_free_space('C', &fs_total, &fs_free);
        printf("[@CHENG_DEBUG][%s][%d]: space total = %dB, free = %dB\n", __FUNCTION__, __LINE__, fs_total, fs_free);
+*/
 
-       if(NULL == data_buff || 0 == data_buff_len)
+       mmi_aigc_msg_item_info_t * t_aigc_item_info = &(s_aigc_info_p->msg_item[1]);
+       
+       if(MMI_AIGC_TTS_AUDIO_PRI == Hal_Audio_Manage_Start_Req(MMI_AIGC_TTS_AUDIO_PRI, mmi_aigc_tts_audio_ctrl_callback))
        {
-               printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
-               return false;
+               uint8_t volume = 0;
+       #ifdef __MMI_USER_PROFILE_SUPPORT__
+               volume = mmi_user_profile_current_mode_remind_volume_get();
+       #else
+               volume = query_current_volume();
+       #endif
+               volume = 1;
+       
+               Hal_Tone_Play_Onetime((uint32_t *)t_aigc_item_info->audio_data_ptr,
+                                                               t_aigc_item_info->audio_data_size,
+                                                               volume,
+                                                               mmi_aigc_tts_audio_over_cb,
+                                                               NULL);  
        }
 
-       if(false == mmi_aigc_is_waiting_for_result())
-       {
-               printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
-               return false;
-       }
+       return true;
+}
+#endif
 
-       mmi_aigc_sending_screen_task_stop();
+void mmi_ui_msg_update_aigc_recv_trans_text_stop(void)
+{
+       AIGC_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
 
-       // ui
-       mmi_watch_wake_up();
-       //mmi_ui_msg_action_aigc_incoming();
-       
-       
-       if(NULL != s_aigc_item_info.msg_voice_data_ptr)
-       {
-               lv_mem_free(s_aigc_item_info.msg_voice_data_ptr);
-               s_aigc_item_info.msg_voice_data_ptr = NULL;
-       }
-       s_aigc_item_info.msg_voice_data_ptr = lv_mem_alloc(data_buff_len);
-       if(NULL == s_aigc_item_info.msg_voice_data_ptr)
-       {
-               printf("[@CHENG_DEBUG][%s][%d]: memory alloc fail\n", __FUNCTION__, __LINE__);
-               return false;
-       }
-       _lv_memset_00(s_aigc_item_info.msg_voice_data_ptr, data_buff_len);      
-       //mbedtls_base64_encode mbedtls_base64_decode
-    if(0 != mbedtls_base64_decode(s_aigc_item_info.msg_voice_data_ptr, data_buff_len, &output_len, data_buff, data_buff_len))
-       {
-               printf("[@CHENG_DEBUG][%s][%d]: base64 decode error\n", __FUNCTION__, __LINE__);
-               return false;
-       }
-       s_aigc_item_info.msg_voice_data_size = output_len;
-       simplest_pcm16le_to_wave(s_aigc_item_info.msg_voice_data_ptr,output_len);
-       s_aigc_item_info.msg_voice_data_size+=44;
-       printf("[@CHENG_DEBUG][%s][%d]: len1=%d,len2=%d\n", __FUNCTION__, __LINE__, data_buff_len, output_len);
-       //mmi_aigc_debug_info_write_to_file(BEI_KE_DEBUG_FILE, s_aigc_item_info.msg_voice_data_ptr, s_aigc_item_info.msg_voice_data_size);
-
-       uint8_t volume = 0;
-#ifdef __MMI_USER_PROFILE_SUPPORT__
-       volume = mmi_user_profile_current_mode_remind_volume_get();
-#else
-       volume = query_current_volume();
-#endif
-       //Hal_NFFS_File_Play_Onetime("C:ai_take.wav",volume,mmi_aigc_tts_info_result_play_over_cb,NULL);
-       Hal_Tone_Play_Onetime((uint32_t *)s_aigc_item_info.msg_voice_data_ptr,
-                                                       s_aigc_item_info.msg_voice_data_size,
-                                                       volume,
-                                                       mmi_aigc_tts_info_result_play_over_cb,
-                                                       NULL);  
+}
 
+void mmi_ui_msg_update_aigc_recv_chat_text_stop(void)
+{
+       AIGC_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
 
-       return true;
+       mmi_aigc_main_screen_refresh();
 }
 
-bool mmi_aigc_send_to_server(void)
+void mmi_ui_msg_update_aigc_recv_tts_audio_stop(void)
 {
-       bool result = false; // true-success; false-fail
-       
-       lv_aigc_ext_t * ext = (lv_aigc_ext_t *)mmi_aigc_actId_ext_get(ACT_ID_AIGC_MAIN);
-       if(NULL == ext) 
-       {
-               printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
-               return false;
-       }
+       AIGC_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
 
-       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_aigc_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_aigc_recording_sent_size, file_size);
-       lv_mem_free(ext->record_buffer);
-       ext->record_buffer = NULL;
+void * mmi_aigc_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;
        
-       //if(true == mmi_aigc_audio_data_send(file_buf, file_size))
+       lv_obj_t * watch_obj = NULL;
+       lv_watch_get_child_obj(activity_obj, lv_watch_obj_signal, &watch_obj);
+       if(NULL != watch_obj) 
        {
-               result = true;
+               void * ext = lv_obj_get_ext_attr(watch_obj);
+               return ext;
        }
-       lv_mem_free(file_buf);
-       s_aigc_recording_sent_size = 0;
 
-       return result;
+       return NULL;
 }
 
-void mmi_aigc_sending_screen_prepare_destory(lv_obj_t * activity_obj)
+void mmi_aigc_main_prepare_destory(lv_obj_t * activity_obj)
 {
-       printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
-               
+       AIGC_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+
+       // websocket
+       mmi_aigc_trans_websocket_app_stop();
+       mmi_aigc_chat_websocket_app_stop();
+       mmi_aigc_tts_websocket_app_stop();
+       // data task
+       mmi_aigc_data_task_delete();
+       watch_set_suspend_enable(true, ACT_ID_AIGC_MAIN, 0);
+
+       // free resource
+       mmi_aigc_msg_data_clean();
+       mmi_aigc_tts_audio_ll_clean();
+       
+       //
+       Hal_NFFS_File_Play_End();
+       Hal_Audio_Manage_End_Ind(MMI_AIGC_TTS_AUDIO_PRI);
+       //Hal_Vibrator_Play_End();
+       
     lv_watch_png_cache_all_free();
 
-       mmi_aigc_sending_screen_task_stop();
+       lv_aigc_ext_t * ext = mmi_aigc_actId_ext_get(ACT_ID_AIGC_MAIN);
+       if(NULL == ext) 
+               return ;
+
+       mmi_aigc_list_msg_item_style_reset(ext);
 
-       watch_set_suspend_enable(true, ACT_ID_AIGC_SENDING, 0);
-       watch_wakeup_time_reset();
+       if(NULL != ext->record_buffer)
+       {
+               lv_mem_free(ext->record_buffer);
+               ext->record_buffer = NULL;
+       }
+       
+       if(NULL != ext->thinking_task_p)
+       {
+               lv_task_del(ext->thinking_task_p);
+               ext->thinking_task_p = NULL;
+       }
+       if(NULL != ext->gif_listening)
+       {
+               gif_close(ext->gif_listening);
+               ext->gif_listening = NULL;
+       }
+       if(NULL != ext->gif_thinking)
+       {
+               gif_close(ext->gif_thinking);
+               ext->gif_thinking = NULL;
+       }
 }
 
-void mmi_aigc_sending_screen_exit(void)
+void mmi_aigc_main_screen_clean(void)
 {
-       mmi_aigc_sending_screen_prepare_destory(NULL);
+       mmi_aigc_main_prepare_destory(NULL);
 
-       //delete sending screen
-       //lv_watch_del_interface(ACT_ID_AIGC_SENDING);
-       lv_obj_t * obj = lv_watch_get_activity_obj(ACT_ID_AIGC_SENDING);
+       lv_obj_t * obj = lv_watch_get_activity_obj(ACT_ID_AIGC_MAIN);
        if(NULL != obj)
        {
-               printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+               AIGC_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
                lv_obj_del(obj);
        }
 }
 
-void mmi_aigc_sending_fail_screen_exit(void)
+static void mmi_aigc_list_set_slide_enable(lv_watch_obj_ext_t * ext, bool enable)
 {
-       mmi_aigc_sending_screen_exit();
-       //return main list screen
-       mmi_aigc_main_screen_refresh();
+    if(enable) 
+       {
+        ext->slide_enable = 1; /*enable to slide to the right*/
+    } 
+       else 
+       {
+        ext->slide_enable = 0; /*disable to slide to the right*/
+    }
 }
 
-
-#define TIMEOUT_SEND_END_CHAR_COUNT    (3) // 500ms *3
-#define TIMEOUT_WAIT_FOR_RESULT_COUNT  (16) // 500ms *3 + 500ms * 16
-#define TIMEOUT_GET_RESULT_FAIL_COUNT  (21) // 500ms *3 + 500ms * 16 + 500ms * 3
-//static hal_rtc_t send_time;
-static bool mmi_aigc_is_waiting_for_result(void)
+void mmi_aigc_timeout_screen_clean(void)
 {
-       bool result = false;
+       AIGC_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
 
-       printf("[@CHENG_DEBUG][%s][%d]: %d\n", __FUNCTION__, __LINE__, s_aigc_sending_screen_counter);
-       if(1 < s_aigc_sending_screen_counter
-               && TIMEOUT_WAIT_FOR_RESULT_COUNT > s_aigc_sending_screen_counter
-               )
+       mmi_aigc_default_screen_display();
+}
+
+void mmi_aigc_timeout_screen_display(void)
+{      
+       AIGC_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+       
+       lv_aigc_ext_t * ext = (lv_aigc_ext_t *)mmi_aigc_actId_ext_get(ACT_ID_AIGC_MAIN);
+       if(NULL == ext) 
+               return ;
+
+       s_aigc_ui_state = MMI_AIGC_UI_STATE_CONNECT_TIMEOUT;
+
+       if(NULL != ext->thinking_task_p)
        {
-               result = true;
+               lv_task_del(ext->thinking_task_p);
+               ext->thinking_task_p = NULL;
        }
-       // hal_rtc_t cur_time = {0};
-       // Hal_Rtc_Gettime(&cur_time);
-       // if(send_time.)
 
-       return result;
+
+       // ui
+       lv_obj_t * cont = ext->cont_timeout;
+       
+       //label
+       lv_obj_t * label_state = lv_label_create(cont, NULL);
+       lv_obj_add_style(label_state, LV_LABEL_PART_MAIN, &lv_watch_font20);
+       lv_label_set_text_id(label_state, WATCH_TEXT_ID_AIGC_ASSISTANT);
+       lv_label_set_align(label_state, LV_LABEL_ALIGN_CENTER);
+       lv_obj_align(label_state, NULL, LV_ALIGN_IN_TOP_MID, 0, 20);
+
+       lv_obj_t * img = lv_img_create(cont, NULL);
+       lv_img_set_src(img, ICON_AIGC_PROMPT);
+       lv_obj_set_click(img, false);
+       lv_obj_align(img, NULL, LV_ALIGN_IN_TOP_MID, 0, 70);
+       
+       lv_obj_t * label = lv_label_create(cont, NULL);
+       lv_obj_add_style(label, LV_LABEL_PART_MAIN, &lv_watch_font20);
+       lv_label_set_text_id(label, WATCH_TEXT_ID_AIGC_CONNECT_TIMEOUT);
+       lv_label_set_align(label, LV_LABEL_ALIGN_CENTER);
+       lv_obj_align(label, img, LV_ALIGN_OUT_BOTTOM_MID, 0, 25);
+
+       lv_obj_t * imgbtn = lv_imgbtn_create(cont, NULL);
+       lv_imgbtn_set_src(imgbtn, LV_BTN_STATE_RELEASED, ICON_AIGC_RECORD_BUTTON_PRESSED);
+       lv_imgbtn_set_src(imgbtn, LV_BTN_STATE_PRESSED, ICON_AIGC_RECORD_BUTTON_PRESSED);
+       lv_obj_set_event_cb(imgbtn, mmi_aigc_record_button_event_cb);
+    lv_obj_add_protect(imgbtn, LV_PROTECT_PRESS_LOST);
+       lv_watch_obj_add_element(imgbtn);
+       lv_obj_align(imgbtn, NULL, LV_ALIGN_IN_BOTTOM_MID, 0, -20);
+
+       lv_obj_t * imgbtn_label = lv_label_create(imgbtn, NULL);
+       lv_obj_add_style(imgbtn_label, LV_LABEL_PART_MAIN, &lv_watch_font26);
+       lv_label_set_align(imgbtn_label, LV_LABEL_ALIGN_CENTER);
+       lv_label_set_text_id(imgbtn_label, WATCH_TEXT_ID_OK);
+       lv_obj_align(imgbtn_label, NULL, LV_ALIGN_CENTER, 0, 0);        
+
+       lv_obj_set_hidden(ext->cont_default, true);
+       lv_obj_set_hidden(ext->cont_listening, true);
+       lv_obj_set_hidden(ext->cont_thinking, true);
+       lv_obj_set_hidden(ext->cont_timeout, false);
+       lv_obj_set_hidden(ext->cont_list, true);
 }
 
-static void mmi_aigc_sending_screen_task_stop(void)
+void mmi_aigc_thinking_screen_clean(void)
 {
-       printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
-               
-       lv_aigc_sending_ext_t * sending_ext = (lv_aigc_sending_ext_t *)mmi_aigc_actId_ext_get(ACT_ID_AIGC_SENDING);
-       if(NULL != sending_ext)
+       AIGC_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+       
+       lv_aigc_ext_t * ext = (lv_aigc_ext_t *)mmi_aigc_actId_ext_get(ACT_ID_AIGC_MAIN);
+       if(NULL == ext) 
+               return ;
+
+       mmi_aigc_send_trans_stop_msg(NULL, 0);
+       if(NULL != ext->thinking_task_p)
        {
-               if(NULL != sending_ext->sending_screen_task_id)
-               {
-                       lv_task_del(sending_ext->sending_screen_task_id);
-                       sending_ext->sending_screen_task_id = NULL;
-               }
+               lv_task_del(ext->thinking_task_p);
+               ext->thinking_task_p = NULL;
        }
 
-       s_aigc_sending_screen_counter = -1;
+       mmi_aigc_default_screen_display();
 }
 
-void mmi_aigc_sending_screen_task_cb(lv_task_t * task)
+static void mmi_aigc_thinking_screen_task_cb(lv_task_t * task)
 {
-       s_aigc_sending_screen_counter++;
-       printf("[@CHENG_DEBUG][%s][%d]: %d\n", __FUNCTION__, __LINE__, s_aigc_sending_screen_counter);
+       s_aigc_thinking_counter++;
+       AIGC_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: thinking_counter=%d\n", __FUNCTION__, __LINE__, s_aigc_thinking_counter);
        
-       switch(s_aigc_sending_screen_counter)
+       switch(s_aigc_thinking_counter)
        {
-               case TIMEOUT_SEND_END_CHAR_COUNT:
-                       //mmi_aigc_audio_data_send_end_char();
+               case 1:
+                       mmi_aigc_send_trans_stop_msg(NULL, 0);
                        break;
-
-               case 5:
-                       lv_aigc_sending_ext_t * sending_ext = (lv_aigc_sending_ext_t *)(task->user_data);
-                       lv_obj_set_hidden(sending_ext->gif_obj, false);
-                       //  lv_obj_t * img = lv_img_create(sending_ext, NULL);
-                       // LV_ASSERT_MEM(img);
-                       // lv_img_set_src(img, ICON_UPAY_BINDING);
-                       // lv_obj_set_size(img, LV_HOR_RES, LV_VER_RES);
-                       // lv_obj_align(img, sending_ext, LV_ALIGN_CENTER, 0, 0);
-
                        
-
-
-                       break;
-               case TIMEOUT_WAIT_FOR_RESULT_COUNT:
-                       //lv_aigc_sending_ext_t * sending_ext = (lv_aigc_sending_ext_t *)(task->user_data);
-                       // lv_obj_set_hidden(sending_ext->label_sending, true);
-                       // lv_obj_set_hidden(sending_ext->label_result, false);
-                       break;
-
-               case TIMEOUT_GET_RESULT_FAIL_COUNT:
-                       
-                       mmi_aigc_sending_fail_screen_exit();
-       
+               case 60:
+                       mmi_aigc_timeout_screen_display();
                        break;
 
                default:
@@ -726,107 +900,122 @@ void mmi_aigc_sending_screen_task_cb(lv_task_t * task)
        }
 }
 
-lv_obj_t * mmi_aigc_sending_screen_create(lv_obj_t * activity_obj)
+void mmi_aigc_listening_remain_data_send(void)
 {
-       printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
-
-    if(NULL == activity_obj) 
+       lv_aigc_ext_t * ext = (lv_aigc_ext_t *)mmi_aigc_actId_ext_get(ACT_ID_AIGC_MAIN);
+       if(NULL == ext) 
        {
-        lv_watch_activity_ext_t activity_ext = {0};
-
-        activity_ext.actId = ACT_ID_AIGC_SENDING;
-        activity_ext.create = (lv_watch_activity_create_f_t)mmi_aigc_sending_screen_create;
-        activity_ext.prepare_destory = mmi_aigc_sending_screen_prepare_destory;
-        activity_obj = lv_watch_creat_activity_obj(&activity_ext);
-               if(NULL == activity_obj)
-                       return NULL;
-    }
+               AIGC_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+               goto EXIT;
+       }
 
-    lv_obj_t * obj = lv_watch_obj_create(activity_obj);
-       if(NULL == obj)
-               return NULL;
-       lv_aigc_sending_ext_t * sending_ext = (lv_aigc_sending_ext_t *)lv_obj_allocate_ext_attr(obj, sizeof(lv_aigc_sending_ext_t));
-       if(NULL == sending_ext)
-               return NULL;
-               
-       mmi_aigc_list_set_slide_enable(&sending_ext->old_ext, false); /*prevent to slide out while recording*/
+       AIGC_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: size=%d, buf=0x%x\n", __FUNCTION__, __LINE__, ext->record_size, ext->record_buffer);
 
-       mmi_aigc_send_to_server();
-       s_aigc_sending_screen_counter = 0;
-       sending_ext->sending_screen_task_id = lv_task_create(mmi_aigc_sending_screen_task_cb, 500, LV_TASK_PRIO_HIGH, sending_ext);
+       int file_size = ext->record_size - s_aigc_recording_sent_size;
+       if(0 >= file_size)
+       {
+               AIGC_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+               goto EXIT;
+       }
+    char * file_buf = lv_mem_alloc(file_size + 1);
+       if(NULL == file_buf)
+       {
+               AIGC_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+               goto EXIT;
+    }
+       _lv_memset_00(file_buf, file_size + 1);
+       _lv_memcpy(file_buf, ext->record_buffer + s_aigc_recording_sent_size, file_size);
+       
+       mmi_aigc_send_trans_audio_msg(file_buf, file_size);
+       lv_mem_free(file_buf);
+       file_buf = NULL;
 
-    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(0x00, 0x00, 0x00));
+EXIT:
+       lv_mem_free(ext->record_buffer);
+       ext->record_buffer = NULL;
+       ext->record_size = 0;
+       
+       s_aigc_recording_sent_size = 0; 
+}
 
-       lv_obj_t * img1 = lv_cont_create(obj, NULL);
-       gif_info_t * upay_binding_gif=gif_open(img1, ANIM_SOS, 0);
-       lv_obj_set_size(img1, 80, 80);
-       lv_obj_align(img1, NULL , LV_ALIGN_CENTER, 0, -20);
-       sending_ext->gif_obj=img1;
-       //lv_obj_set_hidden(sending_ext->gif_obj, true);
+void mmi_aigc_thinking_screen_display(void)
+{      
+       AIGC_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+       
+       lv_aigc_ext_t * ext = (lv_aigc_ext_t *)mmi_aigc_actId_ext_get(ACT_ID_AIGC_MAIN);
+       if(NULL == ext) 
+               return ;
 
-       sending_ext->label_sending = lv_label_create(cont, NULL);
-       lv_obj_add_style(sending_ext->label_sending, LV_LABEL_PART_MAIN, &lv_watch_font26);
-       lv_label_set_text_id(sending_ext->label_sending, WATCH_TEXT_ID_GETTING_RESULT);
-       lv_obj_align(sending_ext->label_sending, NULL, LV_ALIGN_CENTER, 0, 45);
+       s_aigc_ui_state = MMI_AIGC_UI_STATE_THINKING;
 
-       sending_ext->label_result = lv_label_create(cont, sending_ext->label_sending);
-       lv_label_set_text_id(sending_ext->label_result, WATCH_TEXT_ID_GET_RESULT_FAIL);
-       lv_obj_align(sending_ext->label_result, NULL, LV_ALIGN_CENTER, 0, 30);
+       // websocket
+       mmi_aigc_tts_websocket_app_start();
 
-       lv_obj_set_hidden(sending_ext->label_sending, false);
-       lv_obj_set_hidden(sending_ext->label_result, true);
-       
-       watch_set_suspend_enable(false, ACT_ID_AIGC_SENDING, 0);
+       mmi_aigc_listening_remain_data_send();
+       s_aigc_thinking_counter = 0;
+       if(NULL != ext->thinking_task_p)
+       {
+               lv_task_del(ext->thinking_task_p);
+               ext->thinking_task_p = NULL;
+       }
+       ext->thinking_task_p = lv_task_create(mmi_aigc_thinking_screen_task_cb, 1000, LV_TASK_PRIO_HIGH, NULL);
 
-    return obj;
-}
 
-void mmi_aigc_recording_release_event_cb(lv_obj_t * obj, lv_event_t e)
-{
-       printf("[@CHENG_DEBUG][%s][%d]: event=%d\n", __FUNCTION__, __LINE__, e);
+       // ui
+       lv_obj_t * cont = ext->cont_thinking;
        
-#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_AIGC_RECORDING);
-               mmi_aigc_sending_screen_create(NULL);
-    }
-#endif
-}
-
-void mmi_aigc_recording_anim(lv_anim_t * a)
-{
-       s_aigc_play_anim_count++;
-    if(0 == (s_aigc_play_anim_count % 4)) 
-       {
-        int8_t count_down = MMI_AIGC_DATA_RECORD_DURATION_MAX - s_aigc_play_anim_count / 4;
-        printf("[@CHENG_DEBUG][%s][%d]: count down=%d\n", __FUNCTION__, __LINE__, count_down);
-               
-        if(0 < count_down)
+       //label
+       lv_obj_t * label_state = lv_label_create(cont, NULL);
+       lv_obj_add_style(label_state, LV_LABEL_PART_MAIN, &lv_watch_font20);
+       lv_label_set_text_id(label_state, WATCH_TEXT_ID_AIGC_THINKING);
+       lv_label_set_align(label_state, LV_LABEL_ALIGN_CENTER);
+       lv_obj_align(label_state, NULL, LV_ALIGN_IN_TOP_MID, 0, 20);
+
+       //lv_obj_t * img = lv_img_create(cont, NULL);
+       //lv_img_set_src(img, ICON_AIGC_THINKING);
+       //lv_obj_set_click(img, false);
+       //lv_obj_align(img, NULL, LV_ALIGN_CENTER, 0, -10);
+       if(NULL == ext->gif_thinking)
+       {
+               ext->gif_thinking = gif_open(cont, ANIM_AIGC_THINKING, 0);
+               if(NULL == ext->gif_thinking) 
                {
-                       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);
+                       AIGC_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: gif open fail\n", __FUNCTION__, __LINE__);
                }
-    }
+               lv_obj_set_style_local_bg_color(ext->gif_thinking->container, LV_CONT_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_BLACK);
+               lv_obj_align(ext->gif_thinking->container, NULL, LV_ALIGN_CENTER, 0, -10);
+       }
+
+       lv_obj_t * imgbtn = lv_imgbtn_create(cont, NULL);
+       lv_imgbtn_set_src(imgbtn, LV_BTN_STATE_RELEASED, ICON_AIGC_RECORD_BUTTON_PRESSED);
+       lv_imgbtn_set_src(imgbtn, LV_BTN_STATE_PRESSED, ICON_AIGC_RECORD_BUTTON_PRESSED);
+       lv_obj_set_event_cb(imgbtn, mmi_aigc_record_button_event_cb);
+    lv_obj_add_protect(imgbtn, LV_PROTECT_PRESS_LOST);
+       lv_watch_obj_add_element(imgbtn);
+       lv_obj_align(imgbtn, NULL, LV_ALIGN_IN_BOTTOM_MID, 0, -20);
+
+       lv_obj_t * imgbtn_label = lv_label_create(imgbtn, NULL);
+       lv_obj_add_style(imgbtn_label, LV_LABEL_PART_MAIN, &lv_watch_font26);
+       //lv_obj_set_style_local_text_font(imgbtn_label, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, LV_THEME_WATCH_NIGHT_FONT_26);
+       //lv_obj_set_style_local_text_color(imgbtn_label, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_MAKE(253, 82, 19));
+       lv_label_set_align(imgbtn_label, LV_LABEL_ALIGN_CENTER);
+       lv_label_set_text_id(imgbtn_label, WATCH_TEXT_ID_CANCEL);
+       lv_obj_align(imgbtn_label, NULL, LV_ALIGN_CENTER, 0, 0);        
+
+       lv_obj_set_hidden(ext->cont_default, true);
+       lv_obj_set_hidden(ext->cont_listening, true);
+       lv_obj_set_hidden(ext->cont_thinking, false);
+       lv_obj_set_hidden(ext->cont_timeout, true);
+       lv_obj_set_hidden(ext->cont_list, true);
 }
 
-bool mmi_aigc_recording_stop(bool is_cancel)
+bool mmi_aigc_listening_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);
+    Hal_Audio_Manage_End_Ind(MMI_AIGC_TTS_AUDIO_PRI);
        
        lv_aigc_ext_t * ext = (lv_aigc_ext_t *)mmi_aigc_actId_ext_get(ACT_ID_AIGC_MAIN);
        if(NULL == ext) 
@@ -841,7 +1030,7 @@ bool mmi_aigc_recording_stop(bool is_cancel)
         return false;
     }
        
-    if(MMI_AIGC_DATA_WAV_HEAD_SIZE >= size) 
+    if(MMI_AIGC_DATA_RECORD_HEAD_SIZE >= size) 
        {
                printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
         lv_mem_free(ext->record_buffer);
@@ -850,36 +1039,11 @@ bool mmi_aigc_recording_stop(bool is_cancel)
         return false;
     }
        ext->record_size = size;
-
-       return true;
-}
-
-void mmi_aigc_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_aigc_recording_stop(true);
-               
-               //lv_watch_del_interface(ACT_ID_AIGC_RECORDING);
-               lv_obj_t * activity_obj = lv_watch_get_activity_obj(ACT_ID_AIGC_RECORDING);
-               if(NULL != activity_obj)
-               {
-                       lv_obj_del(activity_obj);
-               }
-    }
+
+       return true;
 }
 
-void mmi_aigc_recording_task_cb(lv_task_t * task)
+void mmi_aigc_listening_task_cb(lv_task_t * task)
 {
        lv_aigc_ext_t * ext = (lv_aigc_ext_t *)mmi_aigc_actId_ext_get(ACT_ID_AIGC_MAIN);
        if(NULL == ext) 
@@ -893,31 +1057,18 @@ void mmi_aigc_recording_task_cb(lv_task_t * task)
 
        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);
+       AIGC_DEBUG_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_aigc_recording_stop(false);
-                       activity_obj = lv_watch_get_activity_obj(ACT_ID_AIGC_RECORDING);
-                       if(NULL != activity_obj)
-                       {
-                               lv_obj_del(activity_obj);
-                       }
-                       mmi_aigc_sending_screen_create(NULL);
+                       mmi_aigc_listening_stop(false);
+                       mmi_aigc_thinking_screen_display();
                        break;
                        
                case MCI_EVENT_ERROR:
-                       printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
-
-                       mmi_aigc_recording_stop(true);
-                       activity_obj = lv_watch_get_activity_obj(ACT_ID_AIGC_RECORDING);
-                       if(NULL != activity_obj)
-                       {
-                               lv_obj_del(activity_obj);
-                       }
+                       mmi_aigc_listening_stop(true);
+                       mmi_aigc_main_screen_clean();
                        break;
                        
                //case MCI_EVENT_INFO:
@@ -928,14 +1079,14 @@ void mmi_aigc_recording_task_cb(lv_task_t * task)
        }
 }
 
-void mmi_aigc_recording_cb(MCI_EVNET_T event, MCI_INFO_T info_type, int32_t value)
+void mmi_aigc_listening_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);
+       AIGC_DEBUG_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_aigc_recording_task_cb, 10, LV_TASK_PRIO_HIGH, event);
+           lv_task_t * record_task = lv_task_create(mmi_aigc_listening_task_cb, 10, LV_TASK_PRIO_HIGH, event);
        lv_task_once(record_task);
     }
        else // MCI_EVENT_INFO == event
@@ -945,115 +1096,72 @@ void mmi_aigc_recording_cb(MCI_EVNET_T event, MCI_INFO_T info_type, int32_t valu
                        lv_aigc_ext_t * ext = (lv_aigc_ext_t *)mmi_aigc_actId_ext_get(ACT_ID_AIGC_MAIN);
                        if(NULL == ext) 
                        {
-                               printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+                               AIGC_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
                                return;
                        }
-
-                       static uint8_t t_value = 0;
-                       t_value++;
-                       if(2 == t_value)
-                       {
-                       t_value = 0;
                        
                        uint32_t sending_size = value - s_aigc_recording_sent_size;
                        if(0 >= sending_size)
                        {
-                               printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+                               AIGC_DEBUG_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__);
+                               AIGC_DEBUG_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_aigc_recording_sent_size, sending_size);
                        
-                       mmi_aigc_audio_data_send(sending_buf, sending_size);
-                       
+                       mmi_aigc_send_trans_audio_msg(sending_buf, sending_size);                       
                        lv_mem_free(sending_buf);
                        s_aigc_recording_sent_size += sending_size;
-                       }
                }
        }
 }
 
-
-void mmi_aigc_recording_screen_prepare_destory(lv_obj_t * activity_obj)
+void mmi_aigc_listening_audio_ctrl_callback(AUDIO_CTRL_PRIORITY priority)
 {
-       printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
-       
-    lv_watch_png_cache_all_free();
-
-       //mmi_aigc_recording_stop(true);
-       uint32_t duration_ms = 0;
-       uint32_t size = 0;
+       AIGC_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: priority=%d\n", __FUNCTION__, __LINE__, priority);
        
-       Hal_Record_Buffer_Stop_Req(&size, &duration_ms);
-    Hal_Audio_Manage_End_Ind(AUDIO_CTRL_PRIORITY_5);
+    if(MMI_AIGC_TTS_AUDIO_PRI == priority)
+    {
+        if(false == watch_is_ready()) 
+               {
+            return;
+        }
+    }
+    else if(MMI_AIGC_TTS_AUDIO_PRI > priority)
+    {
+               mmi_aigc_listening_stop(true);
+               mmi_aigc_main_screen_clean();
+    }
 }
 
-lv_obj_t * mmi_aigc_recording_screen_create(lv_obj_t * activity_obj)
+void mmi_aigc_listening_screen_display(void)
 {
-       printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+       AIGC_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+       
+       lv_aigc_ext_t * ext = (lv_aigc_ext_t *)mmi_aigc_actId_ext_get(ACT_ID_AIGC_MAIN);
+       if(NULL == ext) 
+               return ;
 
-    if(NULL == activity_obj) 
-       {
-        lv_watch_activity_ext_t activity_ext = {0};
+       s_aigc_ui_state = MMI_AIGC_UI_STATE_LISTENING;
 
-               activity_ext.actId = ACT_ID_AIGC_RECORDING;
-               activity_ext.create = mmi_aigc_recording_screen_create;
-               activity_ext.prepare_destory = mmi_aigc_recording_screen_prepare_destory;
-        activity_obj = lv_watch_creat_activity_obj(&activity_ext);
-               if(NULL == activity_obj)
-                       return NULL;
-    }
+       Hal_NFFS_File_Play_End();
+       Hal_Audio_Manage_End_Ind(MMI_AIGC_TTS_AUDIO_PRI);
+       
+       // websocket
+       mmi_aigc_tts_websocket_app_stop();
 
-    lv_obj_t * obj = lv_watch_obj_create(activity_obj);
-    LV_ASSERT_MEM(obj);
-       
-    lv_aigc_recording_ext_t * recording_ext = lv_obj_allocate_ext_attr(obj, sizeof(lv_aigc_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(0x00, 0x00, 0x00));
-    //lv_obj_set_click(cont, true);
-    //lv_obj_set_event_cb(cont, mmi_aigc_recording_release_event_cb);  
-    //lv_obj_add_protect(cont, LV_PROTECT_PRESS_LOST);
-
-    lv_obj_t * label_time = lv_label_create(cont, NULL);
-    lv_obj_add_style(label_time, LV_LABEL_PART_MAIN, &lv_watch_font26);
-    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_AIGC_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_aigc_recording_anim);
-    lv_anim_set_repeat_count(&a, LV_ANIM_REPEAT_INFINITE);
-    lv_anim_set_time(&a, 249);
-    lv_anim_start(&a);
-       s_aigc_play_anim_count = 0;
+       // res
+       mmi_aigc_msg_data_clean(); 
+       mmi_aigc_tts_audio_ll_clean();
+       mmi_aigc_send_trans_start_msg(NULL, 0);
 
-       lv_aigc_ext_t * ext = (lv_aigc_ext_t *)mmi_aigc_actId_ext_get(ACT_ID_AIGC_MAIN);
-       if(NULL == ext) 
-               return NULL;
-       
        if(NULL != ext->record_buffer)
        {
                lv_mem_free(ext->record_buffer);
@@ -1064,121 +1172,109 @@ lv_obj_t * mmi_aigc_recording_screen_create(lv_obj_t * activity_obj)
        {
                _lv_memset_00(ext->record_buffer, MMI_AIGC_DATA_RECORD_SIZE_MAX);
 
-               if(AUDIO_CTRL_PRIORITY_5 == Hal_Audio_Manage_Start_Req(AUDIO_CTRL_PRIORITY_5, mmi_aigc_recording_audio_ctrl_callback))
+               if(MMI_AIGC_TTS_AUDIO_PRI == Hal_Audio_Manage_Start_Req(MMI_AIGC_TTS_AUDIO_PRI, mmi_aigc_listening_audio_ctrl_callback))
                {
                        s_aigc_recording_sent_size = 0;
-                       
                        Hal_Record_Buffer_With_Format_Req(ext->record_buffer,
                                                                                MMI_AIGC_DATA_RECORD_SIZE_MAX,
                                                                                MMI_AIGC_DATA_RECORD_DURATION_MAX * 1000,
-                                                                               mmi_aigc_recording_cb,
+                                                                               mmi_aigc_listening_cb,
                                                                                (mci_type_enum)MMI_AIGC_AUDIO_FORMAT);
                }
        }
        
-    return obj;
+       // ui
+       lv_obj_t * cont = ext->cont_listening;
+       
+       //label
+       lv_obj_t * label_state = lv_label_create(cont, NULL);
+       lv_obj_add_style(label_state, LV_LABEL_PART_MAIN, &lv_watch_font20);
+       lv_label_set_text_id(label_state, WATCH_TEXT_ID_AIGC_LISTENING);
+       lv_label_set_align(label_state, LV_LABEL_ALIGN_CENTER);
+       lv_obj_align(label_state, cont, LV_ALIGN_IN_TOP_MID, 0, 20);
+
+       //lv_obj_t * img = lv_img_create(cont, NULL);
+       //lv_img_set_src(img, ICON_AIGC_DEFAULT);
+       //lv_obj_set_click(img, false);
+       //lv_obj_align(img, NULL, LV_ALIGN_CENTER, 0, -10);
+       if(NULL == ext->gif_listening)
+       {
+               ext->gif_listening = gif_open(cont, ANIM_AIGC_LISTENING, 0);
+               if(NULL == ext->gif_listening) 
+               {
+                       AIGC_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: gif open fail\n", __FUNCTION__, __LINE__);
+               }
+               lv_obj_set_style_local_bg_color(ext->gif_listening->container, LV_CONT_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_BLACK);
+               lv_obj_align(ext->gif_listening->container, NULL, LV_ALIGN_CENTER, 0, -10);
+       }
+
+       lv_obj_t * imgbtn = lv_imgbtn_create(cont, NULL);
+       lv_imgbtn_set_src(imgbtn, LV_BTN_STATE_RELEASED, ICON_AIGC_RECORD_BUTTON_PRESSED);
+       lv_imgbtn_set_src(imgbtn, LV_BTN_STATE_PRESSED, ICON_AIGC_RECORD_BUTTON_PRESSED);
+       lv_obj_set_event_cb(imgbtn, mmi_aigc_record_button_event_cb);
+    lv_obj_add_protect(imgbtn, LV_PROTECT_PRESS_LOST);
+       lv_watch_obj_add_element(imgbtn);
+       lv_obj_align(imgbtn, NULL, LV_ALIGN_IN_BOTTOM_MID, 0, -20);
+
+       lv_obj_t * imgbtn_label = lv_label_create(imgbtn, NULL);
+       lv_obj_add_style(imgbtn_label, LV_LABEL_PART_MAIN, &lv_watch_font26);
+       lv_label_set_align(imgbtn_label, LV_LABEL_ALIGN_CENTER);
+       lv_label_set_text_id(imgbtn_label, WATCH_TEXT_ID_AIGC_TALK_FINISH);
+       lv_obj_align(imgbtn_label, NULL, LV_ALIGN_CENTER, 0, 0);        
+
+       lv_obj_set_hidden(ext->cont_default, true);
+       lv_obj_set_hidden(ext->cont_listening, false);
+       lv_obj_set_hidden(ext->cont_thinking, true);
+       lv_obj_set_hidden(ext->cont_timeout, true);
+       lv_obj_set_hidden(ext->cont_list, true);
 }
 
-void mmi_aigc_record_button_event_cb(lv_obj_t * obj, lv_event_t e)
+static void mmi_aigc_cancel_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_aigc_ext_t * ext = mmi_aigc_actId_ext_get(ACT_ID_AIGC_MAIN);
-               if(NULL == ext) 
-                       return ;
+       if(LV_EVENT_CLICKED != e)
+               return;
+       
+       AIGC_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
 
-               mmi_aigc_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;
-        }
-               
-               // free resource
-               //mmi_aigc_data_receive_resource_clean();
-               
-               mmi_aigc_receive_item_info_clean();  
-               
-               mmi_aigc_list_set_slide_enable(&ext->old_ext, false); /*prevent to slide out while recording*/
-               mmi_aigc_start_transcription_send();
-               mmi_aigc_recording_screen_create(NULL);
-    } 
-       else if(LV_EVENT_CLICKED == e || LV_EVENT_PRESS_LOST == e) 
+       mmi_aigc_main_screen_clean();   
+}
+
+static void mmi_aigc_record_button_event_cb(lv_obj_t * obj, lv_event_t e)
+{      
+       if(LV_EVENT_CLICKED != e)
+               return;
+       
+       AIGC_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: ui_state=%d\n", __FUNCTION__, __LINE__, s_aigc_ui_state);
+
+       switch(s_aigc_ui_state)
        {
-               printf("[@CHENG_DEBUG][%s][%d]: event=%d\n", __FUNCTION__, __LINE__, e);
+               case MMI_AIGC_UI_STATE_NONE:
+                       mmi_aigc_listening_screen_display();
+                       break;
+                       
+               case MMI_AIGC_UI_STATE_OPEN_FAIL:
+                       mmi_aigc_main_screen_clean();
+                       break;
 
-       #if 0
-               s_debug_counter++;
-               if(2 == s_debug_counter)
-               {
-                       mmi_aigc_start_transcription_send();
-               }
-               else if(3 == s_debug_counter)
-               {
-                       __mmi_aigc_audio_data_send(0);
-               }
-               else if(4 == s_debug_counter)
-               {
-                       __mmi_aigc_audio_data_send(1);
-               }
-       #endif
-               
-               lv_obj_t * activity_obj = lv_watch_get_activity_obj(ACT_ID_AIGC_RECORDING);
-               if(NULL != activity_obj)
-               {
-                       lv_aigc_ext_t * ext = mmi_aigc_actId_ext_get(ACT_ID_AIGC_MAIN);
-                       if(NULL == ext) 
-                               return ;
+               case MMI_AIGC_UI_STATE_LISTENING:
+                       mmi_aigc_listening_stop(false);
+                       mmi_aigc_thinking_screen_display();
+                       break;
 
-                       lv_aigc_recording_ext_t * recording_ext = (lv_aigc_recording_ext_t *)mmi_aigc_actId_ext_get(ACT_ID_AIGC_RECORDING);
-                       if(NULL == recording_ext) 
-                               return NULL;
+               case MMI_AIGC_UI_STATE_THINKING:
+                       mmi_aigc_thinking_screen_clean();
+                       break;
 
-                       printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
-            mmi_aigc_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_aigc_recording_stop(true);
-                                       lv_obj_del(activity_obj);
-                                       //return main list screen
-                                       mmi_aigc_main_screen_refresh();
-
-                                       return;
-                }
-            }
-                       #endif
-
-                       printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
-                       mmi_aigc_recording_stop(false);
-                       lv_obj_del(activity_obj);
-                       mmi_aigc_sending_screen_create(NULL);            
-        }
-    }
-       else if(LV_EVENT_PRESSED == e) 
-       {
-               printf("[@CHENG_DEBUG][%s][%d]: event=%d\n", __FUNCTION__, __LINE__, e);
-               
-               lv_aigc_ext_t * ext = mmi_aigc_actId_ext_get(ACT_ID_AIGC_MAIN);
-               if(NULL == ext) 
-                       return ;
+               case MMI_AIGC_UI_STATE_CONNECT_TIMEOUT:
+                       mmi_aigc_timeout_screen_clean();
+                       break;
 
-               //
-               Hal_NFFS_File_Play_End();
-               Hal_Audio_Manage_End_Ind(AUDIO_CTRL_PRIORITY_5);
-               Hal_Vibrator_Play_End();
+               case MMI_AIGC_UI_STATE_LIST:
+                       mmi_aigc_listening_screen_display();
+                       break;
 
-               mmi_aigc_voice_item_playing_stop(ext);
+               default:
+                       break;
        }
 }
 
@@ -1201,30 +1297,6 @@ void mmi_aigc_voice_item_reset_play_state(lv_aigc_list_ext_t * list_page_ext)
 #endif
 }
 
-void mmi_aigc_voice_item_playing_stop(lv_aigc_ext_t * ext)
-{
-       printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
-       
-#if 0
-    if(NULL == ext || NULL == ext->list) 
-       {
-               printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
-               return;
-       }
-
-       lv_aigc_list_ext_t * list_page_ext = (lv_aigc_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_aigc_voice_item_reset_play_state(list_page_ext);
-#endif
-}
-
 void mmi_aigc_list_msg_item_style_reset(lv_aigc_ext_t * ext)
 {
     if(NULL == ext || NULL == ext->list) 
@@ -1241,47 +1313,78 @@ void mmi_aigc_list_msg_item_style_reset(lv_aigc_ext_t * ext)
        lv_style_reset(&(list_page_ext->style_label_len_other));
 }
 
-//display time & content
 lv_obj_t * mmi_aigc_list_msg_item_add(lv_obj_t * list_page, mmi_aigc_msg_item_info_t * msg_item, char * time_str, uint8_t i)
 {
-       printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+       AIGC_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
        
        lv_obj_t * obj = NULL;
+       //lv_wechat_msg_list_item_ext_t * list_item_ext = NULL;
        lv_aigc_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;
-       obj_y = lv_obj_get_style_pad_top(scrl, LV_STATE_DEFAULT);
-       printf("[@CHENG_DEBUG][%s][%d]: obj_y=%d,size=%d\n", __FUNCTION__, __LINE__, obj_y, msg_item->msg_data_size);
        
-       obj = lv_cont_create(list_page, NULL);
-    lv_obj_set_size(obj, LV_HOR_RES - 30-20, 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+200);                     
-
-       uint32_t file_size = msg_item->msg_data_size;
-       char * file_buf = msg_item->msg_data_ptr;
-
-       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_LEFT);
-       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, 10);
+       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);
+       }
 
+       uint32_t file_size = msg_item->text_data_size;
+       char * file_buf = msg_item->text_data_ptr;
+       AIGC_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: y=%d,size=%d\n", __FUNCTION__, __LINE__, obj_y, file_size);
        
-       // free resource
-       //mmi_aigc_data_receive_resource_clean();
+       if(0 == msg_item->msg_from) // self
+       {
+               obj = lv_cont_create(list_page, NULL);
+               //list_item_ext = lv_obj_allocate_ext_attr(obj, sizeof(lv_wechat_msg_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_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_self));
+               lv_obj_align(obj, scrl, LV_ALIGN_IN_TOP_RIGHT, -10, obj_y);                     
+               
+               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_self));
+               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);
+       }
+       else
+       {
+               obj = lv_cont_create(list_page, NULL);
+               //list_item_ext = lv_obj_allocate_ext_attr(obj, sizeof(lv_wechat_msg_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_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);                       
+
+               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, false);
+       //lv_obj_set_click(obj, true);
+       //lv_obj_set_event_cb(obj, wechat_chat_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);
-
+       
        return obj;
 }
 
@@ -1310,21 +1413,21 @@ lv_res_t mmi_aigc_list_scrl_signal(lv_obj_t * scrl, lv_signal_t sign, void * par
     return LV_RES_OK;
 }
 
-void mmi_aigc_list_create(lv_obj_t * obj, lv_aigc_ext_t * ext)
+lv_obj_t * mmi_aigc_list_create(lv_obj_t * obj)
 {
-       printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+       AIGC_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
        
        lv_obj_t * list_page = lv_page_create(obj, NULL);
        lv_aigc_list_ext_t * list_page_ext = lv_obj_allocate_ext_attr(list_page, sizeof(lv_aigc_list_ext_t));
-       if(NULL == ext)
-               return;
+       if(NULL == list_page_ext)
+               return NULL;
        
-       lv_obj_set_size(list_page, lv_obj_get_width(obj)-20, lv_obj_get_height(obj) - 5 - lv_obj_get_height(ext->img_record) - 58);
+       lv_obj_set_size(list_page, lv_obj_get_width(obj) - 20, lv_obj_get_height(obj) - 20 - 80);
        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_align(list_page, obj, LV_ALIGN_IN_TOP_MID, 0, 30);               
+       lv_obj_align(list_page, NULL, LV_ALIGN_IN_TOP_MID, 0, 20);
 
        lv_page_set_scrl_layout(list_page, LV_LAYOUT_OFF);
        lv_page_set_scrollable_fit2(list_page, LV_FIT_NONE, LV_FIT_TIGHT);
@@ -1342,14 +1445,14 @@ void mmi_aigc_list_create(lv_obj_t * obj, lv_aigc_ext_t * ext)
 
        lv_style_init(&(list_page_ext->style_label_len_other));
        lv_style_copy(&(list_page_ext->style_label_len_other), &lv_watch_font20);
-       lv_style_set_text_color(&(list_page_ext->style_label_len_other), LV_STATE_DEFAULT, lv_color_make(0xff, 0xff, 0xff));
+       lv_style_set_text_color(&(list_page_ext->style_label_len_other), LV_STATE_DEFAULT, LV_COLOR_WHITE);
 
        lv_style_init(&(list_page_ext->style_label_len_self));
        lv_style_copy(&(list_page_ext->style_label_len_self), &lv_watch_font20);
-       lv_style_set_text_color(&(list_page_ext->style_label_len_self), LV_STATE_DEFAULT, lv_color_make(0xff, 0xff, 0xff));
+       lv_style_set_text_color(&(list_page_ext->style_label_len_self), LV_STATE_DEFAULT, LV_COLOR_WHITE);
 
        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_bg_color(&(list_page_ext->style_cont_self), LV_STATE_DEFAULT, LV_COLOR_MAKE(79, 195, 76)); // 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
@@ -1357,9 +1460,9 @@ void mmi_aigc_list_create(lv_obj_t * obj, lv_aigc_ext_t * ext)
        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(0x00, 0x00, 0x00));
+       lv_style_set_bg_color(&(list_page_ext->style_cont_other), LV_STATE_DEFAULT, LV_COLOR_MAKE(25, 25, 25)); // 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, 30);
+       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);
@@ -1367,106 +1470,194 @@ void mmi_aigc_list_create(lv_obj_t * obj, lv_aigc_ext_t * ext)
        //_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;
 
-       mmi_aigc_msg_item_info_t * msg_item = &s_aigc_item_info;
-       mmi_aigc_list_msg_item_add(list_page, msg_item, NULL, 0);
+       uint8_t i = 0;
+       uint8_t msg_count = mmi_aigc_msg_count_get();
+       
+       for(i = 0; i < msg_count; i++)
+       {
+               mmi_aigc_msg_item_info_t * msg_item = &(s_aigc_info_p->msg_item[i]);
+
+               mmi_aigc_list_msg_item_add(list_page, msg_item, NULL, 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);
        }
+
+       return list_page;
 }
 
-void mmi_aigc_main_screen_refresh(void)
-{
-       printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+void mmi_aigc_list_screen_display(void)
+{      
+       AIGC_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+       
+       lv_aigc_ext_t * ext = (lv_aigc_ext_t *)mmi_aigc_actId_ext_get(ACT_ID_AIGC_MAIN);
+       if(NULL == ext) 
+               return ;
 
-       lv_aigc_ext_t * ext = mmi_aigc_actId_ext_get(ACT_ID_AIGC_MAIN);
-       if(NULL == ext)
-               return;
+       s_aigc_ui_state = MMI_AIGC_UI_STATE_LIST;
        
-       printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+       // ui
+       lv_obj_t * cont = ext->cont_list;
+       lv_obj_clean(cont);
        
-#if 1
-       mmi_aigc_list_set_slide_enable(&ext->old_ext, true);
-       mmi_aigc_list_msg_item_style_reset(ext);
-       if(NULL != ext->list) 
-       {
-               lv_obj_del(ext->list);
-               ext->list = NULL;
-       }
+       ext->list = mmi_aigc_list_create(cont);
+
+       lv_obj_t * imgbtn_cancel = lv_imgbtn_create(cont, NULL);
+       lv_imgbtn_set_src(imgbtn_cancel, LV_BTN_STATE_RELEASED, ICON_AIGC_CANCEL_BUTTON);
+       lv_imgbtn_set_src(imgbtn_cancel, LV_BTN_STATE_PRESSED, ICON_AIGC_CANCEL_BUTTON);
+       lv_obj_set_event_cb(imgbtn_cancel, mmi_aigc_cancel_button_event_cb);
+    lv_obj_add_protect(imgbtn_cancel, LV_PROTECT_PRESS_LOST);
+       lv_watch_obj_add_element(imgbtn_cancel);
+       lv_obj_align(imgbtn_cancel, NULL, LV_ALIGN_IN_BOTTOM_LEFT, 15, -20);
        
-       printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);   
+       lv_obj_t * imgbtn = lv_imgbtn_create(cont, NULL);
+       lv_imgbtn_set_src(imgbtn, LV_BTN_STATE_RELEASED, ICON_AIGC_RECORD_BUTTON_PRESSED);
+       lv_imgbtn_set_src(imgbtn, LV_BTN_STATE_PRESSED, ICON_AIGC_RECORD_BUTTON_PRESSED);
+       lv_obj_set_event_cb(imgbtn, mmi_aigc_record_button_event_cb);
+    lv_obj_add_protect(imgbtn, LV_PROTECT_PRESS_LOST);
+       lv_watch_obj_add_element(imgbtn);
+       lv_obj_align(imgbtn, NULL, LV_ALIGN_IN_BOTTOM_RIGHT, -15, -20);
+
+       lv_obj_t * imgbtn_label = lv_label_create(imgbtn, NULL);
+       lv_obj_add_style(imgbtn_label, LV_LABEL_PART_MAIN, &lv_watch_font26);
+       lv_label_set_align(imgbtn_label, LV_LABEL_ALIGN_CENTER);
+       lv_label_set_text_id(imgbtn_label, WATCH_TEXT_ID_AIGC_CONTINUE);
+       lv_obj_align(imgbtn_label, NULL, LV_ALIGN_CENTER, 0, 0);        
+
+       lv_obj_set_hidden(ext->cont_default, true);
+       lv_obj_set_hidden(ext->cont_listening, true);
+       lv_obj_set_hidden(ext->cont_thinking, true);
+       lv_obj_set_hidden(ext->cont_timeout, true);
+       lv_obj_set_hidden(ext->cont_list, false);
+}
+
+static void mmi_aigc_default_screen_display(void)
+{      
+       AIGC_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
        
-       uint8_t msg_count = mmi_aigc_info_count_get();
-       //mmi_aigc_list_create(ext->cont, ext);
-       if(0 == msg_count)
-       {
-               printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
-               if(NULL != s_aigc_item_info.msg_data_ptr)
-               {
-                       lv_mem_free(s_aigc_item_info.msg_data_ptr);
-                       s_aigc_item_info.msg_data_ptr = NULL;
-               }
-               s_aigc_item_info.msg_data_size = 0;
+       lv_aigc_ext_t * ext = (lv_aigc_ext_t *)mmi_aigc_actId_ext_get(ACT_ID_AIGC_MAIN);
+       if(NULL == ext) 
+               return ;
 
-               mmi_aigc_list_create(ext->cont, ext);
-       }
-       else
-       {
-               printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
-               
-               lv_obj_set_hidden(ext->label_no_msg, true);
-               mmi_aigc_list_create(ext->cont, ext);
-       }
+       s_aigc_ui_state = MMI_AIGC_UI_STATE_NONE;
 
-#else
+       // ui
+       lv_obj_t * cont = ext->cont_default;
+       
+       lv_obj_t * label_state = lv_label_create(cont, NULL);
+       lv_obj_add_style(label_state, LV_LABEL_PART_MAIN, &lv_watch_font20);
+       lv_label_set_text_id(label_state, WATCH_TEXT_ID_AIGC_ASSISTANT);
+       lv_label_set_align(label_state, LV_LABEL_ALIGN_CENTER);
+       lv_obj_align(label_state, NULL, LV_ALIGN_IN_TOP_MID, 0, 20);
+
+       lv_obj_t * img = lv_img_create(cont, NULL);
+       lv_img_set_src(img, ICON_AIGC_DEFAULT);
+       lv_obj_set_click(img, false);
+       lv_obj_align(img, NULL, LV_ALIGN_CENTER, 0, -10);
+
+       lv_obj_t * imgbtn = lv_imgbtn_create(cont, NULL);
+       lv_imgbtn_set_src(imgbtn, LV_BTN_STATE_RELEASED, ICON_AIGC_RECORD_BUTTON_DEFAULT);
+       lv_imgbtn_set_src(imgbtn, LV_BTN_STATE_PRESSED, ICON_AIGC_RECORD_BUTTON_DEFAULT);
+       lv_obj_set_event_cb(imgbtn, mmi_aigc_record_button_event_cb);
+    lv_obj_add_protect(imgbtn, LV_PROTECT_PRESS_LOST);
+       lv_watch_obj_add_element(imgbtn);
+       lv_obj_align(imgbtn, NULL, LV_ALIGN_IN_BOTTOM_MID, 0, -20);
+
+       lv_obj_t * imgbtn_label = lv_label_create(imgbtn, NULL);
+       lv_obj_add_style(imgbtn_label, LV_LABEL_PART_MAIN, &lv_watch_font26);
+       lv_label_set_align(imgbtn_label, LV_LABEL_ALIGN_CENTER);
+       lv_label_set_text_id(imgbtn_label, WATCH_TEXT_ID_AIGC_CONVERSATION);
+       lv_obj_align(imgbtn_label, NULL, LV_ALIGN_CENTER, 0, 0);                
+       
+       lv_obj_set_hidden(ext->cont_default, false);
+       lv_obj_set_hidden(ext->cont_listening, true);
+       lv_obj_set_hidden(ext->cont_thinking, true);
+       lv_obj_set_hidden(ext->cont_timeout, true);
+       lv_obj_set_hidden(ext->cont_list, true);
+}
 
-       mmi_aigc_list_set_slide_enable(&ext->old_ext, true);
+static void mmi_aigc_no_network_screen_display(lv_obj_t * obj)
+{      
+       AIGC_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+       
+       lv_aigc_ext_t * ext = (lv_aigc_ext_t *)mmi_aigc_actId_ext_get(ACT_ID_AIGC_MAIN);
+       if(NULL == ext) 
+               return ;
+
+       // ui
+       s_aigc_ui_state = MMI_AIGC_UI_STATE_OPEN_FAIL;
+       
+       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, NULL, LV_ALIGN_CENTER, 0, 0);
+       lv_obj_set_style_local_bg_color(cont, LV_CONT_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_BLACK);
+       lv_watch_obj_add_element(cont);
        
-       mmi_aigc_voice_item_playing_stop(ext);
+       //label
+       lv_obj_t * label_state = lv_label_create(cont, NULL);
+       lv_obj_add_style(label_state, LV_LABEL_PART_MAIN, &lv_watch_font20);
+       lv_label_set_text_id(label_state, WATCH_TEXT_ID_AIGC_ASSISTANT);
+       lv_label_set_align(label_state, LV_LABEL_ALIGN_CENTER);
+       lv_obj_align(label_state, NULL, LV_ALIGN_IN_TOP_MID, 0, 20);
        
-       mmi_aigc_list_msg_item_style_reset(ext);
-       if(NULL != ext->list) 
-       {
-               lv_obj_del(ext->list);
-               ext->list = NULL;
-       }
+       lv_obj_t * img = lv_img_create(cont, NULL);
+       lv_img_set_src(img, ICON_AIGC_PROMPT);
+       lv_obj_set_click(img, false);
+       lv_obj_align(img, NULL, LV_ALIGN_IN_TOP_MID, 0, 70);
+       
+       lv_obj_t * label = lv_label_create(cont, NULL);
+       lv_obj_add_style(label, LV_LABEL_PART_MAIN, &lv_watch_font20);
+       lv_label_set_text_id(label, WATCH_TEXT_ID_AIGC_OPEN_FAIL);
+       lv_label_set_align(label, LV_LABEL_ALIGN_CENTER);
+       lv_obj_align(label, img, LV_ALIGN_OUT_BOTTOM_MID, 0, 25);
+       
+       lv_obj_t * imgbtn = lv_imgbtn_create(cont, NULL);
+       lv_imgbtn_set_src(imgbtn, LV_BTN_STATE_RELEASED, ICON_AIGC_RECORD_BUTTON_PRESSED);
+       lv_imgbtn_set_src(imgbtn, LV_BTN_STATE_PRESSED, ICON_AIGC_RECORD_BUTTON_PRESSED);
+       lv_obj_set_event_cb(imgbtn, mmi_aigc_record_button_event_cb);
+       lv_obj_align(imgbtn, NULL, LV_ALIGN_IN_BOTTOM_MID, 0, -20);
+       
+       lv_obj_t * imgbtn_label = lv_label_create(imgbtn, NULL);
+       lv_obj_add_style(imgbtn_label, LV_LABEL_PART_MAIN, &lv_watch_font26);
+       lv_label_set_align(imgbtn_label, LV_LABEL_ALIGN_CENTER);
+       lv_label_set_text_id(imgbtn_label, WATCH_TEXT_ID_OK);
+       lv_obj_align(imgbtn_label, NULL, LV_ALIGN_CENTER, 0, 0);                
+}
 
+void mmi_aigc_main_screen_refresh(void)
+{
        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_aigc_ext_t * ext = mmi_aigc_actId_ext_get(ACT_ID_AIGC_MAIN);
+       if(NULL == ext)
+               return;
+       
+       mmi_aigc_list_set_slide_enable(&ext->old_ext, true);
+       mmi_aigc_list_msg_item_style_reset(ext);
+
+       if(NULL != ext->thinking_task_p)
        {
-               lv_obj_del(ext->delete_bg);
-               ext->delete_bg = NULL;
+               lv_task_del(ext->thinking_task_p);
+               ext->thinking_task_p = NULL;
        }
-       
-       printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);   
-       
-       uint8_t msg_count = mmi_aigc_info_count_get();
+               
+       uint8_t msg_count = mmi_aigc_msg_count_get();
+       //mmi_aigc_list_create(ext->cont, ext);
        if(0 == msg_count)
        {
-               
-               printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
-               
-               lv_obj_set_hidden(ext->label_no_msg, false);
+               AIGC_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+
+               mmi_aigc_default_screen_display();
        }
        else
        {
+               AIGC_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
                
-               printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
-               
-               lv_obj_set_hidden(ext->label_no_msg, true);
-               
-               mmi_aigc_list_create(ext->cont, ext);
+               mmi_aigc_list_screen_display();
        }
-#endif
 }
 
 lv_obj_t * mmi_aigc_main_create(lv_obj_t * activity_obj)
@@ -1493,75 +1684,80 @@ lv_obj_t * mmi_aigc_main_create(lv_obj_t * activity_obj)
        if(NULL == ext)
                return NULL;
 
-       ext->cont = NULL;
+       ext->cont_default = NULL;
+       ext->cont_listening = NULL;
+       ext->cont_thinking = NULL;
+       ext->cont_timeout = NULL;
+       ext->cont_list = NULL;
+
        ext->list = NULL;
        ext->record_buffer = NULL;
        ext->record_size = 0;
+       ext->thinking_task_p = NULL;
+       ext->gif_listening = NULL;
+       ext->gif_thinking = NULL;
 
-       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(0x00, 0x00, 0x00));
-       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())
+       s_aigc_ui_state = MMI_AIGC_UI_STATE_NONE;
+       
+    if(false == watch_modem_sim_present_check_req() // no sim
+               //|| (MMI_MODEM_SIGNAL_BAR_0 == watch_modem_get_signal_bar_req()) // no signal
+               //|| (false == watch_modem_sim_present_check_req()) // not activated
                )
     {
-               // no network
-               lv_obj_t * label = lv_label_create(cont, NULL);
-               lv_obj_add_style(label, LV_LABEL_PART_MAIN, &lv_watch_font26);
-               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(false == watch_modem_sim_present_check_req()) // Device not activated
-    {
-               // no permission
-               lv_obj_t * label = lv_label_create(cont, NULL);
-               lv_obj_add_style(label, LV_LABEL_PART_MAIN, &lv_watch_font26);
-               lv_label_set_text_id(label, WATCH_TEXT_ID_DEVICE_NOT_WEAR);
-               lv_label_set_align(label, LV_LABEL_ALIGN_CENTER);
-               lv_obj_align(label, cont, LV_ALIGN_CENTER, 0, -10);
+               mmi_aigc_no_network_screen_display(obj);
                
         return obj;
     }
 
-       //
-       s_debug_counter = 0;
-       mmi_aigc_websocket_app_start();
+       // websocket
+       mmi_aigc_trans_websocket_app_start();
+       mmi_aigc_chat_websocket_app_start();
+
+       // data task
+       mmi_aigc_data_task_create();
        watch_set_suspend_enable(false, ACT_ID_AIGC_MAIN, 0);
 
-       //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);
-       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_aigc_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_aigc_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_aigc_list_create(cont, ext);
-       }
+       // cont_default
+       lv_obj_t * cont_default = lv_cont_create(obj, NULL);
+       lv_obj_set_size(cont_default, lv_obj_get_width(obj), lv_obj_get_height(obj));
+       lv_obj_align(cont_default, NULL, LV_ALIGN_CENTER, 0, 0);
+       lv_obj_set_style_local_bg_color(cont_default, LV_CONT_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_BLACK);
+       lv_watch_obj_add_element(cont_default);
+       ext->cont_default = cont_default;
+
+       // cont_listening
+       lv_obj_t * cont_listening = lv_cont_create(obj, NULL);
+       lv_obj_set_size(cont_listening, lv_obj_get_width(obj), lv_obj_get_height(obj));
+       lv_obj_align(cont_listening, NULL, LV_ALIGN_CENTER, 0, 0);
+       lv_obj_set_style_local_bg_color(cont_listening, LV_CONT_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_BLACK);
+       lv_watch_obj_add_element(cont_listening);
+       ext->cont_listening = cont_listening;
+
+       // cont_thinking
+       lv_obj_t * cont_thinking = lv_cont_create(obj, NULL);
+       lv_obj_set_size(cont_thinking, lv_obj_get_width(obj), lv_obj_get_height(obj));
+       lv_obj_align(cont_thinking, NULL, LV_ALIGN_CENTER, 0, 0);
+       lv_obj_set_style_local_bg_color(cont_thinking, LV_CONT_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_BLACK);
+       lv_watch_obj_add_element(cont_thinking);
+       ext->cont_thinking = cont_thinking;
+
+       // cont_timeout
+       lv_obj_t * cont_timeout = lv_cont_create(obj, NULL);
+       lv_obj_set_size(cont_timeout, lv_obj_get_width(obj), lv_obj_get_height(obj));
+       lv_obj_align(cont_timeout, NULL, LV_ALIGN_CENTER, 0, 0);
+       lv_obj_set_style_local_bg_color(cont_timeout, LV_CONT_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_BLACK);
+       lv_watch_obj_add_element(cont_timeout);
+       ext->cont_timeout = cont_timeout;
+
+       // cont_list
+       lv_obj_t * cont_list = lv_cont_create(obj, NULL);
+       lv_obj_set_size(cont_list, lv_obj_get_width(obj), lv_obj_get_height(obj));
+       lv_obj_align(cont_list, NULL, LV_ALIGN_CENTER, 0, 0);
+       lv_obj_set_style_local_bg_color(cont_list, LV_CONT_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_BLACK);
+       lv_watch_obj_add_element(cont_list);
+       ext->cont_list = cont_list;
+
+       mmi_aigc_default_screen_display();
        
        return obj;
 }
@@ -1570,8 +1766,10 @@ void mmi_aigc_create_event_cb(lv_obj_t * btn, lv_event_t e)
 {
     if(LV_EVENT_CLICKED == e) 
        {
-               //
-               mmi_aigc_receive_item_info_clean();
+               // free resource
+               mmi_aigc_msg_data_clean();
+               mmi_aigc_tts_audio_ll_init();
+               mmi_aigc_tts_audio_ll_clean();
                
         lv_watch_png_cache_all_free();
         lv_obj_t * obj = mmi_aigc_main_create(NULL);
@@ -1580,3 +1778,4 @@ void mmi_aigc_create_event_cb(lv_obj_t * btn, lv_event_t e)
 }
 
 #endif
+
index fa627c0..b7ee5af 100644 (file)
@@ -29,57 +29,58 @@ extern "C" {
 #endif
 
 
+//#define MMI_AIGC_DEBUG_TO_FILE
+#ifdef MMI_AIGC_DEBUG_TO_FILE
+#define AIGC_RECV_TRANS_FILE "C:/aigc_trans.txt"
+#define AIGC_RECV_TRANS_RESULT_FILE "C:/aigc_trans_result.txt"
+#define AIGC_RECV_CHAT_FILE "C:/aigc_chat.txt"
+#define AIGC_RECV_CHAT_RESULT_FILE "C:/aigc_chat_result.txt"
+#define AIGC_RECV_TTS_FILE "C:/aigc_tts.txt"
+#define AIGC_SEND_TTS_TEXT_FILE "C:/aigc_tts_text.txt"
+#endif
+
+
+
 #define MMI_AIGC_AUDIO_FORMAT (3) // 7-pcm8; 3-amr
 //#define MMI_AIGC_AUDIO_FORMAT_STR    (".wav") // ".amr"
 
-//#define MMI_AIGC_DATA_AMR_HEAD_SIZE          (6)
-//#define MMI_AIGC_DATA_RECORD_DURATION_MAX            (15) // seconds
-//#define MMI_AIGC_DATA_RECORD_SIZE_MAX                (MMI_AIGC_DATA_RECORD_DURATION_MAX * HAL_AMR_BUFSIZE_PER_SECOND + MMI_AIGC_DATA_AMR_HEAD_SIZE)
-#define MMI_AIGC_DATA_WAV_HEAD_SIZE            (44)
+#if 1 // amr
+#define MMI_AIGC_DATA_RECORD_HEAD_SIZE         (6)
+#define MMI_AIGC_DATA_RECORD_DURATION_MAX              (60) // seconds
+#define MMI_AIGC_DATA_RECORD_SIZE_MAX          ((MMI_AIGC_DATA_RECORD_DURATION_MAX + 2) * HAL_AMR_BUFSIZE_PER_SECOND + MMI_AIGC_DATA_RECORD_HEAD_SIZE)
+#else // pcm
+#define MMI_AIGC_DATA_RECORD_HEAD_SIZE         (44)
 #define MMI_AIGC_DATA_RECORD_DURATION_MAX              (10) // seconds
-#define MMI_AIGC_DATA_RECORD_SIZE_MAX          (MMI_AIGC_DATA_RECORD_DURATION_MAX * 16000 + MMI_AIGC_DATA_WAV_HEAD_SIZE)
+#define MMI_AIGC_DATA_RECORD_SIZE_MAX          (MMI_AIGC_DATA_RECORD_DURATION_MAX * 16000 + MMI_AIGC_DATA_RECORD_HEAD_SIZE)
+#endif
 
-#define MMI_AIGC_CHAT_TIME_INTERVAL    (3 * 60) /*display the time of current chat msg if more than 3 mins from the previous chat msgs*/
+#define MMI_AIGC_TTS_AUDIO_PRI (AUDIO_CTRL_PRIORITY_2)
 
 
-//#define MMI_AIGC_MSG_NUM_MAX         (1)
+#define MMI_AIGC_MSG_NUM_MAX           (2)
 //#define MMI_AIGC_DATA_FILE_NAME_MAX  (64) // (LV_FS_MAX_PATH_LENGTH / 2)
 
 typedef struct
 {
-       //uint8_t msg_index;
-       //uint8_t msg_from;             // 0-slef; 1-other
-       //uint8_t unread_flag;  // 0-read; 1-unread
+       uint8_t msg_from;               // 0-slef; 1-other
     //hal_rtc_t msg_time;
-       //nv_wechat_msg_type_e msg_type;
-       uint32_t msg_data_size;
-       void * msg_data_ptr;
-       uint32_t msg_voice_data_size;
-       void * msg_voice_data_ptr;
-       //char msg_data_full_file_name[MMI_AIGC_DATA_FILE_NAME_MAX];
+       void * text_data_ptr;
+       uint32_t text_data_size;
+       void * audio_data_ptr;
+       uint32_t audio_data_size;
 } mmi_aigc_msg_item_info_t;
 
-//typedef struct
-//{
-//    uint8_t msg_count;
-//    mmi_aigc_msg_item_info_t msg_item[MMI_AIGC_MSG_NUM_MAX];
-//} mmi_aigc_msg_info_t;
-
-
 typedef struct
 {
-    lv_watch_obj_ext_t old_ext;
-       lv_obj_t * label_sending;
-       lv_obj_t * label_result;
-       lv_task_t * sending_screen_task_id;
-       lv_obj_t * gif_obj;
-} lv_aigc_sending_ext_t;
+    uint8_t msg_count;
+    mmi_aigc_msg_item_info_t msg_item[MMI_AIGC_MSG_NUM_MAX];
+} mmi_aigc_msg_info_t;
 
 typedef struct
 {
-    lv_watch_obj_ext_t old_ext;
-    lv_obj_t * label;
-} lv_aigc_recording_ext_t;
+       void * audio_data_ptr;
+       uint32_t audio_data_size;
+} mmi_aigc_tts_audio_ll_t;
 
 typedef struct
 {
@@ -103,20 +104,45 @@ typedef struct {
 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
 
        //TIMER_ID delete_timer_id;
+       lv_obj_t * cont_default;
+       lv_obj_t * cont_listening;
+       lv_obj_t * cont_thinking;
+       lv_obj_t * cont_timeout;
+       lv_obj_t * cont_list;
+       lv_obj_t * list; // chat list
 
     MCI_EVNET_T event;
        uint8_t * record_buffer;
        uint32_t record_size;
+
+       lv_task_t * thinking_task_p;
+       
+       gif_info_t * gif_listening;
+       gif_info_t * gif_thinking;      
 }lv_aigc_ext_t;
 
+typedef enum
+{
+       MMI_AIGC_UI_STATE_NONE,
+       MMI_AIGC_UI_STATE_OPEN_FAIL,
+       MMI_AIGC_UI_STATE_LISTENING,
+       MMI_AIGC_UI_STATE_THINKING,
+       MMI_AIGC_UI_STATE_CONNECT_TIMEOUT,
+       MMI_AIGC_UI_STATE_LIST,
+       
+       MMI_AIGC_UI_STATE_MAX
+}MMI_AIGC_UI_STATE_E;
+
+
+void mmi_ui_msg_update_aigc_recv_trans_text_stop(void);
+void mmi_ui_msg_update_aigc_recv_chat_text_stop(void);
+
 
+char * mmi_aigc_trans_result_text_get(uint32_t * data_len);
+bool mmi_aigc_trans_result_text_store(char * data_buff, uint32_t data_len);
+bool mmi_aigc_chat_result_text_store(char * data_buff, uint32_t data_len);
 void mmi_aigc_create_event_cb(lv_obj_t * btn, lv_event_t e);
 
 #endif 
index 633414c..03159e8 100644 (file)
@@ -15,7 +15,7 @@
 static uint16_t pedometer_goalsteps = 10000;
 
 #ifdef __MMI_PEDOMETER_STEP_AND_GOAL_STYLE__
-uint16_t pedometer_get_steps(void)
+uint32_t pedometer_get_steps(void)
 {
     return asl_pedometer_steps_get();
 }
@@ -260,63 +260,53 @@ static void mmi_step_goal_btn_event_cb(lv_obj_t * btn, lv_event_t e)
     }
 }
 
-lv_obj_t * pedometer_create(lv_obj_t * tileview, uint16_t id)
+lv_obj_t * mmi_step_goal_cont_create(lv_obj_t * tab, lv_obj_t * tileview)
 {
-    lv_obj_t * tab;
-    if(id == 0xFF) {
-        tab = tileview;
-    } else {
-        tab = launcher_tileview_add_tile(tileview, id);
-        LV_ASSERT_MEM(tab);
-        if(tab == NULL) return NULL;
-    }
-
-    lv_obj_t * cont = lv_cont_create(tab, NULL);
-    if(NULL == cont)
+       lv_obj_t * cont = lv_cont_create(tab, NULL);
+       if(NULL == cont)
                return NULL;
        lv_obj_set_size(cont, LV_HOR_RES, LV_VER_RES);
        lv_obj_set_style_local_bg_color(cont, LV_CONT_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_BLACK);
-    lv_tileview_add_element(tileview, cont);
-    lv_obj_set_click(cont, false);
+       lv_tileview_add_element(tileview, cont);
+       lv_obj_set_click(cont, false);
+
+#if USE_LV_WATCH_BODYINFO != 0
+       nv_watch_pedometer_setting_t pedo;
+       memset(&pedo, 0, sizeof(nv_watch_pedometer_setting_t));
+       bodyinfo_init(&pedo);
+       pedometer_set_goalsteps(pedo.goal);
+#endif
 
        //
-    lv_obj_t * cont_today = lv_watch_cont_create(cont, LV_LAYOUT_COLUMN_MID, &lv_style_transp_fit, lv_obj_get_width(cont));
-    lv_tileview_add_element(tileview, cont_today);
-    lv_obj_set_click(cont_today, false);
+       lv_obj_t * cont_today = lv_watch_cont_create(cont, LV_LAYOUT_COLUMN_MID, &lv_style_transp_fit, lv_obj_get_width(cont));
+       lv_tileview_add_element(tileview, cont_today);
+       lv_obj_set_click(cont_today, false);
 
-    lv_obj_t * label = lv_label_create(cont_today, NULL);
+       lv_obj_t * label = lv_label_create(cont_today, NULL);
 #ifdef USE_LV_WATCH_UI_466_466
        lv_obj_add_style(label, LV_LABEL_PART_MAIN, &lv_watch_font40);
 #else
        lv_obj_add_style(label, LV_LABEL_PART_MAIN, &lv_watch_font26);
 #endif
-    lv_label_set_text_id(label, WATCH_TEXT_ID_TODAY_STEP);
-    lv_obj_set_click(label, false);
-
-#if USE_LV_WATCH_BODYINFO != 0
-    nv_watch_pedometer_setting_t pedo;
-    memset(&pedo, 0, sizeof(nv_watch_pedometer_setting_t));
-    bodyinfo_init(&pedo);
-    pedometer_set_goalsteps(pedo.goal);
-#endif
+       lv_label_set_text_id(label, WATCH_TEXT_ID_TODAY_STEP);
+       lv_obj_set_click(label, false);
 
-    lv_obj_t * digital_content = digital_content_create(cont_today, pedometer_get_steps(), 1);
-
-    lv_obj_align(cont_today, NULL, LV_ALIGN_IN_TOP_MID, 0, LV_VER_RES / 6);
+       lv_obj_t * digital_content = digital_content_create(cont_today, pedometer_get_steps(), 1);
+       lv_obj_align(cont_today, NULL, LV_ALIGN_IN_TOP_MID, 0, LV_VER_RES / 6);
        
        //
-    lv_obj_t * cont_goal = lv_watch_cont_create(cont, LV_LAYOUT_COLUMN_MID, &lv_style_transp_fit, lv_obj_get_width(cont));
-    lv_tileview_add_element(tileview, cont_goal);
-    lv_obj_set_click(cont_goal, false);
+       lv_obj_t * cont_goal = lv_watch_cont_create(cont, LV_LAYOUT_COLUMN_MID, &lv_style_transp_fit, lv_obj_get_width(cont));
+       lv_tileview_add_element(tileview, cont_goal);
+       lv_obj_set_click(cont_goal, false);
        
-    label = lv_label_create(cont_goal, NULL);
+       label = lv_label_create(cont_goal, NULL);
 #ifdef USE_LV_WATCH_UI_466_466
        lv_obj_add_style(label, LV_LABEL_PART_MAIN, &lv_watch_font40);
 #else
        lv_obj_add_style(label, LV_LABEL_PART_MAIN, &lv_watch_font26);
 #endif
-    lv_label_set_text_id(label, WATCH_TEXT_ID_GOAL_STEP);
-    lv_obj_set_click(label, false);
+       lv_label_set_text_id(label, WATCH_TEXT_ID_GOAL_STEP);
+       lv_obj_set_click(label, false);
 
        lv_obj_t * btn_goal = lv_btn_create(cont_goal, NULL);
 #ifdef USE_LV_WATCH_UI_466_466
@@ -330,31 +320,55 @@ lv_obj_t * pedometer_create(lv_obj_t * tileview, uint16_t id)
        lv_obj_set_style_local_radius(btn_goal, LV_BTN_PART_MAIN, LV_STATE_PRESSED, 30);
        lv_obj_set_event_cb(btn_goal, mmi_step_goal_btn_event_cb);
        
-    label = lv_label_create(btn_goal, NULL);
+       label = lv_label_create(btn_goal, NULL);
 #ifdef USE_LV_WATCH_UI_466_466
        lv_obj_add_style(label, LV_LABEL_PART_MAIN, &lv_watch_font40);
 #else
        lv_obj_add_style(label, LV_LABEL_PART_MAIN, &lv_watch_font26);
 #endif
-    char str[10] = "";
-    snprintf(str, sizeof(str), "%d", pedometer_get_goalsteps());
-    lv_label_set_text(label, str);
-    lv_obj_set_click(label, false);
+       char str[10] = "";
+       snprintf(str, sizeof(str), "%d", pedometer_get_goalsteps());
+       lv_label_set_text(label, str);
+       lv_obj_set_click(label, false);
 
        lv_obj_align(cont_goal, NULL, LV_ALIGN_IN_BOTTOM_MID, 0, -LV_VER_RES / 8);
        
 #if USE_LV_WATCH_LAUNCHER != 0
-    lv_drop_pull_obj_ext_t * ext = launcher_get_pull_ext();
-    if(NULL != ext) 
+       lv_drop_pull_obj_ext_t * ext = launcher_get_pull_ext();
+       if(NULL != ext) 
        {
-        ext->pedometer_dot = NULL;
-        ext->pedometer_cont = digital_content;
-        ext->pedometer_goal = label;
-    }
+               ext->pedometer_dot = NULL;
+               ext->pedometer_cont = digital_content;
+               ext->pedometer_goal = label;
+       }
 #endif
+       
+       printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+       
+       return cont;
+}
 
-       s_step_cont_main = cont;
-       lv_obj_set_hidden(s_step_cont_main, false);
+lv_obj_t * pedometer_create(lv_obj_t * tileview, uint16_t id)
+{
+    lv_obj_t * tab;
+    if(id == 0xFF)
+       {
+        tab = tileview;
+    } 
+       else
+       {
+        tab = launcher_tileview_add_tile(tileview, id);
+        LV_ASSERT_MEM(tab);
+        if(tab == NULL)
+                       return NULL;
+    }
+
+       lv_obj_t * cont = mmi_step_goal_cont_create(tab, tileview);
+       if(NULL != cont)
+       {
+               s_step_cont_main = cont;
+               lv_obj_set_hidden(s_step_cont_main, false);
+       }
        
        lv_obj_t * cont_set = mmi_step_goal_set_cont_create(tab, tileview);
        if(NULL != cont_set)