From: azao <821478748@qq.com> Date: Tue, 30 Sep 2025 10:21:11 +0000 (+0800) Subject: 1.优化按键使用 X-Git-Url: http://git.snicker.com.cn/?a=commitdiff_plain;h=3e38b1dfb2957217d0b636d8d2c8a26cfc44c613;p=mirrors%2FASR1603_G5.git 1.优化按键使用 2.处理定时器时间过短问题,发送状态改为5分钟一次,检查重连改为20S一次 3.标志位判断线程状态改为线程返回值判断状态 Signed-off-by: azao <821478748@qq.com> --- diff --git a/2.sdk/project/K8/sdk/services/microPython/ports/quectel/core/ai_VC.py b/2.sdk/project/K8/sdk/services/microPython/ports/quectel/core/ai_VC.py index 40043f27..4635146e 100644 --- a/2.sdk/project/K8/sdk/services/microPython/ports/quectel/core/ai_VC.py +++ b/2.sdk/project/K8/sdk/services/microPython/ports/quectel/core/ai_VC.py @@ -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() diff --git a/2.sdk/project/K8/sdk/services/microPython/ports/quectel/core/protocol.py b/2.sdk/project/K8/sdk/services/microPython/ports/quectel/core/protocol.py index b5e566e8..6b835997 100644 --- a/2.sdk/project/K8/sdk/services/microPython/ports/quectel/core/protocol.py +++ b/2.sdk/project/K8/sdk/services/microPython/ports/quectel/core/protocol.py @@ -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('