2025/4/22一修版本
authorazao <821478748@qq.com>
Tue, 22 Apr 2025 01:47:22 +0000 (09:47 +0800)
committerazao <821478748@qq.com>
Tue, 22 Apr 2025 01:47:22 +0000 (09:47 +0800)
37 files changed:
2.sdk/project/D10/merge_bin.py [deleted file]
2.sdk/project/D10/sdk/services/microPython/ports/quectel/core/Makefile
2.sdk/project/D10/sdk/services/microPython/ports/quectel/core/ai_VC.py [new file with mode: 0644]
2.sdk/project/D10/sdk/services/microPython/ports/quectel/core/btn_device_ec800m.py
2.sdk/project/D10/sdk/services/microPython/ports/quectel/core/btn_device_ec800m_d15.py
2.sdk/project/D10/sdk/services/microPython/ports/quectel/core/constants.py
2.sdk/project/D10/sdk/services/microPython/ports/quectel/core/led.py
2.sdk/project/D10/sdk/services/microPython/ports/quectel/core/main_init.py
2.sdk/project/D10/sdk/services/microPython/ports/quectel/core/mgr.py
2.sdk/project/D10/sdk/services/microPython/ports/quectel/core/mgr_d15.py
2.sdk/project/D10/sdk/services/microPython/ports/quectel/core/protocol.py
2.sdk/project/D10/sdk/services/microPython/ports/quectel/core/versions.py
2.sdk/project/D10/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/images/firmware_base_release_pack.zip
2.sdk/project/D10/usr/static/R_ALARM_NEW.mp3 [new file with mode: 0644]
2.sdk/project/D10/usr/static/R_CHARGE_FULL.mp3 [new file with mode: 0644]
2.sdk/project/D10/usr/static/R_CUR_BATTERY_LEVEL.mp3 [new file with mode: 0644]
2.sdk/project/D10/usr/static/R_DRINK_ALARM.mp3 [new file with mode: 0644]
2.sdk/project/D10/usr/static/R_FALL_ALARM.mp3 [new file with mode: 0644]
2.sdk/project/D10/usr/static/R_NO_SET_SOS_DIAL.mp3 [new file with mode: 0644]
2.sdk/project/D10/usr/static/R_NO_SET_VIDOE.mp3 [new file with mode: 0644]
2.sdk/project/D10/usr/static/R_NO_SIM.mp3 [new file with mode: 0644]
2.sdk/project/D10/usr/static/R_READ_TIME_MIN.mp3 [new file with mode: 0644]
2.sdk/project/D10/usr/static/R_RESET_ALARM.mp3 [new file with mode: 0644]
2.sdk/project/D10/usr/static/R_RESET_END_ALARM.mp3 [new file with mode: 0644]
2.sdk/project/D10/usr/static/R_SIM_CONNECT.mp3 [new file with mode: 0644]
2.sdk/project/D10/usr/static/R_SIM_FAILE.mp3 [new file with mode: 0644]
2.sdk/project/D10/usr/static/R_SLEEP_ALARM.mp3 [new file with mode: 0644]
2.sdk/project/D10/usr/static/R_SOS_ALERT.mp3 [new file with mode: 0644]
2.sdk/project/D10/usr/static/R_TSENSOR_RESULT_VALUE_DOT.mp3 [new file with mode: 0644]
2.sdk/project/D10/usr/static/R_VIDEO_ANSWER.mp3 [new file with mode: 0644]
2.sdk/project/D10/usr/static/R_VIDEO_ANSWERING.mp3 [new file with mode: 0644]
2.sdk/project/D10/usr/static/R_VIDEO_CALL_CONNECT.mp3 [new file with mode: 0644]
2.sdk/project/D10/usr/static/R_VIDEO_CALL_ENDING.mp3 [new file with mode: 0644]
2.sdk/project/D10/usr/static/R_VIDEO_CALL_IN.mp3 [new file with mode: 0644]
2.sdk/project/D10/usr/static/R_VIDEO_VOICE_IN.mp3 [new file with mode: 0644]
2.sdk/project/D10/usr/static/R_VIDEO_WAITING.mp3 [new file with mode: 0644]
2.sdk/project/D10/usr/static/audio.bin [deleted file]

diff --git a/2.sdk/project/D10/merge_bin.py b/2.sdk/project/D10/merge_bin.py
deleted file mode 100644 (file)
index 1ab622a..0000000
+++ /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
index 5590130..8eda461 100644 (file)
@@ -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 (file)
index 0000000..fc7abeb
--- /dev/null
@@ -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<self.VBATT_tab["20"]and VC_satrt_flag == 0 and self.Low_power_warning_flag ==0:#低电报警
+            self.Low_power_warning_flag  = 1
+            EventMesh.publish("flicker_led_red")
+            #self.aud.play(1,0,'Low_power_warning.mp3')
+            # self.Low_power_warning_timer+=1
+            # if self.Low_power_warning_timer >= 2:
+            #     self.Low_power_warning_timer = 0
+            EventMesh.publish("audio_montage_play",["Low_power_warning.mp3"])
+        if  self.usb_status == 0 and Vbatt<self.VBATT_tab["5"]:    
+        # if  self.usb_status == 0 and Vbatt<self.VBATT_tab["5"]:    
+            EventMesh.publish("audio_montage_play",["didianguanji.mp3"])
+            utime.sleep_ms(4500)
+            self.aud.stopPlayStream()
+            self.aud.stopAll()
+            Power.powerDown()
+
+        self.check_rest_timer_count += 1
+        if self.check_rest_timer_count >= 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={}&currentVersion={}".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<cmd_parameter>(男|难|女|童|同|粤|广东话|粤语|四川话|川普|四川口音))",#参数提取正则表达式
+                "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
index 9bbf5e9..505d178 100644 (file)
@@ -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):#å\91¨æ\9c\9få\96\9dæ°´å\93\8dé\93\83
             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 :
index ffec04c..f2eae68 100644 (file)
@@ -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()
index c21cf83..eb9db86 100644 (file)
@@ -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"
 
index a1b19e0..3dde68f 100644 (file)
@@ -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!!!")
index e5dd013..2e91a49 100644 (file)
@@ -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())
index de38bf6..39690b1 100644 (file)
@@ -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 = ''
index 35d7d1b..c95894d 100644 (file)
@@ -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: #跌倒报警
index b9f8001..57c7248 100644 (file)
@@ -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]
index 8ea1990..a174865 100644 (file)
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 (file)
index 0000000..3fd8ed2
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 (file)
index 0000000..73dac2b
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 (file)
index 0000000..bef27e3
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 (file)
index 0000000..6322645
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 (file)
index 0000000..96381f6
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 (file)
index 0000000..ecc9acd
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 (file)
index 0000000..18e2189
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 (file)
index 0000000..c3dd2de
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 (file)
index 0000000..e163941
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 (file)
index 0000000..fc44cba
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 (file)
index 0000000..afb29db
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 (file)
index 0000000..c3f5b3e
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 (file)
index 0000000..78e0139
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 (file)
index 0000000..ed0019a
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 (file)
index 0000000..841aab3
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 (file)
index 0000000..4fd10a0
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 (file)
index 0000000..842b893
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 (file)
index 0000000..516900b
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 (file)
index 0000000..7448c91
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 (file)
index 0000000..2e25bb7
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 (file)
index 0000000..b42d2b8
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 (file)
index 0000000..1539195
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 (file)
index 0000000..7afc11e
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 (file)
index e02e6af..0000000
Binary files a/2.sdk/project/D10/usr/static/audio.bin and /dev/null differ