temp
authorCCC <2393524978@qq.com>
Fri, 1 Dec 2023 08:34:35 +0000 (16:34 +0800)
committerCCC <2393524978@qq.com>
Fri, 1 Dec 2023 08:34:35 +0000 (16:34 +0800)
2.sdk/sdk/gui/lv_watch/lv_apps/custom_function/bei_ke_rui_sheng.c
2.sdk/sdk/gui/lv_watch/lv_apps/custom_function/bei_ke_rui_sheng.h
2.sdk/sdk/gui/lv_watch/lv_apps/custom_function/bei_ke_rui_sheng_data.c
2.sdk/sdk/gui/lv_watch/lv_apps/custom_function/bei_ke_rui_sheng_data.h
2.sdk/sdk/gui/lv_watch/lv_apps/custom_function/bei_ke_rui_sheng_socket.c

index 6f91782..ced170d 100644 (file)
@@ -32,6 +32,14 @@ static void mmi_ai_talk_receive_item_info_clean(void)
                s_ai_talk_item_info.msg_data_ptr = NULL;
                s_ai_talk_item_info.msg_data_size = 0;
        }
+
+       if(NULL != s_ai_talk_item_info.msg_voice_data_ptr)
+       {
+               printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+               lv_mem_free(s_ai_talk_item_info.msg_voice_data_ptr);
+               s_ai_talk_item_info.msg_voice_data_ptr = NULL;
+               s_ai_talk_item_info.msg_voice_data_size = 0;
+       }
 }
 
 uint8_t mmi_ai_talk_info_count_get(void)
@@ -50,86 +58,6 @@ uint8_t mmi_ai_talk_info_count_get(void)
        return msg_count;
 }
 
-uint8_t mmi_ai_talk_info_index_item_msg_from_get(uint8_t msg_index)
-{
-       // 0-slef; 1-other
-       uint8_t msg_from = 0;
-       
-       //msg_from = s_ai_talk_info->msg_item[msg_index].msg_from;
-
-       return msg_from;
-}
-
-void mmi_ai_talk_info_index_item_get(uint8_t msg_index, mmi_ai_talk_msg_item_info_t ** msg_item)
-{
-       //*msg_item = &(s_ai_talk_info->msg_item[msg_index]);
-}
-
-void mmi_ai_talk_info_index_item_delete(uint8_t msg_index)
-{
-#if 0
-       if(msg_index >= s_ai_talk_info->msg_count)
-               return;
-       
-       uint8_t i = 0;
-       uint32_t msg_item_info_size = sizeof(mmi_ai_talk_msg_item_info_t);
-       
-       lv_fs_remove(s_ai_talk_info->msg_item[msg_index].msg_data_full_file_name);
-       _lv_memset_00(&(s_ai_talk_info->msg_item[msg_index]), msg_item_info_size);
-
-       if(msg_index < s_ai_talk_info->msg_count - 1)
-       {
-               for(i = msg_index; i < s_ai_talk_info->msg_count; i++)
-               {
-                       _lv_memcpy(&(s_ai_talk_info->msg_item[i]), &(s_ai_talk_info->msg_item[i + 1]), msg_item_info_size);
-               }
-       }
-       s_ai_talk_info->msg_count--;
-#endif
-}
-
-void mmi_ai_talk_info_all_item_delete(void)
-{
-#if 0
-       uint8_t i = 0;
-       uint32_t msg_item_info_size = sizeof(mmi_ai_talk_msg_item_info_t);
-       
-       for(i = 0; i < s_ai_talk_info->msg_count; i++)
-       {
-               lv_fs_remove(s_ai_talk_info->msg_item[i].msg_data_full_file_name);
-               _lv_memset_00(&(s_ai_talk_info->msg_item[i]), msg_item_info_size);
-       }
-       s_ai_talk_info->msg_count = 0;
-#endif
-}
-
-void mmi_ai_talk_info_new_item_add(mmi_ai_talk_msg_item_info_t * msg_item)
-{
-#if 0
-       uint32_t msg_item_info_size = sizeof(mmi_ai_talk_msg_item_info_t);
-       
-       printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
-       
-       if(MMI_AI_TALK_MSG_NUM_MAX <= s_ai_talk_info->msg_count)
-       {
-               lv_fs_remove(s_ai_talk_info->msg_item[0].msg_data_full_file_name);
-               //_lv_memset_00(&(s_ai_talk_info->msg_item[0]), msg_item_info_size);
-
-               uint8_t i = 0;
-               for(i = 0; i < MMI_AI_TALK_MSG_NUM_MAX - 1; i++)
-               {
-                       _lv_memcpy(&(s_ai_talk_info->msg_item[i]), &(s_ai_talk_info->msg_item[i + 1]), msg_item_info_size);
-               }
-               s_ai_talk_info->msg_count--;
-       }
-
-       printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
-       
-       s_ai_talk_info->msg_count++;
-       _lv_memcpy(&(s_ai_talk_info->msg_item[s_ai_talk_info->msg_count - 1]), msg_item, msg_item_info_size);
-#endif
-}
-
 void * mmi_ai_talk_actId_ext_get(lv_watch_Activity_Id_t actId)
 {
        lv_obj_t * activity_obj = lv_watch_get_activity_obj(actId);
@@ -166,6 +94,9 @@ void mmi_ai_talk_prepare_destory(lv_obj_t * activity_obj)
 
        // close tcp
        mmi_ai_talk_tcp_disconnect_msg(NULL);
+
+       // free resource
+       mmi_ai_talk_data_receive_resource_clean();
        
     lv_watch_png_cache_all_free();
 
@@ -174,13 +105,7 @@ void mmi_ai_talk_prepare_destory(lv_obj_t * activity_obj)
                return ;
 
        printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
-       //if(NULL != ext->delete_timer_id)
-       //{
-       //      Hal_Timer_Stop(ext->delete_timer_id);
-       //      ext->delete_timer_id = NULL;
-       //}
 
-       //mmi_ai_talk_voice_item_playing_stop(ext);
        mmi_ai_talk_list_msg_item_style_reset(ext);
 
        // free buffer
@@ -329,108 +254,192 @@ void mmi_ai_talk_receive_update_ui(void)
        }
 }
 
-bool mmi_ai_talk_receive_from_server(char * data_buff, int data_buff_len, nv_wechat_msg_type_e type)
+bool mmi_ai_talk_model_answer_result_display(char * data_buff, int data_buff_len)
 {
        if(NULL == data_buff || 0 == data_buff_len)
        {
                printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
                return false;
        }
-       if(WECHAT_MSG_TYPE_MAX <= type)
-       {
-               printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
-               return false;
-       }
-       
-#if 1
 
        if(false == mmi_ai_talk_is_waiting_for_result())
        {
                printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
                return false;
        }
-       mmi_ai_talk_sending_screen_task_stop();
-       mmi_ai_talk_receive_item_info_clean();
 
-       uint32_t file_size = 0;
-       char * file_buf = NULL;
+       //mmi_ai_talk_sending_screen_task_stop();
 
-       file_size = data_buff_len;
-       file_buf = lv_mem_alloc(file_size + 1);
-       if(NULL == file_buf)
+       if(NULL != s_ai_talk_item_info.msg_data_ptr)
+       {
+               lv_mem_free(s_ai_talk_item_info.msg_data_ptr);
+               s_ai_talk_item_info.msg_data_ptr = NULL;
+       }
+       s_ai_talk_item_info.msg_data_ptr = lv_mem_alloc(data_buff_len + 1);
+       if(NULL == s_ai_talk_item_info.msg_data_ptr)
        {
                printf("[@CHENG_DEBUG][%s][%d]: alloc memory fail\n", __FUNCTION__, __LINE__);
                return false;
        }
-       _lv_memset_00(file_buf, file_size + 1);
-       _lv_memcpy(file_buf, data_buff, file_size);
-       s_ai_talk_item_info.msg_data_ptr = file_buf;
-       s_ai_talk_item_info.msg_data_size = file_size;
-       s_ai_talk_item_info.msg_type = type;
+       _lv_memset_00(s_ai_talk_item_info.msg_data_ptr, data_buff_len + 1);
+       _lv_memcpy(s_ai_talk_item_info.msg_data_ptr, data_buff, data_buff_len);
+       s_ai_talk_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_ai_talk_item_info.msg_data_size, s_ai_talk_item_info.msg_data_ptr);
 
-       // ui
-       mmi_watch_wake_up();
-       mmi_ui_msg_action_ai_talk_incoming();
-
        return true;
+}
 
-#else
 
-       mmi_ai_talk_msg_item_info_t mmi_ai_talk_item_info = {0};
+#define BEI_KE_DEBUG_FILE "C:/bei_ke_debug.txt"
+bool mmi_ai_talk_debug_info_write_to_file(char * path, char * info_buf, uint32_t info_size)
+{
+       lv_fs_file_t file_p;
+       lv_fs_res_t res;
+       uint32_t bytes_write = 0;
+
+       res = lv_fs_open(&file_p, path, LV_FS_MODE_WR | LV_FS_MODE_APPEND);
+       if(LV_FS_RES_OK != res) 
+       {
+               printf("[@CHENG_DEBUG][%s][%d]: errno=%d\n", __FUNCTION__, __LINE__, res);
+               lv_fs_close(&file_p);
+               return false;
+       }
+
        hal_rtc_t cur_time = {0};
-       char * t_file_ext[WECHAT_MSG_TYPE_MAX] = {AI_TALK_AUDIO_FORMAT_STR, "txt", "png", "png"}; // match nv_wechat_msg_type_e
+       char str_time[24] = {0};
        
        Hal_Rtc_Gettime(&cur_time);
-       _lv_memcpy(&(s_ai_talk_item_info.msg_time), &cur_time, sizeof(hal_rtc_t));
+       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;
+       }
        
-       s_ai_talk_item_info.msg_from = 1;
-       s_ai_talk_item_info.unread_flag = 1;
-       s_ai_talk_item_info.msg_type = type; // WECHAT_MSG_TYPE_VOICE;
-       s_ai_talk_item_info.msg_data_size = data_buff_len;
-       sprintf(s_ai_talk_item_info.msg_data_full_file_name, "C:/aitalk_r%04d%02d%02d_%02d%02d%02d.%s", /*WECHAT_MSG_DATA_FILE_PATH, */
-                       s_ai_talk_item_info.msg_time.tm_year,
-                       s_ai_talk_item_info.msg_time.tm_mon,
-                       s_ai_talk_item_info.msg_time.tm_mday,
-                       s_ai_talk_item_info.msg_time.tm_hour,
-                       s_ai_talk_item_info.msg_time.tm_min,
-                       s_ai_talk_item_info.msg_time.tm_sec,
-                       t_file_ext[type]);
+       res = lv_fs_write(&file_p, info_buf, info_size, &bytes_write);
+       lv_fs_close(&file_p);
+       if(LV_FS_RES_OK != res)
+       {
+               printf("[@CHENG_DEBUG][%s][%d]: errno=%d\n", __FUNCTION__, __LINE__, res);
+               return false;
+       }
+       printf("[@CHENG_DEBUG][%s][%d]: file_size=%d,write_size=%d\n", __FUNCTION__, __LINE__, info_size, bytes_write);
+
+       return true;
+}
+
+
+static void mmi_ai_talk_tts_info_result_play_over_cb(void * para)
+{
+       printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+       
+       if(NULL != s_ai_talk_item_info.msg_voice_data_ptr)
+       {
+               lv_mem_free(s_ai_talk_item_info.msg_voice_data_ptr);
+               s_ai_talk_item_info.msg_voice_data_ptr = NULL;
+       }
+       s_ai_talk_item_info.msg_voice_data_size = 0;
+}
+
+bool mmi_ai_talk_tts_info_result_display(char * data_buff, int data_buff_len)
+{
+       uint32_t output_len = 0;
 
-       if(false == mmi_ai_talk_item_info_write_to_file(s_ai_talk_item_info.msg_data_full_file_name, data_buff, data_buff_len))
+       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)
        {
                printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
                return false;
        }
 
-       lv_ai_talk_ext_t * ext = mmi_ai_talk_actId_ext_get(ACT_ID_AI_TALK);
-       if(NULL != ext) 
+       if(false == mmi_ai_talk_is_waiting_for_result())
        {
-               mmi_ai_talk_voice_item_playing_stop(ext);
+               printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+               return false;
        }
-       
-       mmi_ai_talk_info_new_item_add(&s_ai_talk_item_info);
+
+       mmi_ai_talk_sending_screen_task_stop();
 
        // ui
-       if(false == mmi_active_screen_is_prohibit_interrupted() 
-               && false == mmi_health_measure_state_is_ui_measure()
-//             && false == mmi_ai_talk_voice_is_playing() 
-               && false == mmi_ai_talk_voice_is_recording()
-               && false == mmi_ai_talk_item_is_sending()
-               #ifdef __MMI_ZHSX_SUPPORT_DO_NOT_DISTURB__
-               && false == mmi_watch_is_in_do_not_disturb_time()
-               #endif
-               )
+       mmi_watch_wake_up();
+       mmi_ui_msg_action_ai_talk_incoming();
+       
+       
+       if(NULL != s_ai_talk_item_info.msg_voice_data_ptr)
        {
-               printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
-               
-               mmi_watch_wake_up();
-               mmi_ui_msg_action_ai_talk_incoming();
+               lv_mem_free(s_ai_talk_item_info.msg_voice_data_ptr);
+               s_ai_talk_item_info.msg_voice_data_ptr = NULL;
        }
+       s_ai_talk_item_info.msg_voice_data_ptr = lv_mem_alloc(data_buff_len);
+       if(NULL == s_ai_talk_item_info.msg_voice_data_ptr)
+       {
+               printf("[@CHENG_DEBUG][%s][%d]: memory alloc fail\n", __FUNCTION__, __LINE__);
+               return false;
+       }
+       _lv_memset_00(s_ai_talk_item_info.msg_voice_data_ptr, data_buff_len);   
+       
+    if(0 != mbedtls_base64_decode(s_ai_talk_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_ai_talk_item_info.msg_voice_data_size = output_len;
 
-       return true;
+       printf("[@CHENG_DEBUG][%s][%d]: len1=%d,len2=%d\n", __FUNCTION__, __LINE__, data_buff_len, output_len);
+       //mmi_ai_talk_debug_info_write_to_file(BEI_KE_DEBUG_FILE, s_ai_talk_item_info.msg_voice_data_ptr, s_ai_talk_item_info.msg_voice_data_size);
+#if 1
+       char * info_buf = s_ai_talk_item_info.msg_voice_data_ptr;
+       uint32_t info_size = s_ai_talk_item_info.msg_voice_data_size;
+       {
+               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.wav", 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;
+               }
+       
+               res = lv_fs_write(&file_p, info_buf, info_size, &bytes_write);
+               lv_fs_close(&file_p);
+               if(LV_FS_RES_OK != res)
+               {
+                       printf("[@CHENG_DEBUG][%s][%d]: errno=%d\n", __FUNCTION__, __LINE__, res);
+                       return false;
+               }
+               printf("[@CHENG_DEBUG][%s][%d]: file_size=%d,write_size=%d\n", __FUNCTION__, __LINE__, info_size, bytes_write);
+       
+               return true;
+       }
 #endif
+
+
+       Hal_Tone_Play_Onetime((uint32_t *)s_ai_talk_item_info.msg_voice_data_ptr,
+                                                       s_ai_talk_item_info.msg_voice_data_size,
+                                                       query_current_volume(),
+                                                       mmi_ai_talk_tts_info_result_play_over_cb,
+                                                       NULL);  
+
+
+       return true;
 }
 
 bool mmi_ai_talk_send_to_server(void)
@@ -444,8 +453,6 @@ bool mmi_ai_talk_send_to_server(void)
                return false;
        }
 
-#if 20
-
        printf("[@CHENG_DEBUG][%s][%d]: size=%d, buf=0x%x\n", __FUNCTION__, __LINE__, ext->record_size, ext->record_buffer);
 
        uint32_t file_size = ext->record_size - s_ai_talk_recording_sent_size;
@@ -476,82 +483,6 @@ bool mmi_ai_talk_send_to_server(void)
        lv_mem_free(file_buf);
        s_ai_talk_recording_sent_size = 0;
 
-#else
-
-#if 10
-       printf("[@CHENG_DEBUG][%s][%d]: size=%d, buf=0x%x\n", __FUNCTION__, __LINE__, ext->record_size, ext->record_buffer);
-
-       uint32_t file_size = ext->record_size;
-    char * file_buf = lv_mem_alloc(file_size + 1);
-       if(NULL == file_buf || MMI_AI_TALK_DATA_WAV_HEAD_SIZE >= file_size)
-       {
-               printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
-               
-        lv_mem_free(ext->record_buffer);
-        ext->record_buffer = NULL;
-               ext->record_size = 0;
-        return false;
-    }
-       _lv_memset_00(file_buf, file_size + 1);
-       _lv_memcpy(file_buf, ext->record_buffer, file_size);
-
-       lv_mem_free(ext->record_buffer);
-       ext->record_buffer = NULL;
-
-#else
-
-       lv_mem_free(ext->record_buffer);
-       ext->record_buffer = NULL;
-
-
-       lv_fs_file_t file_p;
-       lv_fs_res_t res;
-       uint32_t file_size = 0, bytes_read = 0;
-       char * file_buf = NULL;
-       
-       res = lv_fs_open(&file_p, "C:/111.pcm", LV_FS_MODE_RD);
-       if(LV_FS_RES_OK != res) 
-       {
-               printf("[@CHENG_DEBUG][%s][%d]: errno=%d\n", __FUNCTION__, __LINE__, res);
-               lv_fs_close(&file_p);
-        return false;
-       }
-       
-       lv_fs_size(&file_p, &file_size);
-       file_buf = (char *)lv_mem_alloc(file_size + 1);
-       _lv_memset_00(file_buf, file_size + 1);
-       res = lv_fs_read(&file_p, file_buf, file_size, &bytes_read);
-       lv_fs_close(&file_p);
-       if(LV_FS_RES_OK != res)
-       {
-               printf("[@CHENG_DEBUG][%s][%d]: errno=%d\n", __FUNCTION__, __LINE__, res);
-               lv_mem_free(file_buf);
-        return false;
-       }
-       printf("[@CHENG_DEBUG][%s][%d]: %d,%d,%s\n", __FUNCTION__, __LINE__, file_size, bytes_read, file_buf);
-
-#endif
-
-       
-
-       if(true == mmi_ai_talk_item_info_write_to_file(s_ai_talk_item_info.msg_data_full_file_name, file_buf, file_size))
-       {
-               if(true == mmi_ai_talk_audio_data_send(file_buf, file_size))
-               {
-                       s_ai_talk_item_info.msg_data_size = file_size;
-                       mmi_ai_talk_info_new_item_add(&s_ai_talk_item_info);
-                       result = true;
-               }
-               else
-               {
-                       lv_fs_remove(s_ai_talk_item_info.msg_data_full_file_name);
-               }
-       }
-       
-       lv_mem_free(file_buf);
-       _lv_memset_00(&s_ai_talk_item_info, sizeof(mmi_ai_talk_msg_item_info_t));
-#endif
-
        return result;
 }
 
@@ -1009,6 +940,9 @@ void mmi_ai_talk_record_button_event_cb(lv_obj_t * obj, lv_event_t e)
             return;
         }
                
+               // free resource
+               mmi_ai_talk_data_receive_resource_clean();
+               
                mmi_ai_talk_list_set_slide_enable(&ext->old_ext, false); /*prevent to slide out while recording*/
                mmi_ai_talk_recording_screen_create(NULL);
     } 
@@ -1131,522 +1065,43 @@ void mmi_ai_talk_list_msg_item_style_reset(lv_ai_talk_ext_t * ext)
        lv_style_reset(&(list_page_ext->style_label_len_other));
 }
 
-void mmi_ai_talk_list_msg_item_time(char * time_str, hal_rtc_t * cur_time, hal_rtc_t * msg_time, hal_rtc_t * last_msg_time)
-{
-       printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
-       
-#if 0
-    if(0 == last_msg_time->tm_year) 
-       {
-        sprintf(time_str, "%d/%d/%d %02d:%02d", msg_time->tm_year, msg_time->tm_mon, msg_time->tm_mday, 
-                                       msg_time->tm_hour, msg_time->tm_min);
-               
-        return;
-    }
-       
-    uint32_t msg_sec = time_to_seconds(msg_time);
-    uint32_t last_msg_sec = time_to_seconds(last_msg_time);
-    if(msg_sec < last_msg_sec) 
-       {
-        sprintf(time_str, "%d/%d/%d %02d:%02d", msg_time->tm_year, msg_time->tm_mon,
-                                       msg_time->tm_mday, msg_time->tm_hour, msg_time->tm_min);
-    } 
-       else if(msg_sec > (last_msg_sec + MMI_AI_TALK_CHAT_TIME_INTERVAL)) 
-       {
-        uint32_t cur_sec = time_to_seconds(cur_time);
-        if((msg_sec > cur_sec) || (msg_time->tm_year < cur_time->tm_year)) 
-               {
-                       sprintf(time_str, "%d/%d/%d %02d:%02d", msg_time->tm_year, msg_time->tm_mon,
-                                               msg_time->tm_mday, msg_time->tm_hour, msg_time->tm_min);
-        } 
-               else 
-               {
-            uint32_t today_sec = cur_sec - cur_time->tm_hour * 3600 - cur_time->tm_min * 60 - cur_time->tm_sec;
-                       
-            if(msg_sec >= today_sec) 
-                       {
-                /*today*/
-                sprintf(time_str, "%02d:%02d", msg_time->tm_hour, msg_time->tm_min);
-            } 
-                       else if(msg_sec >= (today_sec - 24 * 3600)) 
-                       {
-                /*yesterday*/
-                const char * yesterday = lv_lang_get_text(WATCH_TEXT_ID_YESTERDAY);
-
-                sprintf(time_str, "%s %02d:%02d", yesterday, msg_time->tm_hour, msg_time->tm_min);
-            } 
-                       else 
-                       {
-                uint8_t wday;
-                if(0 == cur_time->tm_wday) 
-                               {
-                    /*today is Sunday*/
-                    wday = 6;
-                } 
-                               else 
-                {
-                    wday = cur_time->tm_wday - 1;
-                }
-                /*the start of a week is monday, the end is sunday*/
-                if(msg_sec >= (today_sec - wday * 24 * 3600)) {
-                    /*current week before yesterday*/
-                    const char * wday_str;
-                    switch(rtc_calc_weekday(msg_time)) 
-                                       {
-                           case 1:
-                               /*Monday*/
-                               wday_str = lv_lang_get_text(WATCH_TEXT_ID_MONDAY);
-                               break;
-                           case 2:
-                               /*Tuesday*/
-                               wday_str = lv_lang_get_text(WATCH_TEXT_ID_TUESDAY);
-                               break;
-                           case 3:
-                               /*Wednesday*/
-                               wday_str = lv_lang_get_text(WATCH_TEXT_ID_WEDNESDAY);
-                               break;
-                           case 4:
-                               /*Thursday*/
-                               wday_str = lv_lang_get_text(WATCH_TEXT_ID_THURSDAY);
-                               break;
-                           case 5:
-                               /*Friday*/
-                               wday_str = lv_lang_get_text(WATCH_TEXT_ID_FRIDAY);
-                               break;
-                           default:
-                               printf("%s: week error\n", __FUNCTION__);
-                               break;
-                    }
-                                       
-                    sprintf(time_str, "%s %02d:%02d", wday_str, msg_time->tm_hour, msg_time->tm_min);
-                }
-                               else 
-                               {
-                                       sprintf(time_str, "%d/%d %02d:%02d", msg_time->tm_mon, msg_time->tm_mday, msg_time->tm_hour, msg_time->tm_min);
-                }
-            }
-        }
-    }
-#endif
-}
-
-void mmi_ai_talk_list_voice_item_playing_anim_cb(lv_anim_t * a)
-{
-#if 0
-    lv_obj_t * play_img = (lv_obj_t *)a->var;
-       uint8_t msg_from = mmi_ai_talk_info_index_item_msg_from_get(s_ai_talk_selected_item_index);
-
-       printf("[@CHENG_DEBUG][%s][%d]: msg_from=%d\n", __FUNCTION__, __LINE__, msg_from);
-       
-       switch(s_ai_talk_play_anim_count % 3)
-       {
-               case 0:
-                       lv_img_set_src(play_img, ((0 == msg_from) ? ICON_WECHAT_MY_VOICE_ITEM_PLAYING1 : ICON_WECHAT_OTHER_VOICE_ITEM_PLAYING1));
-                       break;
-
-               case 1:
-                       lv_img_set_src(play_img, ((0 == msg_from) ? ICON_WECHAT_MY_VOICE_ITEM_PLAYING2 : ICON_WECHAT_OTHER_VOICE_ITEM_PLAYING2));
-                       break;
-
-               case 2:
-                       lv_img_set_src(play_img, ((0 == msg_from) ? ICON_WECHAT_MY_VOICE_ITEM_PLAYING3 : ICON_WECHAT_OTHER_VOICE_ITEM_PLAYING3));
-                       break;
-
-               default:
-                       break;
-       }
-       s_ai_talk_play_anim_count++;
-#endif
-}
-
-void mmi_ai_talk_list_voice_item_playing_audio_ctrl_callback(AUDIO_CTRL_PRIORITY priority)
-{
-       printf("[@CHENG_DEBUG][%s][%d]: priority=%d\n", __FUNCTION__, __LINE__, priority);
-       
-#if 0
-    if(AUDIO_CTRL_PRIORITY_5 == priority)
-    {
-        if(false == watch_is_ready()) 
-               {
-                       printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
-            return;
-        }
-    }
-    else if(AUDIO_CTRL_PRIORITY_5 > priority)
-    {
-               lv_ai_talk_ext_t * ext = mmi_ai_talk_actId_ext_get(ACT_ID_AI_TALK);
-               if(NULL != ext)
-               {
-                       mmi_ai_talk_voice_item_playing_stop(ext);
-               }
-    }
-#endif
-}
-
-void mmi_ai_talk_list_voice_item_play_over_cb(void * para)
-{
-       printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
-       
-#if 0
-    Hal_File_Play_End();
-    Hal_Audio_Manage_End_Ind(AUDIO_CTRL_PRIORITY_5);
-       
-       lv_ai_talk_list_ext_t * list_page_ext = (lv_ai_talk_list_ext_t *)para;
-    if(NULL == list_page_ext || NULL == list_page_ext->voice_playing_anim.var) 
-       {
-               printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
-               return;
-    }
-       mmi_ai_talk_voice_item_reset_play_state(list_page_ext);   
-#endif
-}
-
-void mmi_ai_talk_list_voice_item_play_action(lv_ai_talk_list_ext_t * list_page_ext, lv_obj_t * play_img, lv_obj_t * unread_img)
-{
-       printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
-       
-#if 0
-       //display ui
-       lv_anim_t * a = &(list_page_ext->voice_playing_anim);
-
-       lv_anim_init(a);
-       lv_anim_set_var(a, play_img);
-       lv_anim_set_start_cb(a, (lv_anim_ready_cb_t)mmi_ai_talk_list_voice_item_playing_anim_cb);
-       lv_anim_set_repeat_count(a, LV_ANIM_REPEAT_INFINITE);
-       lv_anim_set_time(a, 400);
-       lv_anim_start(a);
-       s_ai_talk_play_anim_count = 1;
-
-       mmi_ai_talk_msg_item_info_t * msg_item = NULL;
-       mmi_ai_talk_info_index_item_get(s_ai_talk_selected_item_index, &msg_item);
-       msg_item->unread_flag = 0;
-       if(NULL != unread_img) 
-       {
-               lv_obj_del(unread_img);
-               unread_img = NULL;
-       }
-       list_page_ext->voice_playing_msg_from = msg_item->msg_from;
-
-       //play voice
-       if(AUDIO_CTRL_PRIORITY_5 == Hal_Audio_Manage_Start_Req(AUDIO_CTRL_PRIORITY_5, mmi_ai_talk_list_voice_item_playing_audio_ctrl_callback))
-       {
-               printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
-               Hal_File_Play_Onetime(msg_item->msg_data_full_file_name, query_current_volume(), mmi_ai_talk_list_voice_item_play_over_cb, list_page_ext, 0);
-       }
-#endif
-}
-
-void mmi_ai_talk_list_voice_item_event_cb(lv_obj_t * cont, lv_event_t e)
-{
-#if 0
-       lv_ai_talk_list_item_ext_t * list_item_ext = (lv_ai_talk_list_item_ext_t *)lv_obj_get_ext_attr(cont);
-       if(NULL == list_item_ext)
-               return;
-
-       s_ai_talk_selected_item_index = list_item_ext->item_index;
-       
-    lv_obj_t * scrl = lv_obj_get_parent(cont);
-    lv_obj_t * list_page = lv_obj_get_parent(scrl);
-       //lv_obj_t * scrl = lv_page_get_scrl(list_page);
-       
-    lv_ai_talk_list_ext_t * list_page_ext = (lv_ai_talk_list_ext_t *)lv_obj_get_ext_attr(list_page);
-       if(NULL == list_page_ext)
-               return;
-   
-       if(LV_EVENT_PRESSED == e)
-       {
-               list_page_ext->pressing = true;
-       }
-       else if((LV_EVENT_LONG_PRESSED == e) && (true == list_page_ext->pressing)) // delete msg item
-       {
-               list_page_ext->pressing = false;
-
-               mmi_ai_talk_list_msg_item_delete_create();      
-       }
-       else if((LV_EVENT_CLICKED == e) && (true == list_page_ext->pressing)) // playing voice msg
-       {
-               list_page_ext->pressing = false;
-               
-               mmi_ai_talk_msg_item_info_t * msg_item = NULL;
-               mmi_ai_talk_info_index_item_get(s_ai_talk_selected_item_index, &msg_item);
-
-               if(0 != msg_item->msg_data_size)
-               {
-               if(NULL != list_page_ext->voice_playing_anim.var) // exist voice playing
-                       {
-                               printf("[@CHENG_DEBUG][%s][%d]: index=%d\n", __FUNCTION__, __LINE__, list_item_ext->item_index);
-
-                               //stop item voice
-                               Hal_File_Play_End();
-                               Hal_Audio_Manage_End_Ind(AUDIO_CTRL_PRIORITY_5);
-                               mmi_ai_talk_voice_item_reset_play_state(list_page_ext);
-               }
-                       else if(NULL != msg_item->msg_data_full_file_name) 
-                       {
-                               printf("[@CHENG_DEBUG][%s][%d]: index=%d\n", __FUNCTION__, __LINE__, list_item_ext->item_index);
-                               
-                               lv_obj_t * play_img = lv_obj_get_child_back(cont, NULL);
-                               mmi_ai_talk_list_voice_item_play_action(list_page_ext, play_img, ((1 == msg_item->unread_flag) ? list_item_ext->unread_img : NULL));
-               }               
-               }
-    }
-#endif
-}
-
-void mmi_ai_talk_list_text_item_event_cb(lv_obj_t * cont, lv_event_t e)
-{
-#if 0
-       lv_ai_talk_list_item_ext_t * list_item_ext = (lv_ai_talk_list_item_ext_t *)lv_obj_get_ext_attr(cont);
-       if(NULL == list_item_ext)
-               return;
-
-       s_ai_talk_selected_item_index = list_item_ext->item_index;
-       
-    lv_obj_t * scrl = lv_obj_get_parent(cont);
-    lv_obj_t * list_page = lv_obj_get_parent(scrl);
-       //lv_obj_t * scrl = lv_page_get_scrl(list_page);
-       
-    lv_ai_talk_list_ext_t * list_page_ext = (lv_ai_talk_list_ext_t *)lv_obj_get_ext_attr(list_page);
-       if(NULL == list_page_ext)
-               return;
-   
-       if(LV_EVENT_PRESSED == e)
-       {
-               list_page_ext->pressing = true;
-       }
-       else if((LV_EVENT_LONG_PRESSED == e) && (true == list_page_ext->pressing)) // delete msg item
-       {
-               list_page_ext->pressing = false;
-
-               mmi_ai_talk_list_msg_item_delete_create();      
-       }
-       else if((LV_EVENT_CLICKED == e) && (true == list_page_ext->pressing)) // display text msg
-       {
-               list_page_ext->pressing = false;
-    }
-#endif
-}
-
 //display time & content
 lv_obj_t * mmi_ai_talk_list_msg_item_add(lv_obj_t * list_page, mmi_ai_talk_msg_item_info_t * msg_item, char * time_str, uint8_t i)
 {
        printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
        
        lv_obj_t * obj = NULL;
-       lv_ai_talk_list_item_ext_t * list_item_ext = NULL;
        lv_ai_talk_list_ext_t * list_page_ext = lv_obj_get_ext_attr(list_page);
        lv_obj_t * scrl = lv_page_get_scrl(list_page);
-       lv_obj_t * last_obj = lv_obj_get_child(scrl, NULL);
        lv_coord_t obj_y = 0;
        
-       #if 1
        obj_y = lv_obj_get_style_pad_inner(scrl, LV_STATE_DEFAULT);
-       #else
-       if(NULL != last_obj) 
-       {
-               obj_y = lv_obj_get_y(last_obj) + lv_obj_get_height(last_obj) + lv_obj_get_style_pad_inner(scrl, LV_STATE_DEFAULT);
-       }
-       else
-       {
-               obj_y = lv_obj_get_style_pad_top(scrl, LV_STATE_DEFAULT);
-       }
-       
-       if(0 != strlen(time_str))
-       {
-               obj = lv_label_create(list_page, NULL);
-
-               //lv_obj_set_base_dir(obj, LV_BIDI_DIR_LTR);
-               lv_label_set_text(obj, time_str);
-               lv_obj_add_style(obj, LV_LABEL_PART_MAIN, &list_page_ext->style_label_time);
-               lv_obj_align(obj, scrl, LV_ALIGN_IN_TOP_MID, 0, obj_y);
-
-               last_obj = obj;
-               obj_y = lv_obj_get_y(last_obj) + lv_obj_get_height(last_obj) + lv_obj_get_style_pad_inner(scrl, LV_STATE_DEFAULT);
-       }
-       
-       printf("[@CHENG_DEBUG][%s][%d]: msg_type=%d,file=%s,size=%d,obj_y=%d\n", __FUNCTION__, __LINE__, 
-                                       msg_item->msg_type, msg_item->msg_data_full_file_name, msg_item->msg_data_size, obj_y);
-       #endif
-       printf("[@CHENG_DEBUG][%s][%d]: msg_type=%d,obj_y=%d,size=%d,buf=0x%x\n", __FUNCTION__, __LINE__, 
-                                       msg_item->msg_type, obj_y, msg_item->msg_data_size, msg_item->msg_data_ptr);
-       
-       switch(msg_item->msg_type)
-       {
-               case WECHAT_MSG_TYPE_VOICE:
-                       #if 0
-                       lv_obj_t * unread_img = lv_img_create(list_page, NULL);
-                       //obj = lv_img_create(list_page, NULL);
-                       obj = lv_cont_create(list_page, NULL);
-                       list_item_ext = lv_obj_allocate_ext_attr(obj, sizeof(lv_ai_talk_list_item_ext_t));
-                       list_item_ext->item_index = i;
-                       list_item_ext->unread_img = NULL;
-                   lv_obj_set_size(obj, LV_HOR_RES * 2 / 3, 50);
-                       lv_cont_set_fit4(obj, LV_FIT_NONE, LV_FIT_NONE, LV_FIT_NONE, LV_FIT_TIGHT);
-                       
-                       lv_obj_t * play_img = lv_img_create(obj, NULL);
-                       lv_obj_t * len_label = lv_label_create(obj, NULL);
-                       uint32_t duration = 0;
-
-                       if(LV_FS_RES_OK != Hal_File_Get_AudioDurationTime((const char *)msg_item->msg_data_full_file_name, &duration)) 
-                       {
-                               printf("[@CHENG_DEBUG][%s][%d]: read file error. %s\n", __FUNCTION__, __LINE__, msg_item->msg_data_full_file_name);
-                       } 
-                       else 
-                       {
-                               duration = (duration + 999) / 1000;
-                       }
-                       
-                       if(0 == duration) 
-                       {
-                               /*invalid voice*/
-                               lv_img_set_src(play_img, ICON_WECHAT_VOICE_ITEM_DAMAGE);
-                               lv_label_set_text(len_label, "");
-                       } 
-                       else 
-                       {
-                               char len_str[8] = {0};
-
-                               if(MMI_AI_TALK_DATA_RECORD_DURATION_MAX < duration)
-                                       duration = MMI_AI_TALK_DATA_RECORD_DURATION_MAX;
-                               
-                               sprintf(len_str, "%d\"", duration);
-                               lv_label_set_text(len_label, len_str);
-                       }
-
-                       if(0 == msg_item->msg_from) // msg from slef
-                       {
-                               lv_obj_add_style(len_label, LV_LABEL_PART_MAIN, &list_page_ext->style_label_len_self);
-                               //lv_img_set_src(obj, ICON_WECHAT_MY_VOICE_ITEM_BG);
-                               lv_obj_add_style(obj, LV_CONT_PART_MAIN, &(list_page_ext->style_cont_self));
-                               lv_obj_align(obj, scrl, LV_ALIGN_IN_TOP_RIGHT, -10, obj_y);
-                               if(0 < duration) 
-                               {
-                                       lv_img_set_src(play_img, ICON_WECHAT_MY_VOICE_ITEM_PLAYING3);
-                               }
-                               lv_obj_align(play_img, obj, LV_ALIGN_IN_LEFT_MID, 15, 0);
-                               lv_obj_align(len_label, play_img, LV_ALIGN_OUT_RIGHT_MID, 10, 0);
-                               lv_obj_del(unread_img);
-                       }
-                       else // msg from other
-                       {
-                               lv_obj_add_style(len_label, LV_LABEL_PART_MAIN, &list_page_ext->style_label_len_other);
-                               //lv_img_set_src(obj, ICON_WECHAT_OTHER_VOICE_ITEM_BG);
-                               lv_obj_add_style(obj, LV_CONT_PART_MAIN, &(list_page_ext->style_cont_other));
-                               lv_obj_align(obj, scrl, LV_ALIGN_IN_TOP_LEFT, 10, obj_y);
-                               if(0 < duration) 
-                               {
-                                       lv_img_set_src(play_img, ICON_WECHAT_OTHER_VOICE_ITEM_PLAYING3);
-                               }
-                               lv_obj_align(play_img, obj, LV_ALIGN_IN_RIGHT_MID, -15, 0);
-                               lv_obj_align(len_label, play_img, LV_ALIGN_OUT_LEFT_MID, -10, 0);
-                               if(1 == msg_item->unread_flag) 
-                               {
-                                       lv_img_set_src(unread_img, ICON_WECHAT_UNREAD_FLAG);
-                                       lv_obj_align(unread_img, obj, LV_ALIGN_OUT_RIGHT_MID, 5, 0);
-                                       list_item_ext->unread_img = unread_img;
-                               }
-                               else
-                               {
-                                       lv_obj_del(unread_img);
-                               }
-                       }
-                       
-                       lv_obj_set_click(obj, true);
-                       lv_obj_set_event_cb(obj, mmi_ai_talk_list_voice_item_event_cb);
-                       lv_obj_set_adv_hittest(obj, false);
-                       lv_page_focus(list_page, obj, 0);
-                       lv_page_glue_obj(obj, true);
-                       lv_watch_obj_add_element(obj);
-                       #endif
-                       break;
-                       
-               case WECHAT_MSG_TYPE_TEXT:
-                       obj = lv_cont_create(list_page, NULL);
-                       #if 0
-                       list_item_ext = lv_obj_allocate_ext_attr(obj, sizeof(lv_ai_talk_list_item_ext_t));
-                       list_item_ext->item_index = i;
-                       list_item_ext->unread_img = NULL;
-                       #endif
-                       #if 1
-                   lv_obj_set_size(obj, LV_HOR_RES - 30, 50); //lv_obj_set_size(obj, 153, 53); // same with voice item
-                       lv_cont_set_fit4(obj, LV_FIT_NONE, LV_FIT_NONE, LV_FIT_NONE, LV_FIT_TIGHT);
-                       //lv_cont_set_layout(obj, LV_LAYOUT_COLUMN_LEFT);
-                       lv_obj_add_style(obj, LV_CONT_PART_MAIN, &(list_page_ext->style_cont_other));
-                       lv_obj_align(obj, scrl, LV_ALIGN_IN_TOP_MID, 0, obj_y);                 
-                       #else
-                   lv_obj_set_size(obj, LV_HOR_RES * 2 / 3, 50); //lv_obj_set_size(obj, 153, 53); // same with voice item
-                       lv_cont_set_fit4(obj, LV_FIT_NONE, LV_FIT_NONE, LV_FIT_NONE, LV_FIT_TIGHT);
-                       //lv_cont_set_layout(obj, LV_LAYOUT_COLUMN_LEFT);
-                       lv_obj_add_style(obj, LV_CONT_PART_MAIN, &(list_page_ext->style_cont_other));
-                       lv_obj_align(obj, scrl, LV_ALIGN_IN_TOP_LEFT, 10, obj_y);                       
-                       #endif
-
-                       #if 1
-                       uint32_t file_size = msg_item->msg_data_size;
-                       char * file_buf = msg_item->msg_data_ptr;
-                       
-                       #else
-                       lv_fs_file_t file_p;
-                       lv_fs_res_t res;
-                       uint32_t file_size = 0, bytes_read = 0;
-                       char * file_buf = NULL;
-                       
-                       res = lv_fs_open(&file_p, msg_item->msg_data_full_file_name, LV_FS_MODE_RD);
-                       if(LV_FS_RES_OK != res) 
-                       {
-                               printf("[@CHENG_DEBUG][%s][%d]: errno=%d\n", __FUNCTION__, __LINE__, res);
-                               lv_fs_close(&file_p);
-                               break;
-                       }
-                       
-                       lv_fs_size(&file_p, &file_size);
-                       file_buf = (char *)lv_mem_alloc(file_size + 1);
-                       _lv_memset_00(file_buf, file_size + 1);
-                       res = lv_fs_read(&file_p, file_buf, file_size, &bytes_read);
-                       lv_fs_close(&file_p);
-                       if(LV_FS_RES_OK != res)
-                       {
-                               printf("[@CHENG_DEBUG][%s][%d]: errno=%d\n", __FUNCTION__, __LINE__, res);
-                               lv_mem_free(file_buf);
-                               break;
-                       }
-                       printf("[@CHENG_DEBUG][%s][%d]: %d,%d,%s\n", __FUNCTION__, __LINE__, file_size, bytes_read, file_buf);
-                       #endif
-                       
-                       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);
-
-                       #if 1
-                       lv_obj_set_click(obj, false);
-                       #else
-                       lv_obj_set_click(obj, true);
-                       lv_obj_set_event_cb(obj, mmi_ai_talk_list_text_item_event_cb);
-                       #endif
-                       lv_obj_set_adv_hittest(obj, false);
-                       lv_page_focus(list_page, obj, 0);
-                       lv_page_glue_obj(obj, true);
-                       lv_watch_obj_add_element(obj);
-                       
-                       //lv_mem_free(file_buf);
-                       break;
-                       
-               case WECHAT_MSG_TYPE_EXPRESSION:
-               case WECHAT_MSG_TYPE_IMAGE:
-                       #if 0
-                       obj = lv_img_create(list, NULL);
-
-                       lv_watch_obj_add_element(obj);
-                       #endif
-                       break;
-
-               default:
-                       break;
-       }
+       printf("[@CHENG_DEBUG][%s][%d]: obj_y=%d,size=%d,buf=0x%x\n", __FUNCTION__, __LINE__, 
+                                       obj_y, msg_item->msg_data_size, msg_item->msg_data_ptr);
+       
+       obj = lv_cont_create(list_page, NULL);
+    lv_obj_set_size(obj, LV_HOR_RES - 30, 50); //lv_obj_set_size(obj, 153, 53); // same with voice item
+       lv_cont_set_fit4(obj, LV_FIT_NONE, LV_FIT_NONE, LV_FIT_NONE, LV_FIT_TIGHT);
+       //lv_cont_set_layout(obj, LV_LAYOUT_COLUMN_LEFT);
+       lv_obj_add_style(obj, LV_CONT_PART_MAIN, &(list_page_ext->style_cont_other));
+       lv_obj_align(obj, scrl, LV_ALIGN_IN_TOP_MID, 0, obj_y);                 
+
+       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_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_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;
 }
@@ -1742,31 +1197,8 @@ void mmi_ai_talk_list_create(lv_obj_t * obj, lv_ai_talk_ext_t * ext)
        list_page_ext->pressing = false;
        ext->list = list_page;
 
-       #if 1
        mmi_ai_talk_msg_item_info_t * msg_item = &s_ai_talk_item_info;
        mmi_ai_talk_list_msg_item_add(list_page, msg_item, NULL, 0);
-       #else
-       
-       uint8_t i = 0;
-       uint8_t msg_count = mmi_ai_talk_info_count_get();
-    hal_rtc_t cur_time = {0}, last_msg_item_time = {0}, msg_time = {0};
-       
-    Hal_Rtc_Gettime(&cur_time);        
-       for(i = 0; i < msg_count; i++)
-       {
-               printf("[@CHENG_DEBUG][%s][%d]: i=%d, msg_count=%d\n", __FUNCTION__, __LINE__, i, msg_count);
-               
-               char time_str[32] = {0};
-               mmi_ai_talk_msg_item_info_t * msg_item = NULL;
-
-               mmi_ai_talk_info_index_item_get(i, &msg_item);
-               _lv_memcpy(&msg_time, &(msg_item->msg_time), sizeof(hal_rtc_t));
-               mmi_ai_talk_list_msg_item_time(time_str, &cur_time, &msg_time, &last_msg_item_time);            
-               _lv_memcpy(&last_msg_item_time, &(msg_item->msg_time), sizeof(hal_rtc_t));
-
-               mmi_ai_talk_list_msg_item_add(list_page, msg_item, time_str, i);
-       }
-       #endif
 
        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))
        {
@@ -1909,21 +1341,6 @@ lv_obj_t * mmi_ai_talk_create(lv_obj_t * activity_obj)
                
         return obj;
     }
-/*
-    else if(true != mmi_watch_tcp_connect_state_get()
-                       || true != mmi_protocol_watch_bind_state_get()
-                       )
-    {
-               // not bind
-               lv_obj_t * label = lv_label_create(cont, NULL);
-               lv_obj_add_style(label, LV_LABEL_PART_MAIN, &lv_watch_font26_black);
-               lv_label_set_text_id(label, WATCH_TEXT_ID_DEVICE_NOT_BIND);
-               lv_label_set_align(label, LV_LABEL_ALIGN_CENTER);
-               lv_obj_align(label, cont, LV_ALIGN_CENTER, 0, -10);
-               
-        return obj;
-    }
-*/
 
        //create no msg label
        ext->label_no_msg = lv_label_create(cont, NULL);
index 7022e71..7d544da 100644 (file)
@@ -23,7 +23,7 @@ extern "C" {
 //#define MMI_AI_TALK_DATA_RECORD_DURATION_MAX         (15) // seconds
 //#define MMI_AI_TALK_DATA_RECORD_SIZE_MAX             (MMI_AI_TALK_DATA_RECORD_DURATION_MAX * HAL_AMR_BUFSIZE_PER_SECOND + MMI_AI_TALK_DATA_AMR_HEAD_SIZE)
 #define MMI_AI_TALK_DATA_WAV_HEAD_SIZE         (44)
-#define MMI_AI_TALK_DATA_RECORD_DURATION_MAX           (10) // seconds
+#define MMI_AI_TALK_DATA_RECORD_DURATION_MAX           (8) // seconds
 #define MMI_AI_TALK_DATA_RECORD_SIZE_MAX               (MMI_AI_TALK_DATA_RECORD_DURATION_MAX * 16000 + MMI_AI_TALK_DATA_WAV_HEAD_SIZE)
 
 #define MMI_AI_TALK_CHAT_TIME_INTERVAL (3 * 60) /*display the time of current chat msg if more than 3 mins from the previous chat msgs*/
@@ -38,9 +38,11 @@ typedef struct
        //uint8_t msg_from;             // 0-slef; 1-other
        //uint8_t unread_flag;  // 0-read; 1-unread
     //hal_rtc_t msg_time;
-       nv_wechat_msg_type_e msg_type;
+       //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_AI_TALK_DATA_FILE_NAME_MAX];
 } mmi_ai_talk_msg_item_info_t;
 
index 5619b81..5f7c68c 100644 (file)
@@ -9,6 +9,10 @@
 #include "hal/dm/cJSON.h"
 
 
+// for debug
+// #define MMI_AI_TALK_DEBUG_TO_FILE
+
+
 static void * s_ai_talk_send_space_ptr[MMI_AI_TALK_ACTION_MAX] = {NULL};
 static uint32_t s_ai_talk_send_space_size[MMI_AI_TALK_ACTION_MAX] = {0};
 
@@ -65,8 +69,8 @@ static bool mm_ai_talk_send_action(MMI_AI_TALK_ACTION_CMD_E action_cmd, unsigned
 }
 
 
-// signatureÉú³ÉÂß¼­£º¶Ôsecret_idºÍtimestampÒÔ¡°&&¡±½øÐÐÆ´½Ó³É×Ö·û´®£¬ÔÚÒÔhmacsha1Ϊ¼ÓÃÜ·½·¨£¬
-// ÒÔapi_keyΪhmacsha1µÄkey¶ÔÉÏÃæÆ´½Ó¶ø³ÉµÄ×Ö·û´®½øÐмÓÃܼ´¿ÉµÃ¡£
+// signature�����߼�����secret_id��timestamp�ԡ�&&������ƴ�ӳ��ַ���������hmacsha1Ϊ���ܷ�����
+// ��api_keyΪhmacsha1��key������ƴ�Ӷ��ɵ��ַ������м��ܼ��ɵá�
 bool mm_ai_talk_login_action(void)
 {
        return false;
@@ -156,9 +160,14 @@ void mmi_ai_talk_audio_data_send_end_char(void)
 
 
 
+#ifdef MMI_AI_TALK_DEBUG_TO_FILE
 #define BEI_KE_RECEIVE_FILE    "C:/bei_ke.txt"
 #define BEI_KE_RECEIVE_TEXT_FILE "C:/bei_ke_result.txt"
-bool mmi_receive_info_write_to_file(char * path, char * info_buf, uint32_t info_size)
+#define BEI_KE_RECEIVE_TTS_INFO_FILE "C:/bei_ke_tts_info.txt"
+#define BEI_KE_RECEIVE_TTS_AUDIO_JSON_FILE "C:/bei_ke_tts_audio_json.txt"
+#define BEI_KE_RECEIVE_TTS_AUDIO_TEMP_FILE "C:/bei_ke_tts_audio_temp.txt"
+#define BEI_KE_RECEIVE_TTS_AUDIO_TOTAL_FILE "C:/bei_ke_tts_audio_total.txt"
+bool mmi_ai_talk_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;
@@ -204,125 +213,354 @@ bool mmi_receive_info_write_to_file(char * path, char * info_buf, uint32_t info_
 
        return true;
 }
+#endif
+
 
+/*
+[20231103_093424]{"status":"ok","msg":"The connection was successful","meeting_id":"1ee79e91-e621-6781-86f5-4be19df63f36","type":"start"}
+[20231103_093429]{"is_final":0,"results":"����","status":"ok","timestamp":{"end":1450,"start":730},"type":"real_asr"}
+[20231103_093429]{"is_final":1,"results":"��������","status":"ok","timestamp":{"end":1900,"start":730},"type":"real_asr"}
+[20231103_093430]{"is_final":0,"results":"��������","status":"ok","timestamp":{"end":1900,"start":730},"type":"real_asr"}
+[20231103_093435]{"type":"model_answer","status":"ok","answer_id":"1698975269631t",
+"answer":"��Ǹ�����޷��ش�������⡣���޷���֪��ǰ�����������","question":"��������"}
+*/
 
-#define KEY_IS_FINAL                           ("is_final")
-#define KEY_RESULTS                                    ("results")
 #define KEY_TYPE                                       ("type")
-#define VALUE_REAL_ASR                         ("real_asr")
 
-#define VALUE_MODEL_ANSWER                     ("model_answer")
-#define KEY_ANSWER                                     ("answer")
+#define VALUE_TYPE_START                       ("start")
+#define VALUE_TYPE_TEXT                                ("real_asr")
+#define VALUE_TYPE_ANSWER                      ("model_answer")
+#define VALUE_TYPE_TTS                         ("tts_info")
 
-bool mmi_ai_talk_data_receive(unsigned char * next_buff, unsigned int next_buff_len)
-{
-       bool result = false;
-       cJSON * json_root = NULL;
 
-       if(NULL == next_buff || 0 == next_buff_len)
-       {
-               printf("[@CHENG_DEBUG][%s][%d]: no data\n", __FUNCTION__, __LINE__);
-               goto exit_free_res;
-       }
+#define KEY_TYPE_START_RESULT          ("status")
+#define VALUE_TYPE_START_RESULT                ("ok")
 
+#define KEY_TYPE_TEXT_RESULT           ("is_final")
+#define VALUE_TYPE_TEXT_RESULT         (1)
+
+#define KEY_TYPE_ANSWER_RESULT         ("answer")
+
+#define KEY_TYPE_TTS_RESULT                    ("audio")
+#define KEY_TYPE_TTS_INDEX                     ("index")
+
+
+static bool s_ai_talk_type_tts_info_recv_begin = false;
+static bool s_ai_talk_type_tts_info_recv_end = false;
+static char * s_ai_talk_type_tts_info_ptr = NULL;
+static uint32_t s_ai_talk_type_tts_info_size = 0;
+static char * s_ai_talk_type_tts_info_json_ptr = NULL;
+static char * s_ai_talk_type_tts_info_audio_ptr = NULL;
+static uint32_t s_ai_talk_type_tts_info_audio_size = 0;
+
+void mmi_ai_talk_data_receive_resource_clean(void)
+{
+       s_ai_talk_type_tts_info_recv_begin = false;
+       s_ai_talk_type_tts_info_recv_end = false;
        
-       // write to file for debug
-       //mmi_receive_info_write_to_file(BEI_KE_RECEIVE_FILE, next_buff, next_buff_len);
-       
-       
-       lv_obj_t * activity_obj = lv_watch_get_activity_obj(ACT_ID_AI_TALK);
-       if(NULL == activity_obj) 
+       if(NULL != s_ai_talk_type_tts_info_ptr)
        {
-               printf("[@CHENG_DEBUG][%s][%d]: not in ai talk\n", __FUNCTION__, __LINE__);
-               goto exit_free_res;
+               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;
 
-       
-    json_root = cJSON_Parse(next_buff);
-    if(NULL == json_root)
+       if(NULL != s_ai_talk_type_tts_info_json_ptr)
        {
-               printf("[@CHENG_DEBUG][%s][%d]: json parse error\n", __FUNCTION__, __LINE__);
-               goto exit_free_res;
-    }
-       //Hal_Mem_Free(next_buff);
-       //next_buff = NULL;
+               lv_mem_free(s_ai_talk_type_tts_info_json_ptr);
+               s_ai_talk_type_tts_info_json_ptr = NULL;
+       }
 
+       if(NULL != s_ai_talk_type_tts_info_audio_ptr)
+       {
+               lv_mem_free(s_ai_talk_type_tts_info_audio_ptr);
+               s_ai_talk_type_tts_info_audio_ptr = NULL;
+       }
+       s_ai_talk_type_tts_info_audio_size = 0;
+}
 
-#if 0
-// {"is_final":1,"results":"ÀëÀëÔ­ÉϲÝ","status":"ok","timestamp":{"end":2200,"start":730},"type":"real_asr"}
-       int is_final = 0;
-       char * type_real_asr = NULL;
-       char * str_results = NULL;
-       uint16_t str_results_len = 0;
-       
-       is_final = cJSON_GetIntValue(cJSON_GetObjectItem(json_root, KEY_IS_FINAL));
-       if(1 != is_final)
+bool mmi_ai_talk_not_type_tts_info_data_processing(unsigned char * next_buff, unsigned int next_buff_len, cJSON * json_root)
+{
+       json_root = cJSON_Parse(next_buff);
+       if(NULL != json_root)
        {
-               printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
-               goto exit_free_res;
+               printf("[@CHENG_DEBUG][%s][%d]: json file\n", __FUNCTION__, __LINE__);
+               
+               char * value_type_str = cJSON_GetStringValue(cJSON_GetObjectItem(json_root, KEY_TYPE));
+               if(0 == strncmp(value_type_str, VALUE_TYPE_START, strlen(VALUE_TYPE_START)))
+               {
+                       // {"status":"ok","msg":"The connection was successful","meeting_id":"1ee79e91-e621-6781-86f5-4be19df63f36","type":"start"}
+                       printf("[@CHENG_DEBUG][%s][%d]: connect message\n", __FUNCTION__, __LINE__);
+                       return false;
+               }
+               else if(0 == strncmp(value_type_str, VALUE_TYPE_TEXT, strlen(VALUE_TYPE_TEXT)))
+               {
+                       // {"is_final":0,"results":"����ԭ�ϲ�","status":"ok","timestamp":{"end":2200,"start":730},"type":"real_asr"}
+                       // {"is_final":1,"results":"����ԭ�ϲ�","status":"ok","timestamp":{"end":2200,"start":730},"type":"real_asr"}
+                       printf("[@CHENG_DEBUG][%s][%d]: convert text\n", __FUNCTION__, __LINE__);
+                       return false;
+               }
+               else if(0 == strncmp(value_type_str, VALUE_TYPE_ANSWER, strlen(VALUE_TYPE_ANSWER)))
+               {
+                       // {"type":"model_answer","status":"ok","answer_id":"1698890526941t","answer":"����ԭ�ϲݣ�һ��һ���١�\nҰ���ղ��������紵������\nԶ���ֹŵ������ӻijǡ�\n��������ȥ�����������顣","question":"����ԭ�ϲ�"}
+                       printf("[@CHENG_DEBUG][%s][%d]: model_answer\n", __FUNCTION__, __LINE__);
+                       char * value_type_answer_result_str = cJSON_GetStringValue(cJSON_GetObjectItem(json_root, KEY_TYPE_ANSWER_RESULT));
+                       if(NULL == value_type_answer_result_str)
+                       {
+                               printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+                               return false;
+                       }
+                       uint32_t answer_result_str_len = strlen(value_type_answer_result_str);
+                       mmi_ai_talk_model_answer_result_display(value_type_answer_result_str, answer_result_str_len); 
+
+                       s_ai_talk_type_tts_info_recv_begin = true;
+               }
        }
+       else
+       {
+               printf("[@CHENG_DEBUG][%s][%d]: not json file\n", __FUNCTION__, __LINE__);
+               return false;
+       }
+
+       return true;
+}
 
-    type_real_asr = cJSON_GetStringValue(cJSON_GetObjectItem(json_root, KEY_TYPE));
-    if(NULL == type_real_asr)
+bool mmi_ai_talk_type_tts_info_data_store(unsigned char * next_buff, unsigned int next_buff_len)
+{
+       if(NULL == s_ai_talk_type_tts_info_ptr)
        {
-               printf("[@CHENG_DEBUG][%s][%d]: get type fail\n", __FUNCTION__, __LINE__);
-               goto exit_free_res;
+               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)
+               {
+                       printf("[@CHENG_DEBUG][%s][%d]: memory alloc fail\n", __FUNCTION__, __LINE__);
+                       return false;
+               }
+               _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;
        }
-       if(0 != strncmp(type_real_asr, VALUE_REAL_ASR, strlen(VALUE_REAL_ASR)))
+       else
        {
-               printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
-               goto exit_free_res;
+               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)
+               {
+                       printf("[@CHENG_DEBUG][%s][%d]: memory realloc fail\n", __FUNCTION__, __LINE__);
+                       return false;
+               }
+               _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;
+}
+
+bool mmi_ai_talk_type_tts_info_data_parse(cJSON * json_type_tts)
+{
+       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;
+
+       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(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__);
+                       return false;
+               }
+               
+               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;
+
+               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);
+
+               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__);
+                       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);
+
+               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__);                                    
+                       return false;
+               }
                
-    str_results = cJSON_GetStringValue(cJSON_GetObjectItem(json_root, KEY_RESULTS));
-    if(NULL == str_results)
+               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__);
+                       return false;
+               }
+
+               int value_type_tts_index = cJSON_GetIntValue(cJSON_GetObjectItem(json_type_tts, KEY_TYPE_TTS_INDEX));
+               if(0 > value_type_tts_index)
+               {
+                       printf("[@CHENG_DEBUG][%s][%d]: tts info end flag\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_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]: \n", __FUNCTION__, __LINE__);
+                       
+                       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);
+
+                       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__);
+                                       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__);
+                                       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;
+                       }
+               }
+       }
+
+       return true;
+}
+
+bool mmi_ai_talk_type_tts_info_data_processing(unsigned char * next_buff, unsigned int next_buff_len, cJSON * json_type_tts)
+{
+       // {"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"}
+       // {"answer_id":"1699511956918t","audio":"FgD7/1YADR/9q/+j/AgAlAA==","index":2,"type":"tts_info"}
+       // {"answer_id":"1699511956918t","audio":"","index":-1,"type":"tts_info"}
+
+       printf("[@CHENG_DEBUG][%s][%d]: receive_size=%d\n", __FUNCTION__, __LINE__, next_buff_len);
+
+       // search end flag
+       char * t_end_str = "\"index\":-1";
+       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__);
-               goto exit_free_res;
+               return false;
        }
-       str_results_len = strlen(str_results);
-       result = mmi_ai_talk_receive_from_server(str_results, str_results_len, WECHAT_MSG_TYPE_TEXT);   
-#endif
 
+       // 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;
+               }
+       }
+       
+       return true;
+}
 
-// {"type":"model_answer","status":"ok","answer_id":"1698890526941t","answer":"ÀëÀëÔ­Éϲݣ¬Ò»ËêÒ»¿ÝÈÙ¡£\nÒ°»ðÉÕ²»¾¡£¬´º·ç´µÓÖÉú¡£\nÔ¶·¼ÇֹŵÀ£¬Çç´ä½Ó»Ä³Ç¡£\nÓÖËÍÍõËïÈ¥£¬ÝÂÝÂÂú±ðÇé¡£","question":"ÀëÀëÔ­ÉϲÝ"}
-       char * type_model_answer = NULL;
-       char * str_answer = NULL;
-       uint16_t str_answer_len = 0;
+bool mmi_ai_talk_data_receive(unsigned char * next_buff, unsigned int next_buff_len)
+{
+       bool result = false;
+       cJSON * json_root = NULL;
+       cJSON * json_type_tts = NULL;
 
-       type_model_answer = cJSON_GetStringValue(cJSON_GetObjectItem(json_root, KEY_TYPE));
-       if(NULL == type_model_answer)
+       if(NULL == next_buff || 0 == next_buff_len)
        {
-               printf("[@CHENG_DEBUG][%s][%d]: get type fail\n", __FUNCTION__, __LINE__);
+               printf("[@CHENG_DEBUG][%s][%d]: no data\n", __FUNCTION__, __LINE__);
                goto exit_free_res;
        }
-       if(0 != strncmp(type_model_answer, VALUE_MODEL_ANSWER, strlen(VALUE_MODEL_ANSWER)))
+
+#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 
+       
+       lv_obj_t * activity_obj = lv_watch_get_activity_obj(ACT_ID_AI_TALK);
+       if(NULL == activity_obj) 
        {
-               printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+               printf("[@CHENG_DEBUG][%s][%d]: not in ai talk\n", __FUNCTION__, __LINE__);
                goto exit_free_res;
        }
 
-       str_answer = cJSON_GetStringValue(cJSON_GetObjectItem(json_root, KEY_ANSWER));
-       if(NULL == str_answer)
+       if(false == s_ai_talk_type_tts_info_recv_begin)
        {
-               printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
-               goto exit_free_res;
+               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);
        }
-       str_answer_len = strlen(str_answer);
-       result = mmi_ai_talk_receive_from_server(str_answer, str_answer_len, WECHAT_MSG_TYPE_TEXT);     
 
 
 exit_free_res:
-       //if(NULL != next_buff)
-       //{
-       //      printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
-       //      Hal_Mem_Free(next_buff);
-       //      next_buff = NULL;
-       //}
+       if(NULL != 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;
+       }
 
        if(NULL != json_root)
        {
-               printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+               printf("[@CHENG_DEBUG][%s][%d]: free json root\n", __FUNCTION__, __LINE__);
                cJSON_Delete(json_root);
                json_root = NULL;
        }
index c7757e9..ee5f3c7 100644 (file)
@@ -31,6 +31,20 @@ typedef enum
 }MMI_AI_TALK_ACTION_CMD_E;
 
 
+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_AI_TALK_RECEIVE_TYPE_MAX
+}MMI_AI_TALK_RECEIVE_TYPE_E;
+
+
+
 void mm_ai_talk_send_space_free(MMI_AI_TALK_ACTION_CMD_E action_cmd);
 void * mm_ai_talk_send_space_ptr_get(MMI_AI_TALK_ACTION_CMD_E action_cmd);
 uint32_t mm_ai_talk_send_space_size_get(MMI_AI_TALK_ACTION_CMD_E action_cmd);
index 0d9e106..753f8ce 100644 (file)
@@ -14,7 +14,7 @@
 TASK_HANDLE * s_ai_talk_tcp_task_id = NULL;
 TASK_HANDLE * s_ai_talk_send_task_id = NULL;
 
-#define AI_TALK_RECEIVE_BUFF_LEN  (10 * 1024) // (26 * 1024)
+#define AI_TALK_RECEIVE_BUFF_LEN  (16 * 1024)
 
 
 static mmi_ai_talk_tcp_info_t s_ai_talk_tcp_info = {0};