From: @CHENG <2393524978@qq.com> Date: Tue, 18 Jun 2024 02:35:47 +0000 (+0800) Subject: gengxin X-Git-Url: http://git.snicker.com.cn/?a=commitdiff_plain;h=6a1345a2323e24100137e66e7fbf3e251d992214;p=mirrors%2FASR3603_Z5.git gengxin --- diff --git a/2.sdk/sdk/gui/lv_watch/lv_apps/custom_function/mmi_aigc_data.c b/2.sdk/sdk/gui/lv_watch/lv_apps/custom_function/mmi_aigc_data.c index 5cece51e..a00d30d0 100644 --- a/2.sdk/sdk/gui/lv_watch/lv_apps/custom_function/mmi_aigc_data.c +++ b/2.sdk/sdk/gui/lv_watch/lv_apps/custom_function/mmi_aigc_data.c @@ -5,462 +5,350 @@ #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 diff --git a/2.sdk/sdk/gui/lv_watch/lv_apps/custom_function/mmi_aigc_data.h b/2.sdk/sdk/gui/lv_watch/lv_apps/custom_function/mmi_aigc_data.h index 1ac9c26a..6e0f061e 100644 --- a/2.sdk/sdk/gui/lv_watch/lv_apps/custom_function/mmi_aigc_data.h +++ b/2.sdk/sdk/gui/lv_watch/lv_apps/custom_function/mmi_aigc_data.h @@ -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 diff --git a/2.sdk/sdk/gui/lv_watch/lv_apps/custom_function/mmi_aigc_ui.c b/2.sdk/sdk/gui/lv_watch/lv_apps/custom_function/mmi_aigc_ui.c index ac8513c0..9637c6a8 100644 --- a/2.sdk/sdk/gui/lv_watch/lv_apps/custom_function/mmi_aigc_ui.c +++ b/2.sdk/sdk/gui/lv_watch/lv_apps/custom_function/mmi_aigc_ui.c @@ -7,718 +7,892 @@ 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 + diff --git a/2.sdk/sdk/gui/lv_watch/lv_apps/custom_function/mmi_aigc_ui.h b/2.sdk/sdk/gui/lv_watch/lv_apps/custom_function/mmi_aigc_ui.h index fa627c01..b7ee5afa 100644 --- a/2.sdk/sdk/gui/lv_watch/lv_apps/custom_function/mmi_aigc_ui.h +++ b/2.sdk/sdk/gui/lv_watch/lv_apps/custom_function/mmi_aigc_ui.h @@ -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 diff --git a/2.sdk/sdk/gui/lv_watch/lv_apps/pedometer/pedometer.c b/2.sdk/sdk/gui/lv_watch/lv_apps/pedometer/pedometer.c index 633414c9..03159e85 100644 --- a/2.sdk/sdk/gui/lv_watch/lv_apps/pedometer/pedometer.c +++ b/2.sdk/sdk/gui/lv_watch/lv_apps/pedometer/pedometer.c @@ -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)