From: azao <821478748@qq.com> Date: Tue, 22 Apr 2025 01:47:22 +0000 (+0800) Subject: 2025/4/22一修版本 X-Git-Url: http://git.snicker.com.cn/Users/apple/Desktop/static/gitweb.css?a=commitdiff_plain;h=848b6e5dc428e8f0d62e31e0ae8cd5950e87cae2;p=mirrors%2FASR1603_G5.git 2025/4/22一修版本 --- diff --git a/2.sdk/project/D10/merge_bin.py b/2.sdk/project/D10/merge_bin.py deleted file mode 100644 index 1ab622ae..00000000 --- a/2.sdk/project/D10/merge_bin.py +++ /dev/null @@ -1,46 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -#直接执行 python merge_bin.py 会自动生成一个audio.bin这个名字可更改和一个list.json文件 -""" -@FileName : merge_bin.py -@Author : zhen.guo -@Email : zhen.guo@quectel.com -@Date : 2022-08-05 09:58:14 -""" -import os -output_list = [] -# 文件名--》下标 -def text_to_hash(filename: str) -> str: - output_list.append(filename.split("\\")[-1][:-4]) - print(str(len(output_list)-1) + filename[-4:]) - return str(len(output_list)-1) + filename[-4:] - - -def merge_bin(res='res.bin', *args): - # 入参文件夹和文件处理 - file_list = [] - for i in args: - if os.path.isdir(i): - for j in os.walk(i): - for x in j[2]: - file_list.append(j[0] + x) - else: - file_list.append(i) - f = open(res, 'wb') - fileheader = bytes("montage", 'utf-8') + bytes(1) + bytes.fromhex('%08X' % len(file_list))[::-1] - filebyte, bytesize, filebody = b'', 0, b'' - for i in file_list: - print(i) - filename_byte = bytes(text_to_hash(i), 'utf-8') - filebyte += (filename_byte + bytes(128-len(filename_byte)) + bytes.fromhex('%08X' % (len(file_list)*136 + 12 + bytesize))[::-1] + bytes.fromhex('%08X' % os.path.getsize(i))[::-1]) - bytesize += os.path.getsize(i) - filebody += open(i, 'rb').read() - f.write(fileheader + filebyte + filebody) - f.close() - print(output_list) - with open('list.json', 'w') as f: - f.write(str(output_list)) - print("----MERGE SUCCESS----") - return output_list - -output_list = merge_bin("D:\\1.workspace\\3.ASR\\2.G5\\1.Code\\ASR1603_G5\\2.sdk\\project\\D10\\audio.bin", "D:\\1.workspace\\3.ASR\\2.G5\\1.Code\\ASR1603_G5\\2.sdk\\project\\D10\\audio\\") \ No newline at end of file diff --git a/2.sdk/project/D10/sdk/services/microPython/ports/quectel/core/Makefile b/2.sdk/project/D10/sdk/services/microPython/ports/quectel/core/Makefile index 55901308..8eda4612 100644 --- a/2.sdk/project/D10/sdk/services/microPython/ports/quectel/core/Makefile +++ b/2.sdk/project/D10/sdk/services/microPython/ports/quectel/core/Makefile @@ -961,15 +961,14 @@ frozen_mpy_list = $(BUILD)/_boot.mpy \ $(BUILD)/constants.mpy \ $(BUILD)/EventMesh.mpy \ $(BUILD)/mgr.mpy \ + $(BUILD)/ai_VC.mpy \ $(BUILD)/protocol.mpy \ $(BUILD)/ui.mpy \ $(BUILD)/main_init.mpy \ $(BUILD)/versions.mpy \ $(BUILD)/led.mpy \ - $(BUILD)/btn_device_ec800m_d15.mpy \ - $(BUILD)/led_d15.mpy \ - $(BUILD)/mgr_d15.mpy \ $(BUILD)/motor.mpy \ + endif @@ -996,6 +995,7 @@ frozen_mpy_list = $(BUILD)/_boot.mpy \ $(BUILD)/event_message.mpy \ $(BUILD)/bak_util.mpy \ $(BUILD)/ymodem.mpy \ + else frozen_mpy_list = $(BUILD)/_boot.mpy \ @@ -1034,6 +1034,7 @@ frozen_mpy_list = $(BUILD)/_boot.mpy \ $(BUILD)/uping.mpy \ $(BUILD)/ymodem.mpy \ + endif else ifeq ($(strip $(PLAT)),EIGEN) @@ -1094,6 +1095,7 @@ frozen_mpy_list = $(BUILD)/_boot.mpy \ $(BUILD)/cellLocator.mpy \ $(BUILD)/ymodem.mpy \ + endif else ifeq ($(strip $(PLAT)),ECR6600) diff --git a/2.sdk/project/D10/sdk/services/microPython/ports/quectel/core/ai_VC.py b/2.sdk/project/D10/sdk/services/microPython/ports/quectel/core/ai_VC.py new file mode 100644 index 00000000..fc7abebf --- /dev/null +++ b/2.sdk/project/D10/sdk/services/microPython/ports/quectel/core/ai_VC.py @@ -0,0 +1,4161 @@ +from common import Abstract, LogAdapter +import EventMesh +import uwebsocket +import usys +import gc +import urandom +import uhashlib +import ubinascii +import ujson +import osTimer +import _thread +from queue import Queue +import utime +import audio +import uos +from machine import Pin +from machine import ExtInt +from machine import WDT +import modem +import sim +import net +import base64 +import ucryptolib +import urandom as random +import request +import ql_fs +from misc import Power,USB,PowerKey +import ntptime +import machine +import dataCall +import constants +import versions +from machine import RTC +from led import open_all_ledm,white_green_open,white_green_close,led_mode,open_led_red,close_led_red,open_led_green,open_led_white,close_led_green,close_led_white,close_all_ledm,white_light_fast +from misc import USB + +#import VAD +#dev_type = "G10" +dev_type = "7PIN_BK"#小瑞 +#dev_type = "7PIN"#柒牌 +#dev_type = 'momo'#食梦貘 +#dev_type = 'sjgq'#四季甘泉 +#dev_type = 'szbst'#深圳百事通 +class AI_led(Abstract): + def __init__(self): + if dev_type == "G10": + self.led_red = Pin(Pin.GPIO36, Pin.OUT, Pin.PULL_PD, 0) + self.led_green = Pin(Pin.GPIO44, Pin.OUT, Pin.PULL_PD, 1) + self.led_blue = Pin(Pin.GPIO21, Pin.OUT, Pin.PULL_PD, 1) + else: + self.led_red = Pin(Pin.GPIO36, Pin.OUT, Pin.PULL_PD, 0) + self.led_green = Pin(Pin.GPIO21, Pin.OUT, Pin.PULL_PD, 1) + self.led_blue = Pin(Pin.GPIO19, Pin.OUT, Pin.PULL_PD, 1) + + #=1 红灯闪,=2白灯闪,=3绿灯闪,=4全部灯闪 + self.led_flicker_flag = 0 + self.led_flicker_on_off_flag = 0 + self.led_flicker_timer = osTimer() + + EventMesh.subscribe("open_led_red",self.open_led_red) + EventMesh.subscribe("open_led_blue",self.open_led_blue) + EventMesh.subscribe("open_led_green",self.open_led_green) + EventMesh.subscribe("open_led_all",self.open_led_all) + EventMesh.subscribe("open_led_red_blue",self.open_led_red_blue) + EventMesh.subscribe("open_led_red_green",self.open_led_red_green) + EventMesh.subscribe("flicker_led_red",self.flicker_led_red) + EventMesh.subscribe("flicker_led_blue",self.flicker_led_blue) + EventMesh.subscribe("flicker_led_green",self.flicker_led_green) + EventMesh.subscribe("flicker_led_all",self.flicker_led_all) + EventMesh.subscribe("close_led",self.close_led) + EventMesh.publish("open_led_red") + + def flicker_led_red(self,event,msg): + self.led_flicker_flag = 1 + self.led_flicker_timer.start(1500, 1, self.led_flicker_timer_cb) + + def flicker_led_blue(self,event,msg): + self.led_flicker_flag = 2 + self.led_flicker_timer.start(1500, 1, self.led_flicker_timer_cb) + + def flicker_led_green(self,event,msg): + self.led_flicker_flag = 3 + self.led_flicker_timer.start(1500, 1, self.led_flicker_timer_cb) + + def flicker_led_all(self,event,msg): + self.led_flicker_flag = 4 + self.led_flicker_timer.start(1500, 1, self.led_flicker_timer_cb) + + def led_flicker_timer_cb(self, *args, **kwargs): + EventMesh.publish("publish_AI_btnInfo",{"func":self.led_flicker_timer_cb_}) + def led_flicker_timer_cb_(self): + if self.led_flicker_flag == 0: + self.led_flicker_timer.stop() + return + if self.led_flicker_on_off_flag == 0: + self.led_red.write(0) + self.led_blue.write(0) + self.led_green.write(0) + self.led_flicker_on_off_flag = 1 + else: + self.led_flicker_on_off_flag = 0 + if self.led_flicker_flag == 1: + self.led_blue.write(0) + self.led_green.write(0) + self.led_red.write(1) + elif self.led_flicker_flag == 2: + self.led_red.write(0) + self.led_green.write(0) + self.led_blue.write(1) + elif self.led_flicker_flag == 3: + self.led_red.write(0) + self.led_blue.write(0) + self.led_green.write(1) + elif self.led_flicker_flag == 4: + self.led_blue.write(1) + self.led_green.write(1) + self.led_red.write(1) + + def open_led_red(self,event,msg): + #print("open_led_red") + self.led_flicker_flag = 0 + #self.led_red.write(0) + self.led_blue.write(0) + self.led_green.write(0) + self.led_red.write(1) + + def open_led_blue(self,event,msg): + #print("open_led_blue") + self.led_flicker_flag = 0 + self.led_red.write(0) + #self.led_blue.write(0) + self.led_green.write(0) + self.led_blue.write(1) + + def open_led_green(self,event,msg): + #print("open_led_green") + self.led_flicker_flag = 0 + self.led_red.write(0) + self.led_blue.write(0) + #self.led_green.write(0) + self.led_green.write(1) + + def open_led_red_blue(self,event,msg): + #print("open_led_blue") + self.led_flicker_flag = 0 + self.led_red.write(1) + #self.led_blue.write(0) + self.led_green.write(0) + self.led_blue.write(1) + + def open_led_red_green(self,event,msg): + #print("open_led_blue") + self.led_flicker_flag = 0 + self.led_red.write(1) + #self.led_blue.write(0) + self.led_green.write(1) + self.led_blue.write(0) + + def open_led_all(self,event,msg): + #print("open_led_all") + self.led_flicker_flag = 0 + #self.led_red.write(0) + self.led_blue.write(1) + self.led_green.write(1) + self.led_red.write(1) + + def close_led(self,event,msg): + #print("close_led") + self.led_flicker_flag = 0 + self.led_red.write(0) + self.led_blue.write(0) + self.led_green.write(0) + +audio_buf = ['chenggong', 'didianguanji', 'IMEIhao', 'jianquancuowu', 'key_prompt', 'liuliangtishi', 'Low_power_warning', 'R_CHARGE_FULL', 'R_CHARGE_IN', 'R_CHARGE_OUT', 'R_READ_TIME_0', 'R_READ_TIME_1', 'R_READ_TIME_2', 'R_READ_TIME_3', 'R_READ_TIME_4', 'R_READ_TIME_5', 'R_READ_TIME_6', 'R_READ_TIME_7', 'R_READ_TIME_8', 'R_READ_TIME_9', 'R_READ_TIME_A', 'R_READ_TIME_B', 'R_READ_TIME_C', 'R_READ_TIME_D', 'R_READ_TIME_E', 'R_READ_TIME_F', 'R_READ_TIME_G', 'R_READ_TIME_H', 'R_READ_TIME_I', 'R_READ_TIME_J', 'R_READ_TIME_K', 'R_READ_TIME_L', 'R_READ_TIME_M', 'R_READ_TIME_N', 'R_READ_TIME_O', 'R_READ_TIME_P', 'R_READ_TIME_Q', 'R_READ_TIME_R', 'R_READ_TIME_S', 'R_READ_TIME_T', 'R_READ_TIME_U', 'R_READ_TIME_V', 'R_READ_TIME_W', 'R_READ_TIME_X', 'R_READ_TIME_Y', 'R_READ_TIME_Z', 'send_tone', 'shouhou', 'xinhaoruo1', 'zhengzaiguanji'] +class AI_dev(Abstract): + # AI + def __init__(self): + self.is_wdt = 0 #是否开启看门狗 + + self.VBATT_tab = {"charge_full":4300,"100" :4250 , "90":4179 , "80":4070, "60": 3883, "40":3770, "20":3699, "10":3652,"5":3600,} + self.KeyAI_status = 0 + self.KeyAI_timer_count = 0 + self.KeyAI_long_press = 0 + self.KeyAI_press = 0 + if self.is_wdt == 1: + self.wdt = WDT(30) #开启看门狗 + # self.wdt_timer = osTimer() + # self.wdt_timer.start(5000, 1, self.wdt_timer_cb) + count = 0 + while True: + count += 1 + if count > 20 : + break + data = dataCall.getInfo(1, 0) + print("data call INFO {}".format(data)) + if data[2][0]: + self.network_state = 1 + break + print("等待网络 {}...".format(count)) + utime.sleep_ms(500) + self.KeyAI_timer = osTimer() + # if dev_type == "G10": + # self.extint_AI = ExtInt(ExtInt.GPIO19,ExtInt.IRQ_RISING_FALLING, ExtInt.PULL_PU, self.keyAI_extint_cb) + # self.pwk_key = ExtInt(ExtInt.GPIO26, ExtInt.IRQ_RISING_FALLING, ExtInt.PULL_PU, self.pwk_extint_cb) + # else: + # self.pwk_key = ExtInt(ExtInt.GPIO26, ExtInt.IRQ_RISING_FALLING, ExtInt.PULL_PU, self.pwk_extint_cb) + + self.pwk_key_status = 0 + self.pwk_key_timer_count = 0 + self.pwk_key_long_press = 0 + self.pwk_key_press = 0 + self.pwk_key_timer = osTimer() + #self.pwk_key = ExtInt(ExtInt.GPIO26, ExtInt.IRQ_RISING_FALLING, ExtInt.PULL_DISABLE, self.pwk_extint_cb) + + # self.pwk_key.enable() + print("AI_dev:1") + self.btnInfo_queue = Queue(100) + self.btnInfo_queue_count = 0 + _thread.stack_size(16*1024) + self.btnInfo_queue_thread_id = _thread.start_new_thread(self.btnInfo_queue_thread, ()) + _thread.stack_size(8*1024) + EventMesh.subscribe("publish_AI_btnInfo",self.publish_AI_btnInfo) + EventMesh.subscribe("get_battery",self.get_battery) + EventMesh.subscribe("audio_montage_play",self.audio_montage_play) + EventMesh.subscribe("paly_iccid_imei",self.paly_iccid_imei) + EventMesh.subscribe("paly_device_res_error",self.paly_device_res_error) + EventMesh.subscribe("Power_off",self.pwk_key_Long_Press) + EventMesh.subscribe("keyAI_extint_cb", self.keyAI_extint_cb) + EventMesh.subscribe("get_usb_state", self.get_usb_state) + print("AI_dev:2") + self.pk = PowerKey() + self.pk.powerKeyEventRegister(self.powerKey_callback) + self.usb = USB() + self.usb.setCallback(self.usb_event_cb) + self.usb_status = self.usb.getStatus() + self.usb_charge_flag = 0 + self.Low_power_warning_timer = 0 + self.AI_dev_timer = osTimer() + self.AI_dev_timer.start(10000, 1, self.AI_dev_timer_cb) + print("AI_dev:AI_dev_timer") + self.aud = audio.Audio(0) + self.Low_power_warning_flag = 0 + self.VC_TTS_volume = EventMesh.publish("get_storage_ai_config","VC_TTS_volume")#音量配置 + if self.VC_TTS_volume == None: + self.VC_TTS_volume = 100 + self.aud.setVolume(self.VC_TTS_volume //10) + #self.aud.play(1,0,'U:/static/xianyikaiji.mp3')#开机音频 + #EventMesh.publish("audio_montage_play",["xianyikaiji.mp3"]) + #EventMesh.publish("publish_AI_btnInfo",{"func":self.ntptime_cb}) + self.check_rest_timer_count = 0 + print("AI_dev:end") + def ntptime_cb(self): + #ntptime.settime(8) + print("timer:{}!!!!!!!!\r\n".format(utime.localtime())) + def usb_event_cb(self, state): + EventMesh.publish("publish_AI_btnInfo",{"func":self.usb_event,"data":state}) + + def usb_event(self, state): + status = state + self.usb_charge_flag = 0 + if status == 1:#插入USB + print("charge R_CHARGE_in") + self.usb_status = 1 + VC_satrt_flag = EventMesh.publish("get_VC_satrt_flag")#获取vc是否在运行 + if VC_satrt_flag == None: + VC_satrt_flag = 0 + if VC_satrt_flag == 0: + self.aud.stop() + #EventMesh.publish("flicker_led_red")#充电闪灯 + #self.aud.play(1,1,'U:/static/R_CHARGE_IN.mp3') + # EventMesh.publish("open_led_red")#充电红灯常亮 + close_all_ledm() + open_led_red() + #EventMesh.publish("audio_montage_play",["R_CHARGE_IN.mp3"]) + self.aud.play(1,1,'U:/static/R_CHARGE_IN.mp3') + self.Low_power_warning_flag = 0 + pass + elif status == 0:#拨出usbs + self.usb_status = 0 + VC_satrt_flag = EventMesh.publish("get_VC_satrt_flag")#获取vc是否在运行 + if VC_satrt_flag == None: + VC_satrt_flag = 0 + if VC_satrt_flag == 0: + self.aud.stop() + # EventMesh.publish("close_led") + close_all_ledm() + #EventMesh.publish("audio_montage_play",["R_CHARGE_OUT.mp3"]) + self.aud.play(1,1,'U:/static/R_CHARGE_OUT.mp3') + def get_usb_state(self,event,msg):#插入为1 拔出为0 + return self.usb_status + def btnInfo_queue_thread(self): + while True: + data = self.btnInfo_queue.get() + self.btnInfo_queue_count-=1 + #EventMesh.debug_log("Info_queue:data = {}".format(data)) + if data != None: + try: + if "data" in data : + data["func"](data["data"]) + else : + data["func"]() + except Exception as e: + #EventMesh.debug_log("btnInfo_queue:ERROR:{}".format(e)) + usys.print_exception(e) + def publish_AI_btnInfo(self,event,msg): + #print("publish_AI_btnInfo 1") + self.btnInfo_queue.put(msg) + self.btnInfo_queue_count+=1 + if self.btnInfo_queue_count > 80: + self.btnInfo_queue_count =0 + print("事件处理线程队列出问题,重启!!!!!!!!!!!!!!") + print("线程:{} 队列:{}".format(_thread.threadIsRunning(self.btnInfo_queue_thread_id),self.btnInfo_queue.size())) + # if _thread.threadIsRunning(self.btnInfo_queue_thread_id): + # _thread.stop_thread(self.btnInfo_queue_thread_id) + # _thread.stack_size(10*1024) + # self.btnInfo_queue_thread_id = _thread.start_new_thread(self.btnInfo_queue_thread, ()) + # _thread.stack_size(8*1024) + # self.btnInfo_queue.clear() + # self.btnInfo_queue = Queue(100) + EventMesh.publish("VC_error") #播放报错 + utime.sleep_ms(1000) + self.aud.stopPlayStream() + self.aud.stopAll() + Power.powerRestart() + EventMesh.publish("set_storage_ai_config",["powerRestart",1]) + #print("publish_AI_btnInfo 2") + def powerKey_callback(self, status): + print("powerKey_callback:{}".format(status)) + + def pwk_extint_cb(self,args):#pwk + try: + print("pwk已经按下") + self.pwk_key_status = int(args[1]) + if self.pwk_key_status == 0: + self.pwk_key_status = 1 + else: + self.pwk_key_status = 0 + pass + if self.pwk_key_status == 0:#按下 + + if self.pwk_key_press == 0 : + # self.pwk_key.disable() + self.pwk_key_press = 1 + self.pwk_key_long_press = 0 + self.pwk_key_timer.start(100, 1, self.pwk_key_timer_cb) + self.pwk_key_timer_count = 0 + EventMesh.publish("close_led") + EventMesh.publish("pwk_key_release") + #EventMesh.publish("AI_key_press") + except Exception as e: + usys.print_exception(e) + def pwk_key_timer_cb(self, *args, **kwargs): + # EventMesh.publish("publish_AI_btnInfo",{"func":self.pwk_key_timer_cb_}) + # def pwk_key_timer_cb_(self) : + try: + # self.pwk_key_status = self.pwk_key.read_level() + self.pwk_key_timer_count +=1 + if self.pwk_key_timer_count >= 10*3: #长按3s + #print("pwk_key_long_press {}".format(self.pwk_key_long_press)) + if self.pwk_key_long_press == 0: + self.pwk_key_long_press = 1 + #EventMesh.publish("AI_key_long_press") + EventMesh.publish("audio_montage_play",["zhengzaiguanji.mp3"]) + #self.aud.play(1,0,'U:/static/zhengzaiguanji.mp3')#关机音频 + self.aud.play(1,1,'U:/static/R_POWER_OFF_1.mp3') + utime.sleep_ms(2000) + self.aud.stopPlayStream() + self.aud.stopAll() + Power.powerDown() + #print("AI_key_release") + #EventMesh.publish("pwk_key_long_press") + #EventMesh.publish("publish_AI_btnInfo",{"func":self.pwk_key_Long_Press}) + if self.pwk_key_status == 1:#松开 + #print("pwk_key_timer_cb:{}".format(self.pwk_key_timer_count)) + key_count = 5 + if dev_type == "7PIN_BK": + key_count = 3 + if self.pwk_key_timer_count >= key_count: #防抖200ms + #EventMesh.publish("AI_key_release") + EventMesh.publish("publish_AI_btnInfo",{"func":self.pwk_key_release}) + # self.pwk_key.enable() + self.pwk_key_timer.stop() + self.pwk_key_timer_count = 0 + self.pwk_key_press = 0 + + except Exception as e: + usys.print_exception(e) + + def keyAI_extint_cb(self,args):#call 2 + try: + print("AI 已经按下") + #print("AI_btn:keyAI_extint_cb{}".format(args[1])) + self.KeyAI_status = int(args[1]) + if self.KeyAI_status == 0: + self.KeyAI_status = 1 + else: + self.KeyAI_status = 0 + + if self.KeyAI_status == 0:#按下 + if self.KeyAI_press == 0 : + EventMesh.publish(constants.EVENT.SYSTEM_UP)#唤醒休眠 + self.extint_AI.disable() + self.KeyAI_press = 1 + self.KeyAI_long_press = 0 + self.KeyAI_timer.start(100, 1, self.KeyAI_timer_cb) + self.KeyAI_timer_count = 0 + #EventMesh.publish("AI_key_press") + # if dev_type == "7PIN" : + self.aud.aud_tone_play(10,200)#播放按键音 + EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_key_press}) + except Exception as e: + usys.print_exception(e) + def KeyAI_timer_cb(self, *args, **kwargs): + # EventMesh.publish("publish_AI_btnInfo",{"func":self.KeyAI_timer_cb_}) + # def KeyAI_timer_cb_(self): + try: + self.KeyAI_status = self.extint_AI.read_level() + self.KeyAI_timer_count +=1 + if self.KeyAI_timer_count >= 10*1: #长按3s + if self.KeyAI_long_press == 0: + self.KeyAI_long_press = 1 + #EventMesh.publish("AI_key_long_press") + EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_key_long_press}) + if self.KeyAI_status == 1:#松开 + #print("KeyAI_timer_cb:{}".format(self.KeyAI_timer_count)) + key_count = 5 + if dev_type == "7PIN_BK": + key_count = 3 + if self.KeyAI_timer_count >= key_count: #防抖200ms + #EventMesh.publish("AI_key_release") + EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_key_release}) + self.extint_AI.enable() + self.KeyAI_timer.stop() + self.KeyAI_timer_count = 0 + self.KeyAI_press = 0 + + except Exception as e: + usys.print_exception(e) + + def AI_key_press(self,event,msg): + self.check_rest_timer_count = 0 + print("AI_key_press") + + EventMesh.publish("AI_key_press") + + def AI_key_long_press(self): + self.check_rest_timer_count = 0 + print("AI_key_long_press") + EventMesh.publish("AI_key_long_press_cb") + + def AI_key_release(self): + print("AI_key_release") + EventMesh.publish("AI_key_release") + + def pwk_key_Long_Press(self,event=None,msg=None): + self.check_rest_timer_count = 0 + print("pwk_key_long_press!!!!!!!") + print("pwk_key_long_press!!!!!!!") + + # EventMesh.publish("paly_iccid_imei") + # return + EventMesh.publish("audio_montage_play",["zhengzaiguanji.mp3"]) + #self.aud.play(1,0,'U:/static/zhengzaiguanji.mp3')#关机音频 + EventMesh.publish("AI_client_VC_synevent","正在关机中")#用TTS读 + utime.sleep_ms(3000) + self.aud.stopPlayStream() + self.aud.stopAll() + Power.powerDown() + #print("AI_key_release") + #EventMesh.publish("pwk_key_long_press") + + def pwk_key_release(self): + self.check_rest_timer_count = 0 + #print("pwk_key_release") + EventMesh.publish("pwk_key_release_cb") + + + def wdt_timer_cb(self, *args, **kwargs): + if self.is_wdt == 1: + self.wdt.feed() + + def AI_dev_timer_cb(self, *args, **kwargs): + #print("AI_dev_timer_cb") + EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_dev_timer_event}) + def AI_dev_timer_event(self): + if self.is_wdt == 1: + self.wdt.feed() + VC_satrt_flag = EventMesh.publish("get_VC_satrt_flag")#获取vc是否在运行 + if VC_satrt_flag == None: + VC_satrt_flag = 0 + Vbatt = Power.getVbatt() + if self.usb_status == 1 and VC_satrt_flag == 0: + # EventMesh.publish("open_led_red")#充电红灯常亮 + open_led_red() + if self.usb_status == 1 and Vbatt>=self.VBATT_tab["charge_full"]and VC_satrt_flag == 0:#充电充满 + # EventMesh.publish("open_led_green") + + if self.usb_charge_flag == 0 : + open_power = EventMesh.publish("get_power_on_state")#获取开机标识 + open_power_off = EventMesh.publish("get_power_off_state")#获取开机标识 + if open_power != None and open_power_off != None: + if open_power == 0 or open_power_off == 1: + #EventMesh.publish("audio_montage_play",["R_CHARGE_FULL.mp3"]) + close_all_ledm() + open_led_green() + self.aud.play(1,0,'U:/static/R_CHARGE_FULL.mp3')#充电已满 + self.usb_charge_flag = 1 + if self.usb_status == 0 and Vbatt= 2: + # self.Low_power_warning_timer = 0 + EventMesh.publish("audio_montage_play",["Low_power_warning.mp3"]) + if self.usb_status == 0 and Vbatt= 8640:#24小时没按键,则关机 + self.pwk_key_Long_Press() + + def get_battery(self, event=None, msg=None): + Vbatt = Power.getVbatt() + if Vbatt>self.VBATT_tab["90"]: + return 100 + if Vbatt>self.VBATT_tab["80"]: + return 90 + if Vbatt>self.VBATT_tab["60"]: + return 80 + if Vbatt>self.VBATT_tab["40"]: + return 60 + if Vbatt>self.VBATT_tab["20"]: + return 40 + if Vbatt>self.VBATT_tab["10"]: + return 20 + if Vbatt<=self.VBATT_tab["10"]: + return 10 + def audio_montage_play(self,event,msg): + self.aud.stopPlayStream() + self.aud.stopAll() + str_data='mp3files=' + for i in msg: + try: + str_tmp = i.replace(".mp3","") + str_data+="{}.mp3+".format(audio_buf.index(str_tmp)) + except Exception as e: + usys.print_exception(e) + str_data = str_data[:-1] + print("audio_montage_play:{}".format(str_data)) + #self.aud.montage_play('U:/static/audio.bin',1,1,str_data) + + def paly_iccid_imei(self,event,msg): + str_data = 'mp3files={}.mp3+'.format(audio_buf.index("liuliangtishi"))#流量提示 + imei = modem.getDevImei() + iccid = sim.getIccid() + print("paly_iccid_imei:ICCID:{}".format(iccid)) + if iccid != -1 and len(iccid) > 5: + iccid = iccid.upper() + if len(iccid) <20: + for i in range(20-len(iccid)): + iccid = "0"+iccid + str_data += '{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+'.format(audio_buf.index("R_READ_TIME_{}".format(iccid[0]))\ + ,audio_buf.index("R_READ_TIME_{}".format(iccid[1])),audio_buf.index("R_READ_TIME_{}".format(iccid[2])),audio_buf.index("R_READ_TIME_{}".format(iccid[3])),\ + audio_buf.index("R_READ_TIME_{}".format(iccid[4])),audio_buf.index("R_READ_TIME_{}".format(iccid[5])),audio_buf.index("R_READ_TIME_{}".format(iccid[6])),audio_buf.index("R_READ_TIME_{}".format(iccid[7])),\ + audio_buf.index("R_READ_TIME_{}".format(iccid[8])),audio_buf.index("R_READ_TIME_{}".format(iccid[9])),audio_buf.index("R_READ_TIME_{}".format(iccid[10])),audio_buf.index("R_READ_TIME_{}".format(iccid[11])),\ + audio_buf.index("R_READ_TIME_{}".format(iccid[12])),audio_buf.index("R_READ_TIME_{}".format(iccid[13])),audio_buf.index("R_READ_TIME_{}".format(iccid[14])),audio_buf.index("R_READ_TIME_{}".format(iccid[15])),\ + audio_buf.index("R_READ_TIME_{}".format(iccid[16])),audio_buf.index("R_READ_TIME_{}".format(iccid[17])),audio_buf.index("R_READ_TIME_{}".format(iccid[18])),audio_buf.index("R_READ_TIME_{}".format(iccid[19]))) + str_data += '{}.mp3+'.format(audio_buf.index("shouhou"))#可联系售后解决,联系方式见售后客服电话是400-886-8777或到微信公众号柒牌SEVENBRAND自行充值: + self.aud.montage_play('U:/static/audio.bin',1,1,str_data) + #鉴权出错,播放imei号 + def paly_device_res_error(self,event,msg): + str_data = 'mp3files={}.mp3+'.format(audio_buf.index("jianquancuowu"))#AI功能异常,请联系客户查询,设备号为: + imei = modem.getDevImei() + imei = imei.upper() + str_data += '{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(imei[0]))\ + ,audio_buf.index("R_READ_TIME_{}".format(imei[1])),audio_buf.index("R_READ_TIME_{}".format(imei[2])),audio_buf.index("R_READ_TIME_{}".format(imei[3])),\ + audio_buf.index("R_READ_TIME_{}".format(imei[4])),audio_buf.index("R_READ_TIME_{}".format(imei[5])),audio_buf.index("R_READ_TIME_{}".format(imei[6])),audio_buf.index("R_READ_TIME_{}".format(imei[7])),\ + audio_buf.index("R_READ_TIME_{}".format(imei[8])),audio_buf.index("R_READ_TIME_{}".format(imei[9])),audio_buf.index("R_READ_TIME_{}".format(imei[10])),audio_buf.index("R_READ_TIME_{}".format(imei[11])),\ + audio_buf.index("R_READ_TIME_{}".format(imei[12])),audio_buf.index("R_READ_TIME_{}".format(imei[13])),audio_buf.index("R_READ_TIME_{}".format(imei[14]))) + #print("str_data:{}".format(str_data)) + self.aud.montage_play('U:/static/audio.bin',1,1,str_data) + +#存储信息 +class getStorageDataManager(Abstract):#获取内存数据 + def __init__(self): + self.config_data = {} + check = ql_fs.path_exists("/usr/static/storage_file/config_ai.json") + if check == True: + with open("/usr/static/storage_file/config_ai.json","r") as fd: + self.config_data = ujson.load(fd) + else : + self.config_data = {'old_time': 0, 'flip_sw': 0} + pass + + def post_processor_after_instantiation(self): + EventMesh.subscribe("set_storage_ai_data", self.set_storage_ai_data) + EventMesh.subscribe("set_storage_ai_config", self.set_storage_ai_config) + EventMesh.subscribe("get_storage_ai_data", self.get_storage_ai_data) + EventMesh.subscribe("get_storage_ai_config", self.get_storage_ai_config) + + def set_storage_ai_data(self, event, msg): + # EventMesh.debug_log("set_storage_ai_data:{}".format(msg)) + if msg != None: + self.config_data = msg + with open("/usr/static/storage_file/config_ai.json",'w+',encoding="utf-8") as fd: + ujson.dump(self.config_data,fd) + + + def set_storage_ai_config(self,event,msg): + # EventMesh.debug_log("set_storage_key_data1:{}".format(msg)) + if len(msg) >= 2: + self.config_data[msg[0]]=msg[1] + # EventMesh.debug_log("set_storage_key_data2:{}".format(self.config_data[msg[0]])) + EventMesh.publish("publish_message_event_ui",{"func":self.set_storage_save,"data":0}) + def set_storage_save(self, data): + with open("/usr/static/storage_file/config_ai.json",'w+',encoding="utf-8") as fd: + ujson.dump(self.config_data,fd) + def get_storage_ai_data(self, event, msg): + # EventMesh.debug_log("get_storage_ai_data:{}".format(self.config_data)) + return self.config_data + def get_storage_ai_config(self,event,msg): + # EventMesh.debug_log("get_storage_key_data1:{}".format(msg)) + b = msg in self.config_data.keys() + if b == True: + # EventMesh.debug_log("get_storage_key_data2:{}".format(self.config_data[msg])) + return self.config_data[msg] + else : + return None + # try: + # return self.config_data[msg] + # except: + # EventMesh.debug_log("get_storage_key_data:none key:{}",msg) + # return None +#设备资源授权平台 +class device_res_author(Abstract): + + def __init__(self) : + print("device_res_author __init__ start !!!!!!!!!!!!!!!!!") + self.deviceId = modem.getDevImei()#"876226002022574" + self.SHA1_BLOCK_SIZE = 64 + self.PAD_BLOCK_SIZE = 16 + self.SHA256 = uhashlib.sha256 + self.pad = lambda s: s + chr(self.PAD_BLOCK_SIZE - len(s) % self.PAD_BLOCK_SIZE) * (self.PAD_BLOCK_SIZE - len(s) % self.PAD_BLOCK_SIZE) + # 除去补16字节的多余字符 + self.unpad = lambda s: s[:-s[-1]] + #K01 + # self.key = b"MWrMZjdtcPhj41jWuoqFAhTmqyFluqj1" + # self.pid = "qAtdDOGXgXYjT2HGFr3a" + #G15 + # self.key = b"3LWfBicxfRZ3ZAqmZCFuvMdGUXdAFWkb" + # self.pid = "qLx4Pu4mSUQxyfVKGLXG" + #7pin + self.key = b"uKLrChwrxA1LklgBc3VwawYjUkbT3BgX" + self.pid = "cqxJZi5CNgzjS3mX21Zw" + + self.dev_res_timer = osTimer() + self.dev_res_timer.start(20000, 1, self.dev_timer_cb) + self.dev_res_timerCount = 0 + self.ud_token_timer = osTimer() + self.ud_token_timer.start(10000, 1, self.ud_token_timer_cb) + self.ud_token_timer_Count = 0 + self.dev_token = None + self.res_error_count = 0 + self.ntptime_flag = 0 + EventMesh.subscribe("get_dev_token", self.get_dev_token) + EventMesh.subscribe("update_dev_token", self.update_dev_token) + EventMesh.subscribe("dev_active", self.dev_active) + EventMesh.subscribe("dev_sign_in", self.dev_sign_in) + EventMesh.subscribe("dev_NTP", self.dev_NTP) + #EventMesh.publish_async("dev_NTP",thread_size = 8192) + + # count = 0 + # while True: + # if self.ntptime_flag == 1: + # break + # utime.sleep_ms(1) + # count+=1 + # if count>600: + # break + # EventMesh.publish_async("dev_active",thread_size = 8192) + # EventMesh.publish_async("dev_sign_in",thread_size = 8192) + + self.dev_NTP()#获取时间 + self.dev_active() #设备激活 + self.dev_sign_in() #设备登入 + print("device_res_author __init__ end !!!!!!!!!!!!!!!!!") + + def get_dev_token(self, event, msg): + return self.dev_token + #网络校时 + def dev_NTP(self, event=None, msg=None): + response = None + try: + print("dev_NTP1") + url = "http://dmp.raisound.com/bz-api/dev/time" + response = request.get(url,timeout=5) + data = response.json() + print("dev_NTP:{}".format(data)) + if data: + try: + timeSecond = data["data"]["timestamp"]//1000 + + next_alarm_time = utime.localtime(timeSecond) + print("timeSecond {} next_alarm_time {}".format(timeSecond,next_alarm_time)) + machine.RTC().datetime((next_alarm_time[0],next_alarm_time[1],next_alarm_time[2],next_alarm_time[6],next_alarm_time[3],next_alarm_time[4],next_alarm_time[5],0)) + self.ntptime_flag = 1 + except Exception as e: + usys.print_exception(e) + except Exception as e: + usys.print_exception(e) + if response != None: + response.close() + print("dev_NTP end") + def dev_timer_cb(self, *args): #设备资源管理鉴权平台定时器 + EventMesh.publish("publish_AI_btnInfo",{"func":self.dev_timer_cb_}) + + def dev_timer_cb_(self): + #if EventMesh.DEV_RES_MANAGE_AUTHEN_PLATFORM == 1: + try: + if self.dev_token == None: + if self.ntptime_flag == 0: + self.ntptime_flag = 1 + EventMesh.publish_async("dev_NTP",thread_size = 8192) + #EventMesh.publish("publish_AI_btnInfo",{"func":self.dev_NTP}) + print("timer:{}!!!!!!!!\r\n".format(utime.localtime())) + EventMesh.publish_async("dev_active",thread_size = 8192) + EventMesh.publish_async("dev_sign_in",thread_size = 8192) + # self.dev_active() #设备激活 + # self.dev_sign_in() #设备登入 + self.dev_res_timerCount+=1 + if self.dev_res_timerCount > 3: #开机一分钟内没有获取到密码和token 等下一次更新令牌在走登入 激活流程 + self.dev_res_timerCount=0 + self.dev_res_timer.stop() + except Exception as e: + usys.print_exception(e) + def ud_token_timer_cb(self, *args): + EventMesh.publish("publish_AI_btnInfo",{"func":self.ud_token_timer_cb_}) + + def ud_token_timer_cb_(self): + try: + #print("ud_token_timer_!!!!") + self.ud_token_timer_Count+=1 + if self.ud_token_timer_Count >= 720: #定时10*3000s时更新token + self.ud_token_timer_Count = 0 + EventMesh.publish_async("dev_sign_in",thread_size = 8192) + except Exception as e: + usys.print_exception(e) + def get_sim_Status(self): + return sim.getStatus() + def HMAC(self,k, m): + + KEY_BLOCK = k + (b'\0' * (self.SHA1_BLOCK_SIZE - len(k))) + KEY_INNER = bytes((x ^ 0x36) for x in KEY_BLOCK) + KEY_OUTER = bytes((x ^ 0x5C) for x in KEY_BLOCK) + inner_message = KEY_INNER + m + outer_message = KEY_OUTER + self.SHA256(inner_message).digest() + return self.SHA256(outer_message) + def get_hmac_sha256(self,k, m): + data = self.HMAC(k, m).digest() + # print("HMAC(k, m).digest():", data) + # print("HMAC(k, m).digest():", ubinascii.hexlify(data)) + hex_data = ubinascii.hexlify(data) + hex_data = hex_data.decode('ascii') + return hex_data + # 加密函数 + def aes_CBC_Encrypt(self,data, key, iv): # CBC模式的加密函数,data为明文,key为16字节密钥,iv为16字节的偏移量 + key = key.encode('utf-8') + iv = iv.encode('utf-8') # CBC 模式下的偏移量 + data = self.pad(data) # 补位 + data = data.encode('utf-8') + aes = ucryptolib.aes(key,ucryptolib.MODE_CBC,iv) + result = base64.b64encode(aes.encrypt(data)) + return str(result, 'utf-8') # 以字符串的形式返回 + + # 解密函数 + def aes_CBC_Decrypt(self,data, key, iv): # CBC模式的解密函数,data为密文,key为16字节密钥 + key = key.encode('utf-8') + iv = iv.encode('utf-8') + + aes = ucryptolib.aes(key,ucryptolib.MODE_CBC,iv) #CBC模式 + + # decrypt AES解密 B64decode为base64 转码 + result = aes.decrypt(base64.b64decode(data)) + result = self.unpad(result) # 除去补16字节的多余字符 + return str(result, 'utf-8') # 以字符串的形式返回 + #激活接口 没有密码走激活 + def dev_active(self, event=None, msg=None): + signal = net.csqQueryPoll() + if signal == -1 or self.get_sim_Status() != 1:#网络不正常 + print("dev_active 无 SIM卡!!!!!!!!\r\n") + return + print("dev_active 1\r\n") + # 签名内容: = deviceId+pid+timeStamp + dev_pass = "" + dev_pass = EventMesh.publish("get_storage_ai_config","dev_pass") + print("dev_pass:{}\r\n".format(dev_pass)) + if dev_pass == None: + dev_pass = "" + if dev_pass == "" or dev_pass == None: + try: + date_tmp = utime.localtime() #获取当前时间 + print("date_tmp:{}\r\n".format(date_tmp)) #转换时间戳s + timeStamp = (utime.mktime(date_tmp))*1000#获取时间戳ms + deviceId = self.deviceId #"876226002022574" #以imei号 + pid = self.pid + key = self.key + sign_data = "{}{}{}".format(deviceId,pid,timeStamp) #签名内容 + print("sign_data:{}\r\n".format(sign_data)) + sha256_hex = self.get_hmac_sha256(key,sign_data) + print("sha256_hex:{}\r\n".format(sha256_hex)) + + data = { + "deviceId":"{}".format(deviceId), #设备名 + "pid":pid, #产品PID + "sign":"{}".format(sha256_hex), #HMACSHA256签名后的数据 + "timeStamp":timeStamp, #要以ms的形式 + "signMethod":"HMACSHA256" #签名方式 HMACSHA256 + } + print(ujson.dumps(data)) + headers_T ={"Content-Type":"application/json"} + url = "http://dmp.raisound.com/bz-api/dev/auth/active" + data =ujson.dumps(data) + response = None + response_result = 0 + try: + response = request.put(url,data=data,headers = headers_T,timeout=5) + response_result = 1 + except Exception as e: + usys.print_exception(e) + print("put error!!!!!\r\n") + response_result = 0 + + IV = "" #偏移量 + PASSWORD= "" #服务器返回后的加密内容 密码 + if response_result == 1: #访问成功ip + if response.status_code == 200: + print("headers:{}".format(response.headers)) + content = response.content + c = next(content) + # "api.xcloudtech.com" + # d_server_port = 9000 + data = ujson.loads(c) + # data = response.json() + print("data-{}".format(data)) + if data != None: + if "success" in data: + if data['success'] == True: + if "data" in data: + data_tmp = data["data"] + if "nonce" in data_tmp: #偏移量 + IV = data_tmp["nonce"] + if "password" in data_tmp: + PASSWORD = data_tmp["password"] + # EventMesh.publish("set_storage_ai_config",["dev_pass",PASS]) + if data["code"] == 20001:#鉴权成功 + pass + elif data["code"] > 50000:#时间错误 + self.res_error_count+=1 + if self.res_error_count>=3: + self.res_error_count = 0 + #EventMesh.publish("paly_device_res_error") + if data["code"] == 50003:#时间错误 + self.ntptime_flag = 0 + if PASSWORD != None and IV != None: + if len(PASSWORD) != 0 and len(IV) != 0: + password = PASSWORD + iv = IV + #解密 之后保存本地下一次登入做使用 + decrypt_data = self.aes_CBC_Decrypt(password, self.key, iv) #对服务器下发的密码进行解密 + print("decrypt_data {}".format(decrypt_data)) + EventMesh.publish("set_storage_ai_config",["dev_pass",decrypt_data]) + print("IV:{}\r\n PASS:{}".format(IV,PASSWORD)) + if response != None: + response.close() + except Exception as e: + usys.print_exception(e) + print("dev_active end\r\n") + return [response_result,PASSWORD,IV] + #随机生成16个字节的字符串作为加密的IV 偏移量 + def generate_random_string(self,length=16): + random_str = "" + chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789' + for i in range(length): + random_str+=chars[random.randint(0,length)] + return random_str + + #设备登入 没有Token 走登入获取token + def dev_sign_in(self, event=None, msg=None): + signal = net.csqQueryPoll() + if signal == -1 or self.get_sim_Status() != 1:#网络不正常 + print("dev_sign_in 无 SIM卡!!!!!!!!\r\n") + return + print("dev_sign_in 1") + token = "" + try: + token = self.dev_token + dev_pass = EventMesh.publish("get_storage_ai_config","dev_pass") + #print("token:{}\r\n".format(token)) + if token == None: + token = "" + if dev_pass == None: + dev_pass = "" + if len(dev_pass) == 0:#没有密码 + return + #if token == None or token == "": + if 1: #返回结果成功 + #获取本地保存的密码 + decrypt_data=EventMesh.publish("get_storage_ai_config","dev_pass") + # decrypt_data = self.aes_CBC_Decrypt(password, self.key, iv) #对服务器下发的密码进行解密 + print("decrypt_data {}".format(decrypt_data)) + #随机生成16个字符串 设备生成做加密使用 + random_string = self.generate_random_string(16) #随机的16个字符串 + enc_iv = random_string #加密的IV偏移量 + #设备端进行密码加密 + encrypt_data = self.aes_CBC_Encrypt(decrypt_data, self.key, enc_iv) + print("encrypt_data {}".format(encrypt_data)) + + #登入数据 + deviceId = self.deviceId + sign_in_data = { + "deviceId":"{}".format(deviceId), #设备ID + "password":"{}".format(encrypt_data), #加密的数据 + "nonce":"{}".format(random_string) #随机的16个字符串 + } + print(ujson.dumps(sign_in_data)) + sign_url = "http://dmp.raisound.com/bz-api/dev/auth/sign_in" #登入地址 + headers_T ={"Content-Type":"application/json"} + response_result = 0 + response = 0 + try: + response = request.post(sign_url,data=ujson.dumps(sign_in_data),headers = headers_T,timeout=5) + response_result = 1 + except Exception as e: + usys.print_exception(e) + print("post error!!!!!\r\n") + response_result = 0 + # {'msg': '', 'code': 20001, 'success': True, + # 'data': {'deviceId': '876226002022574', + # 'token': '95436a9e09fd0ff89feb8825257dca982f'} + # } + + #self.dev_token = "" + if response_result == 1: + if response.status_code == 200: + content = response.content + c = next(content) + data = ujson.loads(c) + print("data-{}".format(data)) + if data != None: + if "success" in data: + if data['success'] == True: #登入成功 + if "data" in data: + data_tmp = data["data"] + if "token" in data_tmp: #token + self.dev_token = data_tmp["token"] + if data["code"] == 50003:#时间错误 + self.ntptime_flag = 0 + print("token:{}\r\n".format(self.dev_token)) + if response != None: + response.close() + pass + except Exception as e: + print("post error!!!!!\r\n") + response_result = 0 + print("dev_sign_in end") + #获取新的令牌 更新token + def update_dev_token(self, event=None, msg=None): + print("update_dev_token") + try: + dev_pass = "" + dev_pass = EventMesh.publish("get_storage_ai_config","dev_pass") + + if dev_pass == None: + dev_pass = "" + if len(dev_pass) == 0: #没有密码走激活 + print("no dev_pass:{}\r\n".format(dev_pass)) + EventMesh.publish("dev_active") + token = self.dev_token + if token == None: + token = "" + if len(token) == 0: #没有token走登入 + print("no dev_token:{}\r\n".format(token)) + #self.dev_sign_in() + EventMesh.publish("dev_sign_in") + dev_tokenip = "http://dmp.raisound.com/bz-api/dev/auth/token" #设备新令牌更新地址 + token = self.dev_token + if token == None: + token = "" + if len(token) != 0: + response_result=0 + response = None + headers_T = {"bz-dt":"{}".format(token)} + try: + response = request.get(dev_tokenip,headers = headers_T,timeout=5) + response_result = 1 + except Exception as e: + print("get error!!!!!\r\n") + response_result = 0 + if response_result == 1: + if response.status_code == 200: + try: + headers_data = response.headers + # print("headers_data!!!!! headers_data:{}\r\n".format(headers_data)) + if "bz-dt" in headers_data: #bz-dt字段是否在头部数据里面 如果有就需要更新 + bz_dt = headers_data["bz-dt"] + self.dev_token = bz_dt.replace(" ", "") #去掉所有的空格符 + print("update_dev_token:{}".format(self.dev_token)) + except Exception as e: + print("headers_data!!!!! error\r\n") + if response != None: + response.close() + except Exception as e: + usys.print_exception(e) + print("update_dev_token end") + +#OTA升级 +class OTA(): + def __init__(self): + #EventMesh.subscribe("min_sys_ota",self.min_sys_ota) + self.downloadFileVoURL1= "" + self.downloadFileVoURL2= "" + #小系统升级,返回0,没有升级;返回,1有升级,正在执行升级;返回2,电压不够 + def min_sys_ota(self,event=None,msg=None): + print("min_sys_ota") + signal = net.csqQueryPoll() + if signal == -1 or sim.getStatus() != 1:#网络不正常 + print("min_sys_ota 无 SIM卡!!!!!!!!\r\n") + return 0 + # return 0 + response = None + ret_str =0 + self.downloadFileVoURL1= "" + self.downloadFileVoURL2= "" + try: + sourceVersion = versions.Build_Time + sourceVersion = "7PIN-"+sourceVersion[:10]+"-"+sourceVersion[11:-3] + print("sourceVersion:{}".format(sourceVersion)) + sourceVersion = sourceVersion.replace(" ", "0") + print("sourceVersion2:{}".format(sourceVersion)) + #url = "http://iot.api.thisiot.com/ota/task?deviceId=860132060348836&sourceVersion=2024-12-20-15:35-1" + url = "http://dmp.raisound.com/bz-api/ota/task?deviceId={}&sourceVersion={}".format(modem.getDevImei(),sourceVersion) + print(url) + response = request.get(url,timeout=5) + if response.status_code == 200: + data = response.json() + print("min_sys_ota1:{}".format(data)) + + if data: + try: + if data["code"] == 20007:#有新版本 + if "fileList"in data["data"]: + if len(data["data"]["fileList"]) == 2: + for fileList in data["data"]["fileList"]: + if fileList["fileName"] == "dfota_2.bin": + self.downloadFileVoURL2 = fileList["url"] + elif fileList["fileName"] == "dfota_1.bin": + self.downloadFileVoURL1 = fileList["url"] + + if data["code"] == 20006:#已是最新版本 + ret_str = 0 + + except Exception as e: + usys.print_exception(e) + else: + print("min_sys_ota get error") + response.close() + except Exception as e: + usys.print_exception(e) + if response != None: + response.close() + + print("min_sys_ota:downloadFileVoURL1:{},\ndownloadFileVoURL2:{}".format(self.downloadFileVoURL1,self.downloadFileVoURL2)) + print("min_sys_ota end") + if self.downloadFileVoURL2!="" and self.downloadFileVoURL1!="": + battery = EventMesh.publish("get_battery") + if battery>=40: + self.ota_timer = osTimer() + self.ota_timer.start(15000, 0, self.ota_timer_cb) + ret_str = 1 + else: + ret_str = 2 + return ret_str + + def ota_timer_cb(self, *args, **kwargs): + import fota + fota_obj = fota() + fota_obj.httpDownload(url1=self.downloadFileVoURL1,url2=self.downloadFileVoURL2) + #ota升级结果返回,开机时调用一次即可 + def ota_result(self,event=None,msg=None): + response = None + try: + currentVersion = versions.Build_Time + currentVersion = "7PIN-"+currentVersion[:10]+"-"+currentVersion[11:-3] + print("currentVersion1:{}".format(currentVersion)) + currentVersion = currentVersion.replace(" ", "0") + print("currentVersion2:{}".format(currentVersion)) + url = "http://dmp.raisound.com/bz-api/ota/result?deviceId={}¤tVersion={}".format(modem.getDevImei(),currentVersion) + print(url) + response = request.post(url,timeout=5) + if response.status_code == 200: + data = response.json() + print("ota_result:{}".format(data)) + else: + print("ota_result error!!!!") + for i in response.text: + print(i) + response.close() + except Exception as e: + usys.print_exception(e) + if response != None: + response.close() + #ICCID上传 + def pots_ICCID(self,event=None,msg=None): + response = None + try: + iccid = sim.getIccid() + if iccid != -1 and len(iccid) > 5: + print("pots_ICCID:{}".format(iccid)) + #Headers = {'Transfer-Encodong':'chunked'} + #http://dmp.raisound.com/bz-api/dev/iccid?deviceId=866610001099679&iccid=89860002192307889057 + url = "http://dmp.raisound.com/bz-api/dev/iccid?deviceId={}&iccid={}".format(modem.getDevImei(),iccid) + print(url) + response = request.post(url,timeout=5) + if response.status_code == 200: + data = response.json() + print("pots_ICCID:{}".format(data)) + else: + print("pots_ICCID error!!!!") + for i in response.text: + print(i) + response.close() + except Exception as e: + usys.print_exception(e) + if response != None: + response.close() +#阿里VC状态枚举 +VC_State_None=0 +VC_State_Listening=1#听 +VC_State_SpeechStart=2#说开始 +VC_State_SpeechIng=3#正在说 +VC_State_SpeechEnd=4#说结束 +VC_State_RequestToRespond=5 #TTS请求或者chat请求 +VC_State_Thinking=6#想(chat) +VC_State_Responding=7#音频播放 +VC_State_TTSStart=8 +VC_State_TTSData=9 +VC_State_TTSFinish=10 +VC_State_TTSEnd=11 +VC_State_TTSError=12 +VC_State_DialogError=13 +VC_State_End=14 + +VC_record_TYPE_PCM = 0 +VC_record_TYPE_AMR = 1 +VC_play_TYPE_PCM = 0 +VC_play_TYPE_MP3 = 1 + +#websocket发送数据编号 +# AI_client_asr_num = 0 +# AI_client_chat_num = 1 +# AI_client_tts_num = 2 +AI_client_VC_num = 3 +AI_client_asr_num = 4 + + +class AI_VC(Abstract): + # AI + + def __init__(self): + try: + self.http_get_config()#获取/更新配置参数 + except Exception as e: + usys.print_exception(e) + self.VC_30S_timer = osTimer() + self.VC_30S_timer.start(30000, 1, self.VC_30S_timer_cb) + self.get_config_timer_count = 0 + self.record_data_save_flag = 0 #是否保存录音文件 + self.play_data_save_flag = 0#是否保存tts数据到文件 + self.record_fd = None + self.play_fd = None + self.is_VC_ACK = 0 #是否开启ack应答模式 + self.is_long_record = 0 #是否开启长录音模式(语音打断模式) + self.ai_OTA = OTA() + self.is_auth = 0 #是否开启dmp鉴权 + self.VC_mode = EventMesh.publish("get_storage_ai_config","VC_mode")# + self.VC_mode = 1 #0:短按连续问答模式 1:长按录音模式 + if self.VC_mode == None : + self.VC_mode = 0 + self.is_up_error= 0 #是否上传错误id + self.Close_flag =0 #=1时,连续对话播放完音频就退出 + + self.error_data = [] + self.asr_taskid = "" + self.VC_taskid = "" + self.VC_server = 86 #0柒牌正式服务器,1:测试服务器1,2:测试服务器2 + + self.usb_state = 2 #USB状态初始值 + + self.server_ip = EventMesh.publish("get_storage_ai_config","server_ip")# + if self.server_ip == None: + if self.VC_server == 1:# + self.server_ip="118.145.158.207:22083" + elif self.VC_server == 2:# + self.server_ip="118.145.158.207:22082" + elif self.VC_server == 4:# + self.server_ip="118.145.158.207:22084" + elif self.VC_server == 5:# + self.server_ip="amp-wss.raisound.com" + elif self.VC_server == 6:# + self.server_ip="118.145.158.207:22080" + elif self.VC_server == 7:# + self.server_ip="118.145.158.207:22080" + elif self.VC_server == 8:# + self.server_ip="115.190.94.208:22080" + elif self.VC_server == 86:# + self.server_ip="118.145.158.207:22086" + else: + #self.server_ip="sevenpin.qipai.com.cn" + self.server_ip="118.145.158.207:22082" + if dev_type == 'momo':# + self.server_ip="118.145.158.207:22080" + # elif dev_type == "7PIN": + # self.server_ip="sevenpin.qipai.com.cn" + + elif dev_type == "sjgq": + self.server_ip="118.145.158.207:22084" + + #开机提示音 + self.power_on_tone = EventMesh.publish("get_storage_ai_config","power_on_tone")# + if dev_type != "7PIN": + self.power_on_tone = None + if self.power_on_tone == None: + if dev_type == "G10": + self.power_on_tone = "已开机,您好!我是北科瑞讯智能 AI bot_name" + elif dev_type == "7PIN_BK": + self.power_on_tone = "小瑞来了!我们一起来愉快地聊天吧!" + elif dev_type == "momo": + self.power_on_tone = "DuloDulo,我是上古神兽食梦貘,主人可以叫我momo,我来自《山海经》,是一只以梦为食的神秘灵兽,每当颜色朦胧、人们入睡时,我就会悄悄飞到人们的床头,用我长长的鼻子把噩梦统统吞噬掉,只留下甜甜的美梦。从今往后,就由我守护在主人身边,一起度过每一个星河璀璨的夜晚。" + elif dev_type == "sjgq": + self.power_on_tone = "您好!我是巴马四季甘泉的智能助手。我可以为你解答各种各样的问题,像是有关巴马四季甘泉知识库、中基长寿科学产品、卫斯曼院士国际先进医疗中心的问题,还有日常生活与工作、旅游信息、健康咨询、教育与学习、情感交流、全球资讯、世界文化等方面的问题哦。你有没有这方面的问题想要问我呀?" + elif dev_type == "szbst": + self.power_on_tone = "深圳百事通来了!请问您有什么需要我帮忙的吗?" + else: + self.power_on_tone = "您好!我是世界首创柒牌男装AI生活好帮手-bot_name, 很高兴为您服务,我可以帮您解答柒牌公司知识库、日常生活与工作、旅游信息、健康与运动咨询、教育与学习、情感交流、全球资讯、世界文化等问题!请问您有什么需要我帮忙的吗?" + + + self.VC_record_TYPE = VC_record_TYPE_PCM #0:PCM 1:AMR + self.VC_play_TYPE = VC_play_TYPE_PCM #0:PCM 1:mp3 + self.VC_record_samplerate = 16000 + self.VC_play_samplerate = 16000 + self.VAD_data_len = 640 #10ms数据 + self.is_VAD = 0#=1打开vad打断 + # ARG_sample_rate, // 采样率 + # ARG_channel, // 通道数 + # ARG_frame_size, // 每帧字节数 + # ARG_energy_threshold, // 能量阈值 + # ARG_voice_time, // 语音持续时间阈值(ms) + # ARG_silence_time, // 静音持续时间阈值(ms) + # ARG_silence_start_threshold, // 静音开始阈值(ms) + self.vad = None + if self.is_VAD == 1: + self.vad = VAD.VAD(self.VC_record_samplerate ,1,self.VAD_data_len,600,100,300,100) + self.speech_rate = EventMesh.publish("get_storage_ai_config","speech_rate")#语速配置 + if self.speech_rate == None: + self.speech_rate = 0 + self.VC_TTS_voice_type = EventMesh.publish("get_storage_ai_config","VC_TTS_voice_type")#音色配置 + if self.VC_TTS_voice_type == None or ("男" in self.VC_TTS_voice_type) == False: + if dev_type == "G10" or dev_type == "7PIN_BK"or dev_type == "szbst": + self.VC_TTS_voice_type = { + "女":{ + "bot_name":"小瑞", + "voice":"zh_female_wanwanxiaohe_moon_bigtts" , + "lang":"zh-cn" + }, + "男":{ + "bot_name":"小瑞", + "voice":"zh_male_wennuanahu_moon_bigtts" , + "lang":"zh-cn" + }, + "ç«¥":{ + "bot_name":"小瑞", + "voice":"ICL_zh_female_huoponvhai_tob" , + "lang":"zh-cn" + }, + "粤":{ + "bot_name":"小瑞", + "voice":"zh_female_wanqudashu_moon_bigtts" , + "lang":"zh-hk" + }, + "四川":{ + "bot_name":"小瑞", + "voice":"zh_female_daimengchuanmei_moon_bigtts", + "lang":"&lang=zh-cn-sc" + }, + "个性":{ + "bot_name":"小瑞", + "voice":"zh_male_sunwukong_mars_bigtts" , + "lang":"zh-cn" + } + + } + elif dev_type == 'momo': + self.VC_TTS_voice_type = { + "女":{ + "bot_name":"食梦貘", + "voice":"zh_female_shaoergushi_mars_bigtts" , + "lang":"zh-cn" + }, + "男":{ + "bot_name":"食梦貘", + "voice":"zh_male_yangguangqingnian_mars_bigtts" , + "lang":"zh-cn" + }, + "ç«¥":{ + "bot_name":"食梦貘", + "voice":"ICL_zh_female_huoponvhai_tob" , + "lang":"zh-cn" + }, + } + elif dev_type == 'sjgq': + self.VC_TTS_voice_type = { + "女":{ + "bot_name":"小巴", + "voice":"zh_female_wanwanxiaohe_moon_bigtts" , + "lang":"zh-cn" + }, + "男":{ + "bot_name":"小巴", + "voice":"zh_male_wennuanahu_moon_bigtts" , + "lang":"zh-cn" + }, + "ç«¥":{ + "bot_name":"小巴", + "voice":"ICL_zh_female_huoponvhai_tob" , + "lang":"zh-cn" + }, + } + else: + #女,男,童,粤,川,个性声 + self.VC_TTS_voice_type = { + "女":{ + "bot_name":"柒妹妹", + "voice":"zh_female_wanwanxiaohe_moon_bigtts" , + "lang":"zh-cn" + }, + "男":{ + "bot_name":"柒先生", + "voice":"zh_male_wennuanahu_moon_bigtts" , + "lang":"zh-cn" + }, + "ç«¥":{ + "bot_name":"柒乐乐", + "voice":"ICL_zh_female_huoponvhai_tob" , + "lang":"zh-cn" + }, + "粤":{ + "bot_name":"柒先生", + "voice":"zh_female_wanqudashu_moon_bigtts" , + "lang":"zh-hk" + }, + "四川":{ + "bot_name":"柒妹妹", + "voice":"zh_female_daimengchuanmei_moon_bigtts", + "lang":"&lang=zh-cn-sc" + }, + "个性":{ + "bot_name":"柒先生", + "voice":"zh_male_sunwukong_mars_bigtts" , + "lang":"zh-cn" + }, + "英语":{ + "bot_name":"柒先生", + "voice":"en_male_smith_mars_bigtts" , + "lang":"zh-cn" + } + + + } + + # self.VC_TTS_voice_type = {0:"zh_female_xinlingjitang_moon_bigtts",1:"zh_male_wennuanahu_moon_bigtts",2:"ICL_zh_female_huoponvhai_tob", + # 3:"aliyun::longjiaxin",4:"zh_female_daimengchuanmei_moon_bigtts"} + #self.VC_TTS_voice_type = ["aliyun::longxiaoxia","aliyun::longnan","aliyun::longling"] + + #EventMesh.publish("set_storage_ai_config",["VC_TTS_voice_type",self.VC_TTS_voice_type]) + + try: + self.VC_TTS_voice_key = EventMesh.publish("get_storage_ai_config","VC_TTS_voice_key")#音色配置 + if self.VC_TTS_voice_key == None : + if dev_type == "7PIN_BK": + self.VC_TTS_voice_key = "ç«¥" + #self.VC_TTS_voice_key = "男" + elif dev_type == "momo": + self.VC_TTS_voice_key = "男" + else: + self.VC_TTS_voice_key = "男" + if self.VC_TTS_voice_key in self.VC_TTS_voice_type: + pass + else: + self.VC_TTS_voice_key = list(self.VC_TTS_voice_type.keys())[0] + print("音色配置:{}:{}\r\n\r\n".format(self.VC_TTS_voice_key,self.VC_TTS_voice_type[self.VC_TTS_voice_key])) + self.VC_TTS_volume = EventMesh.publish("get_storage_ai_config","VC_TTS_volume")#音量配置 + except Exception as e: + usys.print_exception(e) + #配置词 + self.commands_mode = 1 #=1用大模型判断命令,=0用服务器本地插件判断命令 =2用设备本地判断方式 + if dev_type == "7PIN_BK": + pass + # self.commands_mode = 1 + self.commands = [ + { + "command": "切换音色",#命令 + "patterns": [ #多种问法,说法 + "声音改成", "声音改为", "改成", "改为", "换成", "切换成", "变成", "声音" + "使用", "设置声音为", "把声音改成", "声音切换到", "用","声音切换的" + ], + "exact_matches": ["声音改成", "声音改为", "改成", "改为"],#精确匹配的完整短语 + "has_param": True,# 是否包含参数 + "param_regexp": r"(?P(男|难|女|ç«¥|同|粤|广东话|粤语|四川话|川普|四川口音))",#参数提取正则表达式 + "require_full_match": False,#是否要求完全匹配 + "negative_patterns": [],#否定模式(避免误触发) + "keyword_threshold": 0.6#关键词匹配阈值 + }, + { + "command": "音量加大", + "patterns": [ + "音量加大","音量大", "声音大" ,"声音加大","听不清楚","声音太小","太小声了" + ], + "exact_matches": [], + "has_param": False, + "param_regexp": "", + "require_full_match": False, + "negative_patterns": ["声音太大"], + "keyword_threshold": 1 + }, + { + "command": "音量减小", + "patterns": [ + "音量减小","音量小", "声音小","你太吵了","声音太大","太大声了" + ], + "exact_matches": [], + "has_param": False, + "param_regexp": "", + "require_full_match": False, + "negative_patterns": ["声音太小"], + "keyword_threshold": 0.8 + }, + { + "command": "关机", + "patterns": [ + "关机", "关闭电源" + ], + "exact_matches": ["关机", "关闭电源"], + "has_param": False, + "param_regexp": "", + "require_full_match": True, + "negative_patterns": [], + "keyword_threshold": 0.8 + }, + { + "command": "进入工厂模式", + "patterns": [ + "进入工厂模式" + ], + "exact_matches": ["进入工厂模式"], + "has_param": False, + "param_regexp": "", + "require_full_match": True, + "negative_patterns": [], + "keyword_threshold": 0.8 + }, + { + + "command": "再见", + "patterns": [ + "再见","拜拜","我要走了" + ], + "exact_matches": [], + "has_param": False, + "param_regexp": "", + "require_full_match": False, + "negative_patterns": [], + "keyword_threshold": 0.8 + }, + { + + "command": "查询信号", + "patterns": [ + "查询信号","信号怎样","信号是多少","信号怎么样" + ], + "exact_matches": [], + "has_param": False, + "param_regexp": "", + "require_full_match": False, + "negative_patterns": ["查询"], + "keyword_threshold": 0.8 + }, + { + + "command": "查询卡号", + "patterns": [ + "查询卡号","卡号","iccid号","ICCID号" + ], + "exact_matches": [], + "has_param": False, + "param_regexp": "", + "require_full_match": False, + "negative_patterns": ["查询"], + "keyword_threshold": 0.8 + }, + { + + "command": "查询设备号", + "patterns": [ + "设备号","查询设备号","查询IMEI号" + ], + "exact_matches": [], + "has_param": False, + "param_regexp": "", + "require_full_match": False, + "negative_patterns": ["查询"], + "keyword_threshold": 0.8 + }, + { + "command": "OTA升级", + "patterns": [ + "OTA升级" + ], + "exact_matches": ["OTA升级"], + "has_param": False, + "param_regexp": "", + "require_full_match": True, + "negative_patterns": [], + "keyword_threshold": 1 + }, + { + "command": "查询服务器地址", + "patterns": [ + "查询服务器地址" + ], + "exact_matches": [], + "has_param": False, + "param_regexp": "", + "require_full_match": False, + "negative_patterns": ["查询"], + "keyword_threshold": 0.9 + } + , + { + "command": "切换对话模式", + "patterns": [ + "切换对话模式","切换兑换模式" + ], + "exact_matches": [], + "has_param": False, + "param_regexp": "", + "require_full_match": False, + "negative_patterns": [], + "keyword_threshold": 0.8 + }, + { + "command": "查询版本", + "patterns": [ + "查询版本号","软件版本" + ], + "exact_matches": [], + "has_param": False, + "param_regexp": "", + "require_full_match": False, + "negative_patterns": ["查询"], + "keyword_threshold": 0.6 + }, + ] + if self.VC_TTS_volume == None: + self.VC_TTS_volume = 100 + self.AI_audio_queue_thread_id = 0 + self.AI_audio_queue_thread_lock = 0 + self.AI_VC_send_data_queue_thread_id = 0 + self.AI_VC_send_data_queue_thread_lock = 0 + self.AI_ASR_send_data_queue_thread_id = 0 + self.AI_ASR_send_data_queue_thread_lock = 0 + self.AI_record_tmp_queue = Queue(100) + self.AI_ASR_send_data_queue = Queue(200) + self.AI_VC_send_data_queue = Queue(100) + self.AI_audio_queue = Queue(100) + #self.AI_WS_connect_Queue = Queue(100) #释放用 + self.AI_TTS_str = "" + self.AI_ASR_str = "" + self.AI_ASR_flag = 0 + self.AI_ASR_str_tmp = "" + self.AI_ASR_send_buf_len = 0 + self.AI_ASR_text_tmp = "" + self.AI_ASR_text_repet_count = 0 + # #开始线程 + # if self.AI_audio_queue_thread_id ==0: + # self.AI_audio_queue_thread_id = _thread.start_new_thread(self.AI_audio_queue_thread, ()) + # else: + # print("AI_VC_start :AI_audio_queue_thread_id != 0 ") + # if self.AI_VC_send_data_queue_thread_id == 0: + # self.AI_VC_send_data_queue_thread_id = _thread.start_new_thread(self.AI_VC_send_data_queue_thread, ()) + + self.VC_state = VC_State_None #阿里ai VC状态 + self.VC_dialog_id = ""# + self.VC_message_id=None + self.VC_task_id =None + self.AI_client_VC = None + self.AI_client_VC_recv_id = 0 + self.AI_client_VC_recv_lock = 0 + self.AI_client_VC_isconnect =0 + self.AI_client_VC_debug =0 + + self.asr_state = VC_State_None #阿里VC_ASR VC状态 + self.key_state = 0 + + self.AI_client_asr = None + self.AI_client_asr_recv_id = 0 + self.AI_client_asr_recv_lock = 0 + self.AI_client_asr_isconnect =0 + self.AI_ASR_timer = osTimer() + self.AI_ASR_timer_count = 0 + self.AI_client_asr_debug =0 + self.AI_ASR_check_timeout = 0 + self.AI_ASR_error_timeout = 0 + self.VC_Thinking_timerout = 0 + + self.record_pcm = None + self.play_pcm = None + self.VC_record_thread_id = 0 + self.VC_record_thread_lock = 0 + self.VC_pingping_timerout = 0 + self.asr_pingping_timerout = 0 + self.factory_timer = osTimer() + self._1S_timer = osTimer() + self.Audio_buf_size = 16*1024 + self.record = audio.Record() + #self.record.end_callback(self.record_callback) + self.record.gain_set(4,10) + #self.record.gain_set(4,12) + self.aud = audio.Audio(0) + self.aud.setCallback(self.audio_cb) + #self.aud.setVolume(self.VC_TTS_volume //10) + self.audio_play_state = 1 #音频播放完状态 + self.close_timerout = 0 + self.LocalRespondingEnded_timerout = 0 + + self.VC_Play_flag = 0 + self.play_flag = 0 + self.VC_record_state_flag = 0 + self.AI_key_long_press_flag = 0 + self.websocket_error_count = 0 + + self.tts_in_data_len = 0 + self.tts_out_data_len = 0 + self.VC_satrt_flag = 0 + self.session_id = "" + EventMesh.subscribe("AI_key_press", self.AI_key_press_cb) + EventMesh.subscribe("AI_key_release", self.AI_key_release) + EventMesh.subscribe("AI_key_long_press", self.AI_key_long_press_cb) + EventMesh.subscribe("pwk_key_release", self.pwk_key_release_cb) + EventMesh.subscribe("get_AI_audio_queue", self.get_AI_audio_queue) + EventMesh.subscribe("get_VC_satrt_flag", self.get_VC_satrt_flag) + EventMesh.subscribe("VC_error", self.VC_error) + #TTS语音 + EventMesh.subscribe("AI_client_VC_synevent",self.AI_client_VC_synevent) + #EventMesh.publish("AI_client_VC_synevent","") + EventMesh.publish("close_led") + + self.bot_name = "柒先生" + try: + if "bot_name" in self.VC_TTS_voice_type[self.VC_TTS_voice_key]: + self.bot_name = self.VC_TTS_voice_type[self.VC_TTS_voice_key]["bot_name"] + else: + print("not bot_name!!!!!!!!!!!!!!!!!!!!!!") + except Exception as e: + usys.print_exception(e) + try: + if self.ai_OTA.min_sys_ota()==1: + #if 0: + self.AI_TTS_str = "检测到有新版本需要升级啦!升级时可千万别断电或乱按哦,升级完成后设备会自动重启,重启就代表升级成功" + EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_VC_start}) + # if self.ai_OTA.min_sys_ota()==2: + # self.AI_TTS_str = "检测到有新版本需要升级啦!电量低于40%,无法保证升级正常执行,请充满电后重启设备再次升级!" + # EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_VC_start}) + else: + try: + self.ai_OTA.ota_result() + self.ai_OTA.pots_ICCID() + except Exception as e: + usys.print_exception(e) + #开机提示语,如果联网失败,直接提示信号弱 + + #"voice":{"女":"柒妹妹-huoshan::zh_female_wanwanxiaohe_moon_bigtts","男":"柒先生-huoshan::zh_male_wennuanahu_moon_bigtts","ç«¥":"柒乐乐huoshan::ICL_zh_female_huoponvhai_tob","广东":"柒先生-huoshan::zh_female_wanqudashu_moon_bigtts","四川":"柒妹妹-huoshan::zh_female_daimengchuanmei_moon_bigtts","个性":"柒先生-zh_male_sunwukong_mars_bigtts"} + #EventMesh.publish("get_storage_ai_config",["powerRestart",1]) + powerRestart = EventMesh.publish("get_storage_ai_config","powerRestart")#=1非正常重启 + if powerRestart == None: + powerRestart = 0 + if powerRestart == 1: + EventMesh.publish("set_storage_ai_config",["powerRestart",0]) + + else: + pass + #self.AI_TTS_str = self.power_on_tone.replace("bot_name", self.bot_name) + print("开机提示:{}".format(self.AI_TTS_str)) + # EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_VC_start}) + + + + except Exception as e: + usys.print_exception(e) + + + def post_processor_after_instantiation(self): + pass + def get_AI_audio_queue(self, event, msg): + return self.AI_audio_queue + def get_VC_satrt_flag(self, event, msg): + return self.VC_satrt_flag + + + def VC_30S_timer_cb(self, *args): # + EventMesh.publish("publish_AI_btnInfo",{"func":self.VC_30S_timer_cb_}) + + def VC_30S_timer_cb_(self): + self.get_config_timer_count += 1 + if self.get_config_timer_count >= 2*60*2:#2小时更新配置参数 + self.get_config_timer_count = 0 + try: + self.http_get_config()#获取/更新配置参数 + except Exception as e: + usys.print_exception(e) + #提交错误id + def ud_error(self,error_data): + response = None + if self.is_up_error == 1: + try: + # currentVersion = versions.Build_Time + # currentVersion = "7PIN-"+currentVersion[:10]+"-"+currentVersion[11:-3] + url = "http://{}/health?task_id={}".format(self.server_ip,error_data[0]+error_data[1]) + print(url) + response = request.get(url,timeout=5) + if response.status_code == 200: + + print("ud_error:ok") + else: + print("ud_error error!!!!") + for i in response.text: + print(i) + response.close() + except Exception as e: + usys.print_exception(e) + if response != None: + response.close() + #获取配置参数 + def http_get_config(self, event=None, msg=None): + print("http_get_config") + + response = None + #http://180.184.206.142/bz-api/dev/config?deviceId=xxx + try: + url = "http://dmp.raisound.com/bz-api/dev/config/{}".format(modem.getDevImei()) + print(url) + response = request.get(url,timeout=5) + if response.status_code == 200: + data = response.json() + print("http_get_config:{}".format(data)) + + if data: + try: + if data["code"] == 20000:#有配置 + if data["data"] : + if "version" in data["data"]: + config_version = EventMesh.publish("get_storage_ai_config","config_version")#音量配置 + if config_version != data["data"]["version"]: + config_version = data["data"]["version"] + EventMesh.publish("set_storage_ai_config",["config_version",config_version]) + if "VC_TTS_voice_type" in data["data"]: + self.VC_TTS_voice_type = data["data"]["VC_TTS_voice_type"] + EventMesh.publish("set_storage_ai_config",["VC_TTS_voice_type",self.VC_TTS_voice_type]) + print("配置VC_TTS_voice_type成功") + if "server_ip" in data["data"]: + self.server_ip = data["data"]["server_ip"] + EventMesh.publish("set_storage_ai_config",["server_ip",self.server_ip]) + print("配置server_ip成功") + if "power_on_tone" in data["data"]: + self.power_on_tone = data["data"]["power_on_tone"] + EventMesh.publish("set_storage_ai_config",["power_on_tone",self.power_on_tone]) + print("配置power_on_tone成功") + + except Exception as e: + usys.print_exception(e) + else: + print("status_code:{}".format(response.status_code)) + print("http_get_config:error!!!!!!!!!!") + response.close() + except Exception as e: + usys.print_exception(e) + if response != None: + response.close() + + def audio_cb(self,event): + if event == 0: + self.audio_play_state =1 + #EventMesh.publish("set_audio_state", 1) + print('audio-play start.') + elif event == 7: + self.audio_play_state = 0 + #EventMesh.publish("set_audio_state", 0) + print('audio-play finish.!!!!!!') + + def AI_key_press_cb(self,event,msg):#按键按下 + print("AI_key_press") + self.get_config_timer_count = 0 + self.key_state = 1 + self.Close() + if dev_type == "7PIN" : + self.aud.aud_tone_play(10,200)#播放按键音 + #self.aud.aud_tone_play(10,200)#播放按键音 + self.AI_TTS_str = ""#你好,有什么吩咐" + self.AI_ASR_str = "" + self.AI_ASR_str_tmp = "" + self.VC_state = VC_State_None + # if self.VC_state != VC_State_None: + # EventMesh.publish("publish_AI_btnInfo",{"func":self.Close}) + # EventMesh.publish("publish_AI_btnInfo",{"func":utime.sleep_ms,'data':(10)}) + #if self.VC_record_state_flag >1:#如果在录音,就先停止录音 + self.VC_Speech_End() + + self.VC_Speech_Start() + self.AI_VC_start() + #self.chenggong_tone() + # self.Close() + # self.AI_VC_start() + self.AI_key_long_press_flag = 0 + + + def AI_key_release(self, event, msg):#按键弹起 + print("AI_key_release123") + self.key_state = 0 + if self.AI_key_long_press_flag == 1 :#有长按 + #self.AI_client_VC_end_speech() + #EventMesh.publish("publish_AI_btnInfo",{"func":utime.sleep_ms,'data':(1000)}) + #EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_client_asr_StopTranscription_requset}) + #self.AI_client_asr_StopTranscription_requset()#请求停止 + if self.VC_mode == 1 :#长按单次问答模式 + # if self.AI_ASR_str_tmp != "": + print("AI_key_release:asr_str:{}".format(self.AI_ASR_str)) + EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_VC_start}) + self.AI_TTS_str = "请您按住中间的按钮开始讲话,讲完松开即可 " + # EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_VC_start}) + self.AI_client_VC_end_speech() + pass + + else : + if self.VC_mode == 1 :#长按单次问答模式 + try: + EventMesh.publish("publish_AI_btnInfo",{"func":self.Close}) + except Exception as e: + usys.print_exception(e) + EventMesh.publish("publish_AI_btnInfo",{"func":self.key_prompt}) #提示请您按住中间的按钮开始讲话,讲完松开即可 + # self.AI_TTS_str = "请您按住中间的按钮开始讲话,讲完松开即可 " + # EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_VC_start}) + pass + + #self.VC_Speech_End() + def AI_key_long_press_cb(self, event, msg):#按键长按 + print("AI_key_long_press") + self.AI_key_long_press_flag = 1 + + def pwk_key_release_cb(self, event, msg):#电源键短按,关闭 + print("pwk_key_release") + EventMesh.publish("close_hr_sop2")#关闭健康测试 + if self.AI_TTS_str == "": + #close_all_ledm() + EventMesh.publish("close_all_led") + #EventMesh.publish("stop_led_timer") + EventMesh.publish("publish_AI_btnInfo",{"func":self.Close}) + + def key_prompt(self): + EventMesh.publish("audio_montage_play",["key_prompt.mp3"]) + #self.aud.play(1,1,'U:/static/key_prompt.mp3')#提示请您按住中间的按钮开始讲话,讲完松开即可 + def VC_error(self, event, msg):#错误播报 + self.websocket_error() + #EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_error}) + def set_VC_record_state_flag(self,data): + + self.VC_record_state_flag = data + print("set_VC_record_state_flag:{}".format(self.VC_record_state_flag)) + #开始录音,不缓存,直接发 + def VC_Speech_Start_now(self): + self.VC_Speech_Start() + if self.VC_record_state_flag == 1: + self.VC_record_state_flag =2 + print("VC_Speech_Start_now:{}".format(self.VC_record_state_flag)) + #开始录音,先缓存到buf,等服务器响应再发 + def VC_Speech_Start(self): + try: + + #self.VC_state = VC_State_SpeechStart + print("VC_Speech_Start VC_record_state_flag:{} self.AI_ASR_flag:{}!!!!!!!!".format(self.VC_record_state_flag,self.AI_ASR_flag)) + if self.AI_ASR_flag != 0: + return + + if self.VC_record_state_flag == 0: + + self.VC_record_thread_close()#关闭录音线程 + _thread.stack_size(self.Audio_buf_size+8*1024) + self.VC_record_thread_id = _thread.start_new_thread(self.VC_record_thread,()) + _thread.stack_size(8*1024) + print("self.VC_record_thread_id:{}".format(self.VC_record_thread_id)) + try: + + if self.VC_record_TYPE == VC_record_TYPE_AMR : + try : + self.record.stream_start(audio.Record.AMRNB, self.VC_record_samplerate, 0) + except Exception as e: + usys.print_exception(e) + elif self.VC_record_TYPE == VC_record_TYPE_PCM: + print("record_pcm.stream_read_start()!!!!!!!!!!!!") + self.record.stream_start(audio.Record.WAV, self.VC_record_samplerate, 0) + # if self.record_pcm != None: + # try: + # self.record_pcm.stream_stop() + # self.record_pcm.close() + # self.record_pcm = None + # except Exception as e: + # usys.print_exception(e) + # if self.record_pcm == None: + # ret = self.record_pcm = audio.Audio.PCM(0,1,16000,0,1,2) + # print("audio.Audio.PCM:ret:{}".format(ret)) + # ret = self.record_pcm.stream_read_start() + # print("self.record_pcm.stream_read_start:ret:{}".format(ret)) + except Exception as e: + usys.print_exception(e) + + self.VC_record_state_flag = 1 + + except Exception as e: + self.websocket_error() + self.VC_record_state_flag = 1 + self.VC_Speech_End()#关闭录音 + usys.print_exception(e) + #停止录音 + def VC_Speech_End(self): + try: + self.AI_ASR_flag = 0 + self.AI_ASR_str_tmp = "" + self.AI_ASR_str = "" + #EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_deconnect_asr}) + + if self.VC_record_state_flag == 0: + return + #self.AI_client_asr_StopTranscription_requset()#请求停止 + if self.VC_record_TYPE == VC_record_TYPE_AMR: + self.record.stream_stop() + self.record.stop()#关闭录音 + Record_read_buf = bytearray(self.Audio_buf_size) + for i in range(10): + Record_len = self.record.stream_read(Record_read_buf, self.Audio_buf_size) + print("Record_len:!!!!!!{}".format(Record_len)) + if Record_len <= 0: + break + elif self.VC_record_TYPE == VC_record_TYPE_PCM: + self.record.stream_stop() + self.record.stop()#关闭录音 + Record_read_buf = bytearray(self.Audio_buf_size) + for i in range(10): + Record_len = self.record.stream_read(Record_read_buf, self.Audio_buf_size) + print("Record_len:!!!!!!{}".format(Record_len)) + if Record_len <= 0: + break + # if self.record_pcm != None: + # try: + # self.record_pcm.stream_stop() + # self.record_pcm.close() + # self.record_pcm = None + # except Exception as e: + # usys.print_exception(e) + except Exception as e: + usys.print_exception(e) + self.VC_record_thread_close()#关闭录音线程 + if self.AI_record_tmp_queue.empty() != True: + self.AI_record_tmp_queue.clear() + + self.VC_record_state_flag = 0 + print("VC_Speech_End VC_record_state_flag:{}!!!!!!!!".format(self.VC_record_state_flag)) + #关闭录音线程 + def VC_record_thread_close(self): + if self.VC_record_thread_id != 0: + count =50 + while True: + count -= 1 + if self.VC_record_thread_lock == 1: + self.VC_record_thread_lock = 2 + if self.VC_record_thread_lock == 0 or count <=0: + break + else: + print("VC_record_thread_thread going:{}...".format(count)) + utime.sleep_ms(1) + self.VC_record_thread_lock = 0 + print("VC_record_thread_thread_close") + try: + _thread.stop_thread(self.VC_record_thread_id) + except Exception as e: + usys.print_exception(e) + self.VC_record_thread_id = 0 + #获取录音数据 + def VC_record_thread(self): + ##return + print("VC_record_thread start!!!!!!!!!!!!!!!!!!!!\r\n") + count = 0 + RequestToSpeak_flag = 0 + # try: + # uos.remove('/usr/test.pcm') + # except Exception as e: + # usys.print_exception(e) + #record_data_queue = Queue(100) + #fd = open('/usr/test.pcm','w') + # if self.VC_record_TYPE == 1: + # h_data= [0x23,0x21 ,0x41 ,0x4D ,0x52 ,0x0A ] + # h_data_b = bytes(h_data) + # self.AI_client_VC_send(h_data_b) + AI_record_tmp_queue_len = 0 + vad_buf = bytearray() + VAD_data_count = 0 + vad_state = 0 + self.VAD_count = 0 + while True: + try: + if self.VC_record_thread_lock == 2: + break + self.VC_record_thread_lock = 1 + # 死循环接收数据 + #if self.VC_state == VC_State_SpeechStart: + Record_read_buf = bytearray(self.Audio_buf_size) + + Record_len = 0 + if self.VC_record_TYPE == VC_record_TYPE_PCM:#pcm + Record_len = self.record.stream_read(Record_read_buf, self.Audio_buf_size) + #utime.sleep_ms(60) + + else : + + Record_len = self.record.stream_read(Record_read_buf, self.Audio_buf_size) + utime.sleep_ms(600) + + #Record_len = 1024*2 + #print("VC_record_thread:{}".format(Record_len)) + if Record_len > 0: + read_buf = bytes(Record_read_buf[:Record_len]) + # print("Record_len:{},{},{}".format(Record_len,self.VC_state,self.VC_record_state_flag)) + #VAD检测 + if self.is_VAD == 1: + vad_state = 0 + tmp_c = 1000 + while True: + tmp_c -=1 + if tmp_c <=0: + break + #vad_buf_len = len(vad_buf) + if VAD_data_count == 0:#没数据的时候 + vad_buf = Record_read_buf[:self.VAD_data_len] + VAD_data_count = self.VAD_data_len + self.vad.custom_vad_reset()#重置vad + else:#有数据的时候 + if Record_len - VAD_data_count < self.VAD_data_len :#剩余长度不够一次填充,先保留,但不填算法 + vad_buf = Record_read_buf[VAD_data_count:Record_len] + VAD_data_count = 0 + break + else:#剩余长度够填一次数据 + vad_buf = Record_read_buf[VAD_data_count:VAD_data_count+self.VAD_data_len] + VAD_data_count += len(vad_buf) + #print("vad_buf_len:{},{}".format(len(vad_buf),VAD_data_count)) + + if len(vad_buf) >= self.VAD_data_len: + vad_state = self.vad.custom_vad_process(vad_buf,len(vad_buf))#给vad数据 + #print("vad_state:{}".format(vad_state)) + + if VAD_data_count >= Record_len: + VAD_data_count = 0 + break + if vad_state == 1: + print("检测到VAD=1!!!!!!!!!!!!!") + print("检测到VAD=1!!!!!!!!!!!!!") + print("检测到VAD=1!!!!!!!!!!!!!") + + EventMesh.publish("publish_AI_btnInfo",{"func":self.VC_Play_Pause,"data":1})#停止音频 + # EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_client_VC_RequestToSpeak})#打断 + # RequestToSpeak_flag = 1 + + self.VAD_count+=1 + if self.VAD_count >= 2: + EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_client_VC_RequestToSpeak})#打断 + + else: + if self.VAD_count != 0: + EventMesh.publish("publish_AI_btnInfo",{"func":self.VC_Play_Pause,"data":0})#恢复音频播放 + self.VAD_count = 0 + if self.VC_state >= VC_State_TTSStart: + pass + if vad_state == 1: + self.AI_record_tmp_queue.put(read_buf)#入缓存队列 + AI_record_tmp_queue_len += len(read_buf) + + + else: + VAD_data_count = 0 + if self.VC_record_state_flag <=1 :#没发送前先存起来 + self.AI_record_tmp_queue.put(read_buf) + AI_record_tmp_queue_len += len(read_buf) + else: + AI_record_tmp_queue_len = 0 + while True: + if self.AI_record_tmp_queue.empty() == True: + break + else: + pass + self.AI_client_VC_send(self.AI_record_tmp_queue.get()) #发送之前存的数据 + self.AI_client_VC_send(read_buf) + + if self.record_data_save_flag == 1: + if self.record_fd == None: + try: + uos.remove('/usr/record_data.pcm') + except Exception as e: + usys.print_exception(e) + self.record_fd = open('/usr/record_data.pcm','w') + if self.record_fd != None: + self.record_fd.write(read_buf) + print("write record:{}".format(len(read_buf))) + # count+=Record_len + # if count >150*1024: + # self.record_fd.close() + #self.record_fd = None + + + + + #print("VC_record_thread:{}".format(len(read_buf))) + #count+=len(read_buf) + # if count>=500*1024:#结束 + # self.AI_client_VC_end_speech() + # break + # count+=1 + # if count %10 == 0: + # print("VC_record_thread on line {} asr recv :{} send:{}".format(self.VC_record_state_flag,_thread.threadIsRunning(self.AI_client_asr_recv_id),_thread.threadIsRunning(self.AI_VC_send_data_queue_thread_id))) + + # if self.VC_state >= VC_State_SpeechEnd: + # break + + except Exception as e: + usys.print_exception(e) + #break + self.VC_record_thread_lock = 0 + utime.sleep_ms(100) + #fd.close() + print("VC_record_thread:exit") + self.VC_record_thread_id = 0#线程退出 + self.VC_record_thread_lock = 0 +###################################################### VC ################################################################################### + def websocket_connect_VC(self): + print("websocket_connect_VC:{} e:{}!!!!!!!!!!!!!!!!!!!!!".format(self.AI_client_VC_isconnect,self.AI_client_VC_debug)) + if self.AI_client_VC_isconnect == 1: + return + # 创建VC客户端 + try: + signal = net.csqQueryPoll() + if signal == -1 or sim.getStatus() != 1:#网络正常 + self.websocket_error() + return + + req_str = "" + ack = "" + if self.is_VC_ACK == 1: + ack = "ack=1" + lang = "lang=zh-cn"#普通话测试环境 + try: + if "loang" in self.VC_TTS_voice_type[self.VC_TTS_voice_key]: + lang = self.VC_TTS_voice_type[self.VC_TTS_voice_key]["lang"] + else: + print("not lang!!!!!!!!!!!!!!!!!!!!!!") + except Exception as e: + usys.print_exception(e) + if dev_type == "G10": + platform = "platform=huoshan&is_boot=1" + #platform = "platform=raisound" + #platform = "platform=aliyun" + elif dev_type == "7PIN_BK": + platform = "platform=huoshan" + #platform = "platform=raisound&bot_type=dify" + platform = "platform=raisound&bot_type=fourseason_water" + pass + elif dev_type == 'momo':# + #22080/voice-chat/v2.1/ws?platform=raisound&bot_type=deepseek + platform = "platform=raisound&bot_type=shimeng_mo" + elif dev_type == "sjgq": + platform = "platform=raisound" + else: + platform = "platform=huoshan" + #platform = "platform=huoshan&is_boot=1" + #女,男,童,粤,川 + self.bot_name = "柒先生" + try: + if "bot_name" in self.VC_TTS_voice_type[self.VC_TTS_voice_key]: + self.bot_name = self.VC_TTS_voice_type[self.VC_TTS_voice_key]["bot_name"] + else: + print("not bot_name!!!!!!!!!!!!!!!!!!!!!!") + except Exception as e: + usys.print_exception(e) + + # Headers = {'X-NLS-Token':'0c8b8f05a46f423096be64a9c4c46310'} + # self.AI_client_VC = uwebsocket.Client.connect('wss://nls-gateway-cn-beijing.aliyuncs.com/ws/v1',headers=Headers, debug=False) + token = EventMesh.publish("get_dev_token") + print("token:{}".format(token)) + if dev_type == 'momo' :# + req_str = "voice-chat/v2.1/ws?is_auth={}&{}&{}".format(self.is_auth,platform,lang) + elif dev_type == '7PIN_BK': + #req_str = "voice-chat/v2.1/ws?is_auth={}&{}&{}".format(self.is_auth,platform,lang) + req_str = "voice-chat/ws?is_auth={}&{}&{}".format(self.is_auth,platform,lang) + elif dev_type == "sjgq": + req_str = "22085/voice-chat/ws?is_auth={}&{}&{}".format(self.is_auth,platform,lang) + elif dev_type == "G10": + req_str = "vc/chat?is_auth={}".format(self.is_auth) + else: + req_str = "voice-chat/ws?is_auth={}&{}&{}".format(self.is_auth,platform,lang) + req_str = "vc/chat?is_auth={}".format(self.is_auth) + url = 'ws://{}/{}&dt={}'.format(self.server_ip,req_str,token) + #url = 'ws://115.190.94.208:22080/vc/coze?dt={}'.format(token) + + print("VC VC:url{}".format(url)) + self.AI_client_VC = uwebsocket.Client.connect(url, debug=True) + #self.AI_WS_connect_Queue.put(self.AI_client_VC) + + + print("websocket_connect_VC:OK!!!!!!!!!!!!!!!!!!!!!") + except Exception as e: #网络连接异常 + usys.print_exception(e) + print("websocket_connect_VC error!!!\r\n") + str_error = str(e) + if str_error.find("[Errno 22] EINVAL")!= -1: + print("websocket_connect_VC:str_error:{}".format(str_error)) + print("[Errno 22] EINVAL!!!\r\n") + print("[Errno 22] EINVAL!!!\r\n") + print("[Errno 22] EINVAL!!!\r\n") + print("[Errno 22] EINVAL!!!\r\n") + self.websocket_error() + EventMesh.publish("set_storage_ai_config",["powerRestart",1])#调试临时关闭 + utime.sleep_ms(1000) + self.aud.stopPlayStream() + self.aud.stopAll() + Power.powerRestart() + + self.websocket_error() + return + #print("AI_client_VC:{}".format(self.AI_client_VC)) + if self.AI_client_VC == None: + EventMesh.publish("update_dev_token")#获取token + self.websocket_error() + return + self.AI_client_VC_debug+=1 + utime.sleep_ms(10) + self.AI_client_VC.settimeout(5) + #self.AI_VC_send_data_queue_thread_close()#关闭发送线程 + if self.AI_VC_send_data_queue_thread_id == 0: + _thread.stack_size(self.Audio_buf_size+8*1024) + self.AI_VC_send_data_queue_thread_id = _thread.start_new_thread(self.AI_VC_send_data_queue_thread, ()) + _thread.stack_size(8*1024) + print("AI_VC_start :AI_VC_send_data_queue_thread_id :{} ".format(self.AI_VC_send_data_queue_thread_id)) + self.AI_client_VC_recv_thread_close()#关闭读线程 + # 线程接收数据 + _thread.stack_size(self.Audio_buf_size+8*1024) + self.AI_client_VC_recv_id = _thread.start_new_thread(self.AI_client_VC_recv, (self.AI_client_VC,)) + _thread.stack_size(8*1024) + self.AI_client_VC_isconnect = 1 + print("websocket_connect_VC end") + + def websocket_error(self,TTS_str=None): + print("websocket_error1!!!!") + self.Close() + print("websocket_error1.1!!!!") + print("websocket_error!!!!") + print("websocket_error!!!!") + self.VC_Thinking_timerout = 0 + self.VC_satrt_flag = 0 + self.AI_TTS_str = "" + self.AI_ASR_str = "" + self.AI_ASR_str_tmp = "" + self.AI_ASR_flag = 0 + self.VC_Speech_End() + EventMesh.publish("close_led") + if TTS_str == None: + self.websocket_error_count+=1 + # if self.websocket_error_count <=3: + # EventMesh.publish("audio_montage_play",["xinhaoruo1.mp3"]) + if self.websocket_error_count <10 : + EventMesh.publish("audio_montage_play",["xinhaoruo1.mp3"]) + elif self.websocket_error_count >=10: + EventMesh.publish("paly_iccid_imei") + # else: + # EventMesh.publish("audio_montage_play",["R_SIM_FAILE.mp3"]) + self.aud.play(1,1,'U:/static/R_SIM_FAILE.mp3') + if self.websocket_error_count <3 : + utime.sleep_ms(3000) + EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_VC_start}) + else: + print("websocket_error:tts:{}".format(TTS_str)) + self.AI_TTS_str = TTS_str + EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_VC_start}) + print("websocket_error2") + + + print("websocket_error4") + + + def websocket_deconnect_VC(self): + #print("websocket_deconnect_VC {}!!!!!!!".format(self.AI_client_VC_isconnect)) + print("websocket_deconnect_VC!!!!!!!") + self.AI_client_VC_recv_thread_close()#关闭读线程 + self.AI_client_VC_recv_id = 0 + if self.AI_client_VC_isconnect == 1 or self.AI_client_VC!=None: + try: + self.AI_client_VC_isconnect = 0 + count = 500 + while True:#等待发完数据 + count-=1 + if count <=0 or self.AI_VC_send_data_queue_thread_lock == 0: + break + utime.sleep_ms(1) + + try: + self.AI_client_VC.close() + self.AI_client_VC_debug -=1 + #self.AI_client_VC=None + except Exception as e: + usys.print_exception(e) + try : + self.AI_client_VC.close() + self.AI_client_VC_debug -=1 + #self.AI_client_VC=None + except Exception as e: + usys.print_exception(e) + try : + self.AI_client_VC._close() + except Exception as e: + usys.print_exception(e) + self.AI_client_VC = None + except Exception as e: + usys.print_exception(e) + print("websocket_deconnect_VC {}!!!!!!!".format(self.AI_client_VC_isconnect)) + #websocket发送ping + def AI_client_VC_ping(self): + pass + if self.AI_client_VC_isconnect == 1: + #self.AI_client_VC.write_frame(0x09,b'ping ping') + self.AI_client_VC_send("ping") + print("VC: ping ping") + + #websocket发送数据 + def AI_client_VC_send(self,data_str): + # if isinstance(data_str, str):#是字符串 + # print("AI_client_VC_send:{}".format(data_str)) + # pass + # else: + # print("AI_client_VC_send:len{}".format(len(data_str))) + self.AI_VC_send_data_queue.put([AI_client_VC_num,data_str]) + #关闭数据发送线程 + def AI_VC_send_data_queue_thread_close(self): + if self.AI_VC_send_data_queue_thread_id != 0: + count =500 + while True: + count -= 1 + if self.AI_VC_send_data_queue_thread_lock == 0 or count <=0: + break + else: + self.AI_VC_send_data_queue_thread_lock = 2 + print("AI_VC_send_data_queue_thread going:{}...".format(count)) + utime.sleep_ms(1) + if self.AI_VC_send_data_queue.empty()!=True: + self.AI_VC_send_data_queue.clear() + self.AI_VC_send_data_queue_thread_lock = 0 + print("AI_VC_send_data_queue_thread_close") + try: + _thread.stop_thread(self.AI_VC_send_data_queue_thread_id) + except Exception as e: + usys.print_exception(e) + self.AI_VC_send_data_queue_thread_id = 0 + #发送数据队列 + def AI_VC_send_data_queue_thread(self): + print("AI_VC_send_data_queue_thread:start") + count_t = 0 + while True: + if self.AI_VC_send_data_queue_thread_lock == 2: + print("AI_VC_send_data_queue_thread,该退出了") + break + if self.AI_VC_send_data_queue.empty() :#不能去掉,去掉会卡死 + self.AI_VC_send_data_queue_thread_lock = 0 + count_t+=1 + # if count_t%200 == 0: + # print("self.AI_VC_send_data_queue.empty") + utime.sleep_ms(1) + else: + #data[0]是websocket连接对象编号,data[1]是数据 + #print("AI_VC_send_data_queue_thread:get") + + self.AI_VC_send_data_queue_thread_lock = 1 + data = self.AI_VC_send_data_queue.get() + + + #print("AI_VC_send_data_queue_thread:num{} len{}".format(data[0],len(data[1]))) + if data != None: + try: + #data["func"](data["data"]) + # 发送数据 + #bytes_data = bytes(data[1]) + #data[0].send(data[1]) + #print("AI_VC_send_data_queue_thread:len:{}".format(len(data[1]))) + #print("AI_VC_send_data_queue_thread on line asr recv :{} vc recv:{}".format(_thread.threadIsRunning(self.AI_client_asr_recv_id),_thread.threadIsRunning(self.AI_client_VC_recv_id))) + if data[0] == AI_client_VC_num: + + if isinstance(data[1], str):#是字符串 + self.VC_pingping_timerout = 0 + print("VC VC: send_data:{}".format(data[1])) + else: + pass + # print("VC: send_data len:{}".format(len(data[1]))) + if self.AI_client_VC != None and self.AI_client_VC_isconnect == 1: + self.AI_client_VC.send(data[1]) + else: + print("VC VC: send_data:ERROR:{}".format(len(data[1]))) + #print("VC: send_data end") + + #print("VC: send_data end") + except Exception as e: + print("DeviceInfo_queue_thread:ERROR:{}".format(e)) + usys.print_exception(e) + if data[0] == AI_client_VC_num: + #self.websocket_error() + pass + + + try: + if self.AI_client_VC_isconnect != 0: + print("VC发送数据错误,退出") + EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_error,"data":"VC发送出错了,请重试"}) + self.ud_error(["VC",self.VC_taskid]) + except Exception as e: #网络连接异常 + usys.print_exception(e) + + utime.sleep_ms(1) + self.AI_VC_send_data_queue_thread_lock = 0 + #VC关闭读线程 + def AI_client_VC_recv_thread_close(self): + if self.AI_client_VC_recv_id != 0: + count =500 + while True: + count -= 1 + if self.AI_client_VC_recv_lock == 1: + self.AI_client_VC_recv_lock = 2 + if self.AI_client_VC_recv_lock == 0 or count <=0: + break + else: + print("AI_client_VC_recv_thread going:{}...".format(count)) + utime.sleep_ms(1) + self.AI_client_VC_recv_lock = 0 + print("AI_client_VC_recv_thread_close") + try: + _thread.stop_thread(self.AI_client_VC_recv_id) + except Exception as e: + usys.print_exception(e) + self.AI_client_VC_recv_id = 0 + #Ai VC websocket返回数据 + def AI_client_VC_recv(self,cli): + count = 0 + asr_led_flag = 0 + tts_led_flag = 0 + while True: + try: + # 死循环接收数据 + self.AI_client_VC_recv_lock = 0 + + count+=1 + if self.VC_state >= VC_State_TTSStart and (self.tts_in_data_len - self.tts_out_data_len > 64*1024 or count>5): + count = 0 + utime.sleep_ms(1) + if self.VC_state < VC_State_TTSStart: + utime.sleep_ms(1) + recv_data = cli.recv() + if self.AI_client_VC_recv_lock == 2: + print("AI_client_VC_recv 该退出了") + break + self.AI_client_VC_recv_lock = 1 + self.close_timerout = 0#服务器有返回清零退出时间 + if recv_data == "websocket close": + # 服务器关闭连接 + print("VC 服务器关闭连接!!!!!!!!!!!!!!!!!!!!!!!!!!!") + #self.AI_client_VC_isconnect = 0 + #self.websocket_deconnect_VC() + #EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_deconnect_asr}) + # #EventMesh.publish("publish_AI_btnInfo",{"func":utime.sleep_ms,'data':(1500)}) + #EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_connect_asr}) + EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_error,"data":"VC连接断开了,请重试"}) + self.ud_error(["VC",self.VC_taskid]) + break + elif recv_data == "":#客户端关闭连接 + print("VC VC :客户端关闭连接") + EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_error,"data":"VC连接断开了,请重试"}) + self.ud_error(["VC",self.VC_taskid]) + break + try: + self.websocket_error_count = 0 + if isinstance(recv_data, str):#返回的是字符串 + print("VC VC:recv_data:{}".format(recv_data)) + jsload_data = ujson.loads(recv_data) + #print("AI_client_VC_recv jsload_data = {}".format(jsload_data)) + #self.LocalRespondingEnded_timerout = 0 + if jsload_data["event"] == "started" :#会话开始 + #payload = jsload_data["payload"] + # self.VC_dialog_id = payload["dialog_id"] + # self.VC_task_id = jsload_data["task_id"] + EventMesh.publish("open_led_blue") + print("VC:Started str{}!!!!!!!!\r\n".format(self.AI_TTS_str)) + if self.AI_TTS_str == "": + #开始上传语音 + + if self.VC_mode == 0 : + self.VC_record_state_flag =2 + else: + EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_client_VC_send_speech}) + + + else: + EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_client_VC_synthesis}) + self.VC_state = VC_State_None + elif jsload_data["event"] == "asr.started" :#asr开始 + self.VC_state = VC_State_SpeechStart + if self.VC_mode == 1 : + self.VC_record_state_flag = 2 + EventMesh.publish("open_led_blue") + elif jsload_data["event"] == "asr.result" :#asr结果 + self.AI_ASR_str = jsload_data["payload"]["content"] + if self.commands_mode ==2: + ret= self.check_text(self.AI_ASR_str) + if ret == 0:#配置指令 + + if self.AI_VC_send_data_queue.empty()!=True: + self.AI_VC_send_data_queue.clear() + if self.AI_ASR_send_data_queue.empty()!=True: + self.AI_ASR_send_data_queue.clear() + self.AI_ASR_send_buf_len = 0 + EventMesh.publish("open_led_all") + try: + + EventMesh.publish("publish_AI_btnInfo",{"func":self.VC_Speech_End}) + EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_deconnect_VC}) + EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_VC_start}) + except Exception as e: + usys.print_exception(e) + continue + elif ret == 1:#不处理 + pass + EventMesh.publish("open_led_blue") + elif jsload_data["event"] == "asr.completed" :#asr 终止的标识 + #self.VC_Speech_End() + #EventMesh.publish("publish_AI_btnInfo",{"func":self.VC_Speech_End}) + if self.record_data_save_flag == 1: + if self.record_fd : + self.record_fd.close() + self.record_fd = None + # if dev_type != "7PIN" : + #EventMesh.publish("publish_AI_btnInfo",{"func":self.send_tone}) + elif jsload_data["event"] == "vad.silence" :#VAD 终止的标识 + pass + #EventMesh.publish("publish_AI_btnInfo",{"func":self.VC_Speech_End}) + elif jsload_data["event"] == "llm.created" :#会话开始 + self.VC_state = VC_State_Thinking + # EventMesh.publish("publish_AI_btnInfo",{"func":self.VC_Play_Start}) + pass + elif jsload_data["event"] == "llm.delta" :#llm返回数据 + if self.is_VAD == 0: + if self.VC_record_state_flag == 1:#llm返回数据还没停止,就先停止 + EventMesh.publish("publish_AI_btnInfo",{"func":self.VC_Speech_End}) + elif jsload_data["event"] == "tts.started" :#tts开始 + self.VC_state = VC_State_TTSStart + if self.is_VAD == 0: + EventMesh.publish("publish_AI_btnInfo",{"func":self.VC_Speech_End}) + EventMesh.publish("publish_AI_btnInfo",{"func":self.VC_Play_Start}) + + #self.VC_Play_Start() + elif jsload_data["event"] == "tts.completed" :#tts结束 + EventMesh.publish("publish_AI_btnInfo",{"func":self.VC_Play_Start}) + self.LocalRespondingEnded_timerout = 8 + self.VC_state = VC_State_TTSEnd + pass + + elif jsload_data["event"] == "canceled" :#打断 + EventMesh.publish("publish_AI_btnInfo",{"func":self.VC_Speech_Start_now})#开始录音 + self.VC_state = VC_State_None + elif jsload_data["event"] == "completed" :#会话结束 + #EventMesh.publish("open_led_green")#绿色 + + self.LocalRespondingEnded_timerout = 8 + self.VC_state = VC_State_End + pass + # self.AI_client_VC_send_speech()#开始上传语音 + # self.VC_record_state_flag = 2 + elif jsload_data["event"] == "command" :#命令匹配 + ret = -1 + try: + if self.commands_mode ==1: + if len(jsload_data["payload"]["functions"])>0: + + cmd = jsload_data["payload"]["functions"][0]["function"]["arguments"] + print("llm:cmd:{}".format(cmd)) + cmd = ujson.loads(cmd) + ret = self.check_text_llm(cmd) + elif self.commands_mode ==0: + + cmd = jsload_data["payload"] + print("server:cmd:{}".format(cmd)) + ret = self.check_text_server(cmd) + except Exception as e: + usys.print_exception(e) + if ret == -1: + if self.AI_TTS_str =="": + self.AI_TTS_str = "抱歉,没找到对应操作,可以换个说法试试" + #EventMesh.publish("publish_AI_btnInfo",{"func":utime.sleep_ms,'data':(10)}) + EventMesh.publish("publish_AI_btnInfo",{"func":self.VC_Speech_End}) + EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_deconnect_VC}) + EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_VC_start}) + else:#下发音频数据 + #self.AI_ASR_str = ""#下发音频后清掉asr结果 + + + EventMesh.publish("open_led_green")#绿色 + + print("下发音频数据1:{}".format(len(recv_data))) + + if self.play_data_save_flag == 1: + if self.play_fd ==None: + try: + uos.remove('/usr/play_data.pcm') + except Exception as e: + usys.print_exception(e) + self.play_fd = open('/usr/play_data.pcm','w') + if self.play_fd !=None: + self.play_fd.write(recv_data) + # print("下发音频数据2:{}".format(len(recv_data))) + #if self.VC_state >= VC_State_TTSStart: + #self.put_record_data([recv_data,""]) + # if self.VC_play_TYPE == VC_play_TYPE_PCM: + # if self.play_pcm != None: + # try: + # #print("play_pcm.stream_write !!!") + # buf_len = self.play_pcm.stream_get_buf_len() + # count_tmp = 1000 + # while buf_len < len(recv_data): + # utime.sleep_ms(1) + # count_tmp-=1 + # if count_tmp<=0: + # break + # buf_len = self.play_pcm.stream_get_buf_len() + # #print("buf已满,等待释放:buf_len:{},count_tmp:{}".format(buf_len,count_tmp)) + # except Exception as e: + # usys.print_exception(e) + EventMesh.publish("publish_AI_btnInfo",{"func":self.put_record_data,"data":[recv_data,""]}) + utime.sleep_ms(1) + except Exception as e: + usys.print_exception(e) + + except Exception as e: + error_str = str(e) + #print("VC VC:e:{}".format(error_str)) + if error_str.find("[Errno 110] ETIMEDOUT")!= -1: + #print("VC VC:recv TIMEDOUT 正常") + pass + else: + usys.print_exception(e) + #self.websocket_error() + print("VC VC :读数据报错,退出") + EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_error,"data":"VC出错了,请重试"}) + self.ud_error(["VC",self.VC_taskid]) + break + self.AI_client_VC_isconnect = 0 + self.AI_client_VC_recv_id = 0 + self.AI_client_VC_recv_lock = 0 + print("AI_client_VC_recv END!!!!!!!!!!!!!!!!!!!!!!!!!!!") + def put_record_data(self,data): + #print("下发音频数据1:{}".format(len(data[0]))) + ret=self.AI_audio_queue.put(data) + self.tts_in_data_len += len(data[0]) + #print("下发音频数据2:{},{}".format(len(data[0]),self.tts_in_data_len)) + def check_text_server(self,cmd): + # if len(text)>60: + # return -1 + try: + text = cmd["command"] + if text.find("切换音色") != -1 : + try: + text = cmd["params"]["cmd_parameter"] + for key in self.VC_TTS_voice_type: + if text.find(key) != -1 : + self.VC_TTS_voice_key = key + EventMesh.publish("set_storage_ai_config",["VC_TTS_voice_key",self.VC_TTS_voice_key]) + self.AI_TTS_str = "更改成功" + return 0 + except Exception as e: + usys.print_exception(e) + if text.find("男") != -1 : + if "男" in self.VC_TTS_voice_type: + self.VC_TTS_voice_key = "男" + EventMesh.publish("set_storage_ai_config",["VC_TTS_voice_key",self.VC_TTS_voice_key]) + # EventMesh.publish("audio_montage_play",["peizhichenggong.mp3"]) + #self.aud.play(1,0,'U:/static/peizhichenggong.mp3')#切换成功 + self.AI_TTS_str = "更改成功" + return 0 + if text.find("女") != -1 : + if "女" in self.VC_TTS_voice_type: + self.VC_TTS_voice_key = "女" + EventMesh.publish("set_storage_ai_config",["VC_TTS_voice_key",self.VC_TTS_voice_key]) + # EventMesh.publish("audio_montage_play",["peizhichenggong.mp3"]) + #self.aud.play(1,0,'U:/static/peizhichenggong.mp3')#切换成功 + self.AI_TTS_str = "更改成功" + return 0 + if text.find("同声") != -1 or text.find("ç«¥") != -1 : + if "ç«¥" in self.VC_TTS_voice_type: + self.VC_TTS_voice_key = "ç«¥" + EventMesh.publish("set_storage_ai_config",["VC_TTS_voice_key",self.VC_TTS_voice_key]) + # EventMesh.publish("audio_montage_play",["peizhichenggong.mp3"]) + #self.aud.play(1,0,'U:/static/peizhichenggong.mp3')#切换成功 + self.AI_TTS_str = "更改成功" + return 0 + if text.find("粤") != -1 or text.find("越野") != -1 or text.find("广东话") != -1: + if "粤" in self.VC_TTS_voice_type: + self.VC_TTS_voice_key = "粤" + EventMesh.publish("set_storage_ai_config",["VC_TTS_voice_key",self.VC_TTS_voice_key]) + # EventMesh.publish("audio_montage_play",["peizhichenggong.mp3"]) + #self.aud.play(1,0,'U:/static/peizhichenggong.mp3')#切换成功 + self.AI_TTS_str = "更改成功" + return 0 + if text.find("四川") != -1 : + if "四川" in self.VC_TTS_voice_type: + self.VC_TTS_voice_key = "四川" + EventMesh.publish("set_storage_ai_config",["VC_TTS_voice_key",self.VC_TTS_voice_key]) + # EventMesh.publish("audio_montage_play",["peizhichenggong.mp3"]) + #self.aud.play(1,0,'U:/static/peizhichenggong.mp3')#切换成功 + self.AI_TTS_str = "更改成功" + return 0 + if text.find("个性") != -1 : + if "个性" in self.VC_TTS_voice_type: + self.VC_TTS_voice_key = "个性" + EventMesh.publish("set_storage_ai_config",["VC_TTS_voice_key",self.VC_TTS_voice_key]) + # EventMesh.publish("audio_montage_play",["peizhichenggong.mp3"]) + #self.aud.play(1,0,'U:/static/peizhichenggong.mp3')#切换成功 + self.AI_TTS_str = "更改成功" + return 0 + if text.find("英语") != -1 : + if "英语" in self.VC_TTS_voice_type: + self.VC_TTS_voice_key = "英语" + EventMesh.publish("set_storage_ai_config",["VC_TTS_voice_key",self.VC_TTS_voice_key]) + # EventMesh.publish("audio_montage_play",["peizhichenggong.mp3"]) + #self.aud.play(1,0,'U:/static/peizhichenggong.mp3')#切换成功 + self.AI_TTS_str = "更改成功" + return 0 + self.AI_TTS_str = "更改失败,没找到对应声音" + return 0 + if text.find("切换对话模式") != -1: + if self.VC_mode == 0: + self.VC_mode = 1 + self.AI_TTS_str = "已切换到单对话模式" + else: + self.VC_mode = 0 + self.AI_TTS_str = "已切换到长对话模式" + EventMesh.publish("set_storage_ai_config",["VC_mode",self.VC_mode]) + # EventMesh.publish("audio_montage_play",["peizhichenggong.mp3"]) + #self.aud.play(1,0,'U:/static/peizhichenggong.mp3')#切换成功 + + return 0 + if text.find("音量") != -1: + if text.find("加") != -1 : + self.VC_TTS_volume += 10 + if self.VC_TTS_volume > 100: + #EventMesh.publish("audio_montage_play",["yinliangyizuida.mp3"]) + #self.aud.play(1,0,'U:/static/yinliangyizuida.mp3')#音量已最大 + self.AI_TTS_str = "音量已最大" + self.VC_TTS_volume = 100 + else: + self.aud.setVolume(self.VC_TTS_volume //10) + EventMesh.publish("set_storage_ai_config",["VC_TTS_volume",self.VC_TTS_volume]) + #EventMesh.publish("audio_montage_play",["peizhichenggong.mp3"]) + #self.aud.play(1,0,'U:/static/peizhichenggong.mp3')#配置成功 + self.AI_TTS_str = "配置成功,当前音量 {}".format(self.VC_TTS_volume) + + return 0 + if text.find("减") != -1: + self.VC_TTS_volume -= 10 + if self.VC_TTS_volume < 0: + self.VC_TTS_volume = 0 + #EventMesh.publish("audio_montage_play",["yinliangyizuixiao.mp3"]) + #self.aud.play(1,0,'U:/static/yinliangyizuixiao.mp3')#音量已最小 + self.AI_TTS_str = "音量已最小" + else: + self.aud.setVolume(self.VC_TTS_volume //10) + EventMesh.publish("set_storage_ai_config",["VC_TTS_volume",self.VC_TTS_volume]) + #EventMesh.publish("audio_montage_play",["peizhichenggong.mp3"]) + #self.aud.play(1,0,'U:/static/peizhichenggong.mp3')#配置成功 + self.AI_TTS_str = "配置成功,当前音量 {}".format(self.VC_TTS_volume) + return 0 + + if text.find("进入工厂模式") != -1 : + self.factory_mode() + return 1 + if text.find("查询") != -1: + + if text.find("信号") != -1 : + signal = net.csqQueryPoll() + + self.AI_TTS_str = "当前信号{}".format(signal) + return 0 + if text.find("电量") != -1 : + battery = EventMesh.publish("get_battery") + print("电量查询:{}".format(battery)) + #EventMesh.publish("audio_montage_play",["dianliangshengyu{}.mp3".format(battery)]) + #self.aud.play(1,0,'U:/static/dianliangshengyu{}.mp3'.format(battery))#电量剩余 + self.AI_TTS_str = "电量剩余百分之{}".format(battery) + return 0 + if text.find("电压") != -1 : + Vbatt = Power.getVbatt() + #EventMesh.publish("audio_montage_play",["dianliangshengyu{}.mp3".format(battery)]) + #self.aud.play(1,0,'U:/static/dianliangshengyu{}.mp3'.format(battery))#电量剩余 + self.AI_TTS_str = "当前电池电压{}".format(Vbatt) + return 0 + + if text.find("卡号") != -1 : + iccid = sim.getIccid() + if iccid != -1 and len(iccid) > 5: + print("iccid{}".format(iccid)) + self.AI_TTS_str = "当前卡号为:{}".format(iccid) + else: + self.AI_TTS_str = "卡号查询失败" + return 0 + if text.find("设备号") != -1 : + imei = modem.getDevImei() + if imei != -1 and len(imei) > 5: + print("IMEI:{}".format(imei)) + self.AI_TTS_str = "当前设备号为:{}".format(imei) + else: + self.AI_TTS_str = "设备号查询失败" + return 0 + if text.find("版本") != -1 : + sourceVersion = versions.Build_Time + self.AI_TTS_str ="Mr-Seven-"+sourceVersion + return 0 + if text.find("服务器地址") != -1 : + self.AI_TTS_str ="服务器地址"+self.server_ip + return 0 + if text.find("升级") != -1 and (text.find("OTA") != -1 or text.find("ota") != -1): + if self.ai_OTA.min_sys_ota()==1: + self.AI_TTS_str = "有新版本,准备开始升级,升级过程会多次重启设备,请保证流量充足及电量充足" + else: + self.AI_TTS_str = "当前已是最新版本" + return 0 + + if len(text)<20 and (text.find("再见") != -1 or text.find("拜拜") != -1 or text.find("关闭对话") != -1): + #EventMesh.publish("publish_AI_btnInfo",{"func":self.Close}) + self.AI_TTS_str = "好嘞,再见,我们下次再聊" + self.Close_flag = 1 + return 0 + if len(text)<12 and (text.find("关机") != -1 ): + EventMesh.publish("publish_AI_btnInfo",{"func":self.Close}) + EventMesh.publish("Power_off") + return 1 + except Exception as e: + usys.print_exception(e) + return -1 + def check_text_llm(self,cmd): + + try: + text = cmd["command"]["chinese_description"] + if text.find("切换音色") != -1: + text = cmd["command"]["params_json"] + try: + for key in self.VC_TTS_voice_type: + if text.find(key) != -1 : + self.VC_TTS_voice_key = key + EventMesh.publish("set_storage_ai_config",["VC_TTS_voice_key",self.VC_TTS_voice_key]) + self.AI_TTS_str = "了解,声音已切换" + return 0 + except Exception as e: + usys.print_exception(e) + if text.find("男") != -1 : + if "男" in self.VC_TTS_voice_type: + self.VC_TTS_voice_key = "男" + EventMesh.publish("set_storage_ai_config",["VC_TTS_voice_key",self.VC_TTS_voice_key]) + + self.AI_TTS_str = "了解,声音已切换" + return 0 + if text.find("女") != -1 : + if "女" in self.VC_TTS_voice_type: + self.VC_TTS_voice_key = "女" + EventMesh.publish("set_storage_ai_config",["VC_TTS_voice_key",self.VC_TTS_voice_key]) + + self.AI_TTS_str = "了解,声音已切换" + return 0 + if text.find("同声") != -1 or text.find("ç«¥") != -1 : + if "ç«¥" in self.VC_TTS_voice_type: + self.VC_TTS_voice_key = "ç«¥" + EventMesh.publish("set_storage_ai_config",["VC_TTS_voice_key",self.VC_TTS_voice_key]) + + self.AI_TTS_str = "了解,声音已切换" + return 0 + if text.find("粤") != -1 or text.find("越野") != -1 or text.find("广东话") != -1: + if "粤" in self.VC_TTS_voice_type: + self.VC_TTS_voice_key = "粤" + EventMesh.publish("set_storage_ai_config",["VC_TTS_voice_key",self.VC_TTS_voice_key]) + + self.AI_TTS_str = "了解,声音已切换" + return 0 + if text.find("四川") != -1 : + if "四川" in self.VC_TTS_voice_type: + self.VC_TTS_voice_key = "四川" + EventMesh.publish("set_storage_ai_config",["VC_TTS_voice_key",self.VC_TTS_voice_key]) + + self.AI_TTS_str = "了解,声音已切换" + return 0 + if text.find("个性") != -1 : + if "个性" in self.VC_TTS_voice_type: + self.VC_TTS_voice_key = "个性" + EventMesh.publish("set_storage_ai_config",["VC_TTS_voice_key",self.VC_TTS_voice_key]) + + self.AI_TTS_str = "了解,声音已切换" + return 0 + if text.find("英语") != -1 : + if "英语" in self.VC_TTS_voice_type: + self.VC_TTS_voice_key = "英语" + EventMesh.publish("set_storage_ai_config",["VC_TTS_voice_key",self.VC_TTS_voice_key]) + + self.AI_TTS_str = "了解,声音已切换" + return 0 + self.AI_TTS_str = "很抱歉,没找到对应声音" + return 0 + if text.find("切换对话模式") != -1: + if self.VC_mode == 0: + self.VC_mode = 1 + self.AI_TTS_str = "了解,已切换到单对话模式" + else: + self.VC_mode = 0 + self.AI_TTS_str = "了解,已切换到长对话模式" + EventMesh.publish("set_storage_ai_config",["VC_mode",self.VC_mode]) + + + return 0 + if text.find("音量调整") != -1: + text = cmd["command"]["params_json"] + text = ujson.loads(text) + volume = text["n"] + if volume >100 or volume<0: + self.AI_TTS_str = "音量调整超出范围了,只能0-100哦" + else: + self.VC_TTS_volume = volume + self.aud.setVolume(self.VC_TTS_volume //10) + EventMesh.publish("set_storage_ai_config",["VC_TTS_volume",self.VC_TTS_volume]) + self.AI_TTS_str = "了解,音量已经调整,当前音量是{}".format(self.VC_TTS_volume) + return 0 + if text.find("音量增大") != -1: + self.VC_TTS_volume += 10 + if self.VC_TTS_volume > 100: + + self.AI_TTS_str = "音量已经是最大啦" + self.VC_TTS_volume = 100 + else: + self.aud.setVolume(self.VC_TTS_volume //10) + EventMesh.publish("set_storage_ai_config",["VC_TTS_volume",self.VC_TTS_volume]) + + self.AI_TTS_str = "了解,音量已经调大了,当前音量是{}".format(self.VC_TTS_volume) + + return 0 + if text.find("音量减小") != -1: + self.VC_TTS_volume -= 10 + if self.VC_TTS_volume < 0: + self.VC_TTS_volume = 0 + #EventMesh.publish("audio_montage_play",["yinliangyizuixiao.mp3"]) + #self.aud.play(1,0,'U:/static/yinliangyizuixiao.mp3')#音量已最小 + self.AI_TTS_str = "音量已经是最小啦" + else: + self.aud.setVolume(self.VC_TTS_volume //10) + EventMesh.publish("set_storage_ai_config",["VC_TTS_volume",self.VC_TTS_volume]) + + self.AI_TTS_str = "好嘞,音量已经调小了,当前音量是{}".format(self.VC_TTS_volume) + return 0 + + if text.find("语速增大") != -1: + self.speech_rate += 10 + if self.speech_rate > 50: + + self.AI_TTS_str = "语速已经是最快啦" + self.speech_rate = 50 + else: + + EventMesh.publish("set_storage_ai_config",["speech_rate",self.speech_rate]) + + self.AI_TTS_str = "明白,语速已经调快了,当前语速是{}".format(self.speech_rate) + + return 0 + if text.find("语速减小") != -1: + self.speech_rate -= 10 + if self.speech_rate < -50: + self.speech_rate = -50 + #EventMesh.publish("audio_montage_play",["yinliangyizuixiao.mp3"]) + #self.aud.play(1,0,'U:/static/yinliangyizuixiao.mp3')#音量已最小 + self.AI_TTS_str = "语速已经是最慢啦" + else: + EventMesh.publish("set_storage_ai_config",["speech_rate",self.speech_rate]) + + self.AI_TTS_str = "明白,语速已经调慢了,当前语速是{}".format(self.speech_rate) + return 0 + + if text.find("进入工厂模式") != -1 : + self.factory_mode() + return 1 + if text.find("查询") != -1: + if text.find("信号") != -1 : + signal = net.csqQueryPoll() + + self.AI_TTS_str = "当前信号{}".format(signal) + return 0 + if text.find("电量") != -1 : + battery = EventMesh.publish("get_battery") + print("电量查询:{}".format(battery)) + #EventMesh.publish("audio_montage_play",["dianliangshengyu{}.mp3".format(battery)]) + #self.aud.play(1,0,'U:/static/dianliangshengyu{}.mp3'.format(battery))#电量剩余 + self.AI_TTS_str = "电量剩余百分之{}".format(battery) + return 0 + if text.find("电压") != -1 : + Vbatt = Power.getVbatt() + #EventMesh.publish("audio_montage_play",["dianliangshengyu{}.mp3".format(battery)]) + #self.aud.play(1,0,'U:/static/dianliangshengyu{}.mp3'.format(battery))#电量剩余 + self.AI_TTS_str = "当前电池电压{}".format(Vbatt) + return 0 + + if text.find("卡号") != -1 : + iccid = sim.getIccid() + if iccid != -1 and len(iccid) > 5: + print("iccid{}".format(iccid)) + self.AI_TTS_str = "当前卡号为:{}".format(iccid) + else: + self.AI_TTS_str = "卡号查询失败" + return 0 + if text.find("设备号") != -1 : + imei = modem.getDevImei() + if imei != -1 and len(imei) > 5: + print("IMEI:{}".format(imei)) + self.AI_TTS_str = "当前设备号为:{}".format(imei) + else: + self.AI_TTS_str = "设备号查询失败" + return 0 + if text.find("版本") != -1 : + sourceVersion = versions.Build_Time + self.AI_TTS_str ="Mr-Seven-"+sourceVersion + return 0 + if text.find("服务器地址") != -1 : + self.AI_TTS_str ="服务器地址"+self.server_ip + return 0 + if text.find("升级") != -1 and (text.find("OTA") != -1 or text.find("ota") != -1): + if self.ai_OTA.min_sys_ota()==1: + self.AI_TTS_str = "有新版本,准备开始升级,升级过程会多次重启设备,请保证流量充足及电量充足" + else: + self.AI_TTS_str = "当前已是最新版本" + return 0 + + if len(text)<20 and (text.find("再见") != -1 or text.find("拜拜") != -1 or text.find("关闭对话") != -1): + #EventMesh.publish("publish_AI_btnInfo",{"func":self.Close}) + self.AI_TTS_str = "好嘞,再见,我们下次再聊" + self.Close_flag = 1 + return 0 + if len(text)<12 and (text.find("关机") != -1 ): + EventMesh.publish("publish_AI_btnInfo",{"func":self.Close}) + EventMesh.publish("Power_off") + return 1 + #AI智慧手表功能 + if text.find("测量") != -1 : + self.usb_state = EventMesh.publish("get_usb_state") + print("usb_state=",self.usb_state) + if self.usb_state == 0: + if text.find("血氧") != -1 : + print("血氧") + self.AI_TTS_str = "开始血氧测量,请稍等" + EventMesh.publish("set_manual_measure_mode",2)#测量血氧 + self.Close_flag = 1 + return 0 + if text.find("心率") != -1 : + print("心率") + self.AI_TTS_str = "开始心率测量,请稍等" + EventMesh.publish("set_manual_measure_mode",1)#测量心率 + self.Close_flag = 1 + return 0 + if text.find("体温") != -1 : + print("体温") + self.AI_TTS_str = "开始体温测量,请稍等" + EventMesh.publish("set_manual_measure_mode",3)#测量体温 + self.Close_flag = 1 + return 0 + else : + if self.usb_state == 1: + self.AI_TTS_str = "测量失败,请不要充电时测量噢" + return 0 + + #给某人打电话 + if text.find("拨打") != -1 : + # 做中间字符串截取 + text = cmd["command"]["params_json"] + text = ujson.loads(text) + print(text) + result = text["p"] + EventMesh.publish("call_phonebook_name",result) + return 0 + #设置闹钟 {"command":{"chinese_description":"","english_description":"Set Alarm","fail_prompt":"","params_json":"{\"hour_value\": 16, \"min_value\": 36, \"day_value16, \"min_value\": 36, \"day_value\": [1], \"loop_value\": 0, \"event_notice\": \"\"}","succeed_prompt":""}} + if text.find("普通闹钟") != -1 : + # 做中间字符串截取 + # 返回帧名字叫cmd + normal_alarm_save = []#普通闹钟 + print("闹钟") + text = cmd["command"]["params_json"] + text = ujson.loads(text) + print(text) + normal_alarm_save.append({"hour":text["hour_value"],"min":text["min_value"],"day":text["day_value"],"enable":1}) + EventMesh.publish("set_storage_config",["normal_alarm",normal_alarm_save]) + self.AI_TTS_str = "闹钟设置成功" + print(self.AI_TTS_str) + + return 0 + if text.find("起床提醒") != -1: + wakeup_data_save = []#起床提醒 + text = cmd["command"]["params_json"] + text = ujson.loads(text) + wakeup_data_save.append({"hour":text["hour_value"],"min":text["min_value"],"day":text["day_value"],"enable":1}) + EventMesh.publish("clear_wakeup_alarm") + EventMesh.publish("set_storage_config",["wakeup_alarm",wakeup_data_save]) + EventMesh.publish(constants.PROTOCOL.REMIND_CH_WAKEUP_SEND) + self.AI_TTS_str = "起床提醒设置成功" + print(self.AI_TTS_str) + return 0 + # if event_notice == "休息提醒": + # reset_data_save.append({"hour":text["hour_value"],"min":text["min_value"],"day":text["day_value"],"enable":1}) + # EventMesh.publish("set_storage_config",["reset_alarm",reset_data_save]) + # EventMesh.publish(constants.PROTOCOL.REMIND_CH_REST_SEND) + # EventMesh.publish("clear_reset_alarm") + # self.AI_TTS_str = "休息提醒设置成功" + + if text.find("回家提醒") != -1: + reset_data_save = []#休息提醒 + text = cmd["command"]["params_json"] + text = ujson.loads(text) + home_data = str(text["hour_value"]) + ':' + str(text["min_value"]) + EventMesh.publish("clear_home_alarm") + EventMesh.publish("set_storage_config",["home_alarm",home_data]) + EventMesh.publish(constants.PROTOCOL.REMIND_CH_HOME_SEND) + self.AI_TTS_str = "回家提醒设置成功" + print(self.AI_TTS_str) + return 0 + if text.find("睡觉提醒") != -1: + sleep_data_save = []#睡觉提醒 + text = cmd["command"]["params_json"] + text = ujson.loads(text) + sleep_data_save.append({"hour":text["hour_value"],"min":text["min_value"],"day":text["day_value"],"enable":1}) + EventMesh.publish("clear_sleep_alarm") + EventMesh.publish("set_storage_config",["sleep_alarm",sleep_data_save]) + EventMesh.publish(constants.PROTOCOL.REMIND_CH_SLEEP_SEND) + self.AI_TTS_str = "睡觉提醒设置成功" + print(self.AI_TTS_str) + return 0 + # if text.find("休息提醒") != -1: + # text = cmd["command"]["params_json"] + # text = ujson.loads(text) + # reset_data_save.append({"hour":text["hour_value"],"min":text["min_value"],"day":text["day_value"],"enable":1}) + # EventMesh.publish("clear_reset_alarm") + # EventMesh.publish("set_storage_config",["reset_alarm",reset_data_save]) + # EventMesh.publish(constants.PROTOCOL.REMIND_CH_REST_SEND) + # self.AI_TTS_str = "休息提醒设置成功" + # print(self.AI_TTS_str) + # return 0 + if text.find("吃药提醒") != -1: + text = cmd["command"]["params_json"] + text = ujson.loads(text) + medicin_data = []#吃药提醒 + medicin_data.append({"hour":text["hour_value"],"min":text["min_value"],"day":text["day_value"],"enable":1}) + EventMesh.publish("clear_medicine_alarm") + EventMesh.publish("set_storage_config",["medicine",medicin_data]) + EventMesh.publish(constants.PROTOCOL.REMIND_CH_MEDICINE2_SEND) + self.AI_TTS_str = "吃药提醒设置成功" + print(self.AI_TTS_str) + return 0 + if text.find("会议提醒") != -1 : + text = cmd["command"]["params_json"] + text = ujson.loads(text) + meet_data = []#会议提醒 + meet_data = str(text["hour_value"]) + ':' + str(text["min_value"]) + EventMesh.publish("clear_meet_alarm") + EventMesh.publish("set_storage_config",["meet_alarm",meet_data]) + EventMesh.publish(constants.PROTOCOL.REMIND_CH_MEET_SEND) + self.AI_TTS_str = "会议提醒设置成功" + print(self.AI_TTS_str) + return 0 + if text.find("单次喝水提醒") != -1 : + water_data = []#单次喝水提醒 + text = cmd["command"]["params_json"] + text = ujson.loads(text) + water_data = str(text["hour_value"]) + ':' + str(text["min_value"]) + EventMesh.publish("clear_water_alarm") + EventMesh.publish("set_storage_config",["water_alarm",water_data]) + EventMesh.publish(constants.PROTOCOL.REMIND_CH_WATER_SEND) + self.AI_TTS_str = "单次喝水提醒设置成功" + print(self.AI_TTS_str) + return 0 + if text.find("循环喝水提醒") != -1 : + text = cmd["command"]["params_json"] + text = ujson.loads(text) + hour = text["hour_value"] + EventMesh.publish("set_storage_config",["drink_on",1]) + EventMesh.publish("set_storage_config",["drink_time",hour]) + EventMesh.publish(constants.PROTOCOL.REMIND_CH_DRINK_SEND) + self.AI_TTS_str = "循环喝水提醒设置成功" + print(self.AI_TTS_str) + return 0 + if text.find("关闭所有闹钟") != -1 : + EventMesh.publish("set_storage_config",["drink_time",[]]) + EventMesh.publish("set_storage_config",["water_alarm",[]]) + EventMesh.publish("set_storage_config",["meet_alarm",[]]) + EventMesh.publish("set_storage_config",["medicine",[]]) + EventMesh.publish("set_storage_config",["home_alarm",[]]) + EventMesh.publish("set_storage_config",["sleep_alarm",[]]) + EventMesh.publish("set_storage_config",["wakeup_alarm",[]]) + EventMesh.publish("set_storage_config",["normal_alarm",[]]) + EventMesh.publish("clear_water_alarm") + EventMesh.publish("clear_meet_alarm") + EventMesh.publish("clear_medicine_alarm") + EventMesh.publish("clear_sleep_alarm") + EventMesh.publish("clear_home_alarm") + EventMesh.publish("clear_wakeup_alarm") + self.AI_TTS_str = "已关闭所有闹钟" + return 0 + except Exception as e: + usys.print_exception(e) + self.AI_TTS_str = cmd["command"]["fail_prompt"] + return -1 + def check_text(self,text): + if len(text)>60: + return -1 + try: + if isinstance(text, str): + if text.find("声音") != -1 and text.find("改") != -1: + try: + for key in self.VC_TTS_voice_type: + if text.find(key) != -1 : + self.VC_TTS_voice_key = key + EventMesh.publish("set_storage_ai_config",["VC_TTS_voice_key",self.VC_TTS_voice_key]) + self.AI_TTS_str = "更改成功" + return 0 + except Exception as e: + usys.print_exception(e) + if text.find("男") != -1 : + if "男" in self.VC_TTS_voice_type: + self.VC_TTS_voice_key = "男" + EventMesh.publish("set_storage_ai_config",["VC_TTS_voice_key",self.VC_TTS_voice_key]) + # EventMesh.publish("audio_montage_play",["peizhichenggong.mp3"]) + #self.aud.play(1,0,'U:/static/peizhichenggong.mp3')#切换成功 + self.AI_TTS_str = "更改成功" + return 0 + if text.find("女") != -1 : + if "女" in self.VC_TTS_voice_type: + self.VC_TTS_voice_key = "女" + EventMesh.publish("set_storage_ai_config",["VC_TTS_voice_key",self.VC_TTS_voice_key]) + # EventMesh.publish("audio_montage_play",["peizhichenggong.mp3"]) + #self.aud.play(1,0,'U:/static/peizhichenggong.mp3')#切换成功 + self.AI_TTS_str = "更改成功" + return 0 + if text.find("同声") != -1 or text.find("ç«¥") != -1 : + if "ç«¥" in self.VC_TTS_voice_type: + self.VC_TTS_voice_key = "ç«¥" + EventMesh.publish("set_storage_ai_config",["VC_TTS_voice_key",self.VC_TTS_voice_key]) + # EventMesh.publish("audio_montage_play",["peizhichenggong.mp3"]) + #self.aud.play(1,0,'U:/static/peizhichenggong.mp3')#切换成功 + self.AI_TTS_str = "更改成功" + return 0 + if text.find("粤") != -1 or text.find("越野") != -1 or text.find("广东话") != -1: + if "粤" in self.VC_TTS_voice_type: + self.VC_TTS_voice_key = "粤" + EventMesh.publish("set_storage_ai_config",["VC_TTS_voice_key",self.VC_TTS_voice_key]) + # EventMesh.publish("audio_montage_play",["peizhichenggong.mp3"]) + #self.aud.play(1,0,'U:/static/peizhichenggong.mp3')#切换成功 + self.AI_TTS_str = "更改成功" + return 0 + if text.find("四川") != -1 : + if "四川" in self.VC_TTS_voice_type: + self.VC_TTS_voice_key = "四川" + EventMesh.publish("set_storage_ai_config",["VC_TTS_voice_key",self.VC_TTS_voice_key]) + # EventMesh.publish("audio_montage_play",["peizhichenggong.mp3"]) + #self.aud.play(1,0,'U:/static/peizhichenggong.mp3')#切换成功 + self.AI_TTS_str = "更改成功" + return 0 + if text.find("个性") != -1 : + if "个性" in self.VC_TTS_voice_type: + self.VC_TTS_voice_key = "个性" + EventMesh.publish("set_storage_ai_config",["VC_TTS_voice_key",self.VC_TTS_voice_key]) + # EventMesh.publish("audio_montage_play",["peizhichenggong.mp3"]) + #self.aud.play(1,0,'U:/static/peizhichenggong.mp3')#切换成功 + self.AI_TTS_str = "更改成功" + return 0 + if text.find("英语") != -1 : + if "英语" in self.VC_TTS_voice_type: + self.VC_TTS_voice_key = "英语" + EventMesh.publish("set_storage_ai_config",["VC_TTS_voice_key",self.VC_TTS_voice_key]) + # EventMesh.publish("audio_montage_play",["peizhichenggong.mp3"]) + #self.aud.play(1,0,'U:/static/peizhichenggong.mp3')#切换成功 + self.AI_TTS_str = "更改成功" + return 0 + self.AI_TTS_str = "更改失败,没找到对应声音" + return 0 + if text.find("切换对话模式") != -1: + if self.VC_mode == 0: + self.VC_mode = 1 + self.AI_TTS_str = "已切换到单对话模式" + else: + self.VC_mode = 0 + self.AI_TTS_str = "已切换到长对话模式" + EventMesh.publish("set_storage_ai_config",["VC_mode",self.VC_mode]) + # EventMesh.publish("audio_montage_play",["peizhichenggong.mp3"]) + #self.aud.play(1,0,'U:/static/peizhichenggong.mp3')#切换成功 + + return 0 + if text.find("音量") != -1: + if text.find("加") != -1 : + self.VC_TTS_volume += 10 + if self.VC_TTS_volume > 100: + #EventMesh.publish("audio_montage_play",["yinliangyizuida.mp3"]) + #self.aud.play(1,0,'U:/static/yinliangyizuida.mp3')#音量已最大 + self.AI_TTS_str = "音量已最大" + self.VC_TTS_volume = 100 + else: + self.aud.setVolume(self.VC_TTS_volume //10) + EventMesh.publish("set_storage_ai_config",["VC_TTS_volume",self.VC_TTS_volume]) + #EventMesh.publish("audio_montage_play",["peizhichenggong.mp3"]) + #self.aud.play(1,0,'U:/static/peizhichenggong.mp3')#配置成功 + self.AI_TTS_str = "配置成功,当前音量 {}".format(self.VC_TTS_volume) + + return 0 + if text.find("减") != -1: + self.VC_TTS_volume -= 10 + if self.VC_TTS_volume < 0: + self.VC_TTS_volume = 0 + #EventMesh.publish("audio_montage_play",["yinliangyizuixiao.mp3"]) + #self.aud.play(1,0,'U:/static/yinliangyizuixiao.mp3')#音量已最小 + self.AI_TTS_str = "音量已最小" + else: + self.aud.setVolume(self.VC_TTS_volume //10) + EventMesh.publish("set_storage_ai_config",["VC_TTS_volume",self.VC_TTS_volume]) + #EventMesh.publish("audio_montage_play",["peizhichenggong.mp3"]) + #self.aud.play(1,0,'U:/static/peizhichenggong.mp3')#配置成功 + self.AI_TTS_str = "配置成功,当前音量 {}".format(self.VC_TTS_volume) + return 0 + + if text.find("进入工厂模式") != -1 : + self.factory_mode() + return 1 + if text.find("查询") != -1: + + if text.find("信号") != -1 : + signal = net.csqQueryPoll() + + self.AI_TTS_str = "当前信号{}".format(signal) + return 0 + if text.find("电量") != -1 : + battery = EventMesh.publish("get_battery") + print("电量查询:{}".format(battery)) + #EventMesh.publish("audio_montage_play",["dianliangshengyu{}.mp3".format(battery)]) + #self.aud.play(1,0,'U:/static/dianliangshengyu{}.mp3'.format(battery))#电量剩余 + self.AI_TTS_str = "电量剩余百分之{}".format(battery) + return 0 + if text.find("电压") != -1 : + Vbatt = Power.getVbatt() + #EventMesh.publish("audio_montage_play",["dianliangshengyu{}.mp3".format(battery)]) + #self.aud.play(1,0,'U:/static/dianliangshengyu{}.mp3'.format(battery))#电量剩余 + self.AI_TTS_str = "当前电池电压{}".format(Vbatt) + return 0 + + if text.find("卡号") != -1 : + iccid = sim.getIccid() + if iccid != -1 and len(iccid) > 5: + print("iccid{}".format(iccid)) + self.AI_TTS_str = "当前卡号为:{}".format(iccid) + else: + self.AI_TTS_str = "卡号查询失败" + return 0 + if text.find("设备号") != -1 : + imei = modem.getDevImei() + if imei != -1 and len(imei) > 5: + print("IMEI:{}".format(imei)) + self.AI_TTS_str = "当前设备号为:{}".format(imei) + else: + self.AI_TTS_str = "设备号查询失败" + return 0 + if text.find("版本") != -1 : + sourceVersion = versions.Build_Time + self.AI_TTS_str ="Mr-Seven-"+sourceVersion + return 0 + if text.find("服务器地址") != -1 : + self.AI_TTS_str ="服务器地址"+self.server_ip + return 0 + if text.find("步数") != -1: + EventMesh.publish("play_cur_step_event")#播放当前步数 + return 0 + if text.find("升级") != -1 and (text.find("OTA") != -1 or text.find("ota") != -1): + if self.ai_OTA.min_sys_ota()==1: + self.AI_TTS_str = "有新版本,准备开始升级,升级过程会多次重启设备,请保证流量充足及电量充足" + else: + self.AI_TTS_str = "当前已是最新版本" + return 0 + if len(text)<16 and (text.find("再见") != -1 or text.find("拜拜") != -1 or text.find("关闭对话") != -1): + #EventMesh.publish("publish_AI_btnInfo",{"func":self.Close}) + if dev_type != "7PIN":#柒牌 + self.AI_TTS_str = "好嘞,再见,我们下次再聊" + self.Close_flag = 1 + return 0 + else: + EventMesh.publish("publish_AI_btnInfo",{"func":self.Close}) + return 1 + if len(text)<12 and (text.find("关机") != -1 ): + if dev_type == "7PIN":#柒牌 + EventMesh.publish("publish_AI_btnInfo",{"func":self.Close}) + return 1 + EventMesh.publish("publish_AI_btnInfo",{"func":self.Close}) + EventMesh.publish("Power_off") + return 1 + #AI智慧手表功能 + if text.find("测量") != -1 : + + if text.find("血氧") != -1 : + print("血氧") + EventMesh.publish("set_manual_measure_mode",2)#测量血氧 + self.AI_TTS_str = "开始血氧测量,请稍等" + self.Close_flag = 1 + return 0 + if text.find("心率") != -1 : + print("心率") + EventMesh.publish("set_manual_measure_mode",1)#测量心率 + self.AI_TTS_str = "开始心率测量,请稍等" + self.Close_flag = 1 + return 0 + if text.find("体温") != -1 : + print("体温") + EventMesh.publish("set_manual_measure_mode",3)#测量体温 + self.AI_TTS_str = "开始体温测量,请稍等" + self.Close_flag = 1 + return 0 + #给某人打电话 + if text.find("拨打") != -1 : + # 做中间字符串截取 + print("拨打") + start_index = text.find("拨打") + start_index += len("拨打") + end_index = text.find("的电话",start_index) + if end_index != -1: + result = text[start_index:end_index] + print("拨打的名字为:{}".format(result)) + EventMesh.publish("call_phonebook_name",result) + + # #设置闹钟 + # if text.find("设置") != -1 : + # # 做中间字符串截取 + # print("闹钟") + # normal_alarm_save = '' + # alarm_day = [] + + # if text.find("小时后的闹钟") != -1 : + # start_index = text.find("设置") + # start_index += len("设置") + # end_index = text.find("小时后",start_index) + # if end_index != -1: + # #计算闹钟设置后的时间 + # time = text[start_index:end_index] + # data = RTC().datetime() + # hour = data[4] + # hour += self.chinese_num_to_arabic(time) + + # alarm_time = alarm_data.split('-')[0]#-作为分隔符 + # alarm_switch = int(1)#开关 + # alarm_repeat = int(0)#是单次还是每天 还是自定义 + + # alarm_hour = int(hour)#时间 + # alarm_min = int(alarm_time.split(":")[1])#冒号分隔时间 时 分 + + + # if alarm_repeat == 2:#每一天 + # alarm_day = [0,1,2,3,4,5,6] + # elif alarm_repeat == 3:#自定义 + # alarm_day_tmp = alarm_data.split('-')[3]#-作为分隔符 + # if len(str(alarm_day_tmp)) != 0: + # for i in range(0,7): + # if alarm_day_tmp[i] != '0': + # alarm_day.append(i) + # else:#单次 1 + # alarm_day=[] + # if alarm_switch != 0: + # normal_alarm_save.append({"hour":alarm_hour,"min":alarm_min,"day":alarm_day,"enable":alarm_switch}) + + # else : + # if text.find("分钟后的闹钟") != -1 : + # start_index = text.find("设置") + # start_index += len("设置") + # end_index = text.find("分钟后",start_index) + # time = text[start_index:end_index] + # data = RTC().datetime() + # min = data[5] + # new_min = self.chinese_num_to_arabic(time) + # hour += new_min / 60 + # min += new_min % 60 + + # if normal_alarm_save != '': + # EventMesh.publish("set_storage_config",["normal_alarm",normal_alarm_save]) + + except Exception as e: + usys.print_exception(e) + return -1 + + #获取trace_id + def get_trace_id(self): + t = utime.mktime(utime.localtime()) + t = t*1000+urandom.randint(0, 1000) + md5_data = "{}".format(t)#md5签名 + sign_data = "" + hash_obj = uhashlib.md5(md5_data) + res = hash_obj.digest() + + # 转成十六进制表示 + sign_data = ubinascii.hexlify(res) + sign_data = sign_data.decode('ascii') + return sign_data + + def get_session_id(self,data = "session_id"): + t = utime.mktime(utime.localtime()) + t = t*1000+urandom.randint(0, 1000) + md5_data = "{}{}".format(data,t)#md5签名 + sign_data = "" + hash_obj = uhashlib.md5(md5_data) + res = hash_obj.digest() + + # 转成十六进制表示 + sign_data = ubinascii.hexlify(res) + sign_data = sign_data.decode('ascii') + return sign_data + + def get_new_message_id(self): + message_id = self.get_trace_id()+"aaa"+self.get_trace_id() + self.VC_message_id=message_id[:32] + return self.VC_message_id + def get_new_task_id(self): + task_id = self.get_trace_id()+"aaa"+self.get_trace_id() + self.VC_task_id=task_id[:32] + return self.VC_task_id + #开始播放声音 + def VC_Play_Start(self): + self.tts_in_data_len = 0 + self.tts_out_data_len = 0 + if self.VC_Play_flag == 0: + try: + if self.VC_play_TYPE == VC_play_TYPE_PCM: + if self.play_pcm == None: + self.play_pcm = audio.Audio.PCM(0,1,self.VC_play_samplerate,1,1,2) + #self.play_pcm.setVolume(11) + ret = self.play_pcm.stream_write_start() + print("self.record_pcm.stream_write_start:ret:{}".format(ret)) + elif self.VC_play_TYPE == VC_play_TYPE_MP3: + pass + self.VC_Play_flag = 1 + except Exception as e: + self.VC_Play_End() + usys.print_exception(e) + #暂停/继续声音播放 Pause_flag = 1暂停 + def VC_Play_Pause(self,Pause_flag): + try: + if self.VC_play_TYPE == VC_play_TYPE_PCM: + if self.play_pcm != None: + self.play_pcm.stream_pause(Pause_flag) + except Exception as e: + self.VC_Play_End() + usys.print_exception(e) + #停止播放声音 + def VC_Play_End(self): + self.VC_Play_flag = 0 + if self.VC_play_TYPE == VC_play_TYPE_PCM: + if self.VC_play_samplerate == 8000: + self.aud.stopPlayStream() + self.aud.stopAll() + elif self.VC_play_samplerate == 16000: + if self.play_pcm != None: + print("Close:play_pcm.close()!!!!!!!!!!!!!!!!!!") + try: + self.play_pcm.stream_stop() + self.play_pcm.close() + except Exception as e: + usys.print_exception(e) + self.play_pcm=None + self.aud.stopPlayStream() + self.aud.stopAll() + elif self.VC_play_TYPE == VC_play_TYPE_MP3: + self.aud.stopPlayStream() + self.aud.stopAll() + if self.AI_audio_queue.empty()!=True: + self.AI_audio_queue.clear() + + + def _1S_timer_cb(self,*argc): + EventMesh.publish("publish_AI_btnInfo",{"func":self._1S_timer_cb_}) + + def _1S_timer_cb_(self): + + EventMesh.publish("system_sleep_rest")#防止黑屏 + self.close_timerout += 1 + if self.VC_state < VC_State_Thinking: + close_led_green() + close_led_red() + EventMesh.publish("close_all_led") + open_led_white() + else : + if self.VC_state == VC_State_Thinking: + white_green_open() + else: + if self.VC_state >= VC_State_Responding: + white_green_close() + open_led_green() + else: + if self.VC_state == VC_State_End: + close_all_ledm() + if self.close_timerout > 60:#20秒没数据就close + + if self.VC_state >= VC_State_SpeechIng: + print("接口无响应,超时退出") + EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_error,"data":"接口超时了。请重试"}) + self.ud_error(["VC",self.VC_taskid]) + else: + EventMesh.publish("publish_AI_btnInfo",{"func":self.Close}) + # print("get_audio_state !!!!!{} {} {}\r\n".format(self.play_end,EventMesh.publish("get_audio_state"),self.play_flag)) + if self.LocalRespondingEnded_timerout>0 :# + self.LocalRespondingEnded_timerout -= 1 + print("LocalRespondingEnded_timerout:{}".format(self.LocalRespondingEnded_timerout)) + if self.LocalRespondingEnded_timerout <= 0 or (self.play_pcm != None and self.play_pcm.stream_is_empty() == 1) :#超时或者音频播放完, + self.LocalRespondingEnded_timerout = 0 + if self.VC_mode == 1 :#长按单次问答模式 + EventMesh.publish("publish_AI_btnInfo",{"func":self.Close}) + else: + EventMesh.publish("open_led_blue") + if self.Close_flag == 1: + self.Close_flag = 0 + EventMesh.publish("publish_AI_btnInfo",{"func":self.Close}) + else: + #utime.sleep_ms(1000) + EventMesh.publish("publish_AI_btnInfo",{"func":self.VC_Play_End}) + #EventMesh.publish("publish_AI_btnInfo",{"func":self.chenggong_tone}) + EventMesh.publish("publish_AI_btnInfo",{"func":self.VC_Speech_Start_now})#开始录音 + self.VC_state = VC_State_None + #通知服务器播放结束 + #self.AI_client_VC_LocalRespondingEnded() + + self.VC_pingping_timerout+=1 + if self.VC_pingping_timerout>3: + self.VC_pingping_timerout=0 + self.AI_client_VC_ping() + # self.asr_pingping_timerout += 1 + # if self.asr_pingping_timerout>3: + # self.asr_pingping_timerout=0 + # self.AI_client_asr_ping() + if self.VC_Thinking_timerout > 0 and self.VC_Thinking_timerout < 100:#VC Thinking超时后重新开始 + print("VC_Thinking_timerout:{}!!!!!!!!!!!!!!!!!!!!!".format(self.VC_Thinking_timerout)) + self.VC_Thinking_timerout -=1 + if self.VC_Thinking_timerout == 0: + self.VC_Thinking_timerout = 100 + print("Thinking重试,重试!!!!!!!!!!!!!!!!!!!!!") + self.VC_state = VC_State_None + EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_VC_start}) + pass + + #VC开始 + def AI_VC_start(self): + print("AI_VC_start1") + self.VC_satrt_flag = 1 + if self.VC_Thinking_timerout < 100: + self.VC_Thinking_timerout = 0 + EventMesh.publish("open_led_all") + open_all_ledm() + self.VC_Play_End()#关闭音频播放 + print("AI_VC_start2") + #self.aud.aud_tone_play(16,200)#播放按键音 + self.LocalRespondingEnded_timerout = 0 + self.close_timerout = 0 + + + # + if self.AI_client_VC_isconnect == 0:#没连接的时候请求开始 + self.websocket_connect_VC()#连接服务器 + + #utime.sleep_ms(50) + else: + print("self.VC_state :{}".format(self.VC_state )) + + if self.AI_client_VC_isconnect == 0: + return + self.AI_client_VC_start_requset() + print("AI_VC_start3") + + self.VC_state = VC_State_None + if self.AI_TTS_str == "":#没有tts要播放的时候才开始录音 + #开始asr录音 + self.VC_Speech_Start()#开启线程获取录音数据 + + + # pass + print("AI_VC_start4") + #self.VC_Play_Start() + #EventMesh.publish("publish_AI_btnInfo",{"func":self.VC_Play_Start}) + #开始线程 + + # if self.AI_VC_send_data_queue_thread_id == 0: + # _thread.stack_size(self.Audio_buf_size+8*1024) + # self.AI_VC_send_data_queue_thread_id = _thread.start_new_thread(self.AI_VC_send_data_queue_thread, ()) + # _thread.stack_size(8*1024) + # print("AI_VC_start :AI_VC_send_data_queue_thread_id :{} ".format(self.AI_VC_send_data_queue_thread_id)) + + if self.AI_audio_queue_thread_id ==0: + _thread.stack_size(24*1024) + self.AI_audio_queue_thread_id = _thread.start_new_thread(self.AI_audio_queue_thread, ()) + _thread.stack_size(8*1024) + print("AI_VC_start :AI_audio_queue_thread_id :{} ".format(self.AI_audio_queue_thread_id)) + else: + print("AI_VC_start :AI_audio_queue_thread_id != 0 ") + self._1S_timer.start(1000,1,self._1S_timer_cb) + # self.VC_pingping_timerout = 0 + # self.asr_pingping_timerout = 0 + print("AI_VC_start5") + #开始会话 + def AI_client_VC_start_requset(self): + voice="zh_male_wennuanahu_moon_bigtts" + try: + voice = self.VC_TTS_voice_type[self.VC_TTS_voice_key]["voice"] + except Exception as e: + usys.print_exception(e) + #voice="huoshan::zh_female_dongmanxiaoyang_moon_bigtts" + + json_data = \ + { + "header": { + "event": "Start", + "trace_id": self.get_trace_id(), + }, + "payload": { + "device_id": modem.getDevImei(), + "user_agent": "AudioClient/1.0", + "dialog_attributes": { + #"provider": "doubao", + "provider": "coze", + + "cfg": { + "disable_empty_prompt" : True,#拦截空字符请求大模型 + "custom_variables": { + "name": self.bot_name, + }, + # "greeting":{ + # "enabled":True, + # "content":"我来啦!" + # }, + "bot_option": { + "use_workflow": True, + # "bot_id":"7462617881076351002",#语言助手 + # "workflow_id":"7462621757327196187", + "bot_id":"7490815280709812224", + "space_id":"7490774264607113256", + "workflow_id":"7490818049827733514", + + } + } + }, + "outbound_attributes": { + "provider": "volcengine", + "cfg": { + "format": "pcm", + "sample_rate": self.VC_play_samplerate, + "bit_rate": 16, + "channel": 1, + "volume": self.VC_TTS_volume, + #"voice": "7426720361732980745", + "voice": voice,#音色 + "speech_rate": self.speech_rate,#语速 + "chunk_interval_ms": 100, # 配置每段音频入队间隔时间 100ms + } + }, + "inbound_attributes": { + #"provider": "xun-fei",# + "provider": "volcengine", + "disable_vad":True, + "vad_silence":300, + "interrupt_options":{ + "concatenate_results":True, + "thinking_time_only": True, + }, + "cfg": { + "format": "pcm", + "sample_rate": self.VC_record_samplerate, + "bit_rate": 16, + "channel": 1, + "enable_punctuation": True, + "enable_itn":True + } + }, + "commands":self.commands, + } + } + # "bot_id":"7481164663863459850",#鸭子 + # "workflow_id":"7480485093845991443", + # "bot_id":"7462617881076351002",#语言助手 + # "workflow_id":"7462621757327196187", + # "bot_id":"7469964258592931852",#深圳百事通 + # "workflow_id":"7469968083063603241", + # "bot_id":"7411071327182438412",#柒牌 + # "workflow_id":"7469049680291610636", + # if dev_type == "7PIN_BK":#小瑞 + # json_data["payload"]["dialog_attributes"]["cfg"]["bot_option"]["bot_id"]="7481164663863459850"#鸭子 + # json_data["payload"]["dialog_attributes"]["cfg"]["bot_option"]["workflow_id"]="7480485093845991443" + # elif dev_type == "7PIN":#柒牌 + # json_data["payload"]["dialog_attributes"]["cfg"]["bot_option"]["bot_id"]="7411071327182438412"# + # json_data["payload"]["dialog_attributes"]["cfg"]["bot_option"]["workflow_id"]="7469049680291610636" + # json_data["payload"]["inbound_attributes"]["vad_silence"] = 1500 + # # + # elif dev_type == 'momo':#食梦貘 + # pass + # elif dev_type == 'sjgq':#四季甘泉 + # json_data["payload"]["dialog_attributes"]["cfg"]["bot_option"]["bot_id"]="7472201279826690111" + # json_data["payload"]["dialog_attributes"]["cfg"]["bot_option"]["workflow_id"]="472203898494500914" + # pass + # elif dev_type == 'szbst':#深圳百事通 + # json_data["payload"]["dialog_attributes"]["cfg"]["bot_option"]["bot_id"]="7469964258592931852" + # json_data["payload"]["dialog_attributes"]["cfg"]["bot_option"]["workflow_id"]="7469968083063603241" + if self.commands_mode !=0: + json_data["payload"]["commands"] = [] + if self.VC_mode == 0:#长对话模式打开vad + json_data["payload"]["inbound_attributes"]["disable_vad"] = False + json_data["payload"]["inbound_attributes"]["cfg"]["keywords"] = ['昆昆'] + self.VC_state = VC_State_None + self.AI_client_VC_send(ujson.dumps(json_data)) + + #开始上传语音 + def AI_client_VC_send_speech(self): + json_data = \ + { + "header": { + "event": "audio.create", + + }, + } + + if self.VC_mode == 1:#单对话模式 + self.AI_client_VC_send(ujson.dumps(json_data)) + + + + + + + self.VC_state = VC_State_SpeechStart + #结束上传语音 + def AI_client_VC_end_speech(self): + json_data = \ + { + "header": { + "event": "audio.completed", + + }, + } + self.AI_client_VC_send(ujson.dumps(json_data)) + EventMesh.publish("publish_AI_btnInfo",{"func":self.VC_Speech_End}) + + + #客户端打断对话 + def AI_client_VC_RequestToSpeak(self): + json_data = \ + { + "event": "cancel", + "payload": {} + } + print("AI_client_VC_RequestToSpeak!!!!!!!!!!!!!!!!!!!!!!!!!!!!!") + # EventMesh.publish("publish_AI_btnInfo",{"func":self.VC_init}) + # EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_client_VC_send,"data":ujson.dumps(json_data)}) + # utime.sleep_ms(1) + self.websocket_deconnect_VC() + self.AI_audio_queue_thread_close() + self.VC_state = VC_State_None + #self.Close() + self.AI_VC_start() + #TTS播放 + def AI_client_VC_synthesis(self): + json_data = \ + { + "event": "synthesis", + "payload": { + "text": self.AI_TTS_str + } + } + self.AI_TTS_str = "" + print("AI_client_VC_synthesis!!!!!!!!!!!!!!!!!!!!!!!!!!!!!") + # if self.VC_state == VC_State_RequestToRespond: + # print("AI_client_VC_RequestToRespond 重复 tts_str:{}\nasr_str:{}".format(self.AI_TTS_str,self.AI_ASR_str)) + self.AI_client_VC_send(ujson.dumps(json_data)) + + #TTS播放(可加入参数事件调用版) + def AI_client_VC_synevent(self,event, msg): + self.AI_TTS_str = msg + self.Close_flag = 1 + EventMesh.publish("publish_AI_btnInfo",{"func":self.VC_Speech_End}) + EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_deconnect_VC}) + EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_VC_start}) + #self.VC_record_thread_close()#关闭录音线程 + def chenggong_tone(self): + EventMesh.publish("audio_montage_play",["chenggong.mp3"]) + def send_tone(self): + EventMesh.publish("audio_montage_play",["send_tone.mp3"]) + #给服务器回应ack + + + ############################################ + #关闭音频播放线程 + def AI_audio_queue_thread_close(self): + print("AI_audio_queue_thread_close1!!!!!!!!!!!!!!!!!!!!!!") + if self.AI_audio_queue_thread_id != 0: + count =500 + while True: + count -= 1 + if self.AI_audio_queue_thread_lock == 0 or count <=0: + break + else: + self.AI_audio_queue_thread_lock = 2 + print("AI_audio_queue_thread going:{}...".format(count)) + utime.sleep_ms(1) + self.AI_audio_queue_thread_lock = 0 + print("AI_audio_queue_thread_close2!!!!!!!!!!!!!!!!!") + try: + _thread.stop_thread(self.AI_audio_queue_thread_id) + except Exception as e: + usys.print_exception(e) + self.AI_audio_queue_thread_id = 0 + # 音频队列 + def AI_audio_queue_thread(self): + print("AI_audio_queue_thread start") + count = 0 + if self.AI_audio_queue.empty()!=True: + self.AI_audio_queue.clear() + print("音频数据还有剩余!!!!!!!!!!!!") + while True: + try: + if self.AI_audio_queue_thread_lock == 2: + print("AI_audio_queue_thread 该退出了") + break + # + count+=1 + if count%500 == 1: + print("AI_audio_queue_thread on") + utime.sleep_ms(1) + #print("AI_audio_queue_thread") + if self.AI_audio_queue.empty() : + self.AI_audio_queue_thread_lock = 0 + + + else: + self.AI_audio_queue_thread_lock = 1 + data = self.AI_audio_queue.get() + self.close_timerout = 0 + if self.play_flag == 0: + self.play_flag =1 + #self.AI_client_tts_data_len=len(data) + #print("audio_queue:len:{}".format(len(data[0]))) + + if len(data[0]) > 10: + for i in range(5): + if self.VC_Play_flag == 0: + self.VC_Play_Start() + utime.sleep_ms(2) + else: + break + try: + if self.VC_play_TYPE == VC_play_TYPE_PCM: + # if self.VC_play_samplerate == 8000: + # tmp= self.aud.playStream(1,data[0] ) + # else: + write_buf = bytearray(data[0]) + #print("play_pcm.stream_write1 len:{}".format(len(write_buf))) + if self.play_pcm != None: + #print("play_pcm.stream_write !!!") + ret = self.play_pcm.stream_write(write_buf,len(write_buf)) + #ret= self.aud.playStream(1, data[0])#播放音频流 + self.tts_out_data_len += ret + #print("play_pcm.stream_write2:{}".format(self.tts_out_data_len)) + elif self.VC_play_TYPE == VC_play_TYPE_MP3: + tmp= self.aud.playStream(3, data[0])#播放音频流 + + if tmp != 0: + print("2playStream:error tmp:{} data len:{}!!!!!!!!!!!!".format(tmp,len(data[0]))) + # # #播放失败的时候填充WAV头 + # data_len = len(data[0]) + # data_len_b = data_len.to_bytes(4,'little')#数据长度转16进制数组 + # h_data = [ 0x52 ,0x49 ,0x46 ,0x46 #,0x24 ,0x00 ,0x00 ,0x00 #文件标识、文件大小 + # ,0x57 ,0x41 ,0x56 ,0x45 ,0x66 ,0x6D ,0x74 ,0x20 #文件格式、格式块标识符 + # ,0x10 ,0x00 ,0x00 ,0x00 ,0x01 ,0x00 ,0x01 ,0x00 ,0x80 ,0x3E ,0x00 ,0x00 #格式块大小4、音频格式2、声道数2、采样率4 + # ,0x80 ,0x3E ,0x00 ,0x00 ,0x02 ,0x00 ,0x10 ,0x00 ,0x64 ,0x61 ,0x74 ,0x61]#每秒字节数4、数据块对齐2、位深度2、data4 + # h_data_b = bytes(h_data) + # file_len = data_len+len(h_data_b)+4+4 + # file_len_b = file_len.to_bytes(4,'little')#文件长度转16进制数组 + # h_data_b = h_data_b[:4]+file_len_b+h_data_b[4:]+data_len_b + # #self.aud.playStream(2, h_data_b)#播放音频流 + # tmp= self.aud.playStream(2, h_data_b+data[0])#播放音频流 + # print("3playStream:tmp:{} !!!!!!!!!!!!".format(tmp)) + + + mem = gc.mem_free() + #print('1剩余内存RAM:{} KB'.format(mem / 1024)) + except Exception as e: + print("AI_audio_queue_thread:ERROR:") + usys.print_exception(e) + + # if self.VC_state == VC_State_TTSEnd and self.AI_audio_queue.empty() :#self.AI_audio_queue为空且tts下发结束 + # #通知服务器播放结束 + # self.AI_client_VC_LocalRespondingEnded() + except Exception as e: + print("AI_audio_queue_thread:ERROR:") + usys.print_exception(e) + self.AI_audio_queue_thread_lock = 0 + #print("AI_audio_queue_thread:exit") + def factory_mode(self): + print("factory_mode") + EventMesh.publish("publish_AI_btnInfo",{"func":self.Close}) + EventMesh.publish("publish_AI_btnInfo",{"func":self.factory_start}) + def factory_start(self): + self.factory_timer.start(3000, 1, self.factory_timer_cb) + def factory_timer_cb(self, *args, **kwargs): + print("factory_timer_cb play......") + #self.aud.play(1,0,'U:/static/peizhichenggong.mp3')#切换成功 + EventMesh.publish("audio_montage_play",["xinhaoruo1.mp3"]) + + def Close(self): + self.VC_Thinking_timerout = 0 + self.VC_satrt_flag = 0 + self.AI_TTS_str = "" + self.AI_ASR_str = "" + self.AI_ASR_str_tmp = "" + self.AI_ASR_flag = 0 + self.AI_ASR_check_timeout = 0 + self.AI_ASR_error_timeout = 0 + print("ai_VC Close1!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!") + self.tts_in_data_len = 0 + self.tts_out_data_len = 0 + #必须先销毁线程,不然线程会容易报错 + close_all_ledm() + try: + self.AI_audio_queue_thread_close()#销毁音频线程 + except Exception as e: + usys.print_exception(e) + try: + self.AI_VC_send_data_queue_thread_close()#销毁数据发送线程 + except Exception as e: + usys.print_exception(e) + + self.VC_Speech_End() + + print("ai_VC Close1.1!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!") + self.VC_init() + print("ai_VC Close1.2!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!") + + try: + self.websocket_deconnect_VC() + except Exception as e: + usys.print_exception(e) + + + + + + print("ai_VC Close1.3!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!") + + print("ai_VC Close2!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!") + + + self.AI_ASR_timer.stop() + self._1S_timer.stop() + self.factory_timer.stop() + + if self.record_data_save_flag == 1: + if self.record_fd : + self.record_fd.close() + self.record_fd = None + if self.play_data_save_flag == 1: + if self.play_fd !=None: + self.play_fd.close() + self.play_fd = None + print("ai_VC Close3!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\r\n") + + if self.AI_VC_send_data_queue.empty()!=True: + self.AI_VC_send_data_queue.clear() + + self.AI_ASR_send_buf_len = 0 + #self.AI_WS_connect_Queue.put(self.AI_client_VC) + + # try: + # while True: + # if self.AI_WS_connect_Queue.empty()!=True: + # AI_WS_connect = self.AI_WS_connect_Queue.get() + # if AI_WS_connect : + # try: + # AI_WS_connect._close() + # AI_WS_connect = None + # except Exception as e: + # usys.print_exception(e) + # else: + # print("websocket链接已为空") + # else: + # break + # except Exception as e: + # usys.print_exception(e) + + def VC_init2(self): + self.VC_init() + + print("ai_VC VC_init2!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!") + try: + self.websocket_deconnect_VC() + except Exception as e: + usys.print_exception(e) + print("ai_VC Close3!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\r\n") + self._1S_timer.stop() + if self.AI_VC_send_data_queue.empty()!=True: + self.AI_VC_send_data_queue.clear() + + self.AI_ASR_send_buf_len = 0 + if self.AI_audio_queue.empty()!=True: + self.AI_audio_queue.clear() + def VC_init(self): + + print("VC_init:AI_VC_send_data_queue:size:{}".format(self.AI_VC_send_data_queue.size())) + + + print("VC_init2") + #self.VC_Speech_End() + print("VC_init3") + self.VC_Play_End() + print("VC_init4") + + if self.AI_audio_queue.empty()!=True: + self.AI_audio_queue.clear() + # num = EventMesh.publish("get_volum_size") + # if num == None: + # num = 8 + # self.aud.setVolume(num)#恢复原始音量 + \ No newline at end of file diff --git a/2.sdk/project/D10/sdk/services/microPython/ports/quectel/core/btn_device_ec800m.py b/2.sdk/project/D10/sdk/services/microPython/ports/quectel/core/btn_device_ec800m.py index 9bbf5e90..505d1787 100644 --- a/2.sdk/project/D10/sdk/services/microPython/ports/quectel/core/btn_device_ec800m.py +++ b/2.sdk/project/D10/sdk/services/microPython/ports/quectel/core/btn_device_ec800m.py @@ -12,13 +12,16 @@ import ql_fs import ujson import voiceCall from misc import Power -from led import red_green_light,green_light_fast,led_mode,open_led_red,close_led_red,open_led_green,open_led_white,close_led_green,close_led_white +from led import open_all_ledm,green_light_fast,red_light_fast,led_mode,open_led_red,close_led_red,open_led_green,open_led_white,close_led_green,close_led_white,close_all_ledm,white_light_fast from machine import RTC from queue import Queue import _thread import usys import sms from Gsensor import SC7A20 +from misc import Power +DEBUG = 0 #0关闭调试 1开启 +import ai_VC if EventMesh.model == "D10" : audio_buf = ['audio_find_haixiu', 'R_ALARM_NEW', 'R_BLOOD_SUGAR', 'R_CALL_mp3', 'R_CHARGE_FULL', 'R_CHARGE_IN', 'R_CHARGE_OUT', 'R_CUR_BATTERY_LEVEL', 'R_DRINK_ALARM', 'R_FALL_ALARM', 'R_HOME_ALARM', 'R_HSENSOR_RESULT_FAILE', 'R_HSENSOR_RESULT_HR_TITLE', 'R_HSENSOR_RESULT_OK', 'R_HSENSOR_SPO2_TITLE', 'R_HSENSOR_TEMP_TITLE', 'R_MEDICINE_ALARM', 'R_NO_SET_SOS_DIAL', 'R_NO_SET_VIDOE', 'R_NO_SIM', 'R_POWER_OFF_1', 'R_READ_STEP_0', 'R_READ_STEP_1', 'R_READ_STEP_2', 'R_READ_STEP_3', 'R_READ_STEP_4', 'R_READ_TIME_0', 'R_READ_TIME_1', 'R_READ_TIME_2', 'R_READ_TIME_3', 'R_READ_TIME_4', 'R_READ_TIME_5', 'R_READ_TIME_6', 'R_READ_TIME_7', 'R_READ_TIME_8', 'R_READ_TIME_9', 'R_READ_TIME_MIN', 'R_READ_TIME_ZHENG', 'R_RESET_ALARM', 'R_RESET_END_ALARM', 'R_SIM_CONNECT', 'R_SIM_FAILE', 'R_SLEEP_ALARM', 'R_SOS_ALERT', 'R_TSENSOR_RESULT_VALUE_DOT', 'R_UNREAD_WECHAT', 'R_VIDEO_ANSWER', 'R_VIDEO_ANSWERING', 'R_VIDEO_CALL_CONNECT', 'R_VIDEO_CALL_ENDING', 'R_VIDEO_CALL_IN', 'R_VIDEO_VOICE_IN', 'R_VIDEO_WAITING', 'R_WAKEUP_ALARM', 'R_WECHAT_RECV'] @@ -119,7 +122,13 @@ if EventMesh.model == "D10" : self.hr_auto = 0 self.temp_auto = 0 - + #sos打断的标志判断 + #打电话标志 + self.call_flag = 0 + #音频接口初始化 + self.a = audio.Audio(0) + self.a.set_pa(Pin.GPIO29) + self.a.setVolume(1) check_txt = ql_fs.path_exists("/usr/static/storage_file/wechat_record.json") if check_txt == True : with open("/usr/static/storage_file/wechat_record.json","r") as fd:#音频文件编号 @@ -155,7 +164,7 @@ if EventMesh.model == "D10" : EventMesh.subscribe("set_start_temp_measure_time", self.set_start_temp_measure_time)#设置体温开始测量的时间戳时间 EventMesh.subscribe("get_start_temp_measure_time", self.get_start_temp_measure_time)#获取体温开始测量的时间戳时间 EventMesh.subscribe("play_hr_value", self.play_hr_value)#播放心率数值 - EventMesh.subscribe("play_spo2_value", self.play_spo2_value)#播放心率数值 + EventMesh.subscribe("play_spo2_value", self.play_spo2_value)#播放血氧数值 EventMesh.subscribe("play_temp_value", self.play_temp_value)#播放体温数值 EventMesh.subscribe("play_sugar_value", self.play_sugar_value)#播放血糖数值 @@ -218,6 +227,10 @@ if EventMesh.model == "D10" : EventMesh.subscribe("home_alarm_event", self.home_alarm_event)#该回家了 + EventMesh.subscribe("meet_alarm_event", self.meet_alarm_event)#该开会了 + + EventMesh.subscribe("water_alarm_event", self.water_alarm_event)#该单次喝水了 + EventMesh.subscribe("sleep_alarm_event", self.sleep_alarm_event)#该睡觉了 EventMesh.subscribe("reset_alarm_event", self.reset_alarm_event)#该休息了 @@ -273,13 +286,19 @@ if EventMesh.model == "D10" : def publish_home_ring_event_cb(self, *args, **kwargs):#回家响铃 EventMesh.publish("publish_message_event_interInfo",{"func":self.home_alarm_event_cb,"data":0}) + def publish_meet_ring_event_cb(self, *args, **kwargs):#开会响铃 + EventMesh.publish("publish_message_event_interInfo",{"func":self.meet_alarm_event_cb,"data":0}) + + def publish_meet_ring_event_cb(self, *args, **kwargs):#单次喝水响铃 + EventMesh.publish("publish_message_event_interInfo",{"func":self.water_alarm_event_cb,"data":0}) + def publish_wakeup_ring_event_cb(self, *args, **kwargs):#起床响铃 EventMesh.publish("publish_message_event_interInfo",{"func":self.wakeup_alarm_event_cb,"data":0}) def publish_medicine_ring_event_cb(self, *args, **kwargs):#吃药响铃 EventMesh.publish("publish_message_event_interInfo",{"func":self.medicine_alarm_event_cb,"data":0}) - def publish_drink_ring_event_cb(self, *args, **kwargs):#喝水响铃 + def publish_drink_ring_event_cb(self, *args, **kwargs):#周期喝水响铃 EventMesh.publish("publish_message_event_interInfo",{"func":self.drink_alarm_event_cb,"data":0}) def publish_fall_done_ring_event_cb(self, *args, **kwargs):#跌倒提醒 @@ -290,9 +309,7 @@ if EventMesh.model == "D10" : wechat_state = EventMesh.publish("get_wechat_state") if self.call_state == 0 and wechat_state == 0 and self.fall_flag == 0: self.alarm_count = 0 - self.alarm_timer1.start(2000, 1, self.publish_reset_alarm_ring_event_cb) - str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_RESET_ALARM")) - EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件 + self.alarm_timer1.start(4000, 1, self.publish_reset_alarm_ring_event_cb) def reset_alarm_event_cb(self,args):#该休息了 wechat_state = EventMesh.publish("get_wechat_state") if self.call_state == 0 and wechat_state == 0 and self.fall_flag == 0: @@ -301,8 +318,7 @@ if EventMesh.model == "D10" : self.alarm_count = 0 self.alarm_timer1.stop() return - str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_RESET_ALARM")) - EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件 + EventMesh.publish("AI_client_VC_synevent","休息")#用TTS读 else: self.alarm_count = 0 self.alarm_timer1.stop() @@ -311,9 +327,7 @@ if EventMesh.model == "D10" : wechat_state = EventMesh.publish("get_wechat_state") if self.call_state == 0 and wechat_state == 0 and self.fall_flag == 0: self.alarm_count = 0 - self.alarm_timer1.start(2000, 1, self.reset_end_alarm_event_cb) - str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_RESET_END_ALARM")) - EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件 + self.alarm_timer1.start(4000, 1, self.reset_end_alarm_event_cb) def reset_end_alarm_event_cb(self,args):#休息结束了 wechat_state = EventMesh.publish("get_wechat_state") @@ -323,8 +337,7 @@ if EventMesh.model == "D10" : self.alarm_count = 0 self.alarm_timer1.stop() return - str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_RESET_END_ALARM")) - EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件 + EventMesh.publish("AI_client_VC_synevent","结束")#用TTS读 else: self.alarm_count = 0 self.alarm_timer1.stop() @@ -333,9 +346,8 @@ if EventMesh.model == "D10" : wechat_state = EventMesh.publish("get_wechat_state") if self.call_state == 0 and wechat_state == 0 and self.fall_flag == 0: self.alarm_count = 0 - self.alarm_timer1.start(2000, 1, self.publish_sleep_alarm_ring_event_cb) - str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_SLEEP_ALARM")) - EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件 + self.alarm_timer1.start(4000, 1, self.publish_sleep_alarm_ring_event_cb) + def sleep_alarm_event_cb(self,args):#该睡觉了 wechat_state = EventMesh.publish("get_wechat_state") if self.call_state == 0 and wechat_state == 0 and self.fall_flag == 0: @@ -344,8 +356,7 @@ if EventMesh.model == "D10" : self.alarm_count = 0 self.alarm_timer1.stop() return - str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_SLEEP_ALARM")) - EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件 + EventMesh.publish("AI_client_VC_synevent","睡觉")#用TTS读 else: self.alarm_count = 0 self.alarm_timer1.stop() @@ -355,9 +366,7 @@ if EventMesh.model == "D10" : wechat_state = EventMesh.publish("get_wechat_state") if self.call_state == 0 and wechat_state == 0 and self.fall_flag == 0: self.alarm_count = 0 - self.alarm_timer1.start(2000, 1, self.publish_home_ring_event_cb) - str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_HOME_ALARM")) - EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件 + self.alarm_timer1.start(4000, 1, self.publish_home_ring_event_cb) def home_alarm_event_cb(self,args):#该回家了 wechat_state = EventMesh.publish("get_wechat_state") @@ -367,19 +376,65 @@ if EventMesh.model == "D10" : self.alarm_count = 0 self.alarm_timer1.stop() return - str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_HOME_ALARM")) - EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件 + EventMesh.publish("AI_client_VC_synevent","该回家了")#用TTS读 else: self.alarm_count = 0 self.alarm_timer1.stop() + + def meet_alarm_event(self,args,msg):#该开会了 + wechat_state = EventMesh.publish("get_wechat_state") + if self.call_state == 0 and wechat_state == 0 and self.fall_flag == 0: + self.alarm_count = 0 + self.alarm_timer1.start(4000, 1, self.publish_meet_ring_event_cb) + # EventMesh.publish("AI_client_VC_synevent","回家")#用TTS读 + def meet_alarm_event_cb(self,args):#该开会了 + wechat_state = EventMesh.publish("get_wechat_state") + if self.call_state == 0 and wechat_state == 0 and self.fall_flag == 0: + self.alarm_count += 1 + if self.alarm_count >= 3: + self.alarm_count = 0 + self.alarm_timer1.stop() + return + data = RTC().datetime() + hour = data[4] + min = data[5] + print("读日期") + str_data = "当前时间是" + str(hour) + "点" + str(min) + "分,您的会议要开始了" + EventMesh.publish("AI_client_VC_synevent",str_data)#用TTS读 + else: + self.alarm_count = 0 + self.alarm_timer1.stop() + def water_alarm_event(self,args,msg):#该单次喝水了 + wechat_state = EventMesh.publish("get_wechat_state") + if self.call_state == 0 and wechat_state == 0 and self.fall_flag == 0: + self.alarm_count = 0 + self.alarm_timer1.start(4000, 1, self.publish_meet_ring_event_cb) + # EventMesh.publish("AI_client_VC_synevent","回家")#用TTS读 + + def water_alarm_event_cb(self,args):#该单次喝水了 + wechat_state = EventMesh.publish("get_wechat_state") + if self.call_state == 0 and wechat_state == 0 and self.fall_flag == 0: + self.alarm_count += 1 + if self.alarm_count >= 3: + self.alarm_count = 0 + self.alarm_timer1.stop() + return + data = RTC().datetime() + hour = data[4] + min = data[5] + print("读喝水") + str_data = "该喝水啦" + EventMesh.publish("AI_client_VC_synevent",str_data)#用TTS读 + else: + self.alarm_count = 0 + self.alarm_timer1.stop() + def wakeup_alarm_event(self,args,msg):#该起床了 wechat_state = EventMesh.publish("get_wechat_state") if self.call_state == 0 and wechat_state == 0 and self.fall_flag == 0: self.alarm_count = 0 - self.alarm_timer1.start(2000, 1, self.publish_wakeup_ring_event_cb) - str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_WAKEUP_ALARM")) - EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件 + self.alarm_timer1.start(4000, 1, self.publish_wakeup_ring_event_cb) def wakeup_alarm_event_cb(self,args):#该起床了 wechat_state = EventMesh.publish("get_wechat_state") @@ -389,20 +444,16 @@ if EventMesh.model == "D10" : self.alarm_count = 0 self.alarm_timer1.stop() return - str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_WAKEUP_ALARM")) - EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件 + EventMesh.publish("AI_client_VC_synevent","该起床了")#用TTS读 else: self.alarm_count = 0 self.alarm_timer1.stop() - def medicine_alarm_event(self,args,msg):#该吃药了 wechat_state = EventMesh.publish("get_wechat_state") if self.call_state == 0 and wechat_state == 0 and self.fall_flag == 0: self.alarm_count = 0 - self.alarm_timer1.start(2000, 1, self.publish_medicine_ring_event_cb) - str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_MEDICINE_ALARM")) - EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件 + self.alarm_timer1.start(4000, 1, self.publish_medicine_ring_event_cb) def medicine_alarm_event_cb(self,args):#该吃药了 wechat_state = EventMesh.publish("get_wechat_state") @@ -412,6 +463,7 @@ if EventMesh.model == "D10" : self.alarm_count = 0 self.alarm_timer1.stop() return + EventMesh.publish("AI_client_VC_synevent","吃药")#用TTS读 str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_MEDICINE_ALARM")) EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件 else: @@ -422,7 +474,7 @@ if EventMesh.model == "D10" : wechat_state = EventMesh.publish("get_wechat_state") if self.call_state == 0 and wechat_state == 0 and self.fall_flag == 0: self.alarm_count = 0 - self.alarm_timer1.start(2000, 1, self.publish_drink_ring_event_cb) + self.alarm_timer1.start(4000, 1, self.publish_drink_ring_event_cb) str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_DRINK_ALARM")) EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件 @@ -436,8 +488,7 @@ if EventMesh.model == "D10" : self.alarm_count = 0 self.alarm_timer1.stop() return - str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_DRINK_ALARM")) - EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件 + EventMesh.publish("AI_client_VC_synevent","该喝水啦")#用TTS读 else: self.alarm_count = 0 self.alarm_timer1.stop() @@ -453,7 +504,6 @@ if EventMesh.model == "D10" : self.fall_timer1.stop() self.fall_flag = 1 self.fall_timer1.start(4000, 1, self.publish_fall_done_ring_event_cb) - EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件 def falldown_alarm_cb(self,*args): wechat_state = EventMesh.publish("get_wechat_state") @@ -464,8 +514,6 @@ if EventMesh.model == "D10" : self.fall_timer1.stop() EventMesh.publish_async("dial_sos_phone")#拨打sos号码 return - str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_FALL_ALARM")) - EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件 else: self.time_count = 0 self.fall_timer1.stop() @@ -516,6 +564,7 @@ if EventMesh.model == "D10" : # EventMesh.publish("stop_led_timer")#设置参数 self.aud.stopPlayStream() #播放声音 self.alarm_timer1.stop() + def FIND_timer_cb(self, data): flag = EventMesh.publish("get_call_state")#在通话或者电话拨进 或者拨出不允许寻找设备 @@ -524,10 +573,14 @@ if EventMesh.model == "D10" : if self.find_state == 1: # EventMesh.debug_log("self.FIND_timer_count:{}".format(self.FIND_timer_count)) str_data = 'mp3files={}.mp3'.format(audio_buf.index("audio_find_haixiu")) + self.a.aud_tone_play(16, 0)#响铃一分钟 + #EventMesh.publish("AI_client_VC_synevent",str_data)#用TTS读 EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data) self.FIND_timer_count += 1 - if self.FIND_timer_count > 10: #120秒30s - EventMesh.publish("STOP_FIND_WATCH") + print(self.FIND_timer_count) + if self.FIND_timer_count > 1: #120秒30s + self.a.aud_tone_play_stop() + EventMesh.publish("STOP_FIND_WATCH") else: self.FIND_timer_count = 0 self.alarm_timer1.stop() @@ -551,10 +604,11 @@ if EventMesh.model == "D10" : EventMesh.publish("close_timer_all")# self.alarm_state = 1 self.alarm_timer_count = 0 - self.alarm_timer1.start(3000,1,self.publish_alarm_ring_event_cb) + self.alarm_timer1.start(8000,1,self.publish_alarm_ring_event_cb) # EventMesh.publish("set_led_time_arg",[1,1,330,led_mode.LONG_LIGHT_GREEN,2,1,led_mode.OTHER_MEASURE_MODE])#測量成功 # EventMesh.publish("set_led_time_arg",[1000,33000,1,led_mode.FLASH_LIGHT_GREEN,led_mode.DEFAULT_LONG_LIGHT_MODE,led_mode.OTHER_MEASURE_MODE])#设置参数 str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_ALARM_NEW")) + #EventMesh.publish("AI_client_VC_synevent",str_data)#用TTS读 EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data) def stop_alarm_ring(self, event, msg): #停止闹钟响铃 @@ -571,8 +625,8 @@ if EventMesh.model == "D10" : if flag == 0 and wechat_state == 0 and self.fall_flag == 0: if self.alarm_state == 1: # EventMesh.debug_log("self.alarm_timer_count:{}".format(self.alarm_timer_count)) - str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_ALARM_NEW")) - EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data) + self.aud.stop() + self.aud.play(1,1,'U:/static/R_ALARM_NEW.mp3')#闹钟音频 self.alarm_timer_count += 1 if self.alarm_timer_count > 15: #120秒30s EventMesh.publish("STOP_ALARM_RING") @@ -584,12 +638,14 @@ if EventMesh.model == "D10" : return self.fall_flag def sos_short_press(self,args,msg): + #播报当前时间 + flag = EventMesh.publish("get_call_state") + if flag != 2 and flag != 3 and self.alarm_state == 0 and self.call_flag == 0 and self.find_state== 0: + EventMesh.publish("play_cur_time_event")#播报当前时间 EventMesh.publish("interup_call_event")#如果在电话中强制挂断电话 EventMesh.publish("close_audio_play")#强制关闭音频文件播放 EventMesh.publish("STOP_FIND_WATCH")#停止查找设备 - EventMesh.publish("STOP_ALARM_RING")#停止闹钟响铃 - EventMesh.publish("play_cur_time_event")#播报当前时间 - #播报当前时间 + EventMesh.publish("STOP_ALARM_RING")#停止闹钟响铃 def recv_wechat_audio(self,event,str_data):#接收微聊语音播放 wechat_state = EventMesh.publish("get_wechat_state") @@ -628,7 +684,7 @@ if EventMesh.model == "D10" : if power_off != None: if power_off == 1: return - self.aud.montage_play('U:/static/audio.bin',1,data[1],data[0]) + #self.aud.montage_play('U:/static/audio.bin',1,data[1],data[0]) # EventMesh.debug_log("play_audio_file end",data[0],data[1])#路径 str_data[1] 是否需要被打断 @@ -708,7 +764,10 @@ if EventMesh.model == "D10" : EventMesh.publish("close_wechat_btn_timer")# EventMesh.publish("set_led_time_arg",[1,2,10*10,led_mode.FLASH_LIGHT_RED,10,5,led_mode.OTHER_MEASURE_MODE])#測量成功 self.timer.start(6000, 1, self.publish_call_event_cb) - str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_CALL_mp3")) + print("dialin_call_event") + str_data = '来电话啦!叮铃铃' + self.call_flag = 1#来电话的标志位置为1 + EventMesh.publish("AI_client_VC_synevent",str_data)#用TTS读 EventMesh.publish("play_audio_file",[str_data,0])#获取播放音频文件 # EventMesh.publish("play_audio_file",str_data)#获取播放音频文件('U:/static/audio.bin',1,1,str_data) @@ -743,12 +802,14 @@ if EventMesh.model == "D10" : self.phone_num = '' EventMesh.publish("close_timer_all")# if msg == None: - str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_NO_SET_SOS_DIAL")) + str_data = '您没设置电话呀' + EventMesh.publish("AI_client_VC_synevent",str_data)#用TTS读 EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件 # EventMesh.publish("play_audio_file",str_data)#获取播放音频文件('U:/static/audio.bin',1,1,str_data) else: self.phone_num = str(msg) - str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_SOS_ALERT")) + str_data = '电话呼叫中' + EventMesh.publish("AI_client_VC_synevent",str_data)#用TTS读 EventMesh.publish("play_audio_file",[str_data,0])#获取播放音频文件 self.timer1.start(2000, 0, self.time_out_phone) @@ -771,7 +832,7 @@ if EventMesh.model == "D10" : EventMesh.publish("close_timer_all")# if msg == None: - str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_NO_SET_SOS_DIAL")) + str_data = '没有设置SOS电话呀' EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件 # EventMesh.publish("play_audio_file",str_data)#获取播放音频文件('U:/static/audio.bin',1,1,str_data) else: @@ -784,7 +845,8 @@ if EventMesh.model == "D10" : EventMesh.publish(constants.EVENT.START_LOCATION,[constants.PROTOCOL.AL_SEND,sos_state]) #开始AL定位 EventMesh.publish("close_timer_all")# self.sos_phone_num = msg - str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_SOS_ALERT")) + str_data = 'S O S呼叫中' + EventMesh.publish("AI_client_VC_synevent",str_data)#用TTS读 EventMesh.publish("play_audio_file",[str_data,0])#获取播放音频文件 self.sos_timer1.start(2000, 0, self.sos_call_out_phone) self.sos_timer2.start(30000, 0, self.sos_time_out_phone) @@ -808,7 +870,7 @@ if EventMesh.model == "D10" : def interup_call_event(self, event, msg):#侧边金属按钮挂断来电 flag = EventMesh.publish("get_call_state") - if flag == 2 or flag == 3:#电话通话中 或者呼叫中挂断中断 + if flag == 1 or flag == 2 or flag == 3:#电话通话中 或者呼叫中挂断中断 self.call_state = 0 voiceCall.callEnd() @@ -826,19 +888,24 @@ if EventMesh.model == "D10" : if self.fall_flag == 0: EventMesh.publish("close_timer_all")# step = EventMesh.publish("get_old_step_value") + str_data = "您当前已走步数为" + str(step) + "æ­¥" + EventMesh.publish("AI_client_VC_synevent",str_data)#用TTS读 EventMesh.debug_log("step",step) self.setp_old = step if step <= 10:# if step == 10:#十步 str_data = 'mp3files={}.mp3+{}.mp3'.format(audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_STEP_4")) + #EventMesh.publish("AI_client_VC_synevent",str_data)#用TTS读 EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data) else:# 9æ­¥ str_data = 'mp3files={}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(step)),audio_buf.index("R_READ_STEP_4")) + #EventMesh.publish("AI_client_VC_synevent",str_data)#用TTS读 EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data) elif step <= 100:#十 90 if step == 100: str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_1"),audio_buf.index("R_READ_STEP_2"),\ audio_buf.index("R_READ_STEP_4")) + #EventMesh.publish("AI_client_VC_synevent",str_data)#用TTS读 EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data) else: step_tmp = str(step) @@ -848,19 +915,23 @@ if EventMesh.model == "D10" : if ge_value == 0:#9十步 70十步 str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(shi_value)),audio_buf.index("R_READ_STEP_3"),\ audio_buf.index("R_READ_STEP_4")) + #EventMesh.publish("AI_client_VC_synevent",str_data)#用TTS读 EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data) else:#9十2æ­¥ str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(shi_value)),audio_buf.index("R_READ_STEP_3"),\ audio_buf.index("R_READ_TIME_{}".format(ge_value)),audio_buf.index("R_READ_STEP_4")) + #EventMesh.publish("AI_client_VC_synevent",str_data)#用TTS读 EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data) else:#十9æ­¥ str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_{}".format(ge_value)),\ audio_buf.index("R_READ_STEP_4")) + #EventMesh.publish("AI_client_VC_synevent",str_data)#用TTS读 EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data) elif step <= 1000: if step == 1000:#1千步 str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_1"),\ audio_buf.index("R_READ_STEP_1"),audio_buf.index("R_READ_STEP_4")) + #EventMesh.publish("AI_client_VC_synevent",str_data)#用TTS读 EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data) else: step_tmp = str(step)#500 @@ -872,16 +943,19 @@ if EventMesh.model == "D10" : if ge_value == 0: str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(bai_value)),\ audio_buf.index("R_READ_STEP_2"),audio_buf.index("R_READ_TIME_{}".format(shi_value)),audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_STEP_4")) + #EventMesh.publish("AI_client_VC_synevent",str_data)#用TTS读 EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data) else: str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(bai_value)),\ audio_buf.index("R_READ_STEP_2"),audio_buf.index("R_READ_TIME_{}".format(shi_value)),audio_buf.index("R_READ_STEP_3"),\ audio_buf.index("R_READ_TIME_{}".format(ge_value)),audio_buf.index("R_READ_STEP_4")) + #EventMesh.publish("AI_client_VC_synevent",str_data)#用TTS读 EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data) else: if shi_value == 0 and ge_value == 0:#500 600 str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(bai_value)),\ audio_buf.index("R_READ_STEP_2"),audio_buf.index("R_READ_STEP_4")) + #EventMesh.publish("AI_client_VC_synevent",str_data)#用TTS读 EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data) pass else: @@ -889,12 +963,14 @@ if EventMesh.model == "D10" : str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(bai_value)),\ audio_buf.index("R_READ_STEP_2"),audio_buf.index("R_READ_TIME_0"),audio_buf.index("R_READ_TIME_{}".format(ge_value)),\ audio_buf.index("R_READ_STEP_4")) + #EventMesh.publish("AI_client_VC_synevent",str_data)#用TTS读 EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data) pass elif step <= 10000:#千 if step == 10000: str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_1"),\ audio_buf.index("R_READ_STEP_0"),audio_buf.index("R_READ_STEP_4")) + #EventMesh.publish("AI_client_VC_synevent",str_data)#用TTS读 EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data) pass else: @@ -912,17 +988,20 @@ if EventMesh.model == "D10" : str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(qian)),\ audio_buf.index("R_READ_STEP_1"),audio_buf.index("R_READ_TIME_0"),audio_buf.index("R_READ_TIME_{}".format(ge_value)),\ audio_buf.index("R_READ_STEP_4")) + #EventMesh.publish("AI_client_VC_synevent",str_data)#用TTS读 EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data) else: if ge_value == 0:#1020 1040 str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(qian)),\ audio_buf.index("R_READ_STEP_1"),audio_buf.index("R_READ_TIME_0"),audio_buf.index("R_READ_TIME_{}".format(shi_value)),\ audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_STEP_4")) + #EventMesh.publish("AI_client_VC_synevent",str_data)#用TTS读 EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data) else:#1021 str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(qian)),\ audio_buf.index("R_READ_STEP_1"),audio_buf.index("R_READ_TIME_0"),audio_buf.index("R_READ_TIME_{}".format(shi_value)),\ audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_{}".format(ge_value)),audio_buf.index("R_READ_STEP_4")) + #EventMesh.publish("AI_client_VC_synevent",str_data)#用TTS读 EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data) else: if shi_value <= 0:#1109 @@ -930,12 +1009,14 @@ if EventMesh.model == "D10" : str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(qian)),\ audio_buf.index("R_READ_STEP_1"),audio_buf.index("R_READ_TIME_{}".format(bai_value)), audio_buf.index("R_READ_STEP_2"),audio_buf.index("R_READ_STEP_4")) + #EventMesh.publish("AI_client_VC_synevent",str_data)#用TTS读 EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data) else: str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(qian)),\ audio_buf.index("R_READ_STEP_1"),audio_buf.index("R_READ_TIME_{}".format(bai_value)), audio_buf.index("R_READ_STEP_2"),audio_buf.index("R_READ_TIME_0"),audio_buf.index("R_READ_TIME_{}".format(ge_value)),\ audio_buf.index("R_READ_STEP_4")) + #EventMesh.publish("AI_client_VC_synevent",str_data)#用TTS读 EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data) else: if ge_value == 0:#1110 @@ -943,12 +1024,14 @@ if EventMesh.model == "D10" : audio_buf.index("R_READ_STEP_1"),audio_buf.index("R_READ_TIME_{}".format(bai_value)), audio_buf.index("R_READ_STEP_2"),audio_buf.index("R_READ_TIME_{}".format(shi_value)),\ audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_STEP_4")) + #EventMesh.publish("AI_client_VC_synevent",str_data)#用TTS读 EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data) else:#1117 str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(qian)),\ audio_buf.index("R_READ_STEP_1"),audio_buf.index("R_READ_TIME_{}".format(bai_value)), audio_buf.index("R_READ_STEP_2"),audio_buf.index("R_READ_TIME_{}".format(shi_value)),\ audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_{}".format(ge_value)),audio_buf.index("R_READ_STEP_4")) + #EventMesh.publish("AI_client_VC_synevent",str_data)#用TTS读 EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data) pass @@ -956,6 +1039,7 @@ if EventMesh.model == "D10" : if step == 100000:#10万步 str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_STEP_3"),\ audio_buf.index("R_READ_STEP_0"),audio_buf.index("R_READ_STEP_4")) + #EventMesh.publish("AI_client_VC_synevent",str_data)#用TTS读 EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data) else: step_tmp = str(step) @@ -971,6 +1055,7 @@ if EventMesh.model == "D10" : audio_buf.index("R_READ_STEP_0"),audio_buf.index("R_READ_TIME_{}".format(qian)),\ audio_buf.index("R_READ_STEP_1"),audio_buf.index("R_READ_TIME_{}".format(bai_value)),\ audio_buf.index("R_READ_STEP_2"),audio_buf.index("R_READ_STEP_4")) + #EventMesh.publish("AI_client_VC_synevent",str_data)#用TTS读 EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data) else:#11108 str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(wang)),\ @@ -978,6 +1063,7 @@ if EventMesh.model == "D10" : audio_buf.index("R_READ_STEP_1"),audio_buf.index("R_READ_TIME_{}".format(bai_value)),\ audio_buf.index("R_READ_STEP_2"),audio_buf.index("R_READ_TIME_0"),audio_buf.index("R_READ_TIME_{}".format(ge_value)),\ audio_buf.index("R_READ_STEP_4")) + #EventMesh.publish("AI_client_VC_synevent",str_data)#用TTS读 EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data) pass else: @@ -987,6 +1073,7 @@ if EventMesh.model == "D10" : audio_buf.index("R_READ_STEP_1"),audio_buf.index("R_READ_TIME_{}".format(bai_value)),\ audio_buf.index("R_READ_STEP_2"),audio_buf.index("R_READ_TIME_{}".format(shi_value)),\ audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_STEP_4")) + #EventMesh.publish("AI_client_VC_synevent",str_data)#用TTS读 EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data) else:#11116 str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(wang)),\ @@ -994,6 +1081,7 @@ if EventMesh.model == "D10" : audio_buf.index("R_READ_STEP_1"),audio_buf.index("R_READ_TIME_{}".format(bai_value)),\ audio_buf.index("R_READ_STEP_2"),audio_buf.index("R_READ_TIME_{}".format(shi_value)),\ audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_{}".format(ge_value)),audio_buf.index("R_READ_STEP_4")) + #EventMesh.publish("AI_client_VC_synevent",str_data)#用TTS读 EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data) pass elif wang > 0 and qian > 0:#11000 11010 11012 11008 @@ -1003,24 +1091,28 @@ if EventMesh.model == "D10" : audio_buf.index("R_READ_STEP_0"),audio_buf.index("R_READ_TIME_{}".format(qian)),\ audio_buf.index("R_READ_STEP_1"),audio_buf.index("R_READ_TIME_0"),audio_buf.index("R_READ_TIME_{}".format(shi_value)),\ audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_STEP_4")) + #EventMesh.publish("AI_client_VC_synevent",str_data)#用TTS读 EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data) else:#11016 str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(wang)),\ audio_buf.index("R_READ_STEP_0"),audio_buf.index("R_READ_TIME_{}".format(qian)),\ audio_buf.index("R_READ_STEP_1"),audio_buf.index("R_READ_TIME_0"),audio_buf.index("R_READ_TIME_{}".format(shi_value)),\ audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_{}".format(ge_value)),audio_buf.index("R_READ_STEP_4")) + #EventMesh.publish("AI_client_VC_synevent",str_data)#用TTS读 EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data) else: if ge_value == 0:#11000 str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(wang)),\ audio_buf.index("R_READ_STEP_0"),audio_buf.index("R_READ_TIME_{}".format(qian)),\ audio_buf.index("R_READ_STEP_1"),audio_buf.index("R_READ_STEP_4")) + #EventMesh.publish("AI_client_VC_synevent",str_data)#用TTS读 EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data) else:#11004 str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(wang)),\ audio_buf.index("R_READ_STEP_0"),audio_buf.index("R_READ_TIME_{}".format(qian)),\ audio_buf.index("R_READ_STEP_1"),audio_buf.index("R_READ_TIME_0"),audio_buf.index("R_READ_TIME_{}".format(ge_value)),\ audio_buf.index("R_READ_STEP_4")) + #EventMesh.publish("AI_client_VC_synevent",str_data)#用TTS读 EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data) elif wang > 0:#1 @@ -1031,24 +1123,28 @@ if EventMesh.model == "D10" : audio_buf.index("R_READ_STEP_0"),audio_buf.index("R_READ_TIME_0"),audio_buf.index("R_READ_TIME_{}".format(bai_value)),\ audio_buf.index("R_READ_STEP_2"),audio_buf.index("R_READ_TIME_{}".format(shi_value)),audio_buf.index("R_READ_STEP_3"),\ audio_buf.index("R_READ_STEP_4")) + #EventMesh.publish("AI_client_VC_synevent",str_data)#用TTS读 EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data) else: str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(wang)),\ audio_buf.index("R_READ_STEP_0"),audio_buf.index("R_READ_TIME_0"),audio_buf.index("R_READ_TIME_{}".format(bai_value)),\ audio_buf.index("R_READ_STEP_2"),audio_buf.index("R_READ_TIME_{}".format(shi_value)),audio_buf.index("R_READ_STEP_3"),\ audio_buf.index("R_READ_TIME_{}".format(ge_value)),audio_buf.index("R_READ_STEP_4")) + #EventMesh.publish("AI_client_VC_synevent",str_data)#用TTS读 EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data) else:#10108 if ge_value == 0:#10100 str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(wang)),\ audio_buf.index("R_READ_STEP_0"),audio_buf.index("R_READ_TIME_0"),audio_buf.index("R_READ_TIME_{}".format(bai_value)),\ audio_buf.index("R_READ_STEP_2"),audio_buf.index("R_READ_STEP_4")) + #EventMesh.publish("AI_client_VC_synevent",str_data)#用TTS读 EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data) else:#10108 str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(wang)),\ audio_buf.index("R_READ_STEP_0"),audio_buf.index("R_READ_TIME_0"),audio_buf.index("R_READ_TIME_{}".format(bai_value)),\ audio_buf.index("R_READ_STEP_2"),audio_buf.index("R_READ_TIME_0"),audio_buf.index("R_READ_TIME_{}".format(ge_value)),\ audio_buf.index("R_READ_STEP_4")) + #EventMesh.publish("AI_client_VC_synevent",str_data)#用TTS读 EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data) else: if shi_value > 0: @@ -1056,16 +1152,19 @@ if EventMesh.model == "D10" : str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(wang)),\ audio_buf.index("R_READ_STEP_0"),audio_buf.index("R_READ_TIME_0"),audio_buf.index("R_READ_TIME_{}".format(shi_value)),\ audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_STEP_4")) + #EventMesh.publish("AI_client_VC_synevent",str_data)#用TTS读 EventMesh.publish("play_audio_file",str_data)#获取播放音频文件('U:/static/audio.bin',1,1,str_data) else:#10098 str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(wang)),\ audio_buf.index("R_READ_STEP_0"),audio_buf.index("R_READ_TIME_0"),audio_buf.index("R_READ_TIME_{}".format(shi_value)),\ audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_{}".format(ge_value)),audio_buf.index("R_READ_STEP_4")) + #EventMesh.publish("AI_client_VC_synevent",str_data)#用TTS读 EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data) else: str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(wang)),\ audio_buf.index("R_READ_STEP_0"),audio_buf.index("R_READ_TIME_0"),audio_buf.index("R_READ_TIME_{}".format(ge_value)),\ audio_buf.index("R_READ_STEP_4")) + #EventMesh.publish("AI_client_VC_synevent",str_data)#用TTS读 EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data) def set_usb(self, event, msg): #msg 1 正在充电 2充电已移出 3 充电已满 0 @@ -1083,80 +1182,81 @@ if EventMesh.model == "D10" : get_bp_state = EventMesh.publish("get_bp_state") get_bg_state = EventMesh.publish("get_bg_state") get_temp_state = EventMesh.publish("get_temp_state") - if msg == 1: - if get_hr_state != None and get_spo2_state != None and get_bp_state != None and get_bg_state != None and get_temp_state != None: - if get_hr_state != 0: - - EventMesh.publish("set_hr_state",0)#2代表后台进入测试,定时测心率 1ui界面测试洗心率 - if get_hr_state == 1: - EventMesh.publish("stop_led_timer")#设置参数 - EventMesh.publish("set_start_measure_time",0)#设置开始测量的时间戳时间 - - EventMesh.debug_log("stop debug8") - EventMesh.publish(constants.EVENT.STOP_HEART) - if get_spo2_state != 0: - EventMesh.publish("set_spo2_state",0)#2代表后台进入测试 - if get_spo2_state == 1: - EventMesh.publish("stop_led_timer")#设置参数 - EventMesh.publish(constants.EVENT.STOP_BLOOD_OXYGEN) - EventMesh.debug_log("stop debug13") - if get_bp_state != 0: - EventMesh.publish("set_bp_state",0)#2代表后台进入测试 - if get_bp_state == 1: - EventMesh.publish("stop_led_timer")#设置参数 - EventMesh.publish(constants.EVENT.STOP_HEART) - EventMesh.debug_log("stop bp debug1") - if get_bg_state != 0: - EventMesh.publish("set_bg_state",0)#2代表后台进入测试 - if get_bg_state == 1:#手动开灯关闭灯 - EventMesh.publish("stop_led_timer")#设置参数 - EventMesh.publish(constants.EVENT.STOP_HEART) - EventMesh.debug_log("stop BG debug14") - if get_temp_state != 0: - - EventMesh.publish("set_temp_state",0)#2代表后台进入测试 - if get_temp_state == 1: - EventMesh.publish("stop_led_timer")#设置参数 - EventMesh.publish("set_start_temp_measure_time",0)# - EventMesh.publish(constants.EVENT.STOP_TEMP) - EventMesh.debug_log("stop temp debug14") - if msg == 1: - self.usbState = msg - str_buf = [1,1,10,led_mode.LONG_LIGHT_RED,4,2,led_mode.CHARGE_IN_MODE] - EventMesh.publish("set_led_time_arg",str_buf)# - if flag == 0 and self.fall_flag == 0:#电话通话中 或者呼叫中挂断中断 - EventMesh.publish("close_timer_all")# - self.aud.stop() - self.aud.play(1,1,'U:/static/R_CHARGE_IN.mp3') - # str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_CHARGE_IN")) - # EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data) - EventMesh.debug_log("charge R_CHARGE_IN") - - - elif msg == 2: - self.usbState = msg - EventMesh.publish("stop_led_timer")#设置参数 - EventMesh.publish("set_led_time_arg",[1,1,0,led_mode.FLASH_LIGHT_GREEN,4,4,led_mode.CHARGE_OUT_MODE])#測量成功 - EventMesh.debug_log("charge R_CHARGE_OUT") - if flag == 0 and self.fall_flag == 0:#电话通话中 或者呼叫中挂断中断 - EventMesh.publish("close_timer_all")# - self.aud.stop() - self.aud.play(1,1,'U:/static/R_CHARGE_OUT.mp3') - # str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_CHARGE_OUT")) - # EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data) - + if DEBUG == 0: + if msg == 1: + if get_hr_state != None and get_spo2_state != None and get_bp_state != None and get_bg_state != None and get_temp_state != None: + if get_hr_state != 0: + + EventMesh.publish("set_hr_state",0)#2代表后台进入测试,定时测心率 1ui界面测试洗心率 + if get_hr_state == 1: + EventMesh.publish("stop_led_timer")#设置参数 + EventMesh.publish("set_start_measure_time",0)#设置开始测量的时间戳时间 + + EventMesh.debug_log("stop debug8") + EventMesh.publish(constants.EVENT.STOP_HEART) + if get_spo2_state != 0: + EventMesh.publish("set_spo2_state",0)#2代表后台进入测试 + if get_spo2_state == 1: + EventMesh.publish("stop_led_timer")#设置参数 + EventMesh.publish(constants.EVENT.STOP_BLOOD_OXYGEN) + EventMesh.debug_log("stop debug13") + if get_bp_state != 0: + EventMesh.publish("set_bp_state",0)#2代表后台进入测试 + if get_bp_state == 1: + EventMesh.publish("stop_led_timer")#设置参数 + EventMesh.publish(constants.EVENT.STOP_HEART) + EventMesh.debug_log("stop bp debug1") + if get_bg_state != 0: + EventMesh.publish("set_bg_state",0)#2代表后台进入测试 + if get_bg_state == 1:#手动开灯关闭灯 + EventMesh.publish("stop_led_timer")#设置参数 + EventMesh.publish(constants.EVENT.STOP_HEART) + EventMesh.debug_log("stop BG debug14") + if get_temp_state != 0: + + EventMesh.publish("set_temp_state",0)#2代表后台进入测试 + if get_temp_state == 1: + EventMesh.publish("stop_led_timer")#设置参数 + EventMesh.publish("set_start_temp_measure_time",0)# + EventMesh.publish(constants.EVENT.STOP_TEMP) + EventMesh.debug_log("stop temp debug14") + if msg == 1: + self.usbState = msg + str_buf = [1,1,10,led_mode.LONG_LIGHT_RED,4,2,led_mode.CHARGE_IN_MODE] + EventMesh.publish("set_led_time_arg",str_buf)# + if flag == 0 and self.fall_flag == 0:#电话通话中 或者呼叫中挂断中断 + EventMesh.publish("close_timer_all")# + self.aud.stop() + self.aud.play(1,1,'U:/static/R_CHARGE_IN.mp3') + # str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_CHARGE_IN")) + # EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data) + EventMesh.debug_log("charge R_CHARGE_IN") + + + elif msg == 2: + self.usbState = msg + EventMesh.publish("stop_led_timer")#设置参数 + # EventMesh.publish("set_led_time_arg",[1,1,0,led_mode.FLASH_LIGHT_GREEN,4,4,led_mode.CHARGE_OUT_MODE])#測量成功 + EventMesh.debug_log("charge R_CHARGE_OUT") + if flag == 0 and self.fall_flag == 0:#电话通话中 或者呼叫中挂断中断 + EventMesh.publish("close_timer_all")# + self.aud.stop() + self.aud.play(1,1,'U:/static/R_CHARGE_OUT.mp3') + # str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_CHARGE_OUT")) + # EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data) + - elif msg == 3: - self.usbState = msg - EventMesh.debug_log("charge full") - str_buf = [1,1,10,led_mode.LONG_LIGHT_GREEN,4,2,led_mode.CHARGE_FULL_MODE] - EventMesh.publish("set_led_time_arg",str_buf)# - # if flag == 0 and self.fall_flag == 0:#电话通话中 或者呼叫中挂断中断 - # EventMesh.publish("close_timer_all")# - # str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_CHARGE_FULL")) - # EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data) - + elif msg == 3: + self.usbState = msg + EventMesh.debug_log("charge full") + str_buf = [1,1,10,led_mode.LONG_LIGHT_GREEN,4,2,led_mode.CHARGE_FULL_MODE] + EventMesh.publish("set_led_time_arg",str_buf)# + # if flag == 0 and self.fall_flag == 0:#电话通话中 或者呼叫中挂断中断 + # EventMesh.publish("close_timer_all")# + # str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_CHARGE_FULL")) + # EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data) + def get_usb(self, event, msg): @@ -1225,12 +1325,14 @@ if EventMesh.model == "D10" : EventMesh.publish("close_hr_sop2")# # EventMesh.debug_log("power_off_audio_cb") self.aud.stop() + self.aud.play(1,0,'U:/static/R_POWER_OFF_1.mp3') # str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_POWER_OFF_1")) # EventMesh.publish("play_audio_file",[str_data,0])#获取播放音频文件('U:/static/audio.bin',1,1,str_data) EventMesh.publish("set_led_time_arg",[1,2,6*8,led_mode.FLASH_LIGHT_RED,6,3,led_mode.POWER_OFF_MODE])# self.power_off = 1 self.pwk_timer2.start(6000,0,self.publish_power_down_event_cb) + Power.powerDown() elif msg == 3: flag = EventMesh.publish("get_call_state") if flag != 0:#电话呼叫中 @@ -1238,6 +1340,8 @@ if EventMesh.model == "D10" : voiceCall.callEnd() EventMesh.publish("close_hr_sop2")# self.aud.stop() + self.a.aud_tone_play_stop() + EventMesh.publish("AI_key_release") self.aud.play(1,0,'U:/static/R_POWER_OFF_1.mp3') # str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_POWER_OFF_1")) # EventMesh.publish("play_audio_file",[str_data,0])#获取播放音频文件('U:/static/audio.bin',1,1,str_data) @@ -1314,7 +1418,7 @@ if EventMesh.model == "D10" : self.aud.play(1,1,'U:/static/R_POWER_OFF_1.mp3') # str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_POWER_OFF_1")) # EventMesh.publish("play_audio_file",[str_data,0])#获取播放音频文件('U:/static/audio.bin',1,1,str_data) - EventMesh.publish("set_led_time_arg",[1,2,6*8,led_mode.FLASH_LIGHT_GREEN,6,3,led_mode.OTHER_MEASURE_MODE])#測量成功 + EventMesh.publish("set_led_time_arg",[1,2,6*8,led_mode.FLASH_LIGHT_GREEN,6,3,led_mode.OTHER_MEASURE_MODE]) # EventMesh.publish("set_led_time_arg",[1000,200,10,led_mode.FLASH_LIGHT_GREEN,led_mode.DEFAULT_LONG_LIGHT_MODE,led_mode.OTHER_MEASURE_MODE])#设置参数 self.power_on_flag = 0 self.pwk_timer2.start(5000,0,self.power_on_cb) @@ -1352,17 +1456,26 @@ if EventMesh.model == "D10" : get_bp_state = EventMesh.publish("get_bp_state") if get_hr_state != None and get_spo2_state != None and get_temp_state != None and get_bg_state != None and get_bp_state != None: if get_hr_state != 0: + print("结束心率测量") EventMesh.publish("set_hr_state",0)#2代表后台进入测试,定时测心率 1ui界面测试洗心率 EventMesh.debug_log("sstop hr") EventMesh.publish(constants.EVENT.STOP_HEART) + EventMesh.publish("AI_client_VC_synevent","结束心率测量")#用TTS读 + close_all_ledm() if get_spo2_state != 0 : + print("结束血氧测量") EventMesh.debug_log("stop spo2") EventMesh.publish("set_spo2_state",0)#2代表后台进入测试 EventMesh.publish(constants.EVENT.STOP_BLOOD_OXYGEN) + EventMesh.publish("AI_client_VC_synevent","结束血氧测量")#用TTS读 + close_all_ledm() if get_temp_state != 0: + print("结束温度测量") EventMesh.debug_log("stop temp") EventMesh.publish("set_temp_state",0) EventMesh.publish(constants.EVENT.STOP_TEMP)#手动体温测试 + EventMesh.publish("AI_client_VC_synevent","结束温度测量")#用TTS读 + close_all_ledm() if get_bg_state != 0: EventMesh.publish("set_bg_state",0)#2代表后台进入测试,定时测心率 1ui界面测试洗心率 EventMesh.debug_log("sstop bg") @@ -1379,33 +1492,43 @@ if EventMesh.model == "D10" : get_temp_state = EventMesh.publish("get_temp_state") if msg == 1: if get_hr_state != 1:#不是手动测试直接打断 + # EventMesh.publish("set_led_time_arg",[1,2,900,led_mode.FLASH_LIGHT_GREEN,60,30,led_mode.HR_MEASURE_MODE]) EventMesh.debug_log("set_manual_measure_mode",msg) EventMesh.publish("set_spo2_state",0) EventMesh.publish("set_bg_state",0) EventMesh.publish("set_bp_state",0) - EventMesh.publish("set_hr_state",1) EventMesh.publish("clear_manual_hr_flag") EventMesh.publish("set_start_measure_time",1)#设置开始测量的时间戳时间 EventMesh.publish(constants.EVENT.STOP_BLOOD_OXYGEN) #停止测试血氧 EventMesh.publish("set_hr_blood_led",1) EventMesh.publish(constants.EVENT.START_HEART) #手动心率测试 + # EventMesh.publish("publish_message_event_light",green_light_fast(20,200)) + + elif msg == 2: if get_hr_state == 0: if get_spo2_state != 1: + # EventMesh.publish("set_led_time_arg",[1,2,900,led_mode.FLASH_LIGHT_WHITE,60,30,led_mode.OXYGEN_MEASURE_MODE]) EventMesh.debug_log("set_manual_measure_mode",msg) EventMesh.publish("set_spo2_state",1) EventMesh.publish("set_start_measure_time",1)#设置开始测量的时间戳时间 EventMesh.publish("set_hr_blood_led",1) EventMesh.publish(constants.EVENT.START_BLOOD_OXYGEN) #手动血氧测试 + # # #设置灯光 白灯闪烁 + # EventMesh.publish("publish_message_event_light",white_light_fast(20,200)) + elif msg == 3: if get_temp_state != 1: + # EventMesh.publish("set_led_time_arg",[1,2,900,led_mode.FLASH_LIGHT_RED,60,30,led_mode.TEMP_MEASURE_MODE]) EventMesh.debug_log("set_manual_measure_mode",msg) EventMesh.publish("clear_manual_temp_flag") EventMesh.publish("set_temp_state",1) EventMesh.publish("set_start_temp_measure_time",1)#设置开始测量的时间戳时间 EventMesh.publish("set_hr_blood_led",1) EventMesh.publish(constants.EVENT.START_TEMP)#手动体温测试 + # # #设置灯光 红绿灯交替闪烁 + # EventMesh.publish("publish_message_event_light",red_light_fast(20,200)) pass @@ -1440,7 +1563,7 @@ if EventMesh.model == "D10" : - def play_temp_value(self, event, msg): #播放体温数值 + def play_temp_value(self, event, msg): #获取体温数值 flag = EventMesh.publish("get_call_state") if msg != None: if flag == 0 and self.fall_flag == 0: @@ -1460,7 +1583,11 @@ if EventMesh.model == "D10" : EventMesh.publish("set_hr_blood_led",3)#测量异常 def play_temp_fun(self,argc): #播放体温数值 - data = self.temp_value + data = "{:.1f}".format(self.temp_value) + close_all_ledm() + str_data = "当前体温是" + str(data) + "度" + print(str_data) + EventMesh.publish("AI_client_VC_synevent",str_data)#用TTS读 if data > 42: data = 42 data_tmp = str(data) @@ -1503,7 +1630,7 @@ if EventMesh.model == "D10" : EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data) - def play_hr_value(self, event, msg): #播放心率数值 + def play_hr_value(self, event, msg): #获取心率数值 flag = EventMesh.publish("get_call_state") if msg != None: if flag == 0 and self.fall_flag == 0: @@ -1513,7 +1640,7 @@ if EventMesh.model == "D10" : # EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data) self.hr_value = msg EventMesh.publish("set_hr_blood_led",2)#测量成功 - # self.timer.start(2*1000,1,self.play_hr_fun) + #self.timer.start(2*1000,1,self.play_hr_fun) self.play_hr_fun(0) else: str_data ='mp3files={}.mp3'.format(audio_buf.index("R_HSENSOR_RESULT_FAILE")) @@ -1524,45 +1651,48 @@ if EventMesh.model == "D10" : def play_hr_fun(self,argc):#播放心率测试值 - flag = EventMesh.publish("get_call_state") - + flag = EventMesh.publish("get_call_state") if flag == 0 and self.fall_flag == 0:#电话通话中 或者呼叫中挂断中断 EventMesh.publish("close_timer_all")# + close_all_ledm() data = self.hr_value - if data > 220: - data = 220 - if data < 100: - if data%10 == 0: - str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_HSENSOR_RESULT_HR_TITLE"),audio_buf.index("R_READ_TIME_{}".format(data//10)),\ - audio_buf.index("R_READ_STEP_3")) - EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data) - else: - str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_HSENSOR_RESULT_HR_TITLE"),audio_buf.index("R_READ_TIME_{}".format(data//10)),\ - audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_{}".format(data%10))) - EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data) - else: - shi = (data%100)//10 #210 - ge = (data%100)%10 - #210 234 - if shi > 0: - if ge == 0:#210 230 120 - str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_HSENSOR_RESULT_HR_TITLE"),audio_buf.index("R_READ_TIME_{}".format(data//100)),\ - audio_buf.index("R_READ_STEP_2"),audio_buf.index("R_READ_TIME_{}".format(shi)),audio_buf.index("R_READ_STEP_3")) - EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data) - else: - str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_HSENSOR_RESULT_HR_TITLE"),audio_buf.index("R_READ_TIME_{}".format(data//100)),\ - audio_buf.index("R_READ_STEP_2"),audio_buf.index("R_READ_TIME_{}".format(shi)),audio_buf.index("R_READ_STEP_3"),\ - audio_buf.index("R_READ_TIME_{}".format(ge))) - EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data) - else: - if ge == 0:#200 100 209 108 - str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_HSENSOR_RESULT_HR_TITLE"),audio_buf.index("R_READ_TIME_{}".format(data//100)),\ - audio_buf.index("R_READ_STEP_2")) - EventMesh.publish("play_audio_file",str_data)#获取播放音频文件('U:/static/audio.bin',1,1,str_data) - else: - str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_HSENSOR_RESULT_HR_TITLE"),audio_buf.index("R_READ_TIME_{}".format(data//100)),\ - audio_buf.index("R_READ_STEP_2"),audio_buf.index("R_READ_TIME_0"),audio_buf.index("R_READ_TIME_{}".format(ge))) - EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data) + str_data = "您的心率测试值为" + str(data) + EventMesh.publish("AI_client_VC_synevent",str_data)#用TTS读 + + # if data > 220: + # data = 220 + # if data < 100: + # if data%10 == 0: + # str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_HSENSOR_RESULT_HR_TITLE"),audio_buf.index("R_READ_TIME_{}".format(data//10)),\ + # audio_buf.index("R_READ_STEP_3")) + # EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data) + # else: + # str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_HSENSOR_RESULT_HR_TITLE"),audio_buf.index("R_READ_TIME_{}".format(data//10)),\ + # audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_{}".format(data%10))) + # EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data) + # else: + # shi = (data%100)//10 #210 + # ge = (data%100)%10 + # #210 234 + # if shi > 0: + # if ge == 0:#210 230 120 + # str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_HSENSOR_RESULT_HR_TITLE"),audio_buf.index("R_READ_TIME_{}".format(data//100)),\ + # audio_buf.index("R_READ_STEP_2"),audio_buf.index("R_READ_TIME_{}".format(shi)),audio_buf.index("R_READ_STEP_3")) + # EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data) + # else: + # str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_HSENSOR_RESULT_HR_TITLE"),audio_buf.index("R_READ_TIME_{}".format(data//100)),\ + # audio_buf.index("R_READ_STEP_2"),audio_buf.index("R_READ_TIME_{}".format(shi)),audio_buf.index("R_READ_STEP_3"),\ + # audio_buf.index("R_READ_TIME_{}".format(ge))) + # EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data) + # else: + # if ge == 0:#200 100 209 108 + # str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_HSENSOR_RESULT_HR_TITLE"),audio_buf.index("R_READ_TIME_{}".format(data//100)),\ + # audio_buf.index("R_READ_STEP_2")) + # EventMesh.publish("play_audio_file",str_data)#获取播放音频文件('U:/static/audio.bin',1,1,str_data) + # else: + # str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_HSENSOR_RESULT_HR_TITLE"),audio_buf.index("R_READ_TIME_{}".format(data//100)),\ + # audio_buf.index("R_READ_STEP_2"),audio_buf.index("R_READ_TIME_0"),audio_buf.index("R_READ_TIME_{}".format(ge))) + # EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data) def play_sugar_value(self, event, msg): #播放血糖数值 @@ -1597,17 +1727,14 @@ if EventMesh.model == "D10" : else: data_shi = int(data) data_ge = 0 - - if data_shi != 0 and data_ge != 0: - str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_BLOOD_SUGAR"),audio_buf.index("R_READ_TIME_{}".format(data_shi)),\ - audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT"),audio_buf.index("R_READ_TIME_{}".format(data_ge))) - EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data) + str_data = "您的血糖测试值为" + data + EventMesh.publish("AI_client_VC_synevent",str_data)#用TTS读 else: EventMesh.publish("set_hr_blood_led",3)#测量异常 - def play_spo2_value(self, event, msg): #播放血样数值 + def play_spo2_value(self, event, msg): #获取血氧数值 flag = EventMesh.publish("get_call_state") if msg != None: if flag == 0 and self.fall_flag == 0: @@ -1617,6 +1744,8 @@ if EventMesh.model == "D10" : # EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data) EventMesh.publish("set_hr_blood_led",2)#测量成功 self.spo2_value = msg + str_data = "血氧数值为" + str(self.spo2_value) + EventMesh.publish("AI_client_VC_synevent",str_data)#用TTS读 # self.timer.start(2*1000,1,self.play_spo2_fun) self.play_spo2_fun(0) else: @@ -1628,26 +1757,12 @@ if EventMesh.model == "D10" : def play_spo2_fun(self,argc):#播放血氧测试值 flag = EventMesh.publish("get_call_state") - if flag == 0 and self.fall_flag == 0:#电话通话中 或者呼叫中挂断中断 EventMesh.publish("close_timer_all")# + close_all_ledm() data = self.spo2_value - if data > 100: - data = 100 - if data == 100: - str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_HSENSOR_SPO2_TITLE"),audio_buf.index("R_READ_TIME_{}".format(data//10)),\ - audio_buf.index("R_READ_STEP_2")) - EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data) - else: - if data % 10 == 0: - str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_HSENSOR_SPO2_TITLE"),audio_buf.index("R_READ_TIME_{}".format(data//10)),\ - audio_buf.index("R_READ_STEP_3")) - EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data) - pass - else: - str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_HSENSOR_SPO2_TITLE"),audio_buf.index("R_READ_TIME_{}".format(data//10)),\ - audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_{}".format(data%10))) - EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data) + str_data = "您的血氧测试值为" + str(data) + EventMesh.publish("AI_client_VC_synevent",str_data)#用TTS读 def set_sim_mode(self, event, msg): #mode 1 蓝灯闪烁 可识别卡 但未联网 2 可绑定appsim正常 3 手表不识别卡或者未插卡 @@ -1669,17 +1784,20 @@ if EventMesh.model == "D10" : EventMesh.publish("set_led_time_arg",[1,2,10,led_mode.FLASH_LIGHT_WHITE,10,5,led_mode.OTHER_MEASURE_MODE])#測量成功 # EventMesh.publish("set_led_time_arg",[1000,400,1,led_mode.FLASH_LIGHT_WHITE,led_mode.DEFAULT_LONG_LIGHT_MODE,led_mode.OTHER_MEASURE_MODE])#设置参数 str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_SIM_FAILE")) + #EventMesh.publish("AI_client_VC_synevent",str_data)#用TTS读 EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data) pass elif mode == 2:#蓝灯色灯 EventMesh.publish("set_led_time_arg",[1,2,10,led_mode.FLASH_LIGHT_GREEN,10,5,led_mode.OTHER_MEASURE_MODE])#測量成功 # EventMesh.publish("set_led_time_arg",[1000,400,1,led_mode.FLASH_LIGHT_GREEN,led_mode.DEFAULT_LONG_LIGHT_MODE,led_mode.OTHER_MEASURE_MODE])#设置参数 str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_SIM_CONNECT")) + #EventMesh.publish("AI_client_VC_synevent",str_data)#用TTS读 EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data) pass elif mode == 3:#红灯闪烁 EventMesh.publish("set_led_time_arg",[1,2,10,led_mode.FLASH_LIGHT_RED,10,5,led_mode.OTHER_MEASURE_MODE])#測量成功 str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_NO_SIM")) + #EventMesh.publish("AI_client_VC_synevent",str_data)#用TTS读 EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data) pass @@ -1700,17 +1818,20 @@ if EventMesh.model == "D10" : else:#未设置sos紧急求助号码 EventMesh.publish("close_timer_all")# str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_NO_SET_SOS_DIAL")) + EventMesh.publish("AI_client_VC_synevent","您还未设置sos紧急求助号码呀!")#用TTS读 EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data) pass else: EventMesh.publish("close_timer_all")# EventMesh.publish("set_led_time_arg",[1,2,10,led_mode.FLASH_LIGHT_WHITE,10,5,led_mode.OTHER_MEASURE_MODE])#測量成功 str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_SIM_FAILE")) + EventMesh.publish("AI_client_VC_synevent","您未联网呀!")#用TTS读 EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data) else:#未插卡 EventMesh.publish("close_timer_all")# EventMesh.publish("set_led_time_arg",[1,2,10,led_mode.FLASH_LIGHT_RED,10,5,led_mode.OTHER_MEASURE_MODE])#測量成功 str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_NO_SIM")) + EventMesh.publish("AI_client_VC_synevent","您未插卡呀!")#用TTS读 EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data) def play_cur_time_event(self, event, msg): #播放当前时间 @@ -1721,6 +1842,9 @@ if EventMesh.model == "D10" : data = RTC().datetime() hour = data[4] min = data[5] + print("读日期") + str_data = "当前时间是" + str(hour) + "点" + str(min) + "分" + EventMesh.publish("AI_client_VC_synevent",str_data)#用TTS读 # EventMesh.debug_log("hour",hour,min) self.old_hour = hour self.old_min = min @@ -1729,11 +1853,14 @@ if EventMesh.model == "D10" : if self.old_min == 0:#0点整 str_data = 'mp3files={}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_0")\ ,audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT")) + str_data = "现在的时间是:" + #EventMesh.publish("AI_client_VC_synevent",str_data)#用TTS读 EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data) else:#0点09分 str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_0")\ ,audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT"),audio_buf.index("R_READ_TIME_0"),audio_buf.index("R_READ_TIME_{}".format(self.old_min))\ ,audio_buf.index("R_READ_TIME_MIN")) + #EventMesh.publish("AI_client_VC_synevent",str_data)#用TTS读 EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data) pass @@ -1742,12 +1869,14 @@ if EventMesh.model == "D10" : str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_0")\ ,audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT"),audio_buf.index("R_READ_TIME_{}".format(self.old_min // 10))\ ,audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_MIN")) + #EventMesh.publish("AI_client_VC_synevent",str_data)#用TTS读 EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data) pass else:#0点2十8分 str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_0")\ ,audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT"),audio_buf.index("R_READ_TIME_{}".format(self.old_min // 10))\ ,audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_{}".format(self.old_min % 10)),audio_buf.index("R_READ_TIME_MIN")) + #EventMesh.publish("AI_client_VC_synevent",str_data)#用TTS读 EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data) pass @@ -1756,6 +1885,7 @@ if EventMesh.model == "D10" : if self.old_min <= 0: str_data = 'mp3files={}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(self.old_hour))\ ,audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT")) + #EventMesh.publish("AI_client_VC_synevent",str_data)#用TTS读 EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data) pass else: @@ -1769,11 +1899,13 @@ if EventMesh.model == "D10" : str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(self.old_hour))\ ,audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT"),audio_buf.index("R_READ_TIME_{}".format(self.old_min //10))\ ,audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_MIN")) + #EventMesh.publish("AI_client_VC_synevent",str_data)#用TTS读 EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data) else:#9点2十4分 str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(self.old_hour))\ ,audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT"),audio_buf.index("R_READ_TIME_{}".format(self.old_min //10))\ ,audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_{}".format(self.old_min % 10)),audio_buf.index("R_READ_TIME_MIN")) + #EventMesh.publish("AI_client_VC_synevent",str_data)#用TTS读 EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data) @@ -1785,22 +1917,26 @@ if EventMesh.model == "D10" : if self.old_hour == 10:#十点整 str_data = 'mp3files={}.mp3+{}.mp3'.format(audio_buf.index("R_READ_STEP_3")\ ,audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT")) + #EventMesh.publish("AI_client_VC_synevent",str_data)#用TTS读 EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data) elif self.old_hour == 20: str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(hour_shi))\ ,audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT")) + #EventMesh.publish("AI_client_VC_synevent",str_data)#用TTS读 EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data) else: if hour_shi <= 1:#十3点整 str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_STEP_3")\ ,audio_buf.index("R_READ_TIME_{}".format(hour_ge)),audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT")) + #EventMesh.publish("AI_client_VC_synevent",str_data)#用TTS读 EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data) else: str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(hour_shi))\ ,audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_{}".format(hour_ge)),audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT")) + #EventMesh.publish("AI_client_VC_synevent",str_data)#用TTS读 EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data) else: @@ -1809,18 +1945,21 @@ if EventMesh.model == "D10" : str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_STEP_3")\ ,audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT"),audio_buf.index("R_READ_TIME_0")\ ,audio_buf.index("R_READ_TIME_{}".format(self.old_min)),audio_buf.index("R_READ_TIME_MIN")) + #EventMesh.publish("AI_client_VC_synevent",str_data)#用TTS读 EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data) else: if self.old_min % 10 == 0:#十点2十分 str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_STEP_3")\ ,audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT"),audio_buf.index("R_READ_TIME_{}".format(self.old_min//10))\ ,audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_MIN")) + #EventMesh.publish("AI_client_VC_synevent",str_data)#用TTS读 EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data) else:#十点2十1分 str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_STEP_3")\ ,audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT"),audio_buf.index("R_READ_TIME_{}".format(self.old_min//10))\ ,audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_{}".format(self.old_min%10))\ ,audio_buf.index("R_READ_TIME_MIN")) + #EventMesh.publish("AI_client_VC_synevent",str_data)#用TTS读 EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data) else: @@ -1829,6 +1968,7 @@ if EventMesh.model == "D10" : if self.old_min == 0: str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_STEP_3")\ ,audio_buf.index("R_READ_TIME_{}".format(self.old_hour % 10)),audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT")) + #EventMesh.publish("AI_client_VC_synevent",str_data)#用TTS读 EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data) pass else: @@ -1836,6 +1976,7 @@ if EventMesh.model == "D10" : ,audio_buf.index("R_READ_TIME_{}".format(self.old_hour % 10)),audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT")\ ,audio_buf.index("R_READ_TIME_0"),audio_buf.index("R_READ_TIME_{}".format(self.old_min % 10))\ ,audio_buf.index("R_READ_TIME_MIN")) + #EventMesh.publish("AI_client_VC_synevent",str_data)#用TTS读 EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data) else:#19:18 19:40 19:56 @@ -1843,12 +1984,14 @@ if EventMesh.model == "D10" : str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_STEP_3")\ ,audio_buf.index("R_READ_TIME_{}".format(self.old_hour % 10)),audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT")\ ,audio_buf.index("R_READ_TIME_{}".format(self.old_min // 10)),audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_MIN")) + #EventMesh.publish("AI_client_VC_synevent",str_data)#用TTS读 EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data) else:#十9点2十1分 str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_STEP_3")\ ,audio_buf.index("R_READ_TIME_{}".format(self.old_hour % 10)),audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT")\ ,audio_buf.index("R_READ_TIME_{}".format(self.old_min // 10)),audio_buf.index("R_READ_STEP_3")\ ,audio_buf.index("R_READ_TIME_{}".format(self.old_min % 10)),audio_buf.index("R_READ_TIME_MIN")) + #EventMesh.publish("AI_client_VC_synevent",str_data)#用TTS读 EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data) else: @@ -1864,12 +2007,14 @@ if EventMesh.model == "D10" : if self.old_min == 0: str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(hour_shi))\ ,audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT")) + #EventMesh.publish("AI_client_VC_synevent",str_data)#用TTS读 EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data) pass else: str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(hour_shi))\ ,audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT"),audio_buf.index("R_READ_TIME_0")\ ,audio_buf.index("R_READ_TIME_{}".format(min_ge)),audio_buf.index("R_READ_TIME_MIN")) + #EventMesh.publish("AI_client_VC_synevent",str_data)#用TTS读 EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data) else: @@ -1877,11 +2022,13 @@ if EventMesh.model == "D10" : str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(hour_shi))\ ,audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT"),audio_buf.index("R_READ_TIME_{}".format(min_shi))\ ,audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_MIN")) + #EventMesh.publish("AI_client_VC_synevent",str_data)#用TTS读 EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data) else:#2十点2十1分 str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(hour_shi))\ ,audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT"),audio_buf.index("R_READ_TIME_{}".format(min_shi))\ ,audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_{}".format(min_ge)),audio_buf.index("R_READ_TIME_MIN")) + #EventMesh.publish("AI_client_VC_synevent",str_data)#用TTS读 EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data) else:#21:08 21:18 @@ -1890,6 +2037,7 @@ if EventMesh.model == "D10" : str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(hour_shi))\ ,audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_{}".format(hour_ge))\ ,audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT")) + #EventMesh.publish("AI_client_VC_synevent",str_data)#用TTS读 EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data) pass else: @@ -1897,6 +2045,7 @@ if EventMesh.model == "D10" : ,audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_{}".format(hour_ge))\ ,audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT"),audio_buf.index("R_READ_TIME_0")\ ,audio_buf.index("R_READ_TIME_{}".format(min_ge)),audio_buf.index("R_READ_TIME_MIN")) + #EventMesh.publish("AI_client_VC_synevent",str_data)#用TTS读 EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data) else: if min_ge == 0:#2十3点3十分 @@ -1904,12 +2053,14 @@ if EventMesh.model == "D10" : ,audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_{}".format(hour_ge))\ ,audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT"),audio_buf.index("R_READ_TIME_{}".format(min_shi))\ ,audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_MIN")) + #EventMesh.publish("AI_client_VC_synevent",str_data)#用TTS读 EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data) else:#2十3点3十1分 str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(hour_shi))\ ,audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_{}".format(hour_ge))\ ,audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT"),audio_buf.index("R_READ_TIME_{}".format(min_shi))\ ,audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_{}".format(min_ge)),audio_buf.index("R_READ_TIME_MIN")) + #EventMesh.publish("AI_client_VC_synevent",str_data)#用TTS读 EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data) @@ -1932,6 +2083,7 @@ if EventMesh.model == "D10" : else:#未设置号码 # EventMesh.debug_log("play_center_phone") str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_NO_SET_SOS_DIAL")) + EventMesh.publish("AI_client_VC_synevent","您还没设置号码")#用TTS读 EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data) pass def center_phone_cb(self,*argc): #msg @@ -1945,12 +2097,15 @@ if EventMesh.model == "D10" : if flag == 0 and self.fall_flag == 0:#电话通话中 或者呼叫中挂断中断 EventMesh.publish("close_timer_all")# imei = EventMesh.publish(constants.EVENT.GET_IMEI) + str_data = "当前设备号为" + imei + EventMesh.publish("AI_client_VC_synevent",str_data)#用TTS读 EventMesh.debug_log(imei) str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(imei[0]))\ ,audio_buf.index("R_READ_TIME_{}".format(imei[1])),audio_buf.index("R_READ_TIME_{}".format(imei[2])),audio_buf.index("R_READ_TIME_{}".format(imei[3])),\ audio_buf.index("R_READ_TIME_{}".format(imei[4])),audio_buf.index("R_READ_TIME_{}".format(imei[5])),audio_buf.index("R_READ_TIME_{}".format(imei[6])),audio_buf.index("R_READ_TIME_{}".format(imei[7])),\ audio_buf.index("R_READ_TIME_{}".format(imei[8])),audio_buf.index("R_READ_TIME_{}".format(imei[9])),audio_buf.index("R_READ_TIME_{}".format(imei[10])),audio_buf.index("R_READ_TIME_{}".format(imei[11])),\ audio_buf.index("R_READ_TIME_{}".format(imei[12])),audio_buf.index("R_READ_TIME_{}".format(imei[13])),audio_buf.index("R_READ_TIME_{}".format(imei[14]))) + EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data) @@ -2161,6 +2316,7 @@ if EventMesh.model == "D10" : #播放音频文件 EventMesh.publish("close_timer_all") str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_UNREAD_WECHAT")) + #EventMesh.publish("AI_client_VC_synevent",str_data) EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data) else: self.updateTime = 0 @@ -2191,6 +2347,7 @@ if EventMesh.model == "D10" : self.wechatKey_timer = osTimer() self.wechatKey_count = 0 self.wechatKey_press = 0 + self.wechatKey_long_press = 0 self.sosKey_timer = osTimer() self.sosKey_count = 0 @@ -2218,14 +2375,15 @@ if EventMesh.model == "D10" : self.factoryTest_led_count = 0 self.factoryTest_flag = 0 self.btnInfo_queue = Queue() + _thread.stack_size(10*1024+192) _thread.start_new_thread(self.btnInfo_queue_thread, ()) _thread.stack_size(8*1024) - - EventMesh.subscribe("publish_message_event_btnInfo",self.publish_message_event_btnInfo) + EventMesh.subscribe("publish_message_event_btnInfo",self.publish_message_event_btnInfo) + EventMesh.subscribe("publish_message_event_light",self.publish_message_event_light) EventMesh.subscribe("close_wechat_btn_timer", self.close_wechat_btn_timer)#来电强制关闭微聊语音 - + EventMesh.subscribe("get_AIKey_long", self.get_AIKey_long)#判断长按 def btnInfo_queue_thread(self): while True: data = self.btnInfo_queue.get() @@ -2239,7 +2397,10 @@ if EventMesh.model == "D10" : def publish_message_event_btnInfo(self,event,msg): self.btnInfo_queue.put(msg) EventMesh.publish(constants.EVENT.SYSTEM_UP)#唤醒休眠 - + + def publish_message_event_light(self,event,msg): + EventMesh.publish(constants.EVENT.SYSTEM_UP)#唤醒休眠 + def publish_wechat_btn_event_cb(self, *args, **kwargs): EventMesh.publish("publish_message_event_btnInfo",{"func":self.wechatKey_press_cb,"data":0}) @@ -2257,7 +2418,7 @@ if EventMesh.model == "D10" : self.pk.powerKeyEventRegister(self.powerKey_callback) - self.extint = ExtInt(ExtInt.GPIO26, ExtInt.IRQ_RISING_FALLING, ExtInt.PULL_DISABLE, self.pwk_extint_cb) + self.extint = ExtInt(ExtInt.GPIO26, ExtInt.IRQ_RISING_FALLING, ExtInt.PULL_PU, self.pwk_extint_cb) self.extint.enable() self.sosKey = ExtInt(ExtInt.GPIO22, ExtInt.IRQ_RISING_FALLING, ExtInt.PULL_PU, self.sosKey_extint_cb) @@ -2293,6 +2454,7 @@ if EventMesh.model == "D10" : EventMesh.publish("close_wechat_btn_timer") if self.pwkey_press == 0 : self.aud.stop() #播放声音 + # self.a.aud_tone_play_stop() # self.wechatKey_timeout_cb(0) # self.sosKey_timeout_cb(0) self.wechatKey_timer.stop() @@ -2310,6 +2472,7 @@ if EventMesh.model == "D10" : self.pwkey_count = 0 self.led_state = 0 self.pwkey_timer.start(100, 1, self.publish_pwkKey_btn_event_cb) + # EventMesh.debug_log("key22_extint_cb:self.key22_timer.start!!!!\n") def pwKey_press_cb(self, data): @@ -2323,14 +2486,16 @@ if EventMesh.model == "D10" : self.pwkey_press = 0 self.led_state = 0 self.pwKey_press_count=0 + # EventMesh.publish("pwk_key_release") return self.GPIO26_status = self.extint.read_level() if self.pwkey_press == 1 : self.pwkey_count += 1 + print("self.pwkey_count = ",self.pwkey_count) if self.pwkey_count > 5: if self.led_state == 0: self.led_state = 1 - EventMesh.publish("set_led_time_arg",[1,1,330,led_mode.LONG_LIGHT_GREEN,2,1,led_mode.OTHER_MEASURE_MODE])#測量成功 + # EventMesh.publish("set_led_time_arg",[1,1,330,led_mode.LONG_LIGHT_GREEN,2,1,led_mode.OTHER_MEASURE_MODE])#測量成功 if self.pwkey_count >= 10*10: EventMesh.publish("stop_led_timer")#设置参数 self.pwkey_timer.stop() @@ -2345,15 +2510,15 @@ if EventMesh.model == "D10" : return if self.pwkey_count >= 3*10 : - if EventMesh.publish("get_sim_Status") != 1: + if EventMesh.publish("get_sim_Status") != -1: EventMesh.debug_log("长3秒关机") EventMesh.publish("stop_led_timer")#设置参数 - self.pwkey_timer.stop() self.pwkey_count = 0 self.pwkey_press = 0 self.pwKey_press_count = 0 self.led_state = 0 EventMesh.publish("open_power_on", 2)# + return @@ -2365,7 +2530,7 @@ if EventMesh.model == "D10" : self.pwkey_press = 0 self.led_state = 0 self.pwKey_press_count+=1 - self.pwkey_timer.start(500, 0, self.publish_pwKey_timeout_cb_do)#松手超时1s判断 + self.pwkey_timer.start(500, 0, self.publish_pwKey_timeout_cb_do)#松手超时1s判断 def hsensorTest_timer_cb(self,e): EventMesh.publish("system_sleep_rest")#防止黑屏 @@ -2383,6 +2548,7 @@ if EventMesh.model == "D10" : EventMesh.debug_log("c_data:{} {} {} {}".format(c_data[11],c_data[12],c_data[13],c_data[14])) if c_data[11] != 0 and c_data[13] != 0: #校准成功 str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_HSENSOR_RESULT_OK")) + EventMesh.publish("AI_client_VC_synevent","校准成功")#用TTS读 EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data) self.Hsensor.close() self.Hsensor.init() @@ -2393,6 +2559,7 @@ if EventMesh.model == "D10" : self.Hsensor.init(); self.hsensorTest_timer.stop() str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_HSENSOR_RESULT_FAILE")) + EventMesh.publish("AI_client_VC_synevent","超时了,请重试噢")#用TTS读 EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data) def publish_pwKey_timeout_cb_do(self, *args, **kwargs): @@ -2403,7 +2570,7 @@ if EventMesh.model == "D10" : try : if boot_count < 50 :#开机50秒内按键次数大于10就校准 #EventMesh.debug_log("boot_count:{}".format(boot_count)) - if self.pwKey_press_count >= 6: + if self.pwKey_press_count >= 10: self.Hsensor = EventMesh.publish("get_Hsensor") self.hsensorTest_timer.start(1000,1,self.hsensorTest_timer_cb) EventMesh.debug_log("打开校准模式") @@ -2414,6 +2581,7 @@ if EventMesh.model == "D10" : self.hsensorTest_timer_count = 50 self.hsensorTest_timer.start(1000,1,self.hsensorTest_timer_cb) str_data = 'mp3files={}.mp3+{}.mp3'.format(audio_buf.index("R_HSENSOR_RESULT_HR_TITLE"),audio_buf.index("R_HSENSOR_SPO2_TITLE"),) + EventMesh.publish("AI_client_VC_synevent","打开校准模式")#用TTS读 EventMesh.publish("play_audio_file",[str_data,1]) self.pwKey_press_count = 0 return @@ -2450,6 +2618,7 @@ if EventMesh.model == "D10" : # EventMesh.publish("dialing_out_event")#电话呼叫中voiceCall.callEnd() # EventMesh.debug_log("pwKey_timeout_cb:self.pwKey_press_count >= 1") + flag = EventMesh.publish("get_call_state") if flag != 2: EventMesh.publish("stop_led_timer")#设置参数 @@ -2462,9 +2631,10 @@ if EventMesh.model == "D10" : EventMesh.publish("set_sos_num",0) EventMesh.publish("set_hangup_mode",0) EventMesh.publish("close_hr_sop2")# + EventMesh.publish("pwk_key_release") flag = EventMesh.publish("get_call_state") - if flag != 1: - EventMesh.publish("set_sim_mode")# + # if flag != 1: + # EventMesh.publish("set_sim_mode")# self.pwKey_press_count = 0 @@ -2647,14 +2817,18 @@ if EventMesh.model == "D10" : elif self.sosKey_press_count == 5:#功能暂时屏蔽 self.sosKey_press_count = 0 call_state = EventMesh.publish("get_call_state") - battery = EventMesh.publish("screen_get_battery") + battery = EventMesh.publish("get_usb_state") + print("usb_state=",battery) if call_state == None: call_state = 0 if call_state == 0: - if battery != None: - if battery[0] != "1":#在充电得时候 - EventMesh.publish("stop_led_timer")#设置参数 - EventMesh.publish("set_manual_measure_mode",3)#测量体温 + if battery != 1:#在充电得时候 + EventMesh.publish("stop_led_timer")#设置参数、 + print("测量体温") + EventMesh.publish("AI_client_VC_synevent","开始体温测量,请稍等")#用TTS读 + EventMesh.publish("set_manual_measure_mode",3)#测量体温 + else: + EventMesh.publish("AI_client_VC_synevent","体温测量失败,请不要充电时测量噢")#用TTS读 pass elif self.sosKey_press_count == 4:#拨打app快捷号码 self.sosKey_press_count = 0 @@ -2666,14 +2840,16 @@ if EventMesh.model == "D10" : self.sosKey_press_count = 0 call_state = EventMesh.publish("get_call_state") - battery = EventMesh.publish("screen_get_battery") + battery = EventMesh.publish("get_usb_state") if call_state == None: call_state = 0 if call_state == 0: - if battery != None: - if battery[0] != "1":#在充电得时候 - EventMesh.publish("stop_led_timer")#设置参数 - EventMesh.publish("set_manual_measure_mode",1)# + if battery != 1:#在充电得时候 + EventMesh.publish("stop_led_timer")#设置参数 + EventMesh.publish("AI_client_VC_synevent","开始心率测量,请稍等")#用TTS读 + EventMesh.publish("set_manual_measure_mode",1)# + else: + EventMesh.publish("AI_client_VC_synevent","心率测量失败,请不要充电时测量噢")#用TTS读 pass elif self.sosKey_press_count == 2:#播报当前步数 self.sosKey_press_count = 0 @@ -2724,7 +2900,10 @@ if EventMesh.model == "D10" : self.wechatKey_press = 1 self.led_state = 0 self.wechatKey_count = 0 - self.wechat_state = 0 + self.wechat_state = 0 + EventMesh.publish("AI_key_press") + str_buf = [1,2,10*70*2,led_mode.LONG_LIGHT_ALL,10,5,led_mode.HEALTH_LED_MODE]#測量成功 + EventMesh.publish("open_timer",str_buf) self.wechatKey_timer.start(100, 1, self.publish_wechat_btn_event_cb) else: # EventMesh.debug_log('### wechatKey_extint_cb end') @@ -2755,8 +2934,8 @@ if EventMesh.model == "D10" : if wechat_time <= 0: wechat_time = 0 EventMesh.publish("send_wechat_record",wechat_time)#发送录音文件内容 - + def wechatKey_press_cb(self,data): open_power = EventMesh.publish("get_power_on_state")#获取开机标识 open_power_off = EventMesh.publish("get_power_off_state")#获取开机标识 @@ -2788,63 +2967,66 @@ if EventMesh.model == "D10" : if self.WeChatKey_status == 0: if EventMesh.publish(constants.EVENT.GET_CONNECT) == 1:#未联网不需要录音 if self.wechat_state == 0:#按下超过s开始录音 - EventMesh.publish("start_wechat_record")#开始录音 - self.wechat_state = 1 + EventMesh.publish("AI_key_long_press") + # self.wechatKey_long_press = 1#标志位变为长按1 else: self.wechat_state = 0 self.wechatKey_timer.stop() self.wechatKey_count = 0 self.wechatKey_press = 0 self.wechatKey_press_count=0 + self.wechatKey_long_press = 0#标志位变为0 EventMesh.publish("set_sim_mode")#播報imei号 return - if self.WeChatKey_status == 0:#未松手超过15s啧停止录音 - if self.wechat_state == 1: - if tmp != None: - if tmp[0] != 0: - time_sec = tmp[1] - if time_tmp - time_sec >= 15: - wechat_time = time_tmp - time_sec - if wechat_time >= 15: - wechat_time = 15 - EventMesh.publish("send_wechat_record",wechat_time)#发送录音文件内容 + # if self.WeChatKey_status == 0:#未松手超过15s啧停止录音 + # if self.wechat_state == 1: + # if tmp != None: + # if tmp[0] != 0: + # time_sec = tmp[1] + # if time_tmp - time_sec >= 15: + # wechat_time = time_tmp - time_sec + # if wechat_time >= 15: + # wechat_time = 15 + # EventMesh.publish("send_wechat_record",wechat_time)#发送录音文件内容 - self.wechatKey_timer.stop() - self.wechatKey_count = 0 - self.wechatKey_press = 0 - self.wechat_state = 0 - self.wechatKey_press_count=0 - return - else: - if self.WeChatKey_status == 1: - if self.wechat_state == 1:#如果按下时长超过1s且小于长按的时间也认为是录微聊 - if tmp != None: - if tmp[0] != 0: - time_sec = tmp[1] - wechat_time = time_tmp - time_sec - # EventMesh.debug_log("WECHAT TIEM",time_tmp,time_sec,wechat_time) - if wechat_time >= 15: - wechat_time = 15 + # self.wechatKey_timer.stop() + # self.wechatKey_count = 0 + # self.wechatKey_press = 0 + # self.wechat_state = 0 + # self.wechatKey_press_count=0 + # return + # else: + # if self.WeChatKey_status == 1: + # if self.wechat_state == 1:#如果按下时长超过1s且小于长按的时间也认为是录微聊 + # if tmp != None: + # if tmp[0] != 0: + # time_sec = tmp[1] + # wechat_time = time_tmp - time_sec + # # EventMesh.debug_log("WECHAT TIEM",time_tmp,time_sec,wechat_time) + # if wechat_time >= 15: + # wechat_time = 15 - EventMesh.publish("send_wechat_record",wechat_time)#发送录音文件内容 - self.wechatKey_timer.stop() - - self.wechatKey_count = 0 - self.wechatKey_press = 0 - self.wechat_state = 0 - self.wechatKey_press_count=0 - return + # EventMesh.publish("send_wechat_record",wechat_time)#发送录音文件内容 + # self.wechatKey_timer.stop() + + # self.wechatKey_count = 0 + # self.wechatKey_press = 0 + # self.wechat_state = 0 + # self.wechatKey_press_count=0 + # return else: self.wechatKey_timer.stop() self.wechatKey_count = 0 self.wechat_state = 0 self.wechatKey_press = 0 self.wechatKey_press_count=0 + self.wechatKey_long_press = 0#标志位变为0 return if self.WeChatKey_status == 1:#松开 if self.wechatKey_count >= 1: #防抖100ms # EventMesh.debug_log("WeChat time!!!!!!!!!!!!!!") + EventMesh.publish("AI_key_release") self.wechatKey_timer.stop() self.wechatKey_count = 0 self.wechatKey_press = 0 @@ -2895,30 +3077,38 @@ if EventMesh.model == "D10" : EventMesh.publish("call_phonebook_num",2) pass elif self.wechatKey_press_count == 2:#拨打通讯录号码一 + EventMesh.publish("stop_led_timer")#设置参数 self.wechatKey_press_count = 0 EventMesh.publish("call_phonebook_num",1) # EventMesh.publish("interup_call_event")# pass - elif self.wechatKey_press_count == 1:#播放最后收到的语音 + elif self.wechatKey_press_count == 1:#开始说话 self.wechatKey_press_count = 0 + print("说话") EventMesh.publish("stop_led_timer")#设置参数 call_state = EventMesh.publish("get_call_state") + self.wechatKey_long_press = 0#标志位变为0 if call_state == 0: fall_down = EventMesh.publish("get_fall_down_state")#跌倒报警标识 if fall_down != None: if fall_down != 0: - EventMesh.publish_async("dial_sos_phone")#拨打sos号码 + EventMesh.publish_async("dia" + "l_sos_phone")#拨打sos号码 return else: if call_state == 2:#电话拨进需要接听 EventMesh.publish("answer_call_event")#接听电话 + EventMesh.publish("pwk_key_release")#接听电话同时不ai return EventMesh.publish("play_wechat_last_amr") # pass self.wechatKey_press_count = 0 - - + def get_AIKey_long(self): + return self.wechatKey_long_press#标志位变为0 + #AI按键 + def AT_press(self): + EventMesh.publish("AI_key_press") def pwk_press_cb(self, *args): '''KEY2:联动屏幕右下角或返回键长按关机''' if self.pwk_press == 1 : diff --git a/2.sdk/project/D10/sdk/services/microPython/ports/quectel/core/btn_device_ec800m_d15.py b/2.sdk/project/D10/sdk/services/microPython/ports/quectel/core/btn_device_ec800m_d15.py index ffec04ca..f2eae682 100644 --- a/2.sdk/project/D10/sdk/services/microPython/ports/quectel/core/btn_device_ec800m_d15.py +++ b/2.sdk/project/D10/sdk/services/microPython/ports/quectel/core/btn_device_ec800m_d15.py @@ -3238,7 +3238,7 @@ if EventMesh.model == "D15" : # EventMesh.publish("set_hangup_mode",0) # EventMesh.publish("close_hr_sop2")# # flag = EventMesh.publish("get_call_state") - # # if flag == 0 or flag == 2:#在拨出去或者通话中就不播报入网成功的语音 + # # if flag == 0 or flag == 2:#在拨出去或者通话中就不播报的语音 # if flag != 1:#在拨出去或者通话中就不播报入网成功的语音 # EventMesh.publish("set_sim_mode")# # EventMesh.publish("dialing_out_event")#电话呼叫中voiceCall.callEnd() diff --git a/2.sdk/project/D10/sdk/services/microPython/ports/quectel/core/constants.py b/2.sdk/project/D10/sdk/services/microPython/ports/quectel/core/constants.py index c21cf835..eb9db866 100644 --- a/2.sdk/project/D10/sdk/services/microPython/ports/quectel/core/constants.py +++ b/2.sdk/project/D10/sdk/services/microPython/ports/quectel/core/constants.py @@ -132,6 +132,12 @@ class PROTOCOL: REMIND_CH_REST_SEND = "REMIND_CH_REST_SEND" REMIND_CH_REST_RECV = "REMIND_CH_REST_RECV" + REMIND_CH_MEET_SEND = "REMIND_CH_MEET_SEND" + REMIND_CH_MEET_RECV = "REMIND_CH_MEET_RECV" + + REMIND_CH_WATER_SEND = "REMIND_CH_WATER_SEND" + REMIND_CH_WATER_RECV = "REMIND_CH_WATER_RECV" + SLEEP_DATA_SEND = "SleepReport_SEND" SLEEP_DATA_RECV = "SleepReport_RECV" diff --git a/2.sdk/project/D10/sdk/services/microPython/ports/quectel/core/led.py b/2.sdk/project/D10/sdk/services/microPython/ports/quectel/core/led.py index a1b19e0e..3dde68f1 100644 --- a/2.sdk/project/D10/sdk/services/microPython/ports/quectel/core/led.py +++ b/2.sdk/project/D10/sdk/services/microPython/ports/quectel/core/led.py @@ -22,6 +22,9 @@ def green_light_fast(num,freq):#快闪 num 循环闪烁次数 freq 交替闪烁 utime.sleep_ms(freq) led_green.write(0) utime.sleep_ms(freq) + get_WeChatKey_status = EventMesh.publish("get_wechat_state") + if get_WeChatKey_status == 1: + break def red_light_fast(num,freq):#快闪 #快闪 num 循环闪烁次数 freq 交替闪烁的频率ms单位 for i in range(num): @@ -29,6 +32,10 @@ def red_light_fast(num,freq):#快闪 #快闪 num 循环闪烁次数 freq 交替 utime.sleep_ms(freq) led_red.write(0) utime.sleep_ms(freq) + get_WeChatKey_status = EventMesh.publish("get_wechat_state") + if get_WeChatKey_status == 1: + break + def red_light_slow(num,freq):#慢闪 #快闪 num 循环闪烁次数 freq 交替闪烁的频率ms单位 for i in range(10): led_red.write(1) @@ -36,6 +43,16 @@ def red_light_slow(num,freq):#慢闪 #快闪 num 循环闪烁次数 freq 交替 led_red.write(0) utime.sleep_ms(500) +def white_light_fast(num,freq):#快闪 #快闪 num 循环闪烁次数 freq 交替闪烁的频率ms单位 + for i in range(num): + led_red.write(1) + utime.sleep_ms(freq) + led_red.write(0) + utime.sleep_ms(freq) + get_WeChatKey_status = EventMesh.publish("get_wechat_state") + if get_WeChatKey_status == 1: + break + def red_green_light(num,freq):#红绿灯交替闪烁 for i in range(num): led_red.write(1) @@ -46,7 +63,12 @@ def red_green_light(num,freq):#红绿灯交替闪烁 utime.sleep_ms(freq) led_green.write(0) utime.sleep_ms(freq) - +def white_green_open():#白绿开灯 + led_green.write(1) + led_white.write(1) +def white_green_close():#白绿关灯 + led_green.write(0) + led_white.write(0) def open_led_red(): led_red.write(1) @@ -65,8 +87,15 @@ def open_led_green(): def close_led_green(): led_green.write(0) +def close_all_ledm():#关闭所有灯 + close_led_green() + close_led_white() + close_led_red() - +def open_all_ledm():#打开所有灯 + open_led_green() + open_led_white() + open_led_red() LED_TIMER_OUT = 100 class led_mode: LONG_LIGHT_RED = 1 @@ -79,6 +108,7 @@ class led_mode: FLASH_LIGHT_RED_WHITE = 8 FLASH_LIGHT_GREEN_WHITE = 9 LIGHT_NONE = FLASH_LIGHT_GREEN_WHITE+1 + LONG_LIGHT_ALL = 11 DEFAULT_LONG_LIGHT_MODE = 0+LIGHT_NONE #默认是关闭 OPEN_LONG_LIGHT_MODE = 1+LIGHT_NONE#开启 @@ -95,8 +125,9 @@ class led_mode: CHARGE_OUT_MODE = 204 #充电已移出 CHARGE_FULL_MODE = 205 #充电已满 POWER_OFF_MODE = 206 #关机模式 - - + HR_MEASURE_MODE = 207 #心率测量模式 + OXYGEN_MEASURE_MODE = 208 #血氧测量模式 + TEMP_MEASURE_MODE = 209 #体温测量模式 @@ -127,6 +158,8 @@ class ledEventManager(Abstract):#灯事件 _thread.start_new_thread(self.ledInfo_queue_thread, ()) _thread.stack_size(8*1024) EventMesh.subscribe("publish_message_event_ledInfo",self.publish_message_event_ledInfo) + EventMesh.subscribe("open_timer",self.open_timer) + pass @@ -184,7 +217,7 @@ class ledEventManager(Abstract):#灯事件 EventMesh.debug_log("set_hr_blood_led :{}".format(msg)) if msg != None: if msg == 1: - EventMesh.publish("set_led_time_arg",[1,2,10*70*2,led_mode.FLASH_LIGHT_RED_GREEN,10,5,led_mode.HEALTH_LED_MODE])#測量成功 + EventMesh.publish("set_led_time_arg",[1,2,10*70*2,led_mode.FLASH_LIGHT_GREEN,10,5,led_mode.HEALTH_LED_MODE])#測量成功 # EventMesh.publish("set_led_time_arg",[1000,200,300,led_mode.FLASH_LIGHT_RED_GREEN,led_mode.DEFAULT_LONG_LIGHT_MODE,led_mode.HEALTH_LED_MODE])#開始測量 elif msg == 2: EventMesh.publish("set_led_time_arg",[1,2,60,led_mode.FLASH_LIGHT_GREEN,60,30,led_mode.OTHER_MEASURE_MODE])#測量成功 @@ -195,7 +228,6 @@ class ledEventManager(Abstract):#灯事件 pass # EventMesh.publish("set_led_time_arg",[1,1,30,led_mode.FLASH_LIGHT_RED,31,10*3,led_mode.OTHER_MEASURE_MODE])#测量失败 #加音频文件 - def set_find_watch_led(self, event, msg): #查找设备 EventMesh.publish("OPEN_FIND_WATCH")# @@ -203,7 +235,7 @@ class ledEventManager(Abstract):#灯事件 def get_led_state(self, event, msg): # return self.timer_state - def open_timer(self,msg): #msg 0 使能 1总的时间 2 灯模式 3 开启时间 4 关闭时间 + def open_timer(self,event=None,msg=None): #msg 0 使能 1灯模式 2 总的时间 4 开启时间 6 关闭时间 if msg != None: if len(msg) != 0: self.led_total_time = msg[2]# @@ -241,68 +273,72 @@ class ledEventManager(Abstract):#灯事件 if power_off == 1: return usb_in = EventMesh.publish("get_usb")# - if msg != None: - if msg[6] != led_mode.POWER_OFF_MODE:#插入usb关机以防不亮红绿灯 - # EventMesh.debug_log("usb_in",usb_in) - if usb_in != None: - if usb_in == 1 or usb_in == 3:#正在充电或者充电已满都不要被打断 - if self.timer_state == 1: - self.timer_state = 0 - self.timer.stop() - if usb_in == 1: - if self.working_led_mode != led_mode.CHARGE_IN_MODE: - str_buf = [1,1,10,led_mode.LONG_LIGHT_RED,4,2,led_mode.CHARGE_IN_MODE] - self.open_timer(str_buf) - self.working_led_mode = led_mode.CHARGE_IN_MODE + if msg[6] != led_mode.POWER_OFF_MODE:#插入usb关机以防不亮红绿灯 + # EventMesh.debug_log("usb_in",usb_in) + if usb_in != None: + if usb_in == 1 or usb_in == 3:#正在充电或者充电已满都不要被打断 + if self.timer_state == 1: + self.timer_state = 0 + self.timer.stop() + if usb_in == 1: + if self.working_led_mode != led_mode.CHARGE_IN_MODE: + str_buf = [1,1,10,led_mode.LONG_LIGHT_RED,4,2,led_mode.CHARGE_IN_MODE] + self.open_timer(str_buf) + print("open_timer1!!!!!!!!!!!!!!!!!!") + self.working_led_mode = led_mode.CHARGE_IN_MODE + + elif usb_in == 3: + if self.working_led_mode != led_mode.CHARGE_FULL_MODE: + str_buf = [1,1,10,led_mode.LONG_LIGHT_GREEN,4,2,led_mode.CHARGE_FULL_MODE] + self.open_timer(str_buf) + print("open_timer2!!!!!!!!!!!!!!!!!!") + self.working_led_mode = led_mode.CHARGE_FULL_MODE + + return + else: + if msg[5] != led_mode.HEALTH_LED_MODE: + self.working_led_mode = led_mode.OTHER_MEASURE_MODE - elif usb_in == 3: - if self.working_led_mode != led_mode.CHARGE_FULL_MODE: - str_buf = [1,1,10,led_mode.LONG_LIGHT_GREEN,4,2,led_mode.CHARGE_FULL_MODE] + get_hr_state = EventMesh.publish("get_hr_state") + get_spo2_state = EventMesh.publish("get_spo2_state") + + wechat_state = EventMesh.publish("get_wechat_state") + temp_state = EventMesh.publish("get_temp_state") + bp_state = EventMesh.publish("get_bp_state") + bg_state = EventMesh.publish("get_bg_state") + if wechat_state != None: #获取微聊状态 + if wechat_state == 1: + if self.working_led_mode != led_mode.WECHAT_LED_MODE:#如果不在亮微聊模式需要亮微聊模式 + self.timer_state = 0 + self.timer.stop() + str_buf = [1,1,1,led_mode.LONG_LIGHT_GREEN,4,2,led_mode.WECHAT_LED_MODE] self.open_timer(str_buf) - self.working_led_mode = led_mode.CHARGE_FULL_MODE - - return - else: - if msg[5] != led_mode.HEALTH_LED_MODE: - self.working_led_mode = led_mode.OTHER_MEASURE_MODE - - get_hr_state = EventMesh.publish("get_hr_state") - get_spo2_state = EventMesh.publish("get_spo2_state") - - wechat_state = EventMesh.publish("get_wechat_state") - temp_state = EventMesh.publish("get_temp_state") - bp_state = EventMesh.publish("get_bp_state") - bg_state = EventMesh.publish("get_bg_state") - EventMesh.debug_log("get_hr_state",get_hr_state,get_spo2_state,temp_state,wechat_state,self.working_led_mode) - if wechat_state != None: #获取微聊状态 - if wechat_state == 1: - if self.working_led_mode != led_mode.WECHAT_LED_MODE:#如果不在亮微聊模式需要亮微聊模式 - self.timer_state = 0 - self.timer.stop() - str_buf = [1,1,1,led_mode.LONG_LIGHT_GREEN,4,2,led_mode.WECHAT_LED_MODE] - self.open_timer(str_buf) - self.working_led_mode = led_mode.WECHAT_LED_MODE - return - else: - return + print("open_timer3!!!!!!!!!!!!!!!!!!") + self.working_led_mode = led_mode.WECHAT_LED_MODE + return else: - self.wechat_btn = 0 - # if get_hr_state != 0 or get_spo2_state != 0 or temp_state != 0 or bp_state != 0 or bg_state != 0 :#心率血氧优先级高 - if get_hr_state == 1 or get_spo2_state == 1 or temp_state == 1 \ - or bp_state == 1 or bg_state == 1: - if self.working_led_mode != led_mode.HEALTH_LED_MODE:#如果不在亮微聊模式需要亮微聊模式 - EventMesh.debug_log("set_hr_blood_led!!!!!!!!!!") - str_buf = [1,2,10*70*2,led_mode.FLASH_LIGHT_RED_GREEN,10,5,led_mode.HEALTH_LED_MODE]#測量成功 + return + else: + self.wechat_btn = 0 + # if get_hr_state != 0 or get_spo2_state != 0 or temp_state != 0 or bp_state != 0 or bg_state != 0 :#心率血氧优先级高 + if get_hr_state == 1 or get_spo2_state == 1 or temp_state == 1 \ + or bp_state == 1 or bg_state == 1: + if self.working_led_mode != led_mode.HEALTH_LED_MODE:#如果不在亮微聊模式需要亮微聊模式 + EventMesh.debug_log("set_hr_blood_led!!!!!!!!!!") + VC_satrt_flag = EventMesh.publish("get_VC_satrt_flag")#获取vc是否在运行 + if VC_satrt_flag == 0: + str_buf = [1,2,10*70*2,led_mode.FLASH_LIGHT_RED_GREEN,10,5,led_mode.HEALTH_LED_MODE]#測量中 self.timer_state = 0 self.timer.stop() self.open_timer(str_buf) + print("open_timer4!!!!!!!!!!!!!!!!!!") self.working_led_mode = led_mode.HEALTH_LED_MODE - return - else: - EventMesh.debug_log("set_hr_blood_led stop!!!!!!!!!!") - return - else:# 0 2都认为其他模式灯亮 不是测试健康灯 - self.working_led_mode = led_mode.OTHER_MEASURE_MODE + return + else: + EventMesh.debug_log("set_hr_blood_led stop!!!!!!!!!!") + return + else:# 0 2都认为其他模式灯亮 不是测试健康灯 + self.working_led_mode = led_mode.OTHER_MEASURE_MODE self.open_timer(msg) @@ -317,7 +353,7 @@ class ledEventManager(Abstract):#灯事件 if call_state != 0: battery = EventMesh.publish("screen_get_battery") if battery != None: - if battery[0] != "1":#在充电得时候 + if battery[0] != "0":#在充电得时候 get_hr_state = EventMesh.publish("get_hr_state") get_spo2_state = EventMesh.publish("get_spo2_state") get_temp_state = EventMesh.publish("get_temp_state") @@ -329,6 +365,7 @@ class ledEventManager(Abstract):#灯事件 EventMesh.publish("close_led_pin") return # EventMesh.debug_log("self.long_count",self.long_count) + # EventMesh.publish("set_led_time_arg",[1,2,10*70*2,led_mode.FLASH_LIGHT_GREEN,10,5,led_mode.HEALTH_LED_MODE])# if self.led_total_time != 0: #红灯闪烁 if self.long_light_mode == led_mode.FLASH_LIGHT_RED :# @@ -341,6 +378,7 @@ class ledEventManager(Abstract):#灯事件 open_led_red() else: EventMesh.publish("stop_led_timer")#关闭所有的灯 + close_all_ledm()#关闭所有的灯 elif self.led_mode == 2: # EventMesh.debug_log("led red!!!!!!!") @@ -354,6 +392,7 @@ class ledEventManager(Abstract):#灯事件 close_led_red() if self.long_count >= self.led_total_time-1:#大于总的时间 4 EventMesh.publish("stop_led_timer")#设置参数 + close_all_ledm()#关闭所有的灯 return self.long_count+=1 #绿灯闪烁 @@ -367,8 +406,8 @@ class ledEventManager(Abstract):#灯事件 close_led_white() open_led_green() else: - EventMesh.publish("stop_led_timer")#关闭所有的灯 - + close_all_ledm()#关闭所有的灯 + EventMesh.publish("stop_led_timer")#设置参数 elif self.led_mode == 2: @@ -385,6 +424,7 @@ class ledEventManager(Abstract):#灯事件 if self.long_count >= self.led_total_time-1:#大于总的时间 4 EventMesh.publish("stop_led_timer")#设置参数 + close_all_ledm() return self.long_count+=1 #蓝灯闪烁 暂时是白色灯 @@ -398,6 +438,7 @@ class ledEventManager(Abstract):#灯事件 open_led_white() else: EventMesh.publish("stop_led_timer")#关闭所有的灯 + close_all_ledm() elif self.led_mode == 2: if self.long_count % (self.led_open_time) <= self.led_close_time: # 4*cnt cnt 多少次 4 开启时间保护关闭时间 2 关闭时间 100ms 4-2关闭时间为200ms 开启时间也为200ms close_led_red() @@ -411,6 +452,7 @@ class ledEventManager(Abstract):#灯事件 pass if self.long_count >= self.led_total_time-1:#大于总的时间 4 EventMesh.publish("stop_led_timer")#设置参数 + close_all_ledm()#关闭所有的灯 return self.long_count+=1 #红绿灯闪烁 @@ -429,6 +471,7 @@ class ledEventManager(Abstract):#灯事件 pass if self.long_count >= self.led_total_time-1:#大于总的时间 4 EventMesh.publish("stop_led_timer")#设置参数 + close_all_ledm()#关闭所有的灯 return self.long_count+=1 #红蓝灯闪烁 蓝变成白色灯 @@ -445,9 +488,10 @@ class ledEventManager(Abstract):#灯事件 pass if self.long_count >= self.led_total_time-1:#大于总的时间 4 EventMesh.publish("stop_led_timer")#设置参数 + close_all_ledm()#关闭所有的灯 return self.long_count+=1 - #蓝绿灯闪烁 + #白绿灯闪烁 elif self.long_light_mode == led_mode.FLASH_LIGHT_GREEN_WHITE:# @@ -463,6 +507,7 @@ class ledEventManager(Abstract):#灯事件 pass if self.long_count >= self.led_total_time-1:#大于总的时间 4 EventMesh.publish("stop_led_timer")#设置参数 + close_all_ledm()#关闭所有的灯 return self.long_count+=1 #红灯长亮 @@ -511,6 +556,21 @@ class ledEventManager(Abstract):#灯事件 self.led_close_time = 0 self.working_led_mode = 0 self.long_count = 0 + #三灯长亮 + elif self.long_light_mode == led_mode.LONG_LIGHT_ALL:# + open_led_white()#白色灯 + open_led_red() + open_led_green() + self.timer.stop() + self.timer_state = 0 + self.led_total_time = 0 + self.led_enable = 0 + self.led_mode = 0 + self.long_light_mode = 0 + self.led_open_time = 0 + self.led_close_time = 0 + self.working_led_mode = 0 + self.long_count = 0 def close_led_pin(self, event, msg): EventMesh.debug_log("close_led_pin!!!") diff --git a/2.sdk/project/D10/sdk/services/microPython/ports/quectel/core/main_init.py b/2.sdk/project/D10/sdk/services/microPython/ports/quectel/core/main_init.py index e5dd0135..2e91a495 100644 --- a/2.sdk/project/D10/sdk/services/microPython/ports/quectel/core/main_init.py +++ b/2.sdk/project/D10/sdk/services/microPython/ports/quectel/core/main_init.py @@ -3,12 +3,13 @@ import atcmd import net import machine import EventMesh - +import usys resp=bytearray(50) # atcmd.sendSync('AT+log=52,1\r\n',resp,'',200) # EventMesh.debug_log("AT+log=52,1:{}".format(resp)) from common import Abstract + class App(object): def __init__(self): self.managers = [] @@ -47,6 +48,7 @@ def main_init(): import ql_fs import utime import EventMesh + # if ql_fs.path_exists("/ext") == False: # ldev = uos.VfsLfs1(32, 32, 32, "ext_fs",0,3) # uos.mount(ldev,'/ext') @@ -165,7 +167,57 @@ def main_init(): app.append_manager(mgr.firwDownloadManager()) if EventMesh.model == "D15": app.append_manager(mgr.vedioInforManager()) + + try: + # try: + # import ai_VC as _ai + # except Exception as e: + # usys.print_exception(e) + try: + import usr.ai_VC as _ai + except Exception as e: + try: + import ai_VC as _ai + except Exception as e: + usys.print_exception(e) + # except Exception as e: + # usys.print_exception(e) + # try: + # import usr.ai_VC_G15 as _ai + # except Exception as e: + # usys.print_exception(e) + + #app.append_manager(intervManager()) + try: + app.append_manager(_ai.getStorageDataManager()) + except Exception as e: + usys.print_exception(e) + # try: + # app.append_manager(_ai.AI_led()) + # except Exception as e: + # usys.print_exception(e) + try: + app.append_manager(_ai.AI_dev()) + except Exception as e: + usys.print_exception(e) + + try: + app.append_manager(_ai.device_res_author()) + except Exception as e: + usys.print_exception(e) + try: + app.append_manager(_ai.AI_VC()) + except Exception as e: + usys.print_exception(e) + + except Exception as e: + usys.print_exception(e) + + EventMesh.debug_log("init21:{}".format(utime.localtime())) + + EventMesh.debug_log("init11:{}".format(utime.localtime())) + EventMesh.debug_log("init21:{}".format(utime.localtime())) EventMesh.debug_log("init11:{}".format(utime.localtime())) @@ -215,6 +267,8 @@ def main_init(): pcr.add_support(protocol.REMIND_CH_WAKEUP_ProtoCol()) pcr.add_support(protocol.REMIND_CH_SLEEP_ProtoCol()) pcr.add_support(protocol.REMIND_CH_HOME_ProtoCol()) + pcr.add_support(protocol.REMIND_CH_MEET_ProtoCol()) + pcr.add_support(protocol.REMIND_CH_WATER_ProtoCol()) pcr.add_support(protocol.REMIND_CH_REST_ProtoCol()) pcr.add_support(protocol.SLEEP_DATA_ProtoCol()) pcr.add_support(protocol.SLEEPTIME_ProtoCol()) diff --git a/2.sdk/project/D10/sdk/services/microPython/ports/quectel/core/mgr.py b/2.sdk/project/D10/sdk/services/microPython/ports/quectel/core/mgr.py index de38bf64..39690b11 100644 --- a/2.sdk/project/D10/sdk/services/microPython/ports/quectel/core/mgr.py +++ b/2.sdk/project/D10/sdk/services/microPython/ports/quectel/core/mgr.py @@ -30,6 +30,7 @@ try : except Exception as e: EventMesh.debug_log("Hsensor none GH3018:{}".format(e)) # +import Hsensor try : from Hsensor import HX3918 except Exception as e: @@ -42,6 +43,7 @@ import voiceCall from misc import PWM from led import led_mode,open_led_green,close_led_green,open_led_red,close_led_red,close_led_white from queue import Queue +DEBUG = 1 #调试需要屏蔽充电的LED if EventMesh.model == "D10": heartbeat_time = 7*60 #心跳时间 gheartbeat_time = 5*60 #心跳时间 @@ -852,6 +854,14 @@ if EventMesh.model == "D10": self.home_count = 0 self.home_oldtotalmin = 0 + self.meet_flag = 0 + self.meet_count = 0 + self.meet_oldtotalmin = 0 + + self.water_flag = 0 + self.water_count = 0 + self.water_oldtotalmin = 0 + self.normal_flag = 0 self.normal_count = 0 self.normal_oldtotalmin = 0 @@ -883,9 +893,9 @@ if EventMesh.model == "D10": # self.hsensor.activate() self.hsensor.init() - self.hsensor.close() + # self.hsensor.close() try : - self.hsensor.set_sar(1) + self.hsensor.set_sar(0) except Exception as e: EventMesh.debug_log("Hsensor none set_sar:{}".format(e)) self.old_temp_time = 0 @@ -969,6 +979,8 @@ if EventMesh.model == "D10": EventMesh.subscribe("clear_health_state", self.clear_health_state) EventMesh.subscribe("clear_home_alarm", self.clear_home_alarm) + EventMesh.subscribe("clear_meet_alarm", self.clear_meet_alarm) + EventMesh.subscribe("clear_water_alarm", self.clear_water_alarm) EventMesh.subscribe("clear_medicine_alarm", self.clear_medicine_alarm) EventMesh.subscribe("clear_wakeup_alarm", self.clear_wakeup_alarm) EventMesh.subscribe("clear_sleep_alarm", self.clear_sleep_alarm) @@ -2084,6 +2096,7 @@ if EventMesh.model == "D10": else: # EventMesh.publish("set_history_temp_value",0) EventMesh.publish("play_temp_value",0)#播放体温数值 + EventMesh.publish(constants.EVENT.STOP_TEMP) @@ -2101,7 +2114,6 @@ if EventMesh.model == "D10": usb_state = EventMesh.publish("get_usb")# - if battery[0] == '1': # EventMesh.debug_log("battery[1]",battery[1]) if self.vbat_full_flag <= 120: @@ -2135,6 +2147,10 @@ if EventMesh.model == "D10": self.sleep_alarm() #该回家了 self.home_alarm() + #该单次喝水了 + self.meet_alarm() + #该开会了 + self.water_alarm() #该休息了 self.reset_alarm() @@ -2229,7 +2245,7 @@ if EventMesh.model == "D10": if (time_tmp - self.drink_time) >= (time*60*60):#需要转换成小时3600 self.drink_time = time_tmp EventMesh.publish("drink_alarm_event")#该喝水了 - #该喝水了 + else: self.drink_time = 0 else: @@ -2388,7 +2404,8 @@ if EventMesh.model == "D10": sleep_hour = sleep[j]["hour"] sleep_min = sleep[j]["min"] sleep_day = sleep[j]["day"] - sleep_enale = sleep[j]["enable"] + sleep_enale = sleep[j]["enable"] + sleep[j]["enable"] = 0 sleep_totalmin = int(sleep_hour)*60+int(sleep_min) # EventMesh.debug_log("wake alarm",sleep_hour,sleep_min,sleep_day,sleep_enale,sleep_totalmin,week) if sleep_day == []:#单次闹钟只响一次 @@ -2440,7 +2457,7 @@ if EventMesh.model == "D10": if self.home_flag == 1: self.home_flag = 0 self.home_count = 0 - home = '' + home = [] home = EventMesh.publish("get_storage_config","home_alarm") # EventMesh.debug_log("sleep info2",sleep,cur_total_min) if self.home_flag == 1:#表示闹钟响过清除标志 @@ -2449,7 +2466,7 @@ if EventMesh.model == "D10": self.home_count = 0 self.home_flag = 0 if home != None: - if len(str(home)) != 0 and str(home) != '': + if len(home) != 0 and home != []: # EventMesh.debug_log("home home 33",home) home_hour = int(str(home).split(":")[0]) home_min = int(str(home).split(":")[1]) @@ -2461,8 +2478,83 @@ if EventMesh.model == "D10": self.home_oldtotalmin = home_totalmin EventMesh.publish("home_alarm_event")#该回家了 + #该开会了 + def meet_alarm(self): + data = RTC().datetime() + hour = data[4] + min = data[5] - + week = int(data[3]) + + date1 = data[1] + date2 = data[2] + cur_total_min = int(hour)*60+int(min) + # EventMesh.debug_log("self.meet_oldtotalmin",self.meet_oldtotalmin,cur_total_min,self.alarm_flag) + if self.meet_oldtotalmin == 0: + self.meet_oldtotalmin = cur_total_min #549 + if self.meet_oldtotalmin != cur_total_min: #上次响过的闹钟分钟数不等于当前的分钟数据需要清零否则下一个不会响铃 + if self.meet_flag == 1: + self.meet_flag = 0 + self.meet_count = 0 + meet = [] + meet = EventMesh.publish("get_storage_config","meet_alarm") + # EventMesh.debug_log("sleep info2",sleep,cur_total_min) + if self.meet_flag == 1:#表示闹钟响过清除标志 + self.meet_count+=1 + if self.meet_count > 6: + self.meet_count = 0 + self.meet_flag = 0 + if meet != None: + if len(meet) != 0 and meet != []: + # EventMesh.debug_log("meet meet 33",meet) + meet_hour = int(str(meet).split(":")[0]) + meet_min = int(str(meet).split(":")[1]) + + meet_totalmin = int(meet_hour)*60+int(meet_min) + if meet_totalmin == cur_total_min and self.meet_flag == 0:#14:00 + self.meet_flag = 1 + self.meet_count = 0 + self.meet_oldtotalmin = meet_totalmin + EventMesh.publish("meet_alarm_event")#该开会了 + + #该单次喝水了 + def water_alarm(self): + data = RTC().datetime() + hour = data[4] + min = data[5] + + week = int(data[3]) + + date1 = data[1] + date2 = data[2] + cur_total_min = int(hour)*60+int(min) + # EventMesh.debug_log("self.water_oldtotalmin",self.water_oldtotalmin,cur_total_min,self.alarm_flag) + if self.water_oldtotalmin == 0: + self.water_oldtotalmin = cur_total_min #549 + if self.water_oldtotalmin != cur_total_min: #上次响过的闹钟分钟数不等于当前的分钟数据需要清零否则下一个不会响铃 + if self.water_flag == 1: + self.water_flag = 0 + self.water_count = 0 + water = [] + water = EventMesh.publish("get_storage_config","water_alarm") + # EventMesh.debug_log("sleep info2",sleep,cur_total_min) + if self.water_flag == 1:#表示闹钟响过清除标志 + self.water_count+=1 + if self.water_count > 6: + self.water_count = 0 + self.water_flag = 0 + if water != None: + if len(water) != 0 and water != []: + # EventMesh.debug_log("water water 33",water) + water_hour = int(str(water).split(":")[0]) + water_min = int(str(water).split(":")[1]) + + water_totalmin = int(water_hour)*60+int(water_min) + if water_totalmin == cur_total_min and self.water_flag == 0:#14:00 + self.water_flag = 1 + self.water_count = 0 + self.water_oldtotalmin = water_totalmin + EventMesh.publish("water_alarm_event")#该单次喝水了 #该休息了 def reset_alarm(self): data = RTC().datetime() @@ -2490,7 +2582,7 @@ if EventMesh.model == "D10": self.reset_count = 0 self.reset_flag = 0 if reset_alarm != None: - if len(str(reset_alarm)) != 0 and str(reset_alarm) != []: + if len(reset_alarm) != 0 and reset_alarm != []: for i in range(len(reset_alarm)): # print("i",i) start_hour = int(reset_alarm[i]["start_hour"]) @@ -2534,6 +2626,15 @@ if EventMesh.model == "D10": self.home_count = 0 self.home_oldtotalmin = 0 + def clear_meet_alarm(self,event,msg):#会议清除标志 + self.meet_flag = 0 + self.meet_count = 0 + self.meet_oldtotalmin = 0 + + def clear_water_alarm(self,event,msg):#喝水清除标志 + self.water_flag = 0 + self.water_count = 0 + self.water_oldtotalmin = 0 def clear_medicine_alarm(self,event,msg):#吃药清除标志 self.medicine_count = 0 @@ -2671,8 +2772,11 @@ if EventMesh.model == "D10": """ charge_state = '0' - if self.get_usb_state() == 1: - charge_state = '1' + if 0: + if self.get_usb_state() == 1: + charge_state = '1' + else: + charge_state = '0' else: charge_state = '0' @@ -2858,7 +2962,6 @@ if EventMesh.model == "D10": def usb_event_cb(self, state): status = state - if status == 1:#插入USB EventMesh.debug_log("charge R_CHARGE_in") EventMesh.publish("clear_usb_flag") @@ -3016,7 +3119,7 @@ if EventMesh.model == "D10": wifiScan.asyncStart() #EventMesh.debug_log("wifiScan.asyncStart") else : - EventMesh.debug_log("WIFI_scan_open:error1") + EventMesh.debug_log("") def gps_open(self, event, msg): if self.isOpenGNSS == "1": #EventMesh.debug_log("publish:gps_open") @@ -3383,10 +3486,13 @@ if EventMesh.model == "D10": self.read_phonebook = {} self.check_json = 0 self.check_json = ql_fs.path_exists("/usr/static/storage_file/phonebook.json") - + print("进入check_json1") if self.check_json == True: + print("进入check_json2") with open("/usr/static/storage_file/phonebook.json","r",encoding="utf-8") as fd: + self.read_phonebook = ujson.load(fd) + EventMesh.debug_log(self.read_phonebook) EventMesh.debug_log("读取电话本") def post_processor_after_instantiation(self): @@ -3395,7 +3501,7 @@ if EventMesh.model == "D10": EventMesh.subscribe("call_phonebook_one_call", self.call_phonebook_one_call) EventMesh.subscribe("call_phonebook_two_call", self.call_phonebook_two_call) EventMesh.subscribe("call_phonebook_three_call", self.call_phonebook_three_call) - + EventMesh.subscribe("call_phonebook_name", self.call_phonebook_name) EventMesh.subscribe("call_phonebook_num", self.call_phonebook_num) def get(self, event, msg): @@ -3421,7 +3527,37 @@ if EventMesh.model == "D10": EventMesh.publish("dial_out_call_center_cb",None)#电话拨出去 else: EventMesh.publish("dial_out_call_center_cb",None)#电话拨出去 - EventMesh.debug_log("call_phonebook_call name:{} msg:{}".format(len(self.read_phonebook),msg)) + EventMesh.debug_log("call_phonebook_call len:{} read_phonebook:{} name:{} msg:{}".format(len(self.read_phonebook),self.read_phonebook,name,msg)) + #通过名字查询电话并拨打 + def call_phonebook_name(self, event, msg): + name = msg + phone_num = None + # 检查电话簿是否为空 + if self.read_phonebook != {}: + # 遍历电话簿查找匹配的名字 + print("电话簿不为空") + for key in self.read_phonebook.keys(): + #print("key:{},value:{}".format(key,value)) + index = key.find(':') + if index != -1: + result = key[index + 1:] + if result == name: + phone_num = key + break + if phone_num is not None: + # 找到匹配的电话号码,发布事件进行拨打 + print("找到匹配的电话号码,发布事件进行拨打") + value = self.read_phonebook[phone_num] + EventMesh.publish("save_phonename", str(value)) + EventMesh.publish("save_phonenum", str(value)) + EventMesh.publish("dial_out_call_center_cb", str(value)) + else: + # 未找到匹配的电话号码,发布空值 + print("未找到匹配的电话号码,发布空值") + EventMesh.publish("dial_out_call_center_cb", None) + + EventMesh.debug_log("call_phonebook_call name:{}".format(phone_num)) + def call_phonebook_one_call(self, event, msg): name = '' diff --git a/2.sdk/project/D10/sdk/services/microPython/ports/quectel/core/mgr_d15.py b/2.sdk/project/D10/sdk/services/microPython/ports/quectel/core/mgr_d15.py index 35d7d1b9..c95894de 100644 --- a/2.sdk/project/D10/sdk/services/microPython/ports/quectel/core/mgr_d15.py +++ b/2.sdk/project/D10/sdk/services/microPython/ports/quectel/core/mgr_d15.py @@ -1021,7 +1021,7 @@ if EventMesh.model == "D15": def gsensor_cb(self, para): - EventMesh.debug_log("gsensor_cb:{}".format(para)) + EventMesh.debug_log("{}".format(para)) flip_sw = EventMesh.publish("get_storage_config","flip_sw") fall_sw = EventMesh.publish("get_storage_config","fall_sw") if para == 0: #跌倒报警 diff --git a/2.sdk/project/D10/sdk/services/microPython/ports/quectel/core/protocol.py b/2.sdk/project/D10/sdk/services/microPython/ports/quectel/core/protocol.py index b9f80019..57c72485 100644 --- a/2.sdk/project/D10/sdk/services/microPython/ports/quectel/core/protocol.py +++ b/2.sdk/project/D10/sdk/services/microPython/ports/quectel/core/protocol.py @@ -890,8 +890,8 @@ class SockManager(Abstract): self.reconnect() data = data + r - EventMesh.debug_log("TCP recv: data:len:{}".format(len(data))) - # EventMesh.debug_log("TCP recv: data:{}".format(data)) + #EventMesh.debug_log("TCP recv: data:len:{}".format(len(data))) + EventMesh.debug_log("TCP recv: data:{}".format(data)) if data[-1] != 0x5d and len(data)<20*1024: #']': continue self.connect_tmp = 1 #有数据,就认为是连接状态 @@ -1393,14 +1393,10 @@ class FIND_ProtoCol(ProtoCol): @param msg: 接收到的下行数据 """ EventMesh.publish(constants.PROTOCOL.FIND_SEND) - # a = audio.Audio(0) - # a.set_pa(Pin.GPIO29) - # a.setVolume(10) # a.play(1, 1, 'E:/audio_find_haixiu.mp3') #文件名前面要加上路径 - # EventMesh.publish("load_screen", {"screen": "FIND"}) EventMesh.publish("OPEN_FIND_WATCH")# - #EventMesh.debug_log("FIND_ProtoCol:recv:%s"%(msg)) + EventMesh.debug_log("FIND_ProtoCol:recv:%s"%(msg)) class POWEROFF_ProtoCol(ProtoCol): """关机""" @@ -1660,6 +1656,7 @@ class HRSTART_ProtoCol(ProtoCol): battery = EventMesh.publish("screen_get_battery") if battery != None: if battery[0] != "1": + EventMesh.publish("AI_client_VC_synevent","开始心率测量,请稍等")#用TTS读 EventMesh.publish("set_hr_state",3)#3代表单次测量 pass else: @@ -1766,6 +1763,7 @@ class OXYGEN_One_ProtoCol(ProtoCol):#单次测量 battery = EventMesh.publish("screen_get_battery") if battery != None: if battery[0] != "1": + EventMesh.publish("AI_client_VC_synevent","开始血氧测量,请稍等")#用TTS读 EventMesh.publish("set_spo2_state",3)#3代表单次测量 else: if oxstartTotal > 0 and oxstartTotal <= 300: @@ -1845,6 +1843,8 @@ class WDSTART_ProtoCol(ProtoCol): battery = EventMesh.publish("screen_get_battery") if battery != None: if battery[0] != "1": + print("set_temp_state") + EventMesh.publish("AI_client_VC_synevent","开始体温测量,请稍等")#用TTS读 EventMesh.publish("set_temp_state",3)#3代表单次测量 else: if tempTotal > 0 and tempTotal <= 300: @@ -1880,7 +1880,7 @@ class bldstart_ProtoCol(ProtoCol): def recv(self, event, msg): """ - @param event: 体温下发频率数据 + @param event: 血压下发频率数据 @param msg: 接收到的下行数据 """ # print("WDSTART_ProtoCol RECV msg:") @@ -1903,6 +1903,7 @@ class bldstart_ProtoCol(ProtoCol): battery = EventMesh.publish("screen_get_battery") if battery != None: if battery[0] != "1": + EventMesh.publish("AI_client_VC_synevent","开始血压测量,请稍等")#用TTS读 EventMesh.publish("set_bp_state",3)#3代表单次测量 else: if bldstartTotal > 0 and bldstartTotal <= 300: @@ -1979,7 +1980,7 @@ class bgstart_ProtoCol(ProtoCol): def recv(self, event, msg): """ - @param event: 体温下发频率数据 + @param event: 血糖下发频率数据 @param msg: 接收到的下行数据 """ # print("WDSTART_ProtoCol RECV msg:") @@ -2001,6 +2002,7 @@ class bgstart_ProtoCol(ProtoCol): battery = EventMesh.publish("screen_get_battery") if battery != None: if battery[0] != "1": + EventMesh.publish("AI_client_VC_synevent","开始血糖测量,请稍等")#用TTS读 EventMesh.publish("set_bg_state",3)#3代表单次测量 else: if bgstartTotal > 0 and bgstartTotal <= 300: @@ -2016,7 +2018,7 @@ class bgstart_ProtoCol(ProtoCol): if bgstartTotal != 0: on = 1 EventMesh.publish("set_bgauto_time",[on,bgstartTotal]) - + EventMesh.publish(constants.PROTOCOL.BGSTART_SEND) # 上传血糖数据 @@ -2943,6 +2945,49 @@ class REMIND_CH_HOME_ProtoCol(ProtoCol):#回家提醒 EventMesh.publish("set_storage_config",["home_alarm",home_data]) EventMesh.publish("clear_home_alarm") EventMesh.publish(constants.PROTOCOL.REMIND_CH_HOME_SEND) + +class REMIND_CH_MEET_ProtoCol(ProtoCol):#会议提醒(口头信号) + TYPE = "REMIND_CH_MEET" + + def send(self, event, msg): + pass + + def recv(self, event, msg): + # SZKW*860132060346475*0013*REMIND_CH_MEDICINE2,4-1 + msg = msg[1:-1] + msg_tmp = msg.decode('ascii') + msg_data = msg_tmp.split(',') + + # [SZKW*860132060346475*0014*REMIND_CH_HOME,00:00',) + meet_data = str(msg_data[1]) + + EventMesh.debug_log("recv REMIND_CH_MEET:{} remind_data ;{}".format(msg,meet_data)) + if len(meet_data) != 0: + EventMesh.publish("set_storage_config",["meet_alarm",meet_data]) + EventMesh.publish("clear_meet_alarm") + EventMesh.publish(constants.PROTOCOL.REMIND_CH_MEET_SEND) + + +class REMIND_CH_WATER_ProtoCol(ProtoCol):#单次喝水提醒 + TYPE = "REMIND_CH_WATER" + + def send(self, event, msg): + pass + + def recv(self, event, msg): + # SZKW*860132060346475*0013*REMIND_CH_MEDICINE2,4-1 + msg = msg[1:-1] + msg_tmp = msg.decode('ascii') + msg_data = msg_tmp.split(',') + + # [SZKW*860132060346475*0014*REMIND_CH_HOME,00:00',) + water_data = str(msg_data[1]) + + EventMesh.debug_log("recv REMIND_CH_WATER:{} remind_data ;{}".format(msg,water_data)) + if len(water_data) != 0: + EventMesh.publish("set_storage_config",["water_alarm",water_data]) + EventMesh.publish("clear_water_alarm") + EventMesh.publish(constants.PROTOCOL.REMIND_CH_WATER_SEND) # 起床闹钟设置指令 # 平台发送: # [XT*YYYYYYYYYYYYYYY*LEN*REMIND_CH_WAKEUP,闹钟1,闹钟2] diff --git a/2.sdk/project/D10/sdk/services/microPython/ports/quectel/core/versions.py b/2.sdk/project/D10/sdk/services/microPython/ports/quectel/core/versions.py index d32c0fc3..db7d5dff 100644 --- a/2.sdk/project/D10/sdk/services/microPython/ports/quectel/core/versions.py +++ b/2.sdk/project/D10/sdk/services/microPython/ports/quectel/core/versions.py @@ -1,2 +1,2 @@ Version="V1.0" -Build_Time="2025-03-19 16:35:31" +Build_Time="2025-04-21 18:21:57" diff --git a/2.sdk/project/D10/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/images/firmware_base_release_pack.zip b/2.sdk/project/D10/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/images/firmware_base_release_pack.zip index 8ea1990f..a1748659 100644 Binary files a/2.sdk/project/D10/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/images/firmware_base_release_pack.zip and b/2.sdk/project/D10/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/images/firmware_base_release_pack.zip differ diff --git a/2.sdk/project/D10/usr/static/R_ALARM_NEW.mp3 b/2.sdk/project/D10/usr/static/R_ALARM_NEW.mp3 new file mode 100644 index 00000000..3fd8ed2c Binary files /dev/null and b/2.sdk/project/D10/usr/static/R_ALARM_NEW.mp3 differ diff --git a/2.sdk/project/D10/usr/static/R_CHARGE_FULL.mp3 b/2.sdk/project/D10/usr/static/R_CHARGE_FULL.mp3 new file mode 100644 index 00000000..73dac2b8 Binary files /dev/null and b/2.sdk/project/D10/usr/static/R_CHARGE_FULL.mp3 differ diff --git a/2.sdk/project/D10/usr/static/R_CUR_BATTERY_LEVEL.mp3 b/2.sdk/project/D10/usr/static/R_CUR_BATTERY_LEVEL.mp3 new file mode 100644 index 00000000..bef27e37 Binary files /dev/null and b/2.sdk/project/D10/usr/static/R_CUR_BATTERY_LEVEL.mp3 differ diff --git a/2.sdk/project/D10/usr/static/R_DRINK_ALARM.mp3 b/2.sdk/project/D10/usr/static/R_DRINK_ALARM.mp3 new file mode 100644 index 00000000..63226453 Binary files /dev/null and b/2.sdk/project/D10/usr/static/R_DRINK_ALARM.mp3 differ diff --git a/2.sdk/project/D10/usr/static/R_FALL_ALARM.mp3 b/2.sdk/project/D10/usr/static/R_FALL_ALARM.mp3 new file mode 100644 index 00000000..96381f61 Binary files /dev/null and b/2.sdk/project/D10/usr/static/R_FALL_ALARM.mp3 differ diff --git a/2.sdk/project/D10/usr/static/R_NO_SET_SOS_DIAL.mp3 b/2.sdk/project/D10/usr/static/R_NO_SET_SOS_DIAL.mp3 new file mode 100644 index 00000000..ecc9acdc Binary files /dev/null and b/2.sdk/project/D10/usr/static/R_NO_SET_SOS_DIAL.mp3 differ diff --git a/2.sdk/project/D10/usr/static/R_NO_SET_VIDOE.mp3 b/2.sdk/project/D10/usr/static/R_NO_SET_VIDOE.mp3 new file mode 100644 index 00000000..18e2189d Binary files /dev/null and b/2.sdk/project/D10/usr/static/R_NO_SET_VIDOE.mp3 differ diff --git a/2.sdk/project/D10/usr/static/R_NO_SIM.mp3 b/2.sdk/project/D10/usr/static/R_NO_SIM.mp3 new file mode 100644 index 00000000..c3dd2de8 Binary files /dev/null and b/2.sdk/project/D10/usr/static/R_NO_SIM.mp3 differ diff --git a/2.sdk/project/D10/usr/static/R_READ_TIME_MIN.mp3 b/2.sdk/project/D10/usr/static/R_READ_TIME_MIN.mp3 new file mode 100644 index 00000000..e163941e Binary files /dev/null and b/2.sdk/project/D10/usr/static/R_READ_TIME_MIN.mp3 differ diff --git a/2.sdk/project/D10/usr/static/R_RESET_ALARM.mp3 b/2.sdk/project/D10/usr/static/R_RESET_ALARM.mp3 new file mode 100644 index 00000000..fc44cba9 Binary files /dev/null and b/2.sdk/project/D10/usr/static/R_RESET_ALARM.mp3 differ diff --git a/2.sdk/project/D10/usr/static/R_RESET_END_ALARM.mp3 b/2.sdk/project/D10/usr/static/R_RESET_END_ALARM.mp3 new file mode 100644 index 00000000..afb29db4 Binary files /dev/null and b/2.sdk/project/D10/usr/static/R_RESET_END_ALARM.mp3 differ diff --git a/2.sdk/project/D10/usr/static/R_SIM_CONNECT.mp3 b/2.sdk/project/D10/usr/static/R_SIM_CONNECT.mp3 new file mode 100644 index 00000000..c3f5b3eb Binary files /dev/null and b/2.sdk/project/D10/usr/static/R_SIM_CONNECT.mp3 differ diff --git a/2.sdk/project/D10/usr/static/R_SIM_FAILE.mp3 b/2.sdk/project/D10/usr/static/R_SIM_FAILE.mp3 new file mode 100644 index 00000000..78e0139c Binary files /dev/null and b/2.sdk/project/D10/usr/static/R_SIM_FAILE.mp3 differ diff --git a/2.sdk/project/D10/usr/static/R_SLEEP_ALARM.mp3 b/2.sdk/project/D10/usr/static/R_SLEEP_ALARM.mp3 new file mode 100644 index 00000000..ed0019a5 Binary files /dev/null and b/2.sdk/project/D10/usr/static/R_SLEEP_ALARM.mp3 differ diff --git a/2.sdk/project/D10/usr/static/R_SOS_ALERT.mp3 b/2.sdk/project/D10/usr/static/R_SOS_ALERT.mp3 new file mode 100644 index 00000000..841aab32 Binary files /dev/null and b/2.sdk/project/D10/usr/static/R_SOS_ALERT.mp3 differ diff --git a/2.sdk/project/D10/usr/static/R_TSENSOR_RESULT_VALUE_DOT.mp3 b/2.sdk/project/D10/usr/static/R_TSENSOR_RESULT_VALUE_DOT.mp3 new file mode 100644 index 00000000..4fd10a0b Binary files /dev/null and b/2.sdk/project/D10/usr/static/R_TSENSOR_RESULT_VALUE_DOT.mp3 differ diff --git a/2.sdk/project/D10/usr/static/R_VIDEO_ANSWER.mp3 b/2.sdk/project/D10/usr/static/R_VIDEO_ANSWER.mp3 new file mode 100644 index 00000000..842b8938 Binary files /dev/null and b/2.sdk/project/D10/usr/static/R_VIDEO_ANSWER.mp3 differ diff --git a/2.sdk/project/D10/usr/static/R_VIDEO_ANSWERING.mp3 b/2.sdk/project/D10/usr/static/R_VIDEO_ANSWERING.mp3 new file mode 100644 index 00000000..516900ba Binary files /dev/null and b/2.sdk/project/D10/usr/static/R_VIDEO_ANSWERING.mp3 differ diff --git a/2.sdk/project/D10/usr/static/R_VIDEO_CALL_CONNECT.mp3 b/2.sdk/project/D10/usr/static/R_VIDEO_CALL_CONNECT.mp3 new file mode 100644 index 00000000..7448c91e Binary files /dev/null and b/2.sdk/project/D10/usr/static/R_VIDEO_CALL_CONNECT.mp3 differ diff --git a/2.sdk/project/D10/usr/static/R_VIDEO_CALL_ENDING.mp3 b/2.sdk/project/D10/usr/static/R_VIDEO_CALL_ENDING.mp3 new file mode 100644 index 00000000..2e25bb76 Binary files /dev/null and b/2.sdk/project/D10/usr/static/R_VIDEO_CALL_ENDING.mp3 differ diff --git a/2.sdk/project/D10/usr/static/R_VIDEO_CALL_IN.mp3 b/2.sdk/project/D10/usr/static/R_VIDEO_CALL_IN.mp3 new file mode 100644 index 00000000..b42d2b8b Binary files /dev/null and b/2.sdk/project/D10/usr/static/R_VIDEO_CALL_IN.mp3 differ diff --git a/2.sdk/project/D10/usr/static/R_VIDEO_VOICE_IN.mp3 b/2.sdk/project/D10/usr/static/R_VIDEO_VOICE_IN.mp3 new file mode 100644 index 00000000..1539195a Binary files /dev/null and b/2.sdk/project/D10/usr/static/R_VIDEO_VOICE_IN.mp3 differ diff --git a/2.sdk/project/D10/usr/static/R_VIDEO_WAITING.mp3 b/2.sdk/project/D10/usr/static/R_VIDEO_WAITING.mp3 new file mode 100644 index 00000000..7afc11e8 Binary files /dev/null and b/2.sdk/project/D10/usr/static/R_VIDEO_WAITING.mp3 differ diff --git a/2.sdk/project/D10/usr/static/audio.bin b/2.sdk/project/D10/usr/static/audio.bin deleted file mode 100644 index e02e6afe..00000000 Binary files a/2.sdk/project/D10/usr/static/audio.bin and /dev/null differ