Skip to content

Commit 7113bb6

Browse files
陈志和陈志和
authored andcommitted
led灯控,重连
1 parent f8b2471 commit 7113bb6

6 files changed

Lines changed: 162 additions & 31 deletions

File tree

README.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,12 @@ QuecPython introduces the Xiaozhi Platform AI Chatbot solution. This solution is
1818

1919
This demo uses an AI development board equipped with the EC800MCNLE module.
2020

21+
22+
23+
**Note: Business access is prohibited when the USB is plugged in. After unplugging the USB, long press the button to start the business. If you need to view the logs, you can connect a USB after startup to view the logs**
24+
25+
26+
2127
## Features
2228

2329
- Supports voice interruption/barge-in.

README_zh.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,12 @@ QuecPython 推出了小智平台 AI 聊天机器人解决方案。该方案基
1818

1919
本案例采用搭载 EC800MCNLE 模组的 AI 开发板。
2020

21+
22+
23+
**注:插 USB 状态下禁止进入业务;拔掉 USB 后,长按按键(红黑束线)即可启动业务;若需查看日志可在启动后连接USB查看日志**
24+
25+
26+
2127
## 功能特性
2228

2329
- 支持语音中断/打断。

src/OTA_test.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ def __init__(self,mac):
3333
}
3434
self.url = "https://api.tenclass.net/xiaozhi/ota/"
3535
# self.url ="http://xiaozhi.pandastroller.com:8002/xiaozhi/ota/"
36+
# self.url = "http://101.37.79.117:8003/xiaozhi/ota/"
3637
self.response = None
3738
self.UDP_IP = None
3839
self.UDP_PORT = None

src/main.py

Lines changed: 103 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,15 @@
44
import utime
55
import gc
66
from machine import ExtInt,Pin
7+
from misc import PowerKey, Power
78
from 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
910
from usr.threading import Thread, Event, Condition
1011
from usr.logging import getLogger
1112
import sys_bus
1213
import _thread
1314
import 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+
7781
class 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()

src/protocol.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@ def set_callback(self, audio_message_handler=None, json_message_handler=None):
106106
def get_mac_address():
107107
mac = str(uuid.UUID(int=int(modem.getDevImei())))[-12:]
108108
return ":".join([mac[i:i + 2] for i in range(0, 12, 2)])
109-
# return "64:e8:33:48:ec:c2"
109+
# return "64:e8:33:48:ec:c9"
110110

111111
@staticmethod
112112
def generate_uuid() -> str:

src/utils.py

Lines changed: 45 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,15 @@
77
import checkNet
88
import sys_bus
99
from machine import Pin
10+
from machine import ExtInt
11+
import osTimer
1012
from usr.threading import PriorityQueue, Thread
1113
from usr.logging import getLogger
1214

1315

1416
logger = getLogger(__name__)
1517
volume = 7
16-
name = '_xiao_zhi_xiao_zhi'
18+
name = '_xiao_yuan_xiao_yuan'
1719
# ==================== 音频管理 ====================
1820

1921

@@ -77,13 +79,13 @@ def stop(self):
7779
def open_opus(self):
7880
self.pcm = audio.Audio.PCM(0, 1, 16000, 2, 1, 15) # 5 -> 25
7981
self.opus = Opus(self.pcm, 0, 60000) # 6000 ~ 128000
80-
82+
8183
def close_opus(self):
8284
self.opus.close()
8385
self.pcm.close()
8486
del self.opus
8587
del self.pcm
86-
88+
8789
def opus_read(self):
8890
return self.opus.read(60)
8991

@@ -120,9 +122,8 @@ def new_name(self,data):
120122
# print("当前唤醒词:", name)
121123
return name
122124
def start_kws(self):
123-
# list=["_xiao_zhi_xiao_zhi","_xiao_tian_xiao_tian","_xiao_zi_xiao_zi","_xiao_shi_xiao_shi","_xiao_si_xiao_si","_xiao_zhi_xiao_zi","_xiao_zi_xiao_zhi"]
124-
# self.rec.ovkws_start("_xiao_zhi_xiao_zhi", 0.7)
125-
self.rec.ovkws_start(name, 0.7)
125+
list=["_xiao_tian_xiao_tian",name,"_jiang_gou_jiang_gou"]
126+
self.rec.ovkws_start(list, 0.7)
126127

127128

128129
def stop_kws(self):
@@ -131,7 +132,7 @@ def stop_kws(self):
131132
def start_vad(self):
132133
self.__skip = 0
133134
self.rec.vad_start()
134-
135+
135136
def stop_vad(self):
136137
self.rec.vad_stop()
137138

@@ -247,3 +248,40 @@ def run_forever(self):
247248

248249
def submit(self, func, args=(), kwargs={}, priority=0, title="anon"):
249250
self.__q.put(_Task(target=func, args=args, kwargs=kwargs, priority=priority, title=title))
251+
252+
253+
254+
255+
256+
257+
class Button(object):
258+
259+
def __init__(self, gpio_number, delay=3000, long_press_callback=lambda: None, short_press_callback=lambda: None):
260+
self.key = ExtInt(getattr(ExtInt, "GPIO{}".format(gpio_number)), ExtInt.IRQ_RISING_FALLING, ExtInt.PULL_PU, self.__callback, 150)
261+
self.key.enable()
262+
self.delay = delay
263+
self.timer = osTimer()
264+
self.start_time = None
265+
self.end_time = None
266+
self.long_press_callback = long_press_callback
267+
self.short_press_callback = short_press_callback
268+
self.is_pressed = False # 状态变量:按键是否被按下
269+
270+
271+
def __callback(self, args):
272+
gpio_number, mode = args
273+
if not self.is_pressed:
274+
# 下降沿,按下
275+
print("按键按下")
276+
self.is_pressed = True
277+
self.start_time = utime.ticks_ms()
278+
self.timer.start(self.delay, 0, lambda args: self.long_press_callback())
279+
elif self.is_pressed:
280+
# 上升沿,释放
281+
print("按键释放")
282+
self.is_pressed = False
283+
self.timer.stop()
284+
self.end_time = utime.ticks_ms()
285+
duration = utime.ticks_diff(self.end_time, self.start_time)
286+
if duration < self.delay:
287+
self.short_press_callback()

0 commit comments

Comments
 (0)