W8:
authordxy15521469561 <1731678236@qq.com>
Wed, 19 Jun 2024 06:30:08 +0000 (14:30 +0800)
committerdxy15521469561 <1731678236@qq.com>
Wed, 19 Jun 2024 06:30:08 +0000 (14:30 +0800)
优化AI界面

2.sdk/project/W8/sdk/services/microPython/ports/quectel/core/ai.py
2.sdk/project/W8/sdk/services/microPython/ports/quectel/core/ui.py
2.sdk/project/W8/sdk/services/microPython/ports/quectel/core/ui_health.py
2.sdk/project/W8/sdk/services/microPython/ports/quectel/core/ui_setting.py
2.sdk/project/W8/sdk/services/microPython/ports/quectel/core/ui_video.py

index 261e16b..04a615c 100644 (file)
@@ -123,15 +123,15 @@ AI_talk_end_screen.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF)
 AI_talk_end_screen.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT)
 AI_talk_end_screen.add_flag(lv.obj.FLAG.HIDDEN) #
 
-AI_screen_list_screen = lv.obj(AI_talk_end_screen)
-AI_screen_list_screen.set_pos(0, 0)
-AI_screen_list_screen.set_size(LCD_SIZE_W, LCD_SIZE_H-60)
-AI_screen_list_screen.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF)
-AI_screen_list_screen.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT)
-
-al_success_title1 = lv.label(AI_talk_end_screen)
-al_success_title1.set_pos(0, 10)
-al_success_title1.set_size(LCD_SIZE_W, 40)
+AI_screen_list_screen_title = lv.obj(AI_talk_end_screen)
+AI_screen_list_screen_title.set_pos(0, 0)
+AI_screen_list_screen_title.set_size(LCD_SIZE_W,40)
+AI_screen_list_screen_title.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF)
+AI_screen_list_screen_title.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+al_success_title1 = lv.label(AI_screen_list_screen_title)
+al_success_title1.set_pos(0, 5)
+al_success_title1.set_size(LCD_SIZE_W, 25)
 al_success_title1.set_text("AI智能助手")
 al_success_title1.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0)
 al_success_title1.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT)
@@ -143,30 +143,38 @@ al_success_title1.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAU
 # AI_press_btn.add_style(style_common_bg_rect_btn_pressed, lv.PART.MAIN | lv.STATE.PRESSED)
 # AI_press_btn.set_style_radius(30,0)
 
-al_talk_end_screen_icon1 = lv.img(AI_talk_end_screen)
+AI_talk_end_bt_screen = lv.obj(AI_talk_end_screen)
+AI_talk_end_bt_screen.set_pos(0, 210)
+AI_talk_end_bt_screen.set_size(LCD_SIZE_W,LCD_SIZE_H-210)
+print("AI_talk_end_bt_screen")
+AI_talk_end_bt_screen.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF)
+AI_talk_end_bt_screen.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+
+al_talk_end_screen_icon1 = lv.img(AI_talk_end_bt_screen)
 al_talk_end_screen_icon1.set_size(50,50)
-al_talk_end_screen_icon1.set_pos(15,220)
+al_talk_end_screen_icon1.set_pos(15,5)
 al_talk_end_screen_icon1.add_flag(lv.obj.FLAG.CLICKABLE)
 al_talk_end_screen_icon1.set_src("E:/static/AI/ai_result_can_bt.png")
 al_talk_end_screen_icon1.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT)
 
-al_talk_end_screen_cancel_bt = lv.label(AI_talk_end_screen)
+al_talk_end_screen_cancel_bt = lv.label(AI_talk_end_bt_screen)
 al_talk_end_screen_cancel_bt.set_text(" ")
-al_talk_end_screen_cancel_bt.set_size(80, 282-210)
-al_talk_end_screen_cancel_bt.set_pos(0,210)
+al_talk_end_screen_cancel_bt.set_size(80, 72)
+al_talk_end_screen_cancel_bt.set_pos(0,0)
 al_talk_end_screen_cancel_bt.add_flag(lv.obj.FLAG.CLICKABLE)
 
-al_talk_end_screen_icon2 = lv.img(AI_talk_end_screen)
+al_talk_end_screen_icon2 = lv.img(AI_talk_end_bt_screen)
 al_talk_end_screen_icon2.set_size(150,50)
-al_talk_end_screen_icon2.set_pos(80,220)
+al_talk_end_screen_icon2.set_pos(80,5)
 al_talk_end_screen_icon2.add_flag(lv.obj.FLAG.CLICKABLE)
 al_talk_end_screen_icon2.set_src("E:/static/AI/ai_result_bt.png")
 al_talk_end_screen_icon2.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT)
 
 AI_press_label_bt = lv.label(al_talk_end_screen_icon2)
 AI_press_label_bt.set_text(" ")
-AI_press_label_bt.set_size(240-150, 282-210)
-AI_press_label_bt.set_pos(0,210)
+AI_press_label_bt.set_size(240-150, 72)
+AI_press_label_bt.set_pos(0,0)
 AI_press_label_bt.add_flag(lv.obj.FLAG.CLICKABLE)
 
 AI_press_label = lv.label(al_talk_end_screen_icon2)
@@ -189,21 +197,54 @@ style_green_screen.set_pad_bottom(0)
 
 style_font_28_green_bg_gray = lv.style_t()
 style_font_28_green_bg_gray.init()
+# style_font_28_green_bg_gray.set_bg_color(lv.color_make(79,195,76))
+# style_font_28_green_bg_gray.set_bg_opa(255)
+# style_font_28_green_bg_gray.set_radius(5)
+# style_font_28_green_bg_gray.set_border_width(0)
+# style_font_28_green_bg_gray.set_pad_left(0)
+# style_font_28_green_bg_gray.set_pad_right(0)
+# style_font_28_green_bg_gray.set_pad_top(0)
+# style_font_28_green_bg_gray.set_pad_bottom(0)
 style_font_28_green_bg_gray.set_text_color(lv.color_make(255, 255, 255)) #字体文本颜色
 style_font_28_green_bg_gray.set_text_font_v2("font_28.bin",28,0)
-# style_font_28_green_bg_gray.set_bg_opa(255)
 
-ai_requestion_obj = lv.obj(AI_talk_end_screen)
-ai_requestion_obj.set_pos(30, 40)
-ai_requestion_obj.set_size(LCD_SIZE_W-30-5, 58)
-ai_requestion_obj.add_style(style_green_screen, lv.PART.MAIN | lv.STATE.DEFAULT)
-
-AI_listen_text = lv.label(ai_requestion_obj)
-AI_listen_text.set_pos(0, 5)
-AI_listen_text.set_size(LCD_SIZE_W-30-5-10, lv.SIZE.CONTENT)
+#列表obj
+style_wechat_s_btn =  lv.style_t()
+style_wechat_s_btn.init()
+style_wechat_s_btn.set_radius(5)
+style_wechat_s_btn.set_bg_opa(255)
+style_wechat_s_btn.set_border_width(0)
+style_wechat_s_btn.set_pad_left(0)
+style_wechat_s_btn.set_pad_right(0)
+style_wechat_s_btn.set_pad_top(0)
+style_wechat_s_btn.set_pad_bottom(0)
+style_wechat_s_btn.set_bg_color(lv.color_make(79,195,76))
+style_wechat_s_btn.set_shadow_opa(0)
+
+AI_end_screen_list_screen = lv.obj(AI_talk_end_screen)
+AI_end_screen_list_screen.set_pos(10, 30)
+AI_end_screen_list_screen.set_size(LCD_SIZE_W-10,180)
+AI_end_screen_list_screen.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF)
+AI_end_screen_list_screen.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT)
+AI_end_screen_list_screen.set_flex_flow(lv.FLEX_FLOW.COLUMN)#自动排成一列对齐
+
+AI_end_screen_list_detail_screen = lv.obj(AI_end_screen_list_screen)
+AI_end_screen_list_detail_screen.set_pos(0, 5)
+AI_end_screen_list_detail_screen.set_size(230,lv.SIZE.CONTENT)
+AI_end_screen_list_detail_screen.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+
+AI_end_screen_list_detail_screen1 = lv.obj(AI_end_screen_list_detail_screen)
+AI_end_screen_list_detail_screen1.set_pos(30,10)
+AI_end_screen_list_detail_screen1.set_size(190,lv.SIZE.CONTENT)
+AI_end_screen_list_detail_screen1.add_style(style_wechat_s_btn, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+AI_listen_text = lv.label(AI_end_screen_list_detail_screen1)
+AI_listen_text.set_pos(5, 10)
+AI_listen_text.set_size(175, lv.SIZE.CONTENT)
 AI_listen_text.set_text(" ")
 AI_listen_text.set_long_mode(lv.label.LONG.WRAP)
-AI_listen_text.set_style_text_align(lv.TEXT_ALIGN.RIGHT, 0)
+AI_listen_text.set_style_text_align(lv.TEXT_ALIGN.LEFT, 0)
 AI_listen_text.add_style(style_font_28_green_bg_gray, lv.PART.MAIN | lv.STATE.DEFAULT)
 
 style_gray_screen = lv.style_t()
@@ -220,16 +261,39 @@ style_gray_screen.set_pad_bottom(0)
 #灰色背景黑色字
 style_font_28_black_bg_gray = lv.style_t()
 style_font_28_black_bg_gray.init()
+# style_font_28_black_bg_gray.set_radius(5)
+# style_font_28_black_bg_gray.set_bg_opa(255)
+# style_font_28_black_bg_gray.set_border_width(0)
+# style_font_28_black_bg_gray.set_pad_left(0)
+# style_font_28_black_bg_gray.set_pad_right(0)
+# style_font_28_black_bg_gray.set_pad_top(0)
+# style_font_28_black_bg_gray.set_pad_bottom(0)
+# style_font_28_black_bg_gray.set_bg_color(lv.color_make(66,66,66)) #字体文本颜色
 style_font_28_black_bg_gray.set_text_color(lv.color_make(153, 153, 153)) #字体文本颜色
 style_font_28_black_bg_gray.set_text_font_v2("font_28.bin",28,0)
 
-msg_detail_cont_obj = lv.obj(AI_talk_end_screen)
-msg_detail_cont_obj.set_pos(5, 120)
-msg_detail_cont_obj.set_size(LCD_SIZE_W-20, 86)
-msg_detail_cont_obj.add_style(style_gray_screen, lv.PART.MAIN | lv.STATE.DEFAULT)
+style_wechat_r_btn =  lv.style_t()
+style_wechat_r_btn.init()
+style_wechat_r_btn.set_radius(5)
+style_wechat_r_btn.set_bg_opa(255)
+style_wechat_r_btn.set_border_width(0)
+style_wechat_r_btn.set_pad_left(0)
+style_wechat_r_btn.set_pad_right(0)
+style_wechat_r_btn.set_pad_top(0)
+style_wechat_r_btn.set_pad_bottom(0)
+style_wechat_r_btn.set_bg_color(lv.color_make(66,66,66))
+style_wechat_r_btn.set_border_width(0)
+style_wechat_r_btn.set_shadow_opa(0)
+
+
+msg_detail_cont_obj = lv.obj(AI_end_screen_list_screen)
+msg_detail_cont_obj.set_pos(0, 5)
+msg_detail_cont_obj.set_size(220,lv.SIZE.CONTENT)
+msg_detail_cont_obj.add_style(style_wechat_r_btn, lv.PART.MAIN | lv.STATE.DEFAULT)
+
 AI_label = lv.label(msg_detail_cont_obj)
-AI_label.set_pos(0, 5)
-AI_label.set_size(LCD_SIZE_W-20-10, lv.SIZE.CONTENT)
+AI_label.set_pos(5, 10)
+AI_label.set_size(205, lv.SIZE.CONTENT)
 AI_label.set_long_mode(lv.label.LONG.WRAP)
 AI_label.set_style_text_align(lv.TEXT_ALIGN.LEFT, 0)
 AI_label.add_style(style_font_28_black_bg_gray, lv.PART.MAIN | lv.STATE.DEFAULT)
@@ -341,7 +405,7 @@ AI_listen_screen.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT)
 AI_listen_screen.add_flag(lv.obj.FLAG.HIDDEN) #先隐藏
 
 ai_talk_requestion_obj = lv.obj(AI_listen_screen)
-ai_talk_requestion_obj.set_pos(10, 20)
+ai_talk_requestion_obj.set_pos(15, 20)
 ai_talk_requestion_obj.set_size(LCD_SIZE_W-25, 58)
 ai_talk_requestion_obj.add_style(style_green_screen, lv.PART.MAIN | lv.STATE.DEFAULT)
 
@@ -353,10 +417,21 @@ al_listen_screen_title1.set_style_text_align(lv.TEXT_ALIGN.LEFT, 0)
 al_listen_screen_title1.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT)
 
 
+# al_listen_screen_icon1 = lv.gif(AI_listen_screen)
+# al_listen_screen_icon1.set_size(140,45)
+# al_listen_screen_icon1.set_pos((240-140)//2,110)
+# # al_listen_screen_icon1.set_src("E:/static/AI/AI_LISTEN_GIF001.png")
+# al_listen_screen_icon1.set_src("E:/static/AI/listen_gif.gif")
+
+# al_listen_screen_icon1.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+
 al_listen_screen_icon1 = lv.img(AI_listen_screen)
 al_listen_screen_icon1.set_size(140,45)
 al_listen_screen_icon1.set_pos((240-140)//2,110)
 al_listen_screen_icon1.set_src("E:/static/AI/AI_LISTEN_GIF001.png")
+# al_listen_screen_icon1.set_src("E:/static/AI/listen_gif.gif")
+
 al_listen_screen_icon1.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT)
 
 al_listen_screen_icon = lv.img(AI_listen_screen)
@@ -393,11 +468,19 @@ al_think_screen_title1.set_text("正在思考...")
 al_think_screen_title1.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0)
 al_think_screen_title1.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT)
 
+# al_think_screen_icon = lv.gif(AI_think_screen)
+# al_think_screen_icon.set_size(130,130)
+# al_think_screen_icon.set_pos((240-130)//2,65)
+# # al_think_screen_icon.set_src("E:/static/AI/AI_THINK001.png")
+# al_think_screen_icon.set_src("E:/static/AI/think_gif.gif")
+# al_think_screen_icon.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT)
 
 al_think_screen_icon = lv.img(AI_think_screen)
 al_think_screen_icon.set_size(130,130)
 al_think_screen_icon.set_pos((240-130)//2,65)
 al_think_screen_icon.set_src("E:/static/AI/AI_THINK001.png")
+# al_think_screen_icon.set_src("E:/static/AI/think_gif.gif")
+
 al_think_screen_icon.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT)
 
 al_think_screen_icon1 = lv.img(AI_think_screen)
@@ -583,6 +666,7 @@ class AIScreen(Screen):#AI_GUI
         self.img_show_count_flag = 0
         self.tts_data_tmp = bytes()
         self.press_state = 0
+        self.AI_label_answer = ""
         self.AI_label_str = ""
         self.AI_client_tts_play_data_len = 0
         self.refresh_texttimer = osTimer()
@@ -666,10 +750,12 @@ class AIScreen(Screen):#AI_GUI
         self.refresh_count = 0
         self.AI_listen_text = ""
         self.AI_label_str = ""
+        self.AI_label_answer = ""
         self.tts_time_count = 0
 
     def talk_end_cancel_cb(self,e):#对话结束已经播放音频取消继续对话按钮
         self.Close()
+        self.AI_label_answer = ""
         AI_no_net_screen.add_flag(lv.obj.FLAG.HIDDEN) #隐藏
         AI_listen_screen.add_flag(lv.obj.FLAG.HIDDEN)
         AI_think_screen.add_flag(lv.obj.FLAG.HIDDEN) #先隐藏
@@ -681,6 +767,7 @@ class AIScreen(Screen):#AI_GUI
         
     def talk_end_continue_cb(self,e):#连接超时确定按钮回调或者继续对话按钮
         self.Close()
+        self.AI_label_answer = ""
         AI_no_net_screen.add_flag(lv.obj.FLAG.HIDDEN) #隐藏
         AI_talk_end_screen.add_flag(lv.obj.FLAG.HIDDEN) #先隐藏
         AI_think_screen.add_flag(lv.obj.FLAG.HIDDEN) #先隐藏
@@ -765,19 +852,39 @@ class AIScreen(Screen):#AI_GUI
         AI_talk_screen.add_flag(lv.obj.FLAG.HIDDEN) #
         AI_not_listen_text_screen.add_flag(lv.obj.FLAG.HIDDEN) #
         AI_talk_end_screen.clear_flag(lv.obj.FLAG.HIDDEN) #
+
+        # self.AI_label_answer = ""
+        AI_end_screen_list_screen.scroll_to(0, 0, lv.ANIM.OFF)
+        AI_label.set_pos(5, 10)
+        AI_label.set_text(self.AI_label_answer)
         AI_label.set_text("语音识别中...")
-        ai_requestion_obj.scroll_to(0, 0, lv.ANIM.OFF)
-        msg_detail_cont_obj.scroll_to(0, 0, lv.ANIM.OFF)
+        
+        # self.AI_listen_text = "嗯。"
+        str_len = len(self.AI_listen_text)*20
+        if str_len > 165:
+            str_len = 165
+        print("len:{} str_len:{} self.AI_listen_text:{}\r\n".format(len(self.AI_listen_text),str_len,self.AI_listen_text))
+        # AI_end_screen_list_detail_screen1.set_pos(170-str_len,10)
+
+        # AI_listen_text.set_size(str_len,lv.SIZE.CONTENT)
+
+        # AI_listen_text.set_pos(0, 10)
+        # AI_listen_text.set_size(str_len,lv.SIZE.CONTENT)
         AI_listen_text.set_text(self.AI_listen_text)
         EventMesh.publish("system_sleep_rest")#防止黑屏
         self.refresh_count = 0
-        self.refresh_texttimer.start(500,1,self.ai_talk_end_show_text)
-
+        self.refresh_texttimer.start(500,1,self.ai_talk_end_show_text)#stop() #(500,1,self.ai_talk_end_show_text)
     def ai_talk_end_show_text(self,*argc):
+        EventMesh.publish("publish_message_event_ui",{"func":self.ai_talk_end_lcd_on,"data":0})
+    def ai_talk_end_lcd_on(self,data):
         EventMesh.publish("system_sleep_rest")#防止黑屏
+
+    def ai_talk_end_show_text_cb(self,data):
+        AI_label.set_text(self.AI_label_answer)
+        
         pass
 
-    def connect_timerout_popup(self):#连接超时弹窗提示
+    def connect_timerout_popup(self,msg):#连接超时弹窗提示
         self.Close()
         AI_talk_screen.add_flag(lv.obj.FLAG.HIDDEN) #
         AI_no_net_screen.add_flag(lv.obj.FLAG.HIDDEN) #隐藏
@@ -786,12 +893,16 @@ class AIScreen(Screen):#AI_GUI
         AI_not_listen_text_screen.add_flag(lv.obj.FLAG.HIDDEN) #
         AI_think_screen.add_flag(lv.obj.FLAG.HIDDEN) #先隐藏
         AI_connect_timerout_screen.clear_flag(lv.obj.FLAG.HIDDEN) #先隐藏
+        if msg == 1: #连接超时
+            al_connect_timerout_title2.set_text("连接超时")
+        else:
+            al_connect_timerout_title2.set_text("网络连接异常")
         
 
     def text_show_think(self,*argc):
         EventMesh.publish("publish_message_event_ui",{"func":self.text_show_think_cb,"data":0})
     def think_end_result(self):
-        if self.timer_out_count > 4:
+        if self.timer_out_count > 1:
             if self.img_show_count_flag == 1:
                 return
             self.timer_out_count = 0
@@ -799,10 +910,11 @@ class AIScreen(Screen):#AI_GUI
             self.refresh_texttimer.stop()
             self.ai_talk_end()
     def text_show_think_cb(self,data): #文本刷新
-        if self.timer_out_count > 4:
-            if self.img_show_count_flag == 1:
-                return
-            self.timer_out_count = 0
+        if self.img_show_count_flag == 1:
+            self.refresh_texttimer.stop()
+            return
+        if self.AI_label_str != "":
+            self.timer_out_count = 1
             self.img_show_count_flag = 1
             self.refresh_texttimer.stop()
             self.ai_talk_end()
@@ -814,7 +926,7 @@ class AIScreen(Screen):#AI_GUI
             #连接超时
             self.img_show_count = 0
             self.img_show_count_tmp = 0
-            self.connect_timerout_popup()
+            self.connect_timerout_popup(1)
             return
 
         if self.img_show_count > 10:
@@ -860,7 +972,7 @@ class AIScreen(Screen):#AI_GUI
         AI_talk_screen.clear_flag(lv.obj.FLAG.HIDDEN) #先隐藏
         self.aud.setVolume(11)#设置最大声录音
 
-       
+        self.AI_label_answer = ""
         self.AI_client_chat_play_str = ''
         self.AI_init()
         self.AI_client_tts_data_len = 0
@@ -895,11 +1007,11 @@ class AIScreen(Screen):#AI_GUI
             #         except Exception as e:
             #             usys.print_exception(e)    
             #print('audio-play finish.')
-    def AI_init(self,):
+    def AI_init(self):
         self.AI_audio_queue_thread_id = _thread.start_new_thread(self.AI_audio_queue_thread, ())
         self.AI_send_data_queue_thread_id = _thread.start_new_thread(self.AI_send_data_queue_thread, ())
         
-        self.AI_client_tts_timer.start(1000,1,self.AI_client_tts_timer_cb)
+        
         
     #按下录音
     def talking_cb(self,e):
@@ -928,7 +1040,7 @@ class AIScreen(Screen):#AI_GUI
             self.refresh_count = 0
             self.img_show_count = 0
             self.img_show_count_tmp = 0
-            self.AI_client_tts_timer.start(1000,1,self.AI_client_tts_timer_cb)
+            
             EventMesh.publish("publish_message_event_ui",{"func":self.talking,"data":e})
             
 
@@ -1018,6 +1130,7 @@ class AIScreen(Screen):#AI_GUI
                     self.Close()
                     print("talking3")
                     self.AI_init()
+                    self.AI_client_tts_timer.start(1000,1,self.AI_client_tts_timer_cb)
                 except Exception as e:
                     usys.print_exception(e)  
                 al_listen_screen_title1.set_text("识别中...")  
@@ -1087,7 +1200,13 @@ class AIScreen(Screen):#AI_GUI
         print("websocket_connect_chat:{}!!!!!!!!!!!!!!!!!!!!!".format(self.AI_client_chat_isconnect))
         #if self.AI_client_chat_isconnect == 0:
         # 创建客户端, debug=True输出日志, ip和端口需要自己填写, 或者是域名
-        self.AI_client_chat = uwebsocket.Client.connect('ws://121.40.67.151:9099/chat/ws', debug=False)
+        try:
+            self.AI_client_chat = uwebsocket.Client.connect('ws://121.40.67.151:9099/chat/ws', debug=False)
+        except Exception as e: #网络连接异常
+            usys.print_exception(e)
+            print("websocket_connect_chat error!!!\r\n")
+            self.connect_timerout_popup(2)
+            return
         # 线程接收数据
         if self.AI_client_chat_recv_id != 0:
             try:
@@ -1128,7 +1247,7 @@ class AIScreen(Screen):#AI_GUI
                         print("AI_client_chat_recv chat_data = {}".format(chat_data))
                         self.AI_label_str+=str(chat_data)
                         self.AI_client_chat_play_str+=str(chat_data)
-                        
+                        self.think_end_result()
                         if self.TTS_PRO_TYPE == 1:
                             AI_label.set_text(self.AI_label_str)
                         # EventMesh.publish("system_sleep_rest")#防止黑屏
@@ -1157,7 +1276,15 @@ class AIScreen(Screen):#AI_GUI
     def websocket_connect_tts(self):
         print("websocket_connect_tts:{}!!!!!!!!!!!!!!!!!!!!!!".format(self.AI_client_tts_isconnect))
         if self.AI_client_tts_isconnect == 0:
-            self.AI_client_tts = uwebsocket.Client.connect('ws://121.40.67.151:9099/tts/long-text-stream', debug=False)
+            try:
+                # self.AI_client_tts = uwebsocket.Client.connect('ws://40.67.151:9099/tts/', debug=False)
+                self.AI_client_tts = uwebsocket.Client.connect('ws://121.40.67.151:9099/tts/long-text-stream', debug=False)
+            except Exception as e: #网络连接异常
+                usys.print_exception(e)
+                print("websocket_connect_tts ERROR:{}\r\n".format(e))
+                self.connect_timerout_popup(2)
+                return
+            print("websocket_connect_tts:self.AI_client_tts {}\r\n".format(self.AI_client_tts))
         # 线程接收数据
         if self.AI_client_tts_recv_id != 0:
             try:
@@ -1179,6 +1306,7 @@ class AIScreen(Screen):#AI_GUI
                 usys.print_exception(e)
     def AI_client_tts_timer_cb(self,*argc):
         # EventMesh.publish("system_sleep_rest")#防止黑屏
+        
         self.tts_time_count+=1
         if self.TTS_PRO_TYPE == 1:
             #tts数据入队
@@ -1295,7 +1423,12 @@ class AIScreen(Screen):#AI_GUI
                             print("EndSynthesis!!!!!!!!!!!!!!!!!\r\n")
                             print("EndSynthesis!!!!!!!!!!!!!!!!!!\r\n")
                             #self.tts_data_tmp=self.tts_data_tmp[9:-100]
-                            self.websocket_deconnect_tts()#断开
+                            try:
+                                self.websocket_deconnect_tts()#断开
+                            except Exception as e: #网络连接异常
+                                usys.print_exception(e)
+            
+            
                             self.tts_time_count = 60#立即发送剩余数据
                             self.AI_client_tts_put_data()
                             
@@ -1341,7 +1474,14 @@ class AIScreen(Screen):#AI_GUI
             self.websocket_deconnect_asr()#先断一次,预防出错
         except Exception as e:
             usys.print_exception(e)   
-        self.AI_client_asr = uwebsocket.Client.connect('ws://121.40.67.151:9099/asr/ws', debug=False)
+        
+        try:
+            self.AI_client_asr = uwebsocket.Client.connect('ws://121.40.67.151:9099/asr/ws', debug=False)
+        except Exception as e: #网络连接异常
+            usys.print_exception(e)
+            print("websocket_connect_asr error!!!\r\n")
+            self.connect_timerout_popup(2)
+            return
         # 线程接收数据
         if self.AI_client_asr_recv_id != 0:
             try:
@@ -1430,17 +1570,26 @@ class AIScreen(Screen):#AI_GUI
                     #data[0].send(data[1])
                     if data[0] == self.AI_client_chat_num:
                         if self.AI_client_chat_isconnect == 0:
-                            self.websocket_connect_chat()
+                            try:
+                                self.websocket_connect_chat()
+                            except Exception as e: #网络连接异常
+                                usys.print_exception(e)
                         tmp = self.AI_client_chat.send(data[1])
                         print("chat send_data:{} tmp:{}".format(len(data[1]),tmp))
                     if data[0] == self.AI_client_asr_num:
                         if self.AI_client_asr_isconnect == 0:
-                            self.websocket_connect_asr()
+                            try:
+                                self.websocket_connect_asr()
+                            except Exception as e: #网络连接异常
+                                usys.print_exception(e)
                         print("asr send_data:{}".format(len(data[1])))
                         self.AI_client_asr.send(data[1])
                     if data[0] == self.AI_client_tts_num:
                         if self.AI_client_tts_isconnect == 0:
-                            self.websocket_connect_tts() 
+                            try:
+                                self.websocket_connect_tts() 
+                            except Exception as e: #网络连接异常
+                                usys.print_exception(e)
                         print("tts send_data:{}".format((data[1])))
                         self.AI_client_tts.send(data[1])
                 except Exception as e:
@@ -1448,10 +1597,16 @@ class AIScreen(Screen):#AI_GUI
                     usys.print_exception(e)
                     if data[0] == self.AI_client_chat_num:
                         self.AI_client_chat_isconnect = 0
-                        self.websocket_connect_chat()
+                        try:
+                            self.websocket_connect_chat()
+                        except Exception as e: #网络连接异常
+                             usys.print_exception(e)
                     if data[0] == self.AI_client_asr_num:
                         self.AI_client_asr_isconnect = 0
-                        self.websocket_connect_asr()
+                        try:
+                            self.websocket_connect_asr()
+                        except Exception as e: #网络连接异常
+                            usys.print_exception(e)
                     if data[0] == self.AI_client_tts_num:
                         count =10
                         while 1:
@@ -1459,7 +1614,10 @@ class AIScreen(Screen):#AI_GUI
                             if  count<=0:
                                 break
                             self.AI_client_tts_isconnect = 0
-                            self.websocket_connect_tts()
+                            try:
+                                self.websocket_connect_tts()
+                            except Exception as e: #网络连接异常
+                                usys.print_exception(e)
                             #self.AI_client_tts_start()
                             if self.AI_client_tts_isconnect == 1:
                                 try:
@@ -1482,10 +1640,13 @@ class AIScreen(Screen):#AI_GUI
                     print("audio_queue:len:{},data{}".format(len(data[0]),data[1]))
                     if len(data[0]) > 1:
                         if self.TTS_PRO_TYPE == 0:
-                            AI_label.set_text(data[1])
+                            
+                            self.AI_label_answer+=data[1]
+                            EventMesh.publish("publish_message_event_ui",{"func":self.ai_talk_end_show_text_cb,"data":0})
+                            # AI_label.set_text(self.AI_label_answer)
                         try:
                             
-                            tmp=self.aud.playStream(3, data[0])#播放音频流
+                            tmp= self.aud.playStream(3, data[0])#播放音频流
                             print("出:{},{}!!!".format(len(data[0]),self.AI_client_tts_data_len))
                             if tmp != 0:
                                 print("2playStream:error tmp:{} data len:{}!!!!!!!!!!!!".format(tmp,len(data[0])))
@@ -1542,6 +1703,7 @@ class AIScreen(Screen):#AI_GUI
         self.AI_client_chat_play_str = ""
         self.AI_client_tts_tra_flag = 0
         self.record.stop()#关闭录音
+        self.AI_label_answer = ""
         self.refresh_count = 0
         self.refresh_texttimer.stop()
         self.clear_flag()
index bbf0de8..544b0f7 100644 (file)
@@ -1628,51 +1628,40 @@ class NoSimPowerScreen(Screen):#
             no_sim_power_screen_cancel.set_ext_click_area(20)
 
             self.meta = no_sim_power_screen
-            no_sim_power_screen_comfirm.add_event_cb(lambda e: EventMesh.callback_wrapper(self.confirm(e)),
+            no_sim_power_screen.add_event_cb(lambda e:EventMesh.callback_wrapper(self.button_cb(e,1)), lv.EVENT.GESTURE, None)
+            no_sim_power_screen_comfirm.add_event_cb(lambda e: EventMesh.callback_wrapper(self.button_cb(e,2)),
                                      lv.EVENT.SHORT_CLICKED, None)
         
-            no_sim_power_screen_cancel.add_event_cb(lambda e: EventMesh.callback_wrapper(self.cancel(e)),
+            no_sim_power_screen_cancel.add_event_cb(lambda e: EventMesh.callback_wrapper(self.button_cb(e,3)),
                                      lv.EVENT.SHORT_CLICKED, None)
             
-            no_sim_power_screen_comfirm.add_event_cb(lambda e: EventMesh.callback_wrapper(self.confirm(e)),
-                                     lv.EVENT.PRESSING, None)
-        
-            no_sim_power_screen_cancel.add_event_cb(lambda e: EventMesh.callback_wrapper(self.cancel(e)),
-                                     lv.EVENT.PRESSING, None)
-            
-
-    def confirm(self,e):
+    def button_cb(self,e,msg):
         code = e.get_code()
-        if code == lv.EVENT.PRESSING:
-            #print("PRESSING")
-            self.is_sliding += 1
+        indev = lv.indev_get_act()
+        lv.indev_t.wait_release(indev)
+        dir = lv.indev_t.get_gesture_dir(indev)
+        if code == lv.EVENT.GESTURE:
+            if dir == lv.DIR.RIGHT:
+                EventMesh.publish("return_prev_screen")
+            
 
         elif  code == lv.EVENT.SHORT_CLICKED:
-            #utime.sleep_ms(10)
-            print("1self.is_sliding",self.is_sliding)
-            if self.is_sliding <= 5 and self.is_sliding != 0:#如果是在滑动中则不需要点击事件
-                self.is_sliding =0
-                EventMesh.publish("load_screen", {"screen": "poweroff_comfirm"})
-
-            self.is_sliding =0
-        
-
-    def cancel(self,e):
-        EventMesh.publish("return_prev_screen")
-
-    def done_left_to_right(self):
-        EventMesh.publish("return_prev_screen")
+            if msg != 1:
+                if msg == 2:
+                    EventMesh.publish("load_screen", {"screen": "poweroff_comfirm"})
+                elif msg == 3:
+                    EventMesh.publish("return_prev_screen")
 
-    def done_right_to_left(self):
-        EventMesh.publish("return_prev_screen")
+    # def done_right_to_left(self):
+    #     EventMesh.publish("return_prev_screen")
 
-    def done_bottom_to_top(self):
-        EventMesh.publish("return_prev_screen")
+    # def done_bottom_to_top(self):
+    #     EventMesh.publish("return_prev_screen")
     def done_return(self): 
         EventMesh.publish("return_prev_screen")
 
-    def done_top_to_bottom(self):
-        EventMesh.publish("return_prev_screen")
+    # def done_top_to_bottom(self):
+        # EventMesh.publish("return_prev_screen")
 
     def btn8_press(self):
         EventMesh.publish("return_prev_screen")
@@ -1753,20 +1742,36 @@ class NoSimAutoScreen(Screen):#无sim卡是否关机
             no_sim_auto_screen_cancel.set_ext_click_area(20)
 
             self.meta = no_sim_auto_screen
-            no_sim_auto_screen_comfirm.add_event_cb(lambda e: EventMesh.callback_wrapper(self.confirm(e)),
+
+            no_sim_auto_screen.add_event_cb(lambda e:EventMesh.callback_wrapper(self.button_cb(e,0)), lv.EVENT.GESTURE, None)
+
+            no_sim_auto_screen_comfirm.add_event_cb(lambda e: EventMesh.callback_wrapper(self.button_cb(e,1)),
                                      lv.EVENT.SHORT_CLICKED, None)
         
-            no_sim_auto_screen_cancel.add_event_cb(lambda e: EventMesh.callback_wrapper(self.cancel(e)),
+            no_sim_auto_screen_cancel.add_event_cb(lambda e: EventMesh.callback_wrapper(self.button_cb(e,2)),
                                      lv.EVENT.SHORT_CLICKED, None)
-            
-            no_sim_auto_screen_comfirm.add_event_cb(lambda e: EventMesh.callback_wrapper(self.confirm(e)),
-                                     lv.EVENT.PRESSING, None)
         
-            no_sim_auto_screen_cancel.add_event_cb(lambda e: EventMesh.callback_wrapper(self.cancel(e)),
-                                     lv.EVENT.PRESSING, None)
             
         self.timer.start(1*1000,1,self.fun)
         self.count = 0
+    
+    def button_cb(self,e,msg):
+        code = e.get_code()
+        indev = lv.indev_get_act()
+        lv.indev_t.wait_release(indev)
+        dir = lv.indev_t.get_gesture_dir(indev)
+        if code == lv.EVENT.GESTURE:
+            if dir == lv.DIR.RIGHT:
+                EventMesh.publish("return_prev_screen")
+
+        elif  code == lv.EVENT.SHORT_CLICKED:
+            if msg != 0:
+                if msg == 1:
+                    EventMesh.publish("load_screen", {"screen": "poweroff_comfirm"})
+                else:
+                    EventMesh.publish("return_prev_screen")
+
+
     def fun(self,*argc):
         EventMesh.publish("system_sleep_rest")#防止黑屏
         self.count+=1
@@ -2285,17 +2290,34 @@ class MessageFullScreen(Screen):
             message_full_cancel.add_flag(lv.obj.FLAG.CLICKABLE)
             message_full_cancel.set_ext_click_area(20)
             self.meta = message_full_screen
-            
-            message_full_confirm.add_event_cb(lambda e: EventMesh.callback_wrapper(self.confirm(e)),lv.EVENT.SHORT_CLICKED, None)
-            message_full_cancel.add_event_cb(lambda e: EventMesh.callback_wrapper(self.concel(e)),lv.EVENT.SHORT_CLICKED, None)
+            message_full_screen.add_event_cb(lambda e:EventMesh.callback_wrapper(self.button_cb(e,0)), lv.EVENT.GESTURE, None)
 
-            message_full_confirm.add_event_cb(lambda e: EventMesh.callback_wrapper(self.confirm(e)),lv.EVENT.PRESSING, None)
-            message_full_cancel.add_event_cb(lambda e: EventMesh.callback_wrapper(self.concel(e)),lv.EVENT.PRESSING, None)
+            message_full_confirm.add_event_cb(lambda e: EventMesh.callback_wrapper(self.button_cb(e,1)),lv.EVENT.SHORT_CLICKED, None)
+            message_full_cancel.add_event_cb(lambda e: EventMesh.callback_wrapper(self.button_cb(e,2)),lv.EVENT.SHORT_CLICKED, None)
+
+            # message_full_confirm.add_event_cb(lambda e: EventMesh.callback_wrapper(self.confirm(e)),lv.EVENT.PRESSING, None)
+            # message_full_cancel.add_event_cb(lambda e: EventMesh.callback_wrapper(self.concel(e)),lv.EVENT.PRESSING, None)
 
 
     def remove_all_sms_cb(self, event, msg):
         sms.deleteMsg(1,4)
 
+    def button_cb(self, e, msg):
+        code = e.get_code()
+        indev = lv.indev_get_act()
+        lv.indev_t.wait_release(indev)
+        dir = lv.indev_t.get_gesture_dir(indev)
+        if code == lv.EVENT.GESTURE:
+            if dir == lv.DIR.RIGHT:
+                EventMesh.publish("load_screen", {"screen": "main_menu"})
+        elif  code == lv.EVENT.SHORT_CLICKED:
+            if msg != 0:
+                if msg == 1:
+                    EventMesh.publish("load_screen", {"screen": "remove_message_popup"})
+                    EventMesh.publish_async("remove_all_sms_cb","",1*1024)
+                elif msg == 2:
+                    EventMesh.publish("return_prev_screen")
+
     def confirm(self, e):
         code = e.get_code()
         if code == lv.EVENT.PRESSING:
@@ -2314,7 +2336,7 @@ class MessageFullScreen(Screen):
                 
             self.is_sliding =0
        
-        
+    
 
     def concel(self, e):
         EventMesh.publish("return_prev_screen")
index 8a361fe..9315f43 100644 (file)
@@ -678,12 +678,6 @@ class TemperatureScreen(Screen):
     def done_return(self): 
         EventMesh.publish("load_screen", {"screen": "health"})
 
-    def done_left_to_right(self):
-        self.timer.stop()
-        EventMesh.publish("set_temp_state",0)
-        EventMesh.publish(constants.EVENT.STOP_TEMP)
-        EventMesh.publish("return_prev_screen")
-
     def btn8_press(self):
         EventMesh.publish("watch_top_show")
         EventMesh.publish("load_screen", {"screen": "main_menu"})
index 1eead47..539aabb 100644 (file)
@@ -270,7 +270,7 @@ class SettingScreen(Screen):
         setting_poweroff_bg_img.add_event_cb(lambda e: EventMesh.callback_wrapper(self.setting_cb(e, "poweroff")), lv.EVENT.SHORT_CLICKED, None)
         # setting_update_bg_img.add_event_cb(lambda e: EventMesh.callback_wrapper(self.setting_cb(e, "update")), lv.EVENT.CLICKED, None)
         setting_version_bg_img.add_event_cb(lambda e: EventMesh.callback_wrapper(self.setting_cb(e, "version")), lv.EVENT.SHORT_CLICKED, None)
-
+        
         # setting_dialswitch_bg_img.add_event_cb(lambda e: EventMesh.callback_wrapper(self.setting_cb(e, "dialswitch")), lv.EVENT.PRESSING, None)
         # setting_themeswitch_bg_img.add_event_cb(lambda e: EventMesh.callback_wrapper(self.setting_cb(e, "themeswitch")), lv.EVENT.PRESSING, None)
         # setting_imei_bg_img.add_event_cb(lambda e: EventMesh.callback_wrapper(self.setting_cb(e, "imei")), lv.EVENT.PRESSING, None)
@@ -1161,8 +1161,10 @@ class PowerOnScreen(Screen):
 
         self.aud.setVolume(self.volum_size)
         self.count = 0
+        self.flag = 0
 
     def initialization(self):
+        print("power fun!!!!!!! initialization\r\n")
         EventMesh.publish("set_UI_high_priority",1)
         self.count = 0
         self.aud.setVolume(11)
@@ -1171,9 +1173,16 @@ class PowerOnScreen(Screen):
         self.timer1.start(3000,0,self.fun_motor)
         self.timer2.start(13000,0,self.to_main_page_fun)
         pass
+    def  fun(self,*data):
+        EventMesh.publish("publish_message_event_ui",{"func":self.fun_cb,"data":0})
 
-    def fun(self,*argc):
+    def fun_cb(self,data):
         EventMesh.publish("system_sleep_rest")#防止黑屏
+        if self.flag == 1:
+            # self.timer.stop()
+            return
+        EventMesh.publish("system_sleep_rest")#防止黑屏
+        print("power fun!!!!!!! {}\r\n".format(self.count))
         if self.count == 0:
             temp = Power.getVbatt()
             if temp > 3400:#低电播放音频会导致一直复位
@@ -1182,9 +1191,8 @@ class PowerOnScreen(Screen):
             
             if self.count >= 9:#在上一个界面在播放音频时切换界面则关闭 以免一直播放
                 self.count = 0
-                self.timer.stop()
-                self.aud.stopAll()
-                
+                self.flag = 1
+                # self.timer.stop()
                 return
         self.count+=1
     def to_main_page_fun(self,*argc):
@@ -1198,6 +1206,7 @@ class PowerOnScreen(Screen):
         EventMesh.publish("set_UI_high_priority",0)
         EventMesh.publish("close_motor_infor")#关闭马达和定时器
         self.timer.stop()
+        self.aud.stopAll()
         self.aud.setVolume(self.volum_size)
         pass
     def done_return(self):
@@ -1414,10 +1423,12 @@ class DialswitchScreen(Screen):
         self.timer.stop()
     
     def done_bottom_to_top(self):
+        return
         self.move = 3
         self.timer.stop()
 
     def done_top_to_bottom(self):
+        return
         self.move = 4
         self.timer.stop()
 
@@ -1431,10 +1442,8 @@ class DialswitchScreen(Screen):
             dialswitch_butoom_crcile1.set_src("E:/static/point_black.png")
             dialswitch_butoom_crcile2.set_src("E:/static/point_white.png")
     def Close(self):
-        self.timer.stop()
+        pass
 
-    # def done_left_to_right(self):
-    #     EventMesh.publish("load_screen", {"screen": "setting"})
     def done_return(self): 
         EventMesh.publish("load_screen", {"screen": "setting"})
 
@@ -1811,9 +1820,6 @@ class BrightnessScreen(Screen):
 
     def btn1_release(self):
         EventMesh.publish("load_screen", {"screen": "setting"})
-        
-    def done_left_to_right(self):
-        EventMesh.publish("return_prev_screen")
 
     def btn8_press(self):
         EventMesh.publish("watch_top_show")
@@ -2078,9 +2084,6 @@ class totalvolumeScreen(Screen):#总的铃声调节
 
     def btn1_release(self):
         EventMesh.publish("load_screen", {"screen": "setting"})
-        
-    def done_left_to_right(self):
-        EventMesh.publish("return_prev_screen")
 
     def btn8_press(self):
         EventMesh.publish("watch_top_show")
index da91ebf..8d8d05f 100644 (file)
@@ -99,13 +99,17 @@ class cameraFullScreen(Screen):#相册已满
     def done_return(self):
         EventMesh.publish("return_prev_screen")
         # EventMesh.publish("load_screen", {"screen": "main_menu"})
-        
-
+    
     def btn1_release(self):
         EventMesh.publish("return_prev_screen")
         # EventMesh.publish("load_screen", {"screen": "main_menu"})
         pass
 
+    def done_left_to_right(self):
+        EventMesh.publish("return_prev_screen")
+        # EventMesh.publish("load_screen", {"screen": "main_menu"})
+        pass
+
     def btn8_press(self):
         EventMesh.publish("watch_top_show")
         EventMesh.publish("load_screen", {"screen": "main_menu"})
@@ -151,7 +155,11 @@ class deletealbumScreen(Screen):#删除图片
     def done_return(self):
         EventMesh.publish("return_prev_screen")
         # EventMesh.publish("load_screen", {"screen": "main_menu"})
-        
+    
+    def done_left_to_right(self):
+        EventMesh.publish("return_prev_screen")
+        # EventMesh.publish("load_screen", {"screen": "main_menu"})
+        pass
 
     def btn1_release(self):
         EventMesh.publish("return_prev_screen")
@@ -2083,14 +2091,13 @@ class videoModeScreen(Screen):#通话模式选择
             # video_select_mode_label2.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT)
 
             self.meta = video_select_mode_screen
+            video_select_mode_screen.add_event_cb(lambda e:EventMesh.callback_wrapper(self.button_cb(e,0)), lv.EVENT.GESTURE, None)
 
-            video_select_mode_btn.add_event_cb(lambda e: EventMesh.callback_wrapper(self.calling_vedio_cb(e,0)),
+            video_select_mode_btn.add_event_cb(lambda e: EventMesh.callback_wrapper(self.button_cb(e,1)),
                                         lv.EVENT.SHORT_CLICKED, None)
-            video_select_mode_btn.add_event_cb(lambda e: EventMesh.callback_wrapper(self.calling_vedio_cb(e,0)), lv.EVENT.PRESSING, None)
 
-            video_select_mode_btn1.add_event_cb(lambda e: EventMesh.callback_wrapper(self.calling_vedio_cb(e,1)),
+            video_select_mode_btn1.add_event_cb(lambda e: EventMesh.callback_wrapper(self.button_cb(e,2)),
                                         lv.EVENT.SHORT_CLICKED, None)
-            video_select_mode_btn1.add_event_cb(lambda e: EventMesh.callback_wrapper(self.calling_vedio_cb(e,1)), lv.EVENT.PRESSING, None)
 
         if self.meta_info != None:
             if len(str(self.meta_info)) != 0:
@@ -2111,6 +2118,25 @@ class videoModeScreen(Screen):#通话模式选择
            self.timer.stop()
            EventMesh.publish("return_prev_screen") 
         pass
+    def button_cb(self,e,msg):
+        code = e.get_code()
+        indev = lv.indev_get_act()
+        lv.indev_t.wait_release(indev)
+        dir = lv.indev_t.get_gesture_dir(indev)
+        if code == lv.EVENT.GESTURE:
+            if dir == lv.DIR.RIGHT:
+                EventMesh.publish("return_prev_screen")
+
+        elif  code == lv.EVENT.SHORT_CLICKED:
+            if msg != 0:
+                if msg == 1:
+                    msg_text = [self.meta_info,1]
+                    EventMesh.publish("publish_message_event_ui",{"func":self.calling,"data":msg_text})
+                else:
+                    msg_text = [self.meta_info,0]
+                    EventMesh.publish("publish_message_event_ui",{"func":self.calling,"data":msg_text})
+                
+
     def calling_vedio_cb(self,e,data):#视频通话
         code = e.get_code()
         if code == lv.EVENT.PRESSING: