44import utime
55import gc
66from machine import ExtInt ,Pin
7+ from misc import PowerKey , Power
78from usr .protocol import WebSocketClient
8- from usr .utils import ChargeManager , AudioManager , NetManager , TaskManager , name
9+ from usr .utils import ChargeManager , AudioManager , NetManager , TaskManager , name , Button
910from usr .threading import Thread , Event , Condition
1011from usr .logging import getLogger
1112import sys_bus
1213import _thread
1314import ujson as json
15+ from misc import USB
1416# from usr import UI
1517
1618
@@ -74,22 +76,25 @@ def __blink_thread_worker(self):
7476 if self .__count is not None :
7577 self .__count -= 1
7678
79+ enable_flag = 0
80+
7781class Application (object ):
7882
7983 def __init__ (self ):
80- # 初始化唤醒按键
81- self .talk_key = ExtInt (ExtInt .GPIO20 , ExtInt .IRQ_RISING_FALLING , ExtInt .PULL_PU , self .on_talk_key_click , 50 )
8284
8385 # 初始化 led; write(1) 灭; write(0) 亮
8486 self .wifi_red_led = Led (33 )
85- self .wifi_green_led = Led (32 )
86- self .power_red_led = Led (39 )
87- self .power_green_led = Led (38 )
87+ self .wifi_green_led = Led (32 ) #ai
88+ self .power_red_led = Led (39 )
89+ self .power_green_led = Led (38 ) #power
8890 self .lte_red_led = Led (23 )
89- self .lte_green_led = Led (24 )
90- self .led_power_pin = Pin (Pin .GPIO27 , Pin .OUT , Pin .PULL_DISABLE , 0 )
91+ self .lte_green_led = Led (24 )#chat
92+ self .led_power_pin = Pin (Pin .GPIO27 , Pin .OUT , Pin .PULL_DISABLE , 1 )
9193 self .prev_emoj = None
92-
94+ # self.power_green_led.blink(500, 500)
95+ self .power_key = PowerKey ()
96+ self .power_key .powerKeyEventRegister (lambda status : None )
97+
9398
9499 # 初始化充电管理
95100 self .charge_manager = ChargeManager ()
@@ -118,6 +123,15 @@ def __init__(self):
118123 self .__voice_activity_event = Event ()
119124 self .__keyword_spotting_event = Event ()
120125
126+ # self.gpio_pin = Pin(Pin.GPIO41, Pin.OUT, Pin.PULL_PD,0)
127+
128+ # 初始化唤醒按键
129+ self .volumedown = ExtInt (ExtInt .GPIO20 , ExtInt .IRQ_RISING , ExtInt .PULL_PU , self .setvolumedown , 200 )
130+ # self.power_down = ExtInt(ExtInt.GPIO41, ExtInt.IRQ_RISING, ExtInt.PULL_PU, self.power_down_handle, 200)
131+ self .volumeup = ExtInt (ExtInt .GPIO47 , ExtInt .IRQ_RISING , ExtInt .PULL_PU , self .setvolumeup , 200 )
132+ # self.wakeup_key = Button(41, delay=3000, long_press_callback=self.power_down_handle, short_press_callback= self.on_talk_key_click)
133+
134+
121135 def __record_thread_handler (self ):
122136 """纯粹是为了kws&vad能识别才起的线程持续读音频"""
123137 logger .debug ("record thread handler enter" )
@@ -126,13 +140,34 @@ def __record_thread_handler(self):
126140 utime .sleep_ms (5 )
127141 logger .debug ("record thread handler exit" )
128142
129-
143+ def on_led (self ):
144+ self .wifi_green_led .on ()
145+ self .lte_green_led .on ()
146+ self .power_green_led .on ()
147+
148+ def off_led (self ):
149+ self .wifi_green_led .off ()
150+ self .lte_green_led .off ()
151+ self .power_green_led .off ()
152+
130153 def start_kws (self ):
131154 self .audio_manager .start_kws ()
132155 self .__record_thread_stop_event .clear ()
133156 self .__record_thread = Thread (target = self .__record_thread_handler )
134157 self .__record_thread .start (stack_size = 64 )
135158
159+ def setvolumeup (self ,args ):
160+ volume = self .audio_manager .setvolume_up ()
161+ print ("setvolumeup:" , volume )
162+ def setvolumedown (self ,args ):
163+ volume = self .audio_manager .setvolume_down ()
164+ print ("setvolumedown:" , volume )
165+
166+ def power_down_handle (self ):
167+ logger .info ("power down" )
168+ Power .powerDown ()
169+
170+
136171 def stop_kws (self ):
137172 self .__record_thread_stop_event .set ()
138173 self .__record_thread .join ()
@@ -154,10 +189,10 @@ def __working_thread_handler(self):
154189
155190 def __chat_process (self ):
156191 global name
192+ self .power_green_led .on ()
157193 self .start_vad ()
158194 try :
159195 with self .__protocol :
160- self .power_red_led .on ()
161196 self .__protocol .hello ()
162197 self .__protocol .wakeword_detected (name )
163198 is_listen_flag = False
@@ -183,21 +218,26 @@ def __chat_process(self):
183218 is_listen_flag = False
184219 if not self .__protocol .is_state_ok ():
185220 break
186- # utime.sleep_ms(1 )
221+ utime .sleep_ms (5 )
187222 # logger.debug("read opus data length: {}".format(len(data)))
188223 except Exception as e :
189224 logger .debug ("working thread handler got Exception: {}" .format (repr (e )))
190225 finally :
191- self .power_red_led .blink (250 , 250 )
226+ print ("__chat_process exit" )
227+ self .lte_green_led .off ()
228+ self .wifi_green_led .off ()
229+ self .power_green_led .blink (500 , 500 )
230+ self .__working_thread = None
192231 self .stop_vad ()
232+ self .start_kws ()
193233
194- def on_talk_key_click (self , args ):
195- logger .info ("on_talk_key_click: " , args )
234+ def on_talk_key_click (self ):
235+ # logger.info("on_talk_key_click: ", args)
196236 if self .__working_thread is not None and self .__working_thread .is_running ():
197237 return
198238 self .__working_thread = Thread (target = self .__working_thread_handler )
199239 self .__working_thread .start ()
200- self .__keyword_spotting_event .clear ()
240+ self .__keyword_spotting_event .set ()
201241
202242 def on_keyword_spotting (self , state ):
203243 logger .info ("on_keyword_spotting: {}" .format (state ))
@@ -216,8 +256,10 @@ def on_voice_activity_detection(self, state):
216256 logger .info ("on_voice_activity_detection: {}" .format (state ))
217257 if state == 1 :
218258 self .__voice_activity_event .set () # 有人声
259+ self .lte_green_led .on ()
219260 else :
220261 self .__voice_activity_event .clear () # 无人声
262+ self .lte_green_led .off ()
221263
222264 def on_audio_message (self , raw ):
223265 # raise NotImplementedError("on_audio_message not implemented")
@@ -289,14 +331,52 @@ def handle_error_message(data, msg):
289331 # raise NotImplementedError("handle_error_message not implemented")
290332
291333 def run (self ):
292- self .charge_manager .enable_charge ()
334+ global enable_flag
335+ self .charge_manager .disable_charge ()
293336 self .audio_manager .open_opus ()
294- self .talk_key .enable ()
337+ self .volumedown .enable ()
338+ self .volumeup .enable ()
339+ self .power_green_led .blink (500 , 500 )
340+ self .wakeup_key = Button (41 , delay = 3000 , long_press_callback = self .power_down_handle , short_press_callback = self .on_talk_key_click )
341+ enable_flag = 1
295342 self .start_kws ()
296- self . led_power_pin . write ( 1 )
297- self . power_red_led . blink ( 250 , 250 )
298- self . stop_vad ()
343+
344+
345+
299346
300- if __name__ == "__main__" :
347+ def usb_callback (conn_status ):
348+ status = conn_status
349+ if not enable_flag :
350+ if status == 0 :
351+ app .off_led ()
352+ Power .powerDown ()
353+ # enable_flag=1
354+ print ('USB is disconnected.' )
355+ elif status == 1 :
356+ app .on_led ()
357+ # enable_flag=0
358+
359+ print ('USB is connected.' )
360+
361+ def power_open_handle ():
362+ if enable_flag :
363+ app .off_led ()
364+ app .run ()
365+ print ("power_open_handle" )
366+
367+
368+
369+ if __name__ == "__main__" :
370+ usb = USB ()
301371 app = Application ()
302- app .run ()
372+ usb .setCallback (usb_callback )
373+ # 检查 USB 连接状态
374+ if usb .getStatus (): # 假设 getStatus() 返回 True 表示 USB 已连接
375+ app .on_led ()
376+ print ("USB 已连接,仅启用充电业务" )
377+ app .charge_manager .enable_charge () # 只启用充电业务
378+ # Button(41, delay=3000, long_press_callback=power_open_handle, short_press_callback= None)
379+
380+ else :
381+ print ("USB 未连接,启动主业务" )
382+ app .run ()
0 commit comments