1.优化按键使用
authorazao <821478748@qq.com>
Tue, 30 Sep 2025 10:21:11 +0000 (18:21 +0800)
committerazao <821478748@qq.com>
Tue, 30 Sep 2025 10:24:16 +0000 (18:24 +0800)
2.处理定时器时间过短问题,发送状态改为5分钟一次,检查重连改为20S一次
3.标志位判断线程状态改为线程返回值判断状态
Signed-off-by: azao <821478748@qq.com>
2.sdk/project/K8/sdk/services/microPython/ports/quectel/core/ai_VC.py
2.sdk/project/K8/sdk/services/microPython/ports/quectel/core/protocol.py
2.sdk/project/K8/sdk/services/microPython/ports/quectel/core/ui.py

index 40043f2..4635146 100644 (file)
@@ -295,10 +295,9 @@ class AI_dev(Abstract):
         self.check_rest_timer_count = 0
 
         #双击逻辑
-        self.last_time = 0 #上次时间
-        self.gap_time = 1500 #双击间隔时间(ms)
-        self.double_flag = 0 #双击标志
-        self.double_release_timer = osTimer()#双击释放定时器
+        self.is_double_timer = osTimer()#单/双击判断定时器
+        self.double_click_threshold = 2000#双击间隔时间
+        self.press_count = 0#按下次数
         print("AI_dev:end")
     def ntptime_cb(self):
         #ntptime.settime(8)
@@ -436,64 +435,45 @@ class AI_dev(Abstract):
     def keyAI_extint_cb(self,args):#call 2
         try:
             self.KeyAI_status = int(args[1])
-            if self.KeyAI_status == 0:
-                self.KeyAI_status = 1
-            else:
-                self.KeyAI_status = 0
-            current_time = utime.ticks_ms()
-            if self.KeyAI_status == 0:#按下
-                if self.KeyAI_press == 0 :
-                    time_tiff = utime.ticks_diff(current_time,self.last_time)#计算时间差(处理溢出
-                    print("双击时间差为:{}".format(time_tiff))
-                    if time_tiff < 0 :
-                        print("双击时间已经溢出")
-                    if time_tiff > 0 and current_time - self.last_time <= self.gap_time:#鉴定为双击
-                        print("AI_key_double_press DOUBLE DOUBLE ")
-                        self.double_flag = 1#切换标志位
-                        self.KeyAI_long_press = 0
-                        self.KeyAI_press = 0
-                        self.KeyAI_timer_count = 0
-                        EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_key_double_press})
-                        # 启动双击释放检测计时器
-                        self.double_release_timer.start(500, 0, self.double_release_timeout)
-                        return
-                    elif time_tiff > 0 and current_time - self.last_time > self.gap_time:#判断为单击      
-                        EventMesh.publish(constants.EVENT.SYSTEM_UP)#唤醒休眠
-                        self.extint_AI.disable()
-                        self.KeyAI_press = 1
-                        self.KeyAI_long_press = 0
-                        self.double_flag = 0
-                        self.KeyAI_timer.start(100, 1, self.KeyAI_timer_cb)
-                        self.KeyAI_timer_count = 0
-                        #EventMesh.publish("AI_key_press")
-                        screen_name = EventMesh.publish("get_screen_NAME")
-                        if screen_name != "system_init" and screen_name != "poweron":
-                            if dev_type == "7PIN" or dev_type == "7PIN_coze" :
-                                self.aud.aud_tone_play(10,200)#播放按键音  
-                            EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_key_press})
-                        self.last_time = current_time
-            else:  # 释放
-                if self.double_flag:
-                    # 双击释放处理
-                    self.double_flag = 0
-                    EventMesh.publish("publish_AI_btnInfo", {"func": self.AI_key_double_release})
-                    self.extint_AI.enable()
-                    self.KeyAI_timer.stop()
-                    self.KeyAI_timer_count = 0
-                    self.KeyAI_press = 0
-                    return            
+            if self.KeyAI_status == 1:  # 仅处理"按下瞬间"的事件
+                    self.press_count += 1  # 按下次数+1
+                    current_time = utime.ticks_ms()  # 当前时间戳(ms)
                     
+                    if self.press_count == 1:  # 第一次按下
+                        self.first_press_time = current_time  # 记录第一次按下时间
+                        self.AI_key_press()  # 触发单击业务(无音频,音频确定后播放)
+                        # 启动定时器:超过阈值未第二次按下则判定为单击
+                        self.is_double_timer.start(self.double_click_threshold, 0, self.is_double_judge)
+                        print("第一次按下,等待{}ms内第二次按下".format(self.double_click_threshold))
+                    
+                    elif self.press_count == 2:  # 第二次按下
+                        # 计算与第一次按下的间隔
+                        interval = utime.ticks_diff(current_time, self.first_press_time)
+                        if interval <= self.double_click_threshold:  # 间隔符合双击
+                            EventMesh.publish("AI_VC_Close")
+                            self.AI_key_double_press()  # 触发双击业务
+                            # 停止定时器(已判定为双击,无需再检查单击)
+                            self.is_double_timer.stop()
+                            # 重置计数(准备下一次判断)
+                            self.press_count = 0
+                        else:  # 间隔过长,视为新的第一次按下
+                            self.first_press_time = current_time  # 更新第一次按下时间
+                            self.press_count = 1  # 重置为第一次
+                            # 重启定时器
+                            self.is_double_timer.stop()
+                            self.is_double_timer.start(self.double_click_threshold, 0, self.is_double_judge)
+                            print("间隔过长,视为新的第一次按下")
+
         except Exception as e: 
             usys.print_exception(e)
-    def double_release_timeout(self, *args, **kwargs):#双击释放超时处理
-        print("定时器未关闭!!!!!!!!")
-        if self.double_flag:
-            #如果超时仍未释放,重置双击状态
-            self.double_flag = 0
-            self.double_release_timer.stop()
-
-    def AI_key_double_release(self):
-        EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_key_double_press})
+    def is_double_judge(self, *args):
+        if self.press_count == 1:  # 仅一次按下,判定为单击
+            screen_name = EventMesh.publish("get_screen_NAME")
+            if screen_name == "system_init" or screen_name == "poweron" :
+                return
+            EventMesh.publish("audio_montage_play",["chenggong.mp3"])  #进入VC音频
+        # 重置计数(无论何种情况,超时后清零)
+        self.press_count = 0
 
     def KeyAI_timer_cb(self, *args, **kwargs):
     #     EventMesh.publish("publish_AI_btnInfo",{"func":self.KeyAI_timer_cb_})
@@ -2073,6 +2053,7 @@ class AI_VC(Abstract):
         EventMesh.subscribe("draw_handle", self.draw_handle)
         EventMesh.subscribe("dmp_update", self.dmp_update)
         EventMesh.subscribe("update_volume", self.update_volume)
+        EventMesh.subscribe("AI_VC_Close", self.Close)
         EventMesh.publish("close_led")
 
         self.bot_name = "柒先生"
@@ -2347,6 +2328,9 @@ class AI_VC(Abstract):
             #EventMesh.publish("set_audio_state", 0)   
             print('audio-play finish.!!!!!!')
     def AI_key_double_press(self, event, msg):#双击按键
+        screen_name = EventMesh.publish("get_screen_NAME")
+        if screen_name != "UI_ai":
+            return
         print("AI_key_double_press")
         # self.Close_flag = 1
         self.Close()
@@ -2355,6 +2339,9 @@ class AI_VC(Abstract):
         # EventMesh.publish("return_prev_screen")
 
     def AI_key_press(self, event, msg):#按键按下
+        screen_name = EventMesh.publish("get_screen_NAME")
+        if screen_name == "system_init" or screen_name == "poweron" :
+            return
         # 测试闹钟功能
         # EventMesh.publish("AI_alarm_open")
         # EventMesh.publish("AI_add_alarm",[{"alarm_type":"单次闹钟","alarm_timestamp":1753071946,"repeat_day":"2025-07-21","repeat_min":0,"valid_time":"","alarm_timer":"12:25","alarm_content":"开会"}])
@@ -2382,7 +2369,7 @@ class AI_VC(Abstract):
         lv.img.cache_invalidate_src(None)
         lv.img.cache_set_size(8)
         EventMesh.publish("load_screen", {"screen": "UI_ai"})#ai画面
-        EventMesh.publish("audio_montage_play",["chenggong.mp3"])  
+        # EventMesh.publish("audio_montage_play",["chenggong.mp3"])  
         # if dev_type != "7PIN":
         #     self.chenggong_tone()
         # self.Close()
index b5e566e..6b83599 100644 (file)
@@ -528,9 +528,9 @@ class SockMangager(Abstract):
         self.socket_send_queue_id = None
         self.bat_count = 0
         self.reconnect_count = 0 #连续重连次数 默认十次 不过就不重连了 等下一个心跳重连
-        self._1S_timer = osTimer()
+        self._20S_timer = osTimer()
         self._1scnt = 0
-        self._5S_timer = osTimer()
+        self._5M_timer = osTimer()
         self._10Stimer = osTimer()
         self.timer_id = 0
         self.start_voice_flag = 0
@@ -540,8 +540,6 @@ class SockMangager(Abstract):
         #对话状态,一秒检查一次
         self.last_data = None  # 保存上一次的数据状态
         self.current_data = None  # 当前数据
-
-        self.send_recv_flag = 0#线程开启状态
         EventMesh.subscribe("REPORT_ALARM_TO_IOT",self.report_alarm_to_iot)
 
     def report_alarm_to_iot(self,event,msg):
@@ -569,10 +567,10 @@ class SockMangager(Abstract):
         EventMesh.publish("publish_AI_btnInfo",{"func":self.send_packet_iot,"data":WEB_CMD_ENUM.POST_DEVICE_STATE_S_CMD})#上报VC状态
 
     def send_unbind_dev_to_iot(self,event,msg):
-        self._5S_timer.start(30000,1,self._1M_timer_cb)
-        self._1S_timer.start(1000,1,self._1S_timer_cb)
+        self._5M_timer.start(60000*5,1,self._5M_timer_cb)#更新信息
+        self._20S_timer.start(20000,1,self._20S_timer_cb)#重连
         # self._10Stimer.start(50000,1,self._10S_timer_cb)
-    def _1M_timer_cb(self,*argc):
+    def _5M_timer_cb(self,*argc):
         EventMesh.publish("heart_IOT")#开启IOT心跳包
         EventMesh.publish("send_device_information")#发送设备信息
         pass
@@ -648,19 +646,18 @@ class SockMangager(Abstract):
                     self.IOT_sock.connect(('iot.socket.thisiot.com', 7777))
                     #设置为非阻塞
                     self.IOT_sock.setblocking(False)
-
-                if self.send_recv_flag == 0:#线程未开启过
-                    self.send_recv_flag = 1
-                    self.reconnect_count = 0
+                self.reconnect_count = 0
+                # print("self.socket_send_queue_id = {} , self.iot_protoclo_recv_id = {}".format(self.socket_send_queue_id,self.iot_protoclo_recv_id))
+                if self.socket_send_queue_id == None:
                     _thread.stack_size(self.thread_buf_size+8*1024) #_thread.stack_size(16*1024)
                     self.socket_send_queue_id = _thread.start_new_thread(self.socket_send_queue_thread, ())
                     _thread.stack_size(8*1024)
-                
+                if self.iot_protoclo_recv_id == None:
                     _thread.stack_size(self.thread_buf_size+8*1024)
                     self.iot_protoclo_recv_id = _thread.start_new_thread(self.iot_protocol_recv, ())
                     _thread.stack_size(8*1024)
 
-                    socket_log.info("self.IOT_sock thread init!!!!!!!!!")
+                socket_log.info("self.IOT_sock thread init!!!!!!!!!")
 
 
                 if self.IOT_sock is not None:
@@ -751,10 +748,10 @@ class SockMangager(Abstract):
         return ustruct.pack('<H', crc & 0xFFFF)
         
     def close_socket_timer(self,event,msg):
-        self._1S_timer.stop()
-        self._5S_timer.stop()
+        self._20S_timer.stop()
+        self._5M_timer.stop()
     
-    def _1S_timer_cb(self,*argc):
+    def _20S_timer_cb(self,*argc):
         self.current_data = EventMesh.publish("screen_get_ai")  # 当前数据
         if self.current_data is not self.last_data :
             print("VC状态改变")
@@ -876,7 +873,6 @@ class SockMangager(Abstract):
                 _thread.stop_thread(self.socket_send_queue_id)
             except Exception as e:
                 print("iot_send_queue_close !!!!!!!!")
-        self.send_recv_flag = 0
         print("iot_send_queue_close 1111!!!!!!!!")
         self.socket_send_queue_id = None
     
index 825ffdc..2d2c480 100644 (file)
@@ -1817,6 +1817,7 @@ class UI_ai(Screen):
         #获取ai状态
         ai_status = EventMesh.publish("screen_get_ai")
         draw_status = EventMesh.publish("screen_get_draw")
+        EventMesh.publish("send_device_VC_state")#上传VC状态
         # print ("draw_status = {}".format(draw_status))
         # print("ai_status = {}".format(ai_status))
         self.__ai_vc(None, ai_status,draw_status)
@@ -7030,6 +7031,7 @@ class UI(object):
         lv.scr_load(lv.scr_act())
         utime.sleep_ms(900)
         PWM_backlight.open()
+        
 
     def gsensor_cb(self, para):
         print("gsensor_cb:{}".format(para))
@@ -7038,12 +7040,14 @@ class UI(object):
         elif para == 1: #抬腕
             if self.rotate_flag == 1:
                 print("抬腕!!!111")
-                self.set_rotation(0)
+                # self.set_rotation(0)
+                EventMesh.publish("publish_message_event_ui",{"func":self.set_rotation,"data":0})
                 self.rotate_flag = 0
         elif para == 2: #放手
             if self.rotate_flag == 0:
                 print("放手!!!!")
-                self.set_rotation(2)
+                # self.set_rotation(2)
+                EventMesh.publish("publish_message_event_ui",{"func":self.set_rotation,"data":2})
                 self.rotate_flag = 1
             pass