补充所有文件
authorazao <821478748@qq.com>
Fri, 27 Feb 2026 03:46:13 +0000 (11:46 +0800)
committerazao <821478748@qq.com>
Fri, 27 Feb 2026 03:46:13 +0000 (11:46 +0800)
31 files changed:
2.sdk/project/7PIN_1_5/merge_bin.py
2.sdk/project/7PIN_1_5/new.bat
2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/EventMesh.py
2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/Makefile
2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/TTS音频生成.py
2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/ai_VC_coze.py
2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/btn_device_ec800m.py
2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/btn_device_ec800m_d15.py
2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/config.json
2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/constants.py
2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/led.py
2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/led_d15.py
2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/main_1.py
2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/mgr.py
2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/mgr_d15.py
2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/motor.py
2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/pcm_stream_play_test.py
2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/sleep_test.py
2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/tiktok_rtc_demo.py
2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/ui.py
2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/usr/ai_VC.py
2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/usr/ai_test.py
2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/usr/test1.py
2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/versions.py
2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/EG810MCN_GA_VOLTE.mk
2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/autoconf.h
2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/config.in
2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/config.mk
2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/mpconfigboard.h
2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/include/app_link_start_addr.h
2.sdk/project/7PIN_1_5/usr/main.py

index c12eb7a..b37b6da 100644 (file)
@@ -1,46 +1,46 @@
-#!/usr/bin/env python
-# -*- coding: utf-8 -*-
-
-"""
-@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
-
+#!/usr/bin/env python\r
+# -*- coding: utf-8 -*-\r
+\r
+"""\r
+@FileName : merge_bin.py\r
+@Author   : zhen.guo\r
+@Email    : zhen.guo@quectel.com\r
+@Date     : 2022-08-05 09:58:14\r
+"""\r
+import os\r
+output_list = []\r
+# 文件名--》下标\r
+def text_to_hash(filename: str) -> str:\r
+    output_list.append(filename.split("\\")[-1][:-4])\r
+    print(str(len(output_list)-1) + filename[-4:])\r
+    return str(len(output_list)-1) + filename[-4:]\r
+\r
+\r
+def merge_bin(res='res.bin', *args):\r
+    # 入参文件夹和文件处理\r
+    file_list = []\r
+    for i in args:\r
+        if os.path.isdir(i):\r
+            for j in os.walk(i):\r
+                for x in j[2]:\r
+                    file_list.append(j[0] + x)\r
+        else:\r
+            file_list.append(i)\r
+    f = open(res, 'wb')\r
+    fileheader = bytes("montage", 'utf-8') + bytes(1) + bytes.fromhex('%08X' % len(file_list))[::-1]\r
+    filebyte, bytesize, filebody = b'', 0, b''\r
+    for i in file_list:\r
+        print(i)\r
+        filename_byte = bytes(text_to_hash(i), 'utf-8')\r
+        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])\r
+        bytesize += os.path.getsize(i)\r
+        filebody += open(i, 'rb').read()\r
+    f.write(fileheader + filebyte + filebody)\r
+    f.close()\r
+    print(output_list)\r
+    with open('list.json', 'w') as f:\r
+        f.write(str(output_list))\r
+    print("----MERGE SUCCESS----")\r
+    return output_list\r
+\r
 output_list = merge_bin(".\\usr\\static\\audio.bin", ".\\audio\\")
\ No newline at end of file
index bd2d9ea..65596b9 100644 (file)
@@ -1,39 +1,39 @@
-@echo off
-
-md images
-del images /q
-@GOTO :STEP1
-..\..\Helios_SDK\tools\ASR_1606\win32\mklfs.exe -c ext -b 4096 -r 4096 -p 4096 -s 1048576 -i .\images\ext_fs.bin
-if errorlevel 1 (
-    echo "ext_fs.binÉú³Éʧ°Ü !!!!!!!!!!!!!!! "
-    goto exit
-)
-if errorlevel 0 (
-    echo "ext_fs.binÉú³É³É¹¦ !!!!!!!!!!!!!!! "
-)
-:STEP1
-
-..\..\Helios_SDK\tools\ASR_1606\win32\mklfs.exe -c usr -b 4096 -r 4096 -p 4096 -s 1376256 -i .\images\customer_fs.bin
-if errorlevel 1 (
-    echo "customer_fs.binÉú³Éʧ°Ü Çë¼ì²éusrĿ¼ÊÇ·ñ´óÓÚ316K!!!!!!!!!!!!!!!"
-    goto exit
-)
-if errorlevel 0 (
-    echo "customer_fs.binÉú³É³É¹¦ !!!!!!!!!!!!!!! "
-)
-
-%copy font\ext_font.bin images\ext_font.bin%
-
-..\..\Helios_SDK\tools\common\win32\7z\7z a sdk\system\platform\ASR_1606\boards\EG810MCN_GA_VOLTE\images\firmware_base_release_pack.zip .\images\
-if errorlevel 0 (
-    echo imagesѹËõ³É¹¦!!!!!!!!!!!!!!
-)
-if errorlevel 1 (
-    echo imagesѹËõʧ°Ü!!!!!!!!!!!!!!!!!!
-    goto exit
-)
-xcopy  sdk\ ..\..\Helios_SDK\ /e/h/y
-cd ..\..\Helios_SDK
-helios make services/microPython @EG810MCN_GA_VOLTE EG810MCN_GA_VOLTE
-cd ..
+@echo off\r
+\r
+md images\r
+del images /q\r
+@GOTO :STEP1\r
+..\..\Helios_SDK\tools\ASR_1606\win32\mklfs.exe -c ext -b 4096 -r 4096 -p 4096 -s 1048576 -i .\images\ext_fs.bin\r
+if errorlevel 1 (\r
+    echo "ext_fs.binÉú³Éʧ°Ü !!!!!!!!!!!!!!! "\r
+    goto exit\r
+)\r
+if errorlevel 0 (\r
+    echo "ext_fs.binÉú³É³É¹¦ !!!!!!!!!!!!!!! "\r
+)\r
+:STEP1\r
+\r
+..\..\Helios_SDK\tools\ASR_1606\win32\mklfs.exe -c usr -b 4096 -r 4096 -p 4096 -s 1376256 -i .\images\customer_fs.bin\r
+if errorlevel 1 (\r
+    echo "customer_fs.binÉú³Éʧ°Ü Çë¼ì²éusrĿ¼ÊÇ·ñ´óÓÚ316K!!!!!!!!!!!!!!!"\r
+    goto exit\r
+)\r
+if errorlevel 0 (\r
+    echo "customer_fs.binÉú³É³É¹¦ !!!!!!!!!!!!!!! "\r
+)\r
+\r
+%copy font\ext_font.bin images\ext_font.bin%\r
+\r
+..\..\Helios_SDK\tools\common\win32\7z\7z a sdk\system\platform\ASR_1606\boards\EG810MCN_GA_VOLTE\images\firmware_base_release_pack.zip .\images\\r
+if errorlevel 0 (\r
+    echo imagesѹËõ³É¹¦!!!!!!!!!!!!!!\r
+)\r
+if errorlevel 1 (\r
+    echo imagesѹËõʧ°Ü!!!!!!!!!!!!!!!!!!\r
+    goto exit\r
+)\r
+xcopy  sdk\ ..\..\Helios_SDK\ /e/h/y\r
+cd ..\..\Helios_SDK\r
+helios make services/microPython @EG810MCN_GA_VOLTE EG810MCN_GA_VOLTE\r
+cd ..\r
 :exit
\ No newline at end of file
index 912b3d0..47d80af 100644 (file)
-import _thread
-import usys
-import versions
-import ql_fs
-
-model = "D15"
-project = "D15"
-platform = "D15"#格物平台 不用的话选择空
-
-# project = "D10"
-# model = "D10"
-# platform = "D10"#格物平台 不用的话选择空
-#platform = "gewu"#格物平台 不用的话选择空 如果需要联通入库的需求就要打开 不需要就得写空通过变量区分
-
-# platform = "D15"#格物平台 不用的话选择空
-
-# model = "G10W_DT_YBX_"
-
-softversion = "{}_{}".format(project,versions.Version)
-builTime = "{}".format(versions.Build_Time)
-
-class EventStore(object):
-    def __init__(self):
-        self.map = dict()
-        self.log = None
-        self.__filters = []
-
-    def add_filter(self, flt):
-        self.__filters.append(flt)
-
-    def append(self, event, cb):
-        self.map[event] = cb
-
-    def fire_async(self, event, msg,thread_size):
-        if event in self.map:
-            #print("fire_async:thread_size:{}".format(thread_size))
-            if thread_size != None:
-                _thread.stack_size(thread_size)
-                #print("fire_async:thread_size:{}".format(thread_size))
-            _thread.start_new_thread(self.map[event], (event, msg))
-            if thread_size != None:
-                _thread.stack_size(8*1024)
-            if self.log:
-                self.log.info("ASYNC executed (event) -> {} (params) -> {} (result) -> {}".format(event, msg, None))
-
-    def fire_sync(self, event, msg):
-        res = None
-        try:
-            if event in self.map:
-                res = self.map[event](event, msg)
-        except Exception as e:
-            usys.print_exception(e)
-            if self.log:
-                self.log.info("ERROR executed (event) -> {} (params) -> {} (result) -> {}".format(event, msg, res))
-        if event not in self.__filters:
-            if self.log:
-                self.log.info("SYNC executed (event) -> {} (params) -> {} (result) -> {}".format(event, msg, res))
-        return res
-
-
-event_store = EventStore()
-
-
-def subscribe(event, cb):
-    """
-    subscribe event and cb
-    """
-    return event_store.append(event, cb)
-
-
-def publish(event, msg=None):
-    """
-    publish event and msg
-    """
-    return publish_sync(event, msg)
-
-
-def publish_async(event, msg=None,thread_size = None):
-    """
-    异步发送
-    """
-    return event_store.fire_async(event, msg,thread_size)
-
-
-def publish_sync(event, msg=None):
-    """
-    同步发送
-    """
-    return event_store.fire_sync(event, msg)
-
-
-def set_log(log_adapter):
-    event_store.log = log_adapter
-
-
-def add_filter(flt):
-    event_store.add_filter(flt)
-
-def callback_wrapper(callback):#按键回调
-    def wrapped_callback(*args, **kwargs):
-        try:
-            return callback(*args, **kwargs)
-        except Exception as e:
-            # 在这里处理异常,例如打印错误信息,保存到日志文件,等等。
-            print('Exception in callback:', e)
-            # 如果需要,你可以在这里重新抛出异常
-            # raise
-    return wrapped_callback
-
-
-import utime
-import uos
-debug_Log = 1
-def debug_log(*data):
-    if debug_Log != 0 :
-        print(data)
-Txt_Log = 0
-def txt_log(data):
-    if Txt_Log != 0 :
-        print(data)
-        try:
-            check_file = ql_fs.path_exists("usr/log.txt")
-
-            if check_file == True:
-                f_stat = uos.stat("usr/log.txt")
-                if f_stat[6] > 50*1024:
-                    uos.remove("usr/log.txt") 
-        except Exception as e:
-            usys.print_exception(e)
-        with open("/usr/log.txt","a",encoding="utf-8") as fd:
-            d_time = utime.localtime()
-            data_tmp = "%02d-%02d %02d:%02d:%02d :"%(d_time[1],d_time[2],d_time[3],d_time[4],d_time[5])
-            fd.write(data_tmp+data+"\n")
+import _thread\r
+import usys\r
+import versions\r
+import ql_fs\r
+\r
+model = "D15"\r
+project = "D15"\r
+platform = "D15"#格物平台 不用的话选择空\r
+\r
+# project = "D10"\r
+# model = "D10"\r
+# platform = "D10"#格物平台 不用的话选择空\r
+#platform = "gewu"#格物平台 不用的话选择空 如果需要联通入库的需求就要打开 不需要就得写空通过变量区分\r
+\r
+# platform = "D15"#格物平台 不用的话选择空\r
+\r
+# model = "G10W_DT_YBX_"\r
+\r
+softversion = "{}_{}".format(project,versions.Version)\r
+builTime = "{}".format(versions.Build_Time)\r
+\r
+class EventStore(object):\r
+    def __init__(self):\r
+        self.map = dict()\r
+        self.log = None\r
+        self.__filters = []\r
+\r
+    def add_filter(self, flt):\r
+        self.__filters.append(flt)\r
+\r
+    def append(self, event, cb):\r
+        self.map[event] = cb\r
+\r
+    def fire_async(self, event, msg,thread_size):\r
+        if event in self.map:\r
+            #print("fire_async:thread_size:{}".format(thread_size))\r
+            if thread_size != None:\r
+                _thread.stack_size(thread_size)\r
+                #print("fire_async:thread_size:{}".format(thread_size))\r
+            _thread.start_new_thread(self.map[event], (event, msg))\r
+            if thread_size != None:\r
+                _thread.stack_size(8*1024)\r
+            if self.log:\r
+                self.log.info("ASYNC executed (event) -> {} (params) -> {} (result) -> {}".format(event, msg, None))\r
+\r
+    def fire_sync(self, event, msg):\r
+        res = None\r
+        try:\r
+            if event in self.map:\r
+                res = self.map[event](event, msg)\r
+        except Exception as e:\r
+            usys.print_exception(e)\r
+            if self.log:\r
+                self.log.info("ERROR executed (event) -> {} (params) -> {} (result) -> {}".format(event, msg, res))\r
+        if event not in self.__filters:\r
+            if self.log:\r
+                self.log.info("SYNC executed (event) -> {} (params) -> {} (result) -> {}".format(event, msg, res))\r
+        return res\r
+\r
+\r
+event_store = EventStore()\r
+\r
+\r
+def subscribe(event, cb):\r
+    """\r
+    subscribe event and cb\r
+    """\r
+    return event_store.append(event, cb)\r
+\r
+\r
+def publish(event, msg=None):\r
+    """\r
+    publish event and msg\r
+    """\r
+    return publish_sync(event, msg)\r
+\r
+\r
+def publish_async(event, msg=None,thread_size = None):\r
+    """\r
+    异步发送\r
+    """\r
+    return event_store.fire_async(event, msg,thread_size)\r
+\r
+\r
+def publish_sync(event, msg=None):\r
+    """\r
+    同步发送\r
+    """\r
+    return event_store.fire_sync(event, msg)\r
+\r
+\r
+def set_log(log_adapter):\r
+    event_store.log = log_adapter\r
+\r
+\r
+def add_filter(flt):\r
+    event_store.add_filter(flt)\r
+\r
+def callback_wrapper(callback):#按键回调\r
+    def wrapped_callback(*args, **kwargs):\r
+        try:\r
+            return callback(*args, **kwargs)\r
+        except Exception as e:\r
+            # 在这里处理异常,例如打印错误信息,保存到日志文件,等等。\r
+            print('Exception in callback:', e)\r
+            # 如果需要,你可以在这里重新抛出异常\r
+            # raise\r
+    return wrapped_callback\r
+\r
+\r
+import utime\r
+import uos\r
+debug_Log = 1\r
+def debug_log(*data):\r
+    if debug_Log != 0 :\r
+        print(data)\r
+Txt_Log = 0\r
+def txt_log(data):\r
+    if Txt_Log != 0 :\r
+        print(data)\r
+        try:\r
+            check_file = ql_fs.path_exists("usr/log.txt")\r
+\r
+            if check_file == True:\r
+                f_stat = uos.stat("usr/log.txt")\r
+                if f_stat[6] > 50*1024:\r
+                    uos.remove("usr/log.txt") \r
+        except Exception as e:\r
+            usys.print_exception(e)\r
+        with open("/usr/log.txt","a",encoding="utf-8") as fd:\r
+            d_time = utime.localtime()\r
+            data_tmp = "%02d-%02d %02d:%02d:%02d :"%(d_time[1],d_time[2],d_time[3],d_time[4],d_time[5])\r
+            fd.write(data_tmp+data+"\n")\r
index adea516..54aab98 100644 (file)
-# Copyright (c) Quectel Wireless Solution, Co., Ltd.All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-#env
-TOP := ../../..
-ROOT := $(TOP)/../..
-
-KCONFIG_CONFIG_DIR := ../../../../..
-include $(KCONFIG_CONFIG_DIR)/config/$(KCONFIG_CONFIG)
-
-ifeq ("$(origin V)", "command line")
-BUILD_VERBOSE=$(V)
-endif
-ifndef BUILD_VERBOSE
-BUILD_VERBOSE = 0
-endif
-# ifeq ($(BUILD_VERBOSE),0)
-# Q = @
-# else
-# Q =
-# endif
-
-BUILD ?= build
-FROZEN_MPY_DIR ?= .
-
-RM = rm
-ECHO = echo
-CP = cp
-MKDIR = mkdir
-SED = sed
-CAT = cat
-TOUCH = touch
-
-MAKE_MANIFEST = $(PYTHON) $(TOP)/tools/makemanifest.py
-MAKE_FROZEN = $(PYTHON) $(TOP)/tools/make-frozen.py
-#because E-safeNet, mpy-cross could not read the py file, rename as notepad++
-ifeq ($(strip $(HOST)),linux)
-MPY_CROSS = $(TOP)/ports/quectel/tools/mpy-cross
-else
-MPY_CROSS = $(TOP)/ports/quectel/tools/notepad++.exe
-endif
-MPY_TOOL = $(PYTHON) $(TOP)/tools/mpy-tool.py
-
-QSTR_DEFS = source/qstrdefsport.h
-#py
-PY_SRC ?= $(TOP)/py
-HEADER_BUILD = $(TOP)/genhdr
-PY_QSTR_DEFS = $(PY_SRC)/qstrdefs.h
-ifneq ($(QSTR_AUTOGEN_DISABLE),1)
-QSTR_DEFS_COLLECTED = $(HEADER_BUILD)/qstrdefs.collected.h
-endif
-QSTR_GLOBAL_DEPENDENCIES += $(PY_SRC)/mpconfig.h source/mpconfigport.h
-CSUPEROPT = -O3
-ifeq ($(strip $(PLAT)),ECR6600)
-MPY_CROSS_FLAGS += -march=xtensa
-else
-MPY_CROSS_FLAGS += -march=armv7m
-endif
-# Enable building 32-bit code on 64-bit host.
-ifeq ($(MICROPY_FORCE_32BIT),1)
-CC += -m32
-CXX += -m32
-LD += -m32
-endif
-
-# External modules written in C.
-ifneq ($(USER_C_MODULES),)
-# pre-define USERMOD variables as expanded so that variables are immediate
-# expanded as they're added to them
-SRC_USERMOD :=
-C_FLAGS_USERMOD :=
-LD_FLAGS_USERMOD :=
-$(foreach module, $(wildcard $(USER_C_MODULES)/*/micropython.mk), \
-    $(eval USERMOD_DIR = $(patsubst %/,%,$(dir $(module))))\
-    $(info Including User C Module from $(USERMOD_DIR))\
-       $(eval include $(module))\
-)
-
-SRC_MOD += $(patsubst $(USER_C_MODULES)/%.c,%.c,$(SRC_USERMOD))
-C_FLAGS_MOD += $(C_FLAGS_USERMOD)
-LD_FLAGS_MOD += $(LD_FLAGS_USERMOD)
-endif
-
-# py object files
-PY_CORE_O_BASENAME = $(addprefix py/,\
-       mpstate.o \
-       nlr.o \
-       nlrx86.o \
-       nlrx64.o \
-       nlrthumb.o \
-       nlrpowerpc.o \
-       nlrxtensa.o \
-       nlrsetjmp.o \
-       malloc.o \
-       gc.o \
-       pystack.o \
-       qstr.o \
-       vstr.o \
-       mpprint.o \
-       unicode.o \
-       mpz.o \
-       reader.o \
-       lexer.o \
-       parse.o \
-       scope.o \
-       compile.o \
-       emitcommon.o \
-       emitbc.o \
-       asmbase.o \
-       asmx64.o \
-       emitnx64.o \
-       asmx86.o \
-       emitnx86.o \
-       asmthumb.o \
-       emitnthumb.o \
-       emitinlinethumb.o \
-       asmarm.o \
-       emitnarm.o \
-       asmxtensa.o \
-       emitnxtensa.o \
-       emitinlinextensa.o \
-       emitnxtensawin.o \
-       formatfloat.o \
-       parsenumbase.o \
-       parsenum.o \
-       emitglue.o \
-       persistentcode.o \
-       runtime.o \
-       runtime_utils.o \
-       scheduler.o \
-       nativeglue.o \
-       pairheap.o \
-       ringbuf.o \
-       stackctrl.o \
-       argcheck.o \
-       warning.o \
-       profile.o \
-       map.o \
-       obj.o \
-       objarray.o \
-       objattrtuple.o \
-       objbool.o \
-       objboundmeth.o \
-       objcell.o \
-       objclosure.o \
-       objcomplex.o \
-       objdeque.o \
-       objdict.o \
-       objenumerate.o \
-       objexcept.o \
-       objfilter.o \
-       objfloat.o \
-       objfun.o \
-       objgenerator.o \
-       objgetitemiter.o \
-       objint.o \
-       objint_longlong.o \
-       objint_mpz.o \
-       objlist.o \
-       objmap.o \
-       objmodule.o \
-       objobject.o \
-       objpolyiter.o \
-       objproperty.o \
-       objnone.o \
-       objnamedtuple.o \
-       objrange.o \
-       objreversed.o \
-       objset.o \
-       objsingleton.o \
-       objslice.o \
-       objstr.o \
-       objstrunicode.o \
-       objstringio.o \
-       objtuple.o \
-       objtype.o \
-       objzip.o \
-       opmethods.o \
-       sequence.o \
-       stream.o \
-       binary.o \
-       builtinimport.o \
-       builtinevex.o \
-       builtinhelp.o \
-       modarray.o \
-       modbuiltins.o \
-       modcollections.o \
-       modgc.o \
-       modio.o \
-       modmath.o \
-       modcmath.o \
-       modmicropython.o \
-       modstruct.o \
-       modsys.o \
-       moduerrno.o \
-       modthread.o \
-       vm.o \
-       bc.o \
-       showbc.o \
-       repl.o \
-       smallint.o \
-       frozenmod.o \
-       )
-
-PY_EXTMOD_O_BASENAME = \
-       extmod/moductypes.o \
-       extmod/modujson.o \
-       extmod/modure.o \
-       extmod/moduzlib.o \
-       extmod/moduheapq.o \
-       extmod/modutimeq.o \
-       extmod/modubinascii.o \
-       extmod/virtpin.o \
-       extmod/machine_mem.o \
-       extmod/machine_pinbase.o \
-       extmod/machine_signal.o \
-       extmod/machine_pulse.o \
-       extmod/machine_i2c.o \
-       extmod/machine_spi.o \
-       extmod/modbluetooth.o \
-       extmod/modurandom.o \
-       extmod/moduselect.o \
-       extmod/moduasyncio.o \
-       extmod/moduwebsocket.o \
-       extmod/modwebrepl.o \
-       extmod/modframebuf.o \
-       extmod/vfs.o \
-       extmod/vfs_blockdev.o \
-       extmod/vfs_reader.o \
-       extmod/vfs_posix.o \
-       extmod/vfs_posix_file.o \
-       extmod/vfs_fat.o \
-       extmod/vfs_fat_file.o \
-       extmod/vfs_lfs.o \
-       extmod/utime_mphal.o \
-       extmod/uos_dupterm.o \
-       extmod/modussl_mbedtls.o \
-       extmod/moduhashlib.o \
-       extmod/moducryptolib.o \
-       lib/embed/abort_.o \
-       lib/utils/printf.o \
-       lib/utils/sys_stdio_mphal.o
-
-ifeq ($(strip $(PLAT)),Qualcomm)
-PY_EXTMOD_O_BASENAME += \
-       extmod/vfs_efs.o \
-       extmod/vfs_efs_file.o
-endif
-
-ifeq ($(strip $(PLAT)), $(filter $(PLAT),Unisoc Unisoc_8910_R05))
-PY_EXTMOD_O_BASENAME += \
-       extmod/vfs_temp.o \
-       extmod/vfs_temp_file.o
-endif
-
-# Sources that may contain qstrings
-SRC_QSTR_IGNORE = py/nlr%
-SRC_QSTR += $(SRC_MOD) $(filter-out $(SRC_QSTR_IGNORE),$(PY_CORE_O_BASENAME:.o=.c)) $(PY_EXTMOD_O_BASENAME:.o=.c)
-SRC_QSTR += \
-                       source/modalipay.c \
-                       source/audio_audio.c \
-                       source/audio_queue.c \
-                       source/audio_record.c \
-                       source/audio_tts.c \
-                       source/audiocodec_rt5616.c \
-                       source/callbackdeal.c \
-                       source/camera_capture.c \
-                       source/camera_preview.c \
-                       source/camera_scandecode.c \
-                       source/devreport.c \
-                       source/machine_extint.c \
-                       source/machine_hw_spi.c \
-                       source/machine_iic.c \
-                       source/machine_iic_simulation.c \
-                       source/machine_keypad.c \
-                       source/machine_lcd.c \
-                       source/machine_nandflash.c \
-                       source/machine_pin.c \
-                       source/machine_rtc.c \
-                       source/machine_timer.c \
-                       source/machine_uart.c \
-                       source/machine_wdt.c \
-                       source/misc_adc.c \
-                       source/misc_power.c \
-                       source/misc_powerkey.c \
-                       source/misc_pwm.c \
-                       source/misc_temperature.c \
-                       source/misc_usb.c \
-                       source/misc_usbnet.c \
-                       source/modatcmd.c \
-                       source/modaudio.c \
-                       source/modaudiocodec.c \
-                       source/modble.c \
-                       source/modbt.c \
-                       source/modcamera.c \
-                       source/modcelllocator.c \
-                       source/modcelllocator_qpy.c \
-                       source/locator.c \
-                       source/modcsd.c \
-                       source/moddatacall.c \
-                       source/moddev.c \
-                       source/modethernet.c \
-                       source/modethernet_dm9051.c \
-                       source/modethernet_w5500.c \
-                       source/modethernet_ch395.c \
-                       source/modexample.c \
-                       source/modfota.c \
-                       source/modgnss.c \
-                       source/modlpm.c \
-                       source/modlvgl.c \
-                       source/modlwm2m.c \
-                       source/modmachine.c \
-                       source/modmisc.c \
-                       source/modnb.c \
-                       source/modnet.c \
-                       source/modostimer.c \
-                       source/modpoc.c \
-                       source/modqrcode.c \
-                       source/modrtmp.c \
-                       source/modsecuredata.c \
-                       source/modsensor.c \
-                       source/modsha1.c \
-                       source/modsim.c \
-                       source/modslipif.c \
-                       source/modsms.c \
-                       source/modsocket.c \
-                       source/modtp.c \
-                       source/moduos.c \
-                       source/modutils.c \
-                       source/modutime.c \
-                       source/modvoicecall.c \
-                       source/modwifilocator.c \
-                       source/modwifiscan.c \
-                       source/nb_aep.c \
-                       source/nb_oc.c \
-                       source/nb_onenet.c \
-                       source/quecpython.c \
-                       source/sensor_sn95500.c \
-                       source/sensor_icckey.c \
-                       source/sensor_gnss.c \
-                       source/tp_gt9xx.c \
-                       source/tp_xpt2046.c \
-                       source/tp_cst816.c \
-                       source/modGsensor.c \
-                       source/modGsensor_SC7A20.c \
-                       source/modHsensor.c \
-                       source/modHsensor_GH3018.c \
-                       source/modVideoCall.c \
-                       source/modVideoCall_juphoon.c \
-                       source/modHsensor_HX3918.c \
-                       source/modrsa.c \
-                       source/utils_crc32.c \
-                       source/http_parser.c \
-                       source/modwebserver.c \
-                       source/modethernet_yt8512h.c \
-                       source/sim_esim.c \
-                       source/modG711.c \
-                       source/modG729.c \
-                       source/modcan_mcp2515.c \
-                       source/modextuart_wk2114.c \
-                       source/modextgpio_aw9523.c \
-                       source/machine_key.c \
-                       source/lpm_wakeup.c \
-                       source/sensor_handmic_key.c     \
-                       source/modnetwork.c     \
-                       source/modwlan_ASR5803.c \
-                       source/machine_soft_spi.c \
-                       source/code128_p.c \
-                       source/modwlan.c\
-                       source/modwlan.c \
-                       source/modmask.c \
-                       source/modVad.c \
-                       source/machine_one_wire.c
-
-
-ifeq ($(strip $(PLAT)),RDA)
-SRC_QSTR += $(ROOT)/components/quecsdk/cloud/python/modquecIot-BC25old.c
-else
-SRC_QSTR += $(ROOT)/components/quecsdk/cloud/python/modquecIot.c
-endif
-
-ifeq ($(CONFIG_USQLITE), y)
-SRC_QSTR += lib/usqlite/usqlite_connection.c \
-                       lib/usqlite/usqlite_cursor.c \
-                       lib/usqlite/usqlite_row.c \
-                       lib/usqlite/usqlite_file.c \
-                       lib/usqlite/usqlite_mem.c \
-                       lib/usqlite/usqlite_vfs.c \
-                       lib/usqlite/usqlite_utils.c \
-                       lib/usqlite/usqlite.c \
-                       lib/usqlite/usqlite_module.c
-
-INC += -Ilib/usqlite
-endif
-
-$(BUILD)/%.pp: %.c
-       @$(ECHO) "PreProcess $<"
-       $(Q)$(CPP) $(C_FLAGS) -Wp,-C,-dD,-dI -o $@ $<
-
-# Anything that depends on FORCE will be considered out-of-date
-FORCE:
-.PHONY: FORCE
-
-$(HEADER_BUILD):
-       $(MKDIR) -p $@
-
-#$(HEADER_BUILD)/mpversion.h: FORCE | $(HEADER_BUILD)
-#      $(Q)$(PYTHON) $(PY_SRC)/makeversionhdr.py $@
-# mpconfigport.mk is optional, but changes to it may drastically change
-# overall config, so they need to be caught
-MPCONFIGPORT_MK = $(wildcard mpconfigport.mk)
-
-# qstr data
-# Adding an order only dependency on $(HEADER_BUILD) causes $(HEADER_BUILD) to get
-# created before we run the script to generate the .h
-# Note: we need to protect the qstr names from the preprocessor, so we wrap
-# the lines in "" and then unwrap after the preprocessor is finished.
-# See more information about this process in docs/develop/qstr.rst.
-$(HEADER_BUILD)/qstrdefs.generated.h: $(PY_QSTR_DEFS) $(QSTR_DEFS) $(QSTR_DEFS_COLLECTED) $(PY_SRC)/makeqstrdata.py source/mpconfigport.h $(MPCONFIGPORT_MK) $(PY_SRC)/mpconfig.h | $(HEADER_BUILD)
-       @$(ECHO) "GEN $@"
-       $(Q)$(CAT) $(PY_QSTR_DEFS) $(QSTR_DEFS) $(QSTR_DEFS_COLLECTED) | $(SED) 's/^Q(.*)/"&"/' | $(CPP) $(C_FLAGS) - | $(SED) 's/^\"\(Q(.*)\)\"/\1/' > $(HEADER_BUILD)/qstrdefs.preprocessed.h
-       $(Q)$(PYTHON) $(PY_SRC)/makeqstrdata.py $(HEADER_BUILD)/qstrdefs.preprocessed.h > $@
-
-# Compressed error strings.
-$(HEADER_BUILD)/compressed.split: $(HEADER_BUILD)/qstr.i.last
-       @$(ECHO) "GEN $@"
-       $(Q)$(PYTHON) $(PY_SRC)/makeqstrdefs.py split compress $< $(HEADER_BUILD)/compress _
-       $(Q)$(TOUCH) $@
-       
-$(HEADER_BUILD)/compressed.collected: $(HEADER_BUILD)/compressed.split
-       @$(ECHO) "GEN $@"
-       $(Q)$(PYTHON) $(PY_SRC)/makeqstrdefs.py $(CAT) compress _ $(HEADER_BUILD)/compress $@
-       
-$(HEADER_BUILD)/compressed.data.h: $(HEADER_BUILD)/compressed.collected
-       @$(ECHO) "GEN $@"
-       $(Q)$(PYTHON) $(PY_SRC)/makecompresseddata.py $< > $@
-       
-# build a list of registered modules for py/objmodule.c.
-$(HEADER_BUILD)/moduledefs.h: $(SRC_QSTR) $(QSTR_GLOBAL_DEPENDENCIES) | $(HEADER_BUILD)
-       @$(ECHO) "GEN $@"
-       $(Q)$(PYTHON) $(PY_SRC)/makemoduledefs.py --vpath="., $(TOP), $(USER_C_MODULES)" $(SRC_QSTR) > $@
-
-SRC_QSTR += $(HEADER_BUILD)/moduledefs.h
-
-INC += -I$(ROOT)/system/platform/$(strip $(PLAT))/boards/$(strip $(BOARD))/config
-INC += -I$(ROOT)/system/platform/$(strip $(PLAT))/include
-
-ifeq ($(strip $(PLAT)),Qualcomm)
-INC += -I$(COMPILER_PATH)/armv7m-none-eabi/libc/include
-INC += -I$(ROOT)/system/platform/$(strip $(PLAT))/boards/$(strip $(BOARD))/include/azure_api
-INC += -I$(ROOT)/system/platform/$(strip $(PLAT))/boards/$(strip $(BOARD))/include/azure_api/c-utility
-INC += -I$(ROOT)/system/platform/$(strip $(PLAT))/boards/$(strip $(BOARD))/include/azure_api/c-utility/inc
-INC += -I$(ROOT)/system/platform/$(strip $(PLAT))/boards/$(strip $(BOARD))/include/azure_api/c-utility/inc/azure_c_shared_utility
-INC += -I$(ROOT)/system/platform/$(strip $(PLAT))/boards/$(strip $(BOARD))/include/azure_api/c-utility/pal
-INC += -I$(ROOT)/system/platform/$(strip $(PLAT))/boards/$(strip $(BOARD))/include/azure_api/c-utility/pal/generic
-INC += -I$(ROOT)/system/platform/$(strip $(PLAT))/boards/$(strip $(BOARD))/include/azure_api/iothub_client
-INC += -I$(ROOT)/system/platform/$(strip $(PLAT))/boards/$(strip $(BOARD))/include/azure_api/iothub_client/inc
-INC += -I$(ROOT)/system/platform/$(strip $(PLAT))/boards/$(strip $(BOARD))/include/azure_api/iothub_client/inc/internal
-INC += -I$(ROOT)/system/platform/$(strip $(PLAT))/boards/$(strip $(BOARD))/include/azure_api/serializer
-INC += -I$(ROOT)/system/platform/$(strip $(PLAT))/boards/$(strip $(BOARD))/include/azure_api/serializer/inc
-INC += -I$(ROOT)/system/platform/$(strip $(PLAT))/boards/$(strip $(BOARD))/include/azure_api/umqtt
-INC += -I$(ROOT)/system/platform/$(strip $(PLAT))/boards/$(strip $(BOARD))/include/azure_api/umqtt/inc
-INC += -I$(ROOT)/system/platform/$(strip $(PLAT))/boards/$(strip $(BOARD))/include/azure_api/umqtt/inc/azure_umqtt_c
-INC += -I$(ROOT)/system/platform/$(strip $(PLAT))/boards/$(strip $(BOARD))/include/qapi
-INC += -I$(ROOT)/system/platform/$(strip $(PLAT))/boards/$(strip $(BOARD))/include/threadx_api
-INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/include
-INC += -I$(ROOT)/system/at
-INC += -I$(ROOT)/system/esim
-endif
-
-INC += -I.
-INC += -I$(HEADER_BUILD)
-INC += -I$(TOP)
-INC += -I$(TOP)/py
-INC += -I$(TOP)/extmod
-INC += -I$(TOP)/lib/utils
-INC += -I$(TOP)/lib/mp-readline
-INC += -I$(TOP)/lib/littlefs
-INC += -I$(TOP)/lib/netutils
-INC += -I$(TOP)/lib/timeutils
-INC += -I$(TOP)/ports/quectel/core
-INC += -I$(TOP)/ports/quectel/core/source
-INC += -I$(TOP)/ports/quectel/core/py
-INC += -I$(ROOT)/peripheral
-INC += -I$(ROOT)/system/include
-INC += -I$(ROOT)/system/platform/$(strip $(PLAT))/include
-INC += -I$(ROOT)/system/platform/$(strip $(PLAT))/boards/$(strip $(BOARD))/include
-INC += -I$(ROOT)/system/debug
-INC += -I$(ROOT)/system/dev
-INC += -I$(ROOT)/system/fs
-INC += -I$(ROOT)/system/hal
-INC += -I$(ROOT)/system/gnss
-INC += -I$(ROOT)/system/network
-INC += -I$(ROOT)/system/at
-INC += -I$(ROOT)/system/aliiot
-
-ifeq ($(strip $(PLAT)),ASR_1803s)
-INC += -I$(ROOT)/system/csd
-INC += -I$(ROOT)/system/esim
-endif
-ifeq ($(strip $(PLAT)),ASR_1606)
-INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/include
-endif
-
-ifeq ($(strip $(PLAT)),Unisoc)
-INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))
-INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/include
-INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include
-INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include/lwip
-INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include/lwip/apps
-INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include/lwip/priv
-INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include/lwip/prot
-INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include/netif
-INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include/posix
-INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include/posix/arpa
-INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include/posix/net
-INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include/posix/netinet
-INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include/posix/sys
-INC += -I$(ROOT)/system/at
-endif
-
-ifeq ($(strip $(PLAT)),Unisoc_8910_R05)
-INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))
-INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/include
-INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include
-INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include/lwip
-INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include/lwip/apps
-INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include/lwip/priv
-INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include/lwip/prot
-INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include/netif
-INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include/netif/ppp
-INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include/netif/ppp/polarssl
-INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include/compat/posix
-INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include/compat/posix/arpa
-INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include/compat/posix/net
-INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include/compat/posix/netinet
-INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include/compat/posix/sys
-INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include/compat/stdc
-endif
-
-ifeq ($(strip $(PLAT)),EIGEN)
-INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))
-INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/include
-INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/include/lwip
-INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/include/lwip/apps
-INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/include/lwip/priv
-INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/include/lwip/prot
-INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/include/arch
-INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/include/netif
-INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/include/posix
-INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/include/posix/sys
-endif
-
-ifeq ($(strip $(PLAT)),Unisoc_8850)
-INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))
-INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/include
-INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include
-INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include/lwip
-INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include/lwip/apps
-INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include/lwip/priv
-INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include/lwip/prot
-INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include/netif
-INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include/netif/ppp
-INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include/netif/ppp/polarssl
-INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include/compat/posix
-INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include/compat/posix/arpa
-INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include/compat/posix/net
-INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include/compat/posix/netinet
-INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include/compat/posix/sys
-INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include/compat/stdc
-endif
-
-ifeq ($(strip $(PLAT)),RDA)
-INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))
-INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/include
-INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/include/arch
-INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include
-INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include/lwip
-INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include/lwip/apps
-INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include/lwip/priv
-INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include/lwip/prot
-INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include/netif
-INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include/posix
-INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include/posix/arpa
-INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include/posix/net
-INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include/posix/netinet
-INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include/posix/sys
-endif
-
-ifeq ($(strip $(PLAT)), $(filter $(PLAT),ASR ASR_1803s))
-INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))
-INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/include
-INC += -I$(ROOT)/system/at
-endif
-
-ifeq ($(strip $(PLAT)),ECR6600)
-INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))
-INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/include
-endif
-
-ifeq (y, $(CONFIG_MBEDTLS))
-INC += -I$(ROOT)/system/mbedtls
-INC += -I$(ROOT)/system/mbedtls/include
-INC += -I$(ROOT)/system/mbedtls/include/mbedtls
-INC += -I$(ROOT)/system/mbedtls/library
-INC += -I$(ROOT)/system/mbedtls/port/helios/inc
-endif
-INC += -I$(ROOT)/system/network
-INC += -I$(ROOT)/system/os
-INC += -I$(ROOT)/system/startup
-INC += -I$(ROOT)/system/fota
-INC += -I$(ROOT)/system/bt
-INC += -I$(ROOT)/system/at
-ifeq (y, $(CONFIG_LVGL))
-INC += -I$(TOP)/lib/lvgl
-INC += -I$(TOP)/lib/lvgl/src
-INC += -I$(TOP)/lib/lvgl/src/core
-INC += -I$(TOP)/lib/lvgl/src/draw
-INC += -I$(TOP)/lib/lvgl/src/extra
-INC += -I$(TOP)/lib/lvgl/src/font
-INC += -I$(TOP)/lib/lvgl/src/gpu
-INC += -I$(TOP)/lib/lvgl/src/hal
-INC += -I$(TOP)/lib/lvgl/src/misc
-INC += -I$(TOP)/lib/lvgl/src/widgts
-endif
-INC += -I$(ROOT)/driver
-INC += -I$(ROOT)/driver/lcd
-ifeq (y, $(CONFIG_QRCODE))
-INC += -I$(ROOT)/components/qrcode
-endif
-ifeq (y, $(CONFIG_QUECTHING))
-INC += -I$(ROOT)/components/quecsdk/cloud
-INC += -I$(ROOT)/components/quecsdk/driverLayer
-INC += -I$(ROOT)/components/quecsdk/thirdLib/mqtt
-INC += -I$(ROOT)/components/quecsdk/thirdLib/cJSON
-INC += -I$(ROOT)/components/quecsdk/kernel
-endif
-ifeq ($(CONFIG_SPINAND), y)
-INC += -I$(ROOT)/components/fs/include
-INC += -I$(ROOT)/components/fs/yaffs/src/direct
-INC += -I$(ROOT)/components/fs/yaffs/src/port
-INC += -I$(ROOT)/components/fs/yaffs/src
-INC += -I$(ROOT)/components/fs/yaffs
-endif
-ifeq ($(CONFIG_RTMP), y)
-INC += -I$(ROOT)/components/rtmpdump/librtmp/inc
-INC += -I$(ROOT)/components/rtmpdump/libz/inc
-endif
-INC += -I$(ROOT)/utilities
-ifeq ($(CONFIG_JPEG), y)
-INC += -I$(ROOT)/components/jpeg/jpeg-9c
-INC += -I$(ROOT)/components/jpeg
-endif
-ifeq ($(CONFIG_HX3918), y)
-INC += -I$(ROOT)/components/HX3918
-endif
-ifeq ($(CONFIG_GH301x), y)
-INC += -I$(ROOT)/components/GH301x
-endif
-ifeq ($(CONFIG_SC7A20), y)
-INC += -I$(ROOT)/components/SC7A20
-endif
-ifeq ($(CONFIG_juphoon), y)
-INC += -I$(ROOT)/components/juphoon
-endif
-ifeq ($(CONFIG_POC_BND), y)
-INC += -I$(ROOT)/components/poc
-INC += -I$(ROOT)/components/poc/bnd/inc
-endif
-ifeq ($(CONFIG_POC_BND_XIN), y)
-INC += -I$(ROOT)/components/poc
-INC += -I$(ROOT)/components/poc/bnd_xin/inc
-endif
-ifeq ($(CONFIG_POC_SL), y)
-INC += -I$(ROOT)/components/poc
-INC += -I$(ROOT)/components/poc/sl/inc
-endif
-ifeq ($(CONFIG_POC_QS), y)
-INC += -I$(ROOT)/components/poc
-INC += -I$(ROOT)/components/poc/qs/inc
-endif
-#Stephen.Gao add 2022/11/23
-ifeq ($(CONFIG_POC_ZZD), y)
-INC += -I$(ROOT)/components/poc
-INC += -I$(ROOT)/components/poc/zzd/inc
-endif
-#Stephen.Gao add 2023/01/06
-ifeq ($(CONFIG_POC_YDWL), y)
-INC += -I$(ROOT)/components/poc
-INC += -I$(ROOT)/components/poc/ydwl/inc
-endif
-
-ifeq ($(CONFIG_POC_SLPOC), y)
-INC += -I$(ROOT)/components/poc  -I$(ROOT)/components/poc/slpoc/src
-INC += -I$(ROOT)/components/poc/slpoc/inc
-SRC_QSTR += $(ROOT)/components/poc/slpoc/src/modpoc_slpoc.c
-endif
-
-ifeq ($(CONFIG_POC_RDA_BND), y)
-INC += -I$(ROOT)/components/poc  -I$(ROOT)/components/poc/rda_bnd/src
-INC += -I$(ROOT)/components/poc/rda_bnd/inc
-SRC_QSTR += $(ROOT)/components/poc/rda_bnd/src/modpocrda.c
-endif
-
-
-ifeq (y,$(CONFIG_DECODE_ZBAR))
-INC += -I$(ROOT)/components/decode/ZBar/zbar
-INC += -I$(ROOT)/components/decode/ZBar/include
-INC += -I$(ROOT)/components/decode/ZBar/zbar/decoder
-INC += -I$(ROOT)/components/decode/ZBar/zbar/qrcode
-endif
-ifeq (y,$(CONFIG_DECODE_QUECTEL))
-INC += -I$(ROOT)/components/decode/quectel/inc
-endif
-
-ifeq (y,$(CONFIG_DECODE_QINGYA))
-ifneq ($(strip $(PLAT)),ASR)
-ifneq ($(strip $(PLAT)),ASR_1606)
-INC += -I$(ROOT)/components/decode/qingya
-endif
-endif
-endif
-
-ifeq ($(CONFIG_SPI_SDCARD), y)
-INC += -I$(ROOT)/components/fs/fatfs/include
-endif
-
-ifeq ($(CONFIG_AUDIO_G711_COMPRESS), y)
-INC += -I$(ROOT)/components/audio/G711
-endif
-ifeq ($(strip $(PLAT)),EIGEN)
-INC += -I$(ROOT)/components/audio
-endif
-
-ifeq ($(CONFIG_GMSSL), y)
-INC += -I$(ROOT)/components/GMSSL/include
-INC += -I$(ROOT)/components/GMSSL/include/gmssl
-endif
-
-ifeq ($(CONFIG_AUDIO_G729_COMPRESS), y)
-INC += -I$(ROOT)/components/audio/G729
-INC += -I$(ROOT)/components/audio/G729/src
-INC += -I$(ROOT)/components/audio/G729/include
-endif
-
-# compiler settings
-CWARN = -Wall -Werror
-CWARN += -Wpointer-arith -Wuninitialized
-C_FLAGS = $(INC) $(CWARN) -std=gnu99 $(C_FLAGS_MOD) $(COPT) $(C_FLAGS_EXTRA)
-C_FLAGS += -fdata-sections -ffunction-sections -fno-asynchronous-unwind-tables --include=../../../../../../config/autoconf.h
-
-LD_FLAGS_ARCH = -Wl,-Map=$@.map,--cref -Wl,--gc-sections
-LD_FLAGS = $(LD_FLAGS_MOD) $(LD_FLAGS_ARCH) -lm $(LD_FLAGS_EXTRA)
-
-D_FLAGS += $(foreach dflag, $(DFLAGS), -D$(dflag))
-D_FLAGS += -DMP_CONFIGFILE="\"ports/quectel/core/source/mpconfigport.h\"" \
-                 -DMICROPY_MPTHREADPORT_H="\"ports/quectel/core/source/mpthreadport.h\"" \
-                 -DMICROPY_MPHALPORT_H="\"ports/quectel/core/source/mphalport.h\""
-
-vpath %.S . $(TOP) $(USER_C_MODULES)
-$(BUILD)/%.o: %.S
-       @$(ECHO) "CC $<"
-       $(Q)$(CC) $(C_FLAGS) $(D_FLAGS) -c -o $@ $<
-
-vpath %.s . $(TOP) $(USER_C_MODULES)
-$(BUILD)/%.o: %.s
-       @$(ECHO) "AS $<"
-       $(Q)$(AS) -o $@ $<
-QSTR_GEN_EXTRA_C_FLAGS += -DNO_QSTR
-vpath %.c . $(TOP) $(USER_C_MODULES)
-$(BUILD)/%.pp: %.c
-       @$(ECHO) "PreProcess $<"
-       $(Q)$(CPP) $(C_FLAGS) $(D_FLAGS) -Wp,-C,-dD,-dI -o $@ $<
-
-#$(OBJ): | $(HEADER_BUILD)/qstrdefs.generated.h $(HEADER_BUILD)/mpversion.h
-
-
-$(HEADER_BUILD)/qstr.i.last: $(SRC_QSTR) $(QSTR_GLOBAL_DEPENDENCIES) | $(QSTR_GLOBAL_REQUIREMENTS)
-       @$(ECHO) "GEN $@"
-       @rm -f $@ $@.dep
-       @for src in $(if $(filter $?,$(QSTR_GLOBAL_DEPENDENCIES)),$^,$(if $?,$?,$^)); \
-       do \
-               echo $$src >> $@.dep; \
-       done
-       @while read -r src; \
-               do \
-                       echo processing on $$src ...; \
-                       $(CPP) $(QSTR_GEN_EXTRA_C_FLAGS) $(C_FLAGS) $(D_FLAGS) $$src >> $@; \
-       done < $@.dep
-
-$(HEADER_BUILD)/qstr.split: $(HEADER_BUILD)/qstr.i.last
-       @$(ECHO) "GEN $@"
-       $(Q)$(PYTHON) $(PY_SRC)/makeqstrdefs.py split qstr $(HEADER_BUILD)/qstr.i.last $(HEADER_BUILD)/qstr $(QSTR_DEFS_COLLECTED)
-       $(Q)$(TOUCH) $@
-
-$(QSTR_DEFS_COLLECTED): $(HEADER_BUILD)/qstr.split
-       @$(ECHO) "GEN $@"
-       $(Q)$(PYTHON) $(PY_SRC)/makeqstrdefs.py cat qstr $(HEADER_BUILD)/qstr.i.last $(HEADER_BUILD)/qstr $(QSTR_DEFS_COLLECTED)
-
-
-$(BUILD)/%.mpy: $(FROZEN_MPY_DIR)/%.py
-       @$(ECHO) "MPY $<"
-       $(Q)$(MKDIR) -p $(dir $@)
-       $(Q)$(MPY_CROSS) -o $@ -s $(<:$(FROZEN_MPY_DIR)/%=%) $(MPY_CROSS_FLAGS) $<
-
-ifeq ($(strip $(PLAT)),RDA)
-frozen_mpy_list =      $(BUILD)/_boot_RDA.mpy \
-                                       $(BUILD)/system.mpy \
-                                       $(BUILD)/dataCall.mpy \
-                                       $(BUILD)/umqtt.mpy \
-                                       $(BUILD)/sys_bus.mpy \
-                                       $(BUILD)/queue.mpy \
-                                       $(BUILD)/log.mpy \
-                                       $(BUILD)/request.mpy \
-                                       $(BUILD)/ql_fs.mpy \
-                                       $(BUILD)/app_fota_mount.mpy \
-                                       $(BUILD)/app_fota_download.mpy \
-                                       $(BUILD)/checksum.mpy \
-                                       $(BUILD)/file_crc32.mpy \
-                                       $(BUILD)/app_fota_updater.mpy \
-                                       $(BUILD)/app_fota.mpy \
-                                       $(BUILD)/backup_restore.mpy \
-                                       $(BUILD)/event_message.mpy \
-                                       $(BUILD)/ntptime.mpy \
-                                       $(BUILD)/checkNet.mpy \
-                                       $(BUILD)/uping.mpy \
-                                       $(BUILD)/ymodem.mpy \
-
-ifeq ($(strip $(BOARD)),$(filter $(strip $(BOARD)),BC25B8PA_LBS))
-       frozen_mpy_list +=      $(BUILD)/cellLocator.mpy 
-endif
-
-else ifeq ($(strip $(PLAT)),ASR_1803s)
-frozen_mpy_list =      $(BUILD)/_boot.mpy \
-                                       $(BUILD)/system.mpy \
-                                       $(BUILD)/checkNet.mpy \
-                                       $(BUILD)/ntptime.mpy \
-                                       $(BUILD)/dataCall.mpy \
-                                       $(BUILD)/log.mpy \
-                                       $(BUILD)/request.mpy \
-                                       $(BUILD)/umqtt.mpy \
-                                       $(BUILD)/ql_fs.mpy \
-                                       $(BUILD)/app_fota_mount.mpy \
-                                       $(BUILD)/app_fota_download.mpy \
-                                       $(BUILD)/checksum.mpy \
-                                       $(BUILD)/file_crc32.mpy \
-                                       $(BUILD)/app_fota_updater.mpy \
-                                       $(BUILD)/app_fota.mpy \
-                                       $(BUILD)/backup_restore.mpy \
-                                       $(BUILD)/queue.mpy \
-                                       $(BUILD)/sys_bus.mpy \
-                                       $(BUILD)/event_message.mpy \
-                                       $(BUILD)/bak_util.mpy \
-                                       $(BUILD)/cellLocator.mpy \
-                                       $(BUILD)/ftplib.mpy \
-                                       $(BUILD)/ftplibtls.mpy \
-                                       $(BUILD)/uwebsocket.mpy \
-                                       $(BUILD)/uping.mpy \
-                                       $(BUILD)/ymodem.mpy \
-
-else ifeq ($(strip $(PLAT)),Qualcomm)
-frozen_mpy_list =      $(BUILD)/_boot_Qualcomm.mpy \
-                                       $(BUILD)/system.mpy \
-                                       $(BUILD)/checkNet.mpy \
-                                       $(BUILD)/ntptime.mpy \
-                                       $(BUILD)/dataCall.mpy \
-                                       $(BUILD)/umqtt.mpy \
-                                       $(BUILD)/log.mpy \
-                                       $(BUILD)/request.mpy \
-                                       $(BUILD)/ql_fs.mpy \
-                                       $(BUILD)/app_fota_download.mpy \
-                                       $(BUILD)/checksum.mpy \
-                                       $(BUILD)/file_crc32.mpy \
-                                       $(BUILD)/app_fota_mount.mpy \
-                                       $(BUILD)/app_fota_updater.mpy \
-                                       $(BUILD)/app_fota.mpy \
-                                       $(BUILD)/backup_restore.mpy \
-                                       $(BUILD)/queue.mpy \
-                                       $(BUILD)/sys_bus.mpy \
-                                       $(BUILD)/event_message.mpy \
-                                       $(BUILD)/bak_util.mpy \
-                                       $(BUILD)/uwebsocket.mpy \
-                                       $(BUILD)/uping.mpy \
-                                       $(BUILD)/ymodem.mpy \
-
-else ifeq ($(strip $(PLAT)),ASR_1606)
-ifeq ($(strip $(BOARD)),$(filter $(strip $(BOARD)),EC600MCN_CC EC800MCN_CC EC600MCN_CC_EXT EC600MCN_LF_SLPOC))
-frozen_mpy_list =      $(BUILD)/_boot.mpy \
-                                       $(BUILD)/system.mpy \
-                                       $(BUILD)/dataCall.mpy \
-                                       $(BUILD)/umqtt.mpy \
-                                       $(BUILD)/queue.mpy \
-                                       $(BUILD)/log.mpy \
-                                       $(BUILD)/request.mpy \
-                                       $(BUILD)/ql_fs.mpy \
-                                       $(BUILD)/app_fota_mount.mpy \
-                                       $(BUILD)/app_fota_download.mpy \
-                                       $(BUILD)/checksum.mpy \
-                                       $(BUILD)/file_crc32.mpy \
-                                       $(BUILD)/app_fota_updater.mpy \
-                                       $(BUILD)/app_fota.mpy \
-                                       $(BUILD)/backup_restore.mpy \
-                                       $(BUILD)/ntptime.mpy \
-                                       $(BUILD)/checkNet.mpy \
-                                       $(BUILD)/ymodem.mpy
-
-else ifeq ($(strip $(BOARD)),$(filter $(strip $(BOARD)),EC600MCN_CC_EXT_TTS))
-frozen_mpy_list =      $(BUILD)/_boot.mpy \
-                                       $(BUILD)/dataCall.mpy \
-                                       $(BUILD)/file_crc32.mpy \
-                                       $(BUILD)/ntptime.mpy \
-                                       $(BUILD)/ymodem.mpy
-else
-frozen_mpy_list =      $(BUILD)/_boot.mpy \
-                                       $(BUILD)/umqtt.mpy \
-                                       $(BUILD)/ntptime.mpy \
-                                       $(BUILD)/request.mpy \
-                                       $(BUILD)/log.mpy \
-                                       $(BUILD)/aLiYun.mpy \
-                                       $(BUILD)/hmac.mpy \
-                                       $(BUILD)/hashlib.mpy \
-                                       $(BUILD)/base64.mpy \
-                                       $(BUILD)/TenCentYun.mpy \
-                                       $(BUILD)/file_sha256.mpy \
-                                       $(BUILD)/checksum.mpy \
-                                       $(BUILD)/checkNet.mpy \
-                                       $(BUILD)/dataCall.mpy \
-                                       $(BUILD)/ql_fs.mpy \
-                                       $(BUILD)/app_fota_mount.mpy \
-                                       $(BUILD)/app_fota_download.mpy\
-                                       $(BUILD)/app_fota_updater.mpy \
-                                       $(BUILD)/app_fota.mpy \
-                                       $(BUILD)/backup_restore.mpy \
-                                       $(BUILD)/file_crc32.mpy \
-                                       $(BUILD)/system.mpy \
-                                       $(BUILD)/gnss.mpy \
-                                       $(BUILD)/unzip.mpy \
-                                       $(BUILD)/queue.mpy \
-                                       $(BUILD)/sys_bus.mpy \
-                                       $(BUILD)/event_message.mpy \
-                                       $(BUILD)/hls.mpy \
-                                       $(BUILD)/wifilocator.mpy \
-                                       $(BUILD)/cellLocator.mpy \
-                                       $(BUILD)/bak_util.mpy \
-                                       $(BUILD)/uwebsocket.mpy \
-                                       $(BUILD)/uping.mpy \
-                                       $(BUILD)/ymodem.mpy \
-                                       $(BUILD)/common.mpy \
-                                       $(BUILD)/constants.mpy \
-                                       $(BUILD)/EventMesh.mpy \
-                                       $(BUILD)/mgr.mpy \
-                                       $(BUILD)/protocol.mpy \
-                                       $(BUILD)/ui.mpy \
-                                       $(BUILD)/main_init.mpy \
-                                       $(BUILD)/versions.mpy \
-                                       $(BUILD)/motor.mpy \
-                                       $(BUILD)/ai_VC.mpy \
-                                       $(BUILD)/ai_alarm.mpy \
-                                       $(BUILD)/voice_record.mpy \
-
-endif
-
-else ifeq ($(strip $(PLAT)),Unisoc_8850)
-ifeq ($(strip $(BOARD)),$(filter $(strip $(BOARD)),EC600GCN_LD EC600GCN_LD_YM EC800GCN_LD EC800GCN_LD_HRXM))
-frozen_mpy_list =      $(BUILD)/_boot.mpy \
-                                       $(BUILD)/umqtt.mpy \
-                                       $(BUILD)/ntptime.mpy \
-                                       $(BUILD)/request.mpy \
-                                       $(BUILD)/log.mpy \
-                                       $(BUILD)/checksum.mpy \
-                                       $(BUILD)/checkNet.mpy \
-                                       $(BUILD)/dataCall.mpy \
-                                       $(BUILD)/ql_fs.mpy \
-                                       $(BUILD)/app_fota_mount.mpy \
-                                       $(BUILD)/app_fota_download.mpy\
-                                       $(BUILD)/app_fota_updater.mpy \
-                                       $(BUILD)/app_fota.mpy \
-                                       $(BUILD)/backup_restore.mpy \
-                                       $(BUILD)/file_crc32.mpy \
-                                       $(BUILD)/system.mpy \
-                                       $(BUILD)/queue.mpy \
-                                       $(BUILD)/sys_bus.mpy \
-                                       $(BUILD)/event_message.mpy \
-                                       $(BUILD)/bak_util.mpy \
-                                       $(BUILD)/ymodem.mpy \
-                                       
-else
-frozen_mpy_list =      $(BUILD)/_boot.mpy \
-                                       $(BUILD)/umqtt.mpy \
-                                       $(BUILD)/ntptime.mpy \
-                                       $(BUILD)/request.mpy \
-                                       $(BUILD)/log.mpy \
-                                       $(BUILD)/aLiYun.mpy \
-                                       $(BUILD)/hmac.mpy \
-                                       $(BUILD)/hashlib.mpy \
-                                       $(BUILD)/base64.mpy \
-                                       $(BUILD)/TenCentYun.mpy \
-                                       $(BUILD)/file_sha256.mpy \
-                                       $(BUILD)/checksum.mpy \
-                                       $(BUILD)/checkNet.mpy \
-                                       $(BUILD)/dataCall.mpy \
-                                       $(BUILD)/ql_fs.mpy \
-                                       $(BUILD)/app_fota_mount.mpy \
-                                       $(BUILD)/app_fota_download.mpy\
-                                       $(BUILD)/app_fota_updater.mpy \
-                                       $(BUILD)/app_fota.mpy \
-                                       $(BUILD)/backup_restore.mpy \
-                                       $(BUILD)/file_crc32.mpy \
-                                       $(BUILD)/system.mpy \
-                                       $(BUILD)/gnss.mpy \
-                                       $(BUILD)/unzip.mpy \
-                                       $(BUILD)/queue.mpy \
-                                       $(BUILD)/sys_bus.mpy \
-                                       $(BUILD)/event_message.mpy \
-                                       $(BUILD)/hls.mpy \
-                                       $(BUILD)/wifilocator.mpy \
-                                       $(BUILD)/bak_util.mpy \
-                                       $(BUILD)/ftplib.mpy \
-                                       $(BUILD)/ftplibtls.mpy \
-                                       $(BUILD)/uwebsocket.mpy \
-                                       $(BUILD)/uping.mpy \
-                                       $(BUILD)/ymodem.mpy \
-                                       
-endif
-
-else ifeq ($(strip $(PLAT)),EIGEN)
-ifeq ($(strip $(BOARD)),$(filter $(strip $(BOARD)),EC800ECN_LC_WDF))
-frozen_mpy_list =      $(BUILD)/_boot_WDF.mpy \
-                                       $(BUILD)/umqtt.mpy \
-                                       $(BUILD)/dataCall.mpy \
-                                       $(BUILD)/log.mpy \
-                                       $(BUILD)/request.mpy \
-                                       $(BUILD)/aLiYun.mpy \
-                                       $(BUILD)/hmac.mpy \
-                                       $(BUILD)/hashlib.mpy \
-                                       $(BUILD)/ntptime.mpy \
-                                       $(BUILD)/checksum.mpy \
-                                       $(BUILD)/checkNet.mpy \
-                                       $(BUILD)/ql_fs.mpy \
-                                       $(BUILD)/app_fota_mount.mpy \
-                                       $(BUILD)/app_fota_download.mpy\
-                                       $(BUILD)/app_fota_updater.mpy \
-                                       $(BUILD)/app_fota.mpy \
-                                       $(BUILD)/backup_restore.mpy \
-                                       $(BUILD)/file_crc32.mpy \
-                                       $(BUILD)/system.mpy \
-                                       $(BUILD)/queue.mpy \
-                                       $(BUILD)/sys_bus.mpy \
-                                       $(BUILD)/event_message.mpy \
-                                       $(BUILD)/bak_util.mpy \
-                                       $(BUILD)/ftplib.mpy \
-                                       $(BUILD)/ftplibtls.mpy \
-                                       $(BUILD)/ymodem.mpy \
-
-else
-frozen_mpy_list =      $(BUILD)/_boot.mpy \
-                                       $(BUILD)/umqtt.mpy \
-                                       $(BUILD)/dataCall.mpy \
-                                       $(BUILD)/log.mpy \
-                                       $(BUILD)/request.mpy \
-                                       $(BUILD)/aLiYun.mpy \
-                                       $(BUILD)/hmac.mpy \
-                                       $(BUILD)/hashlib.mpy \
-                                       $(BUILD)/ntptime.mpy \
-                                       $(BUILD)/checksum.mpy \
-                                       $(BUILD)/checkNet.mpy \
-                                       $(BUILD)/ql_fs.mpy \
-                                       $(BUILD)/app_fota_mount.mpy \
-                                       $(BUILD)/app_fota_download.mpy\
-                                       $(BUILD)/app_fota_updater.mpy \
-                                       $(BUILD)/app_fota.mpy \
-                                       $(BUILD)/backup_restore.mpy \
-                                       $(BUILD)/file_crc32.mpy \
-                                       $(BUILD)/system.mpy \
-                                       $(BUILD)/queue.mpy \
-                                       $(BUILD)/sys_bus.mpy \
-                                       $(BUILD)/event_message.mpy \
-                                       $(BUILD)/bak_util.mpy \
-                                       $(BUILD)/ftplib.mpy \
-                                       $(BUILD)/ftplibtls.mpy \
-                                       $(BUILD)/cellLocator.mpy \
-                                       $(BUILD)/ymodem.mpy \
-                                       
-endif
-
-else ifeq ($(strip $(PLAT)),ECR6600)
-frozen_mpy_list =      $(BUILD)/_boot_WIFI.mpy \
-                                       $(BUILD)/umqtt.mpy \
-                                       $(BUILD)/request.mpy \
-                                       $(BUILD)/ql_fs.mpy \
-                                       $(BUILD)/queue.mpy \
-                                       $(BUILD)/sys_bus.mpy \
-
-else
-ifeq ($(strip $(BOARD)),$(filter $(strip $(BOARD)),EC600UEU_AB_POC))
-frozen_mpy_list =      $(BUILD)/_boot.mpy \
-                                       $(BUILD)/ntptime.mpy \
-                                       $(BUILD)/log.mpy \
-                                       $(BUILD)/file_sha256.mpy \
-                                       $(BUILD)/checksum.mpy \
-                                       $(BUILD)/checkNet.mpy \
-                                       $(BUILD)/dataCall.mpy \
-                                       $(BUILD)/ql_fs.mpy \
-                                       $(BUILD)/app_fota_mount.mpy \
-                                       $(BUILD)/app_fota_download.mpy\
-                                       $(BUILD)/app_fota_updater.mpy \
-                                       $(BUILD)/app_fota.mpy \
-                                       $(BUILD)/backup_restore.mpy \
-                                       $(BUILD)/file_crc32.mpy \
-                                       $(BUILD)/system.mpy \
-                                       $(BUILD)/queue.mpy \
-                                       $(BUILD)/bak_util.mpy \
-                                       $(BUILD)/ymodem.mpy 
-else
-frozen_mpy_list =      $(BUILD)/_boot.mpy \
-                                       $(BUILD)/umqtt.mpy \
-                                       $(BUILD)/ntptime.mpy \
-                                       $(BUILD)/request.mpy \
-                                       $(BUILD)/log.mpy \
-                                       $(BUILD)/aLiYun.mpy \
-                                       $(BUILD)/hmac.mpy \
-                                       $(BUILD)/hashlib.mpy \
-                                       $(BUILD)/base64.mpy \
-                                       $(BUILD)/TenCentYun.mpy \
-                                       $(BUILD)/file_sha256.mpy \
-                                       $(BUILD)/checksum.mpy \
-                                       $(BUILD)/checkNet.mpy \
-                                       $(BUILD)/dataCall.mpy \
-                                       $(BUILD)/ql_fs.mpy \
-                                       $(BUILD)/app_fota_mount.mpy \
-                                       $(BUILD)/app_fota_download.mpy\
-                                       $(BUILD)/app_fota_updater.mpy \
-                                       $(BUILD)/app_fota.mpy \
-                                       $(BUILD)/backup_restore.mpy \
-                                       $(BUILD)/file_crc32.mpy \
-                                       $(BUILD)/system.mpy \
-                                       $(BUILD)/gnss.mpy \
-                                       $(BUILD)/unzip.mpy \
-                                       $(BUILD)/queue.mpy \
-                                       $(BUILD)/sys_bus.mpy \
-                                       $(BUILD)/event_message.mpy \
-                                       $(BUILD)/hls.mpy \
-                                       $(BUILD)/wifilocator.mpy \
-                                       $(BUILD)/bak_util.mpy \
-                                       $(BUILD)/ftplib.mpy \
-                                       $(BUILD)/ftplibtls.mpy \
-                                       $(BUILD)/uwebsocket.mpy \
-                                       $(BUILD)/uping.mpy \
-                                       $(BUILD)/ymodem.mpy 
-endif
-endif
-
-$(BUILD)/_frozen_mpy.c: $(frozen_mpy_list) $(HEADER_BUILD)/qstrdefs.generated.h
-       @$(ECHO) "MISC freezing bytecode"
-       $(Q)$(MPY_TOOL) -f -q $(HEADER_BUILD)/qstrdefs.preprocessed.h $(frozen_mpy_list) > $@
-
-$(BUILD):
-       $(Q)echo creating directory: $@
-       -$(Q)$(MKDIR) $@
-
-all:$(BUILD) $(HEADER_BUILD)/qstrdefs.generated.h $(HEADER_BUILD)/moduledefs.h  $(HEADER_BUILD)/compressed.data.h $(BUILD)/_frozen_mpy.c
-
-clean:
-       @echo ----- cleaning microPython private target
-       @rm -rf $(HEADER_BUILD)
-       @rm -rf $(BUILD)
-       @echo ----- done.
+# Copyright (c) Quectel Wireless Solution, Co., Ltd.All Rights Reserved.\r
+#\r
+# Licensed under the Apache License, Version 2.0 (the "License");\r
+# you may not use this file except in compliance with the License.\r
+# You may obtain a copy of the License at\r
+#\r
+#     http://www.apache.org/licenses/LICENSE-2.0\r
+#\r
+# Unless required by applicable law or agreed to in writing, software\r
+# distributed under the License is distributed on an "AS IS" BASIS,\r
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+# See the License for the specific language governing permissions and\r
+# limitations under the License.\r
+\r
+#env\r
+TOP := ../../..\r
+ROOT := $(TOP)/../..\r
+\r
+KCONFIG_CONFIG_DIR := ../../../../..\r
+include $(KCONFIG_CONFIG_DIR)/config/$(KCONFIG_CONFIG)\r
+\r
+ifeq ("$(origin V)", "command line")\r
+BUILD_VERBOSE=$(V)\r
+endif\r
+ifndef BUILD_VERBOSE\r
+BUILD_VERBOSE = 0\r
+endif\r
+# ifeq ($(BUILD_VERBOSE),0)\r
+# Q = @\r
+# else\r
+# Q =\r
+# endif\r
+\r
+BUILD ?= build\r
+FROZEN_MPY_DIR ?= .\r
+\r
+RM = rm\r
+ECHO = echo\r
+CP = cp\r
+MKDIR = mkdir\r
+SED = sed\r
+CAT = cat\r
+TOUCH = touch\r
+\r
+MAKE_MANIFEST = $(PYTHON) $(TOP)/tools/makemanifest.py\r
+MAKE_FROZEN = $(PYTHON) $(TOP)/tools/make-frozen.py\r
+#because E-safeNet, mpy-cross could not read the py file, rename as notepad++\r
+ifeq ($(strip $(HOST)),linux)\r
+MPY_CROSS = $(TOP)/ports/quectel/tools/mpy-cross\r
+else\r
+MPY_CROSS = $(TOP)/ports/quectel/tools/notepad++.exe\r
+endif\r
+MPY_TOOL = $(PYTHON) $(TOP)/tools/mpy-tool.py\r
+\r
+QSTR_DEFS = source/qstrdefsport.h\r
+#py\r
+PY_SRC ?= $(TOP)/py\r
+HEADER_BUILD = $(TOP)/genhdr\r
+PY_QSTR_DEFS = $(PY_SRC)/qstrdefs.h\r
+ifneq ($(QSTR_AUTOGEN_DISABLE),1)\r
+QSTR_DEFS_COLLECTED = $(HEADER_BUILD)/qstrdefs.collected.h\r
+endif\r
+QSTR_GLOBAL_DEPENDENCIES += $(PY_SRC)/mpconfig.h source/mpconfigport.h\r
+CSUPEROPT = -O3\r
+ifeq ($(strip $(PLAT)),ECR6600)\r
+MPY_CROSS_FLAGS += -march=xtensa\r
+else\r
+MPY_CROSS_FLAGS += -march=armv7m\r
+endif\r
+# Enable building 32-bit code on 64-bit host.\r
+ifeq ($(MICROPY_FORCE_32BIT),1)\r
+CC += -m32\r
+CXX += -m32\r
+LD += -m32\r
+endif\r
+\r
+# External modules written in C.\r
+ifneq ($(USER_C_MODULES),)\r
+# pre-define USERMOD variables as expanded so that variables are immediate\r
+# expanded as they're added to them\r
+SRC_USERMOD :=\r
+C_FLAGS_USERMOD :=\r
+LD_FLAGS_USERMOD :=\r
+$(foreach module, $(wildcard $(USER_C_MODULES)/*/micropython.mk), \\r
+    $(eval USERMOD_DIR = $(patsubst %/,%,$(dir $(module))))\\r
+    $(info Including User C Module from $(USERMOD_DIR))\\r
+       $(eval include $(module))\\r
+)\r
+\r
+SRC_MOD += $(patsubst $(USER_C_MODULES)/%.c,%.c,$(SRC_USERMOD))\r
+C_FLAGS_MOD += $(C_FLAGS_USERMOD)\r
+LD_FLAGS_MOD += $(LD_FLAGS_USERMOD)\r
+endif\r
+\r
+# py object files\r
+PY_CORE_O_BASENAME = $(addprefix py/,\\r
+       mpstate.o \\r
+       nlr.o \\r
+       nlrx86.o \\r
+       nlrx64.o \\r
+       nlrthumb.o \\r
+       nlrpowerpc.o \\r
+       nlrxtensa.o \\r
+       nlrsetjmp.o \\r
+       malloc.o \\r
+       gc.o \\r
+       pystack.o \\r
+       qstr.o \\r
+       vstr.o \\r
+       mpprint.o \\r
+       unicode.o \\r
+       mpz.o \\r
+       reader.o \\r
+       lexer.o \\r
+       parse.o \\r
+       scope.o \\r
+       compile.o \\r
+       emitcommon.o \\r
+       emitbc.o \\r
+       asmbase.o \\r
+       asmx64.o \\r
+       emitnx64.o \\r
+       asmx86.o \\r
+       emitnx86.o \\r
+       asmthumb.o \\r
+       emitnthumb.o \\r
+       emitinlinethumb.o \\r
+       asmarm.o \\r
+       emitnarm.o \\r
+       asmxtensa.o \\r
+       emitnxtensa.o \\r
+       emitinlinextensa.o \\r
+       emitnxtensawin.o \\r
+       formatfloat.o \\r
+       parsenumbase.o \\r
+       parsenum.o \\r
+       emitglue.o \\r
+       persistentcode.o \\r
+       runtime.o \\r
+       runtime_utils.o \\r
+       scheduler.o \\r
+       nativeglue.o \\r
+       pairheap.o \\r
+       ringbuf.o \\r
+       stackctrl.o \\r
+       argcheck.o \\r
+       warning.o \\r
+       profile.o \\r
+       map.o \\r
+       obj.o \\r
+       objarray.o \\r
+       objattrtuple.o \\r
+       objbool.o \\r
+       objboundmeth.o \\r
+       objcell.o \\r
+       objclosure.o \\r
+       objcomplex.o \\r
+       objdeque.o \\r
+       objdict.o \\r
+       objenumerate.o \\r
+       objexcept.o \\r
+       objfilter.o \\r
+       objfloat.o \\r
+       objfun.o \\r
+       objgenerator.o \\r
+       objgetitemiter.o \\r
+       objint.o \\r
+       objint_longlong.o \\r
+       objint_mpz.o \\r
+       objlist.o \\r
+       objmap.o \\r
+       objmodule.o \\r
+       objobject.o \\r
+       objpolyiter.o \\r
+       objproperty.o \\r
+       objnone.o \\r
+       objnamedtuple.o \\r
+       objrange.o \\r
+       objreversed.o \\r
+       objset.o \\r
+       objsingleton.o \\r
+       objslice.o \\r
+       objstr.o \\r
+       objstrunicode.o \\r
+       objstringio.o \\r
+       objtuple.o \\r
+       objtype.o \\r
+       objzip.o \\r
+       opmethods.o \\r
+       sequence.o \\r
+       stream.o \\r
+       binary.o \\r
+       builtinimport.o \\r
+       builtinevex.o \\r
+       builtinhelp.o \\r
+       modarray.o \\r
+       modbuiltins.o \\r
+       modcollections.o \\r
+       modgc.o \\r
+       modio.o \\r
+       modmath.o \\r
+       modcmath.o \\r
+       modmicropython.o \\r
+       modstruct.o \\r
+       modsys.o \\r
+       moduerrno.o \\r
+       modthread.o \\r
+       vm.o \\r
+       bc.o \\r
+       showbc.o \\r
+       repl.o \\r
+       smallint.o \\r
+       frozenmod.o \\r
+       )\r
+\r
+PY_EXTMOD_O_BASENAME = \\r
+       extmod/moductypes.o \\r
+       extmod/modujson.o \\r
+       extmod/modure.o \\r
+       extmod/moduzlib.o \\r
+       extmod/moduheapq.o \\r
+       extmod/modutimeq.o \\r
+       extmod/modubinascii.o \\r
+       extmod/virtpin.o \\r
+       extmod/machine_mem.o \\r
+       extmod/machine_pinbase.o \\r
+       extmod/machine_signal.o \\r
+       extmod/machine_pulse.o \\r
+       extmod/machine_i2c.o \\r
+       extmod/machine_spi.o \\r
+       extmod/modbluetooth.o \\r
+       extmod/modurandom.o \\r
+       extmod/moduselect.o \\r
+       extmod/moduasyncio.o \\r
+       extmod/moduwebsocket.o \\r
+       extmod/modwebrepl.o \\r
+       extmod/modframebuf.o \\r
+       extmod/vfs.o \\r
+       extmod/vfs_blockdev.o \\r
+       extmod/vfs_reader.o \\r
+       extmod/vfs_posix.o \\r
+       extmod/vfs_posix_file.o \\r
+       extmod/vfs_fat.o \\r
+       extmod/vfs_fat_file.o \\r
+       extmod/vfs_lfs.o \\r
+       extmod/utime_mphal.o \\r
+       extmod/uos_dupterm.o \\r
+       extmod/modussl_mbedtls.o \\r
+       extmod/moduhashlib.o \\r
+       extmod/moducryptolib.o \\r
+       lib/embed/abort_.o \\r
+       lib/utils/printf.o \\r
+       lib/utils/sys_stdio_mphal.o\r
+\r
+ifeq ($(strip $(PLAT)),Qualcomm)\r
+PY_EXTMOD_O_BASENAME += \\r
+       extmod/vfs_efs.o \\r
+       extmod/vfs_efs_file.o\r
+endif\r
+\r
+ifeq ($(strip $(PLAT)), $(filter $(PLAT),Unisoc Unisoc_8910_R05))\r
+PY_EXTMOD_O_BASENAME += \\r
+       extmod/vfs_temp.o \\r
+       extmod/vfs_temp_file.o\r
+endif\r
+\r
+# Sources that may contain qstrings\r
+SRC_QSTR_IGNORE = py/nlr%\r
+SRC_QSTR += $(SRC_MOD) $(filter-out $(SRC_QSTR_IGNORE),$(PY_CORE_O_BASENAME:.o=.c)) $(PY_EXTMOD_O_BASENAME:.o=.c)\r
+SRC_QSTR += \\r
+                       source/modalipay.c \\r
+                       source/audio_audio.c \\r
+                       source/audio_queue.c \\r
+                       source/audio_record.c \\r
+                       source/audio_tts.c \\r
+                       source/audiocodec_rt5616.c \\r
+                       source/callbackdeal.c \\r
+                       source/camera_capture.c \\r
+                       source/camera_preview.c \\r
+                       source/camera_scandecode.c \\r
+                       source/devreport.c \\r
+                       source/machine_extint.c \\r
+                       source/machine_hw_spi.c \\r
+                       source/machine_iic.c \\r
+                       source/machine_iic_simulation.c \\r
+                       source/machine_keypad.c \\r
+                       source/machine_lcd.c \\r
+                       source/machine_nandflash.c \\r
+                       source/machine_pin.c \\r
+                       source/machine_rtc.c \\r
+                       source/machine_timer.c \\r
+                       source/machine_uart.c \\r
+                       source/machine_wdt.c \\r
+                       source/misc_adc.c \\r
+                       source/misc_power.c \\r
+                       source/misc_powerkey.c \\r
+                       source/misc_pwm.c \\r
+                       source/misc_temperature.c \\r
+                       source/misc_usb.c \\r
+                       source/misc_usbnet.c \\r
+                       source/modatcmd.c \\r
+                       source/modaudio.c \\r
+                       source/modaudiocodec.c \\r
+                       source/modble.c \\r
+                       source/modbt.c \\r
+                       source/modcamera.c \\r
+                       source/modcelllocator.c \\r
+                       source/modcelllocator_qpy.c \\r
+                       source/locator.c \\r
+                       source/modcsd.c \\r
+                       source/moddatacall.c \\r
+                       source/moddev.c \\r
+                       source/modethernet.c \\r
+                       source/modethernet_dm9051.c \\r
+                       source/modethernet_w5500.c \\r
+                       source/modethernet_ch395.c \\r
+                       source/modexample.c \\r
+                       source/modfota.c \\r
+                       source/modgnss.c \\r
+                       source/modlpm.c \\r
+                       source/modlvgl.c \\r
+                       source/modlwm2m.c \\r
+                       source/modmachine.c \\r
+                       source/modmisc.c \\r
+                       source/modnb.c \\r
+                       source/modnet.c \\r
+                       source/modostimer.c \\r
+                       source/modpoc.c \\r
+                       source/modqrcode.c \\r
+                       source/modrtmp.c \\r
+                       source/modsecuredata.c \\r
+                       source/modsensor.c \\r
+                       source/modsha1.c \\r
+                       source/modsim.c \\r
+                       source/modslipif.c \\r
+                       source/modsms.c \\r
+                       source/modsocket.c \\r
+                       source/modtp.c \\r
+                       source/moduos.c \\r
+                       source/modutils.c \\r
+                       source/modutime.c \\r
+                       source/modvoicecall.c \\r
+                       source/modwifilocator.c \\r
+                       source/modwifiscan.c \\r
+                       source/nb_aep.c \\r
+                       source/nb_oc.c \\r
+                       source/nb_onenet.c \\r
+                       source/quecpython.c \\r
+                       source/sensor_sn95500.c \\r
+                       source/sensor_icckey.c \\r
+                       source/sensor_gnss.c \\r
+                       source/tp_gt9xx.c \\r
+                       source/tp_xpt2046.c \\r
+                       source/tp_cst816.c \\r
+                       source/modGsensor.c \\r
+                       source/modGsensor_SC7A20.c \\r
+                       source/modHsensor.c \\r
+                       source/modHsensor_GH3018.c \\r
+                       source/modVideoCall.c \\r
+                       source/modVideoCall_juphoon.c \\r
+                       source/modHsensor_HX3918.c \\r
+                       source/modrsa.c \\r
+                       source/utils_crc32.c \\r
+                       source/http_parser.c \\r
+                       source/modwebserver.c \\r
+                       source/modethernet_yt8512h.c \\r
+                       source/sim_esim.c \\r
+                       source/modG711.c \\r
+                       source/modG729.c \\r
+                       source/modcan_mcp2515.c \\r
+                       source/modextuart_wk2114.c \\r
+                       source/modextgpio_aw9523.c \\r
+                       source/machine_key.c \\r
+                       source/lpm_wakeup.c \\r
+                       source/sensor_handmic_key.c     \\r
+                       source/modnetwork.c     \\r
+                       source/modwlan_ASR5803.c \\r
+                       source/machine_soft_spi.c \\r
+                       source/code128_p.c \\r
+                       source/modwlan.c\\r
+                       source/modwlan.c \\r
+                       source/modmask.c \\r
+                       source/modVad.c \\r
+                       source/machine_one_wire.c\r
+\r
+\r
+ifeq ($(strip $(PLAT)),RDA)\r
+SRC_QSTR += $(ROOT)/components/quecsdk/cloud/python/modquecIot-BC25old.c\r
+else\r
+SRC_QSTR += $(ROOT)/components/quecsdk/cloud/python/modquecIot.c\r
+endif\r
+\r
+ifeq ($(CONFIG_USQLITE), y)\r
+SRC_QSTR += lib/usqlite/usqlite_connection.c \\r
+                       lib/usqlite/usqlite_cursor.c \\r
+                       lib/usqlite/usqlite_row.c \\r
+                       lib/usqlite/usqlite_file.c \\r
+                       lib/usqlite/usqlite_mem.c \\r
+                       lib/usqlite/usqlite_vfs.c \\r
+                       lib/usqlite/usqlite_utils.c \\r
+                       lib/usqlite/usqlite.c \\r
+                       lib/usqlite/usqlite_module.c\r
+\r
+INC += -Ilib/usqlite\r
+endif\r
+\r
+$(BUILD)/%.pp: %.c\r
+       @$(ECHO) "PreProcess $<"\r
+       $(Q)$(CPP) $(C_FLAGS) -Wp,-C,-dD,-dI -o $@ $<\r
+\r
+# Anything that depends on FORCE will be considered out-of-date\r
+FORCE:\r
+.PHONY: FORCE\r
+\r
+$(HEADER_BUILD):\r
+       $(MKDIR) -p $@\r
+\r
+#$(HEADER_BUILD)/mpversion.h: FORCE | $(HEADER_BUILD)\r
+#      $(Q)$(PYTHON) $(PY_SRC)/makeversionhdr.py $@\r
+# mpconfigport.mk is optional, but changes to it may drastically change\r
+# overall config, so they need to be caught\r
+MPCONFIGPORT_MK = $(wildcard mpconfigport.mk)\r
+\r
+# qstr data\r
+# Adding an order only dependency on $(HEADER_BUILD) causes $(HEADER_BUILD) to get\r
+# created before we run the script to generate the .h\r
+# Note: we need to protect the qstr names from the preprocessor, so we wrap\r
+# the lines in "" and then unwrap after the preprocessor is finished.\r
+# See more information about this process in docs/develop/qstr.rst.\r
+$(HEADER_BUILD)/qstrdefs.generated.h: $(PY_QSTR_DEFS) $(QSTR_DEFS) $(QSTR_DEFS_COLLECTED) $(PY_SRC)/makeqstrdata.py source/mpconfigport.h $(MPCONFIGPORT_MK) $(PY_SRC)/mpconfig.h | $(HEADER_BUILD)\r
+       @$(ECHO) "GEN $@"\r
+       $(Q)$(CAT) $(PY_QSTR_DEFS) $(QSTR_DEFS) $(QSTR_DEFS_COLLECTED) | $(SED) 's/^Q(.*)/"&"/' | $(CPP) $(C_FLAGS) - | $(SED) 's/^\"\(Q(.*)\)\"/\1/' > $(HEADER_BUILD)/qstrdefs.preprocessed.h\r
+       $(Q)$(PYTHON) $(PY_SRC)/makeqstrdata.py $(HEADER_BUILD)/qstrdefs.preprocessed.h > $@\r
+\r
+# Compressed error strings.\r
+$(HEADER_BUILD)/compressed.split: $(HEADER_BUILD)/qstr.i.last\r
+       @$(ECHO) "GEN $@"\r
+       $(Q)$(PYTHON) $(PY_SRC)/makeqstrdefs.py split compress $< $(HEADER_BUILD)/compress _\r
+       $(Q)$(TOUCH) $@\r
+       \r
+$(HEADER_BUILD)/compressed.collected: $(HEADER_BUILD)/compressed.split\r
+       @$(ECHO) "GEN $@"\r
+       $(Q)$(PYTHON) $(PY_SRC)/makeqstrdefs.py $(CAT) compress _ $(HEADER_BUILD)/compress $@\r
+       \r
+$(HEADER_BUILD)/compressed.data.h: $(HEADER_BUILD)/compressed.collected\r
+       @$(ECHO) "GEN $@"\r
+       $(Q)$(PYTHON) $(PY_SRC)/makecompresseddata.py $< > $@\r
+       \r
+# build a list of registered modules for py/objmodule.c.\r
+$(HEADER_BUILD)/moduledefs.h: $(SRC_QSTR) $(QSTR_GLOBAL_DEPENDENCIES) | $(HEADER_BUILD)\r
+       @$(ECHO) "GEN $@"\r
+       $(Q)$(PYTHON) $(PY_SRC)/makemoduledefs.py --vpath="., $(TOP), $(USER_C_MODULES)" $(SRC_QSTR) > $@\r
+\r
+SRC_QSTR += $(HEADER_BUILD)/moduledefs.h\r
+\r
+INC += -I$(ROOT)/system/platform/$(strip $(PLAT))/boards/$(strip $(BOARD))/config\r
+INC += -I$(ROOT)/system/platform/$(strip $(PLAT))/include\r
+\r
+ifeq ($(strip $(PLAT)),Qualcomm)\r
+INC += -I$(COMPILER_PATH)/armv7m-none-eabi/libc/include\r
+INC += -I$(ROOT)/system/platform/$(strip $(PLAT))/boards/$(strip $(BOARD))/include/azure_api\r
+INC += -I$(ROOT)/system/platform/$(strip $(PLAT))/boards/$(strip $(BOARD))/include/azure_api/c-utility\r
+INC += -I$(ROOT)/system/platform/$(strip $(PLAT))/boards/$(strip $(BOARD))/include/azure_api/c-utility/inc\r
+INC += -I$(ROOT)/system/platform/$(strip $(PLAT))/boards/$(strip $(BOARD))/include/azure_api/c-utility/inc/azure_c_shared_utility\r
+INC += -I$(ROOT)/system/platform/$(strip $(PLAT))/boards/$(strip $(BOARD))/include/azure_api/c-utility/pal\r
+INC += -I$(ROOT)/system/platform/$(strip $(PLAT))/boards/$(strip $(BOARD))/include/azure_api/c-utility/pal/generic\r
+INC += -I$(ROOT)/system/platform/$(strip $(PLAT))/boards/$(strip $(BOARD))/include/azure_api/iothub_client\r
+INC += -I$(ROOT)/system/platform/$(strip $(PLAT))/boards/$(strip $(BOARD))/include/azure_api/iothub_client/inc\r
+INC += -I$(ROOT)/system/platform/$(strip $(PLAT))/boards/$(strip $(BOARD))/include/azure_api/iothub_client/inc/internal\r
+INC += -I$(ROOT)/system/platform/$(strip $(PLAT))/boards/$(strip $(BOARD))/include/azure_api/serializer\r
+INC += -I$(ROOT)/system/platform/$(strip $(PLAT))/boards/$(strip $(BOARD))/include/azure_api/serializer/inc\r
+INC += -I$(ROOT)/system/platform/$(strip $(PLAT))/boards/$(strip $(BOARD))/include/azure_api/umqtt\r
+INC += -I$(ROOT)/system/platform/$(strip $(PLAT))/boards/$(strip $(BOARD))/include/azure_api/umqtt/inc\r
+INC += -I$(ROOT)/system/platform/$(strip $(PLAT))/boards/$(strip $(BOARD))/include/azure_api/umqtt/inc/azure_umqtt_c\r
+INC += -I$(ROOT)/system/platform/$(strip $(PLAT))/boards/$(strip $(BOARD))/include/qapi\r
+INC += -I$(ROOT)/system/platform/$(strip $(PLAT))/boards/$(strip $(BOARD))/include/threadx_api\r
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/include\r
+INC += -I$(ROOT)/system/at\r
+INC += -I$(ROOT)/system/esim\r
+endif\r
+\r
+INC += -I.\r
+INC += -I$(HEADER_BUILD)\r
+INC += -I$(TOP)\r
+INC += -I$(TOP)/py\r
+INC += -I$(TOP)/extmod\r
+INC += -I$(TOP)/lib/utils\r
+INC += -I$(TOP)/lib/mp-readline\r
+INC += -I$(TOP)/lib/littlefs\r
+INC += -I$(TOP)/lib/netutils\r
+INC += -I$(TOP)/lib/timeutils\r
+INC += -I$(TOP)/ports/quectel/core\r
+INC += -I$(TOP)/ports/quectel/core/source\r
+INC += -I$(TOP)/ports/quectel/core/py\r
+INC += -I$(ROOT)/peripheral\r
+INC += -I$(ROOT)/system/include\r
+INC += -I$(ROOT)/system/platform/$(strip $(PLAT))/include\r
+INC += -I$(ROOT)/system/platform/$(strip $(PLAT))/boards/$(strip $(BOARD))/include\r
+INC += -I$(ROOT)/system/debug\r
+INC += -I$(ROOT)/system/dev\r
+INC += -I$(ROOT)/system/fs\r
+INC += -I$(ROOT)/system/hal\r
+INC += -I$(ROOT)/system/gnss\r
+INC += -I$(ROOT)/system/network\r
+INC += -I$(ROOT)/system/at\r
+INC += -I$(ROOT)/system/aliiot\r
+\r
+ifeq ($(strip $(PLAT)),ASR_1803s)\r
+INC += -I$(ROOT)/system/csd\r
+INC += -I$(ROOT)/system/esim\r
+endif\r
+ifeq ($(strip $(PLAT)),ASR_1606)\r
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/include\r
+endif\r
+\r
+ifeq ($(strip $(PLAT)),Unisoc)\r
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))\r
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/include\r
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include\r
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include/lwip\r
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include/lwip/apps\r
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include/lwip/priv\r
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include/lwip/prot\r
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include/netif\r
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include/posix\r
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include/posix/arpa\r
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include/posix/net\r
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include/posix/netinet\r
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include/posix/sys\r
+INC += -I$(ROOT)/system/at\r
+endif\r
+\r
+ifeq ($(strip $(PLAT)),Unisoc_8910_R05)\r
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))\r
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/include\r
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include\r
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include/lwip\r
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include/lwip/apps\r
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include/lwip/priv\r
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include/lwip/prot\r
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include/netif\r
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include/netif/ppp\r
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include/netif/ppp/polarssl\r
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include/compat/posix\r
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include/compat/posix/arpa\r
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include/compat/posix/net\r
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include/compat/posix/netinet\r
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include/compat/posix/sys\r
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include/compat/stdc\r
+endif\r
+\r
+ifeq ($(strip $(PLAT)),EIGEN)\r
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))\r
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/include\r
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/include/lwip\r
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/include/lwip/apps\r
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/include/lwip/priv\r
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/include/lwip/prot\r
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/include/arch\r
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/include/netif\r
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/include/posix\r
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/include/posix/sys\r
+endif\r
+\r
+ifeq ($(strip $(PLAT)),Unisoc_8850)\r
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))\r
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/include\r
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include\r
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include/lwip\r
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include/lwip/apps\r
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include/lwip/priv\r
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include/lwip/prot\r
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include/netif\r
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include/netif/ppp\r
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include/netif/ppp/polarssl\r
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include/compat/posix\r
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include/compat/posix/arpa\r
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include/compat/posix/net\r
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include/compat/posix/netinet\r
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include/compat/posix/sys\r
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include/compat/stdc\r
+endif\r
+\r
+ifeq ($(strip $(PLAT)),RDA)\r
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))\r
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/include\r
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/include/arch\r
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include\r
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include/lwip\r
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include/lwip/apps\r
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include/lwip/priv\r
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include/lwip/prot\r
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include/netif\r
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include/posix\r
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include/posix/arpa\r
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include/posix/net\r
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include/posix/netinet\r
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include/posix/sys\r
+endif\r
+\r
+ifeq ($(strip $(PLAT)), $(filter $(PLAT),ASR ASR_1803s))\r
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))\r
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/include\r
+INC += -I$(ROOT)/system/at\r
+endif\r
+\r
+ifeq ($(strip $(PLAT)),ECR6600)\r
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))\r
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/include\r
+endif\r
+\r
+ifeq (y, $(CONFIG_MBEDTLS))\r
+INC += -I$(ROOT)/system/mbedtls\r
+INC += -I$(ROOT)/system/mbedtls/include\r
+INC += -I$(ROOT)/system/mbedtls/include/mbedtls\r
+INC += -I$(ROOT)/system/mbedtls/library\r
+INC += -I$(ROOT)/system/mbedtls/port/helios/inc\r
+endif\r
+INC += -I$(ROOT)/system/network\r
+INC += -I$(ROOT)/system/os\r
+INC += -I$(ROOT)/system/startup\r
+INC += -I$(ROOT)/system/fota\r
+INC += -I$(ROOT)/system/bt\r
+INC += -I$(ROOT)/system/at\r
+ifeq (y, $(CONFIG_LVGL))\r
+INC += -I$(TOP)/lib/lvgl\r
+INC += -I$(TOP)/lib/lvgl/src\r
+INC += -I$(TOP)/lib/lvgl/src/core\r
+INC += -I$(TOP)/lib/lvgl/src/draw\r
+INC += -I$(TOP)/lib/lvgl/src/extra\r
+INC += -I$(TOP)/lib/lvgl/src/font\r
+INC += -I$(TOP)/lib/lvgl/src/gpu\r
+INC += -I$(TOP)/lib/lvgl/src/hal\r
+INC += -I$(TOP)/lib/lvgl/src/misc\r
+INC += -I$(TOP)/lib/lvgl/src/widgts\r
+endif\r
+INC += -I$(ROOT)/driver\r
+INC += -I$(ROOT)/driver/lcd\r
+ifeq (y, $(CONFIG_QRCODE))\r
+INC += -I$(ROOT)/components/qrcode\r
+endif\r
+ifeq (y, $(CONFIG_QUECTHING))\r
+INC += -I$(ROOT)/components/quecsdk/cloud\r
+INC += -I$(ROOT)/components/quecsdk/driverLayer\r
+INC += -I$(ROOT)/components/quecsdk/thirdLib/mqtt\r
+INC += -I$(ROOT)/components/quecsdk/thirdLib/cJSON\r
+INC += -I$(ROOT)/components/quecsdk/kernel\r
+endif\r
+ifeq ($(CONFIG_SPINAND), y)\r
+INC += -I$(ROOT)/components/fs/include\r
+INC += -I$(ROOT)/components/fs/yaffs/src/direct\r
+INC += -I$(ROOT)/components/fs/yaffs/src/port\r
+INC += -I$(ROOT)/components/fs/yaffs/src\r
+INC += -I$(ROOT)/components/fs/yaffs\r
+endif\r
+ifeq ($(CONFIG_RTMP), y)\r
+INC += -I$(ROOT)/components/rtmpdump/librtmp/inc\r
+INC += -I$(ROOT)/components/rtmpdump/libz/inc\r
+endif\r
+INC += -I$(ROOT)/utilities\r
+ifeq ($(CONFIG_JPEG), y)\r
+INC += -I$(ROOT)/components/jpeg/jpeg-9c\r
+INC += -I$(ROOT)/components/jpeg\r
+endif\r
+ifeq ($(CONFIG_HX3918), y)\r
+INC += -I$(ROOT)/components/HX3918\r
+endif\r
+ifeq ($(CONFIG_GH301x), y)\r
+INC += -I$(ROOT)/components/GH301x\r
+endif\r
+ifeq ($(CONFIG_SC7A20), y)\r
+INC += -I$(ROOT)/components/SC7A20\r
+endif\r
+ifeq ($(CONFIG_juphoon), y)\r
+INC += -I$(ROOT)/components/juphoon\r
+endif\r
+ifeq ($(CONFIG_POC_BND), y)\r
+INC += -I$(ROOT)/components/poc\r
+INC += -I$(ROOT)/components/poc/bnd/inc\r
+endif\r
+ifeq ($(CONFIG_POC_BND_XIN), y)\r
+INC += -I$(ROOT)/components/poc\r
+INC += -I$(ROOT)/components/poc/bnd_xin/inc\r
+endif\r
+ifeq ($(CONFIG_POC_SL), y)\r
+INC += -I$(ROOT)/components/poc\r
+INC += -I$(ROOT)/components/poc/sl/inc\r
+endif\r
+ifeq ($(CONFIG_POC_QS), y)\r
+INC += -I$(ROOT)/components/poc\r
+INC += -I$(ROOT)/components/poc/qs/inc\r
+endif\r
+#Stephen.Gao add 2022/11/23\r
+ifeq ($(CONFIG_POC_ZZD), y)\r
+INC += -I$(ROOT)/components/poc\r
+INC += -I$(ROOT)/components/poc/zzd/inc\r
+endif\r
+#Stephen.Gao add 2023/01/06\r
+ifeq ($(CONFIG_POC_YDWL), y)\r
+INC += -I$(ROOT)/components/poc\r
+INC += -I$(ROOT)/components/poc/ydwl/inc\r
+endif\r
+\r
+ifeq ($(CONFIG_POC_SLPOC), y)\r
+INC += -I$(ROOT)/components/poc  -I$(ROOT)/components/poc/slpoc/src\r
+INC += -I$(ROOT)/components/poc/slpoc/inc\r
+SRC_QSTR += $(ROOT)/components/poc/slpoc/src/modpoc_slpoc.c\r
+endif\r
+\r
+ifeq ($(CONFIG_POC_RDA_BND), y)\r
+INC += -I$(ROOT)/components/poc  -I$(ROOT)/components/poc/rda_bnd/src\r
+INC += -I$(ROOT)/components/poc/rda_bnd/inc\r
+SRC_QSTR += $(ROOT)/components/poc/rda_bnd/src/modpocrda.c\r
+endif\r
+\r
+\r
+ifeq (y,$(CONFIG_DECODE_ZBAR))\r
+INC += -I$(ROOT)/components/decode/ZBar/zbar\r
+INC += -I$(ROOT)/components/decode/ZBar/include\r
+INC += -I$(ROOT)/components/decode/ZBar/zbar/decoder\r
+INC += -I$(ROOT)/components/decode/ZBar/zbar/qrcode\r
+endif\r
+ifeq (y,$(CONFIG_DECODE_QUECTEL))\r
+INC += -I$(ROOT)/components/decode/quectel/inc\r
+endif\r
+\r
+ifeq (y,$(CONFIG_DECODE_QINGYA))\r
+ifneq ($(strip $(PLAT)),ASR)\r
+ifneq ($(strip $(PLAT)),ASR_1606)\r
+INC += -I$(ROOT)/components/decode/qingya\r
+endif\r
+endif\r
+endif\r
+\r
+ifeq ($(CONFIG_SPI_SDCARD), y)\r
+INC += -I$(ROOT)/components/fs/fatfs/include\r
+endif\r
+\r
+ifeq ($(CONFIG_AUDIO_G711_COMPRESS), y)\r
+INC += -I$(ROOT)/components/audio/G711\r
+endif\r
+ifeq ($(strip $(PLAT)),EIGEN)\r
+INC += -I$(ROOT)/components/audio\r
+endif\r
+\r
+ifeq ($(CONFIG_GMSSL), y)\r
+INC += -I$(ROOT)/components/GMSSL/include\r
+INC += -I$(ROOT)/components/GMSSL/include/gmssl\r
+endif\r
+\r
+ifeq ($(CONFIG_AUDIO_G729_COMPRESS), y)\r
+INC += -I$(ROOT)/components/audio/G729\r
+INC += -I$(ROOT)/components/audio/G729/src\r
+INC += -I$(ROOT)/components/audio/G729/include\r
+endif\r
+\r
+# compiler settings\r
+CWARN = -Wall -Werror\r
+CWARN += -Wpointer-arith -Wuninitialized\r
+C_FLAGS = $(INC) $(CWARN) -std=gnu99 $(C_FLAGS_MOD) $(COPT) $(C_FLAGS_EXTRA)\r
+C_FLAGS += -fdata-sections -ffunction-sections -fno-asynchronous-unwind-tables --include=../../../../../../config/autoconf.h\r
+\r
+LD_FLAGS_ARCH = -Wl,-Map=$@.map,--cref -Wl,--gc-sections\r
+LD_FLAGS = $(LD_FLAGS_MOD) $(LD_FLAGS_ARCH) -lm $(LD_FLAGS_EXTRA)\r
+\r
+D_FLAGS += $(foreach dflag, $(DFLAGS), -D$(dflag))\r
+D_FLAGS += -DMP_CONFIGFILE="\"ports/quectel/core/source/mpconfigport.h\"" \\r
+                 -DMICROPY_MPTHREADPORT_H="\"ports/quectel/core/source/mpthreadport.h\"" \\r
+                 -DMICROPY_MPHALPORT_H="\"ports/quectel/core/source/mphalport.h\""\r
+\r
+vpath %.S . $(TOP) $(USER_C_MODULES)\r
+$(BUILD)/%.o: %.S\r
+       @$(ECHO) "CC $<"\r
+       $(Q)$(CC) $(C_FLAGS) $(D_FLAGS) -c -o $@ $<\r
+\r
+vpath %.s . $(TOP) $(USER_C_MODULES)\r
+$(BUILD)/%.o: %.s\r
+       @$(ECHO) "AS $<"\r
+       $(Q)$(AS) -o $@ $<\r
+QSTR_GEN_EXTRA_C_FLAGS += -DNO_QSTR\r
+vpath %.c . $(TOP) $(USER_C_MODULES)\r
+$(BUILD)/%.pp: %.c\r
+       @$(ECHO) "PreProcess $<"\r
+       $(Q)$(CPP) $(C_FLAGS) $(D_FLAGS) -Wp,-C,-dD,-dI -o $@ $<\r
+\r
+#$(OBJ): | $(HEADER_BUILD)/qstrdefs.generated.h $(HEADER_BUILD)/mpversion.h\r
+\r
+\r
+$(HEADER_BUILD)/qstr.i.last: $(SRC_QSTR) $(QSTR_GLOBAL_DEPENDENCIES) | $(QSTR_GLOBAL_REQUIREMENTS)\r
+       @$(ECHO) "GEN $@"\r
+       @rm -f $@ $@.dep\r
+       @for src in $(if $(filter $?,$(QSTR_GLOBAL_DEPENDENCIES)),$^,$(if $?,$?,$^)); \\r
+       do \\r
+               echo $$src >> $@.dep; \\r
+       done\r
+       @while read -r src; \\r
+               do \\r
+                       echo processing on $$src ...; \\r
+                       $(CPP) $(QSTR_GEN_EXTRA_C_FLAGS) $(C_FLAGS) $(D_FLAGS) $$src >> $@; \\r
+       done < $@.dep\r
+\r
+$(HEADER_BUILD)/qstr.split: $(HEADER_BUILD)/qstr.i.last\r
+       @$(ECHO) "GEN $@"\r
+       $(Q)$(PYTHON) $(PY_SRC)/makeqstrdefs.py split qstr $(HEADER_BUILD)/qstr.i.last $(HEADER_BUILD)/qstr $(QSTR_DEFS_COLLECTED)\r
+       $(Q)$(TOUCH) $@\r
+\r
+$(QSTR_DEFS_COLLECTED): $(HEADER_BUILD)/qstr.split\r
+       @$(ECHO) "GEN $@"\r
+       $(Q)$(PYTHON) $(PY_SRC)/makeqstrdefs.py cat qstr $(HEADER_BUILD)/qstr.i.last $(HEADER_BUILD)/qstr $(QSTR_DEFS_COLLECTED)\r
+\r
+\r
+$(BUILD)/%.mpy: $(FROZEN_MPY_DIR)/%.py\r
+       @$(ECHO) "MPY $<"\r
+       $(Q)$(MKDIR) -p $(dir $@)\r
+       $(Q)$(MPY_CROSS) -o $@ -s $(<:$(FROZEN_MPY_DIR)/%=%) $(MPY_CROSS_FLAGS) $<\r
+\r
+ifeq ($(strip $(PLAT)),RDA)\r
+frozen_mpy_list =      $(BUILD)/_boot_RDA.mpy \\r
+                                       $(BUILD)/system.mpy \\r
+                                       $(BUILD)/dataCall.mpy \\r
+                                       $(BUILD)/umqtt.mpy \\r
+                                       $(BUILD)/sys_bus.mpy \\r
+                                       $(BUILD)/queue.mpy \\r
+                                       $(BUILD)/log.mpy \\r
+                                       $(BUILD)/request.mpy \\r
+                                       $(BUILD)/ql_fs.mpy \\r
+                                       $(BUILD)/app_fota_mount.mpy \\r
+                                       $(BUILD)/app_fota_download.mpy \\r
+                                       $(BUILD)/checksum.mpy \\r
+                                       $(BUILD)/file_crc32.mpy \\r
+                                       $(BUILD)/app_fota_updater.mpy \\r
+                                       $(BUILD)/app_fota.mpy \\r
+                                       $(BUILD)/backup_restore.mpy \\r
+                                       $(BUILD)/event_message.mpy \\r
+                                       $(BUILD)/ntptime.mpy \\r
+                                       $(BUILD)/checkNet.mpy \\r
+                                       $(BUILD)/uping.mpy \\r
+                                       $(BUILD)/ymodem.mpy \\r
+\r
+ifeq ($(strip $(BOARD)),$(filter $(strip $(BOARD)),BC25B8PA_LBS))\r
+       frozen_mpy_list +=      $(BUILD)/cellLocator.mpy \r
+endif\r
+\r
+else ifeq ($(strip $(PLAT)),ASR_1803s)\r
+frozen_mpy_list =      $(BUILD)/_boot.mpy \\r
+                                       $(BUILD)/system.mpy \\r
+                                       $(BUILD)/checkNet.mpy \\r
+                                       $(BUILD)/ntptime.mpy \\r
+                                       $(BUILD)/dataCall.mpy \\r
+                                       $(BUILD)/log.mpy \\r
+                                       $(BUILD)/request.mpy \\r
+                                       $(BUILD)/umqtt.mpy \\r
+                                       $(BUILD)/ql_fs.mpy \\r
+                                       $(BUILD)/app_fota_mount.mpy \\r
+                                       $(BUILD)/app_fota_download.mpy \\r
+                                       $(BUILD)/checksum.mpy \\r
+                                       $(BUILD)/file_crc32.mpy \\r
+                                       $(BUILD)/app_fota_updater.mpy \\r
+                                       $(BUILD)/app_fota.mpy \\r
+                                       $(BUILD)/backup_restore.mpy \\r
+                                       $(BUILD)/queue.mpy \\r
+                                       $(BUILD)/sys_bus.mpy \\r
+                                       $(BUILD)/event_message.mpy \\r
+                                       $(BUILD)/bak_util.mpy \\r
+                                       $(BUILD)/cellLocator.mpy \\r
+                                       $(BUILD)/ftplib.mpy \\r
+                                       $(BUILD)/ftplibtls.mpy \\r
+                                       $(BUILD)/uwebsocket.mpy \\r
+                                       $(BUILD)/uping.mpy \\r
+                                       $(BUILD)/ymodem.mpy \\r
+\r
+else ifeq ($(strip $(PLAT)),Qualcomm)\r
+frozen_mpy_list =      $(BUILD)/_boot_Qualcomm.mpy \\r
+                                       $(BUILD)/system.mpy \\r
+                                       $(BUILD)/checkNet.mpy \\r
+                                       $(BUILD)/ntptime.mpy \\r
+                                       $(BUILD)/dataCall.mpy \\r
+                                       $(BUILD)/umqtt.mpy \\r
+                                       $(BUILD)/log.mpy \\r
+                                       $(BUILD)/request.mpy \\r
+                                       $(BUILD)/ql_fs.mpy \\r
+                                       $(BUILD)/app_fota_download.mpy \\r
+                                       $(BUILD)/checksum.mpy \\r
+                                       $(BUILD)/file_crc32.mpy \\r
+                                       $(BUILD)/app_fota_mount.mpy \\r
+                                       $(BUILD)/app_fota_updater.mpy \\r
+                                       $(BUILD)/app_fota.mpy \\r
+                                       $(BUILD)/backup_restore.mpy \\r
+                                       $(BUILD)/queue.mpy \\r
+                                       $(BUILD)/sys_bus.mpy \\r
+                                       $(BUILD)/event_message.mpy \\r
+                                       $(BUILD)/bak_util.mpy \\r
+                                       $(BUILD)/uwebsocket.mpy \\r
+                                       $(BUILD)/uping.mpy \\r
+                                       $(BUILD)/ymodem.mpy \\r
+\r
+else ifeq ($(strip $(PLAT)),ASR_1606)\r
+ifeq ($(strip $(BOARD)),$(filter $(strip $(BOARD)),EC600MCN_CC EC800MCN_CC EC600MCN_CC_EXT EC600MCN_LF_SLPOC))\r
+frozen_mpy_list =      $(BUILD)/_boot.mpy \\r
+                                       $(BUILD)/system.mpy \\r
+                                       $(BUILD)/dataCall.mpy \\r
+                                       $(BUILD)/umqtt.mpy \\r
+                                       $(BUILD)/queue.mpy \\r
+                                       $(BUILD)/log.mpy \\r
+                                       $(BUILD)/request.mpy \\r
+                                       $(BUILD)/ql_fs.mpy \\r
+                                       $(BUILD)/app_fota_mount.mpy \\r
+                                       $(BUILD)/app_fota_download.mpy \\r
+                                       $(BUILD)/checksum.mpy \\r
+                                       $(BUILD)/file_crc32.mpy \\r
+                                       $(BUILD)/app_fota_updater.mpy \\r
+                                       $(BUILD)/app_fota.mpy \\r
+                                       $(BUILD)/backup_restore.mpy \\r
+                                       $(BUILD)/ntptime.mpy \\r
+                                       $(BUILD)/checkNet.mpy \\r
+                                       $(BUILD)/ymodem.mpy\r
+\r
+else ifeq ($(strip $(BOARD)),$(filter $(strip $(BOARD)),EC600MCN_CC_EXT_TTS))\r
+frozen_mpy_list =      $(BUILD)/_boot.mpy \\r
+                                       $(BUILD)/dataCall.mpy \\r
+                                       $(BUILD)/file_crc32.mpy \\r
+                                       $(BUILD)/ntptime.mpy \\r
+                                       $(BUILD)/ymodem.mpy\r
+else\r
+frozen_mpy_list =      $(BUILD)/_boot.mpy \\r
+                                       $(BUILD)/umqtt.mpy \\r
+                                       $(BUILD)/ntptime.mpy \\r
+                                       $(BUILD)/request.mpy \\r
+                                       $(BUILD)/log.mpy \\r
+                                       $(BUILD)/aLiYun.mpy \\r
+                                       $(BUILD)/hmac.mpy \\r
+                                       $(BUILD)/hashlib.mpy \\r
+                                       $(BUILD)/base64.mpy \\r
+                                       $(BUILD)/TenCentYun.mpy \\r
+                                       $(BUILD)/file_sha256.mpy \\r
+                                       $(BUILD)/checksum.mpy \\r
+                                       $(BUILD)/checkNet.mpy \\r
+                                       $(BUILD)/dataCall.mpy \\r
+                                       $(BUILD)/ql_fs.mpy \\r
+                                       $(BUILD)/app_fota_mount.mpy \\r
+                                       $(BUILD)/app_fota_download.mpy\\r
+                                       $(BUILD)/app_fota_updater.mpy \\r
+                                       $(BUILD)/app_fota.mpy \\r
+                                       $(BUILD)/backup_restore.mpy \\r
+                                       $(BUILD)/file_crc32.mpy \\r
+                                       $(BUILD)/system.mpy \\r
+                                       $(BUILD)/gnss.mpy \\r
+                                       $(BUILD)/unzip.mpy \\r
+                                       $(BUILD)/queue.mpy \\r
+                                       $(BUILD)/sys_bus.mpy \\r
+                                       $(BUILD)/event_message.mpy \\r
+                                       $(BUILD)/hls.mpy \\r
+                                       $(BUILD)/wifilocator.mpy \\r
+                                       $(BUILD)/cellLocator.mpy \\r
+                                       $(BUILD)/bak_util.mpy \\r
+                                       $(BUILD)/uwebsocket.mpy \\r
+                                       $(BUILD)/uping.mpy \\r
+                                       $(BUILD)/ymodem.mpy \\r
+                                       $(BUILD)/common.mpy \\r
+                                       $(BUILD)/constants.mpy \\r
+                                       $(BUILD)/EventMesh.mpy \\r
+                                       $(BUILD)/mgr.mpy \\r
+                                       $(BUILD)/protocol.mpy \\r
+                                       $(BUILD)/ui.mpy \\r
+                                       $(BUILD)/main_init.mpy \\r
+                                       $(BUILD)/versions.mpy \\r
+                                       $(BUILD)/motor.mpy \\r
+                                       $(BUILD)/ai_VC.mpy \\r
+                                       $(BUILD)/ai_alarm.mpy \\r
+                                       $(BUILD)/voice_record.mpy \\r
+\r
+endif\r
+\r
+else ifeq ($(strip $(PLAT)),Unisoc_8850)\r
+ifeq ($(strip $(BOARD)),$(filter $(strip $(BOARD)),EC600GCN_LD EC600GCN_LD_YM EC800GCN_LD EC800GCN_LD_HRXM))\r
+frozen_mpy_list =      $(BUILD)/_boot.mpy \\r
+                                       $(BUILD)/umqtt.mpy \\r
+                                       $(BUILD)/ntptime.mpy \\r
+                                       $(BUILD)/request.mpy \\r
+                                       $(BUILD)/log.mpy \\r
+                                       $(BUILD)/checksum.mpy \\r
+                                       $(BUILD)/checkNet.mpy \\r
+                                       $(BUILD)/dataCall.mpy \\r
+                                       $(BUILD)/ql_fs.mpy \\r
+                                       $(BUILD)/app_fota_mount.mpy \\r
+                                       $(BUILD)/app_fota_download.mpy\\r
+                                       $(BUILD)/app_fota_updater.mpy \\r
+                                       $(BUILD)/app_fota.mpy \\r
+                                       $(BUILD)/backup_restore.mpy \\r
+                                       $(BUILD)/file_crc32.mpy \\r
+                                       $(BUILD)/system.mpy \\r
+                                       $(BUILD)/queue.mpy \\r
+                                       $(BUILD)/sys_bus.mpy \\r
+                                       $(BUILD)/event_message.mpy \\r
+                                       $(BUILD)/bak_util.mpy \\r
+                                       $(BUILD)/ymodem.mpy \\r
+                                       \r
+else\r
+frozen_mpy_list =      $(BUILD)/_boot.mpy \\r
+                                       $(BUILD)/umqtt.mpy \\r
+                                       $(BUILD)/ntptime.mpy \\r
+                                       $(BUILD)/request.mpy \\r
+                                       $(BUILD)/log.mpy \\r
+                                       $(BUILD)/aLiYun.mpy \\r
+                                       $(BUILD)/hmac.mpy \\r
+                                       $(BUILD)/hashlib.mpy \\r
+                                       $(BUILD)/base64.mpy \\r
+                                       $(BUILD)/TenCentYun.mpy \\r
+                                       $(BUILD)/file_sha256.mpy \\r
+                                       $(BUILD)/checksum.mpy \\r
+                                       $(BUILD)/checkNet.mpy \\r
+                                       $(BUILD)/dataCall.mpy \\r
+                                       $(BUILD)/ql_fs.mpy \\r
+                                       $(BUILD)/app_fota_mount.mpy \\r
+                                       $(BUILD)/app_fota_download.mpy\\r
+                                       $(BUILD)/app_fota_updater.mpy \\r
+                                       $(BUILD)/app_fota.mpy \\r
+                                       $(BUILD)/backup_restore.mpy \\r
+                                       $(BUILD)/file_crc32.mpy \\r
+                                       $(BUILD)/system.mpy \\r
+                                       $(BUILD)/gnss.mpy \\r
+                                       $(BUILD)/unzip.mpy \\r
+                                       $(BUILD)/queue.mpy \\r
+                                       $(BUILD)/sys_bus.mpy \\r
+                                       $(BUILD)/event_message.mpy \\r
+                                       $(BUILD)/hls.mpy \\r
+                                       $(BUILD)/wifilocator.mpy \\r
+                                       $(BUILD)/bak_util.mpy \\r
+                                       $(BUILD)/ftplib.mpy \\r
+                                       $(BUILD)/ftplibtls.mpy \\r
+                                       $(BUILD)/uwebsocket.mpy \\r
+                                       $(BUILD)/uping.mpy \\r
+                                       $(BUILD)/ymodem.mpy \\r
+                                       \r
+endif\r
+\r
+else ifeq ($(strip $(PLAT)),EIGEN)\r
+ifeq ($(strip $(BOARD)),$(filter $(strip $(BOARD)),EC800ECN_LC_WDF))\r
+frozen_mpy_list =      $(BUILD)/_boot_WDF.mpy \\r
+                                       $(BUILD)/umqtt.mpy \\r
+                                       $(BUILD)/dataCall.mpy \\r
+                                       $(BUILD)/log.mpy \\r
+                                       $(BUILD)/request.mpy \\r
+                                       $(BUILD)/aLiYun.mpy \\r
+                                       $(BUILD)/hmac.mpy \\r
+                                       $(BUILD)/hashlib.mpy \\r
+                                       $(BUILD)/ntptime.mpy \\r
+                                       $(BUILD)/checksum.mpy \\r
+                                       $(BUILD)/checkNet.mpy \\r
+                                       $(BUILD)/ql_fs.mpy \\r
+                                       $(BUILD)/app_fota_mount.mpy \\r
+                                       $(BUILD)/app_fota_download.mpy\\r
+                                       $(BUILD)/app_fota_updater.mpy \\r
+                                       $(BUILD)/app_fota.mpy \\r
+                                       $(BUILD)/backup_restore.mpy \\r
+                                       $(BUILD)/file_crc32.mpy \\r
+                                       $(BUILD)/system.mpy \\r
+                                       $(BUILD)/queue.mpy \\r
+                                       $(BUILD)/sys_bus.mpy \\r
+                                       $(BUILD)/event_message.mpy \\r
+                                       $(BUILD)/bak_util.mpy \\r
+                                       $(BUILD)/ftplib.mpy \\r
+                                       $(BUILD)/ftplibtls.mpy \\r
+                                       $(BUILD)/ymodem.mpy \\r
+\r
+else\r
+frozen_mpy_list =      $(BUILD)/_boot.mpy \\r
+                                       $(BUILD)/umqtt.mpy \\r
+                                       $(BUILD)/dataCall.mpy \\r
+                                       $(BUILD)/log.mpy \\r
+                                       $(BUILD)/request.mpy \\r
+                                       $(BUILD)/aLiYun.mpy \\r
+                                       $(BUILD)/hmac.mpy \\r
+                                       $(BUILD)/hashlib.mpy \\r
+                                       $(BUILD)/ntptime.mpy \\r
+                                       $(BUILD)/checksum.mpy \\r
+                                       $(BUILD)/checkNet.mpy \\r
+                                       $(BUILD)/ql_fs.mpy \\r
+                                       $(BUILD)/app_fota_mount.mpy \\r
+                                       $(BUILD)/app_fota_download.mpy\\r
+                                       $(BUILD)/app_fota_updater.mpy \\r
+                                       $(BUILD)/app_fota.mpy \\r
+                                       $(BUILD)/backup_restore.mpy \\r
+                                       $(BUILD)/file_crc32.mpy \\r
+                                       $(BUILD)/system.mpy \\r
+                                       $(BUILD)/queue.mpy \\r
+                                       $(BUILD)/sys_bus.mpy \\r
+                                       $(BUILD)/event_message.mpy \\r
+                                       $(BUILD)/bak_util.mpy \\r
+                                       $(BUILD)/ftplib.mpy \\r
+                                       $(BUILD)/ftplibtls.mpy \\r
+                                       $(BUILD)/cellLocator.mpy \\r
+                                       $(BUILD)/ymodem.mpy \\r
+                                       \r
+endif\r
+\r
+else ifeq ($(strip $(PLAT)),ECR6600)\r
+frozen_mpy_list =      $(BUILD)/_boot_WIFI.mpy \\r
+                                       $(BUILD)/umqtt.mpy \\r
+                                       $(BUILD)/request.mpy \\r
+                                       $(BUILD)/ql_fs.mpy \\r
+                                       $(BUILD)/queue.mpy \\r
+                                       $(BUILD)/sys_bus.mpy \\r
+\r
+else\r
+ifeq ($(strip $(BOARD)),$(filter $(strip $(BOARD)),EC600UEU_AB_POC))\r
+frozen_mpy_list =      $(BUILD)/_boot.mpy \\r
+                                       $(BUILD)/ntptime.mpy \\r
+                                       $(BUILD)/log.mpy \\r
+                                       $(BUILD)/file_sha256.mpy \\r
+                                       $(BUILD)/checksum.mpy \\r
+                                       $(BUILD)/checkNet.mpy \\r
+                                       $(BUILD)/dataCall.mpy \\r
+                                       $(BUILD)/ql_fs.mpy \\r
+                                       $(BUILD)/app_fota_mount.mpy \\r
+                                       $(BUILD)/app_fota_download.mpy\\r
+                                       $(BUILD)/app_fota_updater.mpy \\r
+                                       $(BUILD)/app_fota.mpy \\r
+                                       $(BUILD)/backup_restore.mpy \\r
+                                       $(BUILD)/file_crc32.mpy \\r
+                                       $(BUILD)/system.mpy \\r
+                                       $(BUILD)/queue.mpy \\r
+                                       $(BUILD)/bak_util.mpy \\r
+                                       $(BUILD)/ymodem.mpy \r
+else\r
+frozen_mpy_list =      $(BUILD)/_boot.mpy \\r
+                                       $(BUILD)/umqtt.mpy \\r
+                                       $(BUILD)/ntptime.mpy \\r
+                                       $(BUILD)/request.mpy \\r
+                                       $(BUILD)/log.mpy \\r
+                                       $(BUILD)/aLiYun.mpy \\r
+                                       $(BUILD)/hmac.mpy \\r
+                                       $(BUILD)/hashlib.mpy \\r
+                                       $(BUILD)/base64.mpy \\r
+                                       $(BUILD)/TenCentYun.mpy \\r
+                                       $(BUILD)/file_sha256.mpy \\r
+                                       $(BUILD)/checksum.mpy \\r
+                                       $(BUILD)/checkNet.mpy \\r
+                                       $(BUILD)/dataCall.mpy \\r
+                                       $(BUILD)/ql_fs.mpy \\r
+                                       $(BUILD)/app_fota_mount.mpy \\r
+                                       $(BUILD)/app_fota_download.mpy\\r
+                                       $(BUILD)/app_fota_updater.mpy \\r
+                                       $(BUILD)/app_fota.mpy \\r
+                                       $(BUILD)/backup_restore.mpy \\r
+                                       $(BUILD)/file_crc32.mpy \\r
+                                       $(BUILD)/system.mpy \\r
+                                       $(BUILD)/gnss.mpy \\r
+                                       $(BUILD)/unzip.mpy \\r
+                                       $(BUILD)/queue.mpy \\r
+                                       $(BUILD)/sys_bus.mpy \\r
+                                       $(BUILD)/event_message.mpy \\r
+                                       $(BUILD)/hls.mpy \\r
+                                       $(BUILD)/wifilocator.mpy \\r
+                                       $(BUILD)/bak_util.mpy \\r
+                                       $(BUILD)/ftplib.mpy \\r
+                                       $(BUILD)/ftplibtls.mpy \\r
+                                       $(BUILD)/uwebsocket.mpy \\r
+                                       $(BUILD)/uping.mpy \\r
+                                       $(BUILD)/ymodem.mpy \r
+endif\r
+endif\r
+\r
+$(BUILD)/_frozen_mpy.c: $(frozen_mpy_list) $(HEADER_BUILD)/qstrdefs.generated.h\r
+       @$(ECHO) "MISC freezing bytecode"\r
+       $(Q)$(MPY_TOOL) -f -q $(HEADER_BUILD)/qstrdefs.preprocessed.h $(frozen_mpy_list) > $@\r
+\r
+$(BUILD):\r
+       $(Q)echo creating directory: $@\r
+       -$(Q)$(MKDIR) $@\r
+\r
+all:$(BUILD) $(HEADER_BUILD)/qstrdefs.generated.h $(HEADER_BUILD)/moduledefs.h  $(HEADER_BUILD)/compressed.data.h $(BUILD)/_frozen_mpy.c\r
+\r
+clean:\r
+       @echo ----- cleaning microPython private target\r
+       @rm -rf $(HEADER_BUILD)\r
+       @rm -rf $(BUILD)\r
+       @echo ----- done.\r
index 9c1eb2e..fd014cf 100644 (file)
-
-import utime
-import audio
-from machine import Pin
-import osTimer
-import _thread
-from queue import Queue
-import uwebsocket
-import usys
-import EventMesh
-import constants
-import ujson
-
-
-import gc
-AI_audio_queue = Queue(100)
-aud = audio.Audio(0)
-aud.set_pa(Pin.GPIO29)
-
-def AI_client_tts_recv(cli,fd):
-
-    while True:
-        try:
-            # 死循环接收数据
-            
-            recv_data = cli.recv()
-            if not recv_data:
-                # 服务器关闭连接或客户端关闭连接
-                print("AI_client_tts_recv close!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\r\n")
-                print("AI_client_tts_recv close!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\r\n")
-                break
-            try:
-                # print("AI_client_tts_recv :{}".format(len(recv_data)))
-                #结束标志{"header":{"event":"EndSynthesis","msg":"success","status":20000000,"task_id":"ffd727e620000803280c5a6498d0e321"}}
-                if isinstance(recv_data, str):
-                    print("AI_client_tts_recv:str recv_data:{}".format(recv_data))
-                    if recv_data.find('\"event\":\"EndSynthesis\"') != -1:
-                        print("EndSynthesis!!!!!!!!!!!!!!!!!\r\n")
-                        print("EndSynthesis!!!!!!!!!!!!!!!!!!\r\n")
-                        cli.close()
-                        fd.close()
-                else:
-                    fd.write(recv_data)
-                    AI_audio_queue.put([recv_data,""])
-                #utime.sleep_ms(1000)
-            except Exception as e:
-                usys.print_exception(e)
-                
-        except Exception as e:
-                usys.print_exception(e)
-                break
-
-def websocket_connect_tts(fd_neme,tts_str):
-    print("websocket_connect_tts {},{}!!!!!!!!!".format(fd_neme,tts_str))
-    fd=open(fd_neme,'w')
-    try:
-       
-        AI_client_tts = uwebsocket.Client.connect('ws://118.145.158.207:80/tts/long-text-stream', debug=False)
-    except Exception as e: #网络连接异常
-        usys.print_exception(e)
-        print("websocket_connect_tts ERROR:{}\r\n".format(e))
-        
-    print("websocket_connect_tts:AI_client_tts {}\r\n".format(AI_client_tts))
-    # 线程接收数据
-
-    #_thread.stack_size(20*1024)
-    AI_client_tts_recv_id = _thread.start_new_thread(AI_client_tts_recv, (AI_client_tts,fd))
-    AI_audio_queue_thread_id = _thread.start_new_thread(AI_audio_queue_thread, ())
-    #_thread.stack_size(8*1024)
-    #AI_client_tts_send()
-#def AI_client_tts_send(data_str):
-    data_str = "该设备的流量可能已用完,请及时充值,您的卡号为:"
-    data_l = {}
-    data_l ={
-        "header": {
-            "event": "LongTextStream",
-            "trace_id": "5864123541"
-        },
-        "payload": {
-            "voice":"xiaoyun",#"xiaoyun",
-            "format":"mp3",
-            "sample_rate":8000,
-            "volume":100,
-            "speech_rate":2,
-            "text":"%s"%(tts_str)
-        }
-    }
-    json_data = ujson.dumps(data_l)
-    AI_client_tts.send(json_data)
-# 音频队列        
-def AI_audio_queue_thread():
-    while True:
-        try:
-            if AI_audio_queue.empty() :
-                # if count_t%200 == 0:
-                #     print("AI_send_data_queue.empty")
-                utime.sleep_ms(5)
-            else:
-                #print("AI_audio_queue_thread")
-
-                data = AI_audio_queue.get()
-                
-                #AI_client_tts_data_len=len(data)
-                print("audio_queue:len:{} \r\n".format(len(data[0]),data[1]))
-                if len(data[0]) > 1:
-                    try:
-
-                        tmp= aud.playStream(3, data[0])#播放音频流
-
-                        print("出:{}!!!".format(len(data[0])))
-                        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)
-
-                    utime.sleep_ms(2)
-        except Exception as e:
-            print("AI_audio_queue_thread:ERROR:")
-            usys.print_exception(e)
-
-websocket_connect_tts("/usr/jianquancuowu.mp3","当前使用人数较多,请稍候重试")
-# for i in range(10):
+\r
+import utime\r
+import audio\r
+from machine import Pin\r
+import osTimer\r
+import _thread\r
+from queue import Queue\r
+import uwebsocket\r
+import usys\r
+import EventMesh\r
+import constants\r
+import ujson\r
+\r
+\r
+import gc\r
+AI_audio_queue = Queue(100)\r
+aud = audio.Audio(0)\r
+aud.set_pa(Pin.GPIO29)\r
+\r
+def AI_client_tts_recv(cli,fd):\r
+\r
+    while True:\r
+        try:\r
+            # 死循环接收数据\r
+            \r
+            recv_data = cli.recv()\r
+            if not recv_data:\r
+                # 服务器关闭连接或客户端关闭连接\r
+                print("AI_client_tts_recv close!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\r\n")\r
+                print("AI_client_tts_recv close!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\r\n")\r
+                break\r
+            try:\r
+                # print("AI_client_tts_recv :{}".format(len(recv_data)))\r
+                #结束标志{"header":{"event":"EndSynthesis","msg":"success","status":20000000,"task_id":"ffd727e620000803280c5a6498d0e321"}}\r
+                if isinstance(recv_data, str):\r
+                    print("AI_client_tts_recv:str recv_data:{}".format(recv_data))\r
+                    if recv_data.find('\"event\":\"EndSynthesis\"') != -1:\r
+                        print("EndSynthesis!!!!!!!!!!!!!!!!!\r\n")\r
+                        print("EndSynthesis!!!!!!!!!!!!!!!!!!\r\n")\r
+                        cli.close()\r
+                        fd.close()\r
+                else:\r
+                    fd.write(recv_data)\r
+                    AI_audio_queue.put([recv_data,""])\r
+                #utime.sleep_ms(1000)\r
+            except Exception as e:\r
+                usys.print_exception(e)\r
+                \r
+        except Exception as e:\r
+                usys.print_exception(e)\r
+                break\r
+\r
+def websocket_connect_tts(fd_neme,tts_str):\r
+    print("websocket_connect_tts {},{}!!!!!!!!!".format(fd_neme,tts_str))\r
+    fd=open(fd_neme,'w')\r
+    try:\r
+       \r
+        AI_client_tts = uwebsocket.Client.connect('ws://118.145.158.207:80/tts/long-text-stream', debug=False)\r
+    except Exception as e: #网络连接异常\r
+        usys.print_exception(e)\r
+        print("websocket_connect_tts ERROR:{}\r\n".format(e))\r
+        \r
+    print("websocket_connect_tts:AI_client_tts {}\r\n".format(AI_client_tts))\r
+    # 线程接收数据\r
+\r
+    #_thread.stack_size(20*1024)\r
+    AI_client_tts_recv_id = _thread.start_new_thread(AI_client_tts_recv, (AI_client_tts,fd))\r
+    AI_audio_queue_thread_id = _thread.start_new_thread(AI_audio_queue_thread, ())\r
+    #_thread.stack_size(8*1024)\r
+    #AI_client_tts_send()\r
+#def AI_client_tts_send(data_str):\r
+    data_str = "该设备的流量可能已用完,请及时充值,您的卡号为:"\r
+    data_l = {}\r
+    data_l ={\r
+        "header": {\r
+            "event": "LongTextStream",\r
+            "trace_id": "5864123541"\r
+        },\r
+        "payload": {\r
+            "voice":"xiaoyun",#"xiaoyun",\r
+            "format":"mp3",\r
+            "sample_rate":8000,\r
+            "volume":100,\r
+            "speech_rate":2,\r
+            "text":"%s"%(tts_str)\r
+        }\r
+    }\r
+    json_data = ujson.dumps(data_l)\r
+    AI_client_tts.send(json_data)\r
+# 音频队列        \r
+def AI_audio_queue_thread():\r
+    while True:\r
+        try:\r
+            if AI_audio_queue.empty() :\r
+                # if count_t%200 == 0:\r
+                #     print("AI_send_data_queue.empty")\r
+                utime.sleep_ms(5)\r
+            else:\r
+                #print("AI_audio_queue_thread")\r
+\r
+                data = AI_audio_queue.get()\r
+                \r
+                #AI_client_tts_data_len=len(data)\r
+                print("audio_queue:len:{} \r\n".format(len(data[0]),data[1]))\r
+                if len(data[0]) > 1:\r
+                    try:\r
+\r
+                        tmp= aud.playStream(3, data[0])#播放音频流\r
+\r
+                        print("出:{}!!!".format(len(data[0])))\r
+                        mem = gc.mem_free()\r
+                        print('1剩余内存RAM:{} KB'.format(mem / 1024))\r
+                    except Exception as e:\r
+                        print("AI_audio_queue_thread:ERROR:")\r
+                        usys.print_exception(e)\r
+\r
+                    utime.sleep_ms(2)\r
+        except Exception as e:\r
+            print("AI_audio_queue_thread:ERROR:")\r
+            usys.print_exception(e)\r
+\r
+websocket_connect_tts("/usr/jianquancuowu.mp3","当前使用人数较多,请稍候重试")\r
+# for i in range(10):\r
 #     websocket_connect_tts("/usr/static/R_READ_TIME_{}.mp3".format(i),"{}".format(i))
\ No newline at end of file
index 16959bb..a209000 100644 (file)
-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
-
-dev_type = "G10"
-#dev_type = "7PIN_BK"#小瑞
-#dev_type = "7PIN"#柒牌
-#dev_type = 'momo'#食梦貘
-#dev_type = 'sjgq'#四季甘泉
-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.GPIO41, ExtInt.IRQ_RISING_FALLING, ExtInt.PULL_PU, self.pwk_extint_cb)
-            #self.extint_AI = ExtInt(ExtInt.GPIO19,ExtInt.IRQ_RISING_FALLING, ExtInt.PULL_PU, self.keyAI_extint_cb)
-            self.extint_AI = ExtInt(ExtInt.GPIO22,ExtInt.IRQ_RISING_FALLING, ExtInt.PULL_PU, self.keyAI_extint_cb)
-        self.extint_AI.enable()
-        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)
-        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_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")#充电红灯常亮
-                EventMesh.publish("audio_montage_play",["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")
-                EventMesh.publish("audio_montage_play",["R_CHARGE_OUT.mp3"])
-                #self.aud.play(1,1,'U:/static/R_CHARGE_OUT.mp3')
-    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_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:
-            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("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')#关机音频
-                        EventMesh.publish("open_led_red")
-                        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_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):
-        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")
-        
-    def AI_key_release(self):
-        print("AI_key_release")
-        EventMesh.publish("AI_key_release")
-        
-    def pwk_key_Long_Press(self):
-        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("open_led_red")
-        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")
-
-    
-    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")#充电红灯常亮
-        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 :
-                EventMesh.publish("audio_montage_play",["R_CHARGE_FULL.mp3"])
-                #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"]:    
-            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.json")
-            if check == True:
-                with open("/usr/static/storage_file/config.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_data", self.set_storage_data)
-            EventMesh.subscribe("set_storage_config", self.set_storage_config)
-            EventMesh.subscribe("get_storage_data", self.get_storage_data)
-            EventMesh.subscribe("get_storage_config", self.get_storage_config)
-
-        def set_storage_data(self, event, msg): 
-            # EventMesh.debug_log("set_storage_data:{}".format(msg))
-            if msg != None:
-                self.config_data = msg
-                with open("/usr/static/storage_file/config.json",'w+',encoding="utf-8") as fd:
-                    ujson.dump(self.config_data,fd)
-        
-
-        def set_storage_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.json",'w+',encoding="utf-8") as fd:
-                ujson.dump(self.config_data,fd)
-        def get_storage_data(self, event, msg): 
-            # EventMesh.debug_log("get_storage_data:{}".format(self.config_data))
-            return self.config_data 
-        def get_storage_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_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_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_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_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_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_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 = 0 #0:短按连续问答模式 1:长按录音模式
-        self.VC_mode = EventMesh.publish("get_storage_config","VC_mode")#
-        if self.VC_mode == None :
-            self.VC_mode = 0
-        self.is_up_error= 0 #是否上传错误id
-        self.error_data = []
-        self.asr_taskid  = ""
-        self.VC_taskid  = ""
-        self.VC_server = 2 #0柒牌正式服务器,1:测试服务器1,2:测试服务器2
-
-        self.server_ip = EventMesh.publish("get_storage_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"
-            else:
-                self.server_ip="sevenpin.qipai.com.cn"
-
-            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_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 = "您好!我是巴马四季甘泉的智能助手。我可以为你解答各种各样的问题,像是有关巴马四季甘泉知识库、中基长寿科学产品、卫斯曼院士国际先进医疗中心的问题,还有日常生活与工作、旅游信息、健康咨询、教育与学习、情感交流、全球资讯、世界文化等方面的问题哦。你有没有这方面的问题想要问我呀?"
-            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.VC_TTS_voice_type = EventMesh.publish("get_storage_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":
-                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":"huoshan::zh_female_wanwanxiaohe_moon_bigtts" ,
-                                            "lang":"zh-cn"
-                                            },
-                                            "男":{
-                                            "bot_name":"柒先生",
-                                            "voice":"huoshan::zh_male_wennuanahu_moon_bigtts"  ,
-                                            "lang":"zh-cn"
-                                            },
-                                            "童":{
-                                            "bot_name":"柒乐乐",
-                                            "voice":"huoshan::ICL_zh_female_huoponvhai_tob"  ,
-                                            "lang":"zh-cn"
-                                            },
-                                            "粤":{
-                                            "bot_name":"柒先生",
-                                            "voice":"huoshan::zh_female_wanqudashu_moon_bigtts" ,
-                                            "lang":"zh-hk" 
-                                            },
-                                            "四川":{
-                                            "bot_name":"柒妹妹",
-                                            "voice":"huoshan::zh_female_daimengchuanmei_moon_bigtts",
-                                            "lang":"&lang=zh-cn-sc"  
-                                            },
-                                            "个性":{
-                                            "bot_name":"柒先生",
-                                            "voice":"huoshan::zh_male_sunwukong_mars_bigtts" ,
-                                            "lang":"zh-cn" 
-                                            },
-                                            "英语":{
-                                            "bot_name":"柒先生",
-                                            "voice":"huoshan::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_config",["VC_TTS_voice_type",self.VC_TTS_voice_type])
-
-        try:
-            self.VC_TTS_voice_key = EventMesh.publish("get_storage_config","VC_TTS_voice_key")#音色配置
-            if self.VC_TTS_voice_key == None :
-                if dev_type == "7PIN_BK":
-                    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_config","VC_TTS_volume")#音量配置
-        except Exception as e:
-            usys.print_exception(e)
-
-        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.VC_Speech_end_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.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)
-        EventMesh.subscribe("AI_key_release", self.AI_key_release)
-        EventMesh.subscribe("AI_key_long_press", self.AI_key_long_press)
-        EventMesh.subscribe("pwk_key_release", self.pwk_key_release)
-        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)
-        
-        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_config",["powerRestart",1])
-                powerRestart =  EventMesh.publish("get_storage_config","powerRestart")#=1非正常重启
-                if powerRestart == None:
-                    powerRestart = 0
-                if powerRestart == 1:
-                    EventMesh.publish("set_storage_config",["powerRestart",0])
-                    
-                else:
-                    
-                    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_config","config_version")#音量配置
-                                    if config_version != data["data"]["version"]:
-                                        config_version = data["data"]["version"]
-                                        EventMesh.publish("set_storage_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_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_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_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(self, event, msg):#按键按下
-        print("AI_key_press")
-        self.get_config_timer_count = 0
-        self.key_state = 1
-        #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.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})
-            
-        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})
-
-                
-                #self.VC_Speech_End()
-    def AI_key_long_press(self, event, msg):#按键长按
-        print("AI_key_long_press")
-        self.AI_key_long_press_flag = 1
-
-    def pwk_key_release(self, event, msg):#电源键短按,关闭
-        print("pwk_key_release")
-        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}) 
-#****************************************ASR连接**********************************************************************
-    def websocket_connect_asr(self):
-        print("websocket_connect_asr:{} e:{}!!!!!!!!!!!!!!!!!!!!!".format(self.AI_client_asr_isconnect,self.AI_client_asr_debug))
-        self.AI_ASR_text_repet_count = 0
-        self.AI_ASR_check_timeout = 0
-        self.AI_ASR_error_timeout = 0
-        self.AI_ASR_text_tmp = ""
-        if self.AI_client_asr_isconnect == 1:
-            return
-        # 创建ASR客户端
-        try:
-            signal = net.csqQueryPoll()
-            if signal == -1 or sim.getStatus() != 1:#网络正常
-                self.websocket_error()
-                return
-
-            # self.AI_client_asr = uwebsocket.Client.connect('wss://nls-gateway-cn-beijing.aliyuncs.com/ws/v1',headers=Headers, debug=False)
-            req_str = ""
-            platform = "platform=huoshan"
-            #platform= "platform=xfyun-ita"
-            platform= "platform=xfyun-bigmodel-ita"
-            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)
-            req_str = "asr/ws?is_auth={}&{}&{}".format(self.is_auth,platform,lang)
-            print("req_str:{}".format(req_str))
-            token = EventMesh.publish("get_dev_token")
-            print("token:{}".format(token))
-            url = 'ws://{}/{}&dt={}'.format(self.server_ip,req_str,token)
-            print("websocket_connect_asr URL:{}".format(url))
-            self.AI_client_asr = uwebsocket.Client.connect(url, debug=True)#
-            #self.AI_WS_connect_Queue.put(self.AI_client_asr)
-            
-        except Exception as e: #网络连接异常
-            usys.print_exception(e)
-            
-            print("websocket_connect_asr error!!!\r\n")
-            #self.connect_timerout_popup(2)  
-            str_error = str(e)
-            if str_error.find("[Errno 22] EINVAL")!= -1: 
-                self.websocket_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")
-                EventMesh.publish("set_storage_config",["powerRestart",1])#调试临时关闭
-                utime.sleep_ms(1000)
-                self.aud.stopPlayStream()
-                self.aud.stopAll()
-                Power.powerRestart()
-                
-            self.websocket_error()
-            
-            return
-        if self.AI_client_asr == None:
-            EventMesh.publish_async("update_dev_token",thread_size = 8192)#获取token
-            return 
-        self.AI_client_asr_debug+=1
-        utime.sleep_ms(10)
-        #self.AI_client_asr.settimeout(5)
-        #开启发送线程
-        if self.AI_ASR_send_data_queue_thread_id == 0:    
-            _thread.stack_size(self.Audio_buf_size+8*1024)
-            self.AI_ASR_send_data_queue_thread_id = _thread.start_new_thread(self.AI_ASR_send_data_queue_thread, ())
-            _thread.stack_size(8*1024)
-            print("AI_VC_start :AI_ASR_send_data_queue_thread_id :{} ".format(self.AI_ASR_send_data_queue_thread_id))
-        print("websocket_connect_asr 222!!!\r\n")
-        self.AI_client_asr_recv_thread_close()#关闭读线程
-        # 创建线程接收数据
-        _thread.stack_size(self.Audio_buf_size+8*1024)
-        self.AI_client_asr_recv_id = _thread.start_new_thread(self.AI_client_asr_recv, (self.AI_client_asr,))
-        _thread.stack_size(8*1024)
-        self.AI_client_asr_isconnect = 1
-        self.AI_ASR_timer.start(1000, 1, self.AI_ASR_timer_cb)
-        self.AI_client_asr_start_requset()#开始请求
-        print("websocket_connect_asr:OK!!!!!!!!!!!!!!!!!!!!!")
-
-    def websocket_deconnect_asr(self):
-        print("websocket_deconnect_asr {}!!!!!!!".format(self.AI_client_asr_isconnect))
-        print("websocket_deconnect_asr!!!!!!!")
-        self.AI_ASR_text_repet_count = 0
-        self.AI_ASR_text_tmp = ""
-        self.AI_ASR_timer.stop()
-        #self.AI_ASR_send_data_queue_thread_close()#关闭发送线程
-        self.AI_client_asr_recv_thread_close()#关闭读线程
-        if self.AI_client_asr_isconnect == 1 or self.AI_client_asr!= None:
-            try:
-                self.AI_client_asr_isconnect = 0
-                count = 500
-                while True:#等待发完数据
-                    count-=1
-                    if count <=0 or self.AI_ASR_send_data_queue_thread_lock == 0:
-                        break
-                    print("等待发送完成:{}".format(count))
-                    if self.AI_ASR_send_data_queue.empty()!=True:
-                        self.AI_ASR_send_data_queue.clear()
-                    utime.sleep_ms(1)
-                
-                try:
-                    self.AI_client_asr_StopTranscription_requset()#发送停止ASR
-                    self.AI_client_asr.close()
-                except Exception as e:
-                    usys.print_exception(e)
-                    utime.sleep_ms(200)#再尝试关闭一次
-                    try:
-                        self.AI_client_asr.close()
-                        
-                    except Exception as e:
-                        usys.print_exception(e)
-                self.AI_client_asr_debug-=1
-                try:
-                    self.AI_client_asr._close()
-                except Exception as e:
-                    usys.print_exception(e)
-                self.AI_client_asr = None
-            except Exception as e:
-                usys.print_exception(e)
-        print("websocket_deconnect_asr {}!!!!!!!".format(self.AI_client_asr_isconnect))
-
-    #websocket发送数据    
-    def AI_client_asr_send(self,data_str):
-        # if isinstance(data_str, str):#是字符串
-        #     print("ASR ASR AI_client_asr_send:{}".format(data_str))
-        #     pass
-        # else:
-        #     pass
-        #     #print("ASR ASR AI_client_asr_send:len:{}".format(len(data_str)))
-        self.AI_ASR_send_data_queue.put([AI_client_asr_num,data_str]) 
-
-    def AI_client_asr_ping(self):
-        pass
-        if self.AI_client_asr_isconnect == 1:
-            #self.AI_client_asr.write_frame(0x09,b'ping ping')
-            self.AI_client_asr_send("ping")
-    def set_AI_ASR_flag(self,data):
-        self.AI_ASR_flag = data
-    def AI_ASR_timer_cb(self, *args): #
-        EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_ASR_timer_cb_}) 
-
-    def AI_ASR_timer_cb_(self):    
-        if self.AI_ASR_check_timeout > 0:
-            print("AI_ASR_check_timeout:{}".format(self.AI_ASR_check_timeout))
-            self.AI_ASR_check_timeout-=1
-            if self.AI_ASR_check_timeout <=0:
-                self.AI_ASR_check_timeout = 0
-                self.AI_ASR_error_timeout = 3#发送停止后3秒后没正式结果就提示
-                #EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_client_asr_StopTranscription_requset})
-                
-        if self.AI_ASR_error_timeout>0:
-            self.AI_ASR_error_timeout-=1
-            print("AI_ASR_error_timeout:{}".format(self.AI_ASR_error_timeout))  
-            if self.AI_ASR_error_timeout <= 0:
-                self.AI_ASR_error_timeout = 0
-                #if self.AI_ASR_str == "":
-                if self.AI_ASR_str_tmp == "" and self.AI_ASR_str == "" and self.AI_ASR_text_tmp == "":
-                    self.AI_TTS_str = "没有识别到您说话,请重试" 
-                else :
-                    self.AI_ASR_str = self.AI_ASR_str_tmp + self.AI_ASR_str+self.AI_ASR_text_tmp
-                    self.AI_ASR_str_tmp = self.AI_ASR_str
-                print("AI_ASR_error_timeout2:重连:{}!!!!!!!!!!\r\n".format(self.AI_ASR_str) )
-                print("AI_ASR_error_timeout2:重连:{}!!!!!!!!!!\r\n".format(self.AI_ASR_str) )
-                print("AI_ASR_error_timeout2:重连:{}!!!!!!!!!!\r\n".format(self.AI_ASR_str) )
-                EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_deconnect_asr}) 
-                EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_connect_asr}) #重连ASR
-                #EventMesh.publish("publish_AI_btnInfo",{"func":self.VC_Speech_End}) #重连ASR
-                EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_VC_start})
-                EventMesh.publish("publish_AI_btnInfo",{"func":self.set_AI_ASR_flag,"data":1})#设置以打断过一次
-                if self.VC_record_state_flag > 1:
-                    self.VC_record_state_flag =1
-        pass
-    #关闭ASR数据发送线程
-    def AI_ASR_send_data_queue_thread_close(self):
-        if self.AI_ASR_send_data_queue_thread_id != 0:
-            count =500
-            while True:
-                count -= 1     
-                if self.AI_ASR_send_data_queue_thread_lock == 0 or count <=0:
-                    break
-                else:
-                    self.AI_ASR_send_data_queue_thread_lock = 2
-                    print("AI_ASR_send_data_queue_thread going:{}...".format(count))
-                    utime.sleep_ms(1)
-            self.AI_ASR_send_data_queue_thread_lock = 0
-            print("AI_ASR_send_data_queue_thread_close")
-            try:
-                _thread.stop_thread(self.AI_ASR_send_data_queue_thread_id)
-            except Exception as e:
-                usys.print_exception(e)
-        self.AI_ASR_send_data_queue_thread_id = 0
-    #发送数据队列
-    def AI_ASR_send_data_queue_thread(self):
-        print("AI_ASR_send_data_queue_thread:start")
-        count_t = 0
-        while True:
-            if self.AI_ASR_send_data_queue_thread_lock == 2:
-                print("AI_ASR_send_data_queue_thread:该退出了")
-                break
-            if self.AI_ASR_send_data_queue.empty() :#不能去掉,去掉会卡死
-                self.AI_ASR_send_data_queue_thread_lock = 0  
-                count_t+=1
-                utime.sleep_ms(1)
-            else:
-                #data[0]是websocket连接对象编号,data[1]是数据
-                #print("AI_ASR_send_data_queue_thread:get")
-                
-                self.AI_ASR_send_data_queue_thread_lock = 1
-                data = self.AI_ASR_send_data_queue.get()
-                #print("AI_ASR_send_data_queue_thread:num{} len{}".format(data[0],len(data[1])))
-                if data != None:
-                    try:
-                        # 发送数据
-                        if data[0] == AI_client_asr_num:
-                            self.AI_ASR_send_buf_len -= len(data[1])
-                            self.asr_pingping_timerout = 0
-                            if self.AI_client_asr != None and self.AI_client_asr_isconnect == 1:
-                                self.AI_client_asr.send(data[1])
-                                if isinstance(data[1], str):#是字符串
-                                    print("ASR ASR: send_data:{}".format(data[1]))
-                                # else:
-                                #     print("ASR ASR: send_data!:{}".format(len(data[1])))
-                            else:
-                                if isinstance(data[1], str):#是字符串
-                                    print("ASR ASR: send_data error!!!:{}".format(data[1]))
-                                else:
-                                    print("ASR ASR: send_data error!!!:{}".format(len(data[1])))
-
-                    except Exception as e:
-                        usys.print_exception(e)
-                        if data[0] == AI_client_asr_num: 
-                            if self.AI_client_asr_isconnect != 0:
-                                print("ASR发送数据错误,退出")
-                                EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_error,"data":"ASR发送出错了,请重试"}) 
-                                self.ud_error(["asr",self.asr_taskid])
-                            #EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_connect_asr}) #重连
-                    utime.sleep_ms(1)
-        self.AI_ASR_send_data_queue_thread_lock = 0    
-
-    #ASR关闭读线程
-    def AI_client_asr_recv_thread_close(self):
-        if self.AI_client_asr_recv_id != 0:
-            count =500
-            while True:
-                count -= 1
-                if self.AI_client_asr_recv_lock == 1:
-                    self.AI_client_asr_recv_lock = 2
-                if self.AI_client_asr_recv_lock == 0 or count <=0:
-                    break
-                else:
-                    print("AI_client_asr_recv_thread going:{}...".format(count))
-                    utime.sleep_ms(1)
-            self.AI_client_asr_recv_lock = 0
-            print("AI_client_asr_recv_thread_close")
-            try:
-                _thread.stop_thread(self.AI_client_asr_recv_id)
-            except Exception as e:
-                usys.print_exception(e)
-        self.AI_client_asr_recv_id = 0
-
-    #Ai ASR websocket返回数据       
-    def AI_client_asr_recv(self,cli):
-        while True:
-            try:
-                # 死循环接收数据
-                self.AI_client_asr_recv_lock = 0
-                utime.sleep_ms(1)
-                recv_data = cli.recv()
-                if self.AI_client_asr_recv_lock == 2:#要关闭线程了
-                    print("AI_client_asr_recv 该退出了")
-                    break
-                self.AI_client_asr_recv_lock = 1
-                self.close_timerout = 0#服务器有返回清零退出时间
-                if recv_data == "websocket close":
-                    # 服务器关闭连接
-                    print("ASR 服务器主动关闭连接!!!!!!!!!!!!!!!!!!!!!!!!!!!")
-                    
-                    EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_error,"data":"ASR连接断开了,请重试"}) 
-                    self.ud_error(["asr",self.asr_taskid])
-                    break
-                elif recv_data == "":#客户端关闭连接
-                    print("ASR ASR :客户端关闭连接")
-                    EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_error,"data":"ASR连接断开了,请重试"}) 
-                    self.ud_error(["asr",self.asr_taskid])
-                    break
-                try:
-                    if isinstance(recv_data, str):
-                        jsload_data =  ujson.loads(recv_data)
-                        print("ASR ASR recv_data: {}".format(jsload_data))
-                        if jsload_data["status"] != 20000000:#返回错误
-                            print("ASR返回非20000000状态码,退出")
-                            EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_error,"data":"ASR出错了,请重试"}) 
-                            self.ud_error(["asr",self.asr_taskid])
-                            break
-                        
-                        if jsload_data["task_id"] != None:
-                            self.asr_taskid  = jsload_data["task_id"]
-                        if jsload_data["event"] != None:
-                            if jsload_data["event"] == "TranscriptionStarted": #开始录音
-                                self.VC_record_state_flag = 2
-                                self.VC_state =  VC_State_SpeechStart
-                                EventMesh.publish("open_led_blue")
-                                self.AI_ASR_error_timeout = 0
-                                
-                                pass
-
-                            elif jsload_data["event"] == "Changed" or jsload_data["event"] == "SentenceEnd" : #开始录音Changed
-                                # if self.VC_record_state_flag == 2:
-                                #     
-                                
-                                self.AI_ASR_timer_count = 0
-                                if jsload_data["result"]["result"]:
-                                    #self.AI_listen_text = str(jsload_data["result"]["result"])
-                                    text= str(jsload_data["result"]["result"])
-                                    print("ASR recv self.VC_state :{}".format(self.VC_state))
-                                    if self.is_long_record == 0:
-                                        if self.VC_state >= VC_State_TTSStart:#开始播音后不响应asr结果
-                                            print("asr continue")
-                                            continue
-                                    EventMesh.publish("open_led_blue")
-                                    
-                                    if jsload_data["result"]["is_end"] == True:  #asr结束
-                                        self.AI_ASR_check_timeout = 0
-                                        self.AI_ASR_error_timeout = 0
-                                        self.AI_ASR_text_repet_count = 0
-                                        self.AI_ASR_text_tmp = ""
-                                        self.VC_record_state_flag = 4
-                                        ret= self.check_text(text)
-                                        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})
-                                                #print("AI_client_asr_recv VC_Speech_End") 
-                                                EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_deconnect_VC}) 
-                                                #EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_deconnect_asr})
-                                                EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_VC_start}) 
-                                            except Exception as e:
-                                                usys.print_exception(e)
-                                            continue
-                                        elif ret == 1:#不处理
-                                            pass
-                                        else:#正常asr
-                                            if self.VC_mode == 0 :#连续问答模式
-                                                self.AI_ASR_str = text#
-                                                if self.AI_ASR_flag == 0:#d第一次识别,没有打断
-                                                    self.AI_ASR_str_tmp = self.AI_ASR_str
-                                                else:#第二次识别,打断了
-                                                    self.AI_ASR_str = self.AI_ASR_str_tmp+text
-                                                    print("ASR ASR 打断 续集 AI_ASR_str {}".format(self.AI_ASR_str))
-                                                    self.AI_ASR_str_tmp = self.AI_ASR_str
-                                                    if self.is_long_record != 0:
-                                                        #if self.VC_state >= VC_State_TTSStart:#如果已经播放了,关闭VC连接,重新打开,处理音频数据太多问题
-                                                        EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_deconnect_VC})#关闭vc连接
-                                                self.AI_ASR_flag  = 1
-                                                print("asr recv :asr_str:{}".format(self.AI_ASR_str))  
-                                                #EventMesh.publish("publish_AI_btnInfo",{"func":utime.sleep_ms,"data":(500)}) #等一秒
-                                                EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_VC_start}) 
-                                            elif self.VC_mode == 1:#单对话模式
-                                                self.AI_ASR_str += text#
-                                                self.AI_ASR_str_tmp = self.AI_ASR_str
-                                                if self.key_state == 0:#按键已经弹起
-                                                    self.AI_ASR_str_tmp =""
-                                                    print("asr recv :asr_str:{}".format(self.AI_ASR_str))  
-                                                    #EventMesh.publish("publish_AI_btnInfo",{"func":utime.sleep_ms,"data":(500)}) #等一秒
-                                                    EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_VC_start}) 
-                                        self.VC_state =  VC_State_SpeechEnd
-                                    elif jsload_data["result"]["is_end"] == False:
-                                        
-                                        self.VC_state =  VC_State_SpeechIng
-                                        if self.AI_ASR_text_tmp != "" and self.AI_ASR_text_tmp  == text:
-                                            pass
-                                            # self.AI_ASR_text_repet_count+=1
-                                            # if self.AI_ASR_text_repet_count>=40:#重复30次下发一样结果,就报错
-                                            #     print("asr 错误,无正式结果:{}".format(text))
-                                            #     #EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_error})#
-                                            #     EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_error,"data":"ASR出错了,请重试"}) 
-                                        else:
-                                            self.AI_ASR_check_timeout = 5 #5秒没更新结果,强制stop
-                                            self.AI_ASR_error_timeout = 0
-                                            self.AI_ASR_text_repet_count = 0
-                                        if self.VC_mode == 0 :#连续问答模式
-                                            self.AI_ASR_text_tmp = text
-                                            self.VC_record_state_flag = 3
-                                            if self.AI_ASR_flag ==1 :#如果已经识别过一次asr
-                                                self.AI_ASR_flag = 2
-                                                print("asr 打断,关闭VC连接")
-                                                self.AI_ASR_str = ""
-                                                if self.is_long_record != 0:
-                                                    self.VC_Play_End()
-                                                    EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_deconnect_VC})#关闭vc连接
-                                                # EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_connect_VC})#连接服务器
-                                                # EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_client_VC_start_requset})#请求
-                                                EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_VC_start}) 
-                                                EventMesh.publish("publish_AI_btnInfo",{"func":EventMesh.publish,"data":"open_led_blue"})#
-                                        elif self.VC_mode ==1:#单对话模式
-                                            self.AI_ASR_str_tmp =""
-                        
-                except Exception as e:
-                    usys.print_exception(e)
-                
-            except Exception as e:
-                    error_str = str(e)
-                    print("ASR ASR:e:{}".format(error_str))
-                    #usys.print_exception(e)
-                    if error_str.find("[Errno 110]")!= -1:
-                        #print("ASR ASR:recv TIMEDOUT 正常")
-                        pass
-                    else:
-                        usys.print_exception(e)
-                        print("{}".format(cli))
-                        #self.websocket_error()
-                        print("ASR读数据报错,退出")
-                        EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_error,"data":"ASR出错了,请重试"})#
-                        self.ud_error(["asr",self.asr_taskid])
-                        break
-        self.AI_client_asr_isconnect = 0
-        self.AI_client_asr_recv_id = 0 
-        self.AI_client_asr_recv_lock = 0
-        print("AI_client_asr_recv END!!!!!!!!!!!!!!!!!!!!!!!!!!!")
-    #ASR开始会话
-    def AI_client_asr_start_requset(self):
-        self.session_id  = self.get_session_id()
-        json_data = \
-        { 
-            "header":{
-                "event":"StartTranscription",
-                "trace_id":self.get_trace_id()
-                },
-            "payload":{
-                "format":"pcm",
-                "sample_rate":self.VC_record_samplerate,
-                 "session_id": self.session_id ,
-                }
-            
-        }
-        if self.VC_record_TYPE == VC_record_TYPE_AMR :
-            json_data["payload"]["format"]='amr'
-            pass
-        
-        self.AI_ASR_error_timeout = 5
-        self.AI_client_asr_send(ujson.dumps(json_data))
-    #ASR终止
-    def AI_client_asr_StopTranscription_requset(self):   
-        print("AI_client_asr_StopTranscription_requset!!!!!")
-        json_data = \
-        {
-            "header":{
-                "event":"StopTranscription",
-                "trace_id":self.get_trace_id()
-                }
-        }
-
-        #self.AI_client_asr_send(ujson.dumps(json_data))
-        if self.AI_client_asr != None and self.AI_client_asr_isconnect == 1:
-            self.AI_client_asr.send(ujson.dumps(json_data))
-                
-     #开始录音
-    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:
-                if dev_type != "7PIN" :
-                    EventMesh.publish("publish_AI_btnInfo",{"func":self.chenggong_tone}) 
-                #self.websocket_connect_asr()   
-                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 = 2
-        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()
-        # try:
-        #     self.websocket_deconnect_asr()
-        # except Exception as e:
-        #     usys.print_exception(e)  
-        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
-        # 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
-        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(20)
-                    
-                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])
-                    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
-                    # if self.VC_record_state_flag >= 2:
-                    #     self.AI_client_asr_send(read_buf)
-                    
-                    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:
-                                self.AI_client_VC_input_audio_buffer_append(self.AI_record_tmp_queue.get())
-                                #self.AI_client_asr_send(self.AI_record_tmp_queue.get())  #发送之前存的数据
-                        #self.AI_client_asr_send(read_buf)   
-                        self.AI_client_VC_input_audio_buffer_append(read_buf)
-                    #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
-            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)
-            
-            url="wss://ws.coze.cn/v1/chat?bot_id=7462617881076351002"
-            print("VC VC:url{}".format(url))
-            Headers = {"Authorization":"Bearer pat_SSaiOzccrRLaQEaB4sdshvHZQzqjeWD5jq2GWPVoWRx4N8XcdraHWYqdDjK5zpR1"}
-            self.AI_client_VC = uwebsocket.Client.connect(url, headers=Headers,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_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("websocket 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:
-                            self.VC_pingping_timerout = 0
-                            if isinstance(data[1], str):#是字符串
-                                if len(data[1])<600:
-                                    print("VC VC: send_data:{}".format(data[1]))
-                                else:
-                                    pass
-                                    #print("VC VC: send_data:{}...".format(data[1][:300]))
-                            #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(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
-
-        while True:
-            try:
-                # 死循环接收数据
-                self.AI_client_VC_recv_lock = 0
-                if self.is_VC_ACK == 1:
-                    self.AI_client_VC_Read()
-                #EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_client_VC_Read})
-                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):#返回的是字符串
-                        if len(recv_data)<300:
-                            print("VC VC:recv_data:{}".format(recv_data))
-                        else:
-                            print("VC VC:recv_data long :{}".format(recv_data[:300]))
-                        jsload_data =  ujson.loads(recv_data)
-                        #print("AI_client_VC_recv jsload_data = {}".format(jsload_data))
-                        if jsload_data["event_type"] == "chat.updated" :#会话开始
-                            print("VC:Started!!!!!!!!\r\n")
-                            print("VC:Started!!!!!!!!\r\n")
-                            print("VC:Started!!!!!!!!\r\n")
-                            
-                            self.AI_client_VC_send_speech()#开始上传语音
-                        elif jsload_data["event_type"] == "conversation.audio_transcript.update" :#音频转译
-                            self.VC_Speech_end_timerout = 2
-                            self.AI_ASR_str = jsload_data["data"]['content']
-                            if self.AI_ASR_str.find("。") != -1 or self.AI_ASR_str.find("?") != -1 or self.AI_ASR_str.find("!") != -1:
-                                self.VC_Speech_end_timerout = 0
-                                self.AI_client_VC_end_speech()#发送说话终止
-
-                        elif jsload_data["event_type"] == "conversation.chat.created" :#开始对话    
-                            self.open_play_flag = 0
-                            if self.play_data_save_flag == 1:
-                                try:
-                                    uos.remove('/usr/play_data.pcm')
-                                except Exception as e:
-                                    usys.print_exception(e)
-                                self.play_fd = open('/usr/play_data.pcm','w')
-                        
-                        elif  jsload_data["event_type"] == "conversation.message.delta":#返回大模型回答数据
-                            if self.open_play_flag == 0:
-                                EventMesh.publish("publish_AI_btnInfo",{"func":self.VC_Play_Start})#打开播放
-                                self.open_play_flag =1
-                        elif  jsload_data["event_type"] == "conversation.audio.delta":#下发音频数据
-                            
-                            audio_data = ubinascii.a2b_base64(jsload_data["data"]['content'])
-                            print("下发音频数据1:{}".format(len(audio_data)))
-                            EventMesh.publish("publish_AI_btnInfo",{"func":self.put_record_data,"data":[audio_data,""]}) 
-                            if self.play_data_save_flag == 1:
-                                if self.play_fd !=None:
-                                    self.play_fd.write(audio_data)
-                        elif  jsload_data["event_type"] == "conversation.audio.completed":#结束播放
-                            if self.play_data_save_flag == 1:
-                                if self.play_fd !=None:
-                                    print("输出音频文件关闭")
-                                    self.play_fd.close()
-
-                        # elif jsload_data["event"]  == "SpeechContent" :#asr转译
-                        #     print("VC:SpeechContent!!!!!!!!\r\n")
-                        #     payload = jsload_data["payload"]
-                            
-                            
-                        #     if(payload['finished'] == True):#asr结束
-                        #         self.VC_state =  VC_State_SpeechEnd
-                        #         #self.VC_Speech_End()#停止录音
-                        #         text = payload["text"]
-                        #         if self.check_text(text) == 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.websocket_deconnect_VC}) 
-                        #                 EventMesh.publish("publish_AI_btnInfo",{"func":self.VC_Speech_End}) 
-                                        
-                        #                 # EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_deconnect_asr})
-                        #                 EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_VC_start}) 
-                        #             except Exception as e:
-                        #                 usys.print_exception(e)
-                                
-                        #         pass
-                        #     else:
-                        #         pass
-
-                        # elif jsload_data["event"]  == "SpeechEnded" :#服务器下发ASR说话结束
-                        #     self.VC_state =  VC_State_SpeechEnd
-                        # elif jsload_data["event"]  == "RespondingContent" :#chat回答      
-                        #     pass
-                            
-                        # elif jsload_data["event"]  == "RespondingStarted" :#音频开始下发
-                        #     self.play_flag = 0
-                        #     self.VC_state = VC_State_TTSStart
-                        #     if self.is_long_record == 0:
-                        #         EventMesh.publish("publish_AI_btnInfo",{"func":self.VC_Speech_End})#
-                        #     else:
-                        #         self.AI_ASR_str_tmp = ""
-                        #         self.AI_ASR_str = ""
-                        #     EventMesh.publish("publish_AI_btnInfo",{"func":self.VC_Play_Start})
-                        #     self.VC_Thinking_timerout = 0#关闭超时重试
-                        #     # self.VC_Play_Start()
-                        #     EventMesh.publish("open_led_green")#绿色
-                        #     #self.tts_fd = open('/usr/tts_tesr.pcm','w')
-                        #     if self.play_data_save_flag == 1:
-                        #         try:
-                        #             uos.remove('/usr/play_data.pcm')
-                        #         except Exception as e:
-                        #             usys.print_exception(e)
-                        #         self.play_fd = open('/usr/play_data.pcm','w')
-                            
-                        #     pass
-                        # elif jsload_data["event"]  == "RespondingEnded" :#音频下发结束
-                        #     #if self.VC_state == VC_State_TTSStart:
-                            
-                        #     print("RespondingEnded!!!!!!" )
-                        #     self.VC_state = VC_State_TTSEnd
-                        #     self.LocalRespondingEnded_timerout = 10 #最长倒数10秒发送音频结束或者终止对话
-                        #     if self.VC_mode == 0 :#连续问答模式
-                        #         #EventMesh.publish("publish_AI_btnInfo",{"func":self.VC_Speech_End})#调试临时打开
-                        #         if dev_type != "7PIN_BK":
-                        #             EventMesh.publish("publish_AI_btnInfo",{"func":self.VC_Speech_Start})#开始录音 
-                        #         pass
-                        #     if self.play_data_save_flag == 1:
-                        #         if self.play_fd !=None:
-                        #             self.play_fd.close()
-                        #     #self.tts_fd.close()
-                        #     #pass
-                        # elif jsload_data["event"]  == "DialogStateChanged" :#状态切换事件
-                        #     payload = jsload_data["payload"]
-                        #     if payload["state"] == "Listening":#可以说了
-                        #         self.VC_state = VC_State_Listening
-                        #         if self.AI_TTS_str != "" or self.AI_ASR_str != "":#有tts数据,则请求TTS数据,没有就请求开始上传语音
-                        #             self.AI_client_VC_RequestToRespond()
-                        #         else:
-                        #             pass
-                        #             #self.VC_Speech_Start()#开启线程获取录音数据
-                        #             if self.is_long_record == 0:
-                        #                 EventMesh.publish("publish_AI_btnInfo",{"func":self.VC_Speech_Start})#
-                        #             #self.AI_client_VC_send_speech()#开始上传语音
-                                
-                        #         #EventMesh.publish("open_led_red")
-                        #     if payload["state"] == "Thinking":#思考
-                        #         self.VC_state = VC_State_Thinking
-                        #         if self.VC_Thinking_timerout == 0:
-                        #             self.VC_Thinking_timerout = 15#倒计时15秒,如果没有音频数据返回就重试
-                        #         EventMesh.publish("open_led_red_green")#黄色
-                        #     if payload["state"] == "Responding":#开始音频播放
-                        #         #self.VC_state = VC_State_Responding#
-                        #         pass
-                        # elif jsload_data["event"]  == "RequestAccepted" :#请求上传语音被允许
-                        #     #self.VC_state =  VC_State_Responding
-                        #     #self.AI_client_VC_send_speech()#开始上传语音
-                        #     pass
-                    else:#下发音频数据
-                        #self.AI_ASR_str = ""#下发音频后清掉asr结果
-                        
-                        print("下发音频数据1:{}".format(len(recv_data)))
-                        
-                        if self.play_data_save_flag == 1:
-                            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,""])
-                            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(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_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_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_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_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_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_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_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_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_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_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_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)<12 and (text.find("再见") != -1 or text.find("拜拜") != -1):
-                    EventMesh.publish("publish_AI_btnInfo",{"func":self.Close}) 
-                    return 1
-        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_TYPE == VC_play_TYPE_PCM:
-            # if self.VC_play_samplerate == 8000:
-            #     pass
-            # elif self.VC_play_samplerate == 16000:
-            #     if self.play_pcm == None:        
-            #         self.play_pcm = audio.Audio.PCM(0,1,16000,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))
-            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
-    #停止播放声音
-    def VC_Play_End(self):
-        if self.VC_play_TYPE == VC_play_TYPE_PCM:
-            if self.VC_play_samplerate == 8000:
-                self.aud.stopPlayStream()
-                self.aud.stopAll()
-            else:
-                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()
-   
-    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.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("publish_AI_btnInfo",{"func":self.VC_Speech_Start})#开始录音
-                    #通知服务器播放结束
-                    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
-        if self.VC_Speech_end_timerout >0:
-            self.VC_Speech_end_timerout-=1
-            if self.VC_Speech_end_timerout <=0:
-                self.VC_Speech_end_timerout = 0
-                self.AI_client_VC_end_speech()#发送说话终止
-    #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")
-        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()#连接服务器
-            self.AI_client_VC_start_requset()
-            #utime.sleep_ms(50)
-        else:
-            print("self.VC_state :{}".format(self.VC_state ))
-            if self.VC_state > VC_State_SpeechStart:
-                #客户端打断对话
-                print("打断对话")
-                # self.websocket_deconnect_VC()
-                # self.websocket_connect_VC()#连接服务器
-                # self.AI_client_VC_start_requset()
-                self.AI_client_VC_RequestToSpeak()
-            elif self.VC_state == VC_State_Listening:
-                #直接chat
-                print("直接chat")
-                self.AI_client_VC_RequestToRespond()
-                return 
-            else:
-                print("异常状态")
-                #self.AI_client_VC_RequestToSpeak()
-                self.websocket_deconnect_VC()
-                self.websocket_connect_VC()#连接服务器
-                self.AI_client_VC_start_requset()
-        if self.AI_client_VC_isconnect == 0:
-            return
-        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")
-        
-        #开始线程
-        
-        # 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="huoshan::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)    
-        json_data =\
-        {
-            "id": "event_id",
-            "event_type": "chat.update",
-            "data": {
-                "chat_config": {
-                    "auto_save_history": True, #保存历史记录。默认 true
-                    #"conversation_id": "1235984as1d54", #conversation_id
-                    "user_id": "86952145024",  #标识当前与智能体的用户,由使用方自行定义、生成与维护。user_id 用于标识对话中的不同用户,不同的 user_id,其对话的上下文消息、数据库等对话记忆数据互相隔离。如果不需要用户数据隔离,可将此参数固定为一个任意字符串
-                    "meta_data": {}, #附加信息,通常用于封装一些业务相关的字段。查看对话消息详情时,系统会透传此附加信息。
-                    "custom_variables": {}, #智能体中定义的变量。在智能体prompt中设置变量{{key}}后,可以通过该参数传入变量值,同时支持Jinja2语法。详细说明可参考变量示例。变量名只支持英文字母和下划线。
-                    "extra_params": {},   #附加参数,通常用于特殊场景下指定一些必要参数供模型判断,例如指定经纬度,并询问智能体此位置的天气。自定义键值对格式,其中键(key)仅支持设置为:latitude:纬度,此时值(Value)为纬度值,例如39.9800718。longitude:经度,此时值(Value)为经度值,例如116.309314。
-                    "parameters": {"custom_var_1": "测试"}
-                },
-                "input_audio": {         #输入音频格式
-                    "format": "pcm",       #输入音频格式,支持 pcm/wav/ogg。默认 wav
-                    "codec": "pcm",         #输入音频编码。 pcm/opus。默认 pcm
-                    "samplate_rate": self.VC_record_samplerate,  #采样率
-                    "channel": 1, #通道数
-                    "bit_depth": 16 #位深
-                },
-                "output_audio": {        #输出音频格式
-                    "codec": "pcm",        #pcm/opus 输出音频格式, 默认 pcm
-                    "pcm_config": {
-                        "sample_rate": self.VC_play_samplerate,   #码率
-                        
-                    },
-                    "speech_rate": 50,  #回复的语速,取值范围 [-50, 100],默认为 0,-50 表示 0.5 倍速,100 表示 2倍速
-                    #"voice_id": "zh_female_shaoergushi_mars_bigtts"
-                },
-                "turn_detection": {
-                               "type":                "server_vad",
-                               "prefix_padding_ms":   600,
-                               "silence_duration_ms": 500,
-                       },
-            }
-        }
-        # if self.VC_play_TYPE == VC_play_TYPE_PCM:
-        #     json_data["payload"]["out_format"]='pcm'
-        # if self.VC_record_TYPE == VC_record_TYPE_AMR :
-        #     json_data["payload"]["in_format"]='amr'
-        #     pass
-        # if self.VC_mode == 1:
-        #     json_data["payload"]["voice_detection"]='disable'
-        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":{
-                "trace_id":self.get_trace_id(),
-                "event":"SendSpeech"
-                },
-            "payload":
-            {
-                "dialog_id":self.VC_dialog_id,
-                "session_id": self.session_id ,
-            }
-        }
-        #self.AI_client_VC_send(ujson.dumps(json_data))
-        self.VC_Speech_Start()#开启线程获取录音数据
-        self.VC_state =  VC_State_SpeechStart
-    def AI_client_VC_input_audio_buffer_append(self,data):
-        json_data = \
-        {
-            "id": "event_id",
-            "event_type": "input_audio_buffer.append",
-            "data": {
-            "delta": ubinascii.b2a_base64(data)
-            }
-        }
-        self.AI_client_VC_send(ujson.dumps(json_data))
-    #结束上传语音
-    def AI_client_VC_end_speech(self):
-        json_data = \
-        {
-            "id": "event_id",
-            "event_type": "input_audio_buffer.complete",
-            "data": {}
-        }
-        self.AI_client_VC_send(ujson.dumps(json_data))
-        EventMesh.publish("publish_AI_btnInfo",{"func":self.VC_Speech_End})
-        EventMesh.publish("publish_AI_btnInfo",{"func":self.send_tone}) 
-
-    #通知服务器开始播放
-    def AI_client_VC_LocalRespondingStarted(self):
-        json_data = \
-        {
-            "header":{
-                "trace_id":self.get_trace_id(),
-                "event":"LocalRespondingStarted"
-                },
-            "payload":{
-                "dialog_id":self.VC_dialog_id,
-                "session_id": self.session_id ,
-                }
-        }
-        self.AI_client_VC_send(ujson.dumps(json_data))
-    #通知服务器播放结束
-    def AI_client_VC_LocalRespondingEnded(self):
-        json_data = \
-        {
-            "header":{
-                "trace_id":self.get_trace_id(),
-                "event":"LocalRespondingEnded"
-                },
-            "payload":{
-                "dialog_id":self.VC_dialog_id,
-                "session_id": self.session_id ,
-                }
-        }
-        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)}) 
-        # json_data = \
-        # {
-        #     "header":{
-        #         "trace_id":self.get_trace_id(),
-        #         "event":"AAAAAAAAAAAAAA1"
-        #         },
-        #     "payload":{
-        #         "dialog_id":self.VC_dialog_id,
-        #         "session_id": self.session_id ,
-        #         }
-        # }
-        # EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_client_VC_send,"data":ujson.dumps(json_data)}) 
-        # utime.sleep_ms(1)
-        # self.AI_client_VC_send(ujson.dumps(json_data))
-        self.VC_state = VC_State_End
-    #客户端打断对话
-    def AI_client_VC_RequestToSpeak(self):
-        json_data = \
-        {
-            "header":{
-                "trace_id":self.get_trace_id(),
-                "event":"RequestToSpeak"
-                },
-            "payload":{
-                "dialog_id":self.VC_dialog_id,
-                "session_id": self.session_id ,
-                }
-        }
-        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)
-    #请求TTS或者chat事件
-    def AI_client_VC_RequestToRespond(self):
-        self.session_id  = self.get_session_id()#调试临时打开
-        json_data = \
-        {
-            "header":{
-                "trace_id":self.get_trace_id(),
-                "event":"RequestToRespond"
-                },
-            "payload":{
-                "dialog_id":self.VC_dialog_id,
-                "session_id": self.session_id ,
-                "type":"transcript",#prompt是跳过asr,transcript是跳过asr和大模型
-                "text":""
-                }
-        }
-
-        print("AI_client_VC_RequestToRespond!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")
-        # 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.VC_state = VC_State_RequestToRespond
-        if self.AI_TTS_str != "":
-            json_data["payload"]["text"] = self.AI_TTS_str
-            json_data["payload"]["type"] = "transcript"
-            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)}) 
-            self.AI_TTS_str = ""
-        elif self.AI_ASR_str != "":
-            json_data["payload"]["text"] = self.AI_ASR_str
-            json_data["payload"]["type"] = "prompt"
-            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)})
-            if dev_type != "7PIN" :
-                EventMesh.publish("publish_AI_btnInfo",{"func":self.send_tone}) 
-            #
-            #self.AI_ASR_str = ""
-        # utime.sleep_ms(1)
-    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_client_VC_Read(self):
-        json_data = \
-        {
-            "header":{
-                "trace_id":self.get_trace_id(),
-                "event":"Read"
-                },
-            "payload":{
-                "dialog_id":self.VC_dialog_id
-                }
-        }
-        print("AI_client_VC_Read!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")
-        
-        #for i in range(6): 
-            #EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_client_VC_send,"data":ujson.dumps(json_data)}) 
-        # utime.sleep_ms(1)
-        if self.AI_client_VC != None and self.AI_client_VC_isconnect == 1:
-            self.AI_client_VC.send(ujson.dumps(json_data))
-      
-    ############################################
-    #关闭音频播放线程
-    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
-        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
-                        print("AI_client_VC_LocalRespondingStarted!!!")
-                        self.AI_client_VC_LocalRespondingStarted()#通知服务器开始播放
-                    #self.AI_client_tts_data_len=len(data)
-                    print("audio_queue:len:{}".format(len(data[0])))
-                    if len(data[0]) > 10:
-                        try:
-                            if self.VC_play_TYPE == VC_play_TYPE_PCM:
-                                # if self.VC_play_samplerate == 8000:
-                                #     tmp= self.aud.playStream(1,data[0] )
-                                # elif self.VC_play_samplerate == 16000:
-                                
-                                
-                                    
-                                    write_buf = bytearray(data[0])
-                                    #print("play_pcm.stream_write1!!")
-                                    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_write:{}".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!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")
-        EventMesh.publish("close_led")
-        self.tts_in_data_len = 0
-        self.tts_out_data_len = 0
-        #必须先销毁线程,不然线程会容易报错
-        try:
-            self.AI_ASR_send_data_queue_thread_close()#销毁ASR发送线程
-        except Exception as e:
-            usys.print_exception(e)
-        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_asr()
-        except Exception as e:
-            usys.print_exception(e)
-        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()
-        print("ai_VC Close3!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\r\n")
-        
-        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
-        #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()
-        if self.AI_ASR_send_data_queue.empty()!=True:
-            self.AI_ASR_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)#恢复原始音量
+from common import Abstract, LogAdapter\r
+import EventMesh\r
+import uwebsocket\r
+import usys\r
+import gc\r
+import urandom\r
+import uhashlib\r
+import ubinascii\r
+import ujson\r
+import osTimer\r
+import _thread\r
+from queue import Queue\r
+import utime\r
+import audio\r
+import uos\r
+from machine import Pin\r
+from machine import ExtInt\r
+from machine import WDT\r
+import modem\r
+import sim\r
+import net\r
+import base64\r
+import ucryptolib\r
+import urandom as random\r
+import request\r
+import ql_fs\r
+from misc import Power,USB,PowerKey\r
+import ntptime\r
+import machine\r
+import dataCall\r
+import constants\r
+import versions\r
+\r
+dev_type = "G10"\r
+#dev_type = "7PIN_BK"#小瑞\r
+#dev_type = "7PIN"#柒牌\r
+#dev_type = 'momo'#食梦貘\r
+#dev_type = 'sjgq'#四季甘泉\r
+class AI_led(Abstract):\r
+    def __init__(self):\r
+        if dev_type == "G10":\r
+            self.led_red = Pin(Pin.GPIO36, Pin.OUT, Pin.PULL_PD, 0)\r
+            self.led_green = Pin(Pin.GPIO44, Pin.OUT, Pin.PULL_PD, 1)\r
+            self.led_blue = Pin(Pin.GPIO21, Pin.OUT, Pin.PULL_PD, 1)\r
+        else:\r
+            self.led_red = Pin(Pin.GPIO36, Pin.OUT, Pin.PULL_PD, 0)\r
+            self.led_green = Pin(Pin.GPIO21, Pin.OUT, Pin.PULL_PD, 1)\r
+            self.led_blue = Pin(Pin.GPIO19, Pin.OUT, Pin.PULL_PD, 1)\r
+\r
+        #=1 红灯闪,=2白灯闪,=3绿灯闪,=4全部灯闪\r
+        self.led_flicker_flag = 0\r
+        self.led_flicker_on_off_flag = 0\r
+        self.led_flicker_timer = osTimer()\r
+        \r
+        EventMesh.subscribe("open_led_red",self.open_led_red)\r
+        EventMesh.subscribe("open_led_blue",self.open_led_blue)\r
+        EventMesh.subscribe("open_led_green",self.open_led_green)\r
+        EventMesh.subscribe("open_led_all",self.open_led_all)\r
+        EventMesh.subscribe("open_led_red_blue",self.open_led_red_blue)\r
+        EventMesh.subscribe("open_led_red_green",self.open_led_red_green)\r
+        EventMesh.subscribe("flicker_led_red",self.flicker_led_red)\r
+        EventMesh.subscribe("flicker_led_blue",self.flicker_led_blue)\r
+        EventMesh.subscribe("flicker_led_green",self.flicker_led_green)\r
+        EventMesh.subscribe("flicker_led_all",self.flicker_led_all)\r
+        EventMesh.subscribe("close_led",self.close_led)\r
+        EventMesh.publish("open_led_red")\r
+\r
+    def flicker_led_red(self,event,msg):\r
+        self.led_flicker_flag = 1\r
+        self.led_flicker_timer.start(1500, 1, self.led_flicker_timer_cb)\r
+\r
+    def flicker_led_blue(self,event,msg):\r
+        self.led_flicker_flag = 2\r
+        self.led_flicker_timer.start(1500, 1, self.led_flicker_timer_cb)\r
+\r
+    def flicker_led_green(self,event,msg):\r
+        self.led_flicker_flag = 3\r
+        self.led_flicker_timer.start(1500, 1, self.led_flicker_timer_cb)\r
+\r
+    def flicker_led_all(self,event,msg):\r
+        self.led_flicker_flag = 4\r
+        self.led_flicker_timer.start(1500, 1, self.led_flicker_timer_cb)\r
+\r
+    def led_flicker_timer_cb(self, *args, **kwargs):\r
+        EventMesh.publish("publish_AI_btnInfo",{"func":self.led_flicker_timer_cb_})  \r
+    def led_flicker_timer_cb_(self):\r
+        if self.led_flicker_flag == 0:\r
+            self.led_flicker_timer.stop()\r
+            return\r
+        if self.led_flicker_on_off_flag == 0:\r
+            self.led_red.write(0)\r
+            self.led_blue.write(0)\r
+            self.led_green.write(0)\r
+            self.led_flicker_on_off_flag = 1\r
+        else:\r
+            self.led_flicker_on_off_flag = 0\r
+            if self.led_flicker_flag == 1:\r
+                self.led_blue.write(0)\r
+                self.led_green.write(0)\r
+                self.led_red.write(1)\r
+            elif self.led_flicker_flag == 2:\r
+                self.led_red.write(0)\r
+                self.led_green.write(0)\r
+                self.led_blue.write(1)\r
+            elif self.led_flicker_flag == 3:\r
+                self.led_red.write(0)\r
+                self.led_blue.write(0)\r
+                self.led_green.write(1)\r
+            elif self.led_flicker_flag == 4:\r
+                self.led_blue.write(1)\r
+                self.led_green.write(1)\r
+                self.led_red.write(1)\r
+\r
+    def open_led_red(self,event,msg):\r
+        #print("open_led_red")\r
+        self.led_flicker_flag = 0\r
+        #self.led_red.write(0)\r
+        self.led_blue.write(0)\r
+        self.led_green.write(0)\r
+        self.led_red.write(1)\r
+\r
+    def open_led_blue(self,event,msg):\r
+        #print("open_led_blue")\r
+        self.led_flicker_flag = 0\r
+        self.led_red.write(0)\r
+        #self.led_blue.write(0)\r
+        self.led_green.write(0)\r
+        self.led_blue.write(1)\r
+\r
+    def open_led_green(self,event,msg):\r
+        #print("open_led_green")\r
+        self.led_flicker_flag = 0\r
+        self.led_red.write(0)\r
+        self.led_blue.write(0)\r
+        #self.led_green.write(0)\r
+        self.led_green.write(1)\r
+\r
+    def open_led_red_blue(self,event,msg):\r
+        #print("open_led_blue")\r
+        self.led_flicker_flag = 0\r
+        self.led_red.write(1)\r
+        #self.led_blue.write(0)\r
+        self.led_green.write(0)\r
+        self.led_blue.write(1)\r
+\r
+    def open_led_red_green(self,event,msg):\r
+        #print("open_led_blue")\r
+        self.led_flicker_flag = 0\r
+        self.led_red.write(1)\r
+        #self.led_blue.write(0)\r
+        self.led_green.write(1)\r
+        self.led_blue.write(0)\r
+\r
+    def open_led_all(self,event,msg):\r
+        #print("open_led_all")\r
+        self.led_flicker_flag = 0\r
+        #self.led_red.write(0)\r
+        self.led_blue.write(1)\r
+        self.led_green.write(1)\r
+        self.led_red.write(1)\r
+\r
+    def close_led(self,event,msg):\r
+        #print("close_led")\r
+        self.led_flicker_flag = 0\r
+        self.led_red.write(0)\r
+        self.led_blue.write(0)\r
+        self.led_green.write(0)\r
+\r
+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']\r
+class AI_dev(Abstract):\r
+    # AI\r
+    def __init__(self):\r
+        self.is_wdt = 0 #是否开启看门狗\r
+\r
+        self.VBATT_tab = {"charge_full":4300,"100" :4250 ,  "90":4179 , "80":4070, "60": 3883, "40":3770, "20":3699,  "10":3652,"5":3600,}\r
+        self.KeyAI_status = 0\r
+        self.KeyAI_timer_count = 0\r
+        self.KeyAI_long_press = 0\r
+        self.KeyAI_press = 0\r
+        if self.is_wdt == 1:\r
+            self.wdt = WDT(30) #开启看门狗\r
+        # self.wdt_timer = osTimer()\r
+        # self.wdt_timer.start(5000, 1, self.wdt_timer_cb)\r
+        count = 0\r
+        while True:\r
+            count += 1\r
+            if count > 20 :\r
+                break\r
+            data = dataCall.getInfo(1, 0)\r
+            print("data call INFO {}".format(data))\r
+            if data[2][0]:\r
+                self.network_state = 1\r
+                break\r
+            print("等待网络 {}...".format(count))\r
+            utime.sleep_ms(500)\r
+        self.KeyAI_timer = osTimer()\r
+        if dev_type == "G10":\r
+            self.extint_AI = ExtInt(ExtInt.GPIO19,ExtInt.IRQ_RISING_FALLING, ExtInt.PULL_PU, self.keyAI_extint_cb)\r
+            self.pwk_key = ExtInt(ExtInt.GPIO26, ExtInt.IRQ_RISING_FALLING, ExtInt.PULL_PU, self.pwk_extint_cb)\r
+        else:\r
+            self.pwk_key = ExtInt(ExtInt.GPIO41, ExtInt.IRQ_RISING_FALLING, ExtInt.PULL_PU, self.pwk_extint_cb)\r
+            #self.extint_AI = ExtInt(ExtInt.GPIO19,ExtInt.IRQ_RISING_FALLING, ExtInt.PULL_PU, self.keyAI_extint_cb)\r
+            self.extint_AI = ExtInt(ExtInt.GPIO22,ExtInt.IRQ_RISING_FALLING, ExtInt.PULL_PU, self.keyAI_extint_cb)\r
+        self.extint_AI.enable()\r
+        self.pwk_key_status = 0\r
+        self.pwk_key_timer_count = 0\r
+        self.pwk_key_long_press = 0\r
+        self.pwk_key_press = 0\r
+        self.pwk_key_timer = osTimer()\r
+        #self.pwk_key = ExtInt(ExtInt.GPIO26, ExtInt.IRQ_RISING_FALLING, ExtInt.PULL_DISABLE, self.pwk_extint_cb)\r
+        \r
+        self.pwk_key.enable() \r
+        print("AI_dev:1")\r
+        self.btnInfo_queue = Queue(100)\r
+        self.btnInfo_queue_count = 0\r
+        _thread.stack_size(16*1024)\r
+        self.btnInfo_queue_thread_id = _thread.start_new_thread(self.btnInfo_queue_thread, ())\r
+        _thread.stack_size(8*1024)\r
+        EventMesh.subscribe("publish_AI_btnInfo",self.publish_AI_btnInfo)\r
+        EventMesh.subscribe("get_battery",self.get_battery)\r
+        EventMesh.subscribe("audio_montage_play",self.audio_montage_play)\r
+        EventMesh.subscribe("paly_iccid_imei",self.paly_iccid_imei)\r
+        EventMesh.subscribe("paly_device_res_error",self.paly_device_res_error)\r
+        print("AI_dev:2")\r
+        self.pk = PowerKey()\r
+        self.pk.powerKeyEventRegister(self.powerKey_callback)\r
+        self.usb = USB()\r
+        self.usb.setCallback(self.usb_event_cb)\r
+        self.usb_status = self.usb.getStatus()\r
+        self.usb_charge_flag = 0 \r
+        self.Low_power_warning_timer = 0\r
+        self.AI_dev_timer = osTimer()\r
+        self.AI_dev_timer.start(10000, 1, self.AI_dev_timer_cb)\r
+        print("AI_dev:AI_dev_timer")\r
+        self.aud = audio.Audio(0)\r
+        self.Low_power_warning_flag = 0\r
+        self.VC_TTS_volume =  EventMesh.publish("get_storage_config","VC_TTS_volume")#音量配置\r
+        if self.VC_TTS_volume == None:\r
+            self.VC_TTS_volume = 100\r
+        self.aud.setVolume(self.VC_TTS_volume //10)\r
+        #self.aud.play(1,0,'U:/static/xianyikaiji.mp3')#开机音频\r
+        #EventMesh.publish("audio_montage_play",["xianyikaiji.mp3"])\r
+        #EventMesh.publish("publish_AI_btnInfo",{"func":self.ntptime_cb})\r
+        self.check_rest_timer_count = 0\r
+        print("AI_dev:end")\r
+    def ntptime_cb(self):\r
+        #ntptime.settime(8)\r
+        print("timer:{}!!!!!!!!\r\n".format(utime.localtime()))\r
+    def usb_event_cb(self, state):\r
+        EventMesh.publish("publish_AI_btnInfo",{"func":self.usb_event,"data":state})\r
+\r
+    def usb_event(self, state):    \r
+        status = state\r
+        self.usb_charge_flag = 0\r
+        if status == 1:#插入USB\r
+            print("charge R_CHARGE_in")\r
+            self.usb_status = 1\r
+            VC_satrt_flag = EventMesh.publish("get_VC_satrt_flag")#获取vc是否在运行\r
+            if VC_satrt_flag == None:\r
+                VC_satrt_flag = 0\r
+            if VC_satrt_flag == 0:\r
+                self.aud.stop()\r
+                #EventMesh.publish("flicker_led_red")#充电闪灯\r
+                #self.aud.play(1,1,'U:/static/R_CHARGE_IN.mp3')\r
+                EventMesh.publish("open_led_red")#充电红灯常亮\r
+                EventMesh.publish("audio_montage_play",["R_CHARGE_IN.mp3"])\r
+            self.Low_power_warning_flag  = 0\r
+            pass\r
+        elif status == 0:#拨出usbs\r
+            self.usb_status = 0\r
+            VC_satrt_flag = EventMesh.publish("get_VC_satrt_flag")#获取vc是否在运行\r
+            if VC_satrt_flag == None:\r
+                VC_satrt_flag = 0\r
+            if VC_satrt_flag == 0:\r
+                self.aud.stop()\r
+                EventMesh.publish("close_led")\r
+                EventMesh.publish("audio_montage_play",["R_CHARGE_OUT.mp3"])\r
+                #self.aud.play(1,1,'U:/static/R_CHARGE_OUT.mp3')\r
+    def btnInfo_queue_thread(self):\r
+        while True:\r
+            data = self.btnInfo_queue.get()\r
+            self.btnInfo_queue_count-=1\r
+            #EventMesh.debug_log("Info_queue:data = {}".format(data))\r
+            if data != None:\r
+                try:\r
+                    if "data" in data :\r
+                        data["func"](data["data"])\r
+                    else :\r
+                        data["func"]()\r
+                except Exception as e:\r
+                    #EventMesh.debug_log("btnInfo_queue:ERROR:{}".format(e))\r
+                    usys.print_exception(e)\r
+    def publish_AI_btnInfo(self,event,msg):\r
+        #print("publish_AI_btnInfo 1")\r
+        self.btnInfo_queue.put(msg)\r
+        self.btnInfo_queue_count+=1\r
+        if self.btnInfo_queue_count > 80:\r
+            self.btnInfo_queue_count =0\r
+            print("事件处理线程队列出问题,重启!!!!!!!!!!!!!!")\r
+            print("线程:{} 队列:{}".format(_thread.threadIsRunning(self.btnInfo_queue_thread_id),self.btnInfo_queue.size()))\r
+            # if _thread.threadIsRunning(self.btnInfo_queue_thread_id):\r
+            #     _thread.stop_thread(self.btnInfo_queue_thread_id)\r
+            # _thread.stack_size(10*1024)\r
+            # self.btnInfo_queue_thread_id = _thread.start_new_thread(self.btnInfo_queue_thread, ())\r
+            # _thread.stack_size(8*1024)\r
+            # self.btnInfo_queue.clear()\r
+            # self.btnInfo_queue = Queue(100)\r
+            EventMesh.publish("VC_error") #播放报错\r
+            utime.sleep_ms(1000)\r
+            self.aud.stopPlayStream()\r
+            self.aud.stopAll()\r
+            Power.powerRestart()\r
+            EventMesh.publish("set_storage_config",["powerRestart",1])\r
+        #print("publish_AI_btnInfo 2")\r
+    def powerKey_callback(self, status):\r
+        print("powerKey_callback:{}".format(status))\r
+\r
+    def pwk_extint_cb(self,args):#pwk\r
+        try:\r
+            self.pwk_key_status = int(args[1])\r
+            if self.pwk_key_status == 0:\r
+                self.pwk_key_status = 1\r
+            else:\r
+                self.pwk_key_status = 0\r
+                pass\r
+            if self.pwk_key_status == 0:#按下\r
+                \r
+                if self.pwk_key_press == 0 :\r
+                    self.pwk_key.disable()\r
+                    self.pwk_key_press = 1\r
+                    self.pwk_key_long_press = 0\r
+                    self.pwk_key_timer.start(100, 1, self.pwk_key_timer_cb)\r
+                    self.pwk_key_timer_count = 0\r
+                    #EventMesh.publish("AI_key_press")\r
+        except Exception as e: \r
+            usys.print_exception(e)\r
+    def pwk_key_timer_cb(self, *args, **kwargs):\r
+    #     EventMesh.publish("publish_AI_btnInfo",{"func":self.pwk_key_timer_cb_})\r
+    # def pwk_key_timer_cb_(self) :\r
+        try:\r
+            self.pwk_key_status = self.pwk_key.read_level()\r
+            self.pwk_key_timer_count +=1\r
+            if self.pwk_key_timer_count >= 10*3: #长按3s \r
+                #print("pwk_key_long_press {}".format(self.pwk_key_long_press))\r
+                if self.pwk_key_long_press == 0:\r
+                        self.pwk_key_long_press = 1\r
+                        #EventMesh.publish("AI_key_long_press")\r
+                        EventMesh.publish("audio_montage_play",["zhengzaiguanji.mp3"])\r
+                        #self.aud.play(1,0,'U:/static/zhengzaiguanji.mp3')#关机音频\r
+                        EventMesh.publish("open_led_red")\r
+                        utime.sleep_ms(2000)\r
+                        self.aud.stopPlayStream()\r
+                        self.aud.stopAll()\r
+                        Power.powerDown()\r
+                        #print("AI_key_release")\r
+                        EventMesh.publish("pwk_key_long_press")\r
+                        #EventMesh.publish("publish_AI_btnInfo",{"func":self.pwk_key_Long_Press})  \r
+            if self.pwk_key_status == 1:#松开\r
+                #print("pwk_key_timer_cb:{}".format(self.pwk_key_timer_count))\r
+                key_count = 5\r
+                if dev_type == "7PIN_BK":\r
+                    key_count = 3\r
+                if self.pwk_key_timer_count >= key_count: #防抖200ms\r
+                    #EventMesh.publish("AI_key_release")\r
+                    EventMesh.publish("publish_AI_btnInfo",{"func":self.pwk_key_release})\r
+                    self.pwk_key.enable()\r
+                    self.pwk_key_timer.stop()\r
+                    self.pwk_key_timer_count = 0\r
+                    self.pwk_key_press = 0\r
+            \r
+        except Exception as e: \r
+            usys.print_exception(e) \r
+            \r
+    def keyAI_extint_cb(self,args):#call 2\r
+        try:\r
+            #print("AI_btn:keyAI_extint_cb{}".format(args[1]))\r
+            self.KeyAI_status = int(args[1])\r
+            if self.KeyAI_status == 0:\r
+                self.KeyAI_status = 1\r
+            else:\r
+                self.KeyAI_status = 0\r
+            \r
+            if self.KeyAI_status == 0:#按下\r
+                if self.KeyAI_press == 0 :\r
+                    EventMesh.publish(constants.EVENT.SYSTEM_UP)#唤醒休眠\r
+                    self.extint_AI.disable()\r
+                    self.KeyAI_press = 1\r
+                    self.KeyAI_long_press = 0\r
+                    self.KeyAI_timer.start(100, 1, self.KeyAI_timer_cb)\r
+                    self.KeyAI_timer_count = 0\r
+                    #EventMesh.publish("AI_key_press")\r
+                    if dev_type == "7PIN" :\r
+                        self.aud.aud_tone_play(10,200)#播放按键音\r
+                    EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_key_press})  \r
+        except Exception as e: \r
+            usys.print_exception(e)\r
+    def KeyAI_timer_cb(self, *args, **kwargs):\r
+    #     EventMesh.publish("publish_AI_btnInfo",{"func":self.KeyAI_timer_cb_})\r
+    # def KeyAI_timer_cb_(self):\r
+        try:\r
+            self.KeyAI_status = self.extint_AI.read_level()\r
+            self.KeyAI_timer_count +=1\r
+            if self.KeyAI_timer_count >= 10*1: #长按3s \r
+                if self.KeyAI_long_press == 0:\r
+                        self.KeyAI_long_press = 1\r
+                        #EventMesh.publish("AI_key_long_press")\r
+                        EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_key_long_press})  \r
+            if self.KeyAI_status == 1:#松开\r
+                #print("KeyAI_timer_cb:{}".format(self.KeyAI_timer_count))\r
+                key_count = 5\r
+                if dev_type == "7PIN_BK":\r
+                    key_count = 3\r
+                if self.KeyAI_timer_count >= key_count: #防抖200ms\r
+                    #EventMesh.publish("AI_key_release")\r
+                    EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_key_release})  \r
+                    self.extint_AI.enable()\r
+                    self.KeyAI_timer.stop()\r
+                    self.KeyAI_timer_count = 0\r
+                    self.KeyAI_press = 0\r
+            \r
+        except Exception as e: \r
+            usys.print_exception(e) \r
+       \r
+    def AI_key_press(self):\r
+        self.check_rest_timer_count = 0\r
+        print("AI_key_press")\r
+        EventMesh.publish("AI_key_press")\r
+\r
+    def AI_key_long_press(self):\r
+        self.check_rest_timer_count = 0\r
+        print("AI_key_long_press")\r
+        EventMesh.publish("AI_key_long_press")\r
+        \r
+    def AI_key_release(self):\r
+        print("AI_key_release")\r
+        EventMesh.publish("AI_key_release")\r
+        \r
+    def pwk_key_Long_Press(self):\r
+        self.check_rest_timer_count = 0\r
+        print("pwk_key_long_press!!!!!!!")\r
+        print("pwk_key_long_press!!!!!!!")\r
+        \r
+        # EventMesh.publish("paly_iccid_imei")\r
+        # return\r
+        EventMesh.publish("audio_montage_play",["zhengzaiguanji.mp3"])\r
+        #self.aud.play(1,0,'U:/static/zhengzaiguanji.mp3')#关机音频\r
+        EventMesh.publish("open_led_red")\r
+        utime.sleep_ms(3000)\r
+        self.aud.stopPlayStream()\r
+        self.aud.stopAll()\r
+        Power.powerDown()\r
+        #print("AI_key_release")\r
+        EventMesh.publish("pwk_key_long_press")\r
+        \r
+    def pwk_key_release(self):\r
+        self.check_rest_timer_count = 0\r
+        #print("pwk_key_release")\r
+        EventMesh.publish("pwk_key_release")\r
+\r
+    \r
+    def wdt_timer_cb(self, *args, **kwargs):\r
+        if self.is_wdt == 1:\r
+            self.wdt.feed()\r
+\r
+    def AI_dev_timer_cb(self, *args, **kwargs):\r
+        #print("AI_dev_timer_cb")\r
+        EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_dev_timer_event})  \r
+    def AI_dev_timer_event(self):\r
+        if self.is_wdt == 1:\r
+            self.wdt.feed()\r
+        VC_satrt_flag = EventMesh.publish("get_VC_satrt_flag")#获取vc是否在运行\r
+        if VC_satrt_flag == None:\r
+            VC_satrt_flag = 0\r
+        Vbatt = Power.getVbatt()\r
+        if self.usb_status == 1 and VC_satrt_flag == 0:\r
+            EventMesh.publish("open_led_red")#充电红灯常亮\r
+        if  self.usb_status == 1 and Vbatt>=self.VBATT_tab["charge_full"]and VC_satrt_flag == 0:#充电充满\r
+            EventMesh.publish("open_led_green")\r
+            if self.usb_charge_flag == 0 :\r
+                EventMesh.publish("audio_montage_play",["R_CHARGE_FULL.mp3"])\r
+                #self.aud.play(1,0,'U:/static/R_CHARGE_FULL.mp3')#充电已满\r
+                self.usb_charge_flag = 1\r
+        if  self.usb_status == 0 and Vbatt<self.VBATT_tab["20"]and VC_satrt_flag == 0 and self.Low_power_warning_flag ==0:#低电报警\r
+            self.Low_power_warning_flag  = 1\r
+            EventMesh.publish("flicker_led_red")\r
+            #self.aud.play(1,0,'Low_power_warning.mp3')\r
+            # self.Low_power_warning_timer+=1\r
+            # if self.Low_power_warning_timer >= 2:\r
+            #     self.Low_power_warning_timer = 0\r
+            EventMesh.publish("audio_montage_play",["Low_power_warning.mp3"])\r
+\r
+        if  self.usb_status == 0 and Vbatt<self.VBATT_tab["5"]:    \r
+            EventMesh.publish("audio_montage_play",["didianguanji.mp3"])\r
+            utime.sleep_ms(4500)\r
+            self.aud.stopPlayStream()\r
+            self.aud.stopAll()\r
+            Power.powerDown()\r
+\r
+        self.check_rest_timer_count += 1\r
+        if self.check_rest_timer_count >= 8640:#24小时没按键,则关机\r
+            self.pwk_key_Long_Press()\r
+        \r
+    def get_battery(self, event=None, msg=None):\r
+        Vbatt = Power.getVbatt()\r
+        if Vbatt>self.VBATT_tab["90"]:\r
+            return 100\r
+        if Vbatt>self.VBATT_tab["80"]:\r
+            return 90\r
+        if Vbatt>self.VBATT_tab["60"]:\r
+            return 80\r
+        if Vbatt>self.VBATT_tab["40"]:\r
+            return 60\r
+        if Vbatt>self.VBATT_tab["20"]:\r
+            return 40\r
+        if Vbatt>self.VBATT_tab["10"]:\r
+            return 20\r
+        if Vbatt<=self.VBATT_tab["10"]:\r
+            return 10\r
+    def audio_montage_play(self,event,msg):\r
+        self.aud.stopPlayStream()\r
+        self.aud.stopAll()\r
+        str_data='mp3files='\r
+        for i in msg:\r
+            try:\r
+                str_tmp = i.replace(".mp3","")\r
+                str_data+="{}.mp3+".format(audio_buf.index(str_tmp))\r
+            except Exception as e:\r
+                    usys.print_exception(e)    \r
+        str_data = str_data[:-1]\r
+        print("audio_montage_play:{}".format(str_data))\r
+        self.aud.montage_play('U:/static/audio.bin',1,1,str_data)\r
+        \r
+    def paly_iccid_imei(self,event,msg):\r
+        str_data = 'mp3files={}.mp3+'.format(audio_buf.index("liuliangtishi"))#流量提示\r
+        imei  = modem.getDevImei()\r
+        iccid = sim.getIccid()\r
+        print("paly_iccid_imei:ICCID:{}".format(iccid))\r
+        if iccid != -1 and len(iccid) > 5:\r
+            iccid = iccid.upper()\r
+            if len(iccid) <20:\r
+                for i in range(20-len(iccid)):\r
+                    iccid = "0"+iccid\r
+            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]))\\r
+                ,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])),\\r
+                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])),\\r
+                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])),\\r
+                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])),\\r
+                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])))\r
+        str_data += '{}.mp3+'.format(audio_buf.index("shouhou"))#可联系售后解决,联系方式见售后客服电话是400-886-8777或到微信公众号柒牌SEVENBRAND自行充值:\r
+        self.aud.montage_play('U:/static/audio.bin',1,1,str_data)\r
+    #鉴权出错,播放imei号\r
+    def paly_device_res_error(self,event,msg):\r
+        str_data = 'mp3files={}.mp3+'.format(audio_buf.index("jianquancuowu"))#AI功能异常,请联系客户查询,设备号为:\r
+        imei  = modem.getDevImei()\r
+        imei = imei.upper()\r
+        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]))\\r
+                ,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])),\\r
+                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])),\\r
+                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])),\\r
+                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])))\r
+        #print("str_data:{}".format(str_data))\r
+        self.aud.montage_play('U:/static/audio.bin',1,1,str_data)\r
+\r
+#存储信息\r
+class getStorageDataManager(Abstract):#获取内存数据\r
+        def __init__(self):\r
+            self.config_data = {}\r
+            check = ql_fs.path_exists("/usr/static/storage_file/config.json")\r
+            if check == True:\r
+                with open("/usr/static/storage_file/config.json","r") as fd:\r
+                    self.config_data = ujson.load(fd)\r
+            else :\r
+                self.config_data = {'old_time': 0, 'flip_sw': 0}\r
+                pass\r
+\r
+        def post_processor_after_instantiation(self):\r
+            EventMesh.subscribe("set_storage_data", self.set_storage_data)\r
+            EventMesh.subscribe("set_storage_config", self.set_storage_config)\r
+            EventMesh.subscribe("get_storage_data", self.get_storage_data)\r
+            EventMesh.subscribe("get_storage_config", self.get_storage_config)\r
+\r
+        def set_storage_data(self, event, msg): \r
+            # EventMesh.debug_log("set_storage_data:{}".format(msg))\r
+            if msg != None:\r
+                self.config_data = msg\r
+                with open("/usr/static/storage_file/config.json",'w+',encoding="utf-8") as fd:\r
+                    ujson.dump(self.config_data,fd)\r
+        \r
+\r
+        def set_storage_config(self,event,msg): \r
+            # EventMesh.debug_log("set_storage_key_data1:{}".format(msg))\r
+            if len(msg) >= 2:\r
+                self.config_data[msg[0]]=msg[1]\r
+                # EventMesh.debug_log("set_storage_key_data2:{}".format(self.config_data[msg[0]]))\r
+                EventMesh.publish("publish_message_event_ui",{"func":self.set_storage_save,"data":0})\r
+        def set_storage_save(self, data): \r
+            with open("/usr/static/storage_file/config.json",'w+',encoding="utf-8") as fd:\r
+                ujson.dump(self.config_data,fd)\r
+        def get_storage_data(self, event, msg): \r
+            # EventMesh.debug_log("get_storage_data:{}".format(self.config_data))\r
+            return self.config_data \r
+        def get_storage_config(self,event,msg):\r
+            # EventMesh.debug_log("get_storage_key_data1:{}".format(msg))\r
+            b = msg in self.config_data.keys()\r
+            if b == True:\r
+                # EventMesh.debug_log("get_storage_key_data2:{}".format(self.config_data[msg]))\r
+                return self.config_data[msg]\r
+            else :\r
+                return None\r
+            # try:\r
+            #     return self.config_data[msg]\r
+            # except:\r
+            #     EventMesh.debug_log("get_storage_key_data:none key:{}",msg)\r
+            #     return None\r
+#设备资源授权平台\r
+class device_res_author(Abstract):\r
+   \r
+    def __init__(self) :\r
+        print("device_res_author __init__ start !!!!!!!!!!!!!!!!!")\r
+        self.deviceId = modem.getDevImei()#"876226002022574"\r
+        self.SHA1_BLOCK_SIZE = 64\r
+        self.PAD_BLOCK_SIZE = 16\r
+        self.SHA256 = uhashlib.sha256\r
+        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)\r
+        # 除去补16字节的多余字符\r
+        self.unpad = lambda s: s[:-s[-1]]\r
+        #K01\r
+        # self.key = b"MWrMZjdtcPhj41jWuoqFAhTmqyFluqj1" \r
+        # self.pid = "qAtdDOGXgXYjT2HGFr3a"\r
+        #G15\r
+        # self.key = b"3LWfBicxfRZ3ZAqmZCFuvMdGUXdAFWkb" \r
+        # self.pid = "qLx4Pu4mSUQxyfVKGLXG"\r
+        #7pin\r
+        self.key = b"uKLrChwrxA1LklgBc3VwawYjUkbT3BgX" \r
+        self.pid = "cqxJZi5CNgzjS3mX21Zw"\r
+        \r
+        self.dev_res_timer = osTimer()\r
+        self.dev_res_timer.start(20000, 1, self.dev_timer_cb)\r
+        self.dev_res_timerCount = 0\r
+        self.ud_token_timer = osTimer()\r
+        self.ud_token_timer.start(10000, 1, self.ud_token_timer_cb)\r
+        self.ud_token_timer_Count = 0\r
+        self.dev_token = None\r
+        self.res_error_count = 0\r
+        self.ntptime_flag = 0\r
+        EventMesh.subscribe("get_dev_token", self.get_dev_token)\r
+        EventMesh.subscribe("update_dev_token", self.update_dev_token)\r
+        EventMesh.subscribe("dev_active", self.dev_active)\r
+        EventMesh.subscribe("dev_sign_in", self.dev_sign_in)\r
+        EventMesh.subscribe("dev_NTP", self.dev_NTP)\r
+        #EventMesh.publish_async("dev_NTP",thread_size = 8192)\r
+\r
+        # count = 0\r
+        # while True:\r
+        #     if self.ntptime_flag == 1:\r
+        #         break\r
+        #     utime.sleep_ms(1)\r
+        #     count+=1\r
+        #     if count>600:\r
+        #         break\r
+        # EventMesh.publish_async("dev_active",thread_size = 8192)\r
+        # EventMesh.publish_async("dev_sign_in",thread_size = 8192)\r
+\r
+        self.dev_NTP()#获取时间\r
+        self.dev_active() #设备激活\r
+        self.dev_sign_in() #设备登入\r
+        print("device_res_author __init__ end !!!!!!!!!!!!!!!!!")\r
+\r
+    def get_dev_token(self, event, msg): \r
+        return self.dev_token\r
+    #网络校时\r
+    def dev_NTP(self, event=None, msg=None):\r
+        response = None\r
+        try:\r
+            print("dev_NTP1")\r
+            url = "http://dmp.raisound.com/bz-api/dev/time"\r
+            response = request.get(url,timeout=5)\r
+            data = response.json()\r
+            print("dev_NTP:{}".format(data))\r
+            if data:\r
+                try:\r
+                    timeSecond = data["data"]["timestamp"]//1000\r
+                    \r
+                    next_alarm_time = utime.localtime(timeSecond)\r
+                    print("timeSecond {} next_alarm_time {}".format(timeSecond,next_alarm_time))\r
+                    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))\r
+                    self.ntptime_flag  = 1\r
+                except Exception as e:\r
+                        usys.print_exception(e)\r
+        except Exception as e:\r
+            usys.print_exception(e)\r
+        if response != None:\r
+            response.close() \r
+        print("dev_NTP end")\r
+    def dev_timer_cb(self, *args): #设备资源管理鉴权平台定时器\r
+        EventMesh.publish("publish_AI_btnInfo",{"func":self.dev_timer_cb_}) \r
+\r
+    def dev_timer_cb_(self):    \r
+        #if EventMesh.DEV_RES_MANAGE_AUTHEN_PLATFORM == 1:\r
+        try:\r
+            if self.dev_token == None:\r
+                if self.ntptime_flag == 0:\r
+                    self.ntptime_flag  = 1\r
+                    EventMesh.publish_async("dev_NTP",thread_size = 8192)\r
+                    #EventMesh.publish("publish_AI_btnInfo",{"func":self.dev_NTP})\r
+                print("timer:{}!!!!!!!!\r\n".format(utime.localtime()))\r
+                EventMesh.publish_async("dev_active",thread_size = 8192)\r
+                EventMesh.publish_async("dev_sign_in",thread_size = 8192)\r
+                # self.dev_active() #设备激活\r
+                # self.dev_sign_in() #设备登入\r
+                self.dev_res_timerCount+=1\r
+                if self.dev_res_timerCount > 3: #开机一分钟内没有获取到密码和token 等下一次更新令牌在走登入 激活流程\r
+                    self.dev_res_timerCount=0\r
+                    self.dev_res_timer.stop()\r
+        except Exception as e:\r
+            usys.print_exception(e)\r
+    def ud_token_timer_cb(self, *args): \r
+        EventMesh.publish("publish_AI_btnInfo",{"func":self.ud_token_timer_cb_}) \r
+\r
+    def ud_token_timer_cb_(self):   \r
+        try:\r
+            #print("ud_token_timer_!!!!")\r
+            self.ud_token_timer_Count+=1\r
+            if self.ud_token_timer_Count >= 720: #定时10*3000s时更新token\r
+                self.ud_token_timer_Count = 0\r
+                EventMesh.publish_async("dev_sign_in",thread_size = 8192)\r
+        except Exception as e:\r
+            usys.print_exception(e)    \r
+    def get_sim_Status(self):\r
+        return sim.getStatus() \r
+    def HMAC(self,k, m):\r
+    \r
+        KEY_BLOCK = k + (b'\0' * (self.SHA1_BLOCK_SIZE - len(k)))\r
+        KEY_INNER = bytes((x ^ 0x36) for x in KEY_BLOCK)\r
+        KEY_OUTER = bytes((x ^ 0x5C) for x in KEY_BLOCK)\r
+        inner_message = KEY_INNER + m\r
+        outer_message = KEY_OUTER + self.SHA256(inner_message).digest()\r
+        return self.SHA256(outer_message)\r
+    def get_hmac_sha256(self,k, m):\r
+        data = self.HMAC(k, m).digest()\r
+        # print("HMAC(k, m).digest():", data)\r
+        # print("HMAC(k, m).digest():", ubinascii.hexlify(data))\r
+        hex_data = ubinascii.hexlify(data)\r
+        hex_data = hex_data.decode('ascii')\r
+        return hex_data\r
+    # 加密函数\r
+    def aes_CBC_Encrypt(self,data, key, iv):  # CBC模式的加密函数,data为明文,key为16字节密钥,iv为16字节的偏移量\r
+        key = key.encode('utf-8')\r
+        iv = iv.encode('utf-8')  # CBC 模式下的偏移量\r
+        data = self.pad(data)  # 补位\r
+        data = data.encode('utf-8')\r
+        aes = ucryptolib.aes(key,ucryptolib.MODE_CBC,iv)\r
+        result = base64.b64encode(aes.encrypt(data))\r
+        return str(result, 'utf-8')  # 以字符串的形式返回\r
+\r
+    # 解密函数\r
+    def aes_CBC_Decrypt(self,data, key, iv):  # CBC模式的解密函数,data为密文,key为16字节密钥\r
+        key = key.encode('utf-8')\r
+        iv = iv.encode('utf-8')\r
+        \r
+        aes = ucryptolib.aes(key,ucryptolib.MODE_CBC,iv) #CBC模式\r
+\r
+        # decrypt AES解密  B64decode为base64 转码\r
+        result = aes.decrypt(base64.b64decode(data))\r
+        result = self.unpad(result)  # 除去补16字节的多余字符\r
+        return str(result, 'utf-8')  # 以字符串的形式返回\r
+    #激活接口 没有密码走激活\r
+    def dev_active(self, event=None, msg=None):\r
+        signal = net.csqQueryPoll()\r
+        if signal == -1 or self.get_sim_Status() != 1:#网络不正常\r
+            print("dev_active 无 SIM卡!!!!!!!!\r\n")\r
+            return\r
+        print("dev_active 1\r\n")\r
+        # 签名内容: = deviceId+pid+timeStamp\r
+        dev_pass = ""\r
+        dev_pass = EventMesh.publish("get_storage_config","dev_pass")\r
+        print("dev_pass:{}\r\n".format(dev_pass))\r
+        if dev_pass == None:\r
+            dev_pass = ""\r
+        if dev_pass == "" or dev_pass == None:\r
+            try:\r
+                date_tmp = utime.localtime() #获取当前时间\r
+                print("date_tmp:{}\r\n".format(date_tmp)) #转换时间戳s\r
+                timeStamp = (utime.mktime(date_tmp))*1000#获取时间戳ms\r
+                deviceId = self.deviceId #"876226002022574" #以imei号\r
+                pid = self.pid\r
+                key = self.key\r
+                sign_data = "{}{}{}".format(deviceId,pid,timeStamp)  #签名内容\r
+                print("sign_data:{}\r\n".format(sign_data))\r
+                sha256_hex = self.get_hmac_sha256(key,sign_data)\r
+                print("sha256_hex:{}\r\n".format(sha256_hex))\r
+\r
+                data = {\r
+                    "deviceId":"{}".format(deviceId), #设备名\r
+                    "pid":pid, #产品PID\r
+                    "sign":"{}".format(sha256_hex), #HMACSHA256签名后的数据\r
+                    "timeStamp":timeStamp, #要以ms的形式\r
+                    "signMethod":"HMACSHA256" #签名方式 HMACSHA256\r
+                }\r
+                print(ujson.dumps(data))\r
+                headers_T ={"Content-Type":"application/json"}\r
+                url = "http://dmp.raisound.com/bz-api/dev/auth/active"\r
+                data =ujson.dumps(data)\r
+                response = None\r
+                response_result = 0\r
+                try:\r
+                    response = request.put(url,data=data,headers = headers_T,timeout=5)\r
+                    response_result = 1\r
+                except Exception as e:\r
+                    usys.print_exception(e)   \r
+                    print("put error!!!!!\r\n")\r
+                    response_result = 0\r
+                \r
+                IV = "" #偏移量\r
+                PASSWORD= "" #服务器返回后的加密内容 密码\r
+                if response_result == 1: #访问成功ip\r
+                    if response.status_code == 200:\r
+                        print("headers:{}".format(response.headers))\r
+                        content = response.content\r
+                        c = next(content)\r
+                        # "api.xcloudtech.com"\r
+                        # d_server_port = 9000\r
+                        data =  ujson.loads(c)\r
+                        # data = response.json()\r
+                        print("data-{}".format(data))\r
+                        if data != None:\r
+                            if "success" in data:\r
+                                if data['success'] == True:\r
+                                    if "data" in data:\r
+                                        data_tmp = data["data"]\r
+                                        if "nonce" in data_tmp: #偏移量\r
+                                            IV = data_tmp["nonce"]\r
+                                        if "password" in data_tmp:\r
+                                            PASSWORD = data_tmp["password"]\r
+                                            # EventMesh.publish("set_storage_config",["dev_pass",PASS])\r
+                                if data["code"] == 20001:#鉴权成功\r
+                                    pass\r
+                                elif data["code"] > 50000:#时间错误\r
+                                    self.res_error_count+=1\r
+                                    if self.res_error_count>=3:\r
+                                        self.res_error_count = 0\r
+                                        #EventMesh.publish("paly_device_res_error")\r
+                                    if data["code"] == 50003:#时间错误\r
+                                        self.ntptime_flag  = 0\r
+                        if PASSWORD != None and IV != None:\r
+                            if len(PASSWORD) != 0 and len(IV) != 0:\r
+                                password = PASSWORD\r
+                                iv = IV\r
+                                #解密 之后保存本地下一次登入做使用\r
+                                decrypt_data = self.aes_CBC_Decrypt(password, self.key, iv) #对服务器下发的密码进行解密\r
+                                print("decrypt_data {}".format(decrypt_data))\r
+                                EventMesh.publish("set_storage_config",["dev_pass",decrypt_data])    \r
+                    print("IV:{}\r\n PASS:{}".format(IV,PASSWORD))\r
+                if response != None:\r
+                    response.close()  \r
+            except Exception as e:\r
+                usys.print_exception(e)   \r
+            print("dev_active end\r\n")\r
+            return [response_result,PASSWORD,IV]\r
+    #随机生成16个字节的字符串作为加密的IV 偏移量\r
+    def generate_random_string(self,length=16): \r
+        random_str = ""\r
+        chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'\r
+        for i in range(length):\r
+            random_str+=chars[random.randint(0,length)]\r
+        return random_str\r
+\r
+    #设备登入 没有Token 走登入获取token\r
+    def dev_sign_in(self, event=None, msg=None):\r
+        signal = net.csqQueryPoll()\r
+        if signal == -1 or self.get_sim_Status() != 1:#网络不正常\r
+            print("dev_sign_in 无 SIM卡!!!!!!!!\r\n")\r
+            return\r
+        print("dev_sign_in 1")\r
+        token = ""\r
+        try:\r
+            token = self.dev_token\r
+            dev_pass = EventMesh.publish("get_storage_config","dev_pass") \r
+            #print("token:{}\r\n".format(token))\r
+            if token == None:\r
+                token = ""\r
+            if dev_pass == None:\r
+                dev_pass = ""\r
+            if len(dev_pass) == 0:#没有密码\r
+                return\r
+            #if token == None or token == "":\r
+            if 1: #返回结果成功\r
+                #获取本地保存的密码\r
+                decrypt_data=EventMesh.publish("get_storage_config","dev_pass")\r
+                # decrypt_data = self.aes_CBC_Decrypt(password, self.key, iv) #对服务器下发的密码进行解密\r
+                print("decrypt_data {}".format(decrypt_data))\r
+                #随机生成16个字符串 设备生成做加密使用\r
+                random_string = self.generate_random_string(16) #随机的16个字符串\r
+                enc_iv = random_string #加密的IV偏移量\r
+                #设备端进行密码加密\r
+                encrypt_data = self.aes_CBC_Encrypt(decrypt_data, self.key, enc_iv)\r
+                print("encrypt_data {}".format(encrypt_data))\r
+\r
+                #登入数据\r
+                deviceId = self.deviceId\r
+                sign_in_data = {\r
+                    "deviceId":"{}".format(deviceId), #设备ID\r
+                    "password":"{}".format(encrypt_data), #加密的数据\r
+                    "nonce":"{}".format(random_string) #随机的16个字符串\r
+                }\r
+                print(ujson.dumps(sign_in_data))\r
+                sign_url = "http://dmp.raisound.com/bz-api/dev/auth/sign_in" #登入地址\r
+                headers_T ={"Content-Type":"application/json"}\r
+                response_result = 0\r
+                response = 0\r
+                try:\r
+                    response = request.post(sign_url,data=ujson.dumps(sign_in_data),headers = headers_T,timeout=5)\r
+                    response_result = 1\r
+                except Exception as e:\r
+                    usys.print_exception(e)   \r
+                    print("post error!!!!!\r\n")\r
+                    response_result = 0\r
+                # {'msg': '', 'code': 20001, 'success': True, \r
+                # 'data': {'deviceId': '876226002022574', \r
+                # 'token': '95436a9e09fd0ff89feb8825257dca982f'}\r
+                # }\r
+                \r
+                #self.dev_token = ""\r
+                if response_result == 1:\r
+                    if response.status_code == 200:\r
+                        content = response.content\r
+                        c = next(content)\r
+                        data =  ujson.loads(c)\r
+                        print("data-{}".format(data))\r
+                        if data != None:\r
+                            if "success" in data:\r
+                                if data['success'] == True: #登入成功\r
+                                    if "data" in data:\r
+                                        data_tmp = data["data"]\r
+                                        if "token" in data_tmp: #token\r
+                                            self.dev_token = data_tmp["token"]\r
+                                if data["code"] == 50003:#时间错误\r
+                                    self.ntptime_flag  = 0\r
+                print("token:{}\r\n".format(self.dev_token))\r
+                if response != None:\r
+                    response.close()\r
+                pass\r
+        except Exception as e:\r
+                    print("post error!!!!!\r\n")\r
+                    response_result = 0\r
+        print("dev_sign_in end")\r
+    #获取新的令牌 更新token\r
+    def update_dev_token(self, event=None, msg=None):\r
+        print("update_dev_token")\r
+        try:\r
+            dev_pass = ""\r
+            dev_pass = EventMesh.publish("get_storage_config","dev_pass")\r
+            \r
+            if dev_pass == None:\r
+                dev_pass = ""\r
+            if len(dev_pass) == 0: #没有密码走激活\r
+                print("no dev_pass:{}\r\n".format(dev_pass))\r
+                EventMesh.publish("dev_active")\r
+            token = self.dev_token\r
+            if token == None:\r
+                token = ""\r
+            if len(token) == 0: #没有token走登入\r
+                print("no dev_token:{}\r\n".format(token))\r
+                #self.dev_sign_in()\r
+                EventMesh.publish("dev_sign_in")\r
+            dev_tokenip = "http://dmp.raisound.com/bz-api/dev/auth/token" #设备新令牌更新地址\r
+\r
+            token = self.dev_token\r
+            if token == None:\r
+                token = ""\r
+            if len(token) != 0:\r
+                response_result=0\r
+                response = None\r
+                headers_T = {"bz-dt":"{}".format(token)}\r
+                try:\r
+                    response = request.get(dev_tokenip,headers = headers_T,timeout=5)\r
+                    response_result = 1\r
+                except Exception as e:\r
+                    print("get error!!!!!\r\n")\r
+                    response_result = 0\r
+                if response_result == 1:\r
+                    if response.status_code == 200:\r
+                        try:\r
+                            headers_data = response.headers\r
+                            # print("headers_data!!!!! headers_data:{}\r\n".format(headers_data))\r
+                            if "bz-dt" in headers_data: #bz-dt字段是否在头部数据里面 如果有就需要更新\r
+                                bz_dt = headers_data["bz-dt"] \r
+                                self.dev_token = bz_dt.replace(" ", "") #去掉所有的空格符\r
+                                print("update_dev_token:{}".format(self.dev_token))\r
+                        except Exception as e:\r
+                            print("headers_data!!!!! error\r\n")\r
+                if response != None:\r
+                    response.close()\r
+        except Exception as e:\r
+            usys.print_exception(e)   \r
+        print("update_dev_token end")\r
+        \r
+#OTA升级\r
+class OTA():\r
+    def __init__(self):\r
+        #EventMesh.subscribe("min_sys_ota",self.min_sys_ota)\r
+        self.downloadFileVoURL1= ""\r
+        self.downloadFileVoURL2= ""\r
+    #小系统升级,返回0,没有升级;返回,1有升级,正在执行升级;返回2,电压不够\r
+    def min_sys_ota(self,event=None,msg=None):\r
+        print("min_sys_ota")\r
+        signal = net.csqQueryPoll()\r
+        if signal == -1 or sim.getStatus()  != 1:#网络不正常\r
+            print("min_sys_ota 无 SIM卡!!!!!!!!\r\n")\r
+            return 0\r
+        # return 0\r
+        response = None\r
+        ret_str =0\r
+        self.downloadFileVoURL1= ""\r
+        self.downloadFileVoURL2= ""\r
+        try:\r
+            sourceVersion = versions.Build_Time\r
+            sourceVersion = "7PIN-"+sourceVersion[:10]+"-"+sourceVersion[11:-3]\r
+            print("sourceVersion:{}".format(sourceVersion))\r
+            sourceVersion = sourceVersion.replace(" ", "0")\r
+            print("sourceVersion2:{}".format(sourceVersion))\r
+            #url = "http://iot.api.thisiot.com/ota/task?deviceId=860132060348836&sourceVersion=2024-12-20-15:35-1"\r
+            url = "http://dmp.raisound.com/bz-api/ota/task?deviceId={}&sourceVersion={}".format(modem.getDevImei(),sourceVersion)\r
+            print(url)\r
+            response = request.get(url,timeout=5)\r
+            if response.status_code == 200:\r
+                data = response.json()\r
+                print("min_sys_ota1:{}".format(data))\r
+                \r
+                if data:\r
+                    try:\r
+                        if data["code"] == 20007:#有新版本\r
+                            if "fileList"in data["data"]:\r
+                                if len(data["data"]["fileList"]) == 2:\r
+                                    for fileList in data["data"]["fileList"]:\r
+                                        if fileList["fileName"] == "dfota_2.bin":\r
+                                            self.downloadFileVoURL2 = fileList["url"]\r
+                                        elif fileList["fileName"] == "dfota_1.bin":\r
+                                            self.downloadFileVoURL1 = fileList["url"]\r
+                            \r
+                        if data["code"] == 20006:#已是最新版本\r
+                            ret_str = 0\r
+                                    \r
+                    except Exception as e:\r
+                            usys.print_exception(e)\r
+            else:\r
+                print("min_sys_ota get error")\r
+            response.close()\r
+        except Exception as e:\r
+            usys.print_exception(e)\r
+            if response != None:\r
+                response.close()\r
+        \r
+        print("min_sys_ota:downloadFileVoURL1:{},\ndownloadFileVoURL2:{}".format(self.downloadFileVoURL1,self.downloadFileVoURL2))\r
+        print("min_sys_ota end") \r
+        if self.downloadFileVoURL2!="" and self.downloadFileVoURL1!="":\r
+            battery = EventMesh.publish("get_battery")\r
+            if battery>=40:\r
+                self.ota_timer = osTimer()\r
+                self.ota_timer.start(15000, 0, self.ota_timer_cb)\r
+                ret_str =  1  \r
+            else:\r
+                ret_str =  2\r
+        return ret_str\r
+    \r
+    def ota_timer_cb(self, *args, **kwargs):\r
+        import fota\r
+        fota_obj = fota() \r
+        fota_obj.httpDownload(url1=self.downloadFileVoURL1,url2=self.downloadFileVoURL2)\r
+    #ota升级结果返回,开机时调用一次即可\r
+    def ota_result(self,event=None,msg=None):\r
+        response = None\r
+        try:\r
+            currentVersion = versions.Build_Time\r
+            currentVersion = "7PIN-"+currentVersion[:10]+"-"+currentVersion[11:-3]\r
+            print("currentVersion1:{}".format(currentVersion))\r
+            currentVersion = currentVersion.replace(" ", "0")\r
+            print("currentVersion2:{}".format(currentVersion))\r
+            url = "http://dmp.raisound.com/bz-api/ota/result?deviceId={}&currentVersion={}".format(modem.getDevImei(),currentVersion)\r
+            print(url)\r
+            response = request.post(url,timeout=5)\r
+            if response.status_code == 200:\r
+                data = response.json()\r
+                print("ota_result:{}".format(data))\r
+            else:\r
+                print("ota_result  error!!!!")\r
+                for i in response.text:\r
+                    print(i)\r
+            response.close()\r
+        except Exception as e:\r
+            usys.print_exception(e)\r
+            if response != None:\r
+                response.close()\r
+    #ICCID上传\r
+    def pots_ICCID(self,event=None,msg=None):\r
+        response = None\r
+        try:\r
+            iccid = sim.getIccid()\r
+            if iccid != -1 and len(iccid) > 5:\r
+                print("pots_ICCID:{}".format(iccid))\r
+                #Headers = {'Transfer-Encodong':'chunked'}\r
+                #http://dmp.raisound.com/bz-api/dev/iccid?deviceId=866610001099679&iccid=89860002192307889057\r
+                url = "http://dmp.raisound.com/bz-api/dev/iccid?deviceId={}&iccid={}".format(modem.getDevImei(),iccid)\r
+                print(url)\r
+                response = request.post(url,timeout=5)\r
+                if response.status_code == 200:\r
+                    data = response.json()\r
+                    print("pots_ICCID:{}".format(data))\r
+                else:\r
+                    print("pots_ICCID  error!!!!")\r
+                    for i in response.text:\r
+                        print(i)\r
+                response.close()\r
+        except Exception as e:\r
+            usys.print_exception(e)\r
+            if response != None:\r
+                response.close()\r
+#阿里VC状态枚举\r
+VC_State_None=0\r
+VC_State_Listening=1#听\r
+VC_State_SpeechStart=2#说开始\r
+VC_State_SpeechIng=3#正在说\r
+VC_State_SpeechEnd=4#说结束\r
+VC_State_RequestToRespond=5 #TTS请求或者chat请求\r
+VC_State_Thinking=6#想(chat)\r
+VC_State_Responding=7#音频播放\r
+VC_State_TTSStart=8\r
+VC_State_TTSData=9\r
+VC_State_TTSFinish=10\r
+VC_State_TTSEnd=11\r
+VC_State_TTSError=12\r
+VC_State_DialogError=13\r
+VC_State_End=14\r
+\r
+VC_record_TYPE_PCM = 0\r
+VC_record_TYPE_AMR = 1\r
+VC_play_TYPE_PCM = 0\r
+VC_play_TYPE_MP3 = 1\r
+\r
+#websocket发送数据编号\r
+# AI_client_asr_num = 0\r
+# AI_client_chat_num = 1\r
+# AI_client_tts_num = 2\r
+AI_client_VC_num = 3\r
+AI_client_asr_num = 4\r
+\r
+\r
+class AI_VC(Abstract):\r
+    # AI\r
+    \r
+    def __init__(self):\r
+        try:\r
+            self.http_get_config()#获取/更新配置参数\r
+        except Exception as e:\r
+            usys.print_exception(e)\r
+        self.VC_30S_timer = osTimer()\r
+        self.VC_30S_timer.start(30000, 1, self.VC_30S_timer_cb)\r
+        self.get_config_timer_count = 0\r
+        self.record_data_save_flag = 0 #是否保存录音文件\r
+        self.play_data_save_flag = 0 #是否保存tts数据到文件\r
+        self.record_fd = None\r
+        self.play_fd = None\r
+        self.is_VC_ACK = 0 #是否开启ack应答模式\r
+        self.is_long_record = 0 #是否开启长录音模式(语音打断模式)\r
+        self.ai_OTA = OTA()\r
+        self.is_auth = 0 #是否开启dmp鉴权\r
+        #self.VC_mode = 0 #0:短按连续问答模式 1:长按录音模式\r
+        self.VC_mode = EventMesh.publish("get_storage_config","VC_mode")#\r
+        if self.VC_mode == None :\r
+            self.VC_mode = 0\r
+        self.is_up_error= 0 #是否上传错误id\r
+        self.error_data = []\r
+        self.asr_taskid  = ""\r
+        self.VC_taskid  = ""\r
+        self.VC_server = 2 #0柒牌正式服务器,1:测试服务器1,2:测试服务器2\r
+\r
+        self.server_ip = EventMesh.publish("get_storage_config","server_ip")#\r
+        if self.server_ip == None:\r
+            if self.VC_server == 1:# \r
+                self.server_ip="118.145.158.207:22083"\r
+            elif self.VC_server == 2:# \r
+                self.server_ip="118.145.158.207:22082"\r
+            elif self.VC_server == 4:# \r
+                self.server_ip="118.145.158.207:22084"\r
+            elif self.VC_server == 5:# \r
+                self.server_ip="amp-wss.raisound.com"\r
+            elif self.VC_server == 6:# \r
+                self.server_ip="118.145.158.207:22080"\r
+            else:\r
+                self.server_ip="sevenpin.qipai.com.cn"\r
+\r
+            if dev_type == 'momo':# \r
+                self.server_ip="118.145.158.207:22080"\r
+            elif dev_type == "7PIN":\r
+                self.server_ip="sevenpin.qipai.com.cn"\r
+            elif dev_type == "sjgq":\r
+                self.server_ip="118.145.158.207:22084"\r
+        #开机提示音\r
+        self.power_on_tone = EventMesh.publish("get_storage_config","power_on_tone")#\r
+        if dev_type != "7PIN":\r
+            self.power_on_tone = None\r
+        if self.power_on_tone == None:\r
+            if dev_type == "G10":\r
+                self.power_on_tone = "已开机,您好!我是北科瑞讯智能 AI bot_name"\r
+            elif dev_type == "7PIN_BK":\r
+                self.power_on_tone = "小瑞来了!我们一起来愉快地聊天吧!" \r
+            elif dev_type == "momo":\r
+                self.power_on_tone = "DuloDulo,我是上古神兽食梦貘,主人可以叫我momo,我来自《山海经》,是一只以梦为食的神秘灵兽,每当颜色朦胧、人们入睡时,我就会悄悄飞到人们的床头,用我长长的鼻子把噩梦统统吞噬掉,只留下甜甜的美梦。从今往后,就由我守护在主人身边,一起度过每一个星河璀璨的夜晚。"\r
+            elif dev_type == "sjgq":\r
+                self.power_on_tone = "您好!我是巴马四季甘泉的智能助手。我可以为你解答各种各样的问题,像是有关巴马四季甘泉知识库、中基长寿科学产品、卫斯曼院士国际先进医疗中心的问题,还有日常生活与工作、旅游信息、健康咨询、教育与学习、情感交流、全球资讯、世界文化等方面的问题哦。你有没有这方面的问题想要问我呀?"\r
+            else:\r
+                self.power_on_tone = "您好!我是世界首创柒牌男装AI生活好帮手-bot_name, 很高兴为您服务,我可以帮您解答柒牌公司知识库、日常生活与工作、旅游信息、健康与运动咨询、教育与学习、情感交流、全球资讯、世界文化等问题!请问您有什么需要我帮忙的吗?" \r
+                \r
+\r
+        self.VC_record_TYPE = VC_record_TYPE_PCM #0:PCM 1:AMR\r
+        self.VC_play_TYPE = VC_play_TYPE_PCM #0:PCM 1:mp3 \r
+        self.VC_record_samplerate = 16000\r
+        self.VC_play_samplerate = 16000\r
+        \r
+        self.VC_TTS_voice_type = EventMesh.publish("get_storage_config","VC_TTS_voice_type")#音色配置\r
+        if self.VC_TTS_voice_type == None or ("男" in self.VC_TTS_voice_type) == False:\r
+            if dev_type == "G10" or  dev_type == "7PIN_BK":\r
+                self.VC_TTS_voice_type = {   \r
+                                            "女":{\r
+                                            "bot_name":"小瑞",\r
+                                            "voice":"zh_female_wanwanxiaohe_moon_bigtts" ,\r
+                                            "lang":"zh-cn"\r
+                                            },\r
+                                            "男":{\r
+                                            "bot_name":"小瑞",\r
+                                            "voice":"zh_male_wennuanahu_moon_bigtts"  ,\r
+                                            "lang":"zh-cn"\r
+                                            },\r
+                                            "童":{\r
+                                            "bot_name":"小瑞",\r
+                                            "voice":"ICL_zh_female_huoponvhai_tob"  ,\r
+                                            "lang":"zh-cn"\r
+                                            },\r
+                                            "粤":{\r
+                                            "bot_name":"小瑞",\r
+                                            "voice":"zh_female_wanqudashu_moon_bigtts" ,\r
+                                            "lang":"zh-hk" \r
+                                            },\r
+                                            "四川":{\r
+                                            "bot_name":"小瑞",\r
+                                            "voice":"zh_female_daimengchuanmei_moon_bigtts",\r
+                                            "lang":"&lang=zh-cn-sc"  \r
+                                            },\r
+                                            "个性":{\r
+                                            "bot_name":"小瑞",\r
+                                            "voice":"zh_male_sunwukong_mars_bigtts" ,\r
+                                            "lang":"zh-cn" \r
+                                            }\r
+                                           \r
+                                        }\r
+            elif dev_type == 'momo':\r
+                self.VC_TTS_voice_type = {   \r
+                                            "女":{\r
+                                            "bot_name":"食梦貘",\r
+                                            "voice":"zh_female_shaoergushi_mars_bigtts" ,\r
+                                            "lang":"zh-cn"\r
+                                            },\r
+                                            "男":{\r
+                                            "bot_name":"食梦貘",\r
+                                            "voice":"zh_male_yangguangqingnian_mars_bigtts"  ,\r
+                                            "lang":"zh-cn"\r
+                                            },\r
+                                            "童":{\r
+                                            "bot_name":"食梦貘",\r
+                                            "voice":"ICL_zh_female_huoponvhai_tob"  ,\r
+                                            "lang":"zh-cn"\r
+                                            },\r
+                }\r
+            elif dev_type == 'sjgq':\r
+                self.VC_TTS_voice_type = {   \r
+                                            "女":{\r
+                                            "bot_name":"小巴",\r
+                                            "voice":"zh_female_wanwanxiaohe_moon_bigtts" ,\r
+                                            "lang":"zh-cn"\r
+                                            },\r
+                                            "男":{\r
+                                            "bot_name":"小巴",\r
+                                            "voice":"zh_male_wennuanahu_moon_bigtts"  ,\r
+                                            "lang":"zh-cn"\r
+                                            },\r
+                                            "童":{\r
+                                            "bot_name":"小巴",\r
+                                            "voice":"ICL_zh_female_huoponvhai_tob"  ,\r
+                                            "lang":"zh-cn"\r
+                                            },\r
+                }\r
+            else:\r
+                #女,男,童,粤,川,个性声\r
+                self.VC_TTS_voice_type = {   \r
+                                            "女":{\r
+                                            "bot_name":"柒妹妹",\r
+                                            "voice":"huoshan::zh_female_wanwanxiaohe_moon_bigtts" ,\r
+                                            "lang":"zh-cn"\r
+                                            },\r
+                                            "男":{\r
+                                            "bot_name":"柒先生",\r
+                                            "voice":"huoshan::zh_male_wennuanahu_moon_bigtts"  ,\r
+                                            "lang":"zh-cn"\r
+                                            },\r
+                                            "童":{\r
+                                            "bot_name":"柒乐乐",\r
+                                            "voice":"huoshan::ICL_zh_female_huoponvhai_tob"  ,\r
+                                            "lang":"zh-cn"\r
+                                            },\r
+                                            "粤":{\r
+                                            "bot_name":"柒先生",\r
+                                            "voice":"huoshan::zh_female_wanqudashu_moon_bigtts" ,\r
+                                            "lang":"zh-hk" \r
+                                            },\r
+                                            "四川":{\r
+                                            "bot_name":"柒妹妹",\r
+                                            "voice":"huoshan::zh_female_daimengchuanmei_moon_bigtts",\r
+                                            "lang":"&lang=zh-cn-sc"  \r
+                                            },\r
+                                            "个性":{\r
+                                            "bot_name":"柒先生",\r
+                                            "voice":"huoshan::zh_male_sunwukong_mars_bigtts" ,\r
+                                            "lang":"zh-cn" \r
+                                            },\r
+                                            "英语":{\r
+                                            "bot_name":"柒先生",\r
+                                            "voice":"huoshan::en_male_smith_mars_bigtts" ,\r
+                                            "lang":"zh-cn" \r
+                                            }\r
+                                            \r
+                                           \r
+                                        }\r
+            \r
+            # self.VC_TTS_voice_type = {0:"zh_female_xinlingjitang_moon_bigtts",1:"zh_male_wennuanahu_moon_bigtts",2:"ICL_zh_female_huoponvhai_tob",\r
+            #                           3:"aliyun::longjiaxin",4:"zh_female_daimengchuanmei_moon_bigtts"}\r
+            #self.VC_TTS_voice_type = ["aliyun::longxiaoxia","aliyun::longnan","aliyun::longling"]\r
+            \r
+            #EventMesh.publish("set_storage_config",["VC_TTS_voice_type",self.VC_TTS_voice_type])\r
+\r
+        try:\r
+            self.VC_TTS_voice_key = EventMesh.publish("get_storage_config","VC_TTS_voice_key")#音色配置\r
+            if self.VC_TTS_voice_key == None :\r
+                if dev_type == "7PIN_BK":\r
+                    self.VC_TTS_voice_key = "童"\r
+                elif dev_type == "momo":\r
+                    self.VC_TTS_voice_key = "男"\r
+                else:\r
+                    self.VC_TTS_voice_key = "男"\r
+            if self.VC_TTS_voice_key in self.VC_TTS_voice_type:\r
+                pass\r
+            else:\r
+                self.VC_TTS_voice_key = list(self.VC_TTS_voice_type.keys())[0]\r
+            print("音色配置:{}:{}\r\n\r\n".format(self.VC_TTS_voice_key,self.VC_TTS_voice_type[self.VC_TTS_voice_key]))\r
+            self.VC_TTS_volume =  EventMesh.publish("get_storage_config","VC_TTS_volume")#音量配置\r
+        except Exception as e:\r
+            usys.print_exception(e)\r
+\r
+        if self.VC_TTS_volume == None:\r
+            self.VC_TTS_volume = 100\r
+        self.AI_audio_queue_thread_id = 0\r
+        self.AI_audio_queue_thread_lock = 0\r
+        self.AI_VC_send_data_queue_thread_id = 0\r
+        self.AI_VC_send_data_queue_thread_lock = 0\r
+        self.AI_ASR_send_data_queue_thread_id = 0\r
+        self.AI_ASR_send_data_queue_thread_lock = 0\r
+        self.AI_record_tmp_queue = Queue(100)\r
+        self.AI_ASR_send_data_queue = Queue(200)\r
+        self.AI_VC_send_data_queue = Queue(100)\r
+        self.AI_audio_queue = Queue(100)\r
+        #self.AI_WS_connect_Queue = Queue(100) #释放用\r
+        self.AI_TTS_str = ""\r
+        self.AI_ASR_str = ""\r
+        self.AI_ASR_flag = 0\r
+        self.AI_ASR_str_tmp = ""\r
+        self.AI_ASR_send_buf_len = 0\r
+        self.AI_ASR_text_tmp = ""\r
+        self.AI_ASR_text_repet_count = 0\r
+        # #开始线程\r
+        # if self.AI_audio_queue_thread_id ==0:\r
+        #     self.AI_audio_queue_thread_id = _thread.start_new_thread(self.AI_audio_queue_thread, ())\r
+        # else:\r
+        #     print("AI_VC_start :AI_audio_queue_thread_id != 0 ")\r
+        # if self.AI_VC_send_data_queue_thread_id == 0:    \r
+        #     self.AI_VC_send_data_queue_thread_id = _thread.start_new_thread(self.AI_VC_send_data_queue_thread, ())\r
+            \r
+        self.VC_state = VC_State_None #阿里ai VC状态\r
+        self.VC_dialog_id = ""#\r
+        self.VC_message_id=None\r
+        self.VC_task_id =None\r
+        self.AI_client_VC = None\r
+        self.AI_client_VC_recv_id = 0\r
+        self.AI_client_VC_recv_lock = 0\r
+        self.AI_client_VC_isconnect =0\r
+        self.AI_client_VC_debug =0\r
+\r
+        self.asr_state = VC_State_None #阿里VC_ASR VC状态\r
+        self.key_state = 0\r
+\r
+        self.AI_client_asr = None\r
+        self.AI_client_asr_recv_id = 0\r
+        self.AI_client_asr_recv_lock = 0\r
+        self.AI_client_asr_isconnect =0\r
+        self.AI_ASR_timer =  osTimer()\r
+        self.AI_ASR_timer_count = 0\r
+        self.AI_client_asr_debug =0\r
+        self.AI_ASR_check_timeout = 0\r
+        self.AI_ASR_error_timeout = 0\r
+        self.VC_Thinking_timerout = 0\r
+        self.VC_Speech_end_timerout = 0\r
+\r
+        self.record_pcm = None\r
+        self.play_pcm = None\r
+        self.VC_record_thread_id = 0\r
+        self.VC_record_thread_lock = 0\r
+        self.VC_pingping_timerout = 0\r
+        self.asr_pingping_timerout = 0\r
+        self.factory_timer = osTimer()\r
+        self._1S_timer = osTimer()\r
+        self.Audio_buf_size = 16*1024\r
+        self.record = audio.Record()\r
+        #self.record.end_callback(self.record_callback)\r
+        self.record.gain_set(4,10)\r
+        #self.record.gain_set(4,12)\r
+        self.aud = audio.Audio(0)\r
+        self.aud.setCallback(self.audio_cb)\r
+        #self.aud.setVolume(self.VC_TTS_volume //10)\r
+        self.audio_play_state = 1 #音频播放完状态\r
+        self.close_timerout = 0\r
+        self.LocalRespondingEnded_timerout = 0\r
+        \r
+        self.play_flag = 0\r
+        self.VC_record_state_flag = 0\r
+        self.AI_key_long_press_flag = 0\r
+        self.websocket_error_count = 0\r
+\r
+        self.tts_in_data_len = 0\r
+        self.tts_out_data_len = 0\r
+        self.VC_satrt_flag = 0\r
+        self.session_id = ""\r
+        EventMesh.subscribe("AI_key_press", self.AI_key_press)\r
+        EventMesh.subscribe("AI_key_release", self.AI_key_release)\r
+        EventMesh.subscribe("AI_key_long_press", self.AI_key_long_press)\r
+        EventMesh.subscribe("pwk_key_release", self.pwk_key_release)\r
+        EventMesh.subscribe("get_AI_audio_queue", self.get_AI_audio_queue)\r
+        EventMesh.subscribe("get_VC_satrt_flag", self.get_VC_satrt_flag)\r
+        EventMesh.subscribe("VC_error", self.VC_error)\r
+        \r
+        EventMesh.publish("close_led")\r
+\r
+        self.bot_name = "柒先生"\r
+        try:\r
+            if "bot_name" in self.VC_TTS_voice_type[self.VC_TTS_voice_key]:\r
+                self.bot_name = self.VC_TTS_voice_type[self.VC_TTS_voice_key]["bot_name"]\r
+            else:\r
+                print("not bot_name!!!!!!!!!!!!!!!!!!!!!!")\r
+        except Exception as e:\r
+            usys.print_exception(e)\r
+        try:\r
+            if self.ai_OTA.min_sys_ota()==1:\r
+            #if 0:    \r
+                self.AI_TTS_str = "检测到有新版本需要升级啦!升级时可千万别断电或乱按哦,升级完成后设备会自动重启,重启就代表升级成功"\r
+                EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_VC_start}) \r
+            # if self.ai_OTA.min_sys_ota()==2:\r
+            #     self.AI_TTS_str = "检测到有新版本需要升级啦!电量低于40%,无法保证升级正常执行,请充满电后重启设备再次升级!"\r
+            #     EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_VC_start}) \r
+            else:\r
+                try:\r
+                    self.ai_OTA.ota_result()\r
+                    self.ai_OTA.pots_ICCID()\r
+                except Exception as e:\r
+                    usys.print_exception(e)\r
+                #开机提示语,如果联网失败,直接提示信号弱\r
+                \r
+                #"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"}\r
+                #EventMesh.publish("get_storage_config",["powerRestart",1])\r
+                powerRestart =  EventMesh.publish("get_storage_config","powerRestart")#=1非正常重启\r
+                if powerRestart == None:\r
+                    powerRestart = 0\r
+                if powerRestart == 1:\r
+                    EventMesh.publish("set_storage_config",["powerRestart",0])\r
+                    \r
+                else:\r
+                    \r
+                    self.AI_TTS_str = self.power_on_tone.replace("bot_name", self.bot_name)\r
+                    print("开机提示:{}".format(self.AI_TTS_str))\r
+                    EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_VC_start}) \r
+                \r
+                \r
+\r
+        except Exception as e:\r
+            usys.print_exception(e)\r
+\r
+        \r
+    def post_processor_after_instantiation(self):\r
+        pass\r
+    def get_AI_audio_queue(self, event, msg):\r
+        return self.AI_audio_queue\r
+    def get_VC_satrt_flag(self, event, msg):\r
+        return self.VC_satrt_flag\r
+\r
+\r
+    def VC_30S_timer_cb(self, *args): #\r
+        EventMesh.publish("publish_AI_btnInfo",{"func":self.VC_30S_timer_cb_}) \r
+\r
+    def VC_30S_timer_cb_(self):    \r
+        self.get_config_timer_count += 1\r
+        if self.get_config_timer_count >= 2*60*2:#2小时更新配置参数\r
+            self.get_config_timer_count = 0\r
+            try:\r
+                self.http_get_config()#获取/更新配置参数\r
+            except Exception as e:\r
+                usys.print_exception(e)\r
+    #提交错误id           \r
+    def ud_error(self,error_data):\r
+        response = None\r
+        if self.is_up_error == 1:\r
+            try:\r
+                # currentVersion = versions.Build_Time\r
+                # currentVersion = "7PIN-"+currentVersion[:10]+"-"+currentVersion[11:-3]\r
+                url = "http://{}/health?task_id={}".format(self.server_ip,error_data[0]+error_data[1])\r
+                print(url)\r
+                response = request.get(url,timeout=5)\r
+                if response.status_code == 200:\r
+\r
+                    print("ud_error:ok")\r
+                else:\r
+                    print("ud_error  error!!!!")\r
+                    for i in response.text:\r
+                        print(i)\r
+                response.close()\r
+            except Exception as e:\r
+                usys.print_exception(e)\r
+                if response != None:\r
+                    response.close()\r
+    #获取配置参数\r
+    def http_get_config(self, event=None, msg=None):\r
+        print("http_get_config")\r
+\r
+        response = None\r
+        #http://180.184.206.142/bz-api/dev/config?deviceId=xxx\r
+        try:\r
+            url = "http://dmp.raisound.com/bz-api/dev/config/{}".format(modem.getDevImei())\r
+            print(url)\r
+            response = request.get(url,timeout=5)\r
+            if response.status_code == 200:\r
+                data = response.json()\r
+                print("http_get_config:{}".format(data))\r
+                \r
+                if data:\r
+                    try:\r
+                        if data["code"] == 20000:#有配置\r
+                            if data["data"] :\r
+                                if "version" in data["data"]:\r
+                                    config_version = EventMesh.publish("get_storage_config","config_version")#音量配置\r
+                                    if config_version != data["data"]["version"]:\r
+                                        config_version = data["data"]["version"]\r
+                                        EventMesh.publish("set_storage_config",["config_version",config_version])\r
+                                        if "VC_TTS_voice_type" in data["data"]:\r
+                                            self.VC_TTS_voice_type = data["data"]["VC_TTS_voice_type"]\r
+                                            EventMesh.publish("set_storage_config",["VC_TTS_voice_type",self.VC_TTS_voice_type])\r
+                                            print("配置VC_TTS_voice_type成功")\r
+                                        if "server_ip" in data["data"]:\r
+                                            self.server_ip = data["data"]["server_ip"]\r
+                                            EventMesh.publish("set_storage_config",["server_ip",self.server_ip])\r
+                                            print("配置server_ip成功")\r
+                                        if "power_on_tone" in data["data"]:\r
+                                            self.power_on_tone = data["data"]["power_on_tone"]\r
+                                            EventMesh.publish("set_storage_config",["power_on_tone",self.power_on_tone])\r
+                                            print("配置power_on_tone成功")\r
+\r
+                    except Exception as e:\r
+                            usys.print_exception(e)\r
+            else:\r
+                print("status_code:{}".format(response.status_code))\r
+                print("http_get_config:error!!!!!!!!!!")\r
+            response.close()\r
+        except Exception as e:\r
+            usys.print_exception(e)\r
+            if response != None:\r
+                response.close()\r
+\r
+    def audio_cb(self,event):\r
+        if event == 0:\r
+            self.audio_play_state =1\r
+            #EventMesh.publish("set_audio_state", 1)\r
+            print('audio-play start.')\r
+        elif event == 7:\r
+            self.audio_play_state = 0\r
+            #EventMesh.publish("set_audio_state", 0)   \r
+            print('audio-play finish.!!!!!!')\r
+\r
+    def AI_key_press(self, event, msg):#按键按下\r
+        print("AI_key_press")\r
+        self.get_config_timer_count = 0\r
+        self.key_state = 1\r
+        #self.aud.aud_tone_play(10,200)#播放按键音\r
+        self.AI_TTS_str = ""#"你好,有什么吩咐"\r
+        self.AI_ASR_str = ""\r
+        self.AI_ASR_str_tmp = ""\r
+        self.VC_state = VC_State_None\r
+        # if self.VC_state != VC_State_None:\r
+        #     EventMesh.publish("publish_AI_btnInfo",{"func":self.Close}) \r
+        #     EventMesh.publish("publish_AI_btnInfo",{"func":utime.sleep_ms,'data':(10)})\r
+        #if self.VC_record_state_flag >1:#如果在录音,就先停止录音\r
+        self.VC_Speech_End()\r
+\r
+        self.VC_Speech_Start()    \r
+        self.AI_VC_start() \r
+        # self.Close()\r
+        # self.AI_VC_start()\r
+        self.AI_key_long_press_flag = 0\r
+\r
+    def AI_key_release(self, event, msg):#按键弹起\r
+        print("AI_key_release123")\r
+        self.key_state = 0\r
+        if self.AI_key_long_press_flag == 1 :#有长按\r
+            #self.AI_client_VC_end_speech()\r
+            EventMesh.publish("publish_AI_btnInfo",{"func":utime.sleep_ms,'data':(1000)})\r
+            EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_client_asr_StopTranscription_requset})\r
+            #self.AI_client_asr_StopTranscription_requset()#请求停止\r
+            if self.VC_mode == 1 :#长按单次问答模式\r
+                if self.AI_ASR_str_tmp != "":\r
+                    print("AI_key_release:asr_str:{}".format(self.AI_ASR_str))  \r
+                    EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_VC_start})\r
+            \r
+        else :\r
+            if self.VC_mode == 1 :#长按单次问答模式\r
+                # try:\r
+                #     EventMesh.publish("publish_AI_btnInfo",{"func":self.Close}) \r
+                # except Exception as e:\r
+                #     usys.print_exception(e)\r
+                # EventMesh.publish("publish_AI_btnInfo",{"func":self.key_prompt})  #提示请您按住中间的按钮开始讲话,讲完松开即可   \r
+                self.AI_TTS_str = "请您按住中间的按钮开始讲话,讲完松开即可 "\r
+                EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_VC_start})\r
+\r
+                \r
+                #self.VC_Speech_End()\r
+    def AI_key_long_press(self, event, msg):#按键长按\r
+        print("AI_key_long_press")\r
+        self.AI_key_long_press_flag = 1\r
+\r
+    def pwk_key_release(self, event, msg):#电源键短按,关闭\r
+        print("pwk_key_release")\r
+        EventMesh.publish("publish_AI_btnInfo",{"func":self.Close}) \r
+\r
+    def key_prompt(self):\r
+        EventMesh.publish("audio_montage_play",["key_prompt.mp3"])\r
+        #self.aud.play(1,1,'U:/static/key_prompt.mp3')#提示请您按住中间的按钮开始讲话,讲完松开即可\r
+    def VC_error(self, event, msg):#错误播报\r
+        self.websocket_error()\r
+        #EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_error}) \r
+#****************************************ASR连接**********************************************************************\r
+    def websocket_connect_asr(self):\r
+        print("websocket_connect_asr:{} e:{}!!!!!!!!!!!!!!!!!!!!!".format(self.AI_client_asr_isconnect,self.AI_client_asr_debug))\r
+        self.AI_ASR_text_repet_count = 0\r
+        self.AI_ASR_check_timeout = 0\r
+        self.AI_ASR_error_timeout = 0\r
+        self.AI_ASR_text_tmp = ""\r
+        if self.AI_client_asr_isconnect == 1:\r
+            return\r
+        # 创建ASR客户端\r
+        try:\r
+            signal = net.csqQueryPoll()\r
+            if signal == -1 or sim.getStatus() != 1:#网络正常\r
+                self.websocket_error()\r
+                return\r
+\r
+            # self.AI_client_asr = uwebsocket.Client.connect('wss://nls-gateway-cn-beijing.aliyuncs.com/ws/v1',headers=Headers, debug=False)\r
+            req_str = ""\r
+            platform = "platform=huoshan"\r
+            #platform= "platform=xfyun-ita"\r
+            platform= "platform=xfyun-bigmodel-ita"\r
+            lang = "lang=zh-cn"#普通话测试环境\r
+            try:\r
+                if "loang" in self.VC_TTS_voice_type[self.VC_TTS_voice_key]:\r
+                    lang = self.VC_TTS_voice_type[self.VC_TTS_voice_key]["lang"]\r
+                else:\r
+                    print("not lang!!!!!!!!!!!!!!!!!!!!!!")\r
+            except Exception as e:\r
+                usys.print_exception(e)\r
+            req_str = "asr/ws?is_auth={}&{}&{}".format(self.is_auth,platform,lang)\r
+            print("req_str:{}".format(req_str))\r
+            token = EventMesh.publish("get_dev_token")\r
+            print("token:{}".format(token))\r
+            url = 'ws://{}/{}&dt={}'.format(self.server_ip,req_str,token)\r
+            print("websocket_connect_asr URL:{}".format(url))\r
+            self.AI_client_asr = uwebsocket.Client.connect(url, debug=True)#\r
+            #self.AI_WS_connect_Queue.put(self.AI_client_asr)\r
+            \r
+        except Exception as e: #网络连接异常\r
+            usys.print_exception(e)\r
+            \r
+            print("websocket_connect_asr error!!!\r\n")\r
+            #self.connect_timerout_popup(2)  \r
+            str_error = str(e)\r
+            if str_error.find("[Errno 22] EINVAL")!= -1: \r
+                self.websocket_error()\r
+                print("[Errno 22] EINVAL!!!\r\n")\r
+                print("[Errno 22] EINVAL!!!\r\n")\r
+                print("[Errno 22] EINVAL!!!\r\n")\r
+                print("[Errno 22] EINVAL!!!\r\n")\r
+                EventMesh.publish("set_storage_config",["powerRestart",1])#调试临时关闭\r
+                utime.sleep_ms(1000)\r
+                self.aud.stopPlayStream()\r
+                self.aud.stopAll()\r
+                Power.powerRestart()\r
+                \r
+            self.websocket_error()\r
+            \r
+            return\r
+        if self.AI_client_asr == None:\r
+            EventMesh.publish_async("update_dev_token",thread_size = 8192)#获取token\r
+            return \r
+        self.AI_client_asr_debug+=1\r
+        utime.sleep_ms(10)\r
+        #self.AI_client_asr.settimeout(5)\r
+        #开启发送线程\r
+        if self.AI_ASR_send_data_queue_thread_id == 0:    \r
+            _thread.stack_size(self.Audio_buf_size+8*1024)\r
+            self.AI_ASR_send_data_queue_thread_id = _thread.start_new_thread(self.AI_ASR_send_data_queue_thread, ())\r
+            _thread.stack_size(8*1024)\r
+            print("AI_VC_start :AI_ASR_send_data_queue_thread_id :{} ".format(self.AI_ASR_send_data_queue_thread_id))\r
+        print("websocket_connect_asr 222!!!\r\n")\r
+        self.AI_client_asr_recv_thread_close()#关闭读线程\r
+        # 创建线程接收数据\r
+        _thread.stack_size(self.Audio_buf_size+8*1024)\r
+        self.AI_client_asr_recv_id = _thread.start_new_thread(self.AI_client_asr_recv, (self.AI_client_asr,))\r
+        _thread.stack_size(8*1024)\r
+        self.AI_client_asr_isconnect = 1\r
+        self.AI_ASR_timer.start(1000, 1, self.AI_ASR_timer_cb)\r
+        self.AI_client_asr_start_requset()#开始请求\r
+        print("websocket_connect_asr:OK!!!!!!!!!!!!!!!!!!!!!")\r
+\r
+    def websocket_deconnect_asr(self):\r
+        print("websocket_deconnect_asr {}!!!!!!!".format(self.AI_client_asr_isconnect))\r
+        print("websocket_deconnect_asr!!!!!!!")\r
+        self.AI_ASR_text_repet_count = 0\r
+        self.AI_ASR_text_tmp = ""\r
+        self.AI_ASR_timer.stop()\r
+        #self.AI_ASR_send_data_queue_thread_close()#关闭发送线程\r
+        self.AI_client_asr_recv_thread_close()#关闭读线程\r
+        if self.AI_client_asr_isconnect == 1 or self.AI_client_asr!= None:\r
+            try:\r
+                self.AI_client_asr_isconnect = 0\r
+                count = 500\r
+                while True:#等待发完数据\r
+                    count-=1\r
+                    if count <=0 or self.AI_ASR_send_data_queue_thread_lock == 0:\r
+                        break\r
+                    print("等待发送完成:{}".format(count))\r
+                    if self.AI_ASR_send_data_queue.empty()!=True:\r
+                        self.AI_ASR_send_data_queue.clear()\r
+                    utime.sleep_ms(1)\r
+                \r
+                try:\r
+                    self.AI_client_asr_StopTranscription_requset()#发送停止ASR\r
+                    self.AI_client_asr.close()\r
+                except Exception as e:\r
+                    usys.print_exception(e)\r
+                    utime.sleep_ms(200)#再尝试关闭一次\r
+                    try:\r
+                        self.AI_client_asr.close()\r
+                        \r
+                    except Exception as e:\r
+                        usys.print_exception(e)\r
+                self.AI_client_asr_debug-=1\r
+                try:\r
+                    self.AI_client_asr._close()\r
+                except Exception as e:\r
+                    usys.print_exception(e)\r
+                self.AI_client_asr = None\r
+            except Exception as e:\r
+                usys.print_exception(e)\r
+        print("websocket_deconnect_asr {}!!!!!!!".format(self.AI_client_asr_isconnect))\r
+\r
+    #websocket发送数据    \r
+    def AI_client_asr_send(self,data_str):\r
+        # if isinstance(data_str, str):#是字符串\r
+        #     print("ASR ASR AI_client_asr_send:{}".format(data_str))\r
+        #     pass\r
+        # else:\r
+        #     pass\r
+        #     #print("ASR ASR AI_client_asr_send:len:{}".format(len(data_str)))\r
+        self.AI_ASR_send_data_queue.put([AI_client_asr_num,data_str]) \r
+\r
+    def AI_client_asr_ping(self):\r
+        pass\r
+        if self.AI_client_asr_isconnect == 1:\r
+            #self.AI_client_asr.write_frame(0x09,b'ping ping')\r
+            self.AI_client_asr_send("ping")\r
+    def set_AI_ASR_flag(self,data):\r
+        self.AI_ASR_flag = data\r
+    def AI_ASR_timer_cb(self, *args): #\r
+        EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_ASR_timer_cb_}) \r
+\r
+    def AI_ASR_timer_cb_(self):    \r
+        if self.AI_ASR_check_timeout > 0:\r
+            print("AI_ASR_check_timeout:{}".format(self.AI_ASR_check_timeout))\r
+            self.AI_ASR_check_timeout-=1\r
+            if self.AI_ASR_check_timeout <=0:\r
+                self.AI_ASR_check_timeout = 0\r
+                self.AI_ASR_error_timeout = 3#发送停止后3秒后没正式结果就提示\r
+                #EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_client_asr_StopTranscription_requset})\r
+                \r
+        if self.AI_ASR_error_timeout>0:\r
+            self.AI_ASR_error_timeout-=1\r
+            print("AI_ASR_error_timeout:{}".format(self.AI_ASR_error_timeout))  \r
+            if self.AI_ASR_error_timeout <= 0:\r
+                self.AI_ASR_error_timeout = 0\r
+                #if self.AI_ASR_str == "":\r
+                if self.AI_ASR_str_tmp == "" and self.AI_ASR_str == "" and self.AI_ASR_text_tmp == "":\r
+                    self.AI_TTS_str = "没有识别到您说话,请重试" \r
+                else :\r
+                    self.AI_ASR_str = self.AI_ASR_str_tmp + self.AI_ASR_str+self.AI_ASR_text_tmp\r
+                    self.AI_ASR_str_tmp = self.AI_ASR_str\r
+                print("AI_ASR_error_timeout2:重连:{}!!!!!!!!!!\r\n".format(self.AI_ASR_str) )\r
+                print("AI_ASR_error_timeout2:重连:{}!!!!!!!!!!\r\n".format(self.AI_ASR_str) )\r
+                print("AI_ASR_error_timeout2:重连:{}!!!!!!!!!!\r\n".format(self.AI_ASR_str) )\r
+                EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_deconnect_asr}) \r
+                EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_connect_asr}) #重连ASR\r
+                #EventMesh.publish("publish_AI_btnInfo",{"func":self.VC_Speech_End}) #重连ASR\r
+                EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_VC_start})\r
+                EventMesh.publish("publish_AI_btnInfo",{"func":self.set_AI_ASR_flag,"data":1})#设置以打断过一次\r
+                if self.VC_record_state_flag > 1:\r
+                    self.VC_record_state_flag =1\r
+        pass\r
+    #关闭ASR数据发送线程\r
+    def AI_ASR_send_data_queue_thread_close(self):\r
+        if self.AI_ASR_send_data_queue_thread_id != 0:\r
+            count =500\r
+            while True:\r
+                count -= 1     \r
+                if self.AI_ASR_send_data_queue_thread_lock == 0 or count <=0:\r
+                    break\r
+                else:\r
+                    self.AI_ASR_send_data_queue_thread_lock = 2\r
+                    print("AI_ASR_send_data_queue_thread going:{}...".format(count))\r
+                    utime.sleep_ms(1)\r
+            self.AI_ASR_send_data_queue_thread_lock = 0\r
+            print("AI_ASR_send_data_queue_thread_close")\r
+            try:\r
+                _thread.stop_thread(self.AI_ASR_send_data_queue_thread_id)\r
+            except Exception as e:\r
+                usys.print_exception(e)\r
+        self.AI_ASR_send_data_queue_thread_id = 0\r
+    #发送数据队列\r
+    def AI_ASR_send_data_queue_thread(self):\r
+        print("AI_ASR_send_data_queue_thread:start")\r
+        count_t = 0\r
+        while True:\r
+            if self.AI_ASR_send_data_queue_thread_lock == 2:\r
+                print("AI_ASR_send_data_queue_thread:该退出了")\r
+                break\r
+            if self.AI_ASR_send_data_queue.empty() :#不能去掉,去掉会卡死\r
+                self.AI_ASR_send_data_queue_thread_lock = 0  \r
+                count_t+=1\r
+                utime.sleep_ms(1)\r
+            else:\r
+                #data[0]是websocket连接对象编号,data[1]是数据\r
+                #print("AI_ASR_send_data_queue_thread:get")\r
+                \r
+                self.AI_ASR_send_data_queue_thread_lock = 1\r
+                data = self.AI_ASR_send_data_queue.get()\r
+                #print("AI_ASR_send_data_queue_thread:num{} len{}".format(data[0],len(data[1])))\r
+                if data != None:\r
+                    try:\r
+                        # 发送数据\r
+                        if data[0] == AI_client_asr_num:\r
+                            self.AI_ASR_send_buf_len -= len(data[1])\r
+                            self.asr_pingping_timerout = 0\r
+                            if self.AI_client_asr != None and self.AI_client_asr_isconnect == 1:\r
+                                self.AI_client_asr.send(data[1])\r
+                                if isinstance(data[1], str):#是字符串\r
+                                    print("ASR ASR: send_data:{}".format(data[1]))\r
+                                # else:\r
+                                #     print("ASR ASR: send_data!:{}".format(len(data[1])))\r
+                            else:\r
+                                if isinstance(data[1], str):#是字符串\r
+                                    print("ASR ASR: send_data error!!!:{}".format(data[1]))\r
+                                else:\r
+                                    print("ASR ASR: send_data error!!!:{}".format(len(data[1])))\r
+\r
+                    except Exception as e:\r
+                        usys.print_exception(e)\r
+                        if data[0] == AI_client_asr_num: \r
+                            if self.AI_client_asr_isconnect != 0:\r
+                                print("ASR发送数据错误,退出")\r
+                                EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_error,"data":"ASR发送出错了,请重试"}) \r
+                                self.ud_error(["asr",self.asr_taskid])\r
+                            #EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_connect_asr}) #重连\r
+                    utime.sleep_ms(1)\r
+        self.AI_ASR_send_data_queue_thread_lock = 0    \r
+\r
+    #ASR关闭读线程\r
+    def AI_client_asr_recv_thread_close(self):\r
+        if self.AI_client_asr_recv_id != 0:\r
+            count =500\r
+            while True:\r
+                count -= 1\r
+                if self.AI_client_asr_recv_lock == 1:\r
+                    self.AI_client_asr_recv_lock = 2\r
+                if self.AI_client_asr_recv_lock == 0 or count <=0:\r
+                    break\r
+                else:\r
+                    print("AI_client_asr_recv_thread going:{}...".format(count))\r
+                    utime.sleep_ms(1)\r
+            self.AI_client_asr_recv_lock = 0\r
+            print("AI_client_asr_recv_thread_close")\r
+            try:\r
+                _thread.stop_thread(self.AI_client_asr_recv_id)\r
+            except Exception as e:\r
+                usys.print_exception(e)\r
+        self.AI_client_asr_recv_id = 0\r
+\r
+    #Ai ASR websocket返回数据       \r
+    def AI_client_asr_recv(self,cli):\r
+        while True:\r
+            try:\r
+                # 死循环接收数据\r
+                self.AI_client_asr_recv_lock = 0\r
+                utime.sleep_ms(1)\r
+                recv_data = cli.recv()\r
+                if self.AI_client_asr_recv_lock == 2:#要关闭线程了\r
+                    print("AI_client_asr_recv 该退出了")\r
+                    break\r
+                self.AI_client_asr_recv_lock = 1\r
+                self.close_timerout = 0#服务器有返回清零退出时间\r
+                if recv_data == "websocket close":\r
+                    # 服务器关闭连接\r
+                    print("ASR 服务器主动关闭连接!!!!!!!!!!!!!!!!!!!!!!!!!!!")\r
+                    \r
+                    EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_error,"data":"ASR连接断开了,请重试"}) \r
+                    self.ud_error(["asr",self.asr_taskid])\r
+                    break\r
+                elif recv_data == "":#客户端关闭连接\r
+                    print("ASR ASR :客户端关闭连接")\r
+                    EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_error,"data":"ASR连接断开了,请重试"}) \r
+                    self.ud_error(["asr",self.asr_taskid])\r
+                    break\r
+                try:\r
+                    if isinstance(recv_data, str):\r
+                        jsload_data =  ujson.loads(recv_data)\r
+                        print("ASR ASR recv_data: {}".format(jsload_data))\r
+                        if jsload_data["status"] != 20000000:#返回错误\r
+                            print("ASR返回非20000000状态码,退出")\r
+                            EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_error,"data":"ASR出错了,请重试"}) \r
+                            self.ud_error(["asr",self.asr_taskid])\r
+                            break\r
+                        \r
+                        if jsload_data["task_id"] != None:\r
+                            self.asr_taskid  = jsload_data["task_id"]\r
+                        if jsload_data["event"] != None:\r
+                            if jsload_data["event"] == "TranscriptionStarted": #开始录音\r
+                                self.VC_record_state_flag = 2\r
+                                self.VC_state =  VC_State_SpeechStart\r
+                                EventMesh.publish("open_led_blue")\r
+                                self.AI_ASR_error_timeout = 0\r
+                                \r
+                                pass\r
+\r
+                            elif jsload_data["event"] == "Changed" or jsload_data["event"] == "SentenceEnd" : #开始录音Changed\r
+                                # if self.VC_record_state_flag == 2:\r
+                                #     \r
+                                \r
+                                self.AI_ASR_timer_count = 0\r
+                                if jsload_data["result"]["result"]:\r
+                                    #self.AI_listen_text = str(jsload_data["result"]["result"])\r
+                                    text= str(jsload_data["result"]["result"])\r
+                                    print("ASR recv self.VC_state :{}".format(self.VC_state))\r
+                                    if self.is_long_record == 0:\r
+                                        if self.VC_state >= VC_State_TTSStart:#开始播音后不响应asr结果\r
+                                            print("asr continue")\r
+                                            continue\r
+                                    EventMesh.publish("open_led_blue")\r
+                                    \r
+                                    if jsload_data["result"]["is_end"] == True:  #asr结束\r
+                                        self.AI_ASR_check_timeout = 0\r
+                                        self.AI_ASR_error_timeout = 0\r
+                                        self.AI_ASR_text_repet_count = 0\r
+                                        self.AI_ASR_text_tmp = ""\r
+                                        self.VC_record_state_flag = 4\r
+                                        ret= self.check_text(text)\r
+                                        if ret == 0:#配置指令\r
+                                            \r
+                                            if self.AI_VC_send_data_queue.empty()!=True:\r
+                                                self.AI_VC_send_data_queue.clear()\r
+                                            if self.AI_ASR_send_data_queue.empty()!=True:\r
+                                                self.AI_ASR_send_data_queue.clear()\r
+                                            self.AI_ASR_send_buf_len = 0\r
+                                            EventMesh.publish("open_led_all")\r
+                                            try:\r
+                                                \r
+                                                EventMesh.publish("publish_AI_btnInfo",{"func":self.VC_Speech_End})\r
+                                                #print("AI_client_asr_recv VC_Speech_End") \r
+                                                EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_deconnect_VC}) \r
+                                                #EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_deconnect_asr})\r
+                                                EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_VC_start}) \r
+                                            except Exception as e:\r
+                                                usys.print_exception(e)\r
+                                            continue\r
+                                        elif ret == 1:#不处理\r
+                                            pass\r
+                                        else:#正常asr\r
+                                            if self.VC_mode == 0 :#连续问答模式\r
+                                                self.AI_ASR_str = text#\r
+                                                if self.AI_ASR_flag == 0:#d第一次识别,没有打断\r
+                                                    self.AI_ASR_str_tmp = self.AI_ASR_str\r
+                                                else:#第二次识别,打断了\r
+                                                    self.AI_ASR_str = self.AI_ASR_str_tmp+text\r
+                                                    print("ASR ASR 打断 续集 AI_ASR_str {}".format(self.AI_ASR_str))\r
+                                                    self.AI_ASR_str_tmp = self.AI_ASR_str\r
+                                                    if self.is_long_record != 0:\r
+                                                        #if self.VC_state >= VC_State_TTSStart:#如果已经播放了,关闭VC连接,重新打开,处理音频数据太多问题\r
+                                                        EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_deconnect_VC})#关闭vc连接\r
+                                                self.AI_ASR_flag  = 1\r
+                                                print("asr recv :asr_str:{}".format(self.AI_ASR_str))  \r
+                                                #EventMesh.publish("publish_AI_btnInfo",{"func":utime.sleep_ms,"data":(500)}) #等一秒\r
+                                                EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_VC_start}) \r
+                                            elif self.VC_mode == 1:#单对话模式\r
+                                                self.AI_ASR_str += text#\r
+                                                self.AI_ASR_str_tmp = self.AI_ASR_str\r
+                                                if self.key_state == 0:#按键已经弹起\r
+                                                    self.AI_ASR_str_tmp =""\r
+                                                    print("asr recv :asr_str:{}".format(self.AI_ASR_str))  \r
+                                                    #EventMesh.publish("publish_AI_btnInfo",{"func":utime.sleep_ms,"data":(500)}) #等一秒\r
+                                                    EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_VC_start}) \r
+                                        self.VC_state =  VC_State_SpeechEnd\r
+                                    elif jsload_data["result"]["is_end"] == False:\r
+                                        \r
+                                        self.VC_state =  VC_State_SpeechIng\r
+                                        if self.AI_ASR_text_tmp != "" and self.AI_ASR_text_tmp  == text:\r
+                                            pass\r
+                                            # self.AI_ASR_text_repet_count+=1\r
+                                            # if self.AI_ASR_text_repet_count>=40:#重复30次下发一样结果,就报错\r
+                                            #     print("asr 错误,无正式结果:{}".format(text))\r
+                                            #     #EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_error})#\r
+                                            #     EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_error,"data":"ASR出错了,请重试"}) \r
+                                        else:\r
+                                            self.AI_ASR_check_timeout = 5 #5秒没更新结果,强制stop\r
+                                            self.AI_ASR_error_timeout = 0\r
+                                            self.AI_ASR_text_repet_count = 0\r
+                                        if self.VC_mode == 0 :#连续问答模式\r
+                                            self.AI_ASR_text_tmp = text\r
+                                            self.VC_record_state_flag = 3\r
+                                            if self.AI_ASR_flag ==1 :#如果已经识别过一次asr\r
+                                                self.AI_ASR_flag = 2\r
+                                                print("asr 打断,关闭VC连接")\r
+                                                self.AI_ASR_str = ""\r
+                                                if self.is_long_record != 0:\r
+                                                    self.VC_Play_End()\r
+                                                    EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_deconnect_VC})#关闭vc连接\r
+                                                # EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_connect_VC})#连接服务器\r
+                                                # EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_client_VC_start_requset})#请求\r
+                                                EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_VC_start}) \r
+                                                EventMesh.publish("publish_AI_btnInfo",{"func":EventMesh.publish,"data":"open_led_blue"})#\r
+                                        elif self.VC_mode ==1:#单对话模式\r
+                                            self.AI_ASR_str_tmp =""\r
+                        \r
+                except Exception as e:\r
+                    usys.print_exception(e)\r
+                \r
+            except Exception as e:\r
+                    error_str = str(e)\r
+                    print("ASR ASR:e:{}".format(error_str))\r
+                    #usys.print_exception(e)\r
+                    if error_str.find("[Errno 110]")!= -1:\r
+                        #print("ASR ASR:recv TIMEDOUT 正常")\r
+                        pass\r
+                    else:\r
+                        usys.print_exception(e)\r
+                        print("{}".format(cli))\r
+                        #self.websocket_error()\r
+                        print("ASR读数据报错,退出")\r
+                        EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_error,"data":"ASR出错了,请重试"})#\r
+                        self.ud_error(["asr",self.asr_taskid])\r
+                        break\r
+        self.AI_client_asr_isconnect = 0\r
+        self.AI_client_asr_recv_id = 0 \r
+        self.AI_client_asr_recv_lock = 0\r
+        print("AI_client_asr_recv END!!!!!!!!!!!!!!!!!!!!!!!!!!!")\r
+    #ASR开始会话\r
+    def AI_client_asr_start_requset(self):\r
+        self.session_id  = self.get_session_id()\r
+        json_data = \\r
+        { \r
+            "header":{\r
+                "event":"StartTranscription",\r
+                "trace_id":self.get_trace_id()\r
+                },\r
+            "payload":{\r
+                "format":"pcm",\r
+                "sample_rate":self.VC_record_samplerate,\r
+                 "session_id": self.session_id ,\r
+                }\r
+            \r
+        }\r
+        if self.VC_record_TYPE == VC_record_TYPE_AMR :\r
+            json_data["payload"]["format"]='amr'\r
+            pass\r
+        \r
+        self.AI_ASR_error_timeout = 5\r
+        self.AI_client_asr_send(ujson.dumps(json_data))\r
+    #ASR终止\r
+    def AI_client_asr_StopTranscription_requset(self):   \r
+        print("AI_client_asr_StopTranscription_requset!!!!!")\r
+        json_data = \\r
+        {\r
+            "header":{\r
+                "event":"StopTranscription",\r
+                "trace_id":self.get_trace_id()\r
+                }\r
+        }\r
+\r
+        #self.AI_client_asr_send(ujson.dumps(json_data))\r
+        if self.AI_client_asr != None and self.AI_client_asr_isconnect == 1:\r
+            self.AI_client_asr.send(ujson.dumps(json_data))\r
+                \r
+     #开始录音\r
+    def VC_Speech_Start(self):\r
+        try:\r
+            \r
+            #self.VC_state =  VC_State_SpeechStart\r
+            print("VC_Speech_Start VC_record_state_flag:{} self.AI_ASR_flag:{}!!!!!!!!".format(self.VC_record_state_flag,self.AI_ASR_flag))  \r
+            if self.AI_ASR_flag  != 0:\r
+                return\r
+            \r
+            if self.VC_record_state_flag  == 0:\r
+                if dev_type != "7PIN" :\r
+                    EventMesh.publish("publish_AI_btnInfo",{"func":self.chenggong_tone}) \r
+                #self.websocket_connect_asr()   \r
+                self.VC_record_thread_close()#关闭录音线程\r
+                _thread.stack_size(self.Audio_buf_size+8*1024)\r
+                self.VC_record_thread_id = _thread.start_new_thread(self.VC_record_thread,())\r
+                _thread.stack_size(8*1024)\r
+                print("self.VC_record_thread_id:{}".format(self.VC_record_thread_id))\r
+                try:\r
+                    \r
+                    if self.VC_record_TYPE == VC_record_TYPE_AMR :\r
+                        try :\r
+                            self.record.stream_start(audio.Record.AMRNB, self.VC_record_samplerate, 0)\r
+                        except Exception as e:\r
+                                usys.print_exception(e)\r
+                    elif self.VC_record_TYPE == VC_record_TYPE_PCM:\r
+                        print("record_pcm.stream_read_start()!!!!!!!!!!!!")\r
+                        self.record.stream_start(audio.Record.WAV, self.VC_record_samplerate, 0)\r
+                        # if self.record_pcm != None:\r
+                        #     try:\r
+                        #         self.record_pcm.stream_stop()\r
+                        #         self.record_pcm.close()\r
+                        #         self.record_pcm = None\r
+                        #     except Exception as e:\r
+                        #         usys.print_exception(e)\r
+                        # if self.record_pcm == None:        \r
+                        #     ret = self.record_pcm = audio.Audio.PCM(0,1,16000,0,1,2)\r
+                        #     print("audio.Audio.PCM:ret:{}".format(ret))\r
+                        #     ret = self.record_pcm.stream_read_start()\r
+                        #     print("self.record_pcm.stream_read_start:ret:{}".format(ret))\r
+                except Exception as e:\r
+                    usys.print_exception(e) \r
+                    \r
+                self.VC_record_state_flag = 2\r
+        except Exception as e:\r
+            self.websocket_error()\r
+            self.VC_record_state_flag = 1\r
+            self.VC_Speech_End()#关闭录音\r
+            usys.print_exception(e)\r
+\r
+    #停止录音\r
+    def VC_Speech_End(self):\r
+        try:\r
+            self.AI_ASR_flag = 0\r
+            self.AI_ASR_str_tmp = ""\r
+            self.AI_ASR_str = ""\r
+            #EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_deconnect_asr})\r
+              \r
+            if self.VC_record_state_flag == 0:\r
+                return\r
+            #self.AI_client_asr_StopTranscription_requset()#请求停止\r
+            if self.VC_record_TYPE == VC_record_TYPE_AMR:\r
+                self.record.stream_stop()\r
+                self.record.stop()#关闭录音\r
+                Record_read_buf = bytearray(self.Audio_buf_size)\r
+                for i in range(10):\r
+                    Record_len = self.record.stream_read(Record_read_buf, self.Audio_buf_size)\r
+                    print("Record_len:!!!!!!{}".format(Record_len))\r
+                    if Record_len <= 0:\r
+                        break\r
+            elif self.VC_record_TYPE == VC_record_TYPE_PCM:\r
+                self.record.stream_stop()\r
+                self.record.stop()#关闭录音\r
+                Record_read_buf = bytearray(self.Audio_buf_size)\r
+                for i in range(10):\r
+                    Record_len = self.record.stream_read(Record_read_buf, self.Audio_buf_size)\r
+                    print("Record_len:!!!!!!{}".format(Record_len))\r
+                    if Record_len <= 0:\r
+                        break\r
+                # if self.record_pcm != None:\r
+                #     try:\r
+                #         self.record_pcm.stream_stop()\r
+                #         self.record_pcm.close()\r
+                #         self.record_pcm = None\r
+                #     except Exception as e:\r
+                #         usys.print_exception(e)\r
+        except Exception as e:\r
+            usys.print_exception(e)\r
+        self.VC_record_thread_close()#关闭录音线程\r
+        if self.AI_record_tmp_queue.empty() != True:\r
+            self.AI_record_tmp_queue.clear()\r
+        # try:\r
+        #     self.websocket_deconnect_asr()\r
+        # except Exception as e:\r
+        #     usys.print_exception(e)  \r
+        self.VC_record_state_flag = 0\r
+        print("VC_Speech_End VC_record_state_flag:{}!!!!!!!!".format(self.VC_record_state_flag))   \r
+    #关闭录音线程   \r
+    def VC_record_thread_close(self): \r
+        if self.VC_record_thread_id != 0:\r
+            count =50\r
+            while True:\r
+                count -= 1\r
+                if self.VC_record_thread_lock == 1:\r
+                    self.VC_record_thread_lock = 2\r
+                if self.VC_record_thread_lock == 0 or count <=0:\r
+                    break\r
+                else:\r
+                    print("VC_record_thread_thread going:{}...".format(count))\r
+                    utime.sleep_ms(1)\r
+            self.VC_record_thread_lock = 0\r
+            print("VC_record_thread_thread_close")\r
+            try:\r
+                _thread.stop_thread(self.VC_record_thread_id)\r
+            except Exception as e:\r
+                usys.print_exception(e)\r
+        self.VC_record_thread_id = 0\r
+    #获取录音数据\r
+    def VC_record_thread(self):\r
+        ##return\r
+        print("VC_record_thread start!!!!!!!!!!!!!!!!!!!!\r\n")\r
+        count = 0\r
+        # try:\r
+        #     uos.remove('/usr/test.pcm')\r
+        # except Exception as e:\r
+        #     usys.print_exception(e)\r
+        #record_data_queue = Queue(100)\r
+        #fd = open('/usr/test.pcm','w')\r
+        # if self.VC_record_TYPE == 1:\r
+        #     h_data= [0x23,0x21 ,0x41 ,0x4D ,0x52 ,0x0A ]\r
+        #     h_data_b = bytes(h_data)\r
+        #     self.AI_client_VC_send(h_data_b)\r
+        AI_record_tmp_queue_len = 0\r
+        while True:\r
+            try:\r
+                if self.VC_record_thread_lock == 2:\r
+                    break\r
+                self.VC_record_thread_lock = 1\r
+                # 死循环接收数据\r
+                #if self.VC_state ==  VC_State_SpeechStart:\r
+                Record_read_buf = bytearray(self.Audio_buf_size)\r
+                \r
+                Record_len = 0\r
+                if self.VC_record_TYPE == VC_record_TYPE_PCM:#pcm\r
+                    Record_len = self.record.stream_read(Record_read_buf, self.Audio_buf_size)\r
+                    utime.sleep_ms(20)\r
+                    \r
+                else :\r
+                    \r
+                    Record_len = self.record.stream_read(Record_read_buf, self.Audio_buf_size)\r
+                    utime.sleep_ms(600)\r
+\r
+                #Record_len = 1024*2\r
+                #print("VC_record_thread:{}".format(Record_len))\r
+                if Record_len > 0:\r
+                    read_buf = bytes(Record_read_buf[:Record_len])\r
+                    if self.record_data_save_flag == 1:\r
+                        if self.record_fd == None:\r
+                            try:\r
+                                uos.remove('/usr/record_data.pcm')\r
+                            except Exception as e:\r
+                                usys.print_exception(e)\r
+                            self.record_fd = open('/usr/record_data.pcm','w')\r
+                        if self.record_fd != None:\r
+                            self.record_fd.write(read_buf)\r
+                            print("write record:{}".format(len(read_buf)))\r
+                            # count+=Record_len\r
+                            # if count >150*1024:\r
+                            #     self.record_fd.close()\r
+                                #self.record_fd = None\r
+                    # if self.VC_record_state_flag >= 2:\r
+                    #     self.AI_client_asr_send(read_buf)\r
+                    \r
+                    if self.VC_record_state_flag <=1 :#没发送前先存起来\r
+                        self.AI_record_tmp_queue.put(read_buf)\r
+                        AI_record_tmp_queue_len += len(read_buf)\r
+                    else:\r
+                        AI_record_tmp_queue_len = 0\r
+                        while True:\r
+                            if self.AI_record_tmp_queue.empty() == True:\r
+                                break\r
+                            else:\r
+                                self.AI_client_VC_input_audio_buffer_append(self.AI_record_tmp_queue.get())\r
+                                #self.AI_client_asr_send(self.AI_record_tmp_queue.get())  #发送之前存的数据\r
+                        #self.AI_client_asr_send(read_buf)   \r
+                        self.AI_client_VC_input_audio_buffer_append(read_buf)\r
+                    #print("VC_record_thread:{}".format(len(read_buf)))\r
+                    #count+=len(read_buf)\r
+                # if count>=500*1024:#结束\r
+                #     self.AI_client_VC_end_speech()\r
+                #     break\r
+                # count+=1\r
+                # if count %10 == 0:\r
+                #     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)))\r
+                \r
+                # if self.VC_state >=  VC_State_SpeechEnd:\r
+                #     break\r
+                \r
+            except Exception as e:\r
+                    usys.print_exception(e)\r
+                    #break\r
+            self.VC_record_thread_lock = 0\r
+            utime.sleep_ms(100)\r
+        #fd.close()\r
+        print("VC_record_thread:exit")\r
+        self.VC_record_thread_id = 0#线程退出\r
+        self.VC_record_thread_lock = 0\r
+###################################################### VC ###################################################################################\r
+    def websocket_connect_VC(self):\r
+        print("websocket_connect_VC:{} e:{}!!!!!!!!!!!!!!!!!!!!!".format(self.AI_client_VC_isconnect,self.AI_client_VC_debug))\r
+        if self.AI_client_VC_isconnect == 1:\r
+            return\r
+        # 创建VC客户端\r
+        try:\r
+            signal = net.csqQueryPoll()\r
+            if signal == -1 or sim.getStatus() != 1:#网络正常\r
+                self.websocket_error()\r
+                return\r
+            try:\r
+                if "bot_name" in self.VC_TTS_voice_type[self.VC_TTS_voice_key]:\r
+                    self.bot_name = self.VC_TTS_voice_type[self.VC_TTS_voice_key]["bot_name"]\r
+                else:\r
+                    print("not bot_name!!!!!!!!!!!!!!!!!!!!!!")\r
+            except Exception as e:\r
+                usys.print_exception(e)\r
+            \r
+            # Headers = {'X-NLS-Token':'0c8b8f05a46f423096be64a9c4c46310'}\r
+            # self.AI_client_VC = uwebsocket.Client.connect('wss://nls-gateway-cn-beijing.aliyuncs.com/ws/v1',headers=Headers, debug=False)\r
+            \r
+            url="wss://ws.coze.cn/v1/chat?bot_id=7462617881076351002"\r
+            print("VC VC:url{}".format(url))\r
+            Headers = {"Authorization":"Bearer pat_SSaiOzccrRLaQEaB4sdshvHZQzqjeWD5jq2GWPVoWRx4N8XcdraHWYqdDjK5zpR1"}\r
+            self.AI_client_VC = uwebsocket.Client.connect(url, headers=Headers,debug=True)\r
+            #self.AI_WS_connect_Queue.put(self.AI_client_VC)\r
+\r
+       \r
+            print("websocket_connect_VC:OK!!!!!!!!!!!!!!!!!!!!!")\r
+        except Exception as e: #网络连接异常\r
+            usys.print_exception(e)\r
+            print("websocket_connect_VC error!!!\r\n")\r
+            str_error = str(e)\r
+            if str_error.find("[Errno 22] EINVAL")!= -1: \r
+                print("websocket_connect_VC:str_error:{}".format(str_error))\r
+                print("[Errno 22] EINVAL!!!\r\n")\r
+                print("[Errno 22] EINVAL!!!\r\n")\r
+                print("[Errno 22] EINVAL!!!\r\n")\r
+                print("[Errno 22] EINVAL!!!\r\n")\r
+                self.websocket_error()\r
+                EventMesh.publish("set_storage_config",["powerRestart",1])#调试临时关闭\r
+                utime.sleep_ms(1000)\r
+                self.aud.stopPlayStream()\r
+                self.aud.stopAll()\r
+                Power.powerRestart()\r
+                \r
+            self.websocket_error()\r
+            return\r
+        #print("AI_client_VC:{}".format(self.AI_client_VC))\r
+        if self.AI_client_VC == None:\r
+            EventMesh.publish("update_dev_token")#获取token\r
+            self.websocket_error()\r
+            return\r
+        self.AI_client_VC_debug+=1\r
+        utime.sleep_ms(10)\r
+        #self.AI_client_VC.settimeout(5)\r
+        #self.AI_VC_send_data_queue_thread_close()#关闭发送线程\r
+        if self.AI_VC_send_data_queue_thread_id == 0:    \r
+            _thread.stack_size(self.Audio_buf_size+8*1024)\r
+            self.AI_VC_send_data_queue_thread_id = _thread.start_new_thread(self.AI_VC_send_data_queue_thread, ())\r
+            _thread.stack_size(8*1024)\r
+            print("AI_VC_start :AI_VC_send_data_queue_thread_id :{} ".format(self.AI_VC_send_data_queue_thread_id))\r
+        self.AI_client_VC_recv_thread_close()#关闭读线程\r
+        # 线程接收数据\r
+        _thread.stack_size(self.Audio_buf_size+8*1024)\r
+        self.AI_client_VC_recv_id = _thread.start_new_thread(self.AI_client_VC_recv, (self.AI_client_VC,))\r
+        _thread.stack_size(8*1024)\r
+        self.AI_client_VC_isconnect = 1\r
+        print("websocket_connect_VC end")\r
+\r
+    def websocket_error(self,TTS_str=None):\r
+        print("websocket_error1!!!!")\r
+        self.Close()\r
+        print("websocket_error1.1!!!!")\r
+        print("websocket_error!!!!")\r
+        print("websocket_error!!!!")\r
+        self.VC_Thinking_timerout = 0\r
+        self.VC_satrt_flag = 0\r
+        self.AI_TTS_str = ""\r
+        self.AI_ASR_str = ""\r
+        self.AI_ASR_str_tmp = ""\r
+        self.AI_ASR_flag  = 0\r
+        self.VC_Speech_End()\r
+        EventMesh.publish("close_led")\r
+        if TTS_str == None:\r
+            self.websocket_error_count+=1\r
+            # if self.websocket_error_count <=3:\r
+            #     EventMesh.publish("audio_montage_play",["xinhaoruo1.mp3"])\r
+            if self.websocket_error_count <10 :\r
+                EventMesh.publish("audio_montage_play",["xinhaoruo1.mp3"])\r
+            elif self.websocket_error_count >=10:\r
+                EventMesh.publish("paly_iccid_imei")    \r
+            # else:\r
+            #     EventMesh.publish("audio_montage_play",["R_SIM_FAILE.mp3"])\r
+            #self.aud.play(1,1,'U:/static/R_SIM_FAILE.mp3')\r
+            if self.websocket_error_count <3 :\r
+                utime.sleep_ms(3000)\r
+                EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_VC_start})\r
+        else:\r
+            print("websocket_error:tts:{}".format(TTS_str))\r
+            self.AI_TTS_str = TTS_str\r
+            EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_VC_start})\r
+        print("websocket_error2")\r
+       \r
+        \r
+        print("websocket_error4")\r
+        \r
+\r
+    def websocket_deconnect_VC(self):\r
+        #print("websocket_deconnect_VC {}!!!!!!!".format(self.AI_client_VC_isconnect))\r
+        print("websocket_deconnect_VC!!!!!!!")\r
+        self.AI_client_VC_recv_thread_close()#关闭读线程\r
+        self.AI_client_VC_recv_id = 0\r
+        if self.AI_client_VC_isconnect == 1 or self.AI_client_VC!=None:\r
+            try:\r
+                self.AI_client_VC_isconnect = 0\r
+                count = 500\r
+                while True:#等待发完数据\r
+                    count-=1\r
+                    if count <=0 or self.AI_VC_send_data_queue_thread_lock == 0:\r
+                        break\r
+                    utime.sleep_ms(1)\r
+                \r
+                try:\r
+                    self.AI_client_VC.close()\r
+                    self.AI_client_VC_debug -=1\r
+                    #self.AI_client_VC=None\r
+                except Exception as e:\r
+                    usys.print_exception(e)\r
+                    try :\r
+                        self.AI_client_VC.close()\r
+                        self.AI_client_VC_debug -=1\r
+                        #self.AI_client_VC=None\r
+                    except Exception as e:\r
+                        usys.print_exception(e)\r
+                try :\r
+                    self.AI_client_VC._close()\r
+                except Exception as e:\r
+                    usys.print_exception(e)\r
+                self.AI_client_VC = None\r
+            except Exception as e:\r
+                usys.print_exception(e)\r
+        print("websocket_deconnect_VC {}!!!!!!!".format(self.AI_client_VC_isconnect))\r
+    #websocket发送ping\r
+    def AI_client_VC_ping(self):\r
+        pass\r
+        if self.AI_client_VC_isconnect == 1:\r
+            #self.AI_client_VC.write_frame(0x09,b'ping ping')\r
+            self.AI_client_VC_send("ping")\r
+            #print("websocket ping ping")\r
+\r
+    #websocket发送数据    \r
+    def AI_client_VC_send(self,data_str):\r
+        # if isinstance(data_str, str):#是字符串\r
+        #     print("AI_client_VC_send:{}".format(data_str))\r
+        #     pass\r
+        # else:\r
+        #     print("AI_client_VC_send:len{}".format(len(data_str)))\r
+        self.AI_VC_send_data_queue.put([AI_client_VC_num,data_str]) \r
+     #关闭数据发送线程\r
+    def AI_VC_send_data_queue_thread_close(self):\r
+        if self.AI_VC_send_data_queue_thread_id != 0:\r
+            count =500\r
+            while True:\r
+                count -= 1\r
+                if self.AI_VC_send_data_queue_thread_lock == 0 or count <=0:\r
+                    break\r
+                else:\r
+                    self.AI_VC_send_data_queue_thread_lock = 2\r
+                    print("AI_VC_send_data_queue_thread going:{}...".format(count))\r
+                    utime.sleep_ms(1)\r
+                    if self.AI_VC_send_data_queue.empty()!=True:\r
+                        self.AI_VC_send_data_queue.clear()\r
+            self.AI_VC_send_data_queue_thread_lock = 0\r
+            print("AI_VC_send_data_queue_thread_close")\r
+            try:\r
+                _thread.stop_thread(self.AI_VC_send_data_queue_thread_id)\r
+            except Exception as e:\r
+                usys.print_exception(e)\r
+        self.AI_VC_send_data_queue_thread_id = 0\r
+    #发送数据队列\r
+    def AI_VC_send_data_queue_thread(self):\r
+        print("AI_VC_send_data_queue_thread:start")\r
+        count_t = 0\r
+        while True:\r
+            if self.AI_VC_send_data_queue_thread_lock == 2:\r
+                print("AI_VC_send_data_queue_thread,该退出了")\r
+                break  \r
+            if self.AI_VC_send_data_queue.empty() :#不能去掉,去掉会卡死\r
+                self.AI_VC_send_data_queue_thread_lock = 0  \r
+                count_t+=1\r
+                # if count_t%200 == 0:\r
+                #     print("self.AI_VC_send_data_queue.empty")\r
+                utime.sleep_ms(1)\r
+            else:\r
+                #data[0]是websocket连接对象编号,data[1]是数据\r
+                #print("AI_VC_send_data_queue_thread:get")\r
+                \r
+                self.AI_VC_send_data_queue_thread_lock = 1\r
+                data = self.AI_VC_send_data_queue.get()\r
+                \r
+                \r
+                #print("AI_VC_send_data_queue_thread:num{} len{}".format(data[0],len(data[1])))\r
+                if data != None:\r
+                    try:\r
+                        #data["func"](data["data"])\r
+                        # 发送数据\r
+                        #bytes_data = bytes(data[1])\r
+                        #data[0].send(data[1])\r
+                        #print("AI_VC_send_data_queue_thread:len:{}".format(len(data[1])))\r
+                        #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)))\r
+                        if data[0] == AI_client_VC_num:\r
+                            self.VC_pingping_timerout = 0\r
+                            if isinstance(data[1], str):#是字符串\r
+                                if len(data[1])<600:\r
+                                    print("VC VC: send_data:{}".format(data[1]))\r
+                                else:\r
+                                    pass\r
+                                    #print("VC VC: send_data:{}...".format(data[1][:300]))\r
+                            #print("VC: send_data len:{}".format(len(data[1])))\r
+                            if self.AI_client_VC != None and self.AI_client_VC_isconnect == 1:\r
+                                self.AI_client_VC.send(data[1])\r
+                            else:\r
+                                print("VC VC: send_data:ERROR:{}".format(data[1]))\r
+                            #print("VC: send_data end")\r
+    \r
+                        #print("VC: send_data end")\r
+                    except Exception as e:\r
+                        print("DeviceInfo_queue_thread:ERROR:{}".format(e))\r
+                        usys.print_exception(e)\r
+                        if data[0] == AI_client_VC_num:\r
+                            #self.websocket_error()\r
+                            pass\r
+\r
+                            \r
+                            try:\r
+                                if self.AI_client_VC_isconnect != 0:\r
+                                    print("VC发送数据错误,退出")\r
+                                    EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_error,"data":"VC发送出错了,请重试"}) \r
+                                    self.ud_error(["VC",self.VC_taskid])\r
+                            except Exception as e: #网络连接异常\r
+                                usys.print_exception(e)\r
+\r
+                    utime.sleep_ms(1)\r
+        self.AI_VC_send_data_queue_thread_lock = 0              \r
+    #VC关闭读线程\r
+    def AI_client_VC_recv_thread_close(self):\r
+        if self.AI_client_VC_recv_id != 0:\r
+            count =500\r
+            while True:\r
+                count -= 1\r
+                if self.AI_client_VC_recv_lock == 1:\r
+                    self.AI_client_VC_recv_lock = 2\r
+                if self.AI_client_VC_recv_lock == 0 or count <=0:\r
+                    break\r
+                else:\r
+                    print("AI_client_VC_recv_thread going:{}...".format(count))\r
+                    utime.sleep_ms(1)\r
+            self.AI_client_VC_recv_lock = 0\r
+            print("AI_client_VC_recv_thread_close")\r
+            try:\r
+                _thread.stop_thread(self.AI_client_VC_recv_id)\r
+            except Exception as e:\r
+                usys.print_exception(e)\r
+        self.AI_client_VC_recv_id = 0\r
+    #Ai VC websocket返回数据       \r
+    def AI_client_VC_recv(self,cli):\r
+        count = 0\r
+\r
+        while True:\r
+            try:\r
+                # 死循环接收数据\r
+                self.AI_client_VC_recv_lock = 0\r
+                if self.is_VC_ACK == 1:\r
+                    self.AI_client_VC_Read()\r
+                #EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_client_VC_Read})\r
+                count+=1\r
+                if self.VC_state >= VC_State_TTSStart and (self.tts_in_data_len - self.tts_out_data_len > 64*1024 or count>5):\r
+                    count = 0\r
+                    utime.sleep_ms(1)\r
+                if self.VC_state < VC_State_TTSStart:\r
+                    utime.sleep_ms(1)\r
+                recv_data = cli.recv()\r
+                if self.AI_client_VC_recv_lock == 2:\r
+                    print("AI_client_VC_recv 该退出了")\r
+                    break\r
+                self.AI_client_VC_recv_lock = 1\r
+                self.close_timerout = 0#服务器有返回清零退出时间\r
+                if recv_data == "websocket close":\r
+                    # 服务器关闭连接\r
+                    print("VC 服务器关闭连接!!!!!!!!!!!!!!!!!!!!!!!!!!!")\r
+                    #self.AI_client_VC_isconnect = 0\r
+                    #self.websocket_deconnect_VC()\r
+                    #EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_deconnect_asr}) \r
+                    # #EventMesh.publish("publish_AI_btnInfo",{"func":utime.sleep_ms,'data':(1500)})\r
+                    #EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_connect_asr}) \r
+                    EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_error,"data":"VC连接断开了,请重试"}) \r
+                    self.ud_error(["VC",self.VC_taskid])\r
+                    break\r
+                elif recv_data == "":#客户端关闭连接\r
+                    print("VC VC :客户端关闭连接")\r
+                    EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_error,"data":"VC连接断开了,请重试"}) \r
+                    self.ud_error(["VC",self.VC_taskid])\r
+                    break\r
+                try:\r
+                    self.websocket_error_count = 0\r
+                    if isinstance(recv_data, str):#返回的是字符串\r
+                        if len(recv_data)<300:\r
+                            print("VC VC:recv_data:{}".format(recv_data))\r
+                        else:\r
+                            print("VC VC:recv_data long :{}".format(recv_data[:300]))\r
+                        jsload_data =  ujson.loads(recv_data)\r
+                        #print("AI_client_VC_recv jsload_data = {}".format(jsload_data))\r
+                        if jsload_data["event_type"] == "chat.updated" :#会话开始\r
+                            print("VC:Started!!!!!!!!\r\n")\r
+                            print("VC:Started!!!!!!!!\r\n")\r
+                            print("VC:Started!!!!!!!!\r\n")\r
+                            \r
+                            self.AI_client_VC_send_speech()#开始上传语音\r
+                        elif jsload_data["event_type"] == "conversation.audio_transcript.update" :#音频转译\r
+                            self.VC_Speech_end_timerout = 2\r
+                            self.AI_ASR_str = jsload_data["data"]['content']\r
+                            if self.AI_ASR_str.find("。") != -1 or self.AI_ASR_str.find("?") != -1 or self.AI_ASR_str.find("!") != -1:\r
+                                self.VC_Speech_end_timerout = 0\r
+                                self.AI_client_VC_end_speech()#发送说话终止\r
+\r
+                        elif jsload_data["event_type"] == "conversation.chat.created" :#开始对话    \r
+                            self.open_play_flag = 0\r
+                            if self.play_data_save_flag == 1:\r
+                                try:\r
+                                    uos.remove('/usr/play_data.pcm')\r
+                                except Exception as e:\r
+                                    usys.print_exception(e)\r
+                                self.play_fd = open('/usr/play_data.pcm','w')\r
+                        \r
+                        elif  jsload_data["event_type"] == "conversation.message.delta":#返回大模型回答数据\r
+                            if self.open_play_flag == 0:\r
+                                EventMesh.publish("publish_AI_btnInfo",{"func":self.VC_Play_Start})#打开播放\r
+                                self.open_play_flag =1\r
+                        elif  jsload_data["event_type"] == "conversation.audio.delta":#下发音频数据\r
+                            \r
+                            audio_data = ubinascii.a2b_base64(jsload_data["data"]['content'])\r
+                            print("下发音频数据1:{}".format(len(audio_data)))\r
+                            EventMesh.publish("publish_AI_btnInfo",{"func":self.put_record_data,"data":[audio_data,""]}) \r
+                            if self.play_data_save_flag == 1:\r
+                                if self.play_fd !=None:\r
+                                    self.play_fd.write(audio_data)\r
+                        elif  jsload_data["event_type"] == "conversation.audio.completed":#结束播放\r
+                            if self.play_data_save_flag == 1:\r
+                                if self.play_fd !=None:\r
+                                    print("输出音频文件关闭")\r
+                                    self.play_fd.close()\r
+\r
+                        # elif jsload_data["event"]  == "SpeechContent" :#asr转译\r
+                        #     print("VC:SpeechContent!!!!!!!!\r\n")\r
+                        #     payload = jsload_data["payload"]\r
+                            \r
+                            \r
+                        #     if(payload['finished'] == True):#asr结束\r
+                        #         self.VC_state =  VC_State_SpeechEnd\r
+                        #         #self.VC_Speech_End()#停止录音\r
+                        #         text = payload["text"]\r
+                        #         if self.check_text(text) == 0:\r
+                        #             if self.AI_VC_send_data_queue.empty()!=True:\r
+                        #                 self.AI_VC_send_data_queue.clear()\r
+                        #             if self.AI_ASR_send_data_queue.empty()!=True:\r
+                        #                 self.AI_ASR_send_data_queue.clear()\r
+                        #             self.AI_ASR_send_buf_len = 0\r
+                        #             EventMesh.publish("open_led_all")\r
+                        #             try:\r
+                        #                 EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_deconnect_VC}) \r
+                        #                 EventMesh.publish("publish_AI_btnInfo",{"func":self.VC_Speech_End}) \r
+                                        \r
+                        #                 # EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_deconnect_asr})\r
+                        #                 EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_VC_start}) \r
+                        #             except Exception as e:\r
+                        #                 usys.print_exception(e)\r
+                                \r
+                        #         pass\r
+                        #     else:\r
+                        #         pass\r
+\r
+                        # elif jsload_data["event"]  == "SpeechEnded" :#服务器下发ASR说话结束\r
+                        #     self.VC_state =  VC_State_SpeechEnd\r
+                        # elif jsload_data["event"]  == "RespondingContent" :#chat回答      \r
+                        #     pass\r
+                            \r
+                        # elif jsload_data["event"]  == "RespondingStarted" :#音频开始下发\r
+                        #     self.play_flag = 0\r
+                        #     self.VC_state = VC_State_TTSStart\r
+                        #     if self.is_long_record == 0:\r
+                        #         EventMesh.publish("publish_AI_btnInfo",{"func":self.VC_Speech_End})#\r
+                        #     else:\r
+                        #         self.AI_ASR_str_tmp = ""\r
+                        #         self.AI_ASR_str = ""\r
+                        #     EventMesh.publish("publish_AI_btnInfo",{"func":self.VC_Play_Start})\r
+                        #     self.VC_Thinking_timerout = 0#关闭超时重试\r
+                        #     # self.VC_Play_Start()\r
+                        #     EventMesh.publish("open_led_green")#绿色\r
+                        #     #self.tts_fd = open('/usr/tts_tesr.pcm','w')\r
+                        #     if self.play_data_save_flag == 1:\r
+                        #         try:\r
+                        #             uos.remove('/usr/play_data.pcm')\r
+                        #         except Exception as e:\r
+                        #             usys.print_exception(e)\r
+                        #         self.play_fd = open('/usr/play_data.pcm','w')\r
+                            \r
+                        #     pass\r
+                        # elif jsload_data["event"]  == "RespondingEnded" :#音频下发结束\r
+                        #     #if self.VC_state == VC_State_TTSStart:\r
+                            \r
+                        #     print("RespondingEnded!!!!!!" )\r
+                        #     self.VC_state = VC_State_TTSEnd\r
+                        #     self.LocalRespondingEnded_timerout = 10 #最长倒数10秒发送音频结束或者终止对话\r
+                        #     if self.VC_mode == 0 :#连续问答模式\r
+                        #         #EventMesh.publish("publish_AI_btnInfo",{"func":self.VC_Speech_End})#调试临时打开\r
+                        #         if dev_type != "7PIN_BK":\r
+                        #             EventMesh.publish("publish_AI_btnInfo",{"func":self.VC_Speech_Start})#开始录音 \r
+                        #         pass\r
+                        #     if self.play_data_save_flag == 1:\r
+                        #         if self.play_fd !=None:\r
+                        #             self.play_fd.close()\r
+                        #     #self.tts_fd.close()\r
+                        #     #pass\r
+                        # elif jsload_data["event"]  == "DialogStateChanged" :#状态切换事件\r
+                        #     payload = jsload_data["payload"]\r
+                        #     if payload["state"] == "Listening":#可以说了\r
+                        #         self.VC_state = VC_State_Listening\r
+                        #         if self.AI_TTS_str != "" or self.AI_ASR_str != "":#有tts数据,则请求TTS数据,没有就请求开始上传语音\r
+                        #             self.AI_client_VC_RequestToRespond()\r
+                        #         else:\r
+                        #             pass\r
+                        #             #self.VC_Speech_Start()#开启线程获取录音数据\r
+                        #             if self.is_long_record == 0:\r
+                        #                 EventMesh.publish("publish_AI_btnInfo",{"func":self.VC_Speech_Start})#\r
+                        #             #self.AI_client_VC_send_speech()#开始上传语音\r
+                                \r
+                        #         #EventMesh.publish("open_led_red")\r
+                        #     if payload["state"] == "Thinking":#思考\r
+                        #         self.VC_state = VC_State_Thinking\r
+                        #         if self.VC_Thinking_timerout == 0:\r
+                        #             self.VC_Thinking_timerout = 15#倒计时15秒,如果没有音频数据返回就重试\r
+                        #         EventMesh.publish("open_led_red_green")#黄色\r
+                        #     if payload["state"] == "Responding":#开始音频播放\r
+                        #         #self.VC_state = VC_State_Responding#\r
+                        #         pass\r
+                        # elif jsload_data["event"]  == "RequestAccepted" :#请求上传语音被允许\r
+                        #     #self.VC_state =  VC_State_Responding\r
+                        #     #self.AI_client_VC_send_speech()#开始上传语音\r
+                        #     pass\r
+                    else:#下发音频数据\r
+                        #self.AI_ASR_str = ""#下发音频后清掉asr结果\r
+                        \r
+                        print("下发音频数据1:{}".format(len(recv_data)))\r
+                        \r
+                        if self.play_data_save_flag == 1:\r
+                            if self.play_fd !=None:\r
+                                self.play_fd.write(recv_data)\r
+                        # print("下发音频数据2:{}".format(len(recv_data)))\r
+                        if self.VC_state >= VC_State_TTSStart:\r
+                            #self.put_record_data([recv_data,""])\r
+                            EventMesh.publish("publish_AI_btnInfo",{"func":self.put_record_data,"data":[recv_data,""]}) \r
+                        utime.sleep_ms(1)\r
+                except Exception as e:\r
+                    usys.print_exception(e)\r
+                \r
+            except Exception as e:\r
+                    \r
+                    error_str = str(e)\r
+                    #print("VC VC:e:{}".format(error_str))\r
+                    if error_str.find("[Errno 110] ETIMEDOUT")!= -1:\r
+                        #print("VC VC:recv TIMEDOUT 正常")\r
+                        pass\r
+                    else:\r
+                        usys.print_exception(e)\r
+                        #self.websocket_error()\r
+                        print("VC VC :读数据报错,退出")\r
+                        EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_error,"data":"VC出错了,请重试"}) \r
+                        self.ud_error(["VC",self.VC_taskid])\r
+                        break\r
+        self.AI_client_VC_isconnect = 0\r
+        self.AI_client_VC_recv_id = 0 \r
+        self.AI_client_VC_recv_lock = 0\r
+        print("AI_client_VC_recv END!!!!!!!!!!!!!!!!!!!!!!!!!!!")\r
+    def put_record_data(self,data):\r
+        #print("下发音频数据1:{}".format(len(data[0])))\r
+        ret=self.AI_audio_queue.put(data)\r
+        self.tts_in_data_len += len(data[0])\r
+        #print("下发音频数据2:{},{}".format(len(data[0]),self.tts_in_data_len))\r
+    def check_text(self,text):\r
+        if len(text)>60:\r
+            return -1\r
+        try:\r
+            if isinstance(text, str): \r
+                if text.find("声音") != -1 and text.find("改") != -1:\r
+                    try:\r
+                        for key in self.VC_TTS_voice_type:\r
+                            if  text.find(key) != -1 :\r
+                                self.VC_TTS_voice_key = key\r
+                                EventMesh.publish("set_storage_config",["VC_TTS_voice_key",self.VC_TTS_voice_key])\r
+                                self.AI_TTS_str = "更改成功" \r
+                                return 0\r
+                    except Exception as e:\r
+                        usys.print_exception(e)    \r
+                    if  text.find("男") != -1 :\r
+                        if "男" in self.VC_TTS_voice_type:\r
+                            self.VC_TTS_voice_key = "男"\r
+                            EventMesh.publish("set_storage_config",["VC_TTS_voice_key",self.VC_TTS_voice_key])\r
+                            # EventMesh.publish("audio_montage_play",["peizhichenggong.mp3"])\r
+                            #self.aud.play(1,0,'U:/static/peizhichenggong.mp3')#切换成功\r
+                            self.AI_TTS_str = "更改成功" \r
+                            return 0\r
+                    if text.find("女") != -1 :\r
+                        if "女" in self.VC_TTS_voice_type:\r
+                            self.VC_TTS_voice_key = "女"\r
+                            EventMesh.publish("set_storage_config",["VC_TTS_voice_key",self.VC_TTS_voice_key])\r
+                            # EventMesh.publish("audio_montage_play",["peizhichenggong.mp3"])\r
+                            #self.aud.play(1,0,'U:/static/peizhichenggong.mp3')#切换成功\r
+                            self.AI_TTS_str = "更改成功" \r
+                            return 0\r
+                    if text.find("同声") != -1 or text.find("童") != -1 :\r
+                        if "童" in self.VC_TTS_voice_type:\r
+                            self.VC_TTS_voice_key = "童"\r
+                            EventMesh.publish("set_storage_config",["VC_TTS_voice_key",self.VC_TTS_voice_key])\r
+                            # EventMesh.publish("audio_montage_play",["peizhichenggong.mp3"])\r
+                            #self.aud.play(1,0,'U:/static/peizhichenggong.mp3')#切换成功\r
+                            self.AI_TTS_str = "更改成功" \r
+                            return 0\r
+                    if text.find("粤") != -1 or text.find("越野") != -1 or text.find("广东话") != -1:\r
+                        if "粤" in self.VC_TTS_voice_type:\r
+                            self.VC_TTS_voice_key = "粤"\r
+                            EventMesh.publish("set_storage_config",["VC_TTS_voice_key",self.VC_TTS_voice_key])\r
+                            # EventMesh.publish("audio_montage_play",["peizhichenggong.mp3"])\r
+                            #self.aud.play(1,0,'U:/static/peizhichenggong.mp3')#切换成功\r
+                            self.AI_TTS_str = "更改成功" \r
+                            return 0\r
+                    if text.find("四川") != -1 :\r
+                        if "四川" in self.VC_TTS_voice_type:\r
+                            self.VC_TTS_voice_key = "四川"\r
+                            EventMesh.publish("set_storage_config",["VC_TTS_voice_key",self.VC_TTS_voice_key])\r
+                            # EventMesh.publish("audio_montage_play",["peizhichenggong.mp3"])\r
+                            #self.aud.play(1,0,'U:/static/peizhichenggong.mp3')#切换成功\r
+                            self.AI_TTS_str = "更改成功" \r
+                            return 0\r
+                    if text.find("个性") != -1 :\r
+                        if "个性" in self.VC_TTS_voice_type:\r
+                            self.VC_TTS_voice_key = "个性"\r
+                            EventMesh.publish("set_storage_config",["VC_TTS_voice_key",self.VC_TTS_voice_key])\r
+                            # EventMesh.publish("audio_montage_play",["peizhichenggong.mp3"])\r
+                            #self.aud.play(1,0,'U:/static/peizhichenggong.mp3')#切换成功\r
+                            self.AI_TTS_str = "更改成功" \r
+                            return 0\r
+                    if text.find("英语") != -1 :\r
+                        if "英语" in self.VC_TTS_voice_type:\r
+                            self.VC_TTS_voice_key = "英语"\r
+                            EventMesh.publish("set_storage_config",["VC_TTS_voice_key",self.VC_TTS_voice_key])\r
+                            # EventMesh.publish("audio_montage_play",["peizhichenggong.mp3"])\r
+                            #self.aud.play(1,0,'U:/static/peizhichenggong.mp3')#切换成功\r
+                            self.AI_TTS_str = "更改成功" \r
+                            return 0\r
+                    self.AI_TTS_str = "更改失败,没找到对应声音" \r
+                    return 0\r
+                if text.find("切换对话模式") != -1:\r
+                    if self.VC_mode == 0:\r
+                       self.VC_mode = 1\r
+                       self.AI_TTS_str = "已切换到单对话模式" \r
+                    else:\r
+                        self.VC_mode = 0 \r
+                        self.AI_TTS_str = "已切换到长对话模式" \r
+                    EventMesh.publish("set_storage_config",["VC_mode",self.VC_mode])\r
+                    # EventMesh.publish("audio_montage_play",["peizhichenggong.mp3"])\r
+                    #self.aud.play(1,0,'U:/static/peizhichenggong.mp3')#切换成功\r
+\r
+                    return 0\r
+                if text.find("音量") != -1:\r
+                    if  text.find("加") != -1 :\r
+                        self.VC_TTS_volume += 10\r
+                        if self.VC_TTS_volume > 100:\r
+                            #EventMesh.publish("audio_montage_play",["yinliangyizuida.mp3"])\r
+                            #self.aud.play(1,0,'U:/static/yinliangyizuida.mp3')#音量已最大\r
+                            self.AI_TTS_str = "音量已最大" \r
+                            self.VC_TTS_volume = 100\r
+                        else:\r
+                            self.aud.setVolume(self.VC_TTS_volume //10)\r
+                            EventMesh.publish("set_storage_config",["VC_TTS_volume",self.VC_TTS_volume])\r
+                            #EventMesh.publish("audio_montage_play",["peizhichenggong.mp3"])\r
+                            #self.aud.play(1,0,'U:/static/peizhichenggong.mp3')#配置成功\r
+                            self.AI_TTS_str = "配置成功,当前音量 {}".format(self.VC_TTS_volume)\r
+                            \r
+                        return 0\r
+                    if text.find("减") != -1:\r
+                        self.VC_TTS_volume -= 10\r
+                        if self.VC_TTS_volume < 0:\r
+                            self.VC_TTS_volume = 0\r
+                            #EventMesh.publish("audio_montage_play",["yinliangyizuixiao.mp3"])\r
+                            #self.aud.play(1,0,'U:/static/yinliangyizuixiao.mp3')#音量已最小\r
+                            self.AI_TTS_str = "音量已最小"\r
+                        else:\r
+                            self.aud.setVolume(self.VC_TTS_volume //10)\r
+                            EventMesh.publish("set_storage_config",["VC_TTS_volume",self.VC_TTS_volume])\r
+                            #EventMesh.publish("audio_montage_play",["peizhichenggong.mp3"])\r
+                            #self.aud.play(1,0,'U:/static/peizhichenggong.mp3')#配置成功\r
+                            self.AI_TTS_str = "配置成功,当前音量 {}".format(self.VC_TTS_volume)\r
+                        return 0\r
+                \r
+                if text.find("进入工厂模式") != -1 :\r
+                    self.factory_mode()\r
+                    return 1\r
+                if text.find("查询") != -1:\r
+\r
+                    if text.find("信号") != -1 :\r
+                        signal = net.csqQueryPoll()\r
+                        \r
+                        self.AI_TTS_str = "当前信号{}".format(signal)\r
+                        return 0\r
+                    if text.find("电量") != -1 :\r
+                        battery = EventMesh.publish("get_battery")\r
+                        print("电量查询:{}".format(battery))\r
+                        #EventMesh.publish("audio_montage_play",["dianliangshengyu{}.mp3".format(battery)])\r
+                        #self.aud.play(1,0,'U:/static/dianliangshengyu{}.mp3'.format(battery))#电量剩余\r
+                        self.AI_TTS_str = "电量剩余百分之{}".format(battery)\r
+                        return 0\r
+                    if text.find("电压") != -1 :\r
+                        Vbatt = Power.getVbatt()\r
+                        #EventMesh.publish("audio_montage_play",["dianliangshengyu{}.mp3".format(battery)])\r
+                        #self.aud.play(1,0,'U:/static/dianliangshengyu{}.mp3'.format(battery))#电量剩余\r
+                        self.AI_TTS_str = "当前电池电压{}".format(Vbatt)\r
+                        return 0\r
+\r
+                    if text.find("卡号") != -1 :\r
+                        iccid = sim.getIccid()\r
+                        if iccid != -1 and len(iccid) > 5:\r
+                            print("iccid{}".format(iccid))\r
+                            self.AI_TTS_str = "当前卡号为:{}".format(iccid)\r
+                        else:\r
+                            self.AI_TTS_str = "卡号查询失败"\r
+                        return 0\r
+                    if text.find("设备号") != -1 :\r
+                        imei = modem.getDevImei()\r
+                        if imei != -1 and len(imei) > 5:\r
+                            print("IMEI:{}".format(imei))\r
+                            self.AI_TTS_str = "当前设备号为:{}".format(imei)\r
+                        else:\r
+                            self.AI_TTS_str = "设备号查询失败"\r
+                        return 0\r
+                    if text.find("版本") != -1 :\r
+                        sourceVersion = versions.Build_Time\r
+                        self.AI_TTS_str ="Mr-Seven-"+sourceVersion\r
+                        return 0\r
+                    if text.find("服务器地址") != -1 :\r
+                        self.AI_TTS_str ="服务器地址"+self.server_ip\r
+                        return 0\r
+                if text.find("升级") != -1 and (text.find("OTA") != -1 or text.find("ota") != -1):\r
+                    if self.ai_OTA.min_sys_ota()==1:\r
+                        self.AI_TTS_str = "有新版本,准备开始升级,升级过程会多次重启设备,请保证流量充足及电量充足"\r
+                    else:\r
+                        self.AI_TTS_str = "当前已是最新版本"\r
+                    return 0\r
+                \r
+                if len(text)<12 and (text.find("再见") != -1 or text.find("拜拜") != -1):\r
+                    EventMesh.publish("publish_AI_btnInfo",{"func":self.Close}) \r
+                    return 1\r
+        except Exception as e:\r
+                usys.print_exception(e)\r
+        return -1\r
+    #获取trace_id\r
+    def get_trace_id(self):\r
+        t = utime.mktime(utime.localtime())\r
+        t = t*1000+urandom.randint(0, 1000)\r
+        md5_data = "{}".format(t)#md5签名\r
+        sign_data = ""\r
+        hash_obj = uhashlib.md5(md5_data)\r
+        res = hash_obj.digest()\r
+\r
+        # 转成十六进制表示\r
+        sign_data = ubinascii.hexlify(res)\r
+        sign_data = sign_data.decode('ascii')\r
+        return sign_data\r
+    \r
+    def get_session_id(self,data = "session_id"):\r
+        t = utime.mktime(utime.localtime())\r
+        t = t*1000+urandom.randint(0, 1000)\r
+        md5_data = "{}{}".format(data,t)#md5签名\r
+        sign_data = ""\r
+        hash_obj = uhashlib.md5(md5_data)\r
+        res = hash_obj.digest()\r
+\r
+        # 转成十六进制表示\r
+        sign_data = ubinascii.hexlify(res)\r
+        sign_data = sign_data.decode('ascii')\r
+        return sign_data\r
+    \r
+    def get_new_message_id(self):\r
+        message_id = self.get_trace_id()+"aaa"+self.get_trace_id()\r
+        self.VC_message_id=message_id[:32]\r
+        return self.VC_message_id \r
+    def get_new_task_id(self):\r
+        task_id = self.get_trace_id()+"aaa"+self.get_trace_id()\r
+        self.VC_task_id=task_id[:32]\r
+        return self.VC_task_id\r
+    #开始播放声音\r
+    def VC_Play_Start(self):\r
+        self.tts_in_data_len = 0\r
+        self.tts_out_data_len = 0\r
+        if self.VC_play_TYPE == VC_play_TYPE_PCM:\r
+            # if self.VC_play_samplerate == 8000:\r
+            #     pass\r
+            # elif self.VC_play_samplerate == 16000:\r
+            #     if self.play_pcm == None:        \r
+            #         self.play_pcm = audio.Audio.PCM(0,1,16000,1,1,2)\r
+            #         #self.play_pcm.setVolume(11)\r
+            #         ret = self.play_pcm.stream_write_start()\r
+            #         print("self.record_pcm.stream_write_start:ret:{}".format(ret))\r
+            if self.play_pcm == None:\r
+                self.play_pcm = audio.Audio.PCM(0,1,self.VC_play_samplerate,1,1,2)\r
+                #self.play_pcm.setVolume(11)\r
+            ret = self.play_pcm.stream_write_start()\r
+            print("音频初始化:self.record_pcm.stream_write_start:ret:{}".format(ret))       \r
+        elif self.VC_play_TYPE == VC_play_TYPE_MP3:\r
+            pass\r
+    #停止播放声音\r
+    def VC_Play_End(self):\r
+        if self.VC_play_TYPE == VC_play_TYPE_PCM:\r
+            if self.VC_play_samplerate == 8000:\r
+                self.aud.stopPlayStream()\r
+                self.aud.stopAll()\r
+            else:\r
+                if self.play_pcm != None:\r
+                    print("Close:play_pcm.close()!!!!!!!!!!!!!!!!!!")\r
+                    try:\r
+                        self.play_pcm.stream_stop()\r
+                        self.play_pcm.close()\r
+                    except Exception as e:\r
+                        usys.print_exception(e)\r
+                    self.play_pcm=None\r
+                self.aud.stopPlayStream()\r
+                self.aud.stopAll()\r
+        elif self.VC_play_TYPE == VC_play_TYPE_MP3:\r
+            self.aud.stopPlayStream()\r
+            self.aud.stopAll()\r
+   \r
+    def _1S_timer_cb(self,*argc):\r
+        EventMesh.publish("publish_AI_btnInfo",{"func":self._1S_timer_cb_}) \r
+\r
+    def _1S_timer_cb_(self):    \r
+    \r
+        EventMesh.publish("system_sleep_rest")#防止黑屏\r
+        self.close_timerout += 1\r
+        if self.close_timerout > 60:#20秒没数据就close\r
+            \r
+            if self.VC_state >= VC_State_SpeechIng:\r
+                print("接口无响应,超时退出")\r
+                EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_error,"data":"接口超时了。请重试"}) \r
+                self.ud_error(["VC",self.VC_taskid])\r
+            else:\r
+                EventMesh.publish("publish_AI_btnInfo",{"func":self.Close}) \r
+        # print("get_audio_state !!!!!{} {} {}\r\n".format(self.play_end,EventMesh.publish("get_audio_state"),self.play_flag))\r
+        if self.LocalRespondingEnded_timerout>0  :#\r
+            self.LocalRespondingEnded_timerout -= 1\r
+            print("LocalRespondingEnded_timerout:{}".format(self.LocalRespondingEnded_timerout))\r
+            if self.LocalRespondingEnded_timerout <= 0 or (self.play_pcm != None and self.play_pcm.stream_is_empty() == 1) :#超时或者音频播放完,\r
+                self.LocalRespondingEnded_timerout = 0\r
+                if self.VC_mode == 1 :#长按单次问答模式\r
+                    EventMesh.publish("publish_AI_btnInfo",{"func":self.Close}) \r
+                else:\r
+                    EventMesh.publish("publish_AI_btnInfo",{"func":self.VC_Speech_Start})#开始录音\r
+                    #通知服务器播放结束\r
+                    self.AI_client_VC_LocalRespondingEnded()\r
+        self.VC_pingping_timerout+=1\r
+        if self.VC_pingping_timerout>3:\r
+            self.VC_pingping_timerout=0\r
+            #self.AI_client_VC_ping()\r
+        self.asr_pingping_timerout += 1\r
+        if self.asr_pingping_timerout>3:\r
+            self.asr_pingping_timerout=0\r
+            self.AI_client_asr_ping()    \r
+        if self.VC_Thinking_timerout > 0 and self.VC_Thinking_timerout < 100:#VC Thinking超时后重新开始\r
+            print("VC_Thinking_timerout:{}!!!!!!!!!!!!!!!!!!!!!".format(self.VC_Thinking_timerout))\r
+            self.VC_Thinking_timerout -=1\r
+            if self.VC_Thinking_timerout == 0:\r
+                self.VC_Thinking_timerout = 100\r
+                print("Thinking重试,重试!!!!!!!!!!!!!!!!!!!!!")\r
+                self.VC_state = VC_State_None\r
+                EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_VC_start}) \r
+                pass\r
+        if self.VC_Speech_end_timerout >0:\r
+            self.VC_Speech_end_timerout-=1\r
+            if self.VC_Speech_end_timerout <=0:\r
+                self.VC_Speech_end_timerout = 0\r
+                self.AI_client_VC_end_speech()#发送说话终止\r
+    #VC开始\r
+    def AI_VC_start(self):\r
+        print("AI_VC_start1")\r
+        self.VC_satrt_flag = 1\r
+        if self.VC_Thinking_timerout < 100:\r
+            self.VC_Thinking_timerout = 0\r
+        EventMesh.publish("open_led_all")\r
+        self.VC_Play_End()#关闭音频播放\r
+        print("AI_VC_start2")\r
+        #self.aud.aud_tone_play(16,200)#播放按键音\r
+        self.LocalRespondingEnded_timerout = 0\r
+        self.close_timerout = 0\r
+\r
+        \r
+        #\r
+        if self.AI_client_VC_isconnect == 0:#没连接的时候请求开始\r
+            self.websocket_connect_VC()#连接服务器\r
+            self.AI_client_VC_start_requset()\r
+            #utime.sleep_ms(50)\r
+        else:\r
+            print("self.VC_state :{}".format(self.VC_state ))\r
+            if self.VC_state > VC_State_SpeechStart:\r
+                #客户端打断对话\r
+                print("打断对话")\r
+                # self.websocket_deconnect_VC()\r
+                # self.websocket_connect_VC()#连接服务器\r
+                # self.AI_client_VC_start_requset()\r
+                self.AI_client_VC_RequestToSpeak()\r
+            elif self.VC_state == VC_State_Listening:\r
+                #直接chat\r
+                print("直接chat")\r
+                self.AI_client_VC_RequestToRespond()\r
+                return \r
+            else:\r
+                print("异常状态")\r
+                #self.AI_client_VC_RequestToSpeak()\r
+                self.websocket_deconnect_VC()\r
+                self.websocket_connect_VC()#连接服务器\r
+                self.AI_client_VC_start_requset()\r
+        if self.AI_client_VC_isconnect == 0:\r
+            return\r
+        print("AI_VC_start3")\r
+         \r
+        self.VC_state = VC_State_None\r
+        if self.AI_TTS_str == "":#没有tts要播放的时候才开始录音\r
+            #开始asr录音\r
+            self.VC_Speech_Start()\r
+        #     pass\r
+        print("AI_VC_start4")\r
+        \r
+        #开始线程\r
+        \r
+        # if self.AI_VC_send_data_queue_thread_id == 0:    \r
+        #     _thread.stack_size(self.Audio_buf_size+8*1024)\r
+        #     self.AI_VC_send_data_queue_thread_id = _thread.start_new_thread(self.AI_VC_send_data_queue_thread, ())\r
+        #     _thread.stack_size(8*1024)\r
+        #     print("AI_VC_start :AI_VC_send_data_queue_thread_id :{} ".format(self.AI_VC_send_data_queue_thread_id))\r
+        \r
+        if self.AI_audio_queue_thread_id ==0:\r
+            _thread.stack_size(24*1024)\r
+            self.AI_audio_queue_thread_id = _thread.start_new_thread(self.AI_audio_queue_thread, ())\r
+            _thread.stack_size(8*1024)\r
+            print("AI_VC_start :AI_audio_queue_thread_id :{} ".format(self.AI_audio_queue_thread_id))\r
+        else:\r
+            print("AI_VC_start :AI_audio_queue_thread_id != 0 ")\r
+        self._1S_timer.start(1000,1,self._1S_timer_cb)\r
+        # self.VC_pingping_timerout = 0\r
+        # self.asr_pingping_timerout = 0\r
+        print("AI_VC_start5")\r
+    #开始会话\r
+    def AI_client_VC_start_requset(self):\r
+        voice="huoshan::zh_male_wennuanahu_moon_bigtts"\r
+        try:\r
+            voice = self.VC_TTS_voice_type[self.VC_TTS_voice_key]["voice"]\r
+        except Exception as e:\r
+            usys.print_exception(e)    \r
+        json_data =\\r
+        {\r
+            "id": "event_id",\r
+            "event_type": "chat.update",\r
+            "data": {\r
+                "chat_config": {\r
+                    "auto_save_history": True, #保存历史记录。默认 true\r
+                    #"conversation_id": "1235984as1d54", #conversation_id\r
+                    "user_id": "86952145024",  #标识当前与智能体的用户,由使用方自行定义、生成与维护。user_id 用于标识对话中的不同用户,不同的 user_id,其对话的上下文消息、数据库等对话记忆数据互相隔离。如果不需要用户数据隔离,可将此参数固定为一个任意字符串\r
+                    "meta_data": {}, #附加信息,通常用于封装一些业务相关的字段。查看对话消息详情时,系统会透传此附加信息。\r
+                    "custom_variables": {}, #智能体中定义的变量。在智能体prompt中设置变量{{key}}后,可以通过该参数传入变量值,同时支持Jinja2语法。详细说明可参考变量示例。变量名只支持英文字母和下划线。\r
+                    "extra_params": {},   #附加参数,通常用于特殊场景下指定一些必要参数供模型判断,例如指定经纬度,并询问智能体此位置的天气。自定义键值对格式,其中键(key)仅支持设置为:latitude:纬度,此时值(Value)为纬度值,例如39.9800718。longitude:经度,此时值(Value)为经度值,例如116.309314。\r
+                    "parameters": {"custom_var_1": "测试"}\r
+                },\r
+                "input_audio": {         #输入音频格式\r
+                    "format": "pcm",       #输入音频格式,支持 pcm/wav/ogg。默认 wav\r
+                    "codec": "pcm",         #输入音频编码。 pcm/opus。默认 pcm\r
+                    "samplate_rate": self.VC_record_samplerate,  #采样率\r
+                    "channel": 1, #通道数\r
+                    "bit_depth": 16 #位深\r
+                },\r
+                "output_audio": {        #输出音频格式\r
+                    "codec": "pcm",        #pcm/opus 输出音频格式, 默认 pcm\r
+                    "pcm_config": {\r
+                        "sample_rate": self.VC_play_samplerate,   #码率\r
+                        \r
+                    },\r
+                    "speech_rate": 50,  #回复的语速,取值范围 [-50, 100],默认为 0,-50 表示 0.5 倍速,100 表示 2倍速\r
+                    #"voice_id": "zh_female_shaoergushi_mars_bigtts"\r
+                },\r
+                "turn_detection": {\r
+                               "type":                "server_vad",\r
+                               "prefix_padding_ms":   600,\r
+                               "silence_duration_ms": 500,\r
+                       },\r
+            }\r
+        }\r
+        # if self.VC_play_TYPE == VC_play_TYPE_PCM:\r
+        #     json_data["payload"]["out_format"]='pcm'\r
+        # if self.VC_record_TYPE == VC_record_TYPE_AMR :\r
+        #     json_data["payload"]["in_format"]='amr'\r
+        #     pass\r
+        # if self.VC_mode == 1:\r
+        #     json_data["payload"]["voice_detection"]='disable'\r
+        self.VC_state = VC_State_None\r
+        self.AI_client_VC_send(ujson.dumps(json_data))\r
+ \r
+    #开始上传语音\r
+    def AI_client_VC_send_speech(self):\r
+        json_data = \\r
+        {\r
+            "header":{\r
+                "trace_id":self.get_trace_id(),\r
+                "event":"SendSpeech"\r
+                },\r
+            "payload":\r
+            {\r
+                "dialog_id":self.VC_dialog_id,\r
+                "session_id": self.session_id ,\r
+            }\r
+        }\r
+        #self.AI_client_VC_send(ujson.dumps(json_data))\r
+        self.VC_Speech_Start()#开启线程获取录音数据\r
+        self.VC_state =  VC_State_SpeechStart\r
+    def AI_client_VC_input_audio_buffer_append(self,data):\r
+        json_data = \\r
+        {\r
+            "id": "event_id",\r
+            "event_type": "input_audio_buffer.append",\r
+            "data": {\r
+            "delta": ubinascii.b2a_base64(data)\r
+            }\r
+        }\r
+        self.AI_client_VC_send(ujson.dumps(json_data))\r
+    #结束上传语音\r
+    def AI_client_VC_end_speech(self):\r
+        json_data = \\r
+        {\r
+            "id": "event_id",\r
+            "event_type": "input_audio_buffer.complete",\r
+            "data": {}\r
+        }\r
+        self.AI_client_VC_send(ujson.dumps(json_data))\r
+        EventMesh.publish("publish_AI_btnInfo",{"func":self.VC_Speech_End})\r
+        EventMesh.publish("publish_AI_btnInfo",{"func":self.send_tone}) \r
+\r
+    #通知服务器开始播放\r
+    def AI_client_VC_LocalRespondingStarted(self):\r
+        json_data = \\r
+        {\r
+            "header":{\r
+                "trace_id":self.get_trace_id(),\r
+                "event":"LocalRespondingStarted"\r
+                },\r
+            "payload":{\r
+                "dialog_id":self.VC_dialog_id,\r
+                "session_id": self.session_id ,\r
+                }\r
+        }\r
+        self.AI_client_VC_send(ujson.dumps(json_data))\r
+    #通知服务器播放结束\r
+    def AI_client_VC_LocalRespondingEnded(self):\r
+        json_data = \\r
+        {\r
+            "header":{\r
+                "trace_id":self.get_trace_id(),\r
+                "event":"LocalRespondingEnded"\r
+                },\r
+            "payload":{\r
+                "dialog_id":self.VC_dialog_id,\r
+                "session_id": self.session_id ,\r
+                }\r
+        }\r
+        EventMesh.publish("publish_AI_btnInfo",{"func":self.VC_init}) \r
+        EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_client_VC_send,"data":ujson.dumps(json_data)}) \r
+        # json_data = \\r
+        # {\r
+        #     "header":{\r
+        #         "trace_id":self.get_trace_id(),\r
+        #         "event":"AAAAAAAAAAAAAA1"\r
+        #         },\r
+        #     "payload":{\r
+        #         "dialog_id":self.VC_dialog_id,\r
+        #         "session_id": self.session_id ,\r
+        #         }\r
+        # }\r
+        # EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_client_VC_send,"data":ujson.dumps(json_data)}) \r
+        # utime.sleep_ms(1)\r
+        # self.AI_client_VC_send(ujson.dumps(json_data))\r
+        self.VC_state = VC_State_End\r
+    #客户端打断对话\r
+    def AI_client_VC_RequestToSpeak(self):\r
+        json_data = \\r
+        {\r
+            "header":{\r
+                "trace_id":self.get_trace_id(),\r
+                "event":"RequestToSpeak"\r
+                },\r
+            "payload":{\r
+                "dialog_id":self.VC_dialog_id,\r
+                "session_id": self.session_id ,\r
+                }\r
+        }\r
+        print("AI_client_VC_RequestToSpeak!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")\r
+        EventMesh.publish("publish_AI_btnInfo",{"func":self.VC_init}) \r
+        EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_client_VC_send,"data":ujson.dumps(json_data)}) \r
+        # utime.sleep_ms(1)\r
+    #请求TTS或者chat事件\r
+    def AI_client_VC_RequestToRespond(self):\r
+        self.session_id  = self.get_session_id()#调试临时打开\r
+        json_data = \\r
+        {\r
+            "header":{\r
+                "trace_id":self.get_trace_id(),\r
+                "event":"RequestToRespond"\r
+                },\r
+            "payload":{\r
+                "dialog_id":self.VC_dialog_id,\r
+                "session_id": self.session_id ,\r
+                "type":"transcript",#prompt是跳过asr,transcript是跳过asr和大模型\r
+                "text":""\r
+                }\r
+        }\r
+\r
+        print("AI_client_VC_RequestToRespond!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")\r
+        # if self.VC_state == VC_State_RequestToRespond:\r
+        #     print("AI_client_VC_RequestToRespond 重复 tts_str:{}\nasr_str:{}".format(self.AI_TTS_str,self.AI_ASR_str))\r
+        self.VC_state = VC_State_RequestToRespond\r
+        if self.AI_TTS_str != "":\r
+            json_data["payload"]["text"] = self.AI_TTS_str\r
+            json_data["payload"]["type"] = "transcript"\r
+            EventMesh.publish("publish_AI_btnInfo",{"func":self.VC_init}) \r
+            EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_client_VC_send,"data":ujson.dumps(json_data)}) \r
+            self.AI_TTS_str = ""\r
+        elif self.AI_ASR_str != "":\r
+            json_data["payload"]["text"] = self.AI_ASR_str\r
+            json_data["payload"]["type"] = "prompt"\r
+            EventMesh.publish("publish_AI_btnInfo",{"func":self.VC_init}) \r
+            EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_client_VC_send,"data":ujson.dumps(json_data)})\r
+            if dev_type != "7PIN" :\r
+                EventMesh.publish("publish_AI_btnInfo",{"func":self.send_tone}) \r
+            #\r
+            #self.AI_ASR_str = ""\r
+        # utime.sleep_ms(1)\r
+    def chenggong_tone(self):\r
+        EventMesh.publish("audio_montage_play",["chenggong.mp3"])    \r
+    def send_tone(self):\r
+        EventMesh.publish("audio_montage_play",["send_tone.mp3"])\r
+    #给服务器回应ack\r
+    def AI_client_VC_Read(self):\r
+        json_data = \\r
+        {\r
+            "header":{\r
+                "trace_id":self.get_trace_id(),\r
+                "event":"Read"\r
+                },\r
+            "payload":{\r
+                "dialog_id":self.VC_dialog_id\r
+                }\r
+        }\r
+        print("AI_client_VC_Read!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")\r
+        \r
+        #for i in range(6): \r
+            #EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_client_VC_send,"data":ujson.dumps(json_data)}) \r
+        # utime.sleep_ms(1)\r
+        if self.AI_client_VC != None and self.AI_client_VC_isconnect == 1:\r
+            self.AI_client_VC.send(ujson.dumps(json_data))\r
+      \r
+    ############################################\r
+    #关闭音频播放线程\r
+    def AI_audio_queue_thread_close(self):\r
+        print("AI_audio_queue_thread_close1!!!!!!!!!!!!!!!!!!!!!!")\r
+        if self.AI_audio_queue_thread_id != 0:\r
+            count =500\r
+            while True:\r
+                count -= 1\r
+                if self.AI_audio_queue_thread_lock == 0 or count <=0:\r
+                    break\r
+                else:\r
+                    self.AI_audio_queue_thread_lock = 2\r
+                    print("AI_audio_queue_thread going:{}...".format(count))\r
+                    utime.sleep_ms(1)\r
+            self.AI_audio_queue_thread_lock = 0\r
+            print("AI_audio_queue_thread_close2!!!!!!!!!!!!!!!!!")\r
+            try:\r
+                _thread.stop_thread(self.AI_audio_queue_thread_id)\r
+            except Exception as e:\r
+                usys.print_exception(e)\r
+        self.AI_audio_queue_thread_id = 0\r
+    # 音频队列        \r
+    def AI_audio_queue_thread(self):\r
+        print("AI_audio_queue_thread start")\r
+        count = 0\r
+        while True:\r
+            try:\r
+                if self.AI_audio_queue_thread_lock == 2:\r
+                        print("AI_audio_queue_thread 该退出了")\r
+                        break\r
+                #\r
+                count+=1\r
+                if count%500 == 1:\r
+                    print("AI_audio_queue_thread on")\r
+                utime.sleep_ms(1)\r
+                #print("AI_audio_queue_thread")\r
+                if self.AI_audio_queue.empty() :\r
+                    self.AI_audio_queue_thread_lock = 0\r
+                    \r
+                    \r
+                else:\r
+                    self.AI_audio_queue_thread_lock = 1\r
+                    data = self.AI_audio_queue.get()\r
+                    self.close_timerout = 0\r
+                    if self.play_flag == 0:\r
+                        self.play_flag =1\r
+                        print("AI_client_VC_LocalRespondingStarted!!!")\r
+                        self.AI_client_VC_LocalRespondingStarted()#通知服务器开始播放\r
+                    #self.AI_client_tts_data_len=len(data)\r
+                    print("audio_queue:len:{}".format(len(data[0])))\r
+                    if len(data[0]) > 10:\r
+                        try:\r
+                            if self.VC_play_TYPE == VC_play_TYPE_PCM:\r
+                                # if self.VC_play_samplerate == 8000:\r
+                                #     tmp= self.aud.playStream(1,data[0] )\r
+                                # elif self.VC_play_samplerate == 16000:\r
+                                \r
+                                \r
+                                    \r
+                                    write_buf = bytearray(data[0])\r
+                                    #print("play_pcm.stream_write1!!")\r
+                                    if self.play_pcm != None:\r
+                                        print("play_pcm.stream_write !!!")\r
+                                        ret = self.play_pcm.stream_write(write_buf,len(write_buf))\r
+                                        #ret= self.aud.playStream(1, data[0])#播放音频流\r
+                                        self.tts_out_data_len += ret\r
+                                        #print("play_pcm.stream_write:{}".format(self.tts_out_data_len))\r
+                            elif self.VC_play_TYPE == VC_play_TYPE_MP3:\r
+                                tmp= self.aud.playStream(3, data[0])#播放音频流\r
+                                \r
+                                if tmp != 0:\r
+                                    print("2playStream:error tmp:{} data len:{}!!!!!!!!!!!!".format(tmp,len(data[0])))\r
+                                    # # #播放失败的时候填充WAV头\r
+                                    # data_len = len(data[0])\r
+                                    # data_len_b = data_len.to_bytes(4,'little')#数据长度转16进制数组\r
+                                    # h_data = [ 0x52 ,0x49 ,0x46 ,0x46 #,0x24 ,0x00 ,0x00 ,0x00 #文件标识、文件大小\r
+                                    #         ,0x57 ,0x41 ,0x56 ,0x45 ,0x66 ,0x6D ,0x74 ,0x20  #文件格式、格式块标识符\r
+                                    #         ,0x10 ,0x00 ,0x00 ,0x00 ,0x01 ,0x00 ,0x01 ,0x00 ,0x80 ,0x3E ,0x00 ,0x00  #格式块大小4、音频格式2、声道数2、采样率4\r
+                                    #         ,0x80 ,0x3E ,0x00 ,0x00 ,0x02 ,0x00 ,0x10 ,0x00 ,0x64 ,0x61 ,0x74 ,0x61]#每秒字节数4、数据块对齐2、位深度2、data4\r
+                                    # h_data_b = bytes(h_data)\r
+                                    # file_len = data_len+len(h_data_b)+4+4\r
+                                    # file_len_b = file_len.to_bytes(4,'little')#文件长度转16进制数组\r
+                                    # h_data_b = h_data_b[:4]+file_len_b+h_data_b[4:]+data_len_b\r
+                                    # #self.aud.playStream(2, h_data_b)#播放音频流\r
+                                    # tmp= self.aud.playStream(2, h_data_b+data[0])#播放音频流\r
+                                    # print("3playStream:tmp:{} !!!!!!!!!!!!".format(tmp))\r
+                            \r
+                            \r
+                            mem = gc.mem_free()\r
+                            #print('1剩余内存RAM:{} KB'.format(mem / 1024))\r
+                        except Exception as e:\r
+                            print("AI_audio_queue_thread:ERROR:")\r
+                            usys.print_exception(e)\r
+                    \r
+                    # if self.VC_state == VC_State_TTSEnd and self.AI_audio_queue.empty() :#self.AI_audio_queue为空且tts下发结束\r
+                    #     #通知服务器播放结束\r
+                    #     self.AI_client_VC_LocalRespondingEnded()\r
+            except Exception as e:\r
+                print("AI_audio_queue_thread:ERROR:")\r
+                usys.print_exception(e)\r
+        self.AI_audio_queue_thread_lock = 0\r
+        #print("AI_audio_queue_thread:exit")\r
+    def factory_mode(self):\r
+        print("factory_mode")\r
+        EventMesh.publish("publish_AI_btnInfo",{"func":self.Close}) \r
+        EventMesh.publish("publish_AI_btnInfo",{"func":self.factory_start}) \r
+    def factory_start(self):\r
+        self.factory_timer.start(3000, 1, self.factory_timer_cb)\r
+    def factory_timer_cb(self, *args, **kwargs):\r
+        print("factory_timer_cb play......")\r
+        #self.aud.play(1,0,'U:/static/peizhichenggong.mp3')#切换成功\r
+        EventMesh.publish("audio_montage_play",["xinhaoruo1.mp3"])\r
+\r
+    def Close(self):\r
+        self.VC_Thinking_timerout = 0\r
+        self.VC_satrt_flag = 0\r
+        self.AI_TTS_str = ""\r
+        self.AI_ASR_str = ""\r
+        self.AI_ASR_str_tmp = ""\r
+        self.AI_ASR_flag  = 0\r
+        self.AI_ASR_check_timeout = 0\r
+        self.AI_ASR_error_timeout = 0\r
+        print("ai_VC Close1!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")\r
+        EventMesh.publish("close_led")\r
+        self.tts_in_data_len = 0\r
+        self.tts_out_data_len = 0\r
+        #必须先销毁线程,不然线程会容易报错\r
+        try:\r
+            self.AI_ASR_send_data_queue_thread_close()#销毁ASR发送线程\r
+        except Exception as e:\r
+            usys.print_exception(e)\r
+        try:\r
+            self.AI_audio_queue_thread_close()#销毁音频线程\r
+        except Exception as e:\r
+            usys.print_exception(e)\r
+        try:\r
+            self.AI_VC_send_data_queue_thread_close()#销毁数据发送线程\r
+        except Exception as e: \r
+            usys.print_exception(e)\r
+        \r
+        self.VC_Speech_End()\r
+        print("ai_VC Close1.1!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")\r
+        self.VC_init()\r
+        \r
+        print("ai_VC Close1.2!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")\r
+        \r
+        try:\r
+            self.websocket_deconnect_asr()\r
+        except Exception as e:\r
+            usys.print_exception(e)\r
+        try:\r
+            self.websocket_deconnect_VC()\r
+        except Exception as e:\r
+            usys.print_exception(e)\r
+        print("ai_VC Close1.3!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")\r
+        \r
+        print("ai_VC Close2!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")\r
+        \r
+        \r
+        self.AI_ASR_timer.stop()\r
+        self._1S_timer.stop()\r
+        self.factory_timer.stop()\r
+        \r
+        if self.record_data_save_flag == 1:\r
+            if self.record_fd :\r
+                self.record_fd.close()\r
+            self.record_fd = None\r
+        if self.play_data_save_flag == 1:\r
+            if self.play_fd !=None:\r
+                self.play_fd.close()\r
+        print("ai_VC Close3!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\r\n")\r
+        \r
+        if self.AI_VC_send_data_queue.empty()!=True:\r
+            self.AI_VC_send_data_queue.clear()\r
+        if self.AI_ASR_send_data_queue.empty()!=True:\r
+            self.AI_ASR_send_data_queue.clear()\r
+        self.AI_ASR_send_buf_len = 0\r
+        #self.AI_WS_connect_Queue.put(self.AI_client_VC)\r
+\r
+        # try:\r
+        #     while True:\r
+        #         if self.AI_WS_connect_Queue.empty()!=True:\r
+        #             AI_WS_connect = self.AI_WS_connect_Queue.get()\r
+        #             if AI_WS_connect :\r
+        #                 try:\r
+        #                     AI_WS_connect._close()\r
+        #                     AI_WS_connect = None\r
+        #                 except Exception as e:\r
+        #                     usys.print_exception(e)\r
+        #             else:\r
+        #                 print("websocket链接已为空")\r
+        #         else:\r
+        #             break\r
+        # except Exception as e:\r
+        #     usys.print_exception(e)\r
+\r
+    def VC_init2(self):\r
+        self.VC_init()\r
+        \r
+        print("ai_VC VC_init2!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")\r
+        try:\r
+            self.websocket_deconnect_VC()\r
+        except Exception as e:\r
+            usys.print_exception(e)\r
+        print("ai_VC Close3!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\r\n")\r
+        self._1S_timer.stop()\r
+        if self.AI_VC_send_data_queue.empty()!=True:\r
+            self.AI_VC_send_data_queue.clear()\r
+        if self.AI_ASR_send_data_queue.empty()!=True:\r
+            self.AI_ASR_send_data_queue.clear()\r
+        self.AI_ASR_send_buf_len = 0\r
+        if self.AI_audio_queue.empty()!=True:\r
+            self.AI_audio_queue.clear()\r
+    def VC_init(self):\r
+        \r
+        print("VC_init:AI_VC_send_data_queue:size:{}".format(self.AI_VC_send_data_queue.size()))\r
+        \r
+        \r
+        print("VC_init2")\r
+        #self.VC_Speech_End()\r
+        print("VC_init3")\r
+        self.VC_Play_End()\r
+        print("VC_init4")\r
+        \r
+        if self.AI_audio_queue.empty()!=True:\r
+            self.AI_audio_queue.clear()\r
+        # num = EventMesh.publish("get_volum_size")\r
+        # if num == None:\r
+        #     num = 8\r
+        # self.aud.setVolume(num)#恢复原始音量\r
         
\ No newline at end of file
index 9bbf5e9..e5e464c 100644 (file)
-from common import Abstract
-import machine
-import osTimer
-from misc import PowerKey
-import EventMesh
-from machine import Pin
-from machine import ExtInt
-import constants
-import utime
-import audio
-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 machine import RTC
-from queue import Queue
-import _thread
-import usys
-import sms
-from Gsensor import SC7A20
-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']
-
-
-    class intervManager(Abstract):
-        def __init__(self):
-            self.timer = osTimer()
-
-            self.pwk_timer1 = osTimer()
-            self.pwk_timer2 = osTimer()
-            self.timer1 = osTimer()
-            self.sos_timer2 = osTimer()
-            self.sos_timer1 = osTimer()
-
-            self.sos_sendtime = osTimer()
-
-            self.fall_timer1 = osTimer()
-            self.fall_timer2 = osTimer()
-
-            self.alarm_timer1 = osTimer()
-
-            self.find_timer1 = osTimer()
-            self.fall_flag = 0
-
-            self.factory_timer = osTimer()
-            
-            self.restart_timer = osTimer()
-
-            self.aud = audio.Audio(0)
-            self.aud.set_pa(Pin.GPIO29)
-            self.aud.setVolume(11)
-            self.play_count = 0
-            self.count = 0
-
-            self.get_hr_state  = 0
-            self.get_spo2_state = 0
-            self.timeSec = 0
-            self.timeTempSec = 0
-
-            self.hr_value = 0
-            self.spo2_value = 0
-            self.temp_value = 0
-
-            self.usbState = 0
-
-            self.setp_old = 0
-            self.step_tmp = ""
-            self.step_num = 0
-            self.power_off = 0
-            self.call_state = 0
-
-            self.find_state = 0
-            self.FIND_timer_count = 0
-
-            self.old_hour = 0
-            self.alarm_state = 0
-            self.alarm_timer_count = 0
-            self.old_min = 0
-            self.interInfo_queue = Queue()
-            _thread.stack_size(10*1024+64)
-            _thread.start_new_thread(self.interInfo_queue_thread, ())
-            _thread.stack_size(8*1024)
-            EventMesh.subscribe("publish_message_event_interInfo",self.publish_message_event_interInfo)
-            
-
-            self.audio_event_queue = Queue()
-            _thread.stack_size(10*1024+128)
-            _thread.start_new_thread(self.audio_event_queue_thread, ())
-            _thread.stack_size(8*1024)
-            EventMesh.subscribe("publish_message_event_audio",self.publish_message_event_audio)
-
-            self.record_test = audio.Record()
-            self.record_test.gain_set(4,12)
-
-            self.timeSecond = 0
-            self.wechat_show = 0
-            self.sort_new = {}
-            self.time_min = 0
-            self.press_btn = 0
-            self.countdown_old = 0
-            self.set_unread_wechat = 0
-            self.updateTime = 0
-            
-            self.power_on_flag = 0
-
-            self.MXA_MSG = 1
-            self.wechat_recode_list = {"num":0}
-            self.wechat_num = 0
-            self.read_data = {}
-            self.volum_size = 8 
-            self.phone_num = ''
-            self.sos_phone_num = ''
-            self.msg_tmp = ""
-            self.time_count = 0
-            self.alarm_count = 0
-            self.audio_int = 0
-
-            self.hr_auto = 0
-
-            self.temp_auto = 0
-            
-            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:#音频文件编号
-                    self.wechat_recode_list = ujson.load(fd)
-                    if not self.wechat_recode_list:
-                        self.wechat_recode_list = {"num":0}
-                        self.wechat_num = 0
-            else:
-                self.wechat_recode_list = {"num":0}
-                with open("/usr/static/storage_file/wechat_record.json","w+",encoding="utf-8") as fd:
-                    ujson.dump(self.wechat_recode_list,fd)         
-
-
-        def post_processor_after_instantiation(self):
-            EventMesh.subscribe("open_power_on", self.open_power_on)#开机关机
-
-            EventMesh.subscribe("play_imei_event", self.play_imei_event)#播報imei号
-            EventMesh.subscribe("play_center_phone", self.play_center_phone)#拨打快捷号码
-            EventMesh.subscribe("play_cur_time_event", self.play_cur_time_event)#播放当前时间
-
-            EventMesh.subscribe("OPEN_FIND_WATCH", self.send_find_watch)#查找设备
-            EventMesh.subscribe("STOP_FIND_WATCH", self.stop_find_watch)#是否需要关闭查找设备
-            EventMesh.subscribe("close_timer_all", self.close_timer_all)#关闭相关定时器
-
-            EventMesh.subscribe("dial_sos_phone", self.dial_sos_phone)#长按3s拨打sos求助号码
-
-            EventMesh.subscribe("set_sim_mode", self.set_sim_mode)#sim检测
-
-            EventMesh.subscribe("close_hr_sop2", self.close_hr_sop2)#关闭健康测试
-            EventMesh.subscribe("set_manual_measure_mode", self.set_manual_measure_mode)#设置测试模式
-            EventMesh.subscribe("set_start_measure_time", self.set_start_measure_time)#设置开始测量的时间戳时间
-            EventMesh.subscribe("get_start_measure_time", self.get_start_measure_time)#获取开始测量的时间戳时间
-            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_temp_value", self.play_temp_value)#播放体温数值
-
-            EventMesh.subscribe("play_sugar_value", self.play_sugar_value)#播放血糖数值
-
-
-            EventMesh.subscribe("set_usb", self.set_usb)#
-            EventMesh.subscribe("get_usb", self.get_usb)#
-
-            EventMesh.subscribe("play_cur_step_event", self.play_cur_step_event)#
-
-            EventMesh.subscribe("set_call_state", self.set_call_state)#1是 拨出去呼叫中 2是播进来 3 是正在通话中 0是无效
-            EventMesh.subscribe("get_call_state", self.get_call_state)#
-            EventMesh.subscribe("interup_call_event", self.interup_call_event)#
-            EventMesh.subscribe("answer_call_event", self.answer_call_event)#接听电话
-            EventMesh.subscribe("dialin_call_event", self.dialin_call_event)#电话拨进响铃
-            EventMesh.subscribe("dialing_out_event", self.dialing_out_event)#电话呼叫中
-            EventMesh.subscribe("call_test_event", self.call_test_event)#电话拨进响铃测试
-
-            EventMesh.subscribe("dial_out_call_center_cb", self.dial_out_call_center_cb)#电话拨出去
-            EventMesh.subscribe("sos_out_call_center_cb", self.sos_out_call_center_cb)#sos拨打
-
-            EventMesh.subscribe("close_audio_play", self.close_audio_play)#关闭音频
-
-
-            EventMesh.subscribe("start_wechat_record", self.start_wechat_record)#手表开始录音
-            EventMesh.subscribe("send_wechat_record", self.send_wechat_record)#发送微聊语音文件to app
-            EventMesh.subscribe("play_wechat_last_amr", self.play_wechat_last_amr)#播放微聊语音最后一条语音文件
-            EventMesh.subscribe("get_wechat_data", self.get_wechat_data)
-            EventMesh.subscribe("set_wechat_data", self.set_wechat_data)
-            EventMesh.subscribe("play_unread_wechat_infor", self.play_unread_wechat_infor)#按键播放最近一条微聊语音
-            EventMesh.subscribe("set_unread_wechat_state", self.set_unread_wechat_state)#设置未读标识
-            EventMesh.subscribe("get_unread_wechat_state", self.get_unread_wechat_state)#获取未读标志
-            EventMesh.subscribe("get_wechat_time", self.get_wechat_time)#获取微聊时间戳
-            EventMesh.subscribe("get_wechat_state", self.get_wechat_state)#获取微聊状态
-            EventMesh.subscribe("set_wechat_state", self.set_wechat_state)#设置微聊状态
-
-
-            EventMesh.subscribe("get_power_on_state", self.get_power_on_state)#获取开机标识
-            EventMesh.subscribe("get_power_off_state", self.get_power_off_state)#获取关机标识
-
-            EventMesh.subscribe("play_audio_file", self.play_audio_file)#获取播放音频文件
-
-            EventMesh.subscribe("OPEN_ALARM_RING", self.send_alarm_ring)#闹钟到点响铃
-            EventMesh.subscribe("STOP_ALARM_RING", self.stop_alarm_ring)#是否需要关闭闹钟
-
-            EventMesh.subscribe("recv_wechat_audio", self.recv_wechat_audio)#
-
-
-            EventMesh.subscribe("sos_short_press", self.sos_short_press)#sos短按事件
-
-            EventMesh.subscribe("falldown_alarm_event", self.falldown_alarm_event)#跌倒报警
-
-            EventMesh.subscribe("close_falldown_alarm_event", self.close_falldown_alarm_event)#关闭跌倒报警
-
-            EventMesh.subscribe("drink_alarm_event", self.drink_alarm_event)#该喝水了
-
-            EventMesh.subscribe("medicine_alarm_event", self.medicine_alarm_event)#该吃药了
-
-            EventMesh.subscribe("wakeup_alarm_event", self.wakeup_alarm_event)#该起床了
-
-            EventMesh.subscribe("home_alarm_event", self.home_alarm_event)#该回家了
-
-            EventMesh.subscribe("sleep_alarm_event", self.sleep_alarm_event)#该睡觉了
-
-            EventMesh.subscribe("reset_alarm_event", self.reset_alarm_event)#该休息了
-
-            EventMesh.subscribe("reset_end_alarm_event", self.reset_end_alarm_event)#休息结束了
-
-            EventMesh.subscribe("get_fall_down_state", self.get_fall_down_state)#跌倒报警标识
-
-            EventMesh.subscribe("app_factory", self.app_factory)#app恢复出厂
-
-            EventMesh.subscribe("app_restart", self.app_restart)#远程重启
-
-        
-
-        def interInfo_queue_thread(self):
-            while True:
-                data = self.interInfo_queue.get()
-                #EventMesh.debug_log("interInfo_queue_thread:data = {}".format(data))
-                if data != None:
-                    try:
-                        data["func"](data["data"])
-                    except Exception as e:
-                        EventMesh.debug_log("interInfo_queue_thread:ERROR:{}".format(e))
-                        usys.print_exception(e)
-
-        def publish_message_event_interInfo(self,event,msg):
-            self.interInfo_queue.put(msg)
-
-        def publish_call_event_cb(self, *args, **kwargs):#拨打电话
-            EventMesh.publish("publish_message_event_interInfo",{"func":self.call_timer_cb,"data":0})  
-
-        def publish_resatrt_down_event_cb(self, *args, **kwargs):#重启设备
-            EventMesh.publish("publish_message_event_interInfo",{"func":self.powe_resatrt_down_fun,"data":0})  
-        
-        def publish_power_down_event_cb(self, *args, **kwargs):#关机
-            EventMesh.publish("publish_message_event_interInfo",{"func":self.power_down_fun,"data":0})  
-
-        def publish_find_watch_event_cb(self, *args, **kwargs):#查找设备
-            EventMesh.publish("publish_message_event_interInfo",{"func":self.FIND_timer_cb,"data":0})  
-
-        def publish_alarm_ring_event_cb(self, *args, **kwargs):#闹钟响铃
-            EventMesh.publish("publish_message_event_interInfo",{"func":self.Alarm_timer_cb,"data":0})  
-
-        def publish_reset_alarm_ring_event_cb(self, *args, **kwargs):#休息响铃
-            EventMesh.publish("publish_message_event_interInfo",{"func":self.reset_alarm_event_cb,"data":0})  
-        
-        def publish_reset_end_alarm_ring_event_cb(self, *args, **kwargs):#休息结束响铃
-            EventMesh.publish("publish_message_event_interInfo",{"func":self.reset_end_alarm_event_cb,"data":0})  
-        
-        def publish_sleep_alarm_ring_event_cb(self, *args, **kwargs):#睡觉响铃
-            EventMesh.publish("publish_message_event_interInfo",{"func":self.sleep_alarm_event_cb,"data":0})  
-        
-        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_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):#喝水响铃
-            EventMesh.publish("publish_message_event_interInfo",{"func":self.drink_alarm_event_cb,"data":0})  
-
-        def publish_fall_done_ring_event_cb(self, *args, **kwargs):#跌倒提醒
-            EventMesh.publish("publish_message_event_interInfo",{"func":self.falldown_alarm_cb,"data":0})  
-
-
-        def reset_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_reset_alarm_ring_event_cb)
-                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_RESET_ALARM"))
-                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件
-        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:
-                self.alarm_count += 1
-                if self.alarm_count >= 3:
-                    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])#获取播放音频文件
-            else:
-                self.alarm_count = 0
-                self.alarm_timer1.stop()
-
-        def reset_end_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.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])#获取播放音频文件
-        
-        def reset_end_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
-                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_RESET_END_ALARM"))
-                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件
-            else:
-                self.alarm_count = 0
-                self.alarm_timer1.stop()
-        
-        def sleep_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_sleep_alarm_ring_event_cb)
-                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_SLEEP_ALARM"))
-                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件
-        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:
-                self.alarm_count += 1
-                if self.alarm_count >= 3:
-                    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])#获取播放音频文件
-            else:
-                self.alarm_count = 0
-                self.alarm_timer1.stop()
-
-
-        def home_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_home_ring_event_cb)
-                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_HOME_ALARM"))
-                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件
-        
-        def home_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
-                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_HOME_ALARM"))
-                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件
-            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])#获取播放音频文件
-        
-        def wakeup_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
-                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_WAKEUP_ALARM"))
-                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件
-            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])#获取播放音频文件
-
-        def medicine_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
-                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_MEDICINE_ALARM"))
-                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件
-            else:
-                self.alarm_count = 0
-                self.alarm_timer1.stop()
-
-        def drink_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_drink_ring_event_cb)
-                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_DRINK_ALARM"))
-                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件
-            
-
-
-        def drink_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# 1 2 
-                if self.alarm_count >= 3:
-                    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])#获取播放音频文件
-            else:
-                self.alarm_count = 0
-                self.alarm_timer1.stop()
-            
-        def falldown_alarm_event(self,args,msg):#跌倒报警启动中提示
-            flag = EventMesh.publish("get_call_state")#在通话或者电话拨进 或者拨出不允许寻找设备
-            wechat_state = EventMesh.publish("get_wechat_state")
-            if flag == 0 and wechat_state == 0:
-                EventMesh.publish("close_timer_all")#
-                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_FALL_ALARM"))
-                self.time_count = 0
-                self.fall_flag = 0
-                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")
-            if self.call_state == 0 and wechat_state == 0:
-                self.time_count+=1
-                if self.time_count >= 5:
-                    self.time_count = 0
-                    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()
-        
-        def close_falldown_alarm_event(self,event,msg):#跌倒挂断挂断
-            if self.fall_flag == 1:#跌倒标志
-                self.fall_flag = 0
-                self.fall_timer1.stop()
-                self.sos_timer1.stop()
-                self.sos_timer2.stop()
-                if self.call_state != 0:
-                    self.call_state = 0
-                    voiceCall.callEnd()
-                sos_flag = EventMesh.publish("get_sos_flag")
-                if sos_flag == 1:
-                    self.call_state = 0
-                    EventMesh.publish("set_sos_flag",0)
-                    EventMesh.publish("set_sos_num",0)
-                    EventMesh.publish("set_hangup_mode",0)
-
-        
-
-        def send_find_watch(self, event, msg): #发送查找设备指令
-            open_power = EventMesh.publish("get_power_on_state")#获取开机标识
-            if open_power != None:
-                if open_power == 0:
-                    return
-            power_off = EventMesh.publish("get_power_off_state")#获取开机标识
-            if power_off != None:
-                if power_off == 1:
-                    return
-            flag = EventMesh.publish("get_call_state")#在通话或者电话拨进 或者拨出不允许寻找设备
-            wechat_state = EventMesh.publish("get_wechat_state")
-            if flag == 0 and wechat_state == 0 and self.fall_flag == 0: 
-                EventMesh.publish("close_timer_all")#
-                self.find_state = 1
-                self.FIND_timer_count = 0
-                self.alarm_timer1.start(3000,1,self.publish_find_watch_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("audio_find_haixiu"))
-                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
-        
-        def stop_find_watch(self, event, msg): 
-            if self.find_state == 1:
-                self.find_state = 0
-                self.FIND_timer_count = 0
-                # EventMesh.publish("stop_led_timer")#设置参数
-                self.aud.stopPlayStream()  #播放声音 
-                self.alarm_timer1.stop()
-
-        def FIND_timer_cb(self, data):
-            flag = EventMesh.publish("get_call_state")#在通话或者电话拨进 或者拨出不允许寻找设备
-            wechat_state = EventMesh.publish("get_wechat_state")
-            if flag == 0 and wechat_state == 0 and self.fall_flag == 0:
-                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"))
-                    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")
-            else:
-                self.FIND_timer_count = 0
-                self.alarm_timer1.stop()
-                
-        
-        def stop_FIND(self) :
-            self.alarm_timer1.stop()
-
-        def send_alarm_ring(self, event, msg): #发送查找设备指令
-            open_power = EventMesh.publish("get_power_on_state")#获取开机标识
-            if open_power != None:
-                if open_power == 0:
-                    return
-            power_off = EventMesh.publish("get_power_off_state")#获取开机标识
-            if power_off != None:
-                if power_off == 1:
-                    return
-            flag = EventMesh.publish("get_call_state")#在通话或者电话拨进 或者拨出不允许寻找设备
-            wechat_state = EventMesh.publish("get_wechat_state")
-            if flag == 0 and wechat_state == 0 and self.fall_flag == 0:
-                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)
-                # 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("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
-        
-        def stop_alarm_ring(self, event, msg): #停止闹钟响铃
-            if self.alarm_state == 1:
-                self.alarm_state = 0
-                self.alarm_timer_count = 0
-                # EventMesh.publish("stop_led_timer")#设置参数
-                self.aud.stopPlayStream()  #停止播放
-                self.alarm_timer1.stop()
-
-        def Alarm_timer_cb(self, data):
-            flag = EventMesh.publish("get_call_state")#在通话或者电话拨进 或者拨出不允许寻找设备
-            wechat_state = EventMesh.publish("get_wechat_state")
-            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.alarm_timer_count += 1
-                    if self.alarm_timer_count > 15: #120秒30s
-                        EventMesh.publish("STOP_ALARM_RING")
-            else:
-                self.alarm_timer_count = 0
-                self.alarm_timer1.stop()
-
-        def get_fall_down_state(self,event,msg):
-            return self.fall_flag
-
-        def sos_short_press(self,args,msg):
-            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")#播报当前时间
-            #播报当前时间
-
-        def recv_wechat_audio(self,event,str_data):#接收微聊语音播放
-            wechat_state = EventMesh.publish("get_wechat_state")
-            if self.call_state == 0 and self.fall_flag == 0 and wechat_state == 0: 
-                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_WECHAT_RECV"))
-                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件
-
-
-
-        def audio_event_queue_thread(self):
-            while True:
-                data = self.audio_event_queue.get()
-                #EventMesh.debug_log("audio_event_queue:data = {}".format(data))
-                if data != None:
-                    try:
-                        data["func"](data["data"])
-                    except Exception as e:
-                        EventMesh.debug_log("audio_event_queue:ERROR:{}".format(e))
-                        usys.print_exception(e)
-        def publish_message_event_audio(self,event,msg):
-            self.audio_event_queue.put(msg)
-
-        def play_audio_file(self, *args, **kwargs):#播放音频文件
-            # EventMesh.debug_log("args",args)
-            # EventMesh.publish("publish_message_event_audio",{"func":self.play_audio_file_do,"data":args[1]})  
-            data = args[1]
-            self.play_audio_file_do(data)
-
-        def play_audio_file_do(self,data):#msg 拼接的路径文件
-            open_power = EventMesh.publish("get_power_on_state")#获取开机标识
-            power_off = EventMesh.publish("get_power_off_state")#获取开机标识
-            # EventMesh.debug_log("play_audio_file",data[0],data[1],open_power,power_off)#路径 str_data[1] 是否需要被打断
-            if open_power != None:
-                if open_power == 0:
-                    return
-            if power_off != None:
-                if power_off == 1:
-                    return
-            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] 是否需要被打断
-            
-
-
-
-
-        def powe_resatrt_down_fun(self, *args):#重启设备
-            EventMesh.publish("close_led_pin")
-            self.aud.stopPlayStream()
-            Power.powerRestart()
-
-        def power_down_fun(self, *args):
-            EventMesh.publish("close_led_pin")
-            self.aud.stopPlayStream()
-            Power.powerDown()
-
-
-
-        def close_audio_play(self, event, msg): #msg
-            open_power = EventMesh.publish("get_power_on_state")#获取开机标识
-            power_off = EventMesh.publish("get_power_off_state")#获取开机标识
-            if open_power != None:
-                if open_power == 0:
-                    return
-            if power_off != None:
-                if power_off == 1:
-                    return
-            self.aud.stopPlayStream()
-
-
-
-        def close_timer_all(self, event, msg): 
-            # EventMesh.debug_log("close_timer_all!!!!!!!!!!!!!!!!!!!")
-            open_power = EventMesh.publish("get_power_on_state")#获取开机标识
-            power_off = EventMesh.publish("get_power_off_state")#获取开机标识
-            if open_power != None:
-                if open_power == 0:
-                    return
-            if power_off != None:
-                if power_off == 1:
-                    return
-            self.aud.stopPlayStream()
-            
-            
-            self.timer.stop()
-            self.sos_timer2.stop()
-            self.sos_timer1.stop()
-            self.fall_flag = 0
-            self.fall_timer1.stop()
-            self.alarm_timer1.stop()
-        
-
-        def answer_call_event(self, event, msg): #
-            if self.call_state == 2:
-                sos_flag = EventMesh.publish("get_sos_flag")
-                if sos_flag == 1:
-                    self.call_state = 0
-                    EventMesh.publish("set_sos_flag",0)
-                    EventMesh.publish("set_sos_num",0)
-                    EventMesh.publish("set_hangup_mode",0)
-                EventMesh.publish("close_timer_all")#
-                voiceCall.callAnswer()
-
-        def set_call_state(self, event, msg): #
-            self.call_state = msg
-
-        def dialin_call_event(self, event, msg):
-            open_power = EventMesh.publish("get_power_on_state")#获取开机标识
-            if open_power != None:
-                if open_power == 0:
-                    return
-            power_off = EventMesh.publish("get_power_off_state")#获取开机标识
-            if power_off != None:
-                if power_off == 1:
-                    return
-            EventMesh.publish("close_timer_all")#
-            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"))
-            EventMesh.publish("play_audio_file",[str_data,0])#获取播放音频文件
-            # EventMesh.publish("play_audio_file",str_data)#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
-        
-        def call_timer_cb(self,data):
-            open_power = EventMesh.publish("get_power_on_state")#获取开机标识
-            if open_power != None:
-                if open_power == 0:
-                    return
-            power_off = EventMesh.publish("get_power_off_state")#获取开机标识
-            if power_off != None:
-                if power_off == 1:
-                    return
-            if self.call_state != 2:
-                EventMesh.publish("stop_led_timer")#设置参数
-                EventMesh.publish("close_timer_all")#
-                return
-            EventMesh.publish("set_led_time_arg",[1,2,10*10,led_mode.FLASH_LIGHT_RED,10,5,led_mode.OTHER_MEASURE_MODE])#測量成功
-            str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_CALL_mp3"))
-            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件
-        
-        def dial_out_call_center_cb(self, event, msg):#电话拨出去
-            open_power = EventMesh.publish("get_power_on_state")#获取开机标识
-            if open_power != None:
-                if open_power == 0:
-                    return
-            power_off = EventMesh.publish("get_power_off_state")#获取开机标识
-            if power_off != None:
-                if power_off == 1:
-                    return
-            # EventMesh.debug_log("dial_out_call_center_cb",msg)
-            if self.call_state == 0:
-                self.phone_num = ''
-                EventMesh.publish("close_timer_all")#
-                if msg == None:
-                    str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_NO_SET_SOS_DIAL"))
-                    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"))
-                    EventMesh.publish("play_audio_file",[str_data,0])#获取播放音频文件
-                    self.timer1.start(2000, 0, self.time_out_phone)
-                    
-        
-        def time_out_phone(self, msg):#电话拨出去
-            voiceCall.callStart(self.phone_num)
-
-        def sos_out_call_center_cb(self, event, msg):#sos电话呼叫中
-            open_power = EventMesh.publish("get_power_on_state")#获取开机标识
-            if open_power != None:
-                if open_power == 0:
-                    return
-            power_off = EventMesh.publish("get_power_off_state")#获取开机标识
-            if power_off != None:
-                if power_off == 1:
-                    return
-            self.sos_phone_num = ''
-            # EventMesh.debug_log("sos_out_call_center_cb",msg)
-            if self.call_state == 0:
-            
-                EventMesh.publish("close_timer_all")#
-                if msg == None:
-                    str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_NO_SET_SOS_DIAL"))
-                    EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件
-                    # EventMesh.publish("play_audio_file",str_data)#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
-                else:
-                    sos_state =  EventMesh.publish("get_dev_state")
-
-                    tmp = 1 << 16
-                    sos_state = sos_state|tmp #第21位=1
-                    EventMesh.publish("set_dev_state",sos_state)
-
-                    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"))
-                    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)
-                    
-                    
-        def sos_time_out_phone(self, msg):#30s超时未打通或者信号不好则重新拨打
-            sos_flag = EventMesh.publish("get_sos_flag")
-            if sos_flag == 1:
-                if self.call_state == 0:
-                    EventMesh.publish("set_sos_info_call") 
-                    
-        def sos_call_out_phone(self, msg):#电话拨出去
-            voiceCall.callStart(self.sos_phone_num)
-        
-
-        def call_test_event(self, event, msg):
-            voiceCall.callStart(str("10086"))
-
-        def get_call_state(self, event, msg):
-            return self.call_state
-        
-        def interup_call_event(self, event, msg):#侧边金属按钮挂断来电
-            flag = EventMesh.publish("get_call_state") 
-            if flag == 2 or flag == 3:#电话通话中 或者呼叫中挂断中断
-                self.call_state = 0
-                voiceCall.callEnd()
-        
-        def dialing_out_event(self, event, msg):#侧边金属按键挂断电话呼叫中
-            flag = EventMesh.publish("get_call_state") 
-            if flag == 1 or flag == 3:#电话呼叫中
-                self.call_state = 0
-                voiceCall.callEnd()
-                
-
-
-        def play_cur_step_event(self, event, msg): #msg 1 播放当前步数
-            flag = EventMesh.publish("get_call_state") 
-            if flag == 0:#电话通话中 或者呼叫中挂断中断
-                if self.fall_flag == 0:
-                    EventMesh.publish("close_timer_all")#
-                step = EventMesh.publish("get_old_step_value")
-                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("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("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("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
-                    else:
-                        step_tmp = str(step)
-                        shi_value = int(step_tmp[0])#十
-                        ge_value = int(step_tmp[1])#个
-                        if shi_value > 1:#大于19步
-                            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("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("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("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("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
-                    else:
-                        step_tmp = str(step)#500
-                        bai_value = int(step_tmp[0])#百
-                        shi_value = int(step_tmp[1])#十
-                        ge_value = int(step_tmp[2])#个
-                        #101 110 1
-                        if shi_value > 0:#110
-                            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("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("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("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
-                                pass
-                            else:
-
-                                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("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("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
-                        pass
-                    else:
-                        one_thousand = step//1000 #千
-                        one_hundred = step%1000 #百
-                        baishu = step%100 #十
-                        shishu = step%10 #个
-                        step_tmp = str(step)
-                        qian = int(step_tmp[0])#千
-                        bai_value = int(step_tmp[1])#百
-                        shi_value = int(step_tmp[2])#十
-                        ge_value = int(step_tmp[3])#个
-                        if bai_value <= 0:
-                            if shi_value <= 0:
-                                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("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("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("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
-                        else:
-                            if shi_value <= 0:#1109
-                                if ge_value == 0:#1110
-                                    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("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("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
-                            else:
-                                if ge_value == 0:#1110
-                                    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_{}".format(shi_value)),\
-                                    audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_STEP_4"))
-                                    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("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
-
-                        pass
-                elif step <= 100000:#万
-                            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("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
-                            else:
-                                step_tmp = str(step)
-                                wang = int(step_tmp[0])#万
-                                qian = int(step_tmp[1])#千
-                                bai_value = int(step_tmp[2])#百
-                                shi_value = int(step_tmp[3])#十
-                                ge_value = int(step_tmp[4])#个
-                                if wang > 0 and qian > 0 and bai_value > 0:#11109 11111
-                                    if shi_value <= 0:#11109
-                                        if ge_value == 0:#11100
-                                            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_{}".format(bai_value)),\
-                                            audio_buf.index("R_READ_STEP_2"),audio_buf.index("R_READ_STEP_4"))
-                                            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)),\
-                                            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_TIME_0"),audio_buf.index("R_READ_TIME_{}".format(ge_value)),\
-                                            audio_buf.index("R_READ_STEP_4"))
-                                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
-                                            pass
-                                    else:
-                                        if ge_value == 0:#11110
-                                            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_{}".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("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)),\
-                                            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_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("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
-                                    if shi_value > 0:
-                                        if ge_value == 0:#11010
-                                            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_{}".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("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("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("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("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
-                                
-                                elif wang > 0:#1
-                                    if bai_value > 0:#百
-                                        if shi_value > 0:#10110
-                                            if ge_value == 0:#10150
-                                                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_{}".format(shi_value)),audio_buf.index("R_READ_STEP_3"),\
-                                                audio_buf.index("R_READ_STEP_4"))
-                                                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("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("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("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
-                                    else:
-                                        if shi_value > 0:
-                                            if ge_value == 0:#10090
-                                                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("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("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("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
-            open_power = EventMesh.publish("get_power_on_state")#获取开机标识
-            if open_power != None:
-                if open_power == 0:
-                    return
-            power_off = EventMesh.publish("get_power_off_state")#获取开机标识
-            if power_off != None:
-                if power_off == 1:
-                    return
-            flag = EventMesh.publish("get_call_state") 
-            get_hr_state = EventMesh.publish("get_hr_state")
-            get_spo2_state = EventMesh.publish("get_spo2_state")
-            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)
-                
-
-
-            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):
-            return self.usbState
-        
-
-
-        def app_factory(self,event,msg):
-            if msg != None:
-                number = str(msg)
-                sms.sendPduMsg(number, 'factory# send ok', 'UCS2')
-            ret = 0
-            ret = ql_fs.path_exists("/usr/static/storage_file")#
-            if ret == True:
-                ql_fs.rmdirs("/usr/static/storage_file")
-                ql_fs.mkdirs("/usr/static/storage_file")
-            if EventMesh.publish(constants.EVENT.GET_CONNECT) == 1:
-                EventMesh.publish(constants.PROTOCOL.DLT_SEND)
-        
-            self.factory_timer.start(6*1000,0,self.factory_cb)
-            pass
-        def factory_cb(self,*argc):
-            self.aud.stopPlayStream()
-            Power.powerRestart()
-
-        def app_restart(self,event,msg):#远程发短信重启
-            if msg != None:
-                number = str(msg)
-                sms.sendPduMsg(number, 'reset# send ok', 'UCS2')
-            self.restart_timer.start(3*1000,0,self.app_restart_cb)
-            pass
-        def app_restart_cb(self,*argc):
-            Power.powerRestart()
-
-        def open_power_on(self, event, msg): #msg 1 开机 2 关机 3 重启  4恢复出厂设置 5静音关机
-            EventMesh.publish("close_timer_all")#
-            if msg == 1:
-                EventMesh.publish("close_hr_sop2")#
-                # 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)
-                self.pwk_timer1.start(1000,0,self.power_on_audio_cb)
-                
-            elif msg == 2:
-                flag = EventMesh.publish("get_call_state") 
-                if flag != 0:#电话呼叫中
-                    self.call_state = 0
-                    voiceCall.callEnd()
-                step = EventMesh.publish("get_old_step_value")
-                # step1 = SC7A20().get_step()
-                # step1 = EventMesh.publish(constants.EVENT.GET_STEP)
-                # step2 = EventMesh.publish("get_storage_config","old_step")
-                self.read_data = EventMesh.publish("get_storage_data")
-                # EventMesh.publish("set_test_data5",[1,step,step1,step2])
-                if step != 0:
-                    EventMesh.publish("set_storage_config",["old_step",step])
-                date_tmp = utime.localtime()
-                time_tmp = utime.mktime(date_tmp)
-                # step3 = EventMesh.publish("get_old_step_value")
-                # step4 = SC7A20().get_step()
-                # step4 = EventMesh.publish(constants.EVENT.GET_STEP)
-                # step5 = EventMesh.publish("get_storage_config","old_step")
-                # EventMesh.publish("set_test_data6",[1,step3,step4,step5])
-                EventMesh.publish("set_storage_config",["old_time",time_tmp])#关机保存一个是时间
-                EventMesh.publish("set_storage_config",["power_state",0])
-                # self.pwk_timer1.start(3000,0,self.power_off_audio_cb)
-                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)
-            elif msg == 3:
-                flag = EventMesh.publish("get_call_state") 
-                if flag != 0:#电话呼叫中
-                    self.call_state = 0
-                    voiceCall.callEnd()
-                EventMesh.publish("close_hr_sop2")#
-                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("stop_led_timer")#设置参数
-                self.power_off = 1
-                self.timer.start(8000,0,self.publish_resatrt_down_event_cb)
-                #EventMesh.publish("set_led_time_arg",[3000,4000,1,led_mode.LONG_LIGHT_GREEN,led_mode.DEFAULT_LONG_LIGHT_MODE])#
-            elif msg == 4:
-                flag = EventMesh.publish("get_call_state") 
-                if flag != 0:#电话呼叫中
-                    self.call_state = 0
-                    voiceCall.callEnd()
-                EventMesh.publish("close_hr_sop2")#
-                EventMesh.publish("stop_led_timer")#设置参数
-                self.power_off = 1
-                ret = 0
-                ret = ql_fs.path_exists("/usr/static/storage_file")#
-                if ret == True:
-                    ql_fs.rmdirs("/usr/static/storage_file")
-                    ql_fs.mkdirs("/usr/static/storage_file")
-                if EventMesh.publish(constants.EVENT.GET_CONNECT) == 1:
-                    EventMesh.publish(constants.PROTOCOL.DLT_SEND)
-                self.aud.stopPlayStream()
-                self.timer.start(6*1000,0,self.fun)
-            elif msg == 5:
-                flag = EventMesh.publish("get_call_state") 
-                if flag != 0:#电话呼叫中
-                    self.call_state = 0
-                    voiceCall.callEnd()
-                step = EventMesh.publish("get_old_step_value")
-                # step1 = SC7A20().get_step()
-                # step1 = EventMesh.publish(constants.EVENT.GET_STEP)
-                # step2 = EventMesh.publish("get_storage_config","old_step")
-                self.read_data = EventMesh.publish("get_storage_data")
-                # EventMesh.publish("set_test_data7",[1,step,step1,step2])
-                if step != 0:
-                    EventMesh.publish("set_storage_config",["old_step",step])
-
-                # step3 = EventMesh.publish("get_old_step_value")
-                # step4 = SC7A20().get_step()
-                # step4 = EventMesh.publish(constants.EVENT.GET_STEP)
-                # step5 = EventMesh.publish("get_storage_config","old_step")
-                # EventMesh.publish("set_test_data8",[1,step3,step4,step5])
-                date_tmp = utime.localtime()
-                time_tmp = utime.mktime(date_tmp)
-                EventMesh.publish("set_storage_config",["old_time",time_tmp])#关机保存一个是时间
-                EventMesh.publish("set_storage_config",["power_state",1])
-                
-                EventMesh.publish("close_hr_sop2")#
-                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)
-                # self.pwk_timer1.start(3000,0,self.power_off_no_audio_cb)#不需要关机铃声
-
-        def fun(self,*argc):
-            self.aud.stopPlayStream()
-            Power.powerRestart()
-            
-
-        def power_on_cb(self, msg): #msg 开机标识
-            self.power_on_flag = 1
-        def clear_power_on_cb(self, msg): #msg 开机标识
-            self.power_on_flag = 0
-        
-        def power_on_audio_cb(self, msg):
-            self.power_on_flag = 1
-            # EventMesh.debug_log("power_on_audio_cb")
-            power_state = EventMesh.publish("get_storage_config","power_state")
-            if power_state == None:
-                power_state = 0
-            # print("power_state",power_state)
-            if power_state <= 0:
-                self.aud.stop()
-                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",[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)
-
-        def get_power_on_state(self, event, msg):
-            return self.power_on_flag
-        
-        def power_off_audio_cb(self, msg):
-            # 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)
-        
-        def power_off_no_audio_cb(self, msg):
-            EventMesh.debug_log("power_off_no_audio_cb")
-            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)
-
-        def set_power_off_cb(self, msg):
-            self.power_off = 1
-
-        def get_power_off_state(self, event, msg):
-            return self.power_off
-
-        def close_hr_sop2(self, event, msg): #msg 关闭心率血氧体温测试
-            get_hr_state = EventMesh.publish("get_hr_state")
-            get_spo2_state = EventMesh.publish("get_spo2_state")
-            get_temp_state = EventMesh.publish("get_temp_state")
-            get_bg_state = EventMesh.publish("get_bg_state")
-            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:
-                    EventMesh.publish("set_hr_state",0)#2代表后台进入测试,定时测心率 1ui界面测试洗心率 
-                    EventMesh.debug_log("sstop hr")
-                    EventMesh.publish(constants.EVENT.STOP_HEART) 
-                if get_spo2_state != 0 :
-                    EventMesh.debug_log("stop spo2")
-                    EventMesh.publish("set_spo2_state",0)#2代表后台进入测试
-                    EventMesh.publish(constants.EVENT.STOP_BLOOD_OXYGEN)
-                if get_temp_state != 0:
-                    EventMesh.debug_log("stop temp")
-                    EventMesh.publish("set_temp_state",0)
-                    EventMesh.publish(constants.EVENT.STOP_TEMP)#手动体温测试
-                if  get_bg_state != 0:
-                    EventMesh.publish("set_bg_state",0)#2代表后台进入测试,定时测心率 1ui界面测试洗心率 
-                    EventMesh.debug_log("sstop bg")
-                    EventMesh.publish(constants.EVENT.STOP_HEART) 
-
-                if  get_bp_state != 0:
-                    EventMesh.publish("set_bp_state",0)#2代表后台进入测试,定时测心率 1ui界面测试洗心率 
-                    EventMesh.debug_log("sstop bp")
-                    EventMesh.publish(constants.EVENT.STOP_HEART) 
-
-        def set_manual_measure_mode(self, event, msg): #手动测试 1心率 2 血氧 3 体温
-            get_hr_state = EventMesh.publish("get_hr_state")
-            get_spo2_state = EventMesh.publish("get_spo2_state")
-            get_temp_state = EventMesh.publish("get_temp_state")
-            if msg == 1:
-                if get_hr_state != 1:#不是手动测试直接打断
-                    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) #手动心率测试
-            elif msg == 2:
-                if get_hr_state == 0:
-                    if get_spo2_state != 1:
-                        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) #手动血氧测试
-            elif msg == 3:
-                if get_temp_state != 1:
-                    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)#手动体温测试
-            pass
-
-
-        def set_start_measure_time(self, event, msg): #手动测试 1心
-            self.hr_auto = msg
-            pass
-
-        def get_start_measure_time(self, event, msg): #手动测试 
-
-            return  self.hr_auto
-        
-        def set_start_temp_measure_time(self, event, msg): #
-            self.temp_auto = msg
-            pass
-
-        def get_start_temp_measure_time(self, event, msg): #
-            return self.temp_auto
-
-        def mearsure_cb(self, event, msg):
-            if msg == 1:
-                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_HSENSOR_RESULT_OK"))
-                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
-            elif msg == 2:
-                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_HSENSOR_RESULT_FAILE"))
-                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data) 
-            elif msg == 3:
-                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_HSENSOR_SPO2_TITLE"))
-                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data) 
-            elif msg == 4:
-                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_HSENSOR_TEMP_TITLE"))
-                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data) 
-            
-            
-            
-        def play_temp_value(self, event, msg): #播放体温数值
-            flag = EventMesh.publish("get_call_state") 
-            if msg != None:
-                if flag == 0 and self.fall_flag == 0:
-                    EventMesh.publish("close_timer_all")#
-                    if msg > 0:
-                        # str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_HSENSOR_RESULT_OK"))
-                        # EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
-                        EventMesh.publish("set_hr_blood_led",2)#测量成功
-                        self.temp_value = msg
-                        # self.timer.start(2*1000,1,self.play_temp_fun)
-                        self.play_temp_fun(0)
-                    else:
-                        str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_HSENSOR_RESULT_FAILE"))
-                        EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
-                        EventMesh.publish("set_hr_blood_led",3)#测量异常
-                else:
-                    EventMesh.publish("set_hr_blood_led",3)#测量异常
-
-        def play_temp_fun(self,argc): #播放体温数值
-            data = self.temp_value
-            if data > 42:
-                data = 42
-            data_tmp = str(data)
-            if data_tmp.find(".") != -1:
-                temp_shi = int(data_tmp.split('.')[0])//10
-                temp_ge = int(data_tmp.split('.')[0])%10
-                dot_ge = int(data_tmp.split('.')[1][:1])
-                if temp_ge > 0:#37.0
-                    if dot_ge > 0:#37.5
-                        str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_HSENSOR_TEMP_TITLE"),audio_buf.index("R_READ_TIME_{}".format(temp_shi)),\
-                        audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_{}".format(temp_ge)),audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT"),\
-                        audio_buf.index("R_READ_TIME_{}".format(dot_ge)))
-                        EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
-
-                    else:#37.0
-                        str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_HSENSOR_TEMP_TITLE"),audio_buf.index("R_READ_TIME_{}".format(temp_shi)),\
-                        audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_{}".format(temp_ge)))
-                        EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
-                else:#30.0 30.6
-                    if dot_ge > 0:
-                        str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_HSENSOR_TEMP_TITLE"),audio_buf.index("R_READ_TIME_{}".format(temp_shi)),\
-                        audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT"),audio_buf.index("R_READ_TIME_{}".format(dot_ge)))
-                        EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
-                    else:
-                        str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_HSENSOR_TEMP_TITLE"),audio_buf.index("R_READ_TIME_{}".format(temp_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:
-                temp_shi = int(data_tmp)//10
-                temp_ge = int(data_tmp)%10
-
-                if temp_ge > 0:#45
-                    str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_HSENSOR_TEMP_TITLE"),audio_buf.index("R_READ_TIME_{}".format(temp_shi)),\
-                    audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_{}".format(temp_ge)))
-                    EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
-                else:
-                    str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_HSENSOR_TEMP_TITLE"),audio_buf.index("R_READ_TIME_{}".format(temp_shi)),\
-                    audio_buf.index("R_READ_STEP_3"))
-                    EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
-                            
-
-        def play_hr_value(self, event, msg): #播放心率数值
-            flag = EventMesh.publish("get_call_state") 
-            if msg != None:
-                if flag == 0 and self.fall_flag == 0:
-                    EventMesh.publish("close_timer_all")#
-                    if msg >= 50:
-                        # str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_HSENSOR_RESULT_OK"))
-                        # 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.play_hr_fun(0)
-                    else:
-                        str_data ='mp3files={}.mp3'.format(audio_buf.index("R_HSENSOR_RESULT_FAILE"))
-                        EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
-                        EventMesh.publish("set_hr_blood_led",3)#测量异常
-                else:
-                    EventMesh.publish("set_hr_blood_led",3)#测量异常
-        
-
-        def play_hr_fun(self,argc):#播放心率测试值
-            flag = EventMesh.publish("get_call_state") 
-            
-            if flag == 0 and self.fall_flag == 0:#电话通话中 或者呼叫中挂断中断
-                EventMesh.publish("close_timer_all")#
-                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)
-
-
-        def play_sugar_value(self, event, msg): #播放血糖数值
-            flag = EventMesh.publish("get_call_state") 
-            if msg != None:
-                if flag == 0 and self.fall_flag == 0:
-                    EventMesh.publish("close_timer_all")#
-                    if msg != 0:
-                        # str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_HSENSOR_RESULT_OK"))
-                        # EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
-                        EventMesh.publish("set_hr_blood_led",2)#测量成功
-                        # self.timer.start(2*1000,1,self.play_spo2_fun)
-                        self.play_sugar_fun(msg)
-                    else:
-                        str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_HSENSOR_RESULT_FAILE"))
-                        EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
-                        EventMesh.publish("set_hr_blood_led",3)#测量异常
-                else:
-                    EventMesh.publish("set_hr_blood_led",3)#测量异常
-
-        def play_sugar_fun(self,argc):#播放血糖测试值
-            flag = EventMesh.publish("get_call_state") 
-            
-            if flag == 0 and self.fall_flag == 0:#电话通话中 或者呼叫中挂断中断
-                EventMesh.publish("close_timer_all")#
-                data = str(argc)
-                data_shi = 0
-                data_ge = 0
-                if data.find(".") != -1:
-                    data_shi = int(data.split(".")[0])
-                    data_ge = int(data.split(".")[1])
-                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)
-            else:
-                EventMesh.publish("set_hr_blood_led",3)#测量异常
-
-
-
-        def play_spo2_value(self, event, msg): #播放血样数值
-            flag = EventMesh.publish("get_call_state") 
-            if msg != None:
-                if flag == 0 and self.fall_flag == 0:
-                    EventMesh.publish("close_timer_all")#
-                    if msg >= 85:
-                        # str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_HSENSOR_RESULT_OK"))
-                        # 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
-                        # self.timer.start(2*1000,1,self.play_spo2_fun)
-                        self.play_spo2_fun(0)
-                    else:
-                        str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_HSENSOR_RESULT_FAILE"))
-                        EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
-                        EventMesh.publish("set_hr_blood_led",3)#测量异常
-                else:
-                    EventMesh.publish("set_hr_blood_led",3)#测量异常
-
-        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")#
-                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)
-
-
-        def set_sim_mode(self, event, msg): #mode 1 蓝灯闪烁 可识别卡 但未联网 2 可绑定appsim正常 3 手表不识别卡或者未插卡
-            flag = EventMesh.publish("get_call_state") 
-            if flag == 0 and self.fall_flag == 0:#电话通话中 或者呼叫中挂断中断
-                EventMesh.publish("close_timer_all")#
-                # EventMesh.publish("stop_led_timer")#设置参数
-                mode = 0
-                signal = EventMesh.publish("get_sim_Status")
-                if signal != None:
-                    if signal == 1:#有卡 
-                        if EventMesh.publish(constants.EVENT.GET_CONNECT) == 1:#未联网提示关机
-                            mode = 2
-                        else:
-                            mode = 1
-                    else:#未插卡
-                        mode = 3
-                if mode == 1:#白色灯
-                    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("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("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("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
-                pass
-            
-        def dial_sos_phone(self, event, msg): #拨打紧急求助电话
-            flag = EventMesh.publish("get_call_state")
-            if flag == 0:
-            
-                signal = EventMesh.publish("screen_get_sig")
-                if signal != None:
-                    if signal >= 0 and signal <= 31:#有卡 
-                        if EventMesh.publish(constants.EVENT.GET_CONNECT) == 1:#未联网提示关机
-                            sos_number = EventMesh.publish("get_dial_sos_number")
-                            if sos_number != None:
-                                if len(sos_number) != 0:
-                                    EventMesh.publish("close_timer_all")#
-                                    EventMesh.publish("set_sos_flag",1)
-                                        
-                                else:#未设置sos紧急求助号码
-                                    EventMesh.publish("close_timer_all")#
-                                    str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_NO_SET_SOS_DIAL"))
-                                    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("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("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
-        
-        def play_cur_time_event(self, event, msg): #播放当前时间
-            flag = EventMesh.publish("get_call_state") 
-            if flag == 0 and self.fall_flag == 0:#电话通话中 或者呼叫中挂断中断
-                EventMesh.publish("close_timer_all")#
-                
-                data = RTC().datetime()
-                hour = data[4]
-                min = data[5]
-                # EventMesh.debug_log("hour",hour,min)
-                self.old_hour = hour
-                self.old_min = min
-                if self.old_hour == 0:
-                    if self.old_min <= 9:#00:09
-                        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"))
-                            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("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
-                            pass
-
-                    else:
-                        if self.old_min % 10 == 0:#0点2十分 0点3十分
-                            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("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("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
-                            pass
-
-                elif self.old_hour <= 9:#8:09 9:20 9:45
-                    if self.old_min <= 9:#9点09分
-                        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("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
-                            pass
-                        else:
-                            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_0"),audio_buf.index("R_READ_TIME_{}".format(self.old_min))\
-                            ,audio_buf.index("R_READ_TIME_MIN"))
-                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
-
-                    else:
-                        if self.old_min % 10 == 0:#9点2十分 9点4十分
-                            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("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("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
-
-
-                else:#12:0
-                    if self.old_min == 0:#12:00 13:00 15:00 20 10 11 12 13 14 15
-                        self.play_count+=1
-                        hour_shi = self.old_hour//10
-                        hour_ge = self.old_hour%10
-                        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("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("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("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("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
-
-                    else:
-                        if self.old_hour == 10:#10:09 10:10
-                            if self.old_min <= 9:
-                                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("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("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("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
-
-                        else:
-                            if self.old_hour < 20:#19:00
-                                if self.old_min <= 9:#19:09 
-                                    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("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_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_0"),audio_buf.index("R_READ_TIME_{}".format(self.old_min % 10))\
-                                        ,audio_buf.index("R_READ_TIME_MIN"))
-                                        EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
-                                    
-                                else:#19:18 19:40 19:56
-                                    if self.old_min % 10 == 0:#十9点2十分 十9点3十分
-                                        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("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("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
-
-                            else:
-                                hour_shi = self.old_hour//10
-                                hour_ge = self.old_hour%10
-
-                                min_shi = self.old_min//10
-                                min_ge = self.old_min%10
-
-                                #20:08 20:18  20:20
-                                if hour_ge == 0:
-                                    if self.old_min <= 9:
-                                        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("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("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
-
-                                    else:
-                                        if min_ge == 0:#2十点2十分
-                                            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("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("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
-
-                                else:#21:08 21:18
-                                    if self.old_min <= 9:
-                                        if self.old_min == 0:
-                                            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("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+{}.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_0")\
-                                            ,audio_buf.index("R_READ_TIME_{}".format(min_ge)),audio_buf.index("R_READ_TIME_MIN"))
-                                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
-                                    else:
-                                        if min_ge == 0:#2十3点3十分
-                                            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_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("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("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
-
-
-        def play_timer_cb_1(self,*agrs):
-            return
-
-        def play_center_phone(self, event, msg): #msg
-            flag = EventMesh.publish("get_call_state")#在通话或者电话拨进 或者拨出不允许设备再次拨出
-            if flag == 0 and self.fall_flag == 0:
-                EventMesh.publish("close_timer_all")#
-            
-                center_dial = EventMesh.publish("get_storage_config","center_dial")
-                if center_dial != None:
-                    if len(center_dial) > 0:
-                        str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_SOS_ALERT"))
-                        EventMesh.publish("play_audio_file",[str_data,0])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
-                        voiceCall.callStart(str(center_dial))
-                        
-                    
-                else:#未设置号码
-                    # EventMesh.debug_log("play_center_phone")
-                    str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_NO_SET_SOS_DIAL"))
-                    EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
-                    pass
-        def center_phone_cb(self,*argc): #msg
-            pass
-
-
-
-
-        def play_imei_event(self, event, msg): #msg
-            flag = EventMesh.publish("get_call_state") 
-            if flag == 0 and self.fall_flag == 0:#电话通话中 或者呼叫中挂断中断
-                EventMesh.publish("close_timer_all")#
-                imei = EventMesh.publish(constants.EVENT.GET_IMEI)
-                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)
-
-
-        def get_unread_wechat_state(self,event, msg): 
-
-            return self.set_unread_wechat
-        
-        def set_unread_wechat_state(self, event, msg): 
-            self.set_unread_wechat = msg
-
-        def get_wechat_data(self,event, msg): 
-
-            return [self.MXA_MSG ,self.wechat_recode_list]
-        
-        def set_wechat_data(self, event, msg): 
-            # EventMesh.debug_log("set_wechat_data1 ",msg,self.wechat_num)
-            self.MXA_MSG = msg[0]
-            self.wechat_recode_list = msg[1]
-            self.wechat_num = self.wechat_recode_list["num"]
-            with open("/usr/static/storage_file/wechat_record.json","w",encoding="utf-8") as fd:
-                ujson.dump(self.wechat_recode_list,fd)
-                #写编号
-            # EventMesh.debug_log("set_wechat_data2:{} ".format(self.wechat_num))
-        
-
-        def get_wechat_time(self, event, msg):
-            return  [self.press_btn,self.timeSecond]
-
-        def start_wechat_record(self, event, msg): #开始录音相关配置
-            if EventMesh.publish(constants.EVENT.GET_CONNECT) == 1:#未联网不需要录音
-                flag = EventMesh.publish("get_call_state") 
-                if flag == 0 and self.fall_flag == 0:#电话通话中 或者呼叫中挂断中断
-                    if self.press_btn == 0:
-                        self.press_btn = 1
-                        audio_state = EventMesh.publish("get_audio_state")
-                        if audio_state == 1:
-                            self.aud.stop()
-                        EventMesh.publish("close_timer_all")#
-                        EventMesh.publish("set_led_time_arg",[1,1,160,led_mode.LONG_LIGHT_GREEN,4,2,led_mode.WECHAT_LED_MODE])#測量成功
-                        # EventMesh.publish("set_led_time_arg",[1000,1000,1,led_mode.LONG_LIGHT_GREEN,led_mode.OPEN_LONG_LIGHT_MODE,led_mode.WECHAT_LED_MODE])#測量成功
-                    
-                        date_tmp = utime.localtime()
-                        time_tmp = utime.mktime(date_tmp)
-                        self.timeSecond = time_tmp#保存按下的时间长s
-                        self.aud.setVolume(11)#设置音量最大
-                        
-                        EventMesh.debug_log("talking1.0")
-                        # if self.wechat_num >= self.MXA_MSG:
-                        #     self.wechat_num = 0 
-                        # self.wechat_num += 1
-                        # self.wechat_show = self.wechat_num
-                        # self.record_test.start("/usr/static/storage_file/{}.amr".format(self.wechat_show),16) 
-                        self.record_test.start("/usr/static/storage_file/wechat.amr",16) 
-                
-            else:
-                self.timeSecond = 0
-                self.press_btn = 0
-        def get_wechat_state(self, event, msg):
-            return self.press_btn
-        def set_wechat_state(self, event, msg):
-            self.press_btn = msg
-
-        def send_wechat_record(self, event, msg): #发送录音文件
-            if self.press_btn == 1:
-                self.press_btn = 0
-                self.record_test.stop() #停止錄音
-                EventMesh.publish("stop_led_timer")#关闭灯
-                EventMesh.publish("set_led_time_arg",[1,1,0,led_mode.FLASH_LIGHT_GREEN,4,2,led_mode.OTHER_MEASURE_MODE])#測量成功
-                # EventMesh.publish("set_led_time_arg",[0,1000,1,led_mode.LONG_LIGHT_GREEN,led_mode.OPEN_LONG_LIGHT_MODE,led_mode.OTHER_MEASURE_MODE])#測量成功
-                self.countdown_old = 0
-
-                date_tmp = utime.localtime()
-                time_tmp = utime.mktime(date_tmp)
-
-                self.countdown_old = msg
-                if self.countdown_old >= 15:
-                    self.countdown_old = 15
-                if self.countdown_old <= 0:
-                    #录音时间太短
-                    return
-                else:
-                    # self.wechat_recode_list["%02d"%(self.wechat_show)] = "read:0"
-                    # self.wechat_recode_list["num"] = self.wechat_show
-                    EventMesh.debug_log("self.wechat_recode_list :{}".format(self.wechat_recode_list))
-
-                    # with open("/usr/static/storage_file/wechat_record.json","w+",encoding="utf-8") as fd:
-                    #     ujson.dump(self.wechat_recode_list,fd)
-                    EventMesh.debug_log("send wechat data!!!!!!!!!!!!!!!!!!!!!")
-
-                    check_txt = ql_fs.path_exists("/usr/static/storage_file/wechat.amr")
-                    if check_txt == True :
-                        path = "/usr/static/storage_file/wechat.amr"
-                        with open(path,"rb") as fd:
-                            buf = bytearray(ql_fs.path_getsize(path))
-                            fd.readinto(buf)
-                            senddata = [self.countdown_old,buf]
-                            EventMesh.publish(constants.PROTOCOL.TKS_SEND,senddata)
-
-                    # with open("/usr/static/storage_file/wechat_record.json","w+",encoding="utf-8") as fd:
-                    #     ujson.dump(self.wechat_recode_list,fd)
-                    # EventMesh.debug_log("send wechat data!!!!!!!!!!!!!!!!!!!!!")
-
-                    # check_txt = ql_fs.path_exists("/usr/static/storage_file/{}.amr".format(self.wechat_show))
-                    # if check_txt == True :
-                    #     path = "/usr/static/storage_file/{}.amr".format(self.wechat_show)
-                    #     with open(path,"rb") as fd:
-                    #         buf = bytearray(ql_fs.path_getsize(path))
-                    #         fd.readinto(buf)
-                    #         senddata = [self.countdown_old,buf]
-                    #         EventMesh.publish(constants.PROTOCOL.TKS_SEND,senddata)
-            else:
-                self.press_btn = 0
-
-
-
-        def play_wechat_last_amr(self, event, msg):#播放微聊最后一条语音文件
-            flag = EventMesh.publish("get_call_state") 
-            if flag == 0:#电话通话中 或者呼叫中挂断中断
-                EventMesh.publish("close_timer_all")#
-                if self.wechat_recode_list != None:
-                    num = 0
-                    play_state = 0
-                    if len(self.wechat_recode_list) > 1:
-                        num = int(self.wechat_recode_list["num"])
-                        #EventMesh.debug_log("self.wechat_recode_list1:{}".format(self.wechat_recode_list))
-                        if num != 0:
-                            last_num = str("%02d"%(num))
-                            last_tmp = self.wechat_recode_list[last_num]
-                            last_read = int(last_tmp.split(":")[1])
-                            if last_read == 1:#如果最后一条没有读则读最新的一条
-                                self.wechat_recode_list[last_num] = "read:0"
-                                self.wechat_recode_list["num"] = num 
-                                with open("/usr/static/storage_file/wechat_record.json","w+",encoding="utf-8") as fd:
-                                    ujson.dump(self.wechat_recode_list,fd)
-                            else:
-                                sotr_new = {}
-                                sotr_new = sorted(self.wechat_recode_list.keys(), reverse=True)#降序排序
-                                # EventMesh.debug_log("sotr_new:{}".format(sotr_new))
-                                for i in range(len(self.wechat_recode_list)-1):#1 01 02 
-                                    key = sotr_new[i+1]
-                                    num_id = int(key)
-                                    #EventMesh.debug_log("key:{} num_id:{}".format(key,num_id))
-                                    if key in self.wechat_recode_list:#
-                                        str_tmp = self.wechat_recode_list[key]
-                                        read = int(str_tmp.split(":")[1])
-                                        if read != 0:#未读是按一下播放下一条同时删除
-                                            check_amr = ql_fs.path_exists("/usr/static/storage_file/{}.amr".format(num_id))#还要检测这个文件是否存在
-                                            if check_amr == True:
-                                                self.wechat_recode_list[key] = "read:0"
-                                                self.wechat_recode_list["num"] = num 
-                                                EventMesh.debug_log("self.wechat_recode_list2:{} num_id:{} num:{}".format(self.wechat_recode_list,num_id,num))
-                                                # self.aud.play(1, 1, '/usr/static/storage_file/{}.amr'.format(num))  #文件名前面要加上路径
-                                                play_state = 1
-                                                with open("/usr/static/storage_file/wechat_record.json","w+",encoding="utf-8") as fd:
-                                                    ujson.dump(self.wechat_recode_list,fd)
-                                                break
-                                            else:
-                                                continue
-                                        else:
-                                            continue
-                                    else:
-                                        continue
-                            #EventMesh.debug_log("play_state:{}".format(play_state))
-                            # if play_state == 0:#
-                            check_amr = ql_fs.path_exists("/usr/static/storage_file/{}.amr".format(num))#还要检测这个文件是否存在
-                            if check_amr == True:
-                                self.aud.play(1, 1, '/usr/static/storage_file/{}.amr'.format(num))  #文件名前面要加上路径
-
-
-        def play_unread_wechat_infor(self,event,msg):#未读微聊语音
-            flag = EventMesh.publish("get_call_state") 
-            if flag == 0 and self.press_btn == 0 and self.fall_flag == 0:#电话通话中 或者呼叫中挂断中断
-                if self.wechat_recode_list != None:
-                    num = 0
-                    play_state = 0
-                    if len(self.wechat_recode_list) > 1:
-                        num = int(self.wechat_recode_list["num"])
-                        if num != 0:
-                            for i in range(len(self.wechat_recode_list)-1):#1 01 02 
-                                key = "%02d"%(i+1)
-                                if key in self.wechat_recode_list:#
-                                    str_tmp = self.wechat_recode_list[key]
-                                    read = int(str_tmp.split(":")[1])
-                                    if read == 1:#未读是按一下播放下一条同时删除
-                                        play_state = 1
-                                    else:
-                                        continue
-                                else:
-                                    continue
-                            if play_state == 1:#设置未读语音状态
-                                EventMesh.publish("set_unread_wechat_state",1)
-                            else:
-                                EventMesh.publish("set_unread_wechat_state",0)
-                                self.updateTime = 0
-
-                state = EventMesh.publish("get_unread_wechat_state")#
-                date_tmp = utime.localtime()
-                time_tmp = utime.mktime(date_tmp)
-                if state != None:
-                    if state == 1:
-                        EventMesh.publish("set_led_time_arg",[1,2,8,led_mode.FLASH_LIGHT_GREEN,8,4,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])#设置参数
-                        if self.updateTime == 0:
-                            self.updateTime = time_tmp
-                        if self.updateTime != 0:
-                            if time_tmp - self.updateTime >= 10*60:
-                                self.updateTime = time_tmp
-                                #播放音频文件
-                                EventMesh.publish("close_timer_all")
-                                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_UNREAD_WECHAT"))
-                                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
-                    else:
-                        self.updateTime = 0
-            
-
-
-
-    class BtnDevice(Abstract):
-
-        def __init__(self, tp=None):
-            self.pk = PowerKey()
-            self.__pwk_timer = osTimer()
-            self.aud = audio.Audio(0)
-            self.aud.set_pa(Pin.GPIO29)
-            self.aud.setVolume(11)
-            # self.keypad = machine.KeyPad(1, 2)
-            self.__PowerDownTimeOut = 3000
-            self.__tp = tp
-            self.pwk_press = 0
-            self.pwk_count = 0
-            self.GPIO26_status = 1#默认是低电平
-            self.powerKey_status = 0
-            self.sosKey = 0
-            self.wechatKey = 0
-            self.sosKey_status = 1#默认是低电平
-            self.WeChatKey_status = 1#默认是低电平
-
-            self.wechatKey_timer = osTimer()
-            self.wechatKey_count = 0
-            self.wechatKey_press = 0 
-
-            self.sosKey_timer = osTimer()
-            self.sosKey_count = 0
-            self.sosKey_press = 0 
-            self.sosKey_long_press = 0
-
-            self.wechatKey_press_count = 0
-
-            self.timeSeconOld = 0
-            self.wechat_state = 0 #按下录音时的状态
-
-            
-            self.sosKey_press_count = 0
-
-
-            self.pwkey_timer = osTimer()
-            self.pwKey_press_count = 0
-            self.pwkey_count = 0
-            self.pwkey_press = 0
-            self.led_state = 0
-            self.hsensorTest_timer = osTimer()
-            self.factoryTest_timer = osTimer()
-            self.factoryTest_count = 0
-            self.factory_timesec = 0
-            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("close_wechat_btn_timer", self.close_wechat_btn_timer)#来电强制关闭微聊语音
-
-        def btnInfo_queue_thread(self):
-            while True:
-                data = self.btnInfo_queue.get()
-                #EventMesh.debug_log("Info_queue:data = {}".format(data))
-                if data != None:
-                    try:
-                        data["func"](data["data"])
-                    except Exception as e:
-                        EventMesh.debug_log("btnInfo_queue:ERROR:{}".format(e))
-                        usys.print_exception(e)
-        def publish_message_event_btnInfo(self,event,msg):
-            self.btnInfo_queue.put(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})  
-
-        def publish_soskey_btn_event_cb(self, *args, **kwargs):
-            EventMesh.publish("publish_message_event_btnInfo",{"func":self.sosKey_press_cb,"data":0})  
-
-        def publish_pwkKey_btn_event_cb(self, *args, **kwargs):
-            EventMesh.publish("publish_message_event_btnInfo",{"func":self.pwKey_press_cb,"data":0})  
-
-    
-
-        def post_processor_after_instantiation(self):
-            # self.keypad.init()
-            # self.keypad.set_callback(self.key_callback)
-        
-            self.pk.powerKeyEventRegister(self.powerKey_callback)
-            
-            self.extint = ExtInt(ExtInt.GPIO26, ExtInt.IRQ_RISING_FALLING, ExtInt.PULL_DISABLE, self.pwk_extint_cb)
-            self.extint.enable()
-
-            self.sosKey = ExtInt(ExtInt.GPIO22, ExtInt.IRQ_RISING_FALLING, ExtInt.PULL_PU, self.sosKey_extint_cb)
-            self.sosKey.enable()
-
-            self.wechatKey = ExtInt(ExtInt.GPIO20, ExtInt.IRQ_RISING_FALLING, ExtInt.PULL_PU, self.wechatKey_extint_cb)
-            self.wechatKey.enable()
-
-            key19 = Pin(Pin.GPIO19, Pin.OUT, Pin.PULL_PU, 0)
-
-        def pwk_extint_cb(self,args):#侧边按键
-            # self.GPIO26_status = self.extint.read_level()
-            
-            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:
-                    return
-            flag = EventMesh.publish("get_call_state")#在通话或者电话拨进 或者拨出不允许寻找设备
-            fall_down = EventMesh.publish("get_fall_down_state")#跌倒报警标识
-            if fall_down != None:
-                if fall_down != 0 or flag == 2:
-                    return
-            self.GPIO26_status = int(args[1])
-            if self.GPIO26_status == 0:
-                self.GPIO26_status = 1
-            else:
-                self.GPIO26_status = 0
-                pass
-            self.WeChatKey_status = self.wechatKey.read_level()
-            if self.sosKey_status != 0 and self.WeChatKey_status != 0:
-                if self.GPIO26_status == 0:#按下
-                    EventMesh.publish("close_wechat_btn_timer")
-                    if self.pwkey_press == 0 :
-                        self.aud.stop()  #播放声音 
-                        # self.wechatKey_timeout_cb(0)
-                        # self.sosKey_timeout_cb(0)
-                        self.wechatKey_timer.stop()
-                        self.pwkey_timer.stop()
-                        self.sosKey_timer.stop()
-                        
-                        self.sosKey_press_count = 0
-                        self.sosKey_press = 0
-                        self.sosKey_long_press = 0
-                        self.wechatKey_press = 0
-                        self.wechat_state = 0
-                        self.wechatKey_press_count = 0
-
-                        self.pwkey_press = 1
-                        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):
-            '''KEY2:联动屏幕右下角或返回键长按关机'''
-            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:
-                    self.pwkey_timer.stop()
-                    self.pwkey_count = 0
-                    self.pwkey_press = 0
-                    self.led_state = 0
-                    self.pwKey_press_count=0
-                    return
-            self.GPIO26_status = self.extint.read_level()
-            if self.pwkey_press == 1 :
-                self.pwkey_count += 1
-                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])#測量成功
-                    if self.pwkey_count >= 10*10:
-                        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
-                        # if EventMesh.publish("get_sim_Status") != 1:
-                        #     EventMesh.publish("open_power_on", 2)#
-                        # else:
-                        EventMesh.publish("open_power_on", 3)#
-                        return
-                    
-                    if self.pwkey_count >= 3*10 :
-                        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
-                            
-                    
-                if self.GPIO26_status == 1:#松开
-                    if self.pwkey_count >= 1: #防抖100ms
-                        # EventMesh.debug_log("self.GPIO26_status == 1")
-                        self.pwkey_timer.stop()
-                        self.pwkey_count = 0
-                        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判断
-
-        def  hsensorTest_timer_cb(self,e):
-            EventMesh.publish("system_sleep_rest")#防止黑屏 
-            w_data = EventMesh.publish(constants.EVENT.GET_WEAR)#佩戴数据
-            #EventMesh.debug_log("FactoryModeHsensorTest{}".format(data))
-        
-            c_data = self.Hsensor.get_test_data()#校准数据和工厂数据
-            # text_data = "   佩戴状态\n红外:{}活体:{}佩戴:{}\n{},{} \n{},{} \n{},{}\n校准数据:{},{},{},{}\n漏光数据:{},{},{}".format(
-            #                                             c_data[3],c_data[4],w_data,c_data[5],c_data[6],c_data[7],c_data[8],c_data[9],c_data[10],
-            #                                                 c_data[11],c_data[12],c_data[13],c_data[14],c_data[0],c_data[1],c_data[2],)
-                
-            if(self.hsensorTest_timer_count != 0):
-                    self.hsensorTest_timer_count -= 1
-                    if self.hsensorTest_timer_count%5 == 0:
-                        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("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
-                            self.Hsensor.close() 
-                            self.Hsensor.init()
-                            self.hsensorTest_timer.stop()
-                            return
-                    if self.hsensorTest_timer_count == 0:#50秒超时,失败
-                        self.Hsensor.close() 
-                        self.Hsensor.init(); 
-                        self.hsensorTest_timer.stop()
-                        str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_HSENSOR_RESULT_FAILE"))
-                        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):
-            EventMesh.publish("publish_message_event_btnInfo",{"func":self.pwKey_timeout_cb,"data":0})  
-        
-        def pwKey_timeout_cb(self, data):#侧边按键
-            boot_count = EventMesh.publish("get_boot_time_count")
-            try :
-                if boot_count < 50 :#开机50秒内按键次数大于10就校准
-                    #EventMesh.debug_log("boot_count:{}".format(boot_count))
-                    if self.pwKey_press_count >= 6:
-                        self.Hsensor =  EventMesh.publish("get_Hsensor")
-                        self.hsensorTest_timer.start(1000,1,self.hsensorTest_timer_cb) 
-                        EventMesh.debug_log("打开校准模式")
-                        self.Hsensor.set_sar(1)
-                        self.Hsensor.open_test(255) #打开校准模式
-                        utime.sleep_ms(500)
-                        self.Hsensor.open_heart()
-                        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("play_audio_file",[str_data,1])
-                        self.pwKey_press_count = 0
-                        return
-
-            except Exception as e:
-                usys.print_exception(e)
-            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:
-                    self.pwkey_timer.stop()
-                    self.pwkey_count = 0
-                    self.pwkey_press = 0
-                    self.led_state = 0
-                    self.pwKey_press_count=0
-                    return
-            if self.pwKey_press_count >= 1:
-                self.pwKey_press_count = 0
-
-                # flag = EventMesh.publish("get_call_state") 
-                # if flag != 2:#如果是电话拨出去或者不在打电话中都可以执行
-                #     EventMesh.publish("stop_led_timer")#设置参数
-                #     if flag == 1:#如果是sos电话拨出去
-                #         sos_flag = EventMesh.publish("get_sos_flag")
-                #         if sos_flag == 1:
-                #             EventMesh.publish("set_sos_flag",0)
-                #             EventMesh.publish("set_sos_num",0)
-                #             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 != 1:#在拨出去或者通话中就不播报入网成功的语音
-                #         EventMesh.publish("set_sim_mode")#
-                #     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")#设置参数
-                    EventMesh.publish("dialing_out_event")#电话呼叫中voiceCall.callEnd()
-
-                    if flag == 1:#如果是sos电话拨出去
-                        sos_flag = EventMesh.publish("get_sos_flag")
-                        if sos_flag == 1:
-                            EventMesh.publish("set_sos_flag",0)
-                            EventMesh.publish("set_sos_num",0)
-                            EventMesh.publish("set_hangup_mode",0)
-                    EventMesh.publish("close_hr_sop2")#
-                    flag = EventMesh.publish("get_call_state") 
-                    if flag != 1:
-                        EventMesh.publish("set_sim_mode")#
-            
-            self.pwKey_press_count = 0
-
-        def sosKey_extint_cb(self,args):
-            power_off = EventMesh.publish("get_power_off_state")#获取关机标识
-            open_power = EventMesh.publish("get_power_on_state")#获取开机标识
-            if power_off != None and open_power != None:
-                if power_off == 1 or open_power == 0:
-                    return
-            # self.sosKey_status = self.sosKey.read_level()
-            self.sosKey_status = int(args[1])
-            if self.sosKey_status == 0:
-                self.sosKey_status = 1
-            else:
-                self.sosKey_status = 0
-                pass
-            # wechat_state = EventMesh.publish("get_wechat_state")
-            # EventMesh.debug_log('### key22_extint_cb  {} {} self.GPIO22_status:{} {} {}'.format(wechat_state,args,self.WeChatKey_status,self.GPIO26_status,self.sosKey_status)) # args[0]:gpio号 args[1]:上升沿或下降沿
-            if self.WeChatKey_status != 0 and self.GPIO26_status != 0:
-                if self.sosKey_status == 0:#按下
-                    EventMesh.publish("close_falldown_alarm_event")#sos短按事件
-                    EventMesh.publish("close_wechat_btn_timer")
-                    if self.sosKey_press == 0 :
-                        self.led_state = 0
-                        self.wechatKey_timer.stop()
-                        self.pwkey_timer.stop()
-                        self.sosKey_timer.stop()
-                        self.wechatKey_press_count = 0
-                        self.wechat_state = 0
-                        self.wechatKey_count = 0
-                        self.pwKey_press_count = 0
-                        
-                        self.pwkey_press = 0
-                        self.wechatKey_press = 0
-                        
-                        self.sosKey_long_press = 0
-                        self.sosKey_count = 0
-                        self.sosKey_press = 1
-                        self.sosKey_timer.start(100, 1, self.publish_soskey_btn_event_cb)
-            # EventMesh.debug_log("key22_extint_cb:self.key22_timer.start!!!!\n")
-
-        def sosKey_press_cb(self, data):
-            '''KEY2:联动屏幕右下角或返回键长按关机'''
-            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:
-                    self.sosKey_timer.stop()
-                    self.sosKey_count = 0
-                    self.sosKey_press = 0
-                    self.sosKey_long_press = 0
-                    self.sosKey_press_count = 0
-                    return
-            self.sosKey_status = self.sosKey.read_level()
-            if self.sosKey_press == 1 :
-                # if self.sosKey_count <= 2:
-                    # if EventMesh.publish(constants.EVENT.GET_CONNECT) == 1:#未联网不需要录音
-                    #     EventMesh.publish("set_led_time_arg",[1000,200,1,led_mode.FLASH_LIGHT_GREEN,led_mode.DEFAULT_LONG_LIGHT_MODE,led_mode.OTHER_MEASURE_MODE])#设置参数
-                    # else:
-                    #     EventMesh.publish("set_led_time_arg",[1000,200,1,led_mode.FLASH_LIGHT_RED,led_mode.DEFAULT_LONG_LIGHT_MODE,led_mode.OTHER_MEASURE_MODE])#设置参数
-                self.sosKey_count += 1
-                if self.sosKey_count >= 10*3: #长按3s sos拨号
-                    if self.sosKey_long_press == 0:
-                        self.sosKey_long_press = 1
-                        flag = EventMesh.publish("get_call_state")#在通话或者电话拨进 或者拨出不允许寻找设备
-                        fall_down = EventMesh.publish("get_fall_down_state")#跌倒报警标识
-                        if fall_down != None:
-                            if fall_down != 0 or flag == 2:
-                                return
-                        EventMesh.publish_async("dial_sos_phone")#拨打sos号码
-                        return
-                    if self.sosKey_status == 1:#松开
-                        self.sosKey_count = 0
-                        self.sosKey_long_press = 0
-                        self.sosKey_press = 0
-                        self.sosKey_timer.stop()
-                        return
-
-                # EventMesh.debug_log("self.sosKey_count {}",self.sosKey_count)
-                if self.sosKey_status == 1:#松开
-                    if self.sosKey_count >= 1: #防抖100ms
-                        self.sosKey_timer.stop()
-                        self.sosKey_count = 0
-                        self.sosKey_press = 0
-                        self.sosKey_long_press = 0
-                        self.sosKey_press_count+=1
-                        self.sosKey_timer.start(500, 0, self.publish_sosKey_timeout_cb_do)#松手超时1s判断
-        def publish_sosKey_timeout_cb_do(self, *args, **kwargs):
-            EventMesh.publish("publish_message_event_btnInfo",{"func":self.sosKey_timeout_cb,"data":0})  
-        
-        def close_factory_test(self):#关闭老化测试
-            if self.factoryTest_flag == 1:
-                self.factoryTest_flag = 0
-                close_led_white()
-                close_led_red()
-                close_led_green()
-                self.factoryTest_led_count = 0
-                self.factoryTest_count = 0
-                self.aud.stopPlayStream()
-                self.factoryTest_timer.stop()
-
-        def factoryTest_timer_cb(self,e):
-            # self.factoryTest_count+=1
-            date_tmp = utime.localtime()
-            time_tmp = utime.mktime(date_tmp)
-
-            if time_tmp - self.factory_timesec > 60*60*2:#老化测试2小时自动退出
-                # self.factoryTest_count = 0
-                self.close_factory_test()
-                return
-            #播放音频 
-            str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_ALARM_NEW"))
-            if EventMesh.publish("get_audio_state") == 0:
-                self.aud.montage_play('U:/static/audio.bin',1,1,str_data)
-            #led灯常亮
-            self.factoryTest_led_count+=1
-            if self.factoryTest_led_count == 1:#1  4 7  10 
-                open_led_red()
-                close_led_green()
-                close_led_white()
-            elif self.factoryTest_led_count == 2:
-                open_led_green()
-                close_led_red()
-                close_led_white()
-            elif self.factoryTest_led_count == 3: #3  6 9 12 
-                open_led_white()
-                close_led_red()
-                close_led_green()
-            if self.factoryTest_led_count >= 3+1:
-                self.factoryTest_led_count = 0
-            
-            
-
-
-            pass
-        def sosKey_timeout_cb(self, data):#
-            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:
-                    self.sosKey_timer.stop()
-                    self.sosKey_count = 0
-                    self.sosKey_press = 0
-                    self.sosKey_long_press = 0
-                    self.sosKey_press_count = 0
-                    return
-            factory_count = EventMesh.publish("get_factory_test_time")
-            print("factory_count:%d",factory_count)
-            try :
-                if factory_count <= 30 :#开机30秒内按键次数大于15进入测试模式
-                    #EventMesh.debug_log("boot_count:{}".format(boot_count))
-                    if self.sosKey_press_count >= 15:
-                        self.factoryTest_timer.start(1000,1,self.factoryTest_timer_cb)
-                        date_tmp = utime.localtime()
-                        time_tmp = utime.mktime(date_tmp)
-                        self.factory_timesec = time_tmp
-                        self.sosKey_press_count = 0
-                        self.factoryTest_led_count = 0
-                        self.factoryTest_flag = 1
-                        return
-
-            except Exception as e:
-                usys.print_exception(e)
-
-            # EventMesh.debug_log("sosKey_press_count!!!!!!!!!!!!!! ",self.sosKey_press_count)
-            flag = EventMesh.publish("get_call_state")#在通话或者电话拨进 或者拨出不允许寻找设备
-            fall_down = EventMesh.publish("get_fall_down_state")#跌倒报警标识
-            if self.sosKey_press_count > 1:#短按十次解绑app
-                if fall_down != None:
-                    if fall_down != 0 or flag == 2:
-                        self.sosKey_press_count = 0
-                        return
-            if self.sosKey_press_count == 10:#
-                self.sosKey_press_count = 0
-                pass
-            elif self.sosKey_press_count == 6:#
-                self.sosKey_press_count = 0
-                self.close_factory_test()
-                pass
-            elif self.sosKey_press_count == 5:#功能暂时屏蔽
-                self.sosKey_press_count = 0
-                call_state = EventMesh.publish("get_call_state")
-                battery = EventMesh.publish("screen_get_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)#测量体温
-                pass
-            elif self.sosKey_press_count == 4:#拨打app快捷号码
-                self.sosKey_press_count = 0
-                EventMesh.publish("stop_led_timer")#设置参数
-                EventMesh.publish("play_center_phone")#拨打快捷号码
-                # EventMesh.publish("call_phonebook_num",3)
-                pass
-            elif self.sosKey_press_count == 3:#测试心率
-                self.sosKey_press_count = 0
-                
-                call_state = EventMesh.publish("get_call_state")
-                battery = EventMesh.publish("screen_get_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",1)#
-                pass
-            elif self.sosKey_press_count == 2:#播报当前步数
-                self.sosKey_press_count = 0
-                EventMesh.publish("stop_led_timer")#设置参数
-                EventMesh.publish("play_cur_step_event")#
-                pass
-            elif self.sosKey_press_count == 1:#挂断来电 短语音播报
-                self.sosKey_press_count = 0
-                EventMesh.publish("stop_led_timer")#设置参数
-                EventMesh.publish("sos_short_press")#sos短按事件
-                
-                pass
-            self.sosKey_press_count = 0
-
-
-        def wechatKey_extint_cb(self,args):
-            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:
-                    return
-            fall_down = EventMesh.publish("get_fall_down_state")#跌倒报警标识
-            if fall_down != None:
-                if fall_down != 0:
-                    return
-            # self.WeChatKey_status = self.wechatKey.read_level()
-            self.WeChatKey_status = int(args[1])
-            if self.WeChatKey_status == 0:
-                self.WeChatKey_status = 1
-            else:
-                self.WeChatKey_status = 0
-                pass
-            
-            # EventMesh.debug_log('### wechatKey_extint_cb  {} {} self.WeChatKey_status:{} {} {}'.format(wechat_state,args,self.sosKey_status,self.GPIO26_status,self.WeChatKey_status)) # args[0]:gpio号 args[1]:上升沿或下降沿
-            if self.sosKey_status != 0 and self.GPIO26_status != 0:
-                if self.WeChatKey_status == 0:#按下
-                    if self.wechatKey_press == 0:
-                        # self.pwKey_timeout_cb(0)
-                        # self.sosKey_timeout_cb(0)
-                        self.wechatKey_timer.stop()
-                        self.pwkey_timer.stop()
-                        self.sosKey_timer.stop()
-                        self.sosKey_press_count = 0
-                        self.sosKey_long_press = 0
-                        self.pwKey_press_count = 0
-                        self.sosKey_press = 0
-                        self.pwkey_press = 0
-                        self.wechatKey_press = 1
-                        self.led_state = 0
-                        self.wechatKey_count = 0
-                        self.wechat_state = 0
-                        self.wechatKey_timer.start(100, 1, self.publish_wechat_btn_event_cb)
-                else:
-                    # EventMesh.debug_log('### wechatKey_extint_cb end')
-                    EventMesh.publish("close_wechat_btn_timer")
-
-
-        def close_wechat_btn_timer(self,event,*argc):
-            tmp = EventMesh.publish("get_wechat_time")#获取微聊时间戳
-            wechat_time = 0
-            time_tmp = 0
-            time_sec = 0
-
-            if tmp != None:
-                if tmp[0] == 1:
-                    self.wechatKey_timer.stop()
-                    self.wechatKey_count = 0
-                    self.wechatKey_press = 0
-                    self.wechat_state = 0
-                    self.wechatKey_press_count=0
-                    
-                    date_tmp = utime.localtime()
-                    time_tmp = utime.mktime(date_tmp)
-                    time_sec = tmp[1]
-                    wechat_time = time_tmp - time_sec
-                    # EventMesh.debug_log("close_btn_timer",time_tmp,time_sec,wechat_time)
-                    if wechat_time >= 15:
-                        wechat_time = 15
-                    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")#获取开机标识
-            if open_power != None and open_power_off != None:
-                if open_power == 0 or open_power_off == 1:
-                    self.wechatKey_timer.stop()
-                    self.wechatKey_count = 0
-                    self.wechatKey_press = 0
-                    self.wechat_state = 0
-                    self.wechatKey_press_count=0
-                    return
-            self.WeChatKey_status = self.wechatKey.read_level()
-            # print("100ms self.WeChatKey_status",self.WeChatKey_status)
-            wechat_time = 0
-            tmp = None
-            time_sec = 0
-            time_tmp = 0
-            date_tmp = utime.localtime()
-            time_tmp = utime.mktime(date_tmp)
-            '''KEY2:联动屏幕右下角或返回键长按关机'''
-            if self.wechatKey_press == 1 :#是否按下
-                tmp = EventMesh.publish("get_wechat_time")#获取微聊时间戳
-                self.wechatKey_count += 1
-                if self.wechatKey_count >= 15: #长按1s进入微聊录音
-                    flag = EventMesh.publish("get_call_state") 
-                    fall_down = EventMesh.publish("get_fall_down_state")#跌倒报警标识
-                    if flag != None:
-                        if flag == 0 and fall_down == 0:
-                            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
-                                else:
-                                    self.wechat_state = 0
-                                    self.wechatKey_timer.stop()
-                                    self.wechatKey_count = 0
-                                    self.wechatKey_press = 0
-                                    self.wechatKey_press_count=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)#发送录音文件内容
-                                                
-                                                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
-                        else:
-                            self.wechatKey_timer.stop()
-                            self.wechatKey_count = 0
-                            self.wechat_state = 0
-                            self.wechatKey_press = 0
-                            self.wechatKey_press_count=0
-                            return
-                if self.WeChatKey_status == 1:#松开
-                    if self.wechatKey_count >= 1: #防抖100ms
-                        # EventMesh.debug_log("WeChat time!!!!!!!!!!!!!!")
-                        self.wechatKey_timer.stop()
-                        self.wechatKey_count = 0
-                        self.wechatKey_press = 0
-                        self.wechat_state = 0
-                        self.wechatKey_press_count+=1
-                        self.wechatKey_timer.start(500, 0, self.publish_wechatKey_btn_event_cb)#松手超时1s判断
-
-        def publish_wechatKey_btn_event_cb(self, *args, **kwargs):
-            EventMesh.publish("publish_message_event_btnInfo",{"func":self.wechatKey_timeout_cb,"data":0})  
-
-        def wechatKey_timeout_cb(self,data):#微聊键
-            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:
-                    self.wechatKey_timer.stop()
-                    self.wechatKey_count = 0
-                    self.wechatKey_press = 0
-                    self.wechat_state = 0
-                    self.wechatKey_press_count=0
-                    return
-            flag = EventMesh.publish("get_call_state")#在通话或者电话拨进 或者拨出不允许寻找设备
-            fall_down = EventMesh.publish("get_fall_down_state")#跌倒报警标识
-            if self.wechatKey_press_count > 1:#
-                if fall_down != None:
-                    if fall_down != 0 or flag == 2:
-                        self.wechatKey_press_count = 0
-                        return
-            # EventMesh.debug_log("wechatKey_timeout_cb!!!!!!!!!!!!!! ",self.wechatKey_press_count)
-            if self.wechatKey_press_count == 10:#短按十次解绑app
-                self.wechatKey_press_count = 0
-                EventMesh.publish("stop_led_timer")#设置参数
-                EventMesh.publish("open_power_on", 4)#恢复出厂
-                pass
-            elif self.wechatKey_press_count == 6:#短按六次播报imei号
-                self.wechatKey_press_count = 0
-                EventMesh.publish("stop_led_timer")#设置参数
-                EventMesh.publish("play_imei_event")#播報imei号
-                pass
-            elif self.wechatKey_press_count == 4:#拨打通讯录号码三
-                self.wechatKey_press_count = 0
-                EventMesh.publish("stop_led_timer")#设置参数
-                EventMesh.publish("call_phonebook_num",3)
-                pass
-            elif self.wechatKey_press_count == 3:#拨打通讯录号码二
-                self.wechatKey_press_count = 0
-                EventMesh.publish("stop_led_timer")#设置参数
-                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:#播放最后收到的语音
-                self.wechatKey_press_count = 0
-                EventMesh.publish("stop_led_timer")#设置参数
-                call_state = EventMesh.publish("get_call_state") 
-                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号码
-                            return
-                else:
-                    if call_state == 2:#电话拨进需要接听
-                        EventMesh.publish("answer_call_event")#接听电话
-                        return
-                EventMesh.publish("play_wechat_last_amr")
-                # pass
-            self.wechatKey_press_count = 0
-
-
-        def pwk_press_cb(self, *args):
-            '''KEY2:联动屏幕右下角或返回键长按关机'''
-            if self.pwk_press == 1 :
-                
-                self.pwk_count += 1
-                EventMesh.debug_log("self.pwk_count {}",self.pwk_count)
-                if self.GPIO26_status == 1:#松开
-                    if self.pwk_count >= 1: #防抖100ms
-                        self.__pwk_timer.stop()
-                        self.pwk_count = 0
-                        self.pwk_press = 0
-                        EventMesh.debug_log("self.GPIO22_status")
-
-                if self.pwk_count > (self.__PowerDownTimeOut//100): #长按
-                    self.__pwk_timer.stop()
-                    self.pwk_count = 0
-                    self.pwk_press = 0
-                    EventMesh.debug_log("btn8_long_press")
-
-        def __ui_callback(self, para):
-        # EventMesh.debug_log("para = {}".format(para))
-            if para == 0:
-                EventMesh.publish("done_left_to_right")
-                #EventMesh.debug_log("<-")
-            elif para == 1:
-                EventMesh.publish("done_right_to_left")
-                #EventMesh.debug_log("->")
-            elif para == 2:
-                EventMesh.publish("done_bottom_to_top")
-                #EventMesh.debug_log("^")
-            elif para == 3:
-                EventMesh.publish("done_top_to_bottom")
-                #EventMesh.debug_log("V")
-            elif para == 4:
-                EventMesh.publish("done_return")
-                #EventMesh.debug_log("return")
-            elif para == 5:
-                EventMesh.publish("done_click")
-                #EventMesh.debug_log("CLICK")
-            elif para == 6:
-                EventMesh.publish("done_press")
-                #EventMesh.debug_log("press")
-            elif (para == 6):
-                EventMesh.publish("done_error")
-                #EventMesh.debug_log("error")
-
-        def key_callback(self, l_list):
-            EventMesh.debug_log("key_callback:",str(l_list))
-            if l_list[0] == 1:
-                # 马达震动预留
-                pass
-            if (l_list[1] == 3) and (l_list[2] == 0):
-                if l_list[0] == 1:
-                    #self.pwk_press = 0
-                    EventMesh.publish("btn1_press")
-                else:
-                    pass
-                    # EventMesh.publish("btn1_press")
-
-
-
-
-        def powerKey_callback(self, status):
-            EventMesh.debug_log('==pwr:', status)# 0 1 0
-            self.powerKey_status = status
-            if self.pwk_press == 1: #按按钮时不处理
-                return
-        
-            
-                
-
-        def power_key_press_cb(self, *args):
-            pass
-            # if EventMesh.publish(constants.EVENT.GET_CONNECT) == 0:#未插卡的情况下强制关机
-                # EventMesh.publish("open_power_on", 2)#
-
-
-        def start(self):
-            self.post_processor_after_instantiation()
+from common import Abstract\r
+import machine\r
+import osTimer\r
+from misc import PowerKey\r
+import EventMesh\r
+from machine import Pin\r
+from machine import ExtInt\r
+import constants\r
+import utime\r
+import audio\r
+import ql_fs\r
+import ujson\r
+import voiceCall\r
+from misc import Power\r
+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\r
+from machine import RTC\r
+from queue import Queue\r
+import _thread\r
+import usys\r
+import sms\r
+from Gsensor import SC7A20\r
+if EventMesh.model == "D10" :\r
+    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']\r
+\r
+\r
+    class intervManager(Abstract):\r
+        def __init__(self):\r
+            self.timer = osTimer()\r
+\r
+            self.pwk_timer1 = osTimer()\r
+            self.pwk_timer2 = osTimer()\r
+            self.timer1 = osTimer()\r
+            self.sos_timer2 = osTimer()\r
+            self.sos_timer1 = osTimer()\r
+\r
+            self.sos_sendtime = osTimer()\r
+\r
+            self.fall_timer1 = osTimer()\r
+            self.fall_timer2 = osTimer()\r
+\r
+            self.alarm_timer1 = osTimer()\r
+\r
+            self.find_timer1 = osTimer()\r
+            self.fall_flag = 0\r
+\r
+            self.factory_timer = osTimer()\r
+            \r
+            self.restart_timer = osTimer()\r
+\r
+            self.aud = audio.Audio(0)\r
+            self.aud.set_pa(Pin.GPIO29)\r
+            self.aud.setVolume(11)\r
+            self.play_count = 0\r
+            self.count = 0\r
+\r
+            self.get_hr_state  = 0\r
+            self.get_spo2_state = 0\r
+            self.timeSec = 0\r
+            self.timeTempSec = 0\r
+\r
+            self.hr_value = 0\r
+            self.spo2_value = 0\r
+            self.temp_value = 0\r
+\r
+            self.usbState = 0\r
+\r
+            self.setp_old = 0\r
+            self.step_tmp = ""\r
+            self.step_num = 0\r
+            self.power_off = 0\r
+            self.call_state = 0\r
+\r
+            self.find_state = 0\r
+            self.FIND_timer_count = 0\r
+\r
+            self.old_hour = 0\r
+            self.alarm_state = 0\r
+            self.alarm_timer_count = 0\r
+            self.old_min = 0\r
+            self.interInfo_queue = Queue()\r
+            _thread.stack_size(10*1024+64)\r
+            _thread.start_new_thread(self.interInfo_queue_thread, ())\r
+            _thread.stack_size(8*1024)\r
+            EventMesh.subscribe("publish_message_event_interInfo",self.publish_message_event_interInfo)\r
+            \r
+\r
+            self.audio_event_queue = Queue()\r
+            _thread.stack_size(10*1024+128)\r
+            _thread.start_new_thread(self.audio_event_queue_thread, ())\r
+            _thread.stack_size(8*1024)\r
+            EventMesh.subscribe("publish_message_event_audio",self.publish_message_event_audio)\r
+\r
+            self.record_test = audio.Record()\r
+            self.record_test.gain_set(4,12)\r
+\r
+            self.timeSecond = 0\r
+            self.wechat_show = 0\r
+            self.sort_new = {}\r
+            self.time_min = 0\r
+            self.press_btn = 0\r
+            self.countdown_old = 0\r
+            self.set_unread_wechat = 0\r
+            self.updateTime = 0\r
+            \r
+            self.power_on_flag = 0\r
+\r
+            self.MXA_MSG = 1\r
+            self.wechat_recode_list = {"num":0}\r
+            self.wechat_num = 0\r
+            self.read_data = {}\r
+            self.volum_size = 8 \r
+            self.phone_num = ''\r
+            self.sos_phone_num = ''\r
+            self.msg_tmp = ""\r
+            self.time_count = 0\r
+            self.alarm_count = 0\r
+            self.audio_int = 0\r
+\r
+            self.hr_auto = 0\r
+\r
+            self.temp_auto = 0\r
+            \r
+            check_txt = ql_fs.path_exists("/usr/static/storage_file/wechat_record.json")\r
+            if check_txt == True :\r
+                with open("/usr/static/storage_file/wechat_record.json","r") as fd:#音频文件编号\r
+                    self.wechat_recode_list = ujson.load(fd)\r
+                    if not self.wechat_recode_list:\r
+                        self.wechat_recode_list = {"num":0}\r
+                        self.wechat_num = 0\r
+            else:\r
+                self.wechat_recode_list = {"num":0}\r
+                with open("/usr/static/storage_file/wechat_record.json","w+",encoding="utf-8") as fd:\r
+                    ujson.dump(self.wechat_recode_list,fd)         \r
+\r
+\r
+        def post_processor_after_instantiation(self):\r
+            EventMesh.subscribe("open_power_on", self.open_power_on)#开机关机\r
+\r
+            EventMesh.subscribe("play_imei_event", self.play_imei_event)#播報imei号\r
+            EventMesh.subscribe("play_center_phone", self.play_center_phone)#拨打快捷号码\r
+            EventMesh.subscribe("play_cur_time_event", self.play_cur_time_event)#播放当前时间\r
+\r
+            EventMesh.subscribe("OPEN_FIND_WATCH", self.send_find_watch)#查找设备\r
+            EventMesh.subscribe("STOP_FIND_WATCH", self.stop_find_watch)#是否需要关闭查找设备\r
+            EventMesh.subscribe("close_timer_all", self.close_timer_all)#关闭相关定时器\r
+\r
+            EventMesh.subscribe("dial_sos_phone", self.dial_sos_phone)#长按3s拨打sos求助号码\r
+\r
+            EventMesh.subscribe("set_sim_mode", self.set_sim_mode)#sim检测\r
+\r
+            EventMesh.subscribe("close_hr_sop2", self.close_hr_sop2)#关闭健康测试\r
+            EventMesh.subscribe("set_manual_measure_mode", self.set_manual_measure_mode)#设置测试模式\r
+            EventMesh.subscribe("set_start_measure_time", self.set_start_measure_time)#设置开始测量的时间戳时间\r
+            EventMesh.subscribe("get_start_measure_time", self.get_start_measure_time)#获取开始测量的时间戳时间\r
+            EventMesh.subscribe("set_start_temp_measure_time", self.set_start_temp_measure_time)#设置体温开始测量的时间戳时间\r
+            EventMesh.subscribe("get_start_temp_measure_time", self.get_start_temp_measure_time)#获取体温开始测量的时间戳时间\r
+            EventMesh.subscribe("play_hr_value", self.play_hr_value)#播放心率数值\r
+            EventMesh.subscribe("play_spo2_value", self.play_spo2_value)#播放心率数值\r
+            EventMesh.subscribe("play_temp_value", self.play_temp_value)#播放体温数值\r
+\r
+            EventMesh.subscribe("play_sugar_value", self.play_sugar_value)#播放血糖数值\r
+\r
+\r
+            EventMesh.subscribe("set_usb", self.set_usb)#\r
+            EventMesh.subscribe("get_usb", self.get_usb)#\r
+\r
+            EventMesh.subscribe("play_cur_step_event", self.play_cur_step_event)#\r
+\r
+            EventMesh.subscribe("set_call_state", self.set_call_state)#1是 拨出去呼叫中 2是播进来 3 是正在通话中 0是无效\r
+            EventMesh.subscribe("get_call_state", self.get_call_state)#\r
+            EventMesh.subscribe("interup_call_event", self.interup_call_event)#\r
+            EventMesh.subscribe("answer_call_event", self.answer_call_event)#接听电话\r
+            EventMesh.subscribe("dialin_call_event", self.dialin_call_event)#电话拨进响铃\r
+            EventMesh.subscribe("dialing_out_event", self.dialing_out_event)#电话呼叫中\r
+            EventMesh.subscribe("call_test_event", self.call_test_event)#电话拨进响铃测试\r
+\r
+            EventMesh.subscribe("dial_out_call_center_cb", self.dial_out_call_center_cb)#电话拨出去\r
+            EventMesh.subscribe("sos_out_call_center_cb", self.sos_out_call_center_cb)#sos拨打\r
+\r
+            EventMesh.subscribe("close_audio_play", self.close_audio_play)#关闭音频\r
+\r
+\r
+            EventMesh.subscribe("start_wechat_record", self.start_wechat_record)#手表开始录音\r
+            EventMesh.subscribe("send_wechat_record", self.send_wechat_record)#发送微聊语音文件to app\r
+            EventMesh.subscribe("play_wechat_last_amr", self.play_wechat_last_amr)#播放微聊语音最后一条语音文件\r
+            EventMesh.subscribe("get_wechat_data", self.get_wechat_data)\r
+            EventMesh.subscribe("set_wechat_data", self.set_wechat_data)\r
+            EventMesh.subscribe("play_unread_wechat_infor", self.play_unread_wechat_infor)#按键播放最近一条微聊语音\r
+            EventMesh.subscribe("set_unread_wechat_state", self.set_unread_wechat_state)#设置未读标识\r
+            EventMesh.subscribe("get_unread_wechat_state", self.get_unread_wechat_state)#获取未读标志\r
+            EventMesh.subscribe("get_wechat_time", self.get_wechat_time)#获取微聊时间戳\r
+            EventMesh.subscribe("get_wechat_state", self.get_wechat_state)#获取微聊状态\r
+            EventMesh.subscribe("set_wechat_state", self.set_wechat_state)#设置微聊状态\r
+\r
+\r
+            EventMesh.subscribe("get_power_on_state", self.get_power_on_state)#获取开机标识\r
+            EventMesh.subscribe("get_power_off_state", self.get_power_off_state)#获取关机标识\r
+\r
+            EventMesh.subscribe("play_audio_file", self.play_audio_file)#获取播放音频文件\r
+\r
+            EventMesh.subscribe("OPEN_ALARM_RING", self.send_alarm_ring)#闹钟到点响铃\r
+            EventMesh.subscribe("STOP_ALARM_RING", self.stop_alarm_ring)#是否需要关闭闹钟\r
+\r
+            EventMesh.subscribe("recv_wechat_audio", self.recv_wechat_audio)#\r
+\r
+\r
+            EventMesh.subscribe("sos_short_press", self.sos_short_press)#sos短按事件\r
+\r
+            EventMesh.subscribe("falldown_alarm_event", self.falldown_alarm_event)#跌倒报警\r
+\r
+            EventMesh.subscribe("close_falldown_alarm_event", self.close_falldown_alarm_event)#关闭跌倒报警\r
+\r
+            EventMesh.subscribe("drink_alarm_event", self.drink_alarm_event)#该喝水了\r
+\r
+            EventMesh.subscribe("medicine_alarm_event", self.medicine_alarm_event)#该吃药了\r
+\r
+            EventMesh.subscribe("wakeup_alarm_event", self.wakeup_alarm_event)#该起床了\r
+\r
+            EventMesh.subscribe("home_alarm_event", self.home_alarm_event)#该回家了\r
+\r
+            EventMesh.subscribe("sleep_alarm_event", self.sleep_alarm_event)#该睡觉了\r
+\r
+            EventMesh.subscribe("reset_alarm_event", self.reset_alarm_event)#该休息了\r
+\r
+            EventMesh.subscribe("reset_end_alarm_event", self.reset_end_alarm_event)#休息结束了\r
+\r
+            EventMesh.subscribe("get_fall_down_state", self.get_fall_down_state)#跌倒报警标识\r
+\r
+            EventMesh.subscribe("app_factory", self.app_factory)#app恢复出厂\r
+\r
+            EventMesh.subscribe("app_restart", self.app_restart)#远程重启\r
+\r
+        \r
+\r
+        def interInfo_queue_thread(self):\r
+            while True:\r
+                data = self.interInfo_queue.get()\r
+                #EventMesh.debug_log("interInfo_queue_thread:data = {}".format(data))\r
+                if data != None:\r
+                    try:\r
+                        data["func"](data["data"])\r
+                    except Exception as e:\r
+                        EventMesh.debug_log("interInfo_queue_thread:ERROR:{}".format(e))\r
+                        usys.print_exception(e)\r
+\r
+        def publish_message_event_interInfo(self,event,msg):\r
+            self.interInfo_queue.put(msg)\r
+\r
+        def publish_call_event_cb(self, *args, **kwargs):#拨打电话\r
+            EventMesh.publish("publish_message_event_interInfo",{"func":self.call_timer_cb,"data":0})  \r
+\r
+        def publish_resatrt_down_event_cb(self, *args, **kwargs):#重启设备\r
+            EventMesh.publish("publish_message_event_interInfo",{"func":self.powe_resatrt_down_fun,"data":0})  \r
+        \r
+        def publish_power_down_event_cb(self, *args, **kwargs):#关机\r
+            EventMesh.publish("publish_message_event_interInfo",{"func":self.power_down_fun,"data":0})  \r
+\r
+        def publish_find_watch_event_cb(self, *args, **kwargs):#查找设备\r
+            EventMesh.publish("publish_message_event_interInfo",{"func":self.FIND_timer_cb,"data":0})  \r
+\r
+        def publish_alarm_ring_event_cb(self, *args, **kwargs):#闹钟响铃\r
+            EventMesh.publish("publish_message_event_interInfo",{"func":self.Alarm_timer_cb,"data":0})  \r
+\r
+        def publish_reset_alarm_ring_event_cb(self, *args, **kwargs):#休息响铃\r
+            EventMesh.publish("publish_message_event_interInfo",{"func":self.reset_alarm_event_cb,"data":0})  \r
+        \r
+        def publish_reset_end_alarm_ring_event_cb(self, *args, **kwargs):#休息结束响铃\r
+            EventMesh.publish("publish_message_event_interInfo",{"func":self.reset_end_alarm_event_cb,"data":0})  \r
+        \r
+        def publish_sleep_alarm_ring_event_cb(self, *args, **kwargs):#睡觉响铃\r
+            EventMesh.publish("publish_message_event_interInfo",{"func":self.sleep_alarm_event_cb,"data":0})  \r
+        \r
+        def publish_home_ring_event_cb(self, *args, **kwargs):#回家响铃\r
+            EventMesh.publish("publish_message_event_interInfo",{"func":self.home_alarm_event_cb,"data":0})  \r
+\r
+        def publish_wakeup_ring_event_cb(self, *args, **kwargs):#起床响铃\r
+            EventMesh.publish("publish_message_event_interInfo",{"func":self.wakeup_alarm_event_cb,"data":0})  \r
+\r
+        def publish_medicine_ring_event_cb(self, *args, **kwargs):#吃药响铃\r
+            EventMesh.publish("publish_message_event_interInfo",{"func":self.medicine_alarm_event_cb,"data":0})  \r
+\r
+        def publish_drink_ring_event_cb(self, *args, **kwargs):#喝水响铃\r
+            EventMesh.publish("publish_message_event_interInfo",{"func":self.drink_alarm_event_cb,"data":0})  \r
+\r
+        def publish_fall_done_ring_event_cb(self, *args, **kwargs):#跌倒提醒\r
+            EventMesh.publish("publish_message_event_interInfo",{"func":self.falldown_alarm_cb,"data":0})  \r
+\r
+\r
+        def reset_alarm_event(self,args,msg):#该休息了\r
+            wechat_state = EventMesh.publish("get_wechat_state")\r
+            if self.call_state == 0 and wechat_state == 0 and self.fall_flag == 0:\r
+                self.alarm_count = 0\r
+                self.alarm_timer1.start(2000, 1, self.publish_reset_alarm_ring_event_cb)\r
+                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_RESET_ALARM"))\r
+                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件\r
+        def reset_alarm_event_cb(self,args):#该休息了\r
+            wechat_state = EventMesh.publish("get_wechat_state")\r
+            if self.call_state == 0 and wechat_state == 0 and self.fall_flag == 0:\r
+                self.alarm_count += 1\r
+                if self.alarm_count >= 3:\r
+                    self.alarm_count = 0\r
+                    self.alarm_timer1.stop()\r
+                    return\r
+                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_RESET_ALARM"))\r
+                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件\r
+            else:\r
+                self.alarm_count = 0\r
+                self.alarm_timer1.stop()\r
+\r
+        def reset_end_alarm_event(self,args,msg):#休息结束了\r
+            wechat_state = EventMesh.publish("get_wechat_state")\r
+            if self.call_state == 0 and wechat_state == 0 and self.fall_flag == 0:\r
+                self.alarm_count = 0\r
+                self.alarm_timer1.start(2000, 1, self.reset_end_alarm_event_cb)\r
+                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_RESET_END_ALARM"))\r
+                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件\r
+        \r
+        def reset_end_alarm_event_cb(self,args):#休息结束了\r
+            wechat_state = EventMesh.publish("get_wechat_state")\r
+            if self.call_state == 0 and wechat_state == 0 and self.fall_flag == 0:\r
+                self.alarm_count += 1\r
+                if self.alarm_count >= 3:\r
+                    self.alarm_count = 0\r
+                    self.alarm_timer1.stop()\r
+                    return\r
+                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_RESET_END_ALARM"))\r
+                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件\r
+            else:\r
+                self.alarm_count = 0\r
+                self.alarm_timer1.stop()\r
+        \r
+        def sleep_alarm_event(self,args,msg):#该睡觉了\r
+            wechat_state = EventMesh.publish("get_wechat_state")\r
+            if self.call_state == 0 and wechat_state == 0 and self.fall_flag == 0:\r
+                self.alarm_count = 0\r
+                self.alarm_timer1.start(2000, 1, self.publish_sleep_alarm_ring_event_cb)\r
+                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_SLEEP_ALARM"))\r
+                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件\r
+        def sleep_alarm_event_cb(self,args):#该睡觉了\r
+            wechat_state = EventMesh.publish("get_wechat_state")\r
+            if self.call_state == 0 and wechat_state == 0 and self.fall_flag == 0:\r
+                self.alarm_count += 1\r
+                if self.alarm_count >= 3:\r
+                    self.alarm_count = 0\r
+                    self.alarm_timer1.stop()\r
+                    return\r
+                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_SLEEP_ALARM"))\r
+                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件\r
+            else:\r
+                self.alarm_count = 0\r
+                self.alarm_timer1.stop()\r
+\r
+\r
+        def home_alarm_event(self,args,msg):#该回家了\r
+            wechat_state = EventMesh.publish("get_wechat_state")\r
+            if self.call_state == 0 and wechat_state == 0 and self.fall_flag == 0:\r
+                self.alarm_count = 0\r
+                self.alarm_timer1.start(2000, 1, self.publish_home_ring_event_cb)\r
+                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_HOME_ALARM"))\r
+                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件\r
+        \r
+        def home_alarm_event_cb(self,args):#该回家了\r
+            wechat_state = EventMesh.publish("get_wechat_state")\r
+            if self.call_state == 0 and wechat_state == 0 and self.fall_flag == 0:\r
+                self.alarm_count += 1\r
+                if self.alarm_count >= 3:\r
+                    self.alarm_count = 0\r
+                    self.alarm_timer1.stop()\r
+                    return\r
+                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_HOME_ALARM"))\r
+                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件\r
+            else:\r
+                self.alarm_count = 0\r
+                self.alarm_timer1.stop()\r
+        \r
+        def wakeup_alarm_event(self,args,msg):#该起床了\r
+            wechat_state = EventMesh.publish("get_wechat_state")\r
+            if self.call_state == 0 and wechat_state == 0 and self.fall_flag == 0:\r
+                self.alarm_count = 0\r
+                self.alarm_timer1.start(2000, 1, self.publish_wakeup_ring_event_cb)\r
+                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_WAKEUP_ALARM"))\r
+                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件\r
+        \r
+        def wakeup_alarm_event_cb(self,args):#该起床了\r
+            wechat_state = EventMesh.publish("get_wechat_state")\r
+            if self.call_state == 0 and wechat_state == 0 and self.fall_flag == 0:\r
+                self.alarm_count += 1\r
+                if self.alarm_count >= 3:\r
+                    self.alarm_count = 0\r
+                    self.alarm_timer1.stop()\r
+                    return\r
+                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_WAKEUP_ALARM"))\r
+                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件\r
+            else:\r
+                self.alarm_count = 0\r
+                self.alarm_timer1.stop()\r
+\r
+\r
+        def medicine_alarm_event(self,args,msg):#该吃药了\r
+            wechat_state = EventMesh.publish("get_wechat_state")\r
+            if self.call_state == 0 and wechat_state == 0 and self.fall_flag == 0:\r
+                self.alarm_count = 0\r
+                self.alarm_timer1.start(2000, 1, self.publish_medicine_ring_event_cb)\r
+                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_MEDICINE_ALARM"))\r
+                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件\r
+\r
+        def medicine_alarm_event_cb(self,args):#该吃药了\r
+            wechat_state = EventMesh.publish("get_wechat_state")\r
+            if self.call_state == 0 and wechat_state == 0 and self.fall_flag == 0:\r
+                self.alarm_count += 1\r
+                if self.alarm_count >= 3:\r
+                    self.alarm_count = 0\r
+                    self.alarm_timer1.stop()\r
+                    return\r
+                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_MEDICINE_ALARM"))\r
+                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件\r
+            else:\r
+                self.alarm_count = 0\r
+                self.alarm_timer1.stop()\r
+\r
+        def drink_alarm_event(self,args,msg):#该喝水了\r
+            wechat_state = EventMesh.publish("get_wechat_state")\r
+            if self.call_state == 0 and wechat_state == 0 and self.fall_flag == 0:\r
+                self.alarm_count = 0\r
+                self.alarm_timer1.start(2000, 1, self.publish_drink_ring_event_cb)\r
+                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_DRINK_ALARM"))\r
+                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件\r
+            \r
+\r
+\r
+        def drink_alarm_event_cb(self,args):#该喝水了\r
+            wechat_state = EventMesh.publish("get_wechat_state")\r
+            if self.call_state == 0 and wechat_state == 0 and self.fall_flag == 0:\r
+                self.alarm_count += 1# 1 2 \r
+                if self.alarm_count >= 3:\r
+                    self.alarm_count = 0\r
+                    self.alarm_timer1.stop()\r
+                    return\r
+                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_DRINK_ALARM"))\r
+                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件\r
+            else:\r
+                self.alarm_count = 0\r
+                self.alarm_timer1.stop()\r
+            \r
+        def falldown_alarm_event(self,args,msg):#跌倒报警启动中提示\r
+            flag = EventMesh.publish("get_call_state")#在通话或者电话拨进 或者拨出不允许寻找设备\r
+            wechat_state = EventMesh.publish("get_wechat_state")\r
+            if flag == 0 and wechat_state == 0:\r
+                EventMesh.publish("close_timer_all")#\r
+                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_FALL_ALARM"))\r
+                self.time_count = 0\r
+                self.fall_flag = 0\r
+                self.fall_timer1.stop()\r
+                self.fall_flag = 1\r
+                self.fall_timer1.start(4000, 1, self.publish_fall_done_ring_event_cb)\r
+                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件\r
+\r
+        def falldown_alarm_cb(self,*args):\r
+            wechat_state = EventMesh.publish("get_wechat_state")\r
+            if self.call_state == 0 and wechat_state == 0:\r
+                self.time_count+=1\r
+                if self.time_count >= 5:\r
+                    self.time_count = 0\r
+                    self.fall_timer1.stop()\r
+                    EventMesh.publish_async("dial_sos_phone")#拨打sos号码\r
+                    return\r
+                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_FALL_ALARM"))\r
+                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件\r
+            else:\r
+                self.time_count = 0\r
+                self.fall_timer1.stop()\r
+        \r
+        def close_falldown_alarm_event(self,event,msg):#跌倒挂断挂断\r
+            if self.fall_flag == 1:#跌倒标志\r
+                self.fall_flag = 0\r
+                self.fall_timer1.stop()\r
+                self.sos_timer1.stop()\r
+                self.sos_timer2.stop()\r
+                if self.call_state != 0:\r
+                    self.call_state = 0\r
+                    voiceCall.callEnd()\r
+                sos_flag = EventMesh.publish("get_sos_flag")\r
+                if sos_flag == 1:\r
+                    self.call_state = 0\r
+                    EventMesh.publish("set_sos_flag",0)\r
+                    EventMesh.publish("set_sos_num",0)\r
+                    EventMesh.publish("set_hangup_mode",0)\r
+\r
+        \r
+\r
+        def send_find_watch(self, event, msg): #发送查找设备指令\r
+            open_power = EventMesh.publish("get_power_on_state")#获取开机标识\r
+            if open_power != None:\r
+                if open_power == 0:\r
+                    return\r
+            power_off = EventMesh.publish("get_power_off_state")#获取开机标识\r
+            if power_off != None:\r
+                if power_off == 1:\r
+                    return\r
+            flag = EventMesh.publish("get_call_state")#在通话或者电话拨进 或者拨出不允许寻找设备\r
+            wechat_state = EventMesh.publish("get_wechat_state")\r
+            if flag == 0 and wechat_state == 0 and self.fall_flag == 0: \r
+                EventMesh.publish("close_timer_all")#\r
+                self.find_state = 1\r
+                self.FIND_timer_count = 0\r
+                self.alarm_timer1.start(3000,1,self.publish_find_watch_event_cb)\r
+                EventMesh.publish("set_led_time_arg",[1,1,330,led_mode.LONG_LIGHT_GREEN,2,1,led_mode.OTHER_MEASURE_MODE])#測量成功\r
+                # 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])#设置参数\r
+                str_data = 'mp3files={}.mp3'.format(audio_buf.index("audio_find_haixiu"))\r
+                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+        \r
+        def stop_find_watch(self, event, msg): \r
+            if self.find_state == 1:\r
+                self.find_state = 0\r
+                self.FIND_timer_count = 0\r
+                # EventMesh.publish("stop_led_timer")#设置参数\r
+                self.aud.stopPlayStream()  #播放声音 \r
+                self.alarm_timer1.stop()\r
+\r
+        def FIND_timer_cb(self, data):\r
+            flag = EventMesh.publish("get_call_state")#在通话或者电话拨进 或者拨出不允许寻找设备\r
+            wechat_state = EventMesh.publish("get_wechat_state")\r
+            if flag == 0 and wechat_state == 0 and self.fall_flag == 0:\r
+                if self.find_state == 1:\r
+                    # EventMesh.debug_log("self.FIND_timer_count:{}".format(self.FIND_timer_count))\r
+                    str_data = 'mp3files={}.mp3'.format(audio_buf.index("audio_find_haixiu"))\r
+                    EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+                    self.FIND_timer_count += 1\r
+                    if self.FIND_timer_count > 10: #120秒30s\r
+                        EventMesh.publish("STOP_FIND_WATCH")\r
+            else:\r
+                self.FIND_timer_count = 0\r
+                self.alarm_timer1.stop()\r
+                \r
+        \r
+        def stop_FIND(self) :\r
+            self.alarm_timer1.stop()\r
+\r
+        def send_alarm_ring(self, event, msg): #发送查找设备指令\r
+            open_power = EventMesh.publish("get_power_on_state")#获取开机标识\r
+            if open_power != None:\r
+                if open_power == 0:\r
+                    return\r
+            power_off = EventMesh.publish("get_power_off_state")#获取开机标识\r
+            if power_off != None:\r
+                if power_off == 1:\r
+                    return\r
+            flag = EventMesh.publish("get_call_state")#在通话或者电话拨进 或者拨出不允许寻找设备\r
+            wechat_state = EventMesh.publish("get_wechat_state")\r
+            if flag == 0 and wechat_state == 0 and self.fall_flag == 0:\r
+                EventMesh.publish("close_timer_all")#\r
+                self.alarm_state = 1\r
+                self.alarm_timer_count = 0\r
+                self.alarm_timer1.start(3000,1,self.publish_alarm_ring_event_cb)\r
+                # EventMesh.publish("set_led_time_arg",[1,1,330,led_mode.LONG_LIGHT_GREEN,2,1,led_mode.OTHER_MEASURE_MODE])#測量成功\r
+                # 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])#设置参数\r
+                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_ALARM_NEW"))\r
+                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+        \r
+        def stop_alarm_ring(self, event, msg): #停止闹钟响铃\r
+            if self.alarm_state == 1:\r
+                self.alarm_state = 0\r
+                self.alarm_timer_count = 0\r
+                # EventMesh.publish("stop_led_timer")#设置参数\r
+                self.aud.stopPlayStream()  #停止播放\r
+                self.alarm_timer1.stop()\r
+\r
+        def Alarm_timer_cb(self, data):\r
+            flag = EventMesh.publish("get_call_state")#在通话或者电话拨进 或者拨出不允许寻找设备\r
+            wechat_state = EventMesh.publish("get_wechat_state")\r
+            if flag == 0 and wechat_state == 0 and self.fall_flag == 0:\r
+                if self.alarm_state == 1:\r
+                    # EventMesh.debug_log("self.alarm_timer_count:{}".format(self.alarm_timer_count))\r
+                    str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_ALARM_NEW"))\r
+                    EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+                    self.alarm_timer_count += 1\r
+                    if self.alarm_timer_count > 15: #120秒30s\r
+                        EventMesh.publish("STOP_ALARM_RING")\r
+            else:\r
+                self.alarm_timer_count = 0\r
+                self.alarm_timer1.stop()\r
+\r
+        def get_fall_down_state(self,event,msg):\r
+            return self.fall_flag\r
+\r
+        def sos_short_press(self,args,msg):\r
+            EventMesh.publish("interup_call_event")#如果在电话中强制挂断电话\r
+            EventMesh.publish("close_audio_play")#强制关闭音频文件播放\r
+            EventMesh.publish("STOP_FIND_WATCH")#停止查找设备\r
+            EventMesh.publish("STOP_ALARM_RING")#停止闹钟响铃\r
+            EventMesh.publish("play_cur_time_event")#播报当前时间\r
+            #播报当前时间\r
+\r
+        def recv_wechat_audio(self,event,str_data):#接收微聊语音播放\r
+            wechat_state = EventMesh.publish("get_wechat_state")\r
+            if self.call_state == 0 and self.fall_flag == 0 and wechat_state == 0: \r
+                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_WECHAT_RECV"))\r
+                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件\r
+\r
+\r
+\r
+        def audio_event_queue_thread(self):\r
+            while True:\r
+                data = self.audio_event_queue.get()\r
+                #EventMesh.debug_log("audio_event_queue:data = {}".format(data))\r
+                if data != None:\r
+                    try:\r
+                        data["func"](data["data"])\r
+                    except Exception as e:\r
+                        EventMesh.debug_log("audio_event_queue:ERROR:{}".format(e))\r
+                        usys.print_exception(e)\r
+        def publish_message_event_audio(self,event,msg):\r
+            self.audio_event_queue.put(msg)\r
+\r
+        def play_audio_file(self, *args, **kwargs):#播放音频文件\r
+            # EventMesh.debug_log("args",args)\r
+            # EventMesh.publish("publish_message_event_audio",{"func":self.play_audio_file_do,"data":args[1]})  \r
+            data = args[1]\r
+            self.play_audio_file_do(data)\r
+\r
+        def play_audio_file_do(self,data):#msg 拼接的路径文件\r
+            open_power = EventMesh.publish("get_power_on_state")#获取开机标识\r
+            power_off = EventMesh.publish("get_power_off_state")#获取开机标识\r
+            # EventMesh.debug_log("play_audio_file",data[0],data[1],open_power,power_off)#路径 str_data[1] 是否需要被打断\r
+            if open_power != None:\r
+                if open_power == 0:\r
+                    return\r
+            if power_off != None:\r
+                if power_off == 1:\r
+                    return\r
+            self.aud.montage_play('U:/static/audio.bin',1,data[1],data[0])\r
+            # EventMesh.debug_log("play_audio_file end",data[0],data[1])#路径 str_data[1] 是否需要被打断\r
+            \r
+\r
+\r
+\r
+\r
+        def powe_resatrt_down_fun(self, *args):#重启设备\r
+            EventMesh.publish("close_led_pin")\r
+            self.aud.stopPlayStream()\r
+            Power.powerRestart()\r
+\r
+        def power_down_fun(self, *args):\r
+            EventMesh.publish("close_led_pin")\r
+            self.aud.stopPlayStream()\r
+            Power.powerDown()\r
+\r
+\r
+\r
+        def close_audio_play(self, event, msg): #msg\r
+            open_power = EventMesh.publish("get_power_on_state")#获取开机标识\r
+            power_off = EventMesh.publish("get_power_off_state")#获取开机标识\r
+            if open_power != None:\r
+                if open_power == 0:\r
+                    return\r
+            if power_off != None:\r
+                if power_off == 1:\r
+                    return\r
+            self.aud.stopPlayStream()\r
+\r
+\r
+\r
+        def close_timer_all(self, event, msg): \r
+            # EventMesh.debug_log("close_timer_all!!!!!!!!!!!!!!!!!!!")\r
+            open_power = EventMesh.publish("get_power_on_state")#获取开机标识\r
+            power_off = EventMesh.publish("get_power_off_state")#获取开机标识\r
+            if open_power != None:\r
+                if open_power == 0:\r
+                    return\r
+            if power_off != None:\r
+                if power_off == 1:\r
+                    return\r
+            self.aud.stopPlayStream()\r
+            \r
+            \r
+            self.timer.stop()\r
+            self.sos_timer2.stop()\r
+            self.sos_timer1.stop()\r
+            self.fall_flag = 0\r
+            self.fall_timer1.stop()\r
+            self.alarm_timer1.stop()\r
+        \r
+\r
+        def answer_call_event(self, event, msg): #\r
+            if self.call_state == 2:\r
+                sos_flag = EventMesh.publish("get_sos_flag")\r
+                if sos_flag == 1:\r
+                    self.call_state = 0\r
+                    EventMesh.publish("set_sos_flag",0)\r
+                    EventMesh.publish("set_sos_num",0)\r
+                    EventMesh.publish("set_hangup_mode",0)\r
+                EventMesh.publish("close_timer_all")#\r
+                voiceCall.callAnswer()\r
+\r
+        def set_call_state(self, event, msg): #\r
+            self.call_state = msg\r
+\r
+        def dialin_call_event(self, event, msg):\r
+            open_power = EventMesh.publish("get_power_on_state")#获取开机标识\r
+            if open_power != None:\r
+                if open_power == 0:\r
+                    return\r
+            power_off = EventMesh.publish("get_power_off_state")#获取开机标识\r
+            if power_off != None:\r
+                if power_off == 1:\r
+                    return\r
+            EventMesh.publish("close_timer_all")#\r
+            EventMesh.publish("close_wechat_btn_timer")#\r
+            EventMesh.publish("set_led_time_arg",[1,2,10*10,led_mode.FLASH_LIGHT_RED,10,5,led_mode.OTHER_MEASURE_MODE])#測量成功\r
+            self.timer.start(6000, 1, self.publish_call_event_cb)\r
+            str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_CALL_mp3"))\r
+            EventMesh.publish("play_audio_file",[str_data,0])#获取播放音频文件\r
+            # EventMesh.publish("play_audio_file",str_data)#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+        \r
+        def call_timer_cb(self,data):\r
+            open_power = EventMesh.publish("get_power_on_state")#获取开机标识\r
+            if open_power != None:\r
+                if open_power == 0:\r
+                    return\r
+            power_off = EventMesh.publish("get_power_off_state")#获取开机标识\r
+            if power_off != None:\r
+                if power_off == 1:\r
+                    return\r
+            if self.call_state != 2:\r
+                EventMesh.publish("stop_led_timer")#设置参数\r
+                EventMesh.publish("close_timer_all")#\r
+                return\r
+            EventMesh.publish("set_led_time_arg",[1,2,10*10,led_mode.FLASH_LIGHT_RED,10,5,led_mode.OTHER_MEASURE_MODE])#測量成功\r
+            str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_CALL_mp3"))\r
+            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件\r
+        \r
+        def dial_out_call_center_cb(self, event, msg):#电话拨出去\r
+            open_power = EventMesh.publish("get_power_on_state")#获取开机标识\r
+            if open_power != None:\r
+                if open_power == 0:\r
+                    return\r
+            power_off = EventMesh.publish("get_power_off_state")#获取开机标识\r
+            if power_off != None:\r
+                if power_off == 1:\r
+                    return\r
+            # EventMesh.debug_log("dial_out_call_center_cb",msg)\r
+            if self.call_state == 0:\r
+                self.phone_num = ''\r
+                EventMesh.publish("close_timer_all")#\r
+                if msg == None:\r
+                    str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_NO_SET_SOS_DIAL"))\r
+                    EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件\r
+                    # EventMesh.publish("play_audio_file",str_data)#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+                else:\r
+                    self.phone_num = str(msg)\r
+                    str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_SOS_ALERT"))\r
+                    EventMesh.publish("play_audio_file",[str_data,0])#获取播放音频文件\r
+                    self.timer1.start(2000, 0, self.time_out_phone)\r
+                    \r
+        \r
+        def time_out_phone(self, msg):#电话拨出去\r
+            voiceCall.callStart(self.phone_num)\r
+\r
+        def sos_out_call_center_cb(self, event, msg):#sos电话呼叫中\r
+            open_power = EventMesh.publish("get_power_on_state")#获取开机标识\r
+            if open_power != None:\r
+                if open_power == 0:\r
+                    return\r
+            power_off = EventMesh.publish("get_power_off_state")#获取开机标识\r
+            if power_off != None:\r
+                if power_off == 1:\r
+                    return\r
+            self.sos_phone_num = ''\r
+            # EventMesh.debug_log("sos_out_call_center_cb",msg)\r
+            if self.call_state == 0:\r
+            \r
+                EventMesh.publish("close_timer_all")#\r
+                if msg == None:\r
+                    str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_NO_SET_SOS_DIAL"))\r
+                    EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件\r
+                    # EventMesh.publish("play_audio_file",str_data)#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+                else:\r
+                    sos_state =  EventMesh.publish("get_dev_state")\r
+\r
+                    tmp = 1 << 16\r
+                    sos_state = sos_state|tmp #第21位=1\r
+                    EventMesh.publish("set_dev_state",sos_state)\r
+\r
+                    EventMesh.publish(constants.EVENT.START_LOCATION,[constants.PROTOCOL.AL_SEND,sos_state]) #开始AL定位\r
+                    EventMesh.publish("close_timer_all")#\r
+                    self.sos_phone_num = msg\r
+                    str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_SOS_ALERT"))\r
+                    EventMesh.publish("play_audio_file",[str_data,0])#获取播放音频文件\r
+                    self.sos_timer1.start(2000, 0, self.sos_call_out_phone)\r
+                    self.sos_timer2.start(30000, 0, self.sos_time_out_phone)\r
+                    \r
+                    \r
+        def sos_time_out_phone(self, msg):#30s超时未打通或者信号不好则重新拨打\r
+            sos_flag = EventMesh.publish("get_sos_flag")\r
+            if sos_flag == 1:\r
+                if self.call_state == 0:\r
+                    EventMesh.publish("set_sos_info_call") \r
+                    \r
+        def sos_call_out_phone(self, msg):#电话拨出去\r
+            voiceCall.callStart(self.sos_phone_num)\r
+        \r
+\r
+        def call_test_event(self, event, msg):\r
+            voiceCall.callStart(str("10086"))\r
+\r
+        def get_call_state(self, event, msg):\r
+            return self.call_state\r
+        \r
+        def interup_call_event(self, event, msg):#侧边金属按钮挂断来电\r
+            flag = EventMesh.publish("get_call_state") \r
+            if flag == 2 or flag == 3:#电话通话中 或者呼叫中挂断中断\r
+                self.call_state = 0\r
+                voiceCall.callEnd()\r
+        \r
+        def dialing_out_event(self, event, msg):#侧边金属按键挂断电话呼叫中\r
+            flag = EventMesh.publish("get_call_state") \r
+            if flag == 1 or flag == 3:#电话呼叫中\r
+                self.call_state = 0\r
+                voiceCall.callEnd()\r
+                \r
+\r
+\r
+        def play_cur_step_event(self, event, msg): #msg 1 播放当前步数\r
+            flag = EventMesh.publish("get_call_state") \r
+            if flag == 0:#电话通话中 或者呼叫中挂断中断\r
+                if self.fall_flag == 0:\r
+                    EventMesh.publish("close_timer_all")#\r
+                step = EventMesh.publish("get_old_step_value")\r
+                EventMesh.debug_log("step",step)\r
+                self.setp_old = step\r
+                if step <= 10:#\r
+                    if step == 10:#十步\r
+                        str_data = 'mp3files={}.mp3+{}.mp3'.format(audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_STEP_4"))\r
+                        EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+                    else:# 9步\r
+                        str_data = 'mp3files={}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(step)),audio_buf.index("R_READ_STEP_4"))\r
+                        EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+                elif step <= 100:#十 90\r
+                    if step == 100:\r
+                        str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_1"),audio_buf.index("R_READ_STEP_2"),\\r
+                            audio_buf.index("R_READ_STEP_4"))\r
+                        EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+                    else:\r
+                        step_tmp = str(step)\r
+                        shi_value = int(step_tmp[0])#十\r
+                        ge_value = int(step_tmp[1])#个\r
+                        if shi_value > 1:#大于19步\r
+                            if ge_value == 0:#9十步 70十步\r
+                                str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(shi_value)),audio_buf.index("R_READ_STEP_3"),\\r
+                                audio_buf.index("R_READ_STEP_4"))\r
+                                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+                            else:#9十2步\r
+                                str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(shi_value)),audio_buf.index("R_READ_STEP_3"),\\r
+                                audio_buf.index("R_READ_TIME_{}".format(ge_value)),audio_buf.index("R_READ_STEP_4"))\r
+                                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+                        else:#十9步\r
+                            str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_{}".format(ge_value)),\\r
+                            audio_buf.index("R_READ_STEP_4"))\r
+                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+                elif step <= 1000:\r
+                    if step == 1000:#1千步\r
+                        str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_1"),\\r
+                        audio_buf.index("R_READ_STEP_1"),audio_buf.index("R_READ_STEP_4"))\r
+                        EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+                    else:\r
+                        step_tmp = str(step)#500\r
+                        bai_value = int(step_tmp[0])#百\r
+                        shi_value = int(step_tmp[1])#十\r
+                        ge_value = int(step_tmp[2])#个\r
+                        #101 110 1\r
+                        if shi_value > 0:#110\r
+                            if ge_value == 0:\r
+                                str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(bai_value)),\\r
+                                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"))\r
+                                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+                            else:\r
+                                str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(bai_value)),\\r
+                                audio_buf.index("R_READ_STEP_2"),audio_buf.index("R_READ_TIME_{}".format(shi_value)),audio_buf.index("R_READ_STEP_3"),\\r
+                                audio_buf.index("R_READ_TIME_{}".format(ge_value)),audio_buf.index("R_READ_STEP_4"))\r
+                                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+                        else:\r
+                            if shi_value == 0 and ge_value == 0:#500 600\r
+                                str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(bai_value)),\\r
+                                audio_buf.index("R_READ_STEP_2"),audio_buf.index("R_READ_STEP_4"))\r
+                                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+                                pass\r
+                            else:\r
+\r
+                                str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(bai_value)),\\r
+                                audio_buf.index("R_READ_STEP_2"),audio_buf.index("R_READ_TIME_0"),audio_buf.index("R_READ_TIME_{}".format(ge_value)),\\r
+                                audio_buf.index("R_READ_STEP_4"))\r
+                                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+                            pass\r
+                elif step <= 10000:#千\r
+                    if step == 10000:\r
+                        str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_1"),\\r
+                        audio_buf.index("R_READ_STEP_0"),audio_buf.index("R_READ_STEP_4"))\r
+                        EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+                        pass\r
+                    else:\r
+                        one_thousand = step//1000 #千\r
+                        one_hundred = step%1000 #百\r
+                        baishu = step%100 #十\r
+                        shishu = step%10 #个\r
+                        step_tmp = str(step)\r
+                        qian = int(step_tmp[0])#千\r
+                        bai_value = int(step_tmp[1])#百\r
+                        shi_value = int(step_tmp[2])#十\r
+                        ge_value = int(step_tmp[3])#个\r
+                        if bai_value <= 0:\r
+                            if shi_value <= 0:\r
+                                str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(qian)),\\r
+                                audio_buf.index("R_READ_STEP_1"),audio_buf.index("R_READ_TIME_0"),audio_buf.index("R_READ_TIME_{}".format(ge_value)),\\r
+                                audio_buf.index("R_READ_STEP_4"))\r
+                                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+                            else:\r
+                                if ge_value == 0:#1020 1040\r
+                                    str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(qian)),\\r
+                                    audio_buf.index("R_READ_STEP_1"),audio_buf.index("R_READ_TIME_0"),audio_buf.index("R_READ_TIME_{}".format(shi_value)),\\r
+                                    audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_STEP_4"))\r
+                                    EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+                                else:#1021 \r
+                                    str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(qian)),\\r
+                                    audio_buf.index("R_READ_STEP_1"),audio_buf.index("R_READ_TIME_0"),audio_buf.index("R_READ_TIME_{}".format(shi_value)),\\r
+                                    audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_{}".format(ge_value)),audio_buf.index("R_READ_STEP_4"))\r
+                                    EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+                        else:\r
+                            if shi_value <= 0:#1109\r
+                                if ge_value == 0:#1110\r
+                                    str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(qian)),\\r
+                                    audio_buf.index("R_READ_STEP_1"),audio_buf.index("R_READ_TIME_{}".format(bai_value)),\r
+                                    audio_buf.index("R_READ_STEP_2"),audio_buf.index("R_READ_STEP_4"))\r
+                                    EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+                                else:\r
+                                    str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(qian)),\\r
+                                    audio_buf.index("R_READ_STEP_1"),audio_buf.index("R_READ_TIME_{}".format(bai_value)),\r
+                                    audio_buf.index("R_READ_STEP_2"),audio_buf.index("R_READ_TIME_0"),audio_buf.index("R_READ_TIME_{}".format(ge_value)),\\r
+                                    audio_buf.index("R_READ_STEP_4"))\r
+                                    EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+                            else:\r
+                                if ge_value == 0:#1110\r
+                                    str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(qian)),\\r
+                                    audio_buf.index("R_READ_STEP_1"),audio_buf.index("R_READ_TIME_{}".format(bai_value)),\r
+                                    audio_buf.index("R_READ_STEP_2"),audio_buf.index("R_READ_TIME_{}".format(shi_value)),\\r
+                                    audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_STEP_4"))\r
+                                    EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+                                else:#1117\r
+                                    str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(qian)),\\r
+                                    audio_buf.index("R_READ_STEP_1"),audio_buf.index("R_READ_TIME_{}".format(bai_value)),\r
+                                    audio_buf.index("R_READ_STEP_2"),audio_buf.index("R_READ_TIME_{}".format(shi_value)),\\r
+                                    audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_{}".format(ge_value)),audio_buf.index("R_READ_STEP_4"))\r
+                                    EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+\r
+                        pass\r
+                elif step <= 100000:#万\r
+                            if step == 100000:#10万步\r
+                                str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_STEP_3"),\\r
+                                audio_buf.index("R_READ_STEP_0"),audio_buf.index("R_READ_STEP_4"))\r
+                                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+                            else:\r
+                                step_tmp = str(step)\r
+                                wang = int(step_tmp[0])#万\r
+                                qian = int(step_tmp[1])#千\r
+                                bai_value = int(step_tmp[2])#百\r
+                                shi_value = int(step_tmp[3])#十\r
+                                ge_value = int(step_tmp[4])#个\r
+                                if wang > 0 and qian > 0 and bai_value > 0:#11109 11111\r
+                                    if shi_value <= 0:#11109\r
+                                        if ge_value == 0:#11100\r
+                                            str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(wang)),\\r
+                                            audio_buf.index("R_READ_STEP_0"),audio_buf.index("R_READ_TIME_{}".format(qian)),\\r
+                                            audio_buf.index("R_READ_STEP_1"),audio_buf.index("R_READ_TIME_{}".format(bai_value)),\\r
+                                            audio_buf.index("R_READ_STEP_2"),audio_buf.index("R_READ_STEP_4"))\r
+                                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+                                        else:#11108\r
+                                            str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(wang)),\\r
+                                            audio_buf.index("R_READ_STEP_0"),audio_buf.index("R_READ_TIME_{}".format(qian)),\\r
+                                            audio_buf.index("R_READ_STEP_1"),audio_buf.index("R_READ_TIME_{}".format(bai_value)),\\r
+                                            audio_buf.index("R_READ_STEP_2"),audio_buf.index("R_READ_TIME_0"),audio_buf.index("R_READ_TIME_{}".format(ge_value)),\\r
+                                            audio_buf.index("R_READ_STEP_4"))\r
+                                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+                                            pass\r
+                                    else:\r
+                                        if ge_value == 0:#11110\r
+                                            str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(wang)),\\r
+                                            audio_buf.index("R_READ_STEP_0"),audio_buf.index("R_READ_TIME_{}".format(qian)),\\r
+                                            audio_buf.index("R_READ_STEP_1"),audio_buf.index("R_READ_TIME_{}".format(bai_value)),\\r
+                                            audio_buf.index("R_READ_STEP_2"),audio_buf.index("R_READ_TIME_{}".format(shi_value)),\\r
+                                            audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_STEP_4"))\r
+                                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+                                        else:#11116\r
+                                            str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(wang)),\\r
+                                            audio_buf.index("R_READ_STEP_0"),audio_buf.index("R_READ_TIME_{}".format(qian)),\\r
+                                            audio_buf.index("R_READ_STEP_1"),audio_buf.index("R_READ_TIME_{}".format(bai_value)),\\r
+                                            audio_buf.index("R_READ_STEP_2"),audio_buf.index("R_READ_TIME_{}".format(shi_value)),\\r
+                                            audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_{}".format(ge_value)),audio_buf.index("R_READ_STEP_4"))\r
+                                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+                                            pass\r
+                                elif wang > 0 and qian > 0:#11000 11010 11012 11008\r
+                                    if shi_value > 0:\r
+                                        if ge_value == 0:#11010\r
+                                            str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(wang)),\\r
+                                            audio_buf.index("R_READ_STEP_0"),audio_buf.index("R_READ_TIME_{}".format(qian)),\\r
+                                            audio_buf.index("R_READ_STEP_1"),audio_buf.index("R_READ_TIME_0"),audio_buf.index("R_READ_TIME_{}".format(shi_value)),\\r
+                                            audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_STEP_4"))\r
+                                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+                                        else:#11016\r
+                                            str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(wang)),\\r
+                                            audio_buf.index("R_READ_STEP_0"),audio_buf.index("R_READ_TIME_{}".format(qian)),\\r
+                                            audio_buf.index("R_READ_STEP_1"),audio_buf.index("R_READ_TIME_0"),audio_buf.index("R_READ_TIME_{}".format(shi_value)),\\r
+                                            audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_{}".format(ge_value)),audio_buf.index("R_READ_STEP_4"))\r
+                                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+                                    else:   \r
+                                        if ge_value == 0:#11000\r
+                                            str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(wang)),\\r
+                                            audio_buf.index("R_READ_STEP_0"),audio_buf.index("R_READ_TIME_{}".format(qian)),\\r
+                                            audio_buf.index("R_READ_STEP_1"),audio_buf.index("R_READ_STEP_4"))\r
+                                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+                                        else:#11004\r
+                                            str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(wang)),\\r
+                                            audio_buf.index("R_READ_STEP_0"),audio_buf.index("R_READ_TIME_{}".format(qian)),\\r
+                                            audio_buf.index("R_READ_STEP_1"),audio_buf.index("R_READ_TIME_0"),audio_buf.index("R_READ_TIME_{}".format(ge_value)),\\r
+                                            audio_buf.index("R_READ_STEP_4"))\r
+                                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+                                \r
+                                elif wang > 0:#1\r
+                                    if bai_value > 0:#百\r
+                                        if shi_value > 0:#10110\r
+                                            if ge_value == 0:#10150\r
+                                                str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(wang)),\\r
+                                                audio_buf.index("R_READ_STEP_0"),audio_buf.index("R_READ_TIME_0"),audio_buf.index("R_READ_TIME_{}".format(bai_value)),\\r
+                                                audio_buf.index("R_READ_STEP_2"),audio_buf.index("R_READ_TIME_{}".format(shi_value)),audio_buf.index("R_READ_STEP_3"),\\r
+                                                audio_buf.index("R_READ_STEP_4"))\r
+                                                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+                                            else:\r
+                                                str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(wang)),\\r
+                                                audio_buf.index("R_READ_STEP_0"),audio_buf.index("R_READ_TIME_0"),audio_buf.index("R_READ_TIME_{}".format(bai_value)),\\r
+                                                audio_buf.index("R_READ_STEP_2"),audio_buf.index("R_READ_TIME_{}".format(shi_value)),audio_buf.index("R_READ_STEP_3"),\\r
+                                                audio_buf.index("R_READ_TIME_{}".format(ge_value)),audio_buf.index("R_READ_STEP_4"))\r
+                                                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+                                        else:#10108\r
+                                            if ge_value == 0:#10100\r
+                                                str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(wang)),\\r
+                                                audio_buf.index("R_READ_STEP_0"),audio_buf.index("R_READ_TIME_0"),audio_buf.index("R_READ_TIME_{}".format(bai_value)),\\r
+                                                audio_buf.index("R_READ_STEP_2"),audio_buf.index("R_READ_STEP_4"))\r
+                                                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+                                            else:#10108\r
+                                                str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(wang)),\\r
+                                                audio_buf.index("R_READ_STEP_0"),audio_buf.index("R_READ_TIME_0"),audio_buf.index("R_READ_TIME_{}".format(bai_value)),\\r
+                                                audio_buf.index("R_READ_STEP_2"),audio_buf.index("R_READ_TIME_0"),audio_buf.index("R_READ_TIME_{}".format(ge_value)),\\r
+                                                audio_buf.index("R_READ_STEP_4"))\r
+                                                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+                                    else:\r
+                                        if shi_value > 0:\r
+                                            if ge_value == 0:#10090\r
+                                                str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(wang)),\\r
+                                                audio_buf.index("R_READ_STEP_0"),audio_buf.index("R_READ_TIME_0"),audio_buf.index("R_READ_TIME_{}".format(shi_value)),\\r
+                                                audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_STEP_4"))\r
+                                                EventMesh.publish("play_audio_file",str_data)#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+                                            else:#10098\r
+                                                str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(wang)),\\r
+                                                audio_buf.index("R_READ_STEP_0"),audio_buf.index("R_READ_TIME_0"),audio_buf.index("R_READ_TIME_{}".format(shi_value)),\\r
+                                                audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_{}".format(ge_value)),audio_buf.index("R_READ_STEP_4"))\r
+                                                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+                                        else:\r
+                                            str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(wang)),\\r
+                                            audio_buf.index("R_READ_STEP_0"),audio_buf.index("R_READ_TIME_0"),audio_buf.index("R_READ_TIME_{}".format(ge_value)),\\r
+                                            audio_buf.index("R_READ_STEP_4"))\r
+                                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+\r
+        def set_usb(self, event, msg): #msg 1 正在充电 2充电已移出 3 充电已满 0\r
+            open_power = EventMesh.publish("get_power_on_state")#获取开机标识\r
+            if open_power != None:\r
+                if open_power == 0:\r
+                    return\r
+            power_off = EventMesh.publish("get_power_off_state")#获取开机标识\r
+            if power_off != None:\r
+                if power_off == 1:\r
+                    return\r
+            flag = EventMesh.publish("get_call_state") \r
+            get_hr_state = EventMesh.publish("get_hr_state")\r
+            get_spo2_state = EventMesh.publish("get_spo2_state")\r
+            get_bp_state  = EventMesh.publish("get_bp_state")\r
+            get_bg_state  = EventMesh.publish("get_bg_state")\r
+            get_temp_state  = EventMesh.publish("get_temp_state")\r
+            if msg == 1:\r
+                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:\r
+                    if get_hr_state != 0:\r
+                        \r
+                        EventMesh.publish("set_hr_state",0)#2代表后台进入测试,定时测心率 1ui界面测试洗心率 \r
+                        if get_hr_state == 1:\r
+                            EventMesh.publish("stop_led_timer")#设置参数\r
+                            EventMesh.publish("set_start_measure_time",0)#设置开始测量的时间戳时间\r
+\r
+                        EventMesh.debug_log("stop debug8")\r
+                        EventMesh.publish(constants.EVENT.STOP_HEART) \r
+                    if get_spo2_state != 0:\r
+                        EventMesh.publish("set_spo2_state",0)#2代表后台进入测试\r
+                        if get_spo2_state == 1:\r
+                            EventMesh.publish("stop_led_timer")#设置参数\r
+                        EventMesh.publish(constants.EVENT.STOP_BLOOD_OXYGEN)\r
+                        EventMesh.debug_log("stop debug13")\r
+                    if get_bp_state != 0:\r
+                        EventMesh.publish("set_bp_state",0)#2代表后台进入测试\r
+                        if get_bp_state == 1:\r
+                            EventMesh.publish("stop_led_timer")#设置参数\r
+                        EventMesh.publish(constants.EVENT.STOP_HEART)\r
+                        EventMesh.debug_log("stop bp debug1")\r
+                    if get_bg_state != 0:\r
+                        EventMesh.publish("set_bg_state",0)#2代表后台进入测试\r
+                        if get_bg_state == 1:#手动开灯关闭灯\r
+                            EventMesh.publish("stop_led_timer")#设置参数\r
+                        EventMesh.publish(constants.EVENT.STOP_HEART)\r
+                        EventMesh.debug_log("stop BG  debug14")\r
+                    if get_temp_state != 0:\r
+                        \r
+                        EventMesh.publish("set_temp_state",0)#2代表后台进入测试\r
+                        if get_temp_state == 1:\r
+                            EventMesh.publish("stop_led_timer")#设置参数\r
+                            EventMesh.publish("set_start_temp_measure_time",0)#\r
+                        EventMesh.publish(constants.EVENT.STOP_TEMP)\r
+                        EventMesh.debug_log("stop temp  debug14")\r
+            if msg == 1:\r
+                self.usbState = msg\r
+                str_buf = [1,1,10,led_mode.LONG_LIGHT_RED,4,2,led_mode.CHARGE_IN_MODE]\r
+                EventMesh.publish("set_led_time_arg",str_buf)#\r
+                if flag == 0 and self.fall_flag == 0:#电话通话中 或者呼叫中挂断中断\r
+                    EventMesh.publish("close_timer_all")#\r
+                    self.aud.stop()\r
+                    self.aud.play(1,1,'U:/static/R_CHARGE_IN.mp3')\r
+                    # str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_CHARGE_IN"))\r
+                    # EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+                EventMesh.debug_log("charge R_CHARGE_IN")\r
+                \r
+                \r
+            elif msg == 2:\r
+                self.usbState = msg\r
+                EventMesh.publish("stop_led_timer")#设置参数\r
+                EventMesh.publish("set_led_time_arg",[1,1,0,led_mode.FLASH_LIGHT_GREEN,4,4,led_mode.CHARGE_OUT_MODE])#測量成功\r
+                EventMesh.debug_log("charge R_CHARGE_OUT")\r
+                if flag == 0 and self.fall_flag == 0:#电话通话中 或者呼叫中挂断中断\r
+                    EventMesh.publish("close_timer_all")#\r
+                    self.aud.stop()\r
+                    self.aud.play(1,1,'U:/static/R_CHARGE_OUT.mp3')\r
+                    # str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_CHARGE_OUT"))\r
+                    # EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+                \r
+\r
+\r
+            elif msg == 3:\r
+                self.usbState = msg\r
+                EventMesh.debug_log("charge full")\r
+                str_buf = [1,1,10,led_mode.LONG_LIGHT_GREEN,4,2,led_mode.CHARGE_FULL_MODE]\r
+                EventMesh.publish("set_led_time_arg",str_buf)#\r
+                # if flag == 0 and self.fall_flag == 0:#电话通话中 或者呼叫中挂断中断\r
+                #     EventMesh.publish("close_timer_all")#\r
+                #     str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_CHARGE_FULL"))\r
+                #     EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+                \r
+\r
+\r
+        def get_usb(self, event, msg):\r
+            return self.usbState\r
+        \r
+\r
+\r
+        def app_factory(self,event,msg):\r
+            if msg != None:\r
+                number = str(msg)\r
+                sms.sendPduMsg(number, 'factory# send ok', 'UCS2')\r
+            ret = 0\r
+            ret = ql_fs.path_exists("/usr/static/storage_file")#\r
+            if ret == True:\r
+                ql_fs.rmdirs("/usr/static/storage_file")\r
+                ql_fs.mkdirs("/usr/static/storage_file")\r
+            if EventMesh.publish(constants.EVENT.GET_CONNECT) == 1:\r
+                EventMesh.publish(constants.PROTOCOL.DLT_SEND)\r
+        \r
+            self.factory_timer.start(6*1000,0,self.factory_cb)\r
+            pass\r
+        def factory_cb(self,*argc):\r
+            self.aud.stopPlayStream()\r
+            Power.powerRestart()\r
+\r
+        def app_restart(self,event,msg):#远程发短信重启\r
+            if msg != None:\r
+                number = str(msg)\r
+                sms.sendPduMsg(number, 'reset# send ok', 'UCS2')\r
+            self.restart_timer.start(3*1000,0,self.app_restart_cb)\r
+            pass\r
+        def app_restart_cb(self,*argc):\r
+            Power.powerRestart()\r
+\r
+        def open_power_on(self, event, msg): #msg 1 开机 2 关机 3 重启  4恢复出厂设置 5静音关机\r
+            EventMesh.publish("close_timer_all")#\r
+            if msg == 1:\r
+                EventMesh.publish("close_hr_sop2")#\r
+                # str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_POWER_OFF_1"))\r
+                # EventMesh.publish("play_audio_file",[str_data,0])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+                self.pwk_timer1.start(1000,0,self.power_on_audio_cb)\r
+                \r
+            elif msg == 2:\r
+                flag = EventMesh.publish("get_call_state") \r
+                if flag != 0:#电话呼叫中\r
+                    self.call_state = 0\r
+                    voiceCall.callEnd()\r
+                step = EventMesh.publish("get_old_step_value")\r
+                # step1 = SC7A20().get_step()\r
+                # step1 = EventMesh.publish(constants.EVENT.GET_STEP)\r
+                # step2 = EventMesh.publish("get_storage_config","old_step")\r
+                self.read_data = EventMesh.publish("get_storage_data")\r
+                # EventMesh.publish("set_test_data5",[1,step,step1,step2])\r
+                if step != 0:\r
+                    EventMesh.publish("set_storage_config",["old_step",step])\r
+                date_tmp = utime.localtime()\r
+                time_tmp = utime.mktime(date_tmp)\r
+                # step3 = EventMesh.publish("get_old_step_value")\r
+                # step4 = SC7A20().get_step()\r
+                # step4 = EventMesh.publish(constants.EVENT.GET_STEP)\r
+                # step5 = EventMesh.publish("get_storage_config","old_step")\r
+                # EventMesh.publish("set_test_data6",[1,step3,step4,step5])\r
+                EventMesh.publish("set_storage_config",["old_time",time_tmp])#关机保存一个是时间\r
+                EventMesh.publish("set_storage_config",["power_state",0])\r
+                # self.pwk_timer1.start(3000,0,self.power_off_audio_cb)\r
+                EventMesh.publish("close_hr_sop2")#\r
+                # EventMesh.debug_log("power_off_audio_cb")\r
+                self.aud.stop()\r
+                self.aud.play(1,0,'U:/static/R_POWER_OFF_1.mp3')\r
+                # str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_POWER_OFF_1"))\r
+                # EventMesh.publish("play_audio_file",[str_data,0])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+                EventMesh.publish("set_led_time_arg",[1,2,6*8,led_mode.FLASH_LIGHT_RED,6,3,led_mode.POWER_OFF_MODE])#\r
+                self.power_off = 1\r
+                self.pwk_timer2.start(6000,0,self.publish_power_down_event_cb)\r
+            elif msg == 3:\r
+                flag = EventMesh.publish("get_call_state") \r
+                if flag != 0:#电话呼叫中\r
+                    self.call_state = 0\r
+                    voiceCall.callEnd()\r
+                EventMesh.publish("close_hr_sop2")#\r
+                self.aud.stop()\r
+                self.aud.play(1,0,'U:/static/R_POWER_OFF_1.mp3')\r
+                # str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_POWER_OFF_1"))\r
+                # EventMesh.publish("play_audio_file",[str_data,0])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+                EventMesh.publish("stop_led_timer")#设置参数\r
+                self.power_off = 1\r
+                self.timer.start(8000,0,self.publish_resatrt_down_event_cb)\r
+                #EventMesh.publish("set_led_time_arg",[3000,4000,1,led_mode.LONG_LIGHT_GREEN,led_mode.DEFAULT_LONG_LIGHT_MODE])#\r
+            elif msg == 4:\r
+                flag = EventMesh.publish("get_call_state") \r
+                if flag != 0:#电话呼叫中\r
+                    self.call_state = 0\r
+                    voiceCall.callEnd()\r
+                EventMesh.publish("close_hr_sop2")#\r
+                EventMesh.publish("stop_led_timer")#设置参数\r
+                self.power_off = 1\r
+                ret = 0\r
+                ret = ql_fs.path_exists("/usr/static/storage_file")#\r
+                if ret == True:\r
+                    ql_fs.rmdirs("/usr/static/storage_file")\r
+                    ql_fs.mkdirs("/usr/static/storage_file")\r
+                if EventMesh.publish(constants.EVENT.GET_CONNECT) == 1:\r
+                    EventMesh.publish(constants.PROTOCOL.DLT_SEND)\r
+                self.aud.stopPlayStream()\r
+                self.timer.start(6*1000,0,self.fun)\r
+            elif msg == 5:\r
+                flag = EventMesh.publish("get_call_state") \r
+                if flag != 0:#电话呼叫中\r
+                    self.call_state = 0\r
+                    voiceCall.callEnd()\r
+                step = EventMesh.publish("get_old_step_value")\r
+                # step1 = SC7A20().get_step()\r
+                # step1 = EventMesh.publish(constants.EVENT.GET_STEP)\r
+                # step2 = EventMesh.publish("get_storage_config","old_step")\r
+                self.read_data = EventMesh.publish("get_storage_data")\r
+                # EventMesh.publish("set_test_data7",[1,step,step1,step2])\r
+                if step != 0:\r
+                    EventMesh.publish("set_storage_config",["old_step",step])\r
+\r
+                # step3 = EventMesh.publish("get_old_step_value")\r
+                # step4 = SC7A20().get_step()\r
+                # step4 = EventMesh.publish(constants.EVENT.GET_STEP)\r
+                # step5 = EventMesh.publish("get_storage_config","old_step")\r
+                # EventMesh.publish("set_test_data8",[1,step3,step4,step5])\r
+                date_tmp = utime.localtime()\r
+                time_tmp = utime.mktime(date_tmp)\r
+                EventMesh.publish("set_storage_config",["old_time",time_tmp])#关机保存一个是时间\r
+                EventMesh.publish("set_storage_config",["power_state",1])\r
+                \r
+                EventMesh.publish("close_hr_sop2")#\r
+                EventMesh.publish("set_led_time_arg",[1,2,6*8,led_mode.FLASH_LIGHT_RED,6,3,led_mode.POWER_OFF_MODE])#\r
+                self.power_off = 1\r
+                self.pwk_timer2.start(6000,0,self.publish_power_down_event_cb)\r
+                # self.pwk_timer1.start(3000,0,self.power_off_no_audio_cb)#不需要关机铃声\r
+\r
+        def fun(self,*argc):\r
+            self.aud.stopPlayStream()\r
+            Power.powerRestart()\r
+            \r
+\r
+        def power_on_cb(self, msg): #msg 开机标识\r
+            self.power_on_flag = 1\r
+        def clear_power_on_cb(self, msg): #msg 开机标识\r
+            self.power_on_flag = 0\r
+        \r
+        def power_on_audio_cb(self, msg):\r
+            self.power_on_flag = 1\r
+            # EventMesh.debug_log("power_on_audio_cb")\r
+            power_state = EventMesh.publish("get_storage_config","power_state")\r
+            if power_state == None:\r
+                power_state = 0\r
+            # print("power_state",power_state)\r
+            if power_state <= 0:\r
+                self.aud.stop()\r
+                self.aud.play(1,1,'U:/static/R_POWER_OFF_1.mp3')\r
+            # str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_POWER_OFF_1"))\r
+            # EventMesh.publish("play_audio_file",[str_data,0])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+            EventMesh.publish("set_led_time_arg",[1,2,6*8,led_mode.FLASH_LIGHT_GREEN,6,3,led_mode.OTHER_MEASURE_MODE])#測量成功\r
+            # 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])#设置参数\r
+            self.power_on_flag = 0\r
+            self.pwk_timer2.start(5000,0,self.power_on_cb)\r
+\r
+        def get_power_on_state(self, event, msg):\r
+            return self.power_on_flag\r
+        \r
+        def power_off_audio_cb(self, msg):\r
+            # EventMesh.debug_log("power_off_audio_cb")\r
+            self.aud.stop()\r
+            self.aud.play(1,0,'U:/static/R_POWER_OFF_1.mp3')\r
+            # str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_POWER_OFF_1"))\r
+            # EventMesh.publish("play_audio_file",[str_data,0])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+            EventMesh.publish("set_led_time_arg",[1,2,6*8,led_mode.FLASH_LIGHT_RED,6,3,led_mode.POWER_OFF_MODE])#\r
+            self.power_off = 1\r
+            self.pwk_timer2.start(6000,0,self.publish_power_down_event_cb)\r
+        \r
+        def power_off_no_audio_cb(self, msg):\r
+            EventMesh.debug_log("power_off_no_audio_cb")\r
+            EventMesh.publish("set_led_time_arg",[1,2,6*8,led_mode.FLASH_LIGHT_RED,6,3,led_mode.POWER_OFF_MODE])#\r
+            self.power_off = 1\r
+            self.pwk_timer2.start(6000,0,self.publish_power_down_event_cb)\r
+\r
+        def set_power_off_cb(self, msg):\r
+            self.power_off = 1\r
+\r
+        def get_power_off_state(self, event, msg):\r
+            return self.power_off\r
+\r
+        def close_hr_sop2(self, event, msg): #msg 关闭心率血氧体温测试\r
+            get_hr_state = EventMesh.publish("get_hr_state")\r
+            get_spo2_state = EventMesh.publish("get_spo2_state")\r
+            get_temp_state = EventMesh.publish("get_temp_state")\r
+            get_bg_state = EventMesh.publish("get_bg_state")\r
+            get_bp_state = EventMesh.publish("get_bp_state")\r
+            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:\r
+                if get_hr_state != 0:\r
+                    EventMesh.publish("set_hr_state",0)#2代表后台进入测试,定时测心率 1ui界面测试洗心率 \r
+                    EventMesh.debug_log("sstop hr")\r
+                    EventMesh.publish(constants.EVENT.STOP_HEART) \r
+                if get_spo2_state != 0 :\r
+                    EventMesh.debug_log("stop spo2")\r
+                    EventMesh.publish("set_spo2_state",0)#2代表后台进入测试\r
+                    EventMesh.publish(constants.EVENT.STOP_BLOOD_OXYGEN)\r
+                if get_temp_state != 0:\r
+                    EventMesh.debug_log("stop temp")\r
+                    EventMesh.publish("set_temp_state",0)\r
+                    EventMesh.publish(constants.EVENT.STOP_TEMP)#手动体温测试\r
+                if  get_bg_state != 0:\r
+                    EventMesh.publish("set_bg_state",0)#2代表后台进入测试,定时测心率 1ui界面测试洗心率 \r
+                    EventMesh.debug_log("sstop bg")\r
+                    EventMesh.publish(constants.EVENT.STOP_HEART) \r
+\r
+                if  get_bp_state != 0:\r
+                    EventMesh.publish("set_bp_state",0)#2代表后台进入测试,定时测心率 1ui界面测试洗心率 \r
+                    EventMesh.debug_log("sstop bp")\r
+                    EventMesh.publish(constants.EVENT.STOP_HEART) \r
+\r
+        def set_manual_measure_mode(self, event, msg): #手动测试 1心率 2 血氧 3 体温\r
+            get_hr_state = EventMesh.publish("get_hr_state")\r
+            get_spo2_state = EventMesh.publish("get_spo2_state")\r
+            get_temp_state = EventMesh.publish("get_temp_state")\r
+            if msg == 1:\r
+                if get_hr_state != 1:#不是手动测试直接打断\r
+                    EventMesh.debug_log("set_manual_measure_mode",msg)\r
+                    EventMesh.publish("set_spo2_state",0)\r
+                    EventMesh.publish("set_bg_state",0)\r
+                    EventMesh.publish("set_bp_state",0)\r
+                    \r
+                    EventMesh.publish("set_hr_state",1)\r
+                    EventMesh.publish("clear_manual_hr_flag")\r
+                    EventMesh.publish("set_start_measure_time",1)#设置开始测量的时间戳时间\r
+                    EventMesh.publish(constants.EVENT.STOP_BLOOD_OXYGEN) #停止测试血氧\r
+                    EventMesh.publish("set_hr_blood_led",1)\r
+                    EventMesh.publish(constants.EVENT.START_HEART) #手动心率测试\r
+            elif msg == 2:\r
+                if get_hr_state == 0:\r
+                    if get_spo2_state != 1:\r
+                        EventMesh.debug_log("set_manual_measure_mode",msg)\r
+                        EventMesh.publish("set_spo2_state",1)\r
+                        EventMesh.publish("set_start_measure_time",1)#设置开始测量的时间戳时间\r
+                        EventMesh.publish("set_hr_blood_led",1)\r
+                        EventMesh.publish(constants.EVENT.START_BLOOD_OXYGEN) #手动血氧测试\r
+            elif msg == 3:\r
+                if get_temp_state != 1:\r
+                    EventMesh.debug_log("set_manual_measure_mode",msg)\r
+                    EventMesh.publish("clear_manual_temp_flag")\r
+                    EventMesh.publish("set_temp_state",1)\r
+                    EventMesh.publish("set_start_temp_measure_time",1)#设置开始测量的时间戳时间\r
+                    EventMesh.publish("set_hr_blood_led",1)\r
+                    EventMesh.publish(constants.EVENT.START_TEMP)#手动体温测试\r
+            pass\r
+\r
+\r
+        def set_start_measure_time(self, event, msg): #手动测试 1心\r
+            self.hr_auto = msg\r
+            pass\r
+\r
+        def get_start_measure_time(self, event, msg): #手动测试 \r
+\r
+            return  self.hr_auto\r
+        \r
+        def set_start_temp_measure_time(self, event, msg): #\r
+            self.temp_auto = msg\r
+            pass\r
+\r
+        def get_start_temp_measure_time(self, event, msg): #\r
+            return self.temp_auto\r
+\r
+        def mearsure_cb(self, event, msg):\r
+            if msg == 1:\r
+                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_HSENSOR_RESULT_OK"))\r
+                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+            elif msg == 2:\r
+                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_HSENSOR_RESULT_FAILE"))\r
+                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data) \r
+            elif msg == 3:\r
+                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_HSENSOR_SPO2_TITLE"))\r
+                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data) \r
+            elif msg == 4:\r
+                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_HSENSOR_TEMP_TITLE"))\r
+                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data) \r
+            \r
+            \r
+            \r
+        def play_temp_value(self, event, msg): #播放体温数值\r
+            flag = EventMesh.publish("get_call_state") \r
+            if msg != None:\r
+                if flag == 0 and self.fall_flag == 0:\r
+                    EventMesh.publish("close_timer_all")#\r
+                    if msg > 0:\r
+                        # str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_HSENSOR_RESULT_OK"))\r
+                        # EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+                        EventMesh.publish("set_hr_blood_led",2)#测量成功\r
+                        self.temp_value = msg\r
+                        # self.timer.start(2*1000,1,self.play_temp_fun)\r
+                        self.play_temp_fun(0)\r
+                    else:\r
+                        str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_HSENSOR_RESULT_FAILE"))\r
+                        EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+                        EventMesh.publish("set_hr_blood_led",3)#测量异常\r
+                else:\r
+                    EventMesh.publish("set_hr_blood_led",3)#测量异常\r
+\r
+        def play_temp_fun(self,argc): #播放体温数值\r
+            data = self.temp_value\r
+            if data > 42:\r
+                data = 42\r
+            data_tmp = str(data)\r
+            if data_tmp.find(".") != -1:\r
+                temp_shi = int(data_tmp.split('.')[0])//10\r
+                temp_ge = int(data_tmp.split('.')[0])%10\r
+                dot_ge = int(data_tmp.split('.')[1][:1])\r
+                if temp_ge > 0:#37.0\r
+                    if dot_ge > 0:#37.5\r
+                        str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_HSENSOR_TEMP_TITLE"),audio_buf.index("R_READ_TIME_{}".format(temp_shi)),\\r
+                        audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_{}".format(temp_ge)),audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT"),\\r
+                        audio_buf.index("R_READ_TIME_{}".format(dot_ge)))\r
+                        EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+\r
+                    else:#37.0\r
+                        str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_HSENSOR_TEMP_TITLE"),audio_buf.index("R_READ_TIME_{}".format(temp_shi)),\\r
+                        audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_{}".format(temp_ge)))\r
+                        EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+                else:#30.0 30.6\r
+                    if dot_ge > 0:\r
+                        str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_HSENSOR_TEMP_TITLE"),audio_buf.index("R_READ_TIME_{}".format(temp_shi)),\\r
+                        audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT"),audio_buf.index("R_READ_TIME_{}".format(dot_ge)))\r
+                        EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+                    else:\r
+                        str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_HSENSOR_TEMP_TITLE"),audio_buf.index("R_READ_TIME_{}".format(temp_shi)),\\r
+                        audio_buf.index("R_READ_STEP_3"))\r
+                        EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+\r
+            else:\r
+                temp_shi = int(data_tmp)//10\r
+                temp_ge = int(data_tmp)%10\r
+\r
+                if temp_ge > 0:#45\r
+                    str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_HSENSOR_TEMP_TITLE"),audio_buf.index("R_READ_TIME_{}".format(temp_shi)),\\r
+                    audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_{}".format(temp_ge)))\r
+                    EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+                else:\r
+                    str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_HSENSOR_TEMP_TITLE"),audio_buf.index("R_READ_TIME_{}".format(temp_shi)),\\r
+                    audio_buf.index("R_READ_STEP_3"))\r
+                    EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+                            \r
+\r
+        def play_hr_value(self, event, msg): #播放心率数值\r
+            flag = EventMesh.publish("get_call_state") \r
+            if msg != None:\r
+                if flag == 0 and self.fall_flag == 0:\r
+                    EventMesh.publish("close_timer_all")#\r
+                    if msg >= 50:\r
+                        # str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_HSENSOR_RESULT_OK"))\r
+                        # EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+                        self.hr_value = msg\r
+                        EventMesh.publish("set_hr_blood_led",2)#测量成功\r
+                        # self.timer.start(2*1000,1,self.play_hr_fun)\r
+                        self.play_hr_fun(0)\r
+                    else:\r
+                        str_data ='mp3files={}.mp3'.format(audio_buf.index("R_HSENSOR_RESULT_FAILE"))\r
+                        EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+                        EventMesh.publish("set_hr_blood_led",3)#测量异常\r
+                else:\r
+                    EventMesh.publish("set_hr_blood_led",3)#测量异常\r
+        \r
+\r
+        def play_hr_fun(self,argc):#播放心率测试值\r
+            flag = EventMesh.publish("get_call_state") \r
+            \r
+            if flag == 0 and self.fall_flag == 0:#电话通话中 或者呼叫中挂断中断\r
+                EventMesh.publish("close_timer_all")#\r
+                data = self.hr_value\r
+                if data > 220:\r
+                    data = 220\r
+                if data < 100:\r
+                    if data%10 == 0:\r
+                        str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_HSENSOR_RESULT_HR_TITLE"),audio_buf.index("R_READ_TIME_{}".format(data//10)),\\r
+                        audio_buf.index("R_READ_STEP_3"))\r
+                        EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+                    else:\r
+                        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)),\\r
+                        audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_{}".format(data%10)))\r
+                        EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+                else: \r
+                    shi = (data%100)//10 #210\r
+                    ge = (data%100)%10\r
+                    #210 234\r
+                    if shi > 0:\r
+                        if ge == 0:#210 230 120\r
+                            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)),\\r
+                            audio_buf.index("R_READ_STEP_2"),audio_buf.index("R_READ_TIME_{}".format(shi)),audio_buf.index("R_READ_STEP_3"))\r
+                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+                        else:\r
+                            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)),\\r
+                            audio_buf.index("R_READ_STEP_2"),audio_buf.index("R_READ_TIME_{}".format(shi)),audio_buf.index("R_READ_STEP_3"),\\r
+                            audio_buf.index("R_READ_TIME_{}".format(ge)))\r
+                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+                    else:\r
+                        if ge == 0:#200 100 209 108\r
+                            str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_HSENSOR_RESULT_HR_TITLE"),audio_buf.index("R_READ_TIME_{}".format(data//100)),\\r
+                            audio_buf.index("R_READ_STEP_2"))\r
+                            EventMesh.publish("play_audio_file",str_data)#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+                        else:\r
+                            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)),\\r
+                            audio_buf.index("R_READ_STEP_2"),audio_buf.index("R_READ_TIME_0"),audio_buf.index("R_READ_TIME_{}".format(ge)))\r
+                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+\r
+\r
+        def play_sugar_value(self, event, msg): #播放血糖数值\r
+            flag = EventMesh.publish("get_call_state") \r
+            if msg != None:\r
+                if flag == 0 and self.fall_flag == 0:\r
+                    EventMesh.publish("close_timer_all")#\r
+                    if msg != 0:\r
+                        # str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_HSENSOR_RESULT_OK"))\r
+                        # EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+                        EventMesh.publish("set_hr_blood_led",2)#测量成功\r
+                        # self.timer.start(2*1000,1,self.play_spo2_fun)\r
+                        self.play_sugar_fun(msg)\r
+                    else:\r
+                        str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_HSENSOR_RESULT_FAILE"))\r
+                        EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+                        EventMesh.publish("set_hr_blood_led",3)#测量异常\r
+                else:\r
+                    EventMesh.publish("set_hr_blood_led",3)#测量异常\r
+\r
+        def play_sugar_fun(self,argc):#播放血糖测试值\r
+            flag = EventMesh.publish("get_call_state") \r
+            \r
+            if flag == 0 and self.fall_flag == 0:#电话通话中 或者呼叫中挂断中断\r
+                EventMesh.publish("close_timer_all")#\r
+                data = str(argc)\r
+                data_shi = 0\r
+                data_ge = 0\r
+                if data.find(".") != -1:\r
+                    data_shi = int(data.split(".")[0])\r
+                    data_ge = int(data.split(".")[1])\r
+                else:\r
+                    data_shi = int(data)\r
+                    data_ge = 0\r
+\r
+                if data_shi != 0 and data_ge != 0:\r
+                    str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_BLOOD_SUGAR"),audio_buf.index("R_READ_TIME_{}".format(data_shi)),\\r
+                    audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT"),audio_buf.index("R_READ_TIME_{}".format(data_ge)))\r
+                    EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+            else:\r
+                EventMesh.publish("set_hr_blood_led",3)#测量异常\r
+\r
+\r
+\r
+        def play_spo2_value(self, event, msg): #播放血样数值\r
+            flag = EventMesh.publish("get_call_state") \r
+            if msg != None:\r
+                if flag == 0 and self.fall_flag == 0:\r
+                    EventMesh.publish("close_timer_all")#\r
+                    if msg >= 85:\r
+                        # str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_HSENSOR_RESULT_OK"))\r
+                        # EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+                        EventMesh.publish("set_hr_blood_led",2)#测量成功\r
+                        self.spo2_value = msg\r
+                        # self.timer.start(2*1000,1,self.play_spo2_fun)\r
+                        self.play_spo2_fun(0)\r
+                    else:\r
+                        str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_HSENSOR_RESULT_FAILE"))\r
+                        EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+                        EventMesh.publish("set_hr_blood_led",3)#测量异常\r
+                else:\r
+                    EventMesh.publish("set_hr_blood_led",3)#测量异常\r
+\r
+        def play_spo2_fun(self,argc):#播放血氧测试值\r
+            flag = EventMesh.publish("get_call_state") \r
+            \r
+            if flag == 0 and self.fall_flag == 0:#电话通话中 或者呼叫中挂断中断\r
+                EventMesh.publish("close_timer_all")#\r
+                data = self.spo2_value\r
+                if data > 100:\r
+                    data = 100\r
+                if data == 100:\r
+                    str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_HSENSOR_SPO2_TITLE"),audio_buf.index("R_READ_TIME_{}".format(data//10)),\\r
+                    audio_buf.index("R_READ_STEP_2"))\r
+                    EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+                else:\r
+                    if data % 10 == 0:\r
+                        str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_HSENSOR_SPO2_TITLE"),audio_buf.index("R_READ_TIME_{}".format(data//10)),\\r
+                        audio_buf.index("R_READ_STEP_3"))\r
+                        EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+                        pass\r
+                    else:\r
+                        str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_HSENSOR_SPO2_TITLE"),audio_buf.index("R_READ_TIME_{}".format(data//10)),\\r
+                        audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_{}".format(data%10)))\r
+                        EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+\r
+\r
+        def set_sim_mode(self, event, msg): #mode 1 蓝灯闪烁 可识别卡 但未联网 2 可绑定appsim正常 3 手表不识别卡或者未插卡\r
+            flag = EventMesh.publish("get_call_state") \r
+            if flag == 0 and self.fall_flag == 0:#电话通话中 或者呼叫中挂断中断\r
+                EventMesh.publish("close_timer_all")#\r
+                # EventMesh.publish("stop_led_timer")#设置参数\r
+                mode = 0\r
+                signal = EventMesh.publish("get_sim_Status")\r
+                if signal != None:\r
+                    if signal == 1:#有卡 \r
+                        if EventMesh.publish(constants.EVENT.GET_CONNECT) == 1:#未联网提示关机\r
+                            mode = 2\r
+                        else:\r
+                            mode = 1\r
+                    else:#未插卡\r
+                        mode = 3\r
+                if mode == 1:#白色灯\r
+                    EventMesh.publish("set_led_time_arg",[1,2,10,led_mode.FLASH_LIGHT_WHITE,10,5,led_mode.OTHER_MEASURE_MODE])#測量成功\r
+                    # 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])#设置参数\r
+                    str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_SIM_FAILE"))\r
+                    EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+                    pass\r
+                elif mode == 2:#蓝灯色灯\r
+                    EventMesh.publish("set_led_time_arg",[1,2,10,led_mode.FLASH_LIGHT_GREEN,10,5,led_mode.OTHER_MEASURE_MODE])#測量成功\r
+                    # 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])#设置参数\r
+                    str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_SIM_CONNECT"))\r
+                    EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+                    pass\r
+                elif mode == 3:#红灯闪烁\r
+                    EventMesh.publish("set_led_time_arg",[1,2,10,led_mode.FLASH_LIGHT_RED,10,5,led_mode.OTHER_MEASURE_MODE])#測量成功\r
+                    str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_NO_SIM"))\r
+                    EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+                pass\r
+            \r
+        def dial_sos_phone(self, event, msg): #拨打紧急求助电话\r
+            flag = EventMesh.publish("get_call_state")\r
+            if flag == 0:\r
+            \r
+                signal = EventMesh.publish("screen_get_sig")\r
+                if signal != None:\r
+                    if signal >= 0 and signal <= 31:#有卡 \r
+                        if EventMesh.publish(constants.EVENT.GET_CONNECT) == 1:#未联网提示关机\r
+                            sos_number = EventMesh.publish("get_dial_sos_number")\r
+                            if sos_number != None:\r
+                                if len(sos_number) != 0:\r
+                                    EventMesh.publish("close_timer_all")#\r
+                                    EventMesh.publish("set_sos_flag",1)\r
+                                        \r
+                                else:#未设置sos紧急求助号码\r
+                                    EventMesh.publish("close_timer_all")#\r
+                                    str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_NO_SET_SOS_DIAL"))\r
+                                    EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+                                    pass\r
+                        else:\r
+                            EventMesh.publish("close_timer_all")#\r
+                            EventMesh.publish("set_led_time_arg",[1,2,10,led_mode.FLASH_LIGHT_WHITE,10,5,led_mode.OTHER_MEASURE_MODE])#測量成功\r
+                            str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_SIM_FAILE"))\r
+                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+                    else:#未插卡\r
+                        EventMesh.publish("close_timer_all")#\r
+                        EventMesh.publish("set_led_time_arg",[1,2,10,led_mode.FLASH_LIGHT_RED,10,5,led_mode.OTHER_MEASURE_MODE])#測量成功\r
+                        str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_NO_SIM"))\r
+                        EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+        \r
+        def play_cur_time_event(self, event, msg): #播放当前时间\r
+            flag = EventMesh.publish("get_call_state") \r
+            if flag == 0 and self.fall_flag == 0:#电话通话中 或者呼叫中挂断中断\r
+                EventMesh.publish("close_timer_all")#\r
+                \r
+                data = RTC().datetime()\r
+                hour = data[4]\r
+                min = data[5]\r
+                # EventMesh.debug_log("hour",hour,min)\r
+                self.old_hour = hour\r
+                self.old_min = min\r
+                if self.old_hour == 0:\r
+                    if self.old_min <= 9:#00:09\r
+                        if self.old_min == 0:#0点整\r
+                            str_data = 'mp3files={}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_0")\\r
+                            ,audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT"))\r
+                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+                        else:#0点09分\r
+                            str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_0")\\r
+                            ,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))\\r
+                            ,audio_buf.index("R_READ_TIME_MIN"))\r
+                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+                            pass\r
+\r
+                    else:\r
+                        if self.old_min % 10 == 0:#0点2十分 0点3十分\r
+                            str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_0")\\r
+                            ,audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT"),audio_buf.index("R_READ_TIME_{}".format(self.old_min // 10))\\r
+                            ,audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_MIN"))\r
+                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+                            pass\r
+                        else:#0点2十8分\r
+                            str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_0")\\r
+                            ,audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT"),audio_buf.index("R_READ_TIME_{}".format(self.old_min // 10))\\r
+                            ,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"))\r
+                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+                            pass\r
+\r
+                elif self.old_hour <= 9:#8:09 9:20 9:45\r
+                    if self.old_min <= 9:#9点09分\r
+                        if self.old_min <= 0:\r
+                            str_data = 'mp3files={}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(self.old_hour))\\r
+                            ,audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT"))\r
+                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+                            pass\r
+                        else:\r
+                            str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(self.old_hour))\\r
+                            ,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))\\r
+                            ,audio_buf.index("R_READ_TIME_MIN"))\r
+                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+\r
+                    else:\r
+                        if self.old_min % 10 == 0:#9点2十分 9点4十分\r
+                            str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(self.old_hour))\\r
+                            ,audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT"),audio_buf.index("R_READ_TIME_{}".format(self.old_min //10))\\r
+                            ,audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_MIN"))\r
+                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+                        else:#9点2十4分\r
+                            str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(self.old_hour))\\r
+                            ,audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT"),audio_buf.index("R_READ_TIME_{}".format(self.old_min //10))\\r
+                            ,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"))\r
+                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+\r
+\r
+                else:#12:0\r
+                    if self.old_min == 0:#12:00 13:00 15:00 20 10 11 12 13 14 15\r
+                        self.play_count+=1\r
+                        hour_shi = self.old_hour//10\r
+                        hour_ge = self.old_hour%10\r
+                        if self.old_hour == 10:#十点整\r
+                            str_data = 'mp3files={}.mp3+{}.mp3'.format(audio_buf.index("R_READ_STEP_3")\\r
+                            ,audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT"))\r
+                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+\r
+                        elif self.old_hour == 20:\r
+                            str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(hour_shi))\\r
+                            ,audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT"))\r
+                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+\r
+                        else:\r
+                            if hour_shi <= 1:#十3点整\r
+                                str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_STEP_3")\\r
+                                ,audio_buf.index("R_READ_TIME_{}".format(hour_ge)),audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT"))\r
+                                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+\r
+                            else:\r
+                                str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(hour_shi))\\r
+                                ,audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_{}".format(hour_ge)),audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT"))\r
+                                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+\r
+                    else:\r
+                        if self.old_hour == 10:#10:09 10:10\r
+                            if self.old_min <= 9:\r
+                                str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_STEP_3")\\r
+                                ,audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT"),audio_buf.index("R_READ_TIME_0")\\r
+                                ,audio_buf.index("R_READ_TIME_{}".format(self.old_min)),audio_buf.index("R_READ_TIME_MIN"))\r
+                                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+                            else:\r
+                                if self.old_min % 10 == 0:#十点2十分\r
+                                    str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_STEP_3")\\r
+                                    ,audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT"),audio_buf.index("R_READ_TIME_{}".format(self.old_min//10))\\r
+                                    ,audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_MIN"))\r
+                                    EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+                                else:#十点2十1分\r
+                                    str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_STEP_3")\\r
+                                    ,audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT"),audio_buf.index("R_READ_TIME_{}".format(self.old_min//10))\\r
+                                    ,audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_{}".format(self.old_min%10))\\r
+                                    ,audio_buf.index("R_READ_TIME_MIN"))\r
+                                    EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+\r
+                        else:\r
+                            if self.old_hour < 20:#19:00\r
+                                if self.old_min <= 9:#19:09 \r
+                                    if self.old_min == 0:\r
+                                        str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_STEP_3")\\r
+                                        ,audio_buf.index("R_READ_TIME_{}".format(self.old_hour % 10)),audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT"))\r
+                                        EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+                                        pass\r
+                                    else:\r
+                                        str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_STEP_3")\\r
+                                        ,audio_buf.index("R_READ_TIME_{}".format(self.old_hour % 10)),audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT")\\r
+                                        ,audio_buf.index("R_READ_TIME_0"),audio_buf.index("R_READ_TIME_{}".format(self.old_min % 10))\\r
+                                        ,audio_buf.index("R_READ_TIME_MIN"))\r
+                                        EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+                                    \r
+                                else:#19:18 19:40 19:56\r
+                                    if self.old_min % 10 == 0:#十9点2十分 十9点3十分\r
+                                        str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_STEP_3")\\r
+                                        ,audio_buf.index("R_READ_TIME_{}".format(self.old_hour % 10)),audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT")\\r
+                                        ,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"))\r
+                                        EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+                                    else:#十9点2十1分\r
+                                        str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_STEP_3")\\r
+                                        ,audio_buf.index("R_READ_TIME_{}".format(self.old_hour % 10)),audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT")\\r
+                                        ,audio_buf.index("R_READ_TIME_{}".format(self.old_min // 10)),audio_buf.index("R_READ_STEP_3")\\r
+                                        ,audio_buf.index("R_READ_TIME_{}".format(self.old_min % 10)),audio_buf.index("R_READ_TIME_MIN"))\r
+                                        EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+\r
+                            else:\r
+                                hour_shi = self.old_hour//10\r
+                                hour_ge = self.old_hour%10\r
+\r
+                                min_shi = self.old_min//10\r
+                                min_ge = self.old_min%10\r
+\r
+                                #20:08 20:18  20:20\r
+                                if hour_ge == 0:\r
+                                    if self.old_min <= 9:\r
+                                        if self.old_min == 0:\r
+                                            str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(hour_shi))\\r
+                                            ,audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT"))\r
+                                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+                                            pass\r
+                                        else:\r
+                                            str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(hour_shi))\\r
+                                            ,audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT"),audio_buf.index("R_READ_TIME_0")\\r
+                                            ,audio_buf.index("R_READ_TIME_{}".format(min_ge)),audio_buf.index("R_READ_TIME_MIN"))\r
+                                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+\r
+                                    else:\r
+                                        if min_ge == 0:#2十点2十分\r
+                                            str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(hour_shi))\\r
+                                            ,audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT"),audio_buf.index("R_READ_TIME_{}".format(min_shi))\\r
+                                            ,audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_MIN"))\r
+                                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+                                        else:#2十点2十1分\r
+                                            str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(hour_shi))\\r
+                                            ,audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT"),audio_buf.index("R_READ_TIME_{}".format(min_shi))\\r
+                                            ,audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_{}".format(min_ge)),audio_buf.index("R_READ_TIME_MIN"))\r
+                                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+\r
+                                else:#21:08 21:18\r
+                                    if self.old_min <= 9:\r
+                                        if self.old_min == 0:\r
+                                            str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(hour_shi))\\r
+                                            ,audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_{}".format(hour_ge))\\r
+                                            ,audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT"))\r
+                                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+                                            pass\r
+                                        else:\r
+                                            str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(hour_shi))\\r
+                                            ,audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_{}".format(hour_ge))\\r
+                                            ,audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT"),audio_buf.index("R_READ_TIME_0")\\r
+                                            ,audio_buf.index("R_READ_TIME_{}".format(min_ge)),audio_buf.index("R_READ_TIME_MIN"))\r
+                                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+                                    else:\r
+                                        if min_ge == 0:#2十3点3十分\r
+                                            str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(hour_shi))\\r
+                                            ,audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_{}".format(hour_ge))\\r
+                                            ,audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT"),audio_buf.index("R_READ_TIME_{}".format(min_shi))\\r
+                                            ,audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_MIN"))\r
+                                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+                                        else:#2十3点3十1分\r
+                                            str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(hour_shi))\\r
+                                            ,audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_{}".format(hour_ge))\\r
+                                            ,audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT"),audio_buf.index("R_READ_TIME_{}".format(min_shi))\\r
+                                            ,audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_{}".format(min_ge)),audio_buf.index("R_READ_TIME_MIN"))\r
+                                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+\r
+\r
+        def play_timer_cb_1(self,*agrs):\r
+            return\r
+\r
+        def play_center_phone(self, event, msg): #msg\r
+            flag = EventMesh.publish("get_call_state")#在通话或者电话拨进 或者拨出不允许设备再次拨出\r
+            if flag == 0 and self.fall_flag == 0:\r
+                EventMesh.publish("close_timer_all")#\r
+            \r
+                center_dial = EventMesh.publish("get_storage_config","center_dial")\r
+                if center_dial != None:\r
+                    if len(center_dial) > 0:\r
+                        str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_SOS_ALERT"))\r
+                        EventMesh.publish("play_audio_file",[str_data,0])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+                        voiceCall.callStart(str(center_dial))\r
+                        \r
+                    \r
+                else:#未设置号码\r
+                    # EventMesh.debug_log("play_center_phone")\r
+                    str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_NO_SET_SOS_DIAL"))\r
+                    EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+                    pass\r
+        def center_phone_cb(self,*argc): #msg\r
+            pass\r
+\r
+\r
+\r
+\r
+        def play_imei_event(self, event, msg): #msg\r
+            flag = EventMesh.publish("get_call_state") \r
+            if flag == 0 and self.fall_flag == 0:#电话通话中 或者呼叫中挂断中断\r
+                EventMesh.publish("close_timer_all")#\r
+                imei = EventMesh.publish(constants.EVENT.GET_IMEI)\r
+                EventMesh.debug_log(imei)\r
+                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]))\\r
+                ,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])),\\r
+                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])),\\r
+                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])),\\r
+                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])))\r
+                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+\r
+\r
+        def get_unread_wechat_state(self,event, msg): \r
+\r
+            return self.set_unread_wechat\r
+        \r
+        def set_unread_wechat_state(self, event, msg): \r
+            self.set_unread_wechat = msg\r
+\r
+        def get_wechat_data(self,event, msg): \r
+\r
+            return [self.MXA_MSG ,self.wechat_recode_list]\r
+        \r
+        def set_wechat_data(self, event, msg): \r
+            # EventMesh.debug_log("set_wechat_data1 ",msg,self.wechat_num)\r
+            self.MXA_MSG = msg[0]\r
+            self.wechat_recode_list = msg[1]\r
+            self.wechat_num = self.wechat_recode_list["num"]\r
+            with open("/usr/static/storage_file/wechat_record.json","w",encoding="utf-8") as fd:\r
+                ujson.dump(self.wechat_recode_list,fd)\r
+                #写编号\r
+            # EventMesh.debug_log("set_wechat_data2:{} ".format(self.wechat_num))\r
+        \r
+\r
+        def get_wechat_time(self, event, msg):\r
+            return  [self.press_btn,self.timeSecond]\r
+\r
+        def start_wechat_record(self, event, msg): #开始录音相关配置\r
+            if EventMesh.publish(constants.EVENT.GET_CONNECT) == 1:#未联网不需要录音\r
+                flag = EventMesh.publish("get_call_state") \r
+                if flag == 0 and self.fall_flag == 0:#电话通话中 或者呼叫中挂断中断\r
+                    if self.press_btn == 0:\r
+                        self.press_btn = 1\r
+                        audio_state = EventMesh.publish("get_audio_state")\r
+                        if audio_state == 1:\r
+                            self.aud.stop()\r
+                        EventMesh.publish("close_timer_all")#\r
+                        EventMesh.publish("set_led_time_arg",[1,1,160,led_mode.LONG_LIGHT_GREEN,4,2,led_mode.WECHAT_LED_MODE])#測量成功\r
+                        # EventMesh.publish("set_led_time_arg",[1000,1000,1,led_mode.LONG_LIGHT_GREEN,led_mode.OPEN_LONG_LIGHT_MODE,led_mode.WECHAT_LED_MODE])#測量成功\r
+                    \r
+                        date_tmp = utime.localtime()\r
+                        time_tmp = utime.mktime(date_tmp)\r
+                        self.timeSecond = time_tmp#保存按下的时间长s\r
+                        self.aud.setVolume(11)#设置音量最大\r
+                        \r
+                        EventMesh.debug_log("talking1.0")\r
+                        # if self.wechat_num >= self.MXA_MSG:\r
+                        #     self.wechat_num = 0 \r
+                        # self.wechat_num += 1\r
+                        # self.wechat_show = self.wechat_num\r
+                        # self.record_test.start("/usr/static/storage_file/{}.amr".format(self.wechat_show),16) \r
+                        self.record_test.start("/usr/static/storage_file/wechat.amr",16) \r
+                \r
+            else:\r
+                self.timeSecond = 0\r
+                self.press_btn = 0\r
+        def get_wechat_state(self, event, msg):\r
+            return self.press_btn\r
+        def set_wechat_state(self, event, msg):\r
+            self.press_btn = msg\r
+\r
+        def send_wechat_record(self, event, msg): #发送录音文件\r
+            if self.press_btn == 1:\r
+                self.press_btn = 0\r
+                self.record_test.stop() #停止錄音\r
+                EventMesh.publish("stop_led_timer")#关闭灯\r
+                EventMesh.publish("set_led_time_arg",[1,1,0,led_mode.FLASH_LIGHT_GREEN,4,2,led_mode.OTHER_MEASURE_MODE])#測量成功\r
+                # EventMesh.publish("set_led_time_arg",[0,1000,1,led_mode.LONG_LIGHT_GREEN,led_mode.OPEN_LONG_LIGHT_MODE,led_mode.OTHER_MEASURE_MODE])#測量成功\r
+                self.countdown_old = 0\r
+\r
+                date_tmp = utime.localtime()\r
+                time_tmp = utime.mktime(date_tmp)\r
+\r
+                self.countdown_old = msg\r
+                if self.countdown_old >= 15:\r
+                    self.countdown_old = 15\r
+                if self.countdown_old <= 0:\r
+                    #录音时间太短\r
+                    return\r
+                else:\r
+                    # self.wechat_recode_list["%02d"%(self.wechat_show)] = "read:0"\r
+                    # self.wechat_recode_list["num"] = self.wechat_show\r
+                    EventMesh.debug_log("self.wechat_recode_list :{}".format(self.wechat_recode_list))\r
+\r
+                    # with open("/usr/static/storage_file/wechat_record.json","w+",encoding="utf-8") as fd:\r
+                    #     ujson.dump(self.wechat_recode_list,fd)\r
+                    EventMesh.debug_log("send wechat data!!!!!!!!!!!!!!!!!!!!!")\r
+\r
+                    check_txt = ql_fs.path_exists("/usr/static/storage_file/wechat.amr")\r
+                    if check_txt == True :\r
+                        path = "/usr/static/storage_file/wechat.amr"\r
+                        with open(path,"rb") as fd:\r
+                            buf = bytearray(ql_fs.path_getsize(path))\r
+                            fd.readinto(buf)\r
+                            senddata = [self.countdown_old,buf]\r
+                            EventMesh.publish(constants.PROTOCOL.TKS_SEND,senddata)\r
+\r
+                    # with open("/usr/static/storage_file/wechat_record.json","w+",encoding="utf-8") as fd:\r
+                    #     ujson.dump(self.wechat_recode_list,fd)\r
+                    # EventMesh.debug_log("send wechat data!!!!!!!!!!!!!!!!!!!!!")\r
+\r
+                    # check_txt = ql_fs.path_exists("/usr/static/storage_file/{}.amr".format(self.wechat_show))\r
+                    # if check_txt == True :\r
+                    #     path = "/usr/static/storage_file/{}.amr".format(self.wechat_show)\r
+                    #     with open(path,"rb") as fd:\r
+                    #         buf = bytearray(ql_fs.path_getsize(path))\r
+                    #         fd.readinto(buf)\r
+                    #         senddata = [self.countdown_old,buf]\r
+                    #         EventMesh.publish(constants.PROTOCOL.TKS_SEND,senddata)\r
+            else:\r
+                self.press_btn = 0\r
+\r
+\r
+\r
+        def play_wechat_last_amr(self, event, msg):#播放微聊最后一条语音文件\r
+            flag = EventMesh.publish("get_call_state") \r
+            if flag == 0:#电话通话中 或者呼叫中挂断中断\r
+                EventMesh.publish("close_timer_all")#\r
+                if self.wechat_recode_list != None:\r
+                    num = 0\r
+                    play_state = 0\r
+                    if len(self.wechat_recode_list) > 1:\r
+                        num = int(self.wechat_recode_list["num"])\r
+                        #EventMesh.debug_log("self.wechat_recode_list1:{}".format(self.wechat_recode_list))\r
+                        if num != 0:\r
+                            last_num = str("%02d"%(num))\r
+                            last_tmp = self.wechat_recode_list[last_num]\r
+                            last_read = int(last_tmp.split(":")[1])\r
+                            if last_read == 1:#如果最后一条没有读则读最新的一条\r
+                                self.wechat_recode_list[last_num] = "read:0"\r
+                                self.wechat_recode_list["num"] = num \r
+                                with open("/usr/static/storage_file/wechat_record.json","w+",encoding="utf-8") as fd:\r
+                                    ujson.dump(self.wechat_recode_list,fd)\r
+                            else:\r
+                                sotr_new = {}\r
+                                sotr_new = sorted(self.wechat_recode_list.keys(), reverse=True)#降序排序\r
+                                # EventMesh.debug_log("sotr_new:{}".format(sotr_new))\r
+                                for i in range(len(self.wechat_recode_list)-1):#1 01 02 \r
+                                    key = sotr_new[i+1]\r
+                                    num_id = int(key)\r
+                                    #EventMesh.debug_log("key:{} num_id:{}".format(key,num_id))\r
+                                    if key in self.wechat_recode_list:#\r
+                                        str_tmp = self.wechat_recode_list[key]\r
+                                        read = int(str_tmp.split(":")[1])\r
+                                        if read != 0:#未读是按一下播放下一条同时删除\r
+                                            check_amr = ql_fs.path_exists("/usr/static/storage_file/{}.amr".format(num_id))#还要检测这个文件是否存在\r
+                                            if check_amr == True:\r
+                                                self.wechat_recode_list[key] = "read:0"\r
+                                                self.wechat_recode_list["num"] = num \r
+                                                EventMesh.debug_log("self.wechat_recode_list2:{} num_id:{} num:{}".format(self.wechat_recode_list,num_id,num))\r
+                                                # self.aud.play(1, 1, '/usr/static/storage_file/{}.amr'.format(num))  #文件名前面要加上路径\r
+                                                play_state = 1\r
+                                                with open("/usr/static/storage_file/wechat_record.json","w+",encoding="utf-8") as fd:\r
+                                                    ujson.dump(self.wechat_recode_list,fd)\r
+                                                break\r
+                                            else:\r
+                                                continue\r
+                                        else:\r
+                                            continue\r
+                                    else:\r
+                                        continue\r
+                            #EventMesh.debug_log("play_state:{}".format(play_state))\r
+                            # if play_state == 0:#\r
+                            check_amr = ql_fs.path_exists("/usr/static/storage_file/{}.amr".format(num))#还要检测这个文件是否存在\r
+                            if check_amr == True:\r
+                                self.aud.play(1, 1, '/usr/static/storage_file/{}.amr'.format(num))  #文件名前面要加上路径\r
+\r
+\r
+        def play_unread_wechat_infor(self,event,msg):#未读微聊语音\r
+            flag = EventMesh.publish("get_call_state") \r
+            if flag == 0 and self.press_btn == 0 and self.fall_flag == 0:#电话通话中 或者呼叫中挂断中断\r
+                if self.wechat_recode_list != None:\r
+                    num = 0\r
+                    play_state = 0\r
+                    if len(self.wechat_recode_list) > 1:\r
+                        num = int(self.wechat_recode_list["num"])\r
+                        if num != 0:\r
+                            for i in range(len(self.wechat_recode_list)-1):#1 01 02 \r
+                                key = "%02d"%(i+1)\r
+                                if key in self.wechat_recode_list:#\r
+                                    str_tmp = self.wechat_recode_list[key]\r
+                                    read = int(str_tmp.split(":")[1])\r
+                                    if read == 1:#未读是按一下播放下一条同时删除\r
+                                        play_state = 1\r
+                                    else:\r
+                                        continue\r
+                                else:\r
+                                    continue\r
+                            if play_state == 1:#设置未读语音状态\r
+                                EventMesh.publish("set_unread_wechat_state",1)\r
+                            else:\r
+                                EventMesh.publish("set_unread_wechat_state",0)\r
+                                self.updateTime = 0\r
+\r
+                state = EventMesh.publish("get_unread_wechat_state")#\r
+                date_tmp = utime.localtime()\r
+                time_tmp = utime.mktime(date_tmp)\r
+                if state != None:\r
+                    if state == 1:\r
+                        EventMesh.publish("set_led_time_arg",[1,2,8,led_mode.FLASH_LIGHT_GREEN,8,4,led_mode.OTHER_MEASURE_MODE])#測量成功\r
+                        # 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])#设置参数\r
+                        if self.updateTime == 0:\r
+                            self.updateTime = time_tmp\r
+                        if self.updateTime != 0:\r
+                            if time_tmp - self.updateTime >= 10*60:\r
+                                self.updateTime = time_tmp\r
+                                #播放音频文件\r
+                                EventMesh.publish("close_timer_all")\r
+                                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_UNREAD_WECHAT"))\r
+                                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+                    else:\r
+                        self.updateTime = 0\r
+            \r
+\r
+\r
+\r
+    class BtnDevice(Abstract):\r
+\r
+        def __init__(self, tp=None):\r
+            self.pk = PowerKey()\r
+            self.__pwk_timer = osTimer()\r
+            self.aud = audio.Audio(0)\r
+            self.aud.set_pa(Pin.GPIO29)\r
+            self.aud.setVolume(11)\r
+            # self.keypad = machine.KeyPad(1, 2)\r
+            self.__PowerDownTimeOut = 3000\r
+            self.__tp = tp\r
+            self.pwk_press = 0\r
+            self.pwk_count = 0\r
+            self.GPIO26_status = 1#默认是低电平\r
+            self.powerKey_status = 0\r
+            self.sosKey = 0\r
+            self.wechatKey = 0\r
+            self.sosKey_status = 1#默认是低电平\r
+            self.WeChatKey_status = 1#默认是低电平\r
+\r
+            self.wechatKey_timer = osTimer()\r
+            self.wechatKey_count = 0\r
+            self.wechatKey_press = 0 \r
+\r
+            self.sosKey_timer = osTimer()\r
+            self.sosKey_count = 0\r
+            self.sosKey_press = 0 \r
+            self.sosKey_long_press = 0\r
+\r
+            self.wechatKey_press_count = 0\r
+\r
+            self.timeSeconOld = 0\r
+            self.wechat_state = 0 #按下录音时的状态\r
+\r
+            \r
+            self.sosKey_press_count = 0\r
+\r
+\r
+            self.pwkey_timer = osTimer()\r
+            self.pwKey_press_count = 0\r
+            self.pwkey_count = 0\r
+            self.pwkey_press = 0\r
+            self.led_state = 0\r
+            self.hsensorTest_timer = osTimer()\r
+            self.factoryTest_timer = osTimer()\r
+            self.factoryTest_count = 0\r
+            self.factory_timesec = 0\r
+            self.factoryTest_led_count = 0\r
+            self.factoryTest_flag = 0\r
+            self.btnInfo_queue = Queue()\r
+            _thread.stack_size(10*1024+192)\r
+            _thread.start_new_thread(self.btnInfo_queue_thread, ())\r
+            _thread.stack_size(8*1024)\r
+            \r
+            EventMesh.subscribe("publish_message_event_btnInfo",self.publish_message_event_btnInfo)\r
+\r
+            EventMesh.subscribe("close_wechat_btn_timer", self.close_wechat_btn_timer)#来电强制关闭微聊语音\r
+\r
+        def btnInfo_queue_thread(self):\r
+            while True:\r
+                data = self.btnInfo_queue.get()\r
+                #EventMesh.debug_log("Info_queue:data = {}".format(data))\r
+                if data != None:\r
+                    try:\r
+                        data["func"](data["data"])\r
+                    except Exception as e:\r
+                        EventMesh.debug_log("btnInfo_queue:ERROR:{}".format(e))\r
+                        usys.print_exception(e)\r
+        def publish_message_event_btnInfo(self,event,msg):\r
+            self.btnInfo_queue.put(msg)\r
+            EventMesh.publish(constants.EVENT.SYSTEM_UP)#唤醒休眠\r
+            \r
+        def publish_wechat_btn_event_cb(self, *args, **kwargs):\r
+            EventMesh.publish("publish_message_event_btnInfo",{"func":self.wechatKey_press_cb,"data":0})  \r
+\r
+        def publish_soskey_btn_event_cb(self, *args, **kwargs):\r
+            EventMesh.publish("publish_message_event_btnInfo",{"func":self.sosKey_press_cb,"data":0})  \r
+\r
+        def publish_pwkKey_btn_event_cb(self, *args, **kwargs):\r
+            EventMesh.publish("publish_message_event_btnInfo",{"func":self.pwKey_press_cb,"data":0})  \r
+\r
+    \r
+\r
+        def post_processor_after_instantiation(self):\r
+            # self.keypad.init()\r
+            # self.keypad.set_callback(self.key_callback)\r
+        \r
+            self.pk.powerKeyEventRegister(self.powerKey_callback)\r
+            \r
+            self.extint = ExtInt(ExtInt.GPIO26, ExtInt.IRQ_RISING_FALLING, ExtInt.PULL_DISABLE, self.pwk_extint_cb)\r
+            self.extint.enable()\r
+\r
+            self.sosKey = ExtInt(ExtInt.GPIO22, ExtInt.IRQ_RISING_FALLING, ExtInt.PULL_PU, self.sosKey_extint_cb)\r
+            self.sosKey.enable()\r
+\r
+            self.wechatKey = ExtInt(ExtInt.GPIO20, ExtInt.IRQ_RISING_FALLING, ExtInt.PULL_PU, self.wechatKey_extint_cb)\r
+            self.wechatKey.enable()\r
+\r
+            key19 = Pin(Pin.GPIO19, Pin.OUT, Pin.PULL_PU, 0)\r
+\r
+        def pwk_extint_cb(self,args):#侧边按键\r
+            # self.GPIO26_status = self.extint.read_level()\r
+            \r
+            open_power = EventMesh.publish("get_power_on_state")#获取开机标识\r
+            open_power_off = EventMesh.publish("get_power_off_state")#获取开机标识\r
+            if open_power != None and open_power_off != None:\r
+                if open_power == 0 or open_power_off == 1:\r
+                    return\r
+            flag = EventMesh.publish("get_call_state")#在通话或者电话拨进 或者拨出不允许寻找设备\r
+            fall_down = EventMesh.publish("get_fall_down_state")#跌倒报警标识\r
+            if fall_down != None:\r
+                if fall_down != 0 or flag == 2:\r
+                    return\r
+            self.GPIO26_status = int(args[1])\r
+            if self.GPIO26_status == 0:\r
+                self.GPIO26_status = 1\r
+            else:\r
+                self.GPIO26_status = 0\r
+                pass\r
+            self.WeChatKey_status = self.wechatKey.read_level()\r
+            if self.sosKey_status != 0 and self.WeChatKey_status != 0:\r
+                if self.GPIO26_status == 0:#按下\r
+                    EventMesh.publish("close_wechat_btn_timer")\r
+                    if self.pwkey_press == 0 :\r
+                        self.aud.stop()  #播放声音 \r
+                        # self.wechatKey_timeout_cb(0)\r
+                        # self.sosKey_timeout_cb(0)\r
+                        self.wechatKey_timer.stop()\r
+                        self.pwkey_timer.stop()\r
+                        self.sosKey_timer.stop()\r
+                        \r
+                        self.sosKey_press_count = 0\r
+                        self.sosKey_press = 0\r
+                        self.sosKey_long_press = 0\r
+                        self.wechatKey_press = 0\r
+                        self.wechat_state = 0\r
+                        self.wechatKey_press_count = 0\r
+\r
+                        self.pwkey_press = 1\r
+                        self.pwkey_count = 0\r
+                        self.led_state = 0\r
+                        self.pwkey_timer.start(100, 1, self.publish_pwkKey_btn_event_cb)\r
+                        # EventMesh.debug_log("key22_extint_cb:self.key22_timer.start!!!!\n")\r
+\r
+        def pwKey_press_cb(self, data):\r
+            '''KEY2:联动屏幕右下角或返回键长按关机'''\r
+            open_power = EventMesh.publish("get_power_on_state")#获取开机标识\r
+            open_power_off = EventMesh.publish("get_power_off_state")#获取开机标识\r
+            if open_power != None and open_power_off != None:\r
+                if open_power == 0 or open_power_off == 1:\r
+                    self.pwkey_timer.stop()\r
+                    self.pwkey_count = 0\r
+                    self.pwkey_press = 0\r
+                    self.led_state = 0\r
+                    self.pwKey_press_count=0\r
+                    return\r
+            self.GPIO26_status = self.extint.read_level()\r
+            if self.pwkey_press == 1 :\r
+                self.pwkey_count += 1\r
+                if self.pwkey_count > 5:\r
+                    if self.led_state == 0:\r
+                        self.led_state = 1\r
+                        EventMesh.publish("set_led_time_arg",[1,1,330,led_mode.LONG_LIGHT_GREEN,2,1,led_mode.OTHER_MEASURE_MODE])#測量成功\r
+                    if self.pwkey_count >= 10*10:\r
+                        EventMesh.publish("stop_led_timer")#设置参数\r
+                        self.pwkey_timer.stop()\r
+                        self.pwkey_count = 0\r
+                        self.pwkey_press = 0\r
+                        self.pwKey_press_count = 0\r
+                        self.led_state = 0\r
+                        # if EventMesh.publish("get_sim_Status") != 1:\r
+                        #     EventMesh.publish("open_power_on", 2)#\r
+                        # else:\r
+                        EventMesh.publish("open_power_on", 3)#\r
+                        return\r
+                    \r
+                    if self.pwkey_count >= 3*10 :\r
+                        if EventMesh.publish("get_sim_Status") != 1:\r
+                            EventMesh.debug_log("长3秒关机")\r
+                            EventMesh.publish("stop_led_timer")#设置参数\r
+                            self.pwkey_timer.stop()\r
+                            self.pwkey_count = 0\r
+                            self.pwkey_press = 0\r
+                            self.pwKey_press_count = 0\r
+                            self.led_state = 0\r
+                            EventMesh.publish("open_power_on", 2)#\r
+                            return\r
+                            \r
+                    \r
+                if self.GPIO26_status == 1:#松开\r
+                    if self.pwkey_count >= 1: #防抖100ms\r
+                        # EventMesh.debug_log("self.GPIO26_status == 1")\r
+                        self.pwkey_timer.stop()\r
+                        self.pwkey_count = 0\r
+                        self.pwkey_press = 0\r
+                        self.led_state = 0\r
+                        self.pwKey_press_count+=1\r
+                        self.pwkey_timer.start(500, 0, self.publish_pwKey_timeout_cb_do)#松手超时1s判断\r
+\r
+        def  hsensorTest_timer_cb(self,e):\r
+            EventMesh.publish("system_sleep_rest")#防止黑屏 \r
+            w_data = EventMesh.publish(constants.EVENT.GET_WEAR)#佩戴数据\r
+            #EventMesh.debug_log("FactoryModeHsensorTest{}".format(data))\r
+        \r
+            c_data = self.Hsensor.get_test_data()#校准数据和工厂数据\r
+            # text_data = "   佩戴状态\n红外:{}活体:{}佩戴:{}\n{},{} \n{},{} \n{},{}\n校准数据:{},{},{},{}\n漏光数据:{},{},{}".format(\r
+            #                                             c_data[3],c_data[4],w_data,c_data[5],c_data[6],c_data[7],c_data[8],c_data[9],c_data[10],\r
+            #                                                 c_data[11],c_data[12],c_data[13],c_data[14],c_data[0],c_data[1],c_data[2],)\r
+                \r
+            if(self.hsensorTest_timer_count != 0):\r
+                    self.hsensorTest_timer_count -= 1\r
+                    if self.hsensorTest_timer_count%5 == 0:\r
+                        EventMesh.debug_log("c_data:{} {} {} {}".format(c_data[11],c_data[12],c_data[13],c_data[14]))\r
+                        if c_data[11] != 0 and c_data[13] != 0: #校准成功\r
+                            str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_HSENSOR_RESULT_OK"))\r
+                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+                            self.Hsensor.close() \r
+                            self.Hsensor.init()\r
+                            self.hsensorTest_timer.stop()\r
+                            return\r
+                    if self.hsensorTest_timer_count == 0:#50秒超时,失败\r
+                        self.Hsensor.close() \r
+                        self.Hsensor.init(); \r
+                        self.hsensorTest_timer.stop()\r
+                        str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_HSENSOR_RESULT_FAILE"))\r
+                        EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+                \r
+        def publish_pwKey_timeout_cb_do(self, *args, **kwargs):\r
+            EventMesh.publish("publish_message_event_btnInfo",{"func":self.pwKey_timeout_cb,"data":0})  \r
+        \r
+        def pwKey_timeout_cb(self, data):#侧边按键\r
+            boot_count = EventMesh.publish("get_boot_time_count")\r
+            try :\r
+                if boot_count < 50 :#开机50秒内按键次数大于10就校准\r
+                    #EventMesh.debug_log("boot_count:{}".format(boot_count))\r
+                    if self.pwKey_press_count >= 6:\r
+                        self.Hsensor =  EventMesh.publish("get_Hsensor")\r
+                        self.hsensorTest_timer.start(1000,1,self.hsensorTest_timer_cb) \r
+                        EventMesh.debug_log("打开校准模式")\r
+                        self.Hsensor.set_sar(1)\r
+                        self.Hsensor.open_test(255) #打开校准模式\r
+                        utime.sleep_ms(500)\r
+                        self.Hsensor.open_heart()\r
+                        self.hsensorTest_timer_count = 50\r
+                        self.hsensorTest_timer.start(1000,1,self.hsensorTest_timer_cb)\r
+                        str_data = 'mp3files={}.mp3+{}.mp3'.format(audio_buf.index("R_HSENSOR_RESULT_HR_TITLE"),audio_buf.index("R_HSENSOR_SPO2_TITLE"),)\r
+                        EventMesh.publish("play_audio_file",[str_data,1])\r
+                        self.pwKey_press_count = 0\r
+                        return\r
+\r
+            except Exception as e:\r
+                usys.print_exception(e)\r
+            open_power = EventMesh.publish("get_power_on_state")#获取开机标识\r
+            open_power_off = EventMesh.publish("get_power_off_state")#获取开机标识\r
+            if open_power != None and open_power_off != None:\r
+                if open_power == 0 or open_power_off == 1:\r
+                    self.pwkey_timer.stop()\r
+                    self.pwkey_count = 0\r
+                    self.pwkey_press = 0\r
+                    self.led_state = 0\r
+                    self.pwKey_press_count=0\r
+                    return\r
+            if self.pwKey_press_count >= 1:\r
+                self.pwKey_press_count = 0\r
+\r
+                # flag = EventMesh.publish("get_call_state") \r
+                # if flag != 2:#如果是电话拨出去或者不在打电话中都可以执行\r
+                #     EventMesh.publish("stop_led_timer")#设置参数\r
+                #     if flag == 1:#如果是sos电话拨出去\r
+                #         sos_flag = EventMesh.publish("get_sos_flag")\r
+                #         if sos_flag == 1:\r
+                #             EventMesh.publish("set_sos_flag",0)\r
+                #             EventMesh.publish("set_sos_num",0)\r
+                #             EventMesh.publish("set_hangup_mode",0)\r
+                #     EventMesh.publish("close_hr_sop2")#\r
+                #     flag = EventMesh.publish("get_call_state") \r
+                #     # if flag == 0 or flag == 2:#在拨出去或者通话中就不播报入网成功的语音\r
+                #     if flag != 1:#在拨出去或者通话中就不播报入网成功的语音\r
+                #         EventMesh.publish("set_sim_mode")#\r
+                #     EventMesh.publish("dialing_out_event")#电话呼叫中voiceCall.callEnd()\r
+                \r
+                # EventMesh.debug_log("pwKey_timeout_cb:self.pwKey_press_count >= 1")\r
+                flag = EventMesh.publish("get_call_state") \r
+                if flag != 2:\r
+                    EventMesh.publish("stop_led_timer")#设置参数\r
+                    EventMesh.publish("dialing_out_event")#电话呼叫中voiceCall.callEnd()\r
+\r
+                    if flag == 1:#如果是sos电话拨出去\r
+                        sos_flag = EventMesh.publish("get_sos_flag")\r
+                        if sos_flag == 1:\r
+                            EventMesh.publish("set_sos_flag",0)\r
+                            EventMesh.publish("set_sos_num",0)\r
+                            EventMesh.publish("set_hangup_mode",0)\r
+                    EventMesh.publish("close_hr_sop2")#\r
+                    flag = EventMesh.publish("get_call_state") \r
+                    if flag != 1:\r
+                        EventMesh.publish("set_sim_mode")#\r
+            \r
+            self.pwKey_press_count = 0\r
+\r
+        def sosKey_extint_cb(self,args):\r
+            power_off = EventMesh.publish("get_power_off_state")#获取关机标识\r
+            open_power = EventMesh.publish("get_power_on_state")#获取开机标识\r
+            if power_off != None and open_power != None:\r
+                if power_off == 1 or open_power == 0:\r
+                    return\r
+            # self.sosKey_status = self.sosKey.read_level()\r
+            self.sosKey_status = int(args[1])\r
+            if self.sosKey_status == 0:\r
+                self.sosKey_status = 1\r
+            else:\r
+                self.sosKey_status = 0\r
+                pass\r
+            # wechat_state = EventMesh.publish("get_wechat_state")\r
+            # EventMesh.debug_log('### key22_extint_cb  {} {} self.GPIO22_status:{} {} {}'.format(wechat_state,args,self.WeChatKey_status,self.GPIO26_status,self.sosKey_status)) # args[0]:gpio号 args[1]:上升沿或下降沿\r
+            if self.WeChatKey_status != 0 and self.GPIO26_status != 0:\r
+                if self.sosKey_status == 0:#按下\r
+                    EventMesh.publish("close_falldown_alarm_event")#sos短按事件\r
+                    EventMesh.publish("close_wechat_btn_timer")\r
+                    if self.sosKey_press == 0 :\r
+                        self.led_state = 0\r
+                        self.wechatKey_timer.stop()\r
+                        self.pwkey_timer.stop()\r
+                        self.sosKey_timer.stop()\r
+                        self.wechatKey_press_count = 0\r
+                        self.wechat_state = 0\r
+                        self.wechatKey_count = 0\r
+                        self.pwKey_press_count = 0\r
+                        \r
+                        self.pwkey_press = 0\r
+                        self.wechatKey_press = 0\r
+                        \r
+                        self.sosKey_long_press = 0\r
+                        self.sosKey_count = 0\r
+                        self.sosKey_press = 1\r
+                        self.sosKey_timer.start(100, 1, self.publish_soskey_btn_event_cb)\r
+            # EventMesh.debug_log("key22_extint_cb:self.key22_timer.start!!!!\n")\r
+\r
+        def sosKey_press_cb(self, data):\r
+            '''KEY2:联动屏幕右下角或返回键长按关机'''\r
+            open_power = EventMesh.publish("get_power_on_state")#获取开机标识\r
+            open_power_off = EventMesh.publish("get_power_off_state")#获取开机标识\r
+            if open_power != None and open_power_off != None:\r
+                if open_power == 0 or open_power_off == 1:\r
+                    self.sosKey_timer.stop()\r
+                    self.sosKey_count = 0\r
+                    self.sosKey_press = 0\r
+                    self.sosKey_long_press = 0\r
+                    self.sosKey_press_count = 0\r
+                    return\r
+            self.sosKey_status = self.sosKey.read_level()\r
+            if self.sosKey_press == 1 :\r
+                # if self.sosKey_count <= 2:\r
+                    # if EventMesh.publish(constants.EVENT.GET_CONNECT) == 1:#未联网不需要录音\r
+                    #     EventMesh.publish("set_led_time_arg",[1000,200,1,led_mode.FLASH_LIGHT_GREEN,led_mode.DEFAULT_LONG_LIGHT_MODE,led_mode.OTHER_MEASURE_MODE])#设置参数\r
+                    # else:\r
+                    #     EventMesh.publish("set_led_time_arg",[1000,200,1,led_mode.FLASH_LIGHT_RED,led_mode.DEFAULT_LONG_LIGHT_MODE,led_mode.OTHER_MEASURE_MODE])#设置参数\r
+                self.sosKey_count += 1\r
+                if self.sosKey_count >= 10*3: #长按3s sos拨号\r
+                    if self.sosKey_long_press == 0:\r
+                        self.sosKey_long_press = 1\r
+                        flag = EventMesh.publish("get_call_state")#在通话或者电话拨进 或者拨出不允许寻找设备\r
+                        fall_down = EventMesh.publish("get_fall_down_state")#跌倒报警标识\r
+                        if fall_down != None:\r
+                            if fall_down != 0 or flag == 2:\r
+                                return\r
+                        EventMesh.publish_async("dial_sos_phone")#拨打sos号码\r
+                        return\r
+                    if self.sosKey_status == 1:#松开\r
+                        self.sosKey_count = 0\r
+                        self.sosKey_long_press = 0\r
+                        self.sosKey_press = 0\r
+                        self.sosKey_timer.stop()\r
+                        return\r
+\r
+                # EventMesh.debug_log("self.sosKey_count {}",self.sosKey_count)\r
+                if self.sosKey_status == 1:#松开\r
+                    if self.sosKey_count >= 1: #防抖100ms\r
+                        self.sosKey_timer.stop()\r
+                        self.sosKey_count = 0\r
+                        self.sosKey_press = 0\r
+                        self.sosKey_long_press = 0\r
+                        self.sosKey_press_count+=1\r
+                        self.sosKey_timer.start(500, 0, self.publish_sosKey_timeout_cb_do)#松手超时1s判断\r
+        def publish_sosKey_timeout_cb_do(self, *args, **kwargs):\r
+            EventMesh.publish("publish_message_event_btnInfo",{"func":self.sosKey_timeout_cb,"data":0})  \r
+        \r
+        def close_factory_test(self):#关闭老化测试\r
+            if self.factoryTest_flag == 1:\r
+                self.factoryTest_flag = 0\r
+                close_led_white()\r
+                close_led_red()\r
+                close_led_green()\r
+                self.factoryTest_led_count = 0\r
+                self.factoryTest_count = 0\r
+                self.aud.stopPlayStream()\r
+                self.factoryTest_timer.stop()\r
+\r
+        def factoryTest_timer_cb(self,e):\r
+            # self.factoryTest_count+=1\r
+            date_tmp = utime.localtime()\r
+            time_tmp = utime.mktime(date_tmp)\r
+\r
+            if time_tmp - self.factory_timesec > 60*60*2:#老化测试2小时自动退出\r
+                # self.factoryTest_count = 0\r
+                self.close_factory_test()\r
+                return\r
+            #播放音频 \r
+            str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_ALARM_NEW"))\r
+            if EventMesh.publish("get_audio_state") == 0:\r
+                self.aud.montage_play('U:/static/audio.bin',1,1,str_data)\r
+            #led灯常亮\r
+            self.factoryTest_led_count+=1\r
+            if self.factoryTest_led_count == 1:#1  4 7  10 \r
+                open_led_red()\r
+                close_led_green()\r
+                close_led_white()\r
+            elif self.factoryTest_led_count == 2:\r
+                open_led_green()\r
+                close_led_red()\r
+                close_led_white()\r
+            elif self.factoryTest_led_count == 3: #3  6 9 12 \r
+                open_led_white()\r
+                close_led_red()\r
+                close_led_green()\r
+            if self.factoryTest_led_count >= 3+1:\r
+                self.factoryTest_led_count = 0\r
+            \r
+            \r
+\r
+\r
+            pass\r
+        def sosKey_timeout_cb(self, data):#\r
+            open_power = EventMesh.publish("get_power_on_state")#获取开机标识\r
+            open_power_off = EventMesh.publish("get_power_off_state")#获取开机标识\r
+            if open_power != None and open_power_off != None:\r
+                if open_power == 0 or open_power_off == 1:\r
+                    self.sosKey_timer.stop()\r
+                    self.sosKey_count = 0\r
+                    self.sosKey_press = 0\r
+                    self.sosKey_long_press = 0\r
+                    self.sosKey_press_count = 0\r
+                    return\r
+            factory_count = EventMesh.publish("get_factory_test_time")\r
+            print("factory_count:%d",factory_count)\r
+            try :\r
+                if factory_count <= 30 :#开机30秒内按键次数大于15进入测试模式\r
+                    #EventMesh.debug_log("boot_count:{}".format(boot_count))\r
+                    if self.sosKey_press_count >= 15:\r
+                        self.factoryTest_timer.start(1000,1,self.factoryTest_timer_cb)\r
+                        date_tmp = utime.localtime()\r
+                        time_tmp = utime.mktime(date_tmp)\r
+                        self.factory_timesec = time_tmp\r
+                        self.sosKey_press_count = 0\r
+                        self.factoryTest_led_count = 0\r
+                        self.factoryTest_flag = 1\r
+                        return\r
+\r
+            except Exception as e:\r
+                usys.print_exception(e)\r
+\r
+            # EventMesh.debug_log("sosKey_press_count!!!!!!!!!!!!!! ",self.sosKey_press_count)\r
+            flag = EventMesh.publish("get_call_state")#在通话或者电话拨进 或者拨出不允许寻找设备\r
+            fall_down = EventMesh.publish("get_fall_down_state")#跌倒报警标识\r
+            if self.sosKey_press_count > 1:#短按十次解绑app\r
+                if fall_down != None:\r
+                    if fall_down != 0 or flag == 2:\r
+                        self.sosKey_press_count = 0\r
+                        return\r
+            if self.sosKey_press_count == 10:#\r
+                self.sosKey_press_count = 0\r
+                pass\r
+            elif self.sosKey_press_count == 6:#\r
+                self.sosKey_press_count = 0\r
+                self.close_factory_test()\r
+                pass\r
+            elif self.sosKey_press_count == 5:#功能暂时屏蔽\r
+                self.sosKey_press_count = 0\r
+                call_state = EventMesh.publish("get_call_state")\r
+                battery = EventMesh.publish("screen_get_battery")\r
+                if call_state == None:\r
+                    call_state = 0\r
+                if call_state == 0: \r
+                    if battery != None:\r
+                        if battery[0] != "1":#在充电得时候\r
+                            EventMesh.publish("stop_led_timer")#设置参数\r
+                            EventMesh.publish("set_manual_measure_mode",3)#测量体温\r
+                pass\r
+            elif self.sosKey_press_count == 4:#拨打app快捷号码\r
+                self.sosKey_press_count = 0\r
+                EventMesh.publish("stop_led_timer")#设置参数\r
+                EventMesh.publish("play_center_phone")#拨打快捷号码\r
+                # EventMesh.publish("call_phonebook_num",3)\r
+                pass\r
+            elif self.sosKey_press_count == 3:#测试心率\r
+                self.sosKey_press_count = 0\r
+                \r
+                call_state = EventMesh.publish("get_call_state")\r
+                battery = EventMesh.publish("screen_get_battery")\r
+                if call_state == None:\r
+                    call_state = 0\r
+                if call_state == 0: \r
+                    if battery != None:\r
+                        if battery[0] != "1":#在充电得时候\r
+                            EventMesh.publish("stop_led_timer")#设置参数\r
+                            EventMesh.publish("set_manual_measure_mode",1)#\r
+                pass\r
+            elif self.sosKey_press_count == 2:#播报当前步数\r
+                self.sosKey_press_count = 0\r
+                EventMesh.publish("stop_led_timer")#设置参数\r
+                EventMesh.publish("play_cur_step_event")#\r
+                pass\r
+            elif self.sosKey_press_count == 1:#挂断来电 短语音播报\r
+                self.sosKey_press_count = 0\r
+                EventMesh.publish("stop_led_timer")#设置参数\r
+                EventMesh.publish("sos_short_press")#sos短按事件\r
+                \r
+                pass\r
+            self.sosKey_press_count = 0\r
+\r
+\r
+        def wechatKey_extint_cb(self,args):\r
+            open_power = EventMesh.publish("get_power_on_state")#获取开机标识\r
+            open_power_off = EventMesh.publish("get_power_off_state")#获取开机标识\r
+            if open_power != None and open_power_off != None:\r
+                if open_power == 0 or open_power_off == 1:\r
+                    return\r
+            fall_down = EventMesh.publish("get_fall_down_state")#跌倒报警标识\r
+            if fall_down != None:\r
+                if fall_down != 0:\r
+                    return\r
+            # self.WeChatKey_status = self.wechatKey.read_level()\r
+            self.WeChatKey_status = int(args[1])\r
+            if self.WeChatKey_status == 0:\r
+                self.WeChatKey_status = 1\r
+            else:\r
+                self.WeChatKey_status = 0\r
+                pass\r
+            \r
+            # EventMesh.debug_log('### wechatKey_extint_cb  {} {} self.WeChatKey_status:{} {} {}'.format(wechat_state,args,self.sosKey_status,self.GPIO26_status,self.WeChatKey_status)) # args[0]:gpio号 args[1]:上升沿或下降沿\r
+            if self.sosKey_status != 0 and self.GPIO26_status != 0:\r
+                if self.WeChatKey_status == 0:#按下\r
+                    if self.wechatKey_press == 0:\r
+                        # self.pwKey_timeout_cb(0)\r
+                        # self.sosKey_timeout_cb(0)\r
+                        self.wechatKey_timer.stop()\r
+                        self.pwkey_timer.stop()\r
+                        self.sosKey_timer.stop()\r
+                        self.sosKey_press_count = 0\r
+                        self.sosKey_long_press = 0\r
+                        self.pwKey_press_count = 0\r
+                        self.sosKey_press = 0\r
+                        self.pwkey_press = 0\r
+                        self.wechatKey_press = 1\r
+                        self.led_state = 0\r
+                        self.wechatKey_count = 0\r
+                        self.wechat_state = 0\r
+                        self.wechatKey_timer.start(100, 1, self.publish_wechat_btn_event_cb)\r
+                else:\r
+                    # EventMesh.debug_log('### wechatKey_extint_cb end')\r
+                    EventMesh.publish("close_wechat_btn_timer")\r
+\r
+\r
+        def close_wechat_btn_timer(self,event,*argc):\r
+            tmp = EventMesh.publish("get_wechat_time")#获取微聊时间戳\r
+            wechat_time = 0\r
+            time_tmp = 0\r
+            time_sec = 0\r
+\r
+            if tmp != None:\r
+                if tmp[0] == 1:\r
+                    self.wechatKey_timer.stop()\r
+                    self.wechatKey_count = 0\r
+                    self.wechatKey_press = 0\r
+                    self.wechat_state = 0\r
+                    self.wechatKey_press_count=0\r
+                    \r
+                    date_tmp = utime.localtime()\r
+                    time_tmp = utime.mktime(date_tmp)\r
+                    time_sec = tmp[1]\r
+                    wechat_time = time_tmp - time_sec\r
+                    # EventMesh.debug_log("close_btn_timer",time_tmp,time_sec,wechat_time)\r
+                    if wechat_time >= 15:\r
+                        wechat_time = 15\r
+                    if wechat_time <= 0:\r
+                        wechat_time = 0\r
+                    EventMesh.publish("send_wechat_record",wechat_time)#发送录音文件内容\r
+        \r
+\r
+        def wechatKey_press_cb(self,data):\r
+            open_power = EventMesh.publish("get_power_on_state")#获取开机标识\r
+            open_power_off = EventMesh.publish("get_power_off_state")#获取开机标识\r
+            if open_power != None and open_power_off != None:\r
+                if open_power == 0 or open_power_off == 1:\r
+                    self.wechatKey_timer.stop()\r
+                    self.wechatKey_count = 0\r
+                    self.wechatKey_press = 0\r
+                    self.wechat_state = 0\r
+                    self.wechatKey_press_count=0\r
+                    return\r
+            self.WeChatKey_status = self.wechatKey.read_level()\r
+            # print("100ms self.WeChatKey_status",self.WeChatKey_status)\r
+            wechat_time = 0\r
+            tmp = None\r
+            time_sec = 0\r
+            time_tmp = 0\r
+            date_tmp = utime.localtime()\r
+            time_tmp = utime.mktime(date_tmp)\r
+            '''KEY2:联动屏幕右下角或返回键长按关机'''\r
+            if self.wechatKey_press == 1 :#是否按下\r
+                tmp = EventMesh.publish("get_wechat_time")#获取微聊时间戳\r
+                self.wechatKey_count += 1\r
+                if self.wechatKey_count >= 15: #长按1s进入微聊录音\r
+                    flag = EventMesh.publish("get_call_state") \r
+                    fall_down = EventMesh.publish("get_fall_down_state")#跌倒报警标识\r
+                    if flag != None:\r
+                        if flag == 0 and fall_down == 0:\r
+                            if self.WeChatKey_status == 0:\r
+                                if EventMesh.publish(constants.EVENT.GET_CONNECT) == 1:#未联网不需要录音\r
+                                    if self.wechat_state == 0:#按下超过s开始录音\r
+                                        EventMesh.publish("start_wechat_record")#开始录音\r
+                                        self.wechat_state = 1\r
+                                else:\r
+                                    self.wechat_state = 0\r
+                                    self.wechatKey_timer.stop()\r
+                                    self.wechatKey_count = 0\r
+                                    self.wechatKey_press = 0\r
+                                    self.wechatKey_press_count=0\r
+                                    EventMesh.publish("set_sim_mode")#播報imei号\r
+                                    return\r
+\r
+                            if self.WeChatKey_status == 0:#未松手超过15s啧停止录音\r
+                                if self.wechat_state == 1:\r
+                                    if tmp != None:\r
+                                        if tmp[0] != 0:\r
+                                            time_sec = tmp[1]\r
+                                            if time_tmp - time_sec >= 15:\r
+                                                wechat_time = time_tmp - time_sec\r
+                                                if wechat_time >= 15:\r
+                                                    wechat_time = 15\r
+                                                EventMesh.publish("send_wechat_record",wechat_time)#发送录音文件内容\r
+                                                \r
+                                                self.wechatKey_timer.stop()\r
+                                                self.wechatKey_count = 0\r
+                                                self.wechatKey_press = 0\r
+                                                self.wechat_state = 0\r
+                                                self.wechatKey_press_count=0\r
+                                                return\r
+                            else:\r
+                                if self.WeChatKey_status == 1:\r
+                                    if self.wechat_state == 1:#如果按下时长超过1s且小于长按的时间也认为是录微聊\r
+                                        if tmp != None:\r
+                                            if tmp[0] != 0:\r
+                                                time_sec = tmp[1]\r
+                                                wechat_time = time_tmp - time_sec\r
+                                            # EventMesh.debug_log("WECHAT TIEM",time_tmp,time_sec,wechat_time)\r
+                                            if wechat_time >= 15:\r
+                                                wechat_time = 15\r
+                                        \r
+                                        EventMesh.publish("send_wechat_record",wechat_time)#发送录音文件内容\r
+                                        self.wechatKey_timer.stop()\r
+\r
+                                        self.wechatKey_count = 0\r
+                                        self.wechatKey_press = 0\r
+                                        self.wechat_state = 0\r
+                                        self.wechatKey_press_count=0\r
+                                        return\r
+                        else:\r
+                            self.wechatKey_timer.stop()\r
+                            self.wechatKey_count = 0\r
+                            self.wechat_state = 0\r
+                            self.wechatKey_press = 0\r
+                            self.wechatKey_press_count=0\r
+                            return\r
+                if self.WeChatKey_status == 1:#松开\r
+                    if self.wechatKey_count >= 1: #防抖100ms\r
+                        # EventMesh.debug_log("WeChat time!!!!!!!!!!!!!!")\r
+                        self.wechatKey_timer.stop()\r
+                        self.wechatKey_count = 0\r
+                        self.wechatKey_press = 0\r
+                        self.wechat_state = 0\r
+                        self.wechatKey_press_count+=1\r
+                        self.wechatKey_timer.start(500, 0, self.publish_wechatKey_btn_event_cb)#松手超时1s判断\r
+\r
+        def publish_wechatKey_btn_event_cb(self, *args, **kwargs):\r
+            EventMesh.publish("publish_message_event_btnInfo",{"func":self.wechatKey_timeout_cb,"data":0})  \r
+\r
+        def wechatKey_timeout_cb(self,data):#微聊键\r
+            open_power = EventMesh.publish("get_power_on_state")#获取开机标识\r
+            open_power_off = EventMesh.publish("get_power_off_state")#获取开机标识\r
+            if open_power != None and open_power_off != None:\r
+                if open_power == 0 or open_power_off == 1:\r
+                    self.wechatKey_timer.stop()\r
+                    self.wechatKey_count = 0\r
+                    self.wechatKey_press = 0\r
+                    self.wechat_state = 0\r
+                    self.wechatKey_press_count=0\r
+                    return\r
+            flag = EventMesh.publish("get_call_state")#在通话或者电话拨进 或者拨出不允许寻找设备\r
+            fall_down = EventMesh.publish("get_fall_down_state")#跌倒报警标识\r
+            if self.wechatKey_press_count > 1:#\r
+                if fall_down != None:\r
+                    if fall_down != 0 or flag == 2:\r
+                        self.wechatKey_press_count = 0\r
+                        return\r
+            # EventMesh.debug_log("wechatKey_timeout_cb!!!!!!!!!!!!!! ",self.wechatKey_press_count)\r
+            if self.wechatKey_press_count == 10:#短按十次解绑app\r
+                self.wechatKey_press_count = 0\r
+                EventMesh.publish("stop_led_timer")#设置参数\r
+                EventMesh.publish("open_power_on", 4)#恢复出厂\r
+                pass\r
+            elif self.wechatKey_press_count == 6:#短按六次播报imei号\r
+                self.wechatKey_press_count = 0\r
+                EventMesh.publish("stop_led_timer")#设置参数\r
+                EventMesh.publish("play_imei_event")#播報imei号\r
+                pass\r
+            elif self.wechatKey_press_count == 4:#拨打通讯录号码三\r
+                self.wechatKey_press_count = 0\r
+                EventMesh.publish("stop_led_timer")#设置参数\r
+                EventMesh.publish("call_phonebook_num",3)\r
+                pass\r
+            elif self.wechatKey_press_count == 3:#拨打通讯录号码二\r
+                self.wechatKey_press_count = 0\r
+                EventMesh.publish("stop_led_timer")#设置参数\r
+                EventMesh.publish("call_phonebook_num",2)\r
+                pass\r
+            elif self.wechatKey_press_count == 2:#拨打通讯录号码一\r
+                EventMesh.publish("stop_led_timer")#设置参数\r
+                self.wechatKey_press_count = 0\r
+                EventMesh.publish("call_phonebook_num",1)\r
+            # EventMesh.publish("interup_call_event")#\r
+                pass\r
+            elif self.wechatKey_press_count == 1:#播放最后收到的语音\r
+                self.wechatKey_press_count = 0\r
+                EventMesh.publish("stop_led_timer")#设置参数\r
+                call_state = EventMesh.publish("get_call_state") \r
+                if call_state == 0:\r
+                    fall_down = EventMesh.publish("get_fall_down_state")#跌倒报警标识\r
+                    if fall_down != None:\r
+                        if fall_down != 0:\r
+                            EventMesh.publish_async("dial_sos_phone")#拨打sos号码\r
+                            return\r
+                else:\r
+                    if call_state == 2:#电话拨进需要接听\r
+                        EventMesh.publish("answer_call_event")#接听电话\r
+                        return\r
+                EventMesh.publish("play_wechat_last_amr")\r
+                # pass\r
+            self.wechatKey_press_count = 0\r
+\r
+\r
+        def pwk_press_cb(self, *args):\r
+            '''KEY2:联动屏幕右下角或返回键长按关机'''\r
+            if self.pwk_press == 1 :\r
+                \r
+                self.pwk_count += 1\r
+                EventMesh.debug_log("self.pwk_count {}",self.pwk_count)\r
+                if self.GPIO26_status == 1:#松开\r
+                    if self.pwk_count >= 1: #防抖100ms\r
+                        self.__pwk_timer.stop()\r
+                        self.pwk_count = 0\r
+                        self.pwk_press = 0\r
+                        EventMesh.debug_log("self.GPIO22_status")\r
+\r
+                if self.pwk_count > (self.__PowerDownTimeOut//100): #长按\r
+                    self.__pwk_timer.stop()\r
+                    self.pwk_count = 0\r
+                    self.pwk_press = 0\r
+                    EventMesh.debug_log("btn8_long_press")\r
+\r
+        def __ui_callback(self, para):\r
+        # EventMesh.debug_log("para = {}".format(para))\r
+            if para == 0:\r
+                EventMesh.publish("done_left_to_right")\r
+                #EventMesh.debug_log("<-")\r
+            elif para == 1:\r
+                EventMesh.publish("done_right_to_left")\r
+                #EventMesh.debug_log("->")\r
+            elif para == 2:\r
+                EventMesh.publish("done_bottom_to_top")\r
+                #EventMesh.debug_log("^")\r
+            elif para == 3:\r
+                EventMesh.publish("done_top_to_bottom")\r
+                #EventMesh.debug_log("V")\r
+            elif para == 4:\r
+                EventMesh.publish("done_return")\r
+                #EventMesh.debug_log("return")\r
+            elif para == 5:\r
+                EventMesh.publish("done_click")\r
+                #EventMesh.debug_log("CLICK")\r
+            elif para == 6:\r
+                EventMesh.publish("done_press")\r
+                #EventMesh.debug_log("press")\r
+            elif (para == 6):\r
+                EventMesh.publish("done_error")\r
+                #EventMesh.debug_log("error")\r
+\r
+        def key_callback(self, l_list):\r
+            EventMesh.debug_log("key_callback:",str(l_list))\r
+            if l_list[0] == 1:\r
+                # 马达震动预留\r
+                pass\r
+            if (l_list[1] == 3) and (l_list[2] == 0):\r
+                if l_list[0] == 1:\r
+                    #self.pwk_press = 0\r
+                    EventMesh.publish("btn1_press")\r
+                else:\r
+                    pass\r
+                    # EventMesh.publish("btn1_press")\r
+\r
+\r
+\r
+\r
+        def powerKey_callback(self, status):\r
+            EventMesh.debug_log('==pwr:', status)# 0 1 0\r
+            self.powerKey_status = status\r
+            if self.pwk_press == 1: #按按钮时不处理\r
+                return\r
+        \r
+            \r
+                \r
+\r
+        def power_key_press_cb(self, *args):\r
+            pass\r
+            # if EventMesh.publish(constants.EVENT.GET_CONNECT) == 0:#未插卡的情况下强制关机\r
+                # EventMesh.publish("open_power_on", 2)#\r
+\r
+\r
+        def start(self):\r
+            self.post_processor_after_instantiation()\r
index 3f31f1c..1889d47 100644 (file)
-from common import Abstract
-import machine
-import osTimer
-from misc import PowerKey
-import EventMesh
-from machine import Pin
-from machine import ExtInt
-import constants
-import utime
-import audio
-import ql_fs
-import ujson
-import voiceCall
-from misc import Power
-
-from machine import RTC
-from queue import Queue
-import _thread
-import usys
-import sms
-
-NEW_ENABLE = 0 #1代表旧的按键功能定义 0代表新的按键功能定义
-if EventMesh.model == "D15" :
-    from led_d15 import red_green_light,green_light_fast,led_mode,open_led_red,open_led_white,close_led_red,open_led_green,close_led_green,close_led_white
-
-    motor_pin = Pin(Pin.GPIO20, Pin.OUT, Pin.PULL_PD, 0)
-
-    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']
-
-
-    class call:
-        CALL_OUT = 1
-        CALL_IN = 2
-        ON_CALL = 3
-
-
-    class intervManager(Abstract):
-        def __init__(self):
-            self.timer = osTimer()
-
-            self.pwk_timer1 = osTimer()
-            self.pwk_timer2 = osTimer()
-            self.timer1 = osTimer()
-            self.sos_timer2 = osTimer()
-            self.sos_timer1 = osTimer()
-
-            self.sos_sendtime = osTimer()
-
-            self.fall_timer1 = osTimer()
-            self.fall_timer2 = osTimer()
-
-            self.alarm_timer1 = osTimer()
-
-            self.find_timer1 = osTimer()
-            self.fall_flag = 0
-
-            self.factory_timer = osTimer()
-            
-            self.restart_timer = osTimer()
-
-            self.aud = audio.Audio(0)
-            self.aud.set_pa(Pin.GPIO29)
-            self.aud.setVolume(11)
-            self.play_count = 0
-            self.count = 0
-
-            self.get_hr_state  = 0
-            self.get_spo2_state = 0
-            self.timeSec = 0
-            self.timeTempSec = 0
-
-            self.hr_value = 0
-            self.spo2_value = 0
-            self.temp_value = 0
-
-            self.usbState = 0
-
-            self.setp_old = 0
-            self.step_tmp = ""
-            self.step_num = 0
-            self.power_off = 0
-            self.call_state = 0
-
-            self.find_state = 0
-            self.FIND_timer_count = 0
-
-            self.old_hour = 0
-            self.alarm_state = 0
-            self.alarm_timer_count = 0
-            self.old_min = 0
-            self.interInfo_queue = Queue()
-            _thread.stack_size(10*1024+64)
-            _thread.start_new_thread(self.interInfo_queue_thread, ())
-            _thread.stack_size(8*1024)
-            EventMesh.subscribe("publish_message_event_interInfo",self.publish_message_event_interInfo)
-            
-
-            self.audio_event_queue = Queue()
-            _thread.stack_size(10*1024+128)
-            _thread.start_new_thread(self.audio_event_queue_thread, ())
-            _thread.stack_size(8*1024)
-            EventMesh.subscribe("publish_message_event_audio",self.publish_message_event_audio)
-
-            self.record_test = audio.Record()
-            self.record_test.gain_set(4,12)
-
-            self.timeSecond = 0
-            self.wechat_show = 0
-            self.sort_new = {}
-            self.time_min = 0
-            self.press_btn = 0
-            self.countdown_old = 0
-            self.set_unread_wechat = 0
-            self.updateTime = 0
-            
-            self.power_on_flag = 0
-
-            self.MXA_MSG = 1
-            self.wechat_recode_list = {"num":0}
-            self.wechat_num = 0
-            self.read_data = {}
-            self.volum_size = 8 
-            self.phone_num = ''
-            self.sos_phone_num = ''
-            self.msg_tmp = ""
-            self.time_count = 0
-            self.alarm_count = 0
-            self.audio_int = 0
-
-            self.hr_auto = 0
-
-            self.temp_auto = 0
-
-            self.video_count = 0
-
-            self.sos_state = 0
-
-            self.video_call_state = 0#视频通话拨进来还是拨出去的状态 1代表是正在拨进或者拨出去
-
-            self.video_call_in_mode = 0 #0是语音 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:#音频文件编号
-                    self.wechat_recode_list = ujson.load(fd)
-                    if not self.wechat_recode_list:
-                        self.wechat_recode_list = {"num":0}
-                        self.wechat_num = 0
-            else:
-                self.wechat_recode_list = {"num":0}
-                with open("/usr/static/storage_file/wechat_record.json","w+",encoding="utf-8") as fd:
-                    ujson.dump(self.wechat_recode_list,fd)         
-
-
-        def post_processor_after_instantiation(self):
-            EventMesh.subscribe("open_power_on", self.open_power_on)#开机关机
-
-            EventMesh.subscribe("play_imei_event", self.play_imei_event)#播報imei号
-            EventMesh.subscribe("play_center_phone", self.play_center_phone)#拨打快捷号码
-            EventMesh.subscribe("play_cur_time_event", self.play_cur_time_event)#播放当前时间
-
-            EventMesh.subscribe("OPEN_FIND_WATCH", self.send_find_watch)#查找设备
-            EventMesh.subscribe("STOP_FIND_WATCH", self.stop_find_watch)#是否需要关闭查找设备
-            EventMesh.subscribe("close_timer_all", self.close_timer_all)#关闭相关定时器
-
-            EventMesh.subscribe("dial_sos_phone", self.dial_sos_phone)#长按3s拨打sos求助号码
-
-            EventMesh.subscribe("set_sim_mode", self.set_sim_mode)#sim检测
-
-            EventMesh.subscribe("close_hr_sop2", self.close_hr_sop2)#关闭健康测试
-            EventMesh.subscribe("set_manual_measure_mode", self.set_manual_measure_mode)#设置测试模式
-            EventMesh.subscribe("set_start_measure_time", self.set_start_measure_time)#设置开始测量的时间戳时间
-            EventMesh.subscribe("get_start_measure_time", self.get_start_measure_time)#获取开始测量的时间戳时间
-            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_temp_value", self.play_temp_value)#播放体温数值
-
-            EventMesh.subscribe("play_sugar_value", self.play_sugar_value)#播放血糖数值
-
-            EventMesh.subscribe("play_battery_level_value", self.play_battery_level_value)
-
-
-            EventMesh.subscribe("set_usb", self.set_usb)#
-            EventMesh.subscribe("get_usb", self.get_usb)#
-
-            EventMesh.subscribe("play_cur_step_event", self.play_cur_step_event)#
-
-            EventMesh.subscribe("set_call_state", self.set_call_state)#1是 拨出去呼叫中 2是播进来 3 是正在通话中 0是无效
-            EventMesh.subscribe("get_call_state", self.get_call_state)#
-            EventMesh.subscribe("interup_call_event", self.interup_call_event)#
-            EventMesh.subscribe("answer_call_event", self.answer_call_event)#接听电话
-            EventMesh.subscribe("dialin_call_event", self.dialin_call_event)#电话拨进响铃
-            EventMesh.subscribe("dialing_out_event", self.dialing_out_event)#电话呼叫中
-            EventMesh.subscribe("call_test_event", self.call_test_event)#电话拨进响铃测试
-
-            EventMesh.subscribe("dial_out_call_center_cb", self.dial_out_call_center_cb)#电话拨出去
-            EventMesh.subscribe("sos_out_call_center_cb", self.sos_out_call_center_cb)#sos拨打
-
-            EventMesh.subscribe("close_audio_play", self.close_audio_play)#关闭音频
-
-            #视频通话
-            EventMesh.subscribe("video_call_in_event", self.video_call_in_event)#视频通话拨进中
-            EventMesh.subscribe("video_call_out_cb", self.video_call_out_cb)#视频通话拨进中
-            EventMesh.subscribe("video_waite_timer_cb", self.video_waite_timer_cb)#对方正在接听中
-
-            EventMesh.subscribe("video_answer_timer_cb", self.video_answer_timer_cb)#对方已接听
-            EventMesh.subscribe("video_answer_mode_timer_cb", self.video_answer_mode_timer_cb)#对方已接听
-
-            EventMesh.subscribe("dev_video_end_timer_cb", self.dev_video_end_timer_cb)#对方未接通挂断了
-
-            
-
-            EventMesh.subscribe("get_video_in_out_state", self.get_video_in_out_state)#获取拨进还是拨出的状态
-            EventMesh.subscribe("set_video_in_out_state", self.set_video_in_out_state)#清除标识
-            
-            
-            
-
-            EventMesh.subscribe("start_wechat_record", self.start_wechat_record)#手表开始录音
-            EventMesh.subscribe("send_wechat_record", self.send_wechat_record)#发送微聊语音文件to app
-            EventMesh.subscribe("play_wechat_last_amr", self.play_wechat_last_amr)#播放微聊语音最后一条语音文件
-            EventMesh.subscribe("get_wechat_data", self.get_wechat_data)
-            EventMesh.subscribe("set_wechat_data", self.set_wechat_data)
-            EventMesh.subscribe("play_unread_wechat_infor", self.play_unread_wechat_infor)#按键播放最近一条微聊语音
-            EventMesh.subscribe("set_unread_wechat_state", self.set_unread_wechat_state)#设置未读标识
-            EventMesh.subscribe("get_unread_wechat_state", self.get_unread_wechat_state)#获取未读标志
-            EventMesh.subscribe("get_wechat_time", self.get_wechat_time)#获取微聊时间戳
-            EventMesh.subscribe("get_wechat_state", self.get_wechat_state)#获取微聊时间戳
-
-
-            EventMesh.subscribe("get_power_on_state", self.get_power_on_state)#获取开机标识
-            EventMesh.subscribe("get_power_off_state", self.get_power_off_state)#获取关机标识
-
-            EventMesh.subscribe("play_audio_file", self.play_audio_file)#获取播放音频文件
-
-            EventMesh.subscribe("OPEN_ALARM_RING", self.send_alarm_ring)#闹钟到点响铃
-            EventMesh.subscribe("STOP_ALARM_RING", self.stop_alarm_ring)#是否需要关闭闹钟
-
-            EventMesh.subscribe("recv_wechat_audio", self.recv_wechat_audio)#
-
-
-            EventMesh.subscribe("sos_short_press", self.sos_short_press)#sos短按事件
-
-            EventMesh.subscribe("falldown_alarm_event", self.falldown_alarm_event)#跌倒报警
-
-            EventMesh.subscribe("close_falldown_alarm_event", self.close_falldown_alarm_event)#关闭跌倒报警
-
-            EventMesh.subscribe("drink_alarm_event", self.drink_alarm_event)#该喝水了
-
-            EventMesh.subscribe("medicine_alarm_event", self.medicine_alarm_event)#该吃药了
-
-            EventMesh.subscribe("wakeup_alarm_event", self.wakeup_alarm_event)#该起床了
-
-            EventMesh.subscribe("home_alarm_event", self.home_alarm_event)#该回家了
-
-            EventMesh.subscribe("sleep_alarm_event", self.sleep_alarm_event)#该睡觉了
-
-            EventMesh.subscribe("reset_alarm_event", self.reset_alarm_event)#该休息了
-
-            EventMesh.subscribe("reset_end_alarm_event", self.reset_end_alarm_event)#休息结束了
-
-            EventMesh.subscribe("get_fall_down_state", self.get_fall_down_state)#跌倒报警标识
-
-            EventMesh.subscribe("app_factory", self.app_factory)#app恢复出厂
-
-            EventMesh.subscribe("app_restart", self.app_restart)#远程重启
-
-            EventMesh.subscribe("get_sos_state_out", self.get_sos_state_out)#正在拨打sos电话
-
-            EventMesh.subscribe("set_sos_state_out", self.set_sos_state_out)#清除在拨打sos电话
-
-        def interInfo_queue_thread(self):
-            while True:
-                data = self.interInfo_queue.get()
-                #EventMesh.debug_log("interInfo_queue_thread:data = {}".format(data))
-                if data != None:
-                    try:
-                        data["func"](data["data"])
-                    except Exception as e:
-                        EventMesh.debug_log("interInfo_queue_thread:ERROR:{}".format(e))
-                        usys.print_exception(e)
-
-        def publish_message_event_interInfo(self,event,msg):
-            self.interInfo_queue.put(msg)
-
-        def publish_call_event_cb(self, *args, **kwargs):#拨打电话
-            EventMesh.publish("publish_message_event_interInfo",{"func":self.call_timer_cb,"data":0})
-
-        def publish_video_in_event_cb(self, *args, **kwargs):#视频通话拨入
-            EventMesh.publish("publish_message_event_interInfo",{"func":self.video_in_timer_cb,"data":0})  
-
-        def publish_video_out_event_cb(self, *args, **kwargs):#拨打视频通话
-            EventMesh.publish("publish_message_event_interInfo",{"func":self.video_out_timer_cb,"data":0})  
-
-        def publish_resatrt_down_event_cb(self, *args, **kwargs):#重启设备
-            EventMesh.publish("publish_message_event_interInfo",{"func":self.powe_resatrt_down_fun,"data":0})  
-        
-        def publish_power_down_event_cb(self, *args, **kwargs):#关机
-            EventMesh.publish("publish_message_event_interInfo",{"func":self.power_down_fun,"data":0})  
-
-        def publish_find_watch_event_cb(self, *args, **kwargs):#查找设备
-            EventMesh.publish("publish_message_event_interInfo",{"func":self.FIND_timer_cb,"data":0})  
-
-        def publish_alarm_ring_event_cb(self, *args, **kwargs):#闹钟响铃
-            EventMesh.publish("publish_message_event_interInfo",{"func":self.Alarm_timer_cb,"data":0})  
-
-        def publish_reset_alarm_ring_event_cb(self, *args, **kwargs):#休息响铃
-            EventMesh.publish("publish_message_event_interInfo",{"func":self.reset_alarm_event_cb,"data":0})  
-        
-        def publish_reset_end_alarm_ring_event_cb(self, *args, **kwargs):#休息结束响铃
-            EventMesh.publish("publish_message_event_interInfo",{"func":self.reset_end_alarm_event_cb,"data":0})  
-        
-        def publish_sleep_alarm_ring_event_cb(self, *args, **kwargs):#睡觉响铃
-            EventMesh.publish("publish_message_event_interInfo",{"func":self.sleep_alarm_event_cb,"data":0})  
-        
-        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_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):#喝水响铃
-            EventMesh.publish("publish_message_event_interInfo",{"func":self.drink_alarm_event_cb,"data":0})  
-
-        def publish_fall_done_ring_event_cb(self, *args, **kwargs):#跌倒提醒
-            EventMesh.publish("publish_message_event_interInfo",{"func":self.falldown_alarm_cb,"data":0})  
-
-
-        def reset_alarm_event(self,args,msg):#该休息了
-            wechat_state = EventMesh.publish("get_wechat_state")
-            video_state = EventMesh.publish("get_video_state")
-            if self.call_state == 0 and wechat_state == 0 and self.fall_flag == 0 and video_state == 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])#获取播放音频文件
-        def reset_alarm_event_cb(self,args):#该休息了
-            wechat_state = EventMesh.publish("get_wechat_state")
-            video_state = EventMesh.publish("get_video_state")
-            if self.call_state == 0 and wechat_state == 0 and self.fall_flag == 0 and video_state == 0:
-                self.alarm_count += 1
-                if self.alarm_count >= 3:
-                    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])#获取播放音频文件
-            else:
-                self.alarm_count = 0
-                self.alarm_timer1.stop()
-
-        def reset_end_alarm_event(self,args,msg):#休息结束了
-            wechat_state = EventMesh.publish("get_wechat_state")
-            video_state = EventMesh.publish("get_video_state")
-            if self.call_state == 0 and wechat_state == 0 and self.fall_flag == 0 and video_state == 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])#获取播放音频文件
-        
-        def reset_end_alarm_event_cb(self,args):#休息结束了
-            wechat_state = EventMesh.publish("get_wechat_state")
-            video_state = EventMesh.publish("get_video_state")
-            if self.call_state == 0 and wechat_state == 0 and self.fall_flag == 0 and video_state == 0:
-                self.alarm_count += 1
-                if self.alarm_count >= 3:
-                    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])#获取播放音频文件
-            else:
-                self.alarm_count = 0
-                self.alarm_timer1.stop()
-        
-        def sleep_alarm_event(self,args,msg):#该睡觉了
-            wechat_state = EventMesh.publish("get_wechat_state")
-            video_state = EventMesh.publish("get_video_state")
-            if self.call_state == 0 and wechat_state == 0 and self.fall_flag == 0 and video_state == 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])#获取播放音频文件
-        def sleep_alarm_event_cb(self,args):#该睡觉了
-            wechat_state = EventMesh.publish("get_wechat_state")
-            video_state = EventMesh.publish("get_video_state")
-            if self.call_state == 0 and wechat_state == 0 and self.fall_flag == 0 and video_state == 0:
-                self.alarm_count += 1
-                if self.alarm_count >= 3:
-                    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])#获取播放音频文件
-            else:
-                self.alarm_count = 0
-                self.alarm_timer1.stop()
-
-
-        def home_alarm_event(self,args,msg):#该回家了
-            wechat_state = EventMesh.publish("get_wechat_state")
-            video_state = EventMesh.publish("get_video_state")
-            if self.call_state == 0 and wechat_state == 0 and self.fall_flag == 0 and video_state == 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])#获取播放音频文件
-        
-        def home_alarm_event_cb(self,args):#该回家了
-            wechat_state = EventMesh.publish("get_wechat_state")
-            video_state = EventMesh.publish("get_video_state")
-            if self.call_state == 0 and wechat_state == 0 and self.fall_flag == 0 and video_state == 0:
-                self.alarm_count += 1
-                if self.alarm_count >= 3:
-                    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])#获取播放音频文件
-            else:
-                self.alarm_count = 0
-                self.alarm_timer1.stop()
-        
-        def wakeup_alarm_event(self,args,msg):#该起床了
-            wechat_state = EventMesh.publish("get_wechat_state")
-            video_state = EventMesh.publish("get_video_state")
-            if self.call_state == 0 and wechat_state == 0 and self.fall_flag == 0 and video_state == 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])#获取播放音频文件
-        
-        def wakeup_alarm_event_cb(self,args):#该起床了
-            wechat_state = EventMesh.publish("get_wechat_state")
-            video_state = EventMesh.publish("get_video_state")
-            if self.call_state == 0 and wechat_state == 0 and self.fall_flag == 0 and video_state == 0:
-                self.alarm_count += 1
-                if self.alarm_count >= 3:
-                    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])#获取播放音频文件
-            else:
-                self.alarm_count = 0
-                self.alarm_timer1.stop()
-
-
-        def medicine_alarm_event(self,args,msg):#该吃药了
-            wechat_state = EventMesh.publish("get_wechat_state")
-            video_state = EventMesh.publish("get_video_state")
-            if self.call_state == 0 and wechat_state == 0 and self.fall_flag == 0 and video_state == 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])#获取播放音频文件
-
-        def medicine_alarm_event_cb(self,args):#该吃药了
-            wechat_state = EventMesh.publish("get_wechat_state")
-            video_state = EventMesh.publish("get_video_state")
-            if self.call_state == 0 and wechat_state == 0 and self.fall_flag == 0 and video_state == 0:
-                self.alarm_count += 1
-                if self.alarm_count >= 3:
-                    self.alarm_count = 0
-                    self.alarm_timer1.stop()
-                    return
-                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_MEDICINE_ALARM"))
-                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件
-            else:
-                self.alarm_count = 0
-                self.alarm_timer1.stop()
-
-        def drink_alarm_event(self,args,msg):#该喝水了
-            wechat_state = EventMesh.publish("get_wechat_state")
-            video_state = EventMesh.publish("get_video_state")
-            if self.call_state == 0 and wechat_state == 0 and self.fall_flag == 0 and video_state == 0:
-                self.alarm_count = 0
-                self.alarm_timer1.start(2000, 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])#获取播放音频文件
-            
-
-
-        def drink_alarm_event_cb(self,args):#该喝水了
-            wechat_state = EventMesh.publish("get_wechat_state")
-            video_state = EventMesh.publish("get_video_state")
-            if self.call_state == 0 and wechat_state == 0 and self.fall_flag == 0 and video_state == 0:
-                self.alarm_count += 1# 1 2 
-                if self.alarm_count >= 3:
-                    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])#获取播放音频文件
-            else:
-                self.alarm_count = 0
-                self.alarm_timer1.stop()
-            
-        def falldown_alarm_event(self,args,msg):#跌倒报警启动中提示
-            flag = EventMesh.publish("get_call_state")#在通话或者电话拨进 或者拨出不允许寻找设备
-            wechat_state = EventMesh.publish("get_wechat_state")
-            video_state = EventMesh.publish("get_video_state")
-            if flag == 0 and wechat_state == 0 and video_state == 0:
-                EventMesh.publish("close_timer_all")#
-                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_FALL_ALARM"))
-                self.time_count = 0
-                self.fall_flag = 0
-                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")
-            flag = EventMesh.publish("get_call_state")#在通话或者电话拨进 或者拨出不允许寻找设备
-            video_state = EventMesh.publish("get_video_state")
-            if flag == 0 and self.call_state == 0 and wechat_state == 0 and video_state == 0:
-                self.time_count+=1
-                if self.time_count >= 5:
-                    self.time_count = 0
-                    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()
-        
-        def close_falldown_alarm_event(self,event,msg):#跌倒挂断挂断
-            if self.fall_flag == 1:#跌倒标志
-                self.fall_flag = 0
-                self.fall_timer1.stop()
-                self.sos_timer1.stop()
-                self.sos_timer2.stop()
-                if self.call_state != 0:
-                    self.call_state = 0
-                    voiceCall.callEnd()
-                sos_flag = EventMesh.publish("get_sos_flag")
-                if sos_flag == 1:
-                    self.call_state = 0
-                    EventMesh.publish("set_sos_state_out")
-                    EventMesh.publish("set_sos_flag",0)
-                    EventMesh.publish("set_sos_num",0)
-                    EventMesh.publish("set_hangup_mode",0)
-
-        
-
-        def send_find_watch(self, event, msg): #发送查找设备指令
-            open_power = EventMesh.publish("get_power_on_state")#获取开机标识
-            if open_power != None:
-                if open_power == 0:
-                    return
-            power_off = EventMesh.publish("get_power_off_state")#获取开机标识
-            if power_off != None:
-                if power_off == 1:
-                    return
-            flag = EventMesh.publish("get_call_state")#在通话或者电话拨进 或者拨出不允许寻找设备
-            wechat_state = EventMesh.publish("get_wechat_state")
-            video_state = EventMesh.publish("get_video_state")
-            if flag == 0 and wechat_state == 0 and self.fall_flag == 0 and video_state == 0: 
-                EventMesh.publish("close_timer_all")#
-                self.find_state = 1
-                self.FIND_timer_count = 0
-                self.alarm_timer1.start(3000,1,self.publish_find_watch_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("audio_find_haixiu"))
-                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
-                EventMesh.publish("set_motor_time",[1,2,8*3,8,4])#设置马达参数
-
-        def stop_find_watch(self, event, msg): 
-            if self.find_state == 1:
-                self.find_state = 0
-                self.FIND_timer_count = 0
-                # EventMesh.publish("stop_led_timer")#设置参数
-                self.aud.stopPlayStream()  #播放声音 
-                self.alarm_timer1.stop()
-                EventMesh.publish("close_motor_infor")#关闭马达和定时器
-
-        def FIND_timer_cb(self, data):
-            flag = EventMesh.publish("get_call_state")#在通话或者电话拨进 或者拨出不允许寻找设备
-            wechat_state = EventMesh.publish("get_wechat_state")
-            video_state = EventMesh.publish("get_video_state")
-            if flag == 0 and wechat_state == 0 and self.fall_flag == 0 and video_state == 0:
-                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"))
-                    EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
-                    #EventMesh.publish("set_motor_time",[1,2,8*2,8,4])#设置马达参数
-                    self.FIND_timer_count += 1
-                    if self.FIND_timer_count > 10: #120秒30s
-                        EventMesh.publish("STOP_FIND_WATCH")
-            else:
-                self.FIND_timer_count = 0
-                self.alarm_timer1.stop()
-                
-        
-        def stop_FIND(self) :
-            self.alarm_timer1.stop()
-
-        def send_alarm_ring(self, event, msg): #发送查找设备指令
-            open_power = EventMesh.publish("get_power_on_state")#获取开机标识
-            if open_power != None:
-                if open_power == 0:
-                    return
-            power_off = EventMesh.publish("get_power_off_state")#获取开机标识
-            if power_off != None:
-                if power_off == 1:
-                    return
-            flag = EventMesh.publish("get_call_state")#在通话或者电话拨进 或者拨出不允许寻找设备
-            wechat_state = EventMesh.publish("get_wechat_state")
-            video_state = EventMesh.publish("get_video_state")
-            if flag == 0 and wechat_state == 0 and self.fall_flag == 0 and video_state == 0 :
-                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)
-                # 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("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
-        
-        def stop_alarm_ring(self, event, msg): #停止闹钟响铃
-            if self.alarm_state == 1:
-                self.alarm_state = 0
-                self.alarm_timer_count = 0
-                # EventMesh.publish("stop_led_timer")#设置参数
-                self.aud.stopPlayStream()  #停止播放
-                self.alarm_timer1.stop()
-
-        def Alarm_timer_cb(self, data):
-            flag = EventMesh.publish("get_call_state")#在通话或者电话拨进 或者拨出不允许寻找设备
-            wechat_state = EventMesh.publish("get_wechat_state")
-            video_state = EventMesh.publish("get_video_state")
-            if flag == 0 and wechat_state == 0 and self.fall_flag == 0 and video_state == 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.alarm_timer_count += 1
-                    if self.alarm_timer_count > 15: #120秒30s
-                        EventMesh.publish("STOP_ALARM_RING")
-            else:
-                self.alarm_timer_count = 0
-                self.alarm_timer1.stop()
-
-        def get_fall_down_state(self,event,msg):
-            return self.fall_flag
-
-        def sos_short_press(self,args,msg):
-            EventMesh.publish("interup_call_event")#如果在电话中强制挂断电话
-            EventMesh.publish("close_audio_play")#强制关闭音频文件播放
-            EventMesh.publish("STOP_FIND_WATCH")#停止查找设备
-            EventMesh.publish("STOP_ALARM_RING")#停止闹钟响铃
-            if NEW_ENABLE == 0:#新的按键功能定义
-                video_state = EventMesh.publish("get_video_state")
-                if video_state != 0:#视频通话打入或者接听后允许挂断视频通话
-                    EventMesh.publish("video_dev_reject_cb",2)#挂断视频通话
-                    return
-            EventMesh.publish("play_cur_time_event")#播报当前时间
-            #播报当前时间
-
-        def recv_wechat_audio(self,event,str_data):#接收微聊语音播放
-            wechat_state = EventMesh.publish("get_wechat_state")
-            video_state = EventMesh.publish("get_video_state")
-            if self.call_state == 0 and self.fall_flag == 0 and wechat_state == 0 and self.fall_flag == 0 and video_state == 0: 
-                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_WECHAT_RECV"))
-                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件
-                EventMesh.publish("set_motor_time",[1,2,10*3,10,5])#设置马达参数
-
-
-
-        def audio_event_queue_thread(self):
-            while True:
-                data = self.audio_event_queue.get()
-                #EventMesh.debug_log("audio_event_queue:data = {}".format(data))
-                if data != None:
-                    try:
-                        data["func"](data["data"])
-                    except Exception as e:
-                        EventMesh.debug_log("audio_event_queue:ERROR:{}".format(e))
-                        usys.print_exception(e)
-        def publish_message_event_audio(self,event,msg):
-            self.audio_event_queue.put(msg)
-
-        def play_audio_file(self, *args, **kwargs):#播放音频文件
-            # EventMesh.debug_log("args",args)
-            # EventMesh.publish("publish_message_event_audio",{"func":self.play_audio_file_do,"data":args[1]})  
-            data = args[1]
-            self.play_audio_file_do(data)
-
-        def play_audio_file_do(self,data):#msg 拼接的路径文件
-            open_power = EventMesh.publish("get_power_on_state")#获取开机标识
-            power_off = EventMesh.publish("get_power_off_state")#获取开机标识
-            # EventMesh.debug_log("play_audio_file",data[0],data[1],open_power,power_off)#路径 str_data[1] 是否需要被打断
-            if open_power != None:
-                if open_power == 0:
-                    return
-            if power_off != None:
-                if power_off == 1:
-                    return
-            self.aud.stopPlayStream()
-            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] 是否需要被打断
-            
-
-
-
-
-        def powe_resatrt_down_fun(self, *args):#重启设备
-            EventMesh.publish("close_led_pin")
-            self.aud.stopPlayStream()
-            Power.powerRestart()
-
-
-        def power_down_fun(self, *args):
-            EventMesh.publish("close_led_pin")
-            self.aud.stopPlayStream()
-            Power.powerDown()
-
-
-
-        def close_audio_play(self, event, msg): #msg
-            open_power = EventMesh.publish("get_power_on_state")#获取开机标识
-            power_off = EventMesh.publish("get_power_off_state")#获取开机标识
-            if open_power != None:
-                if open_power == 0:
-                    return
-            if power_off != None:
-                if power_off == 1:
-                    return
-            self.aud.stopPlayStream()
-
-
-
-        def close_timer_all(self, event, msg): 
-            # EventMesh.debug_log("close_timer_all!!!!!!!!!!!!!!!!!!!")
-            open_power = EventMesh.publish("get_power_on_state")#获取开机标识
-            power_off = EventMesh.publish("get_power_off_state")#获取开机标识
-            if open_power != None:
-                if open_power == 0:
-                    return
-            if power_off != None:
-                if power_off == 1:
-                    return
-                
-            self.aud.stopPlayStream()
-            self.timer.stop()
-            self.sos_timer2.stop()
-            self.sos_timer1.stop()
-            self.fall_flag = 0
-            self.fall_timer1.stop()
-            self.alarm_timer1.stop()
-        
-
-        def answer_call_event(self, event, msg): #
-            if self.call_state == 2:
-                sos_flag = EventMesh.publish("get_sos_flag")
-                if sos_flag == 1:
-                    self.call_state = 0
-                    EventMesh.publish("set_sos_state_out")
-                    EventMesh.publish("set_sos_flag",0)
-                    EventMesh.publish("set_sos_num",0)
-                    EventMesh.publish("set_hangup_mode",0)
-                EventMesh.publish("close_timer_all")#
-                voiceCall.callAnswer()
-
-        def set_call_state(self, event, msg): #
-            self.call_state = msg
-
-
-        def video_call_in_event(self, event, msg):#视频通话拨入
-            open_power = EventMesh.publish("get_power_on_state")#获取开机标识
-            power_off = EventMesh.publish("get_power_off_state")#获取关机标识
-            if open_power != None and power_off != None:
-                if open_power == 0 or power_off == 1:
-                    return
-            EventMesh.publish("close_timer_all")#
-            EventMesh.publish("close_wechat_btn_timer")#
-            EventMesh.publish("set_led_time_arg",[1,2,10*2,led_mode.FLASH_LIGHT_RED,10,5,led_mode.VIDEO_MEASURE_MODE])#測量成功
-            self.video_call_state = 1
-            self.video_count=0
-            self.video_call_in_mode = msg
-            EventMesh.publish("clear_video_timer_state")
-            EventMesh.publish("set_app_dev_end_state")
-            print("voice in!!!",msg,self.video_call_in_mode)
-            if self.video_call_in_mode == 0:
-                
-                self.timer.start(2000, 1, self.publish_video_in_event_cb)
-                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_VIDEO_VOICE_IN"))
-                EventMesh.publish("play_audio_file",[str_data,0])#获取播放音频文件
-            else:
-                self.timer.start(2000, 1, self.publish_video_in_event_cb)
-                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_VIDEO_CALL_IN"))
-                EventMesh.publish("play_audio_file",[str_data,0])#获取播放音频文件
-            # EventMesh.publish("play_audio_file",str_data)#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
-            EventMesh.publish("set_motor_time",[1,2,10*3,10,5])#设置马达参数
-        def video_in_timer_cb(self,data):
-
-            open_power = EventMesh.publish("get_power_on_state")#获取开机标识
-            power_off = EventMesh.publish("get_power_off_state")#获取关机标识
-            if open_power != None and power_off != None:
-                if open_power == 0 or power_off == 1:
-                    return
-            
-            video_state = EventMesh.publish("get_video_state")
-            # print("video_state",video_state)
-            
-            self.video_count+=1
-            if self.video_count >= 30 or video_state == 0:#一分钟挂断视频通话
-                EventMesh.publish("video_newwork_reject_cb",None)#挂断视频通话
-                self.video_call_state = 0
-                self.video_count=0
-                self.timer.stop()
-                return
-            if video_state != 6 or self.video_call_state == 0:#视频电话呼入
-                EventMesh.publish("stop_led_timer")#设置参数
-                EventMesh.publish("close_timer_all")#
-                return
-            if self.video_call_in_mode == 0:
-                EventMesh.publish("set_led_time_arg",[1,2,10*2,led_mode.FLASH_LIGHT_RED,10,5,led_mode.VIDEO_MEASURE_MODE])#
-                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_VIDEO_VOICE_IN"))
-                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件
-            else:
-                EventMesh.publish("set_led_time_arg",[1,2,10*2,led_mode.FLASH_LIGHT_RED,10,5,led_mode.VIDEO_MEASURE_MODE])#
-                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_VIDEO_CALL_IN"))
-                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件
-
-        def video_call_out_cb(self, event, msg):#视频通话拨出
-            open_power = EventMesh.publish("get_power_on_state")#获取开机标识
-            power_off = EventMesh.publish("get_power_off_state")#获取关机标识
-            if open_power != None and power_off != None:
-                if open_power == 0 or power_off == 1:
-                    return
-            EventMesh.publish("close_timer_all")#
-            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])#
-            EventMesh.publish("clear_video_timer_state")
-            EventMesh.publish("set_app_dev_end_state")
-            if msg != None:
-                self.video_count = 0
-                self.video_call_state = 1
-                self.timer.start(2000, 1, self.publish_video_out_event_cb)
-                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_VIDEO_WAITING"))
-                EventMesh.publish("play_audio_file",[str_data,0])#获取播放音频文件
-            else:
-                self.video_call_state = 0
-                self.video_count=0
-                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_NO_SET_VIDOE"))
-                EventMesh.publish("play_audio_file",[str_data,0])#获取播放音频文件
-                pass
-        
-        def video_out_timer_cb(self,data):
-
-            open_power = EventMesh.publish("get_power_on_state")#获取开机标识
-            power_off = EventMesh.publish("get_power_off_state")#获取关机标识
-            if open_power != None and power_off != None:
-                if open_power == 0 or power_off == 1 :
-                    return
-            video_state = EventMesh.publish("get_video_state")#加入中
-            # print("video_out_timer_cb video_state",video_state)
-            
-            self.video_count+=1
-            if self.video_count >= 30 or video_state == 0:#40s挂断视频通话 对方无响应
-                self.timer.stop()
-                EventMesh.publish("video_newwork_reject_cb",None)#挂断视频通话
-                self.video_call_state = 0
-                self.video_count = 0
-                
-                return
-            if video_state == 4 or self.video_call_state == 0:#视频电话呼出 如果接通了就不需要了
-                self.video_call_state = 0
-                self.video_count=0
-                print("video calling")
-                EventMesh.publish("stop_led_timer")#设置参数
-                EventMesh.publish("close_timer_all")#
-                return
-            
-
-            # EventMesh.publish("set_led_time_arg",[1,2,10*10,led_mode.FLASH_LIGHT_RED,10,5,led_mode.OTHER_MEASURE_MODE])#測量成功
-            str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_VIDEO_WAITING"))
-            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件
-
-        def video_waite_timer_cb(self,event,msg):#等待对方接听音频
-            print("video_waite_timer_cb 1")
-            open_power = EventMesh.publish("get_power_on_state")#获取开机标识
-            power_off = EventMesh.publish("get_power_off_state")#获取关机标识
-            if open_power != None and power_off != None:
-                if open_power == 0 or power_off == 1 or self.video_call_state == 0:
-                    return
-            play_state = EventMesh.publish("get_audio_state")
-            if play_state == 0:
-                print("video_waite_timer_cb 2")
-                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_VIDEO_WAITING"))
-                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件
-        
-        
-        def video_answer_timer_cb(self,event,msg):#对方已接听可正常通话了
-            print("video_answer_timer_cb 1")
-            open_power = EventMesh.publish("get_power_on_state")#获取开机标识
-            power_off = EventMesh.publish("get_power_off_state")#获取关机标识
-            if open_power != None and power_off != None:
-                if open_power == 0 or power_off == 1  or self.video_call_state == 0 :
-                    return
-            print("video_answer_timer_cb 2")
-            str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_VIDEO_ANSWER"))
-            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件
-
-        def video_answer_mode_timer_cb(self,event,msg):#1:#正在等待对方接听中,请稍候   2:#对方已接听可正常通话 3:#正在接听中
-            # print("video_answer_mode_timer_cb 1",msg)
-            open_power = EventMesh.publish("get_power_on_state")#获取开机标识
-            power_off = EventMesh.publish("get_power_off_state")#获取关机标识
-            if open_power != None and power_off != None:
-                if open_power == 0 or power_off == 1:
-                    return
-            # print("video_answer_mode_timer_cb 2",msg)
-            if msg == 1:#正在等待对方接听中,请稍候
-                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_VIDEO_WAITING"))
-                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件
-            elif msg == 2:#已接通
-                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_VIDEO_ANSWER"))
-                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件
-                pass
-            elif msg == 3:#正在连接中...
-                if EventMesh.publish("get_audio_state") == 0:
-                    str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_VIDEO_ANSWERING"))
-                    EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件
-                pass
-            elif msg == 4:#对方已挂断...
-                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_VIDEO_CALL_ENDING"))
-                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件
-                pass
-            elif msg == 5:#对方已挂断或网络不好
-                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_VIDEO_CALL_CONNECT"))#播放音频
-                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件
-
-        def dev_video_end_timer_cb(self,event,msg):#网络不好或者对方未接通挂断了
-            self.video_call_state = 0
-            self.video_count = 0
-            print("dev_video_end_timer_cb")
-            EventMesh.publish("stop_led_timer")#设置参数
-            EventMesh.publish("close_timer_all")#
-           
-        
-        def get_video_in_out_state(self,event,msg):
-            return self.video_call_state
-        
-        def set_video_in_out_state(self,event,msg):
-            self.video_call_state = msg
-        
-
-
-        def dialin_call_event(self, event, msg):
-            open_power = EventMesh.publish("get_power_on_state")#获取开机标识
-            if open_power != None:
-                if open_power == 0:
-                    return
-            power_off = EventMesh.publish("get_power_off_state")#获取开机标识
-            if power_off != None:
-                if power_off == 1:
-                    return
-            video_state = EventMesh.publish("get_video_state")
-            if video_state != 0:#视频电话呼入
-                self.call_state = 0
-                voiceCall.callEnd()
-                return
-            EventMesh.publish("close_timer_all")#
-            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"))
-            EventMesh.publish("play_audio_file",[str_data,0])#获取播放音频文件
-            # EventMesh.publish("play_audio_file",str_data)#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
-            EventMesh.publish("set_motor_time",[1,2,10*3,10,5])#设置马达参数
-
-        def call_timer_cb(self,data):
-            open_power = EventMesh.publish("get_power_on_state")#获取开机标识
-            if open_power != None:
-                if open_power == 0:
-                    return
-            power_off = EventMesh.publish("get_power_off_state")#获取开机标识
-            if power_off != None:
-                if power_off == 1:
-                    return
-            video_state = EventMesh.publish("get_video_state")
-            if video_state != 0:#视频电话呼入
-                self.call_state = 0
-                voiceCall.callEnd()
-                EventMesh.publish("stop_led_timer")#设置参数
-                EventMesh.publish("close_timer_all")#
-                return
-            if self.call_state != 2:
-                EventMesh.publish("stop_led_timer")#设置参数
-                EventMesh.publish("close_timer_all")#
-                return
-            EventMesh.publish("set_led_time_arg",[1,2,10*10,led_mode.FLASH_LIGHT_RED,10,5,led_mode.OTHER_MEASURE_MODE])#測量成功
-            str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_CALL_mp3"))
-            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件
-        
-        def dial_out_call_center_cb(self, event, msg):#电话拨出去
-            open_power = EventMesh.publish("get_power_on_state")#获取开机标识
-            if open_power != None:
-                if open_power == 0:
-                    return
-            power_off = EventMesh.publish("get_power_off_state")#获取开机标识
-            if power_off != None:
-                if power_off == 1:
-                    return
-            # EventMesh.debug_log("dial_out_call_center_cb",msg)
-            if self.call_state == 0:
-                self.phone_num = ''
-                EventMesh.publish("close_timer_all")#
-                EventMesh.publish("set_led_time_arg",[1,2,8,led_mode.FLASH_LIGHT_GREEN,8,4,led_mode.OTHER_MEASURE_MODE])#
-                if msg == None:
-                    str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_NO_SET_SOS_DIAL"))
-                    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"))
-                    EventMesh.publish("play_audio_file",[str_data,0])#获取播放音频文件
-                    self.timer1.start(2000, 0, self.time_out_phone)
-
-        
-
-
-                    
-        
-        def time_out_phone(self, msg):#电话拨出去
-            voiceCall.callStart(self.phone_num)
-
-        def sos_out_call_center_cb(self, event, msg):#sos电话呼叫中
-            open_power = EventMesh.publish("get_power_on_state")#获取开机标识
-            if open_power != None:
-                if open_power == 0:
-                    return
-            power_off = EventMesh.publish("get_power_off_state")#获取开机标识
-            if power_off != None:
-                if power_off == 1:
-                    return
-            self.sos_phone_num = ''
-            EventMesh.debug_log("sos_out_call_center_cb",msg)
-            if self.call_state == 0:
-                self.sos_state = 0
-                EventMesh.publish("close_timer_all")#
-                if msg == None:
-                    str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_NO_SET_SOS_DIAL"))
-                    EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件
-                    # EventMesh.publish("play_audio_file",str_data)#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
-                else:
-                    sos_state =  EventMesh.publish("get_dev_state")
-                    self.sos_state = 1
-                    tmp = 1 << 16
-                    sos_state = sos_state|tmp #第21位=1
-                    EventMesh.publish("set_dev_state",sos_state)
-
-                    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"))
-                    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)
-                    
-                    
-        def sos_time_out_phone(self, msg):#30s超时未打通或者信号不好则重新拨打
-            self.sos_state = 0
-            sos_flag = EventMesh.publish("get_sos_flag")
-            if sos_flag == 1:
-                if self.call_state == 0:
-                    EventMesh.publish("set_sos_state_out")
-                    EventMesh.publish("set_sos_info_call") 
-                    
-        def sos_call_out_phone(self, msg):#电话拨出去
-            voiceCall.callStart(self.sos_phone_num)
-        
-        def get_sos_state_out(self, event, msg):#正在拨打sos电话
-            return self.sos_state
-        
-        def set_sos_state_out(self, event, msg):#清除在拨打sos电话
-            self.sos_state = 0
-
-        def call_test_event(self, event, msg):
-            voiceCall.callStart(str("10086"))
-
-        def get_call_state(self, event, msg):
-            return self.call_state
-        
-        def interup_call_event(self, event, msg):#侧边金属按钮挂断来电
-            flag = EventMesh.publish("get_call_state") 
-            if flag == 2 or flag == 3:#电话通话中 或者呼叫中挂断中断
-                self.call_state = 0
-                voiceCall.callEnd()
-        
-        def dialing_out_event(self, event, msg):#侧边金属按键挂断电话呼叫中
-            flag = EventMesh.publish("get_call_state") 
-            if flag == 1 or flag == 3:#电话呼叫中 或者在正在通话中
-                self.call_state = 0
-                voiceCall.callEnd()
-                
-
-
-        def play_cur_step_event(self, event, msg): #msg 1 播放当前步数
-            flag = EventMesh.publish("get_call_state") 
-            video_state = EventMesh.publish("get_video_state")
-            if video_state != 0:
-                return
-            if flag == 0:#电话通话中 或者呼叫中挂断中断
-                if self.fall_flag == 0:
-                    EventMesh.publish("close_timer_all")#
-                step = EventMesh.publish("get_old_step_value")
-                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("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("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("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
-                    else:
-                        step_tmp = str(step)
-                        shi_value = int(step_tmp[0])#十
-                        ge_value = int(step_tmp[1])#个
-                        if shi_value > 1:#大于19步
-                            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("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("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("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("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
-                    else:
-                        step_tmp = str(step)#500
-                        bai_value = int(step_tmp[0])#百
-                        shi_value = int(step_tmp[1])#十
-                        ge_value = int(step_tmp[2])#个
-                        #101 110 1
-                        if shi_value > 0:#110
-                            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("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("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("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
-                                pass
-                            else:
-
-                                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("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("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
-                        pass
-                    else:
-                        one_thousand = step//1000 #千
-                        one_hundred = step%1000 #百
-                        baishu = step%100 #十
-                        shishu = step%10 #个
-                        step_tmp = str(step)
-                        qian = int(step_tmp[0])#千
-                        bai_value = int(step_tmp[1])#百
-                        shi_value = int(step_tmp[2])#十
-                        ge_value = int(step_tmp[3])#个
-                        if bai_value <= 0:
-                            if shi_value <= 0:
-                                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("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("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("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
-                        else:
-                            if shi_value <= 0:#1109
-                                if ge_value == 0:#1110
-                                    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("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("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
-                            else:
-                                if ge_value == 0:#1110
-                                    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_{}".format(shi_value)),\
-                                    audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_STEP_4"))
-                                    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("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
-
-                        pass
-                elif step <= 100000:#万
-                            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("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
-                            else:
-                                step_tmp = str(step)
-                                wang = int(step_tmp[0])#万
-                                qian = int(step_tmp[1])#千
-                                bai_value = int(step_tmp[2])#百
-                                shi_value = int(step_tmp[3])#十
-                                ge_value = int(step_tmp[4])#个
-                                if wang > 0 and qian > 0 and bai_value > 0:#11109 11111
-                                    if shi_value <= 0:#11109
-                                        if ge_value == 0:#11100
-                                            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_{}".format(bai_value)),\
-                                            audio_buf.index("R_READ_STEP_2"),audio_buf.index("R_READ_STEP_4"))
-                                            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)),\
-                                            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_TIME_0"),audio_buf.index("R_READ_TIME_{}".format(ge_value)),\
-                                            audio_buf.index("R_READ_STEP_4"))
-                                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
-                                            pass
-                                    else:
-                                        if ge_value == 0:#11110
-                                            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_{}".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("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)),\
-                                            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_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("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
-                                    if shi_value > 0:
-                                        if ge_value == 0:#11010
-                                            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_{}".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("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("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("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("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
-                                
-                                elif wang > 0:#1
-                                    if bai_value > 0:#百
-                                        if shi_value > 0:#10110
-                                            if ge_value == 0:#10150
-                                                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_{}".format(shi_value)),audio_buf.index("R_READ_STEP_3"),\
-                                                audio_buf.index("R_READ_STEP_4"))
-                                                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("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("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("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
-                                    else:
-                                        if shi_value > 0:
-                                            if ge_value == 0:#10090
-                                                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("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("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("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
-            open_power = EventMesh.publish("get_power_on_state")#获取开机标识
-            if open_power != None:
-                if open_power == 0:
-                    return
-            power_off = EventMesh.publish("get_power_off_state")#获取开机标识
-            if power_off != None:
-                if power_off == 1:
-                    return
-            flag = EventMesh.publish("get_call_state") 
-            video_state = EventMesh.publish("get_video_state")
-            get_hr_state = EventMesh.publish("get_hr_state")
-            get_spo2_state = EventMesh.publish("get_spo2_state")
-            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 and video_state == 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 or msg == 0:
-                self.usbState = msg
-                EventMesh.publish("stop_led_timer")#设置参数
-                # EventMesh.publish("set_led_time_arg",[0,1000,1,led_mode.FLASH_LIGHT_GREEN,led_mode.DEFAULT_LONG_LIGHT_MODE,led_mode.CHARGE_OUT_MODE])#測量成功
-                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 and video_state == 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 and video_state == 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):
-            return self.usbState
-        
-
-
-        def app_factory(self,event,msg):
-            if msg != None:
-                number = str(msg)
-                sms.sendPduMsg(number, 'factory# send ok', 'UCS2')
-            ret = 0
-            ret = ql_fs.path_exists("/usr/static/storage_file")#
-            if ret == True:
-                ql_fs.rmdirs("/usr/static/storage_file")
-                ql_fs.mkdirs("/usr/static/storage_file")
-            if EventMesh.publish(constants.EVENT.GET_CONNECT) == 1:
-                EventMesh.publish(constants.PROTOCOL.DLT_SEND)
-        
-            self.factory_timer.start(6*1000,0,self.factory_cb)
-            pass
-        def factory_cb(self,*argc):
-            self.aud.stopPlayStream()
-            Power.powerRestart()
-
-        def app_restart(self,event,msg):#远程发短信重启
-            if msg != None:
-                number = str(msg)
-                sms.sendPduMsg(number, 'reset# send ok', 'UCS2')
-            self.restart_timer.start(3*1000,0,self.app_restart_cb)
-            pass
-        def app_restart_cb(self,*argc):
-            Power.powerRestart()
-
-        def open_power_on(self, event, msg): #msg 1 开机 2 关机 3 重启  4恢复出厂设置 5静音关机
-            EventMesh.publish("close_timer_all")#
-            if msg == 1:
-                EventMesh.publish("close_hr_sop2")#
-                # 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)
-                self.pwk_timer1.start(1000,0,self.power_on_audio_cb)
-                
-                print("open_power_on!!!!!!!\n\n\n\n")
-            elif msg == 2:
-                flag = EventMesh.publish("get_call_state") 
-                if flag != 0:#电话呼叫中
-                    self.call_state = 0
-                    voiceCall.callEnd()
-                step = EventMesh.publish("get_old_step_value")
-                # step1 = SC7A20().get_step()
-                # step1 = EventMesh.publish(constants.EVENT.GET_STEP)
-                # step2 = EventMesh.publish("get_storage_config","old_step")
-                self.read_data = EventMesh.publish("get_storage_data")
-                # EventMesh.publish("set_test_data5",[1,step,step1,step2])
-                if step != 0:
-                    EventMesh.publish("set_storage_config",["old_step",step])
-                date_tmp = utime.localtime()
-                time_tmp = utime.mktime(date_tmp)
-                # step3 = EventMesh.publish("get_old_step_value")
-                # step4 = SC7A20().get_step()
-                # step4 = EventMesh.publish(constants.EVENT.GET_STEP)
-                # step5 = EventMesh.publish("get_storage_config","old_step")
-                # EventMesh.publish("set_test_data6",[1,step3,step4,step5])
-                EventMesh.publish("set_storage_config",["old_time",time_tmp])#关机保存一个是时间
-                EventMesh.publish("set_storage_config",["power_state",0])
-                # self.pwk_timer1.start(3000,0,self.power_off_audio_cb)
-                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)
-            elif msg == 3:
-                flag = EventMesh.publish("get_call_state") 
-                if flag != 0:#电话呼叫中
-                    self.call_state = 0
-                    voiceCall.callEnd()
-                EventMesh.publish("close_hr_sop2")#
-                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("stop_led_timer")#设置参数
-                self.power_off = 1
-                self.timer.start(8000,0,self.publish_resatrt_down_event_cb)
-                #EventMesh.publish("set_led_time_arg",[3000,4000,1,led_mode.LONG_LIGHT_GREEN,led_mode.DEFAULT_LONG_LIGHT_MODE])#
-            elif msg == 4:
-                flag = EventMesh.publish("get_call_state") 
-                if flag != 0:#电话呼叫中
-                    self.call_state = 0
-                    voiceCall.callEnd()
-                EventMesh.publish("close_hr_sop2")#
-                EventMesh.publish("stop_led_timer")#设置参数
-                self.power_off = 1
-                ret = 0
-                ret = ql_fs.path_exists("/usr/static/storage_file")#
-                if ret == True:
-                    ql_fs.rmdirs("/usr/static/storage_file")
-                    ql_fs.mkdirs("/usr/static/storage_file")
-                if EventMesh.publish(constants.EVENT.GET_CONNECT) == 1:
-                    EventMesh.publish(constants.PROTOCOL.DLT_SEND)
-                self.aud.stopPlayStream()
-                self.timer.start(6*1000,0,self.fun)
-            elif msg == 5:
-                flag = EventMesh.publish("get_call_state") 
-                if flag != 0:#电话呼叫中
-                    self.call_state = 0
-                    voiceCall.callEnd()
-                step = EventMesh.publish("get_old_step_value")
-                # step1 = SC7A20().get_step()
-                # step1 = EventMesh.publish(constants.EVENT.GET_STEP)
-                # step2 = EventMesh.publish("get_storage_config","old_step")
-                self.read_data = EventMesh.publish("get_storage_data")
-                # EventMesh.publish("set_test_data7",[1,step,step1,step2])
-                if step != 0:
-                    EventMesh.publish("set_storage_config",["old_step",step])
-
-                # step3 = EventMesh.publish("get_old_step_value")
-                # step4 = SC7A20().get_step()
-                # step4 = EventMesh.publish(constants.EVENT.GET_STEP)
-                # step5 = EventMesh.publish("get_storage_config","old_step")
-                # EventMesh.publish("set_test_data8",[1,step3,step4,step5])
-                date_tmp = utime.localtime()
-                time_tmp = utime.mktime(date_tmp)
-                EventMesh.publish("set_storage_config",["old_time",time_tmp])#关机保存一个是时间
-                EventMesh.publish("set_storage_config",["power_state",1])
-                
-                EventMesh.publish("close_hr_sop2")#
-                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)
-                # self.pwk_timer1.start(3000,0,self.power_off_no_audio_cb)#不需要关机铃声
-
-
-
-        def fun(self,*argc):
-            self.aud.stopPlayStream()
-            Power.powerRestart()
-            
-
-        def power_on_cb(self, msg): #msg 开机标识
-            self.power_on_flag = 1
-        def clear_power_on_cb(self, msg): #msg 开机标识
-            self.power_on_flag = 0
-        
-        def power_on_audio_cb(self, msg):
-            self.power_on_flag = 1
-            # EventMesh.debug_log("power_on_audio_cb")
-            power_state = EventMesh.publish("get_storage_config","power_state")
-            #EventMesh.publish("set_motor_time",[1,2,10*2,10,5])#设置马达参数
-            if power_state == None:
-                power_state = 0
-            # print("power_state",power_state)
-            if power_state <= 0:
-                self.aud.stop()
-                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",[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)
-
-        def get_power_on_state(self, event, msg):
-            return self.power_on_flag
-        
-        def power_off_audio_cb(self, msg):
-            # 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)
-        
-        def power_off_no_audio_cb(self, msg):
-            EventMesh.debug_log("power_off_no_audio_cb")
-            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)
-
-        def set_power_off_cb(self, msg):
-            self.power_off = 1
-
-        def get_power_off_state(self, event, msg):
-            return self.power_off
-
-        def close_hr_sop2(self, event, msg): #msg 关闭心率血氧体温测试
-            get_hr_state = EventMesh.publish("get_hr_state")
-            get_spo2_state = EventMesh.publish("get_spo2_state")
-            get_temp_state = EventMesh.publish("get_temp_state")
-            get_bg_state = EventMesh.publish("get_bg_state")
-            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:
-                    EventMesh.publish("set_hr_state",0)#2代表后台进入测试,定时测心率 1ui界面测试洗心率 
-                    EventMesh.debug_log("sstop hr")
-                    EventMesh.publish(constants.EVENT.STOP_HEART) 
-                if get_spo2_state != 0 :
-                    EventMesh.debug_log("stop spo2")
-                    EventMesh.publish("set_spo2_state",0)#2代表后台进入测试
-                    EventMesh.publish(constants.EVENT.STOP_BLOOD_OXYGEN)
-                if get_temp_state != 0:
-                    EventMesh.debug_log("stop temp")
-                    EventMesh.publish("set_temp_state",0)
-                    EventMesh.publish(constants.EVENT.STOP_TEMP)#手动体温测试
-                if  get_bg_state != 0:
-                    EventMesh.publish("set_bg_state",0)#2代表后台进入测试,定时测心率 1ui界面测试洗心率 
-                    EventMesh.debug_log("sstop bg")
-                    EventMesh.publish(constants.EVENT.STOP_HEART) 
-
-                if  get_bp_state != 0:
-                    EventMesh.publish("set_bp_state",0)#2代表后台进入测试,定时测心率 1ui界面测试洗心率 
-                    EventMesh.debug_log("sstop bp")
-                    EventMesh.publish(constants.EVENT.STOP_HEART) 
-
-        def set_manual_measure_mode(self, event, msg): #手动测试 1心率 2 血氧 3 体温
-            get_hr_state = EventMesh.publish("get_hr_state")
-            get_spo2_state = EventMesh.publish("get_spo2_state")
-            get_temp_state = EventMesh.publish("get_temp_state")
-            if msg == 1:
-                if get_hr_state != 1:#不是手动测试直接打断
-                    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) #手动心率测试
-            elif msg == 2:
-                if get_hr_state == 0:
-                    if get_spo2_state != 1:
-                        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) #手动血氧测试
-            elif msg == 3:
-                if get_temp_state != 1:
-                    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)#手动体温测试
-            pass
-
-
-        def set_start_measure_time(self, event, msg): #手动测试 1心
-            self.hr_auto = msg
-            pass
-
-        def get_start_measure_time(self, event, msg): #手动测试 
-
-            return  self.hr_auto
-        
-        def set_start_temp_measure_time(self, event, msg): #
-            self.temp_auto = msg
-            pass
-
-        def get_start_temp_measure_time(self, event, msg): #
-            return self.temp_auto
-
-        def mearsure_cb(self, event, msg):
-            if msg == 1:
-                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_HSENSOR_RESULT_OK"))
-                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
-            elif msg == 2:
-                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_HSENSOR_RESULT_FAILE"))
-                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data) 
-            elif msg == 3:
-                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_HSENSOR_SPO2_TITLE"))
-                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data) 
-            elif msg == 4:
-                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_HSENSOR_TEMP_TITLE"))
-                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data) 
-            
-            
-            
-        def play_temp_value(self, event, msg): #播放体温数值
-            video_state = EventMesh.publish("get_video_state")
-            flag = EventMesh.publish("get_call_state") 
-            if msg != None:
-                if flag == 0 and self.fall_flag == 0 and video_state == 0:
-                    EventMesh.publish("close_timer_all")#
-                    if msg > 0:
-                        # str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_HSENSOR_RESULT_OK"))
-                        # EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
-                        EventMesh.publish("set_hr_blood_led",2)#测量成功
-                        self.temp_value = msg
-                        # self.timer.start(2*1000,1,self.play_temp_fun)
-                        self.play_temp_fun(0)
-                    else:
-                        str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_HSENSOR_RESULT_FAILE"))
-                        EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
-                        EventMesh.publish("set_hr_blood_led",3)#测量异常
-                else:
-                    EventMesh.publish("set_hr_blood_led",3)#测量异常
-
-        def play_temp_fun(self,argc): #播放体温数值
-            data = self.temp_value
-            if data > 42:
-                data = 42
-            data_tmp = str(data)
-            if data_tmp.find(".") != -1:
-                temp_shi = int(data_tmp.split('.')[0])//10
-                temp_ge = int(data_tmp.split('.')[0])%10
-                dot_ge = int(data_tmp.split('.')[1][:1])
-                if temp_ge > 0:#37.0
-                    if dot_ge > 0:#37.5
-                        str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_HSENSOR_TEMP_TITLE"),audio_buf.index("R_READ_TIME_{}".format(temp_shi)),\
-                        audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_{}".format(temp_ge)),audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT"),\
-                        audio_buf.index("R_READ_TIME_{}".format(dot_ge)))
-                        EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
-
-                    else:#37.0
-                        str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_HSENSOR_TEMP_TITLE"),audio_buf.index("R_READ_TIME_{}".format(temp_shi)),\
-                        audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_{}".format(temp_ge)))
-                        EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
-                else:#30.0 30.6
-                    if dot_ge > 0:
-                        str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_HSENSOR_TEMP_TITLE"),audio_buf.index("R_READ_TIME_{}".format(temp_shi)),\
-                        audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT"),audio_buf.index("R_READ_TIME_{}".format(dot_ge)))
-                        EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
-                    else:
-                        str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_HSENSOR_TEMP_TITLE"),audio_buf.index("R_READ_TIME_{}".format(temp_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:
-                temp_shi = int(data_tmp)//10
-                temp_ge = int(data_tmp)%10
-
-                if temp_ge > 0:#45
-                    str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_HSENSOR_TEMP_TITLE"),audio_buf.index("R_READ_TIME_{}".format(temp_shi)),\
-                    audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_{}".format(temp_ge)))
-                    EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
-                else:
-                    str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_HSENSOR_TEMP_TITLE"),audio_buf.index("R_READ_TIME_{}".format(temp_shi)),\
-                    audio_buf.index("R_READ_STEP_3"))
-                    EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
-                            
-
-        def play_hr_value(self, event, msg): #播放心率数值
-            video_state = EventMesh.publish("get_video_state")
-            flag = EventMesh.publish("get_call_state") 
-            if msg != None:
-                if flag == 0 and self.fall_flag == 0 and video_state == 0:
-                    EventMesh.publish("close_timer_all")#
-                    if msg >= 50:
-                        # str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_HSENSOR_RESULT_OK"))
-                        # 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.play_hr_fun(0)
-                    else:
-                        str_data ='mp3files={}.mp3'.format(audio_buf.index("R_HSENSOR_RESULT_FAILE"))
-                        EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
-                        EventMesh.publish("set_hr_blood_led",3)#测量异常
-                else:
-                    EventMesh.publish("set_hr_blood_led",3)#测量异常
-
-        def play_hr_fun(self,argc):#播放心率测试值
-            video_state = EventMesh.publish("get_video_state")
-            flag = EventMesh.publish("get_call_state") 
-            
-            if flag == 0 and self.fall_flag == 0 and video_state == 0:#电话通话中 或者呼叫中挂断中断
-                EventMesh.publish("close_timer_all")#
-                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)
-
-
-        def play_battery_level_value(self, event, msg): #播放当前电量
-            flag = EventMesh.publish("get_call_state") 
-            video_state = EventMesh.publish("get_video_state")
-            if flag == 0 and self.fall_flag == 0 and video_state == 0 :#电话通话中 或者呼叫中挂断中断
-                EventMesh.publish("close_timer_all")#
-                battery = EventMesh.publish("screen_get_battery")
-                print("cur level",battery)
-                level = 100
-                if battery == None:
-                    level = 100
-                else:
-                    level = battery[1]
-                
-                data = level
-                if data > 100:
-                    data = 100
-                if data == 100:
-                    str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_CUR_BATTERY_LEVEL"),audio_buf.index("R_READ_TIME_1"),\
-                    audio_buf.index("R_READ_STEP_2"))
-                    EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
-                    return
-                if data > 10:
-                    if data%10 == 0:
-                        str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_CUR_BATTERY_LEVEL"),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_CUR_BATTERY_LEVEL"),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:
-                    if data == 10:
-                        str_data = 'mp3files={}.mp3+{}.mp3'.format(audio_buf.index("R_CUR_BATTERY_LEVEL"),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'.format(audio_buf.index("R_CUR_BATTERY_LEVEL"),audio_buf.index("R_READ_TIME_{}".format(data)))
-                        EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
-
-
-
-
-        def play_sugar_value(self, event, msg): #播放血糖数值
-            video_state = EventMesh.publish("get_video_state")
-            flag = EventMesh.publish("get_call_state") 
-            if msg != None:
-                if flag == 0 and self.fall_flag == 0 and video_state == 0:
-                    EventMesh.publish("close_timer_all")#
-                    if msg != 0:
-                        # str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_HSENSOR_RESULT_OK"))
-                        # EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
-                        EventMesh.publish("set_hr_blood_led",2)#测量成功
-                        # self.timer.start(2*1000,1,self.play_spo2_fun)
-                        self.play_sugar_fun(msg)
-                    else:
-                        str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_HSENSOR_RESULT_FAILE"))
-                        EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
-                        EventMesh.publish("set_hr_blood_led",3)#测量异常
-                else:
-                    EventMesh.publish("set_hr_blood_led",3)#测量异常
-
-        def play_sugar_fun(self,argc):#播放血糖测试值
-            flag = EventMesh.publish("get_call_state") 
-            video_state = EventMesh.publish("get_video_state")
-            if flag == 0 and self.fall_flag == 0 and video_state == 0:#电话通话中 或者呼叫中挂断中断
-                EventMesh.publish("close_timer_all")#
-                data = str(argc)
-                data_shi = 0
-                data_ge = 0
-                if data.find(".") != -1:
-                    data_shi = int(data.split(".")[0])
-                    data_ge = int(data.split(".")[1])
-                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)
-            else:
-                EventMesh.publish("set_hr_blood_led",3)#测量异常
-
-
-
-        def play_spo2_value(self, event, msg): #播放血样数值
-            flag = EventMesh.publish("get_call_state") 
-            video_state = EventMesh.publish("get_video_state")
-            if msg != None:
-                if flag == 0 and self.fall_flag == 0 and video_state == 0:
-                    EventMesh.publish("close_timer_all")#
-                    if msg >= 85:
-                        # str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_HSENSOR_RESULT_OK"))
-                        # 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
-                        # self.timer.start(2*1000,1,self.play_spo2_fun)
-                        self.play_spo2_fun(0)
-                    else:
-                        str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_HSENSOR_RESULT_FAILE"))
-                        EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
-                        EventMesh.publish("set_hr_blood_led",3)#测量异常
-                else:
-                    EventMesh.publish("set_hr_blood_led",3)#测量异常
-
-        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")#
-                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)
-
-
-        def set_sim_mode(self, event, msg): #mode 1 蓝灯闪烁 可识别卡 但未联网 2 可绑定appsim正常 3 手表不识别卡或者未插卡
-            flag = EventMesh.publish("get_call_state") 
-            video_state = EventMesh.publish("get_video_state")
-            if flag == 0 and self.fall_flag == 0 and video_state == 0 :#电话通话中 或者呼叫中挂断中断
-                EventMesh.publish("close_timer_all")#
-                # EventMesh.publish("stop_led_timer")#设置参数
-                mode = 0
-                signal = EventMesh.publish("get_sim_Status")
-                if signal != None:
-                    if signal == 1:#有卡 
-                        if EventMesh.publish(constants.EVENT.GET_CONNECT) == 1:#未联网提示关机
-                            mode = 2
-                        else:
-                            mode = 1
-                    else:#未插卡
-                        mode = 3
-                if mode == 1:#白色灯
-                    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("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("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("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
-                pass
-            
-        def dial_sos_phone(self, event, msg): #拨打紧急求助电话
-            flag = EventMesh.publish("get_call_state")
-            video_state = EventMesh.publish("get_video_state")
-            if flag == 0 and video_state == 0:
-            
-                signal = EventMesh.publish("screen_get_sig")
-                if signal != None:
-                    if signal >= 0 and signal <= 31:#有卡 
-                        if EventMesh.publish(constants.EVENT.GET_CONNECT) == 1:#未联网提示关机
-                            sos_number = EventMesh.publish("get_dial_sos_number")
-                            if sos_number != None:
-                                if len(sos_number) != 0:
-                                    EventMesh.publish("close_timer_all")#
-                                    EventMesh.publish("set_sos_flag",1)
-                                        
-                                else:#未设置sos紧急求助号码
-                                    EventMesh.publish("close_timer_all")#
-                                    str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_NO_SET_SOS_DIAL"))
-                                    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("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("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
-        
-        def play_cur_time_event(self, event, msg): #播放当前时间
-            flag = EventMesh.publish("get_call_state") 
-            video_state = EventMesh.publish("get_video_state")
-            if flag == 0 and self.fall_flag == 0 and video_state == 0:#电话通话中 或者呼叫中挂断中断
-                EventMesh.publish("close_timer_all")#
-                
-                data = RTC().datetime()
-                hour = data[4]
-                min = data[5]
-                # EventMesh.debug_log("hour",hour,min)
-                self.old_hour = hour
-                self.old_min = min
-                if self.old_hour == 0:
-                    if self.old_min <= 9:#00:09
-                        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"))
-                            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("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
-                            pass
-
-                    else:
-                        if self.old_min % 10 == 0:#0点2十分 0点3十分
-                            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("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("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
-                            pass
-
-                elif self.old_hour <= 9:#8:09 9:20 9:45
-                    if self.old_min <= 9:#9点09分
-                        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("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
-                            pass
-                        else:
-                            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_0"),audio_buf.index("R_READ_TIME_{}".format(self.old_min))\
-                            ,audio_buf.index("R_READ_TIME_MIN"))
-                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
-
-                    else:
-                        if self.old_min % 10 == 0:#9点2十分 9点4十分
-                            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("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("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
-
-
-                else:#12:0
-                    if self.old_min == 0:#12:00 13:00 15:00 20 10 11 12 13 14 15
-                        self.play_count+=1
-                        hour_shi = self.old_hour//10
-                        hour_ge = self.old_hour%10
-                        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("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("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("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("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
-
-                    else:
-                        if self.old_hour == 10:#10:09 10:10
-                            if self.old_min <= 9:
-                                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("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("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("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
-
-                        else:
-                            if self.old_hour < 20:#19:00
-                                if self.old_min <= 9:#19:09 
-                                    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("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_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_0"),audio_buf.index("R_READ_TIME_{}".format(self.old_min % 10))\
-                                        ,audio_buf.index("R_READ_TIME_MIN"))
-                                        EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
-                                    
-                                else:#19:18 19:40 19:56
-                                    if self.old_min % 10 == 0:#十9点2十分 十9点3十分
-                                        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("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("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
-
-                            else:
-                                hour_shi = self.old_hour//10
-                                hour_ge = self.old_hour%10
-
-                                min_shi = self.old_min//10
-                                min_ge = self.old_min%10
-
-                                #20:08 20:18  20:20
-                                if hour_ge == 0:
-                                    if self.old_min <= 9:
-                                        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("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("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
-
-                                    else:
-                                        if min_ge == 0:#2十点2十分
-                                            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("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("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
-
-                                else:#21:08 21:18
-                                    if self.old_min <= 9:
-                                        if self.old_min == 0:
-                                            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("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+{}.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_0")\
-                                            ,audio_buf.index("R_READ_TIME_{}".format(min_ge)),audio_buf.index("R_READ_TIME_MIN"))
-                                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
-                                    else:
-                                        if min_ge == 0:#2十3点3十分
-                                            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_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("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("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
-
-
-        def play_timer_cb_1(self,*agrs):
-            return
-
-        def play_center_phone(self, event, msg): #msg
-            flag = EventMesh.publish("get_call_state")#在通话或者电话拨进 或者拨出不允许设备再次拨出
-            video_state = EventMesh.publish("get_video_state")
-            if flag == 0 and self.fall_flag == 0 and video_state == 0:
-                EventMesh.publish("close_timer_all")#
-            
-                center_dial = EventMesh.publish("get_storage_config","center_dial")
-                if center_dial != None:
-                    if len(center_dial) > 0:
-                        str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_SOS_ALERT"))
-                        EventMesh.publish("play_audio_file",[str_data,0])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
-                        voiceCall.callStart(str(center_dial))
-                        
-                    
-                else:#未设置号码
-                    # EventMesh.debug_log("play_center_phone")
-                    str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_NO_SET_SOS_DIAL"))
-                    EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
-                    pass
-        def center_phone_cb(self,*argc): #msg
-            pass
-
-
-
-
-        def play_imei_event(self, event, msg): #msg
-            flag = EventMesh.publish("get_call_state") 
-            video_state = EventMesh.publish("get_video_state")
-            if flag == 0 and self.fall_flag == 0 and video_state == 0:
-                EventMesh.publish("close_timer_all")#
-                imei = EventMesh.publish(constants.EVENT.GET_IMEI)
-                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)
-
-                str_data = 'mp3files=R_READ_TIME_1.mp3+R_READ_TIME_2.mp3+R_READ_TIME_3.mp3+R_READ_TIME_4.mp3+R_READ_TIME_5.mp3+R_READ_TIME_6.mp3+R_READ_TIME_7.mp3+R_READ_TIME_8.mp3+R_READ_TIME_9.mp3+R_READ_TIME_0.mp3+R_READ_TIME_1.mp3+R_READ_TIME_1.mp3+R_READ_TIME_2.mp3+R_READ_TIME_3.mp3+R_READ_TIME_4.mp3'
-                
-        def get_unread_wechat_state(self,event, msg): 
-
-            return self.set_unread_wechat
-        
-        def set_unread_wechat_state(self, event, msg): 
-            self.set_unread_wechat = msg
-
-        def get_wechat_data(self,event, msg): 
-
-            return [self.MXA_MSG ,self.wechat_recode_list]
-        
-        def set_wechat_data(self, event, msg): 
-            # EventMesh.debug_log("set_wechat_data1 ",msg,self.wechat_num)
-            self.MXA_MSG = msg[0]
-            self.wechat_recode_list = msg[1]
-            self.wechat_num = self.wechat_recode_list["num"]
-            with open("/usr/static/storage_file/wechat_record.json","w",encoding="utf-8") as fd:
-                ujson.dump(self.wechat_recode_list,fd)
-                #写编号
-            # EventMesh.debug_log("set_wechat_data2:{} ".format(self.wechat_num))
-        
-
-        def get_wechat_time(self, event, msg):
-            return  [self.press_btn,self.timeSecond]
-
-        def start_wechat_record(self, event, msg): #开始录音相关配置
-            if EventMesh.publish(constants.EVENT.GET_CONNECT) == 1:#未联网不需要录音
-                flag = EventMesh.publish("get_call_state") 
-                video_state = EventMesh.publish("get_video_state")
-                if flag == 0 and self.fall_flag == 0 and video_state == 0:
-                    if self.press_btn == 0:
-                        self.press_btn = 1
-                        audio_state = EventMesh.publish("get_audio_state")
-                        if audio_state == 1:
-                            self.aud.stop()
-                        EventMesh.publish("close_timer_all")#
-                        EventMesh.publish("set_led_time_arg",[1,1,160,led_mode.LONG_LIGHT_GREEN,4,2,led_mode.WECHAT_LED_MODE])#測量成功
-                        # EventMesh.publish("set_led_time_arg",[1000,1000,1,led_mode.LONG_LIGHT_GREEN,led_mode.OPEN_LONG_LIGHT_MODE,led_mode.WECHAT_LED_MODE])#測量成功
-                    
-                        date_tmp = utime.localtime()
-                        time_tmp = utime.mktime(date_tmp)
-                        self.timeSecond = time_tmp#保存按下的时间长s
-                        self.aud.setVolume(11)#设置音量最大
-                        
-                        EventMesh.debug_log("talking1.0")
-                        # if self.wechat_num >= self.MXA_MSG:
-                        #     self.wechat_num = 0 
-                        # self.wechat_num += 1
-                        # self.wechat_show = self.wechat_num
-                        # self.record_test.start("/usr/static/storage_file/{}.amr".format(self.wechat_show),16) 
-                        self.record_test.start("/usr/static/storage_file/wechat.amr",16) 
-                
-            else:
-                self.timeSecond = 0
-                self.press_btn = 0
-        def get_wechat_state(self, event, msg):
-            return self.press_btn
-
-        def send_wechat_record(self, event, msg): #发送录音文件
-            if self.press_btn == 1:
-                self.press_btn = 0
-                self.record_test.stop() #停止錄音
-                EventMesh.publish("stop_led_timer")#关闭灯
-                EventMesh.publish("set_led_time_arg",[1,1,0,led_mode.FLASH_LIGHT_GREEN,4,2,led_mode.OTHER_MEASURE_MODE])#測量成功
-                # EventMesh.publish("set_led_time_arg",[0,1000,1,led_mode.LONG_LIGHT_GREEN,led_mode.OPEN_LONG_LIGHT_MODE,led_mode.OTHER_MEASURE_MODE])#測量成功
-                self.countdown_old = 0
-
-                date_tmp = utime.localtime()
-                time_tmp = utime.mktime(date_tmp)
-
-                self.countdown_old = msg
-                if self.countdown_old >= 15:
-                    self.countdown_old = 15
-                if self.countdown_old <= 0:
-                    #录音时间太短
-                    return
-                else:
-                    # self.wechat_recode_list["%02d"%(self.wechat_show)] = "read:0"
-                    # self.wechat_recode_list["num"] = self.wechat_show
-                    EventMesh.debug_log("self.wechat_recode_list :{}".format(self.wechat_recode_list))
-
-                    # with open("/usr/static/storage_file/wechat_record.json","w+",encoding="utf-8") as fd:
-                    #     ujson.dump(self.wechat_recode_list,fd)
-                    EventMesh.debug_log("send wechat data!!!!!!!!!!!!!!!!!!!!!")
-
-                    check_txt = ql_fs.path_exists("/usr/static/storage_file/wechat.amr")
-                    if check_txt == True :
-                        path = "/usr/static/storage_file/wechat.amr"
-                        with open(path,"rb") as fd:
-                            buf = bytearray(ql_fs.path_getsize(path))
-                            fd.readinto(buf)
-                            senddata = [self.countdown_old,buf]
-                            EventMesh.publish(constants.PROTOCOL.TKS_SEND,senddata)
-
-                    # with open("/usr/static/storage_file/wechat_record.json","w+",encoding="utf-8") as fd:
-                    #     ujson.dump(self.wechat_recode_list,fd)
-                    # EventMesh.debug_log("send wechat data!!!!!!!!!!!!!!!!!!!!!")
-
-                    # check_txt = ql_fs.path_exists("/usr/static/storage_file/{}.amr".format(self.wechat_show))
-                    # if check_txt == True :
-                    #     path = "/usr/static/storage_file/{}.amr".format(self.wechat_show)
-                    #     with open(path,"rb") as fd:
-                    #         buf = bytearray(ql_fs.path_getsize(path))
-                    #         fd.readinto(buf)
-                    #         senddata = [self.countdown_old,buf]
-                    #         EventMesh.publish(constants.PROTOCOL.TKS_SEND,senddata)
-            else:
-                self.press_btn = 0
-
-        def play_wechat_last_amr(self, event, msg):#播放微聊最后一条语音文件
-            flag = EventMesh.publish("get_call_state") 
-            if flag == 0:#电话通话中 或者呼叫中挂断中断
-                EventMesh.publish("close_timer_all")#
-                if self.wechat_recode_list != None:
-                    num = 0
-                    play_state = 0
-                    if len(self.wechat_recode_list) > 1:
-                        num = int(self.wechat_recode_list["num"])
-                        #EventMesh.debug_log("self.wechat_recode_list1:{}".format(self.wechat_recode_list))
-                        if num != 0:
-                            last_num = str("%02d"%(num))
-                            last_tmp = self.wechat_recode_list[last_num]
-                            last_read = int(last_tmp.split(":")[1])
-                            if last_read == 1:#如果最后一条没有读则读最新的一条
-                                self.wechat_recode_list[last_num] = "read:0"
-                                self.wechat_recode_list["num"] = num 
-                                with open("/usr/static/storage_file/wechat_record.json","w+",encoding="utf-8") as fd:
-                                    ujson.dump(self.wechat_recode_list,fd)
-                            else:
-                                sotr_new = {}
-                                sotr_new = sorted(self.wechat_recode_list.keys(), reverse=True)#降序排序
-                                # EventMesh.debug_log("sotr_new:{}".format(sotr_new))
-                                for i in range(len(self.wechat_recode_list)-1):#1 01 02 
-                                    key = sotr_new[i+1]
-                                    num_id = int(key)
-                                    #EventMesh.debug_log("key:{} num_id:{}".format(key,num_id))
-                                    if key in self.wechat_recode_list:#
-                                        str_tmp = self.wechat_recode_list[key]
-                                        read = int(str_tmp.split(":")[1])
-                                        if read != 0:#未读是按一下播放下一条同时删除
-                                            check_amr = ql_fs.path_exists("/usr/static/storage_file/{}.amr".format(num_id))#还要检测这个文件是否存在
-                                            if check_amr == True:
-                                                self.wechat_recode_list[key] = "read:0"
-                                                self.wechat_recode_list["num"] = num 
-                                                EventMesh.debug_log("self.wechat_recode_list2:{} num_id:{} num:{}".format(self.wechat_recode_list,num_id,num))
-                                                # self.aud.play(1, 1, '/usr/static/storage_file/{}.amr'.format(num))  #文件名前面要加上路径
-                                                play_state = 1
-                                                with open("/usr/static/storage_file/wechat_record.json","w+",encoding="utf-8") as fd:
-                                                    ujson.dump(self.wechat_recode_list,fd)
-                                                break
-                                            else:
-                                                continue
-                                        else:
-                                            continue
-                                    else:
-                                        continue
-                            #EventMesh.debug_log("play_state:{}".format(play_state))
-                            # if play_state == 0:#
-                            check_amr = ql_fs.path_exists("/usr/static/storage_file/{}.amr".format(num))#还要检测这个文件是否存在
-                            if check_amr == True:
-                                self.aud.play(1, 1, '/usr/static/storage_file/{}.amr'.format(num))  #文件名前面要加上路径
-
-        def play_unread_wechat_infor(self,event,msg):#未读微聊语音
-            flag = EventMesh.publish("get_call_state") 
-            video_state = EventMesh.publish("get_video_state")
-            if flag == 0 and self.press_btn == 0 and self.fall_flag == 0 and video_state == 0:#电话通话中 或者呼叫中挂断中断
-            
-                if self.wechat_recode_list != None:
-                    num = 0
-                    play_state = 0
-                    if len(self.wechat_recode_list) > 1:
-                        num = int(self.wechat_recode_list["num"])
-                        if num != 0:
-                            for i in range(len(self.wechat_recode_list)-1):#1 01 02 
-                                key = "%02d"%(i+1)
-                                if key in self.wechat_recode_list:#
-                                    str_tmp = self.wechat_recode_list[key]
-                                    read = int(str_tmp.split(":")[1])
-                                    if read == 1:#未读是按一下播放下一条同时删除
-                                        play_state = 1
-                                    else:
-                                        continue
-                                else:
-                                    continue
-                            if play_state == 1:#设置未读语音状态
-                                EventMesh.publish("set_unread_wechat_state",1)
-                            else:
-                                EventMesh.publish("set_unread_wechat_state",0)
-                                self.updateTime = 0
-
-                state = EventMesh.publish("get_unread_wechat_state")#
-                date_tmp = utime.localtime()
-                time_tmp = utime.mktime(date_tmp)
-                if state != None:
-                    if state == 1:
-                        EventMesh.publish("set_led_time_arg",[1,2,8,led_mode.FLASH_LIGHT_GREEN,8,4,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])#设置参数
-                        if self.updateTime == 0:
-                            self.updateTime = time_tmp
-                        if self.updateTime != 0:
-                            if time_tmp - self.updateTime >= 10*60:
-                                self.updateTime = time_tmp
-                                #播放音频文件
-                                EventMesh.publish("close_timer_all")
-                                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_UNREAD_WECHAT"))
-                                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
-                    else:
-                        self.updateTime = 0
-            
-
-
-
-    class BtnDevice(Abstract):
-
-        def __init__(self, tp=None):
-            self.pk = PowerKey()
-            self.__pwk_timer = osTimer()
-            self.aud = audio.Audio(0)
-            self.aud.set_pa(Pin.GPIO29)
-            self.aud.setVolume(11)
-            # self.keypad = machine.KeyPad(4, 4)
-            self.__PowerDownTimeOut = 3000
-            self.__tp = tp
-            self.pwk_press = 0
-            self.pwk_count = 0
-
-            self.powerKey_status = 0
-            self.sosKey = 0
-            self.wechatKey = 0
-            self.sosKey_status = 1#默认是低电平
-            self.WeChatKey_status = 1#默认是低电平
-
-            self.wechatKey_timer = osTimer()
-            self.wechatKey_count = 0
-            self.wechatKey_press = 0 
-
-            self.sosKey_timer = osTimer()
-            self.sosKey_count = 0
-            self.sosKey_press = 0 
-            self.sosKey_long_press = 0
-
-            self.wechatKey_press_count = 0
-
-            self.timeSeconOld = 0
-            self.wechat_state = 0 #按下录音时的状态
-
-            
-            self.sosKey_press_count = 0
-
-
-           
-
-            self.extint_22 = 0
-            self.GPIO22_status = 1
-
-            self.extint_17 = 0
-            self.KeyCall2_status = 1
-
-            self.extint_7 = 1
-            self.extint_8 = 1
-
-            self.extint_19= 0
-            self.KeyCall1_status = 1
-
-            self.Keycall1_timer = osTimer()
-            self.Keycall1_count = 0
-            self.Keycall1_press = 0 
-            self.Keycall1_press_count = 0
-            self.Keycall1_long_press = 0
-
-            self.Keycall2_timer = osTimer()
-            self.Keycall2_count = 0
-            self.Keycall2_press = 0 
-            self.Keycall2_press_count = 0
-            self.Keycall2_long_press = 0
-
-            
-
-            self.pwkey_timer = osTimer()
-            self.pwk_key = 0
-            self.GPIO26_status = 1
-            self.pwKey_press_count = 0
-            self.pwkey_count = 0
-            self.pwkey_press = 0
-            self.led_state = 0
-            self.hsensorTest_timer = osTimer()
-            self.factoryTest_timer = osTimer()
-            self.factoryTest_count = 0
-            self.factoryTest_led_count = 0
-            self.factoryTest_flag = 0
-            self.factory_timesec = 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("close_wechat_btn_timer", self.close_wechat_btn_timer)#来电强制关闭微聊语音
-
-        def btnInfo_queue_thread(self):
-            while True:
-                data = self.btnInfo_queue.get()
-                #EventMesh.debug_log("Info_queue:data = {}".format(data))
-                if data != None:
-                    try:
-                        data["func"](data["data"])
-                    except Exception as e:
-                        #EventMesh.debug_log("btnInfo_queue:ERROR:{}".format(e))
-                        usys.print_exception(e)
-        def publish_message_event_btnInfo(self,event,msg):
-            self.btnInfo_queue.put(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})  
-
-        def publish_soskey_btn_event_cb(self, *args, **kwargs):
-            EventMesh.publish("publish_message_event_btnInfo",{"func":self.sosKey_press_cb,"data":0})  
-
-        def publish_call1key_btn_event_cb(self, *args, **kwargs):
-            EventMesh.publish("publish_message_event_btnInfo",{"func":self.call1Key_press_cb,"data":0})  
-        
-        def publish_call2key_btn_event_cb(self, *args, **kwargs):
-            EventMesh.publish("publish_message_event_btnInfo",{"func":self.call2Key_press_cb,"data":0})  
-
-        def publish_pwkKey_btn_event_cb(self, *args, **kwargs):
-            EventMesh.publish("publish_message_event_btnInfo",{"func":self.pwKey_press_cb,"data":0})  
-
-    
-
-        def post_processor_after_instantiation(self):
-            # self.keypad.init()
-            # self.keypad.set_callback(self.key_callback)
-        
-            self.pk.powerKeyEventRegister(self.powerKey_callback)
-            
-            self.pwk_key26 = ExtInt(ExtInt.GPIO26, ExtInt.IRQ_RISING_FALLING, ExtInt.PULL_DISABLE, self.pwk_extint_cb)
-            self.pwk_key26.enable() 
-
-            self.sosKey = ExtInt(ExtInt.GPIO6,ExtInt.IRQ_RISING_FALLING, ExtInt.PULL_PU, self.sosKey_extint_cb)#S0S键
-            self.sosKey.enable()
-
-            self.extint_19 = ExtInt(ExtInt.GPIO19,ExtInt.IRQ_RISING_FALLING, ExtInt.PULL_PU, self.key19_extint_cb)
-            self.extint_19.enable()
-
-            self.extint_17 = ExtInt(ExtInt.GPIO7,ExtInt.IRQ_RISING_FALLING, ExtInt.PULL_PU, self.key17_extint_cb)
-            self.extint_17.enable()
-
-            self.wechatKey = ExtInt(ExtInt.GPIO22, ExtInt.IRQ_RISING_FALLING, ExtInt.PULL_PU, self.wechatKey_extint_cb)
-            self.wechatKey.enable()
-
-        def key17_extint_cb(self,args):#call 1
-            print("call 1!!!!!!!")
-            # EventMesh.debug_log('key17_extint_cb :{}'.format(args))
-            open_power = EventMesh.publish("get_power_on_state")#获取开机标识
-            open_power_off = EventMesh.publish("get_power_off_state")#获取开机标识
-            video_state = EventMesh.publish("get_video_state")#获取视频通话状态 5在通话状态不允许按键输入
-            get_video_state = EventMesh.publish("get_video_in_out_state")
-            dev_app_mode = EventMesh.publish("get_dev_app_mode")
-            if open_power != None and open_power_off != None and dev_app_mode != None:
-                if open_power == 0 or open_power_off == 1 or  (dev_app_mode == 1 and get_video_state != 0):
-                    return
-            fall_down = EventMesh.publish("get_fall_down_state")#跌倒报警标识
-            flag = EventMesh.publish("get_call_state")#在通话或者电话拨进 或者拨出不允许寻找设备
-            if fall_down != None:
-                if fall_down != 0:
-                    return
-            
-            self.KeyCall1_status = int(args[1]) 
-            # EventMesh.debug_log('key17_extint_cb :{}'.format(args))
-            if self.KeyCall1_status == 0:
-                self.KeyCall1_status = 1
-            else:
-                self.KeyCall1_status = 0
-                pass
-            if NEW_ENABLE == 0:#新的按键功能定义
-                if self.KeyCall1_status == 0:
-                    video_state = EventMesh.publish("get_video_state")
-                    if video_state != 0:#视频通话打入或者接听后允许挂断视频通话
-                        if video_state != 6:#6是app打手表需要接通
-                            # EventMesh.publish("video_dev_reject_cb",2)#挂断视频通话
-                            return
-            self.WeChatKey_status = self.wechatKey.read_level()
-            self.GPIO26_status = self.pwk_key26.read_level()
-            self.KeyCall2_status = self.extint_19.read_level()
-            self.sosKey_status = self.sosKey.read_level()
-            # EventMesh.debug_log('key17_extint_cb',args,self.KeyCall2_status,self.WeChatKey_status,self.GPIO26_status,self.KeyCall1_status,self.sosKey_status) # args[0]:gpio号 args[1]:上升沿或下降沿
-            if self.WeChatKey_status != 0 and self.GPIO26_status != 0 and self.KeyCall2_status != 0 and self.sosKey_status != 0:
-                if self.KeyCall1_status == 0:#按下
-                    if NEW_ENABLE == 0:#新的按键功能定义
-                        video_state = EventMesh.publish("get_video_state")
-                        if video_state != 0:#视频通话打入或者接听后允许挂断视频通话
-                                if video_state == 6:#6 是app拨打手表 1 是手表打app 3 是正在视频通话中 0 关闭只有第一次视频通话打入才允许接听 接通之后不允许接听了
-                                    EventMesh.publish("video_answer_cb")
-                                else:
-                                    pass
-                                    # EventMesh.publish("video_dev_reject_cb",2)#挂断视频通话
-                                    # self.Keycall1_press_count=0
-                                    # self.wechatKey_timer.stop()
-                                    # self.pwkey_timer.stop()
-                                    # self.sosKey_timer.stop()
-                                    # self.Keycall2_timer.stop()
-                                    # self.Keycall1_timer.stop()
-                            
-                                return
-                    EventMesh.publish("close_wechat_btn_timer")
-                    if self.Keycall1_press == 0 :
-                        self.wechatKey_timer.stop()
-                        self.pwkey_timer.stop()
-                        self.sosKey_timer.stop()
-                        self.Keycall2_timer.stop()
-                        self.Keycall1_timer.stop()
-
-                        self.pwkey_count = 0
-                        self.pwkey_press = 0
-                        self.led_state = 0
-                        self.pwKey_press_count=0 #电源键
-
-                        self.sosKey_count = 0
-                        self.sosKey_press = 0
-                        self.sosKey_press_count=0#sos键
-                        self.sosKey_long_press = 0
-
-                        self.wechatKey_count = 0
-                        self.wechatKey_press = 0
-                        self.wechatKey_press_count=0#微聊键
-                        self.wechat_state = 0
-
-                        self.Keycall2_count = 0
-                        self.Keycall2_press = 0
-                        self.Keycall2_press_count = 0#call 2键
-                        self.Keycall2_long_press = 0
-
-                        self.Keycall1_count = 0
-                        self.Keycall1_press = 1
-                        self.Keycall1_long_press = 0
-                        EventMesh.publish("AI_key_press")
-                        self.Keycall1_timer.start(100, 1, self.publish_call1key_btn_event_cb)
-
-        def call1Key_press_cb(self, data):
-            open_power = EventMesh.publish("get_power_on_state")#获取开机标识
-            open_power_off = EventMesh.publish("get_power_off_state")#获取开机标识
-            video_state = EventMesh.publish("get_video_state")
-            if open_power != None and open_power_off != None:
-                if open_power == 0 or open_power_off == 1:
-                    self.Keycall1_timer.stop()
-                    self.Keycall1_count = 0
-                    self.Keycall1_press = 0
-                    self.Keycall1_press_count+=1
-                    self.Keycall1_long_press = 0
-                    return
-            '''KEY2:联动屏幕右下角或返回键长按关机'''
-            self.KeyCall1_status = self.extint_17.read_level()
-            if self.Keycall1_press == 1 :
-                self.Keycall1_count += 1
-                if self.Keycall1_count >= 10*3: #长按3s 
-                    flag = EventMesh.publish("get_call_state")#获取通话状态
-                    fall_down = EventMesh.publish("get_fall_down_state")#跌倒报警标识
-                    if fall_down != None:
-                        if fall_down != 0 or flag == 2:
-                            self.Keycall1_count = 0
-                            self.Keycall1_press = 0
-                            self.Keycall1_press_count = 0
-                            self.Keycall1_long_press = 0
-                            self.Keycall1_timer.stop()
-                            return
-                    if self.Keycall1_long_press == 0:
-                        self.Keycall1_long_press = 1
-                        
-                        flag = EventMesh.publish("get_call_state")#获取通话状态
-                        fall_down = EventMesh.publish("get_fall_down_state")#跌倒报警标识
-                        if fall_down != None:
-                            if fall_down != 0 or flag == 2:
-                                return
-                       
-                        return
-
-                    if self.KeyCall1_status == 1:
-                        self.Keycall1_count = 0
-                        self.Keycall1_press = 0
-                        self.Keycall1_press_count = 0
-                        self.Keycall1_long_press = 0
-                        self.Keycall1_timer.stop()
-                        return
-                    
-
-                if self.KeyCall1_status == 1:#松开
-                    if self.Keycall1_count >= 1: #防抖100ms
-                        
-                        self.Keycall1_timer.stop()
-                        self.Keycall1_count = 0
-                        self.Keycall1_press = 0
-                        self.Keycall1_press_count+=1
-                        self.Keycall1_timer.start(500, 0, self.publish_call1Key_timeout_cb_do)#松手超时1s判断
-                    
-
-        def publish_call1Key_timeout_cb_do(self, *args, **kwargs):
-            EventMesh.publish("publish_message_event_btnInfo",{"func":self.call1Key_timeout_cb,"data":0}) 
-        
-        def call1Key_timeout_cb(self, data):#
-            open_power = EventMesh.publish("get_power_on_state")#获取开机标识
-            open_power_off = EventMesh.publish("get_power_off_state")#获取开机标识
-            video_state = EventMesh.publish("get_video_state")
-            if open_power != None and open_power_off != None:
-                if open_power == 0 or open_power_off == 1 :
-                    self.Keycall1_timer.stop()
-                    self.Keycall1_count = 0
-                    self.Keycall1_press = 0
-                    self.Keycall1_press_count=0
-                    self.Keycall1_long_press = 0
-                    return
-            flag = EventMesh.publish("get_call_state")#在通话或者电话拨进 或者拨出不允许寻找设备
-            fall_down = EventMesh.publish("get_fall_down_state")#跌倒报警标识
-            print("call2Key_timeout_cb",self.Keycall2_press_count,flag)
-            if self.Keycall1_press_count > 1:#
-                if fall_down != None:
-                    if fall_down != 0 or flag != 0 or video_state != 0:#在打电话或者跌倒报警提醒中不允许按键触发
-                        self.Keycall1_press_count = 0
-                        return
-            if self.Keycall1_press_count == 3:#心率血压测试
-                self.Keycall1_press_count = 0
-                call_state = EventMesh.publish("get_call_state")
-                battery = EventMesh.publish("screen_get_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",1)#
-            elif self.Keycall1_press_count == 1:#
-                self.Keycall1_press_count = 0
-                EventMesh.publish("stop_led_timer")#设置参数
-                # print("video_state call",video_state)
-                # if video_state != 0:
-                #     if video_state == 6:#6 是app拨打手表 1 是手表打app 3 是正在视频通话中 0 关闭只有第一次视频通话打入才允许接听 接通之后不允许接听了
-                #         EventMesh.publish("video_answer_cb")
-                #     return
-                call_state = EventMesh.publish("get_call_state") 
-                if call_state == 2:#电话拨进需要接听
-                    EventMesh.publish("answer_call_event")#接听电话
-                    return
-                EventMesh.publish("play_cur_step_event")##播放当前步数
-            
-
-            self.Keycall1_press_count = 0
-
-
-        def key19_extint_cb(self,args):#call 2
-            #print("key19_extint_cb call 2")
-            # EventMesh.txt_log('key19_extint_cb :{}'.format(args))
-            power_off = EventMesh.publish("get_power_off_state")#获取关机标识
-            open_power = EventMesh.publish("get_power_on_state")#获取开机标识
-            dev_app_mode = EventMesh.publish("get_dev_app_mode")
-            video_state = EventMesh.publish("get_video_state")#获取视频通话状态 5在通话状态不允许按键输入
-            get_video_state = EventMesh.publish("get_video_in_out_state")
-            if open_power != None and power_off != None and dev_app_mode != None:
-                if open_power == 0 or power_off == 1 or (dev_app_mode == 1 and get_video_state != 0): 
-                    return
-                
-            fall_down = EventMesh.publish("get_fall_down_state")#跌倒报警标识
-            flag = EventMesh.publish("get_call_state")#在通话或者电话拨进 或者拨出不允许寻找设备
-            if fall_down != None:
-                if fall_down != 0:
-                    return
-            self.KeyCall2_status = int(args[1])
-            if self.KeyCall2_status == 0:
-                self.KeyCall2_status = 1
-            else:
-                self.KeyCall2_status = 0
-                pass
-            
-            if NEW_ENABLE == 0:#新的按键功能定义
-                if self.KeyCall2_status == 0:
-                    video_state = EventMesh.publish("get_video_state")
-                    if video_state != 0:#视频通话打入或者接听后允许挂断视频通话
-                        if video_state != 6:#6是app打手表需要接通
-                            # EventMesh.publish("video_dev_reject_cb",2)#挂断视频通话
-                            return
-            self.WeChatKey_status = self.wechatKey.read_level()
-            self.GPIO26_status = self.pwk_key26.read_level()
-            self.KeyCall1_status = self.extint_17.read_level()
-            self.sosKey_status = self.sosKey.read_level()
-            # EventMesh.debug_log('self.KeyCall1_status :{}',args,self.KeyCall1_status) # args[0]:gpio号 args[1]:上升沿或下降沿
-            if self.WeChatKey_status != 0 and self.GPIO26_status != 0 and self.KeyCall1_status != 0 and self.sosKey_status != 0:
-                if self.KeyCall2_status == 0:#按下
-                    EventMesh.publish("close_wechat_btn_timer")
-                    if self.Keycall2_press == 0 :
-                        self.wechatKey_timer.stop()
-                        self.pwkey_timer.stop()
-                        self.sosKey_timer.stop()
-                        self.Keycall2_timer.stop()
-                        self.Keycall1_timer.stop()
-
-                        self.pwkey_count = 0
-                        self.pwkey_press = 0
-                        self.led_state = 0
-                        self.pwKey_press_count=0
-
-                        self.sosKey_count = 0
-                        self.sosKey_press = 0
-                        self.sosKey_long_press = 0
-                        self.sosKey_press_count=0
-
-                        self.wechatKey_count = 0
-                        self.wechatKey_press = 0
-                        self.wechatKey_press_count=0
-                        self.wechat_state = 0
-            
-                        self.Keycall1_count = 0
-                        self.Keycall1_press = 0 
-                        self.Keycall1_press_count = 0
-                        self.Keycall1_long_press = 0
-
-                        self.Keycall2_count = 0
-                        self.Keycall2_press = 1
-                        self.Keycall2_long_press = 0
-                        EventMesh.publish("AI_key_press")
-                        print("key19_extint_cb AI_key_press")
-                        self.Keycall2_timer.start(100, 1, self.publish_call2key_btn_event_cb)
-
-        def call2Key_press_cb(self, data):
-
-            '''KEY2:联动屏幕右下角或返回键长按关机'''
-            open_power = EventMesh.publish("get_power_on_state")#获取开机标识
-            open_power_off = EventMesh.publish("get_power_off_state")#获取开机标识
-            video_state = EventMesh.publish("get_video_state")
-            if open_power != None and open_power_off != None:
-                if open_power == 0 or open_power_off == 1:
-                    self.Keycall2_timer.stop()
-                    self.Keycall2_count = 0
-                    self.Keycall2_press = 0
-                    self.Keycall2_press_count =0
-                    self.Keycall2_long_press = 0
-                    return
-            self.KeyCall2_status = self.extint_19.read_level()
-            if self.Keycall2_press == 1 :
-                self.Keycall2_count += 1
-                if self.Keycall2_count >= 10*3: #长按3s 
-                    flag = EventMesh.publish("get_call_state")#获取通话状态
-                    fall_down = EventMesh.publish("get_fall_down_state")#跌倒报警标识
-                    if fall_down != None and video_state != None:
-                        if fall_down != 0 or flag != 0 or video_state != 0:
-                            self.Keycall2_count = 0
-                            self.Keycall2_press = 0
-                            self.Keycall2_press_count = 0
-                            self.Keycall2_long_press = 0
-                            self.Keycall2_timer.stop()
-                            return
-                    if self.Keycall2_long_press == 0:
-                        self.Keycall2_long_press = 1
-                        EventMesh.publish("AI_key_long_press")
-                        # EventMesh.publish("stop_led_timer")#设置参数
-                        # EventMesh.publish("call_phonebook_num",2)
-                        return
-                    if self.KeyCall2_status == 1:#松开
-                        self.Keycall2_count = 0
-                        self.Keycall2_press = 0
-                        self.Keycall2_press_count = 0
-                        self.Keycall2_long_press = 0
-                        self.Keycall2_timer.stop()
-                        EventMesh.publish("AI_key_release")
-                        return
-                    
-
-                if self.KeyCall2_status == 1:#松开
-                    if self.Keycall2_count >= 1: #防抖100ms
-                        EventMesh.publish("AI_key_release")
-                        self.Keycall2_timer.stop()
-                        self.Keycall2_count = 0
-                        self.Keycall2_press = 0
-                        self.Keycall2_press_count+=1
-                        #self.Keycall2_timer.start(500, 0, self.publish_call2Key_timeout_cb_do)#松手超时1s判断
-
-        def publish_call2Key_timeout_cb_do(self, *args, **kwargs):
-            EventMesh.publish("publish_message_event_btnInfo",{"func":self.call2Key_timeout_cb,"data":0}) 
-        
-        def call2Key_timeout_cb(self, data):#
-            open_power = EventMesh.publish("get_power_on_state")#获取开机标识
-            open_power_off = EventMesh.publish("get_power_off_state")#获取开机标识
-            video_state = EventMesh.publish("get_video_state")
-            if open_power != None and open_power_off != None:
-                if open_power == 0 or open_power_off == 1 :
-                    self.Keycall2_timer.stop()
-                    self.Keycall2_count = 0
-                    self.Keycall2_press = 0
-                    self.Keycall2_press_count=0
-                    return
-            flag = EventMesh.publish("get_call_state")#获取通话状态 
-            fall_down = EventMesh.publish("get_fall_down_state")#获取跌倒报警标识
-            # print("call1Key_timeout_cb",self.Keycall1_press_count,flag)
-            if self.Keycall2_press_count > 1:#
-                if fall_down != None:
-                    if fall_down != 0 or flag != 0 or video_state != 0:#在打电话或者跌倒报警提醒中不允许按键触发
-                        self.Keycall2_press_count = 0
-                        return
-            
-            if self.Keycall2_press_count == 3:#测试体温
-                self.Keycall2_press_count = 0
-                call_state = EventMesh.publish("get_call_state")
-                battery = EventMesh.publish("screen_get_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)#测量体温
-            elif self.Keycall2_press_count == 1:#
-                self.Keycall2_press_count = 0
-                video_state = EventMesh.publish("get_video_state") 
-                # print("video_state ",video_state)
-                if video_state != 0:
-                    if video_state == 6:#6 是app拨打手表 1 是手表打app 3 是正在视频通话中 0 关闭只有第一次视频通话打入才允许接听 接通之后不允许接听了
-                        EventMesh.publish("video_answer_cb")
-                    return
-                EventMesh.publish("stop_led_timer")#设置参数
-                call_state = EventMesh.publish("get_call_state") 
-                
-                
-                if call_state == 2:#电话拨进需要接听
-                    EventMesh.publish("answer_call_event")#接听电话
-                    return
-                EventMesh.publish("play_battery_level_value")#播放当前电量
-                
-            self.Keycall2_press_count = 0
-
-
-
-        def pwk_extint_cb(self,args):#侧边按键
-            # EventMesh.txt_log('pwk_extint_cb :{}'.format(args))
-            open_power = EventMesh.publish("get_power_on_state")#获取开机标识
-            open_power_off = EventMesh.publish("get_power_off_state")#获取开机标识
-            video_state = EventMesh.publish("get_video_state")
-            get_video_state = EventMesh.publish("get_video_in_out_state")
-            dev_app_mode = EventMesh.publish("get_dev_app_mode")
-            if open_power != None and open_power_off != None and dev_app_mode != None:
-                if open_power == 0 or open_power_off == 1 or  (dev_app_mode == 1 and get_video_state != 0):
-                    return
-            
-            flag = EventMesh.publish("get_call_state")#获取通话状态
-            fall_down = EventMesh.publish("get_fall_down_state")#获取跌倒报警标识
-            if fall_down != None:
-                if fall_down != 0 or flag == 2:
-                    return
-            self.GPIO26_status = int(args[1])
-            if self.GPIO26_status == 0:
-                self.GPIO26_status = 1
-            else:
-                self.GPIO26_status = 0
-                pass
-            if NEW_ENABLE == 0:#新的按键功能定义
-                if self.GPIO26_status == 0:
-                    video_state = EventMesh.publish("get_video_state")
-                    if video_state != 0:#视频通话打入或者接听后允许挂断视频通话
-                        if video_state == 6:#6是app打手表需要接通
-                            print("pwk_extint_cb")
-                            # EventMesh.publish("video_answer_cb")
-                        else:
-                            pass
-                            # EventMesh.publish("video_dev_reject_cb",2)#挂断视频通话
-                        return
-                    
-            self.WeChatKey_status = self.wechatKey.read_level()
-            self.KeyCall2_status = self.extint_17.read_level()
-            self.KeyCall1_status = self.extint_19.read_level()
-            self.sosKey_status = self.sosKey.read_level()
-
-            if self.WeChatKey_status != 0 and self.KeyCall1_status != 0 and self.sosKey_status != 0 and self.KeyCall2_status != 0:
-                if self.GPIO26_status == 0:#按下
-                    EventMesh.publish("close_wechat_btn_timer")
-                    if self.pwkey_press == 0 :
-                        self.aud.stop()  #播放声音 
-                        self.wechatKey_timer.stop()
-                        self.pwkey_timer.stop()
-                        self.sosKey_timer.stop()
-                        self.Keycall2_timer.stop()
-                        self.Keycall1_timer.stop()
-
-                        self.sosKey_count = 0
-                        self.sosKey_press = 0
-                        self.sosKey_press_count=0
-                        self.sosKey_long_press = 0
-
-                        self.wechatKey_count = 0
-                        self.wechatKey_press = 0
-                        self.wechatKey_press_count=0
-                        self.wechat_state = 0
-                       
-
-                        self.pwkey_press = 1
-                        self.pwkey_count = 0
-                        self.led_state = 0
-
-                        self.Keycall1_count = 0
-                        self.Keycall1_press = 0 
-                        self.Keycall1_long_press = 0
-                        self.Keycall1_press_count = 0
-                        
-                        self.Keycall2_count = 0
-                        self.Keycall2_press = 0 
-                        self.Keycall2_press_count = 0
-                        self.Keycall2_long_press = 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):
-            open_power = EventMesh.publish("get_power_on_state")#获取开机标识
-            open_power_off = EventMesh.publish("get_power_off_state")#获取开机标识
-            video_state = EventMesh.publish("get_video_state")
-            if open_power != None and open_power_off != None and video_state != None:
-                if open_power == 0 or open_power_off == 1 or video_state != 0:
-                    self.pwkey_timer.stop()
-                    self.pwkey_count = 0
-                    self.pwkey_press = 0
-                    self.led_state = 0
-                    self.pwKey_press_count=0
-                    return
-            '''KEY2:联动屏幕右下角或返回键长按关机'''
-            self.GPIO26_status = self.pwk_key26.read_level()
-
-            if self.pwkey_press == 1 :
-                self.pwkey_count += 1
-                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])#測量成功
-                    if self.pwkey_count >= 10*10:
-                        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
-                        # if EventMesh.publish("get_sim_Status") != 1:
-                        #     EventMesh.publish("open_power_on", 2)#
-                        # else:
-                        EventMesh.publish("open_power_on", 3)#
-                        return
-                    
-                    if self.pwkey_count >= 3*10 :
-                        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
-                            
-                    
-                if self.GPIO26_status == 1:#松开
-                    if self.pwkey_count >= 1: #防抖100ms
-                        # EventMesh.debug_log("self.GPIO26_status == 1")
-                        self.pwkey_timer.stop()
-                        self.pwkey_count = 0
-                        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判断
-
-        def  hsensorTest_timer_cb(self,e):
-            EventMesh.publish("system_sleep_rest")#防止黑屏 
-            w_data = EventMesh.publish(constants.EVENT.GET_WEAR)#佩戴数据
-            #EventMesh.debug_log("FactoryModeHsensorTest{}".format(data))
-        
-              
-        def publish_pwKey_timeout_cb_do(self, *args, **kwargs):
-            EventMesh.publish("publish_message_event_btnInfo",{"func":self.pwKey_timeout_cb,"data":0})  
-        
-        def pwKey_timeout_cb(self, data):#侧边按键
-            boot_count = EventMesh.publish("get_boot_time_count")
-
-            open_power = EventMesh.publish("get_power_on_state")#获取开机标识
-            open_power_off = EventMesh.publish("get_power_off_state")#获取开机标识
-            video_state = EventMesh.publish("get_video_state")
-            if open_power != None and open_power_off != None and video_state != None:
-                if open_power == 0 or open_power_off == 1 or video_state != 0:
-                    self.pwkey_timer.stop()
-                    self.pwkey_count = 0
-                    self.pwkey_press = 0
-                    self.led_state = 0
-                    self.pwKey_press_count=0
-                    return
-
-            if self.pwKey_press_count >= 1:
-                self.pwKey_press_count = 0
-                # flag = EventMesh.publish("get_call_state") 
-                # if flag != 2:#如果是电话拨出去或者不在打电话中都可以执行
-                #     EventMesh.publish("stop_led_timer")#设置参数
-                #     if flag == 1:#如果是sos电话拨出去
-                #         sos_flag = EventMesh.publish("get_sos_flag")
-                #         if sos_flag == 1:
-                #             EventMesh.publish("set_sos_flag",0)
-                #             EventMesh.publish("set_sos_num",0)
-                #             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 != 1:#在拨出去或者通话中就不播报入网成功的语音
-                #         EventMesh.publish("set_sim_mode")#
-                #     EventMesh.publish("dialing_out_event")#电话呼叫中voiceCall.callEnd()
-                
-                flag = EventMesh.publish("get_call_state") 
-                if flag != 2:
-                    EventMesh.publish("stop_led_timer")#设置参数
-                    EventMesh.publish("dialing_out_event")#电话呼叫中voiceCall.callEnd()
-
-                    if flag == 1:#如果是sos电话拨出去
-                        sos_flag = EventMesh.publish("get_sos_flag")
-                        if sos_flag == 1:
-                            EventMesh.publish("set_sos_state_out")
-                            EventMesh.publish("set_sos_flag",0)
-                            EventMesh.publish("set_sos_num",0)
-                            EventMesh.publish("set_hangup_mode",0)
-                    EventMesh.publish("close_hr_sop2")#
-                    flag = EventMesh.publish("get_call_state") 
-                    if flag != 1:
-                        EventMesh.publish("set_sim_mode")#
-            
-            self.pwKey_press_count = 0
-
-        def sosKey_extint_cb(self,args):
-            
-            power_off = EventMesh.publish("get_power_off_state")#获取关机标识
-            open_power = EventMesh.publish("get_power_on_state")#获取开机标识
-            if power_off != None and open_power != None:
-                if power_off == 1 or open_power == 0:
-                    return
-            self.sosKey_status = int(args[1])
-            if self.sosKey_status == 0:
-                self.sosKey_status = 1
-            else:
-                self.sosKey_status = 0
-                pass
-            get_video = EventMesh.publish("get_video_in_out_state")
-
-            self.WeChatKey_status = self.wechatKey.read_level()
-            self.GPIO26_status = self.pwk_key26.read_level()
-            self.KeyCall1_status = self.extint_19.read_level()
-            self.KeyCall2_status = self.extint_17.read_level()
-
-            # EventMesh.debug_log('sosKey_extint_cb ',args,self.sosKey_status,self.WeChatKey_status,self.KeyCall1_status,self.KeyCall2_status,self.GPIO26_status) # args[0]:gpio号 args[1]:上升沿或下降沿
-            if self.WeChatKey_status != 0 and self.GPIO26_status != 0 and self.KeyCall1_status != 0 and self.KeyCall2_status != 0:
-                if self.sosKey_status == 0:#按下
-                    if NEW_ENABLE == 0:#新的按键功能定义
-                        video_state = EventMesh.publish("get_video_state")
-                        if video_state != 0:#视频通话打入或者接听后允许挂断视频通话
-                            if video_state == 6 or get_video == 0:
-                                EventMesh.debug_log("sosKey_extint_cb",get_video,video_state)
-                                EventMesh.publish("video_dev_reject_cb",2)#挂断视频通话
-                                self.sosKey_press_count=0
-                                self.wechatKey_timer.stop()
-                                self.pwkey_timer.stop()
-                                self.sosKey_timer.stop()
-                                self.Keycall2_timer.stop()
-                                self.Keycall1_timer.stop()
-                                return
-                    EventMesh.publish("close_falldown_alarm_event")#关闭跌倒报警提醒事件
-                    EventMesh.publish("close_wechat_btn_timer")
-
-                    if self.sosKey_press == 0 :
-                        self.wechatKey_timer.stop()
-                        self.pwkey_timer.stop()
-                        self.sosKey_timer.stop()
-                        self.Keycall2_timer.stop()
-                        self.Keycall1_timer.stop()
-
-                        
-                        self.pwkey_count = 0
-                        self.pwkey_press = 0
-                        self.led_state = 0
-                        self.pwKey_press_count=0 #电源键
-
-
-                        self.wechatKey_count = 0
-                        self.wechatKey_press = 0
-                        self.wechat_state = 0
-                        self.wechatKey_press_count=0#微聊键
-
-
-                        self.sosKey_press = 1
-                        self.sosKey_long_press = 0
-                        self.sosKey_count = 0
-
-                        self.Keycall1_count = 0
-                        self.Keycall1_press = 0 
-                        self.Keycall1_long_press = 0
-                        self.Keycall1_press_count = 0
-                        
-                        self.Keycall2_count = 0
-                        self.Keycall2_press = 0 
-                        self.Keycall2_long_press = 0
-                        self.Keycall2_press_count = 0
-
-                        self.sosKey_timer.start(100, 1, self.publish_soskey_btn_event_cb)
-                        # self.sosKey_timer.start(100, 1, self.sosKey_press_cb)
-            # EventMesh.debug_log("key22_extint_cb:self.key22_timer.start!!!!\n")
-
-        def sosKey_press_cb(self, data):
-            '''KEY2:联动屏幕右下角或返回键长按关机'''
-            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:
-                    self.sosKey_timer.stop()
-                    self.sosKey_count = 0
-                    self.sosKey_press = 0
-                    self.sosKey_long_press = 0
-                    self.sosKey_press_count = 0
-                    return
-            self.sosKey_status = self.sosKey.read_level()
-            if self.sosKey_press == 1 :
-                # if self.sosKey_count <= 2:
-                    # if EventMesh.publish(constants.EVENT.GET_CONNECT) == 1:#未联网不需要录音
-                    #     EventMesh.publish("set_led_time_arg",[1000,200,1,led_mode.FLASH_LIGHT_GREEN,led_mode.DEFAULT_LONG_LIGHT_MODE,led_mode.OTHER_MEASURE_MODE])#设置参数
-                    # else:
-                    #     EventMesh.publish("set_led_time_arg",[1000,200,1,led_mode.FLASH_LIGHT_RED,led_mode.DEFAULT_LONG_LIGHT_MODE,led_mode.OTHER_MEASURE_MODE])#设置参数
-                self.sosKey_count += 1
-                if self.sosKey_count >= 10*3: #长按3s sos拨号
-                    flag = EventMesh.publish("get_call_state")#获取通话状态
-                    fall_down = EventMesh.publish("get_fall_down_state")#跌倒报警标识
-                    video_state = EventMesh.publish("get_video_state")#获取视频通话状态
-                    if fall_down != None and video_state != None:
-                        if fall_down != 0 or flag == 2 or video_state != 0:
-                            self.sosKey_count = 0
-                            self.sosKey_long_press = 0
-                            self.sosKey_press = 0
-                            self.sosKey_timer.stop()
-                            return
-                    if self.sosKey_long_press == 0:
-                        self.sosKey_long_press = 1
-                       
-                        EventMesh.publish_async("dial_sos_phone")#拨打sos号码
-                        return
-                    if self.sosKey_status == 1:#松开
-                        self.sosKey_count = 0
-                        self.sosKey_long_press = 0
-                        self.sosKey_press = 0
-                        self.sosKey_timer.stop()
-                        return
-
-                # EventMesh.debug_log("self.sosKey_count {}",self.sosKey_count)
-                if self.sosKey_status == 1:#松开
-                    if self.sosKey_count >= 1: #防抖100ms
-                        self.sosKey_timer.stop()
-                        self.sosKey_count = 0
-                        self.sosKey_press = 0
-                        self.sosKey_long_press = 0
-                        self.sosKey_press_count+=1
-                        self.sosKey_timer.start(500, 0, self.publish_sosKey_timeout_cb_do)#松手超时1s判断
-        def publish_sosKey_timeout_cb_do(self, *args, **kwargs):
-            EventMesh.publish("publish_message_event_btnInfo",{"func":self.sosKey_timeout_cb,"data":0})  
-        # 1、长按3秒以上,进行SOS拔号;
-        # 2、短按挂断来电或挂断视频通话,平时短按一下语音报时;
-        # 3、短按三下,发起视频通话(默认第一个)
-        # 4、短按六次,播报IMEI号
-        # 5、短按十次,解绑APP,同时恢复出厂设置
-        def close_factory_test(self):#关闭老化测试
-            if self.factoryTest_flag == 1:
-                self.factoryTest_flag = 0
-                close_led_white()
-                close_led_red()
-                close_led_green()
-                self.factoryTest_led_count = 0
-                self.aud.stopPlayStream()
-                self.factoryTest_timer.stop()
-                EventMesh.publish("close_motor_infor")
-
-        def factoryTest_timer_cb(self,e):
-            # self.factoryTest_count+=1
-            date_tmp = utime.localtime()
-            time_tmp = utime.mktime(date_tmp)
-            # print("time_tmp - self.factory_timesec :%d time_tmp:%d self.factory_timesec %d\r\n",time_tmp - self.factory_timesec,time_tmp,self.factory_timesec)
-            if time_tmp - self.factory_timesec > 60*60*2:
-            # if self.factoryTest_count > 60*60*2:#老化测试2小时自动退出
-            #     self.factoryTest_count = 0
-                self.close_factory_test()
-                return
-            #播放音频 
-            str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_ALARM_NEW"))
-            if EventMesh.publish("get_audio_state") == 0:
-                self.aud.montage_play('U:/static/audio.bin',1,1,str_data)
-            #led灯常亮
-            self.factoryTest_led_count+=1
-            if self.factoryTest_led_count == 1:#1  4 7  10 
-                open_led_red()
-                close_led_green()
-                close_led_white()
-            elif self.factoryTest_led_count == 2:
-                open_led_green()
-                close_led_red()
-                close_led_white()
-            elif self.factoryTest_led_count == 3: #3  6 9 12 
-                open_led_white()
-                close_led_red()
-                close_led_green()
-            if self.factoryTest_led_count >= 3+1:
-                self.factoryTest_led_count = 0
-
-            EventMesh.publish("set_motor_time",[1,2,10*1,10,5])#设置马达参数
-
-        def sosKey_timeout_cb(self, data):#
-            # print("sosKey_timeout_cb",self.sosKey_press_count)
-            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:
-                    self.sosKey_timer.stop()
-                    self.sosKey_count = 0
-                    self.sosKey_press = 0
-                    self.sosKey_long_press = 0
-                    self.sosKey_press_count = 0
-                    return
-            factory_count = EventMesh.publish("get_factory_test_time")
-            print("factory_count:%d",factory_count)
-            try :
-                if factory_count <= 30 :#开机30秒内按键次数大于15进入测试模式
-                    #EventMesh.debug_log("boot_count:{}".format(boot_count))
-                    if self.sosKey_press_count >= 15:
-                        self.factoryTest_timer.start(1000,1,self.factoryTest_timer_cb)
-                        self.sosKey_press_count = 0
-                        self.factoryTest_led_count = 0
-                        self.factoryTest_flag = 1
-                        date_tmp = utime.localtime()
-                        time_tmp = utime.mktime(date_tmp)
-                        self.factory_timesec = time_tmp
-                        return
-
-            except Exception as e:
-                usys.print_exception(e)
-
-            if NEW_ENABLE == 1:#旧的按键定义
-                # EventMesh.debug_log("sosKey_press_count!!!!!!!!!!!!!! ",self.sosKey_press_count)
-                flag = EventMesh.publish("get_call_state")#获取通话状态
-                fall_down = EventMesh.publish("get_fall_down_state")#跌倒报警标识
-                if self.sosKey_press_count > 1:#
-                    if fall_down != None:
-                        if fall_down != 0 or flag != 0:
-                            self.sosKey_press_count = 0
-                            return
-                if self.sosKey_press_count == 10:#
-                    self.sosKey_press_count = 0
-                    pass
-                elif self.sosKey_press_count == 6:#
-                    self.sosKey_press_count = 0
-                    self.close_factory_test()
-                    pass
-                elif self.sosKey_press_count == 5:#功能暂时屏蔽
-                    self.sosKey_press_count = 0
-                    call_state = EventMesh.publish("get_call_state")
-                    battery = EventMesh.publish("screen_get_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)#测量体温
-                    pass
-                elif self.sosKey_press_count == 4:#拨打app快捷号码
-                    self.sosKey_press_count = 0
-                    EventMesh.publish("stop_led_timer")#设置参数
-                    EventMesh.publish("play_center_phone")#拨打快捷号码
-                    # EventMesh.publish("call_phonebook_num",3)
-                    pass
-                elif self.sosKey_press_count == 3:#测试心率
-                    self.sosKey_press_count = 0
-                    
-                    call_state = EventMesh.publish("get_call_state")
-                    battery = EventMesh.publish("screen_get_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",1)#
-                    pass
-                elif self.sosKey_press_count == 2:#播报当前步数
-                    self.sosKey_press_count = 0
-                    EventMesh.publish("stop_led_timer")#设置参数
-                    EventMesh.publish("play_cur_step_event")#
-                    pass
-                elif self.sosKey_press_count == 1:#挂断来电 短语音播报
-                    self.sosKey_press_count = 0
-                    EventMesh.publish("stop_led_timer")#设置参数
-                    # EventMesh.publish("call_test_event")
-                    EventMesh.publish("sos_short_press")#sos短按事件
-                    
-                    pass
-                self.sosKey_press_count = 0
-            else:
-                # EventMesh.debug_log("sosKey_press_count!!!!!!!!!!!!!! ",self.sosKey_press_count)
-                flag = EventMesh.publish("get_call_state")#获取通话状态
-                fall_down = EventMesh.publish("get_fall_down_state")#跌倒报警标识
-                video_state = EventMesh.publish("get_video_state")#获取视频通话状态
-                
-                
-                if self.sosKey_press_count > 1:#短按十次解绑app
-                    if fall_down != None and video_state != None and flag != None:
-                        if fall_down != 0 or flag != 0 or video_state != 0:#获取视频通话状态:
-                            self.sosKey_press_count = 0
-                            return
-                if self.sosKey_press_count == 10:#
-                    self.sosKey_press_count = 0
-                    EventMesh.publish("stop_led_timer")#设置参数
-                    EventMesh.publish("open_power_on", 4)#恢复出厂
-                    pass
-                elif self.sosKey_press_count == 6:#播报IMEI号
-                    self.sosKey_press_count = 0
-                    self.close_factory_test()
-                    EventMesh.publish("stop_led_timer")#设置参数
-                    EventMesh.publish("play_imei_event")#播報imei号
-                    pass
-                elif self.sosKey_press_count == 5:#
-                    self.sosKey_press_count = 0
-                    # call_state = EventMesh.publish("get_call_state")
-                    # battery = EventMesh.publish("screen_get_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)#测量体温
-                    # pass
-                elif self.sosKey_press_count == 4:#
-                    self.sosKey_press_count = 0
-                    # EventMesh.publish("stop_led_timer")#设置参数
-                    # EventMesh.publish("play_center_phone")#拨打快捷号码
-                    # EventMesh.publish("call_phonebook_num",3)
-                    pass
-                elif self.sosKey_press_count == 3:#视频通话
-                    self.sosKey_press_count = 0
-                    call_state = EventMesh.publish("get_call_state")
-                    battery = EventMesh.publish("screen_get_battery")
-                    if call_state == None:
-                        call_state = 0
-                    if call_state == 0:
-                        flag = EventMesh.publish("get_call_state") 
-                        fall_down = EventMesh.publish("get_fall_down_state")#跌倒报警标识
-                        usb_state = EventMesh.publish("get_usb")#
-                        video_state = EventMesh.publish("get_video_state")
-                        if flag != 0  or fall_down != 0:
-                            return
-                        EventMesh.publish("stop_led_timer")#设置参数
-                        EventMesh.publish("call_viode_book_num")
-                    pass
-                elif self.sosKey_press_count == 2:#播报当前步数
-                    self.sosKey_press_count = 0
-                    # EventMesh.publish("stop_led_timer")#设置参数
-                    # EventMesh.publish("play_cur_step_event")#
-                    pass
-                elif self.sosKey_press_count == 1:#挂断来电 短语音播报
-                    self.sosKey_press_count = 0
-                    EventMesh.publish("stop_led_timer")#设置参数
-                    # EventMesh.publish("call_test_event")
-                    EventMesh.publish("sos_short_press")#sos短按事件
-                    
-                    pass
-                self.sosKey_press_count = 0
-
-
-        def wechatKey_extint_cb(self,args):
-            power_off = EventMesh.publish("get_power_off_state")#获取关机标识
-            open_power = EventMesh.publish("get_power_on_state")#获取开机标识
-            dev_app_mode = EventMesh.publish("get_dev_app_mode")
-            video_state = EventMesh.publish("get_video_state")#获取视频通话状态 5在通话状态不允许按键输入
-            get_video_state = EventMesh.publish("get_video_in_out_state")
-
-            if open_power != None and power_off != None and dev_app_mode != None:
-                if open_power == 0 or power_off == 1 or  (dev_app_mode == 1 and get_video_state != 0):
-                    return
-            fall_down = EventMesh.publish("get_fall_down_state")#跌倒报警标识
-            if fall_down != None:
-                if fall_down != 0:
-                    return
-            # EventMesh.txt_log('wechatKey_extint_cb :{}'.format(args))
-            self.WeChatKey_status = int(args[1])
-            if self.WeChatKey_status == 0:
-                self.WeChatKey_status = 1
-            else:
-                self.WeChatKey_status = 0
-                pass
-            if NEW_ENABLE == 0:#新的按键功能定义
-                if self.WeChatKey_status == 0:
-                    video_state = EventMesh.publish("get_video_state")
-                    if video_state != 0:#视频通话打入或者接听后允许挂断视频通话
-                        if video_state != 6:#6是app打手表需要接通
-                            # EventMesh.publish("video_dev_reject_cb",2)#挂断视频通话
-                            return
-                    
-            self.sosKey_status = self.sosKey.read_level()
-            self.GPIO26_status = self.pwk_key26.read_level()
-            self.KeyCall1_status = self.extint_19.read_level()
-            self.KeyCall2_status = self.extint_17.read_level()
-            # EventMesh.debug_log('wechatKey_extint_cb ',args,self.WeChatKey_status,self.sosKey_status,self.KeyCall1_status,self.KeyCall2_status,self.GPIO26_status) # args[0]:gpio号 args[1]:上升沿或下降沿
-            # if self.sosKey_status != 0 and self.GPIO26_status != 0:
-            if self.sosKey_status != 0 and self.GPIO26_status != 0 and self.KeyCall1_status != 0 and self.KeyCall2_status != 0:
-                if self.WeChatKey_status == 0:#按下
-                    video_state = EventMesh.publish("get_video_state")
-                    if video_state != 0:#视频通话打入或者接听后允许挂断视频通话
-                        if video_state != 6:#6是app打手表需要接通
-                            # EventMesh.publish("video_dev_reject_cb",2)#挂断视频通话
-                            # self.wechatKey_press_count = 0
-                            # self.wechatKey_timer.stop()
-                            # self.pwkey_timer.stop()
-                            # self.sosKey_timer.stop()
-                            # self.Keycall2_timer.stop()
-                            # self.Keycall1_timer.stop()
-                            return
-                    if self.wechatKey_press == 0:
-                        self.wechatKey_timer.stop()
-                        self.pwkey_timer.stop()
-                        self.sosKey_timer.stop()
-                        self.Keycall2_timer.stop()
-                        self.Keycall1_timer.stop()
-
-                        self.sosKey_press_count = 0
-                        self.sosKey_long_press = 0
-                        self.sosKey_press = 0
-                        self.sosKey_count = 0
-
-                        self.pwkey_press = 0
-                        self.pwkey_count = 0
-                        self.led_state = 0
-                        self.pwKey_press_count=0
-
-                        self.wechatKey_press = 1
-                        self.led_state = 0
-                        self.wechatKey_count = 0
-                        self.wechat_state = 0
-
-                        self.Keycall1_count = 0
-                        self.Keycall1_press = 0 
-                        self.Keycall1_long_press = 0
-                        self.Keycall1_press_count = 0
-                        
-                        self.Keycall2_count = 0
-                        self.Keycall2_press = 0 
-                        self.Keycall2_press_count = 0
-                        self.Keycall2_long_press = 0
-
-                        self.wechatKey_timer.start(100, 1, self.publish_wechat_btn_event_cb)
-                else:
-                    EventMesh.publish("close_wechat_btn_timer")
-
-        def close_wechat_btn_timer(self,event,*argc):
-            tmp = EventMesh.publish("get_wechat_time")#获取微聊时间戳
-            wechat_time = 0
-            time_tmp = 0
-            time_sec = 0
-
-            if tmp != None:
-                if tmp[0] == 1:
-                    self.wechatKey_timer.stop()
-                    self.wechatKey_count = 0
-                    self.wechatKey_press = 0
-                    self.wechatKey_press_count=0
-                    self.wechat_state = 0
-                    date_tmp = utime.localtime()
-                    time_tmp = utime.mktime(date_tmp)
-                    time_sec = tmp[1]
-                    wechat_time = time_tmp - time_sec
-                    # EventMesh.debug_log("close_btn_timer",time_tmp,time_sec,wechat_time)
-                    if wechat_time >= 15:
-                        wechat_time = 15
-                    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")#获取开机标识
-            video_state = EventMesh.publish("get_video_state")
-            if open_power != None and open_power_off != None:
-                if open_power == 0 or open_power_off == 1 :
-                    
-                    self.wechatKey_timer.stop()
-                    self.wechatKey_count = 0
-                    self.wechatKey_press = 0
-                    self.wechat_state = 0
-                    self.wechatKey_press_count=0
-                    return
-            self.WeChatKey_status = self.wechatKey.read_level()
-            wechat_time = 0
-            tmp = None
-            time_sec = 0
-            time_tmp = 0
-            date_tmp = utime.localtime()
-            time_tmp = utime.mktime(date_tmp)
-            '''KEY2:联动屏幕右下角或返回键长按关机'''
-            if self.wechatKey_press == 1 :#是否按下
-                tmp = EventMesh.publish("get_wechat_time")#获取微聊时间戳
-                self.wechatKey_count += 1
-                if self.wechatKey_count >= 15: #长按1s进入微聊录音
-                    flag = EventMesh.publish("get_call_state") 
-                    fall_down = EventMesh.publish("get_fall_down_state")#跌倒报警标识
-                    if flag != None:
-                        if flag == 0 and fall_down == 0 and video_state == 0:
-                            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
-                                else:
-                                    self.wechat_state = 0
-                                    self.wechatKey_timer.stop()
-                                    self.wechatKey_count = 0
-                                    self.wechatKey_press = 0
-                                    self.wechatKey_press_count=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)#发送录音文件内容
-                                                
-                                                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.wechat_state = 0
-                                        self.wechatKey_count = 0
-                                        self.wechatKey_press = 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
-                            return
-
-                if self.WeChatKey_status == 1:#松开
-                    if self.wechatKey_count >= 1: #防抖100ms
-                        # EventMesh.debug_log("WeChat time!!!!!!!!!!!!!!")
-                        self.wechatKey_timer.stop()
-                        self.wechatKey_count = 0
-                        self.wechatKey_press = 0
-                        self.wechat_state = 0
-                        self.wechatKey_press_count+=1
-                        self.wechatKey_timer.start(500, 0, self.publish_wechatKey_btn_event_cb)#松手超时1s判断
-
-        def publish_wechatKey_btn_event_cb(self, *args, **kwargs):
-            EventMesh.publish("publish_message_event_btnInfo",{"func":self.wechatKey_timeout_cb,"data":0})  
-
-        # 1、短按一下,播放最后收到的语音或接听电话,接听视频通话;短按一下,开始语音播报能否速度快一点,现在慢了体验感有点差
-        # 2、长按1.5秒后开始录音,松开按键后,发送录音至APP;
-        # 3、短按三次,拨打通信录号码三
-        # 4、短按四次,拨打通信录号码四
-        # 5、短按五次,拨打通信录号码五
-        # 6、短按六次,拨打通信录号码六
-        # 7、短按七次,拨打通信录号码七
-        # 8、短按八次,拨打通信录号码八
-    
-        def wechatKey_timeout_cb(self,data):#微聊键
-            open_power = EventMesh.publish("get_power_on_state")#获取开机标识
-            open_power_off = EventMesh.publish("get_power_off_state")#获取开机标识
-            video_state = EventMesh.publish("get_video_state")
-            if open_power != None and open_power_off != None:
-                if open_power == 0 or open_power_off == 1:
-                    self.wechatKey_timer.stop()
-                    self.wechatKey_count = 0
-                    self.wechatKey_press = 0
-                    self.wechat_state = 0
-                    self.wechatKey_press_count=0
-                    return
-            
-            if NEW_ENABLE == 1: #旧的按键定义微聊键
-                flag = EventMesh.publish("get_call_state")#在通话或者电话拨进 或者拨出不允许寻找设备
-                fall_down = EventMesh.publish("get_fall_down_state")#跌倒报警标识
-                if self.wechatKey_press_count > 1:#
-                    if fall_down != None:
-                        if fall_down != 0 or flag == 2:
-                            self.wechatKey_press_count = 0
-                            return
-                # EventMesh.debug_log("wechatKey_timeout_cb!!!!!!!!!!!!!! ",self.wechatKey_press_count)
-                if self.wechatKey_press_count == 10:#短按十次解绑app
-                    self.wechatKey_press_count = 0
-                    EventMesh.publish("stop_led_timer")#设置参数
-                    EventMesh.publish("open_power_on", 4)#恢复出厂
-                    pass
-                elif self.wechatKey_press_count == 6:#短按六次播报imei号
-                    self.wechatKey_press_count = 0
-                    EventMesh.publish("stop_led_timer")#设置参数
-                    EventMesh.publish("play_imei_event")#播報imei号
-                    pass
-                elif self.wechatKey_press_count == 4:#拨打通讯录号码三
-                    self.wechatKey_press_count = 0
-                    EventMesh.publish("stop_led_timer")#设置参数
-                    EventMesh.publish("call_phonebook_num",3)
-                    pass
-                elif self.wechatKey_press_count == 3:#拨打通讯录号码二
-                    self.wechatKey_press_count = 0
-                    EventMesh.publish("stop_led_timer")#设置参数
-                    EventMesh.publish("call_phonebook_num",2)
-                    pass
-                elif self.wechatKey_press_count == 2:#拨打通讯录号码一
-                    self.wechatKey_press_count = 0
-                    EventMesh.publish("stop_led_timer")#设置参数
-                    EventMesh.publish("call_phonebook_num",1)
-                    # EventMesh.publish("interup_call_event")#
-                    pass
-                elif self.wechatKey_press_count == 1:#播放最后收到的语音
-                    self.wechatKey_press_count = 0
-                    EventMesh.publish("stop_led_timer")#设置参数
-                    call_state = EventMesh.publish("get_call_state") 
-                    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号码
-                                return
-                    else:
-                        if call_state == 2:#电话拨进需要接听
-                            EventMesh.publish("answer_call_event")#接听电话
-                            return
-                    EventMesh.publish("play_wechat_last_amr")
-                    # pass
-                self.wechatKey_press_count = 0
-            else:
-                flag = EventMesh.publish("get_call_state")#在通话或者电话拨进 或者拨出不允许寻找设备
-                fall_down = EventMesh.publish("get_fall_down_state")#跌倒报警标识
-                if self.wechatKey_press_count > 1:#
-                    if fall_down != None and flag != None and video_state != None:
-                        if fall_down != 0 or flag != 0 or video_state != 0:
-                            self.wechatKey_press_count = 0
-                            return
-                # EventMesh.debug_log("wechatKey_timeout_cb!!!!!!!!!!!!!! ",self.wechatKey_press_count)
-                if self.wechatKey_press_count == 10:#短按十次解绑app
-                    self.wechatKey_press_count = 0
-                    # EventMesh.publish("stop_led_timer")#设置参数
-                    # EventMesh.publish("open_power_on", 4)#恢复出厂
-                    pass
-                elif self.wechatKey_press_count == 8:#拨打通讯录号码八
-                    self.wechatKey_press_count = 0
-                    EventMesh.publish("stop_led_timer")#设置参数
-                    EventMesh.publish("call_phonebook_num",8)
-                    pass
-                elif self.wechatKey_press_count == 7:#拨打通讯录号码七
-                    self.wechatKey_press_count = 0
-                    EventMesh.publish("stop_led_timer")#设置参数
-                    EventMesh.publish("call_phonebook_num",7)
-                    pass
-                elif self.wechatKey_press_count == 6:#拨打通讯录号码六
-                    self.wechatKey_press_count = 0
-                    EventMesh.publish("stop_led_timer")#设置参数
-                    EventMesh.publish("call_phonebook_num",6)
-                    pass
-                elif self.wechatKey_press_count == 5:#拨打通讯录号码五
-                    self.wechatKey_press_count = 0
-                    EventMesh.publish("stop_led_timer")#设置参数
-                    EventMesh.publish("call_phonebook_num",5)
-                    pass
-                elif self.wechatKey_press_count == 4:#拨打通讯录号码四
-                    self.wechatKey_press_count = 0
-                    EventMesh.publish("stop_led_timer")#设置参数
-                    EventMesh.publish("call_phonebook_num",4)
-                    pass
-                elif self.wechatKey_press_count == 3:#拨打通讯录号码三
-                    self.wechatKey_press_count = 0
-                    EventMesh.publish("stop_led_timer")#设置参数
-                    EventMesh.publish("call_phonebook_num",3)
-                    pass
-                elif self.wechatKey_press_count == 2:#拨打通讯录号码一
-                    self.wechatKey_press_count = 0
-                    # EventMesh.publish("stop_led_timer")#设置参数
-                    # EventMesh.publish("call_phonebook_num",1)
-                    # EventMesh.publish("interup_call_event")#
-                    pass
-                elif self.wechatKey_press_count == 1:#播放最后收到的语音
-                    self.wechatKey_press_count = 0
-                    EventMesh.publish("stop_led_timer")#设置参数
-                    video_state = EventMesh.publish("get_video_state") 
-                    # print("video_state call",video_state)
-                    if video_state != 0:
-                        if video_state == 6:#2 是app拨打手表 1 是手表打app 3 是正在视频通话中 0 关闭只有第一次视频通话打入才允许接听 接通之后不允许接听了
-                            EventMesh.publish("video_answer_cb")
-                        return
-                    call_state = EventMesh.publish("get_call_state") 
-                    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号码
-                                return
-                    else:
-                        if call_state == 2:#电话拨进需要接听
-                            EventMesh.publish("answer_call_event")#接听电话
-                            return
-                    EventMesh.publish("play_wechat_last_amr")
-                    # pass
-                self.wechatKey_press_count = 0
-            
-    
-
-
-        def pwk_press_cb(self, *args):
-            '''KEY2:联动屏幕右下角或返回键长按关机'''
-            if self.pwk_press == 1 :
-                
-                self.pwk_count += 1
-                EventMesh.debug_log("self.pwk_count {}",self.pwk_count)
-                if self.GPIO26_status == 1:#松开
-                    if self.pwk_count >= 1: #防抖100ms
-                        self.__pwk_timer.stop()
-                        self.pwk_count = 0
-                        self.pwk_press = 0
-                        EventMesh.debug_log("self.pwk_press_cb")
-
-                if self.pwk_count > (self.__PowerDownTimeOut//100): #长按
-                    self.__pwk_timer.stop()
-                    self.pwk_count = 0
-                    self.pwk_press = 0
-                    EventMesh.debug_log("btn8_long_press")
-
-        def __ui_callback(self, para):
-        # EventMesh.debug_log("para = {}".format(para))
-            if para == 0:
-                EventMesh.publish("done_left_to_right")
-                #EventMesh.debug_log("<-")
-            elif para == 1:
-                EventMesh.publish("done_right_to_left")
-                #EventMesh.debug_log("->")
-            elif para == 2:
-                EventMesh.publish("done_bottom_to_top")
-                #EventMesh.debug_log("^")
-            elif para == 3:
-                EventMesh.publish("done_top_to_bottom")
-                #EventMesh.debug_log("V")
-            elif para == 4:
-                EventMesh.publish("done_return")
-                #EventMesh.debug_log("return")
-            elif para == 5:
-                EventMesh.publish("done_click")
-                #EventMesh.debug_log("CLICK")
-            elif para == 6:
-                EventMesh.publish("done_press")
-                #EventMesh.debug_log("press")
-            elif (para == 6):
-                EventMesh.publish("done_error")
-                #EventMesh.debug_log("error")
-
-        def key_callback(self, l_list):
-            EventMesh.debug_log("key_callback:",str(l_list))
-            if l_list[0] == 1:
-                # 马达震动预留
-                pass
-            if (l_list[1] == 3) and (l_list[2] == 0):
-                if l_list[0] == 1:
-                    #self.pwk_press = 0
-                    EventMesh.publish("btn1_press")
-                else:
-                    pass
-                    # EventMesh.publish("btn1_press")
-
-
-
-
-        def powerKey_callback(self, status):
-            EventMesh.debug_log('==pwr:', status)# 0 1 0
-            self.powerKey_status = status
-            if self.pwk_press == 1: #按按钮时不处理
-                return
-        
-            
-                
-
-        def power_key_press_cb(self, *args):
-            pass
-            # if EventMesh.publish(constants.EVENT.GET_CONNECT) == 0:#未插卡的情况下强制关机
-                # EventMesh.publish("open_power_on", 2)#
-
-
-        def start(self):
-            self.post_processor_after_instantiation()
+from common import Abstract\r
+import machine\r
+import osTimer\r
+from misc import PowerKey\r
+import EventMesh\r
+from machine import Pin\r
+from machine import ExtInt\r
+import constants\r
+import utime\r
+import audio\r
+import ql_fs\r
+import ujson\r
+import voiceCall\r
+from misc import Power\r
+\r
+from machine import RTC\r
+from queue import Queue\r
+import _thread\r
+import usys\r
+import sms\r
+\r
+NEW_ENABLE = 0 #1代表旧的按键功能定义 0代表新的按键功能定义\r
+if EventMesh.model == "D15" :\r
+    from led_d15 import red_green_light,green_light_fast,led_mode,open_led_red,open_led_white,close_led_red,open_led_green,close_led_green,close_led_white\r
+\r
+    motor_pin = Pin(Pin.GPIO20, Pin.OUT, Pin.PULL_PD, 0)\r
+\r
+    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']\r
+\r
+\r
+    class call:\r
+        CALL_OUT = 1\r
+        CALL_IN = 2\r
+        ON_CALL = 3\r
+\r
+\r
+    class intervManager(Abstract):\r
+        def __init__(self):\r
+            self.timer = osTimer()\r
+\r
+            self.pwk_timer1 = osTimer()\r
+            self.pwk_timer2 = osTimer()\r
+            self.timer1 = osTimer()\r
+            self.sos_timer2 = osTimer()\r
+            self.sos_timer1 = osTimer()\r
+\r
+            self.sos_sendtime = osTimer()\r
+\r
+            self.fall_timer1 = osTimer()\r
+            self.fall_timer2 = osTimer()\r
+\r
+            self.alarm_timer1 = osTimer()\r
+\r
+            self.find_timer1 = osTimer()\r
+            self.fall_flag = 0\r
+\r
+            self.factory_timer = osTimer()\r
+            \r
+            self.restart_timer = osTimer()\r
+\r
+            self.aud = audio.Audio(0)\r
+            self.aud.set_pa(Pin.GPIO29)\r
+            self.aud.setVolume(11)\r
+            self.play_count = 0\r
+            self.count = 0\r
+\r
+            self.get_hr_state  = 0\r
+            self.get_spo2_state = 0\r
+            self.timeSec = 0\r
+            self.timeTempSec = 0\r
+\r
+            self.hr_value = 0\r
+            self.spo2_value = 0\r
+            self.temp_value = 0\r
+\r
+            self.usbState = 0\r
+\r
+            self.setp_old = 0\r
+            self.step_tmp = ""\r
+            self.step_num = 0\r
+            self.power_off = 0\r
+            self.call_state = 0\r
+\r
+            self.find_state = 0\r
+            self.FIND_timer_count = 0\r
+\r
+            self.old_hour = 0\r
+            self.alarm_state = 0\r
+            self.alarm_timer_count = 0\r
+            self.old_min = 0\r
+            self.interInfo_queue = Queue()\r
+            _thread.stack_size(10*1024+64)\r
+            _thread.start_new_thread(self.interInfo_queue_thread, ())\r
+            _thread.stack_size(8*1024)\r
+            EventMesh.subscribe("publish_message_event_interInfo",self.publish_message_event_interInfo)\r
+            \r
+\r
+            self.audio_event_queue = Queue()\r
+            _thread.stack_size(10*1024+128)\r
+            _thread.start_new_thread(self.audio_event_queue_thread, ())\r
+            _thread.stack_size(8*1024)\r
+            EventMesh.subscribe("publish_message_event_audio",self.publish_message_event_audio)\r
+\r
+            self.record_test = audio.Record()\r
+            self.record_test.gain_set(4,12)\r
+\r
+            self.timeSecond = 0\r
+            self.wechat_show = 0\r
+            self.sort_new = {}\r
+            self.time_min = 0\r
+            self.press_btn = 0\r
+            self.countdown_old = 0\r
+            self.set_unread_wechat = 0\r
+            self.updateTime = 0\r
+            \r
+            self.power_on_flag = 0\r
+\r
+            self.MXA_MSG = 1\r
+            self.wechat_recode_list = {"num":0}\r
+            self.wechat_num = 0\r
+            self.read_data = {}\r
+            self.volum_size = 8 \r
+            self.phone_num = ''\r
+            self.sos_phone_num = ''\r
+            self.msg_tmp = ""\r
+            self.time_count = 0\r
+            self.alarm_count = 0\r
+            self.audio_int = 0\r
+\r
+            self.hr_auto = 0\r
+\r
+            self.temp_auto = 0\r
+\r
+            self.video_count = 0\r
+\r
+            self.sos_state = 0\r
+\r
+            self.video_call_state = 0#视频通话拨进来还是拨出去的状态 1代表是正在拨进或者拨出去\r
+\r
+            self.video_call_in_mode = 0 #0是语音 1是视频通话\r
+            \r
+            check_txt = ql_fs.path_exists("/usr/static/storage_file/wechat_record.json")\r
+            if check_txt == True :\r
+                with open("/usr/static/storage_file/wechat_record.json","r") as fd:#音频文件编号\r
+                    self.wechat_recode_list = ujson.load(fd)\r
+                    if not self.wechat_recode_list:\r
+                        self.wechat_recode_list = {"num":0}\r
+                        self.wechat_num = 0\r
+            else:\r
+                self.wechat_recode_list = {"num":0}\r
+                with open("/usr/static/storage_file/wechat_record.json","w+",encoding="utf-8") as fd:\r
+                    ujson.dump(self.wechat_recode_list,fd)         \r
+\r
+\r
+        def post_processor_after_instantiation(self):\r
+            EventMesh.subscribe("open_power_on", self.open_power_on)#开机关机\r
+\r
+            EventMesh.subscribe("play_imei_event", self.play_imei_event)#播報imei号\r
+            EventMesh.subscribe("play_center_phone", self.play_center_phone)#拨打快捷号码\r
+            EventMesh.subscribe("play_cur_time_event", self.play_cur_time_event)#播放当前时间\r
+\r
+            EventMesh.subscribe("OPEN_FIND_WATCH", self.send_find_watch)#查找设备\r
+            EventMesh.subscribe("STOP_FIND_WATCH", self.stop_find_watch)#是否需要关闭查找设备\r
+            EventMesh.subscribe("close_timer_all", self.close_timer_all)#关闭相关定时器\r
+\r
+            EventMesh.subscribe("dial_sos_phone", self.dial_sos_phone)#长按3s拨打sos求助号码\r
+\r
+            EventMesh.subscribe("set_sim_mode", self.set_sim_mode)#sim检测\r
+\r
+            EventMesh.subscribe("close_hr_sop2", self.close_hr_sop2)#关闭健康测试\r
+            EventMesh.subscribe("set_manual_measure_mode", self.set_manual_measure_mode)#设置测试模式\r
+            EventMesh.subscribe("set_start_measure_time", self.set_start_measure_time)#设置开始测量的时间戳时间\r
+            EventMesh.subscribe("get_start_measure_time", self.get_start_measure_time)#获取开始测量的时间戳时间\r
+            EventMesh.subscribe("set_start_temp_measure_time", self.set_start_temp_measure_time)#设置体温开始测量的时间戳时间\r
+            EventMesh.subscribe("get_start_temp_measure_time", self.get_start_temp_measure_time)#获取体温开始测量的时间戳时间\r
+            EventMesh.subscribe("play_hr_value", self.play_hr_value)#播放心率数值\r
+            EventMesh.subscribe("play_spo2_value", self.play_spo2_value)#播放心率数值\r
+            EventMesh.subscribe("play_temp_value", self.play_temp_value)#播放体温数值\r
+\r
+            EventMesh.subscribe("play_sugar_value", self.play_sugar_value)#播放血糖数值\r
+\r
+            EventMesh.subscribe("play_battery_level_value", self.play_battery_level_value)\r
+\r
+\r
+            EventMesh.subscribe("set_usb", self.set_usb)#\r
+            EventMesh.subscribe("get_usb", self.get_usb)#\r
+\r
+            EventMesh.subscribe("play_cur_step_event", self.play_cur_step_event)#\r
+\r
+            EventMesh.subscribe("set_call_state", self.set_call_state)#1是 拨出去呼叫中 2是播进来 3 是正在通话中 0是无效\r
+            EventMesh.subscribe("get_call_state", self.get_call_state)#\r
+            EventMesh.subscribe("interup_call_event", self.interup_call_event)#\r
+            EventMesh.subscribe("answer_call_event", self.answer_call_event)#接听电话\r
+            EventMesh.subscribe("dialin_call_event", self.dialin_call_event)#电话拨进响铃\r
+            EventMesh.subscribe("dialing_out_event", self.dialing_out_event)#电话呼叫中\r
+            EventMesh.subscribe("call_test_event", self.call_test_event)#电话拨进响铃测试\r
+\r
+            EventMesh.subscribe("dial_out_call_center_cb", self.dial_out_call_center_cb)#电话拨出去\r
+            EventMesh.subscribe("sos_out_call_center_cb", self.sos_out_call_center_cb)#sos拨打\r
+\r
+            EventMesh.subscribe("close_audio_play", self.close_audio_play)#关闭音频\r
+\r
+            #视频通话\r
+            EventMesh.subscribe("video_call_in_event", self.video_call_in_event)#视频通话拨进中\r
+            EventMesh.subscribe("video_call_out_cb", self.video_call_out_cb)#视频通话拨进中\r
+            EventMesh.subscribe("video_waite_timer_cb", self.video_waite_timer_cb)#对方正在接听中\r
+\r
+            EventMesh.subscribe("video_answer_timer_cb", self.video_answer_timer_cb)#对方已接听\r
+            EventMesh.subscribe("video_answer_mode_timer_cb", self.video_answer_mode_timer_cb)#对方已接听\r
+\r
+            EventMesh.subscribe("dev_video_end_timer_cb", self.dev_video_end_timer_cb)#对方未接通挂断了\r
+\r
+            \r
+\r
+            EventMesh.subscribe("get_video_in_out_state", self.get_video_in_out_state)#获取拨进还是拨出的状态\r
+            EventMesh.subscribe("set_video_in_out_state", self.set_video_in_out_state)#清除标识\r
+            \r
+            \r
+            \r
+\r
+            EventMesh.subscribe("start_wechat_record", self.start_wechat_record)#手表开始录音\r
+            EventMesh.subscribe("send_wechat_record", self.send_wechat_record)#发送微聊语音文件to app\r
+            EventMesh.subscribe("play_wechat_last_amr", self.play_wechat_last_amr)#播放微聊语音最后一条语音文件\r
+            EventMesh.subscribe("get_wechat_data", self.get_wechat_data)\r
+            EventMesh.subscribe("set_wechat_data", self.set_wechat_data)\r
+            EventMesh.subscribe("play_unread_wechat_infor", self.play_unread_wechat_infor)#按键播放最近一条微聊语音\r
+            EventMesh.subscribe("set_unread_wechat_state", self.set_unread_wechat_state)#设置未读标识\r
+            EventMesh.subscribe("get_unread_wechat_state", self.get_unread_wechat_state)#获取未读标志\r
+            EventMesh.subscribe("get_wechat_time", self.get_wechat_time)#获取微聊时间戳\r
+            EventMesh.subscribe("get_wechat_state", self.get_wechat_state)#获取微聊时间戳\r
+\r
+\r
+            EventMesh.subscribe("get_power_on_state", self.get_power_on_state)#获取开机标识\r
+            EventMesh.subscribe("get_power_off_state", self.get_power_off_state)#获取关机标识\r
+\r
+            EventMesh.subscribe("play_audio_file", self.play_audio_file)#获取播放音频文件\r
+\r
+            EventMesh.subscribe("OPEN_ALARM_RING", self.send_alarm_ring)#闹钟到点响铃\r
+            EventMesh.subscribe("STOP_ALARM_RING", self.stop_alarm_ring)#是否需要关闭闹钟\r
+\r
+            EventMesh.subscribe("recv_wechat_audio", self.recv_wechat_audio)#\r
+\r
+\r
+            EventMesh.subscribe("sos_short_press", self.sos_short_press)#sos短按事件\r
+\r
+            EventMesh.subscribe("falldown_alarm_event", self.falldown_alarm_event)#跌倒报警\r
+\r
+            EventMesh.subscribe("close_falldown_alarm_event", self.close_falldown_alarm_event)#关闭跌倒报警\r
+\r
+            EventMesh.subscribe("drink_alarm_event", self.drink_alarm_event)#该喝水了\r
+\r
+            EventMesh.subscribe("medicine_alarm_event", self.medicine_alarm_event)#该吃药了\r
+\r
+            EventMesh.subscribe("wakeup_alarm_event", self.wakeup_alarm_event)#该起床了\r
+\r
+            EventMesh.subscribe("home_alarm_event", self.home_alarm_event)#该回家了\r
+\r
+            EventMesh.subscribe("sleep_alarm_event", self.sleep_alarm_event)#该睡觉了\r
+\r
+            EventMesh.subscribe("reset_alarm_event", self.reset_alarm_event)#该休息了\r
+\r
+            EventMesh.subscribe("reset_end_alarm_event", self.reset_end_alarm_event)#休息结束了\r
+\r
+            EventMesh.subscribe("get_fall_down_state", self.get_fall_down_state)#跌倒报警标识\r
+\r
+            EventMesh.subscribe("app_factory", self.app_factory)#app恢复出厂\r
+\r
+            EventMesh.subscribe("app_restart", self.app_restart)#远程重启\r
+\r
+            EventMesh.subscribe("get_sos_state_out", self.get_sos_state_out)#正在拨打sos电话\r
+\r
+            EventMesh.subscribe("set_sos_state_out", self.set_sos_state_out)#清除在拨打sos电话\r
+\r
+        def interInfo_queue_thread(self):\r
+            while True:\r
+                data = self.interInfo_queue.get()\r
+                #EventMesh.debug_log("interInfo_queue_thread:data = {}".format(data))\r
+                if data != None:\r
+                    try:\r
+                        data["func"](data["data"])\r
+                    except Exception as e:\r
+                        EventMesh.debug_log("interInfo_queue_thread:ERROR:{}".format(e))\r
+                        usys.print_exception(e)\r
+\r
+        def publish_message_event_interInfo(self,event,msg):\r
+            self.interInfo_queue.put(msg)\r
+\r
+        def publish_call_event_cb(self, *args, **kwargs):#拨打电话\r
+            EventMesh.publish("publish_message_event_interInfo",{"func":self.call_timer_cb,"data":0})\r
+\r
+        def publish_video_in_event_cb(self, *args, **kwargs):#视频通话拨入\r
+            EventMesh.publish("publish_message_event_interInfo",{"func":self.video_in_timer_cb,"data":0})  \r
+\r
+        def publish_video_out_event_cb(self, *args, **kwargs):#拨打视频通话\r
+            EventMesh.publish("publish_message_event_interInfo",{"func":self.video_out_timer_cb,"data":0})  \r
+\r
+        def publish_resatrt_down_event_cb(self, *args, **kwargs):#重启设备\r
+            EventMesh.publish("publish_message_event_interInfo",{"func":self.powe_resatrt_down_fun,"data":0})  \r
+        \r
+        def publish_power_down_event_cb(self, *args, **kwargs):#关机\r
+            EventMesh.publish("publish_message_event_interInfo",{"func":self.power_down_fun,"data":0})  \r
+\r
+        def publish_find_watch_event_cb(self, *args, **kwargs):#查找设备\r
+            EventMesh.publish("publish_message_event_interInfo",{"func":self.FIND_timer_cb,"data":0})  \r
+\r
+        def publish_alarm_ring_event_cb(self, *args, **kwargs):#闹钟响铃\r
+            EventMesh.publish("publish_message_event_interInfo",{"func":self.Alarm_timer_cb,"data":0})  \r
+\r
+        def publish_reset_alarm_ring_event_cb(self, *args, **kwargs):#休息响铃\r
+            EventMesh.publish("publish_message_event_interInfo",{"func":self.reset_alarm_event_cb,"data":0})  \r
+        \r
+        def publish_reset_end_alarm_ring_event_cb(self, *args, **kwargs):#休息结束响铃\r
+            EventMesh.publish("publish_message_event_interInfo",{"func":self.reset_end_alarm_event_cb,"data":0})  \r
+        \r
+        def publish_sleep_alarm_ring_event_cb(self, *args, **kwargs):#睡觉响铃\r
+            EventMesh.publish("publish_message_event_interInfo",{"func":self.sleep_alarm_event_cb,"data":0})  \r
+        \r
+        def publish_home_ring_event_cb(self, *args, **kwargs):#回家响铃\r
+            EventMesh.publish("publish_message_event_interInfo",{"func":self.home_alarm_event_cb,"data":0})  \r
+\r
+        def publish_wakeup_ring_event_cb(self, *args, **kwargs):#起床响铃\r
+            EventMesh.publish("publish_message_event_interInfo",{"func":self.wakeup_alarm_event_cb,"data":0})  \r
+\r
+        def publish_medicine_ring_event_cb(self, *args, **kwargs):#吃药响铃\r
+            EventMesh.publish("publish_message_event_interInfo",{"func":self.medicine_alarm_event_cb,"data":0})  \r
+\r
+        def publish_drink_ring_event_cb(self, *args, **kwargs):#喝水响铃\r
+            EventMesh.publish("publish_message_event_interInfo",{"func":self.drink_alarm_event_cb,"data":0})  \r
+\r
+        def publish_fall_done_ring_event_cb(self, *args, **kwargs):#跌倒提醒\r
+            EventMesh.publish("publish_message_event_interInfo",{"func":self.falldown_alarm_cb,"data":0})  \r
+\r
+\r
+        def reset_alarm_event(self,args,msg):#该休息了\r
+            wechat_state = EventMesh.publish("get_wechat_state")\r
+            video_state = EventMesh.publish("get_video_state")\r
+            if self.call_state == 0 and wechat_state == 0 and self.fall_flag == 0 and video_state == 0:\r
+                self.alarm_count = 0\r
+                self.alarm_timer1.start(2000, 1, self.publish_reset_alarm_ring_event_cb)\r
+                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_RESET_ALARM"))\r
+                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件\r
+        def reset_alarm_event_cb(self,args):#该休息了\r
+            wechat_state = EventMesh.publish("get_wechat_state")\r
+            video_state = EventMesh.publish("get_video_state")\r
+            if self.call_state == 0 and wechat_state == 0 and self.fall_flag == 0 and video_state == 0:\r
+                self.alarm_count += 1\r
+                if self.alarm_count >= 3:\r
+                    self.alarm_count = 0\r
+                    self.alarm_timer1.stop()\r
+                    return\r
+                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_RESET_ALARM"))\r
+                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件\r
+            else:\r
+                self.alarm_count = 0\r
+                self.alarm_timer1.stop()\r
+\r
+        def reset_end_alarm_event(self,args,msg):#休息结束了\r
+            wechat_state = EventMesh.publish("get_wechat_state")\r
+            video_state = EventMesh.publish("get_video_state")\r
+            if self.call_state == 0 and wechat_state == 0 and self.fall_flag == 0 and video_state == 0:\r
+                self.alarm_count = 0\r
+                self.alarm_timer1.start(2000, 1, self.reset_end_alarm_event_cb)\r
+                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_RESET_END_ALARM"))\r
+                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件\r
+        \r
+        def reset_end_alarm_event_cb(self,args):#休息结束了\r
+            wechat_state = EventMesh.publish("get_wechat_state")\r
+            video_state = EventMesh.publish("get_video_state")\r
+            if self.call_state == 0 and wechat_state == 0 and self.fall_flag == 0 and video_state == 0:\r
+                self.alarm_count += 1\r
+                if self.alarm_count >= 3:\r
+                    self.alarm_count = 0\r
+                    self.alarm_timer1.stop()\r
+                    return\r
+                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_RESET_END_ALARM"))\r
+                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件\r
+            else:\r
+                self.alarm_count = 0\r
+                self.alarm_timer1.stop()\r
+        \r
+        def sleep_alarm_event(self,args,msg):#该睡觉了\r
+            wechat_state = EventMesh.publish("get_wechat_state")\r
+            video_state = EventMesh.publish("get_video_state")\r
+            if self.call_state == 0 and wechat_state == 0 and self.fall_flag == 0 and video_state == 0:\r
+                self.alarm_count = 0\r
+                self.alarm_timer1.start(2000, 1, self.publish_sleep_alarm_ring_event_cb)\r
+                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_SLEEP_ALARM"))\r
+                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件\r
+        def sleep_alarm_event_cb(self,args):#该睡觉了\r
+            wechat_state = EventMesh.publish("get_wechat_state")\r
+            video_state = EventMesh.publish("get_video_state")\r
+            if self.call_state == 0 and wechat_state == 0 and self.fall_flag == 0 and video_state == 0:\r
+                self.alarm_count += 1\r
+                if self.alarm_count >= 3:\r
+                    self.alarm_count = 0\r
+                    self.alarm_timer1.stop()\r
+                    return\r
+                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_SLEEP_ALARM"))\r
+                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件\r
+            else:\r
+                self.alarm_count = 0\r
+                self.alarm_timer1.stop()\r
+\r
+\r
+        def home_alarm_event(self,args,msg):#该回家了\r
+            wechat_state = EventMesh.publish("get_wechat_state")\r
+            video_state = EventMesh.publish("get_video_state")\r
+            if self.call_state == 0 and wechat_state == 0 and self.fall_flag == 0 and video_state == 0:\r
+                self.alarm_count = 0\r
+                self.alarm_timer1.start(2000, 1, self.publish_home_ring_event_cb)\r
+                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_HOME_ALARM"))\r
+                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件\r
+        \r
+        def home_alarm_event_cb(self,args):#该回家了\r
+            wechat_state = EventMesh.publish("get_wechat_state")\r
+            video_state = EventMesh.publish("get_video_state")\r
+            if self.call_state == 0 and wechat_state == 0 and self.fall_flag == 0 and video_state == 0:\r
+                self.alarm_count += 1\r
+                if self.alarm_count >= 3:\r
+                    self.alarm_count = 0\r
+                    self.alarm_timer1.stop()\r
+                    return\r
+                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_HOME_ALARM"))\r
+                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件\r
+            else:\r
+                self.alarm_count = 0\r
+                self.alarm_timer1.stop()\r
+        \r
+        def wakeup_alarm_event(self,args,msg):#该起床了\r
+            wechat_state = EventMesh.publish("get_wechat_state")\r
+            video_state = EventMesh.publish("get_video_state")\r
+            if self.call_state == 0 and wechat_state == 0 and self.fall_flag == 0 and video_state == 0:\r
+                self.alarm_count = 0\r
+                self.alarm_timer1.start(2000, 1, self.publish_wakeup_ring_event_cb)\r
+                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_WAKEUP_ALARM"))\r
+                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件\r
+        \r
+        def wakeup_alarm_event_cb(self,args):#该起床了\r
+            wechat_state = EventMesh.publish("get_wechat_state")\r
+            video_state = EventMesh.publish("get_video_state")\r
+            if self.call_state == 0 and wechat_state == 0 and self.fall_flag == 0 and video_state == 0:\r
+                self.alarm_count += 1\r
+                if self.alarm_count >= 3:\r
+                    self.alarm_count = 0\r
+                    self.alarm_timer1.stop()\r
+                    return\r
+                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_WAKEUP_ALARM"))\r
+                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件\r
+            else:\r
+                self.alarm_count = 0\r
+                self.alarm_timer1.stop()\r
+\r
+\r
+        def medicine_alarm_event(self,args,msg):#该吃药了\r
+            wechat_state = EventMesh.publish("get_wechat_state")\r
+            video_state = EventMesh.publish("get_video_state")\r
+            if self.call_state == 0 and wechat_state == 0 and self.fall_flag == 0 and video_state == 0:\r
+                self.alarm_count = 0\r
+                self.alarm_timer1.start(2000, 1, self.publish_medicine_ring_event_cb)\r
+                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_MEDICINE_ALARM"))\r
+                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件\r
+\r
+        def medicine_alarm_event_cb(self,args):#该吃药了\r
+            wechat_state = EventMesh.publish("get_wechat_state")\r
+            video_state = EventMesh.publish("get_video_state")\r
+            if self.call_state == 0 and wechat_state == 0 and self.fall_flag == 0 and video_state == 0:\r
+                self.alarm_count += 1\r
+                if self.alarm_count >= 3:\r
+                    self.alarm_count = 0\r
+                    self.alarm_timer1.stop()\r
+                    return\r
+                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_MEDICINE_ALARM"))\r
+                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件\r
+            else:\r
+                self.alarm_count = 0\r
+                self.alarm_timer1.stop()\r
+\r
+        def drink_alarm_event(self,args,msg):#该喝水了\r
+            wechat_state = EventMesh.publish("get_wechat_state")\r
+            video_state = EventMesh.publish("get_video_state")\r
+            if self.call_state == 0 and wechat_state == 0 and self.fall_flag == 0 and video_state == 0:\r
+                self.alarm_count = 0\r
+                self.alarm_timer1.start(2000, 1, self.publish_drink_ring_event_cb)\r
+                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_DRINK_ALARM"))\r
+                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件\r
+            \r
+\r
+\r
+        def drink_alarm_event_cb(self,args):#该喝水了\r
+            wechat_state = EventMesh.publish("get_wechat_state")\r
+            video_state = EventMesh.publish("get_video_state")\r
+            if self.call_state == 0 and wechat_state == 0 and self.fall_flag == 0 and video_state == 0:\r
+                self.alarm_count += 1# 1 2 \r
+                if self.alarm_count >= 3:\r
+                    self.alarm_count = 0\r
+                    self.alarm_timer1.stop()\r
+                    return\r
+                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_DRINK_ALARM"))\r
+                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件\r
+            else:\r
+                self.alarm_count = 0\r
+                self.alarm_timer1.stop()\r
+            \r
+        def falldown_alarm_event(self,args,msg):#跌倒报警启动中提示\r
+            flag = EventMesh.publish("get_call_state")#在通话或者电话拨进 或者拨出不允许寻找设备\r
+            wechat_state = EventMesh.publish("get_wechat_state")\r
+            video_state = EventMesh.publish("get_video_state")\r
+            if flag == 0 and wechat_state == 0 and video_state == 0:\r
+                EventMesh.publish("close_timer_all")#\r
+                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_FALL_ALARM"))\r
+                self.time_count = 0\r
+                self.fall_flag = 0\r
+                self.fall_timer1.stop()\r
+                self.fall_flag = 1\r
+                self.fall_timer1.start(4000, 1, self.publish_fall_done_ring_event_cb)\r
+                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件\r
+\r
+        def falldown_alarm_cb(self,*args):\r
+            wechat_state = EventMesh.publish("get_wechat_state")\r
+            flag = EventMesh.publish("get_call_state")#在通话或者电话拨进 或者拨出不允许寻找设备\r
+            video_state = EventMesh.publish("get_video_state")\r
+            if flag == 0 and self.call_state == 0 and wechat_state == 0 and video_state == 0:\r
+                self.time_count+=1\r
+                if self.time_count >= 5:\r
+                    self.time_count = 0\r
+                    self.fall_timer1.stop()\r
+                    EventMesh.publish_async("dial_sos_phone")#拨打sos号码\r
+                    return\r
+                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_FALL_ALARM"))\r
+                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件\r
+            else:\r
+                self.time_count = 0\r
+                self.fall_timer1.stop()\r
+        \r
+        def close_falldown_alarm_event(self,event,msg):#跌倒挂断挂断\r
+            if self.fall_flag == 1:#跌倒标志\r
+                self.fall_flag = 0\r
+                self.fall_timer1.stop()\r
+                self.sos_timer1.stop()\r
+                self.sos_timer2.stop()\r
+                if self.call_state != 0:\r
+                    self.call_state = 0\r
+                    voiceCall.callEnd()\r
+                sos_flag = EventMesh.publish("get_sos_flag")\r
+                if sos_flag == 1:\r
+                    self.call_state = 0\r
+                    EventMesh.publish("set_sos_state_out")\r
+                    EventMesh.publish("set_sos_flag",0)\r
+                    EventMesh.publish("set_sos_num",0)\r
+                    EventMesh.publish("set_hangup_mode",0)\r
+\r
+        \r
+\r
+        def send_find_watch(self, event, msg): #发送查找设备指令\r
+            open_power = EventMesh.publish("get_power_on_state")#获取开机标识\r
+            if open_power != None:\r
+                if open_power == 0:\r
+                    return\r
+            power_off = EventMesh.publish("get_power_off_state")#获取开机标识\r
+            if power_off != None:\r
+                if power_off == 1:\r
+                    return\r
+            flag = EventMesh.publish("get_call_state")#在通话或者电话拨进 或者拨出不允许寻找设备\r
+            wechat_state = EventMesh.publish("get_wechat_state")\r
+            video_state = EventMesh.publish("get_video_state")\r
+            if flag == 0 and wechat_state == 0 and self.fall_flag == 0 and video_state == 0: \r
+                EventMesh.publish("close_timer_all")#\r
+                self.find_state = 1\r
+                self.FIND_timer_count = 0\r
+                self.alarm_timer1.start(3000,1,self.publish_find_watch_event_cb)\r
+                EventMesh.publish("set_led_time_arg",[1,1,330,led_mode.LONG_LIGHT_GREEN,2,1,led_mode.OTHER_MEASURE_MODE])#測量成功\r
+                # 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])#设置参数\r
+                str_data = 'mp3files={}.mp3'.format(audio_buf.index("audio_find_haixiu"))\r
+                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+                EventMesh.publish("set_motor_time",[1,2,8*3,8,4])#设置马达参数\r
+\r
+        def stop_find_watch(self, event, msg): \r
+            if self.find_state == 1:\r
+                self.find_state = 0\r
+                self.FIND_timer_count = 0\r
+                # EventMesh.publish("stop_led_timer")#设置参数\r
+                self.aud.stopPlayStream()  #播放声音 \r
+                self.alarm_timer1.stop()\r
+                EventMesh.publish("close_motor_infor")#关闭马达和定时器\r
+\r
+        def FIND_timer_cb(self, data):\r
+            flag = EventMesh.publish("get_call_state")#在通话或者电话拨进 或者拨出不允许寻找设备\r
+            wechat_state = EventMesh.publish("get_wechat_state")\r
+            video_state = EventMesh.publish("get_video_state")\r
+            if flag == 0 and wechat_state == 0 and self.fall_flag == 0 and video_state == 0:\r
+                if self.find_state == 1:\r
+                    # EventMesh.debug_log("self.FIND_timer_count:{}".format(self.FIND_timer_count))\r
+                    str_data = 'mp3files={}.mp3'.format(audio_buf.index("audio_find_haixiu"))\r
+                    EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+                    #EventMesh.publish("set_motor_time",[1,2,8*2,8,4])#设置马达参数\r
+                    self.FIND_timer_count += 1\r
+                    if self.FIND_timer_count > 10: #120秒30s\r
+                        EventMesh.publish("STOP_FIND_WATCH")\r
+            else:\r
+                self.FIND_timer_count = 0\r
+                self.alarm_timer1.stop()\r
+                \r
+        \r
+        def stop_FIND(self) :\r
+            self.alarm_timer1.stop()\r
+\r
+        def send_alarm_ring(self, event, msg): #发送查找设备指令\r
+            open_power = EventMesh.publish("get_power_on_state")#获取开机标识\r
+            if open_power != None:\r
+                if open_power == 0:\r
+                    return\r
+            power_off = EventMesh.publish("get_power_off_state")#获取开机标识\r
+            if power_off != None:\r
+                if power_off == 1:\r
+                    return\r
+            flag = EventMesh.publish("get_call_state")#在通话或者电话拨进 或者拨出不允许寻找设备\r
+            wechat_state = EventMesh.publish("get_wechat_state")\r
+            video_state = EventMesh.publish("get_video_state")\r
+            if flag == 0 and wechat_state == 0 and self.fall_flag == 0 and video_state == 0 :\r
+                EventMesh.publish("close_timer_all")#\r
+                self.alarm_state = 1\r
+                self.alarm_timer_count = 0\r
+                self.alarm_timer1.start(3000,1,self.publish_alarm_ring_event_cb)\r
+                # EventMesh.publish("set_led_time_arg",[1,1,330,led_mode.LONG_LIGHT_GREEN,2,1,led_mode.OTHER_MEASURE_MODE])#測量成功\r
+                # 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])#设置参数\r
+                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_ALARM_NEW"))\r
+                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+        \r
+        def stop_alarm_ring(self, event, msg): #停止闹钟响铃\r
+            if self.alarm_state == 1:\r
+                self.alarm_state = 0\r
+                self.alarm_timer_count = 0\r
+                # EventMesh.publish("stop_led_timer")#设置参数\r
+                self.aud.stopPlayStream()  #停止播放\r
+                self.alarm_timer1.stop()\r
+\r
+        def Alarm_timer_cb(self, data):\r
+            flag = EventMesh.publish("get_call_state")#在通话或者电话拨进 或者拨出不允许寻找设备\r
+            wechat_state = EventMesh.publish("get_wechat_state")\r
+            video_state = EventMesh.publish("get_video_state")\r
+            if flag == 0 and wechat_state == 0 and self.fall_flag == 0 and video_state == 0:\r
+                if self.alarm_state == 1:\r
+                    # EventMesh.debug_log("self.alarm_timer_count:{}".format(self.alarm_timer_count))\r
+                    str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_ALARM_NEW"))\r
+                    EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+                    self.alarm_timer_count += 1\r
+                    if self.alarm_timer_count > 15: #120秒30s\r
+                        EventMesh.publish("STOP_ALARM_RING")\r
+            else:\r
+                self.alarm_timer_count = 0\r
+                self.alarm_timer1.stop()\r
+\r
+        def get_fall_down_state(self,event,msg):\r
+            return self.fall_flag\r
+\r
+        def sos_short_press(self,args,msg):\r
+            EventMesh.publish("interup_call_event")#如果在电话中强制挂断电话\r
+            EventMesh.publish("close_audio_play")#强制关闭音频文件播放\r
+            EventMesh.publish("STOP_FIND_WATCH")#停止查找设备\r
+            EventMesh.publish("STOP_ALARM_RING")#停止闹钟响铃\r
+            if NEW_ENABLE == 0:#新的按键功能定义\r
+                video_state = EventMesh.publish("get_video_state")\r
+                if video_state != 0:#视频通话打入或者接听后允许挂断视频通话\r
+                    EventMesh.publish("video_dev_reject_cb",2)#挂断视频通话\r
+                    return\r
+            EventMesh.publish("play_cur_time_event")#播报当前时间\r
+            #播报当前时间\r
+\r
+        def recv_wechat_audio(self,event,str_data):#接收微聊语音播放\r
+            wechat_state = EventMesh.publish("get_wechat_state")\r
+            video_state = EventMesh.publish("get_video_state")\r
+            if self.call_state == 0 and self.fall_flag == 0 and wechat_state == 0 and self.fall_flag == 0 and video_state == 0: \r
+                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_WECHAT_RECV"))\r
+                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件\r
+                EventMesh.publish("set_motor_time",[1,2,10*3,10,5])#设置马达参数\r
+\r
+\r
+\r
+        def audio_event_queue_thread(self):\r
+            while True:\r
+                data = self.audio_event_queue.get()\r
+                #EventMesh.debug_log("audio_event_queue:data = {}".format(data))\r
+                if data != None:\r
+                    try:\r
+                        data["func"](data["data"])\r
+                    except Exception as e:\r
+                        EventMesh.debug_log("audio_event_queue:ERROR:{}".format(e))\r
+                        usys.print_exception(e)\r
+        def publish_message_event_audio(self,event,msg):\r
+            self.audio_event_queue.put(msg)\r
+\r
+        def play_audio_file(self, *args, **kwargs):#播放音频文件\r
+            # EventMesh.debug_log("args",args)\r
+            # EventMesh.publish("publish_message_event_audio",{"func":self.play_audio_file_do,"data":args[1]})  \r
+            data = args[1]\r
+            self.play_audio_file_do(data)\r
+\r
+        def play_audio_file_do(self,data):#msg 拼接的路径文件\r
+            open_power = EventMesh.publish("get_power_on_state")#获取开机标识\r
+            power_off = EventMesh.publish("get_power_off_state")#获取开机标识\r
+            # EventMesh.debug_log("play_audio_file",data[0],data[1],open_power,power_off)#路径 str_data[1] 是否需要被打断\r
+            if open_power != None:\r
+                if open_power == 0:\r
+                    return\r
+            if power_off != None:\r
+                if power_off == 1:\r
+                    return\r
+            self.aud.stopPlayStream()\r
+            self.aud.montage_play('U:/static/audio.bin',1,data[1],data[0])\r
+            # EventMesh.debug_log("play_audio_file end",data[0],data[1])#路径 str_data[1] 是否需要被打断\r
+            \r
+\r
+\r
+\r
+\r
+        def powe_resatrt_down_fun(self, *args):#重启设备\r
+            EventMesh.publish("close_led_pin")\r
+            self.aud.stopPlayStream()\r
+            Power.powerRestart()\r
+\r
+\r
+        def power_down_fun(self, *args):\r
+            EventMesh.publish("close_led_pin")\r
+            self.aud.stopPlayStream()\r
+            Power.powerDown()\r
+\r
+\r
+\r
+        def close_audio_play(self, event, msg): #msg\r
+            open_power = EventMesh.publish("get_power_on_state")#获取开机标识\r
+            power_off = EventMesh.publish("get_power_off_state")#获取开机标识\r
+            if open_power != None:\r
+                if open_power == 0:\r
+                    return\r
+            if power_off != None:\r
+                if power_off == 1:\r
+                    return\r
+            self.aud.stopPlayStream()\r
+\r
+\r
+\r
+        def close_timer_all(self, event, msg): \r
+            # EventMesh.debug_log("close_timer_all!!!!!!!!!!!!!!!!!!!")\r
+            open_power = EventMesh.publish("get_power_on_state")#获取开机标识\r
+            power_off = EventMesh.publish("get_power_off_state")#获取开机标识\r
+            if open_power != None:\r
+                if open_power == 0:\r
+                    return\r
+            if power_off != None:\r
+                if power_off == 1:\r
+                    return\r
+                \r
+            self.aud.stopPlayStream()\r
+            self.timer.stop()\r
+            self.sos_timer2.stop()\r
+            self.sos_timer1.stop()\r
+            self.fall_flag = 0\r
+            self.fall_timer1.stop()\r
+            self.alarm_timer1.stop()\r
+        \r
+\r
+        def answer_call_event(self, event, msg): #\r
+            if self.call_state == 2:\r
+                sos_flag = EventMesh.publish("get_sos_flag")\r
+                if sos_flag == 1:\r
+                    self.call_state = 0\r
+                    EventMesh.publish("set_sos_state_out")\r
+                    EventMesh.publish("set_sos_flag",0)\r
+                    EventMesh.publish("set_sos_num",0)\r
+                    EventMesh.publish("set_hangup_mode",0)\r
+                EventMesh.publish("close_timer_all")#\r
+                voiceCall.callAnswer()\r
+\r
+        def set_call_state(self, event, msg): #\r
+            self.call_state = msg\r
+\r
+\r
+        def video_call_in_event(self, event, msg):#视频通话拨入\r
+            open_power = EventMesh.publish("get_power_on_state")#获取开机标识\r
+            power_off = EventMesh.publish("get_power_off_state")#获取关机标识\r
+            if open_power != None and power_off != None:\r
+                if open_power == 0 or power_off == 1:\r
+                    return\r
+            EventMesh.publish("close_timer_all")#\r
+            EventMesh.publish("close_wechat_btn_timer")#\r
+            EventMesh.publish("set_led_time_arg",[1,2,10*2,led_mode.FLASH_LIGHT_RED,10,5,led_mode.VIDEO_MEASURE_MODE])#測量成功\r
+            self.video_call_state = 1\r
+            self.video_count=0\r
+            self.video_call_in_mode = msg\r
+            EventMesh.publish("clear_video_timer_state")\r
+            EventMesh.publish("set_app_dev_end_state")\r
+            print("voice in!!!",msg,self.video_call_in_mode)\r
+            if self.video_call_in_mode == 0:\r
+                \r
+                self.timer.start(2000, 1, self.publish_video_in_event_cb)\r
+                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_VIDEO_VOICE_IN"))\r
+                EventMesh.publish("play_audio_file",[str_data,0])#获取播放音频文件\r
+            else:\r
+                self.timer.start(2000, 1, self.publish_video_in_event_cb)\r
+                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_VIDEO_CALL_IN"))\r
+                EventMesh.publish("play_audio_file",[str_data,0])#获取播放音频文件\r
+            # EventMesh.publish("play_audio_file",str_data)#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+            EventMesh.publish("set_motor_time",[1,2,10*3,10,5])#设置马达参数\r
+        def video_in_timer_cb(self,data):\r
+\r
+            open_power = EventMesh.publish("get_power_on_state")#获取开机标识\r
+            power_off = EventMesh.publish("get_power_off_state")#获取关机标识\r
+            if open_power != None and power_off != None:\r
+                if open_power == 0 or power_off == 1:\r
+                    return\r
+            \r
+            video_state = EventMesh.publish("get_video_state")\r
+            # print("video_state",video_state)\r
+            \r
+            self.video_count+=1\r
+            if self.video_count >= 30 or video_state == 0:#一分钟挂断视频通话\r
+                EventMesh.publish("video_newwork_reject_cb",None)#挂断视频通话\r
+                self.video_call_state = 0\r
+                self.video_count=0\r
+                self.timer.stop()\r
+                return\r
+            if video_state != 6 or self.video_call_state == 0:#视频电话呼入\r
+                EventMesh.publish("stop_led_timer")#设置参数\r
+                EventMesh.publish("close_timer_all")#\r
+                return\r
+            if self.video_call_in_mode == 0:\r
+                EventMesh.publish("set_led_time_arg",[1,2,10*2,led_mode.FLASH_LIGHT_RED,10,5,led_mode.VIDEO_MEASURE_MODE])#\r
+                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_VIDEO_VOICE_IN"))\r
+                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件\r
+            else:\r
+                EventMesh.publish("set_led_time_arg",[1,2,10*2,led_mode.FLASH_LIGHT_RED,10,5,led_mode.VIDEO_MEASURE_MODE])#\r
+                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_VIDEO_CALL_IN"))\r
+                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件\r
+\r
+        def video_call_out_cb(self, event, msg):#视频通话拨出\r
+            open_power = EventMesh.publish("get_power_on_state")#获取开机标识\r
+            power_off = EventMesh.publish("get_power_off_state")#获取关机标识\r
+            if open_power != None and power_off != None:\r
+                if open_power == 0 or power_off == 1:\r
+                    return\r
+            EventMesh.publish("close_timer_all")#\r
+            EventMesh.publish("close_wechat_btn_timer")#\r
+            # EventMesh.publish("set_led_time_arg",[1,2,10*10,led_mode.FLASH_LIGHT_RED,10,5,led_mode.OTHER_MEASURE_MODE])#\r
+            EventMesh.publish("clear_video_timer_state")\r
+            EventMesh.publish("set_app_dev_end_state")\r
+            if msg != None:\r
+                self.video_count = 0\r
+                self.video_call_state = 1\r
+                self.timer.start(2000, 1, self.publish_video_out_event_cb)\r
+                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_VIDEO_WAITING"))\r
+                EventMesh.publish("play_audio_file",[str_data,0])#获取播放音频文件\r
+            else:\r
+                self.video_call_state = 0\r
+                self.video_count=0\r
+                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_NO_SET_VIDOE"))\r
+                EventMesh.publish("play_audio_file",[str_data,0])#获取播放音频文件\r
+                pass\r
+        \r
+        def video_out_timer_cb(self,data):\r
+\r
+            open_power = EventMesh.publish("get_power_on_state")#获取开机标识\r
+            power_off = EventMesh.publish("get_power_off_state")#获取关机标识\r
+            if open_power != None and power_off != None:\r
+                if open_power == 0 or power_off == 1 :\r
+                    return\r
+            video_state = EventMesh.publish("get_video_state")#加入中\r
+            # print("video_out_timer_cb video_state",video_state)\r
+            \r
+            self.video_count+=1\r
+            if self.video_count >= 30 or video_state == 0:#40s挂断视频通话 对方无响应\r
+                self.timer.stop()\r
+                EventMesh.publish("video_newwork_reject_cb",None)#挂断视频通话\r
+                self.video_call_state = 0\r
+                self.video_count = 0\r
+                \r
+                return\r
+            if video_state == 4 or self.video_call_state == 0:#视频电话呼出 如果接通了就不需要了\r
+                self.video_call_state = 0\r
+                self.video_count=0\r
+                print("video calling")\r
+                EventMesh.publish("stop_led_timer")#设置参数\r
+                EventMesh.publish("close_timer_all")#\r
+                return\r
+            \r
+\r
+            # EventMesh.publish("set_led_time_arg",[1,2,10*10,led_mode.FLASH_LIGHT_RED,10,5,led_mode.OTHER_MEASURE_MODE])#測量成功\r
+            str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_VIDEO_WAITING"))\r
+            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件\r
+\r
+        def video_waite_timer_cb(self,event,msg):#等待对方接听音频\r
+            print("video_waite_timer_cb 1")\r
+            open_power = EventMesh.publish("get_power_on_state")#获取开机标识\r
+            power_off = EventMesh.publish("get_power_off_state")#获取关机标识\r
+            if open_power != None and power_off != None:\r
+                if open_power == 0 or power_off == 1 or self.video_call_state == 0:\r
+                    return\r
+            play_state = EventMesh.publish("get_audio_state")\r
+            if play_state == 0:\r
+                print("video_waite_timer_cb 2")\r
+                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_VIDEO_WAITING"))\r
+                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件\r
+        \r
+        \r
+        def video_answer_timer_cb(self,event,msg):#对方已接听可正常通话了\r
+            print("video_answer_timer_cb 1")\r
+            open_power = EventMesh.publish("get_power_on_state")#获取开机标识\r
+            power_off = EventMesh.publish("get_power_off_state")#获取关机标识\r
+            if open_power != None and power_off != None:\r
+                if open_power == 0 or power_off == 1  or self.video_call_state == 0 :\r
+                    return\r
+            print("video_answer_timer_cb 2")\r
+            str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_VIDEO_ANSWER"))\r
+            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件\r
+\r
+        def video_answer_mode_timer_cb(self,event,msg):#1:#正在等待对方接听中,请稍候   2:#对方已接听可正常通话 3:#正在接听中\r
+            # print("video_answer_mode_timer_cb 1",msg)\r
+            open_power = EventMesh.publish("get_power_on_state")#获取开机标识\r
+            power_off = EventMesh.publish("get_power_off_state")#获取关机标识\r
+            if open_power != None and power_off != None:\r
+                if open_power == 0 or power_off == 1:\r
+                    return\r
+            # print("video_answer_mode_timer_cb 2",msg)\r
+            if msg == 1:#正在等待对方接听中,请稍候\r
+                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_VIDEO_WAITING"))\r
+                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件\r
+            elif msg == 2:#已接通\r
+                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_VIDEO_ANSWER"))\r
+                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件\r
+                pass\r
+            elif msg == 3:#正在连接中...\r
+                if EventMesh.publish("get_audio_state") == 0:\r
+                    str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_VIDEO_ANSWERING"))\r
+                    EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件\r
+                pass\r
+            elif msg == 4:#对方已挂断...\r
+                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_VIDEO_CALL_ENDING"))\r
+                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件\r
+                pass\r
+            elif msg == 5:#对方已挂断或网络不好\r
+                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_VIDEO_CALL_CONNECT"))#播放音频\r
+                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件\r
+\r
+        def dev_video_end_timer_cb(self,event,msg):#网络不好或者对方未接通挂断了\r
+            self.video_call_state = 0\r
+            self.video_count = 0\r
+            print("dev_video_end_timer_cb")\r
+            EventMesh.publish("stop_led_timer")#设置参数\r
+            EventMesh.publish("close_timer_all")#\r
+           \r
+        \r
+        def get_video_in_out_state(self,event,msg):\r
+            return self.video_call_state\r
+        \r
+        def set_video_in_out_state(self,event,msg):\r
+            self.video_call_state = msg\r
+        \r
+\r
+\r
+        def dialin_call_event(self, event, msg):\r
+            open_power = EventMesh.publish("get_power_on_state")#获取开机标识\r
+            if open_power != None:\r
+                if open_power == 0:\r
+                    return\r
+            power_off = EventMesh.publish("get_power_off_state")#获取开机标识\r
+            if power_off != None:\r
+                if power_off == 1:\r
+                    return\r
+            video_state = EventMesh.publish("get_video_state")\r
+            if video_state != 0:#视频电话呼入\r
+                self.call_state = 0\r
+                voiceCall.callEnd()\r
+                return\r
+            EventMesh.publish("close_timer_all")#\r
+            EventMesh.publish("close_wechat_btn_timer")#\r
+            EventMesh.publish("set_led_time_arg",[1,2,10*10,led_mode.FLASH_LIGHT_RED,10,5,led_mode.OTHER_MEASURE_MODE])#測量成功\r
+            self.timer.start(6000, 1, self.publish_call_event_cb)\r
+            str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_CALL_mp3"))\r
+            EventMesh.publish("play_audio_file",[str_data,0])#获取播放音频文件\r
+            # EventMesh.publish("play_audio_file",str_data)#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+            EventMesh.publish("set_motor_time",[1,2,10*3,10,5])#设置马达参数\r
+\r
+        def call_timer_cb(self,data):\r
+            open_power = EventMesh.publish("get_power_on_state")#获取开机标识\r
+            if open_power != None:\r
+                if open_power == 0:\r
+                    return\r
+            power_off = EventMesh.publish("get_power_off_state")#获取开机标识\r
+            if power_off != None:\r
+                if power_off == 1:\r
+                    return\r
+            video_state = EventMesh.publish("get_video_state")\r
+            if video_state != 0:#视频电话呼入\r
+                self.call_state = 0\r
+                voiceCall.callEnd()\r
+                EventMesh.publish("stop_led_timer")#设置参数\r
+                EventMesh.publish("close_timer_all")#\r
+                return\r
+            if self.call_state != 2:\r
+                EventMesh.publish("stop_led_timer")#设置参数\r
+                EventMesh.publish("close_timer_all")#\r
+                return\r
+            EventMesh.publish("set_led_time_arg",[1,2,10*10,led_mode.FLASH_LIGHT_RED,10,5,led_mode.OTHER_MEASURE_MODE])#測量成功\r
+            str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_CALL_mp3"))\r
+            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件\r
+        \r
+        def dial_out_call_center_cb(self, event, msg):#电话拨出去\r
+            open_power = EventMesh.publish("get_power_on_state")#获取开机标识\r
+            if open_power != None:\r
+                if open_power == 0:\r
+                    return\r
+            power_off = EventMesh.publish("get_power_off_state")#获取开机标识\r
+            if power_off != None:\r
+                if power_off == 1:\r
+                    return\r
+            # EventMesh.debug_log("dial_out_call_center_cb",msg)\r
+            if self.call_state == 0:\r
+                self.phone_num = ''\r
+                EventMesh.publish("close_timer_all")#\r
+                EventMesh.publish("set_led_time_arg",[1,2,8,led_mode.FLASH_LIGHT_GREEN,8,4,led_mode.OTHER_MEASURE_MODE])#\r
+                if msg == None:\r
+                    str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_NO_SET_SOS_DIAL"))\r
+                    EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件\r
+                    # EventMesh.publish("play_audio_file",str_data)#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+                else:\r
+                    self.phone_num = str(msg)\r
+                    str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_SOS_ALERT"))\r
+                    EventMesh.publish("play_audio_file",[str_data,0])#获取播放音频文件\r
+                    self.timer1.start(2000, 0, self.time_out_phone)\r
+\r
+        \r
+\r
+\r
+                    \r
+        \r
+        def time_out_phone(self, msg):#电话拨出去\r
+            voiceCall.callStart(self.phone_num)\r
+\r
+        def sos_out_call_center_cb(self, event, msg):#sos电话呼叫中\r
+            open_power = EventMesh.publish("get_power_on_state")#获取开机标识\r
+            if open_power != None:\r
+                if open_power == 0:\r
+                    return\r
+            power_off = EventMesh.publish("get_power_off_state")#获取开机标识\r
+            if power_off != None:\r
+                if power_off == 1:\r
+                    return\r
+            self.sos_phone_num = ''\r
+            EventMesh.debug_log("sos_out_call_center_cb",msg)\r
+            if self.call_state == 0:\r
+                self.sos_state = 0\r
+                EventMesh.publish("close_timer_all")#\r
+                if msg == None:\r
+                    str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_NO_SET_SOS_DIAL"))\r
+                    EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件\r
+                    # EventMesh.publish("play_audio_file",str_data)#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+                else:\r
+                    sos_state =  EventMesh.publish("get_dev_state")\r
+                    self.sos_state = 1\r
+                    tmp = 1 << 16\r
+                    sos_state = sos_state|tmp #第21位=1\r
+                    EventMesh.publish("set_dev_state",sos_state)\r
+\r
+                    EventMesh.publish(constants.EVENT.START_LOCATION,[constants.PROTOCOL.AL_SEND,sos_state]) #开始AL定位\r
+                    EventMesh.publish("close_timer_all")#\r
+                    self.sos_phone_num = msg\r
+                    str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_SOS_ALERT"))\r
+                    EventMesh.publish("play_audio_file",[str_data,0])#获取播放音频文件\r
+                    self.sos_timer1.start(2000, 0, self.sos_call_out_phone)\r
+                    self.sos_timer2.start(30000, 0, self.sos_time_out_phone)\r
+                    \r
+                    \r
+        def sos_time_out_phone(self, msg):#30s超时未打通或者信号不好则重新拨打\r
+            self.sos_state = 0\r
+            sos_flag = EventMesh.publish("get_sos_flag")\r
+            if sos_flag == 1:\r
+                if self.call_state == 0:\r
+                    EventMesh.publish("set_sos_state_out")\r
+                    EventMesh.publish("set_sos_info_call") \r
+                    \r
+        def sos_call_out_phone(self, msg):#电话拨出去\r
+            voiceCall.callStart(self.sos_phone_num)\r
+        \r
+        def get_sos_state_out(self, event, msg):#正在拨打sos电话\r
+            return self.sos_state\r
+        \r
+        def set_sos_state_out(self, event, msg):#清除在拨打sos电话\r
+            self.sos_state = 0\r
+\r
+        def call_test_event(self, event, msg):\r
+            voiceCall.callStart(str("10086"))\r
+\r
+        def get_call_state(self, event, msg):\r
+            return self.call_state\r
+        \r
+        def interup_call_event(self, event, msg):#侧边金属按钮挂断来电\r
+            flag = EventMesh.publish("get_call_state") \r
+            if flag == 2 or flag == 3:#电话通话中 或者呼叫中挂断中断\r
+                self.call_state = 0\r
+                voiceCall.callEnd()\r
+        \r
+        def dialing_out_event(self, event, msg):#侧边金属按键挂断电话呼叫中\r
+            flag = EventMesh.publish("get_call_state") \r
+            if flag == 1 or flag == 3:#电话呼叫中 或者在正在通话中\r
+                self.call_state = 0\r
+                voiceCall.callEnd()\r
+                \r
+\r
+\r
+        def play_cur_step_event(self, event, msg): #msg 1 播放当前步数\r
+            flag = EventMesh.publish("get_call_state") \r
+            video_state = EventMesh.publish("get_video_state")\r
+            if video_state != 0:\r
+                return\r
+            if flag == 0:#电话通话中 或者呼叫中挂断中断\r
+                if self.fall_flag == 0:\r
+                    EventMesh.publish("close_timer_all")#\r
+                step = EventMesh.publish("get_old_step_value")\r
+                EventMesh.debug_log("step",step)\r
+                self.setp_old = step\r
+                if step <= 10:#\r
+                    if step == 10:#十步\r
+                        str_data = 'mp3files={}.mp3+{}.mp3'.format(audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_STEP_4"))\r
+                        EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+                    else:# 9步\r
+                        str_data = 'mp3files={}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(step)),audio_buf.index("R_READ_STEP_4"))\r
+                        EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+                elif step <= 100:#十 90\r
+                    if step == 100:\r
+                        str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_1"),audio_buf.index("R_READ_STEP_2"),\\r
+                            audio_buf.index("R_READ_STEP_4"))\r
+                        EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+                    else:\r
+                        step_tmp = str(step)\r
+                        shi_value = int(step_tmp[0])#十\r
+                        ge_value = int(step_tmp[1])#个\r
+                        if shi_value > 1:#大于19步\r
+                            if ge_value == 0:#9十步 70十步\r
+                                str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(shi_value)),audio_buf.index("R_READ_STEP_3"),\\r
+                                audio_buf.index("R_READ_STEP_4"))\r
+                                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+                            else:#9十2步\r
+                                str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(shi_value)),audio_buf.index("R_READ_STEP_3"),\\r
+                                audio_buf.index("R_READ_TIME_{}".format(ge_value)),audio_buf.index("R_READ_STEP_4"))\r
+                                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+                        else:#十9步\r
+                            str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_{}".format(ge_value)),\\r
+                            audio_buf.index("R_READ_STEP_4"))\r
+                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+                elif step <= 1000:\r
+                    if step == 1000:#1千步\r
+                        str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_1"),\\r
+                        audio_buf.index("R_READ_STEP_1"),audio_buf.index("R_READ_STEP_4"))\r
+                        EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+                    else:\r
+                        step_tmp = str(step)#500\r
+                        bai_value = int(step_tmp[0])#百\r
+                        shi_value = int(step_tmp[1])#十\r
+                        ge_value = int(step_tmp[2])#个\r
+                        #101 110 1\r
+                        if shi_value > 0:#110\r
+                            if ge_value == 0:\r
+                                str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(bai_value)),\\r
+                                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"))\r
+                                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+                            else:\r
+                                str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(bai_value)),\\r
+                                audio_buf.index("R_READ_STEP_2"),audio_buf.index("R_READ_TIME_{}".format(shi_value)),audio_buf.index("R_READ_STEP_3"),\\r
+                                audio_buf.index("R_READ_TIME_{}".format(ge_value)),audio_buf.index("R_READ_STEP_4"))\r
+                                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+                        else:\r
+                            if shi_value == 0 and ge_value == 0:#500 600\r
+                                str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(bai_value)),\\r
+                                audio_buf.index("R_READ_STEP_2"),audio_buf.index("R_READ_STEP_4"))\r
+                                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+                                pass\r
+                            else:\r
+\r
+                                str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(bai_value)),\\r
+                                audio_buf.index("R_READ_STEP_2"),audio_buf.index("R_READ_TIME_0"),audio_buf.index("R_READ_TIME_{}".format(ge_value)),\\r
+                                audio_buf.index("R_READ_STEP_4"))\r
+                                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+                            pass\r
+                elif step <= 10000:#千\r
+                    if step == 10000:\r
+                        str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_1"),\\r
+                        audio_buf.index("R_READ_STEP_0"),audio_buf.index("R_READ_STEP_4"))\r
+                        EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+                        pass\r
+                    else:\r
+                        one_thousand = step//1000 #千\r
+                        one_hundred = step%1000 #百\r
+                        baishu = step%100 #十\r
+                        shishu = step%10 #个\r
+                        step_tmp = str(step)\r
+                        qian = int(step_tmp[0])#千\r
+                        bai_value = int(step_tmp[1])#百\r
+                        shi_value = int(step_tmp[2])#十\r
+                        ge_value = int(step_tmp[3])#个\r
+                        if bai_value <= 0:\r
+                            if shi_value <= 0:\r
+                                str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(qian)),\\r
+                                audio_buf.index("R_READ_STEP_1"),audio_buf.index("R_READ_TIME_0"),audio_buf.index("R_READ_TIME_{}".format(ge_value)),\\r
+                                audio_buf.index("R_READ_STEP_4"))\r
+                                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+                            else:\r
+                                if ge_value == 0:#1020 1040\r
+                                    str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(qian)),\\r
+                                    audio_buf.index("R_READ_STEP_1"),audio_buf.index("R_READ_TIME_0"),audio_buf.index("R_READ_TIME_{}".format(shi_value)),\\r
+                                    audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_STEP_4"))\r
+                                    EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+                                else:#1021 \r
+                                    str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(qian)),\\r
+                                    audio_buf.index("R_READ_STEP_1"),audio_buf.index("R_READ_TIME_0"),audio_buf.index("R_READ_TIME_{}".format(shi_value)),\\r
+                                    audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_{}".format(ge_value)),audio_buf.index("R_READ_STEP_4"))\r
+                                    EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+                        else:\r
+                            if shi_value <= 0:#1109\r
+                                if ge_value == 0:#1110\r
+                                    str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(qian)),\\r
+                                    audio_buf.index("R_READ_STEP_1"),audio_buf.index("R_READ_TIME_{}".format(bai_value)),\r
+                                    audio_buf.index("R_READ_STEP_2"),audio_buf.index("R_READ_STEP_4"))\r
+                                    EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+                                else:\r
+                                    str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(qian)),\\r
+                                    audio_buf.index("R_READ_STEP_1"),audio_buf.index("R_READ_TIME_{}".format(bai_value)),\r
+                                    audio_buf.index("R_READ_STEP_2"),audio_buf.index("R_READ_TIME_0"),audio_buf.index("R_READ_TIME_{}".format(ge_value)),\\r
+                                    audio_buf.index("R_READ_STEP_4"))\r
+                                    EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+                            else:\r
+                                if ge_value == 0:#1110\r
+                                    str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(qian)),\\r
+                                    audio_buf.index("R_READ_STEP_1"),audio_buf.index("R_READ_TIME_{}".format(bai_value)),\r
+                                    audio_buf.index("R_READ_STEP_2"),audio_buf.index("R_READ_TIME_{}".format(shi_value)),\\r
+                                    audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_STEP_4"))\r
+                                    EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+                                else:#1117\r
+                                    str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(qian)),\\r
+                                    audio_buf.index("R_READ_STEP_1"),audio_buf.index("R_READ_TIME_{}".format(bai_value)),\r
+                                    audio_buf.index("R_READ_STEP_2"),audio_buf.index("R_READ_TIME_{}".format(shi_value)),\\r
+                                    audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_{}".format(ge_value)),audio_buf.index("R_READ_STEP_4"))\r
+                                    EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+\r
+                        pass\r
+                elif step <= 100000:#万\r
+                            if step == 100000:#10万步\r
+                                str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_STEP_3"),\\r
+                                audio_buf.index("R_READ_STEP_0"),audio_buf.index("R_READ_STEP_4"))\r
+                                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+                            else:\r
+                                step_tmp = str(step)\r
+                                wang = int(step_tmp[0])#万\r
+                                qian = int(step_tmp[1])#千\r
+                                bai_value = int(step_tmp[2])#百\r
+                                shi_value = int(step_tmp[3])#十\r
+                                ge_value = int(step_tmp[4])#个\r
+                                if wang > 0 and qian > 0 and bai_value > 0:#11109 11111\r
+                                    if shi_value <= 0:#11109\r
+                                        if ge_value == 0:#11100\r
+                                            str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(wang)),\\r
+                                            audio_buf.index("R_READ_STEP_0"),audio_buf.index("R_READ_TIME_{}".format(qian)),\\r
+                                            audio_buf.index("R_READ_STEP_1"),audio_buf.index("R_READ_TIME_{}".format(bai_value)),\\r
+                                            audio_buf.index("R_READ_STEP_2"),audio_buf.index("R_READ_STEP_4"))\r
+                                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+                                        else:#11108\r
+                                            str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(wang)),\\r
+                                            audio_buf.index("R_READ_STEP_0"),audio_buf.index("R_READ_TIME_{}".format(qian)),\\r
+                                            audio_buf.index("R_READ_STEP_1"),audio_buf.index("R_READ_TIME_{}".format(bai_value)),\\r
+                                            audio_buf.index("R_READ_STEP_2"),audio_buf.index("R_READ_TIME_0"),audio_buf.index("R_READ_TIME_{}".format(ge_value)),\\r
+                                            audio_buf.index("R_READ_STEP_4"))\r
+                                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+                                            pass\r
+                                    else:\r
+                                        if ge_value == 0:#11110\r
+                                            str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(wang)),\\r
+                                            audio_buf.index("R_READ_STEP_0"),audio_buf.index("R_READ_TIME_{}".format(qian)),\\r
+                                            audio_buf.index("R_READ_STEP_1"),audio_buf.index("R_READ_TIME_{}".format(bai_value)),\\r
+                                            audio_buf.index("R_READ_STEP_2"),audio_buf.index("R_READ_TIME_{}".format(shi_value)),\\r
+                                            audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_STEP_4"))\r
+                                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+                                        else:#11116\r
+                                            str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(wang)),\\r
+                                            audio_buf.index("R_READ_STEP_0"),audio_buf.index("R_READ_TIME_{}".format(qian)),\\r
+                                            audio_buf.index("R_READ_STEP_1"),audio_buf.index("R_READ_TIME_{}".format(bai_value)),\\r
+                                            audio_buf.index("R_READ_STEP_2"),audio_buf.index("R_READ_TIME_{}".format(shi_value)),\\r
+                                            audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_{}".format(ge_value)),audio_buf.index("R_READ_STEP_4"))\r
+                                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+                                            pass\r
+                                elif wang > 0 and qian > 0:#11000 11010 11012 11008\r
+                                    if shi_value > 0:\r
+                                        if ge_value == 0:#11010\r
+                                            str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(wang)),\\r
+                                            audio_buf.index("R_READ_STEP_0"),audio_buf.index("R_READ_TIME_{}".format(qian)),\\r
+                                            audio_buf.index("R_READ_STEP_1"),audio_buf.index("R_READ_TIME_0"),audio_buf.index("R_READ_TIME_{}".format(shi_value)),\\r
+                                            audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_STEP_4"))\r
+                                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+                                        else:#11016\r
+                                            str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(wang)),\\r
+                                            audio_buf.index("R_READ_STEP_0"),audio_buf.index("R_READ_TIME_{}".format(qian)),\\r
+                                            audio_buf.index("R_READ_STEP_1"),audio_buf.index("R_READ_TIME_0"),audio_buf.index("R_READ_TIME_{}".format(shi_value)),\\r
+                                            audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_{}".format(ge_value)),audio_buf.index("R_READ_STEP_4"))\r
+                                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+                                    else:   \r
+                                        if ge_value == 0:#11000\r
+                                            str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(wang)),\\r
+                                            audio_buf.index("R_READ_STEP_0"),audio_buf.index("R_READ_TIME_{}".format(qian)),\\r
+                                            audio_buf.index("R_READ_STEP_1"),audio_buf.index("R_READ_STEP_4"))\r
+                                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+                                        else:#11004\r
+                                            str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(wang)),\\r
+                                            audio_buf.index("R_READ_STEP_0"),audio_buf.index("R_READ_TIME_{}".format(qian)),\\r
+                                            audio_buf.index("R_READ_STEP_1"),audio_buf.index("R_READ_TIME_0"),audio_buf.index("R_READ_TIME_{}".format(ge_value)),\\r
+                                            audio_buf.index("R_READ_STEP_4"))\r
+                                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+                                \r
+                                elif wang > 0:#1\r
+                                    if bai_value > 0:#百\r
+                                        if shi_value > 0:#10110\r
+                                            if ge_value == 0:#10150\r
+                                                str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(wang)),\\r
+                                                audio_buf.index("R_READ_STEP_0"),audio_buf.index("R_READ_TIME_0"),audio_buf.index("R_READ_TIME_{}".format(bai_value)),\\r
+                                                audio_buf.index("R_READ_STEP_2"),audio_buf.index("R_READ_TIME_{}".format(shi_value)),audio_buf.index("R_READ_STEP_3"),\\r
+                                                audio_buf.index("R_READ_STEP_4"))\r
+                                                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+                                            else:\r
+                                                str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(wang)),\\r
+                                                audio_buf.index("R_READ_STEP_0"),audio_buf.index("R_READ_TIME_0"),audio_buf.index("R_READ_TIME_{}".format(bai_value)),\\r
+                                                audio_buf.index("R_READ_STEP_2"),audio_buf.index("R_READ_TIME_{}".format(shi_value)),audio_buf.index("R_READ_STEP_3"),\\r
+                                                audio_buf.index("R_READ_TIME_{}".format(ge_value)),audio_buf.index("R_READ_STEP_4"))\r
+                                                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+                                        else:#10108\r
+                                            if ge_value == 0:#10100\r
+                                                str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(wang)),\\r
+                                                audio_buf.index("R_READ_STEP_0"),audio_buf.index("R_READ_TIME_0"),audio_buf.index("R_READ_TIME_{}".format(bai_value)),\\r
+                                                audio_buf.index("R_READ_STEP_2"),audio_buf.index("R_READ_STEP_4"))\r
+                                                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+                                            else:#10108\r
+                                                str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(wang)),\\r
+                                                audio_buf.index("R_READ_STEP_0"),audio_buf.index("R_READ_TIME_0"),audio_buf.index("R_READ_TIME_{}".format(bai_value)),\\r
+                                                audio_buf.index("R_READ_STEP_2"),audio_buf.index("R_READ_TIME_0"),audio_buf.index("R_READ_TIME_{}".format(ge_value)),\\r
+                                                audio_buf.index("R_READ_STEP_4"))\r
+                                                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+                                    else:\r
+                                        if shi_value > 0:\r
+                                            if ge_value == 0:#10090\r
+                                                str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(wang)),\\r
+                                                audio_buf.index("R_READ_STEP_0"),audio_buf.index("R_READ_TIME_0"),audio_buf.index("R_READ_TIME_{}".format(shi_value)),\\r
+                                                audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_STEP_4"))\r
+                                                EventMesh.publish("play_audio_file",str_data)#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+                                            else:#10098\r
+                                                str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(wang)),\\r
+                                                audio_buf.index("R_READ_STEP_0"),audio_buf.index("R_READ_TIME_0"),audio_buf.index("R_READ_TIME_{}".format(shi_value)),\\r
+                                                audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_{}".format(ge_value)),audio_buf.index("R_READ_STEP_4"))\r
+                                                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+                                        else:\r
+                                            str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(wang)),\\r
+                                            audio_buf.index("R_READ_STEP_0"),audio_buf.index("R_READ_TIME_0"),audio_buf.index("R_READ_TIME_{}".format(ge_value)),\\r
+                                            audio_buf.index("R_READ_STEP_4"))\r
+                                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+\r
+        def set_usb(self, event, msg): #msg 1 正在充电 2充电已移出 3 充电已满 0\r
+            open_power = EventMesh.publish("get_power_on_state")#获取开机标识\r
+            if open_power != None:\r
+                if open_power == 0:\r
+                    return\r
+            power_off = EventMesh.publish("get_power_off_state")#获取开机标识\r
+            if power_off != None:\r
+                if power_off == 1:\r
+                    return\r
+            flag = EventMesh.publish("get_call_state") \r
+            video_state = EventMesh.publish("get_video_state")\r
+            get_hr_state = EventMesh.publish("get_hr_state")\r
+            get_spo2_state = EventMesh.publish("get_spo2_state")\r
+            get_bp_state  = EventMesh.publish("get_bp_state")\r
+            get_bg_state  = EventMesh.publish("get_bg_state")\r
+            get_temp_state  = EventMesh.publish("get_temp_state")\r
+            if msg == 1:\r
+                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:\r
+                    if get_hr_state != 0:\r
+                        \r
+                        EventMesh.publish("set_hr_state",0)#2代表后台进入测试,定时测心率 1ui界面测试洗心率 \r
+                        if get_hr_state == 1:\r
+                            EventMesh.publish("stop_led_timer")#设置参数\r
+                            EventMesh.publish("set_start_measure_time",0)#设置开始测量的时间戳时间\r
+\r
+                        EventMesh.debug_log("stop debug8")\r
+                        EventMesh.publish(constants.EVENT.STOP_HEART) \r
+                    if get_spo2_state != 0:\r
+                        EventMesh.publish("set_spo2_state",0)#2代表后台进入测试\r
+                        if get_spo2_state == 1:\r
+                            EventMesh.publish("stop_led_timer")#设置参数\r
+                        EventMesh.publish(constants.EVENT.STOP_BLOOD_OXYGEN)\r
+                        EventMesh.debug_log("stop debug13")\r
+                    if get_bp_state != 0:\r
+                        EventMesh.publish("set_bp_state",0)#2代表后台进入测试\r
+                        if get_bp_state == 1:\r
+                            EventMesh.publish("stop_led_timer")#设置参数\r
+                        EventMesh.publish(constants.EVENT.STOP_HEART)\r
+                        EventMesh.debug_log("stop bp debug1")\r
+                    if get_bg_state != 0:\r
+                        EventMesh.publish("set_bg_state",0)#2代表后台进入测试\r
+                        if get_bg_state == 1:#手动开灯关闭灯\r
+                            EventMesh.publish("stop_led_timer")#设置参数\r
+                        EventMesh.publish(constants.EVENT.STOP_HEART)\r
+                        EventMesh.debug_log("stop BG  debug14")\r
+                    if get_temp_state != 0:\r
+                        \r
+                        EventMesh.publish("set_temp_state",0)#2代表后台进入测试\r
+                        if get_temp_state == 1:\r
+                            EventMesh.publish("stop_led_timer")#设置参数\r
+                            EventMesh.publish("set_start_temp_measure_time",0)#\r
+                        EventMesh.publish(constants.EVENT.STOP_TEMP)\r
+                        EventMesh.debug_log("stop temp  debug14")\r
+            if msg == 1:\r
+                self.usbState = msg\r
+                str_buf = [1,1,10,led_mode.LONG_LIGHT_RED,4,2,led_mode.CHARGE_IN_MODE]\r
+                EventMesh.publish("set_led_time_arg",str_buf)#\r
+                if flag == 0 and self.fall_flag == 0 and video_state == 0:#电话通话中 或者呼叫中挂断中断\r
+                    EventMesh.publish("close_timer_all")#\r
+                    self.aud.stop()\r
+                    self.aud.play(1,1,'U:/static/R_CHARGE_IN.mp3')\r
+                    # str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_CHARGE_IN"))\r
+                    # EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+                EventMesh.debug_log("charge R_CHARGE_IN")\r
+                \r
+                \r
+            elif msg == 2 or msg == 0:\r
+                self.usbState = msg\r
+                EventMesh.publish("stop_led_timer")#设置参数\r
+                # EventMesh.publish("set_led_time_arg",[0,1000,1,led_mode.FLASH_LIGHT_GREEN,led_mode.DEFAULT_LONG_LIGHT_MODE,led_mode.CHARGE_OUT_MODE])#測量成功\r
+                EventMesh.publish("set_led_time_arg",[1,1,0,led_mode.FLASH_LIGHT_GREEN,4,4,led_mode.CHARGE_OUT_MODE])#測量成功\r
+                EventMesh.debug_log("charge R_CHARGE_OUT")\r
+                if flag == 0 and self.fall_flag == 0 and video_state == 0:#电话通话中 或者呼叫中挂断中断\r
+                    EventMesh.publish("close_timer_all")#\r
+                    self.aud.stop()\r
+                    self.aud.play(1,1,'U:/static/R_CHARGE_OUT.mp3')\r
+                    # str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_CHARGE_OUT"))\r
+                    # EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+                \r
+\r
+\r
+            elif msg == 3:\r
+                self.usbState = msg\r
+                EventMesh.debug_log("charge full")\r
+                str_buf = [1,1,10,led_mode.LONG_LIGHT_GREEN,4,2,led_mode.CHARGE_FULL_MODE]\r
+                EventMesh.publish("set_led_time_arg",str_buf)#\r
+                # if flag == 0 and self.fall_flag == 0 and video_state == 0:#电话通话中 或者呼叫中挂断中断\r
+                #     EventMesh.publish("close_timer_all")#\r
+                #     str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_CHARGE_FULL"))\r
+                #     EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+                \r
+\r
+\r
+        def get_usb(self, event, msg):\r
+            return self.usbState\r
+        \r
+\r
+\r
+        def app_factory(self,event,msg):\r
+            if msg != None:\r
+                number = str(msg)\r
+                sms.sendPduMsg(number, 'factory# send ok', 'UCS2')\r
+            ret = 0\r
+            ret = ql_fs.path_exists("/usr/static/storage_file")#\r
+            if ret == True:\r
+                ql_fs.rmdirs("/usr/static/storage_file")\r
+                ql_fs.mkdirs("/usr/static/storage_file")\r
+            if EventMesh.publish(constants.EVENT.GET_CONNECT) == 1:\r
+                EventMesh.publish(constants.PROTOCOL.DLT_SEND)\r
+        \r
+            self.factory_timer.start(6*1000,0,self.factory_cb)\r
+            pass\r
+        def factory_cb(self,*argc):\r
+            self.aud.stopPlayStream()\r
+            Power.powerRestart()\r
+\r
+        def app_restart(self,event,msg):#远程发短信重启\r
+            if msg != None:\r
+                number = str(msg)\r
+                sms.sendPduMsg(number, 'reset# send ok', 'UCS2')\r
+            self.restart_timer.start(3*1000,0,self.app_restart_cb)\r
+            pass\r
+        def app_restart_cb(self,*argc):\r
+            Power.powerRestart()\r
+\r
+        def open_power_on(self, event, msg): #msg 1 开机 2 关机 3 重启  4恢复出厂设置 5静音关机\r
+            EventMesh.publish("close_timer_all")#\r
+            if msg == 1:\r
+                EventMesh.publish("close_hr_sop2")#\r
+                # str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_POWER_OFF_1"))\r
+                # EventMesh.publish("play_audio_file",[str_data,0])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+                self.pwk_timer1.start(1000,0,self.power_on_audio_cb)\r
+                \r
+                print("open_power_on!!!!!!!\n\n\n\n")\r
+            elif msg == 2:\r
+                flag = EventMesh.publish("get_call_state") \r
+                if flag != 0:#电话呼叫中\r
+                    self.call_state = 0\r
+                    voiceCall.callEnd()\r
+                step = EventMesh.publish("get_old_step_value")\r
+                # step1 = SC7A20().get_step()\r
+                # step1 = EventMesh.publish(constants.EVENT.GET_STEP)\r
+                # step2 = EventMesh.publish("get_storage_config","old_step")\r
+                self.read_data = EventMesh.publish("get_storage_data")\r
+                # EventMesh.publish("set_test_data5",[1,step,step1,step2])\r
+                if step != 0:\r
+                    EventMesh.publish("set_storage_config",["old_step",step])\r
+                date_tmp = utime.localtime()\r
+                time_tmp = utime.mktime(date_tmp)\r
+                # step3 = EventMesh.publish("get_old_step_value")\r
+                # step4 = SC7A20().get_step()\r
+                # step4 = EventMesh.publish(constants.EVENT.GET_STEP)\r
+                # step5 = EventMesh.publish("get_storage_config","old_step")\r
+                # EventMesh.publish("set_test_data6",[1,step3,step4,step5])\r
+                EventMesh.publish("set_storage_config",["old_time",time_tmp])#关机保存一个是时间\r
+                EventMesh.publish("set_storage_config",["power_state",0])\r
+                # self.pwk_timer1.start(3000,0,self.power_off_audio_cb)\r
+                EventMesh.publish("close_hr_sop2")#\r
+                # EventMesh.debug_log("power_off_audio_cb")\r
+                self.aud.stop()\r
+                self.aud.play(1,0,'U:/static/R_POWER_OFF_1.mp3')\r
+                # str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_POWER_OFF_1"))\r
+                # EventMesh.publish("play_audio_file",[str_data,0])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+                EventMesh.publish("set_led_time_arg",[1,2,6*8,led_mode.FLASH_LIGHT_RED,6,3,led_mode.POWER_OFF_MODE])#\r
+                self.power_off = 1\r
+                self.pwk_timer2.start(6000,0,self.publish_power_down_event_cb)\r
+            elif msg == 3:\r
+                flag = EventMesh.publish("get_call_state") \r
+                if flag != 0:#电话呼叫中\r
+                    self.call_state = 0\r
+                    voiceCall.callEnd()\r
+                EventMesh.publish("close_hr_sop2")#\r
+                self.aud.stop()\r
+                self.aud.play(1,0,'U:/static/R_POWER_OFF_1.mp3')\r
+                # str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_POWER_OFF_1"))\r
+                # EventMesh.publish("play_audio_file",[str_data,0])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+                EventMesh.publish("stop_led_timer")#设置参数\r
+                self.power_off = 1\r
+                self.timer.start(8000,0,self.publish_resatrt_down_event_cb)\r
+                #EventMesh.publish("set_led_time_arg",[3000,4000,1,led_mode.LONG_LIGHT_GREEN,led_mode.DEFAULT_LONG_LIGHT_MODE])#\r
+            elif msg == 4:\r
+                flag = EventMesh.publish("get_call_state") \r
+                if flag != 0:#电话呼叫中\r
+                    self.call_state = 0\r
+                    voiceCall.callEnd()\r
+                EventMesh.publish("close_hr_sop2")#\r
+                EventMesh.publish("stop_led_timer")#设置参数\r
+                self.power_off = 1\r
+                ret = 0\r
+                ret = ql_fs.path_exists("/usr/static/storage_file")#\r
+                if ret == True:\r
+                    ql_fs.rmdirs("/usr/static/storage_file")\r
+                    ql_fs.mkdirs("/usr/static/storage_file")\r
+                if EventMesh.publish(constants.EVENT.GET_CONNECT) == 1:\r
+                    EventMesh.publish(constants.PROTOCOL.DLT_SEND)\r
+                self.aud.stopPlayStream()\r
+                self.timer.start(6*1000,0,self.fun)\r
+            elif msg == 5:\r
+                flag = EventMesh.publish("get_call_state") \r
+                if flag != 0:#电话呼叫中\r
+                    self.call_state = 0\r
+                    voiceCall.callEnd()\r
+                step = EventMesh.publish("get_old_step_value")\r
+                # step1 = SC7A20().get_step()\r
+                # step1 = EventMesh.publish(constants.EVENT.GET_STEP)\r
+                # step2 = EventMesh.publish("get_storage_config","old_step")\r
+                self.read_data = EventMesh.publish("get_storage_data")\r
+                # EventMesh.publish("set_test_data7",[1,step,step1,step2])\r
+                if step != 0:\r
+                    EventMesh.publish("set_storage_config",["old_step",step])\r
+\r
+                # step3 = EventMesh.publish("get_old_step_value")\r
+                # step4 = SC7A20().get_step()\r
+                # step4 = EventMesh.publish(constants.EVENT.GET_STEP)\r
+                # step5 = EventMesh.publish("get_storage_config","old_step")\r
+                # EventMesh.publish("set_test_data8",[1,step3,step4,step5])\r
+                date_tmp = utime.localtime()\r
+                time_tmp = utime.mktime(date_tmp)\r
+                EventMesh.publish("set_storage_config",["old_time",time_tmp])#关机保存一个是时间\r
+                EventMesh.publish("set_storage_config",["power_state",1])\r
+                \r
+                EventMesh.publish("close_hr_sop2")#\r
+                EventMesh.publish("set_led_time_arg",[1,2,6*8,led_mode.FLASH_LIGHT_RED,6,3,led_mode.POWER_OFF_MODE])#\r
+                self.power_off = 1\r
+                self.pwk_timer2.start(6000,0,self.publish_power_down_event_cb)\r
+                # self.pwk_timer1.start(3000,0,self.power_off_no_audio_cb)#不需要关机铃声\r
+\r
+\r
+\r
+        def fun(self,*argc):\r
+            self.aud.stopPlayStream()\r
+            Power.powerRestart()\r
+            \r
+\r
+        def power_on_cb(self, msg): #msg 开机标识\r
+            self.power_on_flag = 1\r
+        def clear_power_on_cb(self, msg): #msg 开机标识\r
+            self.power_on_flag = 0\r
+        \r
+        def power_on_audio_cb(self, msg):\r
+            self.power_on_flag = 1\r
+            # EventMesh.debug_log("power_on_audio_cb")\r
+            power_state = EventMesh.publish("get_storage_config","power_state")\r
+            #EventMesh.publish("set_motor_time",[1,2,10*2,10,5])#设置马达参数\r
+            if power_state == None:\r
+                power_state = 0\r
+            # print("power_state",power_state)\r
+            if power_state <= 0:\r
+                self.aud.stop()\r
+                self.aud.play(1,1,'U:/static/R_POWER_OFF_1.mp3')\r
+            # str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_POWER_OFF_1"))\r
+            # EventMesh.publish("play_audio_file",[str_data,0])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+            EventMesh.publish("set_led_time_arg",[1,2,6*8,led_mode.FLASH_LIGHT_GREEN,6,3,led_mode.OTHER_MEASURE_MODE])#測量成功\r
+            # 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])#设置参数\r
+            self.power_on_flag = 0\r
+            self.pwk_timer2.start(5000,0,self.power_on_cb)\r
+\r
+        def get_power_on_state(self, event, msg):\r
+            return self.power_on_flag\r
+        \r
+        def power_off_audio_cb(self, msg):\r
+            # EventMesh.debug_log("power_off_audio_cb")\r
+            self.aud.stop()\r
+            self.aud.play(1,0,'U:/static/R_POWER_OFF_1.mp3')\r
+            # str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_POWER_OFF_1"))\r
+            # EventMesh.publish("play_audio_file",[str_data,0])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+            EventMesh.publish("set_led_time_arg",[1,2,6*8,led_mode.FLASH_LIGHT_RED,6,3,led_mode.POWER_OFF_MODE])#\r
+            self.power_off = 1\r
+            self.pwk_timer2.start(6000,0,self.publish_power_down_event_cb)\r
+        \r
+        def power_off_no_audio_cb(self, msg):\r
+            EventMesh.debug_log("power_off_no_audio_cb")\r
+            EventMesh.publish("set_led_time_arg",[1,2,6*8,led_mode.FLASH_LIGHT_RED,6,3,led_mode.POWER_OFF_MODE])#\r
+            self.power_off = 1\r
+            self.pwk_timer2.start(6000,0,self.publish_power_down_event_cb)\r
+\r
+        def set_power_off_cb(self, msg):\r
+            self.power_off = 1\r
+\r
+        def get_power_off_state(self, event, msg):\r
+            return self.power_off\r
+\r
+        def close_hr_sop2(self, event, msg): #msg 关闭心率血氧体温测试\r
+            get_hr_state = EventMesh.publish("get_hr_state")\r
+            get_spo2_state = EventMesh.publish("get_spo2_state")\r
+            get_temp_state = EventMesh.publish("get_temp_state")\r
+            get_bg_state = EventMesh.publish("get_bg_state")\r
+            get_bp_state = EventMesh.publish("get_bp_state")\r
+            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:\r
+                if get_hr_state != 0:\r
+                    EventMesh.publish("set_hr_state",0)#2代表后台进入测试,定时测心率 1ui界面测试洗心率 \r
+                    EventMesh.debug_log("sstop hr")\r
+                    EventMesh.publish(constants.EVENT.STOP_HEART) \r
+                if get_spo2_state != 0 :\r
+                    EventMesh.debug_log("stop spo2")\r
+                    EventMesh.publish("set_spo2_state",0)#2代表后台进入测试\r
+                    EventMesh.publish(constants.EVENT.STOP_BLOOD_OXYGEN)\r
+                if get_temp_state != 0:\r
+                    EventMesh.debug_log("stop temp")\r
+                    EventMesh.publish("set_temp_state",0)\r
+                    EventMesh.publish(constants.EVENT.STOP_TEMP)#手动体温测试\r
+                if  get_bg_state != 0:\r
+                    EventMesh.publish("set_bg_state",0)#2代表后台进入测试,定时测心率 1ui界面测试洗心率 \r
+                    EventMesh.debug_log("sstop bg")\r
+                    EventMesh.publish(constants.EVENT.STOP_HEART) \r
+\r
+                if  get_bp_state != 0:\r
+                    EventMesh.publish("set_bp_state",0)#2代表后台进入测试,定时测心率 1ui界面测试洗心率 \r
+                    EventMesh.debug_log("sstop bp")\r
+                    EventMesh.publish(constants.EVENT.STOP_HEART) \r
+\r
+        def set_manual_measure_mode(self, event, msg): #手动测试 1心率 2 血氧 3 体温\r
+            get_hr_state = EventMesh.publish("get_hr_state")\r
+            get_spo2_state = EventMesh.publish("get_spo2_state")\r
+            get_temp_state = EventMesh.publish("get_temp_state")\r
+            if msg == 1:\r
+                if get_hr_state != 1:#不是手动测试直接打断\r
+                    EventMesh.debug_log("set_manual_measure_mode",msg)\r
+                    EventMesh.publish("set_spo2_state",0)\r
+                    EventMesh.publish("set_bg_state",0)\r
+                    EventMesh.publish("set_bp_state",0)\r
+                    \r
+                    EventMesh.publish("set_hr_state",1)\r
+                    EventMesh.publish("clear_manual_hr_flag")\r
+                    EventMesh.publish("set_start_measure_time",1)#设置开始测量的时间戳时间\r
+                    EventMesh.publish(constants.EVENT.STOP_BLOOD_OXYGEN) #停止测试血氧\r
+                    EventMesh.publish("set_hr_blood_led",1)\r
+                    EventMesh.publish(constants.EVENT.START_HEART) #手动心率测试\r
+            elif msg == 2:\r
+                if get_hr_state == 0:\r
+                    if get_spo2_state != 1:\r
+                        EventMesh.debug_log("set_manual_measure_mode",msg)\r
+                        EventMesh.publish("set_spo2_state",1)\r
+                        EventMesh.publish("set_start_measure_time",1)#设置开始测量的时间戳时间\r
+                        EventMesh.publish("set_hr_blood_led",1)\r
+                        EventMesh.publish(constants.EVENT.START_BLOOD_OXYGEN) #手动血氧测试\r
+            elif msg == 3:\r
+                if get_temp_state != 1:\r
+                    EventMesh.debug_log("set_manual_measure_mode",msg)\r
+                    EventMesh.publish("clear_manual_temp_flag")\r
+                    EventMesh.publish("set_temp_state",1)\r
+                    EventMesh.publish("set_start_temp_measure_time",1)#设置开始测量的时间戳时间\r
+                    EventMesh.publish("set_hr_blood_led",1)\r
+                    EventMesh.publish(constants.EVENT.START_TEMP)#手动体温测试\r
+            pass\r
+\r
+\r
+        def set_start_measure_time(self, event, msg): #手动测试 1心\r
+            self.hr_auto = msg\r
+            pass\r
+\r
+        def get_start_measure_time(self, event, msg): #手动测试 \r
+\r
+            return  self.hr_auto\r
+        \r
+        def set_start_temp_measure_time(self, event, msg): #\r
+            self.temp_auto = msg\r
+            pass\r
+\r
+        def get_start_temp_measure_time(self, event, msg): #\r
+            return self.temp_auto\r
+\r
+        def mearsure_cb(self, event, msg):\r
+            if msg == 1:\r
+                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_HSENSOR_RESULT_OK"))\r
+                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+            elif msg == 2:\r
+                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_HSENSOR_RESULT_FAILE"))\r
+                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data) \r
+            elif msg == 3:\r
+                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_HSENSOR_SPO2_TITLE"))\r
+                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data) \r
+            elif msg == 4:\r
+                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_HSENSOR_TEMP_TITLE"))\r
+                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data) \r
+            \r
+            \r
+            \r
+        def play_temp_value(self, event, msg): #播放体温数值\r
+            video_state = EventMesh.publish("get_video_state")\r
+            flag = EventMesh.publish("get_call_state") \r
+            if msg != None:\r
+                if flag == 0 and self.fall_flag == 0 and video_state == 0:\r
+                    EventMesh.publish("close_timer_all")#\r
+                    if msg > 0:\r
+                        # str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_HSENSOR_RESULT_OK"))\r
+                        # EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+                        EventMesh.publish("set_hr_blood_led",2)#测量成功\r
+                        self.temp_value = msg\r
+                        # self.timer.start(2*1000,1,self.play_temp_fun)\r
+                        self.play_temp_fun(0)\r
+                    else:\r
+                        str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_HSENSOR_RESULT_FAILE"))\r
+                        EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+                        EventMesh.publish("set_hr_blood_led",3)#测量异常\r
+                else:\r
+                    EventMesh.publish("set_hr_blood_led",3)#测量异常\r
+\r
+        def play_temp_fun(self,argc): #播放体温数值\r
+            data = self.temp_value\r
+            if data > 42:\r
+                data = 42\r
+            data_tmp = str(data)\r
+            if data_tmp.find(".") != -1:\r
+                temp_shi = int(data_tmp.split('.')[0])//10\r
+                temp_ge = int(data_tmp.split('.')[0])%10\r
+                dot_ge = int(data_tmp.split('.')[1][:1])\r
+                if temp_ge > 0:#37.0\r
+                    if dot_ge > 0:#37.5\r
+                        str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_HSENSOR_TEMP_TITLE"),audio_buf.index("R_READ_TIME_{}".format(temp_shi)),\\r
+                        audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_{}".format(temp_ge)),audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT"),\\r
+                        audio_buf.index("R_READ_TIME_{}".format(dot_ge)))\r
+                        EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+\r
+                    else:#37.0\r
+                        str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_HSENSOR_TEMP_TITLE"),audio_buf.index("R_READ_TIME_{}".format(temp_shi)),\\r
+                        audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_{}".format(temp_ge)))\r
+                        EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+                else:#30.0 30.6\r
+                    if dot_ge > 0:\r
+                        str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_HSENSOR_TEMP_TITLE"),audio_buf.index("R_READ_TIME_{}".format(temp_shi)),\\r
+                        audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT"),audio_buf.index("R_READ_TIME_{}".format(dot_ge)))\r
+                        EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+                    else:\r
+                        str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_HSENSOR_TEMP_TITLE"),audio_buf.index("R_READ_TIME_{}".format(temp_shi)),\\r
+                        audio_buf.index("R_READ_STEP_3"))\r
+                        EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+\r
+            else:\r
+                temp_shi = int(data_tmp)//10\r
+                temp_ge = int(data_tmp)%10\r
+\r
+                if temp_ge > 0:#45\r
+                    str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_HSENSOR_TEMP_TITLE"),audio_buf.index("R_READ_TIME_{}".format(temp_shi)),\\r
+                    audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_{}".format(temp_ge)))\r
+                    EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+                else:\r
+                    str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_HSENSOR_TEMP_TITLE"),audio_buf.index("R_READ_TIME_{}".format(temp_shi)),\\r
+                    audio_buf.index("R_READ_STEP_3"))\r
+                    EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+                            \r
+\r
+        def play_hr_value(self, event, msg): #播放心率数值\r
+            video_state = EventMesh.publish("get_video_state")\r
+            flag = EventMesh.publish("get_call_state") \r
+            if msg != None:\r
+                if flag == 0 and self.fall_flag == 0 and video_state == 0:\r
+                    EventMesh.publish("close_timer_all")#\r
+                    if msg >= 50:\r
+                        # str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_HSENSOR_RESULT_OK"))\r
+                        # EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+                        self.hr_value = msg\r
+                        EventMesh.publish("set_hr_blood_led",2)#测量成功\r
+                        # self.timer.start(2*1000,1,self.play_hr_fun)\r
+                        self.play_hr_fun(0)\r
+                    else:\r
+                        str_data ='mp3files={}.mp3'.format(audio_buf.index("R_HSENSOR_RESULT_FAILE"))\r
+                        EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+                        EventMesh.publish("set_hr_blood_led",3)#测量异常\r
+                else:\r
+                    EventMesh.publish("set_hr_blood_led",3)#测量异常\r
+\r
+        def play_hr_fun(self,argc):#播放心率测试值\r
+            video_state = EventMesh.publish("get_video_state")\r
+            flag = EventMesh.publish("get_call_state") \r
+            \r
+            if flag == 0 and self.fall_flag == 0 and video_state == 0:#电话通话中 或者呼叫中挂断中断\r
+                EventMesh.publish("close_timer_all")#\r
+                data = self.hr_value\r
+                if data > 220:\r
+                    data = 220\r
+                if data < 100:\r
+                    if data%10 == 0:\r
+                        str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_HSENSOR_RESULT_HR_TITLE"),audio_buf.index("R_READ_TIME_{}".format(data//10)),\\r
+                        audio_buf.index("R_READ_STEP_3"))\r
+                        EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+                    else:\r
+                        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)),\\r
+                        audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_{}".format(data%10)))\r
+                        EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+                else: \r
+                    shi = (data%100)//10 #210\r
+                    ge = (data%100)%10\r
+                    #210 234\r
+                    if shi > 0:\r
+                        if ge == 0:#210 230 120\r
+                            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)),\\r
+                            audio_buf.index("R_READ_STEP_2"),audio_buf.index("R_READ_TIME_{}".format(shi)),audio_buf.index("R_READ_STEP_3"))\r
+                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+                        else:\r
+                            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)),\\r
+                            audio_buf.index("R_READ_STEP_2"),audio_buf.index("R_READ_TIME_{}".format(shi)),audio_buf.index("R_READ_STEP_3"),\\r
+                            audio_buf.index("R_READ_TIME_{}".format(ge)))\r
+                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+                    else:\r
+                        if ge == 0:#200 100 209 108\r
+                            str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_HSENSOR_RESULT_HR_TITLE"),audio_buf.index("R_READ_TIME_{}".format(data//100)),\\r
+                            audio_buf.index("R_READ_STEP_2"))\r
+                            EventMesh.publish("play_audio_file",str_data)#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+                        else:\r
+                            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)),\\r
+                            audio_buf.index("R_READ_STEP_2"),audio_buf.index("R_READ_TIME_0"),audio_buf.index("R_READ_TIME_{}".format(ge)))\r
+                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+\r
+\r
+        def play_battery_level_value(self, event, msg): #播放当前电量\r
+            flag = EventMesh.publish("get_call_state") \r
+            video_state = EventMesh.publish("get_video_state")\r
+            if flag == 0 and self.fall_flag == 0 and video_state == 0 :#电话通话中 或者呼叫中挂断中断\r
+                EventMesh.publish("close_timer_all")#\r
+                battery = EventMesh.publish("screen_get_battery")\r
+                print("cur level",battery)\r
+                level = 100\r
+                if battery == None:\r
+                    level = 100\r
+                else:\r
+                    level = battery[1]\r
+                \r
+                data = level\r
+                if data > 100:\r
+                    data = 100\r
+                if data == 100:\r
+                    str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_CUR_BATTERY_LEVEL"),audio_buf.index("R_READ_TIME_1"),\\r
+                    audio_buf.index("R_READ_STEP_2"))\r
+                    EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+                    return\r
+                if data > 10:\r
+                    if data%10 == 0:\r
+                        str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_CUR_BATTERY_LEVEL"),audio_buf.index("R_READ_TIME_{}".format(data//10)),\\r
+                        audio_buf.index("R_READ_STEP_3"))\r
+                        EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+                    else:\r
+                        str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_CUR_BATTERY_LEVEL"),audio_buf.index("R_READ_TIME_{}".format(data//10)),\\r
+                        audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_{}".format(data%10)))\r
+                        EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+                else:\r
+                    if data == 10:\r
+                        str_data = 'mp3files={}.mp3+{}.mp3'.format(audio_buf.index("R_CUR_BATTERY_LEVEL"),audio_buf.index("R_READ_STEP_3"))\r
+                        EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+                    else :\r
+                        str_data = 'mp3files={}.mp3+{}.mp3'.format(audio_buf.index("R_CUR_BATTERY_LEVEL"),audio_buf.index("R_READ_TIME_{}".format(data)))\r
+                        EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+\r
+\r
+\r
+\r
+        def play_sugar_value(self, event, msg): #播放血糖数值\r
+            video_state = EventMesh.publish("get_video_state")\r
+            flag = EventMesh.publish("get_call_state") \r
+            if msg != None:\r
+                if flag == 0 and self.fall_flag == 0 and video_state == 0:\r
+                    EventMesh.publish("close_timer_all")#\r
+                    if msg != 0:\r
+                        # str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_HSENSOR_RESULT_OK"))\r
+                        # EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+                        EventMesh.publish("set_hr_blood_led",2)#测量成功\r
+                        # self.timer.start(2*1000,1,self.play_spo2_fun)\r
+                        self.play_sugar_fun(msg)\r
+                    else:\r
+                        str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_HSENSOR_RESULT_FAILE"))\r
+                        EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+                        EventMesh.publish("set_hr_blood_led",3)#测量异常\r
+                else:\r
+                    EventMesh.publish("set_hr_blood_led",3)#测量异常\r
+\r
+        def play_sugar_fun(self,argc):#播放血糖测试值\r
+            flag = EventMesh.publish("get_call_state") \r
+            video_state = EventMesh.publish("get_video_state")\r
+            if flag == 0 and self.fall_flag == 0 and video_state == 0:#电话通话中 或者呼叫中挂断中断\r
+                EventMesh.publish("close_timer_all")#\r
+                data = str(argc)\r
+                data_shi = 0\r
+                data_ge = 0\r
+                if data.find(".") != -1:\r
+                    data_shi = int(data.split(".")[0])\r
+                    data_ge = int(data.split(".")[1])\r
+                else:\r
+                    data_shi = int(data)\r
+                    data_ge = 0\r
+\r
+                if data_shi != 0 and data_ge != 0:\r
+                    str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_BLOOD_SUGAR"),audio_buf.index("R_READ_TIME_{}".format(data_shi)),\\r
+                    audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT"),audio_buf.index("R_READ_TIME_{}".format(data_ge)))\r
+                    EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+            else:\r
+                EventMesh.publish("set_hr_blood_led",3)#测量异常\r
+\r
+\r
+\r
+        def play_spo2_value(self, event, msg): #播放血样数值\r
+            flag = EventMesh.publish("get_call_state") \r
+            video_state = EventMesh.publish("get_video_state")\r
+            if msg != None:\r
+                if flag == 0 and self.fall_flag == 0 and video_state == 0:\r
+                    EventMesh.publish("close_timer_all")#\r
+                    if msg >= 85:\r
+                        # str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_HSENSOR_RESULT_OK"))\r
+                        # EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+                        EventMesh.publish("set_hr_blood_led",2)#测量成功\r
+                        self.spo2_value = msg\r
+                        # self.timer.start(2*1000,1,self.play_spo2_fun)\r
+                        self.play_spo2_fun(0)\r
+                    else:\r
+                        str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_HSENSOR_RESULT_FAILE"))\r
+                        EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+                        EventMesh.publish("set_hr_blood_led",3)#测量异常\r
+                else:\r
+                    EventMesh.publish("set_hr_blood_led",3)#测量异常\r
+\r
+        def play_spo2_fun(self,argc):#播放血氧测试值\r
+            flag = EventMesh.publish("get_call_state") \r
+            \r
+            if flag == 0 and self.fall_flag == 0:#电话通话中 或者呼叫中挂断中断\r
+                EventMesh.publish("close_timer_all")#\r
+                data = self.spo2_value\r
+                if data > 100:\r
+                    data = 100\r
+                if data == 100:\r
+                    str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_HSENSOR_SPO2_TITLE"),audio_buf.index("R_READ_TIME_{}".format(data//10)),\\r
+                    audio_buf.index("R_READ_STEP_2"))\r
+                    EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+                else:\r
+                    if data % 10 == 0:\r
+                        str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_HSENSOR_SPO2_TITLE"),audio_buf.index("R_READ_TIME_{}".format(data//10)),\\r
+                        audio_buf.index("R_READ_STEP_3"))\r
+                        EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+                        pass\r
+                    else:\r
+                        str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_HSENSOR_SPO2_TITLE"),audio_buf.index("R_READ_TIME_{}".format(data//10)),\\r
+                        audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_{}".format(data%10)))\r
+                        EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+\r
+\r
+        def set_sim_mode(self, event, msg): #mode 1 蓝灯闪烁 可识别卡 但未联网 2 可绑定appsim正常 3 手表不识别卡或者未插卡\r
+            flag = EventMesh.publish("get_call_state") \r
+            video_state = EventMesh.publish("get_video_state")\r
+            if flag == 0 and self.fall_flag == 0 and video_state == 0 :#电话通话中 或者呼叫中挂断中断\r
+                EventMesh.publish("close_timer_all")#\r
+                # EventMesh.publish("stop_led_timer")#设置参数\r
+                mode = 0\r
+                signal = EventMesh.publish("get_sim_Status")\r
+                if signal != None:\r
+                    if signal == 1:#有卡 \r
+                        if EventMesh.publish(constants.EVENT.GET_CONNECT) == 1:#未联网提示关机\r
+                            mode = 2\r
+                        else:\r
+                            mode = 1\r
+                    else:#未插卡\r
+                        mode = 3\r
+                if mode == 1:#白色灯\r
+                    EventMesh.publish("set_led_time_arg",[1,2,10,led_mode.FLASH_LIGHT_WHITE,10,5,led_mode.OTHER_MEASURE_MODE])#測量成功\r
+                    # 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])#设置参数\r
+                    str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_SIM_FAILE"))\r
+                    EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+                    pass\r
+                elif mode == 2:#蓝灯色灯\r
+                    EventMesh.publish("set_led_time_arg",[1,2,10,led_mode.FLASH_LIGHT_GREEN,10,5,led_mode.OTHER_MEASURE_MODE])#測量成功\r
+                    # 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])#设置参数\r
+                    str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_SIM_CONNECT"))\r
+                    EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+                    pass\r
+                elif mode == 3:#红灯闪烁\r
+                    EventMesh.publish("set_led_time_arg",[1,2,10,led_mode.FLASH_LIGHT_RED,10,5,led_mode.OTHER_MEASURE_MODE])#測量成功\r
+                    str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_NO_SIM"))\r
+                    EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+                pass\r
+            \r
+        def dial_sos_phone(self, event, msg): #拨打紧急求助电话\r
+            flag = EventMesh.publish("get_call_state")\r
+            video_state = EventMesh.publish("get_video_state")\r
+            if flag == 0 and video_state == 0:\r
+            \r
+                signal = EventMesh.publish("screen_get_sig")\r
+                if signal != None:\r
+                    if signal >= 0 and signal <= 31:#有卡 \r
+                        if EventMesh.publish(constants.EVENT.GET_CONNECT) == 1:#未联网提示关机\r
+                            sos_number = EventMesh.publish("get_dial_sos_number")\r
+                            if sos_number != None:\r
+                                if len(sos_number) != 0:\r
+                                    EventMesh.publish("close_timer_all")#\r
+                                    EventMesh.publish("set_sos_flag",1)\r
+                                        \r
+                                else:#未设置sos紧急求助号码\r
+                                    EventMesh.publish("close_timer_all")#\r
+                                    str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_NO_SET_SOS_DIAL"))\r
+                                    EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+                                    pass\r
+                        else:\r
+                            EventMesh.publish("close_timer_all")#\r
+                            EventMesh.publish("set_led_time_arg",[1,2,10,led_mode.FLASH_LIGHT_WHITE,10,5,led_mode.OTHER_MEASURE_MODE])#測量成功\r
+                            str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_SIM_FAILE"))\r
+                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+                    else:#未插卡\r
+                        EventMesh.publish("close_timer_all")#\r
+                        EventMesh.publish("set_led_time_arg",[1,2,10,led_mode.FLASH_LIGHT_RED,10,5,led_mode.OTHER_MEASURE_MODE])#測量成功\r
+                        str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_NO_SIM"))\r
+                        EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+        \r
+        def play_cur_time_event(self, event, msg): #播放当前时间\r
+            flag = EventMesh.publish("get_call_state") \r
+            video_state = EventMesh.publish("get_video_state")\r
+            if flag == 0 and self.fall_flag == 0 and video_state == 0:#电话通话中 或者呼叫中挂断中断\r
+                EventMesh.publish("close_timer_all")#\r
+                \r
+                data = RTC().datetime()\r
+                hour = data[4]\r
+                min = data[5]\r
+                # EventMesh.debug_log("hour",hour,min)\r
+                self.old_hour = hour\r
+                self.old_min = min\r
+                if self.old_hour == 0:\r
+                    if self.old_min <= 9:#00:09\r
+                        if self.old_min == 0:#0点整\r
+                            str_data = 'mp3files={}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_0")\\r
+                            ,audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT"))\r
+                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+                        else:#0点09分\r
+                            str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_0")\\r
+                            ,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))\\r
+                            ,audio_buf.index("R_READ_TIME_MIN"))\r
+                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+                            pass\r
+\r
+                    else:\r
+                        if self.old_min % 10 == 0:#0点2十分 0点3十分\r
+                            str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_0")\\r
+                            ,audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT"),audio_buf.index("R_READ_TIME_{}".format(self.old_min // 10))\\r
+                            ,audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_MIN"))\r
+                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+                            pass\r
+                        else:#0点2十8分\r
+                            str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_0")\\r
+                            ,audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT"),audio_buf.index("R_READ_TIME_{}".format(self.old_min // 10))\\r
+                            ,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"))\r
+                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+                            pass\r
+\r
+                elif self.old_hour <= 9:#8:09 9:20 9:45\r
+                    if self.old_min <= 9:#9点09分\r
+                        if self.old_min <= 0:\r
+                            str_data = 'mp3files={}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(self.old_hour))\\r
+                            ,audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT"))\r
+                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+                            pass\r
+                        else:\r
+                            str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(self.old_hour))\\r
+                            ,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))\\r
+                            ,audio_buf.index("R_READ_TIME_MIN"))\r
+                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+\r
+                    else:\r
+                        if self.old_min % 10 == 0:#9点2十分 9点4十分\r
+                            str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(self.old_hour))\\r
+                            ,audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT"),audio_buf.index("R_READ_TIME_{}".format(self.old_min //10))\\r
+                            ,audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_MIN"))\r
+                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+                        else:#9点2十4分\r
+                            str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(self.old_hour))\\r
+                            ,audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT"),audio_buf.index("R_READ_TIME_{}".format(self.old_min //10))\\r
+                            ,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"))\r
+                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+\r
+\r
+                else:#12:0\r
+                    if self.old_min == 0:#12:00 13:00 15:00 20 10 11 12 13 14 15\r
+                        self.play_count+=1\r
+                        hour_shi = self.old_hour//10\r
+                        hour_ge = self.old_hour%10\r
+                        if self.old_hour == 10:#十点整\r
+                            str_data = 'mp3files={}.mp3+{}.mp3'.format(audio_buf.index("R_READ_STEP_3")\\r
+                            ,audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT"))\r
+                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+\r
+                        elif self.old_hour == 20:\r
+                            str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(hour_shi))\\r
+                            ,audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT"))\r
+                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+\r
+                        else:\r
+                            if hour_shi <= 1:#十3点整\r
+                                str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_STEP_3")\\r
+                                ,audio_buf.index("R_READ_TIME_{}".format(hour_ge)),audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT"))\r
+                                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+\r
+                            else:\r
+                                str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(hour_shi))\\r
+                                ,audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_{}".format(hour_ge)),audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT"))\r
+                                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+\r
+                    else:\r
+                        if self.old_hour == 10:#10:09 10:10\r
+                            if self.old_min <= 9:\r
+                                str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_STEP_3")\\r
+                                ,audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT"),audio_buf.index("R_READ_TIME_0")\\r
+                                ,audio_buf.index("R_READ_TIME_{}".format(self.old_min)),audio_buf.index("R_READ_TIME_MIN"))\r
+                                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+                            else:\r
+                                if self.old_min % 10 == 0:#十点2十分\r
+                                    str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_STEP_3")\\r
+                                    ,audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT"),audio_buf.index("R_READ_TIME_{}".format(self.old_min//10))\\r
+                                    ,audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_MIN"))\r
+                                    EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+                                else:#十点2十1分\r
+                                    str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_STEP_3")\\r
+                                    ,audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT"),audio_buf.index("R_READ_TIME_{}".format(self.old_min//10))\\r
+                                    ,audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_{}".format(self.old_min%10))\\r
+                                    ,audio_buf.index("R_READ_TIME_MIN"))\r
+                                    EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+\r
+                        else:\r
+                            if self.old_hour < 20:#19:00\r
+                                if self.old_min <= 9:#19:09 \r
+                                    if self.old_min == 0:\r
+                                        str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_STEP_3")\\r
+                                        ,audio_buf.index("R_READ_TIME_{}".format(self.old_hour % 10)),audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT"))\r
+                                        EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+                                        pass\r
+                                    else:\r
+                                        str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_STEP_3")\\r
+                                        ,audio_buf.index("R_READ_TIME_{}".format(self.old_hour % 10)),audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT")\\r
+                                        ,audio_buf.index("R_READ_TIME_0"),audio_buf.index("R_READ_TIME_{}".format(self.old_min % 10))\\r
+                                        ,audio_buf.index("R_READ_TIME_MIN"))\r
+                                        EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+                                    \r
+                                else:#19:18 19:40 19:56\r
+                                    if self.old_min % 10 == 0:#十9点2十分 十9点3十分\r
+                                        str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_STEP_3")\\r
+                                        ,audio_buf.index("R_READ_TIME_{}".format(self.old_hour % 10)),audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT")\\r
+                                        ,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"))\r
+                                        EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+                                    else:#十9点2十1分\r
+                                        str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_STEP_3")\\r
+                                        ,audio_buf.index("R_READ_TIME_{}".format(self.old_hour % 10)),audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT")\\r
+                                        ,audio_buf.index("R_READ_TIME_{}".format(self.old_min // 10)),audio_buf.index("R_READ_STEP_3")\\r
+                                        ,audio_buf.index("R_READ_TIME_{}".format(self.old_min % 10)),audio_buf.index("R_READ_TIME_MIN"))\r
+                                        EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+\r
+                            else:\r
+                                hour_shi = self.old_hour//10\r
+                                hour_ge = self.old_hour%10\r
+\r
+                                min_shi = self.old_min//10\r
+                                min_ge = self.old_min%10\r
+\r
+                                #20:08 20:18  20:20\r
+                                if hour_ge == 0:\r
+                                    if self.old_min <= 9:\r
+                                        if self.old_min == 0:\r
+                                            str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(hour_shi))\\r
+                                            ,audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT"))\r
+                                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+                                            pass\r
+                                        else:\r
+                                            str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(hour_shi))\\r
+                                            ,audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT"),audio_buf.index("R_READ_TIME_0")\\r
+                                            ,audio_buf.index("R_READ_TIME_{}".format(min_ge)),audio_buf.index("R_READ_TIME_MIN"))\r
+                                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+\r
+                                    else:\r
+                                        if min_ge == 0:#2十点2十分\r
+                                            str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(hour_shi))\\r
+                                            ,audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT"),audio_buf.index("R_READ_TIME_{}".format(min_shi))\\r
+                                            ,audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_MIN"))\r
+                                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+                                        else:#2十点2十1分\r
+                                            str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(hour_shi))\\r
+                                            ,audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT"),audio_buf.index("R_READ_TIME_{}".format(min_shi))\\r
+                                            ,audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_{}".format(min_ge)),audio_buf.index("R_READ_TIME_MIN"))\r
+                                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+\r
+                                else:#21:08 21:18\r
+                                    if self.old_min <= 9:\r
+                                        if self.old_min == 0:\r
+                                            str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(hour_shi))\\r
+                                            ,audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_{}".format(hour_ge))\\r
+                                            ,audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT"))\r
+                                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+                                            pass\r
+                                        else:\r
+                                            str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(hour_shi))\\r
+                                            ,audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_{}".format(hour_ge))\\r
+                                            ,audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT"),audio_buf.index("R_READ_TIME_0")\\r
+                                            ,audio_buf.index("R_READ_TIME_{}".format(min_ge)),audio_buf.index("R_READ_TIME_MIN"))\r
+                                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+                                    else:\r
+                                        if min_ge == 0:#2十3点3十分\r
+                                            str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(hour_shi))\\r
+                                            ,audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_{}".format(hour_ge))\\r
+                                            ,audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT"),audio_buf.index("R_READ_TIME_{}".format(min_shi))\\r
+                                            ,audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_MIN"))\r
+                                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+                                        else:#2十3点3十1分\r
+                                            str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(hour_shi))\\r
+                                            ,audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_{}".format(hour_ge))\\r
+                                            ,audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT"),audio_buf.index("R_READ_TIME_{}".format(min_shi))\\r
+                                            ,audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_{}".format(min_ge)),audio_buf.index("R_READ_TIME_MIN"))\r
+                                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+\r
+\r
+        def play_timer_cb_1(self,*agrs):\r
+            return\r
+\r
+        def play_center_phone(self, event, msg): #msg\r
+            flag = EventMesh.publish("get_call_state")#在通话或者电话拨进 或者拨出不允许设备再次拨出\r
+            video_state = EventMesh.publish("get_video_state")\r
+            if flag == 0 and self.fall_flag == 0 and video_state == 0:\r
+                EventMesh.publish("close_timer_all")#\r
+            \r
+                center_dial = EventMesh.publish("get_storage_config","center_dial")\r
+                if center_dial != None:\r
+                    if len(center_dial) > 0:\r
+                        str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_SOS_ALERT"))\r
+                        EventMesh.publish("play_audio_file",[str_data,0])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+                        voiceCall.callStart(str(center_dial))\r
+                        \r
+                    \r
+                else:#未设置号码\r
+                    # EventMesh.debug_log("play_center_phone")\r
+                    str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_NO_SET_SOS_DIAL"))\r
+                    EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+                    pass\r
+        def center_phone_cb(self,*argc): #msg\r
+            pass\r
+\r
+\r
+\r
+\r
+        def play_imei_event(self, event, msg): #msg\r
+            flag = EventMesh.publish("get_call_state") \r
+            video_state = EventMesh.publish("get_video_state")\r
+            if flag == 0 and self.fall_flag == 0 and video_state == 0:\r
+                EventMesh.publish("close_timer_all")#\r
+                imei = EventMesh.publish(constants.EVENT.GET_IMEI)\r
+                EventMesh.debug_log(imei)\r
+                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]))\\r
+                ,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])),\\r
+                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])),\\r
+                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])),\\r
+                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])))\r
+                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+\r
+                str_data = 'mp3files=R_READ_TIME_1.mp3+R_READ_TIME_2.mp3+R_READ_TIME_3.mp3+R_READ_TIME_4.mp3+R_READ_TIME_5.mp3+R_READ_TIME_6.mp3+R_READ_TIME_7.mp3+R_READ_TIME_8.mp3+R_READ_TIME_9.mp3+R_READ_TIME_0.mp3+R_READ_TIME_1.mp3+R_READ_TIME_1.mp3+R_READ_TIME_2.mp3+R_READ_TIME_3.mp3+R_READ_TIME_4.mp3'\r
+                \r
+        def get_unread_wechat_state(self,event, msg): \r
+\r
+            return self.set_unread_wechat\r
+        \r
+        def set_unread_wechat_state(self, event, msg): \r
+            self.set_unread_wechat = msg\r
+\r
+        def get_wechat_data(self,event, msg): \r
+\r
+            return [self.MXA_MSG ,self.wechat_recode_list]\r
+        \r
+        def set_wechat_data(self, event, msg): \r
+            # EventMesh.debug_log("set_wechat_data1 ",msg,self.wechat_num)\r
+            self.MXA_MSG = msg[0]\r
+            self.wechat_recode_list = msg[1]\r
+            self.wechat_num = self.wechat_recode_list["num"]\r
+            with open("/usr/static/storage_file/wechat_record.json","w",encoding="utf-8") as fd:\r
+                ujson.dump(self.wechat_recode_list,fd)\r
+                #写编号\r
+            # EventMesh.debug_log("set_wechat_data2:{} ".format(self.wechat_num))\r
+        \r
+\r
+        def get_wechat_time(self, event, msg):\r
+            return  [self.press_btn,self.timeSecond]\r
+\r
+        def start_wechat_record(self, event, msg): #开始录音相关配置\r
+            if EventMesh.publish(constants.EVENT.GET_CONNECT) == 1:#未联网不需要录音\r
+                flag = EventMesh.publish("get_call_state") \r
+                video_state = EventMesh.publish("get_video_state")\r
+                if flag == 0 and self.fall_flag == 0 and video_state == 0:\r
+                    if self.press_btn == 0:\r
+                        self.press_btn = 1\r
+                        audio_state = EventMesh.publish("get_audio_state")\r
+                        if audio_state == 1:\r
+                            self.aud.stop()\r
+                        EventMesh.publish("close_timer_all")#\r
+                        EventMesh.publish("set_led_time_arg",[1,1,160,led_mode.LONG_LIGHT_GREEN,4,2,led_mode.WECHAT_LED_MODE])#測量成功\r
+                        # EventMesh.publish("set_led_time_arg",[1000,1000,1,led_mode.LONG_LIGHT_GREEN,led_mode.OPEN_LONG_LIGHT_MODE,led_mode.WECHAT_LED_MODE])#測量成功\r
+                    \r
+                        date_tmp = utime.localtime()\r
+                        time_tmp = utime.mktime(date_tmp)\r
+                        self.timeSecond = time_tmp#保存按下的时间长s\r
+                        self.aud.setVolume(11)#设置音量最大\r
+                        \r
+                        EventMesh.debug_log("talking1.0")\r
+                        # if self.wechat_num >= self.MXA_MSG:\r
+                        #     self.wechat_num = 0 \r
+                        # self.wechat_num += 1\r
+                        # self.wechat_show = self.wechat_num\r
+                        # self.record_test.start("/usr/static/storage_file/{}.amr".format(self.wechat_show),16) \r
+                        self.record_test.start("/usr/static/storage_file/wechat.amr",16) \r
+                \r
+            else:\r
+                self.timeSecond = 0\r
+                self.press_btn = 0\r
+        def get_wechat_state(self, event, msg):\r
+            return self.press_btn\r
+\r
+        def send_wechat_record(self, event, msg): #发送录音文件\r
+            if self.press_btn == 1:\r
+                self.press_btn = 0\r
+                self.record_test.stop() #停止錄音\r
+                EventMesh.publish("stop_led_timer")#关闭灯\r
+                EventMesh.publish("set_led_time_arg",[1,1,0,led_mode.FLASH_LIGHT_GREEN,4,2,led_mode.OTHER_MEASURE_MODE])#測量成功\r
+                # EventMesh.publish("set_led_time_arg",[0,1000,1,led_mode.LONG_LIGHT_GREEN,led_mode.OPEN_LONG_LIGHT_MODE,led_mode.OTHER_MEASURE_MODE])#測量成功\r
+                self.countdown_old = 0\r
+\r
+                date_tmp = utime.localtime()\r
+                time_tmp = utime.mktime(date_tmp)\r
+\r
+                self.countdown_old = msg\r
+                if self.countdown_old >= 15:\r
+                    self.countdown_old = 15\r
+                if self.countdown_old <= 0:\r
+                    #录音时间太短\r
+                    return\r
+                else:\r
+                    # self.wechat_recode_list["%02d"%(self.wechat_show)] = "read:0"\r
+                    # self.wechat_recode_list["num"] = self.wechat_show\r
+                    EventMesh.debug_log("self.wechat_recode_list :{}".format(self.wechat_recode_list))\r
+\r
+                    # with open("/usr/static/storage_file/wechat_record.json","w+",encoding="utf-8") as fd:\r
+                    #     ujson.dump(self.wechat_recode_list,fd)\r
+                    EventMesh.debug_log("send wechat data!!!!!!!!!!!!!!!!!!!!!")\r
+\r
+                    check_txt = ql_fs.path_exists("/usr/static/storage_file/wechat.amr")\r
+                    if check_txt == True :\r
+                        path = "/usr/static/storage_file/wechat.amr"\r
+                        with open(path,"rb") as fd:\r
+                            buf = bytearray(ql_fs.path_getsize(path))\r
+                            fd.readinto(buf)\r
+                            senddata = [self.countdown_old,buf]\r
+                            EventMesh.publish(constants.PROTOCOL.TKS_SEND,senddata)\r
+\r
+                    # with open("/usr/static/storage_file/wechat_record.json","w+",encoding="utf-8") as fd:\r
+                    #     ujson.dump(self.wechat_recode_list,fd)\r
+                    # EventMesh.debug_log("send wechat data!!!!!!!!!!!!!!!!!!!!!")\r
+\r
+                    # check_txt = ql_fs.path_exists("/usr/static/storage_file/{}.amr".format(self.wechat_show))\r
+                    # if check_txt == True :\r
+                    #     path = "/usr/static/storage_file/{}.amr".format(self.wechat_show)\r
+                    #     with open(path,"rb") as fd:\r
+                    #         buf = bytearray(ql_fs.path_getsize(path))\r
+                    #         fd.readinto(buf)\r
+                    #         senddata = [self.countdown_old,buf]\r
+                    #         EventMesh.publish(constants.PROTOCOL.TKS_SEND,senddata)\r
+            else:\r
+                self.press_btn = 0\r
+\r
+        def play_wechat_last_amr(self, event, msg):#播放微聊最后一条语音文件\r
+            flag = EventMesh.publish("get_call_state") \r
+            if flag == 0:#电话通话中 或者呼叫中挂断中断\r
+                EventMesh.publish("close_timer_all")#\r
+                if self.wechat_recode_list != None:\r
+                    num = 0\r
+                    play_state = 0\r
+                    if len(self.wechat_recode_list) > 1:\r
+                        num = int(self.wechat_recode_list["num"])\r
+                        #EventMesh.debug_log("self.wechat_recode_list1:{}".format(self.wechat_recode_list))\r
+                        if num != 0:\r
+                            last_num = str("%02d"%(num))\r
+                            last_tmp = self.wechat_recode_list[last_num]\r
+                            last_read = int(last_tmp.split(":")[1])\r
+                            if last_read == 1:#如果最后一条没有读则读最新的一条\r
+                                self.wechat_recode_list[last_num] = "read:0"\r
+                                self.wechat_recode_list["num"] = num \r
+                                with open("/usr/static/storage_file/wechat_record.json","w+",encoding="utf-8") as fd:\r
+                                    ujson.dump(self.wechat_recode_list,fd)\r
+                            else:\r
+                                sotr_new = {}\r
+                                sotr_new = sorted(self.wechat_recode_list.keys(), reverse=True)#降序排序\r
+                                # EventMesh.debug_log("sotr_new:{}".format(sotr_new))\r
+                                for i in range(len(self.wechat_recode_list)-1):#1 01 02 \r
+                                    key = sotr_new[i+1]\r
+                                    num_id = int(key)\r
+                                    #EventMesh.debug_log("key:{} num_id:{}".format(key,num_id))\r
+                                    if key in self.wechat_recode_list:#\r
+                                        str_tmp = self.wechat_recode_list[key]\r
+                                        read = int(str_tmp.split(":")[1])\r
+                                        if read != 0:#未读是按一下播放下一条同时删除\r
+                                            check_amr = ql_fs.path_exists("/usr/static/storage_file/{}.amr".format(num_id))#还要检测这个文件是否存在\r
+                                            if check_amr == True:\r
+                                                self.wechat_recode_list[key] = "read:0"\r
+                                                self.wechat_recode_list["num"] = num \r
+                                                EventMesh.debug_log("self.wechat_recode_list2:{} num_id:{} num:{}".format(self.wechat_recode_list,num_id,num))\r
+                                                # self.aud.play(1, 1, '/usr/static/storage_file/{}.amr'.format(num))  #文件名前面要加上路径\r
+                                                play_state = 1\r
+                                                with open("/usr/static/storage_file/wechat_record.json","w+",encoding="utf-8") as fd:\r
+                                                    ujson.dump(self.wechat_recode_list,fd)\r
+                                                break\r
+                                            else:\r
+                                                continue\r
+                                        else:\r
+                                            continue\r
+                                    else:\r
+                                        continue\r
+                            #EventMesh.debug_log("play_state:{}".format(play_state))\r
+                            # if play_state == 0:#\r
+                            check_amr = ql_fs.path_exists("/usr/static/storage_file/{}.amr".format(num))#还要检测这个文件是否存在\r
+                            if check_amr == True:\r
+                                self.aud.play(1, 1, '/usr/static/storage_file/{}.amr'.format(num))  #文件名前面要加上路径\r
+\r
+        def play_unread_wechat_infor(self,event,msg):#未读微聊语音\r
+            flag = EventMesh.publish("get_call_state") \r
+            video_state = EventMesh.publish("get_video_state")\r
+            if flag == 0 and self.press_btn == 0 and self.fall_flag == 0 and video_state == 0:#电话通话中 或者呼叫中挂断中断\r
+            \r
+                if self.wechat_recode_list != None:\r
+                    num = 0\r
+                    play_state = 0\r
+                    if len(self.wechat_recode_list) > 1:\r
+                        num = int(self.wechat_recode_list["num"])\r
+                        if num != 0:\r
+                            for i in range(len(self.wechat_recode_list)-1):#1 01 02 \r
+                                key = "%02d"%(i+1)\r
+                                if key in self.wechat_recode_list:#\r
+                                    str_tmp = self.wechat_recode_list[key]\r
+                                    read = int(str_tmp.split(":")[1])\r
+                                    if read == 1:#未读是按一下播放下一条同时删除\r
+                                        play_state = 1\r
+                                    else:\r
+                                        continue\r
+                                else:\r
+                                    continue\r
+                            if play_state == 1:#设置未读语音状态\r
+                                EventMesh.publish("set_unread_wechat_state",1)\r
+                            else:\r
+                                EventMesh.publish("set_unread_wechat_state",0)\r
+                                self.updateTime = 0\r
+\r
+                state = EventMesh.publish("get_unread_wechat_state")#\r
+                date_tmp = utime.localtime()\r
+                time_tmp = utime.mktime(date_tmp)\r
+                if state != None:\r
+                    if state == 1:\r
+                        EventMesh.publish("set_led_time_arg",[1,2,8,led_mode.FLASH_LIGHT_GREEN,8,4,led_mode.OTHER_MEASURE_MODE])#測量成功\r
+                        # 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])#设置参数\r
+                        if self.updateTime == 0:\r
+                            self.updateTime = time_tmp\r
+                        if self.updateTime != 0:\r
+                            if time_tmp - self.updateTime >= 10*60:\r
+                                self.updateTime = time_tmp\r
+                                #播放音频文件\r
+                                EventMesh.publish("close_timer_all")\r
+                                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_UNREAD_WECHAT"))\r
+                                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)\r
+                    else:\r
+                        self.updateTime = 0\r
+            \r
+\r
+\r
+\r
+    class BtnDevice(Abstract):\r
+\r
+        def __init__(self, tp=None):\r
+            self.pk = PowerKey()\r
+            self.__pwk_timer = osTimer()\r
+            self.aud = audio.Audio(0)\r
+            self.aud.set_pa(Pin.GPIO29)\r
+            self.aud.setVolume(11)\r
+            # self.keypad = machine.KeyPad(4, 4)\r
+            self.__PowerDownTimeOut = 3000\r
+            self.__tp = tp\r
+            self.pwk_press = 0\r
+            self.pwk_count = 0\r
+\r
+            self.powerKey_status = 0\r
+            self.sosKey = 0\r
+            self.wechatKey = 0\r
+            self.sosKey_status = 1#默认是低电平\r
+            self.WeChatKey_status = 1#默认是低电平\r
+\r
+            self.wechatKey_timer = osTimer()\r
+            self.wechatKey_count = 0\r
+            self.wechatKey_press = 0 \r
+\r
+            self.sosKey_timer = osTimer()\r
+            self.sosKey_count = 0\r
+            self.sosKey_press = 0 \r
+            self.sosKey_long_press = 0\r
+\r
+            self.wechatKey_press_count = 0\r
+\r
+            self.timeSeconOld = 0\r
+            self.wechat_state = 0 #按下录音时的状态\r
+\r
+            \r
+            self.sosKey_press_count = 0\r
+\r
+\r
+           \r
+\r
+            self.extint_22 = 0\r
+            self.GPIO22_status = 1\r
+\r
+            self.extint_17 = 0\r
+            self.KeyCall2_status = 1\r
+\r
+            self.extint_7 = 1\r
+            self.extint_8 = 1\r
+\r
+            self.extint_19= 0\r
+            self.KeyCall1_status = 1\r
+\r
+            self.Keycall1_timer = osTimer()\r
+            self.Keycall1_count = 0\r
+            self.Keycall1_press = 0 \r
+            self.Keycall1_press_count = 0\r
+            self.Keycall1_long_press = 0\r
+\r
+            self.Keycall2_timer = osTimer()\r
+            self.Keycall2_count = 0\r
+            self.Keycall2_press = 0 \r
+            self.Keycall2_press_count = 0\r
+            self.Keycall2_long_press = 0\r
+\r
+            \r
+\r
+            self.pwkey_timer = osTimer()\r
+            self.pwk_key = 0\r
+            self.GPIO26_status = 1\r
+            self.pwKey_press_count = 0\r
+            self.pwkey_count = 0\r
+            self.pwkey_press = 0\r
+            self.led_state = 0\r
+            self.hsensorTest_timer = osTimer()\r
+            self.factoryTest_timer = osTimer()\r
+            self.factoryTest_count = 0\r
+            self.factoryTest_led_count = 0\r
+            self.factoryTest_flag = 0\r
+            self.factory_timesec = 0\r
+            self.btnInfo_queue = Queue()\r
+            _thread.stack_size(10*1024+192)\r
+            _thread.start_new_thread(self.btnInfo_queue_thread, ())\r
+            _thread.stack_size(8*1024)\r
+            \r
+            EventMesh.subscribe("publish_message_event_btnInfo",self.publish_message_event_btnInfo)\r
+\r
+            EventMesh.subscribe("close_wechat_btn_timer", self.close_wechat_btn_timer)#来电强制关闭微聊语音\r
+\r
+        def btnInfo_queue_thread(self):\r
+            while True:\r
+                data = self.btnInfo_queue.get()\r
+                #EventMesh.debug_log("Info_queue:data = {}".format(data))\r
+                if data != None:\r
+                    try:\r
+                        data["func"](data["data"])\r
+                    except Exception as e:\r
+                        #EventMesh.debug_log("btnInfo_queue:ERROR:{}".format(e))\r
+                        usys.print_exception(e)\r
+        def publish_message_event_btnInfo(self,event,msg):\r
+            self.btnInfo_queue.put(msg)\r
+            EventMesh.publish(constants.EVENT.SYSTEM_UP)#唤醒休眠\r
+            \r
+        def publish_wechat_btn_event_cb(self, *args, **kwargs):\r
+            EventMesh.publish("publish_message_event_btnInfo",{"func":self.wechatKey_press_cb,"data":0})  \r
+\r
+        def publish_soskey_btn_event_cb(self, *args, **kwargs):\r
+            EventMesh.publish("publish_message_event_btnInfo",{"func":self.sosKey_press_cb,"data":0})  \r
+\r
+        def publish_call1key_btn_event_cb(self, *args, **kwargs):\r
+            EventMesh.publish("publish_message_event_btnInfo",{"func":self.call1Key_press_cb,"data":0})  \r
+        \r
+        def publish_call2key_btn_event_cb(self, *args, **kwargs):\r
+            EventMesh.publish("publish_message_event_btnInfo",{"func":self.call2Key_press_cb,"data":0})  \r
+\r
+        def publish_pwkKey_btn_event_cb(self, *args, **kwargs):\r
+            EventMesh.publish("publish_message_event_btnInfo",{"func":self.pwKey_press_cb,"data":0})  \r
+\r
+    \r
+\r
+        def post_processor_after_instantiation(self):\r
+            # self.keypad.init()\r
+            # self.keypad.set_callback(self.key_callback)\r
+        \r
+            self.pk.powerKeyEventRegister(self.powerKey_callback)\r
+            \r
+            self.pwk_key26 = ExtInt(ExtInt.GPIO26, ExtInt.IRQ_RISING_FALLING, ExtInt.PULL_DISABLE, self.pwk_extint_cb)\r
+            self.pwk_key26.enable() \r
+\r
+            self.sosKey = ExtInt(ExtInt.GPIO6,ExtInt.IRQ_RISING_FALLING, ExtInt.PULL_PU, self.sosKey_extint_cb)#S0S键\r
+            self.sosKey.enable()\r
+\r
+            self.extint_19 = ExtInt(ExtInt.GPIO19,ExtInt.IRQ_RISING_FALLING, ExtInt.PULL_PU, self.key19_extint_cb)\r
+            self.extint_19.enable()\r
+\r
+            self.extint_17 = ExtInt(ExtInt.GPIO7,ExtInt.IRQ_RISING_FALLING, ExtInt.PULL_PU, self.key17_extint_cb)\r
+            self.extint_17.enable()\r
+\r
+            self.wechatKey = ExtInt(ExtInt.GPIO22, ExtInt.IRQ_RISING_FALLING, ExtInt.PULL_PU, self.wechatKey_extint_cb)\r
+            self.wechatKey.enable()\r
+\r
+        def key17_extint_cb(self,args):#call 1\r
+            print("call 1!!!!!!!")\r
+            # EventMesh.debug_log('key17_extint_cb :{}'.format(args))\r
+            open_power = EventMesh.publish("get_power_on_state")#获取开机标识\r
+            open_power_off = EventMesh.publish("get_power_off_state")#获取开机标识\r
+            video_state = EventMesh.publish("get_video_state")#获取视频通话状态 5在通话状态不允许按键输入\r
+            get_video_state = EventMesh.publish("get_video_in_out_state")\r
+            dev_app_mode = EventMesh.publish("get_dev_app_mode")\r
+            if open_power != None and open_power_off != None and dev_app_mode != None:\r
+                if open_power == 0 or open_power_off == 1 or  (dev_app_mode == 1 and get_video_state != 0):\r
+                    return\r
+            fall_down = EventMesh.publish("get_fall_down_state")#跌倒报警标识\r
+            flag = EventMesh.publish("get_call_state")#在通话或者电话拨进 或者拨出不允许寻找设备\r
+            if fall_down != None:\r
+                if fall_down != 0:\r
+                    return\r
+            \r
+            self.KeyCall1_status = int(args[1]) \r
+            # EventMesh.debug_log('key17_extint_cb :{}'.format(args))\r
+            if self.KeyCall1_status == 0:\r
+                self.KeyCall1_status = 1\r
+            else:\r
+                self.KeyCall1_status = 0\r
+                pass\r
+            if NEW_ENABLE == 0:#新的按键功能定义\r
+                if self.KeyCall1_status == 0:\r
+                    video_state = EventMesh.publish("get_video_state")\r
+                    if video_state != 0:#视频通话打入或者接听后允许挂断视频通话\r
+                        if video_state != 6:#6是app打手表需要接通\r
+                            # EventMesh.publish("video_dev_reject_cb",2)#挂断视频通话\r
+                            return\r
+            self.WeChatKey_status = self.wechatKey.read_level()\r
+            self.GPIO26_status = self.pwk_key26.read_level()\r
+            self.KeyCall2_status = self.extint_19.read_level()\r
+            self.sosKey_status = self.sosKey.read_level()\r
+            # EventMesh.debug_log('key17_extint_cb',args,self.KeyCall2_status,self.WeChatKey_status,self.GPIO26_status,self.KeyCall1_status,self.sosKey_status) # args[0]:gpio号 args[1]:上升沿或下降沿\r
+            if self.WeChatKey_status != 0 and self.GPIO26_status != 0 and self.KeyCall2_status != 0 and self.sosKey_status != 0:\r
+                if self.KeyCall1_status == 0:#按下\r
+                    if NEW_ENABLE == 0:#新的按键功能定义\r
+                        video_state = EventMesh.publish("get_video_state")\r
+                        if video_state != 0:#视频通话打入或者接听后允许挂断视频通话\r
+                                if video_state == 6:#6 是app拨打手表 1 是手表打app 3 是正在视频通话中 0 关闭只有第一次视频通话打入才允许接听 接通之后不允许接听了\r
+                                    EventMesh.publish("video_answer_cb")\r
+                                else:\r
+                                    pass\r
+                                    # EventMesh.publish("video_dev_reject_cb",2)#挂断视频通话\r
+                                    # self.Keycall1_press_count=0\r
+                                    # self.wechatKey_timer.stop()\r
+                                    # self.pwkey_timer.stop()\r
+                                    # self.sosKey_timer.stop()\r
+                                    # self.Keycall2_timer.stop()\r
+                                    # self.Keycall1_timer.stop()\r
+                            \r
+                                return\r
+                    EventMesh.publish("close_wechat_btn_timer")\r
+                    if self.Keycall1_press == 0 :\r
+                        self.wechatKey_timer.stop()\r
+                        self.pwkey_timer.stop()\r
+                        self.sosKey_timer.stop()\r
+                        self.Keycall2_timer.stop()\r
+                        self.Keycall1_timer.stop()\r
+\r
+                        self.pwkey_count = 0\r
+                        self.pwkey_press = 0\r
+                        self.led_state = 0\r
+                        self.pwKey_press_count=0 #电源键\r
+\r
+                        self.sosKey_count = 0\r
+                        self.sosKey_press = 0\r
+                        self.sosKey_press_count=0#sos键\r
+                        self.sosKey_long_press = 0\r
+\r
+                        self.wechatKey_count = 0\r
+                        self.wechatKey_press = 0\r
+                        self.wechatKey_press_count=0#微聊键\r
+                        self.wechat_state = 0\r
+\r
+                        self.Keycall2_count = 0\r
+                        self.Keycall2_press = 0\r
+                        self.Keycall2_press_count = 0#call 2键\r
+                        self.Keycall2_long_press = 0\r
+\r
+                        self.Keycall1_count = 0\r
+                        self.Keycall1_press = 1\r
+                        self.Keycall1_long_press = 0\r
+                        EventMesh.publish("AI_key_press")\r
+                        self.Keycall1_timer.start(100, 1, self.publish_call1key_btn_event_cb)\r
+\r
+        def call1Key_press_cb(self, data):\r
+            open_power = EventMesh.publish("get_power_on_state")#获取开机标识\r
+            open_power_off = EventMesh.publish("get_power_off_state")#获取开机标识\r
+            video_state = EventMesh.publish("get_video_state")\r
+            if open_power != None and open_power_off != None:\r
+                if open_power == 0 or open_power_off == 1:\r
+                    self.Keycall1_timer.stop()\r
+                    self.Keycall1_count = 0\r
+                    self.Keycall1_press = 0\r
+                    self.Keycall1_press_count+=1\r
+                    self.Keycall1_long_press = 0\r
+                    return\r
+            '''KEY2:联动屏幕右下角或返回键长按关机'''\r
+            self.KeyCall1_status = self.extint_17.read_level()\r
+            if self.Keycall1_press == 1 :\r
+                self.Keycall1_count += 1\r
+                if self.Keycall1_count >= 10*3: #长按3s \r
+                    flag = EventMesh.publish("get_call_state")#获取通话状态\r
+                    fall_down = EventMesh.publish("get_fall_down_state")#跌倒报警标识\r
+                    if fall_down != None:\r
+                        if fall_down != 0 or flag == 2:\r
+                            self.Keycall1_count = 0\r
+                            self.Keycall1_press = 0\r
+                            self.Keycall1_press_count = 0\r
+                            self.Keycall1_long_press = 0\r
+                            self.Keycall1_timer.stop()\r
+                            return\r
+                    if self.Keycall1_long_press == 0:\r
+                        self.Keycall1_long_press = 1\r
+                        \r
+                        flag = EventMesh.publish("get_call_state")#获取通话状态\r
+                        fall_down = EventMesh.publish("get_fall_down_state")#跌倒报警标识\r
+                        if fall_down != None:\r
+                            if fall_down != 0 or flag == 2:\r
+                                return\r
+                       \r
+                        return\r
+\r
+                    if self.KeyCall1_status == 1:\r
+                        self.Keycall1_count = 0\r
+                        self.Keycall1_press = 0\r
+                        self.Keycall1_press_count = 0\r
+                        self.Keycall1_long_press = 0\r
+                        self.Keycall1_timer.stop()\r
+                        return\r
+                    \r
+\r
+                if self.KeyCall1_status == 1:#松开\r
+                    if self.Keycall1_count >= 1: #防抖100ms\r
+                        \r
+                        self.Keycall1_timer.stop()\r
+                        self.Keycall1_count = 0\r
+                        self.Keycall1_press = 0\r
+                        self.Keycall1_press_count+=1\r
+                        self.Keycall1_timer.start(500, 0, self.publish_call1Key_timeout_cb_do)#松手超时1s判断\r
+                    \r
+\r
+        def publish_call1Key_timeout_cb_do(self, *args, **kwargs):\r
+            EventMesh.publish("publish_message_event_btnInfo",{"func":self.call1Key_timeout_cb,"data":0}) \r
+        \r
+        def call1Key_timeout_cb(self, data):#\r
+            open_power = EventMesh.publish("get_power_on_state")#获取开机标识\r
+            open_power_off = EventMesh.publish("get_power_off_state")#获取开机标识\r
+            video_state = EventMesh.publish("get_video_state")\r
+            if open_power != None and open_power_off != None:\r
+                if open_power == 0 or open_power_off == 1 :\r
+                    self.Keycall1_timer.stop()\r
+                    self.Keycall1_count = 0\r
+                    self.Keycall1_press = 0\r
+                    self.Keycall1_press_count=0\r
+                    self.Keycall1_long_press = 0\r
+                    return\r
+            flag = EventMesh.publish("get_call_state")#在通话或者电话拨进 或者拨出不允许寻找设备\r
+            fall_down = EventMesh.publish("get_fall_down_state")#跌倒报警标识\r
+            print("call2Key_timeout_cb",self.Keycall2_press_count,flag)\r
+            if self.Keycall1_press_count > 1:#\r
+                if fall_down != None:\r
+                    if fall_down != 0 or flag != 0 or video_state != 0:#在打电话或者跌倒报警提醒中不允许按键触发\r
+                        self.Keycall1_press_count = 0\r
+                        return\r
+            if self.Keycall1_press_count == 3:#心率血压测试\r
+                self.Keycall1_press_count = 0\r
+                call_state = EventMesh.publish("get_call_state")\r
+                battery = EventMesh.publish("screen_get_battery")\r
+                if call_state == None:\r
+                    call_state = 0\r
+                if call_state == 0: \r
+                    if battery != None:\r
+                        if battery[0] != "1":#在充电得时候\r
+                            EventMesh.publish("stop_led_timer")#设置参数\r
+                            EventMesh.publish("set_manual_measure_mode",1)#\r
+            elif self.Keycall1_press_count == 1:#\r
+                self.Keycall1_press_count = 0\r
+                EventMesh.publish("stop_led_timer")#设置参数\r
+                # print("video_state call",video_state)\r
+                # if video_state != 0:\r
+                #     if video_state == 6:#6 是app拨打手表 1 是手表打app 3 是正在视频通话中 0 关闭只有第一次视频通话打入才允许接听 接通之后不允许接听了\r
+                #         EventMesh.publish("video_answer_cb")\r
+                #     return\r
+                call_state = EventMesh.publish("get_call_state") \r
+                if call_state == 2:#电话拨进需要接听\r
+                    EventMesh.publish("answer_call_event")#接听电话\r
+                    return\r
+                EventMesh.publish("play_cur_step_event")##播放当前步数\r
+            \r
+\r
+            self.Keycall1_press_count = 0\r
+\r
+\r
+        def key19_extint_cb(self,args):#call 2\r
+            #print("key19_extint_cb call 2")\r
+            # EventMesh.txt_log('key19_extint_cb :{}'.format(args))\r
+            power_off = EventMesh.publish("get_power_off_state")#获取关机标识\r
+            open_power = EventMesh.publish("get_power_on_state")#获取开机标识\r
+            dev_app_mode = EventMesh.publish("get_dev_app_mode")\r
+            video_state = EventMesh.publish("get_video_state")#获取视频通话状态 5在通话状态不允许按键输入\r
+            get_video_state = EventMesh.publish("get_video_in_out_state")\r
+            if open_power != None and power_off != None and dev_app_mode != None:\r
+                if open_power == 0 or power_off == 1 or (dev_app_mode == 1 and get_video_state != 0): \r
+                    return\r
+                \r
+            fall_down = EventMesh.publish("get_fall_down_state")#跌倒报警标识\r
+            flag = EventMesh.publish("get_call_state")#在通话或者电话拨进 或者拨出不允许寻找设备\r
+            if fall_down != None:\r
+                if fall_down != 0:\r
+                    return\r
+            self.KeyCall2_status = int(args[1])\r
+            if self.KeyCall2_status == 0:\r
+                self.KeyCall2_status = 1\r
+            else:\r
+                self.KeyCall2_status = 0\r
+                pass\r
+            \r
+            if NEW_ENABLE == 0:#新的按键功能定义\r
+                if self.KeyCall2_status == 0:\r
+                    video_state = EventMesh.publish("get_video_state")\r
+                    if video_state != 0:#视频通话打入或者接听后允许挂断视频通话\r
+                        if video_state != 6:#6是app打手表需要接通\r
+                            # EventMesh.publish("video_dev_reject_cb",2)#挂断视频通话\r
+                            return\r
+            self.WeChatKey_status = self.wechatKey.read_level()\r
+            self.GPIO26_status = self.pwk_key26.read_level()\r
+            self.KeyCall1_status = self.extint_17.read_level()\r
+            self.sosKey_status = self.sosKey.read_level()\r
+            # EventMesh.debug_log('self.KeyCall1_status :{}',args,self.KeyCall1_status) # args[0]:gpio号 args[1]:上升沿或下降沿\r
+            if self.WeChatKey_status != 0 and self.GPIO26_status != 0 and self.KeyCall1_status != 0 and self.sosKey_status != 0:\r
+                if self.KeyCall2_status == 0:#按下\r
+                    EventMesh.publish("close_wechat_btn_timer")\r
+                    if self.Keycall2_press == 0 :\r
+                        self.wechatKey_timer.stop()\r
+                        self.pwkey_timer.stop()\r
+                        self.sosKey_timer.stop()\r
+                        self.Keycall2_timer.stop()\r
+                        self.Keycall1_timer.stop()\r
+\r
+                        self.pwkey_count = 0\r
+                        self.pwkey_press = 0\r
+                        self.led_state = 0\r
+                        self.pwKey_press_count=0\r
+\r
+                        self.sosKey_count = 0\r
+                        self.sosKey_press = 0\r
+                        self.sosKey_long_press = 0\r
+                        self.sosKey_press_count=0\r
+\r
+                        self.wechatKey_count = 0\r
+                        self.wechatKey_press = 0\r
+                        self.wechatKey_press_count=0\r
+                        self.wechat_state = 0\r
+            \r
+                        self.Keycall1_count = 0\r
+                        self.Keycall1_press = 0 \r
+                        self.Keycall1_press_count = 0\r
+                        self.Keycall1_long_press = 0\r
+\r
+                        self.Keycall2_count = 0\r
+                        self.Keycall2_press = 1\r
+                        self.Keycall2_long_press = 0\r
+                        EventMesh.publish("AI_key_press")\r
+                        print("key19_extint_cb AI_key_press")\r
+                        self.Keycall2_timer.start(100, 1, self.publish_call2key_btn_event_cb)\r
+\r
+        def call2Key_press_cb(self, data):\r
+\r
+            '''KEY2:联动屏幕右下角或返回键长按关机'''\r
+            open_power = EventMesh.publish("get_power_on_state")#获取开机标识\r
+            open_power_off = EventMesh.publish("get_power_off_state")#获取开机标识\r
+            video_state = EventMesh.publish("get_video_state")\r
+            if open_power != None and open_power_off != None:\r
+                if open_power == 0 or open_power_off == 1:\r
+                    self.Keycall2_timer.stop()\r
+                    self.Keycall2_count = 0\r
+                    self.Keycall2_press = 0\r
+                    self.Keycall2_press_count =0\r
+                    self.Keycall2_long_press = 0\r
+                    return\r
+            self.KeyCall2_status = self.extint_19.read_level()\r
+            if self.Keycall2_press == 1 :\r
+                self.Keycall2_count += 1\r
+                if self.Keycall2_count >= 10*3: #长按3s \r
+                    flag = EventMesh.publish("get_call_state")#获取通话状态\r
+                    fall_down = EventMesh.publish("get_fall_down_state")#跌倒报警标识\r
+                    if fall_down != None and video_state != None:\r
+                        if fall_down != 0 or flag != 0 or video_state != 0:\r
+                            self.Keycall2_count = 0\r
+                            self.Keycall2_press = 0\r
+                            self.Keycall2_press_count = 0\r
+                            self.Keycall2_long_press = 0\r
+                            self.Keycall2_timer.stop()\r
+                            return\r
+                    if self.Keycall2_long_press == 0:\r
+                        self.Keycall2_long_press = 1\r
+                        EventMesh.publish("AI_key_long_press")\r
+                        # EventMesh.publish("stop_led_timer")#设置参数\r
+                        # EventMesh.publish("call_phonebook_num",2)\r
+                        return\r
+                    if self.KeyCall2_status == 1:#松开\r
+                        self.Keycall2_count = 0\r
+                        self.Keycall2_press = 0\r
+                        self.Keycall2_press_count = 0\r
+                        self.Keycall2_long_press = 0\r
+                        self.Keycall2_timer.stop()\r
+                        EventMesh.publish("AI_key_release")\r
+                        return\r
+                    \r
+\r
+                if self.KeyCall2_status == 1:#松开\r
+                    if self.Keycall2_count >= 1: #防抖100ms\r
+                        EventMesh.publish("AI_key_release")\r
+                        self.Keycall2_timer.stop()\r
+                        self.Keycall2_count = 0\r
+                        self.Keycall2_press = 0\r
+                        self.Keycall2_press_count+=1\r
+                        #self.Keycall2_timer.start(500, 0, self.publish_call2Key_timeout_cb_do)#松手超时1s判断\r
+\r
+        def publish_call2Key_timeout_cb_do(self, *args, **kwargs):\r
+            EventMesh.publish("publish_message_event_btnInfo",{"func":self.call2Key_timeout_cb,"data":0}) \r
+        \r
+        def call2Key_timeout_cb(self, data):#\r
+            open_power = EventMesh.publish("get_power_on_state")#获取开机标识\r
+            open_power_off = EventMesh.publish("get_power_off_state")#获取开机标识\r
+            video_state = EventMesh.publish("get_video_state")\r
+            if open_power != None and open_power_off != None:\r
+                if open_power == 0 or open_power_off == 1 :\r
+                    self.Keycall2_timer.stop()\r
+                    self.Keycall2_count = 0\r
+                    self.Keycall2_press = 0\r
+                    self.Keycall2_press_count=0\r
+                    return\r
+            flag = EventMesh.publish("get_call_state")#获取通话状态 \r
+            fall_down = EventMesh.publish("get_fall_down_state")#获取跌倒报警标识\r
+            # print("call1Key_timeout_cb",self.Keycall1_press_count,flag)\r
+            if self.Keycall2_press_count > 1:#\r
+                if fall_down != None:\r
+                    if fall_down != 0 or flag != 0 or video_state != 0:#在打电话或者跌倒报警提醒中不允许按键触发\r
+                        self.Keycall2_press_count = 0\r
+                        return\r
+            \r
+            if self.Keycall2_press_count == 3:#测试体温\r
+                self.Keycall2_press_count = 0\r
+                call_state = EventMesh.publish("get_call_state")\r
+                battery = EventMesh.publish("screen_get_battery")\r
+                if call_state == None:\r
+                    call_state = 0\r
+                if call_state == 0: \r
+                    if battery != None:\r
+                        if battery[0] != "1":#在充电得时候\r
+                            EventMesh.publish("stop_led_timer")#设置参数\r
+                            EventMesh.publish("set_manual_measure_mode",3)#测量体温\r
+            elif self.Keycall2_press_count == 1:#\r
+                self.Keycall2_press_count = 0\r
+                video_state = EventMesh.publish("get_video_state") \r
+                # print("video_state ",video_state)\r
+                if video_state != 0:\r
+                    if video_state == 6:#6 是app拨打手表 1 是手表打app 3 是正在视频通话中 0 关闭只有第一次视频通话打入才允许接听 接通之后不允许接听了\r
+                        EventMesh.publish("video_answer_cb")\r
+                    return\r
+                EventMesh.publish("stop_led_timer")#设置参数\r
+                call_state = EventMesh.publish("get_call_state") \r
+                \r
+                \r
+                if call_state == 2:#电话拨进需要接听\r
+                    EventMesh.publish("answer_call_event")#接听电话\r
+                    return\r
+                EventMesh.publish("play_battery_level_value")#播放当前电量\r
+                \r
+            self.Keycall2_press_count = 0\r
+\r
+\r
+\r
+        def pwk_extint_cb(self,args):#侧边按键\r
+            # EventMesh.txt_log('pwk_extint_cb :{}'.format(args))\r
+            open_power = EventMesh.publish("get_power_on_state")#获取开机标识\r
+            open_power_off = EventMesh.publish("get_power_off_state")#获取开机标识\r
+            video_state = EventMesh.publish("get_video_state")\r
+            get_video_state = EventMesh.publish("get_video_in_out_state")\r
+            dev_app_mode = EventMesh.publish("get_dev_app_mode")\r
+            if open_power != None and open_power_off != None and dev_app_mode != None:\r
+                if open_power == 0 or open_power_off == 1 or  (dev_app_mode == 1 and get_video_state != 0):\r
+                    return\r
+            \r
+            flag = EventMesh.publish("get_call_state")#获取通话状态\r
+            fall_down = EventMesh.publish("get_fall_down_state")#获取跌倒报警标识\r
+            if fall_down != None:\r
+                if fall_down != 0 or flag == 2:\r
+                    return\r
+            self.GPIO26_status = int(args[1])\r
+            if self.GPIO26_status == 0:\r
+                self.GPIO26_status = 1\r
+            else:\r
+                self.GPIO26_status = 0\r
+                pass\r
+            if NEW_ENABLE == 0:#新的按键功能定义\r
+                if self.GPIO26_status == 0:\r
+                    video_state = EventMesh.publish("get_video_state")\r
+                    if video_state != 0:#视频通话打入或者接听后允许挂断视频通话\r
+                        if video_state == 6:#6是app打手表需要接通\r
+                            print("pwk_extint_cb")\r
+                            # EventMesh.publish("video_answer_cb")\r
+                        else:\r
+                            pass\r
+                            # EventMesh.publish("video_dev_reject_cb",2)#挂断视频通话\r
+                        return\r
+                    \r
+            self.WeChatKey_status = self.wechatKey.read_level()\r
+            self.KeyCall2_status = self.extint_17.read_level()\r
+            self.KeyCall1_status = self.extint_19.read_level()\r
+            self.sosKey_status = self.sosKey.read_level()\r
+\r
+            if self.WeChatKey_status != 0 and self.KeyCall1_status != 0 and self.sosKey_status != 0 and self.KeyCall2_status != 0:\r
+                if self.GPIO26_status == 0:#按下\r
+                    EventMesh.publish("close_wechat_btn_timer")\r
+                    if self.pwkey_press == 0 :\r
+                        self.aud.stop()  #播放声音 \r
+                        self.wechatKey_timer.stop()\r
+                        self.pwkey_timer.stop()\r
+                        self.sosKey_timer.stop()\r
+                        self.Keycall2_timer.stop()\r
+                        self.Keycall1_timer.stop()\r
+\r
+                        self.sosKey_count = 0\r
+                        self.sosKey_press = 0\r
+                        self.sosKey_press_count=0\r
+                        self.sosKey_long_press = 0\r
+\r
+                        self.wechatKey_count = 0\r
+                        self.wechatKey_press = 0\r
+                        self.wechatKey_press_count=0\r
+                        self.wechat_state = 0\r
+                       \r
+\r
+                        self.pwkey_press = 1\r
+                        self.pwkey_count = 0\r
+                        self.led_state = 0\r
+\r
+                        self.Keycall1_count = 0\r
+                        self.Keycall1_press = 0 \r
+                        self.Keycall1_long_press = 0\r
+                        self.Keycall1_press_count = 0\r
+                        \r
+                        self.Keycall2_count = 0\r
+                        self.Keycall2_press = 0 \r
+                        self.Keycall2_press_count = 0\r
+                        self.Keycall2_long_press = 0\r
+\r
+                        self.pwkey_timer.start(100, 1, self.publish_pwkKey_btn_event_cb)\r
+                        # EventMesh.debug_log("key22_extint_cb:self.key22_timer.start!!!!\n")\r
+\r
+\r
+\r
+\r
+        def pwKey_press_cb(self, data):\r
+            open_power = EventMesh.publish("get_power_on_state")#获取开机标识\r
+            open_power_off = EventMesh.publish("get_power_off_state")#获取开机标识\r
+            video_state = EventMesh.publish("get_video_state")\r
+            if open_power != None and open_power_off != None and video_state != None:\r
+                if open_power == 0 or open_power_off == 1 or video_state != 0:\r
+                    self.pwkey_timer.stop()\r
+                    self.pwkey_count = 0\r
+                    self.pwkey_press = 0\r
+                    self.led_state = 0\r
+                    self.pwKey_press_count=0\r
+                    return\r
+            '''KEY2:联动屏幕右下角或返回键长按关机'''\r
+            self.GPIO26_status = self.pwk_key26.read_level()\r
+\r
+            if self.pwkey_press == 1 :\r
+                self.pwkey_count += 1\r
+                if self.pwkey_count > 5:\r
+                    if self.led_state == 0:\r
+                        self.led_state = 1\r
+                        EventMesh.publish("set_led_time_arg",[1,1,330,led_mode.LONG_LIGHT_GREEN,2,1,led_mode.OTHER_MEASURE_MODE])#測量成功\r
+                    if self.pwkey_count >= 10*10:\r
+                        EventMesh.publish("stop_led_timer")#设置参数\r
+                        self.pwkey_timer.stop()\r
+                        self.pwkey_count = 0\r
+                        self.pwkey_press = 0\r
+                        self.pwKey_press_count = 0\r
+                        self.led_state = 0\r
+                        # if EventMesh.publish("get_sim_Status") != 1:\r
+                        #     EventMesh.publish("open_power_on", 2)#\r
+                        # else:\r
+                        EventMesh.publish("open_power_on", 3)#\r
+                        return\r
+                    \r
+                    if self.pwkey_count >= 3*10 :\r
+                        if EventMesh.publish("get_sim_Status") != 1:\r
+                            EventMesh.debug_log("长3秒关机")\r
+                            EventMesh.publish("stop_led_timer")#设置参数\r
+                            self.pwkey_timer.stop()\r
+                            self.pwkey_count = 0\r
+                            self.pwkey_press = 0\r
+                            self.pwKey_press_count = 0\r
+                            self.led_state = 0\r
+                            EventMesh.publish("open_power_on", 2)#\r
+                            return\r
+                            \r
+                    \r
+                if self.GPIO26_status == 1:#松开\r
+                    if self.pwkey_count >= 1: #防抖100ms\r
+                        # EventMesh.debug_log("self.GPIO26_status == 1")\r
+                        self.pwkey_timer.stop()\r
+                        self.pwkey_count = 0\r
+                        self.pwkey_press = 0\r
+                        self.led_state = 0\r
+                        self.pwKey_press_count+=1\r
+                        self.pwkey_timer.start(500, 0, self.publish_pwKey_timeout_cb_do)#松手超时1s判断\r
+\r
+        def  hsensorTest_timer_cb(self,e):\r
+            EventMesh.publish("system_sleep_rest")#防止黑屏 \r
+            w_data = EventMesh.publish(constants.EVENT.GET_WEAR)#佩戴数据\r
+            #EventMesh.debug_log("FactoryModeHsensorTest{}".format(data))\r
+        \r
+              \r
+        def publish_pwKey_timeout_cb_do(self, *args, **kwargs):\r
+            EventMesh.publish("publish_message_event_btnInfo",{"func":self.pwKey_timeout_cb,"data":0})  \r
+        \r
+        def pwKey_timeout_cb(self, data):#侧边按键\r
+            boot_count = EventMesh.publish("get_boot_time_count")\r
+\r
+            open_power = EventMesh.publish("get_power_on_state")#获取开机标识\r
+            open_power_off = EventMesh.publish("get_power_off_state")#获取开机标识\r
+            video_state = EventMesh.publish("get_video_state")\r
+            if open_power != None and open_power_off != None and video_state != None:\r
+                if open_power == 0 or open_power_off == 1 or video_state != 0:\r
+                    self.pwkey_timer.stop()\r
+                    self.pwkey_count = 0\r
+                    self.pwkey_press = 0\r
+                    self.led_state = 0\r
+                    self.pwKey_press_count=0\r
+                    return\r
+\r
+            if self.pwKey_press_count >= 1:\r
+                self.pwKey_press_count = 0\r
+                # flag = EventMesh.publish("get_call_state") \r
+                # if flag != 2:#如果是电话拨出去或者不在打电话中都可以执行\r
+                #     EventMesh.publish("stop_led_timer")#设置参数\r
+                #     if flag == 1:#如果是sos电话拨出去\r
+                #         sos_flag = EventMesh.publish("get_sos_flag")\r
+                #         if sos_flag == 1:\r
+                #             EventMesh.publish("set_sos_flag",0)\r
+                #             EventMesh.publish("set_sos_num",0)\r
+                #             EventMesh.publish("set_hangup_mode",0)\r
+                #     EventMesh.publish("close_hr_sop2")#\r
+                #     flag = EventMesh.publish("get_call_state") \r
+                #     # if flag == 0 or flag == 2:#在拨出去或者通话中就不播报入网成功的语音\r
+                #     if flag != 1:#在拨出去或者通话中就不播报入网成功的语音\r
+                #         EventMesh.publish("set_sim_mode")#\r
+                #     EventMesh.publish("dialing_out_event")#电话呼叫中voiceCall.callEnd()\r
+                \r
+                flag = EventMesh.publish("get_call_state") \r
+                if flag != 2:\r
+                    EventMesh.publish("stop_led_timer")#设置参数\r
+                    EventMesh.publish("dialing_out_event")#电话呼叫中voiceCall.callEnd()\r
+\r
+                    if flag == 1:#如果是sos电话拨出去\r
+                        sos_flag = EventMesh.publish("get_sos_flag")\r
+                        if sos_flag == 1:\r
+                            EventMesh.publish("set_sos_state_out")\r
+                            EventMesh.publish("set_sos_flag",0)\r
+                            EventMesh.publish("set_sos_num",0)\r
+                            EventMesh.publish("set_hangup_mode",0)\r
+                    EventMesh.publish("close_hr_sop2")#\r
+                    flag = EventMesh.publish("get_call_state") \r
+                    if flag != 1:\r
+                        EventMesh.publish("set_sim_mode")#\r
+            \r
+            self.pwKey_press_count = 0\r
+\r
+        def sosKey_extint_cb(self,args):\r
+            \r
+            power_off = EventMesh.publish("get_power_off_state")#获取关机标识\r
+            open_power = EventMesh.publish("get_power_on_state")#获取开机标识\r
+            if power_off != None and open_power != None:\r
+                if power_off == 1 or open_power == 0:\r
+                    return\r
+            self.sosKey_status = int(args[1])\r
+            if self.sosKey_status == 0:\r
+                self.sosKey_status = 1\r
+            else:\r
+                self.sosKey_status = 0\r
+                pass\r
+            get_video = EventMesh.publish("get_video_in_out_state")\r
+\r
+            self.WeChatKey_status = self.wechatKey.read_level()\r
+            self.GPIO26_status = self.pwk_key26.read_level()\r
+            self.KeyCall1_status = self.extint_19.read_level()\r
+            self.KeyCall2_status = self.extint_17.read_level()\r
+\r
+            # EventMesh.debug_log('sosKey_extint_cb ',args,self.sosKey_status,self.WeChatKey_status,self.KeyCall1_status,self.KeyCall2_status,self.GPIO26_status) # args[0]:gpio号 args[1]:上升沿或下降沿\r
+            if self.WeChatKey_status != 0 and self.GPIO26_status != 0 and self.KeyCall1_status != 0 and self.KeyCall2_status != 0:\r
+                if self.sosKey_status == 0:#按下\r
+                    if NEW_ENABLE == 0:#新的按键功能定义\r
+                        video_state = EventMesh.publish("get_video_state")\r
+                        if video_state != 0:#视频通话打入或者接听后允许挂断视频通话\r
+                            if video_state == 6 or get_video == 0:\r
+                                EventMesh.debug_log("sosKey_extint_cb",get_video,video_state)\r
+                                EventMesh.publish("video_dev_reject_cb",2)#挂断视频通话\r
+                                self.sosKey_press_count=0\r
+                                self.wechatKey_timer.stop()\r
+                                self.pwkey_timer.stop()\r
+                                self.sosKey_timer.stop()\r
+                                self.Keycall2_timer.stop()\r
+                                self.Keycall1_timer.stop()\r
+                                return\r
+                    EventMesh.publish("close_falldown_alarm_event")#关闭跌倒报警提醒事件\r
+                    EventMesh.publish("close_wechat_btn_timer")\r
+\r
+                    if self.sosKey_press == 0 :\r
+                        self.wechatKey_timer.stop()\r
+                        self.pwkey_timer.stop()\r
+                        self.sosKey_timer.stop()\r
+                        self.Keycall2_timer.stop()\r
+                        self.Keycall1_timer.stop()\r
+\r
+                        \r
+                        self.pwkey_count = 0\r
+                        self.pwkey_press = 0\r
+                        self.led_state = 0\r
+                        self.pwKey_press_count=0 #电源键\r
+\r
+\r
+                        self.wechatKey_count = 0\r
+                        self.wechatKey_press = 0\r
+                        self.wechat_state = 0\r
+                        self.wechatKey_press_count=0#微聊键\r
+\r
+\r
+                        self.sosKey_press = 1\r
+                        self.sosKey_long_press = 0\r
+                        self.sosKey_count = 0\r
+\r
+                        self.Keycall1_count = 0\r
+                        self.Keycall1_press = 0 \r
+                        self.Keycall1_long_press = 0\r
+                        self.Keycall1_press_count = 0\r
+                        \r
+                        self.Keycall2_count = 0\r
+                        self.Keycall2_press = 0 \r
+                        self.Keycall2_long_press = 0\r
+                        self.Keycall2_press_count = 0\r
+\r
+                        self.sosKey_timer.start(100, 1, self.publish_soskey_btn_event_cb)\r
+                        # self.sosKey_timer.start(100, 1, self.sosKey_press_cb)\r
+            # EventMesh.debug_log("key22_extint_cb:self.key22_timer.start!!!!\n")\r
+\r
+        def sosKey_press_cb(self, data):\r
+            '''KEY2:联动屏幕右下角或返回键长按关机'''\r
+            open_power = EventMesh.publish("get_power_on_state")#获取开机标识\r
+            open_power_off = EventMesh.publish("get_power_off_state")#获取开机标识\r
+            if open_power != None and open_power_off != None:\r
+                if open_power == 0 or open_power_off == 1:\r
+                    self.sosKey_timer.stop()\r
+                    self.sosKey_count = 0\r
+                    self.sosKey_press = 0\r
+                    self.sosKey_long_press = 0\r
+                    self.sosKey_press_count = 0\r
+                    return\r
+            self.sosKey_status = self.sosKey.read_level()\r
+            if self.sosKey_press == 1 :\r
+                # if self.sosKey_count <= 2:\r
+                    # if EventMesh.publish(constants.EVENT.GET_CONNECT) == 1:#未联网不需要录音\r
+                    #     EventMesh.publish("set_led_time_arg",[1000,200,1,led_mode.FLASH_LIGHT_GREEN,led_mode.DEFAULT_LONG_LIGHT_MODE,led_mode.OTHER_MEASURE_MODE])#设置参数\r
+                    # else:\r
+                    #     EventMesh.publish("set_led_time_arg",[1000,200,1,led_mode.FLASH_LIGHT_RED,led_mode.DEFAULT_LONG_LIGHT_MODE,led_mode.OTHER_MEASURE_MODE])#设置参数\r
+                self.sosKey_count += 1\r
+                if self.sosKey_count >= 10*3: #长按3s sos拨号\r
+                    flag = EventMesh.publish("get_call_state")#获取通话状态\r
+                    fall_down = EventMesh.publish("get_fall_down_state")#跌倒报警标识\r
+                    video_state = EventMesh.publish("get_video_state")#获取视频通话状态\r
+                    if fall_down != None and video_state != None:\r
+                        if fall_down != 0 or flag == 2 or video_state != 0:\r
+                            self.sosKey_count = 0\r
+                            self.sosKey_long_press = 0\r
+                            self.sosKey_press = 0\r
+                            self.sosKey_timer.stop()\r
+                            return\r
+                    if self.sosKey_long_press == 0:\r
+                        self.sosKey_long_press = 1\r
+                       \r
+                        EventMesh.publish_async("dial_sos_phone")#拨打sos号码\r
+                        return\r
+                    if self.sosKey_status == 1:#松开\r
+                        self.sosKey_count = 0\r
+                        self.sosKey_long_press = 0\r
+                        self.sosKey_press = 0\r
+                        self.sosKey_timer.stop()\r
+                        return\r
+\r
+                # EventMesh.debug_log("self.sosKey_count {}",self.sosKey_count)\r
+                if self.sosKey_status == 1:#松开\r
+                    if self.sosKey_count >= 1: #防抖100ms\r
+                        self.sosKey_timer.stop()\r
+                        self.sosKey_count = 0\r
+                        self.sosKey_press = 0\r
+                        self.sosKey_long_press = 0\r
+                        self.sosKey_press_count+=1\r
+                        self.sosKey_timer.start(500, 0, self.publish_sosKey_timeout_cb_do)#松手超时1s判断\r
+        def publish_sosKey_timeout_cb_do(self, *args, **kwargs):\r
+            EventMesh.publish("publish_message_event_btnInfo",{"func":self.sosKey_timeout_cb,"data":0})  \r
+        # 1、长按3秒以上,进行SOS拔号;\r
+        # 2、短按挂断来电或挂断视频通话,平时短按一下语音报时;\r
+        # 3、短按三下,发起视频通话(默认第一个)\r
+        # 4、短按六次,播报IMEI号\r
+        # 5、短按十次,解绑APP,同时恢复出厂设置\r
+        def close_factory_test(self):#关闭老化测试\r
+            if self.factoryTest_flag == 1:\r
+                self.factoryTest_flag = 0\r
+                close_led_white()\r
+                close_led_red()\r
+                close_led_green()\r
+                self.factoryTest_led_count = 0\r
+                self.aud.stopPlayStream()\r
+                self.factoryTest_timer.stop()\r
+                EventMesh.publish("close_motor_infor")\r
+\r
+        def factoryTest_timer_cb(self,e):\r
+            # self.factoryTest_count+=1\r
+            date_tmp = utime.localtime()\r
+            time_tmp = utime.mktime(date_tmp)\r
+            # print("time_tmp - self.factory_timesec :%d time_tmp:%d self.factory_timesec %d\r\n",time_tmp - self.factory_timesec,time_tmp,self.factory_timesec)\r
+            if time_tmp - self.factory_timesec > 60*60*2:\r
+            # if self.factoryTest_count > 60*60*2:#老化测试2小时自动退出\r
+            #     self.factoryTest_count = 0\r
+                self.close_factory_test()\r
+                return\r
+            #播放音频 \r
+            str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_ALARM_NEW"))\r
+            if EventMesh.publish("get_audio_state") == 0:\r
+                self.aud.montage_play('U:/static/audio.bin',1,1,str_data)\r
+            #led灯常亮\r
+            self.factoryTest_led_count+=1\r
+            if self.factoryTest_led_count == 1:#1  4 7  10 \r
+                open_led_red()\r
+                close_led_green()\r
+                close_led_white()\r
+            elif self.factoryTest_led_count == 2:\r
+                open_led_green()\r
+                close_led_red()\r
+                close_led_white()\r
+            elif self.factoryTest_led_count == 3: #3  6 9 12 \r
+                open_led_white()\r
+                close_led_red()\r
+                close_led_green()\r
+            if self.factoryTest_led_count >= 3+1:\r
+                self.factoryTest_led_count = 0\r
+\r
+            EventMesh.publish("set_motor_time",[1,2,10*1,10,5])#设置马达参数\r
+\r
+        def sosKey_timeout_cb(self, data):#\r
+            # print("sosKey_timeout_cb",self.sosKey_press_count)\r
+            open_power = EventMesh.publish("get_power_on_state")#获取开机标识\r
+            open_power_off = EventMesh.publish("get_power_off_state")#获取开机标识\r
+            if open_power != None and open_power_off != None:\r
+                if open_power == 0 or open_power_off == 1:\r
+                    self.sosKey_timer.stop()\r
+                    self.sosKey_count = 0\r
+                    self.sosKey_press = 0\r
+                    self.sosKey_long_press = 0\r
+                    self.sosKey_press_count = 0\r
+                    return\r
+            factory_count = EventMesh.publish("get_factory_test_time")\r
+            print("factory_count:%d",factory_count)\r
+            try :\r
+                if factory_count <= 30 :#开机30秒内按键次数大于15进入测试模式\r
+                    #EventMesh.debug_log("boot_count:{}".format(boot_count))\r
+                    if self.sosKey_press_count >= 15:\r
+                        self.factoryTest_timer.start(1000,1,self.factoryTest_timer_cb)\r
+                        self.sosKey_press_count = 0\r
+                        self.factoryTest_led_count = 0\r
+                        self.factoryTest_flag = 1\r
+                        date_tmp = utime.localtime()\r
+                        time_tmp = utime.mktime(date_tmp)\r
+                        self.factory_timesec = time_tmp\r
+                        return\r
+\r
+            except Exception as e:\r
+                usys.print_exception(e)\r
+\r
+            if NEW_ENABLE == 1:#旧的按键定义\r
+                # EventMesh.debug_log("sosKey_press_count!!!!!!!!!!!!!! ",self.sosKey_press_count)\r
+                flag = EventMesh.publish("get_call_state")#获取通话状态\r
+                fall_down = EventMesh.publish("get_fall_down_state")#跌倒报警标识\r
+                if self.sosKey_press_count > 1:#\r
+                    if fall_down != None:\r
+                        if fall_down != 0 or flag != 0:\r
+                            self.sosKey_press_count = 0\r
+                            return\r
+                if self.sosKey_press_count == 10:#\r
+                    self.sosKey_press_count = 0\r
+                    pass\r
+                elif self.sosKey_press_count == 6:#\r
+                    self.sosKey_press_count = 0\r
+                    self.close_factory_test()\r
+                    pass\r
+                elif self.sosKey_press_count == 5:#功能暂时屏蔽\r
+                    self.sosKey_press_count = 0\r
+                    call_state = EventMesh.publish("get_call_state")\r
+                    battery = EventMesh.publish("screen_get_battery")\r
+                    if call_state == None:\r
+                        call_state = 0\r
+                    if call_state == 0: \r
+                        if battery != None:\r
+                            if battery[0] != "1":#在充电得时候\r
+                                EventMesh.publish("stop_led_timer")#设置参数\r
+                                EventMesh.publish("set_manual_measure_mode",3)#测量体温\r
+                    pass\r
+                elif self.sosKey_press_count == 4:#拨打app快捷号码\r
+                    self.sosKey_press_count = 0\r
+                    EventMesh.publish("stop_led_timer")#设置参数\r
+                    EventMesh.publish("play_center_phone")#拨打快捷号码\r
+                    # EventMesh.publish("call_phonebook_num",3)\r
+                    pass\r
+                elif self.sosKey_press_count == 3:#测试心率\r
+                    self.sosKey_press_count = 0\r
+                    \r
+                    call_state = EventMesh.publish("get_call_state")\r
+                    battery = EventMesh.publish("screen_get_battery")\r
+                    if call_state == None:\r
+                        call_state = 0\r
+                    if call_state == 0: \r
+                        if battery != None:\r
+                            if battery[0] != "1":#在充电得时候\r
+                                EventMesh.publish("stop_led_timer")#设置参数\r
+                                EventMesh.publish("set_manual_measure_mode",1)#\r
+                    pass\r
+                elif self.sosKey_press_count == 2:#播报当前步数\r
+                    self.sosKey_press_count = 0\r
+                    EventMesh.publish("stop_led_timer")#设置参数\r
+                    EventMesh.publish("play_cur_step_event")#\r
+                    pass\r
+                elif self.sosKey_press_count == 1:#挂断来电 短语音播报\r
+                    self.sosKey_press_count = 0\r
+                    EventMesh.publish("stop_led_timer")#设置参数\r
+                    # EventMesh.publish("call_test_event")\r
+                    EventMesh.publish("sos_short_press")#sos短按事件\r
+                    \r
+                    pass\r
+                self.sosKey_press_count = 0\r
+            else:\r
+                # EventMesh.debug_log("sosKey_press_count!!!!!!!!!!!!!! ",self.sosKey_press_count)\r
+                flag = EventMesh.publish("get_call_state")#获取通话状态\r
+                fall_down = EventMesh.publish("get_fall_down_state")#跌倒报警标识\r
+                video_state = EventMesh.publish("get_video_state")#获取视频通话状态\r
+                \r
+                \r
+                if self.sosKey_press_count > 1:#短按十次解绑app\r
+                    if fall_down != None and video_state != None and flag != None:\r
+                        if fall_down != 0 or flag != 0 or video_state != 0:#获取视频通话状态:\r
+                            self.sosKey_press_count = 0\r
+                            return\r
+                if self.sosKey_press_count == 10:#\r
+                    self.sosKey_press_count = 0\r
+                    EventMesh.publish("stop_led_timer")#设置参数\r
+                    EventMesh.publish("open_power_on", 4)#恢复出厂\r
+                    pass\r
+                elif self.sosKey_press_count == 6:#播报IMEI号\r
+                    self.sosKey_press_count = 0\r
+                    self.close_factory_test()\r
+                    EventMesh.publish("stop_led_timer")#设置参数\r
+                    EventMesh.publish("play_imei_event")#播報imei号\r
+                    pass\r
+                elif self.sosKey_press_count == 5:#\r
+                    self.sosKey_press_count = 0\r
+                    # call_state = EventMesh.publish("get_call_state")\r
+                    # battery = EventMesh.publish("screen_get_battery")\r
+                    # if call_state == None:\r
+                    #     call_state = 0\r
+                    # if call_state == 0: \r
+                    #     if battery != None:\r
+                    #         if battery[0] != "1":#在充电得时候\r
+                    #             EventMesh.publish("stop_led_timer")#设置参数\r
+                    #             EventMesh.publish("set_manual_measure_mode",3)#测量体温\r
+                    # pass\r
+                elif self.sosKey_press_count == 4:#\r
+                    self.sosKey_press_count = 0\r
+                    # EventMesh.publish("stop_led_timer")#设置参数\r
+                    # EventMesh.publish("play_center_phone")#拨打快捷号码\r
+                    # EventMesh.publish("call_phonebook_num",3)\r
+                    pass\r
+                elif self.sosKey_press_count == 3:#视频通话\r
+                    self.sosKey_press_count = 0\r
+                    call_state = EventMesh.publish("get_call_state")\r
+                    battery = EventMesh.publish("screen_get_battery")\r
+                    if call_state == None:\r
+                        call_state = 0\r
+                    if call_state == 0:\r
+                        flag = EventMesh.publish("get_call_state") \r
+                        fall_down = EventMesh.publish("get_fall_down_state")#跌倒报警标识\r
+                        usb_state = EventMesh.publish("get_usb")#\r
+                        video_state = EventMesh.publish("get_video_state")\r
+                        if flag != 0  or fall_down != 0:\r
+                            return\r
+                        EventMesh.publish("stop_led_timer")#设置参数\r
+                        EventMesh.publish("call_viode_book_num")\r
+                    pass\r
+                elif self.sosKey_press_count == 2:#播报当前步数\r
+                    self.sosKey_press_count = 0\r
+                    # EventMesh.publish("stop_led_timer")#设置参数\r
+                    # EventMesh.publish("play_cur_step_event")#\r
+                    pass\r
+                elif self.sosKey_press_count == 1:#挂断来电 短语音播报\r
+                    self.sosKey_press_count = 0\r
+                    EventMesh.publish("stop_led_timer")#设置参数\r
+                    # EventMesh.publish("call_test_event")\r
+                    EventMesh.publish("sos_short_press")#sos短按事件\r
+                    \r
+                    pass\r
+                self.sosKey_press_count = 0\r
+\r
+\r
+        def wechatKey_extint_cb(self,args):\r
+            power_off = EventMesh.publish("get_power_off_state")#获取关机标识\r
+            open_power = EventMesh.publish("get_power_on_state")#获取开机标识\r
+            dev_app_mode = EventMesh.publish("get_dev_app_mode")\r
+            video_state = EventMesh.publish("get_video_state")#获取视频通话状态 5在通话状态不允许按键输入\r
+            get_video_state = EventMesh.publish("get_video_in_out_state")\r
+\r
+            if open_power != None and power_off != None and dev_app_mode != None:\r
+                if open_power == 0 or power_off == 1 or  (dev_app_mode == 1 and get_video_state != 0):\r
+                    return\r
+            fall_down = EventMesh.publish("get_fall_down_state")#跌倒报警标识\r
+            if fall_down != None:\r
+                if fall_down != 0:\r
+                    return\r
+            # EventMesh.txt_log('wechatKey_extint_cb :{}'.format(args))\r
+            self.WeChatKey_status = int(args[1])\r
+            if self.WeChatKey_status == 0:\r
+                self.WeChatKey_status = 1\r
+            else:\r
+                self.WeChatKey_status = 0\r
+                pass\r
+            if NEW_ENABLE == 0:#新的按键功能定义\r
+                if self.WeChatKey_status == 0:\r
+                    video_state = EventMesh.publish("get_video_state")\r
+                    if video_state != 0:#视频通话打入或者接听后允许挂断视频通话\r
+                        if video_state != 6:#6是app打手表需要接通\r
+                            # EventMesh.publish("video_dev_reject_cb",2)#挂断视频通话\r
+                            return\r
+                    \r
+            self.sosKey_status = self.sosKey.read_level()\r
+            self.GPIO26_status = self.pwk_key26.read_level()\r
+            self.KeyCall1_status = self.extint_19.read_level()\r
+            self.KeyCall2_status = self.extint_17.read_level()\r
+            # EventMesh.debug_log('wechatKey_extint_cb ',args,self.WeChatKey_status,self.sosKey_status,self.KeyCall1_status,self.KeyCall2_status,self.GPIO26_status) # args[0]:gpio号 args[1]:上升沿或下降沿\r
+            # if self.sosKey_status != 0 and self.GPIO26_status != 0:\r
+            if self.sosKey_status != 0 and self.GPIO26_status != 0 and self.KeyCall1_status != 0 and self.KeyCall2_status != 0:\r
+                if self.WeChatKey_status == 0:#按下\r
+                    video_state = EventMesh.publish("get_video_state")\r
+                    if video_state != 0:#视频通话打入或者接听后允许挂断视频通话\r
+                        if video_state != 6:#6是app打手表需要接通\r
+                            # EventMesh.publish("video_dev_reject_cb",2)#挂断视频通话\r
+                            # self.wechatKey_press_count = 0\r
+                            # self.wechatKey_timer.stop()\r
+                            # self.pwkey_timer.stop()\r
+                            # self.sosKey_timer.stop()\r
+                            # self.Keycall2_timer.stop()\r
+                            # self.Keycall1_timer.stop()\r
+                            return\r
+                    if self.wechatKey_press == 0:\r
+                        self.wechatKey_timer.stop()\r
+                        self.pwkey_timer.stop()\r
+                        self.sosKey_timer.stop()\r
+                        self.Keycall2_timer.stop()\r
+                        self.Keycall1_timer.stop()\r
+\r
+                        self.sosKey_press_count = 0\r
+                        self.sosKey_long_press = 0\r
+                        self.sosKey_press = 0\r
+                        self.sosKey_count = 0\r
+\r
+                        self.pwkey_press = 0\r
+                        self.pwkey_count = 0\r
+                        self.led_state = 0\r
+                        self.pwKey_press_count=0\r
+\r
+                        self.wechatKey_press = 1\r
+                        self.led_state = 0\r
+                        self.wechatKey_count = 0\r
+                        self.wechat_state = 0\r
+\r
+                        self.Keycall1_count = 0\r
+                        self.Keycall1_press = 0 \r
+                        self.Keycall1_long_press = 0\r
+                        self.Keycall1_press_count = 0\r
+                        \r
+                        self.Keycall2_count = 0\r
+                        self.Keycall2_press = 0 \r
+                        self.Keycall2_press_count = 0\r
+                        self.Keycall2_long_press = 0\r
+\r
+                        self.wechatKey_timer.start(100, 1, self.publish_wechat_btn_event_cb)\r
+                else:\r
+                    EventMesh.publish("close_wechat_btn_timer")\r
+\r
+        def close_wechat_btn_timer(self,event,*argc):\r
+            tmp = EventMesh.publish("get_wechat_time")#获取微聊时间戳\r
+            wechat_time = 0\r
+            time_tmp = 0\r
+            time_sec = 0\r
+\r
+            if tmp != None:\r
+                if tmp[0] == 1:\r
+                    self.wechatKey_timer.stop()\r
+                    self.wechatKey_count = 0\r
+                    self.wechatKey_press = 0\r
+                    self.wechatKey_press_count=0\r
+                    self.wechat_state = 0\r
+                    date_tmp = utime.localtime()\r
+                    time_tmp = utime.mktime(date_tmp)\r
+                    time_sec = tmp[1]\r
+                    wechat_time = time_tmp - time_sec\r
+                    # EventMesh.debug_log("close_btn_timer",time_tmp,time_sec,wechat_time)\r
+                    if wechat_time >= 15:\r
+                        wechat_time = 15\r
+                    if wechat_time <= 0:\r
+                        wechat_time = 0\r
+                    EventMesh.publish("send_wechat_record",wechat_time)#发送录音文件内容\r
+        \r
+\r
+        def wechatKey_press_cb(self,data):\r
+            open_power = EventMesh.publish("get_power_on_state")#获取开机标识\r
+            open_power_off = EventMesh.publish("get_power_off_state")#获取开机标识\r
+            video_state = EventMesh.publish("get_video_state")\r
+            if open_power != None and open_power_off != None:\r
+                if open_power == 0 or open_power_off == 1 :\r
+                    \r
+                    self.wechatKey_timer.stop()\r
+                    self.wechatKey_count = 0\r
+                    self.wechatKey_press = 0\r
+                    self.wechat_state = 0\r
+                    self.wechatKey_press_count=0\r
+                    return\r
+            self.WeChatKey_status = self.wechatKey.read_level()\r
+            wechat_time = 0\r
+            tmp = None\r
+            time_sec = 0\r
+            time_tmp = 0\r
+            date_tmp = utime.localtime()\r
+            time_tmp = utime.mktime(date_tmp)\r
+            '''KEY2:联动屏幕右下角或返回键长按关机'''\r
+            if self.wechatKey_press == 1 :#是否按下\r
+                tmp = EventMesh.publish("get_wechat_time")#获取微聊时间戳\r
+                self.wechatKey_count += 1\r
+                if self.wechatKey_count >= 15: #长按1s进入微聊录音\r
+                    flag = EventMesh.publish("get_call_state") \r
+                    fall_down = EventMesh.publish("get_fall_down_state")#跌倒报警标识\r
+                    if flag != None:\r
+                        if flag == 0 and fall_down == 0 and video_state == 0:\r
+                            if self.WeChatKey_status == 0:\r
+                                if EventMesh.publish(constants.EVENT.GET_CONNECT) == 1:#未联网不需要录音\r
+                                    if self.wechat_state == 0:#按下超过s开始录音\r
+                                        EventMesh.publish("start_wechat_record")#开始录音\r
+                                        self.wechat_state = 1\r
+                                else:\r
+                                    self.wechat_state = 0\r
+                                    self.wechatKey_timer.stop()\r
+                                    self.wechatKey_count = 0\r
+                                    self.wechatKey_press = 0\r
+                                    self.wechatKey_press_count=0\r
+                                    EventMesh.publish("set_sim_mode")#播報imei号\r
+                                    return\r
+\r
+                            if self.WeChatKey_status == 0:#未松手超过15s啧停止录音\r
+                                if self.wechat_state == 1:\r
+                                    if tmp != None:\r
+                                        if tmp[0] != 0:\r
+                                            time_sec = tmp[1]\r
+                                            if time_tmp - time_sec >= 15:\r
+                                                wechat_time = time_tmp - time_sec\r
+                                                if wechat_time >= 15:\r
+                                                    wechat_time = 15\r
+                                                EventMesh.publish("send_wechat_record",wechat_time)#发送录音文件内容\r
+                                                \r
+                                                self.wechatKey_timer.stop()\r
+                                                self.wechatKey_count = 0\r
+                                                self.wechatKey_press = 0\r
+                                                self.wechat_state = 0\r
+                                                self.wechatKey_press_count=0\r
+                                                return\r
+                            else:\r
+                                if self.WeChatKey_status == 1:\r
+                                    if self.wechat_state == 1:#如果按下时长超过1s且小于长按的时间也认为是录微聊\r
+                                        if tmp != None:\r
+                                            if tmp[0] != 0:\r
+                                                time_sec = tmp[1]\r
+                                                wechat_time = time_tmp - time_sec\r
+                                            # EventMesh.debug_log("WECHAT TIEM",time_tmp,time_sec,wechat_time)\r
+                                            if wechat_time >= 15:\r
+                                                wechat_time = 15\r
+                                        \r
+                                        \r
+                                        EventMesh.publish("send_wechat_record",wechat_time)#发送录音文件内容\r
+                                        self.wechatKey_timer.stop()\r
+                                        self.wechat_state = 0\r
+                                        self.wechatKey_count = 0\r
+                                        self.wechatKey_press = 0\r
+                                        self.wechatKey_press_count=0\r
+                                        return\r
+                        else:\r
+                            self.wechatKey_timer.stop()\r
+                            self.wechatKey_count = 0\r
+                            self.wechat_state = 0\r
+                            self.wechatKey_press = 0\r
+                            self.wechatKey_press_count = 0\r
+                            return\r
+\r
+                if self.WeChatKey_status == 1:#松开\r
+                    if self.wechatKey_count >= 1: #防抖100ms\r
+                        # EventMesh.debug_log("WeChat time!!!!!!!!!!!!!!")\r
+                        self.wechatKey_timer.stop()\r
+                        self.wechatKey_count = 0\r
+                        self.wechatKey_press = 0\r
+                        self.wechat_state = 0\r
+                        self.wechatKey_press_count+=1\r
+                        self.wechatKey_timer.start(500, 0, self.publish_wechatKey_btn_event_cb)#松手超时1s判断\r
+\r
+        def publish_wechatKey_btn_event_cb(self, *args, **kwargs):\r
+            EventMesh.publish("publish_message_event_btnInfo",{"func":self.wechatKey_timeout_cb,"data":0})  \r
+\r
+        # 1、短按一下,播放最后收到的语音或接听电话,接听视频通话;短按一下,开始语音播报能否速度快一点,现在慢了体验感有点差\r
+        # 2、长按1.5秒后开始录音,松开按键后,发送录音至APP;\r
+        # 3、短按三次,拨打通信录号码三\r
+        # 4、短按四次,拨打通信录号码四\r
+        # 5、短按五次,拨打通信录号码五\r
+        # 6、短按六次,拨打通信录号码六\r
+        # 7、短按七次,拨打通信录号码七\r
+        # 8、短按八次,拨打通信录号码八\r
+    \r
+        def wechatKey_timeout_cb(self,data):#微聊键\r
+            open_power = EventMesh.publish("get_power_on_state")#获取开机标识\r
+            open_power_off = EventMesh.publish("get_power_off_state")#获取开机标识\r
+            video_state = EventMesh.publish("get_video_state")\r
+            if open_power != None and open_power_off != None:\r
+                if open_power == 0 or open_power_off == 1:\r
+                    self.wechatKey_timer.stop()\r
+                    self.wechatKey_count = 0\r
+                    self.wechatKey_press = 0\r
+                    self.wechat_state = 0\r
+                    self.wechatKey_press_count=0\r
+                    return\r
+            \r
+            if NEW_ENABLE == 1: #旧的按键定义微聊键\r
+                flag = EventMesh.publish("get_call_state")#在通话或者电话拨进 或者拨出不允许寻找设备\r
+                fall_down = EventMesh.publish("get_fall_down_state")#跌倒报警标识\r
+                if self.wechatKey_press_count > 1:#\r
+                    if fall_down != None:\r
+                        if fall_down != 0 or flag == 2:\r
+                            self.wechatKey_press_count = 0\r
+                            return\r
+                # EventMesh.debug_log("wechatKey_timeout_cb!!!!!!!!!!!!!! ",self.wechatKey_press_count)\r
+                if self.wechatKey_press_count == 10:#短按十次解绑app\r
+                    self.wechatKey_press_count = 0\r
+                    EventMesh.publish("stop_led_timer")#设置参数\r
+                    EventMesh.publish("open_power_on", 4)#恢复出厂\r
+                    pass\r
+                elif self.wechatKey_press_count == 6:#短按六次播报imei号\r
+                    self.wechatKey_press_count = 0\r
+                    EventMesh.publish("stop_led_timer")#设置参数\r
+                    EventMesh.publish("play_imei_event")#播報imei号\r
+                    pass\r
+                elif self.wechatKey_press_count == 4:#拨打通讯录号码三\r
+                    self.wechatKey_press_count = 0\r
+                    EventMesh.publish("stop_led_timer")#设置参数\r
+                    EventMesh.publish("call_phonebook_num",3)\r
+                    pass\r
+                elif self.wechatKey_press_count == 3:#拨打通讯录号码二\r
+                    self.wechatKey_press_count = 0\r
+                    EventMesh.publish("stop_led_timer")#设置参数\r
+                    EventMesh.publish("call_phonebook_num",2)\r
+                    pass\r
+                elif self.wechatKey_press_count == 2:#拨打通讯录号码一\r
+                    self.wechatKey_press_count = 0\r
+                    EventMesh.publish("stop_led_timer")#设置参数\r
+                    EventMesh.publish("call_phonebook_num",1)\r
+                    # EventMesh.publish("interup_call_event")#\r
+                    pass\r
+                elif self.wechatKey_press_count == 1:#播放最后收到的语音\r
+                    self.wechatKey_press_count = 0\r
+                    EventMesh.publish("stop_led_timer")#设置参数\r
+                    call_state = EventMesh.publish("get_call_state") \r
+                    if call_state == 0:\r
+                        fall_down = EventMesh.publish("get_fall_down_state")#跌倒报警标识\r
+                        if fall_down != None:\r
+                            if fall_down != 0:\r
+                                EventMesh.publish_async("dial_sos_phone")#拨打sos号码\r
+                                return\r
+                    else:\r
+                        if call_state == 2:#电话拨进需要接听\r
+                            EventMesh.publish("answer_call_event")#接听电话\r
+                            return\r
+                    EventMesh.publish("play_wechat_last_amr")\r
+                    # pass\r
+                self.wechatKey_press_count = 0\r
+            else:\r
+                flag = EventMesh.publish("get_call_state")#在通话或者电话拨进 或者拨出不允许寻找设备\r
+                fall_down = EventMesh.publish("get_fall_down_state")#跌倒报警标识\r
+                if self.wechatKey_press_count > 1:#\r
+                    if fall_down != None and flag != None and video_state != None:\r
+                        if fall_down != 0 or flag != 0 or video_state != 0:\r
+                            self.wechatKey_press_count = 0\r
+                            return\r
+                # EventMesh.debug_log("wechatKey_timeout_cb!!!!!!!!!!!!!! ",self.wechatKey_press_count)\r
+                if self.wechatKey_press_count == 10:#短按十次解绑app\r
+                    self.wechatKey_press_count = 0\r
+                    # EventMesh.publish("stop_led_timer")#设置参数\r
+                    # EventMesh.publish("open_power_on", 4)#恢复出厂\r
+                    pass\r
+                elif self.wechatKey_press_count == 8:#拨打通讯录号码八\r
+                    self.wechatKey_press_count = 0\r
+                    EventMesh.publish("stop_led_timer")#设置参数\r
+                    EventMesh.publish("call_phonebook_num",8)\r
+                    pass\r
+                elif self.wechatKey_press_count == 7:#拨打通讯录号码七\r
+                    self.wechatKey_press_count = 0\r
+                    EventMesh.publish("stop_led_timer")#设置参数\r
+                    EventMesh.publish("call_phonebook_num",7)\r
+                    pass\r
+                elif self.wechatKey_press_count == 6:#拨打通讯录号码六\r
+                    self.wechatKey_press_count = 0\r
+                    EventMesh.publish("stop_led_timer")#设置参数\r
+                    EventMesh.publish("call_phonebook_num",6)\r
+                    pass\r
+                elif self.wechatKey_press_count == 5:#拨打通讯录号码五\r
+                    self.wechatKey_press_count = 0\r
+                    EventMesh.publish("stop_led_timer")#设置参数\r
+                    EventMesh.publish("call_phonebook_num",5)\r
+                    pass\r
+                elif self.wechatKey_press_count == 4:#拨打通讯录号码四\r
+                    self.wechatKey_press_count = 0\r
+                    EventMesh.publish("stop_led_timer")#设置参数\r
+                    EventMesh.publish("call_phonebook_num",4)\r
+                    pass\r
+                elif self.wechatKey_press_count == 3:#拨打通讯录号码三\r
+                    self.wechatKey_press_count = 0\r
+                    EventMesh.publish("stop_led_timer")#设置参数\r
+                    EventMesh.publish("call_phonebook_num",3)\r
+                    pass\r
+                elif self.wechatKey_press_count == 2:#拨打通讯录号码一\r
+                    self.wechatKey_press_count = 0\r
+                    # EventMesh.publish("stop_led_timer")#设置参数\r
+                    # EventMesh.publish("call_phonebook_num",1)\r
+                    # EventMesh.publish("interup_call_event")#\r
+                    pass\r
+                elif self.wechatKey_press_count == 1:#播放最后收到的语音\r
+                    self.wechatKey_press_count = 0\r
+                    EventMesh.publish("stop_led_timer")#设置参数\r
+                    video_state = EventMesh.publish("get_video_state") \r
+                    # print("video_state call",video_state)\r
+                    if video_state != 0:\r
+                        if video_state == 6:#2 是app拨打手表 1 是手表打app 3 是正在视频通话中 0 关闭只有第一次视频通话打入才允许接听 接通之后不允许接听了\r
+                            EventMesh.publish("video_answer_cb")\r
+                        return\r
+                    call_state = EventMesh.publish("get_call_state") \r
+                    if call_state == 0:\r
+                        fall_down = EventMesh.publish("get_fall_down_state")#跌倒报警标识\r
+                        if fall_down != None:\r
+                            if fall_down != 0:\r
+                                EventMesh.publish_async("dial_sos_phone")#拨打sos号码\r
+                                return\r
+                    else:\r
+                        if call_state == 2:#电话拨进需要接听\r
+                            EventMesh.publish("answer_call_event")#接听电话\r
+                            return\r
+                    EventMesh.publish("play_wechat_last_amr")\r
+                    # pass\r
+                self.wechatKey_press_count = 0\r
+            \r
+    \r
+\r
+\r
+        def pwk_press_cb(self, *args):\r
+            '''KEY2:联动屏幕右下角或返回键长按关机'''\r
+            if self.pwk_press == 1 :\r
+                \r
+                self.pwk_count += 1\r
+                EventMesh.debug_log("self.pwk_count {}",self.pwk_count)\r
+                if self.GPIO26_status == 1:#松开\r
+                    if self.pwk_count >= 1: #防抖100ms\r
+                        self.__pwk_timer.stop()\r
+                        self.pwk_count = 0\r
+                        self.pwk_press = 0\r
+                        EventMesh.debug_log("self.pwk_press_cb")\r
+\r
+                if self.pwk_count > (self.__PowerDownTimeOut//100): #长按\r
+                    self.__pwk_timer.stop()\r
+                    self.pwk_count = 0\r
+                    self.pwk_press = 0\r
+                    EventMesh.debug_log("btn8_long_press")\r
+\r
+        def __ui_callback(self, para):\r
+        # EventMesh.debug_log("para = {}".format(para))\r
+            if para == 0:\r
+                EventMesh.publish("done_left_to_right")\r
+                #EventMesh.debug_log("<-")\r
+            elif para == 1:\r
+                EventMesh.publish("done_right_to_left")\r
+                #EventMesh.debug_log("->")\r
+            elif para == 2:\r
+                EventMesh.publish("done_bottom_to_top")\r
+                #EventMesh.debug_log("^")\r
+            elif para == 3:\r
+                EventMesh.publish("done_top_to_bottom")\r
+                #EventMesh.debug_log("V")\r
+            elif para == 4:\r
+                EventMesh.publish("done_return")\r
+                #EventMesh.debug_log("return")\r
+            elif para == 5:\r
+                EventMesh.publish("done_click")\r
+                #EventMesh.debug_log("CLICK")\r
+            elif para == 6:\r
+                EventMesh.publish("done_press")\r
+                #EventMesh.debug_log("press")\r
+            elif (para == 6):\r
+                EventMesh.publish("done_error")\r
+                #EventMesh.debug_log("error")\r
+\r
+        def key_callback(self, l_list):\r
+            EventMesh.debug_log("key_callback:",str(l_list))\r
+            if l_list[0] == 1:\r
+                # 马达震动预留\r
+                pass\r
+            if (l_list[1] == 3) and (l_list[2] == 0):\r
+                if l_list[0] == 1:\r
+                    #self.pwk_press = 0\r
+                    EventMesh.publish("btn1_press")\r
+                else:\r
+                    pass\r
+                    # EventMesh.publish("btn1_press")\r
+\r
+\r
+\r
+\r
+        def powerKey_callback(self, status):\r
+            EventMesh.debug_log('==pwr:', status)# 0 1 0\r
+            self.powerKey_status = status\r
+            if self.pwk_press == 1: #按按钮时不处理\r
+                return\r
+        \r
+            \r
+                \r
+\r
+        def power_key_press_cb(self, *args):\r
+            pass\r
+            # if EventMesh.publish(constants.EVENT.GET_CONNECT) == 0:#未插卡的情况下强制关机\r
+                # EventMesh.publish("open_power_on", 2)#\r
+\r
+\r
+        def start(self):\r
+            self.post_processor_after_instantiation()\r
index 334b3b6..7b4aa65 100644 (file)
@@ -1,12 +1,12 @@
-{
-  "old_time": 0,
-  "flip_sw": 0,
-  "VC_TTS_voice_type": {
-    "3": "aliyun::longjiaxin",
-    "2": "huoshan::zh_male_tiancaitongsheng_mars_bigtts",
-    "4": "huoshan::zh_female_daimengchuanmei_moon_bigtts",
-    "1": "huoshan::zh_male_wennuanahu_moon_bigtts",
-    "0": "huoshan::zh_female_wanwanxiaohe_moon_bigtts"
-  },
-  "dev_pass": "dEX5qdAPR2lhOBRmHbgbmPKZsPAcGN"
+{\r
+  "old_time": 0,\r
+  "flip_sw": 0,\r
+  "VC_TTS_voice_type": {\r
+    "3": "aliyun::longjiaxin",\r
+    "2": "huoshan::zh_male_tiancaitongsheng_mars_bigtts",\r
+    "4": "huoshan::zh_female_daimengchuanmei_moon_bigtts",\r
+    "1": "huoshan::zh_male_wennuanahu_moon_bigtts",\r
+    "0": "huoshan::zh_female_wanwanxiaohe_moon_bigtts"\r
+  },\r
+  "dev_pass": "dEX5qdAPR2lhOBRmHbgbmPKZsPAcGN"\r
 }
\ No newline at end of file
index b277a3b..a37f880 100644 (file)
-class PROTOCOL:
-    LK_SEND = "LK_SEND"
-    LK_RECV = "LK_RECV"
-
-    PING_SEND = "PING_SEND"
-    PING_RECV = "PING_RECV"
-
-    KA_SEND = "KA_SEND"
-    KA_RECV = "KA_RECV"
-
-    UD_SEND = "UD_SEND"
-    UD_RECV = "UD_RECV"
-
-    CR_SEND = "CR_SEND"
-    CR_RECV = "CR_RECV"
-
-    AL_SEND = "AL_SEND"
-    AL_RECV = "AL_RECV"
-
-    FIND_SEND = "FIND_SEND"
-    FIND_RECV = "FIND_RECV"
-
-    POWEROFF_SEND = "POWEROFF_SEND"
-    POWEROFF_RECV = "POWEROFF_RECV"
-
-    PHL_SEND = "PHL_SEND"
-    PHL_RECV = "PHL_RECV"
-
-    TK_SEND = "TK_SEND"
-    TK_RECV = "TK_RECV"
-
-    TKS_SEND = "TKS_SEND"
-    TKS_RECV = "TKS_RECV"
-
-    MESSAGE_SEND = "MESSAGE_SEND"
-    MESSAGE_RECV = "MESSAGE_RECV"
-
-    WT_SEND = "WT_SEND"
-    WT_RECV = "WT_RECV"
-
-    REMIND_SEND = "REMIND_SEND"
-    REMIND_RECV = "REMIND_RECV"
-
-    HRTSTART_SEND = "hrtstart_SEND"
-    HRTSTART_RECV = "hrtstart_RECV"
-
-    HEART_SEND = "heart_SEND"
-    HEART_RECV = "heart_RECV"
-    
-    OXYGEN_SEND = "oxygen_SEND"
-    OXYGEN_RECV = "oxygen_RECV"
-
-    OXSTART_SEND = "oxstart_SEND"
-    OXSTART_RECV = "oxstart_RECV"
-
-    TEMP_SEND = "temp_SEND"
-    TEMP_RECV = "temp_RECV"
-
-    DLT_SEND = "DLT_SEND"
-    DLT_RECV = "DLT_RECV"
-
-    UPLOAD_SEND = "UPLOAD_SEND"
-    UPLOAD_RECV = "UPLOAD_RECV"
-
-    CENTER_SEND = "CENTER_SEND"
-    CENTER_RECV = "CENTER_RECV"
-
-    MONITOR_SEND = "MONITOR_SEND"
-    MONITOR_RECV = "MONITOR_RECV"
-
-    SOS_SEND = "SOS_SEND"
-    SOS_RECV = "SOS_RECV"
-
-    BOOTOFF_SEND = "BOOTOFF_SEND"
-    BOOTOFF_RECV = "BOOTOFF_RECV"
-
-    WDSTART_SEND ="wdstart_SEND"
-    WDSTART_RECV ="wdstart_RECV"
-
-
-    LOWBAT_SEND = "LOWBAT_SEND"
-    LOWBAT_RECV = "LOWBAT_RECV"
-
-    TIME_SEND = "Time_SEND"
-    TIME_RECV = "Time_RECV"
-
-    WLKEY_SEND = "WLKEY_SEND"
-    WLKEY_RECV = "WLKEY_RECV"
-
-    SILENCETIME2_SEND = "SILENCETIME2_SEND"
-    SILENCETIME2_RECV = "SILENCETIME2_RECV"
-
-    KEYBRD_SEND = "KEYBRD_SEND"
-    KEYBRD_RECV = "KEYBRD_RECV"
-
-    FALLDOWN_SEND = "FALLDOWN_SEND"
-    FALLDOWN_RECV = "FALLDOWN_RECV"
-    
-    HELP_SEND = "HELP_SEND"
-    HELP_RECV = "HELP_RECV"
-    
-    REMOVE_SEND = "REMOVE_SEND"
-    REMOVE_RECV = "REMOVE_RECV"
-
-    BLOOD_SEND = "blood_SEND"
-    BLOOD_RECV = "blood_RECV"
-
-    BLDSTART_SEND ="bldstart_SEND"
-    BLDSTART_RECV = "bldstart_RECV"
-
-    BGSTART_SEND = "bgstart_SEND"
-    BGSTART_RECV = "bgstart_RECV"
-
-    BLOODGLUSOCE_SEND = "bloodglucose_SEND"
-    BLOODGLUSOCE_RECV = "bloodglucose_RECV"
-
-    REMIND_CH_DRINK_SEND = "REMIND_CH_DRINK_SEND"
-    REMIND_CH_DRINK_RECV = "REMIND_CH_DRINK_RECV"
-
-    REMIND_CH_MEDICINE2_SEND = "REMIND_CH_MEDICINE2_SEND"
-    REMIND_CH_MEDICINE2_RECV = "REMIND_CH_MEDICINE2_RECV"
-
-    REMIND_CH_HOME_SEND = "REMIND_CH_HOME_SEND"
-    REMIND_CH_HOME_RECV = "REMIND_CH_HOME_RECV"
-
-    REMIND_CH_WAKEUP_SEND = "REMIND_CH_WAKEUP_SEND"
-    REMIND_CH_WAKEUP_RECV = "REMIND_CH_WAKEUP_RECV"
-
-    REMIND_CH_SLEEP_SEND = "REMIND_CH_SLEEP_SEND"
-    REMIND_CH_SLEEP_RECV = "REMIND_CH_SLEEP_RECV"
-
-    REMIND_CH_REST_SEND = "REMIND_CH_REST_SEND"
-    REMIND_CH_REST_RECV = "REMIND_CH_REST_RECV"
-
-    SLEEP_DATA_SEND = "SleepReport_SEND"
-    SLEEP_DATA_RECV = "SleepReport_RECV"
-
-    SLEEPTIME_SEND = "SLEEPTIME_SEND"
-    SLEEPTIME_RECV = "SLEEPTIME_RECV"
-
-    FACTORY_SEND = "FACTORY_SEND"
-    FACTORY_RECV = "FACTORY_RECV"
-
-    RESET_SEND = "RESET_SEND"
-    RESET_RECV = "RESET_RECV"
-
-    REMIND_CH_SIT_SEND = "REMIND_CH_SIT_SEND"
-    REMIND_CH_SIT_RECV = "REMIND_CH_SIT_RECV"
-
-    SCREEN_SHOW_SEND = "SCREEN_SHOW_SEND"
-    SCREEN_SHOW_RECV = "SCREEN_SHOW_RECV"
-
-    JPREG_SEND = "JPREG_SEND"
-    JPREG_RECV = "JPREG_RECV"
-
-    MEMBERS_SEND = "MEMBERS_SEND"
-    MEMBERS_RECV = "MEMBERS_RECV"
-
-    CALLING_SEND = "CALLING_SEND"
-    CALLING_RECV = "CALLING_RECV"
-    
-
-    RCALLING_SEND  = "RCALLING_SEND"
-    RCALLING_RECV  = "RCALLING_RECV"
-
-    AGTALK_SEND = "AGTALK_SEND"
-    AGTALK_RECV = "AGTALK_RECV"
-
-    RTALK_SEND = "RTALK_SEND"
-    RTALK_RECV = "RTALK_RECV"
-
-    JMEMBERS_SEND = "JMEMBERS_SEND"
-    JMEMBERS_RECV = "JMEMBERS_RECV"
-
-    RINGING_SEND = "RINGING_SEND"
-    RINGING_RECV = "RINGING_RECV"
-
-    HANGUP_SEND = "HANGUP_SEND"
-    HANGUP_RECV = "HANGUP_RECV"
-
-    CALLCANCEL_SEND ="CALLCANCEL_SEND"
-    CALLCANCEL_RECV = "CALLCANCEL_RECV"
-    
-
-class EVENT:
-    CHANNEL_SOCKET_SEND = "CHANNEL_SOCKET_SEND"
-    START_LOCATION = "START_LOCATION" 
-    START_LOCATION_TEST = "START_LOCATION_TEST" 
-    READ_LOCATION = "READ_LOCATION"  
-    CLOSE_LOCATION = "CLOSE_LOCATION"
-    GPSOPEN = "GPSOPEN"
-    GPSCLOSE = "GPSCLOSE"
-    GPSINFO = "GPSINFO"
-    WIFISCANOPEN = "WIFISCANOPEN"
-    WIFIINFO = "WIFIINFO"
-
-    GET_KEY = "GET_KEY"
-    SET_KEY = "SET_KEY"
-    GET_IMEI = "GET_IMEI"
-    GET_CID = "GET_CID"
-    SET_CID = "SET_CID"
-    GET_IMSI = "GET_IMSI"
-    GET_PASSWORD = "GET_PASSWORD"
-    SET_PASSWORD = "SET_PASSWORD"
-    GET_BATTERY = "GET_BATTERY"
-    PERSISTENT_CONFIG_GET = "PERSISTENT_CONFIG_GET"
-    PERSISTENT_CONFIG_STORE = "PERSISTENT_CONFIG_STORE"
-    SET_PING = "SET_PING"
-    GET_PING = "GET_PING"
-    SET_CONNECT = "SET_CONNECT"
-    GET_CONNECT = "GET_CONNECT"
-    GET_STEP = "GET_STEP"
-    PUSH_STEP = "PUSH_STEP"
-    SYSTEM_SLEEP = "SYSTEM_SLEEP"
-    SYSTEM_UP = "SYSTEM_UP"
-    START_HEART = "START_HEART" 
-    GET_HEART = "GET_HEART"
-    STOP_HEART = "STOP_HEART"
-    GET_WEAR = "GET_WEAR"
-    START_TEMP = "START_TEMP"
-    STOP_TEMP = "STOP_TEMP"
-    GET_TEMP = "GET_TEMP"
-    START_BLOOD_OXYGEN = "STARTT_BLOOD_OXYGEN" 
-    GET_BLOOD_OXYGEN = "GET_BLOOD_OXYGEN"
-    STOP_BLOOD_OXYGEN = "STOP_BLOOD_OXYGEN"
-    CHANNEL_IOT_WEB_SEND = "CHANNEL_IOT_WEB_SEND"
-    
+class PROTOCOL:\r
+    LK_SEND = "LK_SEND"\r
+    LK_RECV = "LK_RECV"\r
+\r
+    PING_SEND = "PING_SEND"\r
+    PING_RECV = "PING_RECV"\r
+\r
+    KA_SEND = "KA_SEND"\r
+    KA_RECV = "KA_RECV"\r
+\r
+    UD_SEND = "UD_SEND"\r
+    UD_RECV = "UD_RECV"\r
+\r
+    CR_SEND = "CR_SEND"\r
+    CR_RECV = "CR_RECV"\r
+\r
+    AL_SEND = "AL_SEND"\r
+    AL_RECV = "AL_RECV"\r
+\r
+    FIND_SEND = "FIND_SEND"\r
+    FIND_RECV = "FIND_RECV"\r
+\r
+    POWEROFF_SEND = "POWEROFF_SEND"\r
+    POWEROFF_RECV = "POWEROFF_RECV"\r
+\r
+    PHL_SEND = "PHL_SEND"\r
+    PHL_RECV = "PHL_RECV"\r
+\r
+    TK_SEND = "TK_SEND"\r
+    TK_RECV = "TK_RECV"\r
+\r
+    TKS_SEND = "TKS_SEND"\r
+    TKS_RECV = "TKS_RECV"\r
+\r
+    MESSAGE_SEND = "MESSAGE_SEND"\r
+    MESSAGE_RECV = "MESSAGE_RECV"\r
+\r
+    WT_SEND = "WT_SEND"\r
+    WT_RECV = "WT_RECV"\r
+\r
+    REMIND_SEND = "REMIND_SEND"\r
+    REMIND_RECV = "REMIND_RECV"\r
+\r
+    HRTSTART_SEND = "hrtstart_SEND"\r
+    HRTSTART_RECV = "hrtstart_RECV"\r
+\r
+    HEART_SEND = "heart_SEND"\r
+    HEART_RECV = "heart_RECV"\r
+    \r
+    OXYGEN_SEND = "oxygen_SEND"\r
+    OXYGEN_RECV = "oxygen_RECV"\r
+\r
+    OXSTART_SEND = "oxstart_SEND"\r
+    OXSTART_RECV = "oxstart_RECV"\r
+\r
+    TEMP_SEND = "temp_SEND"\r
+    TEMP_RECV = "temp_RECV"\r
+\r
+    DLT_SEND = "DLT_SEND"\r
+    DLT_RECV = "DLT_RECV"\r
+\r
+    UPLOAD_SEND = "UPLOAD_SEND"\r
+    UPLOAD_RECV = "UPLOAD_RECV"\r
+\r
+    CENTER_SEND = "CENTER_SEND"\r
+    CENTER_RECV = "CENTER_RECV"\r
+\r
+    MONITOR_SEND = "MONITOR_SEND"\r
+    MONITOR_RECV = "MONITOR_RECV"\r
+\r
+    SOS_SEND = "SOS_SEND"\r
+    SOS_RECV = "SOS_RECV"\r
+\r
+    BOOTOFF_SEND = "BOOTOFF_SEND"\r
+    BOOTOFF_RECV = "BOOTOFF_RECV"\r
+\r
+    WDSTART_SEND ="wdstart_SEND"\r
+    WDSTART_RECV ="wdstart_RECV"\r
+\r
+\r
+    LOWBAT_SEND = "LOWBAT_SEND"\r
+    LOWBAT_RECV = "LOWBAT_RECV"\r
+\r
+    TIME_SEND = "Time_SEND"\r
+    TIME_RECV = "Time_RECV"\r
+\r
+    WLKEY_SEND = "WLKEY_SEND"\r
+    WLKEY_RECV = "WLKEY_RECV"\r
+\r
+    SILENCETIME2_SEND = "SILENCETIME2_SEND"\r
+    SILENCETIME2_RECV = "SILENCETIME2_RECV"\r
+\r
+    KEYBRD_SEND = "KEYBRD_SEND"\r
+    KEYBRD_RECV = "KEYBRD_RECV"\r
+\r
+    FALLDOWN_SEND = "FALLDOWN_SEND"\r
+    FALLDOWN_RECV = "FALLDOWN_RECV"\r
+    \r
+    HELP_SEND = "HELP_SEND"\r
+    HELP_RECV = "HELP_RECV"\r
+    \r
+    REMOVE_SEND = "REMOVE_SEND"\r
+    REMOVE_RECV = "REMOVE_RECV"\r
+\r
+    BLOOD_SEND = "blood_SEND"\r
+    BLOOD_RECV = "blood_RECV"\r
+\r
+    BLDSTART_SEND ="bldstart_SEND"\r
+    BLDSTART_RECV = "bldstart_RECV"\r
+\r
+    BGSTART_SEND = "bgstart_SEND"\r
+    BGSTART_RECV = "bgstart_RECV"\r
+\r
+    BLOODGLUSOCE_SEND = "bloodglucose_SEND"\r
+    BLOODGLUSOCE_RECV = "bloodglucose_RECV"\r
+\r
+    REMIND_CH_DRINK_SEND = "REMIND_CH_DRINK_SEND"\r
+    REMIND_CH_DRINK_RECV = "REMIND_CH_DRINK_RECV"\r
+\r
+    REMIND_CH_MEDICINE2_SEND = "REMIND_CH_MEDICINE2_SEND"\r
+    REMIND_CH_MEDICINE2_RECV = "REMIND_CH_MEDICINE2_RECV"\r
+\r
+    REMIND_CH_HOME_SEND = "REMIND_CH_HOME_SEND"\r
+    REMIND_CH_HOME_RECV = "REMIND_CH_HOME_RECV"\r
+\r
+    REMIND_CH_WAKEUP_SEND = "REMIND_CH_WAKEUP_SEND"\r
+    REMIND_CH_WAKEUP_RECV = "REMIND_CH_WAKEUP_RECV"\r
+\r
+    REMIND_CH_SLEEP_SEND = "REMIND_CH_SLEEP_SEND"\r
+    REMIND_CH_SLEEP_RECV = "REMIND_CH_SLEEP_RECV"\r
+\r
+    REMIND_CH_REST_SEND = "REMIND_CH_REST_SEND"\r
+    REMIND_CH_REST_RECV = "REMIND_CH_REST_RECV"\r
+\r
+    SLEEP_DATA_SEND = "SleepReport_SEND"\r
+    SLEEP_DATA_RECV = "SleepReport_RECV"\r
+\r
+    SLEEPTIME_SEND = "SLEEPTIME_SEND"\r
+    SLEEPTIME_RECV = "SLEEPTIME_RECV"\r
+\r
+    FACTORY_SEND = "FACTORY_SEND"\r
+    FACTORY_RECV = "FACTORY_RECV"\r
+\r
+    RESET_SEND = "RESET_SEND"\r
+    RESET_RECV = "RESET_RECV"\r
+\r
+    REMIND_CH_SIT_SEND = "REMIND_CH_SIT_SEND"\r
+    REMIND_CH_SIT_RECV = "REMIND_CH_SIT_RECV"\r
+\r
+    SCREEN_SHOW_SEND = "SCREEN_SHOW_SEND"\r
+    SCREEN_SHOW_RECV = "SCREEN_SHOW_RECV"\r
+\r
+    JPREG_SEND = "JPREG_SEND"\r
+    JPREG_RECV = "JPREG_RECV"\r
+\r
+    MEMBERS_SEND = "MEMBERS_SEND"\r
+    MEMBERS_RECV = "MEMBERS_RECV"\r
+\r
+    CALLING_SEND = "CALLING_SEND"\r
+    CALLING_RECV = "CALLING_RECV"\r
+    \r
+\r
+    RCALLING_SEND  = "RCALLING_SEND"\r
+    RCALLING_RECV  = "RCALLING_RECV"\r
+\r
+    AGTALK_SEND = "AGTALK_SEND"\r
+    AGTALK_RECV = "AGTALK_RECV"\r
+\r
+    RTALK_SEND = "RTALK_SEND"\r
+    RTALK_RECV = "RTALK_RECV"\r
+\r
+    JMEMBERS_SEND = "JMEMBERS_SEND"\r
+    JMEMBERS_RECV = "JMEMBERS_RECV"\r
+\r
+    RINGING_SEND = "RINGING_SEND"\r
+    RINGING_RECV = "RINGING_RECV"\r
+\r
+    HANGUP_SEND = "HANGUP_SEND"\r
+    HANGUP_RECV = "HANGUP_RECV"\r
+\r
+    CALLCANCEL_SEND ="CALLCANCEL_SEND"\r
+    CALLCANCEL_RECV = "CALLCANCEL_RECV"\r
+    \r
+\r
+class EVENT:\r
+    CHANNEL_SOCKET_SEND = "CHANNEL_SOCKET_SEND"\r
+    START_LOCATION = "START_LOCATION" \r
+    START_LOCATION_TEST = "START_LOCATION_TEST" \r
+    READ_LOCATION = "READ_LOCATION"  \r
+    CLOSE_LOCATION = "CLOSE_LOCATION"\r
+    GPSOPEN = "GPSOPEN"\r
+    GPSCLOSE = "GPSCLOSE"\r
+    GPSINFO = "GPSINFO"\r
+    WIFISCANOPEN = "WIFISCANOPEN"\r
+    WIFIINFO = "WIFIINFO"\r
+\r
+    GET_KEY = "GET_KEY"\r
+    SET_KEY = "SET_KEY"\r
+    GET_IMEI = "GET_IMEI"\r
+    GET_CID = "GET_CID"\r
+    SET_CID = "SET_CID"\r
+    GET_IMSI = "GET_IMSI"\r
+    GET_PASSWORD = "GET_PASSWORD"\r
+    SET_PASSWORD = "SET_PASSWORD"\r
+    GET_BATTERY = "GET_BATTERY"\r
+    PERSISTENT_CONFIG_GET = "PERSISTENT_CONFIG_GET"\r
+    PERSISTENT_CONFIG_STORE = "PERSISTENT_CONFIG_STORE"\r
+    SET_PING = "SET_PING"\r
+    GET_PING = "GET_PING"\r
+    SET_CONNECT = "SET_CONNECT"\r
+    GET_CONNECT = "GET_CONNECT"\r
+    GET_STEP = "GET_STEP"\r
+    PUSH_STEP = "PUSH_STEP"\r
+    SYSTEM_SLEEP = "SYSTEM_SLEEP"\r
+    SYSTEM_UP = "SYSTEM_UP"\r
+    START_HEART = "START_HEART" \r
+    GET_HEART = "GET_HEART"\r
+    STOP_HEART = "STOP_HEART"\r
+    GET_WEAR = "GET_WEAR"\r
+    START_TEMP = "START_TEMP"\r
+    STOP_TEMP = "STOP_TEMP"\r
+    GET_TEMP = "GET_TEMP"\r
+    START_BLOOD_OXYGEN = "STARTT_BLOOD_OXYGEN" \r
+    GET_BLOOD_OXYGEN = "GET_BLOOD_OXYGEN"\r
+    STOP_BLOOD_OXYGEN = "STOP_BLOOD_OXYGEN"\r
+    CHANNEL_IOT_WEB_SEND = "CHANNEL_IOT_WEB_SEND"\r
+    \r
index a1b19e0..6a6ac13 100644 (file)
-from common import Abstract
-import osTimer
-import EventMesh
-from machine import Pin
-import utime
-
-from queue import Queue
-import _thread
-import usys
-
-led_red = Pin(Pin.GPIO36, Pin.OUT, Pin.PULL_PD, 0)
-
-led_green = Pin(Pin.GPIO44, Pin.OUT, Pin.PULL_PD, 0)
-
-led_white = Pin(Pin.GPIO21, Pin.OUT, Pin.PULL_PD, 0)
-
-
-
-def green_light_fast(num,freq):#快闪 num 循环闪烁次数 freq 交替闪烁的频率ms单位 
-    for i in range(num):
-        led_green.write(1)
-        utime.sleep_ms(freq)
-        led_green.write(0)
-        utime.sleep_ms(freq)
-
-def red_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)
-def red_light_slow(num,freq):#慢闪 #快闪 num 循环闪烁次数 freq 交替闪烁的频率ms单位 
-    for i in range(10):
-        led_red.write(1)
-        utime.sleep_ms(500)
-        led_red.write(0)
-        utime.sleep_ms(500)
-
-def red_green_light(num,freq):#红绿灯交替闪烁 
-    for i in range(num):
-        led_red.write(1)
-        utime.sleep_ms(freq)
-        led_red.write(0)
-        utime.sleep_ms(freq)
-        led_green.write(1)
-        utime.sleep_ms(freq)
-        led_green.write(0)
-        utime.sleep_ms(freq)
-
-def open_led_red():
-    led_red.write(1)
-
-def close_led_red():
-    led_red.write(0)
-
-def open_led_white():
-    led_white.write(1)
-
-def close_led_white():
-    led_white.write(0)
-
-def open_led_green():
-    led_green.write(1)
-
-def close_led_green():
-    led_green.write(0)
-
-
-
-LED_TIMER_OUT = 100 
-class led_mode:
-    LONG_LIGHT_RED = 1
-    LONG_LIGHT_GREEN = 2
-    LONG_LIGHT_WHITE = 3
-    FLASH_LIGHT_RED = 4
-    FLASH_LIGHT_GREEN = 5
-    FLASH_LIGHT_WHITE = 6
-    FLASH_LIGHT_RED_GREEN = 7
-    FLASH_LIGHT_RED_WHITE = 8
-    FLASH_LIGHT_GREEN_WHITE = 9
-    LIGHT_NONE = FLASH_LIGHT_GREEN_WHITE+1
-
-    DEFAULT_LONG_LIGHT_MODE = 0+LIGHT_NONE #默认是关闭
-    OPEN_LONG_LIGHT_MODE = 1+LIGHT_NONE#开启
-    CLOSE_LONG_LIGHT_MODE = 2+LIGHT_NONE#需要关闭
-    INTERVAL_LIGHT_RED  = 3+LIGHT_NONE
-    INTERVAL_LIGHT_GREEN  = 4+LIGHT_NONE
-    INTERVAL_LIGHT_WHITE  = 5+LIGHT_NONE
-
-    OTHER_MEASURE_MODE = 200
-
-    HEALTH_LED_MODE = 201 #健康测试模式
-    WECHAT_LED_MODE = 202 #微聊模式
-    CHARGE_IN_MODE = 203 #充电模式
-    CHARGE_OUT_MODE = 204 #充电已移出
-    CHARGE_FULL_MODE = 205 #充电已满
-    POWER_OFF_MODE = 206 #关机模式
-
-
-
-
-
-class ledEventManager(Abstract):#灯事件
-    def __init__(self):
-        self.timer = osTimer()
-        self.freq_time = 0#交替闪烁时间 最小100ms 
-        self.freq_num = 0#交替闪烁的次数
-        self.flash_light = 0
-        self.total_time = 0
-        self.long_count = 0
-        self.timer_state = 0
-        self.total_count = 0
-        self.freq = 0
-        self.led_state = 0
-        self.long_light_mode = 0
-        self.hr_state = 0
-        self.wechat_btn = 1
-        self.need_hr_btn = 0
-        self.led_open_time = 0
-        self.led_close_time = 0
-        self.led_total_time = 0#闪的总时间
-        self.led_enable = 0
-        self.led_mode = 0
-        self.working_led_mode = None
-        self.ledInfo_queue = Queue()
-        _thread.stack_size(10*1024)
-        _thread.start_new_thread(self.ledInfo_queue_thread, ())
-        _thread.stack_size(8*1024)
-        EventMesh.subscribe("publish_message_event_ledInfo",self.publish_message_event_ledInfo)
-        pass
-    
-        
-
-    def post_processor_after_instantiation(self):
-        EventMesh.subscribe("set_led_time_arg", self.set_led_time_arg)#设置参数
-        EventMesh.subscribe("get_led_state", self.get_led_state)#设置参数
-
-        EventMesh.subscribe("set_hr_blood_led", self.set_hr_blood_led)#设置参数
-
-        EventMesh.subscribe("set_find_watch_led", self.set_find_watch_led)#设置参数
-
-        EventMesh.subscribe("close_all_led", self.close_all_led)#设置参数
-
-        EventMesh.subscribe("stop_led_timer", self.stop_led_timer)#设置参数
-
-        EventMesh.subscribe("read_red_led_level", self.read_red_led_level)#读取红灯的电平状态
-
-        EventMesh.subscribe("read_green_led_level", self.read_green_led_level)#读取绿灯的电平状态
-
-        EventMesh.subscribe("read_white_led_level", self.read_white_led_level)#读取白灯的电平状态
-
-        EventMesh.subscribe("close_led_pin", self.close_led_pin)#读取白灯的电平状态def close_led_pin(self, event, msg):
-
-
-    def ledInfo_queue_thread(self):
-        while True:
-            data = self.ledInfo_queue.get()
-            #EventMesh.debug_log("ledInfo_queue:data = {}".format(data))
-            if data != None:
-                try:
-                    data["func"](data["data"])
-                except Exception as e:
-                    EventMesh.debug_log("ledInfo_queue:ERROR:{}".format(e))
-                    usys.print_exception(e)
-    def publish_message_event_ledInfo(self,event,msg):
-        self.ledInfo_queue.put(msg)
-
-    def publish_led_event_cb(self, *args, **kwargs):
-        EventMesh.publish("publish_message_event_ledInfo",{"func":self.led_fun_cb,"data":0})  
-
-    def read_red_led_level(self, event, msg): #
-        red_level = led_red.read()
-        return red_level
-
-    def read_green_led_level(self, event, msg): #
-        green_level = led_green.read()
-        return green_level
-    
-    def read_white_led_level(self, event, msg): #
-        white_level = led_green.read()
-        return white_level
-
-    def set_hr_blood_led(self, event, msg): #
-        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",[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])#測量成功
-                # EventMesh.publish("set_led_time_arg",[3000,1000,1,led_mode.LONG_LIGHT_GREEN,led_mode.DEFAULT_LONG_LIGHT_MODE,led_mode.OTHER_MEASURE_MODE])#測量成功
-            elif msg == 3:#测量失败
-                EventMesh.publish("stop_led_timer")
-                # EventMesh.publish("set_led_time_arg",[1,1,1,led_mode.FLASH_LIGHT_RED,31,10*3,led_mode.OTHER_MEASURE_MODE])#測量成功
-                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")#
-       
-        # EventMesh.publish("set_led_time_arg",[37000,1000,1,led_mode.LONG_LIGHT_GREEN,led_mode.DEFAULT_LONG_LIGHT_MODE,led_mode.OTHER_MEASURE_MODE])#查找设备绿灯长亮37s
-
-    def get_led_state(self, event, msg): #
-        return self.timer_state
-    def open_timer(self,msg): #msg 0 使能 1总的时间 2 灯模式 3 开启时间 4 关闭时间 
-        if msg != None:
-            if len(msg) != 0:
-                self.led_total_time = msg[2]#
-                # EventMesh.debug_log("open_timer:{}".format(msg))
-                if self.led_total_time != None:
-
-                    if self.led_total_time > 0:
-                        self.led_enable=msg[0]
-                        if self.led_enable != 0:
-                            self.led_mode = msg[1]
-                            self.long_light_mode = msg[3]
-                            self.led_open_time = msg[4]
-                            self.led_close_time = msg[5]
-                            self.working_led_mode = msg[6]
-                            self.long_count = 0
-
-                            if self.timer_state == 0:
-                                self.timer_state = 1
-                                self.timer.stop()
-                                # self.timer.start(LED_TIMER_OUT,1,self.led_fun_cb)
-                                self.timer.start(LED_TIMER_OUT,1,self.publish_led_event_cb)
-                
-        
-
-
-    def set_led_time_arg(self, event, msg): #msg 
-        
-        open_power = EventMesh.publish("get_power_on_state")#获取开机标识
-        power_off = EventMesh.publish("get_power_off_state")#获取开机标识
-        # EventMesh.debug_log("set_led_time_arg",msg,open_power,power_off)
-        if open_power != None:
-            if open_power == 0:
-                return
-        if power_off != None:
-            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
-
-                        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)
-                            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
-                            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]#測量成功
-                                        self.timer_state = 0
-                                        self.timer.stop()
-                                        self.open_timer(str_buf)
-                                        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
-        self.open_timer(msg)
-
-
-   
-    # EventMesh.publish("set_led_time_arg",[1,2,2*300,led_mode.FLASH_LIGHT_RED_GREEN,2,1,led_mode.HEALTH_LED_MODE])#測量成功
-    def led_fun_cb(self, data):#
-        if self.led_enable == 0 or self.led_total_time == 0:
-            return
-        call_state = EventMesh.publish("get_call_state")
-        if call_state == None:
-            call_state = 0
-        if call_state != 0:
-            battery = EventMesh.publish("screen_get_battery")
-            if battery != None:
-                if battery[0] != "1":#在充电得时候
-                    get_hr_state = EventMesh.publish("get_hr_state")
-                    get_spo2_state = EventMesh.publish("get_spo2_state")
-                    get_temp_state = EventMesh.publish("get_temp_state")
-                    get_bp_state = EventMesh.publish("get_bp_state")
-                    get_bg_state = EventMesh.publish("get_bg_state")
-                    if get_hr_state != None and  get_spo2_state != None and get_temp_state != None and get_bp_state != None and get_bg_state != None:
-                        if get_hr_state == 1 or get_spo2_state == 1 or get_temp_state == 1 or get_bp_state == 1 or get_bg_state == 1:
-                                EventMesh.publish("close_hr_sop2")
-                                EventMesh.publish("close_led_pin")
-                                return
-        # EventMesh.debug_log("self.long_count",self.long_count)
-        if self.led_total_time != 0:
-            #红灯闪烁
-            if self.long_light_mode == led_mode.FLASH_LIGHT_RED :#
-                if self.led_mode == 1:
-                    if self.led_total_time > 0:
-                        self.led_total_time-=1
-                        if self.led_total_time > 0:
-                            close_led_green()
-                            close_led_white()
-                            open_led_red()
-                        else:
-                            EventMesh.publish("stop_led_timer")#关闭所有的灯
-                elif self.led_mode == 2:
-                    # EventMesh.debug_log("led red!!!!!!!")
-                    
-                    if self.long_count % (self.led_open_time) <=  self.led_close_time: # 4*cnt cnt 多少次 4 开启时间保护关闭时间 2 关闭时间 100ms 4-2关闭时间为200ms 开启时间也为200ms 
-                        close_led_green()
-                        close_led_white()
-                        open_led_red()
-                    else:
-                        close_led_green()
-                        close_led_white()
-                        close_led_red()
-                    if self.long_count >= self.led_total_time-1:#大于总的时间 4
-                        EventMesh.publish("stop_led_timer")#设置参数
-                        return
-                    self.long_count+=1
-            #绿灯闪烁
-            elif self.long_light_mode == led_mode.FLASH_LIGHT_GREEN:#
-                if self.led_mode == 1:#长亮时间限制
-                    
-                    if self.led_total_time > 0:
-                        self.led_total_time-=1
-                        if self.led_total_time > 0:
-                            close_led_red()
-                            close_led_white()
-                            open_led_green()
-                        else:
-                            EventMesh.publish("stop_led_timer")#关闭所有的灯
-                        
-
-                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()
-                        close_led_white()
-                        open_led_green()
-                        pass
-                    else:
-                        close_led_green()
-                        close_led_white()
-                        close_led_red()
-                        pass
-                    
-                    if self.long_count >= self.led_total_time-1:#大于总的时间 4
-                        EventMesh.publish("stop_led_timer")#设置参数
-                        return
-                    self.long_count+=1
-            #蓝灯闪烁 暂时是白色灯
-            elif self.long_light_mode == led_mode.FLASH_LIGHT_WHITE:#
-                if self.led_mode == 1:#长亮时间限制
-                    if self.led_total_time > 0:
-                        self.led_total_time-=1
-                        if self.led_total_time > 0:
-                            close_led_red()
-                            close_led_green()
-                            open_led_white()
-                        else:
-                            EventMesh.publish("stop_led_timer")#关闭所有的灯
-                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()
-                        close_led_green()
-                        open_led_white()
-                        pass
-                    else:
-                        close_led_green()
-                        close_led_white()
-                        close_led_red()
-                        pass
-                    if self.long_count >= self.led_total_time-1:#大于总的时间 4
-                        EventMesh.publish("stop_led_timer")#设置参数
-                        return
-                    self.long_count+=1
-            #红绿灯闪烁
-            elif self.long_light_mode == led_mode.FLASH_LIGHT_RED_GREEN:#
-                
-                
-                if self.long_count % (self.led_open_time) <=  self.led_close_time: # 4*cnt cnt 多少次 4 开启时间保护关闭时间 2 关闭时间 100ms 4-2关闭时间为200ms 开启时间也为200ms 
-                    close_led_white()#白色灯
-                    close_led_green()
-                    open_led_red()
-                    pass
-                else: 
-                    close_led_white()
-                    close_led_red()
-                    open_led_green()
-                    pass
-                if self.long_count >= self.led_total_time-1:#大于总的时间 4
-                    EventMesh.publish("stop_led_timer")#设置参数
-                    return
-                self.long_count+=1
-            #红蓝灯闪烁 蓝变成白色灯
-            elif self.long_light_mode == led_mode.FLASH_LIGHT_RED_WHITE:#
-                if self.long_count % (self.led_open_time) <=  self.led_close_time: # 4*cnt cnt 多少次 4 开启时间保护关闭时间 2 关闭时间 100ms 4-2关闭时间为200ms 开启时间也为200ms 
-                    close_led_white()#白色灯
-                    close_led_green()
-                    open_led_red()
-                    pass
-                else:
-                    close_led_green()
-                    close_led_red()
-                    open_led_white()
-                    pass
-                if self.long_count >= self.led_total_time-1:#大于总的时间 4
-                    EventMesh.publish("stop_led_timer")#设置参数
-                    return
-                self.long_count+=1
-            #蓝绿灯闪烁
-            elif self.long_light_mode == led_mode.FLASH_LIGHT_GREEN_WHITE:#
-
-                
-                if self.long_count % (self.led_open_time) <=  self.led_close_time: # 4*cnt cnt 多少次 4 开启时间保护关闭时间 2 关闭时间 100ms 4-2关闭时间为200ms 开启时间也为200ms 
-                    close_led_white()#白色灯
-                    close_led_red()
-                    open_led_green()
-                    pass
-                else:
-                    close_led_green()
-                    close_led_red()
-                    open_led_white()
-                    pass
-                if self.long_count >= self.led_total_time-1:#大于总的时间 4
-                    EventMesh.publish("stop_led_timer")#设置参数
-                    return
-                self.long_count+=1
-            #红灯长亮
-            elif self.long_light_mode == led_mode.LONG_LIGHT_RED:#
-                close_led_white()#白色灯
-                close_led_green()
-                open_led_red()
-                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
-
-            #绿灯长亮
-            elif self.long_light_mode == led_mode.LONG_LIGHT_GREEN:#
-                close_led_white()#白色灯
-                close_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
-            #蓝灯长亮
-            elif self.long_light_mode == led_mode.LONG_LIGHT_WHITE:#
-                close_led_green()#白色灯
-                close_led_red()
-                open_led_white()
-                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!!!")
-
-        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
-        close_led_red()
-        close_led_green()
-        close_led_white()
-
-    def stop_led_timer(self, event, msg):
-        EventMesh.publish("close_all_led")#关闭所有的灯
-    
-    def close_all_led(self, event, msg):
-        self.close_all_led_do(0)
-    def close_all_led_do(self,data):   
-        open_power = EventMesh.publish("get_power_on_state")#获取开机标识
-        if open_power != None:
-            if open_power == 0:
-                return
-        open_power_off = EventMesh.publish("get_power_off_state")#获取开机标识
-        if open_power_off != None:
-            if open_power_off == 1:
-                return
-        usb_in = EventMesh.publish("get_usb")#
-        open_power_off = EventMesh.publish("get_power_off_state")#获取开机标识
-        if open_power_off != None:
-            if open_power_off != 1:
-                if usb_in != None:
-                    if usb_in == 1 or usb_in == 3:#正在充电或者充电已满都不要被打断
-                        if self.timer_state == 1:
-                            self.timer_state = 0
-                            self.timer.stop()
-                        return
-                    else:
-                        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,wechat_state,self.working_led_mode)
-                        if wechat_state != None: #获取微聊状态
-                            if wechat_state == 1 or get_spo2_state == 1  or get_hr_state == 1  or temp_state == 1 or bp_state == 1 \
-                                or bg_state == 1 :
-                                return
-        if self.timer_state == 1:
-            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
-        close_led_red()
-        close_led_green()
-        close_led_white()
-        # EventMesh.debug_log("close led!!!")
-
-    def led_test_fun_cb(self, data):
-        return
-   
+from common import Abstract\r
+import osTimer\r
+import EventMesh\r
+from machine import Pin\r
+import utime\r
+\r
+from queue import Queue\r
+import _thread\r
+import usys\r
+\r
+led_red = Pin(Pin.GPIO36, Pin.OUT, Pin.PULL_PD, 0)\r
+\r
+led_green = Pin(Pin.GPIO44, Pin.OUT, Pin.PULL_PD, 0)\r
+\r
+led_white = Pin(Pin.GPIO21, Pin.OUT, Pin.PULL_PD, 0)\r
+\r
+\r
+\r
+def green_light_fast(num,freq):#快闪 num 循环闪烁次数 freq 交替闪烁的频率ms单位 \r
+    for i in range(num):\r
+        led_green.write(1)\r
+        utime.sleep_ms(freq)\r
+        led_green.write(0)\r
+        utime.sleep_ms(freq)\r
+\r
+def red_light_fast(num,freq):#快闪 #快闪 num 循环闪烁次数 freq 交替闪烁的频率ms单位 \r
+    for i in range(num):\r
+        led_red.write(1)\r
+        utime.sleep_ms(freq)\r
+        led_red.write(0)\r
+        utime.sleep_ms(freq)\r
+def red_light_slow(num,freq):#慢闪 #快闪 num 循环闪烁次数 freq 交替闪烁的频率ms单位 \r
+    for i in range(10):\r
+        led_red.write(1)\r
+        utime.sleep_ms(500)\r
+        led_red.write(0)\r
+        utime.sleep_ms(500)\r
+\r
+def red_green_light(num,freq):#红绿灯交替闪烁 \r
+    for i in range(num):\r
+        led_red.write(1)\r
+        utime.sleep_ms(freq)\r
+        led_red.write(0)\r
+        utime.sleep_ms(freq)\r
+        led_green.write(1)\r
+        utime.sleep_ms(freq)\r
+        led_green.write(0)\r
+        utime.sleep_ms(freq)\r
+\r
+def open_led_red():\r
+    led_red.write(1)\r
+\r
+def close_led_red():\r
+    led_red.write(0)\r
+\r
+def open_led_white():\r
+    led_white.write(1)\r
+\r
+def close_led_white():\r
+    led_white.write(0)\r
+\r
+def open_led_green():\r
+    led_green.write(1)\r
+\r
+def close_led_green():\r
+    led_green.write(0)\r
+\r
+\r
+\r
+LED_TIMER_OUT = 100 \r
+class led_mode:\r
+    LONG_LIGHT_RED = 1\r
+    LONG_LIGHT_GREEN = 2\r
+    LONG_LIGHT_WHITE = 3\r
+    FLASH_LIGHT_RED = 4\r
+    FLASH_LIGHT_GREEN = 5\r
+    FLASH_LIGHT_WHITE = 6\r
+    FLASH_LIGHT_RED_GREEN = 7\r
+    FLASH_LIGHT_RED_WHITE = 8\r
+    FLASH_LIGHT_GREEN_WHITE = 9\r
+    LIGHT_NONE = FLASH_LIGHT_GREEN_WHITE+1\r
+\r
+    DEFAULT_LONG_LIGHT_MODE = 0+LIGHT_NONE #默认是关闭\r
+    OPEN_LONG_LIGHT_MODE = 1+LIGHT_NONE#开启\r
+    CLOSE_LONG_LIGHT_MODE = 2+LIGHT_NONE#需要关闭\r
+    INTERVAL_LIGHT_RED  = 3+LIGHT_NONE\r
+    INTERVAL_LIGHT_GREEN  = 4+LIGHT_NONE\r
+    INTERVAL_LIGHT_WHITE  = 5+LIGHT_NONE\r
+\r
+    OTHER_MEASURE_MODE = 200\r
+\r
+    HEALTH_LED_MODE = 201 #健康测试模式\r
+    WECHAT_LED_MODE = 202 #微聊模式\r
+    CHARGE_IN_MODE = 203 #充电模式\r
+    CHARGE_OUT_MODE = 204 #充电已移出\r
+    CHARGE_FULL_MODE = 205 #充电已满\r
+    POWER_OFF_MODE = 206 #关机模式\r
+\r
+\r
+\r
+\r
+\r
+class ledEventManager(Abstract):#灯事件\r
+    def __init__(self):\r
+        self.timer = osTimer()\r
+        self.freq_time = 0#交替闪烁时间 最小100ms \r
+        self.freq_num = 0#交替闪烁的次数\r
+        self.flash_light = 0\r
+        self.total_time = 0\r
+        self.long_count = 0\r
+        self.timer_state = 0\r
+        self.total_count = 0\r
+        self.freq = 0\r
+        self.led_state = 0\r
+        self.long_light_mode = 0\r
+        self.hr_state = 0\r
+        self.wechat_btn = 1\r
+        self.need_hr_btn = 0\r
+        self.led_open_time = 0\r
+        self.led_close_time = 0\r
+        self.led_total_time = 0#闪的总时间\r
+        self.led_enable = 0\r
+        self.led_mode = 0\r
+        self.working_led_mode = None\r
+        self.ledInfo_queue = Queue()\r
+        _thread.stack_size(10*1024)\r
+        _thread.start_new_thread(self.ledInfo_queue_thread, ())\r
+        _thread.stack_size(8*1024)\r
+        EventMesh.subscribe("publish_message_event_ledInfo",self.publish_message_event_ledInfo)\r
+        pass\r
+    \r
+        \r
+\r
+    def post_processor_after_instantiation(self):\r
+        EventMesh.subscribe("set_led_time_arg", self.set_led_time_arg)#设置参数\r
+        EventMesh.subscribe("get_led_state", self.get_led_state)#设置参数\r
+\r
+        EventMesh.subscribe("set_hr_blood_led", self.set_hr_blood_led)#设置参数\r
+\r
+        EventMesh.subscribe("set_find_watch_led", self.set_find_watch_led)#设置参数\r
+\r
+        EventMesh.subscribe("close_all_led", self.close_all_led)#设置参数\r
+\r
+        EventMesh.subscribe("stop_led_timer", self.stop_led_timer)#设置参数\r
+\r
+        EventMesh.subscribe("read_red_led_level", self.read_red_led_level)#读取红灯的电平状态\r
+\r
+        EventMesh.subscribe("read_green_led_level", self.read_green_led_level)#读取绿灯的电平状态\r
+\r
+        EventMesh.subscribe("read_white_led_level", self.read_white_led_level)#读取白灯的电平状态\r
+\r
+        EventMesh.subscribe("close_led_pin", self.close_led_pin)#读取白灯的电平状态def close_led_pin(self, event, msg):\r
+\r
+\r
+    def ledInfo_queue_thread(self):\r
+        while True:\r
+            data = self.ledInfo_queue.get()\r
+            #EventMesh.debug_log("ledInfo_queue:data = {}".format(data))\r
+            if data != None:\r
+                try:\r
+                    data["func"](data["data"])\r
+                except Exception as e:\r
+                    EventMesh.debug_log("ledInfo_queue:ERROR:{}".format(e))\r
+                    usys.print_exception(e)\r
+    def publish_message_event_ledInfo(self,event,msg):\r
+        self.ledInfo_queue.put(msg)\r
+\r
+    def publish_led_event_cb(self, *args, **kwargs):\r
+        EventMesh.publish("publish_message_event_ledInfo",{"func":self.led_fun_cb,"data":0})  \r
+\r
+    def read_red_led_level(self, event, msg): #\r
+        red_level = led_red.read()\r
+        return red_level\r
+\r
+    def read_green_led_level(self, event, msg): #\r
+        green_level = led_green.read()\r
+        return green_level\r
+    \r
+    def read_white_led_level(self, event, msg): #\r
+        white_level = led_green.read()\r
+        return white_level\r
+\r
+    def set_hr_blood_led(self, event, msg): #\r
+        EventMesh.debug_log("set_hr_blood_led :{}".format(msg))\r
+        if msg != None:\r
+            if msg == 1:\r
+                EventMesh.publish("set_led_time_arg",[1,2,10*70*2,led_mode.FLASH_LIGHT_RED_GREEN,10,5,led_mode.HEALTH_LED_MODE])#測量成功\r
+                # 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])#開始測量\r
+            elif msg == 2:\r
+                EventMesh.publish("set_led_time_arg",[1,2,60,led_mode.FLASH_LIGHT_GREEN,60,30,led_mode.OTHER_MEASURE_MODE])#測量成功\r
+                # EventMesh.publish("set_led_time_arg",[3000,1000,1,led_mode.LONG_LIGHT_GREEN,led_mode.DEFAULT_LONG_LIGHT_MODE,led_mode.OTHER_MEASURE_MODE])#測量成功\r
+            elif msg == 3:#测量失败\r
+                EventMesh.publish("stop_led_timer")\r
+                # EventMesh.publish("set_led_time_arg",[1,1,1,led_mode.FLASH_LIGHT_RED,31,10*3,led_mode.OTHER_MEASURE_MODE])#測量成功\r
+                pass\r
+                # EventMesh.publish("set_led_time_arg",[1,1,30,led_mode.FLASH_LIGHT_RED,31,10*3,led_mode.OTHER_MEASURE_MODE])#测量失败\r
+                #加音频文件\r
+\r
+    def set_find_watch_led(self, event, msg): #查找设备\r
+        EventMesh.publish("OPEN_FIND_WATCH")#\r
+       \r
+        # EventMesh.publish("set_led_time_arg",[37000,1000,1,led_mode.LONG_LIGHT_GREEN,led_mode.DEFAULT_LONG_LIGHT_MODE,led_mode.OTHER_MEASURE_MODE])#查找设备绿灯长亮37s\r
+\r
+    def get_led_state(self, event, msg): #\r
+        return self.timer_state\r
+    def open_timer(self,msg): #msg 0 使能 1总的时间 2 灯模式 3 开启时间 4 关闭时间 \r
+        if msg != None:\r
+            if len(msg) != 0:\r
+                self.led_total_time = msg[2]#\r
+                # EventMesh.debug_log("open_timer:{}".format(msg))\r
+                if self.led_total_time != None:\r
+\r
+                    if self.led_total_time > 0:\r
+                        self.led_enable=msg[0]\r
+                        if self.led_enable != 0:\r
+                            self.led_mode = msg[1]\r
+                            self.long_light_mode = msg[3]\r
+                            self.led_open_time = msg[4]\r
+                            self.led_close_time = msg[5]\r
+                            self.working_led_mode = msg[6]\r
+                            self.long_count = 0\r
+\r
+                            if self.timer_state == 0:\r
+                                self.timer_state = 1\r
+                                self.timer.stop()\r
+                                # self.timer.start(LED_TIMER_OUT,1,self.led_fun_cb)\r
+                                self.timer.start(LED_TIMER_OUT,1,self.publish_led_event_cb)\r
+                \r
+        \r
+\r
+\r
+    def set_led_time_arg(self, event, msg): #msg \r
+        \r
+        open_power = EventMesh.publish("get_power_on_state")#获取开机标识\r
+        power_off = EventMesh.publish("get_power_off_state")#获取开机标识\r
+        # EventMesh.debug_log("set_led_time_arg",msg,open_power,power_off)\r
+        if open_power != None:\r
+            if open_power == 0:\r
+                return\r
+        if power_off != None:\r
+            if power_off == 1:\r
+                return\r
+        usb_in = EventMesh.publish("get_usb")#\r
+        if msg != None:\r
+            if msg[6] != led_mode.POWER_OFF_MODE:#插入usb关机以防不亮红绿灯\r
+                # EventMesh.debug_log("usb_in",usb_in)\r
+                if usb_in != None:\r
+                    if usb_in == 1 or usb_in == 3:#正在充电或者充电已满都不要被打断\r
+                        if self.timer_state == 1:\r
+                            self.timer_state = 0\r
+                            self.timer.stop()\r
+                        if usb_in == 1:\r
+                            if self.working_led_mode != led_mode.CHARGE_IN_MODE:\r
+                                str_buf = [1,1,10,led_mode.LONG_LIGHT_RED,4,2,led_mode.CHARGE_IN_MODE]\r
+                                self.open_timer(str_buf)\r
+                            self.working_led_mode = led_mode.CHARGE_IN_MODE\r
+\r
+                        elif usb_in == 3:\r
+                            if self.working_led_mode != led_mode.CHARGE_FULL_MODE:\r
+                                str_buf = [1,1,10,led_mode.LONG_LIGHT_GREEN,4,2,led_mode.CHARGE_FULL_MODE]\r
+                                self.open_timer(str_buf)\r
+                            self.working_led_mode = led_mode.CHARGE_FULL_MODE\r
+                        \r
+                        return\r
+                    else:\r
+                        if msg[5] != led_mode.HEALTH_LED_MODE:\r
+                            self.working_led_mode = led_mode.OTHER_MEASURE_MODE\r
+\r
+                        get_hr_state = EventMesh.publish("get_hr_state")\r
+                        get_spo2_state = EventMesh.publish("get_spo2_state")\r
+                        \r
+                        wechat_state = EventMesh.publish("get_wechat_state")\r
+                        temp_state = EventMesh.publish("get_temp_state")\r
+                        bp_state = EventMesh.publish("get_bp_state")\r
+                        bg_state = EventMesh.publish("get_bg_state")\r
+                        EventMesh.debug_log("get_hr_state",get_hr_state,get_spo2_state,temp_state,wechat_state,self.working_led_mode)\r
+                        if wechat_state != None: #获取微聊状态\r
+                            if wechat_state == 1:\r
+                                if self.working_led_mode != led_mode.WECHAT_LED_MODE:#如果不在亮微聊模式需要亮微聊模式\r
+                                    self.timer_state = 0\r
+                                    self.timer.stop()\r
+                                    str_buf = [1,1,1,led_mode.LONG_LIGHT_GREEN,4,2,led_mode.WECHAT_LED_MODE]\r
+                                    self.open_timer(str_buf)\r
+                                    self.working_led_mode = led_mode.WECHAT_LED_MODE\r
+                                    return\r
+                                else:\r
+                                    return\r
+                            else:\r
+                                self.wechat_btn = 0\r
+                                # if get_hr_state != 0 or get_spo2_state != 0 or temp_state != 0 or bp_state != 0 or bg_state != 0 :#心率血氧优先级高\r
+                                if get_hr_state == 1 or get_spo2_state == 1 or temp_state == 1 \\r
+                                or bp_state == 1  or bg_state == 1:\r
+                                    if self.working_led_mode != led_mode.HEALTH_LED_MODE:#如果不在亮微聊模式需要亮微聊模式\r
+                                        EventMesh.debug_log("set_hr_blood_led!!!!!!!!!!")\r
+                                        str_buf = [1,2,10*70*2,led_mode.FLASH_LIGHT_RED_GREEN,10,5,led_mode.HEALTH_LED_MODE]#測量成功\r
+                                        self.timer_state = 0\r
+                                        self.timer.stop()\r
+                                        self.open_timer(str_buf)\r
+                                        self.working_led_mode = led_mode.HEALTH_LED_MODE\r
+                                        return\r
+                                    else:\r
+                                        EventMesh.debug_log("set_hr_blood_led stop!!!!!!!!!!")\r
+                                        return\r
+                                else:# 0 2都认为其他模式灯亮 不是测试健康灯\r
+                                    self.working_led_mode = led_mode.OTHER_MEASURE_MODE\r
+        self.open_timer(msg)\r
+\r
+\r
+   \r
+    # EventMesh.publish("set_led_time_arg",[1,2,2*300,led_mode.FLASH_LIGHT_RED_GREEN,2,1,led_mode.HEALTH_LED_MODE])#測量成功\r
+    def led_fun_cb(self, data):#\r
+        if self.led_enable == 0 or self.led_total_time == 0:\r
+            return\r
+        call_state = EventMesh.publish("get_call_state")\r
+        if call_state == None:\r
+            call_state = 0\r
+        if call_state != 0:\r
+            battery = EventMesh.publish("screen_get_battery")\r
+            if battery != None:\r
+                if battery[0] != "1":#在充电得时候\r
+                    get_hr_state = EventMesh.publish("get_hr_state")\r
+                    get_spo2_state = EventMesh.publish("get_spo2_state")\r
+                    get_temp_state = EventMesh.publish("get_temp_state")\r
+                    get_bp_state = EventMesh.publish("get_bp_state")\r
+                    get_bg_state = EventMesh.publish("get_bg_state")\r
+                    if get_hr_state != None and  get_spo2_state != None and get_temp_state != None and get_bp_state != None and get_bg_state != None:\r
+                        if get_hr_state == 1 or get_spo2_state == 1 or get_temp_state == 1 or get_bp_state == 1 or get_bg_state == 1:\r
+                                EventMesh.publish("close_hr_sop2")\r
+                                EventMesh.publish("close_led_pin")\r
+                                return\r
+        # EventMesh.debug_log("self.long_count",self.long_count)\r
+        if self.led_total_time != 0:\r
+            #红灯闪烁\r
+            if self.long_light_mode == led_mode.FLASH_LIGHT_RED :#\r
+                if self.led_mode == 1:\r
+                    if self.led_total_time > 0:\r
+                        self.led_total_time-=1\r
+                        if self.led_total_time > 0:\r
+                            close_led_green()\r
+                            close_led_white()\r
+                            open_led_red()\r
+                        else:\r
+                            EventMesh.publish("stop_led_timer")#关闭所有的灯\r
+                elif self.led_mode == 2:\r
+                    # EventMesh.debug_log("led red!!!!!!!")\r
+                    \r
+                    if self.long_count % (self.led_open_time) <=  self.led_close_time: # 4*cnt cnt 多少次 4 开启时间保护关闭时间 2 关闭时间 100ms 4-2关闭时间为200ms 开启时间也为200ms \r
+                        close_led_green()\r
+                        close_led_white()\r
+                        open_led_red()\r
+                    else:\r
+                        close_led_green()\r
+                        close_led_white()\r
+                        close_led_red()\r
+                    if self.long_count >= self.led_total_time-1:#大于总的时间 4\r
+                        EventMesh.publish("stop_led_timer")#设置参数\r
+                        return\r
+                    self.long_count+=1\r
+            #绿灯闪烁\r
+            elif self.long_light_mode == led_mode.FLASH_LIGHT_GREEN:#\r
+                if self.led_mode == 1:#长亮时间限制\r
+                    \r
+                    if self.led_total_time > 0:\r
+                        self.led_total_time-=1\r
+                        if self.led_total_time > 0:\r
+                            close_led_red()\r
+                            close_led_white()\r
+                            open_led_green()\r
+                        else:\r
+                            EventMesh.publish("stop_led_timer")#关闭所有的灯\r
+                        \r
+\r
+                elif self.led_mode == 2:\r
+                    \r
+                    if self.long_count % (self.led_open_time) <=  self.led_close_time: # 4*cnt cnt 多少次 4 开启时间保护关闭时间 2 关闭时间 100ms 4-2关闭时间为200ms 开启时间也为200ms \r
+                        close_led_red()\r
+                        close_led_white()\r
+                        open_led_green()\r
+                        pass\r
+                    else:\r
+                        close_led_green()\r
+                        close_led_white()\r
+                        close_led_red()\r
+                        pass\r
+                    \r
+                    if self.long_count >= self.led_total_time-1:#大于总的时间 4\r
+                        EventMesh.publish("stop_led_timer")#设置参数\r
+                        return\r
+                    self.long_count+=1\r
+            #蓝灯闪烁 暂时是白色灯\r
+            elif self.long_light_mode == led_mode.FLASH_LIGHT_WHITE:#\r
+                if self.led_mode == 1:#长亮时间限制\r
+                    if self.led_total_time > 0:\r
+                        self.led_total_time-=1\r
+                        if self.led_total_time > 0:\r
+                            close_led_red()\r
+                            close_led_green()\r
+                            open_led_white()\r
+                        else:\r
+                            EventMesh.publish("stop_led_timer")#关闭所有的灯\r
+                elif self.led_mode == 2:\r
+                    if self.long_count % (self.led_open_time) <=  self.led_close_time: # 4*cnt cnt 多少次 4 开启时间保护关闭时间 2 关闭时间 100ms 4-2关闭时间为200ms 开启时间也为200ms \r
+                        close_led_red()\r
+                        close_led_green()\r
+                        open_led_white()\r
+                        pass\r
+                    else:\r
+                        close_led_green()\r
+                        close_led_white()\r
+                        close_led_red()\r
+                        pass\r
+                    if self.long_count >= self.led_total_time-1:#大于总的时间 4\r
+                        EventMesh.publish("stop_led_timer")#设置参数\r
+                        return\r
+                    self.long_count+=1\r
+            #红绿灯闪烁\r
+            elif self.long_light_mode == led_mode.FLASH_LIGHT_RED_GREEN:#\r
+                \r
+                \r
+                if self.long_count % (self.led_open_time) <=  self.led_close_time: # 4*cnt cnt 多少次 4 开启时间保护关闭时间 2 关闭时间 100ms 4-2关闭时间为200ms 开启时间也为200ms \r
+                    close_led_white()#白色灯\r
+                    close_led_green()\r
+                    open_led_red()\r
+                    pass\r
+                else: \r
+                    close_led_white()\r
+                    close_led_red()\r
+                    open_led_green()\r
+                    pass\r
+                if self.long_count >= self.led_total_time-1:#大于总的时间 4\r
+                    EventMesh.publish("stop_led_timer")#设置参数\r
+                    return\r
+                self.long_count+=1\r
+            #红蓝灯闪烁 蓝变成白色灯\r
+            elif self.long_light_mode == led_mode.FLASH_LIGHT_RED_WHITE:#\r
+                if self.long_count % (self.led_open_time) <=  self.led_close_time: # 4*cnt cnt 多少次 4 开启时间保护关闭时间 2 关闭时间 100ms 4-2关闭时间为200ms 开启时间也为200ms \r
+                    close_led_white()#白色灯\r
+                    close_led_green()\r
+                    open_led_red()\r
+                    pass\r
+                else:\r
+                    close_led_green()\r
+                    close_led_red()\r
+                    open_led_white()\r
+                    pass\r
+                if self.long_count >= self.led_total_time-1:#大于总的时间 4\r
+                    EventMesh.publish("stop_led_timer")#设置参数\r
+                    return\r
+                self.long_count+=1\r
+            #蓝绿灯闪烁\r
+            elif self.long_light_mode == led_mode.FLASH_LIGHT_GREEN_WHITE:#\r
+\r
+                \r
+                if self.long_count % (self.led_open_time) <=  self.led_close_time: # 4*cnt cnt 多少次 4 开启时间保护关闭时间 2 关闭时间 100ms 4-2关闭时间为200ms 开启时间也为200ms \r
+                    close_led_white()#白色灯\r
+                    close_led_red()\r
+                    open_led_green()\r
+                    pass\r
+                else:\r
+                    close_led_green()\r
+                    close_led_red()\r
+                    open_led_white()\r
+                    pass\r
+                if self.long_count >= self.led_total_time-1:#大于总的时间 4\r
+                    EventMesh.publish("stop_led_timer")#设置参数\r
+                    return\r
+                self.long_count+=1\r
+            #红灯长亮\r
+            elif self.long_light_mode == led_mode.LONG_LIGHT_RED:#\r
+                close_led_white()#白色灯\r
+                close_led_green()\r
+                open_led_red()\r
+                self.timer.stop()\r
+                self.timer_state = 0\r
+                self.led_total_time = 0\r
+                self.led_enable = 0\r
+                self.led_mode = 0\r
+                self.long_light_mode = 0\r
+                self.led_open_time = 0\r
+                self.led_close_time = 0\r
+                self.working_led_mode = 0\r
+                self.long_count = 0\r
+\r
+            #绿灯长亮\r
+            elif self.long_light_mode == led_mode.LONG_LIGHT_GREEN:#\r
+                close_led_white()#白色灯\r
+                close_led_red()\r
+                open_led_green()\r
+                self.timer.stop()\r
+                self.timer_state = 0\r
+                self.led_total_time = 0\r
+                self.led_enable = 0\r
+                self.led_mode = 0\r
+                self.long_light_mode = 0\r
+                self.led_open_time = 0\r
+                self.led_close_time = 0\r
+                self.working_led_mode = 0\r
+                self.long_count = 0\r
+            #蓝灯长亮\r
+            elif self.long_light_mode == led_mode.LONG_LIGHT_WHITE:#\r
+                close_led_green()#白色灯\r
+                close_led_red()\r
+                open_led_white()\r
+                self.timer.stop()\r
+                self.timer_state = 0\r
+                self.led_total_time = 0\r
+                self.led_enable = 0\r
+                self.led_mode = 0\r
+                self.long_light_mode = 0\r
+                self.led_open_time = 0\r
+                self.led_close_time = 0\r
+                self.working_led_mode = 0\r
+                self.long_count = 0\r
+    \r
+    def close_led_pin(self, event, msg):\r
+        EventMesh.debug_log("close_led_pin!!!")\r
+\r
+        self.timer.stop()\r
+        self.timer_state = 0\r
+        self.led_total_time = 0\r
+        self.led_enable = 0\r
+        self.led_mode = 0\r
+        self.long_light_mode = 0\r
+        self.led_open_time = 0\r
+        self.led_close_time = 0\r
+        self.working_led_mode = 0\r
+        self.long_count = 0\r
+        close_led_red()\r
+        close_led_green()\r
+        close_led_white()\r
+\r
+    def stop_led_timer(self, event, msg):\r
+        EventMesh.publish("close_all_led")#关闭所有的灯\r
+    \r
+    def close_all_led(self, event, msg):\r
+        self.close_all_led_do(0)\r
+    def close_all_led_do(self,data):   \r
+        open_power = EventMesh.publish("get_power_on_state")#获取开机标识\r
+        if open_power != None:\r
+            if open_power == 0:\r
+                return\r
+        open_power_off = EventMesh.publish("get_power_off_state")#获取开机标识\r
+        if open_power_off != None:\r
+            if open_power_off == 1:\r
+                return\r
+        usb_in = EventMesh.publish("get_usb")#\r
+        open_power_off = EventMesh.publish("get_power_off_state")#获取开机标识\r
+        if open_power_off != None:\r
+            if open_power_off != 1:\r
+                if usb_in != None:\r
+                    if usb_in == 1 or usb_in == 3:#正在充电或者充电已满都不要被打断\r
+                        if self.timer_state == 1:\r
+                            self.timer_state = 0\r
+                            self.timer.stop()\r
+                        return\r
+                    else:\r
+                        get_hr_state = EventMesh.publish("get_hr_state")\r
+                        get_spo2_state = EventMesh.publish("get_spo2_state")\r
+                        \r
+                        wechat_state = EventMesh.publish("get_wechat_state")\r
+                        temp_state = EventMesh.publish("get_temp_state")\r
+                        bp_state = EventMesh.publish("get_bp_state")\r
+                        bg_state = EventMesh.publish("get_bg_state")\r
+                        # EventMesh.debug_log("get_hr_state",get_hr_state,get_spo2_state,wechat_state,self.working_led_mode)\r
+                        if wechat_state != None: #获取微聊状态\r
+                            if wechat_state == 1 or get_spo2_state == 1  or get_hr_state == 1  or temp_state == 1 or bp_state == 1 \\r
+                                or bg_state == 1 :\r
+                                return\r
+        if self.timer_state == 1:\r
+            self.timer.stop()\r
+        self.timer_state = 0\r
+        self.led_total_time = 0\r
+        self.led_enable = 0\r
+        self.led_mode = 0\r
+        self.long_light_mode = 0\r
+        self.led_open_time = 0\r
+        self.led_close_time = 0\r
+        self.working_led_mode = 0\r
+        self.long_count = 0\r
+        close_led_red()\r
+        close_led_green()\r
+        close_led_white()\r
+        # EventMesh.debug_log("close led!!!")\r
+\r
+    def led_test_fun_cb(self, data):\r
+        return\r
+   \r
index 4680da9..d31a50d 100644 (file)
-from common import Abstract
-import osTimer
-import EventMesh
-from machine import Pin
-import utime
-from queue import Queue
-import _thread
-import usys
-if EventMesh.model == "D15":
-
-    led_red = Pin(Pin.GPIO36, Pin.OUT, Pin.PULL_PD, 0)
-
-    led_green = Pin(Pin.GPIO44, Pin.OUT, Pin.PULL_PD, 0)
-
-    led_white = Pin(Pin.GPIO21, Pin.OUT, Pin.PULL_PD, 0)
-
-
-
-    def green_light_fast(num,freq):#快闪 num 循环闪烁次数 freq 交替闪烁的频率ms单位 
-        for i in range(num):
-            led_green.write(1)
-            utime.sleep_ms(freq)
-            led_green.write(0)
-            utime.sleep_ms(freq)
-
-    def red_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)
-    def red_light_slow(num,freq):#慢闪 #快闪 num 循环闪烁次数 freq 交替闪烁的频率ms单位 
-        for i in range(10):
-            led_red.write(1)
-            utime.sleep_ms(500)
-            led_red.write(0)
-            utime.sleep_ms(500)
-
-    def red_green_light(num,freq):#红绿灯交替闪烁 
-        for i in range(num):
-            led_red.write(1)
-            utime.sleep_ms(freq)
-            led_red.write(0)
-            utime.sleep_ms(freq)
-            led_green.write(1)
-            utime.sleep_ms(freq)
-            led_green.write(0)
-            utime.sleep_ms(freq)
-
-    def open_led_red():
-        led_red.write(1)
-
-    def close_led_red():
-        led_red.write(0)
-
-    def open_led_white():
-        led_white.write(1)
-
-    def close_led_white():
-        led_white.write(0)
-
-    def open_led_green():
-        led_green.write(1)
-
-    def close_led_green():
-        led_green.write(0)
-
-
-
-    LED_TIMER_OUT = 100 
-    class led_mode:
-        LONG_LIGHT_RED = 1
-        LONG_LIGHT_GREEN = 2
-        LONG_LIGHT_WHITE = 3
-        FLASH_LIGHT_RED = 4
-        FLASH_LIGHT_GREEN = 5
-        FLASH_LIGHT_WHITE = 6
-        FLASH_LIGHT_RED_GREEN = 7
-        FLASH_LIGHT_RED_WHITE = 8
-        FLASH_LIGHT_GREEN_WHITE = 9
-        LIGHT_NONE = FLASH_LIGHT_GREEN_WHITE+1
-
-        DEFAULT_LONG_LIGHT_MODE = 0+LIGHT_NONE #默认是关闭
-        OPEN_LONG_LIGHT_MODE = 1+LIGHT_NONE#开启
-        CLOSE_LONG_LIGHT_MODE = 2+LIGHT_NONE#需要关闭
-        INTERVAL_LIGHT_RED  = 3+LIGHT_NONE
-        INTERVAL_LIGHT_GREEN  = 4+LIGHT_NONE
-        INTERVAL_LIGHT_WHITE  = 5+LIGHT_NONE
-
-        OTHER_MEASURE_MODE = 200
-
-        HEALTH_LED_MODE = 201 #健康测试模式
-        WECHAT_LED_MODE = 202 #微聊模式
-        CHARGE_IN_MODE = 203 #充电模式
-        CHARGE_OUT_MODE = 204 #充电已移出
-        CHARGE_FULL_MODE = 205 #充电已满
-        POWER_OFF_MODE = 206 #关机模式
-
-        VIDEO_MEASURE_MODE = 207 #视频通话
-
-
-
-
-
-    class ledEventManager(Abstract):#灯事件
-        def __init__(self):
-            self.timer = osTimer()
-            self.freq_time = 0#交替闪烁时间 最小100ms 
-            self.freq_num = 0#交替闪烁的次数
-            self.flash_light = 0
-            self.total_time = 0
-            self.long_count = 0
-            self.timer_state = 0
-            self.total_count = 0
-            self.freq = 0
-            self.led_state = 0
-            self.long_light_mode = 0
-            self.hr_state = 0
-            self.wechat_btn = 1
-            self.need_hr_btn = 0
-            self.led_open_time = 0
-            self.led_close_time = 0
-            self.led_total_time = 0#闪的总时间
-            self.led_enable = 0
-            self.led_mode = 0
-            self.working_led_mode = None
-            self.ledInfo_queue = Queue()
-            _thread.stack_size(10*1024)
-            _thread.start_new_thread(self.ledInfo_queue_thread, ())
-            _thread.stack_size(8*1024)
-            EventMesh.subscribe("publish_message_event_ledInfo",self.publish_message_event_ledInfo)
-            pass
-        
-            
-
-        def post_processor_after_instantiation(self):
-            EventMesh.subscribe("set_led_time_arg", self.set_led_time_arg)#设置参数
-            EventMesh.subscribe("get_led_state", self.get_led_state)#设置参数
-
-            EventMesh.subscribe("set_hr_blood_led", self.set_hr_blood_led)#设置参数
-
-            EventMesh.subscribe("set_find_watch_led", self.set_find_watch_led)#设置参数
-
-            EventMesh.subscribe("close_all_led", self.close_all_led)#设置参数
-
-            EventMesh.subscribe("stop_led_timer", self.stop_led_timer)#设置参数
-
-            EventMesh.subscribe("read_red_led_level", self.read_red_led_level)#读取红灯的电平状态
-
-            EventMesh.subscribe("read_green_led_level", self.read_green_led_level)#读取绿灯的电平状态
-
-            EventMesh.subscribe("read_white_led_level", self.read_white_led_level)#读取白灯的电平状态
-
-            EventMesh.subscribe("close_led_pin", self.close_led_pin)#读取白灯的电平状态def close_led_pin(self, event, msg):
-
-
-        def ledInfo_queue_thread(self):
-            while True:
-                data = self.ledInfo_queue.get()
-                #EventMesh.debug_log("ledInfo_queue:data = {}".format(data))
-                if data != None:
-                    try:
-                        data["func"](data["data"])
-                    except Exception as e:
-                        EventMesh.debug_log("ledInfo_queue:ERROR:{}".format(e))
-                        usys.print_exception(e)
-        def publish_message_event_ledInfo(self,event,msg):
-            self.ledInfo_queue.put(msg)
-
-        def publish_led_event_cb(self, *args, **kwargs):
-            EventMesh.publish("publish_message_event_ledInfo",{"func":self.led_fun_cb,"data":0})  
-
-        def read_red_led_level(self, event, msg): #
-            red_level = led_red.read()
-            return red_level
-
-        def read_green_led_level(self, event, msg): #
-            green_level = led_green.read()
-            return green_level
-        
-        def read_white_led_level(self, event, msg): #
-            white_level = led_green.read()
-            return white_level
-
-        def set_hr_blood_led(self, event, msg): #
-            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",[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])#測量成功
-                    # EventMesh.publish("set_led_time_arg",[3000,1000,1,led_mode.LONG_LIGHT_GREEN,led_mode.DEFAULT_LONG_LIGHT_MODE,led_mode.OTHER_MEASURE_MODE])#測量成功
-                elif msg == 3:#测量失败
-                    EventMesh.publish("stop_led_timer")
-                    # EventMesh.publish("set_led_time_arg",[1,1,1,led_mode.FLASH_LIGHT_RED,31,10*3,led_mode.OTHER_MEASURE_MODE])#測量成功
-                    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")#
-        
-            # EventMesh.publish("set_led_time_arg",[37000,1000,1,led_mode.LONG_LIGHT_GREEN,led_mode.DEFAULT_LONG_LIGHT_MODE,led_mode.OTHER_MEASURE_MODE])#查找设备绿灯长亮37s
-
-        def get_led_state(self, event, msg): #
-            return self.timer_state
-        def open_timer(self,msg): #msg 0 使能 1总的时间 2 灯模式 3 开启时间 4 关闭时间 
-            if msg != None:
-                if len(msg) != 0:
-                    self.led_total_time = msg[2]#
-                    # EventMesh.debug_log("open_timer:{}".format(msg))
-                    if self.led_total_time != None:
-
-                        if self.led_total_time > 0:
-                            self.led_enable=msg[0]
-                            if self.led_enable != 0:
-                                self.led_mode = msg[1]
-                                self.long_light_mode = msg[3]
-                                self.led_open_time = msg[4]
-                                self.led_close_time = msg[5]
-                                self.working_led_mode = msg[6]
-                                self.long_count = 0
-
-                                if self.timer_state == 0:
-                                    self.timer_state = 1
-                                    self.timer.stop()
-                                    # self.timer.start(LED_TIMER_OUT,1,self.led_fun_cb)
-                                    self.timer.start(LED_TIMER_OUT,1,self.publish_led_event_cb)
-                    
-            
-
-
-        def set_led_time_arg(self, event, msg): #msg 
-            
-            open_power = EventMesh.publish("get_power_on_state")#获取开机标识
-            power_off = EventMesh.publish("get_power_off_state")#获取开机标识
-            # EventMesh.debug_log("set_led_time_arg",msg,open_power,power_off)
-            if open_power != None:
-                if open_power == 0:
-                    return
-            if power_off != None:
-                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
-
-                            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)
-                                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
-                                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]#測量成功
-                                            self.timer_state = 0
-                                            self.timer.stop()
-                                            self.open_timer(str_buf)
-                                            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
-
-            if EventMesh.publish("get_video_state") != 0:
-                if msg[6] != led_mode.VIDEO_MEASURE_MODE:
-                    return
-            self.open_timer(msg)
-
-
-    
-        # EventMesh.publish("set_led_time_arg",[1,2,2*300,led_mode.FLASH_LIGHT_RED_GREEN,2,1,led_mode.HEALTH_LED_MODE])#測量成功
-        def led_fun_cb(self, data):#
-            if self.led_enable == 0 or self.led_total_time == 0:
-                return
-            call_state = EventMesh.publish("get_call_state")
-            if call_state == None:
-                call_state = 0
-            if call_state != 0:
-                battery = EventMesh.publish("screen_get_battery")
-                if battery != None:
-                    if battery[0] != "1":#在充电得时候
-                        get_hr_state = EventMesh.publish("get_hr_state")
-                        get_spo2_state = EventMesh.publish("get_spo2_state")
-                        get_temp_state = EventMesh.publish("get_temp_state")
-                        get_bp_state = EventMesh.publish("get_bp_state")
-                        get_bg_state = EventMesh.publish("get_bg_state")
-                        if get_hr_state != None and  get_spo2_state != None and get_temp_state != None and get_bp_state != None and get_bg_state != None:
-                            if get_hr_state == 1 or get_spo2_state == 1 or get_temp_state == 1 or get_bp_state == 1 or get_bg_state == 1:
-                                    EventMesh.publish("close_hr_sop2")
-                                    EventMesh.publish("close_led_pin")
-                                    return
-            # EventMesh.debug_log("self.long_count",self.long_count)
-            if self.led_total_time != 0:
-                #红灯闪烁
-                if self.long_light_mode == led_mode.FLASH_LIGHT_RED :#
-                    if self.led_mode == 1:
-                        if self.led_total_time > 0:
-                            self.led_total_time-=1
-                            if self.led_total_time > 0:
-                                close_led_green()
-                                close_led_white()
-                                open_led_red()
-                            else:
-                                EventMesh.publish("stop_led_timer")#关闭所有的灯
-                    elif self.led_mode == 2:
-                        # EventMesh.debug_log("led red!!!!!!!")
-                        
-                        if self.long_count % (self.led_open_time) <=  self.led_close_time: # 4*cnt cnt 多少次 4 开启时间保护关闭时间 2 关闭时间 100ms 4-2关闭时间为200ms 开启时间也为200ms 
-                            close_led_green()
-                            close_led_white()
-                            open_led_red()
-                        else:
-                            close_led_green()
-                            close_led_white()
-                            close_led_red()
-                        if self.long_count >= self.led_total_time-1:#大于总的时间 4
-                            EventMesh.publish("stop_led_timer")#设置参数
-                            return
-                        self.long_count+=1
-                #绿灯闪烁
-                elif self.long_light_mode == led_mode.FLASH_LIGHT_GREEN:#
-                    if self.led_mode == 1:#长亮时间限制
-                        
-                        if self.led_total_time > 0:
-                            self.led_total_time-=1
-                            if self.led_total_time > 0:
-                                close_led_red()
-                                close_led_white()
-                                open_led_green()
-                            else:
-                                EventMesh.publish("stop_led_timer")#关闭所有的灯
-                            
-
-                    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()
-                            close_led_white()
-                            open_led_green()
-                            pass
-                        else:
-                            close_led_green()
-                            close_led_white()
-                            close_led_red()
-                            pass
-                        
-                        if self.long_count >= self.led_total_time-1:#大于总的时间 4
-                            EventMesh.publish("stop_led_timer")#设置参数
-                            return
-                        self.long_count+=1
-                #蓝灯闪烁 暂时是白色灯
-                elif self.long_light_mode == led_mode.FLASH_LIGHT_WHITE:#
-                    if self.led_mode == 1:#长亮时间限制
-                        if self.led_total_time > 0:
-                            self.led_total_time-=1
-                            if self.led_total_time > 0:
-                                close_led_red()
-                                close_led_green()
-                                open_led_white()
-                            else:
-                                EventMesh.publish("stop_led_timer")#关闭所有的灯
-                    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()
-                            close_led_green()
-                            open_led_white()
-                            pass
-                        else:
-                            close_led_green()
-                            close_led_white()
-                            close_led_red()
-                            pass
-                        if self.long_count >= self.led_total_time-1:#大于总的时间 4
-                            EventMesh.publish("stop_led_timer")#设置参数
-                            return
-                        self.long_count+=1
-                #红绿灯闪烁
-                elif self.long_light_mode == led_mode.FLASH_LIGHT_RED_GREEN:#
-                    
-                    
-                    if self.long_count % (self.led_open_time) <=  self.led_close_time: # 4*cnt cnt 多少次 4 开启时间保护关闭时间 2 关闭时间 100ms 4-2关闭时间为200ms 开启时间也为200ms 
-                        close_led_white()#白色灯
-                        close_led_green()
-                        open_led_red()
-                        pass
-                    else: 
-                        close_led_white()
-                        close_led_red()
-                        open_led_green()
-                        pass
-                    if self.long_count >= self.led_total_time-1:#大于总的时间 4
-                        EventMesh.publish("stop_led_timer")#设置参数
-                        return
-                    self.long_count+=1
-                #红蓝灯闪烁 蓝变成白色灯
-                elif self.long_light_mode == led_mode.FLASH_LIGHT_RED_WHITE:#
-                    if self.long_count % (self.led_open_time) <=  self.led_close_time: # 4*cnt cnt 多少次 4 开启时间保护关闭时间 2 关闭时间 100ms 4-2关闭时间为200ms 开启时间也为200ms 
-                        close_led_white()#白色灯
-                        close_led_green()
-                        open_led_red()
-                        pass
-                    else:
-                        close_led_green()
-                        close_led_red()
-                        open_led_white()
-                        pass
-                    if self.long_count >= self.led_total_time-1:#大于总的时间 4
-                        EventMesh.publish("stop_led_timer")#设置参数
-                        return
-                    self.long_count+=1
-                #蓝绿灯闪烁
-                elif self.long_light_mode == led_mode.FLASH_LIGHT_GREEN_WHITE:#
-
-                    
-                    if self.long_count % (self.led_open_time) <=  self.led_close_time: # 4*cnt cnt 多少次 4 开启时间保护关闭时间 2 关闭时间 100ms 4-2关闭时间为200ms 开启时间也为200ms 
-                        close_led_white()#白色灯
-                        close_led_red()
-                        open_led_green()
-                        pass
-                    else:
-                        close_led_green()
-                        close_led_red()
-                        open_led_white()
-                        pass
-                    if self.long_count >= self.led_total_time-1:#大于总的时间 4
-                        EventMesh.publish("stop_led_timer")#设置参数
-                        return
-                    self.long_count+=1
-                #红灯长亮
-                elif self.long_light_mode == led_mode.LONG_LIGHT_RED:#
-                    close_led_white()#白色灯
-                    close_led_green()
-                    open_led_red()
-                    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
-
-                #绿灯长亮
-                elif self.long_light_mode == led_mode.LONG_LIGHT_GREEN:#
-                    close_led_white()#白色灯
-                    close_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
-                #蓝灯长亮
-                elif self.long_light_mode == led_mode.LONG_LIGHT_WHITE:#
-                    close_led_green()#白色灯
-                    close_led_red()
-                    open_led_white()
-                    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!!!")
-
-            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
-            close_led_red()
-            close_led_green()
-            close_led_white()
-
-        def stop_led_timer(self, event, msg):
-            EventMesh.publish("close_all_led")#关闭所有的灯
-        
-        def close_all_led(self, event, msg):
-            self.close_all_led_do(0)
-        def close_all_led_do(self,data):   
-            open_power = EventMesh.publish("get_power_on_state")#获取开机标识
-            if open_power != None:
-                if open_power == 0:
-                    return
-            usb_in = EventMesh.publish("get_usb")#
-            open_power_off = EventMesh.publish("get_power_off_state")#获取开机标识
-            if open_power_off != None:
-                if open_power_off != 1:
-                    if usb_in != None:
-                        if usb_in == 1 or usb_in == 3:#正在充电或者充电已满都不要被打断
-                            if self.timer_state == 1:
-                                self.timer_state = 0
-                                self.timer.stop()
-                            return
-                        else:
-                            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,wechat_state,self.working_led_mode)
-                            if wechat_state != None: #获取微聊状态
-                                if wechat_state == 1 or get_spo2_state == 1  or get_hr_state == 1  or temp_state == 1 or bp_state == 1 \
-                                    or bg_state == 1 :
-                                    return
-            if self.timer_state == 1:
-                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
-            close_led_red()
-            close_led_green()
-            close_led_white()
-            # EventMesh.debug_log("close led!!!")
-
-        def led_test_fun_cb(self, data):
-            return
-    
+from common import Abstract\r
+import osTimer\r
+import EventMesh\r
+from machine import Pin\r
+import utime\r
+from queue import Queue\r
+import _thread\r
+import usys\r
+if EventMesh.model == "D15":\r
+\r
+    led_red = Pin(Pin.GPIO36, Pin.OUT, Pin.PULL_PD, 0)\r
+\r
+    led_green = Pin(Pin.GPIO44, Pin.OUT, Pin.PULL_PD, 0)\r
+\r
+    led_white = Pin(Pin.GPIO21, Pin.OUT, Pin.PULL_PD, 0)\r
+\r
+\r
+\r
+    def green_light_fast(num,freq):#快闪 num 循环闪烁次数 freq 交替闪烁的频率ms单位 \r
+        for i in range(num):\r
+            led_green.write(1)\r
+            utime.sleep_ms(freq)\r
+            led_green.write(0)\r
+            utime.sleep_ms(freq)\r
+\r
+    def red_light_fast(num,freq):#快闪 #快闪 num 循环闪烁次数 freq 交替闪烁的频率ms单位 \r
+        for i in range(num):\r
+            led_red.write(1)\r
+            utime.sleep_ms(freq)\r
+            led_red.write(0)\r
+            utime.sleep_ms(freq)\r
+    def red_light_slow(num,freq):#慢闪 #快闪 num 循环闪烁次数 freq 交替闪烁的频率ms单位 \r
+        for i in range(10):\r
+            led_red.write(1)\r
+            utime.sleep_ms(500)\r
+            led_red.write(0)\r
+            utime.sleep_ms(500)\r
+\r
+    def red_green_light(num,freq):#红绿灯交替闪烁 \r
+        for i in range(num):\r
+            led_red.write(1)\r
+            utime.sleep_ms(freq)\r
+            led_red.write(0)\r
+            utime.sleep_ms(freq)\r
+            led_green.write(1)\r
+            utime.sleep_ms(freq)\r
+            led_green.write(0)\r
+            utime.sleep_ms(freq)\r
+\r
+    def open_led_red():\r
+        led_red.write(1)\r
+\r
+    def close_led_red():\r
+        led_red.write(0)\r
+\r
+    def open_led_white():\r
+        led_white.write(1)\r
+\r
+    def close_led_white():\r
+        led_white.write(0)\r
+\r
+    def open_led_green():\r
+        led_green.write(1)\r
+\r
+    def close_led_green():\r
+        led_green.write(0)\r
+\r
+\r
+\r
+    LED_TIMER_OUT = 100 \r
+    class led_mode:\r
+        LONG_LIGHT_RED = 1\r
+        LONG_LIGHT_GREEN = 2\r
+        LONG_LIGHT_WHITE = 3\r
+        FLASH_LIGHT_RED = 4\r
+        FLASH_LIGHT_GREEN = 5\r
+        FLASH_LIGHT_WHITE = 6\r
+        FLASH_LIGHT_RED_GREEN = 7\r
+        FLASH_LIGHT_RED_WHITE = 8\r
+        FLASH_LIGHT_GREEN_WHITE = 9\r
+        LIGHT_NONE = FLASH_LIGHT_GREEN_WHITE+1\r
+\r
+        DEFAULT_LONG_LIGHT_MODE = 0+LIGHT_NONE #默认是关闭\r
+        OPEN_LONG_LIGHT_MODE = 1+LIGHT_NONE#开启\r
+        CLOSE_LONG_LIGHT_MODE = 2+LIGHT_NONE#需要关闭\r
+        INTERVAL_LIGHT_RED  = 3+LIGHT_NONE\r
+        INTERVAL_LIGHT_GREEN  = 4+LIGHT_NONE\r
+        INTERVAL_LIGHT_WHITE  = 5+LIGHT_NONE\r
+\r
+        OTHER_MEASURE_MODE = 200\r
+\r
+        HEALTH_LED_MODE = 201 #健康测试模式\r
+        WECHAT_LED_MODE = 202 #微聊模式\r
+        CHARGE_IN_MODE = 203 #充电模式\r
+        CHARGE_OUT_MODE = 204 #充电已移出\r
+        CHARGE_FULL_MODE = 205 #充电已满\r
+        POWER_OFF_MODE = 206 #关机模式\r
+\r
+        VIDEO_MEASURE_MODE = 207 #视频通话\r
+\r
+\r
+\r
+\r
+\r
+    class ledEventManager(Abstract):#灯事件\r
+        def __init__(self):\r
+            self.timer = osTimer()\r
+            self.freq_time = 0#交替闪烁时间 最小100ms \r
+            self.freq_num = 0#交替闪烁的次数\r
+            self.flash_light = 0\r
+            self.total_time = 0\r
+            self.long_count = 0\r
+            self.timer_state = 0\r
+            self.total_count = 0\r
+            self.freq = 0\r
+            self.led_state = 0\r
+            self.long_light_mode = 0\r
+            self.hr_state = 0\r
+            self.wechat_btn = 1\r
+            self.need_hr_btn = 0\r
+            self.led_open_time = 0\r
+            self.led_close_time = 0\r
+            self.led_total_time = 0#闪的总时间\r
+            self.led_enable = 0\r
+            self.led_mode = 0\r
+            self.working_led_mode = None\r
+            self.ledInfo_queue = Queue()\r
+            _thread.stack_size(10*1024)\r
+            _thread.start_new_thread(self.ledInfo_queue_thread, ())\r
+            _thread.stack_size(8*1024)\r
+            EventMesh.subscribe("publish_message_event_ledInfo",self.publish_message_event_ledInfo)\r
+            pass\r
+        \r
+            \r
+\r
+        def post_processor_after_instantiation(self):\r
+            EventMesh.subscribe("set_led_time_arg", self.set_led_time_arg)#设置参数\r
+            EventMesh.subscribe("get_led_state", self.get_led_state)#设置参数\r
+\r
+            EventMesh.subscribe("set_hr_blood_led", self.set_hr_blood_led)#设置参数\r
+\r
+            EventMesh.subscribe("set_find_watch_led", self.set_find_watch_led)#设置参数\r
+\r
+            EventMesh.subscribe("close_all_led", self.close_all_led)#设置参数\r
+\r
+            EventMesh.subscribe("stop_led_timer", self.stop_led_timer)#设置参数\r
+\r
+            EventMesh.subscribe("read_red_led_level", self.read_red_led_level)#读取红灯的电平状态\r
+\r
+            EventMesh.subscribe("read_green_led_level", self.read_green_led_level)#读取绿灯的电平状态\r
+\r
+            EventMesh.subscribe("read_white_led_level", self.read_white_led_level)#读取白灯的电平状态\r
+\r
+            EventMesh.subscribe("close_led_pin", self.close_led_pin)#读取白灯的电平状态def close_led_pin(self, event, msg):\r
+\r
+\r
+        def ledInfo_queue_thread(self):\r
+            while True:\r
+                data = self.ledInfo_queue.get()\r
+                #EventMesh.debug_log("ledInfo_queue:data = {}".format(data))\r
+                if data != None:\r
+                    try:\r
+                        data["func"](data["data"])\r
+                    except Exception as e:\r
+                        EventMesh.debug_log("ledInfo_queue:ERROR:{}".format(e))\r
+                        usys.print_exception(e)\r
+        def publish_message_event_ledInfo(self,event,msg):\r
+            self.ledInfo_queue.put(msg)\r
+\r
+        def publish_led_event_cb(self, *args, **kwargs):\r
+            EventMesh.publish("publish_message_event_ledInfo",{"func":self.led_fun_cb,"data":0})  \r
+\r
+        def read_red_led_level(self, event, msg): #\r
+            red_level = led_red.read()\r
+            return red_level\r
+\r
+        def read_green_led_level(self, event, msg): #\r
+            green_level = led_green.read()\r
+            return green_level\r
+        \r
+        def read_white_led_level(self, event, msg): #\r
+            white_level = led_green.read()\r
+            return white_level\r
+\r
+        def set_hr_blood_led(self, event, msg): #\r
+            EventMesh.debug_log("set_hr_blood_led :{}".format(msg))\r
+            if msg != None:\r
+                if msg == 1:\r
+                    EventMesh.publish("set_led_time_arg",[1,2,10*70*2,led_mode.FLASH_LIGHT_RED_GREEN,10,5,led_mode.HEALTH_LED_MODE])#測量成功\r
+                    # 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])#開始測量\r
+                elif msg == 2:\r
+                    EventMesh.publish("set_led_time_arg",[1,2,60,led_mode.FLASH_LIGHT_GREEN,60,30,led_mode.OTHER_MEASURE_MODE])#測量成功\r
+                    # EventMesh.publish("set_led_time_arg",[3000,1000,1,led_mode.LONG_LIGHT_GREEN,led_mode.DEFAULT_LONG_LIGHT_MODE,led_mode.OTHER_MEASURE_MODE])#測量成功\r
+                elif msg == 3:#测量失败\r
+                    EventMesh.publish("stop_led_timer")\r
+                    # EventMesh.publish("set_led_time_arg",[1,1,1,led_mode.FLASH_LIGHT_RED,31,10*3,led_mode.OTHER_MEASURE_MODE])#測量成功\r
+                    pass\r
+                    # EventMesh.publish("set_led_time_arg",[1,1,30,led_mode.FLASH_LIGHT_RED,31,10*3,led_mode.OTHER_MEASURE_MODE])#测量失败\r
+                    #加音频文件\r
+\r
+        def set_find_watch_led(self, event, msg): #查找设备\r
+            EventMesh.publish("OPEN_FIND_WATCH")#\r
+        \r
+            # EventMesh.publish("set_led_time_arg",[37000,1000,1,led_mode.LONG_LIGHT_GREEN,led_mode.DEFAULT_LONG_LIGHT_MODE,led_mode.OTHER_MEASURE_MODE])#查找设备绿灯长亮37s\r
+\r
+        def get_led_state(self, event, msg): #\r
+            return self.timer_state\r
+        def open_timer(self,msg): #msg 0 使能 1总的时间 2 灯模式 3 开启时间 4 关闭时间 \r
+            if msg != None:\r
+                if len(msg) != 0:\r
+                    self.led_total_time = msg[2]#\r
+                    # EventMesh.debug_log("open_timer:{}".format(msg))\r
+                    if self.led_total_time != None:\r
+\r
+                        if self.led_total_time > 0:\r
+                            self.led_enable=msg[0]\r
+                            if self.led_enable != 0:\r
+                                self.led_mode = msg[1]\r
+                                self.long_light_mode = msg[3]\r
+                                self.led_open_time = msg[4]\r
+                                self.led_close_time = msg[5]\r
+                                self.working_led_mode = msg[6]\r
+                                self.long_count = 0\r
+\r
+                                if self.timer_state == 0:\r
+                                    self.timer_state = 1\r
+                                    self.timer.stop()\r
+                                    # self.timer.start(LED_TIMER_OUT,1,self.led_fun_cb)\r
+                                    self.timer.start(LED_TIMER_OUT,1,self.publish_led_event_cb)\r
+                    \r
+            \r
+\r
+\r
+        def set_led_time_arg(self, event, msg): #msg \r
+            \r
+            open_power = EventMesh.publish("get_power_on_state")#获取开机标识\r
+            power_off = EventMesh.publish("get_power_off_state")#获取开机标识\r
+            # EventMesh.debug_log("set_led_time_arg",msg,open_power,power_off)\r
+            if open_power != None:\r
+                if open_power == 0:\r
+                    return\r
+            if power_off != None:\r
+                if power_off == 1:\r
+                    return\r
+            usb_in = EventMesh.publish("get_usb")#\r
+\r
+            if msg != None:\r
+                if msg[6] != led_mode.POWER_OFF_MODE:#插入usb关机以防不亮红绿灯\r
+                    # EventMesh.debug_log("usb_in",usb_in)\r
+                    if usb_in != None:\r
+                        if usb_in == 1 or usb_in == 3:#正在充电或者充电已满都不要被打断\r
+                            if self.timer_state == 1:\r
+                                self.timer_state = 0\r
+                                self.timer.stop()\r
+                            if usb_in == 1:\r
+                                if self.working_led_mode != led_mode.CHARGE_IN_MODE:\r
+                                    str_buf = [1,1,10,led_mode.LONG_LIGHT_RED,4,2,led_mode.CHARGE_IN_MODE]\r
+                                    self.open_timer(str_buf)\r
+                                self.working_led_mode = led_mode.CHARGE_IN_MODE\r
+\r
+                            elif usb_in == 3:\r
+                                if self.working_led_mode != led_mode.CHARGE_FULL_MODE:\r
+                                    str_buf = [1,1,10,led_mode.LONG_LIGHT_GREEN,4,2,led_mode.CHARGE_FULL_MODE]\r
+                                    self.open_timer(str_buf)\r
+                                self.working_led_mode = led_mode.CHARGE_FULL_MODE\r
+                            \r
+                            return\r
+                        else:\r
+                            if msg[5] != led_mode.HEALTH_LED_MODE:\r
+                                self.working_led_mode = led_mode.OTHER_MEASURE_MODE\r
+\r
+                            get_hr_state = EventMesh.publish("get_hr_state")\r
+                            get_spo2_state = EventMesh.publish("get_spo2_state")\r
+                            \r
+                            wechat_state = EventMesh.publish("get_wechat_state")\r
+                            temp_state = EventMesh.publish("get_temp_state")\r
+                            bp_state = EventMesh.publish("get_bp_state")\r
+                            bg_state = EventMesh.publish("get_bg_state")\r
+                            EventMesh.debug_log("get_hr_state",get_hr_state,get_spo2_state,temp_state,wechat_state,self.working_led_mode)\r
+                            if wechat_state != None: #获取微聊状态\r
+                                if wechat_state == 1:\r
+                                    if self.working_led_mode != led_mode.WECHAT_LED_MODE:#如果不在亮微聊模式需要亮微聊模式\r
+                                        self.timer_state = 0\r
+                                        self.timer.stop()\r
+                                        str_buf = [1,1,1,led_mode.LONG_LIGHT_GREEN,4,2,led_mode.WECHAT_LED_MODE]\r
+                                        self.open_timer(str_buf)\r
+                                        self.working_led_mode = led_mode.WECHAT_LED_MODE\r
+                                        return\r
+                                    else:\r
+                                        return\r
+                                else:\r
+                                    self.wechat_btn = 0\r
+                                    # if get_hr_state != 0 or get_spo2_state != 0 or temp_state != 0 or bp_state != 0 or bg_state != 0 :#心率血氧优先级高\r
+                                    if get_hr_state == 1 or get_spo2_state == 1 or temp_state == 1 \\r
+                                    or bp_state == 1  or bg_state == 1:\r
+                                        if self.working_led_mode != led_mode.HEALTH_LED_MODE:#如果不在亮微聊模式需要亮微聊模式\r
+                                            EventMesh.debug_log("set_hr_blood_led!!!!!!!!!!")\r
+                                            str_buf = [1,2,10*70*2,led_mode.FLASH_LIGHT_RED_GREEN,10,5,led_mode.HEALTH_LED_MODE]#測量成功\r
+                                            self.timer_state = 0\r
+                                            self.timer.stop()\r
+                                            self.open_timer(str_buf)\r
+                                            self.working_led_mode = led_mode.HEALTH_LED_MODE\r
+                                            return\r
+                                        else:\r
+                                            EventMesh.debug_log("set_hr_blood_led stop!!!!!!!!!!")\r
+                                            return\r
+                                    else:# 0 2都认为其他模式灯亮 不是测试健康灯\r
+                                        self.working_led_mode = led_mode.OTHER_MEASURE_MODE\r
+\r
+            if EventMesh.publish("get_video_state") != 0:\r
+                if msg[6] != led_mode.VIDEO_MEASURE_MODE:\r
+                    return\r
+            self.open_timer(msg)\r
+\r
+\r
+    \r
+        # EventMesh.publish("set_led_time_arg",[1,2,2*300,led_mode.FLASH_LIGHT_RED_GREEN,2,1,led_mode.HEALTH_LED_MODE])#測量成功\r
+        def led_fun_cb(self, data):#\r
+            if self.led_enable == 0 or self.led_total_time == 0:\r
+                return\r
+            call_state = EventMesh.publish("get_call_state")\r
+            if call_state == None:\r
+                call_state = 0\r
+            if call_state != 0:\r
+                battery = EventMesh.publish("screen_get_battery")\r
+                if battery != None:\r
+                    if battery[0] != "1":#在充电得时候\r
+                        get_hr_state = EventMesh.publish("get_hr_state")\r
+                        get_spo2_state = EventMesh.publish("get_spo2_state")\r
+                        get_temp_state = EventMesh.publish("get_temp_state")\r
+                        get_bp_state = EventMesh.publish("get_bp_state")\r
+                        get_bg_state = EventMesh.publish("get_bg_state")\r
+                        if get_hr_state != None and  get_spo2_state != None and get_temp_state != None and get_bp_state != None and get_bg_state != None:\r
+                            if get_hr_state == 1 or get_spo2_state == 1 or get_temp_state == 1 or get_bp_state == 1 or get_bg_state == 1:\r
+                                    EventMesh.publish("close_hr_sop2")\r
+                                    EventMesh.publish("close_led_pin")\r
+                                    return\r
+            # EventMesh.debug_log("self.long_count",self.long_count)\r
+            if self.led_total_time != 0:\r
+                #红灯闪烁\r
+                if self.long_light_mode == led_mode.FLASH_LIGHT_RED :#\r
+                    if self.led_mode == 1:\r
+                        if self.led_total_time > 0:\r
+                            self.led_total_time-=1\r
+                            if self.led_total_time > 0:\r
+                                close_led_green()\r
+                                close_led_white()\r
+                                open_led_red()\r
+                            else:\r
+                                EventMesh.publish("stop_led_timer")#关闭所有的灯\r
+                    elif self.led_mode == 2:\r
+                        # EventMesh.debug_log("led red!!!!!!!")\r
+                        \r
+                        if self.long_count % (self.led_open_time) <=  self.led_close_time: # 4*cnt cnt 多少次 4 开启时间保护关闭时间 2 关闭时间 100ms 4-2关闭时间为200ms 开启时间也为200ms \r
+                            close_led_green()\r
+                            close_led_white()\r
+                            open_led_red()\r
+                        else:\r
+                            close_led_green()\r
+                            close_led_white()\r
+                            close_led_red()\r
+                        if self.long_count >= self.led_total_time-1:#大于总的时间 4\r
+                            EventMesh.publish("stop_led_timer")#设置参数\r
+                            return\r
+                        self.long_count+=1\r
+                #绿灯闪烁\r
+                elif self.long_light_mode == led_mode.FLASH_LIGHT_GREEN:#\r
+                    if self.led_mode == 1:#长亮时间限制\r
+                        \r
+                        if self.led_total_time > 0:\r
+                            self.led_total_time-=1\r
+                            if self.led_total_time > 0:\r
+                                close_led_red()\r
+                                close_led_white()\r
+                                open_led_green()\r
+                            else:\r
+                                EventMesh.publish("stop_led_timer")#关闭所有的灯\r
+                            \r
+\r
+                    elif self.led_mode == 2:\r
+                        \r
+                        if self.long_count % (self.led_open_time) <=  self.led_close_time: # 4*cnt cnt 多少次 4 开启时间保护关闭时间 2 关闭时间 100ms 4-2关闭时间为200ms 开启时间也为200ms \r
+                            close_led_red()\r
+                            close_led_white()\r
+                            open_led_green()\r
+                            pass\r
+                        else:\r
+                            close_led_green()\r
+                            close_led_white()\r
+                            close_led_red()\r
+                            pass\r
+                        \r
+                        if self.long_count >= self.led_total_time-1:#大于总的时间 4\r
+                            EventMesh.publish("stop_led_timer")#设置参数\r
+                            return\r
+                        self.long_count+=1\r
+                #蓝灯闪烁 暂时是白色灯\r
+                elif self.long_light_mode == led_mode.FLASH_LIGHT_WHITE:#\r
+                    if self.led_mode == 1:#长亮时间限制\r
+                        if self.led_total_time > 0:\r
+                            self.led_total_time-=1\r
+                            if self.led_total_time > 0:\r
+                                close_led_red()\r
+                                close_led_green()\r
+                                open_led_white()\r
+                            else:\r
+                                EventMesh.publish("stop_led_timer")#关闭所有的灯\r
+                    elif self.led_mode == 2:\r
+                        if self.long_count % (self.led_open_time) <=  self.led_close_time: # 4*cnt cnt 多少次 4 开启时间保护关闭时间 2 关闭时间 100ms 4-2关闭时间为200ms 开启时间也为200ms \r
+                            close_led_red()\r
+                            close_led_green()\r
+                            open_led_white()\r
+                            pass\r
+                        else:\r
+                            close_led_green()\r
+                            close_led_white()\r
+                            close_led_red()\r
+                            pass\r
+                        if self.long_count >= self.led_total_time-1:#大于总的时间 4\r
+                            EventMesh.publish("stop_led_timer")#设置参数\r
+                            return\r
+                        self.long_count+=1\r
+                #红绿灯闪烁\r
+                elif self.long_light_mode == led_mode.FLASH_LIGHT_RED_GREEN:#\r
+                    \r
+                    \r
+                    if self.long_count % (self.led_open_time) <=  self.led_close_time: # 4*cnt cnt 多少次 4 开启时间保护关闭时间 2 关闭时间 100ms 4-2关闭时间为200ms 开启时间也为200ms \r
+                        close_led_white()#白色灯\r
+                        close_led_green()\r
+                        open_led_red()\r
+                        pass\r
+                    else: \r
+                        close_led_white()\r
+                        close_led_red()\r
+                        open_led_green()\r
+                        pass\r
+                    if self.long_count >= self.led_total_time-1:#大于总的时间 4\r
+                        EventMesh.publish("stop_led_timer")#设置参数\r
+                        return\r
+                    self.long_count+=1\r
+                #红蓝灯闪烁 蓝变成白色灯\r
+                elif self.long_light_mode == led_mode.FLASH_LIGHT_RED_WHITE:#\r
+                    if self.long_count % (self.led_open_time) <=  self.led_close_time: # 4*cnt cnt 多少次 4 开启时间保护关闭时间 2 关闭时间 100ms 4-2关闭时间为200ms 开启时间也为200ms \r
+                        close_led_white()#白色灯\r
+                        close_led_green()\r
+                        open_led_red()\r
+                        pass\r
+                    else:\r
+                        close_led_green()\r
+                        close_led_red()\r
+                        open_led_white()\r
+                        pass\r
+                    if self.long_count >= self.led_total_time-1:#大于总的时间 4\r
+                        EventMesh.publish("stop_led_timer")#设置参数\r
+                        return\r
+                    self.long_count+=1\r
+                #蓝绿灯闪烁\r
+                elif self.long_light_mode == led_mode.FLASH_LIGHT_GREEN_WHITE:#\r
+\r
+                    \r
+                    if self.long_count % (self.led_open_time) <=  self.led_close_time: # 4*cnt cnt 多少次 4 开启时间保护关闭时间 2 关闭时间 100ms 4-2关闭时间为200ms 开启时间也为200ms \r
+                        close_led_white()#白色灯\r
+                        close_led_red()\r
+                        open_led_green()\r
+                        pass\r
+                    else:\r
+                        close_led_green()\r
+                        close_led_red()\r
+                        open_led_white()\r
+                        pass\r
+                    if self.long_count >= self.led_total_time-1:#大于总的时间 4\r
+                        EventMesh.publish("stop_led_timer")#设置参数\r
+                        return\r
+                    self.long_count+=1\r
+                #红灯长亮\r
+                elif self.long_light_mode == led_mode.LONG_LIGHT_RED:#\r
+                    close_led_white()#白色灯\r
+                    close_led_green()\r
+                    open_led_red()\r
+                    self.timer.stop()\r
+                    self.timer_state = 0\r
+                    self.led_total_time = 0\r
+                    self.led_enable = 0\r
+                    self.led_mode = 0\r
+                    self.long_light_mode = 0\r
+                    self.led_open_time = 0\r
+                    self.led_close_time = 0\r
+                    self.working_led_mode = 0\r
+                    self.long_count = 0\r
+\r
+                #绿灯长亮\r
+                elif self.long_light_mode == led_mode.LONG_LIGHT_GREEN:#\r
+                    close_led_white()#白色灯\r
+                    close_led_red()\r
+                    open_led_green()\r
+                    self.timer.stop()\r
+                    self.timer_state = 0\r
+                    self.led_total_time = 0\r
+                    self.led_enable = 0\r
+                    self.led_mode = 0\r
+                    self.long_light_mode = 0\r
+                    self.led_open_time = 0\r
+                    self.led_close_time = 0\r
+                    self.working_led_mode = 0\r
+                    self.long_count = 0\r
+                #蓝灯长亮\r
+                elif self.long_light_mode == led_mode.LONG_LIGHT_WHITE:#\r
+                    close_led_green()#白色灯\r
+                    close_led_red()\r
+                    open_led_white()\r
+                    self.timer.stop()\r
+                    self.timer_state = 0\r
+                    self.led_total_time = 0\r
+                    self.led_enable = 0\r
+                    self.led_mode = 0\r
+                    self.long_light_mode = 0\r
+                    self.led_open_time = 0\r
+                    self.led_close_time = 0\r
+                    self.working_led_mode = 0\r
+                    self.long_count = 0\r
+        \r
+        def close_led_pin(self, event, msg):\r
+            EventMesh.debug_log("close_led_pin!!!")\r
+\r
+            self.timer.stop()\r
+            self.timer_state = 0\r
+            self.led_total_time = 0\r
+            self.led_enable = 0\r
+            self.led_mode = 0\r
+            self.long_light_mode = 0\r
+            self.led_open_time = 0\r
+            self.led_close_time = 0\r
+            self.working_led_mode = 0\r
+            self.long_count = 0\r
+            close_led_red()\r
+            close_led_green()\r
+            close_led_white()\r
+\r
+        def stop_led_timer(self, event, msg):\r
+            EventMesh.publish("close_all_led")#关闭所有的灯\r
+        \r
+        def close_all_led(self, event, msg):\r
+            self.close_all_led_do(0)\r
+        def close_all_led_do(self,data):   \r
+            open_power = EventMesh.publish("get_power_on_state")#获取开机标识\r
+            if open_power != None:\r
+                if open_power == 0:\r
+                    return\r
+            usb_in = EventMesh.publish("get_usb")#\r
+            open_power_off = EventMesh.publish("get_power_off_state")#获取开机标识\r
+            if open_power_off != None:\r
+                if open_power_off != 1:\r
+                    if usb_in != None:\r
+                        if usb_in == 1 or usb_in == 3:#正在充电或者充电已满都不要被打断\r
+                            if self.timer_state == 1:\r
+                                self.timer_state = 0\r
+                                self.timer.stop()\r
+                            return\r
+                        else:\r
+                            get_hr_state = EventMesh.publish("get_hr_state")\r
+                            get_spo2_state = EventMesh.publish("get_spo2_state")\r
+                            \r
+                            wechat_state = EventMesh.publish("get_wechat_state")\r
+                            temp_state = EventMesh.publish("get_temp_state")\r
+                            bp_state = EventMesh.publish("get_bp_state")\r
+                            bg_state = EventMesh.publish("get_bg_state")\r
+                            # EventMesh.debug_log("get_hr_state",get_hr_state,get_spo2_state,wechat_state,self.working_led_mode)\r
+                            if wechat_state != None: #获取微聊状态\r
+                                if wechat_state == 1 or get_spo2_state == 1  or get_hr_state == 1  or temp_state == 1 or bp_state == 1 \\r
+                                    or bg_state == 1 :\r
+                                    return\r
+            if self.timer_state == 1:\r
+                self.timer.stop()\r
+            self.timer_state = 0\r
+            self.led_total_time = 0\r
+            self.led_enable = 0\r
+            self.led_mode = 0\r
+            self.long_light_mode = 0\r
+            self.led_open_time = 0\r
+            self.led_close_time = 0\r
+            self.working_led_mode = 0\r
+            self.long_count = 0\r
+            close_led_red()\r
+            close_led_green()\r
+            close_led_white()\r
+            # EventMesh.debug_log("close led!!!")\r
+\r
+        def led_test_fun_cb(self, data):\r
+            return\r
+    \r
index c14a3dc..16dbe9c 100644 (file)
-import sms
-
-class App(object):
-    def __init__(self):
-        self.managers = []
-
-    def append_manager(self, manager):
-        if isinstance(manager, Abstract):
-            manager.post_processor_after_instantiation()
-            self.managers.append(manager)
-        return self
-
-    def start(self):
-        for manager in self.managers:
-            manager.post_processor_before_initialization()
-            manager.initialization()
-            manager.post_processor_after_initialization()
-
-
-class watchApp(App):
-    def __init__(self):
-        super(watchApp, self).__init__()
-        self.__ui = None
-
-    def set_ui(self, ui):
-        self.__ui = ui
-
-    def start(self):
-        if self.__ui is not None:
-            self.__ui.start()
-        super().start()
-
-
-
-if __name__ == '__main__':
-    import uos
-    import ql_fs
-    import utime
-    if ql_fs.path_exists("/ext") == False:
-        ldev = uos.VfsLfs1(32, 32, 32, "ext_fs",0,3)
-        uos.mount(ldev,'/ext')
-    res = uos.statvfs("/ext")
-    res = list(res)
-    print('总ext空间:{} MB,剩余空间:{} MB'.format((((res[0] * res[2]) / 1024 / 1024)),((res[0] * res[3]) / 1024 / 1024)))
-    print("init1:{}".format(utime.localtime()))
-    import EventMesh
-    from common import Abstract
-    print("init2:{}".format(utime.localtime()))
-    from lcd import tp_cst816
-    print("init3:{}".format(utime.localtime()))
-
-    from usr.ui_main_menu import MainMenuScreen
-    # from ui_WatchFaceScreen import WatchFaceScreen
-    
-    from appFactoryMode import  FactoryModeLocationScreen,FactoryModeScreen ,FactoryModeAlipayInitScreen
-    import ui as _ui
-    # import ui as _ui
-    print("init4:{}".format(utime.localtime()))
-    ui = _ui.UI()
-    ui.post_processor_after_instantiation()
-    ui.add_screen(MainMenuScreen()) 
-    EventMesh.publish("load_screen", {"screen": "main_menu"})
-    print("init5:{}".format(utime.localtime()))
-    
-    ui.add_screen(_ui.PopupScreen()) 
-    ui.add_screen(_ui.PhoneScreen()) 
-    ui.add_screen(_ui.HeartrateScreen()) 
-    import ui_setting as _ui_setting
-    ui.add_screen(_ui_setting.SettingScreen()) 
-    ui.add_screen(_ui.ToolboxScreen()) 
-    ui.add_screen(_ui.StepScreen()) 
-    ui.add_screen(_ui.CountdownScreen()) 
-    ui.add_screen(_ui.StopwatchScreen()) 
-    ui.add_screen(_ui.WeatherScreen()) 
-    ui.add_screen(_ui.Spo2Screen()) 
-    ui.add_screen(_ui.TemperatureScreen()) 
-    ui.add_screen(_ui.ContactsScreen()) 
-    from appWechat import WechatScreen,TK_ProtoCol,MESSAGE_ProtoCol,NewWechatPopupScreen
-    ui.add_screen(WechatScreen()) 
-    from alarm import ClkListScreen,NewEditClk,CLKTimeScreen,ClkPeriod,PopupAlarmScreen
-  
-    ui.add_screen(ClkListScreen()) 
-    ui.add_screen(_ui.CountdownEndScreen()) 
-    ui.add_screen(NewEditClk()) 
-    ui.add_screen(CLKTimeScreen()) 
-    ui.add_screen(ClkPeriod()) 
-  
-    # ui.add_screen(_ui_setting.LanguageScreen()) 
-    ui.add_screen(_ui_setting.DialswitchScreen()) 
-    # ui.add_screen(_ui.ThemeswitchScreen()) 
-    ui.add_screen(_ui_setting.ImeiScreen()) 
-    ui.add_screen(_ui_setting.AppScreen()) 
-    ui.add_screen(_ui_setting.BrightnessScreen()) 
-    ui.add_screen(_ui_setting.VolumeScreen()) 
-    ui.add_screen(_ui_setting.RestoreScreen()) 
-    ui.add_screen(_ui_setting.PoweroffScreen()) 
-    ui.add_screen(_ui_setting.VersionScreen()) 
-    ui.add_screen(_ui_setting.UpdateScreen()) 
-    ui.add_screen(_ui_setting.AlarmvolumeScreen()) 
-    ui.add_screen(_ui_setting.MsgvolumeScreen()) 
-    ui.add_screen(_ui_setting.PhoneringScreen()) 
-    ui.add_screen(_ui_setting.totalvolumeScreen()) 
-    ui.add_screen(_ui_setting.PoweroffConfirmScreen()) 
-    ui.add_screen(_ui.DialingScreen()) 
-    ui.add_screen(_ui.CallLogScreen()) 
-    from appAlipay import Alipay ,AlipayOpenScreen,Alipay_1_1,Alipay_invite,Alipay_inviting,\
-    Alipay_success,Alipay_paycode,Alipay_pay_success,Alipay_collect,Alipay_parent
-    ui.add_screen(AlipayOpenScreen()) 
-    ui.add_screen(Alipay_1_1())
-    ui.add_screen(Alipay_invite())  
-    ui.add_screen(Alipay_inviting()) 
-    ui.add_screen(Alipay_success()) 
-    ui.add_screen(Alipay_paycode()) 
-    ui.add_screen(Alipay_pay_success()) 
-    ui.add_screen(Alipay_collect()) 
-    ui.add_screen(Alipay_parent()) 
-    ui.add_screen(_ui.UIFINDScreen())
-    ui.add_screen(_ui.MsgDetailScreen())
-    ui.add_screen(_ui.IncomingCallScreen())
-    ui.add_screen(_ui.OnCallScreen())
-    ui.add_screen(_ui.MessageFullScreen())
-    # ui.add_screen(_ui.PowerOnScreen())
-    ui.add_screen(FactoryModeLocationScreen())
-    ui.add_screen(FactoryModeScreen())
-    ui.add_screen(FactoryModeAlipayInitScreen())
-    ui.add_screen(PopupAlarmScreen())
-    ui.add_screen(_ui.LowPowerScreen())
-    ui.add_screen(_ui.NewMessageScreen())
-    ui.add_screen(NewWechatPopupScreen())
-    ui.add_screen(HealthScreen())
-    # ui.add_screen(_ui.Setting3Screen())  
-    print("init6:{}".format(utime.localtime()))
-    
-
-    from protocol import LK_ProtoCol,PING_ProtoCol,HEART_ProtoCol,OXYGEN_ProtoCol,OXYGEN_One_ProtoCol,HRSTART_ProtoCol,CENTER_ProtoCol,UPLOAD_ProtoCol,\
-        TEMP_ProtoCol,DLT_ProtoCol,WT_ProtoCol,UD_ProtoCol,REMIND_ProtoCol, CR_ProtoCol,KA_ProtoCol,FIND_ProtoCol,POWEROFF_ProtoCol,\
-            ProtoColResolver,PHL_ProtoCol,MONITOR_ProtoCol,bootoff_ProtoCol,WDSTART_ProtoCol,LOWBAT_ProtoCol,sosHome_dial_ProtoCol,SockManager,NetManager
-    import mgr as mgr
-    print("init7:{}".format(utime.localtime()))
-    
-    from mgr import ConfigStoreManager,getBootOffManager,getSosFlagManager,CountdownManager, LocationManager, getVolumSizeManager,gethistoryDataManager,getUpLoadDataManager, getplayAudiodStateManager,\
-    AddrBookManager,MsgdetailManager,PhoneCallingManager,getOldTimeManager,getStorageDataManager,getBrightnessManager,getHrTimeManager,getTempTimeManager,getLowBatManager
-    print("init8:{}".format(utime.localtime()))
-    
-    
-    #from ui_WatchFaceScreen import WatchFaceScreen 
-    
-    
-    # from usr.test_sms import HRSTART_ProtoCol,getHrTimeManager,HEART_ProtoCol,OXYGEN_ProtoCol,OXYGEN_One_ProtoCol,getBrightnessManager,\
-    # getStorageDataManager
-    print("init9:{}".format(utime.localtime()))
-   #from usr.ui_wechat import WechatScreen,TK_ProtoCol
-
-    print("init10:{}".format(utime.localtime()))
-    
-
-    app = watchApp()
-    app.set_ui(ui)
-    app.append_manager(mgr.AlarmVolumeLevelManager()) \
-        .append_manager(mgr.MsgVolumeLevelManager()) \
-        .append_manager(mgr.PhoneVolumeLevelManager()) \
-        .append_manager(mgr.DeviceInfoManager()) \
-        .append_manager(mgr.BatteryManager()) \
-           
-        # .append_manager(mgr.StopwatchManager()) \
-        # .append_manager(mgr.CountdownManager()) \
-
-   
-    app.append_manager(ConfigStoreManager())
-    app.append_manager(NetManager())
-    app.append_manager(LocationManager())
-    app.append_manager(AddrBookManager())
-    app.append_manager(mgr.MsgManager())
-    app.append_manager(MsgdetailManager())
-    app.append_manager(mgr.CallLogManager())
-    app.append_manager(mgr.getWeatherDataManager())
-    app.append_manager(PhoneCallingManager())
-    app.append_manager(ClockManager())
-    app.append_manager(gethistoryDataManager())
-    app.append_manager(getHrTimeManager())
-    app.append_manager(getBrightnessManager())
-    app.append_manager(getStorageDataManager())
-    app.append_manager(getUpLoadDataManager())
-    app.append_manager(getVolumSizeManager())
-    app.append_manager(getTempTimeManager())
-    app.append_manager(getplayAudiodStateManager())
-    app.append_manager(getLowBatManager())
-    app.append_manager(getBootOffManager())
-    app.append_manager(getOldTimeManager())
-    app.append_manager(getSosFlagManager())
-    app.append_manager(CountdownManager())
-
-    print("init21:{}".format(utime.localtime()))    
-    
-    print("init11:{}".format(utime.localtime()))    
-    pcr = ProtoColResolver()
-    pcr.add_support(LK_ProtoCol())
-    pcr.add_support(PING_ProtoCol())
-    pcr.add_support(KA_ProtoCol())
-    pcr.add_support(UD_ProtoCol())
-    pcr.add_support(CR_ProtoCol())
-    pcr.add_support(FIND_ProtoCol())
-    pcr.add_support(POWEROFF_ProtoCol())
-    pcr.add_support(PHL_ProtoCol())
-    pcr.add_support(TK_ProtoCol())
-    pcr.add_support(MESSAGE_ProtoCol())
-    pcr.add_support(WT_ProtoCol())
-    pcr.add_support(REMIND_ProtoCol())
-    pcr.add_support(HRSTART_ProtoCol())
-    pcr.add_support(HEART_ProtoCol())
-    pcr.add_support(OXYGEN_ProtoCol())
-    pcr.add_support(OXYGEN_One_ProtoCol())
-    pcr.add_support(TEMP_ProtoCol())
-    pcr.add_support(DLT_ProtoCol())
-    pcr.add_support(UPLOAD_ProtoCol())
-    pcr.add_support(MONITOR_ProtoCol())
-    # pcr.add_support(CENTER_ProtoCol())
-    pcr.add_support(CENTER_ProtoCol())
-    pcr.add_support(bootoff_ProtoCol())
-    pcr.add_support(WDSTART_ProtoCol())
-    pcr.add_support(LOWBAT_ProtoCol())
-    pcr.add_support(sosHome_dial_ProtoCol())
-
-    sm = SockManager()
-    sm.add_support_resolver(pcr)
-    app.append_manager(sm)
-    print("init11.0:{}".format(utime.localtime()))   
-    app.start()
-    sms_data = sms.getSaveLoc()
-    sms_lacv = sms_data[0][0]
-    if sms_lacv != 'SM':#每次开机设置一下短信的存储位置
-        sms.setSaveLoc('SM', 'SM', 'SM')
-    print("init12:{}".format(utime.localtime()))
-    import atcmd
-    resp=bytearray(50)
-    atcmd.sendSync('AT+log=52,1\r\n',resp,'',20)
-    print("AT+log=52,1:{}".format(resp))
-
-
+import sms\r
+\r
+class App(object):\r
+    def __init__(self):\r
+        self.managers = []\r
+\r
+    def append_manager(self, manager):\r
+        if isinstance(manager, Abstract):\r
+            manager.post_processor_after_instantiation()\r
+            self.managers.append(manager)\r
+        return self\r
+\r
+    def start(self):\r
+        for manager in self.managers:\r
+            manager.post_processor_before_initialization()\r
+            manager.initialization()\r
+            manager.post_processor_after_initialization()\r
+\r
+\r
+class watchApp(App):\r
+    def __init__(self):\r
+        super(watchApp, self).__init__()\r
+        self.__ui = None\r
+\r
+    def set_ui(self, ui):\r
+        self.__ui = ui\r
+\r
+    def start(self):\r
+        if self.__ui is not None:\r
+            self.__ui.start()\r
+        super().start()\r
+\r
+\r
+\r
+if __name__ == '__main__':\r
+    import uos\r
+    import ql_fs\r
+    import utime\r
+    if ql_fs.path_exists("/ext") == False:\r
+        ldev = uos.VfsLfs1(32, 32, 32, "ext_fs",0,3)\r
+        uos.mount(ldev,'/ext')\r
+    res = uos.statvfs("/ext")\r
+    res = list(res)\r
+    print('总ext空间:{} MB,剩余空间:{} MB'.format((((res[0] * res[2]) / 1024 / 1024)),((res[0] * res[3]) / 1024 / 1024)))\r
+    print("init1:{}".format(utime.localtime()))\r
+    import EventMesh\r
+    from common import Abstract\r
+    print("init2:{}".format(utime.localtime()))\r
+    from lcd import tp_cst816\r
+    print("init3:{}".format(utime.localtime()))\r
+\r
+    from usr.ui_main_menu import MainMenuScreen\r
+    # from ui_WatchFaceScreen import WatchFaceScreen\r
+    \r
+    from appFactoryMode import  FactoryModeLocationScreen,FactoryModeScreen ,FactoryModeAlipayInitScreen\r
+    import ui as _ui\r
+    # import ui as _ui\r
+    print("init4:{}".format(utime.localtime()))\r
+    ui = _ui.UI()\r
+    ui.post_processor_after_instantiation()\r
+    ui.add_screen(MainMenuScreen()) \r
+    EventMesh.publish("load_screen", {"screen": "main_menu"})\r
+    print("init5:{}".format(utime.localtime()))\r
+    \r
+    ui.add_screen(_ui.PopupScreen()) \r
+    ui.add_screen(_ui.PhoneScreen()) \r
+    ui.add_screen(_ui.HeartrateScreen()) \r
+    import ui_setting as _ui_setting\r
+    ui.add_screen(_ui_setting.SettingScreen()) \r
+    ui.add_screen(_ui.ToolboxScreen()) \r
+    ui.add_screen(_ui.StepScreen()) \r
+    ui.add_screen(_ui.CountdownScreen()) \r
+    ui.add_screen(_ui.StopwatchScreen()) \r
+    ui.add_screen(_ui.WeatherScreen()) \r
+    ui.add_screen(_ui.Spo2Screen()) \r
+    ui.add_screen(_ui.TemperatureScreen()) \r
+    ui.add_screen(_ui.ContactsScreen()) \r
+    from appWechat import WechatScreen,TK_ProtoCol,MESSAGE_ProtoCol,NewWechatPopupScreen\r
+    ui.add_screen(WechatScreen()) \r
+    from alarm import ClkListScreen,NewEditClk,CLKTimeScreen,ClkPeriod,PopupAlarmScreen\r
+  \r
+    ui.add_screen(ClkListScreen()) \r
+    ui.add_screen(_ui.CountdownEndScreen()) \r
+    ui.add_screen(NewEditClk()) \r
+    ui.add_screen(CLKTimeScreen()) \r
+    ui.add_screen(ClkPeriod()) \r
+  \r
+    # ui.add_screen(_ui_setting.LanguageScreen()) \r
+    ui.add_screen(_ui_setting.DialswitchScreen()) \r
+    # ui.add_screen(_ui.ThemeswitchScreen()) \r
+    ui.add_screen(_ui_setting.ImeiScreen()) \r
+    ui.add_screen(_ui_setting.AppScreen()) \r
+    ui.add_screen(_ui_setting.BrightnessScreen()) \r
+    ui.add_screen(_ui_setting.VolumeScreen()) \r
+    ui.add_screen(_ui_setting.RestoreScreen()) \r
+    ui.add_screen(_ui_setting.PoweroffScreen()) \r
+    ui.add_screen(_ui_setting.VersionScreen()) \r
+    ui.add_screen(_ui_setting.UpdateScreen()) \r
+    ui.add_screen(_ui_setting.AlarmvolumeScreen()) \r
+    ui.add_screen(_ui_setting.MsgvolumeScreen()) \r
+    ui.add_screen(_ui_setting.PhoneringScreen()) \r
+    ui.add_screen(_ui_setting.totalvolumeScreen()) \r
+    ui.add_screen(_ui_setting.PoweroffConfirmScreen()) \r
+    ui.add_screen(_ui.DialingScreen()) \r
+    ui.add_screen(_ui.CallLogScreen()) \r
+    from appAlipay import Alipay ,AlipayOpenScreen,Alipay_1_1,Alipay_invite,Alipay_inviting,\\r
+    Alipay_success,Alipay_paycode,Alipay_pay_success,Alipay_collect,Alipay_parent\r
+    ui.add_screen(AlipayOpenScreen()) \r
+    ui.add_screen(Alipay_1_1())\r
+    ui.add_screen(Alipay_invite())  \r
+    ui.add_screen(Alipay_inviting()) \r
+    ui.add_screen(Alipay_success()) \r
+    ui.add_screen(Alipay_paycode()) \r
+    ui.add_screen(Alipay_pay_success()) \r
+    ui.add_screen(Alipay_collect()) \r
+    ui.add_screen(Alipay_parent()) \r
+    ui.add_screen(_ui.UIFINDScreen())\r
+    ui.add_screen(_ui.MsgDetailScreen())\r
+    ui.add_screen(_ui.IncomingCallScreen())\r
+    ui.add_screen(_ui.OnCallScreen())\r
+    ui.add_screen(_ui.MessageFullScreen())\r
+    # ui.add_screen(_ui.PowerOnScreen())\r
+    ui.add_screen(FactoryModeLocationScreen())\r
+    ui.add_screen(FactoryModeScreen())\r
+    ui.add_screen(FactoryModeAlipayInitScreen())\r
+    ui.add_screen(PopupAlarmScreen())\r
+    ui.add_screen(_ui.LowPowerScreen())\r
+    ui.add_screen(_ui.NewMessageScreen())\r
+    ui.add_screen(NewWechatPopupScreen())\r
+    ui.add_screen(HealthScreen())\r
+    # ui.add_screen(_ui.Setting3Screen())  \r
+    print("init6:{}".format(utime.localtime()))\r
+    \r
+\r
+    from protocol import LK_ProtoCol,PING_ProtoCol,HEART_ProtoCol,OXYGEN_ProtoCol,OXYGEN_One_ProtoCol,HRSTART_ProtoCol,CENTER_ProtoCol,UPLOAD_ProtoCol,\\r
+        TEMP_ProtoCol,DLT_ProtoCol,WT_ProtoCol,UD_ProtoCol,REMIND_ProtoCol, CR_ProtoCol,KA_ProtoCol,FIND_ProtoCol,POWEROFF_ProtoCol,\\r
+            ProtoColResolver,PHL_ProtoCol,MONITOR_ProtoCol,bootoff_ProtoCol,WDSTART_ProtoCol,LOWBAT_ProtoCol,sosHome_dial_ProtoCol,SockManager,NetManager\r
+    import mgr as mgr\r
+    print("init7:{}".format(utime.localtime()))\r
+    \r
+    from mgr import ConfigStoreManager,getBootOffManager,getSosFlagManager,CountdownManager, LocationManager, getVolumSizeManager,gethistoryDataManager,getUpLoadDataManager, getplayAudiodStateManager,\\r
+    AddrBookManager,MsgdetailManager,PhoneCallingManager,getOldTimeManager,getStorageDataManager,getBrightnessManager,getHrTimeManager,getTempTimeManager,getLowBatManager\r
+    print("init8:{}".format(utime.localtime()))\r
+    \r
+    \r
+    #from ui_WatchFaceScreen import WatchFaceScreen \r
+    \r
+    \r
+    # from usr.test_sms import HRSTART_ProtoCol,getHrTimeManager,HEART_ProtoCol,OXYGEN_ProtoCol,OXYGEN_One_ProtoCol,getBrightnessManager,\\r
+    # getStorageDataManager\r
+    print("init9:{}".format(utime.localtime()))\r
+   #from usr.ui_wechat import WechatScreen,TK_ProtoCol\r
+\r
+    print("init10:{}".format(utime.localtime()))\r
+    \r
+\r
+    app = watchApp()\r
+    app.set_ui(ui)\r
+    app.append_manager(mgr.AlarmVolumeLevelManager()) \\r
+        .append_manager(mgr.MsgVolumeLevelManager()) \\r
+        .append_manager(mgr.PhoneVolumeLevelManager()) \\r
+        .append_manager(mgr.DeviceInfoManager()) \\r
+        .append_manager(mgr.BatteryManager()) \\r
+           \r
+        # .append_manager(mgr.StopwatchManager()) \\r
+        # .append_manager(mgr.CountdownManager()) \\r
+\r
+   \r
+    app.append_manager(ConfigStoreManager())\r
+    app.append_manager(NetManager())\r
+    app.append_manager(LocationManager())\r
+    app.append_manager(AddrBookManager())\r
+    app.append_manager(mgr.MsgManager())\r
+    app.append_manager(MsgdetailManager())\r
+    app.append_manager(mgr.CallLogManager())\r
+    app.append_manager(mgr.getWeatherDataManager())\r
+    app.append_manager(PhoneCallingManager())\r
+    app.append_manager(ClockManager())\r
+    app.append_manager(gethistoryDataManager())\r
+    app.append_manager(getHrTimeManager())\r
+    app.append_manager(getBrightnessManager())\r
+    app.append_manager(getStorageDataManager())\r
+    app.append_manager(getUpLoadDataManager())\r
+    app.append_manager(getVolumSizeManager())\r
+    app.append_manager(getTempTimeManager())\r
+    app.append_manager(getplayAudiodStateManager())\r
+    app.append_manager(getLowBatManager())\r
+    app.append_manager(getBootOffManager())\r
+    app.append_manager(getOldTimeManager())\r
+    app.append_manager(getSosFlagManager())\r
+    app.append_manager(CountdownManager())\r
+\r
+    print("init21:{}".format(utime.localtime()))    \r
+    \r
+    print("init11:{}".format(utime.localtime()))    \r
+    pcr = ProtoColResolver()\r
+    pcr.add_support(LK_ProtoCol())\r
+    pcr.add_support(PING_ProtoCol())\r
+    pcr.add_support(KA_ProtoCol())\r
+    pcr.add_support(UD_ProtoCol())\r
+    pcr.add_support(CR_ProtoCol())\r
+    pcr.add_support(FIND_ProtoCol())\r
+    pcr.add_support(POWEROFF_ProtoCol())\r
+    pcr.add_support(PHL_ProtoCol())\r
+    pcr.add_support(TK_ProtoCol())\r
+    pcr.add_support(MESSAGE_ProtoCol())\r
+    pcr.add_support(WT_ProtoCol())\r
+    pcr.add_support(REMIND_ProtoCol())\r
+    pcr.add_support(HRSTART_ProtoCol())\r
+    pcr.add_support(HEART_ProtoCol())\r
+    pcr.add_support(OXYGEN_ProtoCol())\r
+    pcr.add_support(OXYGEN_One_ProtoCol())\r
+    pcr.add_support(TEMP_ProtoCol())\r
+    pcr.add_support(DLT_ProtoCol())\r
+    pcr.add_support(UPLOAD_ProtoCol())\r
+    pcr.add_support(MONITOR_ProtoCol())\r
+    # pcr.add_support(CENTER_ProtoCol())\r
+    pcr.add_support(CENTER_ProtoCol())\r
+    pcr.add_support(bootoff_ProtoCol())\r
+    pcr.add_support(WDSTART_ProtoCol())\r
+    pcr.add_support(LOWBAT_ProtoCol())\r
+    pcr.add_support(sosHome_dial_ProtoCol())\r
+\r
+    sm = SockManager()\r
+    sm.add_support_resolver(pcr)\r
+    app.append_manager(sm)\r
+    print("init11.0:{}".format(utime.localtime()))   \r
+    app.start()\r
+    sms_data = sms.getSaveLoc()\r
+    sms_lacv = sms_data[0][0]\r
+    if sms_lacv != 'SM':#每次开机设置一下短信的存储位置\r
+        sms.setSaveLoc('SM', 'SM', 'SM')\r
+    print("init12:{}".format(utime.localtime()))\r
+    import atcmd\r
+    resp=bytearray(50)\r
+    atcmd.sendSync('AT+log=52,1\r\n',resp,'',20)\r
+    print("AT+log=52,1:{}".format(resp))\r
+\r
+\r
index d863a95..945b027 100644 (file)
-from common import Abstract, LogAdapter
-import EventMesh
-import usocket
-import ql_fs
-import ujson
-import _thread
-import modem
-import utime
-import sim
-import net
-import dataCall
-import checkNet
-import osTimer
-import constants
-import sms
-from common import Lock, Abstract, LogAdapter
-#from location import GPS, GPSMatch,CellLocator
-from misc import USB, Power, ADC
-from machine import ExtInt, Pin,Timer,RTC,UART
-import EventMesh
-import usys
-import audio
-from machine import I2C
-from Gsensor import SC7A20
-import pm
-import ure
-import urandom
-try :
-    from Hsensor import GH3018
-except Exception as e:
-    EventMesh.debug_log("Hsensor none GH3018:{}".format(e))   
-#
-try :
-    from Hsensor import HX3918
-except Exception as e:
-    EventMesh.debug_log("Hsensor none HX3918:{}".format(e))    
-from machine import RTC
-import quecgnss
-import wifiScan
-import math
-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
-if EventMesh.model == "D10":
-    heartbeat_time = 7*60 #心跳时间
-    gheartbeat_time = 5*60 #心跳时间
-
-    def get_autoblood_value():#血压值
-        data = RTC().datetime()
-        hour = int(data[4])
-        blood_Maxvalue = 0
-        blood_Minvalue = 0
-        if hour >= 6 and hour <= 10:
-            random_numMax = urandom.randint(0, 30)
-            random_numMin = urandom.randint(0, 20)
-            blood_Maxvalue = 120+random_numMax
-            blood_Minvalue = 75+random_numMin
-
-            print("get_autoblood_value 6 -10",blood_Maxvalue,blood_Minvalue)
-            # return [self.blood_Maxvalue,self.blood_Minvalue]
-        elif hour > 10 and hour <= 14:#10-14(10,14]
-            random_numMax = urandom.randint(0, 20)
-            random_numMin = urandom.randint(0, 25)
-            blood_Maxvalue = 115+random_numMax
-            blood_Minvalue = 60+random_numMin
-            print("get_autoblood_value 10 -14",blood_Maxvalue,blood_Minvalue)
-            # return [self.blood_Maxvalue,self.blood_Minvalue]
-        elif hour > 14 and hour <= 18:#14-18
-            random_numMax = urandom.randint(0, 25)
-            random_numMin = urandom.randint(0, 15)
-            blood_Maxvalue = 115+random_numMax
-            blood_Minvalue = 70+random_numMin
-
-            print("get_autoblood_value 14 -18",blood_Maxvalue,blood_Minvalue)
-            # return [self.blood_Maxvalue,self.blood_Minvalue]
-        elif hour > 2 and hour < 6:#2-6
-            random_numMax = urandom.randint(0, 30)
-            random_numMin = urandom.randint(0, 20)
-            blood_Maxvalu = 105+random_numMax
-            blood_Minvalue = 65+random_numMin
-
-            
-            print("get_autoblood_value 2 -6",blood_Maxvalue,blood_Minvalue)
-            # return [self.blood_Maxvalue,self.blood_Minvalue]
-        else:#18-2 19 20 21 22 23 1 2
-            random_numMax = urandom.randint(0, 30)
-            random_numMin = urandom.randint(0, 20)
-            blood_Maxvalue = 100+random_numMax
-            blood_Minvalue = 60+random_numMin
-            print("get_autoblood_value 18 -2",blood_Maxvalue,blood_Minvalue)
-        return [blood_Maxvalue,blood_Minvalue]
-
-    def get_blood_sugar_value():#血糖值
-        data = RTC().datetime()
-        hour = int(data[4])
-        blood_sugar = 0
-        if (hour >= 6 and hour <= 8) or (hour >= 12 and hour <= 13) or (hour >= 18 and hour <= 19):#6-8 12-13 18-19 
-            random_value = urandom.randint(39, 61)
-            blood_sugar = random_value/10
-            print("get_blood_sugar_value 6 -10",blood_sugar)
-            # return [self.blood_Maxvalue,self.blood_Minvalue]
-        elif (hour > 8 and hour <= 9) or (hour >= 14 and hour <= 15) or (hour >= 20 and hour <= 21):#8-9 14-15 20-21
-            random_value = urandom.randint(67, 90)
-            blood_sugar = random_value/10
-            print("get_blood_sugar_value 10 -14",blood_sugar)
-        else:#18-2 19 20 21 22 23 1 2 10-11 16-17 21-22
-            random_value = urandom.randint(39, 78)
-            blood_sugar = random_value/10
-            print("get_blood_sugar_value 18 -2",blood_sugar)
-        return blood_sugar
-
-
-
-
-    class PhoneVolumeLevelManager(Abstract):
-        def __init__(self):
-            self.level = 0
-
-        def post_processor_after_instantiation(self):
-            EventMesh.subscribe("push_add_phonering_level", self.add)
-            EventMesh.subscribe("push_reduce_phonering_level", self.reduce)
-            EventMesh.subscribe("get_phonering_level", self.get)
-
-        def add(self, event, msg):
-            if self.level < 7:
-                self.level = self.level + 1
-
-        def reduce(self, event, msg):
-            if self.level > 0:
-                self.level = self.level - 1
-
-        def get(self, event=None, msg=None):
-            return self.level
-
-    class MsgVolumeLevelManager(Abstract):
-        def __init__(self):
-            self.level = 0
-
-        def post_processor_after_instantiation(self):
-            EventMesh.subscribe("push_add_msgvolume_level", self.add)
-            EventMesh.subscribe("push_reduce_msgvolume_level", self.reduce)
-            EventMesh.subscribe("get_msgvolume_level", self.get)
-
-        def add(self, event, msg):
-            if self.level < 7:
-                self.level = self.level + 1
-
-        def reduce(self, event, msg):
-            if self.level > 0:
-                self.level = self.level - 1
-
-        def get(self, event=None, msg=None):
-            return self.level
-
-    class AlarmVolumeLevelManager(Abstract):
-        def __init__(self):
-            self.level = 0
-
-        def post_processor_after_instantiation(self):
-            EventMesh.subscribe("push_add_alarmvolume_level", self.add)
-            EventMesh.subscribe("push_reduce_alarmvolume_level", self.reduce)
-            EventMesh.subscribe("get_alarmvolume_level", self.get)
-
-        def add(self, event, msg):
-            if self.level < 7:
-                self.level = self.level + 1
-
-        def reduce(self, event, msg):
-            if self.level > 0:
-                self.level = self.level - 1
-
-        def get(self, event=None, msg=None):
-            return self.level
-            
-    class StopwatchManager(Abstract):
-        def __init__(self):
-            self.level = 0
-            self.ms_value = 0
-            self.sec_value = 0
-            self.min_value = 0
-            self.timer = Timer(Timer.Timer1)
-
-        def post_processor_after_instantiation(self):
-            EventMesh.subscribe("stopwatch_start", self.start)
-            EventMesh.subscribe("stopwatch_stop", self.paused)
-            EventMesh.subscribe("stopwatch_reset", self.reset)
-            EventMesh.subscribe("get_stopwatch_ms", self.get_ms)
-            EventMesh.subscribe("get_stopwatch_sec", self.get_sec)
-            EventMesh.subscribe("get_stopwatch_min", self.get_min)
-
-        def start(self, event, msg):        
-            self.timer.start(period=100, mode=self.timer.PERIODIC, callback=self.fun)
-        
-        def paused(self, event, msg):        
-            self.timer.stop()
-        
-        def reset(self, event, msg):
-            self.timer.stop()
-
-            self.sec_value = 0
-            self.min_value = 0
-            self.ms_value = 0
-
-        def fun(self):
-            self.ms_value += 1
-            if self.ms_value > 9:
-                self.ms_value = 0   
-                self.sec_value += 1
-            if self.sec_value > 60:
-                self.sec_value = 0
-                self.min_value += 1
-            if self.min_value > 60:
-                self.timer.stop()
-
-        def get_ms(self, event=None, msg=None):
-            return self.ms_value
-
-        def get_min(self, event=None, msg=None):
-            return self.min_value
-
-        def get_sec(self, event=None, msg=None):
-            return self.sec_value
-
-    class CountdownManager(Abstract):
-        def __init__(self):
-            self.sec = 0
-            self.min = 0
-            self.hour = 0
-            self.timer = osTimer()
-            self.total = 0
-            self.time_cb = 0
-            self.time_play = 0
-            self.total_sec = 0
-
-        def post_processor_after_instantiation(self):
-            EventMesh.subscribe("add_countdown_sec", self.add_sec)
-            EventMesh.subscribe("reduce_countdown_sec", self.reduce_sec)
-            EventMesh.subscribe("add_countdown_min", self.add_min)
-            EventMesh.subscribe("reduce_countdown_min", self.reduce_min)
-            EventMesh.subscribe("add_countdown_hour", self.add_hour)
-            EventMesh.subscribe("reduce_countdown_hour", self.reduce_hour)
-            EventMesh.subscribe("get_countdown_sec", self.get_sec)
-            EventMesh.subscribe("get_countdown_min", self.get_min)
-            EventMesh.subscribe("get_countdown_hour", self.get_hour)
-
-            EventMesh.subscribe("set_countdown_off_state", self.set_countdown_off_state)
-            EventMesh.subscribe("get_countdown_off_state", self.get_countdown_off_state)
-
-
-            EventMesh.subscribe("set_countdown_all_time", self.set_countdown_all_time)
-            EventMesh.subscribe("get_countdown_all_time", self.get_countdown_all_time)
-
-            EventMesh.subscribe("countdown_end_cb", self.countdown_end_cb)
-
-            EventMesh.subscribe("reset_time_countdown",self.reset)
-
-        def set_countdown_all_time(self, event, msg):
-            self.total = msg[0]
-            self.total_sec = msg[1]
-            # EventMesh.debug_log("self.total:{} self.total_sec:{}".format(self.total,self.total_sec))
-
-
-        def get_countdown_all_time(self, event, msg):
-            return self.total
-        
-        def set_countdown_off_state(self, event, msg):
-
-            self.time_cb = msg[0]
-            self.time_play = msg[1]
-            # EventMesh.debug_log("self.time_cb:{} self.total_sec:{}".format(self.time_cb,self.time_play))
-
-
-        def get_countdown_off_state(self, event, msg):
-            return [self.time_cb,self.time_play]
-        
-        def countdown_end_cb(self, event, msg):
-            
-            if self.time_cb == 1 and self.time_play == 1:
-                date_tmp = utime.localtime()
-                time_tmp = utime.mktime(date_tmp) 
-                reduce = time_tmp- self.total_sec
-                EventMesh.debug_log("self.time_cb:{} self.time_play:{} self.total:{} self.total_sec:{}".format(self.time_cb,self.time_play, self.total,self.total_sec))
-                self.total = self.total - reduce
-                if self.total <= 0:
-                    self.total = 0
-                    self.time_cb = 0
-                    self.time_play = 0
-                    self.sec = 0
-                    self.min = 0
-                    self.hour = 0
-                    
-                    EventMesh.publish("load_screen", {"screen": "countdown_end"})
-                    return
-                self.total_sec = time_tmp
-
-
-        def add_sec(self, event, msg):
-            if self.sec < 59:
-                self.sec = self.sec + 1
-
-        def reduce_sec(self, event, msg):
-            if self.sec > 0:
-                self.sec = self.sec - 1
-
-        def add_min(self, event, msg):
-            if self.min < 59:
-                self.min = self.min + 1
-
-        def reduce_min(self, event, msg):
-            if self.min > 0:
-                self.min = self.min - 1
-
-        def add_hour(self, event, msg):
-            if self.hour < 99:
-                self.hour = self.hour + 1
-
-        def reduce_hour(self, event, msg):
-            if self.hour > 0:
-                self.hour = self.hour - 1
-
-        def get_sec(self, event=None, msg=None):
-            return self.sec
-
-        def get_min(self, event=None, msg=None):
-            return self.min
-
-        def get_hour(self, event=None, msg=None):
-            return self.hour
-        
-
-        
-        def reset(self, event=None, msg=None):
-            self.hour = 0
-            self.min = 0
-            self.sec = 0
-        
-        
-
-    BATTERY_OCV_TABLE = {
-        "nix_coy_mnzo2": {
-            55: {
-                4290: 100, 4237: 95, 4179: 90, 4123: 85, 4070: 80, 4020: 75, 3963: 70, 3919: 65, 3882: 60, 3847: 55,
-                3818: 50, 3794: 45, 3772: 40, 3752: 35, 3733: 30, 3716: 25, 3699: 20, 3677: 15, 3652: 10, 3629: 5, 3400: 0,
-            },
-            20: {
-                4290: 100, 4237: 95, 4179: 90, 4123: 85, 4070: 80, 4020: 75, 3963: 70, 3919: 65, 3882: 60, 3847: 55,
-                3818: 50, 3794: 45, 3772: 40, 3752: 35, 3733: 30, 3716: 25, 3699: 20, 3677: 15, 3652: 10, 3629: 5, 3400: 0,
-            },
-            0: {
-                4290: 100, 4237: 95, 4179: 90, 4123: 85, 4070: 80, 4020: 75, 3963: 70, 3919: 65, 3882: 60, 3847: 55,
-                3818: 50, 3794: 45, 3772: 40, 3752: 35, 3733: 30, 3716: 25, 3699: 20, 3677: 15, 3652: 10, 3629: 5, 3400: 0,
-            },
-        },
-    }
-
-
-
-    class Battery(object):
-        """This class is for battery info.
-
-        This class can get battery voltage and energy.
-        if adc_args is not None, use cbc to read battery
-
-        adc_args: (adc_num, adc_period, factor)
-
-            adc_num: ADC channel num
-            adc_period: Cyclic read ADC cycle period
-            factor: calculation coefficient
-        """
-
-        def __init__(self, adc_args=None, chrg_gpion=None, stdby_gpion=None):
-            self.__energy = 100
-            self.__temp = 55
-
-            # ADC params
-            self.__adc = None
-            if adc_args:
-                self.__adc_num, self.__adc_period, self.__factor = adc_args
-                if not isinstance(self.__adc_num, int):
-                    raise TypeError("adc_args adc_num is not int number.")
-                if not isinstance(self.__adc_period, int):
-                    raise TypeError("adc_args adc_period is not int number.")
-                if not isinstance(self.__factor, float):
-                    raise TypeError("adc_args factor is not int float.")
-                self.__adc = ADC()
-
-            # Charge params
-            self.__charge_callback = None
-            self.__charge_status = None
-            self.__chrg_gpion = chrg_gpion
-            self.__stdby_gpion = stdby_gpion
-            self.__chrg_gpio = None
-            self.__stdby_gpio = None
-            self.__chrg_exint = None
-            self.__stdby_exint = None
-            if self.__chrg_gpion is not None and self.__stdby_gpion is not None:
-                self.__init_charge()
-
-        def __chrg_callback(self, args):
-            self.__update_charge_status()
-            if self.__charge_callback is not None:
-                self.__charge_callback(self.__charge_status)
-
-        def __stdby_callback(self, args):
-            self.__update_charge_status()
-            if self.__charge_callback is not None:
-                self.__charge_callback(self.__charge_status)
-
-        def __update_charge_status(self):
-            if self.__chrg_gpio.read() == 1 and self.__stdby_gpio.read() == 1:
-                self.__charge_status = 0
-            elif self.__chrg_gpio.read() == 0 and self.__stdby_gpio.read() == 1:
-                self.__charge_status = 1
-            elif self.__chrg_gpio.read() == 1 and self.__stdby_gpio.read() == 0:
-                self.__charge_status = 2
-            else:
-                raise TypeError("CHRG and STDBY cannot be 0 at the same time!")
-
-        def __init_charge(self):
-            self.__chrg_gpio = Pin(self.__chrg_gpion, Pin.IN, Pin.PULL_DISABLE)
-            self.__stdby_gpio = Pin(self.__stdby_gpion, Pin.IN, Pin.PULL_DISABLE)
-            self.__chrg_exint = ExtInt(self.__chrg_gpion, ExtInt.IRQ_RISING_FALLING, ExtInt.PULL_PU, self.__chrg_callback)
-            self.__stdby_exint = ExtInt(self.__stdby_gpion, ExtInt.IRQ_RISING_FALLING, ExtInt.PULL_PU,
-                                        self.__stdby_callback)
-            self.__chrg_exint.enable()
-            self.__stdby_exint.enable()
-            self.__update_charge_status()
-
-        def __get_soc_from_dict(self, key, volt_arg):
-            """Get battery energy from map"""
-            if key in BATTERY_OCV_TABLE["nix_coy_mnzo2"]:
-                volts = sorted(BATTERY_OCV_TABLE["nix_coy_mnzo2"][key].keys(), reverse=True)
-                pre_volt = 0
-                volt_not_under = 0  # Determine whether the voltage is lower than the minimum voltage value of soc.
-                for volt in volts:
-                    if volt_arg > volt:
-                        volt_not_under = 1
-                        soc1 = BATTERY_OCV_TABLE["nix_coy_mnzo2"][key].get(volt, 0)
-                        soc2 = BATTERY_OCV_TABLE["nix_coy_mnzo2"][key].get(pre_volt, 0)
-                        break
-                    else:
-                        pre_volt = volt
-                # EventMesh.debug_log("__get_soc_from_dict:{}".format(soc2 - (soc2 - soc1) * (pre_volt - volt_arg) // (pre_volt - volt)))
-                if pre_volt == 0:  # Input Voltarg > Highest Voltarg
-                    return soc1
-                elif volt_not_under == 0:
-                    return 0
-                else:
-                    return soc2 - (soc2 - soc1) * (pre_volt - volt_arg) // (pre_volt - volt)
-
-        def __get_soc(self, temp, volt_arg, bat_type="nix_coy_mnzo2"):
-            """Get battery energy by temperature and voltage"""
-            if bat_type == "nix_coy_mnzo2":
-                if temp > 30:
-                    return self.__get_soc_from_dict(55, volt_arg)
-                elif temp < 10:
-                    return self.__get_soc_from_dict(0, volt_arg)
-                else:
-                    return self.__get_soc_from_dict(20, volt_arg)
-
-        def __get_power_vbatt(self):
-            return int(sum([Power.getVbatt() for i in range(100)]) / 100)
-
-        def __get_adc_vbatt(self):
-            self.__adc.open()
-            utime.sleep_ms(self.__adc_period)
-            adc_list = list()
-            for i in range(self.__adc_period):
-                adc_list.append(self.__adc.read(self.__adc_num))
-                utime.sleep_ms(self.__adc_period)
-            adc_list.remove(min(adc_list))
-            adc_list.remove(max(adc_list))
-            adc_value = int(sum(adc_list) / len(adc_list))
-            self.__adc.close()
-            vbatt_value = adc_value * (self.__factor + 1)
-            return vbatt_value
-
-        def set_temp(self, temp):
-            """Set now temperature."""
-            if isinstance(temp, int) or isinstance(temp, float):
-                self.__temp = temp
-                return True
-            return False
-
-        def get_voltage(self):
-            """Get battery voltage"""
-            if self.__adc is None:
-                return self.__get_power_vbatt()
-            else:
-                return self.__get_adc_vbatt()
-
-        def get_energy(self,volt_arg ):
-            """Get battery energy"""
-            if( volt_arg == None) :
-                volt_arg = self.get_voltage()
-            self.__energy = self.__get_soc(self.__temp, volt_arg)
-            # EventMesh.debug_log("get_energy:volt_arg {} __energy{}".format(volt_arg,self.__energy))
-            return self.__energy
-
-        def set_charge_callback(self, charge_callback):
-            if self.__chrg_gpion is not None and self.__stdby_gpion is not None:
-                if callable(charge_callback):
-                    self.__charge_callback = charge_callback
-                    return True
-            return False
-
-        def get_charge_status(self):
-            return self.__charge_status
-
-    class BatteryManager(Abstract):
-        def __init__(self):
-            """电池管理器"""
-            self.battery = Battery()
-            self.low_battery = False
-
-        def post_processor_after_instantiation(self):
-            """订阅此类所有的事件到 EventMesh中"""
-            EventMesh.subscribe("get_battery", self.get_battery)
-
-        def get_battery(self, event=None, msg=None):
-            battery = self.battery.get_energy(msg)
-            return battery
-
-        def get_voltage(self, event=None, msg=None):
-            voltage = self.battery.get_voltage()
-            return voltage
-
-    class ConfigStoreManager(Abstract):
-        """
-        持久化落盘存储
-        """
-
-        def __init__(self):
-            self.file_name = "/usr/conf_store.json"
-            self.lock = Lock()
-            self.map = dict()
-
-        def post_processor_after_instantiation(self):
-            if ql_fs.path_exists(self.file_name):
-                self.map = ql_fs.read_json(self.file_name)
-            else:
-                self.__store()
-            EventMesh.subscribe("persistent_config_get", self.__read)
-            EventMesh.subscribe("persistent_config_store", self.__store)
-
-        def __read(self, event, msg):
-            with self.lock:
-                return self.map.get(msg)
-
-        def __store(self, event=None, msg=None):
-            if msg is None:
-                msg = dict()
-            with self.lock:
-                self.map.update(msg)
-                ql_fs.touch(self.file_name, self.map)
-            
-    class sosInfoCallManager(Abstract):
-        # 通讯录
-        def __init__(self):
-            pass
-
-        def post_processor_after_instantiation(self):
-            EventMesh.subscribe("set_sos_info_call", self.set_sos_info_call)
-
-        def set_sos_info_call(self, event, msg):
-            hangup_mode = EventMesh.publish("get_hangup_mode")
-            if hangup_mode == 1:
-                EventMesh.publish("set_sos_flag",0)
-                EventMesh.publish("set_sos_num",0)
-                EventMesh.publish("set_hangup_mode",0)
-            EventMesh.debug_log('hangup_mode disconnect',hangup_mode)
-            sos_flag = EventMesh.publish("get_sos_flag")
-            EventMesh.debug_log('voicecall sos_flag',sos_flag)
-            if sos_flag == 0 :
-                EventMesh.publish("set_sos_num",0)
-            else:
-                num = EventMesh.publish("get_sos_num")
-                number = EventMesh.publish("get_dial_sos_number")
-                if number != None:
-                    if len(number) > 0:
-                        if num == None:
-                            num = 0
-                        num+=1
-                        num_len = 0
-
-                        if len(number) == 1:
-                            num_len = len(number)+1#三次
-                        elif len(number) == 2:
-                            num_len = len(number)+1+2 #1+2+1+2
-                        elif len(number) == 3:
-                            num_len = len(number)+5 #1+3+5
-                        # EventMesh.debug_log("number:{} number_len :{} num:{} num_len:{}".format(number,len(number),num,num_len))
-                        if num > num_len :
-                            if len(number) == 1:
-                                number1 = str(number[0])
-                                sms.sendPduMsg(number1, '我需要你的帮助', 'UCS2')
-                            elif len(number) == 2:
-                                number1 = str(number[0])
-                                sms.sendPduMsg(number1, '我需要你的帮助', 'UCS2')
-
-                                number2 = str(number[1])
-                                sms.sendPduMsg(number2, '我需要你的帮助', 'UCS2')
-                            elif len(number) == 3:
-                                number1 = str(number[0])
-                                sms.sendPduMsg(number1, '我需要你的帮助', 'UCS2')
-                                number2 = str(number[1])
-                                sms.sendPduMsg(number2, '我需要你的帮助', 'UCS2')
-                                number3 = str(number[2])
-                                sms.sendPduMsg(number3, '我需要你的帮助', 'UCS2')
-                            EventMesh.publish("set_sos_flag",0)
-                            EventMesh.publish("set_sos_num",0)
-                        else:
-                        # EventMesh.debug_log("number:{} number_len :{}".format(number,len(number)))
-                            EventMesh.publish("set_sos_num",num)
-                            if len(number) == 1:
-                                if len(number[0]) != 0:
-                                    EventMesh.publish("set_callnumer_cb",number[0])
-                                    EventMesh.debug_log("phone 1")
-                            elif len(number) == 2:
-                                if num == 1 or num == 3 or num == 5: #1 2 3 4 5 
-                                    if len(number[1]) != 0:
-                                        EventMesh.debug_log("phone 2")
-                                        EventMesh.publish("set_callnumer_cb",number[1])
-                                elif num == 2 or num == 4:
-                                    if len(number[0]) != 0:
-                                        EventMesh.debug_log("phone 3")
-                                        EventMesh.publish("set_callnumer_cb",number[0])
-                            elif len(number) == 3:
-                                if num == 1 or num == 4 or num == 7:
-                                    if len(number[1]) != 0:
-                                        EventMesh.publish("set_callnumer_cb",number[1])
-                                        EventMesh.debug_log("phone 4")
-                                elif num == 2 or num == 5 or num == 8:
-                                    if len(number[2]) != 0:
-                                        EventMesh.debug_log("phone 5")
-                                        EventMesh.publish("set_callnumer_cb",number[2])
-                                elif num == 3 or num == 6 :
-                                    if len(number[0]) != 0:
-                                        EventMesh.debug_log("phone 6")
-                                        EventMesh.publish("set_callnumer_cb",number[0])   
-    
-    
-    WL_timer = osTimer()   
-    def WL_timer_cb(*args):   
-        get_call = EventMesh.publish("get_call_state") 
-        if get_call == 2:#只有拨进来才给接听
-            EventMesh.publish("answer_call_event")#接听电话
-    def voice_callback(args):
-        EventMesh.debug_log('voicecall iinfo:{}'.format(args))
-        if args[0] == 10:
-                get_UI_high_priority = EventMesh.publish("get_UI_high_priority")#如果在拨出去或者通话中屏蔽来电
-                if get_UI_high_priority == 1:
-                    EventMesh.publish("set_interrup_incall",1)
-                    return
-                EventMesh.debug_log('voicecall incoming call, PhoneNO.: ', args[6])
-                size_len = len(str(args[6]))
-                tmp = []
-                tmp = args[6]
-                find_num = tmp[0]
-                b = tmp[0].isdigit()#判断是否不是数字开头 暂时不用 因为截取了+判断不了 判断号码是否大于11位数,如果大于11位数 并且第一个字符是数字就按照最后11位做存储
-
-                if b == True and size_len > 11:
-                    tmp = tmp[size_len-11:]
-                WLKEY = EventMesh.publish("get_storage_config","WLKEY") 
-                if WLKEY == "1" or WLKEY == "2":#开启了白名单
-                    on_list_flag = 0
-                    phonebook = EventMesh.publish("get_phonebook_list")
-                    phonebook_list = phonebook[1]
-                    EventMesh.debug_log("voice_callback:phonebook_list{}".format(phonebook_list))
-                    try:
-                        for value in phonebook_list.values():
-                            if value == args[6]:
-                                on_list_flag = 1
-                                break
-                    except Exception as e:
-                        usys.print_exception(e)
-                    EventMesh.debug_log("voice_callback:on_list_flag{}".format(on_list_flag))
-                    if on_list_flag == 1:#在白名单里
-                        if WLKEY == "2":
-                            WL_timer.stop()
-                            WL_timer.start(30000, 0, WL_timer_cb)
-                    else:
-                        EventMesh.debug_log("voice_callback:不在白名单中,挂断")
-                        voiceCall.callEnd()
-                        return 
-                fall_down = EventMesh.publish("get_fall_down_state")#跌倒报警标识
-                if fall_down != 0:
-                    voiceCall.callEnd()
-                    return
-                EventMesh.publish("set_call_state",2) 
-                EventMesh.publish("dialin_call_event")#电话拨进响铃
-                # EventMesh.publish("load_screen", {"screen": "incoming_call","meta":str(tmp)})
-
-        elif args[0] == 11:
-                EventMesh.publish("set_UI_high_priority",0)
-                sos_flag = EventMesh.publish("get_sos_flag")
-                if sos_flag == 1:
-                    sos_flag = 0
-                    EventMesh.publish("set_sos_flag",0)
-
-                EventMesh.debug_log('voicecall connected, PhoneNO.: ', args[6])
-                size_len = len(str(args[6]))
-                tmp = []
-                tmp = args[6]
-                find_num = tmp[0]
-                b = tmp[0].isdigit()#判断是否不是数字开头 暂时不用 因为截取了+判断不了
-                if b == True and size_len > 11:
-                    tmp = tmp[size_len-11:]
-                EventMesh.publish("set_call_state",3) 
-                # EventMesh.publish("load_screen", {"screen": "on_call","meta":str(tmp)})
-
-        elif args[0] == 12:
-                set_interrup_call = EventMesh.publish("get_interrup_incall")#打断这次不需要来电的ui事件 以免通话中退出当前界面进不去了
-                if set_interrup_call == 1:
-                    EventMesh.publish("set_interrup_incall",0)
-                    return
-
-                EventMesh.publish("set_interrup_incall",0)
-                EventMesh.publish("set_UI_high_priority",0)
-                
-
-                
-                
-                EventMesh.publish("set_sos_info_call")  
-                flag = EventMesh.publish("get_call_state") 
-                if flag == 2:
-                    EventMesh.publish("stop_led_timer")#设置参数
-                    EventMesh.publish("close_timer_all")#
-                EventMesh.publish("set_call_state",0) 
-                EventMesh.debug_log('voicecall disconnect end')
-                
-
-        elif args[0] == 13:
-                EventMesh.debug_log('voicecall is waiting, PhoneNO.: ', args[6])
-        elif args[0] == 14:
-
-                EventMesh.debug_log('voicecall dialing, PhoneNO.: ', args[6])
-                EventMesh.publish("set_UI_high_priority",0)
-                EventMesh.publish("set_call_state",1) 
-                # EventMesh.publish("load_screen", {"screen": "dialing"})
-
-                
-        elif args[0] == 15:
-                EventMesh.debug_log('voicecall alerting, PhoneNO.: ', args[6])
-                EventMesh.publish("set_call_state",1) 
-                
-        elif args[0] == 16:
-                EventMesh.debug_log('voicecall holding, PhoneNO.: ', args[6])
-
-    class DeviceInfoManager(Abstract):
-        
-        """
-            设备信息管理
-        """
-
-        def __init__(self):
-
-            self.DeviceInfo_queue = Queue()
-            _thread.stack_size((9+6)*1024)
-            _thread.start_new_thread(self.DeviceInfo_queue_thread, ())
-            _thread.stack_size(8*1024)
-            self.boot_time_count = 0
-            self.factory_test_time = 0
-            EventMesh.subscribe("publish_message_event_DeviceInfo",self.publish_message_event_DeviceInfo)
-            self.key = ""
-            self.imei = ""
-            self.cid = "ETEST20221014010"
-            self.imsi = ""
-            self.password = "000000"
-            #self.__city = None
-            #self.__location = None
-            self.timer_push_schedule = osTimer()
-            self.timer_pusht_test = osTimer()
-            
-            #self.battery_push_schedule = osTimer()
-            self.check_battery_list = []
-            
-            self.step = [0,0,0,0]
-            self.timer_push=0
-            self.timer_push_tmp=60
-            self.PING = "0" #绑定状态
-            self.connect = 0 #服务器连接状态
-            self.KA_time = 0
-            self.HR_time = 0
-            self.hr_timeSecond = 0
-            self.HR_state = 0
-            self.HR_Onestate = 0
-            self.get_hr_state = 0
-            self.get_spo2_state = 0
-            self.set_hsenor_crt = 0
-            self.HR_OneTime = 0
-            self.Hr_Need_Open = 0
-            self.Spo2_Need_Open = 0
-            self.bat_time = 0
-            self.vbat_full_flag = 0
-            self.clear_step = 0
-            self.test = 0
-            self.old_time = 0
-            self.UD_time = 0
-            self.upload_time = 0
-            self.UD_timeout = 7*60
-
-            self.low_power_AL = 0
-
-            self.temp_timeSecond = 0
-            self.temp_state = 0
-            self.temp_one_state = 0
-            self.temp_warning = 0
-
-            self.bg_timeSecond = 0
-
-            self.bp_timeSecond = 0
-            self.bpauto_state = 0
-
-            self.spo2_timeSecond = 0
-            self.spo2auto_state = 0
-
-            self.vbat_count = 0
-
-            self.vbat_buf=[]
-
-            self.curr_battery_level = 4200
-            self.bat_count = 0
-
-            self.mearsure_btn = 0
-            self.mearsure_timer = 0
-
-            self.old_hr_time = 0
-            self.old_spo2_time = 0
-
-            self.no_smi_count = 0
-            self.no_smi_state = 0
-
-            self.old_bp_time = 0
-
-            self.medicine_count = 0
-            self.medicine_flag  = 0
-            self.medicine_oldtotalmin = 0
-            
-            self.wakeup_flag = 0
-            self.wakeup_count = 0
-            self.wakeup_oldtotalmin = 0
-
-            self.sleep_flag = 0
-            self.sleep_count = 0
-            self.sleep_oldtotalmin = 0
-
-            self.reset_flag = 0
-            self.reset_count = 0
-            self.reset_oldtotalmin = 0
-
-            self.home_flag = 0
-            self.home_count = 0
-            self.home_oldtotalmin = 0
-
-            self.normal_flag = 0
-            self.normal_count = 0
-            self.normal_oldtotalmin = 0
-            
-            self.charge_full_count = 0
-            self.GPS_step_t = 0#记录步数
-            self.usb = USB()
-            self.usb.setCallback(self.usb_event_cb)
-            self.log = LogAdapter(self.__class__.__name__)
-            self.rtc = RTC()
-            self.aud = audio.Audio(0)
-            EventMesh.debug_log("DeviceInfoManager:1")
-            self.gsensor = SC7A20()
-            EventMesh.debug_log("DeviceInfoManager:1.0")
-            self.gsensor.activate()
-            EventMesh.debug_log("DeviceInfoManager:1.1")
-            self.gsensor.init()
-            EventMesh.debug_log("DeviceInfoManager:2")
-            self.gsensor.set_callback(self.gsensor_cb)
-            try :
-                self.hsensor = HX3918()
-                
-            except Exception as e:
-                EventMesh.debug_log("Hsensor none HX3918:{}".format(e))   
-            try :
-                self.hsensor = GH3018()
-            except Exception as e:
-                EventMesh.debug_log("Hsensor none GH3018:{}".format(e))   
-            #
-            self.hsensor.activate()
-            self.hsensor.init()
-            self.hsensor.close()
-            try :
-                self.hsensor.set_sar(1)
-            except Exception as e:
-                EventMesh.debug_log("Hsensor none set_sar:{}".format(e)) 
-            self.old_temp_time = 0
-            # #EventMesh.debug_log("hsensor.open_heart:%d\r\n"%(self.hsensor.open_heart()))
-            EventMesh.debug_log("DeviceInfoManager:3")
-            self.i2c0 = I2C(I2C.I2C0, I2C.FAST_MODE)
-            self.stop_temp( None, None)
-            self.dev_state = 0
-            self.wear = 1
-            self.BG_state = 0
-            self.old_bg_time = 0
-
-            self.pull_time = 0
-
-            self.drink_time = 0
-
-            self.alarm_count = 0
-            self.alarm_flag = 0
-
-            self.time_count = 0
-            
-            self.auto_spo2_count = 0
-
-            self.auto_hr_count = 0
-
-            self.auto_temp_count = 0
-
-            self.test_time = 0
-
-        def post_processor_after_instantiation(self):
-            EventMesh.debug_log("post_processor_after_instantiation:1")
-            """订阅此类所有的事件到 EventMesh中"""
-            # voiceCall.setCallback(voice_callback)
-            EventMesh.subscribe("screen_get_ope", self.get_device_ope)
-            EventMesh.subscribe("screen_get_sig", self.get_signal)
-            EventMesh.subscribe("screen_get_time", self.get_time)
-            EventMesh.subscribe("about_get_imei", self.get_imei)
-            EventMesh.subscribe("about_get_iccid", self.get_ic_cid)
-            EventMesh.subscribe("get_sim_Status", self.get_sim_Status)
-            EventMesh.subscribe("about_get_phonenum", self.get_phone_num)
-            EventMesh.subscribe("screen_get_battery", self.get_battery)
-            EventMesh.subscribe("set_curr_battery_level", self.set_curr_battery_level)
-            EventMesh.subscribe("get_curr_battery_level", self.get_curr_battery_level)
-            EventMesh.subscribe("get_fw_version", self.get_device_fw_version)
-            EventMesh.subscribe("get_standby_time", self.get_standby_time)
-            EventMesh.subscribe(constants.EVENT.GET_STEP, self.get_step_count)
-            EventMesh.subscribe("sim_slot_get", self.sim_slot_get)
-            EventMesh.subscribe("sim_slot_switch", self.sim_slot_switch)
-            EventMesh.subscribe(constants.EVENT.GET_KEY, self.get_key)
-            EventMesh.subscribe(constants.EVENT.SET_KEY, self.set_key)
-            EventMesh.subscribe(constants.EVENT.GET_IMEI, self.get_imei)
-            EventMesh.subscribe(constants.EVENT.GET_CID, self.get_cid)
-            EventMesh.subscribe(constants.EVENT.SET_CID, self.set_cid)
-            EventMesh.subscribe(constants.EVENT.GET_IMSI, self.get_imsi)
-            EventMesh.subscribe(constants.EVENT.GET_PASSWORD, self.get_password)
-            EventMesh.subscribe(constants.EVENT.SET_PASSWORD, self.set_password)     
-            EventMesh.subscribe(constants.EVENT.SET_PING, self.set_ping)
-            EventMesh.subscribe(constants.EVENT.GET_PING, self.get_ping)
-            EventMesh.subscribe(constants.EVENT.SET_CONNECT, self.set_connect)
-            EventMesh.subscribe(constants.EVENT.GET_CONNECT, self.get_connect)
-
-            
-            EventMesh.subscribe(constants.EVENT.START_BLOOD_OXYGEN, self.start_blood_oxygen)
-            EventMesh.subscribe(constants.EVENT.START_HEART, self.start_heart)
-            EventMesh.subscribe(constants.EVENT.STOP_BLOOD_OXYGEN, self.stop_blood_oxygen)
-            EventMesh.subscribe(constants.EVENT.STOP_HEART, self.stop_heart)
-            EventMesh.subscribe(constants.EVENT.GET_BLOOD_OXYGEN, self.get_blood_oxygen)
-            EventMesh.subscribe(constants.EVENT.GET_HEART, self.get_heart)
-            EventMesh.subscribe(constants.EVENT.GET_WEAR, self.get_wear)
-            EventMesh.subscribe("get_Hsensor", self.get_Hsensor)
-            EventMesh.subscribe("Hsensor_set_sleep", self.Hsensor_set_sleep)
-
-            EventMesh.subscribe(constants.EVENT.START_TEMP, self.start_temp)
-            EventMesh.subscribe(constants.EVENT.STOP_TEMP, self.stop_temp)
-            EventMesh.subscribe(constants.EVENT.GET_TEMP, self.get_temp)
-            EventMesh.subscribe("get_boot_time_count", self.get_boot_time_count)
-            EventMesh.subscribe("get_factory_test_time", self.get_factory_test_time)
-            EventMesh.subscribe("get_dev_state", self.get_dev_state)
-            EventMesh.subscribe("set_dev_state", self.set_dev_state)
-
-            EventMesh.subscribe("clear_health_state", self.clear_health_state)
-
-            EventMesh.subscribe("clear_home_alarm", self.clear_home_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)
-            EventMesh.subscribe("clear_normal_alarm", self.clear_normal_alarm)
-
-            EventMesh.subscribe("clear_manual_hr_flag", self.clear_manual_hr_flag)
-            EventMesh.subscribe("clear_manual_temp_flag", self.clear_manual_temp_flag)
-
-
-            EventMesh.subscribe("clear_usb_flag", self.clear_usb_flag)
-            
-            EventMesh.debug_log("post_processor_after_instantiation:2")
-            self.timer_push_schedule.start(10000, 1, self.publish_event_cb)
-            # self.timer_pusht_test.start(2000, 1, self.publish_test)
-            # self.battery_push_schedule.start(3000, 1, self.__check_battery)
-            self.log.debug("post_processor_after_instantiation finished")
-            #EventMesh.publish(constants.EVENT.START_HEART)
-            # 设备开机立刻更新一次参数
-            self.publish_event_cb()
-            
-            EventMesh.debug_log("post_processor_after_instantiation:3")
-
-        def clear_manual_hr_flag(self,event,msg):
-            self.auto_hr_count = 0
-        
-        def clear_manual_temp_flag(self,event,msg):
-            self.auto_temp_count = 0
-
-        def publish_message_event_DeviceInfo(self,event,msg):
-            self.DeviceInfo_queue.put(msg)
-
-        #DeviceInfo的消息队列处理,防止卡顿
-        def DeviceInfo_queue_thread(self):
-            while True:
-                data = self.DeviceInfo_queue.get()
-                #EventMesh.debug_log("DeviceInfo_queue_thread:data = {}".format(data))
-                if data != None:
-                    try:
-                        data["func"](data["data"])
-                    except Exception as e:
-                        EventMesh.debug_log("DeviceInfo_queue_thread:ERROR:{}".format(e))
-                        usys.print_exception(e)
-
-
-        def gsensor_cb(self, para):
-            EventMesh.debug_log("gsensor_cb:{}".format(para))
-            flip_sw = EventMesh.publish("get_storage_config","flip_sw")
-            fall_sw = EventMesh.publish("get_storage_config","fall_sw")
-            if para == 0: #跌倒报警
-                pass
-                if fall_sw == "1":
-                    EventMesh.publish("falldown_alarm_event")
-                    dev_state =  EventMesh.publish("get_dev_state")
-
-                    tmp = 1 << 21
-                    dev_state = dev_state|tmp #第21位=1
-                    EventMesh.publish("set_dev_state",dev_state)
-                    EventMesh.publish(constants.EVENT.START_LOCATION,[constants.PROTOCOL.AL_SEND,dev_state]) #开始AL定位
-                    pass
-                #EventMesh.publish("load_screen", {"screen": "FIND"})
-            elif para == 1: #抬腕
-                
-                if flip_sw == 1:
-                    EventMesh.publish(constants.EVENT.SYSTEM_UP)
-                
-            elif para == 2: #放手
-                pass
-                # if flip_sw == 1:
-                #     EventMesh.publish(constants.EVENT.SYSTEM_SLEEP)
-        def get_boot_time_count(self, event, msg):
-            return self.boot_time_count
-        
-        def get_factory_test_time(self, event, msg):
-            return self.factory_test_time
-        
-        def get_dev_state(self, event, msg):
-            return self.dev_state
-        def set_dev_state(self, event, msg):
-            self.dev_state = msg
-        
-        def publish_event_cb(self, *args, **kwargs):
-            
-            open_power = EventMesh.publish("get_power_on_state")#获取开机标识
-            if open_power != None:
-                if open_power == 1:
-                    if self.boot_time_count < 50000000:
-                        self.boot_time_count += 10
-                    if self.factory_test_time < 300:
-                        self.factory_test_time+=10
-                #EventMesh.debug_log("boot_time_count:{}".format(self.boot_time_count))
-            EventMesh.publish("publish_message_event_DeviceInfo",{"func":self.publish_event,"data":0})  
-        def optimize_temp(self,temp):
-            temp += 0.5
-            get_temp_time  = EventMesh.publish("get_temp_time")
-            EventMesh.debug_log("temp:{}".format(temp))
-            if temp < 36 :#or temp > 37.5:
-                temp = 36+urandom.random()
-            if temp > 37.5:
-                
-                self.temp_warning += 1
-                EventMesh.debug_log("temp_warning:{} get_temp_time{}".format(self.temp_warning,get_temp_time))
-                
-                if self.temp_warning < 5:#高温没连续超过3次,和谐成37.5度以下
-                    temp = 37+(urandom.randint(1, 4)/10)
-                else:
-                    self.temp_warning = 0
-            else:
-                if self.temp_warning>=1:
-                    self.temp_warning -= 1
-            if temp >= 40:
-                temp = 40
-            return temp
-        def clear_health_state(self,event,msg):
-            print("clear_health_state")
-            self.old_bp_time = 0#关闭心率 血压 血氧 体温清除标志
-            self.old_time = 0
-            self.HR_Onestate = 0
-            self.HR_OneTime = 0
-            self.HR_state = 0
-            self.set_hsenor_crt = 0
-            self.old_bg_time = 0
-            self.old_hr_time = 0
-            self.old_spo2_time = 0
-            self.BG_state = 0
-            self.bpauto_state = 0
-            self.spo2auto_state = 0
-            pass
-
-        def clear_temp_state(self,event,msg):
-            print("clear_temp_state")
-            self.temp_state = 0
-            self.temp_one_state = 0
-            self.old_temp_time = 0
-            pass
-
-        def publish_event(self,data):
-            """
-            定时事件处理
-            :param args:
-            :param kwargs:
-            :return:
-            """
-
-            date_tmp = utime.localtime()
-            time_tmp = utime.mktime(date_tmp)
-            # EventMesh.debug_log("date_tmp......01....{} time_tmp:{}\r\n".format(date_tmp,time_tmp))
-            
-
-            EventMesh.publish("countdown_end_cb")
-            """定时检查是否关闭gps失败"""
-            # gnss_state = quecgnss.get_state()
-            # get_location_flag = EventMesh.publish("get_location_flag")
-            # if get_location_flag != None:
-            #     # if gnss_state == 2 and get_location_flag == 0:
-            #     #     EventMesh.publish(constants.EVENT.GPSCLOSE)
-            #     if(get_location_flag == 0):
-            #         EventMesh.publish(constants.EVENT.START_LOCATION,constants.PROTOCOL.UD_SEND) #开始UD定位
-
-            """7分钟一次心跳"""
-            if EventMesh.platform == "gewu":
-                if  math.fabs(time_tmp - self.KA_time) > gheartbeat_time: #7分钟一次心跳
-                    self.KA_time = time_tmp
-                    EventMesh.publish(constants.PROTOCOL.KA_SEND)
-            else:
-                if  math.fabs(time_tmp - self.KA_time) > heartbeat_time: #7分钟一次心跳
-                    self.KA_time = time_tmp
-                    EventMesh.publish(constants.PROTOCOL.KA_SEND)
-
-            """定时定位"""
-            #EventMesh.publish("set_upload_data",3*60)
-            self.upload_time = EventMesh.publish("get_upload_data")
-            #EventMesh.debug_log("self.upload_time:{} math.fabs(time_tmp - self.UD_time):{}".format(self.upload_time,math.fabs(time_tmp - self.UD_time)))
-            if self.upload_time != None :
-                if  math.fabs(time_tmp - self.UD_time) > self.upload_time: #30分钟一次定位
-                    self.UD_time = time_tmp
-                    status_tmp = self.gsensor.get_status()#获取运动次数
-                    #status_tmp = 4
-                    #EventMesh.txt_log("status_count:{}".format(status_tmp))
-                    if EventMesh.publish(constants.EVENT.GET_CONNECT) == 1 and status_tmp > 3 :
-                        EventMesh.publish(constants.EVENT.START_LOCATION,constants.PROTOCOL.UD_SEND) #开始UD定位
-                        self.gsensor.clean_status()#清除运动次数
-                    else : #关闭定位
-                        #EventMesh.txt_log("NO status")
-                        EventMesh.debug_log("NO status")
-                        EventMesh.publish(constants.EVENT.CLOSE_LOCATION)#关闭定位 
-            
-            EventMesh.publish(constants.EVENT.PUSH_STEP, self.get_step_count())
-
-            """电池平均值"""
-            temp = Power.getVbatt()
-            if self.bat_count < 10:
-                self.vbat_buf.append(temp)
-                self.bat_count += 1
-            else:
-                for i in range(9):
-                    self.vbat_buf[i] = self.vbat_buf[i+1]
-                self.vbat_buf[9] = temp
-            curr_count = len(self.vbat_buf)
-            bat_total_value = 0
-            for i in range(curr_count):
-                bat_total_value += self.vbat_buf[i]
-            bat_total_value = bat_total_value//curr_count#一分钟更新一次电量 10个平均值
-            EventMesh.publish("set_curr_battery_level",bat_total_value)
-            # EventMesh.debug_log("self.vbat_buf:{} curr_count :{} bat_total_value:{} temp:{}".format(self.vbat_buf,curr_count,bat_total_value,temp))
-            bat_tmp = EventMesh.publish("screen_get_battery")
-            self.vbat_count+=10
-            if self.vbat_count >= 60:
-                self.vbat_count = 0
-                if bat_tmp != None:
-                    bat_value = bat_tmp[1]
-                    if bat_value <= 0:
-                        pass
-                        # EventMesh.publish("load_screen", {"screen": "LOW_ONE_POWER"})
-            
-            
-            """"隔天清步数"""
-
-            data = RTC().datetime()
-
-            hour = int(data[4])
-            min = int(data[5])
-
-
-
-            cur_month = int(data[1])
-            cur_day = int(data[2])
-            cur_year = int(data[0])
-
-            old_Timesec = EventMesh.publish("get_old_time_data")
-            # EventMesh.debug_log("hour:{} {} cur_month:{} {} next_alarm_time:{} old_Timesec:{}".format(hour,min,cur_month,cur_day,next_alarm_time,old_Timesec))
-            # EventMesh.debug_log("old_Timesec",old_Timesec)
-            if old_Timesec != None:
-                next_alarm_time = utime.localtime(int(old_Timesec))
-                month = int(next_alarm_time[1]) #00:00 18
-                day = int(next_alarm_time[2])
-                year = int(next_alarm_time[0])
-                if month != cur_month or day != cur_day or year != cur_year:#年 月 日只要其中一个都不一样就清零
-                    EventMesh.publish("set_old_time_data",time_tmp)
-                    self.gsensor.reset_step()
-
-                    EventMesh.publish("set_old_step_value",0)
-                    
-                    hr = EventMesh.publish("get_old_hr_data")
-                    if hr != 0:
-                        EventMesh.publish("set_old_hr_data", 0)
-                    
-                    spo2 = EventMesh.publish("get_old_spo2_data")
-                    if spo2 != 0:
-                        EventMesh.publish("set_old_spo2_data", 0)
-                    EventMesh.debug_log("clear step1111")
-                else:
-                    pass
-                    
-                    
-            if hour == 23:#清步数23:59
-                if min == 59:#58 59
-                    # if self.clear_step == 0:
-                    #     self.clear_step = 1
-                    EventMesh.publish("set_old_time_data",time_tmp)
-                    self.gsensor.reset_step()
-                    EventMesh.publish("set_old_step_value",0)
-
-                    hr = EventMesh.publish("get_old_hr_data")
-                    if hr != 0:
-                        EventMesh.publish("set_old_hr_data", 0)
-                    
-                    spo2 = EventMesh.publish("get_old_spo2_data")
-                    if spo2 != 0:
-                        EventMesh.publish("set_old_spo2_data", 0)
-                    EventMesh.debug_log("clear step2222")
-
-                else:
-                    self.clear_step = 0
-            else:
-                self.clear_step = 0
-            
-            """电量小于0% 关机"""
-            get_low_btn = EventMesh.publish("get_low_bat_btn")#
-            battery = EventMesh.publish("screen_get_battery")
-            if battery != None:
-                power = int(battery[1])
-                if battery[0] != '1':
-                    if power == 0:
-                        EventMesh.publish("open_power_on",2)#  
-                    """"低电报警"""
-                    # print("low power!!!!!!!!!!! %d",self.low_power_AL)
-                    if power <= 15 and self.low_power_AL==0:
-                        self.low_power_AL = 1
-                        dev_state =  EventMesh.publish("get_dev_state")
-
-                        tmp = 1 << 17
-                        dev_state = dev_state|tmp #第17位=1
-                        EventMesh.publish("set_dev_state",dev_state)
-                        EventMesh.publish(constants.EVENT.START_LOCATION,[constants.PROTOCOL.AL_SEND,dev_state]) #开始AL定位
-
-                if power >= 50:
-                    self.low_power_AL = 0
-
-            """未联网提示关机"""
-            ble=EventMesh.publish(constants.EVENT.GET_CONNECT)
-            # EventMesh.debug_log("ble",ble)
-            if ble == 0:#未联网提示关机
-                if battery[0] != '1':
-                    self.no_smi_count+=10
-                    # EventMesh.debug_log("self.no_smi_count",self.no_smi_count)
-                    if self.no_smi_count >= (15*60):#(15*60)
-                        self.no_smi_count = 0
-                        EventMesh.publish("open_power_on",2)#  #未检测到sim卡15分钟后关机
-                    
-            else:
-                self.no_smi_count = 0
-
-            msg_nums = sms.getMsgNums() #获取短信条数
-            # EventMesh.debug_log("msg_nums",msg_nums)
-            if(msg_nums != -1):
-                sms_data = sms.getSaveLoc()
-                sms_max = sms_data[0][2]
-                if msg_nums >= sms_max-1:
-                    EventMesh.publish("delete_sms_event")#
-
-            #佩戴检测
-            WEAR = EventMesh.publish(constants.EVENT.GET_WEAR)#佩戴数据
-            if self.wear != WEAR:
-                remove_sw = EventMesh.publish("get_storage_config","remove_sw")
-                if remove_sw == "1":#开启了佩戴检测的开关
-                    dev_state =  EventMesh.publish("get_dev_state")
-                    
-                    if WEAR != 1:
-                        tmp = 1 << 3
-                        tmp = ~tmp
-                        tmp = 1 << 20
-                        dev_state = dev_state|tmp #第20位=1
-                    # else :     
-                    #     pass              
-                        
-                    #     tmp = 1 << 20
-                    #     dev_state = dev_state|tmp #第20位=1
-                    #     tmp = 1 << 3
-                    #     dev_state = dev_state|tmp #第三位=1
-                        EventMesh.debug_log("佩戴检测:{}".format(dev_state))    
-                        EventMesh.publish("set_dev_state",dev_state)
-                        EventMesh.publish(constants.EVENT.START_LOCATION,[constants.PROTOCOL.AL_SEND,dev_state]) #开始AL定位,发送报警
-                        #EventMesh.publish(constants.PROTOCOL.HELP_SEND,65)
-            self.wear = WEAR
-            """定时测量心率,血氧,体温"""
-            self.get_hr_state = EventMesh.publish("get_hr_state")
-            self.get_spo2_state = EventMesh.publish("get_spo2_state")
-            get_temp_time  = EventMesh.publish("get_temp_time")
-            get_temp_state  = EventMesh.publish("get_temp_state")
-            get_bp_state  = EventMesh.publish("get_bp_state")
-            get_bg_state  = EventMesh.publish("get_bg_state")
-            if get_bg_state == None:
-                get_bg_state = 0
-            if get_bp_state == None:
-                get_bp_state = 0
-
-            if get_temp_state == None:
-                get_temp_state = 0
-
-            if self.get_hr_state == None:
-                self.get_hr_state = 0
-            if self.get_spo2_state == None:
-                self.get_spo2_state = 0 
-        
-            call_state = EventMesh.publish("get_call_state")
-            if call_state == None:
-                call_state = 0
-            if battery[0] != "1":
-                if get_temp_state != None and call_state != None: #突然脱腕
-
-                    if get_temp_state > 1  and (WEAR != 1 or call_state != 0):
-                        EventMesh.publish(constants.EVENT.STOP_TEMP)
-                        EventMesh.publish("set_temp_state",0)
-                        EventMesh.txt_log("auto stop_temp:22")
-
-                    if (self.get_hr_state > 1 or self.get_spo2_state > 1 or get_bp_state > 1 or get_bg_state > 1) and (WEAR != 1 or call_state != 0):
-                        # print("wear faile")
-                        if self.get_hr_state > 1 :
-                            EventMesh.txt_log("auto stop_hr:22")
-                            EventMesh.publish("set_hr_state",0)#2代表后台进入测试,定时测心率 1ui界面测试洗心率 
-                            EventMesh.publish(constants.EVENT.STOP_HEART) 
-                            if WEAR == 1:
-                                heart_value = EventMesh.publish(constants.EVENT.GET_HEART)
-                                if heart_value >= 50 and heart_value != None:
-                                    EventMesh.publish(constants.PROTOCOL.HEART_SEND,heart_value)#上传心率数据
-                            
-                        if self.get_spo2_state > 1:
-                            EventMesh.txt_log("auto stop_spo2:22")
-                            EventMesh.publish("set_spo2_state",0)#2代表后台进入测试
-
-                            EventMesh.publish(constants.EVENT.STOP_BLOOD_OXYGEN)
-                            spo2_value = EventMesh.publish(constants.EVENT.GET_BLOOD_OXYGEN)
-                            if WEAR == 1:
-                                if spo2_value > 85 and spo2_value != None:
-                                    EventMesh.publish(constants.PROTOCOL.OXYGEN_SEND,spo2_value)
-                            
-                        if get_bp_state > 1:
-                            EventMesh.txt_log("auto stop_bp:22")
-                            EventMesh.publish("set_bp_state",0)#2代表后台进入测试
-                            EventMesh.publish(constants.EVENT.STOP_HEART)
-                            if WEAR == 1:
-                                blood_data = get_autoblood_value()
-                                if blood_data == None:
-                                    blood_data[0] = 0
-                                    blood_data[1] = 0
-
-                                max_value = blood_data[0]
-                                min_value = blood_data[1]
-                                if max_value != 0 and min_value != 0:
-                                    EventMesh.publish(constants.PROTOCOL.BLOOD_SEND,[max_value,min_value])
-                            
-                        if get_bg_state > 1:
-                            EventMesh.txt_log("auto stop_bg:22")
-                            EventMesh.publish("set_bg_state",0)#2代表后台进入测试
-                            EventMesh.publish(constants.EVENT.STOP_HEART)
-                            if WEAR == 1:
-                                bg_data = get_blood_sugar_value()
-                                if bg_data == None:
-                                    bg_data = 0
-                                if bg_data != 0:
-                                    # EventMesh.publish("play_sugar_value", bg_data)#播放血糖数值
-                                    EventMesh.publish(constants.PROTOCOL.BLOODGLUSOCE_SEND,bg_data)
-                            
-            if self.pull_time == 0:
-                self.pull_time = time_tmp
-            # if EventMesh.publish(constants.EVENT.GET_CONNECT) == 1:#已联网 并且不在充电 佩戴正常 不在通话就给测试心率
-            if EventMesh.publish(constants.EVENT.GET_CONNECT) == 1 and battery[0] != "1" and WEAR == 1 and call_state == 0:
-                #防止时间校时出错
-                if time_tmp < self.pull_time :
-                    self.pull_time = time_tmp
-                if time_tmp < self.temp_timeSecond:
-                    self.temp_timeSecond = time_tmp
-                if time_tmp < self.hr_timeSecond:
-                    self.hr_timeSecond = time_tmp
-                if time_tmp < self.spo2_timeSecond :
-                    self.spo2_timeSecond = time_tmp
-                if time_tmp < self.bp_timeSecond:
-                    self.bp_timeSecond = time_tmp
-                if time_tmp < self.bg_timeSecond:
-                     self.bg_timeSecond = time_tmp
-                     
-                if time_tmp - self.pull_time >= 30:
-                    # EventMesh.debug_log("shifens:")  
-
-                    get_hr_state = EventMesh.publish("get_hr_state")
-                    get_spo2_state = EventMesh.publish("get_spo2_state")
-                    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 get_hr_state == None:
-                        get_hr_state = 0
-                        self.old_hr_time = 0
-
-                    if get_spo2_state == None:
-                        get_spo2_state = 0
-                        self.old_spo2_time = 0
-
-                    if get_temp_state == None:
-                        get_temp_state = 0
-                        self.temp_one_state = 0
-
-                    if get_bp_state == None:
-                        get_bp_state = 0
-                        self.old_bp_time = 0
-                    
-                    if get_bg_state == None:
-                        get_bg_state = 0
-                        self.old_bg_time = 0
-                    
-                    # print("bp get_bp_state ",get_bp_state,self.old_bp_time)
-
-                    
-                    if get_hr_state != None:
-                        if get_hr_state == 3:
-                            self.old_hr_time+=1
-                            if self.old_hr_time == 1:
-                                EventMesh.publish("set_hr_state",3)#2代表后台进入测试
-                                # EventMesh.publish("set_hr_blood_led",1)
-                                EventMesh.publish(constants.EVENT.START_HEART)
-                                EventMesh.txt_log("auto start_hr:333")
-                            elif self.old_hr_time > 6:
-                                self.old_hr_time = 0
-                                EventMesh.publish("set_hr_state",0)#2代表后台进入测试
-                                EventMesh.txt_log("auto stop_hr:333")
-                                EventMesh.publish(constants.EVENT.STOP_HEART)
-                                heart_value = EventMesh.publish(constants.EVENT.GET_HEART)
-                                EventMesh.debug_log("heart_value:{}".format(heart_value))
-                                if heart_value >= 50 and heart_value != None:
-                                    EventMesh.publish(constants.PROTOCOL.HEART_SEND,heart_value)#上传心率数据
-                                EventMesh.debug_log("STOP_HEART:3")
-                        else:
-                            self.old_hr_time = 0
-                    else:
-                        self.old_hr_time = 0
-
-
-                    if get_spo2_state != None:
-                        if get_spo2_state == 3:
-                            self.old_spo2_time+=1
-                            if self.old_spo2_time == 1:
-                                EventMesh.publish("set_spo2_state",3)#2代表后台进入测试
-                                # EventMesh.publish("set_hr_blood_led",1)
-                                EventMesh.publish(constants.EVENT.START_BLOOD_OXYGEN)#K开血氧
-                                EventMesh.txt_log("auto start_spo2:333")
-                            elif self.old_spo2_time > 6:
-                                self.old_spo2_time = 0
-                                EventMesh.txt_log("auto stop_spo2:333")
-                                EventMesh.publish("set_spo2_state",0)#2代表后台进入测试
-                                EventMesh.publish(constants.EVENT.STOP_BLOOD_OXYGEN)
-                                spo2_value = EventMesh.publish(constants.EVENT.GET_BLOOD_OXYGEN)
-                                if spo2_value > 85 and spo2_value != None:
-                                    EventMesh.publish(constants.PROTOCOL.OXYGEN_SEND,spo2_value)
-                                    
-                        else:
-                            self.old_spo2_time = 0
-                    else:
-                        self.old_spo2_time = 0
-
-
-                    if get_bp_state != None:
-                        if get_bp_state == 3:
-                            self.old_bp_time+=1
-                            if self.old_bp_time == 1:
-                                EventMesh.publish("set_bp_state",3)#2代表后台进入测试
-                                # EventMesh.publish("set_hr_blood_led",1)
-                                EventMesh.publish(constants.EVENT.START_HEART)
-                                EventMesh.txt_log("auto start_bp:333")
-                            elif self.old_bp_time > 6:
-                                self.old_bp_time = 0
-                                
-                                EventMesh.publish("set_bp_state",0)#2代表后台进入测试
-                                # EventMesh.publish("stop_led_timer")#设置参数
-                                blood_data = get_autoblood_value()
-                                if blood_data == None:
-                                    blood_data[0] = 0
-                                    blood_data[1] = 0
-
-                                max_value = blood_data[0]
-                                min_value = blood_data[1]
-                                if max_value != 0 and min_value != 0:
-                                    EventMesh.publish(constants.PROTOCOL.BLOOD_SEND,[max_value,min_value])
-                                EventMesh.publish(constants.EVENT.STOP_HEART)
-                                EventMesh.txt_log("auto stop_bp:333")
-                        else:
-                            self.old_bp_time = 0
-                    else:
-                        self.old_bp_time = 0
-
-                    if get_bg_state != None:
-                        if get_bg_state == 3:
-                            self.old_bg_time+=1
-                            if self.old_bg_time == 1:
-                                EventMesh.publish("set_bg_state",3)#2代表后台进入测试
-                                # EventMesh.publish("set_hr_blood_led",1)
-                                EventMesh.publish(constants.EVENT.START_HEART)
-                                EventMesh.txt_log("auto start_bg:333")
-                            elif self.old_bg_time > 6:
-                                self.old_bg_time = 0
-                                EventMesh.publish("set_bg_state",0)#2代表后台进入测试
-                                EventMesh.publish(constants.EVENT.STOP_HEART)
-                                # EventMesh.publish("stop_led_timer")#设置参数
-                                bg_data = get_blood_sugar_value()
-                                if bg_data == None:
-                                    bg_data = 0
-                                if bg_data != 0:
-                                    EventMesh.publish(constants.PROTOCOL.BLOODGLUSOCE_SEND,bg_data)
-
-                                EventMesh.txt_log("auto stop_bp:333")
-                        else:
-                            self.old_bg_time = 0
-                    else:
-                        self.old_bg_time = 0
-
-                    
-                    if get_temp_state != None:
-                        if get_temp_state == 3:#单次测量
-                            self.temp_one_state+=1
-                            if self.temp_one_state == 1:
-                                EventMesh.txt_log("auto start_temp:333")
-                                EventMesh.debug_log("AUTO one temp:2") 
-                                EventMesh.publish("set_temp_state",3)
-                                # EventMesh.publish("set_hr_blood_led",1)
-                                EventMesh.publish(constants.EVENT.START_TEMP)   
-                            elif self.temp_one_state > 3:
-                                self.temp_one_state = 0
-                                temp = EventMesh.publish(constants.EVENT.GET_TEMP) 
-                                temp = self.optimize_temp(temp)
-                                
-                                EventMesh.publish("set_temp_state",0)
-                                tmp_f_tmp = 0
-                                tmp_d_tmp = 0
-                                if str(temp).find(".") != -1:
-                                    tmp_f = str(temp).split('.')[0] 
-                                    tmp_f_tmp = int(tmp_f)
-                                    
-                                    tmp_d = str(temp).split('.')[1][:1]
-                                    tmp_d_tmp = int(tmp_d)
-                                else:
-                                    tmp_f_tmp = temp
-                                    
-                                if temp != None:
-                                    if temp != 0:
-                                        EventMesh.publish(constants.PROTOCOL.TEMP_SEND,[tmp_f_tmp,tmp_d_tmp])
-                                EventMesh.publish(constants.EVENT.STOP_TEMP)
-                                EventMesh.txt_log("auto start_temp:333")
-                        else:
-                            self.temp_one_state = 0
-
-
-        
-                    
-                    # EventMesh.debug_log("get_temp_time:{} self.temp_one_state:{}".format(get_temp_time,self.temp_one_state))
-                    if get_temp_time != None:#定时测量体温
-                        if get_temp_time > 0:
-                            if get_temp_state != None:
-                                get_temp_state  = EventMesh.publish("get_temp_state")
-                                if get_temp_state == 0 or get_temp_state == 2:
-                                    if (time_tmp-self.temp_timeSecond) >= get_temp_time:#大于一个周期的时间,重新赋值
-                                        self.temp_state = 0
-                                        self.temp_timeSecond = time_tmp
-
-                                    if (time_tmp-self.temp_timeSecond) == 0 and self.temp_state == 0:#一开始就测量 测量一分钟停止测量体温
-                                        self.temp_state = 1
-                                        EventMesh.publish("set_temp_state",2)
-                                        # EventMesh.publish("set_hr_blood_led",1)
-                                        EventMesh.debug_log("AUTO temp:") 
-                                        EventMesh.txt_log("auto START_temp:1")
-                                        EventMesh.publish(constants.EVENT.START_TEMP)
-
-                                    elif (time_tmp-self.temp_timeSecond) >= 30 and self.temp_state == 1 and get_temp_state == 2:
-                                        self.temp_state = 0
-                                        EventMesh.txt_log("auto stop_temp:1")
-                                        EventMesh.publish("set_temp_state",0)
-                                        temp = EventMesh.publish(constants.EVENT.GET_TEMP) 
-                                        temp = self.optimize_temp(temp)
-                                        
-                                        tmp_f_tmp = 0
-                                        tmp_d_tmp = 0
-                                        if str(temp).find(".") != -1:
-                                            tmp_f = str(temp).split('.')[0] 
-                                            tmp_f_tmp = int(tmp_f)
-                                            
-                                            tmp_d = str(temp).split('.')[1][:1]
-                                            tmp_d_tmp = int(tmp_d)
-                                        else:
-                                            tmp_f_tmp = temp
-                                            
-                                        if temp != None:
-                                            if temp != 0:
-                                                EventMesh.publish(constants.PROTOCOL.TEMP_SEND,[tmp_f_tmp,tmp_d_tmp])
-                                        EventMesh.publish(constants.EVENT.STOP_TEMP)
-
-                                else:
-                                    self.temp_state = 0
-                                    self.old_temp_time = 0
-                        else:
-                            temp_state  = EventMesh.publish("get_temp_state") 
-                            if temp_state == 2:
-                                EventMesh.publish("set_temp_state",0)#2代表后台进入测试
-                                # EventMesh.publish("stop_led_timer")#设置参数
-                                EventMesh.txt_log("auto wear stop_temp:2 ")
-                                EventMesh.publish(constants.EVENT.STOP_TEMP)
-                            self.temp_state = 0
-                            self.temp_timeSecond = 0
-                            self.old_temp_time = 0
-
-
-
-                    hr_time = {}
-                    hr_time = EventMesh.publish("get_time_hr")#获取时间是否大于0
-                    # print("hr_time{}".format(hr_time))
-                    if hr_time[0] !=  None:
-                        self.mearsure_btn = int(hr_time[0])
-                        self.mearsure_timer = int(hr_time[1])
-
-                        if self.mearsure_btn != None and self.mearsure_timer != None:
-                            
-                            if self.mearsure_btn >= 1 and self.mearsure_timer > 0:#开关打开并且时间大于0就可以测试血糖
-                                get_hr_state = EventMesh.publish("get_hr_state")#心率
-                                get_spo2_state = EventMesh.publish("get_spo2_state")#血氧
-                                get_bp_state  = EventMesh.publish("get_bp_state")#血压
-                                get_bg_state  = EventMesh.publish("get_bg_state")#血糖
-                                # print("state hr",get_hr_state,get_spo2_state,get_bp_state,get_bg_state)
-                                if (get_bg_state == 0 and get_spo2_state == 0 and get_bp_state == 0) and  (get_hr_state == 2 or get_hr_state == 0):#心率血压血氧不在测试就测试血糖自动测量
-                                    if (time_tmp-self.hr_timeSecond) >= self.mearsure_timer:#大于一个周期的时间,保存的时间戳时间 1678 0 1678 30 1678 
-                                        self.hr_timeSecond = time_tmp
-                                        self.HR_Onestate = 0
-                                    # print("time_tmp hr",time_tmp,self.hr_timeSecond,time_tmp-self.hr_timeSecond,self.mearsure_timer,self.HR_Onestate)
-                                    if (time_tmp - self.hr_timeSecond) == 0 and self.HR_Onestate == 0:
-                                        self.HR_Onestate = 1
-                                        EventMesh.txt_log("auto START_hr:1")
-                                        EventMesh.publish("set_hr_state",2)#2代表后台进入测试
-                                        # EventMesh.publish("set_hr_blood_led",1)
-                                        EventMesh.publish(constants.EVENT.START_HEART)
-                                        
-                                    elif (time_tmp - self.hr_timeSecond) >= 60 and self.HR_Onestate == 1 and get_hr_state == 2:
-                                        self.HR_Onestate = 0
-                                        EventMesh.publish("set_hr_state",0)#2代表后台进入测试
-                                        EventMesh.debug_log("stop debug3")
-                                        EventMesh.txt_log("auto stop_hr:1")
-                                        EventMesh.publish(constants.EVENT.STOP_HEART)
-                                        heart_value = EventMesh.publish(constants.EVENT.GET_HEART)
-                                        EventMesh.debug_log("heart_value:{}".format(heart_value))
-                                        # heart_value = 60+urandom.randint(0,10)
-                                        if heart_value >= 50 and heart_value != None:
-                                            EventMesh.publish(constants.PROTOCOL.HEART_SEND,heart_value)#上传心率数据
-                                        #获取心率数据上传数据app
-                                        EventMesh.debug_log("STOP_HEART:")
-                                        
-                                else:
-                                    self.HR_Onestate = 0
-                            else:
-                                self.hr_timeSecond = 0
-                                self.HR_Onestate = 0
-                                hr_state = EventMesh.publish("get_hr_state")#心率
-                                if hr_state == 2:
-                                    EventMesh.publish("set_hr_state",0)#2代表后台进入测试
-                                    EventMesh.debug_log("33stop debug3")
-                                    # EventMesh.publish("stop_led_timer")#设置参数
-                                    EventMesh.publish(constants.EVENT.STOP_HEART)
-                                    EventMesh.txt_log("auto wear stop_hr:2 ")
-
-                    get_spo2time = EventMesh.publish("get_spo2_time")#血压自动测试
-                    # print("get_spo2time",get_spo2time)
-                    if get_spo2time != None:#血压时间不为0
-                        spo2_on = int(get_spo2time[0])
-                        spo2_time = int(get_spo2time[1])
-                        if spo2_on != 0 and spo2_time != 0:
-                            get_hr_state = EventMesh.publish("get_hr_state")
-                            get_spo2_state = EventMesh.publish("get_spo2_state")
-                            get_bp_state  = EventMesh.publish("get_bp_state")
-                            get_bg_state  = EventMesh.publish("get_bg_state")
-                            # print("state bg2",get_hr_state,get_spo2_state,get_bp_state,get_bg_state)
-                            if (get_hr_state == 0 and get_bp_state == 0 and get_bg_state == 0) and (get_spo2_state == 2 or get_spo2_state == 0):#心率血压血氧不在测试就测试血糖自动测量
-                                if (time_tmp-self.spo2_timeSecond) >= spo2_time:#大于一个周期的时间,保存的时间戳时间 1678 0 1678 30 1678 
-                                    self.spo2_timeSecond = time_tmp
-                                    self.spo2auto_state = 0
-                                # print("time_tmp spo2",time_tmp,self.spo2_timeSecond,time_tmp-self.spo2_timeSecond,self.bg_timer,self.bpauto_state)
-                                if (time_tmp - self.spo2_timeSecond) == 0 and self.spo2auto_state == 0:
-                                    self.spo2auto_state = 1
-                                    EventMesh.debug_log("START_spo2:auto")
-                                    EventMesh.txt_log("auto START_spo2:1")
-                                    EventMesh.publish("set_spo2_state",2)#2代表后台进入测试
-                                    EventMesh.publish(constants.EVENT.START_BLOOD_OXYGEN)#K开血氧
-                                    
-                                elif (time_tmp - self.spo2_timeSecond) >= 60 and self.spo2auto_state == 1 and get_spo2_state == 2:
-                                    EventMesh.publish("set_spo2_state",0)#2代表后台进入测试
-                                    self.spo2auto_state = 0
-                                    EventMesh.publish(constants.EVENT.STOP_BLOOD_OXYGEN)
-                                    spo2_value = EventMesh.publish(constants.EVENT.GET_BLOOD_OXYGEN)
-                                    if spo2_value > 85 and spo2_value != None:
-                                        EventMesh.publish(constants.PROTOCOL.OXYGEN_SEND,spo2_value)
-                                    EventMesh.txt_log("auto stop_spo2:1")
-                                
-                            else:
-                                self.spo2auto_state = 0
-                        else:
-                            self.spo2_timeSecond = 0
-                            self.spo2auto_state = 0
-                            spo2_state = EventMesh.publish("get_spo2_state")#心率
-                            if spo2_state == 2:
-                                EventMesh.publish("set_spo2_state",0)#2代表后台进入测试
-                                EventMesh.debug_log("spo2 stop debug3")
-                                EventMesh.txt_log("auto wear stop_spo2:2 ")
-                                EventMesh.publish(constants.EVENT.STOP_BLOOD_OXYGEN)
-
-
-                    get_bptime = EventMesh.publish("get_bp_time")#血压自动测试
-                    # print("get_bptime",get_bptime)
-                    if get_bptime != None:#血压时间不为0
-                        bp_on = int(get_bptime[0])
-                        bp_time = int(get_bptime[1])
-                        if bp_on != 0 and bp_time != 0:
-                            get_hr_state = EventMesh.publish("get_hr_state")
-                            get_spo2_state = EventMesh.publish("get_spo2_state")
-                            get_bp_state  = EventMesh.publish("get_bp_state")
-                            get_bg_state  = EventMesh.publish("get_bg_state")
-                            # print("state bg2",get_hr_state,get_spo2_state,get_bp_state,get_bg_state)
-                            
-                            if (get_hr_state == 0 and get_spo2_state == 0 and get_bg_state == 0) and (get_bp_state == 2 or get_bp_state == 0):#心率血压血氧不在测试就测试血糖自动测量
-                                if (time_tmp-self.bp_timeSecond) >= bp_time:#大于一个周期的时间,保存的时间戳时间 1678 0 1678 30 1678 
-                                    self.bp_timeSecond = time_tmp
-                                    self.bpauto_state = 0
-                                # print("time_tmp bp",time_tmp,self.bp_timeSecond,time_tmp-self.bp_timeSecond,self.bg_timer,self.bpauto_state)
-                                if (time_tmp - self.bp_timeSecond) == 0 and self.bpauto_state == 0:
-                                    self.bpauto_state = 1
-                                    EventMesh.debug_log("START_bp:auto")
-                                    EventMesh.txt_log("auto START_bp:1")
-                                    EventMesh.publish("set_bp_state",2)#2代表后台进入测试
-                                    # EventMesh.publish("set_hr_blood_led",1)
-                                    EventMesh.publish(constants.EVENT.START_HEART)
-                                    
-                                elif (time_tmp - self.bp_timeSecond) >= 60 and self.bpauto_state == 1 and get_bp_state == 2:
-                                    self.bpauto_state = 0
-                                    EventMesh.publish("set_bp_state",0)#2代表后台进入测试
-                                    blood_data = get_autoblood_value()
-                                    if blood_data == None:
-                                        blood_data[0] = 0
-                                        blood_data[1] = 0
-
-                                    max_value = blood_data[0]
-                                    min_value = blood_data[1]
-                                    if max_value != 0 and min_value != 0:
-                                        EventMesh.publish(constants.PROTOCOL.BLOOD_SEND,[max_value,min_value])
-                                    EventMesh.publish(constants.EVENT.STOP_HEART)
-                                    EventMesh.txt_log("auto stop_bp:1")
-                                    
-                            else:
-                                self.bpauto_state = 0
-                        else:
-                            self.bp_timeSecond = 0
-                            self.bpauto_state = 0
-                            bp_state = EventMesh.publish("get_bp_state")#心率
-                            if bp_state == 2:
-                                EventMesh.publish("set_bp_state",0)#2代表后台进入测试
-                                EventMesh.debug_log("bp stop debug3")
-                                EventMesh.txt_log("auto wear stop_bp:2 ")
-                                # EventMesh.publish("stop_led_timer")#设置参数
-                                EventMesh.publish(constants.EVENT.STOP_HEART)
-
-
-
-                    bg_time = {}
-                    bg_time = EventMesh.publish("get_bgauto_time")
-                    if bg_time[0] != None:
-                    
-                        bg_btn = int(bg_time[0])
-                        bg_timer = int(bg_time[1]) 
-                        # print("state bg2",self.bg_btn,self.bg_timer)
-                        if bg_btn >= 1 and bg_timer > 0:#开关打开并且时间大于0就可以测试血糖
-                            get_hr_state = EventMesh.publish("get_hr_state")
-                            get_spo2_state = EventMesh.publish("get_spo2_state")
-                            get_bp_state  = EventMesh.publish("get_bp_state")
-                            get_bg_state  = EventMesh.publish("get_bg_state")
-                            # print("state bg2",get_hr_state,get_spo2_state,get_bp_state,get_bg_state)
-                            
-                            if (get_hr_state == 0 and get_spo2_state == 0 and get_bp_state == 0) and (get_bg_state == 2 or get_bg_state == 0):#心率血压血氧不在测试就测试血糖自动测量
-                                if (time_tmp-self.bg_timeSecond) >= bg_timer:#大于一个周期的时间,保存的时间戳时间 1678 0 1678 30 1678 
-                                    self.bg_timeSecond = time_tmp #1780 
-                                    self.BG_state = 0
-                                # print("time_tmp bg",time_tmp,self.bg_timeSecond,time_tmp-self.bg_timeSecond,bg_timer,self.BG_state)
-                                if (time_tmp - self.bg_timeSecond) == 0 and self.BG_state == 0:
-                                    EventMesh.debug_log("START_bg:1")
-                                    EventMesh.txt_log("auto START_bg:1")
-                                    EventMesh.publish("set_bg_state",2)#2代表后台进入测试
-                                    # EventMesh.publish("set_hr_blood_led",1)
-                                    EventMesh.publish(constants.EVENT.START_HEART)
-                                    self.BG_state = 1
-                                elif (time_tmp - self.bg_timeSecond) >= 60 and self.BG_state == 1 and get_bg_state == 2:
-                                    self.BG_state = 0
-                                    EventMesh.publish("set_bg_state",0)#2代表后台进入测试
-                                    # EventMesh.publish("stop_led_timer")#设置参数
-                                    EventMesh.txt_log("auto stop_bg:1")
-                                    EventMesh.debug_log("stop bgdebug3")
-                                    EventMesh.publish(constants.EVENT.STOP_HEART)
-                                    bgdata = get_blood_sugar_value()
-                                    if bgdata == None:
-                                        bgdata = 0
-                                    if bgdata != 0:
-                                        EventMesh.debug_log("bgdata",bgdata)
-                                        EventMesh.publish(constants.PROTOCOL.BLOODGLUSOCE_SEND,bgdata)#上传心率数据
-                                    
-                            else:
-                                
-                                self.BG_state = 0
-                        else:
-                            bg_state  = EventMesh.publish("get_bg_state") 
-                            if bg_state == 2:
-                                EventMesh.publish("set_bg_state",0)#2代表后台进入测试
-                                # EventMesh.publish("stop_led_timer")#设置参数
-                                EventMesh.debug_log("bg stop bgdebug3")
-                                EventMesh.txt_log("auto wear stop_bg:2 ")
-                                EventMesh.publish(constants.EVENT.STOP_HEART)
-                            self.bg_timeSecond = 0
-                            self.BG_state = 0
-                    
-                else:
-                    self.old_temp_time = 0
-                    self.old_time = 0
-                    # self.hr_timeSecond = time_tmp
-                    self.HR_Onestate = 0
-                    self.HR_OneTime = 0
-                    self.HR_state = 0
-                    self.old_time = 0    
-                    self.old_bp_time = 0
-                    self.old_hr_time = 0
-                    self.old_spo2_time = 0
-                    self.set_hsenor_crt = 0
-                    self.old_bg_time = 0
-                    # self.bg_timeSecond = time_tmp
-                    self.BG_state = 0
-                    # self.temp_timeSecond = time_tmp
-
-                    # self.bp_timeSecond = time_tmp
-                    self.bpauto_state = 0
-
-                    # self.spo2_timeSecond = time_tmp
-                    self.spo2auto_state = 0
-
-                    self.temp_state = 0
-                    self.temp_one_state = 0
-
-            else:
-                self.old_temp_time = 0
-                self.old_time = 0
-                # self.hr_timeSecond = time_tmp
-                self.HR_Onestate = 0
-                self.HR_OneTime = 0
-                self.HR_state = 0
-                self.old_time = 0    
-                self.old_bp_time = 0
-                self.old_hr_time = 0
-                self.old_spo2_time = 0
-                self.set_hsenor_crt = 0
-                self.old_bg_time = 0
-                # self.bg_timeSecond = time_tmp
-
-                self.BG_state = 0
-                # self.temp_timeSecond = time_tmp
-
-                # self.bp_timeSecond = time_tmp
-                self.bpauto_state = 0
-
-                # self.spo2_timeSecond = time_tmp
-                self.spo2auto_state = 0
-
-                self.temp_state = 0
-                self.temp_one_state = 0
-
-                get_hr_state = EventMesh.publish("get_hr_state")
-                get_spo2_state = EventMesh.publish("get_spo2_state")
-                get_bp_state  = EventMesh.publish("get_bp_state")
-                get_bg_state  = EventMesh.publish("get_bg_state")
-                if get_hr_state != None and get_spo2_state != None and get_bp_state != None and get_bg_state != None:
-                    if get_hr_state > 1:
-                        EventMesh.txt_log("auto stop_hr:44")
-                        EventMesh.publish("set_hr_state",0)#2代表后台进入测试,定时测心率 1ui界面测试洗心率 
-                        # if get_hr_state == 3:
-                        #     EventMesh.publish("stop_led_timer")#设置参数
-                        EventMesh.debug_log("stop debug8")
-                        if WEAR == 1:
-                            heart_value = EventMesh.publish(constants.EVENT.GET_HEART)
-                            if heart_value >= 50 and heart_value != None:
-                                EventMesh.publish(constants.PROTOCOL.HEART_SEND,heart_value)#上传心率数据
-                        EventMesh.publish(constants.EVENT.STOP_HEART) 
-                    elif get_spo2_state > 1:
-                        EventMesh.txt_log("auto stop_spo2:44")
-                        EventMesh.publish("set_spo2_state",0)#2代表后台进入测试
-                        # if get_spo2_state == 3:
-                        #     EventMesh.publish("stop_led_timer")#设置参数
-                        if WEAR == 1:
-                            spo2_value = EventMesh.publish(constants.EVENT.GET_BLOOD_OXYGEN)
-                            if spo2_value > 85 and spo2_value != None:
-                                EventMesh.publish(constants.PROTOCOL.OXYGEN_SEND,spo2_value)
-                        EventMesh.publish(constants.EVENT.STOP_BLOOD_OXYGEN)
-                        EventMesh.debug_log("stop debug13")
-                    elif get_bp_state > 1:
-                        EventMesh.txt_log("auto stop_bp:44")
-                        EventMesh.publish("set_bp_state",0)#2代表后台进入测试
-                        # if get_bp_state == 3:
-                        #     EventMesh.publish("stop_led_timer")#设置参数
-                        if WEAR == 1:
-                            blood_data = get_autoblood_value()
-                            if blood_data == None:
-                                blood_data[0] = 0
-                                blood_data[1] = 0
-
-                            max_value = blood_data[0]
-                            min_value = blood_data[1]
-                            if max_value != 0 and min_value != 0:
-                                EventMesh.publish(constants.PROTOCOL.BLOOD_SEND,[max_value,min_value])
-                        EventMesh.publish(constants.EVENT.STOP_HEART)
-                        EventMesh.debug_log("stop debug14")
-                    elif get_bg_state > 1:
-                        EventMesh.txt_log("auto stop_bg:44")
-                        EventMesh.publish("set_bg_state",0)#2代表后台进入测试
-                        # if get_bg_state == 3:
-                        #     EventMesh.publish("stop_led_timer")#设置参数
-                        EventMesh.publish(constants.EVENT.STOP_HEART)
-                        if WEAR == 1:
-                            bgdata = get_blood_sugar_value()
-                            if bgdata == None:
-                                bgdata = 0
-                            if bgdata != 0:
-                                EventMesh.publish(constants.PROTOCOL.BLOODGLUSOCE_SEND,bgdata)#上传心率数据
-                        EventMesh.debug_log("stop debug15")
-                get_temp_state  = EventMesh.publish("get_temp_state")
-                if get_temp_state != None:
-                    if get_temp_state > 1:
-                        self.temp_one_state = 0
-                        self.temp_state = 0
-                        temp = EventMesh.publish(constants.EVENT.GET_TEMP)       
-                        temp = self.optimize_temp(temp)
-                        EventMesh.txt_log("auto stop_temp:44")
-                        EventMesh.publish("set_temp_state",0)
-                        if WEAR == 1:
-                            tmp_f_tmp = 0
-                            tmp_d_tmp = 0
-                            if str(temp).find(".") != -1:
-                                tmp_f = str(temp).split('.')[0] 
-                                tmp_f_tmp = int(tmp_f)
-                                
-                                tmp_d = str(temp).split('.')[1][:1]
-                                tmp_d_tmp = int(tmp_d)
-                            else:
-                                tmp_f_tmp = temp
-                                
-                            if temp != None:
-                                if temp != 0:
-                                    EventMesh.publish(constants.PROTOCOL.TEMP_SEND,[tmp_f_tmp,tmp_d_tmp])
-                        EventMesh.publish(constants.EVENT.STOP_TEMP)
-
-            
-
-
-            hr_state = EventMesh.publish("get_hr_state")
-            spo2_state = EventMesh.publish("get_spo2_state")
-            temp_state  = EventMesh.publish("get_temp_state")
-            if hr_state != None or spo2_state != None or temp_state != None:#手动测试
-                auto_hr = EventMesh.publish("get_start_measure_time")#设置开始测量的时间戳时间
-                if auto_hr == None:
-                    auto_hr = 0
-                if hr_state == 1:
-                    if auto_hr != 0:
-                        self.auto_hr_count+=1
-                        if  self.auto_hr_count > 6:
-                            self.auto_hr_count = 0
-                            EventMesh.publish("set_hr_state",0)#0代表g关闭测试
-                            EventMesh.debug_log("stop debug7")
-                            EventMesh.publish(constants.EVENT.STOP_HEART)
-                            heart_value = EventMesh.publish(constants.EVENT.GET_HEART)
-                            if heart_value >= 50 and heart_value != None:
-                                EventMesh.publish("play_hr_value",heart_value)
-                                # EventMesh.publish("set_history_hr_value",heart_value)
-                                EventMesh.publish(constants.PROTOCOL.HEART_SEND,heart_value)#上传心率数据
-
-                            else:
-                                EventMesh.publish("play_hr_value",0) 
-                            
-                            
-
-                        else :
-                            if WEAR != 1:
-                                EventMesh.publish("set_hr_state",0)#0代表g关闭测试
-                                EventMesh.debug_log("stop debug7")
-                                EventMesh.publish(constants.EVENT.STOP_HEART)                               
-                                EventMesh.publish("play_hr_value",0) 
-                                
-                else:
-                    self.auto_hr_count = 0
-                    
-
-                auto_spo2 = EventMesh.publish("get_start_measure_time")#设置开始测量的时间戳时间
-                if auto_spo2 == None:
-                    auto_spo2 = 0
-                if spo2_state == 1:#手动测试血氧
-                    if auto_spo2 != None:
-                        if auto_spo2 != 0:
-                            self.auto_spo2_count+=1
-                            if self.auto_spo2_count > 6:
-                                self.auto_spo2_count = 0
-                                EventMesh.publish("set_spo2_state",0)#0代表g关闭测试
-                                EventMesh.debug_log("stop spo2 debug7")
-                                EventMesh.publish(constants.EVENT.STOP_BLOOD_OXYGEN)
-                                spo2_value = EventMesh.publish(constants.EVENT.GET_BLOOD_OXYGEN)
-                                if spo2_value > 85 and spo2_value != None:
-                                    EventMesh.publish("play_spo2_value",spo2_value)
-                                    EventMesh.publish("set_old_spo2_data",spo2_value)
-                                    EventMesh.publish(constants.PROTOCOL.OXYGEN_SEND,spo2_value)
-                                else:
-                                    EventMesh.publish("play_spo2_value",0)
-                            
-                            else:
-                                if WEAR != 1:
-                                    EventMesh.publish("set_spo2_state",0)#0代表g关闭测试
-                                    EventMesh.debug_log("stop debug8")
-                                    EventMesh.publish(constants.EVENT.STOP_BLOOD_OXYGEN)                               
-                                    EventMesh.publish("play_spo2_value",0) 
-                                    
-                else:
-                    self.auto_spo2_count = 0
-
-                if temp_state == 1:#手动测试体温
-                    auto_temp = EventMesh.publish("get_start_temp_measure_time")#设置开始测量的时间戳时间
-                    if auto_temp == None:
-                        auto_temp = 0
-                    if auto_temp != None:
-                        if auto_temp != 0:
-                            self.auto_temp_count += 1
-                            if self.auto_temp_count > 6:
-                                self.auto_temp_count = 0
-                                EventMesh.debug_log("体温测量结束")
-                                temp = EventMesh.publish(constants.EVENT.GET_TEMP)       
-                                temp = self.optimize_temp(temp)
-                                EventMesh.debug_log("temp",temp)
-                                EventMesh.publish("set_temp_state",0)
-                                tmp_f_tmp = 0
-                                tmp_d_tmp = 0
-                                if str(temp).find(".") != -1:
-                                    tmp_f = str(temp).split('.')[0] 
-                                    tmp_f_tmp = int(tmp_f)
-                                    
-                                    tmp_d = str(temp).split('.')[1][:1]
-                                    tmp_d_tmp = int(tmp_d)
-                                else:
-                                    tmp_f_tmp = temp
-                                    
-                                if temp != None:
-                                    if temp != 0:
-                                        # EventMesh.publish("set_history_temp_value",temp)
-                                        EventMesh.publish("play_temp_value",temp)#播放体温数值
-                                        EventMesh.publish(constants.PROTOCOL.TEMP_SEND,[tmp_f_tmp,tmp_d_tmp])
-                                    else:
-                                        # EventMesh.publish("set_history_temp_value",0)
-                                        EventMesh.publish("play_temp_value",0)#播放体温数值
-                                
-                                EventMesh.publish(constants.EVENT.STOP_TEMP)
-
-                            else :
-                                if WEAR  != 1:
-                                    EventMesh.publish("set_temp_state",0)#0代表g关闭测试
-                                    EventMesh.debug_log("stop debug9")
-                                    EventMesh.publish(constants.EVENT.STOP_TEMP)                               
-                                    EventMesh.publish("play_temp_value",0) 
-                                    
-                else:
-                    self.auto_temp_count = 0
-
-            EventMesh.publish("play_unread_wechat_infor")#每10s检测是否有未读语音数据
-
-            usb_state = EventMesh.publish("get_usb")#
-            
-
-            if battery[0] == '1':
-                # EventMesh.debug_log("battery[1]",battery[1])
-                if self.vbat_full_flag <= 120:
-                    self.vbat_full_flag+=10
-                    if self.vbat_full_flag == 60:#开机检测一次如果是充电标识为1就不再提示
-                        if usb_state != 1:
-                            EventMesh.publish("set_usb",1)#
-                else:
-                    if battery[1] >= 100:
-                        if self.charge_full_count == 0:#充电已满
-                            EventMesh.publish("set_usb",3)#
-                            EventMesh.debug_log("charge R_CHARGE_full")
-                            self.charge_full_count = 1
-                    
-            else:
-                self.charge_full_count = 0
-                low_power = battery[1]
-                if low_power <= 5:#小于5%红色灯慢闪
-                    EventMesh.publish("set_led_time_arg",[1,2,20*11,led_mode.FLASH_LIGHT_RED,20,10,led_mode.OTHER_MEASURE_MODE])#測量成功
-                    # EventMesh.publish("set_led_time_arg",[1000,400,52,led_mode.FLASH_LIGHT_RED,led_mode.DEFAULT_LONG_LIGHT_MODE,led_mode.OTHER_MEASURE_MODE])#開始測量
-
-            
-            self.normal_alarm()
-            #喝水提醒
-            self.drink_alarm()
-            #该吃药了
-            self.medicine_alarm()
-            #该起床了
-            self.wakeup_alarm()
-            #该睡觉了
-            self.sleep_alarm()
-            #该回家了
-            self.home_alarm()
-            #该休息了
-            self.reset_alarm()
-
-
-            if self.alarm_flag == 0:
-                self.alarm_flag = 1
-                EventMesh.publish("set_rtc_alarm")
-
-        def clear_usb_flag(self,event,msg):
-            self.charge_full_count = 0
-        #普通闹钟
-        def normal_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.normal_oldtotalmin",self.normal_oldtotalmin,cur_total_min,self.alarm_flag)
-            if self.normal_oldtotalmin == 0:
-                self.normal_oldtotalmin = cur_total_min #549
-            if self.normal_oldtotalmin != cur_total_min: #上次响过的闹钟分钟数不等于当前的分钟数据需要清零否则下一个不会响铃
-                if self.normal_flag == 1:
-                    self.normal_flag = 0
-                    self.normal_count = 0
-            normal_alarm = []
-            normal_alarm = EventMesh.publish("get_storage_config","normal_alarm")
-            # EventMesh.debug_log("sleep info2",sleep,cur_total_min)
-            if self.normal_flag == 1:#表示闹钟响过清除标志
-                self.normal_count+=1
-                if self.normal_count > 6:
-                    self.normal_count = 0
-                    self.normal_flag = 0
-            if normal_alarm != None:
-                if len(normal_alarm) != 0 and normal_alarm != []:
-                    j = 0
-                    for i in range(len(normal_alarm)):
-                        # EventMesh.debug_log("normal_alarm normal_alarm 33",normal_alarm,j)
-                        normalalarm_hour = normal_alarm[j]["hour"]
-                        normalalarm_min = normal_alarm[j]["min"]
-                        normalalarm_day = normal_alarm[j]["day"]
-                        normalalarm_enale = normal_alarm[j]["enable"]
-                        normalalarm_totalmin = int(normalalarm_hour)*60+int(normalalarm_min)
-                        # EventMesh.debug_log("wake alarm",normalalarm_hour,sleep_min,sleep_day,sleep_enale,sleep_totalmin,week)
-                        if normalalarm_day == []:#单次闹钟只响一次
-                            if normalalarm_enale != 0:
-                                if cur_total_min > normalalarm_totalmin:
-                                    normal_alarm.pop(j)
-                                    self.normal_count = 0
-                                    self.normal_flag  = 0 
-                                    j=0
-                                    # EventMesh.debug_log("wakeup wakeup dayu",sleep,j)
-                                    EventMesh.publish("set_storage_config",["normal_alarm",normal_alarm])#删除之后重新保存
-                                    # sleep = EventMesh.publish("get_storage_config","sleep_alarm")#删除之后重新保存
-                                    continue
-                                else:
-                                    if normalalarm_totalmin == cur_total_min and self.normal_flag == 0:#14:00
-                                        self.normal_count = 0
-                                        self.normal_flag  = 0    
-                                        normal_alarm.pop(j)
-                                        # EventMesh.debug_log("wakeup wakeup1",sleep,j)
-                                        EventMesh.publish("set_storage_config",["normal_alarm",normal_alarm])#删除之后重新保存
-                                        EventMesh.publish("OPEN_ALARM_RING")                                                                                                                                            
-                                        break
-                        else:
-                            if normalalarm_enale != 0 and (week in normalalarm_day):#记录响过的时间分钟数
-                                if normalalarm_totalmin == cur_total_min and self.normal_flag == 0:#14:00
-                                    self.normal_flag  = 1
-                                    self.normal_count = 0
-                                    self.normal_oldtotalmin = normalalarm_totalmin
-                                    EventMesh.publish("OPEN_ALARM_RING")#                                                                                                                                                  
-                                    break
-                        j+=1
-
-
-        #喝水提醒
-        def drink_alarm(self):
-            date_tmp = utime.localtime()
-            time_tmp = utime.mktime(date_tmp)
-        
-            if self.drink_time == 0:
-                self.drink_time = time_tmp
-            
-            on = EventMesh.publish("get_storage_config","drink_on")
-            time = EventMesh.publish("get_storage_config","drink_time")
-            # print("drink info2",on,time)
-            if on != None and time != None:
-                if on != 0 and time != 0:
-                    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:
-                self.drink_time = 0
-
-        #吃药提醒
-        def medicine_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)
-            # print("self.medicine_oldtotalmin",self.medicine_oldtotalmin,cur_total_min,self.alarm_flag)
-            if self.medicine_oldtotalmin == 0:
-                self.medicine_oldtotalmin = cur_total_min #549
-            if self.medicine_oldtotalmin != cur_total_min: #上次响过的闹钟分钟数不等于当前的分钟数据需要清零否则下一个不会响铃
-                if self.medicine_flag == 1:
-                    self.medicine_flag = 0
-                    self.medicine_count = 0
-            medicine = EventMesh.publish("get_storage_config","medicine")
-            # print("medicine info2",medicine,cur_total_min)
-            if self.medicine_flag == 1:#表示闹钟响过清除标志
-                self.medicine_count+=1
-                if self.medicine_count > 6:
-                    self.medicine_count = 0
-                    self.medicine_flag = 0
-            if medicine != None:
-                if len(medicine) != 0 and medicine != []:
-                    for i in range(len(medicine)):
-                        medicine_hour = medicine[i]["hour"]
-                        medicine_min = medicine[i]["min"]
-                        medicine_day = medicine[i]["day"]
-                        medicine_enale = medicine[i]["enable"]
-                        medicine_totalmin = int(medicine_hour)*60+int(medicine_min)
-                        # print("medicine alarm",medicine_hour,medicine_min,medicine_day,medicine_enale,medicine_totalmin,week)
-                        if medicine_day == []:
-                            if medicine_enale != 0:
-                                if medicine_totalmin == cur_total_min and self.medicine_flag == 0:#14:00
-                                    self.medicine_count = 0
-                                    self.medicine_flag  = 1    
-                                    self.medicine_oldtotalmin = medicine_totalmin#记录响过的时间分钟数
-                                    # print("medicine alarm1")
-                                    EventMesh.publish("medicine_alarm_event")#该吃药了                                                                                                                                              
-                                    break
-                        else:
-                            if medicine_enale != 0 and (week in medicine_day):#记录响过的时间分钟数
-                                if medicine_totalmin == cur_total_min and self.medicine_flag == 0:#14:00
-                                    self.medicine_flag  = 1
-                                    self.medicine_count = 0
-                                    self.medicine_oldtotalmin = medicine_totalmin
-                                    # print("medicine alarm2",)
-                                    EventMesh.publish("medicine_alarm_event")#该吃药了                                                                                                                                                   
-                                    break
-        #该起床了
-        def wakeup_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.wakeup_oldtotalmin",self.wakeup_oldtotalmin,cur_total_min,self.alarm_flag)
-            if self.wakeup_oldtotalmin == 0:
-                self.wakeup_oldtotalmin = cur_total_min #549
-            if self.wakeup_oldtotalmin != cur_total_min: #上次响过的闹钟分钟数不等于当前的分钟数据需要清零否则下一个不会响铃
-                if self.wakeup_flag == 1:
-                    self.wakeup_flag = 0
-                    self.wakeup_count = 0
-            wakeup = []
-            wakeup = EventMesh.publish("get_storage_config","wakeup_alarm")
-            # EventMesh.debug_log("wakeup info2",wakeup,cur_total_min)
-            if self.wakeup_flag == 1:#表示闹钟响过清除标志
-                self.wakeup_count+=1
-                if self.wakeup_count > 6:
-                    self.wakeup_count = 0
-                    self.wakeup_flag = 0
-            if wakeup != None:
-                if len(wakeup) != 0 and wakeup != []:
-                    j = 0
-                    for i in range(len(wakeup)):
-                        wakeup_hour = wakeup[j]["hour"]
-                        wakeup_min = wakeup[j]["min"]
-                        wakeup_day = wakeup[j]["day"]
-                        wakeup_enale = wakeup[j]["enable"]
-                        wakeup_totalmin = int(wakeup_hour)*60+int(wakeup_min)
-                        # EventMesh.debug_log("wake alarm",wakeup_hour,wakeup_min,wakeup_day,wakeup_enale,wakeup_totalmin,week)
-                        if wakeup_day == []:#单次闹钟只响一次
-                            if wakeup_enale != 0:
-                                if cur_total_min > wakeup_totalmin:
-                                    self.wakeup_count = 0
-                                    self.wakeup_flag  = 0    
-                                    wakeup.pop(j)
-                                    j=0#每次删除都从0开始遍历
-                                    # EventMesh.debug_log("wakeup wakeup1 dayu",wakeup,j)
-                                    EventMesh.publish("set_storage_config",["wakeup_alarm",wakeup])
-                                    continue
-                                else:
-                                    if wakeup_totalmin == cur_total_min and self.wakeup_flag == 0:#14:00
-                                        self.wakeup_count = 0
-                                        self.wakeup_flag  = 0    
-                                        wakeup.pop(j)
-                                        EventMesh.debug_log("wakeup wakeup1",wakeup,j)
-                                        EventMesh.publish("set_storage_config",["wakeup_alarm",wakeup])
-                                        EventMesh.publish("wakeup_alarm_event")#该吃药了                                                                                                                                              
-                                        break
-                        else:
-                            if wakeup_enale != 0 and (week in wakeup_day):#记录响过的时间分钟数
-                                if wakeup_totalmin == cur_total_min and self.wakeup_flag == 0:#14:00
-                                    self.wakeup_flag  = 1
-                                    self.wakeup_count = 0
-                                    self.wakeup_oldtotalmin = wakeup_totalmin
-                                    EventMesh.publish("wakeup_alarm_event")#该吃药了                                                                                                                                                   
-                                    break
-                        j+=1
-
-
-        #该睡觉了
-        def sleep_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.sleep_oldtotalmin",self.sleep_oldtotalmin,cur_total_min,self.alarm_flag)
-            if self.sleep_oldtotalmin == 0:
-                self.sleep_oldtotalmin = cur_total_min #549
-            if self.sleep_oldtotalmin != cur_total_min: #上次响过的闹钟分钟数不等于当前的分钟数据需要清零否则下一个不会响铃
-                if self.sleep_flag == 1:
-                    self.sleep_flag = 0
-                    self.sleep_count = 0
-            sleep = []
-            sleep = EventMesh.publish("get_storage_config","sleep_alarm")
-            # EventMesh.debug_log("sleep info2",sleep,cur_total_min)
-            if self.sleep_flag == 1:#表示闹钟响过清除标志
-                self.sleep_count+=1
-                if self.sleep_count > 6:
-                    self.sleep_count = 0
-                    self.sleep_flag = 0
-            if sleep != None:
-                if len(sleep) != 0 and sleep != []:
-                    j = 0
-                    count = int(len(sleep))
-                    for i in range(len(sleep)):
-                        # EventMesh.debug_log("wakeup wakeup 33",sleep,j)
-                        sleep_hour = sleep[j]["hour"]
-                        sleep_min = sleep[j]["min"]
-                        sleep_day = sleep[j]["day"]
-                        sleep_enale = sleep[j]["enable"]
-                        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 == []:#单次闹钟只响一次
-                            if sleep_enale != 0:
-                                if cur_total_min > sleep_totalmin:
-                                    sleep.pop(j)
-                                    self.sleep_count = 0
-                                    self.sleep_flag  = 0 
-                                    j=0
-                                    # EventMesh.debug_log("wakeup wakeup dayu",sleep,j)
-                                    EventMesh.publish("set_storage_config",["sleep_alarm",sleep])#删除之后重新保存
-                                    # sleep = EventMesh.publish("get_storage_config","sleep_alarm")#删除之后重新保存
-                                    continue
-                                else:
-                                    if sleep_totalmin == cur_total_min and self.sleep_flag == 0:#14:00
-                                        self.sleep_count = 0
-                                        self.sleep_flag  = 0    
-                                        sleep.pop(j)
-                                        # EventMesh.debug_log("wakeup wakeup1",sleep,j)
-                                        EventMesh.publish("set_storage_config",["sleep_alarm",sleep])#删除之后重新保存
-                                        EventMesh.publish("sleep_alarm_event")#该吃药了                                                                                                                                              
-                                        break
-                        else:
-                            if sleep_enale != 0 and (week in sleep_day):#记录响过的时间分钟数
-                                if sleep_totalmin == cur_total_min and self.sleep_flag == 0:#14:00
-                                    self.sleep_flag  = 1
-                                    self.sleep_count = 0
-                                    self.sleep_oldtotalmin = sleep_totalmin
-                                    EventMesh.publish("sleep_alarm_event")#该吃药了                                                                                                                                                   
-                                    break
-                        j+=1
-
-
-        #该回家了
-        def home_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.home_oldtotalmin",self.home_oldtotalmin,cur_total_min,self.alarm_flag)
-            if self.home_oldtotalmin == 0:
-                self.home_oldtotalmin = cur_total_min #549
-            if self.home_oldtotalmin != cur_total_min: #上次响过的闹钟分钟数不等于当前的分钟数据需要清零否则下一个不会响铃
-                if self.home_flag == 1:
-                    self.home_flag = 0
-                    self.home_count = 0
-            home = ''
-            home = EventMesh.publish("get_storage_config","home_alarm")
-            # EventMesh.debug_log("sleep info2",sleep,cur_total_min)
-            if self.home_flag == 1:#表示闹钟响过清除标志
-                self.home_count+=1
-                if self.home_count > 6:
-                    self.home_count = 0
-                    self.home_flag = 0
-            if home != None:
-                if len(str(home)) != 0 and str(home) != '':
-                    # EventMesh.debug_log("home home 33",home)
-                    home_hour = int(str(home).split(":")[0])
-                    home_min = int(str(home).split(":")[1])
-                    
-                    home_totalmin = int(home_hour)*60+int(home_min)
-                    if home_totalmin == cur_total_min and self.home_flag == 0:#14:00
-                        self.home_flag  = 1
-                        self.home_count = 0
-                        self.home_oldtotalmin = home_totalmin
-                        EventMesh.publish("home_alarm_event")#该回家了                                                                                                                                                   
-
-
-        
-        #该休息了
-        def reset_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.reset_oldtotalmin",self.reset_oldtotalmin,cur_total_min,self.alarm_flag)
-            if self.reset_oldtotalmin == 0:
-                self.reset_oldtotalmin = cur_total_min #549
-            if self.reset_oldtotalmin != cur_total_min: #上次响过的闹钟分钟数不等于当前的分钟数据需要清零否则下一个不会响铃
-                if self.reset_flag == 1:
-                    self.reset_flag = 0
-                    self.reset_count = 0
-            reset_alarm = []
-            reset_alarm = EventMesh.publish("get_storage_config","reset_alarm")
-            # EventMesh.debug_log("reset_alarm info2",len(reset_alarm),cur_total_min)
-            if self.reset_flag == 1:#表示闹钟响过清除标志
-                self.reset_count+=1
-                if self.reset_count > 6:
-                    self.reset_count = 0
-                    self.reset_flag = 0
-            if reset_alarm != None:
-                if len(str(reset_alarm)) != 0 and str(reset_alarm) != []:
-                    for i in range(len(reset_alarm)):
-                        # print("i",i)
-                        start_hour = int(reset_alarm[i]["start_hour"])
-                        start_min = int(reset_alarm[i]["start_min"])
-
-                        end_hour = int(reset_alarm[i]["end_hour"])
-                        end_min = int(reset_alarm[i]["end_min"])
-
-                        # EventMesh.debug_log("reset_alarm home 33",reset_alarm)
-                        
-                        start_totalmin = int(start_hour)*60+int(start_min)
-                        end_totalmin = int(end_hour)*60+int(end_min)
-
-                        if start_totalmin == cur_total_min and self.reset_flag == 0:#14:00
-                            self.reset_flag  = 1
-                            self.reset_count = 0
-                            self.reset_oldtotalmin = start_totalmin
-                            EventMesh.publish("reset_alarm_event")#该休息了     
-                            break
-
-                        if end_totalmin == cur_total_min and self.reset_flag == 0:
-                            self.reset_flag  = 1
-                            self.reset_count = 0
-                            self.reset_oldtotalmin = end_totalmin
-                            EventMesh.publish("reset_end_alarm_event")#休息结束了     
-                            break
-                                                                                                                                                                    
-
-        def clear_normal_alarm(self,event,msg):#普通闹钟清除标志
-            self.normal_flag = 0
-            self.normal_count = 0
-            self.normal_oldtotalmin = 0
-
-        def clear_reset_alarm(self,event,msg):#休息清除标志
-            self.reset_flag = 0
-            self.reset_count = 0
-            self.reset_oldtotalmin = 0
-
-        def clear_home_alarm(self,event,msg):#回家清除标志
-            self.home_flag = 0
-            self.home_count = 0
-            self.home_oldtotalmin = 0
-
-
-        def clear_medicine_alarm(self,event,msg):#吃药清除标志
-            self.medicine_count = 0
-            self.medicine_flag  = 0
-            self.medicine_oldtotalmin = 0
-        
-
-        def clear_wakeup_alarm(self,event,msg):#起床标识
-            self.wakeup_flag = 0
-            self.wakeup_count = 0
-            self.wakeup_oldtotalmin = 0
-
-        def clear_sleep_alarm(self,event,msg):#睡觉标识
-
-            self.sleep_flag = 0
-            self.sleep_count = 0
-            self.sleep_oldtotalmin = 0
-
-            
-
-
-        def get_sim_Status(self, event, msg):
-            return sim.getStatus()
-        def get_device_ope(self, event, msg):
-            """
-            获取设备运营商信息
-            :param event:
-            :param msg:
-            :return: 运营商
-            """
-            net_ope_map = {
-                "UNICOM": "中国联通HD",
-                "CMCC": "中国移动HD",
-                "CT": "中国电信HD"
-            }
-            """获取运营商"""
-            try:
-                short_eons = net.operatorName()[1]
-            except Exception:
-                return "无"
-            return net_ope_map.get(short_eons, None)
-
-        def get_signal(self, event=None, msg=None):
-            """
-            获取信号事件
-            :param event:
-            :param msg:
-            :return: int 类型
-            """
-            return net.csqQueryPoll()
-
-        def get_time_bucket(self, time):
-            if time < 12:
-                return '上午'
-            else:
-                return '下午'
-
-        def get_week(self, week):
-            if week == 1:
-                return '一'
-            elif week == 2:
-                return '二'
-            elif week == 3:
-                return '三'
-            elif week == 4:
-                return '四'
-            elif week == 5:
-                return '五'
-            elif week == 6:
-                return '六'
-            elif week == 7 or week == 0:
-                return '日'
-
-        def get_time(self, event=None, msg=None):
-            """
-            获取时间事件
-            :param event:
-            :param msg:
-            :return: HH:MM 格式
-            """
-            rtc_time = self.rtc.datetime()
-            
-            date = ("%d月%d日" % (rtc_time[1], rtc_time[2]))
-            year = ("%04d年" % (rtc_time[0]))
-            week = ("星期%s"%(self.get_week(rtc_time[3])))
-            week_data = rtc_time[3]
-            time = [rtc_time[4], rtc_time[5]]
-            time_quantum = ("%s" % (self.get_time_bucket(rtc_time[4])))
-            
-            result = [time, time_quantum, date , week,year,week_data]
-            #时分,上午下午,日期,星期,年 星期
-            return result
-
-        def get_step_count(self, event=None, msg=None):
-            """
-            获取步数
-            """
-            # print("11111:{}".format(EventMesh.publish("get_storage_config","clear_state3")))
-            XYZ = self.gsensor.get_x_y_z()
-            tmp = 0
-            step =[0,0,0,0]
-            tmp =  self.gsensor.get_step() 
-            # EventMesh.debug_log("x:%d,y:%d,z:%d tmp %d",XYZ[0],XYZ[1],XYZ[2],tmp)
-            step[0]= tmp 
-            step[1] = XYZ[0]
-            step[2] = XYZ[1]
-            step[3] = XYZ[2]
-            # print("1222:{}".format(EventMesh.publish("get_storage_config","clear_state3")))
-            return step
-
-        def get_ic_cid(self, event, msg):
-            """
-            获取ic cid事件
-            :param event:
-            :param msg:
-            :return: str ic cid
-            """
-            return sim.getIccid()
-
-        def get_phone_num(self, event, msg):
-            """
-            获取电话号码事件
-            :param event:
-            :param msg:
-            :return: str number
-            """
-            return sim.getPhoneNumber()
-
-        def get_battery(self, event=None, msg=None):
-            """
-            获取电池事件,暂时没支持
-            :param event:
-            :param msg:
-            :return:
-            """
-
-            charge_state = '0'
-            if self.get_usb_state() == 1:
-                charge_state = '1'
-            else:
-                charge_state = '0'
-
-            #temp = Power.getVbatt()
-            temp = EventMesh.publish("get_curr_battery_level")
-            vbat = EventMesh.publish("get_battery",temp)
-            if vbat == None:
-                vbat = 100
-            # EventMesh.debug_log("vbat",vbat)
-            # if temp != None :
-            #     if temp <= 3505:
-            #         vbat = 0 
-            #     elif temp <= 3699:
-            #         vbat = 20 #"E:/vbat_20.jpg"
-            #     elif temp <= 3772:
-            #         vbat = 40 #"E:/vbat_40.jpg"
-            #     elif temp <= 3882:
-            #         vbat = 60 #"E:/vbat_60.jpg"
-            #     elif temp <= 4070:
-            #         vbat = 80 #"E:/vbat_80.jpg"
-            #     elif temp <= 4200:
-            #         vbat = 90 #
-            #     else:
-            #         vbat = 100 #"E:/vbat_100.jpg"
-            # else:
-            #     vbat = 100
-
-            result = [charge_state, vbat]
-
-            return result
-        #Set the current average battery level
-        def set_curr_battery_level(self, event=None, msg=None):
-            self.curr_battery_level = msg
-        
-        def get_curr_battery_level(self, event=None, msg=None):
-            return self.curr_battery_level
-
-        def get_device_fw_version(self, *args):
-            '''
-            获取设备固件版本号
-            '''
-            fw_version = modem.getDevFwVersion()
-            if isinstance(fw_version, str):
-                return fw_version
-            return "--"
-
-        def get_standby_time(self, *args):
-            '''
-            获取设备单次开机待机时间
-            '''
-            time_msg = utime.time()
-            d = int(
-                time_msg / 86400)  # The int call removes the decimals.  Conveniently, it always rounds down.  int(2.9) returns 2 instead of 3, for example.
-            time_msg -= (
-                    d * 86400)  # This updates the value of x to show that the already counted seconds won't be double counted or anything.
-            h = int(time_msg / 3600)
-            time_msg -= (h * 3600)
-            m = int(time_msg / 60)
-            time_msg -= (m * 60)
-            s = time_msg
-            result = "{}天{}小时{}分".format(d, h, m)
-            return result
-
-        def set_key(self, topic, msg):
-            self.key = msg["value"]
-        def get_key(self, topic, msg):
-            return self.key
-
-        def get_imei(self, topic, msg):
-            if not self.imei:
-                self.imei = modem.getDevImei()
-            
-            # self.imei = "860132064231574" #860132060128634
-            return self.imei
-
-        def get_cid(self, topic, msg):
-            return self.cid
-
-        def set_cid(self, topic, msg):
-            self.cid = msg["value"]
-
-        def get_imsi(self, topic, msg):
-            if not self.imei:
-                self.imei = sim.getImsi()
-            return self.imsi
-
-        def get_password(self, topic, msg):
-            return self.password
-
-        def set_password(self, topic, msg):
-            self.password = msg["value"]
-
-        def set_ping(self, topic, msg):
-            self.PING = msg
-        def get_ping(self, topic, msg):
-            return self.PING
-
-        def set_connect(self, topic, msg):
-            #EventMesh.debug_log("set_connect:{}".format(msg))
-            self.connect = msg
-        def get_connect(self, topic, msg):
-            return self.connect
-
-        def start_blood_oxygen(self, topic, msg):
-            EventMesh.debug_log("start_blood_oxygen!!!")
-            self.hsensor.open_blood_oxygen()
-
-        def start_heart(self, topic, msg):
-            EventMesh.debug_log("start_heart!!!")
-            self.hsensor.open_heart()
-
-        def stop_blood_oxygen(self, topic, msg):
-            EventMesh.debug_log("stop_blood_oxygen!!!")
-            self.hsensor.close()
-
-        def stop_heart(self, topic, msg):
-            EventMesh.debug_log("stop_heart!!!")
-            self.hsensor.close()
-
-        def get_blood_oxygen(self, topic, msg):
-            data = self.hsensor.get_all_data()
-            return data[1]
-
-        def get_heart(self, topic, msg):
-            data = self.hsensor.get_all_data()
-            return data[0]
-        
-        def get_wear(self, topic, msg):
-            return self.hsensor.get_wear()
-        
-        def get_Hsensor(self, topic, msg):
-            return self.hsensor
-        
-        def Hsensor_set_sleep(self, topic, msg):
-            self.hsensor.set_sleep()
-
-        def start_temp(self, topic, msg):
-            EventMesh.debug_log("start_temp!!!!!!!")
-            WHO_AM_I = bytearray([0x01, 0])
-            I2C_SLAVE_ADDR = 0x49
-            #I2C_SLAVE_ADDR = 0x48
-            r_data = bytearray(2)
-            data = bytearray([0x61A0, 0])   # 唤醒
-            return self.i2c0.write(I2C_SLAVE_ADDR, WHO_AM_I, 1, data, 2)
-        def stop_temp(self, topic, msg):
-            EventMesh.debug_log("stop_temp!!!!!!!")
-            WHO_AM_I = bytearray([0x01, 0])
-            I2C_SLAVE_ADDR = 0x49
-            #I2C_SLAVE_ADDR = 0x48
-            r_data = bytearray(2)
-            data = bytearray([0x60A0, 0])   #休眠
-            return self.i2c0.write(I2C_SLAVE_ADDR, WHO_AM_I, 1, data, 2)
-            
-        def get_temp(self, topic, msg):
-            WHO_AM_I = bytearray([0x00, 0])
-            I2C_SLAVE_ADDR = 0x49
-            #I2C_SLAVE_ADDR = 0x48
-            r_data = bytearray(2)
-            self.i2c0.read(I2C_SLAVE_ADDR, WHO_AM_I, 1, r_data, 2, 0)
-            #EventMesh.debug_log("temp_data:{}".format(r_data))
-            temp_s = ((r_data[0]<<8) | (r_data[1]))>>4
-            #EventMesh.debug_log("temp_s:{}".format(temp_s))
-            temp_data = temp_s * 0.0625
-            EventMesh.debug_log("temp_data:{}".format(temp_data))
-            return temp_data
-    
-                
-
-        def sim_slot_get(self, topic=None, msg=None):
-            return sim.getCurSimid()
-
-        def sim_slot_switch(self, topic=None, slot=None):
-            """
-            sim 卡槽切换
-            :param topic:
-            :param slot:
-            :return: 切换sim卡卡槽  0 切换成功, 1 无需切换, -1 切换失败
-            """
-            if self.sim_slot_get() == slot:
-                return 1
-            else:
-                return sim.switchCard(slot)
-
-        def usb_event_cb(self, state):
-            status = state
-
-            if status == 1:#插入USB
-                EventMesh.debug_log("charge R_CHARGE_in")
-                EventMesh.publish("clear_usb_flag")
-                EventMesh.publish("set_usb", 1)#
-                pass
-            elif status == 0:#拨出usbs
-                EventMesh.publish("clear_usb_flag")
-                EventMesh.publish("set_usb", 2)#
-                EventMesh.debug_log("charge R_CHARGE_out")
-
-                
-                
-
-        
-
-        def get_usb_state(self):
-            state = self.usb.getStatus()
-            if state == -1:
-                state = 0
-            return state
-        
-
-    def wifiScan_cb(args):
-            EventMesh.publish(constants.EVENT.WIFIINFO, args)
-            wifiScan.control(0)
-
-    class LocationManager(Abstract):
-
-        def __init__(self):
-            self.gps = None
-            #self.match = GPSMatch()
-            self.timer_read_GPS_info = osTimer()
-            self.wifi_data = []
-            self.gps_data  = {}
-            self.cell_data = []
-            self.location_timer_count = 0
-            self.location_check_data_timer_count = 0
-            self.GGA_count = 0
-            self.RMC_A_count = 0
-            self.location_type = 0 #定位类型,0:正常定位,有gps数据或60秒关闭;1:测试模式,只有发CLOSE_LOCATION消息才关闭
-            self.location_flag = 0
-            self.start_location_flag = 0
-            self.location_thread_id  = 0
-            self.location_queue = Queue(100)
-            self.lpm_fd = None
-            self.start_agps = 0
-            read_data = EventMesh.publish("get_storage_config","isOpenGNSS")#获取是否打开GNSS
-            if read_data != None:
-                self.isOpenGNSS = read_data
-            else:#默认关闭GNSS
-                self.isOpenGNSS = "1"
-                EventMesh.publish("set_storage_config",["isOpenGNSS",self.isOpenGNSS])
-
-            self.isOpenGNSS = EventMesh.publish("get_storage_config","isOpenGNSS")
-            if self.isOpenGNSS == None:
-                self.isOpenGNSS = "1"
-            if self.isOpenGNSS == "1":
-                if quecgnss.init() == -1:
-                    self.isOpenGNSS = "0"
-                    EventMesh.publish("set_storage_config",["isOpenGNSS",self.isOpenGNSS])
-                else:
-                    quecgnss.gnssEnable(0)
-        @staticmethod
-        def get_date():
-            return "{:04d}-{:02d}-{:02d}".format(*utime.localtime()[0:3])
-
-        @staticmethod
-        def get_time():
-            return "{:02d}:{:02d}:{:02d}".format(*utime.localtime()[3:6])
-
-        def post_processor_after_instantiation(self):
-            # _gps_cfg = {
-            #     "UARTn": UART.UART1,
-            #     "buadrate": 115200,
-            #     "databits": 8,
-            #     "parity": 0,
-            #     "stopbits": 1,
-            #     "flowctl": 0,
-            #     "PowerPin": Pin.GPIO2,
-            #     "StandbyPin": Pin.GPIO3,
-            #     "BackupPin": None,
-            #     "gps_mode": 0x01,
-            # }
-            # self.gps = GPS(**_gps_cfg)
-            # self.gps.power_switch(0)#关闭GPS
-            EventMesh.subscribe(constants.EVENT.GPSOPEN, self.gps_open)
-            EventMesh.subscribe(constants.EVENT.GPSCLOSE, self.gps_close)
-            EventMesh.subscribe(constants.EVENT.START_LOCATION, self.start_location)
-            EventMesh.subscribe(constants.EVENT.START_LOCATION_TEST, self.start_location_test)
-            EventMesh.subscribe(constants.EVENT.WIFIINFO, self.WIFI_INFO)
-            EventMesh.subscribe(constants.EVENT.WIFISCANOPEN,self.WIFI_scan_open)
-            EventMesh.subscribe(constants.EVENT.CLOSE_LOCATION,self.close_location)
-            EventMesh.subscribe("get_location_flag",self.get_location_flag)
-            
-            #EventMesh.subscribe(constants.EVENT.GPSCLOSE, self.gps_close)
-        def get_location_flag(self, event, msg):
-            return self.location_flag
-        def start_location(self, event, msg):
-            self.location_queue.put(msg)#测试类型入队
-            self.gps_data = {}
-            self.wifi_data = []
-            self.cell_data = []
-            self.location_timer_count = 0
-            self.GSV_sig_ok_count = 0
-            EventMesh.debug_log("start_location:{}".format(msg))
-            if( self.location_flag == 1):
-                return
-            _thread.stack_size((9+5)*1024)
-            self.location_thread_id  = _thread.start_new_thread(self.location_thread, ())
-            _thread.stack_size(8*1024)
-            
-            self.location_flag = 1
-            self.timer_read_GPS_info.start(1000, 1, self.location_timer)
-            #self.gps_open(event, msg)
-
-
-        def start_location_test(self, event, msg):
-            EventMesh.debug_log("start_location_test")
-            
-            self.location_type = 1
-            if( self.location_flag == 1):
-                return
-            _thread.stack_size((9+4)*1024)
-            self.location_thread_id  = _thread.start_new_thread(self.location_thread, ())
-            _thread.stack_size(8*1024)
-        
-            self.location_timer_count = 0
-            self.location_flag = 1
-            #self.gps_open(event, msg)
-            self.location_type = 1
-            self.timer_read_GPS_info.start(1000, 1, self.location_timer)
-    
-
-        def close_location(self, event, msg):
-            self.location_flag = 0
-            self.location_type = 0
-            self.timer_read_GPS_info.stop()
-
-            
-
-        def WIFI_INFO(self, event, msg):
-            self.wifi_data = msg
-            # EventMesh.debug_log("WIFI_INFO:")
-            # EventMesh.debug_log([msg[0],msg])
-
-        def WIFI_scan_open(self, event, msg):
-            #EventMesh.debug_log("WIFI_scan_open")
-            
-
-            if wifiScan.getState() == False :
-                self.wifi_data = []
-                wifiScan.control(1)
-                wifiScan.setCfgParam(6, 2, 5,  0)  #设置WiFi参数,10秒上层,两轮,最多6个,6秒底层,PS优先
-                wifiScan.setCallback(wifiScan_cb) #注册回调函数
-                wifiScan.asyncStart()
-                #EventMesh.debug_log("wifiScan.asyncStart")
-            else :
-                EventMesh.debug_log("WIFI_scan_open:error1") 
-        def gps_open(self, event, msg):
-            if self.isOpenGNSS == "1":
-                #EventMesh.debug_log("publish:gps_open")
-                #quecgnss.init()
-                quecgnss.gnssEnable(2)
-                #self.gps.__gps_nmea_data_clean()
-        def gps_close(self, event, msg):
-            if self.isOpenGNSS == "1":
-                quecgnss.gnssEnable(0)
-        def location_timer(self, *args, **kwargs):
-            
-            self.location_timer_count = self.location_timer_count +1
-            self.location_check_data_timer_count = self.location_check_data_timer_count+1
-
-        def Location_send(self, msg) :
-            EventMesh.debug_log("Location_send1")
-            if self.location_queue.empty() == True:
-                return
-            EventMesh.debug_log("Location_send2")
-            while True:
-                if self.location_queue.empty() == False:
-                    TYPE = self.location_queue.get()
-                    date = "{:04d}{:02d}{:02d},{:02d}{:02d}{:02d}".format(*utime.localtime()[0:6])
-                    date = date[2:]
-                    #date = "180916,025723"
-                    GPS_type = "V"
-                    latitude = "0.000000,N"
-                    longitude = "0.000000,E"
-                    speed = "0.00"
-                    direction = "0.0"
-                    high = "100.0"
-                    number = "0"
-                    precision = "24"
-                    if msg[0] :#有GPS数据
-                        GPS_type = "A"
-                        # 纬度
-                        latitude = msg[0]["latitude"]
-                        # 经度
-                        longitude = msg[0]["longitude"]
-                        # 速度
-                        speed = msg[0]["speed"]
-                        # 方向
-                        direction = "0"
-                        if msg[0]["direction"] :
-                            direction = msg[0]["direction"]
-                        # 高度
-                        high = msg[0]["high"]
-                        high_tmp = high.split(".")
-                        if len(high_tmp) >= 2 :
-                            high = "%s"%(high_tmp[0])
-                        # 讯号质量:搜索到的卫星数目
-                        number = msg[0]["number"]
-                        precision = msg[0]["precision"]
-                        #date = msg[0]["date"]
-                    
-                    #gsm 信号强度
-                    gsm_sig =  str((100//31)*EventMesh.publish("screen_get_sig"))
-                    # 电池电量百分比 
-                    bat_tmp = EventMesh.publish("screen_get_battery")
-                    battery_caption =  str(bat_tmp[1])
-                    #步数
-                    old_step = 0
-                    step = 0
-                    step = EventMesh.publish("get_old_step_value")
-                    if step != 0:
-                        tmp_data  = EventMesh.publish("get_storage_config","old_step_new")
-                        if tmp_data != None:
-                            old_step = tmp_data
-                        if old_step !=  step:
-                            EventMesh.publish("set_storage_config",["old_step",step])
-                            EventMesh.publish("set_storage_config",["old_step_new",step])
-                            
-                    old_step = step
-                    # step = str(EventMesh.publish(constants.EVENT.GET_STEP)[0])
-                    #翻转次数
-                    turn_count = "0"
-                    #终端状态
-                    state = "%08X"%(EventMesh.publish("get_dev_state"))
-                    #EventMesh.debug_log("TYPE:{}".format(TYPE))
-                    if type(TYPE) == list:#队列里的数据有终端状态,则用队里的终端状态
-                        if len(TYPE)>= 2 :
-                            state = "%08X"%(TYPE[1])
-                    
-                    EventMesh.debug_log("state:{}".format(state))
-                    #基站数据
-                    CELL_num = len(msg[2])
-                    CELL_data = "1," #时延
-                    if msg[2] != []:
-                        for CELL in msg[2] :
-                            if CELL[0] == 0 :
-                                CELL_data += "%X,"%(int(CELL[2])) #MCC
-                                CELL_data += str(CELL[3]) +","#MNC
-                                CELL_data += str(CELL[5]) +","#tac,区域码
-                                CELL_data += str(CELL[1]) +","#基站编号 CID
-                                CELL_data += str(int(CELL[7]+140)) +","#信号强度 rssi
-                            else :
-                                CELL_data += str(CELL[5]) +","#tac,区域码
-                                CELL_data += str(CELL[1]) +","#基站编号 CID
-                                CELL_data += str(int(CELL[7]+140)) +","#信号强度 rssi
-                        CELL_data = CELL_data[:(len(CELL_data)-1)]
-                    #WIFI数据
-                    WIFI_num = 0 
-                    WIFI_data = ""
-                    if msg[1] :
-                        WIFI_num = msg[1][0]
-                        i = 0
-                        for MAC in msg[1][1] :
-                            WIFI_data += "wifi%d,%s,%d,"%(i,str(MAC[0]),MAC[1])
-                            i += 1
-                        WIFI_data = WIFI_data[:(len(WIFI_data)-1)]
-                    WIFI_data = WIFI_data.lower()
-                    #send_data = "UD ,%s ,%s     ,%s       ,%s       ,%s   ,%s       ,%s  ,%s    ,%s     ,%s             ,%s  ,%s        ,%s   ,%d     ,%s       ,%d      ,%s"\
-                    #              %(date,GPS_type,latitude,longitude,speed,direction,high,number,gsm_sig,battery_caption,step,turn_count,state,CELL_num,CELL_data,WIFI_num,WIFI_data)
-                    #定位数据
-                    send_data = "%s,%s,%s"%(date,GPS_type,latitude)
-                    send_data += ",%s,%s,%s"%(longitude,speed,direction)
-                    send_data += ",%s,%s,%s"%(high,number,gsm_sig,)
-                    send_data += ",%s,%s,%s"%(battery_caption,step,turn_count)
-                    send_data += ",%s,%d,%s"%(state,CELL_num,CELL_data)
-                    send_data += ",%d,%s"%(WIFI_num,WIFI_data)
-                    send_data+=",%s"%(precision)
-                    #EventMesh.debug_log("Location_send2:{} q_size:{}".format(send_data,self.location_queue.size()))
-            
-                
-                    #EventMesh.debug_log("Location_send3:{}:{}".format(TYPE,send_data))
-                    if type(TYPE) == list:
-                        EventMesh.publish(TYPE[0],send_data)
-                    else:
-                        EventMesh.publish(TYPE,send_data)
-                else :
-                    break
-
-        def GxGGA_latitude(self, gga_data):
-            """Parse latitude from GGA"""
-            if gga_data:
-                latitude_re = ure.search(r",[0-9]+\.[0-9]+,[NS],", gga_data)
-                if latitude_re:
-                    latitude = latitude_re.group(0)[1:-3]
-                    return str(float(latitude[:2]) + float(latitude[2:]) / 60)
-            return ""
-        def GxGGA_longitude(self, gga_data):
-            """Parse longitude from GGA"""
-            if gga_data:
-                longitude_re = ure.search(r",[0-9]+\.[0-9]+,[EW],", gga_data)
-                if longitude_re:
-                    longitude = longitude_re.group(0)[1:-3]
-                    return str(float(longitude[:3]) + float(longitude[3:]) / 60)
-            return ""
-
-        def GxGGA_altitude(self, gga_data):
-            """Parse altitude from GGA"""
-            if gga_data:
-                altitude_re = ure.search(r",-*[0-9]+\.[0-9]+,M,", gga_data)
-                if altitude_re:
-                    return altitude_re.group(0)[1:-3]
-            return ""
-        def location_thread(self):
-            
-            self.wifi_data = []
-            self.gps_data = {}
-            self.cell_data = []
-            gnss_r_data = []
-            self.GSV_sig_ok_count = 0
-            self.GSV_sig_very_ok_count = 0
-            self.GGA_count = 0
-            self.RMC_A_count = 0
-            # if self.start_agps == 1: #开启agps
-            #     self.start_agps = 0
-            #     quecgnss.configSet(2,1)
-            if self.lpm_fd == None:
-                self.lpm_fd = pm.create_wakelock("test_lock", len("test_lock"))
-            pm.wakelock_lock(self.lpm_fd)
-            EventMesh.debug_log("location_thread:1")
-            EventMesh.publish(constants.EVENT.GPSOPEN)
-            EventMesh.debug_log("location_thread:2")
-            #self.timer_read_GPS_info.start(1000, 1, self.location_timer)
-            EventMesh.debug_log("location_thread:3")
-            #utime.sleep_ms(1000)
-            self.location_timer_count = 0
-            #quecgnss.read(4096)#去掉第一次错误数据
-            #EventMesh.txt_log("START_LOCATION")
-            # pm.autosleep(0)#唤醒
-            # pm.sclkEx_set(0, 1, 5)
-            GSV_dict= {}
-            while self.location_flag == 1:
-                try :   
-                    
-                    match_gga_data = []
-                    #match_gsv_data = []
-                    gnss_r_data = []
-                    # if self.location_check_data_timer_count >= 3:
-                    #     pm.autosleep(0)#唤醒
-                    #     pm.sclkEx_set(0, 1, 5)
-                    if self.location_check_data_timer_count >= 1 :#3秒查一次基站数据和wifi数据
-                        self.location_check_data_timer_count = 0
-                        #EventMesh.debug_log(self.location_timer_count)
-                        GSV_dict= {}
-                        if self.isOpenGNSS == "1":                    
-                            #检查GNSS数据
-                            if ( self.gps_data == {} or self.location_type == 1) and quecgnss.get_state() == 2:
-
-                                pass
-                                tmp_ok_count = 0
-                                tmp_very_ok_count = 0
-                                gsv_data = quecgnss.get_gsv()
-                                rmc_data = quecgnss.get_rmc()
-                                gga_data = quecgnss.get_gga()
-                                vtg_data = quecgnss.get_vtg()
-                                # EventMesh.debug_log("gsv:{}".format(quecgnss.get_gsv()))
-                                # EventMesh.debug_log("gga:{}".format(quecgnss.get_gga()))
-                                # EventMesh.debug_log("rmc:{}".format(quecgnss.get_rmc()))
-                                # EventMesh.debug_log("vtg:{}".format(quecgnss.get_vtg())) 
-                                for i in range(len(gsv_data)) :
-                                    
-                                    if i % 2 == 0:
-                                        if i+1 >= len(gsv_data) :
-                                            # EventMesh.debug_log("gsv_data num error!!")
-                                            break
-                                        GSV_dict[gsv_data[i]] = gsv_data[i+1]
-                                        #EventMesh.debug_log("type:gsv_data{}".format(type(gsv_data[i+1])))
-                                        try:
-                                            #EventMesh.debug_log("gsv_tmp[i+3]:{}".format(gsv_tmp[i+3]))
-                                            if gsv_data[i+1] :
-                                                if (gsv_data[i+1])>=20:
-                                                    tmp_ok_count +=1   
-                                                if (gsv_data[i+1])>=30:
-                                                    tmp_very_ok_count +=1  
-                                                    
-                                        except Exception as e:
-                                            usys.print_exception(e)
-                                        
-                                if(tmp_ok_count > self.GSV_sig_ok_count ):
-                                    self.GSV_sig_ok_count = tmp_ok_count
-                                if(tmp_very_ok_count > self.GSV_sig_very_ok_count ):
-                                    self.GSV_sig_very_ok_count = tmp_very_ok_count
-                                match_rmc_data = rmc_data.split(",")
-                                if len (match_rmc_data)>3: #有rmc数据
-                                        if match_rmc_data[2] == 'A':    
-                                            match_gga_data = gga_data.split(",")
-                                            if len(match_gga_data) >4: #数据全
-                                                match_vtg_data = vtg_data.split(",")
-                                                gps_date = "%s,%s"%(match_rmc_data[9],match_rmc_data[1][:6])#日期
-                                                #gps_data_tmp = self.gps.read_coordinates(gnss_r_data[1])
-                                                latitude = "0,N" #纬度
-                                                latitude_tmp = str(self.GxGGA_latitude(gga_data)).split(".")
-                                                if len(latitude_tmp) >= 2 and len(latitude_tmp[1])>=5:
-                                                    latitude = "%s.%s"%(latitude_tmp[0],latitude_tmp[1][:6])
-                                                    latitude = "%s,%s"%(latitude,match_rmc_data[4] )
-
-                                                longitude = "0,E"#经度
-                                                longitude_tmp = str(self.GxGGA_longitude(gga_data)).split(".")
-                                                if len(longitude_tmp) >= 2 and len(longitude_tmp[1])>=5:
-                                                    longitude = "%s.%s"%(longitude_tmp[0],longitude_tmp[1][:6])
-                                                    longitude = "%s,%s"%(longitude,match_rmc_data[6] ) #match_rmc_data[6] + str(gnss_r_data[1])
-                                                
-                                                high = "0"#高度
-                                                high = str(self.GxGGA_altitude(gga_data))
-                                                number = "0"#可用卫星
-                                                precision = "5.8"#精度
-                                                if len(match_gga_data)>5 :
-                                                    if match_gga_data[7]:
-                                                        number = match_gga_data[7]
-                                                    if match_gga_data[8]:
-                                                        precision = match_gga_data[8]
-                                                direction = "249.5" #方向
-                                                speed = '0.00'    #速度    
-                                                if(len(match_vtg_data)>5 ):
-                                                    if match_vtg_data[1]:
-                                                        direction =  match_vtg_data[1]
-                                                    if match_vtg_data[7]:    
-                                                        speed =  match_vtg_data[7]
-                                                self.gps_data = {
-                                                    "latitude": latitude,
-                                                    "longitude": longitude,
-                                                    "high": high,
-                                                    "direction": direction,
-                                                    "speed": speed,
-                                                    "number": number, 
-                                                    "date":  gps_date,
-                                                    "precision":  precision
-                                                }
-    # ***********************************************************************************
-
-
-                    #检查wifi数据
-                    if self.wifi_data == [] or (self.wifi_data != [] and self.wifi_data[0] == 0):#and self.wifi_data[0] <= 0:
-                        EventMesh.publish(constants.EVENT.WIFISCANOPEN)
-                
-                    #检查基站数据
-                    if self.cell_data == []:   
-                        data_tmp = net.getCellInfo()
-                        if(len(data_tmp)>=2):
-                            for cell in data_tmp:
-                                if cell and cell[0][0] == 0 and len(cell[0]) > 1:
-                                    self.cell_data = cell
-                                    break
-
-                    if self.location_type == 1: #测试模式
-                        self.location_timer_count = 0
-                        
-                        EventMesh.publish("PUSH_LOCATION_DATA", [[self.gps_data,GSV_dict],self.wifi_data,self.cell_data]) 
-                        if self.gps_data  != {} : #发送数据 
-                            EventMesh.publish(constants.EVENT.CLOSE_LOCATION)#关闭定位
-                            self.location_queue.put(constants.PROTOCOL.UD_SEND)
-                            self.Location_send([self.gps_data,self.wifi_data,self.cell_data])
-                            
-
-                    elif self.location_type == 0: #正常模式     
-                        if self.gps_data  != {} or self.location_timer_count > 100: #or( self.wifi_data != [] and self.cell_data != []): 
-                            if self.location_queue.empty() == False:#有定位队列
-                                pass
-                                #EventMesh.txt_log("LOCATION timer:{} ok:{} very_ok:{}".format(self.location_timer_count,self.GSV_sig_ok_count))   
-                                #EventMesh.txt_log("LOCATION:timer:{} ok_count:{} ".format(self.location_timer_count,self.GSV_sig_ok_count))
-                            if self.gps_data  == {}: #定位超时,且信噪比多个大于30,下次启动agps
-                                if self.GSV_sig_very_ok_count > 3:#3个超30以上
-                                    self.start_agps = 1
-                                    #EventMesh.txt_log("open agps:{}".format(GSV_dict))
-                            #upload_time = EventMesh.publish("get_upload_data")    
-                            self.Location_send([self.gps_data,self.wifi_data,self.cell_data])
-                            #if upload_time > 200  : 
-                            EventMesh.publish(constants.EVENT.CLOSE_LOCATION)#关闭定位
-                            # else:   #定位间隔小于3分钟不关闭gps,不影响无信号判断
-                            #     self.location_timer_count = 0
-                            #     self.GSV_sig_ok_count = 0
-                                
-                            
-
-                            
-                        if (self.isOpenGNSS != "1" or (self.GSV_sig_ok_count <= 1 and self.location_timer_count > 20)) and self.wifi_data != [] and self.cell_data != [] : #超过40秒且信号大于30的不足3个
-                            EventMesh.publish(constants.EVENT.CLOSE_LOCATION)#关闭定位 
-                            EventMesh.debug_log("Location_send:CLOSE_LOCATION")  
-                            #EventMesh.txt_log("GSV_sig_ok_count<3:timer:{} ok_count:{} ".format(self.location_timer_count,self.GSV_sig_ok_count))
-                            self.Location_send([self.gps_data,self.wifi_data,self.cell_data])
-
-                
-                    
-                except Exception as e:
-                    usys.print_exception(e)
-                    EventMesh.txt_log("location_thread:ERROR:".format(e))
-                    #EventMesh.debug_log("location_thread:ERROR:{}".format(usys.print_exception(e)))
-                    EventMesh.debug_log("self.gps_data{},self.wifi_data{},self.cell_data{}".format(self.gps_data,self.wifi_data,self.cell_data))
-                    #self.Location_send([self.gps_data,self.wifi_data,self.cell_data])
-                    EventMesh.publish(constants.EVENT.CLOSE_LOCATION)#关闭定位 
-                utime.sleep_ms(500)
-
-            #self.timer_read_GPS_info.stop()
-            #self.gps.power_switch(0)
-            wifiScan.control(0)
-            EventMesh.publish(constants.EVENT.GPSCLOSE)
-            # if EventMesh.publish("get_lcd_state" ) == 0:#休眠的时候,恢复休眠
-            #     pm.autosleep(1)
-            #     pm.sclkEx_set(1, 1, 5)
-            if self.lpm_fd != None:
-                pm.wakelock_unlock(self.lpm_fd)
-            #pm.delete_wakelock(lpm_fd)
-            EventMesh.debug_log("CLOSE_LOCATION")
-            #EventMesh.txt_log("CLOSE_LOCATION")
-
-                    
-
-    class AddrBookManager(Abstract):
-        # 通讯录
-        def __init__(self):
-            self.read_phonebook = {}
-            self.check_json = 0
-            self.check_json = ql_fs.path_exists("/usr/static/storage_file/phonebook.json")
-
-            if self.check_json == True:
-                with open("/usr/static/storage_file/phonebook.json","r",encoding="utf-8") as fd:
-                    self.read_phonebook = ujson.load(fd)
-                    EventMesh.debug_log("读取电话本")
-
-        def post_processor_after_instantiation(self):
-            EventMesh.subscribe("get_phonebook_list", self.get)
-            EventMesh.subscribe("set_phonebook_list", self.set)
-            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_num", self.call_phonebook_num)
-
-        def get(self, event, msg):
-            self.check_json = ql_fs.path_exists("/usr/static/storage_file/phonebook.json")
-            return [self.check_json,self.read_phonebook]
-        
-        def call_phonebook_num(self, event, msg):
-            name = ''
-            key_tmp = ''
-            phone_num = int(msg)
-            if self.read_phonebook != {}:
-                if len(self.read_phonebook) >= phone_num:
-                    phonebook_keys = sorted(self.read_phonebook.keys())
-                    name = self.read_phonebook[phonebook_keys[phone_num-1]]
-                    key_tmp = phonebook_keys[phone_num-1]
-                    if len(name) != 0:
-                        EventMesh.publish("save_phonename",str(name))
-                        EventMesh.publish("save_phonenum",str(name))
-                        EventMesh.publish("dial_out_call_center_cb",str(name))#电话拨出去
-                    else:
-                        EventMesh.publish("dial_out_call_center_cb",None)#电话拨出去
-                else:
-                    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))
-
-        def call_phonebook_one_call(self, event, msg):
-            name = ''
-            key_tmp = ''
-            if self.read_phonebook != {}:
-                if len(self.read_phonebook) >= 1:
-                    phonebook_keys = sorted(self.read_phonebook.keys())
-                    name = self.read_phonebook[phonebook_keys[0]]
-                    key_tmp = phonebook_keys[0]
-                    if len(name) != 0:
-                        EventMesh.publish("save_phonename",str(name))
-                        EventMesh.publish("save_phonenum",str(name))
-                        EventMesh.publish("dial_out_call_center_cb",str(name))#电话拨出去
-                    else:
-                        EventMesh.publish("dial_out_call_center_cb",None)#电话拨出去
-                else:
-                    EventMesh.publish("dial_out_call_center_cb",None)#电话拨出去
-            else:
-                EventMesh.publish("dial_out_call_center_cb",None)#电话拨出去
-            EventMesh.debug_log("call_phonebook_one_call name:{} key_tmp:{} len:{}".format(name,key_tmp,len(self.read_phonebook)))
-
-        def call_phonebook_two_call(self, event, msg):
-            name = ''
-            key_tmp = ''
-            if self.read_phonebook != {}:
-                if len(self.read_phonebook) >= 2:
-                    phonebook_keys = sorted(self.read_phonebook.keys())
-                    name = self.read_phonebook[phonebook_keys[1]]
-                    key_tmp = phonebook_keys[1]
-                    if len(name) != 0:
-                        #voiceCall.callStart(str(name))
-                        EventMesh.publish("save_phonename",str(name))
-                        EventMesh.publish("save_phonenum",str(name))
-                        EventMesh.publish("dial_out_call_center_cb",str(name))#电话拨出去
-                    else:
-                        EventMesh.publish("dial_out_call_center_cb",None)#电话拨出去
-                    
-                else:
-                    EventMesh.publish("dial_out_call_center_cb",None)#电话拨出去
-            else:
-                EventMesh.publish("dial_out_call_center_cb",None)#电话拨出去
-                EventMesh.debug_log("call_phonebook_two_call name:{} key_tmp:{}".format(name,key_tmp))
-        
-        def call_phonebook_three_call(self, event, msg):
-            name = ''
-            key_tmp = ''
-            if self.read_phonebook != {}:
-                if len(self.read_phonebook) >= 3:
-                    phonebook_keys = sorted(self.read_phonebook.keys())
-                    name = self.read_phonebook[phonebook_keys[2]]
-                    key_tmp = phonebook_keys[2]
-                    if len(name) != 0:
-                        #voiceCall.callStart(str(name))
-                        EventMesh.publish("save_phonename",str(name))
-                        EventMesh.publish("save_phonenum",str(name))
-                        EventMesh.publish("dial_out_call_center_cb",str(name))#电话拨出去
-                    else:
-                        EventMesh.publish("dial_out_call_center_cb",None)#电话拨出去
-                    
-                else:
-                    EventMesh.publish("dial_out_call_center_cb",None)#电话拨出去
-            else:
-                EventMesh.publish("dial_out_call_center_cb",None)#电话拨出去
-            EventMesh.debug_log("call_phonebook_three_call name:{} key_tmp:{}".format(name,key_tmp))
-
-        def set(self, event, msg):
-            self.check_json = msg[0]
-            self.read_phonebook = msg[1]
-
-    import sms
-    class MsgManager(Abstract):
-        # 短信
-        def __init__(self):
-            self.msg_nums = 0
-            self.msg_detail = ""
-
-        def post_processor_after_instantiation(self):
-            EventMesh.subscribe("get_msg_nums", self.get_msg_nums)
-            # 可通过此push_addr_book_list主动推送
-            EventMesh.subscribe("get_msg_detail", self.get_msg_detail)
-
-        def get_msg_nums(self, event, msg):
-
-            self.msg_nums = sms.getMsgNums() 
-            EventMesh.debug_log("self.msg_nums {}:".format(self.msg_nums))
-            return self.msg_nums
-        
-        def get_msg_detail(self, event, msg):
-            
-            # self.msg_detail = sms.searchTextMsg(self.msg_nums)
-            # EventMesh.debug_log("self.msg_detai {}:".format(self.msg_detai))
-            return{
-                "小明":"有内鬼,停止交易",
-                "小红":"今晚十点一起吃饭"
-            }
-
-    class MsgdetailManager(Abstract):
-        def __init__(self):
-            self.level = 0
-            self.msg_name = ""
-            self.msg_content = ""
-
-        def post_processor_after_instantiation(self):
-            EventMesh.subscribe("save_msg_name", self.save_msg_name)
-            EventMesh.subscribe("save_msg_content", self.save_msg_content)
-            EventMesh.subscribe("get_msg_name", self.get_msg_name)
-            EventMesh.subscribe("get_msg_content", self.get_msg_content)
-
-        def save_msg_name(self, event, msg): 
-            self.msg_name = str(msg)
-            EventMesh.debug_log("save_msg_name:msg".format(msg))
-        
-        def save_msg_content(self, event, msg):
-            self.msg_content = str(msg)
-            EventMesh.debug_log("save_msg_content:msg".format(msg))
-        
-        def get_msg_content(self, event, msg):
-            return self.msg_content
-
-        def get_msg_name(self, event, msg):
-            return self.msg_name
-
-    class CallLogManager(Abstract):
-        # 通话记录
-        def __init__(self):
-            self.read_call_log = {}
-            self.check_json = ql_fs.path_exists("/usr/static/storage_file/Call_log.json")
-
-            if self.check_json == True:
-                with open("/usr/static/storage_file/Call_log.json","r",encoding="utf-8") as fd:
-                    self.read_call_log = ujson.load(fd)
-                    EventMesh.debug_log("读取通话记录")
-
-        def post_processor_after_instantiation(self):
-            EventMesh.subscribe("get_call_log_list", self.get)
-            EventMesh.subscribe("set_call_log_list", self.set)
-
-        def get(self, event, msg):
-            self.check_json = ql_fs.path_exists("/usr/static/storage_file/Call_log.json")
-            return [self.check_json,self.read_call_log]
-
-        def set(self, event, msg):
-            return
-            self.check_json = msg[0]
-            self.read_call_log = msg[1]
-            with open("/usr/static/storage_file/Call_log.json","w+",encoding="utf-8") as fd:
-                ujson.dump(self.read_call_log,fd)
-        # def call_usr(self,event,msg):
-        #     content = self.log[msg]
-        #     # 参数1 姓名  参数2  电话   参数3 1/主动呼叫  0别人呼叫
-        #     EventMesh.publish("call_in", [content[2], content[0], 1])
-
-
-
-    class PhoneCallingManager(Abstract):
-        def __init__(self):
-            self.phonenum = ""
-            self.phonename = ""
-
-        def post_processor_after_instantiation(self):
-            EventMesh.subscribe("save_phonenum", self.save_phonenum)
-            EventMesh.subscribe("get_phonenum", self.get_phonenum)
-            EventMesh.subscribe("get_phonename", self.get_phonename)
-            EventMesh.subscribe("save_phonename", self.save_phonename)
-
-        def get_phonename(self, event, msg): 
-            return self.phonename
-
-        def save_phonename(self, event, msg): 
-            self.phonename = str(msg)
-
-        def save_phonenum(self, event, msg): 
-            self.phonenum = str(msg)
-        
-        def get_phonenum(self, event, msg):
-            return self.phonenum
-
-    #获取心率 血氧 步数历史数据
-    class gethistoryDataManager(Abstract):
-        def __init__(self):
-            self.oldHr = 0
-            self.oldspo2 = 0
-            self.oldstep = 0
-            self.old_step = 0
-            self.read_histroy_hr_data = []
-            self.read_histroy_temp_data = []
-            self.read_histroy_spo2_data = []
-
-            oldHr  = EventMesh.publish("get_storage_config","old_hr")
-            if oldHr != None:
-                self.oldHr = oldHr  
-            old_spo2  = EventMesh.publish("get_storage_config","old_spo2")
-            if old_spo2 != None:
-                self.oldspo2 = old_spo2 
-            old_step  = EventMesh.publish("get_storage_config","old_step")    
-            if old_step != None:
-                self.oldstep = old_step
-
-
-            check_hr= ql_fs.path_exists("/usr/static/storage_file/history_hr.json")
-            if check_hr == True :
-                with open("/usr/static/storage_file/history_hr.json","r") as fd:#音频文件编号
-                    self.read_histroy_hr_data = ujson.load(fd)
-            
-            check_temp= ql_fs.path_exists("/usr/static/storage_file/history_temp.json")
-            if check_temp == True :
-                with open("/usr/static/storage_file/history_temp.json","r") as fd:#音频文件编号
-                    self.read_histroy_temp_data = ujson.load(fd)
-
-            check_spo2= ql_fs.path_exists("/usr/static/storage_file/history_spo2.json")
-            if check_spo2 == True :
-                with open("/usr/static/storage_file/history_spo2.json","r") as fd:#音频文件编号
-                    self.read_histroy_spo2_data = ujson.load(fd)
-            self.temp_value = 0
-            
-            # self.read_histroy_hr_data=[{"timeSec":16789890,"value":90},{"timeSec":16789888,"value":78},{"timeSec":16789688,"value":68},{"timeSec":16789898,"value":58},\
-            #                              {"timeSec":16789897,"value":88},{"timeSec":16789867,"value":77},{"timeSec":16789895,"value":70}]
-
-        def post_processor_after_instantiation(self):
-            EventMesh.subscribe("set_old_hr_data", self.save_hr_value)
-            EventMesh.subscribe("get_old_hr_data", self.get_hr_value)
-            EventMesh.subscribe("set_old_spo2_data", self.save_spo2_value)
-            EventMesh.subscribe("get_old_spo2_data", self.get_spo2_value)
-
-            EventMesh.subscribe("get_old_step_value", self.get_old_step_value)
-            EventMesh.subscribe("set_old_step_value", self.set_old_step_value)
-
-
-            EventMesh.subscribe("get_history_hr_value", self.get_history_hr_value)
-            EventMesh.subscribe("set_history_hr_value", self.set_history_hr_value)
-
-            EventMesh.subscribe("get_history_temp_value", self.get_history_temp_value)
-            EventMesh.subscribe("set_history_temp_value", self.set_history_temp_value)
-
-            EventMesh.subscribe("get_history_spo2_value", self.get_history_spo2_value)
-            EventMesh.subscribe("set_history_spo2_value", self.set_history_spo2_value)
-
-        
-
-        def get_history_spo2_value(self, event, msg): #近7次血氧历史数据统计显示
-            return self.read_histroy_spo2_data
-
-        def set_history_spo2_value(self, event, msg): 
-            pass
-
-
-
-        def get_history_temp_value(self, event, msg): #近7次体温历史数据统计显示
-            return self.read_histroy_temp_data
-
-        def set_history_temp_value(self, event, msg): 
-            self.temp_value = msg
-            if self.temp_value > 0:
-                # date_tmp = utime.localtime()
-                # time_tmp = utime.mktime(date_tmp)
-                # if len(self.read_histroy_temp_data) >= 7:
-                #     sort_new = {}
-                #     sort_new = sorted(self.read_histroy_temp_data, key = lambda i: i['timeSec'],reverse = False)#按照时间戳进行排序 去掉最旧的一次数据如果满了五十条
-                #     EventMesh.debug_log(sort_new)
-                #     for i in range(len(self.read_histroy_temp_data)-1):
-                #         sort_new[i] = sort_new[i+1]#0==1 1== 2 2== 3 3==4 4==5 5==6 6==7
-                #         self.read_histroy_temp_data[i] = sort_new[i]
-                #         pass
-                #     self.read_histroy_temp_data[6] = {"timeSec": time_tmp, "temp": self.temp_value}
-                # else:
-                #     self.read_histroy_temp_data.append({"timeSec": time_tmp, "temp": self.temp_value}) 
-
-                # with open("/usr/static/storage_file/history_temp.json","w",encoding="utf-8") as fd:
-                #     ujson.dump(self.read_histroy_temp_data,fd)
-                #EventMesh.debug_log(self.read_histroy_temp_data)
-                pass
-            else:
-                pass
-
-        def get_history_hr_value(self, event, msg): #近7次心率历史数据统计显示
-            return self.read_histroy_hr_data
-
-        def set_history_hr_value(self, event, msg): 
-            pass
-                
-            
-
-        def save_hr_value(self, event, msg): 
-            if msg >= 50:
-                EventMesh.publish("set_storage_config",["old_hr",msg])
-                self.oldHr = msg
-                
-
-                date_tmp = utime.localtime()
-                time_tmp = utime.mktime(date_tmp)
-                if len(self.read_histroy_hr_data) >= 7:
-                    sort_new = {}
-                    sort_new = sorted(self.read_histroy_hr_data, key = lambda i: i['timeSec'],reverse = False)#按照时间戳进行排序 去掉最旧的一次数据如果满了五十条
-                    EventMesh.debug_log(sort_new)
-                    for i in range(len(self.read_histroy_hr_data)-1):
-                        sort_new[i] = sort_new[i+1]#0==1 1== 2 2== 3 3==4 4==5 5==6 6==7
-                        self.read_histroy_hr_data[i] = sort_new[i]
-                        pass
-                    self.read_histroy_hr_data[6] = {"timeSec": time_tmp, "hr": self.oldHr}
-                else:
-                    self.read_histroy_hr_data.append({"timeSec": time_tmp, "hr": self.oldHr}) 
-
-
-                with open("/usr/static/storage_file/history_hr.json","w",encoding="utf-8") as fd:
-                    ujson.dump(self.read_histroy_hr_data,fd)
-                pass
-            else:
-                
-                pass
-
-
-        def get_hr_value(self, event, msg): 
-            return self.oldHr
-
-        def save_spo2_value(self, event, msg): 
-            if msg >= 85:
-                # EventMesh.publish("set_storage_config",["old_spo2",msg])
-                # self.oldspo2 = msg
-
-
-                # date_tmp = utime.localtime()
-                # time_tmp = utime.mktime(date_tmp)
-                # if len(self.read_histroy_spo2_data) >= 7:
-                #     sort_new = {}
-                #     sort_new = sorted(self.read_histroy_spo2_data, key = lambda i: i['timeSec'],reverse = False)#按照时间戳进行排序 去掉最旧的一次数据如果满了五十条
-                #     EventMesh.debug_log(sort_new)
-                #     for i in range(len(self.read_histroy_spo2_data)-1):
-                #         sort_new[i] = sort_new[i+1]#0==1 1== 2 2== 3 3==4 4==5 5==6 6==7
-                #         self.read_histroy_spo2_data[i] = sort_new[i]
-                #         pass
-                #     self.read_histroy_spo2_data[6] = {"timeSec": time_tmp, "spo2": self.oldspo2}
-                # else:
-                #     self.read_histroy_spo2_data.append({"timeSec": time_tmp, "spo2": self.oldspo2}) 
-
-                # with open("/usr/static/storage_file/history_spo2.json","w",encoding="utf-8") as fd:
-                #     ujson.dump(self.read_histroy_spo2_data,fd)
-                # #EventMesh.debug_log(self.read_histroy_spo2_data)
-                #播放语音
-                # EventMesh.publish("set_hr_blood_led",2)#测量成功
-                pass
-            else:
-                pass
-                pass
-
-        def get_spo2_value(self, event, msg): 
-            return self.oldspo2
-        
-        def set_old_step_value(self, event, msg): 
-            self.oldstep = msg
-            EventMesh.publish("set_storage_config",["old_step",msg])
-            
-            
-        def get_old_step_value(self, event, msg): 
-            step = EventMesh.publish(constants.EVENT.GET_STEP)
-            self.old_step = self.oldstep + step[0]
-            return self.old_step
-    #获取旧的时间戳
-    class getOldTimeManager(Abstract):
-        # 获取天气数据
-        def __init__(self):
-            self.time_sec = 0
-            self.time_step = 0
-            self.step_second = 0
-            tmp_data = EventMesh.publish("get_storage_config","old_time")
-            if tmp_data !=None :
-                self.time_sec = tmp_data
-            tmp_data = EventMesh.publish("get_storage_config","clear_state")
-            if tmp_data !=None :
-                self.time_step = tmp_data[0]
-                self.step_second = tmp_data[1]
-
-            
-            
-        def post_processor_after_instantiation(self):
-            EventMesh.subscribe("get_old_time_data", self.get_old_time_data)
-            EventMesh.subscribe("set_old_time_data", self.set_old_time_data)
-
-            EventMesh.subscribe("get_old_step_data", self.get_old_step_data)
-            EventMesh.subscribe("set_old_step_data", self.set_old_step_data)
-
-            EventMesh.subscribe("set_test_data1", self.set_test_data1)
-
-            EventMesh.subscribe("set_test_data2", self.set_test_data2)
-
-            EventMesh.subscribe("set_test_data3", self.set_test_data3)
-
-            EventMesh.subscribe("set_test_data4", self.set_test_data4)
-
-            EventMesh.subscribe("set_test_data5", self.set_test_data5)
-
-            EventMesh.subscribe("set_test_data6", self.set_test_data6)
-
-            EventMesh.subscribe("set_test_data7", self.set_test_data7)
-
-            EventMesh.subscribe("set_test_data8", self.set_test_data8)
-        
-
-        def set_test_data1(self, event, msg):
-            EventMesh.publish("set_storage_config",["clear_state1",msg])
-
-        
-        def set_test_data2(self, event, msg):
-            
-            EventMesh.publish("set_storage_config",["clear_state2",msg])
-
-
-        def set_test_data3(self, event, msg):
-            EventMesh.publish("set_storage_config",["clear_state3",msg])
-
-        def set_test_data4(self, event, msg):
-            EventMesh.publish("set_storage_config",["clear_state4",msg])
-
-        def set_test_data5(self, event, msg):
-            EventMesh.publish("set_storage_config",["clear_state5",msg])
-
-        def set_test_data6(self, event, msg):
-            EventMesh.publish("set_storage_config",["clear_state6",msg])
-
-        def set_test_data7(self, event, msg):
-            EventMesh.publish("set_storage_config",["clear_state7",msg])
-
-        def set_test_data8(self, event, msg):
-            EventMesh.publish("set_storage_config",["clear_state8",msg])
-
-        # f = open("/usr/static/storage_file/config.json",'r',encoding="utf-8")
-        # print(f.read())
-
-        def get_old_step_data(self, event, msg):
-            return [self.time_step,self.step_second]
-
-        def get_old_time_data(self, event, msg):
-            return self.time_sec
-        
-        
-
-        def set_old_time_data(self, event, msg):
-            self.time_sec = msg
-            EventMesh.publish("set_storage_config",["old_time",msg])
-
-        def set_old_step_data(self, event, msg):
-            self.time_step = msg[0]
-            self.step_second = msg[1]
-            EventMesh.publish("set_storage_config",["clear_state",msg])
-
-        def get_old_step_data(self, event, msg):
-            return [self.time_step,self.step_second]
-
-
-            
-        
-
-    class getWeatherDataManager(Abstract):
-        # 获取天气数据
-        def __init__(self):
-            self.date = {} #日期23-04-07
-            self.time = {} #14:41:41
-            self.content = {} #天气描述 
-            self.type = None #天气类型
-            self.temp = None #当前温度
-            self.min_temp = None #最低温度
-            self.max_temp = None #最高温度
-            self.city = {} #城市
-            self.no_data = 0#0沒有数据 1有数据
-
-        def post_processor_after_instantiation(self):
-            EventMesh.subscribe("get_weather_data", self.get)
-            EventMesh.subscribe("set_weather_data", self.set)
-
-        def get(self, event, msg):
-            return [self.date,self.time,self.content,self.type,self.temp,self.min_temp,self.max_temp,self.city,self.no_data]
-
-        def set(self, event, msg):
-            self.date = msg[0]
-            self.time = msg[1]
-            self.content = msg[2]
-            self.type = msg[3]
-            self.temp = msg[4]
-            self.min_temp = msg[5]
-            self.max_temp = msg[6]
-            self.city = msg[7]
-            self.no_data = msg[8]
-
-
-    class getHrTimeManager(Abstract):
-        def __init__(self):
-            self.set_time = 0
-            self.set_hr = 0 #0关闭 1手动 2 自动测量按照时间间隔测试心率
-            self.set_spo2 = 0
-            self.open_btn = 0
-            if EventMesh.platform == "gewu":
-                self.set_time = 10*60
-                self.open_btn = 1
-            self.set_bgautotime = 0
-            self.bgauto_btn = 0
-            read_data = EventMesh.publish("get_storage_config","measure_time")
-            if read_data != None:
-                self.set_time = read_data  
-            read_data = EventMesh.publish("get_storage_config","open_hr_btn")
-                    
-            if read_data != None:
-                self.open_btn = read_data   
-
-            read_data = EventMesh.publish("get_storage_config","bgauto_time")
-            if read_data != None:
-                self.set_bgautotime = read_data  
-            read_data = EventMesh.publish("get_storage_config","bgauto_btn")
-                    
-            if read_data != None:
-                self.bgauto_btn = read_data   
-
-
-
-        def post_processor_after_instantiation(self):
-            EventMesh.subscribe("set_time_hr", self.set_time_hr)
-            EventMesh.subscribe("get_time_hr", self.get_time_hr)
-            EventMesh.subscribe("set_hr_state", self.set_hr_state)
-            EventMesh.subscribe("get_hr_state", self.get_hr_state)
-            EventMesh.subscribe("set_spo2_state", self.set_spo2_state)
-            EventMesh.subscribe("get_spo2_state", self.get_spo2_state)
-
-            EventMesh.subscribe("set_bgauto_time", self.set_bgauto_time)
-            EventMesh.subscribe("get_bgauto_time", self.get_bgauto_time)
-
-        def set_bgauto_time(self, event, msg): 
-            self.bgauto_btn = msg[0]
-            self.set_bgautotime = msg[1]
-            EventMesh.publish("set_storage_config",["bgauto_btn",self.bgauto_btn])
-            EventMesh.publish("set_storage_config",["bgauto_time",self.set_bgautotime])
-
-        def get_bgauto_time(self, event, msg): 
-            if self.bgauto_btn == None:
-                self.bgauto_btn = 0
-            if self.set_bgautotime == None:
-                self.set_bgautotime = 0
-            return [self.bgauto_btn,self.set_bgautotime]
-        
-
-        def set_time_hr(self, event, msg): 
-            self.open_btn = msg[0]
-            self.set_time = msg[1]
-            EventMesh.publish("set_storage_config",["measure_time",self.set_time])
-            EventMesh.publish("set_storage_config",["open_hr_btn",self.open_btn])
-
-        def get_time_hr(self, event, msg): 
-            return [self.open_btn,self.set_time]
-
-        def set_hr_state(self, event, msg): 
-            # if msg != 0:
-            #     EventMesh.publish("set_hr_blood_led",1)#红绿灯交替闪烁
-            self.set_hr = msg
-            if self.set_hr == 0:
-                EventMesh.publish("clear_health_state")
-            
-
-        def get_hr_state(self, event, msg): 
-            return self.set_hr
-        
-        def set_spo2_state(self, event, msg): 
-            # if msg != 0:
-            #     EventMesh.publish("set_hr_blood_led",1)##红绿灯交替闪烁
-            self.set_spo2 = msg
-            if self.set_spo2 == 0:
-                EventMesh.publish("clear_health_state")
-            
-
-        def get_spo2_state(self, event, msg): 
-            return self.set_spo2
-        
-    #体温
-    class getTempTimeManager(Abstract):
-        def __init__(self):
-            self.set_time = 0
-            self.get_temp = 0
-            read_data = EventMesh.publish("get_storage_config","temp_time")
-
-            if read_data != None:
-                self.set_time = read_data
-
-            self.get_bgstate = 0
-            self.get_bpstate = 0
-
-            self.bptime_on = 0
-            self.bptime_time = 0
-            read_data=EventMesh.publish("get_storage_config","bpauto_btn")
-            if read_data != None:
-                self.bptime_on = read_data
-
-            read_data=EventMesh.publish("get_storage_config","bpauto_time")
-            if read_data != None:
-                self.bptime_time = read_data
-
-            self.spo2time_on = 0
-            self.spo2time_time = 0
-            read_data = EventMesh.publish("get_storage_config","spo2auto_btn")
-            if read_data != None:
-                self.spo2time_on = read_data
-
-            read_data = EventMesh.publish("get_storage_config","spo2auto_time")
-            if read_data != None:
-                self.spo2time_time = read_data
-
-        def post_processor_after_instantiation(self):
-            EventMesh.subscribe("set_temp_time", self.set_temp_time)
-            EventMesh.subscribe("get_temp_time", self.get_temp_time)
-
-            EventMesh.subscribe("set_temp_state", self.set_temp_state)
-            EventMesh.subscribe("get_temp_state", self.get_temp_state)
-
-            EventMesh.subscribe("set_bp_time", self.set_bp_time)
-            EventMesh.subscribe("get_bp_time", self.get_bp_time)
-
-            EventMesh.subscribe("set_bp_state", self.set_bp_state)
-            EventMesh.subscribe("get_bp_state", self.get_bp_state)
-
-
-            EventMesh.subscribe("set_bg_state", self.set_bg_state)
-            EventMesh.subscribe("get_bg_state", self.get_bg_state)
-
-            EventMesh.subscribe("set_spo2_time", self.set_spo2_time)
-            EventMesh.subscribe("get_spo2_time", self.get_spo2_time)
-
-            
-        def set_bg_state(self, event, msg): 
-            self.get_bgstate = msg
-            if self.get_bgstate == 0:
-                EventMesh.publish("clear_health_state")
-            # if msg != 0:
-            #     EventMesh.publish("set_hr_blood_led",1)#红绿灯交替闪烁
-
-        def get_bg_state(self, event, msg): 
-            if self.get_bgstate:
-                return self.get_bgstate
-            else :
-                return 0
-
-        def set_spo2_time(self, event, msg): 
-            self.spo2time_on = msg[0]
-            self.spo2time_time = msg[1]
-            EventMesh.publish("set_storage_config",["spo2auto_btn",self.spo2time_on])
-            EventMesh.publish("set_storage_config",["spo2auto_time",self.spo2time_time])
-
-
-        def get_spo2_time(self, event, msg): 
-            
-            return [self.spo2time_on,self.spo2time_time]
-
-
-        def set_bp_time(self, event, msg): 
-            self.bptime_on = msg[0]
-            self.bptime_time = msg[1]
-            EventMesh.publish("set_storage_config",["bpauto_btn",self.bptime_on])
-            EventMesh.publish("set_storage_config",["bpauto_time",self.bptime_time])
-
-        def get_bp_time(self, event, msg): 
-            if self.bptime_on == None:
-                self.bptime_on = 0
-            if self.bptime_time == None:
-                self.bptime_time = 0
-            return [self.bptime_on,self.bptime_time]
-        
-            
-        def set_bp_state(self, event, msg): 
-            self.get_bpstate = msg
-            if self.get_bpstate == 0:
-                EventMesh.publish("clear_health_state")
-            # if msg != 0:
-                # EventMesh.publish("set_hr_blood_led",1)#红绿灯交替闪烁
-
-        def get_bp_state(self, event, msg): 
-            if self.get_bpstate:
-                return self.get_bpstate
-            else :
-                return 0
-
-
-        def set_temp_time(self, event, msg): 
-            self.set_time = msg
-            EventMesh.publish("set_storage_config",["temp_time",self.set_time])
-
-        def get_temp_time(self, event, msg): 
-            return self.set_time
-        
-        def set_temp_state(self, event, msg): 
-            self.get_temp = msg
-            if self.get_temp == 0:
-                EventMesh.publish("clear_temp_state")
-            # if msg != 0:
-            #     EventMesh.publish("set_hr_blood_led",1)#红绿灯交替闪烁
-
-        def get_temp_state(self, event, msg): 
-            return self.get_temp
-            
-    class getBrightnessManager(Abstract):#获取亮度级别
-        def __init__(self):
-            self.level = 6#默认值6
-            # self.read_data = {}
-            self.time = 5
-            self.PWM_backlight  = None
-
-
-        def post_processor_after_instantiation(self):
-            EventMesh.subscribe("get_brightness_level", self.get_brightness_level)
-            EventMesh.subscribe("push_add_brightness_level", self.add)
-            EventMesh.subscribe("push_reduce_brightness_level", self.reduce)
-            EventMesh.subscribe("set_brightness_level", self.set_brightness_level)
-
-            EventMesh.subscribe("set_brightness_time", self.set_brightness_time)
-            EventMesh.subscribe("get_brightness_time", self.get_brightness_time)
-
-        def set_brightness_level(self, event, msg): 
-            self.level = msg
-            EventMesh.publish("set_storage_config", ["brightness_level",self.level])
-
-        def get_brightness_level(self, event, msg): 
-            tmp = EventMesh.publish("get_storage_config","brightness_level")
-            if tmp != None:
-                self.level = tmp
-            return self.level
-        
-        def set_brightness_time(self, event, msg): 
-            self.time = msg
-            EventMesh.publish("set_storage_config", ["brightness_time",self.time])
-        
-        def get_brightness_time(self, event, msg): 
-            tmp = EventMesh.publish("get_storage_config","brightness_time")
-            if tmp != None:
-                self.time = tmp
-            return self.time
-        
-
-
-        def add(self, event, msg):
-            if self.level < 10:
-                self.level = self.level + 2
-            # self.PWM_backlight = PWM(PWM.PWM1, PWM.ABOVE_MS, self.level, 10)
-            # self.PWM_backlight.open()
-            EventMesh.publish("set_storage_config", ["brightness_level",self.level])
-
-
-        def reduce(self, event, msg):
-            # if self.level > 0:
-            #     self.level = self.level - 2
-            # if self.level <= 0:
-            #     self.PWM_backlight = PWM(PWM.PWM1, PWM.ABOVE_MS, 1, 10)
-            # else:
-            #     self.PWM_backlight = PWM(PWM.PWM1, PWM.ABOVE_MS,self.level, 10)
-
-            # self.PWM_backlight.open()
-            EventMesh.publish("set_storage_config", ["brightness_level",self.level])
-        
-        
-    class getStorageDataManager(Abstract):#获取内存数据
-        def __init__(self):
-            self.config_data = {}
-            check = ql_fs.path_exists("/usr/static/storage_file/config.json")
-            if check == True:
-                with open("/usr/static/storage_file/config.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_data", self.set_storage_data)
-            EventMesh.subscribe("set_storage_config", self.set_storage_config)
-            EventMesh.subscribe("get_storage_data", self.get_storage_data)
-            EventMesh.subscribe("get_storage_config", self.get_storage_config)
-
-        def set_storage_data(self, event, msg): 
-            # EventMesh.debug_log("set_storage_data:{}".format(msg))
-            if msg != None:
-                self.config_data = msg
-                with open("/usr/static/storage_file/config.json",'w+',encoding="utf-8") as fd:
-                    ujson.dump(self.config_data,fd)
-        
-
-        def set_storage_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.json",'w+',encoding="utf-8") as fd:
-                ujson.dump(self.config_data,fd)
-        def get_storage_data(self, event, msg): 
-            # EventMesh.debug_log("get_storage_data:{}".format(self.config_data))
-            return self.config_data 
-        def get_storage_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 getUpLoadDataManager(Abstract):#
-        def __init__(self):
-            self.upload_time = 2*60*60
-            if EventMesh.platform == "gewu":
-                self.upload_time = 10*60
-
-            read_data = EventMesh.publish("get_storage_config","upload_time")
-            if read_data != None:
-                self.upload_time = read_data 
-
-        def post_processor_after_instantiation(self):
-            EventMesh.subscribe("set_upload_data", self.set_upload_data)
-            EventMesh.subscribe("get_upload_data", self.get_upload_data)
-
-        def set_upload_data(self, event, msg): 
-            self.upload_time = msg
-
-        def get_upload_data(self, event, msg): 
-            if self.upload_time == None:
-                if EventMesh.platform == "gewu":
-                    self.upload_time = 10*60
-                else:
-                    self.upload_time = 2*60*60
-            return self.upload_time 
-
-    class getplayAudiodStateManager(Abstract):#获取设置播放音频状态
-        def __init__(self):
-            self.play = 0
-
-        def post_processor_after_instantiation(self):
-            EventMesh.subscribe("set_audio_state", self.set_audio_state)
-            EventMesh.subscribe("get_audio_state", self.get_audio_state)
-
-        def set_audio_state(self, event, msg): 
-            self.play = msg
-
-        def get_audio_state(self, event, msg): 
-            return self.play
-        
-    class getVolumSizeManager(Abstract):#设置或获取音量大小数据
-        def __init__(self):
-            self.volume_size = 8
-            read_data = EventMesh.publish("get_storage_config","volum")
-            if read_data != None:
-                self.volume_size = read_data
-        
-        def post_processor_after_instantiation(self):
-            EventMesh.subscribe("set_volum_size", self.set_volum_size)
-            EventMesh.subscribe("get_volum_size", self.get_volum_size)
-
-        def set_volum_size(self, event, msg): 
-            self.volume_size = msg
-            EventMesh.publish("set_storage_config", ["volum",self.volume_size])
-
-        def get_volum_size(self, event, msg): 
-            return self.volume_size
-
-    class getSosFlagManager(Abstract):#设置sos
-        def __init__(self):
-            self.aud = audio.Audio(0)
-            self.sos_flag = 0
-            self.sos_num = 0
-            self.hangup_mode = 0
-            self.call_timer = osTimer()
-            self.sos_numer1 = []
-            self.callnumer =""
-            SOS_NUMBER1 = EventMesh.publish("get_storage_config","SOS_NUMBER1")
-            if SOS_NUMBER1 != None:
-                self.sos_numer1 = SOS_NUMBER1
-            SOS_NUMBER2 = EventMesh.publish("get_storage_config","SOS_NUMBER2")
-            if SOS_NUMBER2 != None:        
-                self.sos_numer1 = [SOS_NUMBER1, SOS_NUMBER2]
-
-            SOS_NUMBER3 = EventMesh.publish("get_storage_config","SOS_NUMBER3")
-            if SOS_NUMBER3 != None:        
-                self.sos_numer1 = [SOS_NUMBER1, SOS_NUMBER2,SOS_NUMBER3]
-
-
-        def post_processor_after_instantiation(self):
-            EventMesh.subscribe("set_sos_flag", self.set_sos_flag)#设置sos拨打标识
-            EventMesh.subscribe("get_sos_flag", self.get_sos_flag)
-
-            EventMesh.subscribe("set_sos_num", self.set_sos_num)#设置拨打循环次数
-            EventMesh.subscribe("get_sos_num", self.get_sos_num)
-
-            EventMesh.subscribe("set_dial_sos_number", self.set_dial_sos_number)
-            EventMesh.subscribe("get_dial_sos_number", self.get_dial_sos_number)#设置家庭号码三个
-
-            EventMesh.subscribe("set_callnumer_cb", self.set_callnumer_cb)#延时回调
-
-            EventMesh.subscribe("close_call_time",self.close_call_time)
-
-            EventMesh.subscribe("set_hangup_mode", self.set_hangup_mode)
-            EventMesh.subscribe("get_hangup_mode", self.get_hangup_mode)#获取挂断方式 是对方挂断 还是手表按键主动挂断
-
-        def get_hangup_mode(self, event, msg): # 1是设备端手表主动挂断 0是手机端
-            return self.hangup_mode
-        
-        def set_hangup_mode(self, event, msg): 
-            self.hangup_mode = msg
-
-        def set_sos_flag(self, event, msg): 
-            self.sos_flag = msg
-        
-            if self.sos_flag == 1:
-                number = EventMesh.publish("get_dial_sos_number")
-            
-                if number != None:
-                    if len(number) > 0:
-                        self.call_timer.stop()
-                        EventMesh.publish("save_phonename",number[0])
-                        EventMesh.publish("save_phonenum",number[0])
-                        EventMesh.publish("set_sos_num",0)
-                        phone_num = EventMesh.publish("get_phonenum")  
-                        EventMesh.publish("sos_out_call_center_cb",phone_num)#电话拨出去
-                    else:
-                        EventMesh.publish("sos_out_call_center_cb",None)#电话拨出去
-
-        def set_callnumer_cb(self, event, msg):
-            if self.sos_flag == 1:
-                self.callnumer = msg
-                self.call_timer.start(5000, 0, self.call_timer_cb)#延迟10S 继续拨打
-
-        def call_timer_cb(self, *args, **kwargs):
-            if self.sos_flag == 1:
-                EventMesh.publish("save_phonename",str(self.callnumer))
-                EventMesh.publish("save_phonenum",str(self.callnumer))
-                phone_num = EventMesh.publish("get_phonenum")  
-                EventMesh.publish("sos_out_call_center_cb",phone_num)#电话拨出去
-        
-        def close_call_time(self, event, msg): 
-            self.call_timer.stop()
-
-        def get_sos_flag(self, event, msg): 
-            return self.sos_flag
-        
-        def set_sos_num(self, event, msg): 
-            self.sos_num = msg
-
-        def get_sos_num(self, event, msg): 
-            return self.sos_num
-        
-        def set_dial_sos_number(self, event, msg): 
-            self.sos_numer1 = msg
-            
-
-        def get_dial_sos_number(self, event, msg): 
-            return self.sos_numer1
-    class getLowBatManager(Abstract):#低电提醒
-        def __init__(self):
-
-            self.low_btn = 0
-            read_data = EventMesh.publish("get_storage_config","low_on")
-            if read_data != None:
-                self.low_btn = read_data
-
-        def post_processor_after_instantiation(self):
-            EventMesh.subscribe("set_low_bat_btn", self.set_low_bat_btn)#
-            EventMesh.subscribe("get_low_bat_btn", self.get_low_bat_btn)
-
-        def set_low_bat_btn(self, event, msg): 
-            self.low_btn = msg
-            EventMesh.publish("set_storage_config",["low_on",self.low_btn])
-
-        def get_low_bat_btn(self, event, msg): 
-            return self.low_btn
-        
-
-
-    class playPowerAudioManager(Abstract):#播放开关机音频文件
-        def __init__(self):
-            self.aud = audio.Audio(0)
-
-        def post_processor_after_instantiation(self):
-            
-            EventMesh.subscribe("play_poewr_on_event", self.play_poewr_on_event)#
-            EventMesh.subscribe("play_poewr_off_event", self.play_poewr_off_event)
-
-        def play_poewr_on_event(self, event, msg): 
-            self.aud.play(1, 1, 'U:/static/R_POWER_1.mp3')  #播放播放开机铃声
-
-        def play_poewr_off_event(self, event, msg): 
-            self.aud.setVolume(11)
-            self.aud.play(1, 1, 'U:/static/R_POWER_OFF_1.mp3')  #播放关机铃声
-        
-    class getBootOffManager(Abstract):#开关机时间
-        def __init__(self):
-            self.poweroff_time = []
-            read_data = EventMesh.publish("get_storage_config","poweroff_alarm")
-            if read_data != None:
-                self.poweroff_time = read_data
-            else:
-                self.poweroff_time = [{"poweroff_on":0,"start_hour":6,"start_min":0,"end_hour":0,"end_min":0}]
-            
-
-
-        def post_processor_after_instantiation(self):
-            EventMesh.subscribe("set_boot_off_time", self.set_boot_off_time)#设置关机时间
-            EventMesh.subscribe("get_boot_off_time", self.get_boot_off_time)
-
-        def set_boot_off_time(self, event, msg): 
-            EventMesh.debug_log("set_boot_off_time",msg)
-
-            EventMesh.publish("set_storage_config",["poweroff_alarm",msg])
-            self.poweroff_time = msg
-            EventMesh.publish("set_rtc_alarm")
-
-
-        def get_boot_off_time(self, event, msg):
-            return self.poweroff_time
-    class setSmsIndexManager(Abstract):#
-        def __init__(self):
-            self.index = -1
-
-        def post_processor_after_instantiation(self):
-            EventMesh.subscribe("set_sms_index", self.set_sms_index)#设置关机时间
-            EventMesh.subscribe("get_sms_index", self.get_sms_index)
-
-        def set_sms_index(self, event, msg): 
-            self.index = msg
-            
-
-        def get_sms_index(self, event, msg):
-            
-            return self.index
-    import protocol 
-    class testSmsSetIPManager(Abstract):#
-        def __init__(self):
-            self.timer = osTimer()
-            #大锤
-            severdata = protocol.server_init()
-
-            self.newip = severdata[0]
-            self.newcom = severdata[1]
-            self.new_key = severdata[2]
-            self.new_pid = severdata[3]
-            
-            EventMesh.debug_log("testSmsSetIPManager:{}\n".format(severdata))
-
-            self.server_sate = 0
-
-
-
-            tmp_data = EventMesh.publish("get_storage_config","set_new_ip_addr")
-            if tmp_data != None:
-                self.newip = tmp_data
-            tmp_data = EventMesh.publish("get_storage_config","set_new_com")
-            if tmp_data != None:
-                self.newcom = tmp_data
-            tmp_data = EventMesh.publish("get_storage_config","set_new_md5")
-            if tmp_data != None:
-                self.newmd5 = tmp_data    
-
-            tmp_data = EventMesh.publish("get_storage_config","set_new_key")
-            if tmp_data != None:
-                self.new_key = tmp_data 
-
-            tmp_data = EventMesh.publish("get_storage_config","set_new_pid")
-            if tmp_data != None:
-                self.new_pid = tmp_data 
-
-            tmp_data = EventMesh.publish("get_storage_config","get_server_sate")
-            if tmp_data != None:
-                self.server_sate = tmp_data 
-            
-            
-
-
-
-        def post_processor_after_instantiation(self):
-            EventMesh.subscribe("set_new_ip_com", self.set_new_ip_com)#设置关机时间
-            EventMesh.subscribe("get_new_ip_com", self.get_new_ip_com)
-
-            EventMesh.subscribe("set_ip", self.set_ip)#设置关机时间
-            EventMesh.subscribe("get_ip", self.get_ip)
-
-            EventMesh.subscribe("set_com", self.set_com)#设置关机时间
-            EventMesh.subscribe("get_com", self.get_com)
-
-            EventMesh.subscribe("get_new_key", self.get_new_key_cb)#获取key
-            EventMesh.subscribe("set_new_key", self.set_new_key_cb)#获取key
-
-            EventMesh.subscribe("set_new_pid", self.set_new_pid_cb)#获取pid
-            EventMesh.subscribe("get_new_pid", self.get_new_pid_cb)#获取pid
-
-            EventMesh.subscribe("set_server_state", self.set_server_state)#
-            EventMesh.subscribe("get_server_state", self.get_server_state)#
-
-            EventMesh.subscribe("get_new_key_pid", self.get_new_key_pid)#
-
-
-
-        def set_new_key_cb(self, event, msg): 
-            self.new_key = msg
-            # print("set_new_key_cb",msg,self.new_key)
-            EventMesh.publish("set_storage_config",["set_new_key",self.new_key])
-
-        def get_new_key_cb(self, event, msg):
-            # print("get_new_key_cb",self.new_key)
-            return self.new_key
-        
-        def set_new_pid_cb(self, event, msg): 
-            self.new_pid = msg
-            # print("set_new_pid_cb",msg,self.new_pid)
-            EventMesh.publish("set_storage_config",["set_new_pid",self.new_pid])
-
-        def get_new_pid_cb(self, event, msg):
-            # print("get_new_pid_cb",self.new_pid)
-            return self.new_pid
-
-        def set_new_ip_com(self, event, msg): 
-            self.newip = str(msg[0])
-            self.newcom = int(msg[1])
-            # self.newmd5 = str(msg[2])
-            #短信格式:SETIP:api.xcloudtech.com:9000:bZld0ALsZTt15tKEZhOlLPgbsO75BLTP 以冒号分隔 SETIP:ip地址:ip端口号:ip密钥key
-
-            # self.read_data["set_new_md5"] = self.newmd5  #通过短信设置ip的key密钥
-        
-
-            EventMesh.publish("set_storage_config",["set_new_ip_addr",self.newip])
-            EventMesh.publish("set_storage_config",["set_new_com",self.newcom])
-
-
-            number = str(msg[2])
-            sms.sendPduMsg(number, 'set ok', 'UCS2')
-            self.timer.start(10*1000,0,self.fun)
-            
-        def fun(self,*argc):
-            Power.powerRestart()
-
-        def get_new_ip_com(self, event, msg):
-            tmp_addr = EventMesh.publish("get_storage_config","set_new_ip_addr")
-            tmp_com = EventMesh.publish("get_storage_config","set_new_com")
-            if tmp_addr != None:
-                self.newip = tmp_addr
-            if tmp_com != None:
-                self.newcom = tmp_com
-            return [self.newip,self.newcom]
-        
-        def set_ip(self, event, msg): 
-            self.newip = msg
-            EventMesh.publish("set_storage_config",["set_new_ip_addr",self.newip])
-
-        def get_ip(self, event, msg):
-            # print("get_ip",self.newip)
-            return self.newip
-        
-        def set_com(self, event, msg): 
-            self.newcom = msg
-            EventMesh.publish("set_storage_config",["set_new_com",self.newcom])
-
-        def get_com(self, event, msg):
-            # print("get_com",self.newcom)
-            return self.newcom
-
-        def get_new_key_pid(self, event, msg):
-            return [self.new_key,self.new_pid]
-        
-        def set_server_state(self, event, msg):
-            EventMesh.publish("set_storage_config",["get_server_sate",msg])
-            self.server_sate = msg
-
-        def get_server_state(self, event, msg):
-            return self.server_sate
-            
-
-    # MMI Version:UIX8910_C55_DS_D12G_PRO18_FZD_V1.0_Release
-    # Build:07-07-2022 16:12:58
-    # IMEI:861218001025267
-    # IP:api.xcloudtech.com
-    # PORT:9000
-    # UPLOAD:300
-    # Battery:3948, 64
-    # Udebug: 0
-    # ConnectTime: 7
-    import protocol
-
-    class sendDevinfoManager(Abstract):#发送设备信息
-        def __init__(self):
-            self.timer = osTimer()
-            pass
-
-        def post_processor_after_instantiation(self):
-            EventMesh.subscribe("send_devinfo_event", self.send_devinfo_event)#删除短信
-
-        def send_devinfo_event(self, event, msg): 
-            number = str(msg)
-            versions = EventMesh.softversion
-            Build = EventMesh.builTime
-            IMEI = EventMesh.publish(constants.EVENT.GET_IMEI)
-            IP = ""
-            new_ip = EventMesh.publish("get_storage_config","set_new_ip_addr")
-            new_com = EventMesh.publish("get_storage_config","set_new_com")
-            server_data = protocol.server_init()
-        
-            if new_ip != None:
-                if len(str(new_ip)) != 0:
-                    IP = new_ip
-                else:
-                    IP = server_data[0]
-            else:
-                IP = server_data[0]
-            
-            PORT = ''
-            if new_com != None:
-                if len(str(new_com)) != 0:
-                    PORT = str(new_com)
-                else:
-                    PORT = str(server_data[1])
-            else:
-                PORT = str(server_data[1])
-            
-            UPLOAD = EventMesh.publish("get_upload_data")
-
-            level = EventMesh.publish("get_curr_battery_level")
-            if level == None:
-                level = 4200
-            bat = EventMesh.publish("screen_get_battery")[1]
-            if bat == None:
-                bat = 100
-            Battery = str(level) +',' +  str(bat)
-
-            ConnectTime = 0
-            
-            if EventMesh.platform == "gewu":
-                ConnectTime = gheartbeat_time//60
-            else:
-                ConnectTime = heartbeat_time//60
-            data1 = "Version:{}\nBuild:{}".format(versions,Build)
-
-            data2 = "IMEI:{}\nIP:{}\nPORT:{}".format(IMEI,IP,PORT)
-            
-            data3 = "UPLOAD:{}\nBattery:{}\nConnectTime:{}".format(UPLOAD,Battery,ConnectTime)
-
-            send_state1 = -1
-            send_state2 = -1
-            # print("data",data1,data2,data3)
-            send_state1 = sms.sendPduMsg(number, data1, 'UCS2')
-
-            if send_state1 == 0:
-                send_state2 = sms.sendPduMsg(number, data2, 'UCS2')
-
-            if send_state2 == 0:
-                sms.sendPduMsg(number, data3, 'UCS2')
-            
-
-    class deleteSmsManager(Abstract):#删除信息
-        def __init__(self):
-            self.timer = osTimer()
-            pass
-
-        def post_processor_after_instantiation(self):
-            EventMesh.subscribe("delete_sms_event", self.delete_sms_event)#删除短信
-            EventMesh.subscribe("remove_all_sms_cb", self.remove_all_sms_cb)#
-
-        def delete_sms_event(self, event, msg): 
-            self.timer.start(4*1000,0,self.fun)
-            
-        def fun(self, *argc): 
-            EventMesh.publish_async("remove_all_sms_cb","",1*1024)
-
-        def remove_all_sms_cb(self, event, msg):
-            sms.deleteMsg(1,4)
-
-    #闹钟信息
-    alarm_list = [{'hour': 6, 'repeart': 10, 'idx': 0, 'enabled': 1, 'days': [0,1,2,3,4,5,6], 'minute': 0},
-                {'hour': 0, 'repeart': 10, 'idx': 1, 'enabled': 1, 'days': [0,1,2,3,4,5,6], 'minute': 0}]
-    #用于显示闹钟列表不包含开关机信息
-
-    class ClockManager(Abstract):
-        def __init__(self):
-            super().__init__()
-            self.rtc = RTC()
-            self.days = 0
-            self.idx = 0
-
-            IFEXIST = ql_fs.path_exists("/usr/static/storage_file/alarm_msg.json") 
-            self.check_alarm_list = []     
-            if IFEXIST == True:
-                with open("/usr/static/storage_file/alarm_msg.json","r",encoding='utf-8') as fd:
-                    self.check_alarm_list = ujson.load(fd)
-            
-            EventMesh.subscribe("push_clock_info", self.set)
-            EventMesh.subscribe("read_alarminjson", self.read_alarminjson)
-            EventMesh.subscribe("add_alarm", self.add_alarm)
-            EventMesh.subscribe("remove_alarm", self.remove_alarm)
-            EventMesh.subscribe("set_rtc_alarm", self.set_rtc_alarm)
-            EventMesh.subscribe("get_alarm_indx", self.get_alarm_indx)
-            EventMesh.subscribe("get_check_alarm_list", self.get_check_alarm_list)
-            EventMesh.subscribe("push_update_alarm_show", self.update_show_info)
-
-        def post_processor_after_instantiation(self):
-        
-            EventMesh.publish("read_alarminjson")
-            # EventMesh.publish("set_rtc_alarm")
-        
-        def update_show_info(self,event,msg):
-            EventMesh.publish("read_alarminjson")
-            # EventMesh.publish("set_rtc_alarm")
-
-        def get_check_alarm_list(self, event, msg):
-            alarm_len = 0
-            global alarm_list
-            EventMesh.publish("read_alarminjson")
-            alarm_len = len(alarm_list)
-            return alarm_len
-
-
-        def set(self, event, msg):
-            global alarm_list
-            EventMesh.debug_log("msg = {}".format(msg))
-            idx = msg.get("idx")
-            EventMesh.debug_log("修改第{}个闹钟信息{}".format(idx,alarm_list[idx]))
-            alarm_list[idx]["hour"] = msg["hour"]
-            alarm_list[idx]["minute"] = msg["minute"]
-            alarm_list[idx]["days"] = msg["days"]
-            alarm_list[idx]["enabled"] = msg["enabled"]
-            alarm_list[idx]["repeart"] = msg["repeart"]
-            with open("/usr/static/storage_file/alarm_msg.json", 'w+',encoding='utf-8') as fd:
-                ujson.dump(alarm_list,fd)
-
-        def read_alarminjson(self, event, msg):
-            IFEXIST = ql_fs.path_exists("/usr/static/storage_file/alarm_msg.json") 
-            global alarm_list     
-            EventMesh.debug_log("IFEXIST:{}".format(IFEXIST))
-            if IFEXIST == True:
-                with open("/usr/static/storage_file/alarm_msg.json","r",encoding='utf-8') as fd:
-                    alarm_list = ujson.load(fd)
-
-            
-            # read_data = EventMesh.publish("get_storage_config","off_on")
-
-            hour1 = str(alarm_list[0]["hour"])+':'+str(alarm_list[0]["minute"])
-            # min1 = str(alarm_list[0]["minute"])
-
-            hour2 = str(alarm_list[1]["hour"])+':'+str(alarm_list[1]["minute"])
-            # min2 = str(alarm_list[1]["minute"]) 
-            # EventMesh.publish("set_boot_off_time",[1,hour1,hour2])
-
-            EventMesh.debug_log("hour1:{}-{}".format(hour1,hour2))
-
-            
-            return alarm_list
-
-        def add_alarm(self, event, msg):
-
-            global alarm_list
-            EventMesh.publish("read_alarminjson")
-            EventMesh.debug_log("msg:{}".format(msg))
-            for i in range(0,2):#开关机固定是 idx 0 1
-                off_msg1 = msg[i+1]
-                msg_tmp1 = off_msg1.split(':')
-                start_hour = int(msg_tmp1[0])
-                start_min = int(msg_tmp1[1])
-                enable = int(msg[0])
-                EventMesh.debug_log("start_hour:{} start_min:{} enable:{}",start_hour,start_min,enable)
-                # EventMesh.publish("set_boot_off_time",[msg[0],msg[1],msg[2]])
-
-                alarm_list[i]["idx"]=i
-                alarm_list[i]["hour"]=start_hour
-                alarm_list[i]["minute"]=start_min
-                alarm_list[i]["days"]=[0,1,2,3,4,5,6]
-                alarm_list[i]["enabled"]=enable
-                alarm_list[i]["repeart"]=10
-
-
-                # alarm_list.append({"idx": i, "hour": start_hour, "minute": start_min, "days":[0,1,2,3,4,5,6], "enabled": enable,"repeart":10})
-
-            
-            # EventMesh.debug_log("alarm_list----len- :{} alarm_list:{}".format(len(alarm_list),alarm_list))
-            with open("/usr/static/storage_file/alarm_msg.json", 'w+',encoding='utf-8') as fd:
-                ujson.dump(alarm_list,fd)
-            EventMesh.publish("push_update_alarm_show")
-            
-        
-                
-            
-
-
-        def remove_alarm(self, event, msg):
-            global alarm_list
-            EventMesh.debug_log("ddddddddddddddddddd:",msg)
-            idx = msg.get("idx")
-            EventMesh.debug_log("delete_here1-----{},{}:".format(idx,msg))
-
-            for i, alarm in enumerate(alarm_list):
-                EventMesh.debug_log("delete_here2-----{},{}:".format(i,alarm))
-
-                if alarm["idx"] == idx:
-                    del alarm_list[i]
-                    EventMesh.debug_log("delete_here3-----",alarm_list)
-
-                    #删除闹钟后,对idx重新排序
-                    if alarm_list:
-                        for j in range(i,len(alarm_list)):
-                            alarm_list[j]["idx"] -= 1
-                            EventMesh.debug_log("delete_here4-----",alarm_list)
-
-            with open("/usr/static/storage_file/alarm_msg.json", 'w+',encoding='utf-8') as fd:
-                ujson.dump(alarm_list,fd)
-
-
-        def get_alarm_indx(self,event,msg):
-            return self.idx
-
-        def _rtc_callback(self,args):
-            #设置下一个闹钟,定时开关机功能
-            msg_data = EventMesh.publish("get_boot_off_time")
-            if msg_data != None:
-                power_offdata = msg_data[0]
-                start_hour = int(power_offdata["start_hour"])
-                start_min = int(power_offdata["start_min"])
-                end_hour = int(power_offdata["end_hour"])
-                end_min = int(power_offdata["end_min"])
-                off_on = int(power_offdata["poweroff_on"])
-
-                rtc_now_time = self.rtc.datetime()
-                current_minute = rtc_now_time[4]*60 + rtc_now_time[5]
-                end_min_total = end_hour*60+end_min
-                next_minute = start_hour*60+start_min #10:11
-                EventMesh.debug_log("off_on:{} {} {}".format(off_on,current_minute,next_minute))
-                if off_on != None:
-                    if off_on == 1:
-                        if end_min_total == current_minute:#结束的时间分钟等于关机时间分钟数则关机
-                            ubs_state = EventMesh.publish("get_usb")#'
-                            
-                            if ubs_state == 2 or ubs_state == 0:
-
-                                if next_minute > current_minute:#开机时间大于当前时间 9:00 > = 8:00 
-                                    interval_minute = next_minute - current_minute
-                                    
-                                    EventMesh.debug_log("开机距离下一次响铃的的分钟数:", interval_minute,next_minute)
-                                else:#8:00 9:00
-                                    #7*60*24 7天一个周期 7*60*24 - 
-                                    interval_minute = next_minute + (24*60-current_minute)
-                                    EventMesh.debug_log("开机08888距离下一次响铃的的分钟数:", interval_minute,next_minute)
-
-                                #反向获取时间戳
-                                time = utime.localtime()
-                                EventMesh.debug_log("开机9获取utime的时间戳:", time)
-                                rtc_mktime = utime.mktime(time)-time[5]
-                                EventMesh.debug_log("开机10反向获取utime的mktime:", rtc_mktime)
-
-                                #加上下一次响铃需要的时间
-                                next_alarm_mktime = rtc_mktime + interval_minute*60 #转换成s单位 时间戳
-                                EventMesh.debug_log("开机11下一次响铃的mktime:", next_alarm_mktime)
-
-                                #格式化时间戳,得到下一次闹钟的时间
-                                next_alarm_time = utime.localtime(next_alarm_mktime)
-                                EventMesh.debug_log("开机12下一次响铃的准确时间:", next_alarm_time)
-                                #将时间转换为rtc的格式
-                                data_l = [2021, 7, 9, 5, 12, 30, 0, 0]
-                                #给rtc时间赋值
-                                data_l[0] = next_alarm_time[0] #year
-                                data_l[1] = next_alarm_time[1] #month                    
-                                data_l[2] = next_alarm_time[2] #day                     
-                                data_l[4] = next_alarm_time[3] #hour               
-                                data_l[5] = next_alarm_time[4] #minute   
-                                data_e=tuple(data_l)
-                                EventMesh.debug_log("开机13将该时间转换为RTC元组:", data_e)
-                                
-                                self.rtc.register_callback(self._rtc_callback)
-
-                                FLAG = self.rtc.set_alarm(data_e)
-                                if FLAG == 0:
-                                    EventMesh.debug_log("开机11成功设置rtc的到期时间:", data_e)
-                                else:
-                                    EventMesh.debug_log("开机时设置rtc的到期时间失败:", data_e)
-                                self.rtc.enable_alarm(1)
-                                
-                                EventMesh.debug_log("结束时设置rtc的到期时间失败:", data_e)
-                                EventMesh.publish("open_power_on", 5)#静音关机
-                                return
-                            else:
-                                EventMesh.publish("set_rtc_alarm")
-                                #self.rtc.datetime([2023, 12, 1, 5, 5, 59, 30, 0])
-                                return
-                
-            EventMesh.publish("set_rtc_alarm")
-
-
-        def set_rtc_alarm(self,event,msg):
-            msg_data = EventMesh.publish("get_boot_off_time")
-            if msg_data != None:
-                power_offdata = msg_data[0]
-                start_hour = int(power_offdata["start_hour"])
-                start_min = int(power_offdata["start_min"])
-                end_hour = int(power_offdata["end_hour"])
-                end_min = int(power_offdata["end_min"])
-                off_on = int(power_offdata["poweroff_on"])
-                if off_on == 1:
-                    next_minute = start_hour*60+start_min #10:11
-
-                    start_total = start_hour*60+start_min #10:11
-                    end_total = end_hour*60+end_min #10:11
-                    rtc_now_time = self.rtc.datetime()
-                    current_minute = rtc_now_time[4]*60 + rtc_now_time[5]#当前时间
-
-
-                    minute_list = []
-                    if start_total != current_minute:
-                        minute_list.append(start_total)#23*60=
-                    if end_total != current_minute:
-                        minute_list.append(end_total)
-                    minute_list.append(current_minute)#[927,927,930]
-                    minute_list = sorted(minute_list)
-                    current_index = minute_list.index(current_minute)
-                    print("minute_list",minute_list,start_total,end_total,current_index,power_offdata)
-                    
-                    
-                    next_index = current_index + 1
-                    if next_index >= len(minute_list):
-                        next_minute = minute_list[0]
-                        print("07下一个闹钟的分钟数:", next_minute)
-                    else:
-                        next_minute = minute_list[next_index]
-                        print("08下一个闹钟的分钟数:", next_minute)
-
-                    print("minute_list1",minute_list,current_index,next_minute)
-                    if next_minute > current_minute:
-                        interval_minute = next_minute - current_minute
-                        print("09距离下一次响铃的的分钟数:", interval_minute)#14 31 14 29 14 31 24*60-
-                    else:
-                        interval_minute = (24*60 - current_minute) + next_minute
-                        print("10距离下一次响铃的的分钟数:", interval_minute)
-
-
-                    #反向获取时间戳
-                    time = utime.localtime()
-                    EventMesh.debug_log("关机09获取utime的时间戳:", time)
-                    time
-                    rtc_mktime = utime.mktime(time)-time[5]
-                    EventMesh.debug_log("关机10反向获取utime的mktime:", rtc_mktime)
-
-                    #加上下一次响铃需要的时间
-                    next_alarm_mktime = rtc_mktime + interval_minute*60 #转换成s单位 时间戳
-                    EventMesh.debug_log("关机11下一次响铃的mktime:", next_alarm_mktime)
-
-                    #格式化时间戳,得到下一次闹钟的时间
-                    next_alarm_time = utime.localtime(next_alarm_mktime)
-                    EventMesh.debug_log("关机12下一次响铃的准确时间:", next_alarm_time)
-                    #将时间转换为rtc的格式
-                    data_l = [2021, 7, 9, 5, 12, 30, 0, 0]
-                    #给rtc时间赋值
-                    data_l[0] = next_alarm_time[0] #year
-                    data_l[1] = next_alarm_time[1] #month                    
-                    data_l[2] = next_alarm_time[2] #day                     
-                    data_l[4] = next_alarm_time[3] #hour               
-                    data_l[5] = next_alarm_time[4] #minute   
-                    data_e=tuple(data_l)
-                    EventMesh.debug_log("关机13将该时间转换为RTC元组:", data_e)
-                    
-                    self.rtc.register_callback(self._rtc_callback)
-
-                    FLAG = self.rtc.set_alarm(data_e)
-                    if FLAG == 0:
-                        EventMesh.debug_log("关机11成功设置rtc的到期时间:", data_e)
-                    else:
-                        EventMesh.debug_log("关机时设置rtc的到期时间失败:", data_e)
-                    self.rtc.enable_alarm(1)
-                else:
-                    self.rtc.enable_alarm(0)
-                    
-
-    class schoolclassManager(Abstract):#
-        def __init__(self):
-            # ['火星情报局', '一年级二班', '柠檬茶']
-            self.school_name = ''
-            self.class_name = ''
-            self.full_name = ''
-            tmp_data = EventMesh.publish("get_storage_config","school_name")
-            if tmp_data != None:
-                self.school_name = tmp_data
-            tmp_data = EventMesh.publish("get_storage_config","class_name")
-            if tmp_data != None:
-                self.class_name = tmp_data
-            tmp_data = EventMesh.publish("get_storage_config","full_name")
-            if tmp_data != None:
-                self.full_name = tmp_data    
-
-            
-
-        def post_processor_after_instantiation(self):
-            EventMesh.subscribe("set_schoolname", self.set_school_name)#
-            EventMesh.subscribe("get_schoolname", self.get_school_name)
-
-            EventMesh.subscribe("set_classname", self.set_classname)#
-            EventMesh.subscribe("get_classname", self.get_classname)
-
-            EventMesh.subscribe("set_fullname", self.set_full_name)#
-            EventMesh.subscribe("get_fullname", self.get_full_name)
-
-        def set_school_name(self, event, msg): 
-            if msg != None:
-                if len(msg) != 0:
-                    self.school_name = str(msg)
-                    EventMesh.publish("set_storage_config",["school_name",str(msg)])
-            
-
-        def get_school_name(self, event, msg):
-            if self.school_name:
-                return self.school_name
-            else:
-                return None
-        
-        def set_classname(self, event, msg): 
-            if msg != None:
-                if len(msg) != 0:
-                    self.class_name = str(msg)
-                    EventMesh.publish("set_storage_config",["class_name",str(msg)])
-                
-            
-        def get_classname(self, event, msg):
-            if self.class_name:
-                return self.class_name
-            else:
-                return None
-        def set_full_name(self, event, msg): 
-            if msg != None:
-                if len(msg) != 0:
-                    self.full_name = str(msg)
-                    EventMesh.publish("set_storage_config",["full_name",str(msg)])
-
-        def get_full_name(self, event, msg):
-            if self.full_name:
-                return self.full_name
-            else:
-                return None
-    
-    import fota
-    class firwDownloadManager(Abstract):#
-        def __init__(self):
-            self.timer = osTimer()
-
-
-        def post_processor_after_instantiation(self):
-            EventMesh.subscribe("firware_download", self.firware_download)#
-
-        def firware_download(self, event, msg): 
-            number = str(msg)
-            sms.sendPduMsg(number, 'set ok', 'UCS2')
-            self.timer.start(10*1000,0,self.fun)
-
-        def fun(self,*argc):
-            fota_obj = fota()
+from common import Abstract, LogAdapter\r
+import EventMesh\r
+import usocket\r
+import ql_fs\r
+import ujson\r
+import _thread\r
+import modem\r
+import utime\r
+import sim\r
+import net\r
+import dataCall\r
+import checkNet\r
+import osTimer\r
+import constants\r
+import sms\r
+from common import Lock, Abstract, LogAdapter\r
+#from location import GPS, GPSMatch,CellLocator\r
+from misc import USB, Power, ADC\r
+from machine import ExtInt, Pin,Timer,RTC,UART\r
+import EventMesh\r
+import usys\r
+import audio\r
+from machine import I2C\r
+from Gsensor import SC7A20\r
+import pm\r
+import ure\r
+import urandom\r
+try :\r
+    from Hsensor import GH3018\r
+except Exception as e:\r
+    EventMesh.debug_log("Hsensor none GH3018:{}".format(e))   \r
+#\r
+try :\r
+    from Hsensor import HX3918\r
+except Exception as e:\r
+    EventMesh.debug_log("Hsensor none HX3918:{}".format(e))    \r
+from machine import RTC\r
+import quecgnss\r
+import wifiScan\r
+import math\r
+import voiceCall\r
+from misc import PWM\r
+from led import led_mode,open_led_green,close_led_green,open_led_red,close_led_red,close_led_white\r
+from queue import Queue\r
+if EventMesh.model == "D10":\r
+    heartbeat_time = 7*60 #心跳时间\r
+    gheartbeat_time = 5*60 #心跳时间\r
+\r
+    def get_autoblood_value():#血压值\r
+        data = RTC().datetime()\r
+        hour = int(data[4])\r
+        blood_Maxvalue = 0\r
+        blood_Minvalue = 0\r
+        if hour >= 6 and hour <= 10:\r
+            random_numMax = urandom.randint(0, 30)\r
+            random_numMin = urandom.randint(0, 20)\r
+            blood_Maxvalue = 120+random_numMax\r
+            blood_Minvalue = 75+random_numMin\r
+\r
+            print("get_autoblood_value 6 -10",blood_Maxvalue,blood_Minvalue)\r
+            # return [self.blood_Maxvalue,self.blood_Minvalue]\r
+        elif hour > 10 and hour <= 14:#10-14(10,14]\r
+            random_numMax = urandom.randint(0, 20)\r
+            random_numMin = urandom.randint(0, 25)\r
+            blood_Maxvalue = 115+random_numMax\r
+            blood_Minvalue = 60+random_numMin\r
+            print("get_autoblood_value 10 -14",blood_Maxvalue,blood_Minvalue)\r
+            # return [self.blood_Maxvalue,self.blood_Minvalue]\r
+        elif hour > 14 and hour <= 18:#14-18\r
+            random_numMax = urandom.randint(0, 25)\r
+            random_numMin = urandom.randint(0, 15)\r
+            blood_Maxvalue = 115+random_numMax\r
+            blood_Minvalue = 70+random_numMin\r
+\r
+            print("get_autoblood_value 14 -18",blood_Maxvalue,blood_Minvalue)\r
+            # return [self.blood_Maxvalue,self.blood_Minvalue]\r
+        elif hour > 2 and hour < 6:#2-6\r
+            random_numMax = urandom.randint(0, 30)\r
+            random_numMin = urandom.randint(0, 20)\r
+            blood_Maxvalu = 105+random_numMax\r
+            blood_Minvalue = 65+random_numMin\r
+\r
+            \r
+            print("get_autoblood_value 2 -6",blood_Maxvalue,blood_Minvalue)\r
+            # return [self.blood_Maxvalue,self.blood_Minvalue]\r
+        else:#18-2 19 20 21 22 23 1 2\r
+            random_numMax = urandom.randint(0, 30)\r
+            random_numMin = urandom.randint(0, 20)\r
+            blood_Maxvalue = 100+random_numMax\r
+            blood_Minvalue = 60+random_numMin\r
+            print("get_autoblood_value 18 -2",blood_Maxvalue,blood_Minvalue)\r
+        return [blood_Maxvalue,blood_Minvalue]\r
+\r
+    def get_blood_sugar_value():#血糖值\r
+        data = RTC().datetime()\r
+        hour = int(data[4])\r
+        blood_sugar = 0\r
+        if (hour >= 6 and hour <= 8) or (hour >= 12 and hour <= 13) or (hour >= 18 and hour <= 19):#6-8 12-13 18-19 \r
+            random_value = urandom.randint(39, 61)\r
+            blood_sugar = random_value/10\r
+            print("get_blood_sugar_value 6 -10",blood_sugar)\r
+            # return [self.blood_Maxvalue,self.blood_Minvalue]\r
+        elif (hour > 8 and hour <= 9) or (hour >= 14 and hour <= 15) or (hour >= 20 and hour <= 21):#8-9 14-15 20-21\r
+            random_value = urandom.randint(67, 90)\r
+            blood_sugar = random_value/10\r
+            print("get_blood_sugar_value 10 -14",blood_sugar)\r
+        else:#18-2 19 20 21 22 23 1 2 10-11 16-17 21-22\r
+            random_value = urandom.randint(39, 78)\r
+            blood_sugar = random_value/10\r
+            print("get_blood_sugar_value 18 -2",blood_sugar)\r
+        return blood_sugar\r
+\r
+\r
+\r
+\r
+    class PhoneVolumeLevelManager(Abstract):\r
+        def __init__(self):\r
+            self.level = 0\r
+\r
+        def post_processor_after_instantiation(self):\r
+            EventMesh.subscribe("push_add_phonering_level", self.add)\r
+            EventMesh.subscribe("push_reduce_phonering_level", self.reduce)\r
+            EventMesh.subscribe("get_phonering_level", self.get)\r
+\r
+        def add(self, event, msg):\r
+            if self.level < 7:\r
+                self.level = self.level + 1\r
+\r
+        def reduce(self, event, msg):\r
+            if self.level > 0:\r
+                self.level = self.level - 1\r
+\r
+        def get(self, event=None, msg=None):\r
+            return self.level\r
+\r
+    class MsgVolumeLevelManager(Abstract):\r
+        def __init__(self):\r
+            self.level = 0\r
+\r
+        def post_processor_after_instantiation(self):\r
+            EventMesh.subscribe("push_add_msgvolume_level", self.add)\r
+            EventMesh.subscribe("push_reduce_msgvolume_level", self.reduce)\r
+            EventMesh.subscribe("get_msgvolume_level", self.get)\r
+\r
+        def add(self, event, msg):\r
+            if self.level < 7:\r
+                self.level = self.level + 1\r
+\r
+        def reduce(self, event, msg):\r
+            if self.level > 0:\r
+                self.level = self.level - 1\r
+\r
+        def get(self, event=None, msg=None):\r
+            return self.level\r
+\r
+    class AlarmVolumeLevelManager(Abstract):\r
+        def __init__(self):\r
+            self.level = 0\r
+\r
+        def post_processor_after_instantiation(self):\r
+            EventMesh.subscribe("push_add_alarmvolume_level", self.add)\r
+            EventMesh.subscribe("push_reduce_alarmvolume_level", self.reduce)\r
+            EventMesh.subscribe("get_alarmvolume_level", self.get)\r
+\r
+        def add(self, event, msg):\r
+            if self.level < 7:\r
+                self.level = self.level + 1\r
+\r
+        def reduce(self, event, msg):\r
+            if self.level > 0:\r
+                self.level = self.level - 1\r
+\r
+        def get(self, event=None, msg=None):\r
+            return self.level\r
+            \r
+    class StopwatchManager(Abstract):\r
+        def __init__(self):\r
+            self.level = 0\r
+            self.ms_value = 0\r
+            self.sec_value = 0\r
+            self.min_value = 0\r
+            self.timer = Timer(Timer.Timer1)\r
+\r
+        def post_processor_after_instantiation(self):\r
+            EventMesh.subscribe("stopwatch_start", self.start)\r
+            EventMesh.subscribe("stopwatch_stop", self.paused)\r
+            EventMesh.subscribe("stopwatch_reset", self.reset)\r
+            EventMesh.subscribe("get_stopwatch_ms", self.get_ms)\r
+            EventMesh.subscribe("get_stopwatch_sec", self.get_sec)\r
+            EventMesh.subscribe("get_stopwatch_min", self.get_min)\r
+\r
+        def start(self, event, msg):        \r
+            self.timer.start(period=100, mode=self.timer.PERIODIC, callback=self.fun)\r
+        \r
+        def paused(self, event, msg):        \r
+            self.timer.stop()\r
+        \r
+        def reset(self, event, msg):\r
+            self.timer.stop()\r
+\r
+            self.sec_value = 0\r
+            self.min_value = 0\r
+            self.ms_value = 0\r
+\r
+        def fun(self):\r
+            self.ms_value += 1\r
+            if self.ms_value > 9:\r
+                self.ms_value = 0   \r
+                self.sec_value += 1\r
+            if self.sec_value > 60:\r
+                self.sec_value = 0\r
+                self.min_value += 1\r
+            if self.min_value > 60:\r
+                self.timer.stop()\r
+\r
+        def get_ms(self, event=None, msg=None):\r
+            return self.ms_value\r
+\r
+        def get_min(self, event=None, msg=None):\r
+            return self.min_value\r
+\r
+        def get_sec(self, event=None, msg=None):\r
+            return self.sec_value\r
+\r
+    class CountdownManager(Abstract):\r
+        def __init__(self):\r
+            self.sec = 0\r
+            self.min = 0\r
+            self.hour = 0\r
+            self.timer = osTimer()\r
+            self.total = 0\r
+            self.time_cb = 0\r
+            self.time_play = 0\r
+            self.total_sec = 0\r
+\r
+        def post_processor_after_instantiation(self):\r
+            EventMesh.subscribe("add_countdown_sec", self.add_sec)\r
+            EventMesh.subscribe("reduce_countdown_sec", self.reduce_sec)\r
+            EventMesh.subscribe("add_countdown_min", self.add_min)\r
+            EventMesh.subscribe("reduce_countdown_min", self.reduce_min)\r
+            EventMesh.subscribe("add_countdown_hour", self.add_hour)\r
+            EventMesh.subscribe("reduce_countdown_hour", self.reduce_hour)\r
+            EventMesh.subscribe("get_countdown_sec", self.get_sec)\r
+            EventMesh.subscribe("get_countdown_min", self.get_min)\r
+            EventMesh.subscribe("get_countdown_hour", self.get_hour)\r
+\r
+            EventMesh.subscribe("set_countdown_off_state", self.set_countdown_off_state)\r
+            EventMesh.subscribe("get_countdown_off_state", self.get_countdown_off_state)\r
+\r
+\r
+            EventMesh.subscribe("set_countdown_all_time", self.set_countdown_all_time)\r
+            EventMesh.subscribe("get_countdown_all_time", self.get_countdown_all_time)\r
+\r
+            EventMesh.subscribe("countdown_end_cb", self.countdown_end_cb)\r
+\r
+            EventMesh.subscribe("reset_time_countdown",self.reset)\r
+\r
+        def set_countdown_all_time(self, event, msg):\r
+            self.total = msg[0]\r
+            self.total_sec = msg[1]\r
+            # EventMesh.debug_log("self.total:{} self.total_sec:{}".format(self.total,self.total_sec))\r
+\r
+\r
+        def get_countdown_all_time(self, event, msg):\r
+            return self.total\r
+        \r
+        def set_countdown_off_state(self, event, msg):\r
+\r
+            self.time_cb = msg[0]\r
+            self.time_play = msg[1]\r
+            # EventMesh.debug_log("self.time_cb:{} self.total_sec:{}".format(self.time_cb,self.time_play))\r
+\r
+\r
+        def get_countdown_off_state(self, event, msg):\r
+            return [self.time_cb,self.time_play]\r
+        \r
+        def countdown_end_cb(self, event, msg):\r
+            \r
+            if self.time_cb == 1 and self.time_play == 1:\r
+                date_tmp = utime.localtime()\r
+                time_tmp = utime.mktime(date_tmp) \r
+                reduce = time_tmp- self.total_sec\r
+                EventMesh.debug_log("self.time_cb:{} self.time_play:{} self.total:{} self.total_sec:{}".format(self.time_cb,self.time_play, self.total,self.total_sec))\r
+                self.total = self.total - reduce\r
+                if self.total <= 0:\r
+                    self.total = 0\r
+                    self.time_cb = 0\r
+                    self.time_play = 0\r
+                    self.sec = 0\r
+                    self.min = 0\r
+                    self.hour = 0\r
+                    \r
+                    EventMesh.publish("load_screen", {"screen": "countdown_end"})\r
+                    return\r
+                self.total_sec = time_tmp\r
+\r
+\r
+        def add_sec(self, event, msg):\r
+            if self.sec < 59:\r
+                self.sec = self.sec + 1\r
+\r
+        def reduce_sec(self, event, msg):\r
+            if self.sec > 0:\r
+                self.sec = self.sec - 1\r
+\r
+        def add_min(self, event, msg):\r
+            if self.min < 59:\r
+                self.min = self.min + 1\r
+\r
+        def reduce_min(self, event, msg):\r
+            if self.min > 0:\r
+                self.min = self.min - 1\r
+\r
+        def add_hour(self, event, msg):\r
+            if self.hour < 99:\r
+                self.hour = self.hour + 1\r
+\r
+        def reduce_hour(self, event, msg):\r
+            if self.hour > 0:\r
+                self.hour = self.hour - 1\r
+\r
+        def get_sec(self, event=None, msg=None):\r
+            return self.sec\r
+\r
+        def get_min(self, event=None, msg=None):\r
+            return self.min\r
+\r
+        def get_hour(self, event=None, msg=None):\r
+            return self.hour\r
+        \r
+\r
+        \r
+        def reset(self, event=None, msg=None):\r
+            self.hour = 0\r
+            self.min = 0\r
+            self.sec = 0\r
+        \r
+        \r
+\r
+    BATTERY_OCV_TABLE = {\r
+        "nix_coy_mnzo2": {\r
+            55: {\r
+                4290: 100, 4237: 95, 4179: 90, 4123: 85, 4070: 80, 4020: 75, 3963: 70, 3919: 65, 3882: 60, 3847: 55,\r
+                3818: 50, 3794: 45, 3772: 40, 3752: 35, 3733: 30, 3716: 25, 3699: 20, 3677: 15, 3652: 10, 3629: 5, 3400: 0,\r
+            },\r
+            20: {\r
+                4290: 100, 4237: 95, 4179: 90, 4123: 85, 4070: 80, 4020: 75, 3963: 70, 3919: 65, 3882: 60, 3847: 55,\r
+                3818: 50, 3794: 45, 3772: 40, 3752: 35, 3733: 30, 3716: 25, 3699: 20, 3677: 15, 3652: 10, 3629: 5, 3400: 0,\r
+            },\r
+            0: {\r
+                4290: 100, 4237: 95, 4179: 90, 4123: 85, 4070: 80, 4020: 75, 3963: 70, 3919: 65, 3882: 60, 3847: 55,\r
+                3818: 50, 3794: 45, 3772: 40, 3752: 35, 3733: 30, 3716: 25, 3699: 20, 3677: 15, 3652: 10, 3629: 5, 3400: 0,\r
+            },\r
+        },\r
+    }\r
+\r
+\r
+\r
+    class Battery(object):\r
+        """This class is for battery info.\r
+\r
+        This class can get battery voltage and energy.\r
+        if adc_args is not None, use cbc to read battery\r
+\r
+        adc_args: (adc_num, adc_period, factor)\r
+\r
+            adc_num: ADC channel num\r
+            adc_period: Cyclic read ADC cycle period\r
+            factor: calculation coefficient\r
+        """\r
+\r
+        def __init__(self, adc_args=None, chrg_gpion=None, stdby_gpion=None):\r
+            self.__energy = 100\r
+            self.__temp = 55\r
+\r
+            # ADC params\r
+            self.__adc = None\r
+            if adc_args:\r
+                self.__adc_num, self.__adc_period, self.__factor = adc_args\r
+                if not isinstance(self.__adc_num, int):\r
+                    raise TypeError("adc_args adc_num is not int number.")\r
+                if not isinstance(self.__adc_period, int):\r
+                    raise TypeError("adc_args adc_period is not int number.")\r
+                if not isinstance(self.__factor, float):\r
+                    raise TypeError("adc_args factor is not int float.")\r
+                self.__adc = ADC()\r
+\r
+            # Charge params\r
+            self.__charge_callback = None\r
+            self.__charge_status = None\r
+            self.__chrg_gpion = chrg_gpion\r
+            self.__stdby_gpion = stdby_gpion\r
+            self.__chrg_gpio = None\r
+            self.__stdby_gpio = None\r
+            self.__chrg_exint = None\r
+            self.__stdby_exint = None\r
+            if self.__chrg_gpion is not None and self.__stdby_gpion is not None:\r
+                self.__init_charge()\r
+\r
+        def __chrg_callback(self, args):\r
+            self.__update_charge_status()\r
+            if self.__charge_callback is not None:\r
+                self.__charge_callback(self.__charge_status)\r
+\r
+        def __stdby_callback(self, args):\r
+            self.__update_charge_status()\r
+            if self.__charge_callback is not None:\r
+                self.__charge_callback(self.__charge_status)\r
+\r
+        def __update_charge_status(self):\r
+            if self.__chrg_gpio.read() == 1 and self.__stdby_gpio.read() == 1:\r
+                self.__charge_status = 0\r
+            elif self.__chrg_gpio.read() == 0 and self.__stdby_gpio.read() == 1:\r
+                self.__charge_status = 1\r
+            elif self.__chrg_gpio.read() == 1 and self.__stdby_gpio.read() == 0:\r
+                self.__charge_status = 2\r
+            else:\r
+                raise TypeError("CHRG and STDBY cannot be 0 at the same time!")\r
+\r
+        def __init_charge(self):\r
+            self.__chrg_gpio = Pin(self.__chrg_gpion, Pin.IN, Pin.PULL_DISABLE)\r
+            self.__stdby_gpio = Pin(self.__stdby_gpion, Pin.IN, Pin.PULL_DISABLE)\r
+            self.__chrg_exint = ExtInt(self.__chrg_gpion, ExtInt.IRQ_RISING_FALLING, ExtInt.PULL_PU, self.__chrg_callback)\r
+            self.__stdby_exint = ExtInt(self.__stdby_gpion, ExtInt.IRQ_RISING_FALLING, ExtInt.PULL_PU,\r
+                                        self.__stdby_callback)\r
+            self.__chrg_exint.enable()\r
+            self.__stdby_exint.enable()\r
+            self.__update_charge_status()\r
+\r
+        def __get_soc_from_dict(self, key, volt_arg):\r
+            """Get battery energy from map"""\r
+            if key in BATTERY_OCV_TABLE["nix_coy_mnzo2"]:\r
+                volts = sorted(BATTERY_OCV_TABLE["nix_coy_mnzo2"][key].keys(), reverse=True)\r
+                pre_volt = 0\r
+                volt_not_under = 0  # Determine whether the voltage is lower than the minimum voltage value of soc.\r
+                for volt in volts:\r
+                    if volt_arg > volt:\r
+                        volt_not_under = 1\r
+                        soc1 = BATTERY_OCV_TABLE["nix_coy_mnzo2"][key].get(volt, 0)\r
+                        soc2 = BATTERY_OCV_TABLE["nix_coy_mnzo2"][key].get(pre_volt, 0)\r
+                        break\r
+                    else:\r
+                        pre_volt = volt\r
+                # EventMesh.debug_log("__get_soc_from_dict:{}".format(soc2 - (soc2 - soc1) * (pre_volt - volt_arg) // (pre_volt - volt)))\r
+                if pre_volt == 0:  # Input Voltarg > Highest Voltarg\r
+                    return soc1\r
+                elif volt_not_under == 0:\r
+                    return 0\r
+                else:\r
+                    return soc2 - (soc2 - soc1) * (pre_volt - volt_arg) // (pre_volt - volt)\r
+\r
+        def __get_soc(self, temp, volt_arg, bat_type="nix_coy_mnzo2"):\r
+            """Get battery energy by temperature and voltage"""\r
+            if bat_type == "nix_coy_mnzo2":\r
+                if temp > 30:\r
+                    return self.__get_soc_from_dict(55, volt_arg)\r
+                elif temp < 10:\r
+                    return self.__get_soc_from_dict(0, volt_arg)\r
+                else:\r
+                    return self.__get_soc_from_dict(20, volt_arg)\r
+\r
+        def __get_power_vbatt(self):\r
+            return int(sum([Power.getVbatt() for i in range(100)]) / 100)\r
+\r
+        def __get_adc_vbatt(self):\r
+            self.__adc.open()\r
+            utime.sleep_ms(self.__adc_period)\r
+            adc_list = list()\r
+            for i in range(self.__adc_period):\r
+                adc_list.append(self.__adc.read(self.__adc_num))\r
+                utime.sleep_ms(self.__adc_period)\r
+            adc_list.remove(min(adc_list))\r
+            adc_list.remove(max(adc_list))\r
+            adc_value = int(sum(adc_list) / len(adc_list))\r
+            self.__adc.close()\r
+            vbatt_value = adc_value * (self.__factor + 1)\r
+            return vbatt_value\r
+\r
+        def set_temp(self, temp):\r
+            """Set now temperature."""\r
+            if isinstance(temp, int) or isinstance(temp, float):\r
+                self.__temp = temp\r
+                return True\r
+            return False\r
+\r
+        def get_voltage(self):\r
+            """Get battery voltage"""\r
+            if self.__adc is None:\r
+                return self.__get_power_vbatt()\r
+            else:\r
+                return self.__get_adc_vbatt()\r
+\r
+        def get_energy(self,volt_arg ):\r
+            """Get battery energy"""\r
+            if( volt_arg == None) :\r
+                volt_arg = self.get_voltage()\r
+            self.__energy = self.__get_soc(self.__temp, volt_arg)\r
+            # EventMesh.debug_log("get_energy:volt_arg {} __energy{}".format(volt_arg,self.__energy))\r
+            return self.__energy\r
+\r
+        def set_charge_callback(self, charge_callback):\r
+            if self.__chrg_gpion is not None and self.__stdby_gpion is not None:\r
+                if callable(charge_callback):\r
+                    self.__charge_callback = charge_callback\r
+                    return True\r
+            return False\r
+\r
+        def get_charge_status(self):\r
+            return self.__charge_status\r
+\r
+    class BatteryManager(Abstract):\r
+        def __init__(self):\r
+            """电池管理器"""\r
+            self.battery = Battery()\r
+            self.low_battery = False\r
+\r
+        def post_processor_after_instantiation(self):\r
+            """订阅此类所有的事件到 EventMesh中"""\r
+            EventMesh.subscribe("get_battery", self.get_battery)\r
+\r
+        def get_battery(self, event=None, msg=None):\r
+            battery = self.battery.get_energy(msg)\r
+            return battery\r
+\r
+        def get_voltage(self, event=None, msg=None):\r
+            voltage = self.battery.get_voltage()\r
+            return voltage\r
+\r
+    class ConfigStoreManager(Abstract):\r
+        """\r
+        持久化落盘存储\r
+        """\r
+\r
+        def __init__(self):\r
+            self.file_name = "/usr/conf_store.json"\r
+            self.lock = Lock()\r
+            self.map = dict()\r
+\r
+        def post_processor_after_instantiation(self):\r
+            if ql_fs.path_exists(self.file_name):\r
+                self.map = ql_fs.read_json(self.file_name)\r
+            else:\r
+                self.__store()\r
+            EventMesh.subscribe("persistent_config_get", self.__read)\r
+            EventMesh.subscribe("persistent_config_store", self.__store)\r
+\r
+        def __read(self, event, msg):\r
+            with self.lock:\r
+                return self.map.get(msg)\r
+\r
+        def __store(self, event=None, msg=None):\r
+            if msg is None:\r
+                msg = dict()\r
+            with self.lock:\r
+                self.map.update(msg)\r
+                ql_fs.touch(self.file_name, self.map)\r
+            \r
+    class sosInfoCallManager(Abstract):\r
+        # 通讯录\r
+        def __init__(self):\r
+            pass\r
+\r
+        def post_processor_after_instantiation(self):\r
+            EventMesh.subscribe("set_sos_info_call", self.set_sos_info_call)\r
+\r
+        def set_sos_info_call(self, event, msg):\r
+            hangup_mode = EventMesh.publish("get_hangup_mode")\r
+            if hangup_mode == 1:\r
+                EventMesh.publish("set_sos_flag",0)\r
+                EventMesh.publish("set_sos_num",0)\r
+                EventMesh.publish("set_hangup_mode",0)\r
+            EventMesh.debug_log('hangup_mode disconnect',hangup_mode)\r
+            sos_flag = EventMesh.publish("get_sos_flag")\r
+            EventMesh.debug_log('voicecall sos_flag',sos_flag)\r
+            if sos_flag == 0 :\r
+                EventMesh.publish("set_sos_num",0)\r
+            else:\r
+                num = EventMesh.publish("get_sos_num")\r
+                number = EventMesh.publish("get_dial_sos_number")\r
+                if number != None:\r
+                    if len(number) > 0:\r
+                        if num == None:\r
+                            num = 0\r
+                        num+=1\r
+                        num_len = 0\r
+\r
+                        if len(number) == 1:\r
+                            num_len = len(number)+1#三次\r
+                        elif len(number) == 2:\r
+                            num_len = len(number)+1+2 #1+2+1+2\r
+                        elif len(number) == 3:\r
+                            num_len = len(number)+5 #1+3+5\r
+                        # EventMesh.debug_log("number:{} number_len :{} num:{} num_len:{}".format(number,len(number),num,num_len))\r
+                        if num > num_len :\r
+                            if len(number) == 1:\r
+                                number1 = str(number[0])\r
+                                sms.sendPduMsg(number1, '我需要你的帮助', 'UCS2')\r
+                            elif len(number) == 2:\r
+                                number1 = str(number[0])\r
+                                sms.sendPduMsg(number1, '我需要你的帮助', 'UCS2')\r
+\r
+                                number2 = str(number[1])\r
+                                sms.sendPduMsg(number2, '我需要你的帮助', 'UCS2')\r
+                            elif len(number) == 3:\r
+                                number1 = str(number[0])\r
+                                sms.sendPduMsg(number1, '我需要你的帮助', 'UCS2')\r
+                                number2 = str(number[1])\r
+                                sms.sendPduMsg(number2, '我需要你的帮助', 'UCS2')\r
+                                number3 = str(number[2])\r
+                                sms.sendPduMsg(number3, '我需要你的帮助', 'UCS2')\r
+                            EventMesh.publish("set_sos_flag",0)\r
+                            EventMesh.publish("set_sos_num",0)\r
+                        else:\r
+                        # EventMesh.debug_log("number:{} number_len :{}".format(number,len(number)))\r
+                            EventMesh.publish("set_sos_num",num)\r
+                            if len(number) == 1:\r
+                                if len(number[0]) != 0:\r
+                                    EventMesh.publish("set_callnumer_cb",number[0])\r
+                                    EventMesh.debug_log("phone 1")\r
+                            elif len(number) == 2:\r
+                                if num == 1 or num == 3 or num == 5: #1 2 3 4 5 \r
+                                    if len(number[1]) != 0:\r
+                                        EventMesh.debug_log("phone 2")\r
+                                        EventMesh.publish("set_callnumer_cb",number[1])\r
+                                elif num == 2 or num == 4:\r
+                                    if len(number[0]) != 0:\r
+                                        EventMesh.debug_log("phone 3")\r
+                                        EventMesh.publish("set_callnumer_cb",number[0])\r
+                            elif len(number) == 3:\r
+                                if num == 1 or num == 4 or num == 7:\r
+                                    if len(number[1]) != 0:\r
+                                        EventMesh.publish("set_callnumer_cb",number[1])\r
+                                        EventMesh.debug_log("phone 4")\r
+                                elif num == 2 or num == 5 or num == 8:\r
+                                    if len(number[2]) != 0:\r
+                                        EventMesh.debug_log("phone 5")\r
+                                        EventMesh.publish("set_callnumer_cb",number[2])\r
+                                elif num == 3 or num == 6 :\r
+                                    if len(number[0]) != 0:\r
+                                        EventMesh.debug_log("phone 6")\r
+                                        EventMesh.publish("set_callnumer_cb",number[0])   \r
+    \r
+    \r
+    WL_timer = osTimer()   \r
+    def WL_timer_cb(*args):   \r
+        get_call = EventMesh.publish("get_call_state") \r
+        if get_call == 2:#只有拨进来才给接听\r
+            EventMesh.publish("answer_call_event")#接听电话\r
+    def voice_callback(args):\r
+        EventMesh.debug_log('voicecall iinfo:{}'.format(args))\r
+        if args[0] == 10:\r
+                get_UI_high_priority = EventMesh.publish("get_UI_high_priority")#如果在拨出去或者通话中屏蔽来电\r
+                if get_UI_high_priority == 1:\r
+                    EventMesh.publish("set_interrup_incall",1)\r
+                    return\r
+                EventMesh.debug_log('voicecall incoming call, PhoneNO.: ', args[6])\r
+                size_len = len(str(args[6]))\r
+                tmp = []\r
+                tmp = args[6]\r
+                find_num = tmp[0]\r
+                b = tmp[0].isdigit()#判断是否不是数字开头 暂时不用 因为截取了+判断不了 判断号码是否大于11位数,如果大于11位数 并且第一个字符是数字就按照最后11位做存储\r
+\r
+                if b == True and size_len > 11:\r
+                    tmp = tmp[size_len-11:]\r
+                WLKEY = EventMesh.publish("get_storage_config","WLKEY") \r
+                if WLKEY == "1" or WLKEY == "2":#开启了白名单\r
+                    on_list_flag = 0\r
+                    phonebook = EventMesh.publish("get_phonebook_list")\r
+                    phonebook_list = phonebook[1]\r
+                    EventMesh.debug_log("voice_callback:phonebook_list{}".format(phonebook_list))\r
+                    try:\r
+                        for value in phonebook_list.values():\r
+                            if value == args[6]:\r
+                                on_list_flag = 1\r
+                                break\r
+                    except Exception as e:\r
+                        usys.print_exception(e)\r
+                    EventMesh.debug_log("voice_callback:on_list_flag{}".format(on_list_flag))\r
+                    if on_list_flag == 1:#在白名单里\r
+                        if WLKEY == "2":\r
+                            WL_timer.stop()\r
+                            WL_timer.start(30000, 0, WL_timer_cb)\r
+                    else:\r
+                        EventMesh.debug_log("voice_callback:不在白名单中,挂断")\r
+                        voiceCall.callEnd()\r
+                        return \r
+                fall_down = EventMesh.publish("get_fall_down_state")#跌倒报警标识\r
+                if fall_down != 0:\r
+                    voiceCall.callEnd()\r
+                    return\r
+                EventMesh.publish("set_call_state",2) \r
+                EventMesh.publish("dialin_call_event")#电话拨进响铃\r
+                # EventMesh.publish("load_screen", {"screen": "incoming_call","meta":str(tmp)})\r
+\r
+        elif args[0] == 11:\r
+                EventMesh.publish("set_UI_high_priority",0)\r
+                sos_flag = EventMesh.publish("get_sos_flag")\r
+                if sos_flag == 1:\r
+                    sos_flag = 0\r
+                    EventMesh.publish("set_sos_flag",0)\r
+\r
+                EventMesh.debug_log('voicecall connected, PhoneNO.: ', args[6])\r
+                size_len = len(str(args[6]))\r
+                tmp = []\r
+                tmp = args[6]\r
+                find_num = tmp[0]\r
+                b = tmp[0].isdigit()#判断是否不是数字开头 暂时不用 因为截取了+判断不了\r
+                if b == True and size_len > 11:\r
+                    tmp = tmp[size_len-11:]\r
+                EventMesh.publish("set_call_state",3) \r
+                # EventMesh.publish("load_screen", {"screen": "on_call","meta":str(tmp)})\r
+\r
+        elif args[0] == 12:\r
+                set_interrup_call = EventMesh.publish("get_interrup_incall")#打断这次不需要来电的ui事件 以免通话中退出当前界面进不去了\r
+                if set_interrup_call == 1:\r
+                    EventMesh.publish("set_interrup_incall",0)\r
+                    return\r
+\r
+                EventMesh.publish("set_interrup_incall",0)\r
+                EventMesh.publish("set_UI_high_priority",0)\r
+                \r
+\r
+                \r
+                \r
+                EventMesh.publish("set_sos_info_call")  \r
+                flag = EventMesh.publish("get_call_state") \r
+                if flag == 2:\r
+                    EventMesh.publish("stop_led_timer")#设置参数\r
+                    EventMesh.publish("close_timer_all")#\r
+                EventMesh.publish("set_call_state",0) \r
+                EventMesh.debug_log('voicecall disconnect end')\r
+                \r
+\r
+        elif args[0] == 13:\r
+                EventMesh.debug_log('voicecall is waiting, PhoneNO.: ', args[6])\r
+        elif args[0] == 14:\r
+\r
+                EventMesh.debug_log('voicecall dialing, PhoneNO.: ', args[6])\r
+                EventMesh.publish("set_UI_high_priority",0)\r
+                EventMesh.publish("set_call_state",1) \r
+                # EventMesh.publish("load_screen", {"screen": "dialing"})\r
+\r
+                \r
+        elif args[0] == 15:\r
+                EventMesh.debug_log('voicecall alerting, PhoneNO.: ', args[6])\r
+                EventMesh.publish("set_call_state",1) \r
+                \r
+        elif args[0] == 16:\r
+                EventMesh.debug_log('voicecall holding, PhoneNO.: ', args[6])\r
+\r
+    class DeviceInfoManager(Abstract):\r
+        \r
+        """\r
+            设备信息管理\r
+        """\r
+\r
+        def __init__(self):\r
+\r
+            self.DeviceInfo_queue = Queue()\r
+            _thread.stack_size((9+6)*1024)\r
+            _thread.start_new_thread(self.DeviceInfo_queue_thread, ())\r
+            _thread.stack_size(8*1024)\r
+            self.boot_time_count = 0\r
+            self.factory_test_time = 0\r
+            EventMesh.subscribe("publish_message_event_DeviceInfo",self.publish_message_event_DeviceInfo)\r
+            self.key = ""\r
+            self.imei = ""\r
+            self.cid = "ETEST20221014010"\r
+            self.imsi = ""\r
+            self.password = "000000"\r
+            #self.__city = None\r
+            #self.__location = None\r
+            self.timer_push_schedule = osTimer()\r
+            self.timer_pusht_test = osTimer()\r
+            \r
+            #self.battery_push_schedule = osTimer()\r
+            self.check_battery_list = []\r
+            \r
+            self.step = [0,0,0,0]\r
+            self.timer_push=0\r
+            self.timer_push_tmp=60\r
+            self.PING = "0" #绑定状态\r
+            self.connect = 0 #服务器连接状态\r
+            self.KA_time = 0\r
+            self.HR_time = 0\r
+            self.hr_timeSecond = 0\r
+            self.HR_state = 0\r
+            self.HR_Onestate = 0\r
+            self.get_hr_state = 0\r
+            self.get_spo2_state = 0\r
+            self.set_hsenor_crt = 0\r
+            self.HR_OneTime = 0\r
+            self.Hr_Need_Open = 0\r
+            self.Spo2_Need_Open = 0\r
+            self.bat_time = 0\r
+            self.vbat_full_flag = 0\r
+            self.clear_step = 0\r
+            self.test = 0\r
+            self.old_time = 0\r
+            self.UD_time = 0\r
+            self.upload_time = 0\r
+            self.UD_timeout = 7*60\r
+\r
+            self.low_power_AL = 0\r
+\r
+            self.temp_timeSecond = 0\r
+            self.temp_state = 0\r
+            self.temp_one_state = 0\r
+            self.temp_warning = 0\r
+\r
+            self.bg_timeSecond = 0\r
+\r
+            self.bp_timeSecond = 0\r
+            self.bpauto_state = 0\r
+\r
+            self.spo2_timeSecond = 0\r
+            self.spo2auto_state = 0\r
+\r
+            self.vbat_count = 0\r
+\r
+            self.vbat_buf=[]\r
+\r
+            self.curr_battery_level = 4200\r
+            self.bat_count = 0\r
+\r
+            self.mearsure_btn = 0\r
+            self.mearsure_timer = 0\r
+\r
+            self.old_hr_time = 0\r
+            self.old_spo2_time = 0\r
+\r
+            self.no_smi_count = 0\r
+            self.no_smi_state = 0\r
+\r
+            self.old_bp_time = 0\r
+\r
+            self.medicine_count = 0\r
+            self.medicine_flag  = 0\r
+            self.medicine_oldtotalmin = 0\r
+            \r
+            self.wakeup_flag = 0\r
+            self.wakeup_count = 0\r
+            self.wakeup_oldtotalmin = 0\r
+\r
+            self.sleep_flag = 0\r
+            self.sleep_count = 0\r
+            self.sleep_oldtotalmin = 0\r
+\r
+            self.reset_flag = 0\r
+            self.reset_count = 0\r
+            self.reset_oldtotalmin = 0\r
+\r
+            self.home_flag = 0\r
+            self.home_count = 0\r
+            self.home_oldtotalmin = 0\r
+\r
+            self.normal_flag = 0\r
+            self.normal_count = 0\r
+            self.normal_oldtotalmin = 0\r
+            \r
+            self.charge_full_count = 0\r
+            self.GPS_step_t = 0#记录步数\r
+            self.usb = USB()\r
+            self.usb.setCallback(self.usb_event_cb)\r
+            self.log = LogAdapter(self.__class__.__name__)\r
+            self.rtc = RTC()\r
+            self.aud = audio.Audio(0)\r
+            EventMesh.debug_log("DeviceInfoManager:1")\r
+            self.gsensor = SC7A20()\r
+            EventMesh.debug_log("DeviceInfoManager:1.0")\r
+            self.gsensor.activate()\r
+            EventMesh.debug_log("DeviceInfoManager:1.1")\r
+            self.gsensor.init()\r
+            EventMesh.debug_log("DeviceInfoManager:2")\r
+            self.gsensor.set_callback(self.gsensor_cb)\r
+            try :\r
+                self.hsensor = HX3918()\r
+                \r
+            except Exception as e:\r
+                EventMesh.debug_log("Hsensor none HX3918:{}".format(e))   \r
+            try :\r
+                self.hsensor = GH3018()\r
+            except Exception as e:\r
+                EventMesh.debug_log("Hsensor none GH3018:{}".format(e))   \r
+            #\r
+            self.hsensor.activate()\r
+            self.hsensor.init()\r
+            self.hsensor.close()\r
+            try :\r
+                self.hsensor.set_sar(1)\r
+            except Exception as e:\r
+                EventMesh.debug_log("Hsensor none set_sar:{}".format(e)) \r
+            self.old_temp_time = 0\r
+            # #EventMesh.debug_log("hsensor.open_heart:%d\r\n"%(self.hsensor.open_heart()))\r
+            EventMesh.debug_log("DeviceInfoManager:3")\r
+            self.i2c0 = I2C(I2C.I2C0, I2C.FAST_MODE)\r
+            self.stop_temp( None, None)\r
+            self.dev_state = 0\r
+            self.wear = 1\r
+            self.BG_state = 0\r
+            self.old_bg_time = 0\r
+\r
+            self.pull_time = 0\r
+\r
+            self.drink_time = 0\r
+\r
+            self.alarm_count = 0\r
+            self.alarm_flag = 0\r
+\r
+            self.time_count = 0\r
+            \r
+            self.auto_spo2_count = 0\r
+\r
+            self.auto_hr_count = 0\r
+\r
+            self.auto_temp_count = 0\r
+\r
+            self.test_time = 0\r
+\r
+        def post_processor_after_instantiation(self):\r
+            EventMesh.debug_log("post_processor_after_instantiation:1")\r
+            """订阅此类所有的事件到 EventMesh中"""\r
+            # voiceCall.setCallback(voice_callback)\r
+            EventMesh.subscribe("screen_get_ope", self.get_device_ope)\r
+            EventMesh.subscribe("screen_get_sig", self.get_signal)\r
+            EventMesh.subscribe("screen_get_time", self.get_time)\r
+            EventMesh.subscribe("about_get_imei", self.get_imei)\r
+            EventMesh.subscribe("about_get_iccid", self.get_ic_cid)\r
+            EventMesh.subscribe("get_sim_Status", self.get_sim_Status)\r
+            EventMesh.subscribe("about_get_phonenum", self.get_phone_num)\r
+            EventMesh.subscribe("screen_get_battery", self.get_battery)\r
+            EventMesh.subscribe("set_curr_battery_level", self.set_curr_battery_level)\r
+            EventMesh.subscribe("get_curr_battery_level", self.get_curr_battery_level)\r
+            EventMesh.subscribe("get_fw_version", self.get_device_fw_version)\r
+            EventMesh.subscribe("get_standby_time", self.get_standby_time)\r
+            EventMesh.subscribe(constants.EVENT.GET_STEP, self.get_step_count)\r
+            EventMesh.subscribe("sim_slot_get", self.sim_slot_get)\r
+            EventMesh.subscribe("sim_slot_switch", self.sim_slot_switch)\r
+            EventMesh.subscribe(constants.EVENT.GET_KEY, self.get_key)\r
+            EventMesh.subscribe(constants.EVENT.SET_KEY, self.set_key)\r
+            EventMesh.subscribe(constants.EVENT.GET_IMEI, self.get_imei)\r
+            EventMesh.subscribe(constants.EVENT.GET_CID, self.get_cid)\r
+            EventMesh.subscribe(constants.EVENT.SET_CID, self.set_cid)\r
+            EventMesh.subscribe(constants.EVENT.GET_IMSI, self.get_imsi)\r
+            EventMesh.subscribe(constants.EVENT.GET_PASSWORD, self.get_password)\r
+            EventMesh.subscribe(constants.EVENT.SET_PASSWORD, self.set_password)     \r
+            EventMesh.subscribe(constants.EVENT.SET_PING, self.set_ping)\r
+            EventMesh.subscribe(constants.EVENT.GET_PING, self.get_ping)\r
+            EventMesh.subscribe(constants.EVENT.SET_CONNECT, self.set_connect)\r
+            EventMesh.subscribe(constants.EVENT.GET_CONNECT, self.get_connect)\r
+\r
+            \r
+            EventMesh.subscribe(constants.EVENT.START_BLOOD_OXYGEN, self.start_blood_oxygen)\r
+            EventMesh.subscribe(constants.EVENT.START_HEART, self.start_heart)\r
+            EventMesh.subscribe(constants.EVENT.STOP_BLOOD_OXYGEN, self.stop_blood_oxygen)\r
+            EventMesh.subscribe(constants.EVENT.STOP_HEART, self.stop_heart)\r
+            EventMesh.subscribe(constants.EVENT.GET_BLOOD_OXYGEN, self.get_blood_oxygen)\r
+            EventMesh.subscribe(constants.EVENT.GET_HEART, self.get_heart)\r
+            EventMesh.subscribe(constants.EVENT.GET_WEAR, self.get_wear)\r
+            EventMesh.subscribe("get_Hsensor", self.get_Hsensor)\r
+            EventMesh.subscribe("Hsensor_set_sleep", self.Hsensor_set_sleep)\r
+\r
+            EventMesh.subscribe(constants.EVENT.START_TEMP, self.start_temp)\r
+            EventMesh.subscribe(constants.EVENT.STOP_TEMP, self.stop_temp)\r
+            EventMesh.subscribe(constants.EVENT.GET_TEMP, self.get_temp)\r
+            EventMesh.subscribe("get_boot_time_count", self.get_boot_time_count)\r
+            EventMesh.subscribe("get_factory_test_time", self.get_factory_test_time)\r
+            EventMesh.subscribe("get_dev_state", self.get_dev_state)\r
+            EventMesh.subscribe("set_dev_state", self.set_dev_state)\r
+\r
+            EventMesh.subscribe("clear_health_state", self.clear_health_state)\r
+\r
+            EventMesh.subscribe("clear_home_alarm", self.clear_home_alarm)\r
+            EventMesh.subscribe("clear_medicine_alarm", self.clear_medicine_alarm)\r
+            EventMesh.subscribe("clear_wakeup_alarm", self.clear_wakeup_alarm)\r
+            EventMesh.subscribe("clear_sleep_alarm", self.clear_sleep_alarm)\r
+            EventMesh.subscribe("clear_normal_alarm", self.clear_normal_alarm)\r
+\r
+            EventMesh.subscribe("clear_manual_hr_flag", self.clear_manual_hr_flag)\r
+            EventMesh.subscribe("clear_manual_temp_flag", self.clear_manual_temp_flag)\r
+\r
+\r
+            EventMesh.subscribe("clear_usb_flag", self.clear_usb_flag)\r
+            \r
+            EventMesh.debug_log("post_processor_after_instantiation:2")\r
+            self.timer_push_schedule.start(10000, 1, self.publish_event_cb)\r
+            # self.timer_pusht_test.start(2000, 1, self.publish_test)\r
+            # self.battery_push_schedule.start(3000, 1, self.__check_battery)\r
+            self.log.debug("post_processor_after_instantiation finished")\r
+            #EventMesh.publish(constants.EVENT.START_HEART)\r
+            # 设备开机立刻更新一次参数\r
+            self.publish_event_cb()\r
+            \r
+            EventMesh.debug_log("post_processor_after_instantiation:3")\r
+\r
+        def clear_manual_hr_flag(self,event,msg):\r
+            self.auto_hr_count = 0\r
+        \r
+        def clear_manual_temp_flag(self,event,msg):\r
+            self.auto_temp_count = 0\r
+\r
+        def publish_message_event_DeviceInfo(self,event,msg):\r
+            self.DeviceInfo_queue.put(msg)\r
+\r
+        #DeviceInfo的消息队列处理,防止卡顿\r
+        def DeviceInfo_queue_thread(self):\r
+            while True:\r
+                data = self.DeviceInfo_queue.get()\r
+                #EventMesh.debug_log("DeviceInfo_queue_thread:data = {}".format(data))\r
+                if data != None:\r
+                    try:\r
+                        data["func"](data["data"])\r
+                    except Exception as e:\r
+                        EventMesh.debug_log("DeviceInfo_queue_thread:ERROR:{}".format(e))\r
+                        usys.print_exception(e)\r
+\r
+\r
+        def gsensor_cb(self, para):\r
+            EventMesh.debug_log("gsensor_cb:{}".format(para))\r
+            flip_sw = EventMesh.publish("get_storage_config","flip_sw")\r
+            fall_sw = EventMesh.publish("get_storage_config","fall_sw")\r
+            if para == 0: #跌倒报警\r
+                pass\r
+                if fall_sw == "1":\r
+                    EventMesh.publish("falldown_alarm_event")\r
+                    dev_state =  EventMesh.publish("get_dev_state")\r
+\r
+                    tmp = 1 << 21\r
+                    dev_state = dev_state|tmp #第21位=1\r
+                    EventMesh.publish("set_dev_state",dev_state)\r
+                    EventMesh.publish(constants.EVENT.START_LOCATION,[constants.PROTOCOL.AL_SEND,dev_state]) #开始AL定位\r
+                    pass\r
+                #EventMesh.publish("load_screen", {"screen": "FIND"})\r
+            elif para == 1: #抬腕\r
+                \r
+                if flip_sw == 1:\r
+                    EventMesh.publish(constants.EVENT.SYSTEM_UP)\r
+                \r
+            elif para == 2: #放手\r
+                pass\r
+                # if flip_sw == 1:\r
+                #     EventMesh.publish(constants.EVENT.SYSTEM_SLEEP)\r
+        def get_boot_time_count(self, event, msg):\r
+            return self.boot_time_count\r
+        \r
+        def get_factory_test_time(self, event, msg):\r
+            return self.factory_test_time\r
+        \r
+        def get_dev_state(self, event, msg):\r
+            return self.dev_state\r
+        def set_dev_state(self, event, msg):\r
+            self.dev_state = msg\r
+        \r
+        def publish_event_cb(self, *args, **kwargs):\r
+            \r
+            open_power = EventMesh.publish("get_power_on_state")#获取开机标识\r
+            if open_power != None:\r
+                if open_power == 1:\r
+                    if self.boot_time_count < 50000000:\r
+                        self.boot_time_count += 10\r
+                    if self.factory_test_time < 300:\r
+                        self.factory_test_time+=10\r
+                #EventMesh.debug_log("boot_time_count:{}".format(self.boot_time_count))\r
+            EventMesh.publish("publish_message_event_DeviceInfo",{"func":self.publish_event,"data":0})  \r
+        def optimize_temp(self,temp):\r
+            temp += 0.5\r
+            get_temp_time  = EventMesh.publish("get_temp_time")\r
+            EventMesh.debug_log("temp:{}".format(temp))\r
+            if temp < 36 :#or temp > 37.5:\r
+                temp = 36+urandom.random()\r
+            if temp > 37.5:\r
+                \r
+                self.temp_warning += 1\r
+                EventMesh.debug_log("temp_warning:{} get_temp_time{}".format(self.temp_warning,get_temp_time))\r
+                \r
+                if self.temp_warning < 5:#高温没连续超过3次,和谐成37.5度以下\r
+                    temp = 37+(urandom.randint(1, 4)/10)\r
+                else:\r
+                    self.temp_warning = 0\r
+            else:\r
+                if self.temp_warning>=1:\r
+                    self.temp_warning -= 1\r
+            if temp >= 40:\r
+                temp = 40\r
+            return temp\r
+        def clear_health_state(self,event,msg):\r
+            print("clear_health_state")\r
+            self.old_bp_time = 0#关闭心率 血压 血氧 体温清除标志\r
+            self.old_time = 0\r
+            self.HR_Onestate = 0\r
+            self.HR_OneTime = 0\r
+            self.HR_state = 0\r
+            self.set_hsenor_crt = 0\r
+            self.old_bg_time = 0\r
+            self.old_hr_time = 0\r
+            self.old_spo2_time = 0\r
+            self.BG_state = 0\r
+            self.bpauto_state = 0\r
+            self.spo2auto_state = 0\r
+            pass\r
+\r
+        def clear_temp_state(self,event,msg):\r
+            print("clear_temp_state")\r
+            self.temp_state = 0\r
+            self.temp_one_state = 0\r
+            self.old_temp_time = 0\r
+            pass\r
+\r
+        def publish_event(self,data):\r
+            """\r
+            定时事件处理\r
+            :param args:\r
+            :param kwargs:\r
+            :return:\r
+            """\r
+\r
+            date_tmp = utime.localtime()\r
+            time_tmp = utime.mktime(date_tmp)\r
+            # EventMesh.debug_log("date_tmp......01....{} time_tmp:{}\r\n".format(date_tmp,time_tmp))\r
+            \r
+\r
+            EventMesh.publish("countdown_end_cb")\r
+            """定时检查是否关闭gps失败"""\r
+            # gnss_state = quecgnss.get_state()\r
+            # get_location_flag = EventMesh.publish("get_location_flag")\r
+            # if get_location_flag != None:\r
+            #     # if gnss_state == 2 and get_location_flag == 0:\r
+            #     #     EventMesh.publish(constants.EVENT.GPSCLOSE)\r
+            #     if(get_location_flag == 0):\r
+            #         EventMesh.publish(constants.EVENT.START_LOCATION,constants.PROTOCOL.UD_SEND) #开始UD定位\r
+\r
+            """7分钟一次心跳"""\r
+            if EventMesh.platform == "gewu":\r
+                if  math.fabs(time_tmp - self.KA_time) > gheartbeat_time: #7分钟一次心跳\r
+                    self.KA_time = time_tmp\r
+                    EventMesh.publish(constants.PROTOCOL.KA_SEND)\r
+            else:\r
+                if  math.fabs(time_tmp - self.KA_time) > heartbeat_time: #7分钟一次心跳\r
+                    self.KA_time = time_tmp\r
+                    EventMesh.publish(constants.PROTOCOL.KA_SEND)\r
+\r
+            """定时定位"""\r
+            #EventMesh.publish("set_upload_data",3*60)\r
+            self.upload_time = EventMesh.publish("get_upload_data")\r
+            #EventMesh.debug_log("self.upload_time:{} math.fabs(time_tmp - self.UD_time):{}".format(self.upload_time,math.fabs(time_tmp - self.UD_time)))\r
+            if self.upload_time != None :\r
+                if  math.fabs(time_tmp - self.UD_time) > self.upload_time: #30分钟一次定位\r
+                    self.UD_time = time_tmp\r
+                    status_tmp = self.gsensor.get_status()#获取运动次数\r
+                    #status_tmp = 4\r
+                    #EventMesh.txt_log("status_count:{}".format(status_tmp))\r
+                    if EventMesh.publish(constants.EVENT.GET_CONNECT) == 1 and status_tmp > 3 :\r
+                        EventMesh.publish(constants.EVENT.START_LOCATION,constants.PROTOCOL.UD_SEND) #开始UD定位\r
+                        self.gsensor.clean_status()#清除运动次数\r
+                    else : #关闭定位\r
+                        #EventMesh.txt_log("NO status")\r
+                        EventMesh.debug_log("NO status")\r
+                        EventMesh.publish(constants.EVENT.CLOSE_LOCATION)#关闭定位 \r
+            \r
+            EventMesh.publish(constants.EVENT.PUSH_STEP, self.get_step_count())\r
+\r
+            """电池平均值"""\r
+            temp = Power.getVbatt()\r
+            if self.bat_count < 10:\r
+                self.vbat_buf.append(temp)\r
+                self.bat_count += 1\r
+            else:\r
+                for i in range(9):\r
+                    self.vbat_buf[i] = self.vbat_buf[i+1]\r
+                self.vbat_buf[9] = temp\r
+            curr_count = len(self.vbat_buf)\r
+            bat_total_value = 0\r
+            for i in range(curr_count):\r
+                bat_total_value += self.vbat_buf[i]\r
+            bat_total_value = bat_total_value//curr_count#一分钟更新一次电量 10个平均值\r
+            EventMesh.publish("set_curr_battery_level",bat_total_value)\r
+            # EventMesh.debug_log("self.vbat_buf:{} curr_count :{} bat_total_value:{} temp:{}".format(self.vbat_buf,curr_count,bat_total_value,temp))\r
+            bat_tmp = EventMesh.publish("screen_get_battery")\r
+            self.vbat_count+=10\r
+            if self.vbat_count >= 60:\r
+                self.vbat_count = 0\r
+                if bat_tmp != None:\r
+                    bat_value = bat_tmp[1]\r
+                    if bat_value <= 0:\r
+                        pass\r
+                        # EventMesh.publish("load_screen", {"screen": "LOW_ONE_POWER"})\r
+            \r
+            \r
+            """"隔天清步数"""\r
+\r
+            data = RTC().datetime()\r
+\r
+            hour = int(data[4])\r
+            min = int(data[5])\r
+\r
+\r
+\r
+            cur_month = int(data[1])\r
+            cur_day = int(data[2])\r
+            cur_year = int(data[0])\r
+\r
+            old_Timesec = EventMesh.publish("get_old_time_data")\r
+            # EventMesh.debug_log("hour:{} {} cur_month:{} {} next_alarm_time:{} old_Timesec:{}".format(hour,min,cur_month,cur_day,next_alarm_time,old_Timesec))\r
+            # EventMesh.debug_log("old_Timesec",old_Timesec)\r
+            if old_Timesec != None:\r
+                next_alarm_time = utime.localtime(int(old_Timesec))\r
+                month = int(next_alarm_time[1]) #00:00 18\r
+                day = int(next_alarm_time[2])\r
+                year = int(next_alarm_time[0])\r
+                if month != cur_month or day != cur_day or year != cur_year:#年 月 日只要其中一个都不一样就清零\r
+                    EventMesh.publish("set_old_time_data",time_tmp)\r
+                    self.gsensor.reset_step()\r
+\r
+                    EventMesh.publish("set_old_step_value",0)\r
+                    \r
+                    hr = EventMesh.publish("get_old_hr_data")\r
+                    if hr != 0:\r
+                        EventMesh.publish("set_old_hr_data", 0)\r
+                    \r
+                    spo2 = EventMesh.publish("get_old_spo2_data")\r
+                    if spo2 != 0:\r
+                        EventMesh.publish("set_old_spo2_data", 0)\r
+                    EventMesh.debug_log("clear step1111")\r
+                else:\r
+                    pass\r
+                    \r
+                    \r
+            if hour == 23:#清步数23:59\r
+                if min == 59:#58 59\r
+                    # if self.clear_step == 0:\r
+                    #     self.clear_step = 1\r
+                    EventMesh.publish("set_old_time_data",time_tmp)\r
+                    self.gsensor.reset_step()\r
+                    EventMesh.publish("set_old_step_value",0)\r
+\r
+                    hr = EventMesh.publish("get_old_hr_data")\r
+                    if hr != 0:\r
+                        EventMesh.publish("set_old_hr_data", 0)\r
+                    \r
+                    spo2 = EventMesh.publish("get_old_spo2_data")\r
+                    if spo2 != 0:\r
+                        EventMesh.publish("set_old_spo2_data", 0)\r
+                    EventMesh.debug_log("clear step2222")\r
+\r
+                else:\r
+                    self.clear_step = 0\r
+            else:\r
+                self.clear_step = 0\r
+            \r
+            """电量小于0% 关机"""\r
+            get_low_btn = EventMesh.publish("get_low_bat_btn")#\r
+            battery = EventMesh.publish("screen_get_battery")\r
+            if battery != None:\r
+                power = int(battery[1])\r
+                if battery[0] != '1':\r
+                    if power == 0:\r
+                        EventMesh.publish("open_power_on",2)#  \r
+                    """"低电报警"""\r
+                    # print("low power!!!!!!!!!!! %d",self.low_power_AL)\r
+                    if power <= 15 and self.low_power_AL==0:\r
+                        self.low_power_AL = 1\r
+                        dev_state =  EventMesh.publish("get_dev_state")\r
+\r
+                        tmp = 1 << 17\r
+                        dev_state = dev_state|tmp #第17位=1\r
+                        EventMesh.publish("set_dev_state",dev_state)\r
+                        EventMesh.publish(constants.EVENT.START_LOCATION,[constants.PROTOCOL.AL_SEND,dev_state]) #开始AL定位\r
+\r
+                if power >= 50:\r
+                    self.low_power_AL = 0\r
+\r
+            """未联网提示关机"""\r
+            ble=EventMesh.publish(constants.EVENT.GET_CONNECT)\r
+            # EventMesh.debug_log("ble",ble)\r
+            if ble == 0:#未联网提示关机\r
+                if battery[0] != '1':\r
+                    self.no_smi_count+=10\r
+                    # EventMesh.debug_log("self.no_smi_count",self.no_smi_count)\r
+                    if self.no_smi_count >= (15*60):#(15*60)\r
+                        self.no_smi_count = 0\r
+                        EventMesh.publish("open_power_on",2)#  #未检测到sim卡15分钟后关机\r
+                    \r
+            else:\r
+                self.no_smi_count = 0\r
+\r
+            msg_nums = sms.getMsgNums() #获取短信条数\r
+            # EventMesh.debug_log("msg_nums",msg_nums)\r
+            if(msg_nums != -1):\r
+                sms_data = sms.getSaveLoc()\r
+                sms_max = sms_data[0][2]\r
+                if msg_nums >= sms_max-1:\r
+                    EventMesh.publish("delete_sms_event")#\r
+\r
+            #佩戴检测\r
+            WEAR = EventMesh.publish(constants.EVENT.GET_WEAR)#佩戴数据\r
+            if self.wear != WEAR:\r
+                remove_sw = EventMesh.publish("get_storage_config","remove_sw")\r
+                if remove_sw == "1":#开启了佩戴检测的开关\r
+                    dev_state =  EventMesh.publish("get_dev_state")\r
+                    \r
+                    if WEAR != 1:\r
+                        tmp = 1 << 3\r
+                        tmp = ~tmp\r
+                        tmp = 1 << 20\r
+                        dev_state = dev_state|tmp #第20位=1\r
+                    # else :     \r
+                    #     pass              \r
+                        \r
+                    #     tmp = 1 << 20\r
+                    #     dev_state = dev_state|tmp #第20位=1\r
+                    #     tmp = 1 << 3\r
+                    #     dev_state = dev_state|tmp #第三位=1\r
+                        EventMesh.debug_log("佩戴检测:{}".format(dev_state))    \r
+                        EventMesh.publish("set_dev_state",dev_state)\r
+                        EventMesh.publish(constants.EVENT.START_LOCATION,[constants.PROTOCOL.AL_SEND,dev_state]) #开始AL定位,发送报警\r
+                        #EventMesh.publish(constants.PROTOCOL.HELP_SEND,65)\r
+            self.wear = WEAR\r
+            """定时测量心率,血氧,体温"""\r
+            self.get_hr_state = EventMesh.publish("get_hr_state")\r
+            self.get_spo2_state = EventMesh.publish("get_spo2_state")\r
+            get_temp_time  = EventMesh.publish("get_temp_time")\r
+            get_temp_state  = EventMesh.publish("get_temp_state")\r
+            get_bp_state  = EventMesh.publish("get_bp_state")\r
+            get_bg_state  = EventMesh.publish("get_bg_state")\r
+            if get_bg_state == None:\r
+                get_bg_state = 0\r
+            if get_bp_state == None:\r
+                get_bp_state = 0\r
+\r
+            if get_temp_state == None:\r
+                get_temp_state = 0\r
+\r
+            if self.get_hr_state == None:\r
+                self.get_hr_state = 0\r
+            if self.get_spo2_state == None:\r
+                self.get_spo2_state = 0 \r
+        \r
+            call_state = EventMesh.publish("get_call_state")\r
+            if call_state == None:\r
+                call_state = 0\r
+            if battery[0] != "1":\r
+                if get_temp_state != None and call_state != None: #突然脱腕\r
+\r
+                    if get_temp_state > 1  and (WEAR != 1 or call_state != 0):\r
+                        EventMesh.publish(constants.EVENT.STOP_TEMP)\r
+                        EventMesh.publish("set_temp_state",0)\r
+                        EventMesh.txt_log("auto stop_temp:22")\r
+\r
+                    if (self.get_hr_state > 1 or self.get_spo2_state > 1 or get_bp_state > 1 or get_bg_state > 1) and (WEAR != 1 or call_state != 0):\r
+                        # print("wear faile")\r
+                        if self.get_hr_state > 1 :\r
+                            EventMesh.txt_log("auto stop_hr:22")\r
+                            EventMesh.publish("set_hr_state",0)#2代表后台进入测试,定时测心率 1ui界面测试洗心率 \r
+                            EventMesh.publish(constants.EVENT.STOP_HEART) \r
+                            if WEAR == 1:\r
+                                heart_value = EventMesh.publish(constants.EVENT.GET_HEART)\r
+                                if heart_value >= 50 and heart_value != None:\r
+                                    EventMesh.publish(constants.PROTOCOL.HEART_SEND,heart_value)#上传心率数据\r
+                            \r
+                        if self.get_spo2_state > 1:\r
+                            EventMesh.txt_log("auto stop_spo2:22")\r
+                            EventMesh.publish("set_spo2_state",0)#2代表后台进入测试\r
+\r
+                            EventMesh.publish(constants.EVENT.STOP_BLOOD_OXYGEN)\r
+                            spo2_value = EventMesh.publish(constants.EVENT.GET_BLOOD_OXYGEN)\r
+                            if WEAR == 1:\r
+                                if spo2_value > 85 and spo2_value != None:\r
+                                    EventMesh.publish(constants.PROTOCOL.OXYGEN_SEND,spo2_value)\r
+                            \r
+                        if get_bp_state > 1:\r
+                            EventMesh.txt_log("auto stop_bp:22")\r
+                            EventMesh.publish("set_bp_state",0)#2代表后台进入测试\r
+                            EventMesh.publish(constants.EVENT.STOP_HEART)\r
+                            if WEAR == 1:\r
+                                blood_data = get_autoblood_value()\r
+                                if blood_data == None:\r
+                                    blood_data[0] = 0\r
+                                    blood_data[1] = 0\r
+\r
+                                max_value = blood_data[0]\r
+                                min_value = blood_data[1]\r
+                                if max_value != 0 and min_value != 0:\r
+                                    EventMesh.publish(constants.PROTOCOL.BLOOD_SEND,[max_value,min_value])\r
+                            \r
+                        if get_bg_state > 1:\r
+                            EventMesh.txt_log("auto stop_bg:22")\r
+                            EventMesh.publish("set_bg_state",0)#2代表后台进入测试\r
+                            EventMesh.publish(constants.EVENT.STOP_HEART)\r
+                            if WEAR == 1:\r
+                                bg_data = get_blood_sugar_value()\r
+                                if bg_data == None:\r
+                                    bg_data = 0\r
+                                if bg_data != 0:\r
+                                    # EventMesh.publish("play_sugar_value", bg_data)#播放血糖数值\r
+                                    EventMesh.publish(constants.PROTOCOL.BLOODGLUSOCE_SEND,bg_data)\r
+                            \r
+            if self.pull_time == 0:\r
+                self.pull_time = time_tmp\r
+            # if EventMesh.publish(constants.EVENT.GET_CONNECT) == 1:#已联网 并且不在充电 佩戴正常 不在通话就给测试心率\r
+            if EventMesh.publish(constants.EVENT.GET_CONNECT) == 1 and battery[0] != "1" and WEAR == 1 and call_state == 0:\r
+                #防止时间校时出错\r
+                if time_tmp < self.pull_time :\r
+                    self.pull_time = time_tmp\r
+                if time_tmp < self.temp_timeSecond:\r
+                    self.temp_timeSecond = time_tmp\r
+                if time_tmp < self.hr_timeSecond:\r
+                    self.hr_timeSecond = time_tmp\r
+                if time_tmp < self.spo2_timeSecond :\r
+                    self.spo2_timeSecond = time_tmp\r
+                if time_tmp < self.bp_timeSecond:\r
+                    self.bp_timeSecond = time_tmp\r
+                if time_tmp < self.bg_timeSecond:\r
+                     self.bg_timeSecond = time_tmp\r
+                     \r
+                if time_tmp - self.pull_time >= 30:\r
+                    # EventMesh.debug_log("shifens:")  \r
+\r
+                    get_hr_state = EventMesh.publish("get_hr_state")\r
+                    get_spo2_state = EventMesh.publish("get_spo2_state")\r
+                    get_bp_state  = EventMesh.publish("get_bp_state")\r
+                    get_bg_state  = EventMesh.publish("get_bg_state")\r
+                    get_temp_state  = EventMesh.publish("get_temp_state")\r
+                    if get_hr_state == None:\r
+                        get_hr_state = 0\r
+                        self.old_hr_time = 0\r
+\r
+                    if get_spo2_state == None:\r
+                        get_spo2_state = 0\r
+                        self.old_spo2_time = 0\r
+\r
+                    if get_temp_state == None:\r
+                        get_temp_state = 0\r
+                        self.temp_one_state = 0\r
+\r
+                    if get_bp_state == None:\r
+                        get_bp_state = 0\r
+                        self.old_bp_time = 0\r
+                    \r
+                    if get_bg_state == None:\r
+                        get_bg_state = 0\r
+                        self.old_bg_time = 0\r
+                    \r
+                    # print("bp get_bp_state ",get_bp_state,self.old_bp_time)\r
+\r
+                    \r
+                    if get_hr_state != None:\r
+                        if get_hr_state == 3:\r
+                            self.old_hr_time+=1\r
+                            if self.old_hr_time == 1:\r
+                                EventMesh.publish("set_hr_state",3)#2代表后台进入测试\r
+                                # EventMesh.publish("set_hr_blood_led",1)\r
+                                EventMesh.publish(constants.EVENT.START_HEART)\r
+                                EventMesh.txt_log("auto start_hr:333")\r
+                            elif self.old_hr_time > 6:\r
+                                self.old_hr_time = 0\r
+                                EventMesh.publish("set_hr_state",0)#2代表后台进入测试\r
+                                EventMesh.txt_log("auto stop_hr:333")\r
+                                EventMesh.publish(constants.EVENT.STOP_HEART)\r
+                                heart_value = EventMesh.publish(constants.EVENT.GET_HEART)\r
+                                EventMesh.debug_log("heart_value:{}".format(heart_value))\r
+                                if heart_value >= 50 and heart_value != None:\r
+                                    EventMesh.publish(constants.PROTOCOL.HEART_SEND,heart_value)#上传心率数据\r
+                                EventMesh.debug_log("STOP_HEART:3")\r
+                        else:\r
+                            self.old_hr_time = 0\r
+                    else:\r
+                        self.old_hr_time = 0\r
+\r
+\r
+                    if get_spo2_state != None:\r
+                        if get_spo2_state == 3:\r
+                            self.old_spo2_time+=1\r
+                            if self.old_spo2_time == 1:\r
+                                EventMesh.publish("set_spo2_state",3)#2代表后台进入测试\r
+                                # EventMesh.publish("set_hr_blood_led",1)\r
+                                EventMesh.publish(constants.EVENT.START_BLOOD_OXYGEN)#K开血氧\r
+                                EventMesh.txt_log("auto start_spo2:333")\r
+                            elif self.old_spo2_time > 6:\r
+                                self.old_spo2_time = 0\r
+                                EventMesh.txt_log("auto stop_spo2:333")\r
+                                EventMesh.publish("set_spo2_state",0)#2代表后台进入测试\r
+                                EventMesh.publish(constants.EVENT.STOP_BLOOD_OXYGEN)\r
+                                spo2_value = EventMesh.publish(constants.EVENT.GET_BLOOD_OXYGEN)\r
+                                if spo2_value > 85 and spo2_value != None:\r
+                                    EventMesh.publish(constants.PROTOCOL.OXYGEN_SEND,spo2_value)\r
+                                    \r
+                        else:\r
+                            self.old_spo2_time = 0\r
+                    else:\r
+                        self.old_spo2_time = 0\r
+\r
+\r
+                    if get_bp_state != None:\r
+                        if get_bp_state == 3:\r
+                            self.old_bp_time+=1\r
+                            if self.old_bp_time == 1:\r
+                                EventMesh.publish("set_bp_state",3)#2代表后台进入测试\r
+                                # EventMesh.publish("set_hr_blood_led",1)\r
+                                EventMesh.publish(constants.EVENT.START_HEART)\r
+                                EventMesh.txt_log("auto start_bp:333")\r
+                            elif self.old_bp_time > 6:\r
+                                self.old_bp_time = 0\r
+                                \r
+                                EventMesh.publish("set_bp_state",0)#2代表后台进入测试\r
+                                # EventMesh.publish("stop_led_timer")#设置参数\r
+                                blood_data = get_autoblood_value()\r
+                                if blood_data == None:\r
+                                    blood_data[0] = 0\r
+                                    blood_data[1] = 0\r
+\r
+                                max_value = blood_data[0]\r
+                                min_value = blood_data[1]\r
+                                if max_value != 0 and min_value != 0:\r
+                                    EventMesh.publish(constants.PROTOCOL.BLOOD_SEND,[max_value,min_value])\r
+                                EventMesh.publish(constants.EVENT.STOP_HEART)\r
+                                EventMesh.txt_log("auto stop_bp:333")\r
+                        else:\r
+                            self.old_bp_time = 0\r
+                    else:\r
+                        self.old_bp_time = 0\r
+\r
+                    if get_bg_state != None:\r
+                        if get_bg_state == 3:\r
+                            self.old_bg_time+=1\r
+                            if self.old_bg_time == 1:\r
+                                EventMesh.publish("set_bg_state",3)#2代表后台进入测试\r
+                                # EventMesh.publish("set_hr_blood_led",1)\r
+                                EventMesh.publish(constants.EVENT.START_HEART)\r
+                                EventMesh.txt_log("auto start_bg:333")\r
+                            elif self.old_bg_time > 6:\r
+                                self.old_bg_time = 0\r
+                                EventMesh.publish("set_bg_state",0)#2代表后台进入测试\r
+                                EventMesh.publish(constants.EVENT.STOP_HEART)\r
+                                # EventMesh.publish("stop_led_timer")#设置参数\r
+                                bg_data = get_blood_sugar_value()\r
+                                if bg_data == None:\r
+                                    bg_data = 0\r
+                                if bg_data != 0:\r
+                                    EventMesh.publish(constants.PROTOCOL.BLOODGLUSOCE_SEND,bg_data)\r
+\r
+                                EventMesh.txt_log("auto stop_bp:333")\r
+                        else:\r
+                            self.old_bg_time = 0\r
+                    else:\r
+                        self.old_bg_time = 0\r
+\r
+                    \r
+                    if get_temp_state != None:\r
+                        if get_temp_state == 3:#单次测量\r
+                            self.temp_one_state+=1\r
+                            if self.temp_one_state == 1:\r
+                                EventMesh.txt_log("auto start_temp:333")\r
+                                EventMesh.debug_log("AUTO one temp:2") \r
+                                EventMesh.publish("set_temp_state",3)\r
+                                # EventMesh.publish("set_hr_blood_led",1)\r
+                                EventMesh.publish(constants.EVENT.START_TEMP)   \r
+                            elif self.temp_one_state > 3:\r
+                                self.temp_one_state = 0\r
+                                temp = EventMesh.publish(constants.EVENT.GET_TEMP) \r
+                                temp = self.optimize_temp(temp)\r
+                                \r
+                                EventMesh.publish("set_temp_state",0)\r
+                                tmp_f_tmp = 0\r
+                                tmp_d_tmp = 0\r
+                                if str(temp).find(".") != -1:\r
+                                    tmp_f = str(temp).split('.')[0] \r
+                                    tmp_f_tmp = int(tmp_f)\r
+                                    \r
+                                    tmp_d = str(temp).split('.')[1][:1]\r
+                                    tmp_d_tmp = int(tmp_d)\r
+                                else:\r
+                                    tmp_f_tmp = temp\r
+                                    \r
+                                if temp != None:\r
+                                    if temp != 0:\r
+                                        EventMesh.publish(constants.PROTOCOL.TEMP_SEND,[tmp_f_tmp,tmp_d_tmp])\r
+                                EventMesh.publish(constants.EVENT.STOP_TEMP)\r
+                                EventMesh.txt_log("auto start_temp:333")\r
+                        else:\r
+                            self.temp_one_state = 0\r
+\r
+\r
+        \r
+                    \r
+                    # EventMesh.debug_log("get_temp_time:{} self.temp_one_state:{}".format(get_temp_time,self.temp_one_state))\r
+                    if get_temp_time != None:#定时测量体温\r
+                        if get_temp_time > 0:\r
+                            if get_temp_state != None:\r
+                                get_temp_state  = EventMesh.publish("get_temp_state")\r
+                                if get_temp_state == 0 or get_temp_state == 2:\r
+                                    if (time_tmp-self.temp_timeSecond) >= get_temp_time:#大于一个周期的时间,重新赋值\r
+                                        self.temp_state = 0\r
+                                        self.temp_timeSecond = time_tmp\r
+\r
+                                    if (time_tmp-self.temp_timeSecond) == 0 and self.temp_state == 0:#一开始就测量 测量一分钟停止测量体温\r
+                                        self.temp_state = 1\r
+                                        EventMesh.publish("set_temp_state",2)\r
+                                        # EventMesh.publish("set_hr_blood_led",1)\r
+                                        EventMesh.debug_log("AUTO temp:") \r
+                                        EventMesh.txt_log("auto START_temp:1")\r
+                                        EventMesh.publish(constants.EVENT.START_TEMP)\r
+\r
+                                    elif (time_tmp-self.temp_timeSecond) >= 30 and self.temp_state == 1 and get_temp_state == 2:\r
+                                        self.temp_state = 0\r
+                                        EventMesh.txt_log("auto stop_temp:1")\r
+                                        EventMesh.publish("set_temp_state",0)\r
+                                        temp = EventMesh.publish(constants.EVENT.GET_TEMP) \r
+                                        temp = self.optimize_temp(temp)\r
+                                        \r
+                                        tmp_f_tmp = 0\r
+                                        tmp_d_tmp = 0\r
+                                        if str(temp).find(".") != -1:\r
+                                            tmp_f = str(temp).split('.')[0] \r
+                                            tmp_f_tmp = int(tmp_f)\r
+                                            \r
+                                            tmp_d = str(temp).split('.')[1][:1]\r
+                                            tmp_d_tmp = int(tmp_d)\r
+                                        else:\r
+                                            tmp_f_tmp = temp\r
+                                            \r
+                                        if temp != None:\r
+                                            if temp != 0:\r
+                                                EventMesh.publish(constants.PROTOCOL.TEMP_SEND,[tmp_f_tmp,tmp_d_tmp])\r
+                                        EventMesh.publish(constants.EVENT.STOP_TEMP)\r
+\r
+                                else:\r
+                                    self.temp_state = 0\r
+                                    self.old_temp_time = 0\r
+                        else:\r
+                            temp_state  = EventMesh.publish("get_temp_state") \r
+                            if temp_state == 2:\r
+                                EventMesh.publish("set_temp_state",0)#2代表后台进入测试\r
+                                # EventMesh.publish("stop_led_timer")#设置参数\r
+                                EventMesh.txt_log("auto wear stop_temp:2 ")\r
+                                EventMesh.publish(constants.EVENT.STOP_TEMP)\r
+                            self.temp_state = 0\r
+                            self.temp_timeSecond = 0\r
+                            self.old_temp_time = 0\r
+\r
+\r
+\r
+                    hr_time = {}\r
+                    hr_time = EventMesh.publish("get_time_hr")#获取时间是否大于0\r
+                    # print("hr_time{}".format(hr_time))\r
+                    if hr_time[0] !=  None:\r
+                        self.mearsure_btn = int(hr_time[0])\r
+                        self.mearsure_timer = int(hr_time[1])\r
+\r
+                        if self.mearsure_btn != None and self.mearsure_timer != None:\r
+                            \r
+                            if self.mearsure_btn >= 1 and self.mearsure_timer > 0:#开关打开并且时间大于0就可以测试血糖\r
+                                get_hr_state = EventMesh.publish("get_hr_state")#心率\r
+                                get_spo2_state = EventMesh.publish("get_spo2_state")#血氧\r
+                                get_bp_state  = EventMesh.publish("get_bp_state")#血压\r
+                                get_bg_state  = EventMesh.publish("get_bg_state")#血糖\r
+                                # print("state hr",get_hr_state,get_spo2_state,get_bp_state,get_bg_state)\r
+                                if (get_bg_state == 0 and get_spo2_state == 0 and get_bp_state == 0) and  (get_hr_state == 2 or get_hr_state == 0):#心率血压血氧不在测试就测试血糖自动测量\r
+                                    if (time_tmp-self.hr_timeSecond) >= self.mearsure_timer:#大于一个周期的时间,保存的时间戳时间 1678 0 1678 30 1678 \r
+                                        self.hr_timeSecond = time_tmp\r
+                                        self.HR_Onestate = 0\r
+                                    # print("time_tmp hr",time_tmp,self.hr_timeSecond,time_tmp-self.hr_timeSecond,self.mearsure_timer,self.HR_Onestate)\r
+                                    if (time_tmp - self.hr_timeSecond) == 0 and self.HR_Onestate == 0:\r
+                                        self.HR_Onestate = 1\r
+                                        EventMesh.txt_log("auto START_hr:1")\r
+                                        EventMesh.publish("set_hr_state",2)#2代表后台进入测试\r
+                                        # EventMesh.publish("set_hr_blood_led",1)\r
+                                        EventMesh.publish(constants.EVENT.START_HEART)\r
+                                        \r
+                                    elif (time_tmp - self.hr_timeSecond) >= 60 and self.HR_Onestate == 1 and get_hr_state == 2:\r
+                                        self.HR_Onestate = 0\r
+                                        EventMesh.publish("set_hr_state",0)#2代表后台进入测试\r
+                                        EventMesh.debug_log("stop debug3")\r
+                                        EventMesh.txt_log("auto stop_hr:1")\r
+                                        EventMesh.publish(constants.EVENT.STOP_HEART)\r
+                                        heart_value = EventMesh.publish(constants.EVENT.GET_HEART)\r
+                                        EventMesh.debug_log("heart_value:{}".format(heart_value))\r
+                                        # heart_value = 60+urandom.randint(0,10)\r
+                                        if heart_value >= 50 and heart_value != None:\r
+                                            EventMesh.publish(constants.PROTOCOL.HEART_SEND,heart_value)#上传心率数据\r
+                                        #获取心率数据上传数据app\r
+                                        EventMesh.debug_log("STOP_HEART:")\r
+                                        \r
+                                else:\r
+                                    self.HR_Onestate = 0\r
+                            else:\r
+                                self.hr_timeSecond = 0\r
+                                self.HR_Onestate = 0\r
+                                hr_state = EventMesh.publish("get_hr_state")#心率\r
+                                if hr_state == 2:\r
+                                    EventMesh.publish("set_hr_state",0)#2代表后台进入测试\r
+                                    EventMesh.debug_log("33stop debug3")\r
+                                    # EventMesh.publish("stop_led_timer")#设置参数\r
+                                    EventMesh.publish(constants.EVENT.STOP_HEART)\r
+                                    EventMesh.txt_log("auto wear stop_hr:2 ")\r
+\r
+                    get_spo2time = EventMesh.publish("get_spo2_time")#血压自动测试\r
+                    # print("get_spo2time",get_spo2time)\r
+                    if get_spo2time != None:#血压时间不为0\r
+                        spo2_on = int(get_spo2time[0])\r
+                        spo2_time = int(get_spo2time[1])\r
+                        if spo2_on != 0 and spo2_time != 0:\r
+                            get_hr_state = EventMesh.publish("get_hr_state")\r
+                            get_spo2_state = EventMesh.publish("get_spo2_state")\r
+                            get_bp_state  = EventMesh.publish("get_bp_state")\r
+                            get_bg_state  = EventMesh.publish("get_bg_state")\r
+                            # print("state bg2",get_hr_state,get_spo2_state,get_bp_state,get_bg_state)\r
+                            if (get_hr_state == 0 and get_bp_state == 0 and get_bg_state == 0) and (get_spo2_state == 2 or get_spo2_state == 0):#心率血压血氧不在测试就测试血糖自动测量\r
+                                if (time_tmp-self.spo2_timeSecond) >= spo2_time:#大于一个周期的时间,保存的时间戳时间 1678 0 1678 30 1678 \r
+                                    self.spo2_timeSecond = time_tmp\r
+                                    self.spo2auto_state = 0\r
+                                # print("time_tmp spo2",time_tmp,self.spo2_timeSecond,time_tmp-self.spo2_timeSecond,self.bg_timer,self.bpauto_state)\r
+                                if (time_tmp - self.spo2_timeSecond) == 0 and self.spo2auto_state == 0:\r
+                                    self.spo2auto_state = 1\r
+                                    EventMesh.debug_log("START_spo2:auto")\r
+                                    EventMesh.txt_log("auto START_spo2:1")\r
+                                    EventMesh.publish("set_spo2_state",2)#2代表后台进入测试\r
+                                    EventMesh.publish(constants.EVENT.START_BLOOD_OXYGEN)#K开血氧\r
+                                    \r
+                                elif (time_tmp - self.spo2_timeSecond) >= 60 and self.spo2auto_state == 1 and get_spo2_state == 2:\r
+                                    EventMesh.publish("set_spo2_state",0)#2代表后台进入测试\r
+                                    self.spo2auto_state = 0\r
+                                    EventMesh.publish(constants.EVENT.STOP_BLOOD_OXYGEN)\r
+                                    spo2_value = EventMesh.publish(constants.EVENT.GET_BLOOD_OXYGEN)\r
+                                    if spo2_value > 85 and spo2_value != None:\r
+                                        EventMesh.publish(constants.PROTOCOL.OXYGEN_SEND,spo2_value)\r
+                                    EventMesh.txt_log("auto stop_spo2:1")\r
+                                \r
+                            else:\r
+                                self.spo2auto_state = 0\r
+                        else:\r
+                            self.spo2_timeSecond = 0\r
+                            self.spo2auto_state = 0\r
+                            spo2_state = EventMesh.publish("get_spo2_state")#心率\r
+                            if spo2_state == 2:\r
+                                EventMesh.publish("set_spo2_state",0)#2代表后台进入测试\r
+                                EventMesh.debug_log("spo2 stop debug3")\r
+                                EventMesh.txt_log("auto wear stop_spo2:2 ")\r
+                                EventMesh.publish(constants.EVENT.STOP_BLOOD_OXYGEN)\r
+\r
+\r
+                    get_bptime = EventMesh.publish("get_bp_time")#血压自动测试\r
+                    # print("get_bptime",get_bptime)\r
+                    if get_bptime != None:#血压时间不为0\r
+                        bp_on = int(get_bptime[0])\r
+                        bp_time = int(get_bptime[1])\r
+                        if bp_on != 0 and bp_time != 0:\r
+                            get_hr_state = EventMesh.publish("get_hr_state")\r
+                            get_spo2_state = EventMesh.publish("get_spo2_state")\r
+                            get_bp_state  = EventMesh.publish("get_bp_state")\r
+                            get_bg_state  = EventMesh.publish("get_bg_state")\r
+                            # print("state bg2",get_hr_state,get_spo2_state,get_bp_state,get_bg_state)\r
+                            \r
+                            if (get_hr_state == 0 and get_spo2_state == 0 and get_bg_state == 0) and (get_bp_state == 2 or get_bp_state == 0):#心率血压血氧不在测试就测试血糖自动测量\r
+                                if (time_tmp-self.bp_timeSecond) >= bp_time:#大于一个周期的时间,保存的时间戳时间 1678 0 1678 30 1678 \r
+                                    self.bp_timeSecond = time_tmp\r
+                                    self.bpauto_state = 0\r
+                                # print("time_tmp bp",time_tmp,self.bp_timeSecond,time_tmp-self.bp_timeSecond,self.bg_timer,self.bpauto_state)\r
+                                if (time_tmp - self.bp_timeSecond) == 0 and self.bpauto_state == 0:\r
+                                    self.bpauto_state = 1\r
+                                    EventMesh.debug_log("START_bp:auto")\r
+                                    EventMesh.txt_log("auto START_bp:1")\r
+                                    EventMesh.publish("set_bp_state",2)#2代表后台进入测试\r
+                                    # EventMesh.publish("set_hr_blood_led",1)\r
+                                    EventMesh.publish(constants.EVENT.START_HEART)\r
+                                    \r
+                                elif (time_tmp - self.bp_timeSecond) >= 60 and self.bpauto_state == 1 and get_bp_state == 2:\r
+                                    self.bpauto_state = 0\r
+                                    EventMesh.publish("set_bp_state",0)#2代表后台进入测试\r
+                                    blood_data = get_autoblood_value()\r
+                                    if blood_data == None:\r
+                                        blood_data[0] = 0\r
+                                        blood_data[1] = 0\r
+\r
+                                    max_value = blood_data[0]\r
+                                    min_value = blood_data[1]\r
+                                    if max_value != 0 and min_value != 0:\r
+                                        EventMesh.publish(constants.PROTOCOL.BLOOD_SEND,[max_value,min_value])\r
+                                    EventMesh.publish(constants.EVENT.STOP_HEART)\r
+                                    EventMesh.txt_log("auto stop_bp:1")\r
+                                    \r
+                            else:\r
+                                self.bpauto_state = 0\r
+                        else:\r
+                            self.bp_timeSecond = 0\r
+                            self.bpauto_state = 0\r
+                            bp_state = EventMesh.publish("get_bp_state")#心率\r
+                            if bp_state == 2:\r
+                                EventMesh.publish("set_bp_state",0)#2代表后台进入测试\r
+                                EventMesh.debug_log("bp stop debug3")\r
+                                EventMesh.txt_log("auto wear stop_bp:2 ")\r
+                                # EventMesh.publish("stop_led_timer")#设置参数\r
+                                EventMesh.publish(constants.EVENT.STOP_HEART)\r
+\r
+\r
+\r
+                    bg_time = {}\r
+                    bg_time = EventMesh.publish("get_bgauto_time")\r
+                    if bg_time[0] != None:\r
+                    \r
+                        bg_btn = int(bg_time[0])\r
+                        bg_timer = int(bg_time[1]) \r
+                        # print("state bg2",self.bg_btn,self.bg_timer)\r
+                        if bg_btn >= 1 and bg_timer > 0:#开关打开并且时间大于0就可以测试血糖\r
+                            get_hr_state = EventMesh.publish("get_hr_state")\r
+                            get_spo2_state = EventMesh.publish("get_spo2_state")\r
+                            get_bp_state  = EventMesh.publish("get_bp_state")\r
+                            get_bg_state  = EventMesh.publish("get_bg_state")\r
+                            # print("state bg2",get_hr_state,get_spo2_state,get_bp_state,get_bg_state)\r
+                            \r
+                            if (get_hr_state == 0 and get_spo2_state == 0 and get_bp_state == 0) and (get_bg_state == 2 or get_bg_state == 0):#心率血压血氧不在测试就测试血糖自动测量\r
+                                if (time_tmp-self.bg_timeSecond) >= bg_timer:#大于一个周期的时间,保存的时间戳时间 1678 0 1678 30 1678 \r
+                                    self.bg_timeSecond = time_tmp #1780 \r
+                                    self.BG_state = 0\r
+                                # print("time_tmp bg",time_tmp,self.bg_timeSecond,time_tmp-self.bg_timeSecond,bg_timer,self.BG_state)\r
+                                if (time_tmp - self.bg_timeSecond) == 0 and self.BG_state == 0:\r
+                                    EventMesh.debug_log("START_bg:1")\r
+                                    EventMesh.txt_log("auto START_bg:1")\r
+                                    EventMesh.publish("set_bg_state",2)#2代表后台进入测试\r
+                                    # EventMesh.publish("set_hr_blood_led",1)\r
+                                    EventMesh.publish(constants.EVENT.START_HEART)\r
+                                    self.BG_state = 1\r
+                                elif (time_tmp - self.bg_timeSecond) >= 60 and self.BG_state == 1 and get_bg_state == 2:\r
+                                    self.BG_state = 0\r
+                                    EventMesh.publish("set_bg_state",0)#2代表后台进入测试\r
+                                    # EventMesh.publish("stop_led_timer")#设置参数\r
+                                    EventMesh.txt_log("auto stop_bg:1")\r
+                                    EventMesh.debug_log("stop bgdebug3")\r
+                                    EventMesh.publish(constants.EVENT.STOP_HEART)\r
+                                    bgdata = get_blood_sugar_value()\r
+                                    if bgdata == None:\r
+                                        bgdata = 0\r
+                                    if bgdata != 0:\r
+                                        EventMesh.debug_log("bgdata",bgdata)\r
+                                        EventMesh.publish(constants.PROTOCOL.BLOODGLUSOCE_SEND,bgdata)#上传心率数据\r
+                                    \r
+                            else:\r
+                                \r
+                                self.BG_state = 0\r
+                        else:\r
+                            bg_state  = EventMesh.publish("get_bg_state") \r
+                            if bg_state == 2:\r
+                                EventMesh.publish("set_bg_state",0)#2代表后台进入测试\r
+                                # EventMesh.publish("stop_led_timer")#设置参数\r
+                                EventMesh.debug_log("bg stop bgdebug3")\r
+                                EventMesh.txt_log("auto wear stop_bg:2 ")\r
+                                EventMesh.publish(constants.EVENT.STOP_HEART)\r
+                            self.bg_timeSecond = 0\r
+                            self.BG_state = 0\r
+                    \r
+                else:\r
+                    self.old_temp_time = 0\r
+                    self.old_time = 0\r
+                    # self.hr_timeSecond = time_tmp\r
+                    self.HR_Onestate = 0\r
+                    self.HR_OneTime = 0\r
+                    self.HR_state = 0\r
+                    self.old_time = 0    \r
+                    self.old_bp_time = 0\r
+                    self.old_hr_time = 0\r
+                    self.old_spo2_time = 0\r
+                    self.set_hsenor_crt = 0\r
+                    self.old_bg_time = 0\r
+                    # self.bg_timeSecond = time_tmp\r
+                    self.BG_state = 0\r
+                    # self.temp_timeSecond = time_tmp\r
+\r
+                    # self.bp_timeSecond = time_tmp\r
+                    self.bpauto_state = 0\r
+\r
+                    # self.spo2_timeSecond = time_tmp\r
+                    self.spo2auto_state = 0\r
+\r
+                    self.temp_state = 0\r
+                    self.temp_one_state = 0\r
+\r
+            else:\r
+                self.old_temp_time = 0\r
+                self.old_time = 0\r
+                # self.hr_timeSecond = time_tmp\r
+                self.HR_Onestate = 0\r
+                self.HR_OneTime = 0\r
+                self.HR_state = 0\r
+                self.old_time = 0    \r
+                self.old_bp_time = 0\r
+                self.old_hr_time = 0\r
+                self.old_spo2_time = 0\r
+                self.set_hsenor_crt = 0\r
+                self.old_bg_time = 0\r
+                # self.bg_timeSecond = time_tmp\r
+\r
+                self.BG_state = 0\r
+                # self.temp_timeSecond = time_tmp\r
+\r
+                # self.bp_timeSecond = time_tmp\r
+                self.bpauto_state = 0\r
+\r
+                # self.spo2_timeSecond = time_tmp\r
+                self.spo2auto_state = 0\r
+\r
+                self.temp_state = 0\r
+                self.temp_one_state = 0\r
+\r
+                get_hr_state = EventMesh.publish("get_hr_state")\r
+                get_spo2_state = EventMesh.publish("get_spo2_state")\r
+                get_bp_state  = EventMesh.publish("get_bp_state")\r
+                get_bg_state  = EventMesh.publish("get_bg_state")\r
+                if get_hr_state != None and get_spo2_state != None and get_bp_state != None and get_bg_state != None:\r
+                    if get_hr_state > 1:\r
+                        EventMesh.txt_log("auto stop_hr:44")\r
+                        EventMesh.publish("set_hr_state",0)#2代表后台进入测试,定时测心率 1ui界面测试洗心率 \r
+                        # if get_hr_state == 3:\r
+                        #     EventMesh.publish("stop_led_timer")#设置参数\r
+                        EventMesh.debug_log("stop debug8")\r
+                        if WEAR == 1:\r
+                            heart_value = EventMesh.publish(constants.EVENT.GET_HEART)\r
+                            if heart_value >= 50 and heart_value != None:\r
+                                EventMesh.publish(constants.PROTOCOL.HEART_SEND,heart_value)#上传心率数据\r
+                        EventMesh.publish(constants.EVENT.STOP_HEART) \r
+                    elif get_spo2_state > 1:\r
+                        EventMesh.txt_log("auto stop_spo2:44")\r
+                        EventMesh.publish("set_spo2_state",0)#2代表后台进入测试\r
+                        # if get_spo2_state == 3:\r
+                        #     EventMesh.publish("stop_led_timer")#设置参数\r
+                        if WEAR == 1:\r
+                            spo2_value = EventMesh.publish(constants.EVENT.GET_BLOOD_OXYGEN)\r
+                            if spo2_value > 85 and spo2_value != None:\r
+                                EventMesh.publish(constants.PROTOCOL.OXYGEN_SEND,spo2_value)\r
+                        EventMesh.publish(constants.EVENT.STOP_BLOOD_OXYGEN)\r
+                        EventMesh.debug_log("stop debug13")\r
+                    elif get_bp_state > 1:\r
+                        EventMesh.txt_log("auto stop_bp:44")\r
+                        EventMesh.publish("set_bp_state",0)#2代表后台进入测试\r
+                        # if get_bp_state == 3:\r
+                        #     EventMesh.publish("stop_led_timer")#设置参数\r
+                        if WEAR == 1:\r
+                            blood_data = get_autoblood_value()\r
+                            if blood_data == None:\r
+                                blood_data[0] = 0\r
+                                blood_data[1] = 0\r
+\r
+                            max_value = blood_data[0]\r
+                            min_value = blood_data[1]\r
+                            if max_value != 0 and min_value != 0:\r
+                                EventMesh.publish(constants.PROTOCOL.BLOOD_SEND,[max_value,min_value])\r
+                        EventMesh.publish(constants.EVENT.STOP_HEART)\r
+                        EventMesh.debug_log("stop debug14")\r
+                    elif get_bg_state > 1:\r
+                        EventMesh.txt_log("auto stop_bg:44")\r
+                        EventMesh.publish("set_bg_state",0)#2代表后台进入测试\r
+                        # if get_bg_state == 3:\r
+                        #     EventMesh.publish("stop_led_timer")#设置参数\r
+                        EventMesh.publish(constants.EVENT.STOP_HEART)\r
+                        if WEAR == 1:\r
+                            bgdata = get_blood_sugar_value()\r
+                            if bgdata == None:\r
+                                bgdata = 0\r
+                            if bgdata != 0:\r
+                                EventMesh.publish(constants.PROTOCOL.BLOODGLUSOCE_SEND,bgdata)#上传心率数据\r
+                        EventMesh.debug_log("stop debug15")\r
+                get_temp_state  = EventMesh.publish("get_temp_state")\r
+                if get_temp_state != None:\r
+                    if get_temp_state > 1:\r
+                        self.temp_one_state = 0\r
+                        self.temp_state = 0\r
+                        temp = EventMesh.publish(constants.EVENT.GET_TEMP)       \r
+                        temp = self.optimize_temp(temp)\r
+                        EventMesh.txt_log("auto stop_temp:44")\r
+                        EventMesh.publish("set_temp_state",0)\r
+                        if WEAR == 1:\r
+                            tmp_f_tmp = 0\r
+                            tmp_d_tmp = 0\r
+                            if str(temp).find(".") != -1:\r
+                                tmp_f = str(temp).split('.')[0] \r
+                                tmp_f_tmp = int(tmp_f)\r
+                                \r
+                                tmp_d = str(temp).split('.')[1][:1]\r
+                                tmp_d_tmp = int(tmp_d)\r
+                            else:\r
+                                tmp_f_tmp = temp\r
+                                \r
+                            if temp != None:\r
+                                if temp != 0:\r
+                                    EventMesh.publish(constants.PROTOCOL.TEMP_SEND,[tmp_f_tmp,tmp_d_tmp])\r
+                        EventMesh.publish(constants.EVENT.STOP_TEMP)\r
+\r
+            \r
+\r
+\r
+            hr_state = EventMesh.publish("get_hr_state")\r
+            spo2_state = EventMesh.publish("get_spo2_state")\r
+            temp_state  = EventMesh.publish("get_temp_state")\r
+            if hr_state != None or spo2_state != None or temp_state != None:#手动测试\r
+                auto_hr = EventMesh.publish("get_start_measure_time")#设置开始测量的时间戳时间\r
+                if auto_hr == None:\r
+                    auto_hr = 0\r
+                if hr_state == 1:\r
+                    if auto_hr != 0:\r
+                        self.auto_hr_count+=1\r
+                        if  self.auto_hr_count > 6:\r
+                            self.auto_hr_count = 0\r
+                            EventMesh.publish("set_hr_state",0)#0代表g关闭测试\r
+                            EventMesh.debug_log("stop debug7")\r
+                            EventMesh.publish(constants.EVENT.STOP_HEART)\r
+                            heart_value = EventMesh.publish(constants.EVENT.GET_HEART)\r
+                            if heart_value >= 50 and heart_value != None:\r
+                                EventMesh.publish("play_hr_value",heart_value)\r
+                                # EventMesh.publish("set_history_hr_value",heart_value)\r
+                                EventMesh.publish(constants.PROTOCOL.HEART_SEND,heart_value)#上传心率数据\r
+\r
+                            else:\r
+                                EventMesh.publish("play_hr_value",0) \r
+                            \r
+                            \r
+\r
+                        else :\r
+                            if WEAR != 1:\r
+                                EventMesh.publish("set_hr_state",0)#0代表g关闭测试\r
+                                EventMesh.debug_log("stop debug7")\r
+                                EventMesh.publish(constants.EVENT.STOP_HEART)                               \r
+                                EventMesh.publish("play_hr_value",0) \r
+                                \r
+                else:\r
+                    self.auto_hr_count = 0\r
+                    \r
+\r
+                auto_spo2 = EventMesh.publish("get_start_measure_time")#设置开始测量的时间戳时间\r
+                if auto_spo2 == None:\r
+                    auto_spo2 = 0\r
+                if spo2_state == 1:#手动测试血氧\r
+                    if auto_spo2 != None:\r
+                        if auto_spo2 != 0:\r
+                            self.auto_spo2_count+=1\r
+                            if self.auto_spo2_count > 6:\r
+                                self.auto_spo2_count = 0\r
+                                EventMesh.publish("set_spo2_state",0)#0代表g关闭测试\r
+                                EventMesh.debug_log("stop spo2 debug7")\r
+                                EventMesh.publish(constants.EVENT.STOP_BLOOD_OXYGEN)\r
+                                spo2_value = EventMesh.publish(constants.EVENT.GET_BLOOD_OXYGEN)\r
+                                if spo2_value > 85 and spo2_value != None:\r
+                                    EventMesh.publish("play_spo2_value",spo2_value)\r
+                                    EventMesh.publish("set_old_spo2_data",spo2_value)\r
+                                    EventMesh.publish(constants.PROTOCOL.OXYGEN_SEND,spo2_value)\r
+                                else:\r
+                                    EventMesh.publish("play_spo2_value",0)\r
+                            \r
+                            else:\r
+                                if WEAR != 1:\r
+                                    EventMesh.publish("set_spo2_state",0)#0代表g关闭测试\r
+                                    EventMesh.debug_log("stop debug8")\r
+                                    EventMesh.publish(constants.EVENT.STOP_BLOOD_OXYGEN)                               \r
+                                    EventMesh.publish("play_spo2_value",0) \r
+                                    \r
+                else:\r
+                    self.auto_spo2_count = 0\r
+\r
+                if temp_state == 1:#手动测试体温\r
+                    auto_temp = EventMesh.publish("get_start_temp_measure_time")#设置开始测量的时间戳时间\r
+                    if auto_temp == None:\r
+                        auto_temp = 0\r
+                    if auto_temp != None:\r
+                        if auto_temp != 0:\r
+                            self.auto_temp_count += 1\r
+                            if self.auto_temp_count > 6:\r
+                                self.auto_temp_count = 0\r
+                                EventMesh.debug_log("体温测量结束")\r
+                                temp = EventMesh.publish(constants.EVENT.GET_TEMP)       \r
+                                temp = self.optimize_temp(temp)\r
+                                EventMesh.debug_log("temp",temp)\r
+                                EventMesh.publish("set_temp_state",0)\r
+                                tmp_f_tmp = 0\r
+                                tmp_d_tmp = 0\r
+                                if str(temp).find(".") != -1:\r
+                                    tmp_f = str(temp).split('.')[0] \r
+                                    tmp_f_tmp = int(tmp_f)\r
+                                    \r
+                                    tmp_d = str(temp).split('.')[1][:1]\r
+                                    tmp_d_tmp = int(tmp_d)\r
+                                else:\r
+                                    tmp_f_tmp = temp\r
+                                    \r
+                                if temp != None:\r
+                                    if temp != 0:\r
+                                        # EventMesh.publish("set_history_temp_value",temp)\r
+                                        EventMesh.publish("play_temp_value",temp)#播放体温数值\r
+                                        EventMesh.publish(constants.PROTOCOL.TEMP_SEND,[tmp_f_tmp,tmp_d_tmp])\r
+                                    else:\r
+                                        # EventMesh.publish("set_history_temp_value",0)\r
+                                        EventMesh.publish("play_temp_value",0)#播放体温数值\r
+                                \r
+                                EventMesh.publish(constants.EVENT.STOP_TEMP)\r
+\r
+                            else :\r
+                                if WEAR  != 1:\r
+                                    EventMesh.publish("set_temp_state",0)#0代表g关闭测试\r
+                                    EventMesh.debug_log("stop debug9")\r
+                                    EventMesh.publish(constants.EVENT.STOP_TEMP)                               \r
+                                    EventMesh.publish("play_temp_value",0) \r
+                                    \r
+                else:\r
+                    self.auto_temp_count = 0\r
+\r
+            EventMesh.publish("play_unread_wechat_infor")#每10s检测是否有未读语音数据\r
+\r
+            usb_state = EventMesh.publish("get_usb")#\r
+            \r
+\r
+            if battery[0] == '1':\r
+                # EventMesh.debug_log("battery[1]",battery[1])\r
+                if self.vbat_full_flag <= 120:\r
+                    self.vbat_full_flag+=10\r
+                    if self.vbat_full_flag == 60:#开机检测一次如果是充电标识为1就不再提示\r
+                        if usb_state != 1:\r
+                            EventMesh.publish("set_usb",1)#\r
+                else:\r
+                    if battery[1] >= 100:\r
+                        if self.charge_full_count == 0:#充电已满\r
+                            EventMesh.publish("set_usb",3)#\r
+                            EventMesh.debug_log("charge R_CHARGE_full")\r
+                            self.charge_full_count = 1\r
+                    \r
+            else:\r
+                self.charge_full_count = 0\r
+                low_power = battery[1]\r
+                if low_power <= 5:#小于5%红色灯慢闪\r
+                    EventMesh.publish("set_led_time_arg",[1,2,20*11,led_mode.FLASH_LIGHT_RED,20,10,led_mode.OTHER_MEASURE_MODE])#測量成功\r
+                    # EventMesh.publish("set_led_time_arg",[1000,400,52,led_mode.FLASH_LIGHT_RED,led_mode.DEFAULT_LONG_LIGHT_MODE,led_mode.OTHER_MEASURE_MODE])#開始測量\r
+\r
+            \r
+            self.normal_alarm()\r
+            #喝水提醒\r
+            self.drink_alarm()\r
+            #该吃药了\r
+            self.medicine_alarm()\r
+            #该起床了\r
+            self.wakeup_alarm()\r
+            #该睡觉了\r
+            self.sleep_alarm()\r
+            #该回家了\r
+            self.home_alarm()\r
+            #该休息了\r
+            self.reset_alarm()\r
+\r
+\r
+            if self.alarm_flag == 0:\r
+                self.alarm_flag = 1\r
+                EventMesh.publish("set_rtc_alarm")\r
+\r
+        def clear_usb_flag(self,event,msg):\r
+            self.charge_full_count = 0\r
+        #普通闹钟\r
+        def normal_alarm(self):\r
+            data = RTC().datetime()\r
+            hour = data[4]\r
+            min = data[5]\r
+\r
+            week = int(data[3])\r
+\r
+            date1 = data[1]\r
+            date2 = data[2]\r
+            cur_total_min = int(hour)*60+int(min)\r
+            # EventMesh.debug_log("self.normal_oldtotalmin",self.normal_oldtotalmin,cur_total_min,self.alarm_flag)\r
+            if self.normal_oldtotalmin == 0:\r
+                self.normal_oldtotalmin = cur_total_min #549\r
+            if self.normal_oldtotalmin != cur_total_min: #上次响过的闹钟分钟数不等于当前的分钟数据需要清零否则下一个不会响铃\r
+                if self.normal_flag == 1:\r
+                    self.normal_flag = 0\r
+                    self.normal_count = 0\r
+            normal_alarm = []\r
+            normal_alarm = EventMesh.publish("get_storage_config","normal_alarm")\r
+            # EventMesh.debug_log("sleep info2",sleep,cur_total_min)\r
+            if self.normal_flag == 1:#表示闹钟响过清除标志\r
+                self.normal_count+=1\r
+                if self.normal_count > 6:\r
+                    self.normal_count = 0\r
+                    self.normal_flag = 0\r
+            if normal_alarm != None:\r
+                if len(normal_alarm) != 0 and normal_alarm != []:\r
+                    j = 0\r
+                    for i in range(len(normal_alarm)):\r
+                        # EventMesh.debug_log("normal_alarm normal_alarm 33",normal_alarm,j)\r
+                        normalalarm_hour = normal_alarm[j]["hour"]\r
+                        normalalarm_min = normal_alarm[j]["min"]\r
+                        normalalarm_day = normal_alarm[j]["day"]\r
+                        normalalarm_enale = normal_alarm[j]["enable"]\r
+                        normalalarm_totalmin = int(normalalarm_hour)*60+int(normalalarm_min)\r
+                        # EventMesh.debug_log("wake alarm",normalalarm_hour,sleep_min,sleep_day,sleep_enale,sleep_totalmin,week)\r
+                        if normalalarm_day == []:#单次闹钟只响一次\r
+                            if normalalarm_enale != 0:\r
+                                if cur_total_min > normalalarm_totalmin:\r
+                                    normal_alarm.pop(j)\r
+                                    self.normal_count = 0\r
+                                    self.normal_flag  = 0 \r
+                                    j=0\r
+                                    # EventMesh.debug_log("wakeup wakeup dayu",sleep,j)\r
+                                    EventMesh.publish("set_storage_config",["normal_alarm",normal_alarm])#删除之后重新保存\r
+                                    # sleep = EventMesh.publish("get_storage_config","sleep_alarm")#删除之后重新保存\r
+                                    continue\r
+                                else:\r
+                                    if normalalarm_totalmin == cur_total_min and self.normal_flag == 0:#14:00\r
+                                        self.normal_count = 0\r
+                                        self.normal_flag  = 0    \r
+                                        normal_alarm.pop(j)\r
+                                        # EventMesh.debug_log("wakeup wakeup1",sleep,j)\r
+                                        EventMesh.publish("set_storage_config",["normal_alarm",normal_alarm])#删除之后重新保存\r
+                                        EventMesh.publish("OPEN_ALARM_RING")                                                                                                                                            \r
+                                        break\r
+                        else:\r
+                            if normalalarm_enale != 0 and (week in normalalarm_day):#记录响过的时间分钟数\r
+                                if normalalarm_totalmin == cur_total_min and self.normal_flag == 0:#14:00\r
+                                    self.normal_flag  = 1\r
+                                    self.normal_count = 0\r
+                                    self.normal_oldtotalmin = normalalarm_totalmin\r
+                                    EventMesh.publish("OPEN_ALARM_RING")#                                                                                                                                                  \r
+                                    break\r
+                        j+=1\r
+\r
+\r
+        #喝水提醒\r
+        def drink_alarm(self):\r
+            date_tmp = utime.localtime()\r
+            time_tmp = utime.mktime(date_tmp)\r
+        \r
+            if self.drink_time == 0:\r
+                self.drink_time = time_tmp\r
+            \r
+            on = EventMesh.publish("get_storage_config","drink_on")\r
+            time = EventMesh.publish("get_storage_config","drink_time")\r
+            # print("drink info2",on,time)\r
+            if on != None and time != None:\r
+                if on != 0 and time != 0:\r
+                    if (time_tmp - self.drink_time) >= (time*60*60):#需要转换成小时3600\r
+                        self.drink_time = time_tmp \r
+                        EventMesh.publish("drink_alarm_event")#该喝水了\r
+                        #该喝水了\r
+                else:\r
+                    self.drink_time = 0\r
+            else:\r
+                self.drink_time = 0\r
+\r
+        #吃药提醒\r
+        def medicine_alarm(self):\r
+            data = RTC().datetime()\r
+            hour = data[4]\r
+            min = data[5]\r
+\r
+            week = int(data[3])\r
+\r
+            date1 = data[1]\r
+            date2 = data[2]\r
+            cur_total_min = int(hour)*60+int(min)\r
+            # print("self.medicine_oldtotalmin",self.medicine_oldtotalmin,cur_total_min,self.alarm_flag)\r
+            if self.medicine_oldtotalmin == 0:\r
+                self.medicine_oldtotalmin = cur_total_min #549\r
+            if self.medicine_oldtotalmin != cur_total_min: #上次响过的闹钟分钟数不等于当前的分钟数据需要清零否则下一个不会响铃\r
+                if self.medicine_flag == 1:\r
+                    self.medicine_flag = 0\r
+                    self.medicine_count = 0\r
+            medicine = EventMesh.publish("get_storage_config","medicine")\r
+            # print("medicine info2",medicine,cur_total_min)\r
+            if self.medicine_flag == 1:#表示闹钟响过清除标志\r
+                self.medicine_count+=1\r
+                if self.medicine_count > 6:\r
+                    self.medicine_count = 0\r
+                    self.medicine_flag = 0\r
+            if medicine != None:\r
+                if len(medicine) != 0 and medicine != []:\r
+                    for i in range(len(medicine)):\r
+                        medicine_hour = medicine[i]["hour"]\r
+                        medicine_min = medicine[i]["min"]\r
+                        medicine_day = medicine[i]["day"]\r
+                        medicine_enale = medicine[i]["enable"]\r
+                        medicine_totalmin = int(medicine_hour)*60+int(medicine_min)\r
+                        # print("medicine alarm",medicine_hour,medicine_min,medicine_day,medicine_enale,medicine_totalmin,week)\r
+                        if medicine_day == []:\r
+                            if medicine_enale != 0:\r
+                                if medicine_totalmin == cur_total_min and self.medicine_flag == 0:#14:00\r
+                                    self.medicine_count = 0\r
+                                    self.medicine_flag  = 1    \r
+                                    self.medicine_oldtotalmin = medicine_totalmin#记录响过的时间分钟数\r
+                                    # print("medicine alarm1")\r
+                                    EventMesh.publish("medicine_alarm_event")#该吃药了                                                                                                                                              \r
+                                    break\r
+                        else:\r
+                            if medicine_enale != 0 and (week in medicine_day):#记录响过的时间分钟数\r
+                                if medicine_totalmin == cur_total_min and self.medicine_flag == 0:#14:00\r
+                                    self.medicine_flag  = 1\r
+                                    self.medicine_count = 0\r
+                                    self.medicine_oldtotalmin = medicine_totalmin\r
+                                    # print("medicine alarm2",)\r
+                                    EventMesh.publish("medicine_alarm_event")#该吃药了                                                                                                                                                   \r
+                                    break\r
+        #该起床了\r
+        def wakeup_alarm(self):\r
+            data = RTC().datetime()\r
+            hour = data[4]\r
+            min = data[5]\r
+\r
+            week = int(data[3])\r
+\r
+            date1 = data[1]\r
+            date2 = data[2]\r
+            cur_total_min = int(hour)*60+int(min)\r
+            # EventMesh.debug_log("self.wakeup_oldtotalmin",self.wakeup_oldtotalmin,cur_total_min,self.alarm_flag)\r
+            if self.wakeup_oldtotalmin == 0:\r
+                self.wakeup_oldtotalmin = cur_total_min #549\r
+            if self.wakeup_oldtotalmin != cur_total_min: #上次响过的闹钟分钟数不等于当前的分钟数据需要清零否则下一个不会响铃\r
+                if self.wakeup_flag == 1:\r
+                    self.wakeup_flag = 0\r
+                    self.wakeup_count = 0\r
+            wakeup = []\r
+            wakeup = EventMesh.publish("get_storage_config","wakeup_alarm")\r
+            # EventMesh.debug_log("wakeup info2",wakeup,cur_total_min)\r
+            if self.wakeup_flag == 1:#表示闹钟响过清除标志\r
+                self.wakeup_count+=1\r
+                if self.wakeup_count > 6:\r
+                    self.wakeup_count = 0\r
+                    self.wakeup_flag = 0\r
+            if wakeup != None:\r
+                if len(wakeup) != 0 and wakeup != []:\r
+                    j = 0\r
+                    for i in range(len(wakeup)):\r
+                        wakeup_hour = wakeup[j]["hour"]\r
+                        wakeup_min = wakeup[j]["min"]\r
+                        wakeup_day = wakeup[j]["day"]\r
+                        wakeup_enale = wakeup[j]["enable"]\r
+                        wakeup_totalmin = int(wakeup_hour)*60+int(wakeup_min)\r
+                        # EventMesh.debug_log("wake alarm",wakeup_hour,wakeup_min,wakeup_day,wakeup_enale,wakeup_totalmin,week)\r
+                        if wakeup_day == []:#单次闹钟只响一次\r
+                            if wakeup_enale != 0:\r
+                                if cur_total_min > wakeup_totalmin:\r
+                                    self.wakeup_count = 0\r
+                                    self.wakeup_flag  = 0    \r
+                                    wakeup.pop(j)\r
+                                    j=0#每次删除都从0开始遍历\r
+                                    # EventMesh.debug_log("wakeup wakeup1 dayu",wakeup,j)\r
+                                    EventMesh.publish("set_storage_config",["wakeup_alarm",wakeup])\r
+                                    continue\r
+                                else:\r
+                                    if wakeup_totalmin == cur_total_min and self.wakeup_flag == 0:#14:00\r
+                                        self.wakeup_count = 0\r
+                                        self.wakeup_flag  = 0    \r
+                                        wakeup.pop(j)\r
+                                        EventMesh.debug_log("wakeup wakeup1",wakeup,j)\r
+                                        EventMesh.publish("set_storage_config",["wakeup_alarm",wakeup])\r
+                                        EventMesh.publish("wakeup_alarm_event")#该吃药了                                                                                                                                              \r
+                                        break\r
+                        else:\r
+                            if wakeup_enale != 0 and (week in wakeup_day):#记录响过的时间分钟数\r
+                                if wakeup_totalmin == cur_total_min and self.wakeup_flag == 0:#14:00\r
+                                    self.wakeup_flag  = 1\r
+                                    self.wakeup_count = 0\r
+                                    self.wakeup_oldtotalmin = wakeup_totalmin\r
+                                    EventMesh.publish("wakeup_alarm_event")#该吃药了                                                                                                                                                   \r
+                                    break\r
+                        j+=1\r
+\r
+\r
+        #该睡觉了\r
+        def sleep_alarm(self):\r
+            data = RTC().datetime()\r
+            hour = data[4]\r
+            min = data[5]\r
+\r
+            week = int(data[3])\r
+\r
+            date1 = data[1]\r
+            date2 = data[2]\r
+            cur_total_min = int(hour)*60+int(min)\r
+            # EventMesh.debug_log("self.sleep_oldtotalmin",self.sleep_oldtotalmin,cur_total_min,self.alarm_flag)\r
+            if self.sleep_oldtotalmin == 0:\r
+                self.sleep_oldtotalmin = cur_total_min #549\r
+            if self.sleep_oldtotalmin != cur_total_min: #上次响过的闹钟分钟数不等于当前的分钟数据需要清零否则下一个不会响铃\r
+                if self.sleep_flag == 1:\r
+                    self.sleep_flag = 0\r
+                    self.sleep_count = 0\r
+            sleep = []\r
+            sleep = EventMesh.publish("get_storage_config","sleep_alarm")\r
+            # EventMesh.debug_log("sleep info2",sleep,cur_total_min)\r
+            if self.sleep_flag == 1:#表示闹钟响过清除标志\r
+                self.sleep_count+=1\r
+                if self.sleep_count > 6:\r
+                    self.sleep_count = 0\r
+                    self.sleep_flag = 0\r
+            if sleep != None:\r
+                if len(sleep) != 0 and sleep != []:\r
+                    j = 0\r
+                    count = int(len(sleep))\r
+                    for i in range(len(sleep)):\r
+                        # EventMesh.debug_log("wakeup wakeup 33",sleep,j)\r
+                        sleep_hour = sleep[j]["hour"]\r
+                        sleep_min = sleep[j]["min"]\r
+                        sleep_day = sleep[j]["day"]\r
+                        sleep_enale = sleep[j]["enable"]\r
+                        sleep_totalmin = int(sleep_hour)*60+int(sleep_min)\r
+                        # EventMesh.debug_log("wake alarm",sleep_hour,sleep_min,sleep_day,sleep_enale,sleep_totalmin,week)\r
+                        if sleep_day == []:#单次闹钟只响一次\r
+                            if sleep_enale != 0:\r
+                                if cur_total_min > sleep_totalmin:\r
+                                    sleep.pop(j)\r
+                                    self.sleep_count = 0\r
+                                    self.sleep_flag  = 0 \r
+                                    j=0\r
+                                    # EventMesh.debug_log("wakeup wakeup dayu",sleep,j)\r
+                                    EventMesh.publish("set_storage_config",["sleep_alarm",sleep])#删除之后重新保存\r
+                                    # sleep = EventMesh.publish("get_storage_config","sleep_alarm")#删除之后重新保存\r
+                                    continue\r
+                                else:\r
+                                    if sleep_totalmin == cur_total_min and self.sleep_flag == 0:#14:00\r
+                                        self.sleep_count = 0\r
+                                        self.sleep_flag  = 0    \r
+                                        sleep.pop(j)\r
+                                        # EventMesh.debug_log("wakeup wakeup1",sleep,j)\r
+                                        EventMesh.publish("set_storage_config",["sleep_alarm",sleep])#删除之后重新保存\r
+                                        EventMesh.publish("sleep_alarm_event")#该吃药了                                                                                                                                              \r
+                                        break\r
+                        else:\r
+                            if sleep_enale != 0 and (week in sleep_day):#记录响过的时间分钟数\r
+                                if sleep_totalmin == cur_total_min and self.sleep_flag == 0:#14:00\r
+                                    self.sleep_flag  = 1\r
+                                    self.sleep_count = 0\r
+                                    self.sleep_oldtotalmin = sleep_totalmin\r
+                                    EventMesh.publish("sleep_alarm_event")#该吃药了                                                                                                                                                   \r
+                                    break\r
+                        j+=1\r
+\r
+\r
+        #该回家了\r
+        def home_alarm(self):\r
+            data = RTC().datetime()\r
+            hour = data[4]\r
+            min = data[5]\r
+\r
+            week = int(data[3])\r
+\r
+            date1 = data[1]\r
+            date2 = data[2]\r
+            cur_total_min = int(hour)*60+int(min)\r
+            # EventMesh.debug_log("self.home_oldtotalmin",self.home_oldtotalmin,cur_total_min,self.alarm_flag)\r
+            if self.home_oldtotalmin == 0:\r
+                self.home_oldtotalmin = cur_total_min #549\r
+            if self.home_oldtotalmin != cur_total_min: #上次响过的闹钟分钟数不等于当前的分钟数据需要清零否则下一个不会响铃\r
+                if self.home_flag == 1:\r
+                    self.home_flag = 0\r
+                    self.home_count = 0\r
+            home = ''\r
+            home = EventMesh.publish("get_storage_config","home_alarm")\r
+            # EventMesh.debug_log("sleep info2",sleep,cur_total_min)\r
+            if self.home_flag == 1:#表示闹钟响过清除标志\r
+                self.home_count+=1\r
+                if self.home_count > 6:\r
+                    self.home_count = 0\r
+                    self.home_flag = 0\r
+            if home != None:\r
+                if len(str(home)) != 0 and str(home) != '':\r
+                    # EventMesh.debug_log("home home 33",home)\r
+                    home_hour = int(str(home).split(":")[0])\r
+                    home_min = int(str(home).split(":")[1])\r
+                    \r
+                    home_totalmin = int(home_hour)*60+int(home_min)\r
+                    if home_totalmin == cur_total_min and self.home_flag == 0:#14:00\r
+                        self.home_flag  = 1\r
+                        self.home_count = 0\r
+                        self.home_oldtotalmin = home_totalmin\r
+                        EventMesh.publish("home_alarm_event")#该回家了                                                                                                                                                   \r
+\r
+\r
+        \r
+        #该休息了\r
+        def reset_alarm(self):\r
+            data = RTC().datetime()\r
+            hour = data[4]\r
+            min = data[5]\r
+\r
+            week = int(data[3])\r
+\r
+            date1 = data[1]\r
+            date2 = data[2]\r
+            cur_total_min = int(hour)*60+int(min)\r
+            # EventMesh.debug_log("self.reset_oldtotalmin",self.reset_oldtotalmin,cur_total_min,self.alarm_flag)\r
+            if self.reset_oldtotalmin == 0:\r
+                self.reset_oldtotalmin = cur_total_min #549\r
+            if self.reset_oldtotalmin != cur_total_min: #上次响过的闹钟分钟数不等于当前的分钟数据需要清零否则下一个不会响铃\r
+                if self.reset_flag == 1:\r
+                    self.reset_flag = 0\r
+                    self.reset_count = 0\r
+            reset_alarm = []\r
+            reset_alarm = EventMesh.publish("get_storage_config","reset_alarm")\r
+            # EventMesh.debug_log("reset_alarm info2",len(reset_alarm),cur_total_min)\r
+            if self.reset_flag == 1:#表示闹钟响过清除标志\r
+                self.reset_count+=1\r
+                if self.reset_count > 6:\r
+                    self.reset_count = 0\r
+                    self.reset_flag = 0\r
+            if reset_alarm != None:\r
+                if len(str(reset_alarm)) != 0 and str(reset_alarm) != []:\r
+                    for i in range(len(reset_alarm)):\r
+                        # print("i",i)\r
+                        start_hour = int(reset_alarm[i]["start_hour"])\r
+                        start_min = int(reset_alarm[i]["start_min"])\r
+\r
+                        end_hour = int(reset_alarm[i]["end_hour"])\r
+                        end_min = int(reset_alarm[i]["end_min"])\r
+\r
+                        # EventMesh.debug_log("reset_alarm home 33",reset_alarm)\r
+                        \r
+                        start_totalmin = int(start_hour)*60+int(start_min)\r
+                        end_totalmin = int(end_hour)*60+int(end_min)\r
+\r
+                        if start_totalmin == cur_total_min and self.reset_flag == 0:#14:00\r
+                            self.reset_flag  = 1\r
+                            self.reset_count = 0\r
+                            self.reset_oldtotalmin = start_totalmin\r
+                            EventMesh.publish("reset_alarm_event")#该休息了     \r
+                            break\r
+\r
+                        if end_totalmin == cur_total_min and self.reset_flag == 0:\r
+                            self.reset_flag  = 1\r
+                            self.reset_count = 0\r
+                            self.reset_oldtotalmin = end_totalmin\r
+                            EventMesh.publish("reset_end_alarm_event")#休息结束了     \r
+                            break\r
+                                                                                                                                                                    \r
+\r
+        def clear_normal_alarm(self,event,msg):#普通闹钟清除标志\r
+            self.normal_flag = 0\r
+            self.normal_count = 0\r
+            self.normal_oldtotalmin = 0\r
+\r
+        def clear_reset_alarm(self,event,msg):#休息清除标志\r
+            self.reset_flag = 0\r
+            self.reset_count = 0\r
+            self.reset_oldtotalmin = 0\r
+\r
+        def clear_home_alarm(self,event,msg):#回家清除标志\r
+            self.home_flag = 0\r
+            self.home_count = 0\r
+            self.home_oldtotalmin = 0\r
+\r
+\r
+        def clear_medicine_alarm(self,event,msg):#吃药清除标志\r
+            self.medicine_count = 0\r
+            self.medicine_flag  = 0\r
+            self.medicine_oldtotalmin = 0\r
+        \r
+\r
+        def clear_wakeup_alarm(self,event,msg):#起床标识\r
+            self.wakeup_flag = 0\r
+            self.wakeup_count = 0\r
+            self.wakeup_oldtotalmin = 0\r
+\r
+        def clear_sleep_alarm(self,event,msg):#睡觉标识\r
+\r
+            self.sleep_flag = 0\r
+            self.sleep_count = 0\r
+            self.sleep_oldtotalmin = 0\r
+\r
+            \r
+\r
+\r
+        def get_sim_Status(self, event, msg):\r
+            return sim.getStatus()\r
+        def get_device_ope(self, event, msg):\r
+            """\r
+            获取设备运营商信息\r
+            :param event:\r
+            :param msg:\r
+            :return: 运营商\r
+            """\r
+            net_ope_map = {\r
+                "UNICOM": "中国联通HD",\r
+                "CMCC": "中国移动HD",\r
+                "CT": "中国电信HD"\r
+            }\r
+            """获取运营商"""\r
+            try:\r
+                short_eons = net.operatorName()[1]\r
+            except Exception:\r
+                return "无"\r
+            return net_ope_map.get(short_eons, None)\r
+\r
+        def get_signal(self, event=None, msg=None):\r
+            """\r
+            获取信号事件\r
+            :param event:\r
+            :param msg:\r
+            :return: int 类型\r
+            """\r
+            return net.csqQueryPoll()\r
+\r
+        def get_time_bucket(self, time):\r
+            if time < 12:\r
+                return '上午'\r
+            else:\r
+                return '下午'\r
+\r
+        def get_week(self, week):\r
+            if week == 1:\r
+                return '一'\r
+            elif week == 2:\r
+                return '二'\r
+            elif week == 3:\r
+                return '三'\r
+            elif week == 4:\r
+                return '四'\r
+            elif week == 5:\r
+                return '五'\r
+            elif week == 6:\r
+                return '六'\r
+            elif week == 7 or week == 0:\r
+                return '日'\r
+\r
+        def get_time(self, event=None, msg=None):\r
+            """\r
+            获取时间事件\r
+            :param event:\r
+            :param msg:\r
+            :return: HH:MM 格式\r
+            """\r
+            rtc_time = self.rtc.datetime()\r
+            \r
+            date = ("%d月%d日" % (rtc_time[1], rtc_time[2]))\r
+            year = ("%04d年" % (rtc_time[0]))\r
+            week = ("星期%s"%(self.get_week(rtc_time[3])))\r
+            week_data = rtc_time[3]\r
+            time = [rtc_time[4], rtc_time[5]]\r
+            time_quantum = ("%s" % (self.get_time_bucket(rtc_time[4])))\r
+            \r
+            result = [time, time_quantum, date , week,year,week_data]\r
+            #时分,上午下午,日期,星期,年 星期\r
+            return result\r
+\r
+        def get_step_count(self, event=None, msg=None):\r
+            """\r
+            获取步数\r
+            """\r
+            # print("11111:{}".format(EventMesh.publish("get_storage_config","clear_state3")))\r
+            XYZ = self.gsensor.get_x_y_z()\r
+            tmp = 0\r
+            step =[0,0,0,0]\r
+            tmp =  self.gsensor.get_step() \r
+            # EventMesh.debug_log("x:%d,y:%d,z:%d tmp %d",XYZ[0],XYZ[1],XYZ[2],tmp)\r
+            step[0]= tmp \r
+            step[1] = XYZ[0]\r
+            step[2] = XYZ[1]\r
+            step[3] = XYZ[2]\r
+            # print("1222:{}".format(EventMesh.publish("get_storage_config","clear_state3")))\r
+            return step\r
+\r
+        def get_ic_cid(self, event, msg):\r
+            """\r
+            获取ic cid事件\r
+            :param event:\r
+            :param msg:\r
+            :return: str ic cid\r
+            """\r
+            return sim.getIccid()\r
+\r
+        def get_phone_num(self, event, msg):\r
+            """\r
+            获取电话号码事件\r
+            :param event:\r
+            :param msg:\r
+            :return: str number\r
+            """\r
+            return sim.getPhoneNumber()\r
+\r
+        def get_battery(self, event=None, msg=None):\r
+            """\r
+            获取电池事件,暂时没支持\r
+            :param event:\r
+            :param msg:\r
+            :return:\r
+            """\r
+\r
+            charge_state = '0'\r
+            if self.get_usb_state() == 1:\r
+                charge_state = '1'\r
+            else:\r
+                charge_state = '0'\r
+\r
+            #temp = Power.getVbatt()\r
+            temp = EventMesh.publish("get_curr_battery_level")\r
+            vbat = EventMesh.publish("get_battery",temp)\r
+            if vbat == None:\r
+                vbat = 100\r
+            # EventMesh.debug_log("vbat",vbat)\r
+            # if temp != None :\r
+            #     if temp <= 3505:\r
+            #         vbat = 0 \r
+            #     elif temp <= 3699:\r
+            #         vbat = 20 #"E:/vbat_20.jpg"\r
+            #     elif temp <= 3772:\r
+            #         vbat = 40 #"E:/vbat_40.jpg"\r
+            #     elif temp <= 3882:\r
+            #         vbat = 60 #"E:/vbat_60.jpg"\r
+            #     elif temp <= 4070:\r
+            #         vbat = 80 #"E:/vbat_80.jpg"\r
+            #     elif temp <= 4200:\r
+            #         vbat = 90 #\r
+            #     else:\r
+            #         vbat = 100 #"E:/vbat_100.jpg"\r
+            # else:\r
+            #     vbat = 100\r
+\r
+            result = [charge_state, vbat]\r
+\r
+            return result\r
+        #Set the current average battery level\r
+        def set_curr_battery_level(self, event=None, msg=None):\r
+            self.curr_battery_level = msg\r
+        \r
+        def get_curr_battery_level(self, event=None, msg=None):\r
+            return self.curr_battery_level\r
+\r
+        def get_device_fw_version(self, *args):\r
+            '''\r
+            获取设备固件版本号\r
+            '''\r
+            fw_version = modem.getDevFwVersion()\r
+            if isinstance(fw_version, str):\r
+                return fw_version\r
+            return "--"\r
+\r
+        def get_standby_time(self, *args):\r
+            '''\r
+            获取设备单次开机待机时间\r
+            '''\r
+            time_msg = utime.time()\r
+            d = int(\r
+                time_msg / 86400)  # The int call removes the decimals.  Conveniently, it always rounds down.  int(2.9) returns 2 instead of 3, for example.\r
+            time_msg -= (\r
+                    d * 86400)  # This updates the value of x to show that the already counted seconds won't be double counted or anything.\r
+            h = int(time_msg / 3600)\r
+            time_msg -= (h * 3600)\r
+            m = int(time_msg / 60)\r
+            time_msg -= (m * 60)\r
+            s = time_msg\r
+            result = "{}天{}小时{}分".format(d, h, m)\r
+            return result\r
+\r
+        def set_key(self, topic, msg):\r
+            self.key = msg["value"]\r
+        def get_key(self, topic, msg):\r
+            return self.key\r
+\r
+        def get_imei(self, topic, msg):\r
+            if not self.imei:\r
+                self.imei = modem.getDevImei()\r
+            \r
+            # self.imei = "860132064231574" #860132060128634\r
+            return self.imei\r
+\r
+        def get_cid(self, topic, msg):\r
+            return self.cid\r
+\r
+        def set_cid(self, topic, msg):\r
+            self.cid = msg["value"]\r
+\r
+        def get_imsi(self, topic, msg):\r
+            if not self.imei:\r
+                self.imei = sim.getImsi()\r
+            return self.imsi\r
+\r
+        def get_password(self, topic, msg):\r
+            return self.password\r
+\r
+        def set_password(self, topic, msg):\r
+            self.password = msg["value"]\r
+\r
+        def set_ping(self, topic, msg):\r
+            self.PING = msg\r
+        def get_ping(self, topic, msg):\r
+            return self.PING\r
+\r
+        def set_connect(self, topic, msg):\r
+            #EventMesh.debug_log("set_connect:{}".format(msg))\r
+            self.connect = msg\r
+        def get_connect(self, topic, msg):\r
+            return self.connect\r
+\r
+        def start_blood_oxygen(self, topic, msg):\r
+            EventMesh.debug_log("start_blood_oxygen!!!")\r
+            self.hsensor.open_blood_oxygen()\r
+\r
+        def start_heart(self, topic, msg):\r
+            EventMesh.debug_log("start_heart!!!")\r
+            self.hsensor.open_heart()\r
+\r
+        def stop_blood_oxygen(self, topic, msg):\r
+            EventMesh.debug_log("stop_blood_oxygen!!!")\r
+            self.hsensor.close()\r
+\r
+        def stop_heart(self, topic, msg):\r
+            EventMesh.debug_log("stop_heart!!!")\r
+            self.hsensor.close()\r
+\r
+        def get_blood_oxygen(self, topic, msg):\r
+            data = self.hsensor.get_all_data()\r
+            return data[1]\r
+\r
+        def get_heart(self, topic, msg):\r
+            data = self.hsensor.get_all_data()\r
+            return data[0]\r
+        \r
+        def get_wear(self, topic, msg):\r
+            return self.hsensor.get_wear()\r
+        \r
+        def get_Hsensor(self, topic, msg):\r
+            return self.hsensor\r
+        \r
+        def Hsensor_set_sleep(self, topic, msg):\r
+            self.hsensor.set_sleep()\r
+\r
+        def start_temp(self, topic, msg):\r
+            EventMesh.debug_log("start_temp!!!!!!!")\r
+            WHO_AM_I = bytearray([0x01, 0])\r
+            I2C_SLAVE_ADDR = 0x49\r
+            #I2C_SLAVE_ADDR = 0x48\r
+            r_data = bytearray(2)\r
+            data = bytearray([0x61A0, 0])   # 唤醒\r
+            return self.i2c0.write(I2C_SLAVE_ADDR, WHO_AM_I, 1, data, 2)\r
+        def stop_temp(self, topic, msg):\r
+            EventMesh.debug_log("stop_temp!!!!!!!")\r
+            WHO_AM_I = bytearray([0x01, 0])\r
+            I2C_SLAVE_ADDR = 0x49\r
+            #I2C_SLAVE_ADDR = 0x48\r
+            r_data = bytearray(2)\r
+            data = bytearray([0x60A0, 0])   #休眠\r
+            return self.i2c0.write(I2C_SLAVE_ADDR, WHO_AM_I, 1, data, 2)\r
+            \r
+        def get_temp(self, topic, msg):\r
+            WHO_AM_I = bytearray([0x00, 0])\r
+            I2C_SLAVE_ADDR = 0x49\r
+            #I2C_SLAVE_ADDR = 0x48\r
+            r_data = bytearray(2)\r
+            self.i2c0.read(I2C_SLAVE_ADDR, WHO_AM_I, 1, r_data, 2, 0)\r
+            #EventMesh.debug_log("temp_data:{}".format(r_data))\r
+            temp_s = ((r_data[0]<<8) | (r_data[1]))>>4\r
+            #EventMesh.debug_log("temp_s:{}".format(temp_s))\r
+            temp_data = temp_s * 0.0625\r
+            EventMesh.debug_log("temp_data:{}".format(temp_data))\r
+            return temp_data\r
+    \r
+                \r
+\r
+        def sim_slot_get(self, topic=None, msg=None):\r
+            return sim.getCurSimid()\r
+\r
+        def sim_slot_switch(self, topic=None, slot=None):\r
+            """\r
+            sim 卡槽切换\r
+            :param topic:\r
+            :param slot:\r
+            :return: 切换sim卡卡槽  0 切换成功, 1 无需切换, -1 切换失败\r
+            """\r
+            if self.sim_slot_get() == slot:\r
+                return 1\r
+            else:\r
+                return sim.switchCard(slot)\r
+\r
+        def usb_event_cb(self, state):\r
+            status = state\r
+\r
+            if status == 1:#插入USB\r
+                EventMesh.debug_log("charge R_CHARGE_in")\r
+                EventMesh.publish("clear_usb_flag")\r
+                EventMesh.publish("set_usb", 1)#\r
+                pass\r
+            elif status == 0:#拨出usbs\r
+                EventMesh.publish("clear_usb_flag")\r
+                EventMesh.publish("set_usb", 2)#\r
+                EventMesh.debug_log("charge R_CHARGE_out")\r
+\r
+                \r
+                \r
+\r
+        \r
+\r
+        def get_usb_state(self):\r
+            state = self.usb.getStatus()\r
+            if state == -1:\r
+                state = 0\r
+            return state\r
+        \r
+\r
+    def wifiScan_cb(args):\r
+            EventMesh.publish(constants.EVENT.WIFIINFO, args)\r
+            wifiScan.control(0)\r
+\r
+    class LocationManager(Abstract):\r
+\r
+        def __init__(self):\r
+            self.gps = None\r
+            #self.match = GPSMatch()\r
+            self.timer_read_GPS_info = osTimer()\r
+            self.wifi_data = []\r
+            self.gps_data  = {}\r
+            self.cell_data = []\r
+            self.location_timer_count = 0\r
+            self.location_check_data_timer_count = 0\r
+            self.GGA_count = 0\r
+            self.RMC_A_count = 0\r
+            self.location_type = 0 #定位类型,0:正常定位,有gps数据或60秒关闭;1:测试模式,只有发CLOSE_LOCATION消息才关闭\r
+            self.location_flag = 0\r
+            self.start_location_flag = 0\r
+            self.location_thread_id  = 0\r
+            self.location_queue = Queue(100)\r
+            self.lpm_fd = None\r
+            self.start_agps = 0\r
+            read_data = EventMesh.publish("get_storage_config","isOpenGNSS")#获取是否打开GNSS\r
+            if read_data != None:\r
+                self.isOpenGNSS = read_data\r
+            else:#默认关闭GNSS\r
+                self.isOpenGNSS = "1"\r
+                EventMesh.publish("set_storage_config",["isOpenGNSS",self.isOpenGNSS])\r
+\r
+            self.isOpenGNSS = EventMesh.publish("get_storage_config","isOpenGNSS")\r
+            if self.isOpenGNSS == None:\r
+                self.isOpenGNSS = "1"\r
+            if self.isOpenGNSS == "1":\r
+                if quecgnss.init() == -1:\r
+                    self.isOpenGNSS = "0"\r
+                    EventMesh.publish("set_storage_config",["isOpenGNSS",self.isOpenGNSS])\r
+                else:\r
+                    quecgnss.gnssEnable(0)\r
+        @staticmethod\r
+        def get_date():\r
+            return "{:04d}-{:02d}-{:02d}".format(*utime.localtime()[0:3])\r
+\r
+        @staticmethod\r
+        def get_time():\r
+            return "{:02d}:{:02d}:{:02d}".format(*utime.localtime()[3:6])\r
+\r
+        def post_processor_after_instantiation(self):\r
+            # _gps_cfg = {\r
+            #     "UARTn": UART.UART1,\r
+            #     "buadrate": 115200,\r
+            #     "databits": 8,\r
+            #     "parity": 0,\r
+            #     "stopbits": 1,\r
+            #     "flowctl": 0,\r
+            #     "PowerPin": Pin.GPIO2,\r
+            #     "StandbyPin": Pin.GPIO3,\r
+            #     "BackupPin": None,\r
+            #     "gps_mode": 0x01,\r
+            # }\r
+            # self.gps = GPS(**_gps_cfg)\r
+            # self.gps.power_switch(0)#关闭GPS\r
+            EventMesh.subscribe(constants.EVENT.GPSOPEN, self.gps_open)\r
+            EventMesh.subscribe(constants.EVENT.GPSCLOSE, self.gps_close)\r
+            EventMesh.subscribe(constants.EVENT.START_LOCATION, self.start_location)\r
+            EventMesh.subscribe(constants.EVENT.START_LOCATION_TEST, self.start_location_test)\r
+            EventMesh.subscribe(constants.EVENT.WIFIINFO, self.WIFI_INFO)\r
+            EventMesh.subscribe(constants.EVENT.WIFISCANOPEN,self.WIFI_scan_open)\r
+            EventMesh.subscribe(constants.EVENT.CLOSE_LOCATION,self.close_location)\r
+            EventMesh.subscribe("get_location_flag",self.get_location_flag)\r
+            \r
+            #EventMesh.subscribe(constants.EVENT.GPSCLOSE, self.gps_close)\r
+        def get_location_flag(self, event, msg):\r
+            return self.location_flag\r
+        def start_location(self, event, msg):\r
+            self.location_queue.put(msg)#测试类型入队\r
+            self.gps_data = {}\r
+            self.wifi_data = []\r
+            self.cell_data = []\r
+            self.location_timer_count = 0\r
+            self.GSV_sig_ok_count = 0\r
+            EventMesh.debug_log("start_location:{}".format(msg))\r
+            if( self.location_flag == 1):\r
+                return\r
+            _thread.stack_size((9+5)*1024)\r
+            self.location_thread_id  = _thread.start_new_thread(self.location_thread, ())\r
+            _thread.stack_size(8*1024)\r
+            \r
+            self.location_flag = 1\r
+            self.timer_read_GPS_info.start(1000, 1, self.location_timer)\r
+            #self.gps_open(event, msg)\r
+\r
+\r
+        def start_location_test(self, event, msg):\r
+            EventMesh.debug_log("start_location_test")\r
+            \r
+            self.location_type = 1\r
+            if( self.location_flag == 1):\r
+                return\r
+            _thread.stack_size((9+4)*1024)\r
+            self.location_thread_id  = _thread.start_new_thread(self.location_thread, ())\r
+            _thread.stack_size(8*1024)\r
+        \r
+            self.location_timer_count = 0\r
+            self.location_flag = 1\r
+            #self.gps_open(event, msg)\r
+            self.location_type = 1\r
+            self.timer_read_GPS_info.start(1000, 1, self.location_timer)\r
+    \r
+\r
+        def close_location(self, event, msg):\r
+            self.location_flag = 0\r
+            self.location_type = 0\r
+            self.timer_read_GPS_info.stop()\r
+\r
+            \r
+\r
+        def WIFI_INFO(self, event, msg):\r
+            self.wifi_data = msg\r
+            # EventMesh.debug_log("WIFI_INFO:")\r
+            # EventMesh.debug_log([msg[0],msg])\r
+\r
+        def WIFI_scan_open(self, event, msg):\r
+            #EventMesh.debug_log("WIFI_scan_open")\r
+            \r
+\r
+            if wifiScan.getState() == False :\r
+                self.wifi_data = []\r
+                wifiScan.control(1)\r
+                wifiScan.setCfgParam(6, 2, 5,  0)  #设置WiFi参数,10秒上层,两轮,最多6个,6秒底层,PS优先\r
+                wifiScan.setCallback(wifiScan_cb) #注册回调函数\r
+                wifiScan.asyncStart()\r
+                #EventMesh.debug_log("wifiScan.asyncStart")\r
+            else :\r
+                EventMesh.debug_log("WIFI_scan_open:error1") \r
+        def gps_open(self, event, msg):\r
+            if self.isOpenGNSS == "1":\r
+                #EventMesh.debug_log("publish:gps_open")\r
+                #quecgnss.init()\r
+                quecgnss.gnssEnable(2)\r
+                #self.gps.__gps_nmea_data_clean()\r
+        def gps_close(self, event, msg):\r
+            if self.isOpenGNSS == "1":\r
+                quecgnss.gnssEnable(0)\r
+        def location_timer(self, *args, **kwargs):\r
+            \r
+            self.location_timer_count = self.location_timer_count +1\r
+            self.location_check_data_timer_count = self.location_check_data_timer_count+1\r
+\r
+        def Location_send(self, msg) :\r
+            EventMesh.debug_log("Location_send1")\r
+            if self.location_queue.empty() == True:\r
+                return\r
+            EventMesh.debug_log("Location_send2")\r
+            while True:\r
+                if self.location_queue.empty() == False:\r
+                    TYPE = self.location_queue.get()\r
+                    date = "{:04d}{:02d}{:02d},{:02d}{:02d}{:02d}".format(*utime.localtime()[0:6])\r
+                    date = date[2:]\r
+                    #date = "180916,025723"\r
+                    GPS_type = "V"\r
+                    latitude = "0.000000,N"\r
+                    longitude = "0.000000,E"\r
+                    speed = "0.00"\r
+                    direction = "0.0"\r
+                    high = "100.0"\r
+                    number = "0"\r
+                    precision = "24"\r
+                    if msg[0] :#有GPS数据\r
+                        GPS_type = "A"\r
+                        # 纬度\r
+                        latitude = msg[0]["latitude"]\r
+                        # 经度\r
+                        longitude = msg[0]["longitude"]\r
+                        # 速度\r
+                        speed = msg[0]["speed"]\r
+                        # 方向\r
+                        direction = "0"\r
+                        if msg[0]["direction"] :\r
+                            direction = msg[0]["direction"]\r
+                        # 高度\r
+                        high = msg[0]["high"]\r
+                        high_tmp = high.split(".")\r
+                        if len(high_tmp) >= 2 :\r
+                            high = "%s"%(high_tmp[0])\r
+                        # 讯号质量:搜索到的卫星数目\r
+                        number = msg[0]["number"]\r
+                        precision = msg[0]["precision"]\r
+                        #date = msg[0]["date"]\r
+                    \r
+                    #gsm 信号强度\r
+                    gsm_sig =  str((100//31)*EventMesh.publish("screen_get_sig"))\r
+                    # 电池电量百分比 \r
+                    bat_tmp = EventMesh.publish("screen_get_battery")\r
+                    battery_caption =  str(bat_tmp[1])\r
+                    #步数\r
+                    old_step = 0\r
+                    step = 0\r
+                    step = EventMesh.publish("get_old_step_value")\r
+                    if step != 0:\r
+                        tmp_data  = EventMesh.publish("get_storage_config","old_step_new")\r
+                        if tmp_data != None:\r
+                            old_step = tmp_data\r
+                        if old_step !=  step:\r
+                            EventMesh.publish("set_storage_config",["old_step",step])\r
+                            EventMesh.publish("set_storage_config",["old_step_new",step])\r
+                            \r
+                    old_step = step\r
+                    # step = str(EventMesh.publish(constants.EVENT.GET_STEP)[0])\r
+                    #翻转次数\r
+                    turn_count = "0"\r
+                    #终端状态\r
+                    state = "%08X"%(EventMesh.publish("get_dev_state"))\r
+                    #EventMesh.debug_log("TYPE:{}".format(TYPE))\r
+                    if type(TYPE) == list:#队列里的数据有终端状态,则用队里的终端状态\r
+                        if len(TYPE)>= 2 :\r
+                            state = "%08X"%(TYPE[1])\r
+                    \r
+                    EventMesh.debug_log("state:{}".format(state))\r
+                    #基站数据\r
+                    CELL_num = len(msg[2])\r
+                    CELL_data = "1," #时延\r
+                    if msg[2] != []:\r
+                        for CELL in msg[2] :\r
+                            if CELL[0] == 0 :\r
+                                CELL_data += "%X,"%(int(CELL[2])) #MCC\r
+                                CELL_data += str(CELL[3]) +","#MNC\r
+                                CELL_data += str(CELL[5]) +","#tac,区域码\r
+                                CELL_data += str(CELL[1]) +","#基站编号 CID\r
+                                CELL_data += str(int(CELL[7]+140)) +","#信号强度 rssi\r
+                            else :\r
+                                CELL_data += str(CELL[5]) +","#tac,区域码\r
+                                CELL_data += str(CELL[1]) +","#基站编号 CID\r
+                                CELL_data += str(int(CELL[7]+140)) +","#信号强度 rssi\r
+                        CELL_data = CELL_data[:(len(CELL_data)-1)]\r
+                    #WIFI数据\r
+                    WIFI_num = 0 \r
+                    WIFI_data = ""\r
+                    if msg[1] :\r
+                        WIFI_num = msg[1][0]\r
+                        i = 0\r
+                        for MAC in msg[1][1] :\r
+                            WIFI_data += "wifi%d,%s,%d,"%(i,str(MAC[0]),MAC[1])\r
+                            i += 1\r
+                        WIFI_data = WIFI_data[:(len(WIFI_data)-1)]\r
+                    WIFI_data = WIFI_data.lower()\r
+                    #send_data = "UD ,%s ,%s     ,%s       ,%s       ,%s   ,%s       ,%s  ,%s    ,%s     ,%s             ,%s  ,%s        ,%s   ,%d     ,%s       ,%d      ,%s"\\r
+                    #              %(date,GPS_type,latitude,longitude,speed,direction,high,number,gsm_sig,battery_caption,step,turn_count,state,CELL_num,CELL_data,WIFI_num,WIFI_data)\r
+                    #定位数据\r
+                    send_data = "%s,%s,%s"%(date,GPS_type,latitude)\r
+                    send_data += ",%s,%s,%s"%(longitude,speed,direction)\r
+                    send_data += ",%s,%s,%s"%(high,number,gsm_sig,)\r
+                    send_data += ",%s,%s,%s"%(battery_caption,step,turn_count)\r
+                    send_data += ",%s,%d,%s"%(state,CELL_num,CELL_data)\r
+                    send_data += ",%d,%s"%(WIFI_num,WIFI_data)\r
+                    send_data+=",%s"%(precision)\r
+                    #EventMesh.debug_log("Location_send2:{} q_size:{}".format(send_data,self.location_queue.size()))\r
+            \r
+                \r
+                    #EventMesh.debug_log("Location_send3:{}:{}".format(TYPE,send_data))\r
+                    if type(TYPE) == list:\r
+                        EventMesh.publish(TYPE[0],send_data)\r
+                    else:\r
+                        EventMesh.publish(TYPE,send_data)\r
+                else :\r
+                    break\r
+\r
+        def GxGGA_latitude(self, gga_data):\r
+            """Parse latitude from GGA"""\r
+            if gga_data:\r
+                latitude_re = ure.search(r",[0-9]+\.[0-9]+,[NS],", gga_data)\r
+                if latitude_re:\r
+                    latitude = latitude_re.group(0)[1:-3]\r
+                    return str(float(latitude[:2]) + float(latitude[2:]) / 60)\r
+            return ""\r
+        def GxGGA_longitude(self, gga_data):\r
+            """Parse longitude from GGA"""\r
+            if gga_data:\r
+                longitude_re = ure.search(r",[0-9]+\.[0-9]+,[EW],", gga_data)\r
+                if longitude_re:\r
+                    longitude = longitude_re.group(0)[1:-3]\r
+                    return str(float(longitude[:3]) + float(longitude[3:]) / 60)\r
+            return ""\r
+\r
+        def GxGGA_altitude(self, gga_data):\r
+            """Parse altitude from GGA"""\r
+            if gga_data:\r
+                altitude_re = ure.search(r",-*[0-9]+\.[0-9]+,M,", gga_data)\r
+                if altitude_re:\r
+                    return altitude_re.group(0)[1:-3]\r
+            return ""\r
+        def location_thread(self):\r
+            \r
+            self.wifi_data = []\r
+            self.gps_data = {}\r
+            self.cell_data = []\r
+            gnss_r_data = []\r
+            self.GSV_sig_ok_count = 0\r
+            self.GSV_sig_very_ok_count = 0\r
+            self.GGA_count = 0\r
+            self.RMC_A_count = 0\r
+            # if self.start_agps == 1: #开启agps\r
+            #     self.start_agps = 0\r
+            #     quecgnss.configSet(2,1)\r
+            if self.lpm_fd == None:\r
+                self.lpm_fd = pm.create_wakelock("test_lock", len("test_lock"))\r
+            pm.wakelock_lock(self.lpm_fd)\r
+            EventMesh.debug_log("location_thread:1")\r
+            EventMesh.publish(constants.EVENT.GPSOPEN)\r
+            EventMesh.debug_log("location_thread:2")\r
+            #self.timer_read_GPS_info.start(1000, 1, self.location_timer)\r
+            EventMesh.debug_log("location_thread:3")\r
+            #utime.sleep_ms(1000)\r
+            self.location_timer_count = 0\r
+            #quecgnss.read(4096)#去掉第一次错误数据\r
+            #EventMesh.txt_log("START_LOCATION")\r
+            # pm.autosleep(0)#唤醒\r
+            # pm.sclkEx_set(0, 1, 5)\r
+            GSV_dict= {}\r
+            while self.location_flag == 1:\r
+                try :   \r
+                    \r
+                    match_gga_data = []\r
+                    #match_gsv_data = []\r
+                    gnss_r_data = []\r
+                    # if self.location_check_data_timer_count >= 3:\r
+                    #     pm.autosleep(0)#唤醒\r
+                    #     pm.sclkEx_set(0, 1, 5)\r
+                    if self.location_check_data_timer_count >= 1 :#3秒查一次基站数据和wifi数据\r
+                        self.location_check_data_timer_count = 0\r
+                        #EventMesh.debug_log(self.location_timer_count)\r
+                        GSV_dict= {}\r
+                        if self.isOpenGNSS == "1":                    \r
+                            #检查GNSS数据\r
+                            if ( self.gps_data == {} or self.location_type == 1) and quecgnss.get_state() == 2:\r
+\r
+                                pass\r
+                                tmp_ok_count = 0\r
+                                tmp_very_ok_count = 0\r
+                                gsv_data = quecgnss.get_gsv()\r
+                                rmc_data = quecgnss.get_rmc()\r
+                                gga_data = quecgnss.get_gga()\r
+                                vtg_data = quecgnss.get_vtg()\r
+                                # EventMesh.debug_log("gsv:{}".format(quecgnss.get_gsv()))\r
+                                # EventMesh.debug_log("gga:{}".format(quecgnss.get_gga()))\r
+                                # EventMesh.debug_log("rmc:{}".format(quecgnss.get_rmc()))\r
+                                # EventMesh.debug_log("vtg:{}".format(quecgnss.get_vtg())) \r
+                                for i in range(len(gsv_data)) :\r
+                                    \r
+                                    if i % 2 == 0:\r
+                                        if i+1 >= len(gsv_data) :\r
+                                            # EventMesh.debug_log("gsv_data num error!!")\r
+                                            break\r
+                                        GSV_dict[gsv_data[i]] = gsv_data[i+1]\r
+                                        #EventMesh.debug_log("type:gsv_data{}".format(type(gsv_data[i+1])))\r
+                                        try:\r
+                                            #EventMesh.debug_log("gsv_tmp[i+3]:{}".format(gsv_tmp[i+3]))\r
+                                            if gsv_data[i+1] :\r
+                                                if (gsv_data[i+1])>=20:\r
+                                                    tmp_ok_count +=1   \r
+                                                if (gsv_data[i+1])>=30:\r
+                                                    tmp_very_ok_count +=1  \r
+                                                    \r
+                                        except Exception as e:\r
+                                            usys.print_exception(e)\r
+                                        \r
+                                if(tmp_ok_count > self.GSV_sig_ok_count ):\r
+                                    self.GSV_sig_ok_count = tmp_ok_count\r
+                                if(tmp_very_ok_count > self.GSV_sig_very_ok_count ):\r
+                                    self.GSV_sig_very_ok_count = tmp_very_ok_count\r
+                                match_rmc_data = rmc_data.split(",")\r
+                                if len (match_rmc_data)>3: #有rmc数据\r
+                                        if match_rmc_data[2] == 'A':    \r
+                                            match_gga_data = gga_data.split(",")\r
+                                            if len(match_gga_data) >4: #数据全\r
+                                                match_vtg_data = vtg_data.split(",")\r
+                                                gps_date = "%s,%s"%(match_rmc_data[9],match_rmc_data[1][:6])#日期\r
+                                                #gps_data_tmp = self.gps.read_coordinates(gnss_r_data[1])\r
+                                                latitude = "0,N" #纬度\r
+                                                latitude_tmp = str(self.GxGGA_latitude(gga_data)).split(".")\r
+                                                if len(latitude_tmp) >= 2 and len(latitude_tmp[1])>=5:\r
+                                                    latitude = "%s.%s"%(latitude_tmp[0],latitude_tmp[1][:6])\r
+                                                    latitude = "%s,%s"%(latitude,match_rmc_data[4] )\r
+\r
+                                                longitude = "0,E"#经度\r
+                                                longitude_tmp = str(self.GxGGA_longitude(gga_data)).split(".")\r
+                                                if len(longitude_tmp) >= 2 and len(longitude_tmp[1])>=5:\r
+                                                    longitude = "%s.%s"%(longitude_tmp[0],longitude_tmp[1][:6])\r
+                                                    longitude = "%s,%s"%(longitude,match_rmc_data[6] ) #match_rmc_data[6] + str(gnss_r_data[1])\r
+                                                \r
+                                                high = "0"#高度\r
+                                                high = str(self.GxGGA_altitude(gga_data))\r
+                                                number = "0"#可用卫星\r
+                                                precision = "5.8"#精度\r
+                                                if len(match_gga_data)>5 :\r
+                                                    if match_gga_data[7]:\r
+                                                        number = match_gga_data[7]\r
+                                                    if match_gga_data[8]:\r
+                                                        precision = match_gga_data[8]\r
+                                                direction = "249.5" #方向\r
+                                                speed = '0.00'    #速度    \r
+                                                if(len(match_vtg_data)>5 ):\r
+                                                    if match_vtg_data[1]:\r
+                                                        direction =  match_vtg_data[1]\r
+                                                    if match_vtg_data[7]:    \r
+                                                        speed =  match_vtg_data[7]\r
+                                                self.gps_data = {\r
+                                                    "latitude": latitude,\r
+                                                    "longitude": longitude,\r
+                                                    "high": high,\r
+                                                    "direction": direction,\r
+                                                    "speed": speed,\r
+                                                    "number": number, \r
+                                                    "date":  gps_date,\r
+                                                    "precision":  precision\r
+                                                }\r
+    # ***********************************************************************************\r
+\r
+\r
+                    #检查wifi数据\r
+                    if self.wifi_data == [] or (self.wifi_data != [] and self.wifi_data[0] == 0):#and self.wifi_data[0] <= 0:\r
+                        EventMesh.publish(constants.EVENT.WIFISCANOPEN)\r
+                \r
+                    #检查基站数据\r
+                    if self.cell_data == []:   \r
+                        data_tmp = net.getCellInfo()\r
+                        if(len(data_tmp)>=2):\r
+                            for cell in data_tmp:\r
+                                if cell and cell[0][0] == 0 and len(cell[0]) > 1:\r
+                                    self.cell_data = cell\r
+                                    break\r
+\r
+                    if self.location_type == 1: #测试模式\r
+                        self.location_timer_count = 0\r
+                        \r
+                        EventMesh.publish("PUSH_LOCATION_DATA", [[self.gps_data,GSV_dict],self.wifi_data,self.cell_data]) \r
+                        if self.gps_data  != {} : #发送数据 \r
+                            EventMesh.publish(constants.EVENT.CLOSE_LOCATION)#关闭定位\r
+                            self.location_queue.put(constants.PROTOCOL.UD_SEND)\r
+                            self.Location_send([self.gps_data,self.wifi_data,self.cell_data])\r
+                            \r
+\r
+                    elif self.location_type == 0: #正常模式     \r
+                        if self.gps_data  != {} or self.location_timer_count > 100: #or( self.wifi_data != [] and self.cell_data != []): \r
+                            if self.location_queue.empty() == False:#有定位队列\r
+                                pass\r
+                                #EventMesh.txt_log("LOCATION timer:{} ok:{} very_ok:{}".format(self.location_timer_count,self.GSV_sig_ok_count))   \r
+                                #EventMesh.txt_log("LOCATION:timer:{} ok_count:{} ".format(self.location_timer_count,self.GSV_sig_ok_count))\r
+                            if self.gps_data  == {}: #定位超时,且信噪比多个大于30,下次启动agps\r
+                                if self.GSV_sig_very_ok_count > 3:#3个超30以上\r
+                                    self.start_agps = 1\r
+                                    #EventMesh.txt_log("open agps:{}".format(GSV_dict))\r
+                            #upload_time = EventMesh.publish("get_upload_data")    \r
+                            self.Location_send([self.gps_data,self.wifi_data,self.cell_data])\r
+                            #if upload_time > 200  : \r
+                            EventMesh.publish(constants.EVENT.CLOSE_LOCATION)#关闭定位\r
+                            # else:   #定位间隔小于3分钟不关闭gps,不影响无信号判断\r
+                            #     self.location_timer_count = 0\r
+                            #     self.GSV_sig_ok_count = 0\r
+                                \r
+                            \r
+\r
+                            \r
+                        if (self.isOpenGNSS != "1" or (self.GSV_sig_ok_count <= 1 and self.location_timer_count > 20)) and self.wifi_data != [] and self.cell_data != [] : #超过40秒且信号大于30的不足3个\r
+                            EventMesh.publish(constants.EVENT.CLOSE_LOCATION)#关闭定位 \r
+                            EventMesh.debug_log("Location_send:CLOSE_LOCATION")  \r
+                            #EventMesh.txt_log("GSV_sig_ok_count<3:timer:{} ok_count:{} ".format(self.location_timer_count,self.GSV_sig_ok_count))\r
+                            self.Location_send([self.gps_data,self.wifi_data,self.cell_data])\r
+\r
+                \r
+                    \r
+                except Exception as e:\r
+                    usys.print_exception(e)\r
+                    EventMesh.txt_log("location_thread:ERROR:".format(e))\r
+                    #EventMesh.debug_log("location_thread:ERROR:{}".format(usys.print_exception(e)))\r
+                    EventMesh.debug_log("self.gps_data{},self.wifi_data{},self.cell_data{}".format(self.gps_data,self.wifi_data,self.cell_data))\r
+                    #self.Location_send([self.gps_data,self.wifi_data,self.cell_data])\r
+                    EventMesh.publish(constants.EVENT.CLOSE_LOCATION)#关闭定位 \r
+                utime.sleep_ms(500)\r
+\r
+            #self.timer_read_GPS_info.stop()\r
+            #self.gps.power_switch(0)\r
+            wifiScan.control(0)\r
+            EventMesh.publish(constants.EVENT.GPSCLOSE)\r
+            # if EventMesh.publish("get_lcd_state" ) == 0:#休眠的时候,恢复休眠\r
+            #     pm.autosleep(1)\r
+            #     pm.sclkEx_set(1, 1, 5)\r
+            if self.lpm_fd != None:\r
+                pm.wakelock_unlock(self.lpm_fd)\r
+            #pm.delete_wakelock(lpm_fd)\r
+            EventMesh.debug_log("CLOSE_LOCATION")\r
+            #EventMesh.txt_log("CLOSE_LOCATION")\r
+\r
+                    \r
+\r
+    class AddrBookManager(Abstract):\r
+        # 通讯录\r
+        def __init__(self):\r
+            self.read_phonebook = {}\r
+            self.check_json = 0\r
+            self.check_json = ql_fs.path_exists("/usr/static/storage_file/phonebook.json")\r
+\r
+            if self.check_json == True:\r
+                with open("/usr/static/storage_file/phonebook.json","r",encoding="utf-8") as fd:\r
+                    self.read_phonebook = ujson.load(fd)\r
+                    EventMesh.debug_log("读取电话本")\r
+\r
+        def post_processor_after_instantiation(self):\r
+            EventMesh.subscribe("get_phonebook_list", self.get)\r
+            EventMesh.subscribe("set_phonebook_list", self.set)\r
+            EventMesh.subscribe("call_phonebook_one_call", self.call_phonebook_one_call)\r
+            EventMesh.subscribe("call_phonebook_two_call", self.call_phonebook_two_call)\r
+            EventMesh.subscribe("call_phonebook_three_call", self.call_phonebook_three_call)\r
+\r
+            EventMesh.subscribe("call_phonebook_num", self.call_phonebook_num)\r
+\r
+        def get(self, event, msg):\r
+            self.check_json = ql_fs.path_exists("/usr/static/storage_file/phonebook.json")\r
+            return [self.check_json,self.read_phonebook]\r
+        \r
+        def call_phonebook_num(self, event, msg):\r
+            name = ''\r
+            key_tmp = ''\r
+            phone_num = int(msg)\r
+            if self.read_phonebook != {}:\r
+                if len(self.read_phonebook) >= phone_num:\r
+                    phonebook_keys = sorted(self.read_phonebook.keys())\r
+                    name = self.read_phonebook[phonebook_keys[phone_num-1]]\r
+                    key_tmp = phonebook_keys[phone_num-1]\r
+                    if len(name) != 0:\r
+                        EventMesh.publish("save_phonename",str(name))\r
+                        EventMesh.publish("save_phonenum",str(name))\r
+                        EventMesh.publish("dial_out_call_center_cb",str(name))#电话拨出去\r
+                    else:\r
+                        EventMesh.publish("dial_out_call_center_cb",None)#电话拨出去\r
+                else:\r
+                    EventMesh.publish("dial_out_call_center_cb",None)#电话拨出去\r
+            else:\r
+                EventMesh.publish("dial_out_call_center_cb",None)#电话拨出去\r
+            EventMesh.debug_log("call_phonebook_call name:{} msg:{}".format(len(self.read_phonebook),msg))\r
+\r
+        def call_phonebook_one_call(self, event, msg):\r
+            name = ''\r
+            key_tmp = ''\r
+            if self.read_phonebook != {}:\r
+                if len(self.read_phonebook) >= 1:\r
+                    phonebook_keys = sorted(self.read_phonebook.keys())\r
+                    name = self.read_phonebook[phonebook_keys[0]]\r
+                    key_tmp = phonebook_keys[0]\r
+                    if len(name) != 0:\r
+                        EventMesh.publish("save_phonename",str(name))\r
+                        EventMesh.publish("save_phonenum",str(name))\r
+                        EventMesh.publish("dial_out_call_center_cb",str(name))#电话拨出去\r
+                    else:\r
+                        EventMesh.publish("dial_out_call_center_cb",None)#电话拨出去\r
+                else:\r
+                    EventMesh.publish("dial_out_call_center_cb",None)#电话拨出去\r
+            else:\r
+                EventMesh.publish("dial_out_call_center_cb",None)#电话拨出去\r
+            EventMesh.debug_log("call_phonebook_one_call name:{} key_tmp:{} len:{}".format(name,key_tmp,len(self.read_phonebook)))\r
+\r
+        def call_phonebook_two_call(self, event, msg):\r
+            name = ''\r
+            key_tmp = ''\r
+            if self.read_phonebook != {}:\r
+                if len(self.read_phonebook) >= 2:\r
+                    phonebook_keys = sorted(self.read_phonebook.keys())\r
+                    name = self.read_phonebook[phonebook_keys[1]]\r
+                    key_tmp = phonebook_keys[1]\r
+                    if len(name) != 0:\r
+                        #voiceCall.callStart(str(name))\r
+                        EventMesh.publish("save_phonename",str(name))\r
+                        EventMesh.publish("save_phonenum",str(name))\r
+                        EventMesh.publish("dial_out_call_center_cb",str(name))#电话拨出去\r
+                    else:\r
+                        EventMesh.publish("dial_out_call_center_cb",None)#电话拨出去\r
+                    \r
+                else:\r
+                    EventMesh.publish("dial_out_call_center_cb",None)#电话拨出去\r
+            else:\r
+                EventMesh.publish("dial_out_call_center_cb",None)#电话拨出去\r
+                EventMesh.debug_log("call_phonebook_two_call name:{} key_tmp:{}".format(name,key_tmp))\r
+        \r
+        def call_phonebook_three_call(self, event, msg):\r
+            name = ''\r
+            key_tmp = ''\r
+            if self.read_phonebook != {}:\r
+                if len(self.read_phonebook) >= 3:\r
+                    phonebook_keys = sorted(self.read_phonebook.keys())\r
+                    name = self.read_phonebook[phonebook_keys[2]]\r
+                    key_tmp = phonebook_keys[2]\r
+                    if len(name) != 0:\r
+                        #voiceCall.callStart(str(name))\r
+                        EventMesh.publish("save_phonename",str(name))\r
+                        EventMesh.publish("save_phonenum",str(name))\r
+                        EventMesh.publish("dial_out_call_center_cb",str(name))#电话拨出去\r
+                    else:\r
+                        EventMesh.publish("dial_out_call_center_cb",None)#电话拨出去\r
+                    \r
+                else:\r
+                    EventMesh.publish("dial_out_call_center_cb",None)#电话拨出去\r
+            else:\r
+                EventMesh.publish("dial_out_call_center_cb",None)#电话拨出去\r
+            EventMesh.debug_log("call_phonebook_three_call name:{} key_tmp:{}".format(name,key_tmp))\r
+\r
+        def set(self, event, msg):\r
+            self.check_json = msg[0]\r
+            self.read_phonebook = msg[1]\r
+\r
+    import sms\r
+    class MsgManager(Abstract):\r
+        # 短信\r
+        def __init__(self):\r
+            self.msg_nums = 0\r
+            self.msg_detail = ""\r
+\r
+        def post_processor_after_instantiation(self):\r
+            EventMesh.subscribe("get_msg_nums", self.get_msg_nums)\r
+            # 可通过此push_addr_book_list主动推送\r
+            EventMesh.subscribe("get_msg_detail", self.get_msg_detail)\r
+\r
+        def get_msg_nums(self, event, msg):\r
+\r
+            self.msg_nums = sms.getMsgNums() \r
+            EventMesh.debug_log("self.msg_nums {}:".format(self.msg_nums))\r
+            return self.msg_nums\r
+        \r
+        def get_msg_detail(self, event, msg):\r
+            \r
+            # self.msg_detail = sms.searchTextMsg(self.msg_nums)\r
+            # EventMesh.debug_log("self.msg_detai {}:".format(self.msg_detai))\r
+            return{\r
+                "小明":"有内鬼,停止交易",\r
+                "小红":"今晚十点一起吃饭"\r
+            }\r
+\r
+    class MsgdetailManager(Abstract):\r
+        def __init__(self):\r
+            self.level = 0\r
+            self.msg_name = ""\r
+            self.msg_content = ""\r
+\r
+        def post_processor_after_instantiation(self):\r
+            EventMesh.subscribe("save_msg_name", self.save_msg_name)\r
+            EventMesh.subscribe("save_msg_content", self.save_msg_content)\r
+            EventMesh.subscribe("get_msg_name", self.get_msg_name)\r
+            EventMesh.subscribe("get_msg_content", self.get_msg_content)\r
+\r
+        def save_msg_name(self, event, msg): \r
+            self.msg_name = str(msg)\r
+            EventMesh.debug_log("save_msg_name:msg".format(msg))\r
+        \r
+        def save_msg_content(self, event, msg):\r
+            self.msg_content = str(msg)\r
+            EventMesh.debug_log("save_msg_content:msg".format(msg))\r
+        \r
+        def get_msg_content(self, event, msg):\r
+            return self.msg_content\r
+\r
+        def get_msg_name(self, event, msg):\r
+            return self.msg_name\r
+\r
+    class CallLogManager(Abstract):\r
+        # 通话记录\r
+        def __init__(self):\r
+            self.read_call_log = {}\r
+            self.check_json = ql_fs.path_exists("/usr/static/storage_file/Call_log.json")\r
+\r
+            if self.check_json == True:\r
+                with open("/usr/static/storage_file/Call_log.json","r",encoding="utf-8") as fd:\r
+                    self.read_call_log = ujson.load(fd)\r
+                    EventMesh.debug_log("读取通话记录")\r
+\r
+        def post_processor_after_instantiation(self):\r
+            EventMesh.subscribe("get_call_log_list", self.get)\r
+            EventMesh.subscribe("set_call_log_list", self.set)\r
+\r
+        def get(self, event, msg):\r
+            self.check_json = ql_fs.path_exists("/usr/static/storage_file/Call_log.json")\r
+            return [self.check_json,self.read_call_log]\r
+\r
+        def set(self, event, msg):\r
+            return\r
+            self.check_json = msg[0]\r
+            self.read_call_log = msg[1]\r
+            with open("/usr/static/storage_file/Call_log.json","w+",encoding="utf-8") as fd:\r
+                ujson.dump(self.read_call_log,fd)\r
+        # def call_usr(self,event,msg):\r
+        #     content = self.log[msg]\r
+        #     # 参数1 姓名  参数2  电话   参数3 1/主动呼叫  0别人呼叫\r
+        #     EventMesh.publish("call_in", [content[2], content[0], 1])\r
+\r
+\r
+\r
+    class PhoneCallingManager(Abstract):\r
+        def __init__(self):\r
+            self.phonenum = ""\r
+            self.phonename = ""\r
+\r
+        def post_processor_after_instantiation(self):\r
+            EventMesh.subscribe("save_phonenum", self.save_phonenum)\r
+            EventMesh.subscribe("get_phonenum", self.get_phonenum)\r
+            EventMesh.subscribe("get_phonename", self.get_phonename)\r
+            EventMesh.subscribe("save_phonename", self.save_phonename)\r
+\r
+        def get_phonename(self, event, msg): \r
+            return self.phonename\r
+\r
+        def save_phonename(self, event, msg): \r
+            self.phonename = str(msg)\r
+\r
+        def save_phonenum(self, event, msg): \r
+            self.phonenum = str(msg)\r
+        \r
+        def get_phonenum(self, event, msg):\r
+            return self.phonenum\r
+\r
+    #获取心率 血氧 步数历史数据\r
+    class gethistoryDataManager(Abstract):\r
+        def __init__(self):\r
+            self.oldHr = 0\r
+            self.oldspo2 = 0\r
+            self.oldstep = 0\r
+            self.old_step = 0\r
+            self.read_histroy_hr_data = []\r
+            self.read_histroy_temp_data = []\r
+            self.read_histroy_spo2_data = []\r
+\r
+            oldHr  = EventMesh.publish("get_storage_config","old_hr")\r
+            if oldHr != None:\r
+                self.oldHr = oldHr  \r
+            old_spo2  = EventMesh.publish("get_storage_config","old_spo2")\r
+            if old_spo2 != None:\r
+                self.oldspo2 = old_spo2 \r
+            old_step  = EventMesh.publish("get_storage_config","old_step")    \r
+            if old_step != None:\r
+                self.oldstep = old_step\r
+\r
+\r
+            check_hr= ql_fs.path_exists("/usr/static/storage_file/history_hr.json")\r
+            if check_hr == True :\r
+                with open("/usr/static/storage_file/history_hr.json","r") as fd:#音频文件编号\r
+                    self.read_histroy_hr_data = ujson.load(fd)\r
+            \r
+            check_temp= ql_fs.path_exists("/usr/static/storage_file/history_temp.json")\r
+            if check_temp == True :\r
+                with open("/usr/static/storage_file/history_temp.json","r") as fd:#音频文件编号\r
+                    self.read_histroy_temp_data = ujson.load(fd)\r
+\r
+            check_spo2= ql_fs.path_exists("/usr/static/storage_file/history_spo2.json")\r
+            if check_spo2 == True :\r
+                with open("/usr/static/storage_file/history_spo2.json","r") as fd:#音频文件编号\r
+                    self.read_histroy_spo2_data = ujson.load(fd)\r
+            self.temp_value = 0\r
+            \r
+            # self.read_histroy_hr_data=[{"timeSec":16789890,"value":90},{"timeSec":16789888,"value":78},{"timeSec":16789688,"value":68},{"timeSec":16789898,"value":58},\\r
+            #                              {"timeSec":16789897,"value":88},{"timeSec":16789867,"value":77},{"timeSec":16789895,"value":70}]\r
+\r
+        def post_processor_after_instantiation(self):\r
+            EventMesh.subscribe("set_old_hr_data", self.save_hr_value)\r
+            EventMesh.subscribe("get_old_hr_data", self.get_hr_value)\r
+            EventMesh.subscribe("set_old_spo2_data", self.save_spo2_value)\r
+            EventMesh.subscribe("get_old_spo2_data", self.get_spo2_value)\r
+\r
+            EventMesh.subscribe("get_old_step_value", self.get_old_step_value)\r
+            EventMesh.subscribe("set_old_step_value", self.set_old_step_value)\r
+\r
+\r
+            EventMesh.subscribe("get_history_hr_value", self.get_history_hr_value)\r
+            EventMesh.subscribe("set_history_hr_value", self.set_history_hr_value)\r
+\r
+            EventMesh.subscribe("get_history_temp_value", self.get_history_temp_value)\r
+            EventMesh.subscribe("set_history_temp_value", self.set_history_temp_value)\r
+\r
+            EventMesh.subscribe("get_history_spo2_value", self.get_history_spo2_value)\r
+            EventMesh.subscribe("set_history_spo2_value", self.set_history_spo2_value)\r
+\r
+        \r
+\r
+        def get_history_spo2_value(self, event, msg): #近7次血氧历史数据统计显示\r
+            return self.read_histroy_spo2_data\r
+\r
+        def set_history_spo2_value(self, event, msg): \r
+            pass\r
+\r
+\r
+\r
+        def get_history_temp_value(self, event, msg): #近7次体温历史数据统计显示\r
+            return self.read_histroy_temp_data\r
+\r
+        def set_history_temp_value(self, event, msg): \r
+            self.temp_value = msg\r
+            if self.temp_value > 0:\r
+                # date_tmp = utime.localtime()\r
+                # time_tmp = utime.mktime(date_tmp)\r
+                # if len(self.read_histroy_temp_data) >= 7:\r
+                #     sort_new = {}\r
+                #     sort_new = sorted(self.read_histroy_temp_data, key = lambda i: i['timeSec'],reverse = False)#按照时间戳进行排序 去掉最旧的一次数据如果满了五十条\r
+                #     EventMesh.debug_log(sort_new)\r
+                #     for i in range(len(self.read_histroy_temp_data)-1):\r
+                #         sort_new[i] = sort_new[i+1]#0==1 1== 2 2== 3 3==4 4==5 5==6 6==7\r
+                #         self.read_histroy_temp_data[i] = sort_new[i]\r
+                #         pass\r
+                #     self.read_histroy_temp_data[6] = {"timeSec": time_tmp, "temp": self.temp_value}\r
+                # else:\r
+                #     self.read_histroy_temp_data.append({"timeSec": time_tmp, "temp": self.temp_value}) \r
+\r
+                # with open("/usr/static/storage_file/history_temp.json","w",encoding="utf-8") as fd:\r
+                #     ujson.dump(self.read_histroy_temp_data,fd)\r
+                #EventMesh.debug_log(self.read_histroy_temp_data)\r
+                pass\r
+            else:\r
+                pass\r
+\r
+        def get_history_hr_value(self, event, msg): #近7次心率历史数据统计显示\r
+            return self.read_histroy_hr_data\r
+\r
+        def set_history_hr_value(self, event, msg): \r
+            pass\r
+                \r
+            \r
+\r
+        def save_hr_value(self, event, msg): \r
+            if msg >= 50:\r
+                EventMesh.publish("set_storage_config",["old_hr",msg])\r
+                self.oldHr = msg\r
+                \r
+\r
+                date_tmp = utime.localtime()\r
+                time_tmp = utime.mktime(date_tmp)\r
+                if len(self.read_histroy_hr_data) >= 7:\r
+                    sort_new = {}\r
+                    sort_new = sorted(self.read_histroy_hr_data, key = lambda i: i['timeSec'],reverse = False)#按照时间戳进行排序 去掉最旧的一次数据如果满了五十条\r
+                    EventMesh.debug_log(sort_new)\r
+                    for i in range(len(self.read_histroy_hr_data)-1):\r
+                        sort_new[i] = sort_new[i+1]#0==1 1== 2 2== 3 3==4 4==5 5==6 6==7\r
+                        self.read_histroy_hr_data[i] = sort_new[i]\r
+                        pass\r
+                    self.read_histroy_hr_data[6] = {"timeSec": time_tmp, "hr": self.oldHr}\r
+                else:\r
+                    self.read_histroy_hr_data.append({"timeSec": time_tmp, "hr": self.oldHr}) \r
+\r
+\r
+                with open("/usr/static/storage_file/history_hr.json","w",encoding="utf-8") as fd:\r
+                    ujson.dump(self.read_histroy_hr_data,fd)\r
+                pass\r
+            else:\r
+                \r
+                pass\r
+\r
+\r
+        def get_hr_value(self, event, msg): \r
+            return self.oldHr\r
+\r
+        def save_spo2_value(self, event, msg): \r
+            if msg >= 85:\r
+                # EventMesh.publish("set_storage_config",["old_spo2",msg])\r
+                # self.oldspo2 = msg\r
+\r
+\r
+                # date_tmp = utime.localtime()\r
+                # time_tmp = utime.mktime(date_tmp)\r
+                # if len(self.read_histroy_spo2_data) >= 7:\r
+                #     sort_new = {}\r
+                #     sort_new = sorted(self.read_histroy_spo2_data, key = lambda i: i['timeSec'],reverse = False)#按照时间戳进行排序 去掉最旧的一次数据如果满了五十条\r
+                #     EventMesh.debug_log(sort_new)\r
+                #     for i in range(len(self.read_histroy_spo2_data)-1):\r
+                #         sort_new[i] = sort_new[i+1]#0==1 1== 2 2== 3 3==4 4==5 5==6 6==7\r
+                #         self.read_histroy_spo2_data[i] = sort_new[i]\r
+                #         pass\r
+                #     self.read_histroy_spo2_data[6] = {"timeSec": time_tmp, "spo2": self.oldspo2}\r
+                # else:\r
+                #     self.read_histroy_spo2_data.append({"timeSec": time_tmp, "spo2": self.oldspo2}) \r
+\r
+                # with open("/usr/static/storage_file/history_spo2.json","w",encoding="utf-8") as fd:\r
+                #     ujson.dump(self.read_histroy_spo2_data,fd)\r
+                # #EventMesh.debug_log(self.read_histroy_spo2_data)\r
+                #播放语音\r
+                # EventMesh.publish("set_hr_blood_led",2)#测量成功\r
+                pass\r
+            else:\r
+                pass\r
+                pass\r
+\r
+        def get_spo2_value(self, event, msg): \r
+            return self.oldspo2\r
+        \r
+        def set_old_step_value(self, event, msg): \r
+            self.oldstep = msg\r
+            EventMesh.publish("set_storage_config",["old_step",msg])\r
+            \r
+            \r
+        def get_old_step_value(self, event, msg): \r
+            step = EventMesh.publish(constants.EVENT.GET_STEP)\r
+            self.old_step = self.oldstep + step[0]\r
+            return self.old_step\r
+    #获取旧的时间戳\r
+    class getOldTimeManager(Abstract):\r
+        # 获取天气数据\r
+        def __init__(self):\r
+            self.time_sec = 0\r
+            self.time_step = 0\r
+            self.step_second = 0\r
+            tmp_data = EventMesh.publish("get_storage_config","old_time")\r
+            if tmp_data !=None :\r
+                self.time_sec = tmp_data\r
+            tmp_data = EventMesh.publish("get_storage_config","clear_state")\r
+            if tmp_data !=None :\r
+                self.time_step = tmp_data[0]\r
+                self.step_second = tmp_data[1]\r
+\r
+            \r
+            \r
+        def post_processor_after_instantiation(self):\r
+            EventMesh.subscribe("get_old_time_data", self.get_old_time_data)\r
+            EventMesh.subscribe("set_old_time_data", self.set_old_time_data)\r
+\r
+            EventMesh.subscribe("get_old_step_data", self.get_old_step_data)\r
+            EventMesh.subscribe("set_old_step_data", self.set_old_step_data)\r
+\r
+            EventMesh.subscribe("set_test_data1", self.set_test_data1)\r
+\r
+            EventMesh.subscribe("set_test_data2", self.set_test_data2)\r
+\r
+            EventMesh.subscribe("set_test_data3", self.set_test_data3)\r
+\r
+            EventMesh.subscribe("set_test_data4", self.set_test_data4)\r
+\r
+            EventMesh.subscribe("set_test_data5", self.set_test_data5)\r
+\r
+            EventMesh.subscribe("set_test_data6", self.set_test_data6)\r
+\r
+            EventMesh.subscribe("set_test_data7", self.set_test_data7)\r
+\r
+            EventMesh.subscribe("set_test_data8", self.set_test_data8)\r
+        \r
+\r
+        def set_test_data1(self, event, msg):\r
+            EventMesh.publish("set_storage_config",["clear_state1",msg])\r
+\r
+        \r
+        def set_test_data2(self, event, msg):\r
+            \r
+            EventMesh.publish("set_storage_config",["clear_state2",msg])\r
+\r
+\r
+        def set_test_data3(self, event, msg):\r
+            EventMesh.publish("set_storage_config",["clear_state3",msg])\r
+\r
+        def set_test_data4(self, event, msg):\r
+            EventMesh.publish("set_storage_config",["clear_state4",msg])\r
+\r
+        def set_test_data5(self, event, msg):\r
+            EventMesh.publish("set_storage_config",["clear_state5",msg])\r
+\r
+        def set_test_data6(self, event, msg):\r
+            EventMesh.publish("set_storage_config",["clear_state6",msg])\r
+\r
+        def set_test_data7(self, event, msg):\r
+            EventMesh.publish("set_storage_config",["clear_state7",msg])\r
+\r
+        def set_test_data8(self, event, msg):\r
+            EventMesh.publish("set_storage_config",["clear_state8",msg])\r
+\r
+        # f = open("/usr/static/storage_file/config.json",'r',encoding="utf-8")\r
+        # print(f.read())\r
+\r
+        def get_old_step_data(self, event, msg):\r
+            return [self.time_step,self.step_second]\r
+\r
+        def get_old_time_data(self, event, msg):\r
+            return self.time_sec\r
+        \r
+        \r
+\r
+        def set_old_time_data(self, event, msg):\r
+            self.time_sec = msg\r
+            EventMesh.publish("set_storage_config",["old_time",msg])\r
+\r
+        def set_old_step_data(self, event, msg):\r
+            self.time_step = msg[0]\r
+            self.step_second = msg[1]\r
+            EventMesh.publish("set_storage_config",["clear_state",msg])\r
+\r
+        def get_old_step_data(self, event, msg):\r
+            return [self.time_step,self.step_second]\r
+\r
+\r
+            \r
+        \r
+\r
+    class getWeatherDataManager(Abstract):\r
+        # 获取天气数据\r
+        def __init__(self):\r
+            self.date = {} #日期23-04-07\r
+            self.time = {} #14:41:41\r
+            self.content = {} #天气描述 \r
+            self.type = None #天气类型\r
+            self.temp = None #当前温度\r
+            self.min_temp = None #最低温度\r
+            self.max_temp = None #最高温度\r
+            self.city = {} #城市\r
+            self.no_data = 0#0沒有数据 1有数据\r
+\r
+        def post_processor_after_instantiation(self):\r
+            EventMesh.subscribe("get_weather_data", self.get)\r
+            EventMesh.subscribe("set_weather_data", self.set)\r
+\r
+        def get(self, event, msg):\r
+            return [self.date,self.time,self.content,self.type,self.temp,self.min_temp,self.max_temp,self.city,self.no_data]\r
+\r
+        def set(self, event, msg):\r
+            self.date = msg[0]\r
+            self.time = msg[1]\r
+            self.content = msg[2]\r
+            self.type = msg[3]\r
+            self.temp = msg[4]\r
+            self.min_temp = msg[5]\r
+            self.max_temp = msg[6]\r
+            self.city = msg[7]\r
+            self.no_data = msg[8]\r
+\r
+\r
+    class getHrTimeManager(Abstract):\r
+        def __init__(self):\r
+            self.set_time = 0\r
+            self.set_hr = 0 #0关闭 1手动 2 自动测量按照时间间隔测试心率\r
+            self.set_spo2 = 0\r
+            self.open_btn = 0\r
+            if EventMesh.platform == "gewu":\r
+                self.set_time = 10*60\r
+                self.open_btn = 1\r
+            self.set_bgautotime = 0\r
+            self.bgauto_btn = 0\r
+            read_data = EventMesh.publish("get_storage_config","measure_time")\r
+            if read_data != None:\r
+                self.set_time = read_data  \r
+            read_data = EventMesh.publish("get_storage_config","open_hr_btn")\r
+                    \r
+            if read_data != None:\r
+                self.open_btn = read_data   \r
+\r
+            read_data = EventMesh.publish("get_storage_config","bgauto_time")\r
+            if read_data != None:\r
+                self.set_bgautotime = read_data  \r
+            read_data = EventMesh.publish("get_storage_config","bgauto_btn")\r
+                    \r
+            if read_data != None:\r
+                self.bgauto_btn = read_data   \r
+\r
+\r
+\r
+        def post_processor_after_instantiation(self):\r
+            EventMesh.subscribe("set_time_hr", self.set_time_hr)\r
+            EventMesh.subscribe("get_time_hr", self.get_time_hr)\r
+            EventMesh.subscribe("set_hr_state", self.set_hr_state)\r
+            EventMesh.subscribe("get_hr_state", self.get_hr_state)\r
+            EventMesh.subscribe("set_spo2_state", self.set_spo2_state)\r
+            EventMesh.subscribe("get_spo2_state", self.get_spo2_state)\r
+\r
+            EventMesh.subscribe("set_bgauto_time", self.set_bgauto_time)\r
+            EventMesh.subscribe("get_bgauto_time", self.get_bgauto_time)\r
+\r
+        def set_bgauto_time(self, event, msg): \r
+            self.bgauto_btn = msg[0]\r
+            self.set_bgautotime = msg[1]\r
+            EventMesh.publish("set_storage_config",["bgauto_btn",self.bgauto_btn])\r
+            EventMesh.publish("set_storage_config",["bgauto_time",self.set_bgautotime])\r
+\r
+        def get_bgauto_time(self, event, msg): \r
+            if self.bgauto_btn == None:\r
+                self.bgauto_btn = 0\r
+            if self.set_bgautotime == None:\r
+                self.set_bgautotime = 0\r
+            return [self.bgauto_btn,self.set_bgautotime]\r
+        \r
+\r
+        def set_time_hr(self, event, msg): \r
+            self.open_btn = msg[0]\r
+            self.set_time = msg[1]\r
+            EventMesh.publish("set_storage_config",["measure_time",self.set_time])\r
+            EventMesh.publish("set_storage_config",["open_hr_btn",self.open_btn])\r
+\r
+        def get_time_hr(self, event, msg): \r
+            return [self.open_btn,self.set_time]\r
+\r
+        def set_hr_state(self, event, msg): \r
+            # if msg != 0:\r
+            #     EventMesh.publish("set_hr_blood_led",1)#红绿灯交替闪烁\r
+            self.set_hr = msg\r
+            if self.set_hr == 0:\r
+                EventMesh.publish("clear_health_state")\r
+            \r
+\r
+        def get_hr_state(self, event, msg): \r
+            return self.set_hr\r
+        \r
+        def set_spo2_state(self, event, msg): \r
+            # if msg != 0:\r
+            #     EventMesh.publish("set_hr_blood_led",1)##红绿灯交替闪烁\r
+            self.set_spo2 = msg\r
+            if self.set_spo2 == 0:\r
+                EventMesh.publish("clear_health_state")\r
+            \r
+\r
+        def get_spo2_state(self, event, msg): \r
+            return self.set_spo2\r
+        \r
+    #体温\r
+    class getTempTimeManager(Abstract):\r
+        def __init__(self):\r
+            self.set_time = 0\r
+            self.get_temp = 0\r
+            read_data = EventMesh.publish("get_storage_config","temp_time")\r
+\r
+            if read_data != None:\r
+                self.set_time = read_data\r
+\r
+            self.get_bgstate = 0\r
+            self.get_bpstate = 0\r
+\r
+            self.bptime_on = 0\r
+            self.bptime_time = 0\r
+            read_data=EventMesh.publish("get_storage_config","bpauto_btn")\r
+            if read_data != None:\r
+                self.bptime_on = read_data\r
+\r
+            read_data=EventMesh.publish("get_storage_config","bpauto_time")\r
+            if read_data != None:\r
+                self.bptime_time = read_data\r
+\r
+            self.spo2time_on = 0\r
+            self.spo2time_time = 0\r
+            read_data = EventMesh.publish("get_storage_config","spo2auto_btn")\r
+            if read_data != None:\r
+                self.spo2time_on = read_data\r
+\r
+            read_data = EventMesh.publish("get_storage_config","spo2auto_time")\r
+            if read_data != None:\r
+                self.spo2time_time = read_data\r
+\r
+        def post_processor_after_instantiation(self):\r
+            EventMesh.subscribe("set_temp_time", self.set_temp_time)\r
+            EventMesh.subscribe("get_temp_time", self.get_temp_time)\r
+\r
+            EventMesh.subscribe("set_temp_state", self.set_temp_state)\r
+            EventMesh.subscribe("get_temp_state", self.get_temp_state)\r
+\r
+            EventMesh.subscribe("set_bp_time", self.set_bp_time)\r
+            EventMesh.subscribe("get_bp_time", self.get_bp_time)\r
+\r
+            EventMesh.subscribe("set_bp_state", self.set_bp_state)\r
+            EventMesh.subscribe("get_bp_state", self.get_bp_state)\r
+\r
+\r
+            EventMesh.subscribe("set_bg_state", self.set_bg_state)\r
+            EventMesh.subscribe("get_bg_state", self.get_bg_state)\r
+\r
+            EventMesh.subscribe("set_spo2_time", self.set_spo2_time)\r
+            EventMesh.subscribe("get_spo2_time", self.get_spo2_time)\r
+\r
+            \r
+        def set_bg_state(self, event, msg): \r
+            self.get_bgstate = msg\r
+            if self.get_bgstate == 0:\r
+                EventMesh.publish("clear_health_state")\r
+            # if msg != 0:\r
+            #     EventMesh.publish("set_hr_blood_led",1)#红绿灯交替闪烁\r
+\r
+        def get_bg_state(self, event, msg): \r
+            if self.get_bgstate:\r
+                return self.get_bgstate\r
+            else :\r
+                return 0\r
+\r
+        def set_spo2_time(self, event, msg): \r
+            self.spo2time_on = msg[0]\r
+            self.spo2time_time = msg[1]\r
+            EventMesh.publish("set_storage_config",["spo2auto_btn",self.spo2time_on])\r
+            EventMesh.publish("set_storage_config",["spo2auto_time",self.spo2time_time])\r
+\r
+\r
+        def get_spo2_time(self, event, msg): \r
+            \r
+            return [self.spo2time_on,self.spo2time_time]\r
+\r
+\r
+        def set_bp_time(self, event, msg): \r
+            self.bptime_on = msg[0]\r
+            self.bptime_time = msg[1]\r
+            EventMesh.publish("set_storage_config",["bpauto_btn",self.bptime_on])\r
+            EventMesh.publish("set_storage_config",["bpauto_time",self.bptime_time])\r
+\r
+        def get_bp_time(self, event, msg): \r
+            if self.bptime_on == None:\r
+                self.bptime_on = 0\r
+            if self.bptime_time == None:\r
+                self.bptime_time = 0\r
+            return [self.bptime_on,self.bptime_time]\r
+        \r
+            \r
+        def set_bp_state(self, event, msg): \r
+            self.get_bpstate = msg\r
+            if self.get_bpstate == 0:\r
+                EventMesh.publish("clear_health_state")\r
+            # if msg != 0:\r
+                # EventMesh.publish("set_hr_blood_led",1)#红绿灯交替闪烁\r
+\r
+        def get_bp_state(self, event, msg): \r
+            if self.get_bpstate:\r
+                return self.get_bpstate\r
+            else :\r
+                return 0\r
+\r
+\r
+        def set_temp_time(self, event, msg): \r
+            self.set_time = msg\r
+            EventMesh.publish("set_storage_config",["temp_time",self.set_time])\r
+\r
+        def get_temp_time(self, event, msg): \r
+            return self.set_time\r
+        \r
+        def set_temp_state(self, event, msg): \r
+            self.get_temp = msg\r
+            if self.get_temp == 0:\r
+                EventMesh.publish("clear_temp_state")\r
+            # if msg != 0:\r
+            #     EventMesh.publish("set_hr_blood_led",1)#红绿灯交替闪烁\r
+\r
+        def get_temp_state(self, event, msg): \r
+            return self.get_temp\r
+            \r
+    class getBrightnessManager(Abstract):#获取亮度级别\r
+        def __init__(self):\r
+            self.level = 6#默认值6\r
+            # self.read_data = {}\r
+            self.time = 5\r
+            self.PWM_backlight  = None\r
+\r
+\r
+        def post_processor_after_instantiation(self):\r
+            EventMesh.subscribe("get_brightness_level", self.get_brightness_level)\r
+            EventMesh.subscribe("push_add_brightness_level", self.add)\r
+            EventMesh.subscribe("push_reduce_brightness_level", self.reduce)\r
+            EventMesh.subscribe("set_brightness_level", self.set_brightness_level)\r
+\r
+            EventMesh.subscribe("set_brightness_time", self.set_brightness_time)\r
+            EventMesh.subscribe("get_brightness_time", self.get_brightness_time)\r
+\r
+        def set_brightness_level(self, event, msg): \r
+            self.level = msg\r
+            EventMesh.publish("set_storage_config", ["brightness_level",self.level])\r
+\r
+        def get_brightness_level(self, event, msg): \r
+            tmp = EventMesh.publish("get_storage_config","brightness_level")\r
+            if tmp != None:\r
+                self.level = tmp\r
+            return self.level\r
+        \r
+        def set_brightness_time(self, event, msg): \r
+            self.time = msg\r
+            EventMesh.publish("set_storage_config", ["brightness_time",self.time])\r
+        \r
+        def get_brightness_time(self, event, msg): \r
+            tmp = EventMesh.publish("get_storage_config","brightness_time")\r
+            if tmp != None:\r
+                self.time = tmp\r
+            return self.time\r
+        \r
+\r
+\r
+        def add(self, event, msg):\r
+            if self.level < 10:\r
+                self.level = self.level + 2\r
+            # self.PWM_backlight = PWM(PWM.PWM1, PWM.ABOVE_MS, self.level, 10)\r
+            # self.PWM_backlight.open()\r
+            EventMesh.publish("set_storage_config", ["brightness_level",self.level])\r
+\r
+\r
+        def reduce(self, event, msg):\r
+            # if self.level > 0:\r
+            #     self.level = self.level - 2\r
+            # if self.level <= 0:\r
+            #     self.PWM_backlight = PWM(PWM.PWM1, PWM.ABOVE_MS, 1, 10)\r
+            # else:\r
+            #     self.PWM_backlight = PWM(PWM.PWM1, PWM.ABOVE_MS,self.level, 10)\r
+\r
+            # self.PWM_backlight.open()\r
+            EventMesh.publish("set_storage_config", ["brightness_level",self.level])\r
+        \r
+        \r
+    class getStorageDataManager(Abstract):#获取内存数据\r
+        def __init__(self):\r
+            self.config_data = {}\r
+            check = ql_fs.path_exists("/usr/static/storage_file/config.json")\r
+            if check == True:\r
+                with open("/usr/static/storage_file/config.json","r") as fd:\r
+                    self.config_data = ujson.load(fd)\r
+            else :\r
+                self.config_data = {'old_time': 0, 'flip_sw': 0}\r
+                pass\r
+\r
+        def post_processor_after_instantiation(self):\r
+            EventMesh.subscribe("set_storage_data", self.set_storage_data)\r
+            EventMesh.subscribe("set_storage_config", self.set_storage_config)\r
+            EventMesh.subscribe("get_storage_data", self.get_storage_data)\r
+            EventMesh.subscribe("get_storage_config", self.get_storage_config)\r
+\r
+        def set_storage_data(self, event, msg): \r
+            # EventMesh.debug_log("set_storage_data:{}".format(msg))\r
+            if msg != None:\r
+                self.config_data = msg\r
+                with open("/usr/static/storage_file/config.json",'w+',encoding="utf-8") as fd:\r
+                    ujson.dump(self.config_data,fd)\r
+        \r
+\r
+        def set_storage_config(self,event,msg): \r
+            # EventMesh.debug_log("set_storage_key_data1:{}".format(msg))\r
+            if len(msg) >= 2:\r
+                self.config_data[msg[0]]=msg[1]\r
+                # EventMesh.debug_log("set_storage_key_data2:{}".format(self.config_data[msg[0]]))\r
+                EventMesh.publish("publish_message_event_ui",{"func":self.set_storage_save,"data":0})\r
+        def set_storage_save(self, data): \r
+            with open("/usr/static/storage_file/config.json",'w+',encoding="utf-8") as fd:\r
+                ujson.dump(self.config_data,fd)\r
+        def get_storage_data(self, event, msg): \r
+            # EventMesh.debug_log("get_storage_data:{}".format(self.config_data))\r
+            return self.config_data \r
+        def get_storage_config(self,event,msg):\r
+            # EventMesh.debug_log("get_storage_key_data1:{}".format(msg))\r
+            b = msg in self.config_data.keys()\r
+            if b == True:\r
+                # EventMesh.debug_log("get_storage_key_data2:{}".format(self.config_data[msg]))\r
+                return self.config_data[msg]\r
+            else :\r
+                return None\r
+            # try:\r
+            #     return self.config_data[msg]\r
+            # except:\r
+            #     EventMesh.debug_log("get_storage_key_data:none key:{}",msg)\r
+            #     return None\r
+    #定位频率\r
+    class getUpLoadDataManager(Abstract):#\r
+        def __init__(self):\r
+            self.upload_time = 2*60*60\r
+            if EventMesh.platform == "gewu":\r
+                self.upload_time = 10*60\r
+\r
+            read_data = EventMesh.publish("get_storage_config","upload_time")\r
+            if read_data != None:\r
+                self.upload_time = read_data \r
+\r
+        def post_processor_after_instantiation(self):\r
+            EventMesh.subscribe("set_upload_data", self.set_upload_data)\r
+            EventMesh.subscribe("get_upload_data", self.get_upload_data)\r
+\r
+        def set_upload_data(self, event, msg): \r
+            self.upload_time = msg\r
+\r
+        def get_upload_data(self, event, msg): \r
+            if self.upload_time == None:\r
+                if EventMesh.platform == "gewu":\r
+                    self.upload_time = 10*60\r
+                else:\r
+                    self.upload_time = 2*60*60\r
+            return self.upload_time \r
+\r
+    class getplayAudiodStateManager(Abstract):#获取设置播放音频状态\r
+        def __init__(self):\r
+            self.play = 0\r
+\r
+        def post_processor_after_instantiation(self):\r
+            EventMesh.subscribe("set_audio_state", self.set_audio_state)\r
+            EventMesh.subscribe("get_audio_state", self.get_audio_state)\r
+\r
+        def set_audio_state(self, event, msg): \r
+            self.play = msg\r
+\r
+        def get_audio_state(self, event, msg): \r
+            return self.play\r
+        \r
+    class getVolumSizeManager(Abstract):#设置或获取音量大小数据\r
+        def __init__(self):\r
+            self.volume_size = 8\r
+            read_data = EventMesh.publish("get_storage_config","volum")\r
+            if read_data != None:\r
+                self.volume_size = read_data\r
+        \r
+        def post_processor_after_instantiation(self):\r
+            EventMesh.subscribe("set_volum_size", self.set_volum_size)\r
+            EventMesh.subscribe("get_volum_size", self.get_volum_size)\r
+\r
+        def set_volum_size(self, event, msg): \r
+            self.volume_size = msg\r
+            EventMesh.publish("set_storage_config", ["volum",self.volume_size])\r
+\r
+        def get_volum_size(self, event, msg): \r
+            return self.volume_size\r
+\r
+    class getSosFlagManager(Abstract):#设置sos\r
+        def __init__(self):\r
+            self.aud = audio.Audio(0)\r
+            self.sos_flag = 0\r
+            self.sos_num = 0\r
+            self.hangup_mode = 0\r
+            self.call_timer = osTimer()\r
+            self.sos_numer1 = []\r
+            self.callnumer =""\r
+            SOS_NUMBER1 = EventMesh.publish("get_storage_config","SOS_NUMBER1")\r
+            if SOS_NUMBER1 != None:\r
+                self.sos_numer1 = SOS_NUMBER1\r
+            SOS_NUMBER2 = EventMesh.publish("get_storage_config","SOS_NUMBER2")\r
+            if SOS_NUMBER2 != None:        \r
+                self.sos_numer1 = [SOS_NUMBER1, SOS_NUMBER2]\r
+\r
+            SOS_NUMBER3 = EventMesh.publish("get_storage_config","SOS_NUMBER3")\r
+            if SOS_NUMBER3 != None:        \r
+                self.sos_numer1 = [SOS_NUMBER1, SOS_NUMBER2,SOS_NUMBER3]\r
+\r
+\r
+        def post_processor_after_instantiation(self):\r
+            EventMesh.subscribe("set_sos_flag", self.set_sos_flag)#设置sos拨打标识\r
+            EventMesh.subscribe("get_sos_flag", self.get_sos_flag)\r
+\r
+            EventMesh.subscribe("set_sos_num", self.set_sos_num)#设置拨打循环次数\r
+            EventMesh.subscribe("get_sos_num", self.get_sos_num)\r
+\r
+            EventMesh.subscribe("set_dial_sos_number", self.set_dial_sos_number)\r
+            EventMesh.subscribe("get_dial_sos_number", self.get_dial_sos_number)#设置家庭号码三个\r
+\r
+            EventMesh.subscribe("set_callnumer_cb", self.set_callnumer_cb)#延时回调\r
+\r
+            EventMesh.subscribe("close_call_time",self.close_call_time)\r
+\r
+            EventMesh.subscribe("set_hangup_mode", self.set_hangup_mode)\r
+            EventMesh.subscribe("get_hangup_mode", self.get_hangup_mode)#获取挂断方式 是对方挂断 还是手表按键主动挂断\r
+\r
+        def get_hangup_mode(self, event, msg): # 1是设备端手表主动挂断 0是手机端\r
+            return self.hangup_mode\r
+        \r
+        def set_hangup_mode(self, event, msg): \r
+            self.hangup_mode = msg\r
+\r
+        def set_sos_flag(self, event, msg): \r
+            self.sos_flag = msg\r
+        \r
+            if self.sos_flag == 1:\r
+                number = EventMesh.publish("get_dial_sos_number")\r
+            \r
+                if number != None:\r
+                    if len(number) > 0:\r
+                        self.call_timer.stop()\r
+                        EventMesh.publish("save_phonename",number[0])\r
+                        EventMesh.publish("save_phonenum",number[0])\r
+                        EventMesh.publish("set_sos_num",0)\r
+                        phone_num = EventMesh.publish("get_phonenum")  \r
+                        EventMesh.publish("sos_out_call_center_cb",phone_num)#电话拨出去\r
+                    else:\r
+                        EventMesh.publish("sos_out_call_center_cb",None)#电话拨出去\r
+\r
+        def set_callnumer_cb(self, event, msg):\r
+            if self.sos_flag == 1:\r
+                self.callnumer = msg\r
+                self.call_timer.start(5000, 0, self.call_timer_cb)#延迟10S 继续拨打\r
+\r
+        def call_timer_cb(self, *args, **kwargs):\r
+            if self.sos_flag == 1:\r
+                EventMesh.publish("save_phonename",str(self.callnumer))\r
+                EventMesh.publish("save_phonenum",str(self.callnumer))\r
+                phone_num = EventMesh.publish("get_phonenum")  \r
+                EventMesh.publish("sos_out_call_center_cb",phone_num)#电话拨出去\r
+        \r
+        def close_call_time(self, event, msg): \r
+            self.call_timer.stop()\r
+\r
+        def get_sos_flag(self, event, msg): \r
+            return self.sos_flag\r
+        \r
+        def set_sos_num(self, event, msg): \r
+            self.sos_num = msg\r
+\r
+        def get_sos_num(self, event, msg): \r
+            return self.sos_num\r
+        \r
+        def set_dial_sos_number(self, event, msg): \r
+            self.sos_numer1 = msg\r
+            \r
+\r
+        def get_dial_sos_number(self, event, msg): \r
+            return self.sos_numer1\r
+    class getLowBatManager(Abstract):#低电提醒\r
+        def __init__(self):\r
+\r
+            self.low_btn = 0\r
+            read_data = EventMesh.publish("get_storage_config","low_on")\r
+            if read_data != None:\r
+                self.low_btn = read_data\r
+\r
+        def post_processor_after_instantiation(self):\r
+            EventMesh.subscribe("set_low_bat_btn", self.set_low_bat_btn)#\r
+            EventMesh.subscribe("get_low_bat_btn", self.get_low_bat_btn)\r
+\r
+        def set_low_bat_btn(self, event, msg): \r
+            self.low_btn = msg\r
+            EventMesh.publish("set_storage_config",["low_on",self.low_btn])\r
+\r
+        def get_low_bat_btn(self, event, msg): \r
+            return self.low_btn\r
+        \r
+\r
+\r
+    class playPowerAudioManager(Abstract):#播放开关机音频文件\r
+        def __init__(self):\r
+            self.aud = audio.Audio(0)\r
+\r
+        def post_processor_after_instantiation(self):\r
+            \r
+            EventMesh.subscribe("play_poewr_on_event", self.play_poewr_on_event)#\r
+            EventMesh.subscribe("play_poewr_off_event", self.play_poewr_off_event)\r
+\r
+        def play_poewr_on_event(self, event, msg): \r
+            self.aud.play(1, 1, 'U:/static/R_POWER_1.mp3')  #播放播放开机铃声\r
+\r
+        def play_poewr_off_event(self, event, msg): \r
+            self.aud.setVolume(11)\r
+            self.aud.play(1, 1, 'U:/static/R_POWER_OFF_1.mp3')  #播放关机铃声\r
+        \r
+    class getBootOffManager(Abstract):#开关机时间\r
+        def __init__(self):\r
+            self.poweroff_time = []\r
+            read_data = EventMesh.publish("get_storage_config","poweroff_alarm")\r
+            if read_data != None:\r
+                self.poweroff_time = read_data\r
+            else:\r
+                self.poweroff_time = [{"poweroff_on":0,"start_hour":6,"start_min":0,"end_hour":0,"end_min":0}]\r
+            \r
+\r
+\r
+        def post_processor_after_instantiation(self):\r
+            EventMesh.subscribe("set_boot_off_time", self.set_boot_off_time)#设置关机时间\r
+            EventMesh.subscribe("get_boot_off_time", self.get_boot_off_time)\r
+\r
+        def set_boot_off_time(self, event, msg): \r
+            EventMesh.debug_log("set_boot_off_time",msg)\r
+\r
+            EventMesh.publish("set_storage_config",["poweroff_alarm",msg])\r
+            self.poweroff_time = msg\r
+            EventMesh.publish("set_rtc_alarm")\r
+\r
+\r
+        def get_boot_off_time(self, event, msg):\r
+            return self.poweroff_time\r
+    class setSmsIndexManager(Abstract):#\r
+        def __init__(self):\r
+            self.index = -1\r
+\r
+        def post_processor_after_instantiation(self):\r
+            EventMesh.subscribe("set_sms_index", self.set_sms_index)#设置关机时间\r
+            EventMesh.subscribe("get_sms_index", self.get_sms_index)\r
+\r
+        def set_sms_index(self, event, msg): \r
+            self.index = msg\r
+            \r
+\r
+        def get_sms_index(self, event, msg):\r
+            \r
+            return self.index\r
+    import protocol \r
+    class testSmsSetIPManager(Abstract):#\r
+        def __init__(self):\r
+            self.timer = osTimer()\r
+            #大锤\r
+            severdata = protocol.server_init()\r
+\r
+            self.newip = severdata[0]\r
+            self.newcom = severdata[1]\r
+            self.new_key = severdata[2]\r
+            self.new_pid = severdata[3]\r
+            \r
+            EventMesh.debug_log("testSmsSetIPManager:{}\n".format(severdata))\r
+\r
+            self.server_sate = 0\r
+\r
+\r
+\r
+            tmp_data = EventMesh.publish("get_storage_config","set_new_ip_addr")\r
+            if tmp_data != None:\r
+                self.newip = tmp_data\r
+            tmp_data = EventMesh.publish("get_storage_config","set_new_com")\r
+            if tmp_data != None:\r
+                self.newcom = tmp_data\r
+            tmp_data = EventMesh.publish("get_storage_config","set_new_md5")\r
+            if tmp_data != None:\r
+                self.newmd5 = tmp_data    \r
+\r
+            tmp_data = EventMesh.publish("get_storage_config","set_new_key")\r
+            if tmp_data != None:\r
+                self.new_key = tmp_data \r
+\r
+            tmp_data = EventMesh.publish("get_storage_config","set_new_pid")\r
+            if tmp_data != None:\r
+                self.new_pid = tmp_data \r
+\r
+            tmp_data = EventMesh.publish("get_storage_config","get_server_sate")\r
+            if tmp_data != None:\r
+                self.server_sate = tmp_data \r
+            \r
+            \r
+\r
+\r
+\r
+        def post_processor_after_instantiation(self):\r
+            EventMesh.subscribe("set_new_ip_com", self.set_new_ip_com)#设置关机时间\r
+            EventMesh.subscribe("get_new_ip_com", self.get_new_ip_com)\r
+\r
+            EventMesh.subscribe("set_ip", self.set_ip)#设置关机时间\r
+            EventMesh.subscribe("get_ip", self.get_ip)\r
+\r
+            EventMesh.subscribe("set_com", self.set_com)#设置关机时间\r
+            EventMesh.subscribe("get_com", self.get_com)\r
+\r
+            EventMesh.subscribe("get_new_key", self.get_new_key_cb)#获取key\r
+            EventMesh.subscribe("set_new_key", self.set_new_key_cb)#获取key\r
+\r
+            EventMesh.subscribe("set_new_pid", self.set_new_pid_cb)#获取pid\r
+            EventMesh.subscribe("get_new_pid", self.get_new_pid_cb)#获取pid\r
+\r
+            EventMesh.subscribe("set_server_state", self.set_server_state)#\r
+            EventMesh.subscribe("get_server_state", self.get_server_state)#\r
+\r
+            EventMesh.subscribe("get_new_key_pid", self.get_new_key_pid)#\r
+\r
+\r
+\r
+        def set_new_key_cb(self, event, msg): \r
+            self.new_key = msg\r
+            # print("set_new_key_cb",msg,self.new_key)\r
+            EventMesh.publish("set_storage_config",["set_new_key",self.new_key])\r
+\r
+        def get_new_key_cb(self, event, msg):\r
+            # print("get_new_key_cb",self.new_key)\r
+            return self.new_key\r
+        \r
+        def set_new_pid_cb(self, event, msg): \r
+            self.new_pid = msg\r
+            # print("set_new_pid_cb",msg,self.new_pid)\r
+            EventMesh.publish("set_storage_config",["set_new_pid",self.new_pid])\r
+\r
+        def get_new_pid_cb(self, event, msg):\r
+            # print("get_new_pid_cb",self.new_pid)\r
+            return self.new_pid\r
+\r
+        def set_new_ip_com(self, event, msg): \r
+            self.newip = str(msg[0])\r
+            self.newcom = int(msg[1])\r
+            # self.newmd5 = str(msg[2])\r
+            #短信格式:SETIP:api.xcloudtech.com:9000:bZld0ALsZTt15tKEZhOlLPgbsO75BLTP 以冒号分隔 SETIP:ip地址:ip端口号:ip密钥key\r
+\r
+            # self.read_data["set_new_md5"] = self.newmd5  #通过短信设置ip的key密钥\r
+        \r
+\r
+            EventMesh.publish("set_storage_config",["set_new_ip_addr",self.newip])\r
+            EventMesh.publish("set_storage_config",["set_new_com",self.newcom])\r
+\r
+\r
+            number = str(msg[2])\r
+            sms.sendPduMsg(number, 'set ok', 'UCS2')\r
+            self.timer.start(10*1000,0,self.fun)\r
+            \r
+        def fun(self,*argc):\r
+            Power.powerRestart()\r
+\r
+        def get_new_ip_com(self, event, msg):\r
+            tmp_addr = EventMesh.publish("get_storage_config","set_new_ip_addr")\r
+            tmp_com = EventMesh.publish("get_storage_config","set_new_com")\r
+            if tmp_addr != None:\r
+                self.newip = tmp_addr\r
+            if tmp_com != None:\r
+                self.newcom = tmp_com\r
+            return [self.newip,self.newcom]\r
+        \r
+        def set_ip(self, event, msg): \r
+            self.newip = msg\r
+            EventMesh.publish("set_storage_config",["set_new_ip_addr",self.newip])\r
+\r
+        def get_ip(self, event, msg):\r
+            # print("get_ip",self.newip)\r
+            return self.newip\r
+        \r
+        def set_com(self, event, msg): \r
+            self.newcom = msg\r
+            EventMesh.publish("set_storage_config",["set_new_com",self.newcom])\r
+\r
+        def get_com(self, event, msg):\r
+            # print("get_com",self.newcom)\r
+            return self.newcom\r
+\r
+        def get_new_key_pid(self, event, msg):\r
+            return [self.new_key,self.new_pid]\r
+        \r
+        def set_server_state(self, event, msg):\r
+            EventMesh.publish("set_storage_config",["get_server_sate",msg])\r
+            self.server_sate = msg\r
+\r
+        def get_server_state(self, event, msg):\r
+            return self.server_sate\r
+            \r
+\r
+    # MMI Version:UIX8910_C55_DS_D12G_PRO18_FZD_V1.0_Release\r
+    # Build:07-07-2022 16:12:58\r
+    # IMEI:861218001025267\r
+    # IP:api.xcloudtech.com\r
+    # PORT:9000\r
+    # UPLOAD:300\r
+    # Battery:3948, 64\r
+    # Udebug: 0\r
+    # ConnectTime: 7\r
+    import protocol\r
+\r
+    class sendDevinfoManager(Abstract):#发送设备信息\r
+        def __init__(self):\r
+            self.timer = osTimer()\r
+            pass\r
+\r
+        def post_processor_after_instantiation(self):\r
+            EventMesh.subscribe("send_devinfo_event", self.send_devinfo_event)#删除短信\r
+\r
+        def send_devinfo_event(self, event, msg): \r
+            number = str(msg)\r
+            versions = EventMesh.softversion\r
+            Build = EventMesh.builTime\r
+            IMEI = EventMesh.publish(constants.EVENT.GET_IMEI)\r
+            IP = ""\r
+            new_ip = EventMesh.publish("get_storage_config","set_new_ip_addr")\r
+            new_com = EventMesh.publish("get_storage_config","set_new_com")\r
+            server_data = protocol.server_init()\r
+        \r
+            if new_ip != None:\r
+                if len(str(new_ip)) != 0:\r
+                    IP = new_ip\r
+                else:\r
+                    IP = server_data[0]\r
+            else:\r
+                IP = server_data[0]\r
+            \r
+            PORT = ''\r
+            if new_com != None:\r
+                if len(str(new_com)) != 0:\r
+                    PORT = str(new_com)\r
+                else:\r
+                    PORT = str(server_data[1])\r
+            else:\r
+                PORT = str(server_data[1])\r
+            \r
+            UPLOAD = EventMesh.publish("get_upload_data")\r
+\r
+            level = EventMesh.publish("get_curr_battery_level")\r
+            if level == None:\r
+                level = 4200\r
+            bat = EventMesh.publish("screen_get_battery")[1]\r
+            if bat == None:\r
+                bat = 100\r
+            Battery = str(level) +',' +  str(bat)\r
+\r
+            ConnectTime = 0\r
+            \r
+            if EventMesh.platform == "gewu":\r
+                ConnectTime = gheartbeat_time//60\r
+            else:\r
+                ConnectTime = heartbeat_time//60\r
+            data1 = "Version:{}\nBuild:{}".format(versions,Build)\r
+\r
+            data2 = "IMEI:{}\nIP:{}\nPORT:{}".format(IMEI,IP,PORT)\r
+            \r
+            data3 = "UPLOAD:{}\nBattery:{}\nConnectTime:{}".format(UPLOAD,Battery,ConnectTime)\r
+\r
+            send_state1 = -1\r
+            send_state2 = -1\r
+            # print("data",data1,data2,data3)\r
+            send_state1 = sms.sendPduMsg(number, data1, 'UCS2')\r
+\r
+            if send_state1 == 0:\r
+                send_state2 = sms.sendPduMsg(number, data2, 'UCS2')\r
+\r
+            if send_state2 == 0:\r
+                sms.sendPduMsg(number, data3, 'UCS2')\r
+            \r
+\r
+    class deleteSmsManager(Abstract):#删除信息\r
+        def __init__(self):\r
+            self.timer = osTimer()\r
+            pass\r
+\r
+        def post_processor_after_instantiation(self):\r
+            EventMesh.subscribe("delete_sms_event", self.delete_sms_event)#删除短信\r
+            EventMesh.subscribe("remove_all_sms_cb", self.remove_all_sms_cb)#\r
+\r
+        def delete_sms_event(self, event, msg): \r
+            self.timer.start(4*1000,0,self.fun)\r
+            \r
+        def fun(self, *argc): \r
+            EventMesh.publish_async("remove_all_sms_cb","",1*1024)\r
+\r
+        def remove_all_sms_cb(self, event, msg):\r
+            sms.deleteMsg(1,4)\r
+\r
+    #闹钟信息\r
+    alarm_list = [{'hour': 6, 'repeart': 10, 'idx': 0, 'enabled': 1, 'days': [0,1,2,3,4,5,6], 'minute': 0},\r
+                {'hour': 0, 'repeart': 10, 'idx': 1, 'enabled': 1, 'days': [0,1,2,3,4,5,6], 'minute': 0}]\r
+    #用于显示闹钟列表不包含开关机信息\r
+\r
+    class ClockManager(Abstract):\r
+        def __init__(self):\r
+            super().__init__()\r
+            self.rtc = RTC()\r
+            self.days = 0\r
+            self.idx = 0\r
+\r
+            IFEXIST = ql_fs.path_exists("/usr/static/storage_file/alarm_msg.json") \r
+            self.check_alarm_list = []     \r
+            if IFEXIST == True:\r
+                with open("/usr/static/storage_file/alarm_msg.json","r",encoding='utf-8') as fd:\r
+                    self.check_alarm_list = ujson.load(fd)\r
+            \r
+            EventMesh.subscribe("push_clock_info", self.set)\r
+            EventMesh.subscribe("read_alarminjson", self.read_alarminjson)\r
+            EventMesh.subscribe("add_alarm", self.add_alarm)\r
+            EventMesh.subscribe("remove_alarm", self.remove_alarm)\r
+            EventMesh.subscribe("set_rtc_alarm", self.set_rtc_alarm)\r
+            EventMesh.subscribe("get_alarm_indx", self.get_alarm_indx)\r
+            EventMesh.subscribe("get_check_alarm_list", self.get_check_alarm_list)\r
+            EventMesh.subscribe("push_update_alarm_show", self.update_show_info)\r
+\r
+        def post_processor_after_instantiation(self):\r
+        \r
+            EventMesh.publish("read_alarminjson")\r
+            # EventMesh.publish("set_rtc_alarm")\r
+        \r
+        def update_show_info(self,event,msg):\r
+            EventMesh.publish("read_alarminjson")\r
+            # EventMesh.publish("set_rtc_alarm")\r
+\r
+        def get_check_alarm_list(self, event, msg):\r
+            alarm_len = 0\r
+            global alarm_list\r
+            EventMesh.publish("read_alarminjson")\r
+            alarm_len = len(alarm_list)\r
+            return alarm_len\r
+\r
+\r
+        def set(self, event, msg):\r
+            global alarm_list\r
+            EventMesh.debug_log("msg = {}".format(msg))\r
+            idx = msg.get("idx")\r
+            EventMesh.debug_log("修改第{}个闹钟信息{}".format(idx,alarm_list[idx]))\r
+            alarm_list[idx]["hour"] = msg["hour"]\r
+            alarm_list[idx]["minute"] = msg["minute"]\r
+            alarm_list[idx]["days"] = msg["days"]\r
+            alarm_list[idx]["enabled"] = msg["enabled"]\r
+            alarm_list[idx]["repeart"] = msg["repeart"]\r
+            with open("/usr/static/storage_file/alarm_msg.json", 'w+',encoding='utf-8') as fd:\r
+                ujson.dump(alarm_list,fd)\r
+\r
+        def read_alarminjson(self, event, msg):\r
+            IFEXIST = ql_fs.path_exists("/usr/static/storage_file/alarm_msg.json") \r
+            global alarm_list     \r
+            EventMesh.debug_log("IFEXIST:{}".format(IFEXIST))\r
+            if IFEXIST == True:\r
+                with open("/usr/static/storage_file/alarm_msg.json","r",encoding='utf-8') as fd:\r
+                    alarm_list = ujson.load(fd)\r
+\r
+            \r
+            # read_data = EventMesh.publish("get_storage_config","off_on")\r
+\r
+            hour1 = str(alarm_list[0]["hour"])+':'+str(alarm_list[0]["minute"])\r
+            # min1 = str(alarm_list[0]["minute"])\r
+\r
+            hour2 = str(alarm_list[1]["hour"])+':'+str(alarm_list[1]["minute"])\r
+            # min2 = str(alarm_list[1]["minute"]) \r
+            # EventMesh.publish("set_boot_off_time",[1,hour1,hour2])\r
+\r
+            EventMesh.debug_log("hour1:{}-{}".format(hour1,hour2))\r
+\r
+            \r
+            return alarm_list\r
+\r
+        def add_alarm(self, event, msg):\r
+\r
+            global alarm_list\r
+            EventMesh.publish("read_alarminjson")\r
+            EventMesh.debug_log("msg:{}".format(msg))\r
+            for i in range(0,2):#开关机固定是 idx 0 1\r
+                off_msg1 = msg[i+1]\r
+                msg_tmp1 = off_msg1.split(':')\r
+                start_hour = int(msg_tmp1[0])\r
+                start_min = int(msg_tmp1[1])\r
+                enable = int(msg[0])\r
+                EventMesh.debug_log("start_hour:{} start_min:{} enable:{}",start_hour,start_min,enable)\r
+                # EventMesh.publish("set_boot_off_time",[msg[0],msg[1],msg[2]])\r
+\r
+                alarm_list[i]["idx"]=i\r
+                alarm_list[i]["hour"]=start_hour\r
+                alarm_list[i]["minute"]=start_min\r
+                alarm_list[i]["days"]=[0,1,2,3,4,5,6]\r
+                alarm_list[i]["enabled"]=enable\r
+                alarm_list[i]["repeart"]=10\r
+\r
+\r
+                # alarm_list.append({"idx": i, "hour": start_hour, "minute": start_min, "days":[0,1,2,3,4,5,6], "enabled": enable,"repeart":10})\r
+\r
+            \r
+            # EventMesh.debug_log("alarm_list----len- :{} alarm_list:{}".format(len(alarm_list),alarm_list))\r
+            with open("/usr/static/storage_file/alarm_msg.json", 'w+',encoding='utf-8') as fd:\r
+                ujson.dump(alarm_list,fd)\r
+            EventMesh.publish("push_update_alarm_show")\r
+            \r
+        \r
+                \r
+            \r
+\r
+\r
+        def remove_alarm(self, event, msg):\r
+            global alarm_list\r
+            EventMesh.debug_log("ddddddddddddddddddd:",msg)\r
+            idx = msg.get("idx")\r
+            EventMesh.debug_log("delete_here1-----{},{}:".format(idx,msg))\r
+\r
+            for i, alarm in enumerate(alarm_list):\r
+                EventMesh.debug_log("delete_here2-----{},{}:".format(i,alarm))\r
+\r
+                if alarm["idx"] == idx:\r
+                    del alarm_list[i]\r
+                    EventMesh.debug_log("delete_here3-----",alarm_list)\r
+\r
+                    #删除闹钟后,对idx重新排序\r
+                    if alarm_list:\r
+                        for j in range(i,len(alarm_list)):\r
+                            alarm_list[j]["idx"] -= 1\r
+                            EventMesh.debug_log("delete_here4-----",alarm_list)\r
+\r
+            with open("/usr/static/storage_file/alarm_msg.json", 'w+',encoding='utf-8') as fd:\r
+                ujson.dump(alarm_list,fd)\r
+\r
+\r
+        def get_alarm_indx(self,event,msg):\r
+            return self.idx\r
+\r
+        def _rtc_callback(self,args):\r
+            #设置下一个闹钟,定时开关机功能\r
+            msg_data = EventMesh.publish("get_boot_off_time")\r
+            if msg_data != None:\r
+                power_offdata = msg_data[0]\r
+                start_hour = int(power_offdata["start_hour"])\r
+                start_min = int(power_offdata["start_min"])\r
+                end_hour = int(power_offdata["end_hour"])\r
+                end_min = int(power_offdata["end_min"])\r
+                off_on = int(power_offdata["poweroff_on"])\r
+\r
+                rtc_now_time = self.rtc.datetime()\r
+                current_minute = rtc_now_time[4]*60 + rtc_now_time[5]\r
+                end_min_total = end_hour*60+end_min\r
+                next_minute = start_hour*60+start_min #10:11\r
+                EventMesh.debug_log("off_on:{} {} {}".format(off_on,current_minute,next_minute))\r
+                if off_on != None:\r
+                    if off_on == 1:\r
+                        if end_min_total == current_minute:#结束的时间分钟等于关机时间分钟数则关机\r
+                            ubs_state = EventMesh.publish("get_usb")#'\r
+                            \r
+                            if ubs_state == 2 or ubs_state == 0:\r
+\r
+                                if next_minute > current_minute:#开机时间大于当前时间 9:00 > = 8:00 \r
+                                    interval_minute = next_minute - current_minute\r
+                                    \r
+                                    EventMesh.debug_log("开机距离下一次响铃的的分钟数:", interval_minute,next_minute)\r
+                                else:#8:00 9:00\r
+                                    #7*60*24 7天一个周期 7*60*24 - \r
+                                    interval_minute = next_minute + (24*60-current_minute)\r
+                                    EventMesh.debug_log("开机08888距离下一次响铃的的分钟数:", interval_minute,next_minute)\r
+\r
+                                #反向获取时间戳\r
+                                time = utime.localtime()\r
+                                EventMesh.debug_log("开机9获取utime的时间戳:", time)\r
+                                rtc_mktime = utime.mktime(time)-time[5]\r
+                                EventMesh.debug_log("开机10反向获取utime的mktime:", rtc_mktime)\r
+\r
+                                #加上下一次响铃需要的时间\r
+                                next_alarm_mktime = rtc_mktime + interval_minute*60 #转换成s单位 时间戳\r
+                                EventMesh.debug_log("开机11下一次响铃的mktime:", next_alarm_mktime)\r
+\r
+                                #格式化时间戳,得到下一次闹钟的时间\r
+                                next_alarm_time = utime.localtime(next_alarm_mktime)\r
+                                EventMesh.debug_log("开机12下一次响铃的准确时间:", next_alarm_time)\r
+                                #将时间转换为rtc的格式\r
+                                data_l = [2021, 7, 9, 5, 12, 30, 0, 0]\r
+                                #给rtc时间赋值\r
+                                data_l[0] = next_alarm_time[0] #year\r
+                                data_l[1] = next_alarm_time[1] #month                    \r
+                                data_l[2] = next_alarm_time[2] #day                     \r
+                                data_l[4] = next_alarm_time[3] #hour               \r
+                                data_l[5] = next_alarm_time[4] #minute   \r
+                                data_e=tuple(data_l)\r
+                                EventMesh.debug_log("开机13将该时间转换为RTC元组:", data_e)\r
+                                \r
+                                self.rtc.register_callback(self._rtc_callback)\r
+\r
+                                FLAG = self.rtc.set_alarm(data_e)\r
+                                if FLAG == 0:\r
+                                    EventMesh.debug_log("开机11成功设置rtc的到期时间:", data_e)\r
+                                else:\r
+                                    EventMesh.debug_log("开机时设置rtc的到期时间失败:", data_e)\r
+                                self.rtc.enable_alarm(1)\r
+                                \r
+                                EventMesh.debug_log("结束时设置rtc的到期时间失败:", data_e)\r
+                                EventMesh.publish("open_power_on", 5)#静音关机\r
+                                return\r
+                            else:\r
+                                EventMesh.publish("set_rtc_alarm")\r
+                                #self.rtc.datetime([2023, 12, 1, 5, 5, 59, 30, 0])\r
+                                return\r
+                \r
+            EventMesh.publish("set_rtc_alarm")\r
+\r
+\r
+        def set_rtc_alarm(self,event,msg):\r
+            msg_data = EventMesh.publish("get_boot_off_time")\r
+            if msg_data != None:\r
+                power_offdata = msg_data[0]\r
+                start_hour = int(power_offdata["start_hour"])\r
+                start_min = int(power_offdata["start_min"])\r
+                end_hour = int(power_offdata["end_hour"])\r
+                end_min = int(power_offdata["end_min"])\r
+                off_on = int(power_offdata["poweroff_on"])\r
+                if off_on == 1:\r
+                    next_minute = start_hour*60+start_min #10:11\r
+\r
+                    start_total = start_hour*60+start_min #10:11\r
+                    end_total = end_hour*60+end_min #10:11\r
+                    rtc_now_time = self.rtc.datetime()\r
+                    current_minute = rtc_now_time[4]*60 + rtc_now_time[5]#当前时间\r
+\r
+\r
+                    minute_list = []\r
+                    if start_total != current_minute:\r
+                        minute_list.append(start_total)#23*60=\r
+                    if end_total != current_minute:\r
+                        minute_list.append(end_total)\r
+                    minute_list.append(current_minute)#[927,927,930]\r
+                    minute_list = sorted(minute_list)\r
+                    current_index = minute_list.index(current_minute)\r
+                    print("minute_list",minute_list,start_total,end_total,current_index,power_offdata)\r
+                    \r
+                    \r
+                    next_index = current_index + 1\r
+                    if next_index >= len(minute_list):\r
+                        next_minute = minute_list[0]\r
+                        print("07下一个闹钟的分钟数:", next_minute)\r
+                    else:\r
+                        next_minute = minute_list[next_index]\r
+                        print("08下一个闹钟的分钟数:", next_minute)\r
+\r
+                    print("minute_list1",minute_list,current_index,next_minute)\r
+                    if next_minute > current_minute:\r
+                        interval_minute = next_minute - current_minute\r
+                        print("09距离下一次响铃的的分钟数:", interval_minute)#14 31 14 29 14 31 24*60-\r
+                    else:\r
+                        interval_minute = (24*60 - current_minute) + next_minute\r
+                        print("10距离下一次响铃的的分钟数:", interval_minute)\r
+\r
+\r
+                    #反向获取时间戳\r
+                    time = utime.localtime()\r
+                    EventMesh.debug_log("关机09获取utime的时间戳:", time)\r
+                    time\r
+                    rtc_mktime = utime.mktime(time)-time[5]\r
+                    EventMesh.debug_log("关机10反向获取utime的mktime:", rtc_mktime)\r
+\r
+                    #加上下一次响铃需要的时间\r
+                    next_alarm_mktime = rtc_mktime + interval_minute*60 #转换成s单位 时间戳\r
+                    EventMesh.debug_log("关机11下一次响铃的mktime:", next_alarm_mktime)\r
+\r
+                    #格式化时间戳,得到下一次闹钟的时间\r
+                    next_alarm_time = utime.localtime(next_alarm_mktime)\r
+                    EventMesh.debug_log("关机12下一次响铃的准确时间:", next_alarm_time)\r
+                    #将时间转换为rtc的格式\r
+                    data_l = [2021, 7, 9, 5, 12, 30, 0, 0]\r
+                    #给rtc时间赋值\r
+                    data_l[0] = next_alarm_time[0] #year\r
+                    data_l[1] = next_alarm_time[1] #month                    \r
+                    data_l[2] = next_alarm_time[2] #day                     \r
+                    data_l[4] = next_alarm_time[3] #hour               \r
+                    data_l[5] = next_alarm_time[4] #minute   \r
+                    data_e=tuple(data_l)\r
+                    EventMesh.debug_log("关机13将该时间转换为RTC元组:", data_e)\r
+                    \r
+                    self.rtc.register_callback(self._rtc_callback)\r
+\r
+                    FLAG = self.rtc.set_alarm(data_e)\r
+                    if FLAG == 0:\r
+                        EventMesh.debug_log("关机11成功设置rtc的到期时间:", data_e)\r
+                    else:\r
+                        EventMesh.debug_log("关机时设置rtc的到期时间失败:", data_e)\r
+                    self.rtc.enable_alarm(1)\r
+                else:\r
+                    self.rtc.enable_alarm(0)\r
+                    \r
+\r
+    class schoolclassManager(Abstract):#\r
+        def __init__(self):\r
+            # ['火星情报局', '一年级二班', '柠檬茶']\r
+            self.school_name = ''\r
+            self.class_name = ''\r
+            self.full_name = ''\r
+            tmp_data = EventMesh.publish("get_storage_config","school_name")\r
+            if tmp_data != None:\r
+                self.school_name = tmp_data\r
+            tmp_data = EventMesh.publish("get_storage_config","class_name")\r
+            if tmp_data != None:\r
+                self.class_name = tmp_data\r
+            tmp_data = EventMesh.publish("get_storage_config","full_name")\r
+            if tmp_data != None:\r
+                self.full_name = tmp_data    \r
+\r
+            \r
+\r
+        def post_processor_after_instantiation(self):\r
+            EventMesh.subscribe("set_schoolname", self.set_school_name)#\r
+            EventMesh.subscribe("get_schoolname", self.get_school_name)\r
+\r
+            EventMesh.subscribe("set_classname", self.set_classname)#\r
+            EventMesh.subscribe("get_classname", self.get_classname)\r
+\r
+            EventMesh.subscribe("set_fullname", self.set_full_name)#\r
+            EventMesh.subscribe("get_fullname", self.get_full_name)\r
+\r
+        def set_school_name(self, event, msg): \r
+            if msg != None:\r
+                if len(msg) != 0:\r
+                    self.school_name = str(msg)\r
+                    EventMesh.publish("set_storage_config",["school_name",str(msg)])\r
+            \r
+\r
+        def get_school_name(self, event, msg):\r
+            if self.school_name:\r
+                return self.school_name\r
+            else:\r
+                return None\r
+        \r
+        def set_classname(self, event, msg): \r
+            if msg != None:\r
+                if len(msg) != 0:\r
+                    self.class_name = str(msg)\r
+                    EventMesh.publish("set_storage_config",["class_name",str(msg)])\r
+                \r
+            \r
+        def get_classname(self, event, msg):\r
+            if self.class_name:\r
+                return self.class_name\r
+            else:\r
+                return None\r
+        def set_full_name(self, event, msg): \r
+            if msg != None:\r
+                if len(msg) != 0:\r
+                    self.full_name = str(msg)\r
+                    EventMesh.publish("set_storage_config",["full_name",str(msg)])\r
+\r
+        def get_full_name(self, event, msg):\r
+            if self.full_name:\r
+                return self.full_name\r
+            else:\r
+                return None\r
+    \r
+    import fota\r
+    class firwDownloadManager(Abstract):#\r
+        def __init__(self):\r
+            self.timer = osTimer()\r
+\r
+\r
+        def post_processor_after_instantiation(self):\r
+            EventMesh.subscribe("firware_download", self.firware_download)#\r
+\r
+        def firware_download(self, event, msg): \r
+            number = str(msg)\r
+            sms.sendPduMsg(number, 'set ok', 'UCS2')\r
+            self.timer.start(10*1000,0,self.fun)\r
+\r
+        def fun(self,*argc):\r
+            fota_obj = fota()\r
             fota_obj.httpDownload(url1="http://u-oss.thisiot.com/test/dfota_1.bin",url2="http://u-oss.thisiot.com/test/dfota_2.bin")
\ No newline at end of file
index eb9ddec..dd48742 100644 (file)
-from common import Abstract, LogAdapter
-import EventMesh
-import usocket
-import ql_fs
-import ujson
-import _thread
-import modem
-import utime
-import sim
-import net
-import dataCall
-import checkNet
-import osTimer
-import constants
-import sms
-from common import Lock, Abstract, LogAdapter
-#from location import GPS, GPSMatch,CellLocator
-from misc import USB, Power, ADC
-from machine import ExtInt, Pin,Timer,RTC,UART
-import EventMesh
-import usys
-import audio
-from machine import I2C
-
-import pm
-import ure
-import urandom
-  
-from machine import RTC
-import quecgnss
-import wifiScan
-import math
-import voiceCall
-from misc import PWM
-from queue import Queue
-if EventMesh.model == "D15":
-    from led_d15 import led_mode,open_led_green,close_led_green,open_led_red,close_led_red,close_led_white
-    heartbeat_time = 7*60 #心跳时间
-
-    def get_autoblood_value():#血压值
-        data = RTC().datetime()
-        hour = int(data[4])
-        blood_Maxvalue = 0
-        blood_Minvalue = 0
-        if hour >= 6 and hour <= 10:
-            random_numMax = urandom.randint(0, 30)
-            random_numMin = urandom.randint(0, 20)
-            blood_Maxvalue = 120+random_numMax
-            blood_Minvalue = 75+random_numMin
-
-            print("get_autoblood_value 6 -10",blood_Maxvalue,blood_Minvalue)
-            # return [self.blood_Maxvalue,self.blood_Minvalue]
-        elif hour > 10 and hour <= 14:#10-14(10,14]
-            random_numMax = urandom.randint(0, 20)
-            random_numMin = urandom.randint(0, 25)
-            blood_Maxvalue = 115+random_numMax
-            blood_Minvalue = 60+random_numMin
-            print("get_autoblood_value 10 -14",blood_Maxvalue,blood_Minvalue)
-            # return [self.blood_Maxvalue,self.blood_Minvalue]
-        elif hour > 14 and hour <= 18:#14-18
-            random_numMax = urandom.randint(0, 25)
-            random_numMin = urandom.randint(0, 15)
-            blood_Maxvalue = 115+random_numMax
-            blood_Minvalue = 70+random_numMin
-
-            print("get_autoblood_value 14 -18",blood_Maxvalue,blood_Minvalue)
-            # return [self.blood_Maxvalue,self.blood_Minvalue]
-        elif hour > 2 and hour < 6:#2-6
-            random_numMax = urandom.randint(0, 30)
-            random_numMin = urandom.randint(0, 20)
-            blood_Maxvalu = 105+random_numMax
-            blood_Minvalue = 65+random_numMin
-
-            
-            print("get_autoblood_value 2 -6",blood_Maxvalue,blood_Minvalue)
-            # return [self.blood_Maxvalue,self.blood_Minvalue]
-        else:#18-2 19 20 21 22 23 1 2
-            random_numMax = urandom.randint(0, 30)
-            random_numMin = urandom.randint(0, 20)
-            blood_Maxvalue = 100+random_numMax
-            blood_Minvalue = 60+random_numMin
-            print("get_autoblood_value 18 -2",blood_Maxvalue,blood_Minvalue)
-        return [blood_Maxvalue,blood_Minvalue]
-
-    def get_blood_sugar_value():#血糖值
-        data = RTC().datetime()
-        hour = int(data[4])
-        blood_sugar = 0
-        if (hour >= 6 and hour <= 8) or (hour >= 12 and hour <= 13) or (hour >= 18 and hour <= 19):#6-8 12-13 18-19 
-            random_value = urandom.randint(39, 61)
-            blood_sugar = random_value/10
-            print("get_blood_sugar_value 6 -10",blood_sugar)
-            # return [self.blood_Maxvalue,self.blood_Minvalue]
-        elif (hour > 8 and hour <= 9) or (hour >= 14 and hour <= 15) or (hour >= 20 and hour <= 21):#8-9 14-15 20-21
-            random_value = urandom.randint(67, 90)
-            blood_sugar = random_value/10
-            print("get_blood_sugar_value 10 -14",blood_sugar)
-        else:#18-2 19 20 21 22 23 1 2 10-11 16-17 21-22
-            random_value = urandom.randint(39, 78)
-            blood_sugar = random_value/10
-            print("get_blood_sugar_value 18 -2",blood_sugar)
-        return blood_sugar
-
-
-
-
-    class PhoneVolumeLevelManager(Abstract):
-        def __init__(self):
-            self.level = 0
-
-        def post_processor_after_instantiation(self):
-            EventMesh.subscribe("push_add_phonering_level", self.add)
-            EventMesh.subscribe("push_reduce_phonering_level", self.reduce)
-            EventMesh.subscribe("get_phonering_level", self.get)
-
-        def add(self, event, msg):
-            if self.level < 7:
-                self.level = self.level + 1
-
-        def reduce(self, event, msg):
-            if self.level > 0:
-                self.level = self.level - 1
-
-        def get(self, event=None, msg=None):
-            return self.level
-
-    class MsgVolumeLevelManager(Abstract):
-        def __init__(self):
-            self.level = 0
-
-        def post_processor_after_instantiation(self):
-            EventMesh.subscribe("push_add_msgvolume_level", self.add)
-            EventMesh.subscribe("push_reduce_msgvolume_level", self.reduce)
-            EventMesh.subscribe("get_msgvolume_level", self.get)
-
-        def add(self, event, msg):
-            if self.level < 7:
-                self.level = self.level + 1
-
-        def reduce(self, event, msg):
-            if self.level > 0:
-                self.level = self.level - 1
-
-        def get(self, event=None, msg=None):
-            return self.level
-
-    class AlarmVolumeLevelManager(Abstract):
-        def __init__(self):
-            self.level = 0
-
-        def post_processor_after_instantiation(self):
-            EventMesh.subscribe("push_add_alarmvolume_level", self.add)
-            EventMesh.subscribe("push_reduce_alarmvolume_level", self.reduce)
-            EventMesh.subscribe("get_alarmvolume_level", self.get)
-
-        def add(self, event, msg):
-            if self.level < 7:
-                self.level = self.level + 1
-
-        def reduce(self, event, msg):
-            if self.level > 0:
-                self.level = self.level - 1
-
-        def get(self, event=None, msg=None):
-            return self.level
-            
-    class StopwatchManager(Abstract):
-        def __init__(self):
-            self.level = 0
-            self.ms_value = 0
-            self.sec_value = 0
-            self.min_value = 0
-            self.timer = Timer(Timer.Timer1)
-
-        def post_processor_after_instantiation(self):
-            EventMesh.subscribe("stopwatch_start", self.start)
-            EventMesh.subscribe("stopwatch_stop", self.paused)
-            EventMesh.subscribe("stopwatch_reset", self.reset)
-            EventMesh.subscribe("get_stopwatch_ms", self.get_ms)
-            EventMesh.subscribe("get_stopwatch_sec", self.get_sec)
-            EventMesh.subscribe("get_stopwatch_min", self.get_min)
-
-        def start(self, event, msg):        
-            self.timer.start(period=100, mode=self.timer.PERIODIC, callback=self.fun)
-        
-        def paused(self, event, msg):        
-            self.timer.stop()
-        
-        def reset(self, event, msg):
-            self.timer.stop()
-
-            self.sec_value = 0
-            self.min_value = 0
-            self.ms_value = 0
-
-        def fun(self):
-            self.ms_value += 1
-            if self.ms_value > 9:
-                self.ms_value = 0   
-                self.sec_value += 1
-            if self.sec_value > 60:
-                self.sec_value = 0
-                self.min_value += 1
-            if self.min_value > 60:
-                self.timer.stop()
-
-        def get_ms(self, event=None, msg=None):
-            return self.ms_value
-
-        def get_min(self, event=None, msg=None):
-            return self.min_value
-
-        def get_sec(self, event=None, msg=None):
-            return self.sec_value
-
-    class CountdownManager(Abstract):
-        def __init__(self):
-            self.sec = 0
-            self.min = 0
-            self.hour = 0
-            self.timer = osTimer()
-            self.total = 0
-            self.time_cb = 0
-            self.time_play = 0
-            self.total_sec = 0
-
-        def post_processor_after_instantiation(self):
-            EventMesh.subscribe("add_countdown_sec", self.add_sec)
-            EventMesh.subscribe("reduce_countdown_sec", self.reduce_sec)
-            EventMesh.subscribe("add_countdown_min", self.add_min)
-            EventMesh.subscribe("reduce_countdown_min", self.reduce_min)
-            EventMesh.subscribe("add_countdown_hour", self.add_hour)
-            EventMesh.subscribe("reduce_countdown_hour", self.reduce_hour)
-            EventMesh.subscribe("get_countdown_sec", self.get_sec)
-            EventMesh.subscribe("get_countdown_min", self.get_min)
-            EventMesh.subscribe("get_countdown_hour", self.get_hour)
-
-            EventMesh.subscribe("set_countdown_off_state", self.set_countdown_off_state)
-            EventMesh.subscribe("get_countdown_off_state", self.get_countdown_off_state)
-
-
-            EventMesh.subscribe("set_countdown_all_time", self.set_countdown_all_time)
-            EventMesh.subscribe("get_countdown_all_time", self.get_countdown_all_time)
-
-            EventMesh.subscribe("countdown_end_cb", self.countdown_end_cb)
-
-            EventMesh.subscribe("reset_time_countdown",self.reset)
-
-        def set_countdown_all_time(self, event, msg):
-            self.total = msg[0]
-            self.total_sec = msg[1]
-            # EventMesh.debug_log("self.total:{} self.total_sec:{}".format(self.total,self.total_sec))
-
-
-        def get_countdown_all_time(self, event, msg):
-            return self.total
-        
-        def set_countdown_off_state(self, event, msg):
-
-            self.time_cb = msg[0]
-            self.time_play = msg[1]
-            # EventMesh.debug_log("self.time_cb:{} self.total_sec:{}".format(self.time_cb,self.time_play))
-
-
-        def get_countdown_off_state(self, event, msg):
-            return [self.time_cb,self.time_play]
-        
-        def countdown_end_cb(self, event, msg):
-            
-            if self.time_cb == 1 and self.time_play == 1:
-                date_tmp = utime.localtime()
-                time_tmp = utime.mktime(date_tmp) 
-                reduce = time_tmp- self.total_sec
-                EventMesh.debug_log("self.time_cb:{} self.time_play:{} self.total:{} self.total_sec:{}".format(self.time_cb,self.time_play, self.total,self.total_sec))
-                self.total = self.total - reduce
-                if self.total <= 0:
-                    self.total = 0
-                    self.time_cb = 0
-                    self.time_play = 0
-                    self.sec = 0
-                    self.min = 0
-                    self.hour = 0
-                    
-                    EventMesh.publish("load_screen", {"screen": "countdown_end"})
-                    return
-                self.total_sec = time_tmp
-
-
-        def add_sec(self, event, msg):
-            if self.sec < 59:
-                self.sec = self.sec + 1
-
-        def reduce_sec(self, event, msg):
-            if self.sec > 0:
-                self.sec = self.sec - 1
-
-        def add_min(self, event, msg):
-            if self.min < 59:
-                self.min = self.min + 1
-
-        def reduce_min(self, event, msg):
-            if self.min > 0:
-                self.min = self.min - 1
-
-        def add_hour(self, event, msg):
-            if self.hour < 99:
-                self.hour = self.hour + 1
-
-        def reduce_hour(self, event, msg):
-            if self.hour > 0:
-                self.hour = self.hour - 1
-
-        def get_sec(self, event=None, msg=None):
-            return self.sec
-
-        def get_min(self, event=None, msg=None):
-            return self.min
-
-        def get_hour(self, event=None, msg=None):
-            return self.hour
-        
-
-        
-        def reset(self, event=None, msg=None):
-            self.hour = 0
-            self.min = 0
-            self.sec = 0
-        
-        
-
-    BATTERY_OCV_TABLE = {
-        "nix_coy_mnzo2": {
-            55: {
-                4290: 100, 4237: 95, 4179: 90, 4123: 85, 4070: 80, 4020: 75, 3963: 70, 3919: 65, 3882: 60, 3847: 55,
-                3818: 50, 3794: 45, 3772: 40, 3752: 35, 3733: 30, 3716: 25, 3699: 20, 3677: 15, 3652: 10, 3629: 5, 3400: 0,
-            },
-            20: {
-                4290: 100, 4237: 95, 4179: 90, 4123: 85, 4070: 80, 4020: 75, 3963: 70, 3919: 65, 3882: 60, 3847: 55,
-                3818: 50, 3794: 45, 3772: 40, 3752: 35, 3733: 30, 3716: 25, 3699: 20, 3677: 15, 3652: 10, 3629: 5, 3400: 0,
-            },
-            0: {
-                4290: 100, 4237: 95, 4179: 90, 4123: 85, 4070: 80, 4020: 75, 3963: 70, 3919: 65, 3882: 60, 3847: 55,
-                3818: 50, 3794: 45, 3772: 40, 3752: 35, 3733: 30, 3716: 25, 3699: 20, 3677: 15, 3652: 10, 3629: 5, 3400: 0,
-            },
-        },
-    }
-
-
-
-    class Battery(object):
-        """This class is for battery info.
-
-        This class can get battery voltage and energy.
-        if adc_args is not None, use cbc to read battery
-
-        adc_args: (adc_num, adc_period, factor)
-
-            adc_num: ADC channel num
-            adc_period: Cyclic read ADC cycle period
-            factor: calculation coefficient
-        """
-
-        def __init__(self, adc_args=None, chrg_gpion=None, stdby_gpion=None):
-            self.__energy = 100
-            self.__temp = 55
-
-            # ADC params
-            self.__adc = None
-            if adc_args:
-                self.__adc_num, self.__adc_period, self.__factor = adc_args
-                if not isinstance(self.__adc_num, int):
-                    raise TypeError("adc_args adc_num is not int number.")
-                if not isinstance(self.__adc_period, int):
-                    raise TypeError("adc_args adc_period is not int number.")
-                if not isinstance(self.__factor, float):
-                    raise TypeError("adc_args factor is not int float.")
-                self.__adc = ADC()
-
-            # Charge params
-            self.__charge_callback = None
-            self.__charge_status = None
-            self.__chrg_gpion = chrg_gpion
-            self.__stdby_gpion = stdby_gpion
-            self.__chrg_gpio = None
-            self.__stdby_gpio = None
-            self.__chrg_exint = None
-            self.__stdby_exint = None
-            if self.__chrg_gpion is not None and self.__stdby_gpion is not None:
-                self.__init_charge()
-
-        def __chrg_callback(self, args):
-            self.__update_charge_status()
-            if self.__charge_callback is not None:
-                self.__charge_callback(self.__charge_status)
-
-        def __stdby_callback(self, args):
-            self.__update_charge_status()
-            if self.__charge_callback is not None:
-                self.__charge_callback(self.__charge_status)
-
-        def __update_charge_status(self):
-            if self.__chrg_gpio.read() == 1 and self.__stdby_gpio.read() == 1:
-                self.__charge_status = 0
-            elif self.__chrg_gpio.read() == 0 and self.__stdby_gpio.read() == 1:
-                self.__charge_status = 1
-            elif self.__chrg_gpio.read() == 1 and self.__stdby_gpio.read() == 0:
-                self.__charge_status = 2
-            else:
-                raise TypeError("CHRG and STDBY cannot be 0 at the same time!")
-
-        def __init_charge(self):
-            self.__chrg_gpio = Pin(self.__chrg_gpion, Pin.IN, Pin.PULL_DISABLE)
-            self.__stdby_gpio = Pin(self.__stdby_gpion, Pin.IN, Pin.PULL_DISABLE)
-            self.__chrg_exint = ExtInt(self.__chrg_gpion, ExtInt.IRQ_RISING_FALLING, ExtInt.PULL_PU, self.__chrg_callback)
-            self.__stdby_exint = ExtInt(self.__stdby_gpion, ExtInt.IRQ_RISING_FALLING, ExtInt.PULL_PU,
-                                        self.__stdby_callback)
-            self.__chrg_exint.enable()
-            self.__stdby_exint.enable()
-            self.__update_charge_status()
-
-        def __get_soc_from_dict(self, key, volt_arg):
-            """Get battery energy from map"""
-            if key in BATTERY_OCV_TABLE["nix_coy_mnzo2"]:
-                volts = sorted(BATTERY_OCV_TABLE["nix_coy_mnzo2"][key].keys(), reverse=True)
-                pre_volt = 0
-                volt_not_under = 0  # Determine whether the voltage is lower than the minimum voltage value of soc.
-                for volt in volts:
-                    if volt_arg > volt:
-                        volt_not_under = 1
-                        soc1 = BATTERY_OCV_TABLE["nix_coy_mnzo2"][key].get(volt, 0)
-                        soc2 = BATTERY_OCV_TABLE["nix_coy_mnzo2"][key].get(pre_volt, 0)
-                        break
-                    else:
-                        pre_volt = volt
-                # EventMesh.debug_log("__get_soc_from_dict:{}".format(soc2 - (soc2 - soc1) * (pre_volt - volt_arg) // (pre_volt - volt)))
-                if pre_volt == 0:  # Input Voltarg > Highest Voltarg
-                    return soc1
-                elif volt_not_under == 0:
-                    return 0
-                else:
-                    return soc2 - (soc2 - soc1) * (pre_volt - volt_arg) // (pre_volt - volt)
-
-        def __get_soc(self, temp, volt_arg, bat_type="nix_coy_mnzo2"):
-            """Get battery energy by temperature and voltage"""
-            if bat_type == "nix_coy_mnzo2":
-                if temp > 30:
-                    return self.__get_soc_from_dict(55, volt_arg)
-                elif temp < 10:
-                    return self.__get_soc_from_dict(0, volt_arg)
-                else:
-                    return self.__get_soc_from_dict(20, volt_arg)
-
-        def __get_power_vbatt(self):
-            return int(sum([Power.getVbatt() for i in range(100)]) / 100)
-
-        def __get_adc_vbatt(self):
-            self.__adc.open()
-            utime.sleep_ms(self.__adc_period)
-            adc_list = list()
-            for i in range(self.__adc_period):
-                adc_list.append(self.__adc.read(self.__adc_num))
-                utime.sleep_ms(self.__adc_period)
-            adc_list.remove(min(adc_list))
-            adc_list.remove(max(adc_list))
-            adc_value = int(sum(adc_list) / len(adc_list))
-            self.__adc.close()
-            vbatt_value = adc_value * (self.__factor + 1)
-            return vbatt_value
-
-        def set_temp(self, temp):
-            """Set now temperature."""
-            if isinstance(temp, int) or isinstance(temp, float):
-                self.__temp = temp
-                return True
-            return False
-
-        def get_voltage(self):
-            """Get battery voltage"""
-            if self.__adc is None:
-                return self.__get_power_vbatt()
-            else:
-                return self.__get_adc_vbatt()
-
-        def get_energy(self,volt_arg ):
-            """Get battery energy"""
-            if( volt_arg == None) :
-                volt_arg = self.get_voltage()
-            self.__energy = self.__get_soc(self.__temp, volt_arg)
-            # EventMesh.debug_log("get_energy:volt_arg {} __energy{}".format(volt_arg,self.__energy))
-            return self.__energy
-
-        def set_charge_callback(self, charge_callback):
-            if self.__chrg_gpion is not None and self.__stdby_gpion is not None:
-                if callable(charge_callback):
-                    self.__charge_callback = charge_callback
-                    return True
-            return False
-
-        def get_charge_status(self):
-            return self.__charge_status
-
-    class BatteryManager(Abstract):
-        def __init__(self):
-            """电池管理器"""
-            self.battery = Battery()
-            self.low_battery = False
-
-        def post_processor_after_instantiation(self):
-            """订阅此类所有的事件到 EventMesh中"""
-            EventMesh.subscribe("get_battery", self.get_battery)
-
-        def get_battery(self, event=None, msg=None):
-            battery = self.battery.get_energy(msg)
-            return battery
-
-        def get_voltage(self, event=None, msg=None):
-            voltage = self.battery.get_voltage()
-            return voltage
-
-    class ConfigStoreManager(Abstract):
-        """
-        持久化落盘存储
-        """
-
-        def __init__(self):
-            self.file_name = "/usr/conf_store.json"
-            self.lock = Lock()
-            self.map = dict()
-
-        def post_processor_after_instantiation(self):
-            if ql_fs.path_exists(self.file_name):
-                self.map = ql_fs.read_json(self.file_name)
-            else:
-                self.__store()
-            EventMesh.subscribe("persistent_config_get", self.__read)
-            EventMesh.subscribe("persistent_config_store", self.__store)
-
-        def __read(self, event, msg):
-            with self.lock:
-                return self.map.get(msg)
-
-        def __store(self, event=None, msg=None):
-            if msg is None:
-                msg = dict()
-            with self.lock:
-                self.map.update(msg)
-                ql_fs.touch(self.file_name, self.map)
-            
-    class sosInfoCallManager(Abstract):
-        # 通讯录
-        def __init__(self):
-            pass
-
-        def post_processor_after_instantiation(self):
-            EventMesh.subscribe("set_sos_info_call", self.set_sos_info_call)
-
-        def set_sos_info_call(self, event, msg):
-            hangup_mode = EventMesh.publish("get_hangup_mode")
-            if hangup_mode == 1:
-                EventMesh.publish("set_sos_flag",0)
-                EventMesh.publish("set_sos_num",0)
-                EventMesh.publish("set_hangup_mode",0)
-            EventMesh.debug_log('hangup_mode disconnect',hangup_mode)
-            sos_flag = EventMesh.publish("get_sos_flag")
-            EventMesh.debug_log('voicecall sos_flag',sos_flag)
-            if sos_flag == 0 :
-                EventMesh.publish("set_sos_num",0)
-            else:
-                num = EventMesh.publish("get_sos_num")
-                number = EventMesh.publish("get_dial_sos_number")
-                if number != None:
-                    if len(number) > 0:
-                        if num == None:
-                            num = 0
-                        num+=1
-                        num_len = 0
-
-                        if len(number) == 1:
-                            num_len = len(number)+1#三次
-                        elif len(number) == 2:
-                            num_len = len(number)+1+2 #1+2+1+2
-                        elif len(number) == 3:
-                            num_len = len(number)+5 #1+3+5
-                        # EventMesh.debug_log("number:{} number_len :{} num:{} num_len:{}".format(number,len(number),num,num_len))
-                        if num > num_len :
-                            if len(number) == 1:
-                                number1 = str(number[0])
-                                sms.sendPduMsg(number1, '我需要你的帮助', 'UCS2')
-                            elif len(number) == 2:
-                                number1 = str(number[0])
-                                sms.sendPduMsg(number1, '我需要你的帮助', 'UCS2')
-
-                                number2 = str(number[1])
-                                sms.sendPduMsg(number2, '我需要你的帮助', 'UCS2')
-                            elif len(number) == 3:
-                                number1 = str(number[0])
-                                sms.sendPduMsg(number1, '我需要你的帮助', 'UCS2')
-                                number2 = str(number[1])
-                                sms.sendPduMsg(number2, '我需要你的帮助', 'UCS2')
-                                number3 = str(number[2])
-                                sms.sendPduMsg(number3, '我需要你的帮助', 'UCS2')
-                            EventMesh.publish("set_sos_flag",0)
-                            EventMesh.publish("set_sos_num",0)
-                        else:
-                        # EventMesh.debug_log("number:{} number_len :{}".format(number,len(number)))
-                            EventMesh.publish("set_sos_num",num)
-                            if len(number) == 1:
-                                if len(number[0]) != 0:
-                                    EventMesh.publish("set_callnumer_cb",number[0])
-                                    EventMesh.debug_log("phone 1")
-                            elif len(number) == 2:
-                                if num == 1 or num == 3 or num == 5: #1 2 3 4 5 
-                                    if len(number[1]) != 0:
-                                        EventMesh.debug_log("phone 2")
-                                        EventMesh.publish("set_callnumer_cb",number[1])
-                                elif num == 2 or num == 4:
-                                    if len(number[0]) != 0:
-                                        EventMesh.debug_log("phone 3")
-                                        EventMesh.publish("set_callnumer_cb",number[0])
-                            elif len(number) == 3:
-                                if num == 1 or num == 4 or num == 7:
-                                    if len(number[1]) != 0:
-                                        EventMesh.publish("set_callnumer_cb",number[1])
-                                        EventMesh.debug_log("phone 4")
-                                elif num == 2 or num == 5 or num == 8:
-                                    if len(number[2]) != 0:
-                                        EventMesh.debug_log("phone 5")
-                                        EventMesh.publish("set_callnumer_cb",number[2])
-                                elif num == 3 or num == 6 :
-                                    if len(number[0]) != 0:
-                                        EventMesh.debug_log("phone 6")
-                                        EventMesh.publish("set_callnumer_cb",number[0])   
-    
-    WL_timer = osTimer()   
-    def WL_timer_cb(*args):   
-        get_call = EventMesh.publish("get_call_state") 
-        if get_call == 2:#只有拨进来才给接听
-            EventMesh.publish("answer_call_event")#接听电话
-    def voice_callback(args):
-        EventMesh.debug_log('voicecall iinfo:{}'.format(args))
-        if args[0] == 10:
-                get_UI_high_priority = EventMesh.publish("get_UI_high_priority")#如果在拨出去或者通话中屏蔽来电
-                if get_UI_high_priority == 1:
-                    EventMesh.publish("set_interrup_incall",1)
-                    return
-                EventMesh.debug_log('voicecall incoming call, PhoneNO.: ', args[6])
-                size_len = len(str(args[6]))
-                tmp = []
-                tmp = args[6]
-                find_num = tmp[0]
-                b = tmp[0].isdigit()#判断是否不是数字开头 暂时不用 因为截取了+判断不了 判断号码是否大于11位数,如果大于11位数 并且第一个字符是数字就按照最后11位做存储
-
-                if b == True and size_len > 11:
-                    tmp = tmp[size_len-11:]
-                WLKEY = EventMesh.publish("get_storage_config","WLKEY") 
-                if WLKEY == "1" or WLKEY == "2":#开启了白名单
-                    on_list_flag = 0
-                    phonebook = EventMesh.publish("get_phonebook_list")
-                    phonebook_list = phonebook[1]
-                    EventMesh.debug_log("voice_callback:phonebook_list{}".format(phonebook_list))
-                    try:
-                        for value in phonebook_list.values():
-                            if value == args[6]:
-                                on_list_flag = 1
-                                break
-                    except Exception as e:
-                        usys.print_exception(e)
-                    EventMesh.debug_log("voice_callback:on_list_flag{}".format(on_list_flag))
-                    if on_list_flag == 1:#在白名单里
-                        if WLKEY == "2":
-                            WL_timer.start(30000, 0, WL_timer_cb)
-                    else:
-                        EventMesh.debug_log("voice_callback:不在白名单中,挂断")
-                        voiceCall.callEnd()
-                        return 
-                viode_state = EventMesh.publish("get_video_state")
-                fall_down = EventMesh.publish("get_fall_down_state")#跌倒报警标识
-                if viode_state != 0 or fall_down != 0:
-                    voiceCall.callEnd()
-                    return
-
-                EventMesh.publish("set_call_state",2) 
-                EventMesh.publish("dialin_call_event")#电话拨进响铃
-                # EventMesh.publish("load_screen", {"screen": "incoming_call","meta":str(tmp)})
-
-        elif args[0] == 11:
-                EventMesh.publish("set_UI_high_priority",0)
-                sos_flag = EventMesh.publish("get_sos_flag")
-                if sos_flag == 1:
-                    sos_flag = 0
-
-                    EventMesh.publish("set_sos_flag",0)
-
-                EventMesh.debug_log('voicecall connected, PhoneNO.: ', args[6])
-                size_len = len(str(args[6]))
-                tmp = []
-                tmp = args[6]
-                find_num = tmp[0]
-                b = tmp[0].isdigit()#判断是否不是数字开头 暂时不用 因为截取了+判断不了
-                if b == True and size_len > 11:
-                    tmp = tmp[size_len-11:]
-                EventMesh.publish("set_call_state",3) 
-                # if EventMesh.publish("get_call_state") == 2:#打通了才可设置状态 防止挂断太及时,又拨出去了
-                #     EventMesh.publish("set_call_state",3) 
-                # else:
-                #     EventMesh.publish("set_call_state",0) 
-                # EventMesh.publish("load_screen", {"screen": "on_call","meta":str(tmp)})
-
-        elif args[0] == 12:
-                set_interrup_call = EventMesh.publish("get_interrup_incall")#打断这次不需要来电的ui事件 以免通话中退出当前界面进不去了
-                if set_interrup_call == 1:
-                    EventMesh.publish("set_interrup_incall",0)
-                    return
-
-                EventMesh.publish("set_interrup_incall",0)
-                EventMesh.publish("set_UI_high_priority",0)
-                
-
-                
-                
-                EventMesh.publish("set_sos_info_call")  
-                flag = EventMesh.publish("get_call_state") 
-                if flag == 2:
-                    EventMesh.publish("stop_led_timer")#设置参数
-                    EventMesh.publish("close_timer_all")#
-                    EventMesh.publish("close_motor_infor")#关闭马达和定时器
-                    
-                EventMesh.publish("set_sos_state_out")
-                EventMesh.publish("set_call_state",0) 
-                EventMesh.debug_log('voicecall disconnect end')
-                
-
-        elif args[0] == 13:
-                EventMesh.debug_log('voicecall is waiting, PhoneNO.: ', args[6])
-        elif args[0] == 14:
-
-                EventMesh.debug_log('voicecall dialing, PhoneNO.: ', args[6])
-                EventMesh.publish("set_UI_high_priority",0)
-                EventMesh.publish("set_call_state",1) 
-                # EventMesh.publish("load_screen", {"screen": "dialing"})
-
-                
-        elif args[0] == 15:
-                EventMesh.debug_log('voicecall alerting, PhoneNO.: ', args[6])
-                EventMesh.publish("set_call_state",1) 
-                
-        elif args[0] == 16:
-                EventMesh.debug_log('voicecall holding, PhoneNO.: ', args[6])
-
-    class DeviceInfoManager(Abstract):
-        
-        """
-            设备信息管理
-        """
-
-        def __init__(self):
-
-            self.DeviceInfo_queue = Queue()
-            _thread.stack_size((9+6)*1024)
-            _thread.start_new_thread(self.DeviceInfo_queue_thread, ())
-            _thread.stack_size(8*1024)
-            self.boot_time_count = 0
-            self.factory_test_time = 0
-            EventMesh.subscribe("publish_message_event_DeviceInfo",self.publish_message_event_DeviceInfo)
-            self.key = ""
-            self.imei = ""
-            self.cid = "ETEST20221014010"
-            self.imsi = ""
-            self.password = "000000"
-            #self.__city = None
-            #self.__location = None
-            self.timer_push_schedule = osTimer()
-            self.timer_pusht_test = osTimer()
-            
-            #self.battery_push_schedule = osTimer()
-            self.check_battery_list = []
-            
-            self.step = [0,0,0,0]
-            self.timer_push=0
-            self.timer_push_tmp=60
-            self.PING = "0" #绑定状态
-            self.connect = 0 #服务器连接状态
-            self.KA_time = 0
-            self.HR_time = 0
-            self.hr_timeSecond = 0
-            self.HR_state = 0
-            self.HR_Onestate = 0
-            self.get_hr_state = 0
-            self.get_spo2_state = 0
-            self.set_hsenor_crt = 0
-            self.HR_OneTime = 0
-            self.Hr_Need_Open = 0
-            self.Spo2_Need_Open = 0
-            self.bat_time = 0
-            self.vbat_full_flag = 0
-            self.clear_step = 0
-            self.test = 0
-            self.old_time = 0
-            self.UD_time = 0
-            self.upload_time = 0
-            self.UD_timeout = 7*60
-
-            self.temp_timeSecond = 0
-            self.temp_state = 0
-            self.temp_one_state = 0
-            self.temp_warning = 0
-
-            self.bg_timeSecond = 0
-
-            self.bp_timeSecond = 0
-            self.bpauto_state = 0
-
-            self.spo2_timeSecond = 0
-            self.spo2auto_state = 0
-
-            self.vbat_count = 0
-
-            self.vbat_buf=[]
-
-            self.curr_battery_level = 4200
-            self.bat_count = 0
-
-            self.mearsure_btn = 0
-            self.mearsure_timer = 0
-
-            self.old_hr_time = 0
-            self.old_spo2_time = 0
-
-            self.no_smi_count = 0
-            self.no_smi_state = 0
-
-            self.old_bp_time = 0
-
-            self.medicine_count = 0
-            self.medicine_flag  = 0
-            self.medicine_oldtotalmin = 0
-            
-            self.wakeup_flag = 0
-            self.wakeup_count = 0
-            self.wakeup_oldtotalmin = 0
-
-            self.sleep_flag = 0
-            self.sleep_count = 0
-            self.sleep_oldtotalmin = 0
-
-            self.reset_flag = 0
-            self.reset_count = 0
-            self.reset_oldtotalmin = 0
-
-            self.home_flag = 0
-            self.home_count = 0
-            self.home_oldtotalmin = 0
-
-            self.normal_flag = 0
-            self.normal_count = 0
-            self.normal_oldtotalmin = 0
-            
-            self.charge_full_count = 0
-            self.GPS_step_t = 0#记录步数
-            self.usb = USB()
-            self.usb.setCallback(self.usb_event_cb)
-            self.log = LogAdapter(self.__class__.__name__)
-            self.rtc = RTC()
-            self.aud = audio.Audio(0)
-            EventMesh.debug_log("DeviceInfoManager:1")
-
-            self.old_temp_time = 0
-
-            EventMesh.debug_log("DeviceInfoManager:3")
-            self.i2c0 = I2C(I2C.I2C0, I2C.FAST_MODE)
-            self.stop_temp( None, None)
-            self.dev_state = 0
-            self.wear = 1
-            self.BG_state = 0
-            self.old_bg_time = 0
-
-            self.pull_time = 0
-
-            self.drink_time = 0
-
-            self.alarm_count = 0
-            self.alarm_flag = 0
-
-            self.time_count = 0
-            
-            self.auto_spo2_count = 0
-
-            self.auto_hr_count = 0
-
-            self.auto_temp_count = 0
-
-            self.low_power_AL = 0
-
-        def post_processor_after_instantiation(self):
-            EventMesh.debug_log("post_processor_after_instantiation:1")
-            """订阅此类所有的事件到 EventMesh中"""
-            voiceCall.setCallback(voice_callback)
-            EventMesh.subscribe("screen_get_ope", self.get_device_ope)
-            EventMesh.subscribe("screen_get_sig", self.get_signal)
-            EventMesh.subscribe("screen_get_time", self.get_time)
-            EventMesh.subscribe("about_get_imei", self.get_imei)
-            EventMesh.subscribe("about_get_iccid", self.get_ic_cid)
-            EventMesh.subscribe("get_sim_Status", self.get_sim_Status)
-            EventMesh.subscribe("about_get_phonenum", self.get_phone_num)
-            EventMesh.subscribe("screen_get_battery", self.get_battery)
-            EventMesh.subscribe("set_curr_battery_level", self.set_curr_battery_level)
-            EventMesh.subscribe("get_curr_battery_level", self.get_curr_battery_level)
-            EventMesh.subscribe("get_fw_version", self.get_device_fw_version)
-            EventMesh.subscribe("get_standby_time", self.get_standby_time)
-            EventMesh.subscribe(constants.EVENT.GET_STEP, self.get_step_count)
-            EventMesh.subscribe("sim_slot_get", self.sim_slot_get)
-            EventMesh.subscribe("sim_slot_switch", self.sim_slot_switch)
-            EventMesh.subscribe(constants.EVENT.GET_KEY, self.get_key)
-            EventMesh.subscribe(constants.EVENT.SET_KEY, self.set_key)
-            EventMesh.subscribe(constants.EVENT.GET_IMEI, self.get_imei)
-            EventMesh.subscribe(constants.EVENT.GET_CID, self.get_cid)
-            EventMesh.subscribe(constants.EVENT.SET_CID, self.set_cid)
-            EventMesh.subscribe(constants.EVENT.GET_IMSI, self.get_imsi)
-            EventMesh.subscribe(constants.EVENT.GET_PASSWORD, self.get_password)
-            EventMesh.subscribe(constants.EVENT.SET_PASSWORD, self.set_password)     
-            EventMesh.subscribe(constants.EVENT.SET_PING, self.set_ping)
-            EventMesh.subscribe(constants.EVENT.GET_PING, self.get_ping)
-            EventMesh.subscribe(constants.EVENT.SET_CONNECT, self.set_connect)
-            EventMesh.subscribe(constants.EVENT.GET_CONNECT, self.get_connect)
-
-            
-            EventMesh.subscribe(constants.EVENT.START_BLOOD_OXYGEN, self.start_blood_oxygen)
-            EventMesh.subscribe(constants.EVENT.START_HEART, self.start_heart)
-            EventMesh.subscribe(constants.EVENT.STOP_BLOOD_OXYGEN, self.stop_blood_oxygen)
-            EventMesh.subscribe(constants.EVENT.STOP_HEART, self.stop_heart)
-            EventMesh.subscribe(constants.EVENT.GET_BLOOD_OXYGEN, self.get_blood_oxygen)
-            EventMesh.subscribe(constants.EVENT.GET_HEART, self.get_heart)
-            EventMesh.subscribe(constants.EVENT.GET_WEAR, self.get_wear)
-            EventMesh.subscribe("get_Hsensor", self.get_Hsensor)
-            EventMesh.subscribe("Hsensor_set_sleep", self.Hsensor_set_sleep)
-
-            EventMesh.subscribe(constants.EVENT.START_TEMP, self.start_temp)
-            EventMesh.subscribe(constants.EVENT.STOP_TEMP, self.stop_temp)
-            EventMesh.subscribe(constants.EVENT.GET_TEMP, self.get_temp)
-            EventMesh.subscribe("get_boot_time_count", self.get_boot_time_count)
-            EventMesh.subscribe("get_factory_test_time", self.get_factory_test_time)
-            EventMesh.subscribe("get_dev_state", self.get_dev_state)
-            EventMesh.subscribe("set_dev_state", self.set_dev_state)
-
-            EventMesh.subscribe("clear_health_state", self.clear_health_state)
-
-            EventMesh.subscribe("clear_home_alarm", self.clear_home_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)
-            EventMesh.subscribe("clear_normal_alarm", self.clear_normal_alarm)
-
-            EventMesh.subscribe("clear_manual_hr_flag", self.clear_manual_hr_flag)
-            EventMesh.subscribe("clear_manual_temp_flag", self.clear_manual_temp_flag)
-
-
-            EventMesh.subscribe("clear_usb_flag", self.clear_usb_flag)
-            
-            EventMesh.debug_log("post_processor_after_instantiation:2")
-            self.timer_push_schedule.start(10000, 1, self.publish_event_cb)
-            # self.timer_pusht_test.start(2000, 1, self.publish_test)
-            # self.battery_push_schedule.start(3000, 1, self.__check_battery)
-            self.log.debug("post_processor_after_instantiation finished")
-            #EventMesh.publish(constants.EVENT.START_HEART)
-            # 设备开机立刻更新一次参数
-            self.publish_event_cb()
-            
-            EventMesh.debug_log("post_processor_after_instantiation:3")
-
-        def clear_manual_hr_flag(self,event,msg):
-            self.auto_hr_count = 0
-        
-        def clear_manual_temp_flag(self,event,msg):
-            self.auto_temp_count = 0
-
-        def publish_message_event_DeviceInfo(self,event,msg):
-            self.DeviceInfo_queue.put(msg)
-
-        #DeviceInfo的消息队列处理,防止卡顿
-        def DeviceInfo_queue_thread(self):
-            while True:
-                data = self.DeviceInfo_queue.get()
-                #EventMesh.debug_log("DeviceInfo_queue_thread:data = {}".format(data))
-                if data != None:
-                    try:
-                        data["func"](data["data"])
-                    except Exception as e:
-                        EventMesh.debug_log("DeviceInfo_queue_thread:ERROR:{}".format(e))
-                        usys.print_exception(e)
-
-
-        def gsensor_cb(self, para):
-            EventMesh.debug_log("gsensor_cb:{}".format(para))
-            flip_sw = EventMesh.publish("get_storage_config","flip_sw")
-            fall_sw = EventMesh.publish("get_storage_config","fall_sw")
-            if para == 0: #跌倒报警
-                pass
-                if fall_sw == "1":
-                    EventMesh.publish("falldown_alarm_event")
-                    dev_state =  EventMesh.publish("get_dev_state")
-
-                    tmp = 1 << 21
-                    dev_state = dev_state|tmp #第21位=1
-                    EventMesh.publish("set_dev_state",dev_state)
-                    EventMesh.publish(constants.EVENT.START_LOCATION,[constants.PROTOCOL.AL_SEND,dev_state]) #开始AL定位
-                    pass
-                #EventMesh.publish("load_screen", {"screen": "FIND"})
-            elif para == 1: #抬腕
-                
-                if flip_sw == 1:
-                    EventMesh.publish(constants.EVENT.SYSTEM_UP)
-                
-            elif para == 2: #放手
-                pass
-                # if flip_sw == 1:
-                #     EventMesh.publish(constants.EVENT.SYSTEM_SLEEP)
-        def get_boot_time_count(self, event, msg):
-            return self.boot_time_count
-        
-        def get_factory_test_time(self, event, msg):
-            return self.factory_test_time
-        
-        def get_dev_state(self, event, msg):
-            return self.dev_state
-        def set_dev_state(self, event, msg):
-            self.dev_state = msg
-        
-        def publish_event_cb(self, *args, **kwargs):
-            open_power = EventMesh.publish("get_power_on_state")#获取开机标识
-            if open_power != None:
-                if open_power == 1:
-                    if self.boot_time_count < 50000000:
-                        self.boot_time_count += 10
-                    
-                    if self.factory_test_time < 300:
-                        self.factory_test_time+=10
-                #EventMesh.debug_log("boot_time_count:{}".format(self.boot_time_count))
-            EventMesh.publish("publish_message_event_DeviceInfo",{"func":self.publish_event,"data":0})  
-        def optimize_temp(self,temp):
-            temp += 0.5
-            get_temp_time  = EventMesh.publish("get_temp_time")
-            EventMesh.debug_log("temp:{}".format(temp))
-            if temp < 36 :#or temp > 37.5:
-                temp = 36+urandom.random()
-            if temp > 37.5:
-                
-                self.temp_warning += 1
-                EventMesh.debug_log("temp_warning:{} get_temp_time{}".format(self.temp_warning,get_temp_time))
-                
-                if self.temp_warning < 5:#高温没连续超过3次,和谐成37.5度以下
-                    temp = 37+(urandom.randint(1, 4)/10)
-                else:
-                    self.temp_warning = 0
-            else:
-                if self.temp_warning>=1:
-                    self.temp_warning -= 1
-            if temp >= 40:
-                temp = 40
-            return temp
-        def clear_health_state(self,event,msg):
-            print("clear_health_state")
-            self.old_bp_time = 0#关闭心率 血压 血氧 体温清除标志
-            self.old_time = 0
-            self.HR_Onestate = 0
-            self.HR_OneTime = 0
-            self.HR_state = 0
-            self.set_hsenor_crt = 0
-            self.old_bg_time = 0
-            self.old_hr_time = 0
-            self.old_spo2_time = 0
-            self.BG_state = 0
-            self.bpauto_state = 0
-            self.spo2auto_state = 0
-            pass
-
-        def clear_temp_state(self,event,msg):
-            print("clear_temp_state")
-            self.temp_state = 0
-            self.temp_one_state = 0
-            self.old_temp_time = 0
-            pass
-
-        def publish_event(self,data):
-            """
-            定时事件处理
-            :param args:
-            :param kwargs:
-            :return:
-            """
-
-            date_tmp = utime.localtime()
-            time_tmp = utime.mktime(date_tmp)
-            # EventMesh.debug_log("date_tmp......01....{} time_tmp:{}\r\n".format(date_tmp,time_tmp))
-            
-
-            EventMesh.publish("countdown_end_cb")
-            """定时检查是否关闭gps失败"""
-            # gnss_state = quecgnss.get_state()
-            # get_location_flag = EventMesh.publish("get_location_flag")
-            # if get_location_flag != None:
-            #     # if gnss_state == 2 and get_location_flag == 0:
-            #     #     EventMesh.publish(constants.EVENT.GPSCLOSE)
-            #     if(get_location_flag == 0):
-            #         EventMesh.publish(constants.EVENT.START_LOCATION,constants.PROTOCOL.UD_SEND) #开始UD定位
-
-            """7分钟一次心跳"""
-            if  math.fabs(time_tmp - self.KA_time) > heartbeat_time: #7分钟一次心跳
-                self.KA_time = time_tmp
-                EventMesh.publish(constants.PROTOCOL.KA_SEND)
-
-            """定时定位"""
-            #EventMesh.publish("set_upload_data",3*60)
-            self.upload_time = EventMesh.publish("get_upload_data")
-            #EventMesh.debug_log("self.upload_time:{} math.fabs(time_tmp - self.UD_time):{}".format(self.upload_time,math.fabs(time_tmp - self.UD_time)))
-            if self.upload_time != None :
-                if  math.fabs(time_tmp - self.UD_time) > self.upload_time: #30分钟一次定位
-                    self.UD_time = time_tmp
-
-                    status_tmp = 4
-                    #EventMesh.txt_log("status_count:{}".format(status_tmp))
-                    if EventMesh.publish(constants.EVENT.GET_CONNECT) == 1 and status_tmp > 3 :
-                        EventMesh.publish(constants.EVENT.START_LOCATION,constants.PROTOCOL.UD_SEND) #开始UD定位
-
-                    else : #关闭定位
-                        #EventMesh.txt_log("NO status")
-                        EventMesh.debug_log("NO status")
-                        EventMesh.publish(constants.EVENT.CLOSE_LOCATION)#关闭定位 
-            
-            EventMesh.publish(constants.EVENT.PUSH_STEP, self.get_step_count())
-
-            """电池平均值"""
-            temp = Power.getVbatt()
-            if self.bat_count < 10:
-                self.vbat_buf.append(temp)
-                self.bat_count += 1
-            else:
-                for i in range(9):
-                    self.vbat_buf[i] = self.vbat_buf[i+1]
-                self.vbat_buf[9] = temp
-            curr_count = len(self.vbat_buf)
-            bat_total_value = 0
-            for i in range(curr_count):
-                bat_total_value += self.vbat_buf[i]
-            bat_total_value = bat_total_value//curr_count#一分钟更新一次电量 10个平均值
-            EventMesh.publish("set_curr_battery_level",bat_total_value)
-            # EventMesh.debug_log("self.vbat_buf:{} curr_count :{} bat_total_value:{} temp:{}".format(self.vbat_buf,curr_count,bat_total_value,temp))
-            bat_tmp = EventMesh.publish("screen_get_battery")
-            self.vbat_count+=10
-            if self.vbat_count >= 60:
-                self.vbat_count = 0
-                if bat_tmp != None:
-                    bat_value = bat_tmp[1]
-                    if bat_value <= 0:
-                        pass
-                        # EventMesh.publish("load_screen", {"screen": "LOW_ONE_POWER"})
-            
-            
-            """"隔天清步数"""
-
-            data = RTC().datetime()
-
-            hour = int(data[4])
-            min = int(data[5])
-
-
-
-            cur_month = int(data[1])
-            cur_day = int(data[2])
-            cur_year = int(data[0])
-
-            old_Timesec = EventMesh.publish("get_old_time_data")
-            # EventMesh.debug_log("hour:{} {} cur_month:{} {} next_alarm_time:{} old_Timesec:{}".format(hour,min,cur_month,cur_day,next_alarm_time,old_Timesec))
-            # EventMesh.debug_log("old_Timesec",old_Timesec)
-            if old_Timesec != None:
-                next_alarm_time = utime.localtime(int(old_Timesec))
-                month = int(next_alarm_time[1]) #00:00 18
-                day = int(next_alarm_time[2])
-                year = int(next_alarm_time[0])
-                if month != cur_month or day != cur_day or year != cur_year:#年 月 日只要其中一个都不一样就清零
-                    EventMesh.publish("set_old_time_data",time_tmp)
-
-
-                    EventMesh.publish("set_old_step_value",0)
-                    
-                    hr = EventMesh.publish("get_old_hr_data")
-                    if hr != 0:
-                        EventMesh.publish("set_old_hr_data", 0)
-                    
-                    spo2 = EventMesh.publish("get_old_spo2_data")
-                    if spo2 != 0:
-                        EventMesh.publish("set_old_spo2_data", 0)
-                    EventMesh.debug_log("clear step1111")
-                else:
-                    pass
-                    
-                    
-            if hour == 23:#清步数23:59
-                if min == 59:#58 59
-                    # if self.clear_step == 0:
-                    #     self.clear_step = 1
-                    EventMesh.publish("set_old_time_data",time_tmp)
-
-                    EventMesh.publish("set_old_step_value",0)
-
-                    hr = EventMesh.publish("get_old_hr_data")
-                    if hr != 0:
-                        EventMesh.publish("set_old_hr_data", 0)
-                    
-                    spo2 = EventMesh.publish("get_old_spo2_data")
-                    if spo2 != 0:
-                        EventMesh.publish("set_old_spo2_data", 0)
-                    EventMesh.debug_log("clear step2222")
-
-                else:
-                    self.clear_step = 0
-            else:
-                self.clear_step = 0
-            
-            """电量小于0% 关机"""
-            get_low_btn = EventMesh.publish("get_low_bat_btn")#
-            battery = EventMesh.publish("screen_get_battery")
-
-            if battery != None:
-                power = int(battery[1])
-                if battery[0] != '1':
-                    if power == 0:
-                        EventMesh.publish("open_power_on",2)#  
-                    """"低电报警"""
-                    # print("low power!!!!!!!!!!! %d",self.low_power_AL)
-                    if power <= 15 and self.low_power_AL==0:
-                        self.low_power_AL = 1
-                        dev_state =  EventMesh.publish("get_dev_state")
-
-                        tmp = 1 << 17
-                        dev_state = dev_state|tmp #第17位=1
-                        EventMesh.publish("set_dev_state",dev_state)
-                        EventMesh.publish(constants.EVENT.START_LOCATION,[constants.PROTOCOL.AL_SEND,dev_state]) #开始AL定位
-
-                if power >= 50:
-                    self.low_power_AL = 0
-            
-            """未联网提示关机"""
-            ble=EventMesh.publish(constants.EVENT.GET_CONNECT)
-            # EventMesh.debug_log("ble",ble)
-            if ble == 0:#未联网提示关机
-                if battery[0] != '1':
-                    self.no_smi_count+=10
-                    # EventMesh.debug_log("self.no_smi_count",self.no_smi_count)
-                    if self.no_smi_count >= (15*60):#(15*60)
-                        self.no_smi_count = 0
-                        EventMesh.publish("open_power_on",2)#  #未检测到sim卡15分钟后关机
-                    
-            else:
-                self.no_smi_count = 0
-
-            msg_nums = sms.getMsgNums() #获取短信条数
-            # EventMesh.debug_log("msg_nums",msg_nums)
-            if(msg_nums != -1):
-                sms_data = sms.getSaveLoc()
-                sms_max = sms_data[0][2]
-                if msg_nums >= sms_max-1:
-                    EventMesh.publish("delete_sms_event")#
-
-            #佩戴检测
-            WEAR = EventMesh.publish(constants.EVENT.GET_WEAR)#佩戴数据
-            if self.wear != WEAR:
-                remove_sw = EventMesh.publish("get_storage_config","remove_sw")
-                if remove_sw == "1":#开启了佩戴检测的开关
-                    dev_state =  EventMesh.publish("get_dev_state")
-                    
-                    if WEAR != 1:
-                        tmp = 1 << 3
-                        tmp = ~tmp
-                        tmp = 1 << 20
-                        dev_state = dev_state|tmp #第20位=1
-                    # else :     
-                    #     pass              
-                        
-                    #     tmp = 1 << 20
-                    #     dev_state = dev_state|tmp #第20位=1
-                    #     tmp = 1 << 3
-                    #     dev_state = dev_state|tmp #第三位=1
-                        EventMesh.debug_log("佩戴检测:{}".format(dev_state))    
-                        EventMesh.publish("set_dev_state",dev_state)
-                        EventMesh.publish(constants.EVENT.START_LOCATION,[constants.PROTOCOL.AL_SEND,dev_state]) #开始AL定位,发送报警
-                        #EventMesh.publish(constants.PROTOCOL.HELP_SEND,65)
-            self.wear = WEAR
-            """定时测量心率,血氧,体温"""
-            self.get_hr_state = EventMesh.publish("get_hr_state")
-            self.get_spo2_state = EventMesh.publish("get_spo2_state")
-            get_temp_time  = EventMesh.publish("get_temp_time")
-            get_temp_state  = EventMesh.publish("get_temp_state")
-            get_bp_state  = EventMesh.publish("get_bp_state")
-            get_bg_state  = EventMesh.publish("get_bg_state")
-            if get_bg_state == None:
-                get_bg_state = 0
-            if get_bp_state == None:
-                get_bp_state = 0
-
-            if get_temp_state == None:
-                get_temp_state = 0
-
-            if self.get_hr_state == None:
-                self.get_hr_state = 0
-            if self.get_spo2_state == None:
-                self.get_spo2_state = 0 
-
-            video_state = EventMesh.publish("get_video_state")#获取
-            if video_state == None:
-                video_state = 0
-                
-            call_state = EventMesh.publish("get_call_state")
-            if call_state == None:
-                call_state = 0
-
-
-            video_state = EventMesh.publish("get_video_state")
-            if video_state != None:
-                if battery[0] != "1":
-                    if get_temp_state != None and call_state != None and video_state != None: #突然脱腕
-
-                        if get_temp_state > 1  and (WEAR != 1 or call_state != 0 or video_state != 0):
-                            EventMesh.publish(constants.EVENT.STOP_TEMP)
-                            EventMesh.publish("set_temp_state",0)       
-                            EventMesh.txt_log("auto stop_temp:22")
-
-                        if (self.get_hr_state > 1 or self.get_spo2_state > 1 or get_bp_state > 1 or get_bg_state > 1) and (WEAR != 1 or call_state != 0 or video_state != 0):
-                            # print("wear faile")
-                            if self.get_hr_state > 1 :
-                                EventMesh.txt_log("auto stop_hr:22")
-                                EventMesh.publish("set_hr_state",0)#2代表后台进入测试,定时测心率 1ui界面测试洗心率 
-                                EventMesh.publish(constants.EVENT.STOP_HEART) 
-                                if WEAR == 1:
-                                    heart_value = EventMesh.publish(constants.EVENT.GET_HEART)
-                                    if heart_value >= 50 and heart_value != None:
-                                        EventMesh.publish(constants.PROTOCOL.HEART_SEND,heart_value)#上传心率数据
-                                
-                            if self.get_spo2_state > 1:
-                                EventMesh.txt_log("auto stop_spo2:22")
-                                EventMesh.publish("set_spo2_state",0)#2代表后台进入测试
-
-                                EventMesh.publish(constants.EVENT.STOP_BLOOD_OXYGEN)
-                                spo2_value = EventMesh.publish(constants.EVENT.GET_BLOOD_OXYGEN)
-                                if WEAR == 1:
-                                    if spo2_value > 85 and spo2_value != None:
-                                        EventMesh.publish(constants.PROTOCOL.OXYGEN_SEND,spo2_value)
-                                
-                            if get_bp_state > 1:
-
-                                EventMesh.txt_log("auto stop_bp:22")
-                                EventMesh.publish("set_bp_state",0)#2代表后台进入测试
-                                EventMesh.publish(constants.EVENT.STOP_HEART)
-                                if WEAR == 1:
-                                    blood_data = get_autoblood_value()
-                                    if blood_data == None:
-                                        blood_data[0] = 0
-                                        blood_data[1] = 0
-
-                                    max_value = blood_data[0]
-                                    min_value = blood_data[1]
-                                    if max_value != 0 and min_value != 0:
-                                        EventMesh.publish(constants.PROTOCOL.BLOOD_SEND,[max_value,min_value])
-                                
-                            if get_bg_state > 1:
-                                EventMesh.txt_log("auto stop_bg:22")
-                                
-                                EventMesh.publish("set_bg_state",0)#2代表后台进入测试
-                                EventMesh.publish(constants.EVENT.STOP_HEART)
-                                if WEAR == 1:
-                                    bg_data = get_blood_sugar_value()
-                                    if bg_data == None:
-                                        bg_data = 0
-                                    if bg_data != 0:
-                                        # EventMesh.publish("play_sugar_value", bg_data)#播放血糖数值
-                                        EventMesh.publish(constants.PROTOCOL.BLOODGLUSOCE_SEND,bg_data)   
-        
-            if self.pull_time == 0:
-                self.pull_time = time_tmp
-            # if EventMesh.publish(constants.EVENT.GET_CONNECT) == 1:#已联网 并且不在充电 佩戴正常 不在通话就给测试心率
-            if EventMesh.publish(constants.EVENT.GET_CONNECT) == 1 and battery[0] != "1" and WEAR == 1 and call_state == 0 and video_state == 0:
-                #防止时间校时出错
-                if time_tmp < self.pull_time :
-                    self.pull_time = time_tmp
-                if time_tmp < self.temp_timeSecond:
-                    self.temp_timeSecond = time_tmp
-                if time_tmp < self.hr_timeSecond:
-                    self.hr_timeSecond = time_tmp
-                if time_tmp < self.spo2_timeSecond :
-                    self.spo2_timeSecond = time_tmp
-                if time_tmp < self.bp_timeSecond:
-                    self.bp_timeSecond = time_tmp
-                if time_tmp < self.bg_timeSecond:
-                     self.bg_timeSecond = time_tmp
-
-                if time_tmp - self.pull_time >= 30:
-                    # EventMesh.debug_log("shifens:")  
-
-                    get_hr_state = EventMesh.publish("get_hr_state")
-                    get_spo2_state = EventMesh.publish("get_spo2_state")
-                    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 get_hr_state == None:
-                        get_hr_state = 0
-                        self.old_hr_time = 0
-
-                    if get_spo2_state == None:
-                        get_spo2_state = 0
-                        self.old_spo2_time = 0
-
-                    if get_temp_state == None:
-                        get_temp_state = 0
-                        self.temp_one_state = 0
-
-                    if get_bp_state == None:
-                        get_bp_state = 0
-                        self.old_bp_time = 0
-                    
-                    if get_bg_state == None:
-                        get_bg_state = 0
-                        self.old_bg_time = 0
-                    
-                    # print("bp get_bp_state ",get_bp_state,self.old_bp_time)
-
-                    
-                    if get_hr_state != None:
-                        if get_hr_state == 3:
-                            self.old_hr_time+=1
-                            if self.old_hr_time == 1:
-                                EventMesh.publish("set_hr_state",3)#2代表后台进入测试
-                                # EventMesh.publish("set_hr_blood_led",1)
-                                EventMesh.publish(constants.EVENT.START_HEART)
-                                EventMesh.txt_log("auto start_hr:333")
-                            elif self.old_hr_time > 6:
-                                self.old_hr_time = 0
-                                EventMesh.publish("set_hr_state",0)#2代表后台进入测试
-                                EventMesh.txt_log("auto stop_hr:333")
-                                EventMesh.publish(constants.EVENT.STOP_HEART)
-                                heart_value = EventMesh.publish(constants.EVENT.GET_HEART)
-                                EventMesh.debug_log("heart_value:{}".format(heart_value))
-                                if heart_value >= 50 and heart_value != None:
-                                    EventMesh.publish(constants.PROTOCOL.HEART_SEND,heart_value)#上传心率数据
-                                EventMesh.debug_log("STOP_HEART:3")
-                        else:
-                            self.old_hr_time = 0
-                    else:
-                        self.old_hr_time = 0
-
-
-                    if get_spo2_state != None:
-                        if get_spo2_state == 3:
-                            self.old_spo2_time+=1
-                            if self.old_spo2_time == 1:
-                                EventMesh.publish("set_spo2_state",3)#2代表后台进入测试
-                                # EventMesh.publish("set_hr_blood_led",1)
-                                EventMesh.publish(constants.EVENT.START_BLOOD_OXYGEN)#K开血氧
-                                EventMesh.txt_log("auto start_spo2:333")
-                            elif self.old_spo2_time > 6:
-                                self.old_spo2_time = 0
-                                EventMesh.txt_log("auto stop_spo2:333")
-                                EventMesh.publish("set_spo2_state",0)#2代表后台进入测试
-                                EventMesh.publish(constants.EVENT.STOP_BLOOD_OXYGEN)
-                                spo2_value = EventMesh.publish(constants.EVENT.GET_BLOOD_OXYGEN)
-                                if spo2_value > 85 and spo2_value != None:
-                                    EventMesh.publish(constants.PROTOCOL.OXYGEN_SEND,spo2_value)
-                                    
-                        else:
-                            self.old_spo2_time = 0
-                    else:
-                        self.old_spo2_time = 0
-
-
-                    if get_bp_state != None:
-                        if get_bp_state == 3:
-                            self.old_bp_time+=1
-                            if self.old_bp_time == 1:
-                                EventMesh.publish("set_bp_state",3)#2代表后台进入测试
-                                # EventMesh.publish("set_hr_blood_led",1)
-                                EventMesh.publish(constants.EVENT.START_HEART)
-                                EventMesh.txt_log("auto start_bp:333")
-                            elif self.old_bp_time > 6:
-                                self.old_bp_time = 0
-                                
-                                EventMesh.publish("set_bp_state",0)#2代表后台进入测试
-                                # EventMesh.publish("stop_led_timer")#设置参数
-                                blood_data = get_autoblood_value()
-                                if blood_data == None:
-                                    blood_data[0] = 0
-                                    blood_data[1] = 0
-
-                                max_value = blood_data[0]
-                                min_value = blood_data[1]
-                                if max_value != 0 and min_value != 0:
-                                    EventMesh.publish(constants.PROTOCOL.BLOOD_SEND,[max_value,min_value])
-                                EventMesh.publish(constants.EVENT.STOP_HEART)
-                                EventMesh.txt_log("auto stop_bp:333")
-                        else:
-                            self.old_bp_time = 0
-                    else:
-                        self.old_bp_time = 0
-
-                    if get_bg_state != None:
-                        if get_bg_state == 3:
-                            self.old_bg_time+=1
-                            if self.old_bg_time == 1:
-                                EventMesh.publish("set_bg_state",3)#2代表后台进入测试
-                                # EventMesh.publish("set_hr_blood_led",1)
-                                EventMesh.publish(constants.EVENT.START_HEART)
-                                EventMesh.txt_log("auto start_bg:333")
-                            elif self.old_bg_time > 6:
-                                self.old_bg_time = 0
-                                EventMesh.publish("set_bg_state",0)#2代表后台进入测试
-                                EventMesh.publish(constants.EVENT.STOP_HEART)
-                                # EventMesh.publish("stop_led_timer")#设置参数
-                                bg_data = get_blood_sugar_value()
-                                if bg_data == None:
-                                    bg_data = 0
-                                if bg_data != 0:
-                                    EventMesh.publish(constants.PROTOCOL.BLOODGLUSOCE_SEND,bg_data)
-
-                                EventMesh.txt_log("auto stop_bp:333")
-                        else:
-                            self.old_bg_time = 0
-                    else:
-                        self.old_bg_time = 0
-
-                    
-                    if get_temp_state != None:
-                        if get_temp_state == 3:#单次测量
-                            self.temp_one_state+=1
-                            if self.temp_one_state == 1:
-                                EventMesh.txt_log("auto start_temp:333")
-                                EventMesh.debug_log("AUTO one temp:2") 
-                                EventMesh.publish("set_temp_state",3)
-                                # EventMesh.publish("set_hr_blood_led",1)
-                                EventMesh.publish(constants.EVENT.START_TEMP)   
-                            elif self.temp_one_state > 3:
-                                self.temp_one_state = 0
-                                temp = EventMesh.publish(constants.EVENT.GET_TEMP) 
-                                temp = self.optimize_temp(temp)
-                                
-                                EventMesh.publish("set_temp_state",0)
-                                tmp_f_tmp = 0
-                                tmp_d_tmp = 0
-                                if str(temp).find(".") != -1:
-                                    tmp_f = str(temp).split('.')[0] 
-                                    tmp_f_tmp = int(tmp_f)
-                                    
-                                    tmp_d = str(temp).split('.')[1][:1]
-                                    tmp_d_tmp = int(tmp_d)
-                                else:
-                                    tmp_f_tmp = temp
-                                    
-                                if temp != None:
-                                    if temp != 0:
-                                        EventMesh.publish(constants.PROTOCOL.TEMP_SEND,[tmp_f_tmp,tmp_d_tmp])
-                                EventMesh.publish(constants.EVENT.STOP_TEMP)
-                                EventMesh.txt_log("auto start_temp:333")
-
-
-        
-                    
-                    # EventMesh.debug_log("get_temp_time:{} self.temp_one_state:{}".format(get_temp_time,self.temp_one_state))
-                    if get_temp_time != None:#定时测量体温
-                        if get_temp_time > 0:
-                            if get_temp_state != None:
-                                get_temp_state  = EventMesh.publish("get_temp_state")
-                                if get_temp_state == 0 or get_temp_state == 2:
-                                    if (time_tmp-self.temp_timeSecond) >= get_temp_time:#大于一个周期的时间,重新赋值
-                                        self.temp_state = 0
-                                        self.temp_timeSecond = time_tmp
-
-                                    if (time_tmp-self.temp_timeSecond) == 0 and self.temp_state == 0:#一开始就测量 测量一分钟停止测量体温
-                                        self.temp_state = 1
-                                        EventMesh.publish("set_temp_state",2)
-                                        # EventMesh.publish("set_hr_blood_led",1)
-                                        EventMesh.debug_log("AUTO temp:") 
-                                        EventMesh.txt_log("auto START_temp:1")
-                                        EventMesh.publish(constants.EVENT.START_TEMP)
-
-                                    elif (time_tmp-self.temp_timeSecond) >= 30 and self.temp_state == 1 and get_temp_state == 2:
-                                        self.temp_state = 0
-                                        EventMesh.txt_log("auto stop_temp:1")
-                                        EventMesh.publish("set_temp_state",0)
-                                        temp = EventMesh.publish(constants.EVENT.GET_TEMP) 
-                                        temp = self.optimize_temp(temp)
-                                        
-                                        tmp_f_tmp = 0
-                                        tmp_d_tmp = 0
-                                        if str(temp).find(".") != -1:
-                                            tmp_f = str(temp).split('.')[0] 
-                                            tmp_f_tmp = int(tmp_f)
-                                            
-                                            tmp_d = str(temp).split('.')[1][:1]
-                                            tmp_d_tmp = int(tmp_d)
-                                        else:
-                                            tmp_f_tmp = temp
-                                            
-                                        if temp != None:
-                                            if temp != 0:
-                                                EventMesh.publish(constants.PROTOCOL.TEMP_SEND,[tmp_f_tmp,tmp_d_tmp])
-                                        EventMesh.publish(constants.EVENT.STOP_TEMP)
-
-                                else:
-                                    self.temp_state = 0
-                                    self.old_temp_time = 0
-                        else:
-                            temp_state  = EventMesh.publish("get_temp_state") 
-                            if temp_state == 2:
-                                EventMesh.publish("set_temp_state",0)#2代表后台进入测试
-                                # EventMesh.publish("stop_led_timer")#设置参数
-                                EventMesh.txt_log("auto wear stop_temp:2 ")
-                                EventMesh.publish(constants.EVENT.STOP_TEMP)
-                            self.temp_state = 0
-                            self.temp_timeSecond = 0
-                            self.old_temp_time = 0
-
-
-
-                    hr_time = EventMesh.publish("get_time_hr")#获取时间是否大于0
-                    if hr_time !=  None:
-                        self.mearsure_btn = int(hr_time[0])
-                        self.mearsure_timer = int(hr_time[1])
-
-                        if self.mearsure_btn != None and self.mearsure_timer != None:
-                            
-                            if self.mearsure_btn >= 1 and self.mearsure_timer > 0:#开关打开并且时间大于0就可以测试血糖
-                                get_hr_state = EventMesh.publish("get_hr_state")#心率
-                                get_spo2_state = EventMesh.publish("get_spo2_state")#血氧
-                                get_bp_state  = EventMesh.publish("get_bp_state")#血压
-                                get_bg_state  = EventMesh.publish("get_bg_state")#血糖
-                                # print("state hr",get_hr_state,get_spo2_state,get_bp_state,get_bg_state)
-                                if (get_bg_state == 0 and get_spo2_state == 0 and get_bp_state == 0) and  (get_hr_state == 2 or get_hr_state == 0):#心率血压血氧不在测试就测试血糖自动测量
-                                    if (time_tmp-self.hr_timeSecond) >= self.mearsure_timer:#大于一个周期的时间,保存的时间戳时间 1678 0 1678 30 1678 
-                                        self.hr_timeSecond = time_tmp
-                                        self.HR_Onestate = 0
-                                    # print("time_tmp hr",time_tmp,self.hr_timeSecond,time_tmp-self.hr_timeSecond,self.mearsure_timer,self.HR_Onestate)
-                                    if (time_tmp - self.hr_timeSecond) == 0 and self.HR_Onestate == 0:
-                                        self.HR_Onestate = 1
-                                        EventMesh.txt_log("auto START_hr:1")
-                                        EventMesh.publish("set_hr_state",2)#2代表后台进入测试
-                                        # EventMesh.publish("set_hr_blood_led",1)
-                                        EventMesh.publish(constants.EVENT.START_HEART)
-                                        
-                                    elif (time_tmp - self.hr_timeSecond) >= 60 and self.HR_Onestate == 1 and get_hr_state == 2:
-                                        self.HR_Onestate = 0
-                                        EventMesh.publish("set_hr_state",0)#2代表后台进入测试
-                                        EventMesh.debug_log("stop debug3")
-                                        EventMesh.txt_log("auto stop_hr:1")
-                                        EventMesh.publish(constants.EVENT.STOP_HEART)
-                                        heart_value = EventMesh.publish(constants.EVENT.GET_HEART)
-                                        EventMesh.debug_log("heart_value:{}".format(heart_value))
-                                        # heart_value = 60+urandom.randint(0,10)
-                                        if heart_value >= 50 and heart_value != None:
-                                            EventMesh.publish(constants.PROTOCOL.HEART_SEND,heart_value)#上传心率数据
-                                        #获取心率数据上传数据app
-                                        EventMesh.debug_log("STOP_HEART:")
-                                        
-                                else:
-                                    self.HR_Onestate = 0
-                            else:
-                                self.hr_timeSecond = 0
-                                self.HR_Onestate = 0
-                                hr_state = EventMesh.publish("get_hr_state")#心率
-                                if hr_state == 2:
-                                    EventMesh.publish("set_hr_state",0)#2代表后台进入测试
-                                    EventMesh.debug_log("33stop debug3")
-                                    # EventMesh.publish("stop_led_timer")#设置参数
-                                    EventMesh.publish(constants.EVENT.STOP_HEART)
-                                    EventMesh.txt_log("auto wear stop_hr:2 ")
-
-                    get_spo2time = EventMesh.publish("get_spo2_time")#血压自动测试
-                    # print("get_spo2time",get_spo2time)
-                    if get_spo2time != None:#血压时间不为0
-                        spo2_on = int(get_spo2time[0])
-                        spo2_time = int(get_spo2time[1])
-                        if spo2_on != 0 and spo2_time != 0:
-                            get_hr_state = EventMesh.publish("get_hr_state")
-                            get_spo2_state = EventMesh.publish("get_spo2_state")
-                            get_bp_state  = EventMesh.publish("get_bp_state")
-                            get_bg_state  = EventMesh.publish("get_bg_state")
-                            # print("state bg2",get_hr_state,get_spo2_state,get_bp_state,get_bg_state)
-                            if (get_hr_state == 0 and get_bp_state == 0 and get_bg_state == 0) and (get_spo2_state == 2 or get_spo2_state == 0):#心率血压血氧不在测试就测试血糖自动测量
-                                if (time_tmp-self.spo2_timeSecond) >= spo2_time:#大于一个周期的时间,保存的时间戳时间 1678 0 1678 30 1678 
-                                    self.spo2_timeSecond = time_tmp
-                                    self.spo2auto_state = 0
-                                # print("time_tmp spo2",time_tmp,self.spo2_timeSecond,time_tmp-self.spo2_timeSecond,self.bg_timer,self.bpauto_state)
-                                if (time_tmp - self.spo2_timeSecond) == 0 and self.spo2auto_state == 0:
-                                    self.spo2auto_state = 1
-                                    EventMesh.debug_log("START_spo2:auto")
-                                    EventMesh.txt_log("auto START_spo2:1")
-                                    EventMesh.publish("set_spo2_state",2)#2代表后台进入测试
-                                    EventMesh.publish(constants.EVENT.START_BLOOD_OXYGEN)#K开血氧
-                                    
-                                elif (time_tmp - self.spo2_timeSecond) >= 60 and self.spo2auto_state == 1 and get_spo2_state == 2:
-                                    EventMesh.publish("set_spo2_state",0)#2代表后台进入测试
-                                    self.spo2auto_state = 0
-                                    EventMesh.publish(constants.EVENT.STOP_BLOOD_OXYGEN)
-                                    spo2_value = EventMesh.publish(constants.EVENT.GET_BLOOD_OXYGEN)
-                                    if spo2_value > 85 and spo2_value != None:
-                                        EventMesh.publish(constants.PROTOCOL.OXYGEN_SEND,spo2_value)
-                                    EventMesh.txt_log("auto stop_spo2:1")
-                                
-                            else:
-                                self.spo2auto_state = 0
-                        else:
-                            self.spo2_timeSecond = 0
-                            self.spo2auto_state = 0
-                            spo2_state = EventMesh.publish("get_spo2_state")#心率
-                            if spo2_state == 2:
-                                EventMesh.publish("set_spo2_state",0)#2代表后台进入测试
-                                EventMesh.debug_log("spo2 stop debug3")
-                                EventMesh.txt_log("auto wear stop_spo2:2 ")
-                                EventMesh.publish(constants.EVENT.STOP_BLOOD_OXYGEN)
-
-
-                    get_bptime = EventMesh.publish("get_bp_time")#血压自动测试
-                    # print("get_bptime",get_bptime)
-                    if get_bptime != None:#血压时间不为0
-                        bp_on = int(get_bptime[0])
-                        bp_time = int(get_bptime[1])
-                        if bp_on != 0 and bp_time != 0:
-                            get_hr_state = EventMesh.publish("get_hr_state")
-                            get_spo2_state = EventMesh.publish("get_spo2_state")
-                            get_bp_state  = EventMesh.publish("get_bp_state")
-                            get_bg_state  = EventMesh.publish("get_bg_state")
-                            # print("state bg2",get_hr_state,get_spo2_state,get_bp_state,get_bg_state)
-                            
-                            if (get_hr_state == 0 and get_spo2_state == 0 and get_bg_state == 0) and (get_bp_state == 2 or get_bp_state == 0):#心率血压血氧不在测试就测试血糖自动测量
-                                if (time_tmp-self.bp_timeSecond) >= bp_time:#大于一个周期的时间,保存的时间戳时间 1678 0 1678 30 1678 
-                                    self.bp_timeSecond = time_tmp
-                                    self.bpauto_state = 0
-                                # print("time_tmp bp",time_tmp,self.bp_timeSecond,time_tmp-self.bp_timeSecond,self.bg_timer,self.bpauto_state)
-                                if (time_tmp - self.bp_timeSecond) == 0 and self.bpauto_state == 0:
-                                    self.bpauto_state = 1
-                                    EventMesh.debug_log("START_bp:auto")
-                                    EventMesh.txt_log("auto START_bp:1")
-                                    EventMesh.publish("set_bp_state",2)#2代表后台进入测试
-                                    # EventMesh.publish("set_hr_blood_led",1)
-                                    EventMesh.publish(constants.EVENT.START_HEART)
-                                    
-                                elif (time_tmp - self.bp_timeSecond) >= 60 and self.bpauto_state == 1 and get_bp_state == 2:
-                                    self.bpauto_state = 0
-                                    EventMesh.publish("set_bp_state",0)#2代表后台进入测试
-                                    blood_data = get_autoblood_value()
-                                    if blood_data == None:
-                                        blood_data[0] = 0
-                                        blood_data[1] = 0
-
-                                    max_value = blood_data[0]
-                                    min_value = blood_data[1]
-                                    if max_value != 0 and min_value != 0:
-                                        EventMesh.publish(constants.PROTOCOL.BLOOD_SEND,[max_value,min_value])
-                                    EventMesh.publish(constants.EVENT.STOP_HEART)
-                                    EventMesh.txt_log("auto stop_bp:1")
-                                    
-                            else:
-                                self.bpauto_state = 0
-                        else:
-                            self.bp_timeSecond = 0
-                            self.bpauto_state = 0
-                            bp_state = EventMesh.publish("get_bp_state")#心率
-                            if bp_state == 2:
-                                EventMesh.publish("set_bp_state",0)#2代表后台进入测试
-                                EventMesh.debug_log("bp stop debug3")
-                                EventMesh.txt_log("auto wear stop_bp:2 ")
-                                # EventMesh.publish("stop_led_timer")#设置参数
-                                EventMesh.publish(constants.EVENT.STOP_HEART)
-
-
-
-                    bg_time = EventMesh.publish("get_bgauto_time")
-                    if bg_time != None:
-                    
-                        bg_btn = int(bg_time[0])
-                        bg_timer = int(bg_time[1]) 
-                        # print("state bg2",self.bg_btn,self.bg_timer)
-                        if bg_btn >= 1 and bg_timer > 0:#开关打开并且时间大于0就可以测试血糖
-                            get_hr_state = EventMesh.publish("get_hr_state")
-                            get_spo2_state = EventMesh.publish("get_spo2_state")
-                            get_bp_state  = EventMesh.publish("get_bp_state")
-                            get_bg_state  = EventMesh.publish("get_bg_state")
-                            # print("state bg2",get_hr_state,get_spo2_state,get_bp_state,get_bg_state)
-                            
-                            if (get_hr_state == 0 and get_spo2_state == 0 and get_bp_state == 0) and (get_bg_state == 2 or get_bg_state == 0):#心率血压血氧不在测试就测试血糖自动测量
-                                if (time_tmp-self.bg_timeSecond) >= bg_timer:#大于一个周期的时间,保存的时间戳时间 1678 0 1678 30 1678 
-                                    self.bg_timeSecond = time_tmp #1780 
-                                    self.BG_state = 0
-                                # print("time_tmp bg",time_tmp,self.bg_timeSecond,time_tmp-self.bg_timeSecond,bg_timer,self.BG_state)
-                                if (time_tmp - self.bg_timeSecond) == 0 and self.BG_state == 0:
-                                    EventMesh.debug_log("START_bg:1")
-                                    EventMesh.txt_log("auto START_bg:1")
-                                    EventMesh.publish("set_bg_state",2)#2代表后台进入测试
-                                    # EventMesh.publish("set_hr_blood_led",1)
-                                    EventMesh.publish(constants.EVENT.START_HEART)
-                                    self.BG_state = 1
-                                elif (time_tmp - self.bg_timeSecond) >= 60 and self.BG_state == 1 and get_bg_state == 2:
-                                    self.BG_state = 0
-                                    EventMesh.publish("set_bg_state",0)#2代表后台进入测试
-                                    # EventMesh.publish("stop_led_timer")#设置参数
-                                    EventMesh.txt_log("auto stop_bg:1")
-                                    EventMesh.debug_log("stop bgdebug3")
-                                    EventMesh.publish(constants.EVENT.STOP_HEART)
-                                    bgdata = get_blood_sugar_value()
-                                    if bgdata == None:
-                                        bgdata = 0
-                                    if bgdata != 0:
-                                        EventMesh.debug_log("bgdata",bgdata)
-                                        EventMesh.publish(constants.PROTOCOL.BLOODGLUSOCE_SEND,bgdata)#上传心率数据
-                                    
-                            else:
-                                
-                                self.BG_state = 0
-                        else:
-                            bg_state  = EventMesh.publish("get_bg_state") 
-                            if bg_state == 2:
-                                EventMesh.publish("set_bg_state",0)#2代表后台进入测试
-                                # EventMesh.publish("stop_led_timer")#设置参数
-                                EventMesh.debug_log("bg stop bgdebug3")
-                                EventMesh.txt_log("auto wear stop_bg:2 ")
-                                EventMesh.publish(constants.EVENT.STOP_HEART)
-                            self.bg_timeSecond = 0
-                            self.BG_state = 0
-
-
-
-
-
-                else:
-                    self.old_temp_time = 0
-                    self.old_time = 0
-                    # self.hr_timeSecond = time_tmp
-                    self.HR_Onestate = 0
-                    self.HR_OneTime = 0
-                    self.HR_state = 0
-                    self.old_time = 0    
-                    self.old_bp_time = 0
-                    self.old_hr_time = 0
-                    self.old_spo2_time = 0
-                    self.set_hsenor_crt = 0
-                    self.old_bg_time = 0
-                    # self.bg_timeSecond = time_tmp
-                    self.BG_state = 0
-                    # self.temp_timeSecond = time_tmp
-
-                    # self.bp_timeSecond = time_tmp
-                    self.bpauto_state = 0
-
-                    # self.spo2_timeSecond = time_tmp
-                    self.spo2auto_state = 0
-
-                    self.temp_state = 0
-                    self.temp_one_state = 0
-
-
-            else:
-                self.old_temp_time = 0
-                self.old_time = 0
-                # self.hr_timeSecond = time_tmp
-                self.HR_Onestate = 0
-                self.HR_OneTime = 0
-                self.HR_state = 0
-                self.old_time = 0    
-                self.old_bp_time = 0
-                self.old_hr_time = 0
-                self.old_spo2_time = 0
-                self.set_hsenor_crt = 0
-                self.old_bg_time = 0
-                # self.bg_timeSecond = time_tmp
-
-                self.BG_state = 0
-                # self.temp_timeSecond = time_tmp
-
-                # self.bp_timeSecond = time_tmp
-                self.bpauto_state = 0
-
-                # self.spo2_timeSecond = time_tmp
-                self.spo2auto_state = 0
-
-                self.temp_state = 0
-                self.temp_one_state = 0
-
-                get_hr_state = EventMesh.publish("get_hr_state")
-                get_spo2_state = EventMesh.publish("get_spo2_state")
-                get_bp_state  = EventMesh.publish("get_bp_state")
-                get_bg_state  = EventMesh.publish("get_bg_state")
-                if get_hr_state != None and get_spo2_state != None and get_bp_state != None and get_bg_state != None:
-                    if get_hr_state > 1:
-                        EventMesh.txt_log("auto stop_hr:44")
-                        EventMesh.publish("set_hr_state",0)#2代表后台进入测试,定时测心率 1ui界面测试洗心率 
-                        # if get_hr_state == 3:
-                        #     EventMesh.publish("stop_led_timer")#设置参数
-                        EventMesh.debug_log("stop debug8")
-                        if WEAR == 1:
-                            heart_value = EventMesh.publish(constants.EVENT.GET_HEART)
-                            if heart_value >= 50 and heart_value != None:
-                                EventMesh.publish(constants.PROTOCOL.HEART_SEND,heart_value)#上传心率数据
-                        EventMesh.publish(constants.EVENT.STOP_HEART) 
-                    elif get_spo2_state > 1:
-                        EventMesh.txt_log("auto stop_spo2:44")
-                        EventMesh.publish("set_spo2_state",0)#2代表后台进入测试
-                        # if get_spo2_state == 3:
-                        #     EventMesh.publish("stop_led_timer")#设置参数
-                        if WEAR == 1:
-                            spo2_value = EventMesh.publish(constants.EVENT.GET_BLOOD_OXYGEN)
-                            if spo2_value > 85 and spo2_value != None:
-                                EventMesh.publish(constants.PROTOCOL.OXYGEN_SEND,spo2_value)
-                        EventMesh.publish(constants.EVENT.STOP_BLOOD_OXYGEN)
-                        EventMesh.debug_log("stop debug13")
-                    elif get_bp_state > 1:
-                        EventMesh.txt_log("auto stop_bp:44")
-                        EventMesh.publish("set_bp_state",0)#2代表后台进入测试
-                        # if get_bp_state == 3:
-                        #     EventMesh.publish("stop_led_timer")#设置参数
-                        if WEAR == 1:
-                            blood_data = get_autoblood_value()
-                            if blood_data == None:
-                                blood_data[0] = 0
-                                blood_data[1] = 0
-
-                            max_value = blood_data[0]
-                            min_value = blood_data[1]
-                            if max_value != 0 and min_value != 0:
-                                EventMesh.publish(constants.PROTOCOL.BLOOD_SEND,[max_value,min_value])
-                        EventMesh.publish(constants.EVENT.STOP_HEART)
-                        EventMesh.debug_log("stop debug14")
-                    elif get_bg_state > 1:
-                        EventMesh.txt_log("auto stop_bg:44")
-                        EventMesh.publish("set_bg_state",0)#2代表后台进入测试
-                        # if get_bg_state == 3:
-                        #     EventMesh.publish("stop_led_timer")#设置参数
-                        EventMesh.publish(constants.EVENT.STOP_HEART)
-                        if WEAR == 1:
-                            bgdata = get_blood_sugar_value()
-                            if bgdata == None:
-                                bgdata = 0
-                            if bgdata != 0:
-                                EventMesh.publish(constants.PROTOCOL.BLOODGLUSOCE_SEND,bgdata)#上传心率数据
-                        EventMesh.debug_log("stop debug15")
-                get_temp_state  = EventMesh.publish("get_temp_state")
-                if get_temp_state != None:
-                    if get_temp_state > 1:
-                        self.temp_one_state = 0
-                        self.temp_state = 0
-                        temp = EventMesh.publish(constants.EVENT.GET_TEMP)       
-                        temp = self.optimize_temp(temp)
-                        EventMesh.txt_log("auto stop_temp:44")
-                        EventMesh.publish("set_temp_state",0)
-                        if WEAR == 1:
-                            tmp_f_tmp = 0
-                            tmp_d_tmp = 0
-                            if str(temp).find(".") != -1:
-                                tmp_f = str(temp).split('.')[0] 
-                                tmp_f_tmp = int(tmp_f)
-                                
-                                tmp_d = str(temp).split('.')[1][:1]
-                                tmp_d_tmp = int(tmp_d)
-                            else:
-                                tmp_f_tmp = temp
-                                
-                            if temp != None:
-                                if temp != 0:
-                                    EventMesh.publish(constants.PROTOCOL.TEMP_SEND,[tmp_f_tmp,tmp_d_tmp])
-                        EventMesh.publish(constants.EVENT.STOP_TEMP)
-
-
-            hr_state = EventMesh.publish("get_hr_state")
-            spo2_state = EventMesh.publish("get_spo2_state")
-            temp_state  = EventMesh.publish("get_temp_state")
-            if hr_state != None or spo2_state != None or temp_state != None:#手动测试
-                auto_hr = EventMesh.publish("get_start_measure_time")#设置开始测量的时间戳时间
-                if auto_hr == None:
-                    auto_hr = 0
-                if hr_state == 1:
-                    if auto_hr != 0:
-                        self.auto_hr_count+=1
-                        if  self.auto_hr_count > 6:
-                            self.auto_hr_count = 0
-                            EventMesh.publish("set_hr_state",0)#0代表g关闭测试
-                            EventMesh.debug_log("stop debug7")
-                            EventMesh.publish(constants.EVENT.STOP_HEART)
-                            heart_value = EventMesh.publish(constants.EVENT.GET_HEART)
-                            if heart_value >= 50 and heart_value != None:
-                                EventMesh.publish("play_hr_value",heart_value)
-                                # EventMesh.publish("set_history_hr_value",heart_value)
-                                EventMesh.publish(constants.PROTOCOL.HEART_SEND,heart_value)#上传心率数据
-
-                                blood_data = get_autoblood_value()
-                                if blood_data == None:
-                                    blood_data[0] = 0
-                                    blood_data[1] = 0
-
-                                max_value = blood_data[0]
-                                min_value = blood_data[1]
-                                if max_value != 0 and min_value != 0:
-                                    EventMesh.publish(constants.PROTOCOL.BLOOD_SEND,[max_value,min_value])
-
-                            else:
-                                EventMesh.publish("play_hr_value",0) 
-                        else :
-                            if WEAR != 1:
-                                EventMesh.publish("set_hr_state",0)#0代表g关闭测试
-                                EventMesh.debug_log("stop debug7")
-                                EventMesh.publish(constants.EVENT.STOP_HEART)                               
-                                EventMesh.publish("play_hr_value",0) 
-                                
-                else:
-                    self.auto_hr_count = 0
-                    
-
-                auto_spo2 = EventMesh.publish("get_start_measure_time")#设置开始测量的时间戳时间
-                if auto_spo2 == None:
-                    auto_spo2 = 0
-                if spo2_state == 1:#手动测试血氧
-                    if auto_spo2 != None:
-                        if auto_spo2 != 0:
-                            self.auto_spo2_count+=1
-                            if self.auto_spo2_count > 6:
-                                self.auto_spo2_count = 0
-                                EventMesh.publish("set_spo2_state",0)#0代表g关闭测试
-                                EventMesh.debug_log("stop spo2 debug7")
-                                EventMesh.publish(constants.EVENT.STOP_BLOOD_OXYGEN)
-                                spo2_value = EventMesh.publish(constants.EVENT.GET_BLOOD_OXYGEN)
-                                if spo2_value > 85 and spo2_value != None:
-                                    EventMesh.publish("play_spo2_value",spo2_value)
-                                    EventMesh.publish("set_old_spo2_data",spo2_value)
-                                    EventMesh.publish(constants.PROTOCOL.OXYGEN_SEND,spo2_value)
-                                else:
-                                    EventMesh.publish("play_spo2_value",0)
-                            
-                            else:
-                                if WEAR != 1:
-                                    EventMesh.publish("set_spo2_state",0)#0代表g关闭测试
-                                    EventMesh.debug_log("stop debug8")
-                                    EventMesh.publish(constants.EVENT.STOP_BLOOD_OXYGEN)                               
-                                    EventMesh.publish("play_spo2_value",0) 
-                                    
-                else:
-                    self.auto_spo2_count = 0
-
-                if temp_state == 1:#手动测试体温
-                    auto_temp = EventMesh.publish("get_start_temp_measure_time")#设置开始测量的时间戳时间
-                    if auto_temp == None:
-                        auto_temp = 0
-                    if auto_temp != None:
-                        if auto_temp != 0:
-                            self.auto_temp_count += 1
-                            if self.auto_temp_count > 6:
-                                self.auto_temp_count = 0
-                                EventMesh.debug_log("体温测量结束")
-                                temp = EventMesh.publish(constants.EVENT.GET_TEMP)       
-                                temp = self.optimize_temp(temp)
-                                EventMesh.debug_log("temp",temp)
-                                EventMesh.publish("set_temp_state",0)
-                                tmp_f_tmp = 0
-                                tmp_d_tmp = 0
-                                if str(temp).find(".") != -1:
-                                    tmp_f = str(temp).split('.')[0] 
-                                    tmp_f_tmp = int(tmp_f)
-                                    
-                                    tmp_d = str(temp).split('.')[1][:1]
-                                    tmp_d_tmp = int(tmp_d)
-                                else:
-                                    tmp_f_tmp = temp
-                                    
-                                if temp != None:
-                                    if temp != 0:
-                                        # EventMesh.publish("set_history_temp_value",temp)
-                                        EventMesh.publish("play_temp_value",temp)#播放体温数值
-                                        EventMesh.publish(constants.PROTOCOL.TEMP_SEND,[tmp_f_tmp,tmp_d_tmp])
-                                    else:
-                                        # EventMesh.publish("set_history_temp_value",0)
-                                        EventMesh.publish("play_temp_value",0)#播放体温数值
-                                
-                                EventMesh.publish(constants.EVENT.STOP_TEMP)
-
-                            else :
-                                if WEAR  != 1:
-                                    EventMesh.publish("set_temp_state",0)#0代表g关闭测试
-                                    EventMesh.debug_log("stop debug9")
-                                    EventMesh.publish(constants.EVENT.STOP_TEMP)                               
-                                    EventMesh.publish("play_temp_value",0) 
-                                    
-                else:
-                    self.auto_temp_count = 0
-
-            EventMesh.publish("play_unread_wechat_infor")#每10s检测是否有未读语音数据
-
-            usb_state = EventMesh.publish("get_usb")#
-            
-            # EventMesh.publish("set_led_time_arg",[1,2,20*11,led_mode.FLASH_LIGHT_RED,20,10,led_mode.OTHER_MEASURE_MODE])#測量成功
-            if battery[0] == '1':
-                # EventMesh.debug_log("battery[1]",battery[1])
-                if self.vbat_full_flag <= 120:
-                    self.vbat_full_flag+=10
-                    if self.vbat_full_flag == 60:#开机检测一次如果是充电标识为1就不再提示
-                        if usb_state != 1:
-                            EventMesh.publish("set_usb",1)#
-                else:
-                    if battery[1] >= 100:
-                        if self.charge_full_count == 0:#充电已满
-                            EventMesh.publish("set_usb",3)#
-                            EventMesh.debug_log("charge R_CHARGE_full")
-                            self.charge_full_count = 1
-                    
-            else:
-                self.charge_full_count = 0
-                low_power = battery[1]
-                if low_power <= 5:#小于5%红色灯慢闪
-                    EventMesh.publish("set_led_time_arg",[1,2,20*11,led_mode.FLASH_LIGHT_RED,20,10,led_mode.OTHER_MEASURE_MODE])#測量成功
-                    # EventMesh.publish("set_led_time_arg",[1000,400,52,led_mode.FLASH_LIGHT_RED,led_mode.DEFAULT_LONG_LIGHT_MODE,led_mode.OTHER_MEASURE_MODE])#開始測量
-
-            
-            self.normal_alarm()
-            #喝水提醒
-            self.drink_alarm()
-            #该吃药了
-            self.medicine_alarm()
-            #该起床了
-            self.wakeup_alarm()
-            #该睡觉了
-            self.sleep_alarm()
-            #该回家了
-            self.home_alarm()
-            #该休息了
-            self.reset_alarm()
-
-
-            if self.alarm_flag == 0:
-                self.alarm_flag = 1
-                EventMesh.publish("set_rtc_alarm")
-
-            EventMesh.publish("video_no_network")
-
-        def clear_usb_flag(self,event,msg):
-            self.charge_full_count = 0
-        #普通闹钟
-        def normal_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.normal_oldtotalmin",self.normal_oldtotalmin,cur_total_min,self.alarm_flag)
-            if self.normal_oldtotalmin == 0:
-                self.normal_oldtotalmin = cur_total_min #549
-            if self.normal_oldtotalmin != cur_total_min: #上次响过的闹钟分钟数不等于当前的分钟数据需要清零否则下一个不会响铃
-                if self.normal_flag == 1:
-                    self.normal_flag = 0
-                    self.normal_count = 0
-            normal_alarm = []
-            normal_alarm = EventMesh.publish("get_storage_config","normal_alarm")
-            # EventMesh.debug_log("sleep info2",sleep,cur_total_min)
-            if self.normal_flag == 1:#表示闹钟响过清除标志
-                self.normal_count+=1
-                if self.normal_count > 6:
-                    self.normal_count = 0
-                    self.normal_flag = 0
-            if normal_alarm != None:
-                if len(normal_alarm) != 0 and normal_alarm != []:
-                    j = 0
-                    for i in range(len(normal_alarm)):
-                        # EventMesh.debug_log("normal_alarm normal_alarm 33",normal_alarm,j)
-                        normalalarm_hour = normal_alarm[j]["hour"]
-                        normalalarm_min = normal_alarm[j]["min"]
-                        normalalarm_day = normal_alarm[j]["day"]
-                        normalalarm_enale = normal_alarm[j]["enable"]
-                        normalalarm_totalmin = int(normalalarm_hour)*60+int(normalalarm_min)
-                        # EventMesh.debug_log("wake alarm",normalalarm_hour,sleep_min,sleep_day,sleep_enale,sleep_totalmin,week)
-                        if normalalarm_day == []:#单次闹钟只响一次
-                            if normalalarm_enale != 0:
-                                if cur_total_min > normalalarm_totalmin:
-                                    normal_alarm.pop(j)
-                                    self.normal_count = 0
-                                    self.normal_flag  = 0 
-                                    j=0
-                                    # EventMesh.debug_log("wakeup wakeup dayu",sleep,j)
-                                    EventMesh.publish("set_storage_config",["normal_alarm",normal_alarm])#删除之后重新保存
-                                    # sleep = EventMesh.publish("get_storage_config","sleep_alarm")#删除之后重新保存
-                                    continue
-                                else:
-                                    if normalalarm_totalmin == cur_total_min and self.normal_flag == 0:#14:00
-                                        self.normal_count = 0
-                                        self.normal_flag  = 0    
-                                        normal_alarm.pop(j)
-                                        # EventMesh.debug_log("wakeup wakeup1",sleep,j)
-                                        EventMesh.publish("set_storage_config",["normal_alarm",normal_alarm])#删除之后重新保存
-                                        EventMesh.publish("OPEN_ALARM_RING")                                                                                                                                            
-                                        break
-                        else:
-                            if normalalarm_enale != 0 and (week in normalalarm_day):#记录响过的时间分钟数
-                                if normalalarm_totalmin == cur_total_min and self.normal_flag == 0:#14:00
-                                    self.normal_flag  = 1
-                                    self.normal_count = 0
-                                    self.normal_oldtotalmin = normalalarm_totalmin
-                                    EventMesh.publish("OPEN_ALARM_RING")#                                                                                                                                                  
-                                    break
-                        j+=1
-
-
-        #喝水提醒
-        def drink_alarm(self):
-            date_tmp = utime.localtime()
-            time_tmp = utime.mktime(date_tmp)
-        
-            if self.drink_time == 0:
-                self.drink_time = time_tmp
-            
-            on = EventMesh.publish("get_storage_config","drink_on")
-            time = EventMesh.publish("get_storage_config","drink_time")
-            # print("drink info2",on,time)
-            if on != None and time != None:
-                if on != 0 and time != 0:
-                    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:
-                self.drink_time = 0
-
-        #吃药提醒
-        def medicine_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)
-            # print("self.medicine_oldtotalmin",self.medicine_oldtotalmin,cur_total_min,self.alarm_flag)
-            if self.medicine_oldtotalmin == 0:
-                self.medicine_oldtotalmin = cur_total_min #549
-            if self.medicine_oldtotalmin != cur_total_min: #上次响过的闹钟分钟数不等于当前的分钟数据需要清零否则下一个不会响铃
-                if self.medicine_flag == 1:
-                    self.medicine_flag = 0
-                    self.medicine_count = 0
-            medicine = EventMesh.publish("get_storage_config","medicine")
-            # print("medicine info2",medicine,cur_total_min)
-            if self.medicine_flag == 1:#表示闹钟响过清除标志
-                self.medicine_count+=1
-                if self.medicine_count > 6:
-                    self.medicine_count = 0
-                    self.medicine_flag = 0
-            if medicine != None:
-                if len(medicine) != 0 and medicine != []:
-                    for i in range(len(medicine)):
-                        medicine_hour = medicine[i]["hour"]
-                        medicine_min = medicine[i]["min"]
-                        medicine_day = medicine[i]["day"]
-                        medicine_enale = medicine[i]["enable"]
-                        medicine_totalmin = int(medicine_hour)*60+int(medicine_min)
-                        # print("medicine alarm",medicine_hour,medicine_min,medicine_day,medicine_enale,medicine_totalmin,week)
-                        if medicine_day == []:
-                            if medicine_enale != 0:
-                                if medicine_totalmin == cur_total_min and self.medicine_flag == 0:#14:00
-                                    self.medicine_count = 0
-                                    self.medicine_flag  = 1    
-                                    self.medicine_oldtotalmin = medicine_totalmin#记录响过的时间分钟数
-                                    # print("medicine alarm1")
-                                    EventMesh.publish("medicine_alarm_event")#该吃药了                                                                                                                                              
-                                    break
-                        else:
-                            if medicine_enale != 0 and (week in medicine_day):#记录响过的时间分钟数
-                                if medicine_totalmin == cur_total_min and self.medicine_flag == 0:#14:00
-                                    self.medicine_flag  = 1
-                                    self.medicine_count = 0
-                                    self.medicine_oldtotalmin = medicine_totalmin
-                                    # print("medicine alarm2",)
-                                    EventMesh.publish("medicine_alarm_event")#该吃药了                                                                                                                                                   
-                                    break
-        #该起床了
-        def wakeup_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.wakeup_oldtotalmin",self.wakeup_oldtotalmin,cur_total_min,self.alarm_flag)
-            if self.wakeup_oldtotalmin == 0:
-                self.wakeup_oldtotalmin = cur_total_min #549
-            if self.wakeup_oldtotalmin != cur_total_min: #上次响过的闹钟分钟数不等于当前的分钟数据需要清零否则下一个不会响铃
-                if self.wakeup_flag == 1:
-                    self.wakeup_flag = 0
-                    self.wakeup_count = 0
-            wakeup = []
-            wakeup = EventMesh.publish("get_storage_config","wakeup_alarm")
-            # EventMesh.debug_log("wakeup info2",wakeup,cur_total_min)
-            if self.wakeup_flag == 1:#表示闹钟响过清除标志
-                self.wakeup_count+=1
-                if self.wakeup_count > 6:
-                    self.wakeup_count = 0
-                    self.wakeup_flag = 0
-            if wakeup != None:
-                if len(wakeup) != 0 and wakeup != []:
-                    j = 0
-                    for i in range(len(wakeup)):
-                        wakeup_hour = wakeup[j]["hour"]
-                        wakeup_min = wakeup[j]["min"]
-                        wakeup_day = wakeup[j]["day"]
-                        wakeup_enale = wakeup[j]["enable"]
-                        wakeup_totalmin = int(wakeup_hour)*60+int(wakeup_min)
-                        # EventMesh.debug_log("wake alarm",wakeup_hour,wakeup_min,wakeup_day,wakeup_enale,wakeup_totalmin,week)
-                        if wakeup_day == []:#单次闹钟只响一次
-                            if wakeup_enale != 0:
-                                if cur_total_min > wakeup_totalmin:
-                                    self.wakeup_count = 0
-                                    self.wakeup_flag  = 0    
-                                    wakeup.pop(j)
-                                    j=0#每次删除都从0开始遍历
-                                    # EventMesh.debug_log("wakeup wakeup1 dayu",wakeup,j)
-                                    EventMesh.publish("set_storage_config",["wakeup_alarm",wakeup])
-                                    continue
-                                else:
-                                    if wakeup_totalmin == cur_total_min and self.wakeup_flag == 0:#14:00
-                                        self.wakeup_count = 0
-                                        self.wakeup_flag  = 0    
-                                        wakeup.pop(j)
-                                        EventMesh.debug_log("wakeup wakeup1",wakeup,j)
-                                        EventMesh.publish("set_storage_config",["wakeup_alarm",wakeup])
-                                        EventMesh.publish("wakeup_alarm_event")#该吃药了                                                                                                                                              
-                                        break
-                        else:
-                            if wakeup_enale != 0 and (week in wakeup_day):#记录响过的时间分钟数
-                                if wakeup_totalmin == cur_total_min and self.wakeup_flag == 0:#14:00
-                                    self.wakeup_flag  = 1
-                                    self.wakeup_count = 0
-                                    self.wakeup_oldtotalmin = wakeup_totalmin
-                                    EventMesh.publish("wakeup_alarm_event")#该吃药了                                                                                                                                                   
-                                    break
-                        j+=1
-
-
-        #该睡觉了
-        def sleep_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.sleep_oldtotalmin",self.sleep_oldtotalmin,cur_total_min,self.alarm_flag)
-            if self.sleep_oldtotalmin == 0:
-                self.sleep_oldtotalmin = cur_total_min #549
-            if self.sleep_oldtotalmin != cur_total_min: #上次响过的闹钟分钟数不等于当前的分钟数据需要清零否则下一个不会响铃
-                if self.sleep_flag == 1:
-                    self.sleep_flag = 0
-                    self.sleep_count = 0
-            sleep = []
-            sleep = EventMesh.publish("get_storage_config","sleep_alarm")
-            # EventMesh.debug_log("sleep info2",sleep,cur_total_min)
-            if self.sleep_flag == 1:#表示闹钟响过清除标志
-                self.sleep_count+=1
-                if self.sleep_count > 6:
-                    self.sleep_count = 0
-                    self.sleep_flag = 0
-            if sleep != None:
-                if len(sleep) != 0 and sleep != []:
-                    j = 0
-                    count = int(len(sleep))
-                    for i in range(len(sleep)):
-                        # EventMesh.debug_log("wakeup wakeup 33",sleep,j)
-                        sleep_hour = sleep[j]["hour"]
-                        sleep_min = sleep[j]["min"]
-                        sleep_day = sleep[j]["day"]
-                        sleep_enale = sleep[j]["enable"]
-                        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 == []:#单次闹钟只响一次
-                            if sleep_enale != 0:
-                                if cur_total_min > sleep_totalmin:
-                                    sleep.pop(j)
-                                    self.sleep_count = 0
-                                    self.sleep_flag  = 0 
-                                    j=0
-                                    # EventMesh.debug_log("wakeup wakeup dayu",sleep,j)
-                                    EventMesh.publish("set_storage_config",["sleep_alarm",sleep])#删除之后重新保存
-                                    # sleep = EventMesh.publish("get_storage_config","sleep_alarm")#删除之后重新保存
-                                    continue
-                                else:
-                                    if sleep_totalmin == cur_total_min and self.sleep_flag == 0:#14:00
-                                        self.sleep_count = 0
-                                        self.sleep_flag  = 0    
-                                        sleep.pop(j)
-                                        # EventMesh.debug_log("wakeup wakeup1",sleep,j)
-                                        EventMesh.publish("set_storage_config",["sleep_alarm",sleep])#删除之后重新保存
-                                        EventMesh.publish("sleep_alarm_event")#该吃药了                                                                                                                                              
-                                        break
-                        else:
-                            if sleep_enale != 0 and (week in sleep_day):#记录响过的时间分钟数
-                                if sleep_totalmin == cur_total_min and self.sleep_flag == 0:#14:00
-                                    self.sleep_flag  = 1
-                                    self.sleep_count = 0
-                                    self.sleep_oldtotalmin = sleep_totalmin
-                                    EventMesh.publish("sleep_alarm_event")#该吃药了                                                                                                                                                   
-                                    break
-                        j+=1
-
-
-        #该回家了
-        def home_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.home_oldtotalmin",self.home_oldtotalmin,cur_total_min,self.alarm_flag)
-            if self.home_oldtotalmin == 0:
-                self.home_oldtotalmin = cur_total_min #549
-            if self.home_oldtotalmin != cur_total_min: #上次响过的闹钟分钟数不等于当前的分钟数据需要清零否则下一个不会响铃
-                if self.home_flag == 1:
-                    self.home_flag = 0
-                    self.home_count = 0
-            home = ''
-            home = EventMesh.publish("get_storage_config","home_alarm")
-            # EventMesh.debug_log("sleep info2",sleep,cur_total_min)
-            if self.home_flag == 1:#表示闹钟响过清除标志
-                self.home_count+=1
-                if self.home_count > 6:
-                    self.home_count = 0
-                    self.home_flag = 0
-            if home != None:
-                if len(str(home)) != 0 and str(home) != '':
-                    # EventMesh.debug_log("home home 33",home)
-                    home_hour = int(str(home).split(":")[0])
-                    home_min = int(str(home).split(":")[1])
-                    
-                    home_totalmin = int(home_hour)*60+int(home_min)
-                    if home_totalmin == cur_total_min and self.home_flag == 0:#14:00
-                        self.home_flag  = 1
-                        self.home_count = 0
-                        self.home_oldtotalmin = home_totalmin
-                        EventMesh.publish("home_alarm_event")#该回家了                                                                                                                                                   
-
-
-        
-        #该休息了
-        def reset_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.reset_oldtotalmin",self.reset_oldtotalmin,cur_total_min,self.alarm_flag)
-            if self.reset_oldtotalmin == 0:
-                self.reset_oldtotalmin = cur_total_min #549
-            if self.reset_oldtotalmin != cur_total_min: #上次响过的闹钟分钟数不等于当前的分钟数据需要清零否则下一个不会响铃
-                if self.reset_flag == 1:
-                    self.reset_flag = 0
-                    self.reset_count = 0
-            reset_alarm = []
-            reset_alarm = EventMesh.publish("get_storage_config","reset_alarm")
-            # EventMesh.debug_log("reset_alarm info2",len(reset_alarm),cur_total_min)
-            if self.reset_flag == 1:#表示闹钟响过清除标志
-                self.reset_count+=1
-                if self.reset_count > 6:
-                    self.reset_count = 0
-                    self.reset_flag = 0
-            if reset_alarm != None:
-                if len(str(reset_alarm)) != 0 and str(reset_alarm) != []:
-                    for i in range(len(reset_alarm)):
-                        # print("i",i)
-                        start_hour = int(reset_alarm[i]["start_hour"])
-                        start_min = int(reset_alarm[i]["start_min"])
-
-                        end_hour = int(reset_alarm[i]["end_hour"])
-                        end_min = int(reset_alarm[i]["end_min"])
-
-                        # EventMesh.debug_log("reset_alarm home 33",reset_alarm)
-                        
-                        start_totalmin = int(start_hour)*60+int(start_min)
-                        end_totalmin = int(end_hour)*60+int(end_min)
-
-                        if start_totalmin == cur_total_min and self.reset_flag == 0:#14:00
-                            self.reset_flag  = 1
-                            self.reset_count = 0
-                            self.reset_oldtotalmin = start_totalmin
-                            EventMesh.publish("reset_alarm_event")#该休息了     
-                            break
-
-                        if end_totalmin == cur_total_min and self.reset_flag == 0:
-                            self.reset_flag  = 1
-                            self.reset_count = 0
-                            self.reset_oldtotalmin = end_totalmin
-                            EventMesh.publish("reset_end_alarm_event")#休息结束了     
-                            break
-                                                                                                                                                                    
-
-        def clear_normal_alarm(self,event,msg):#普通闹钟清除标志
-            self.normal_flag = 0
-            self.normal_count = 0
-            self.normal_oldtotalmin = 0
-
-        def clear_reset_alarm(self,event,msg):#休息清除标志
-            self.reset_flag = 0
-            self.reset_count = 0
-            self.reset_oldtotalmin = 0
-
-        def clear_home_alarm(self,event,msg):#回家清除标志
-            self.home_flag = 0
-            self.home_count = 0
-            self.home_oldtotalmin = 0
-
-
-        def clear_medicine_alarm(self,event,msg):#吃药清除标志
-            self.medicine_count = 0
-            self.medicine_flag  = 0
-            self.medicine_oldtotalmin = 0
-        
-
-        def clear_wakeup_alarm(self,event,msg):#起床标识
-            self.wakeup_flag = 0
-            self.wakeup_count = 0
-            self.wakeup_oldtotalmin = 0
-
-        def clear_sleep_alarm(self,event,msg):#睡觉标识
-
-            self.sleep_flag = 0
-            self.sleep_count = 0
-            self.sleep_oldtotalmin = 0
-
-            
-
-
-        def get_sim_Status(self, event, msg):
-            return sim.getStatus()
-        def get_device_ope(self, event, msg):
-            """
-            获取设备运营商信息
-            :param event:
-            :param msg:
-            :return: 运营商
-            """
-            net_ope_map = {
-                "UNICOM": "中国联通HD",
-                "CMCC": "中国移动HD",
-                "CT": "中国电信HD"
-            }
-            """获取运营商"""
-            try:
-                short_eons = net.operatorName()[1]
-            except Exception:
-                return "无"
-            return net_ope_map.get(short_eons, None)
-
-        def get_signal(self, event=None, msg=None):
-            """
-            获取信号事件
-            :param event:
-            :param msg:
-            :return: int 类型
-            """
-            return net.csqQueryPoll()
-
-        def get_time_bucket(self, time):
-            if time < 12:
-                return '上午'
-            else:
-                return '下午'
-
-        def get_week(self, week):
-            if week == 1:
-                return '一'
-            elif week == 2:
-                return '二'
-            elif week == 3:
-                return '三'
-            elif week == 4:
-                return '四'
-            elif week == 5:
-                return '五'
-            elif week == 6:
-                return '六'
-            elif week == 7 or week == 0:
-                return '日'
-
-        def get_time(self, event=None, msg=None):
-            """
-            获取时间事件
-            :param event:
-            :param msg:
-            :return: HH:MM 格式
-            """
-            rtc_time = self.rtc.datetime()
-            
-            date = ("%d月%d日" % (rtc_time[1], rtc_time[2]))
-            year = ("%04d年" % (rtc_time[0]))
-            week = ("星期%s"%(self.get_week(rtc_time[3])))
-            week_data = rtc_time[3]
-            time = [rtc_time[4], rtc_time[5]]
-            time_quantum = ("%s" % (self.get_time_bucket(rtc_time[4])))
-            
-            result = [time, time_quantum, date , week,year,week_data]
-            #时分,上午下午,日期,星期,年 星期
-            return result
-
-        def get_step_count(self, event=None, msg=None):
-            """
-            获取步数
-            """
-            # print("11111:{}".format(EventMesh.publish("get_storage_config","clear_state3")))
-
-            tmp = 0
-            step =[0,0,0,0]
-
-            # EventMesh.debug_log("x:%d,y:%d,z:%d tmp %d",XYZ[0],XYZ[1],XYZ[2],tmp)
-            step[0]= tmp 
-            step[1] = 0
-            step[2] = 1
-            step[3] = 2
-            # print("1222:{}".format(EventMesh.publish("get_storage_config","clear_state3")))
-            return step
-
-        def get_ic_cid(self, event, msg):
-            """
-            获取ic cid事件
-            :param event:
-            :param msg:
-            :return: str ic cid
-            """
-            return sim.getIccid()
-
-        def get_phone_num(self, event, msg):
-            """
-            获取电话号码事件
-            :param event:
-            :param msg:
-            :return: str number
-            """
-            return sim.getPhoneNumber()
-
-        def get_battery(self, event=None, msg=None):
-            """
-            获取电池事件,暂时没支持
-            :param event:
-            :param msg:
-            :return:
-            """
-
-            charge_state = '0'
-            if self.get_usb_state() == 1:
-                charge_state = '1'
-            else:
-                charge_state = '0'
-
-            #temp = Power.getVbatt()
-            temp = EventMesh.publish("get_curr_battery_level")
-            vbat = EventMesh.publish("get_battery",temp)
-            if vbat == None:
-                vbat = 100
-            # EventMesh.debug_log("vbat",vbat)
-            # if temp != None :
-            #     if temp <= 3505:
-            #         vbat = 0 
-            #     elif temp <= 3699:
-            #         vbat = 20 #"E:/vbat_20.jpg"
-            #     elif temp <= 3772:
-            #         vbat = 40 #"E:/vbat_40.jpg"
-            #     elif temp <= 3882:
-            #         vbat = 60 #"E:/vbat_60.jpg"
-            #     elif temp <= 4070:
-            #         vbat = 80 #"E:/vbat_80.jpg"
-            #     elif temp <= 4200:
-            #         vbat = 90 #
-            #     else:
-            #         vbat = 100 #"E:/vbat_100.jpg"
-            # else:
-            #     vbat = 100
-
-            result = [charge_state, vbat]
-
-            return result
-        #Set the current average battery level
-        def set_curr_battery_level(self, event=None, msg=None):
-            self.curr_battery_level = msg
-        
-        def get_curr_battery_level(self, event=None, msg=None):
-            return self.curr_battery_level
-
-        def get_device_fw_version(self, *args):
-            '''
-            获取设备固件版本号
-            '''
-            fw_version = modem.getDevFwVersion()
-            if isinstance(fw_version, str):
-                return fw_version
-            return "--"
-
-        def get_standby_time(self, *args):
-            '''
-            获取设备单次开机待机时间
-            '''
-            time_msg = utime.time()
-            d = int(
-                time_msg / 86400)  # The int call removes the decimals.  Conveniently, it always rounds down.  int(2.9) returns 2 instead of 3, for example.
-            time_msg -= (
-                    d * 86400)  # This updates the value of x to show that the already counted seconds won't be double counted or anything.
-            h = int(time_msg / 3600)
-            time_msg -= (h * 3600)
-            m = int(time_msg / 60)
-            time_msg -= (m * 60)
-            s = time_msg
-            result = "{}天{}小时{}分".format(d, h, m)
-            return result
-
-        def set_key(self, topic, msg):
-            self.key = msg["value"]
-        def get_key(self, topic, msg):
-            return self.key
-
-        def get_imei(self, topic, msg):
-            if not self.imei:
-                self.imei = modem.getDevImei()
-            # self.imei = "876226002021444"#视频通话测试账号
-            # self.imei = "826226524724963"#视频通话测试账号
-            # self.imei = "860132060128634" #860132060128634
-            return self.imei
-
-        def get_cid(self, topic, msg):
-            return self.cid
-
-        def set_cid(self, topic, msg):
-            self.cid = msg["value"]
-
-        def get_imsi(self, topic, msg):
-            if not self.imei:
-                self.imei = sim.getImsi()
-            return self.imsi
-
-        def get_password(self, topic, msg):
-            return self.password
-
-        def set_password(self, topic, msg):
-            self.password = msg["value"]
-
-        def set_ping(self, topic, msg):
-            self.PING = msg
-        def get_ping(self, topic, msg):
-            return self.PING
-
-        def set_connect(self, topic, msg):
-            #EventMesh.debug_log("set_connect:{}".format(msg))
-            self.connect = msg
-        def get_connect(self, topic, msg):
-            return self.connect
-
-        def start_blood_oxygen(self, topic, msg):
-            EventMesh.debug_log("start_blood_oxygen!!!")
-
-
-        def start_heart(self, topic, msg):
-            EventMesh.debug_log("start_heart!!!")
-
-
-        def stop_blood_oxygen(self, topic, msg):
-            EventMesh.debug_log("stop_blood_oxygen!!!")
-
-
-        def stop_heart(self, topic, msg):
-            EventMesh.debug_log("stop_heart!!!")
-
-
-        def get_blood_oxygen(self, topic, msg):
-
-            return 0
-
-        def get_heart(self, topic, msg):
-
-            return 0
-        
-        def get_wear(self, topic, msg):
-            return 0
-        
-        def get_Hsensor(self, topic, msg):
-            return 0
-        
-        def Hsensor_set_sleep(self, topic, msg):
-            pass
-
-        def start_temp(self, topic, msg):
-            EventMesh.debug_log("start_temp!!!!!!!")
-            WHO_AM_I = bytearray([0x01, 0])
-            I2C_SLAVE_ADDR = 0x49
-            #I2C_SLAVE_ADDR = 0x48
-            r_data = bytearray(2)
-            data = bytearray([0x61A0, 0])   # 唤醒
-            return self.i2c0.write(I2C_SLAVE_ADDR, WHO_AM_I, 1, data, 2)
-        def stop_temp(self, topic, msg):
-            EventMesh.debug_log("stop_temp!!!!!!!")
-            WHO_AM_I = bytearray([0x01, 0])
-            I2C_SLAVE_ADDR = 0x49
-            #I2C_SLAVE_ADDR = 0x48
-            r_data = bytearray(2)
-            data = bytearray([0x60A0, 0])   #休眠
-            return self.i2c0.write(I2C_SLAVE_ADDR, WHO_AM_I, 1, data, 2)
-            
-        def get_temp(self, topic, msg):
-            WHO_AM_I = bytearray([0x00, 0])
-            I2C_SLAVE_ADDR = 0x49
-            #I2C_SLAVE_ADDR = 0x48
-            r_data = bytearray(2)
-            self.i2c0.read(I2C_SLAVE_ADDR, WHO_AM_I, 1, r_data, 2, 0)
-            #EventMesh.debug_log("temp_data:{}".format(r_data))
-            temp_s = ((r_data[0]<<8) | (r_data[1]))>>4
-            #EventMesh.debug_log("temp_s:{}".format(temp_s))
-            temp_data = temp_s * 0.0625
-            EventMesh.debug_log("temp_data:{}".format(temp_data))
-            return temp_data
-    
-                
-
-        def sim_slot_get(self, topic=None, msg=None):
-            return sim.getCurSimid()
-
-        def sim_slot_switch(self, topic=None, slot=None):
-            """
-            sim 卡槽切换
-            :param topic:
-            :param slot:
-            :return: 切换sim卡卡槽  0 切换成功, 1 无需切换, -1 切换失败
-            """
-            if self.sim_slot_get() == slot:
-                return 1
-            else:
-                return sim.switchCard(slot)
-
-        def usb_event_cb(self, state):
-            status = state
-
-            if status == 1:#插入USB
-                EventMesh.debug_log("charge R_CHARGE_in")
-                EventMesh.publish("clear_usb_flag")
-                EventMesh.publish("set_usb", 1)#
-                pass
-            elif status == 0:#拨出usbs
-                EventMesh.publish("clear_usb_flag")
-                EventMesh.publish("set_usb", 2)#
-                EventMesh.debug_log("charge R_CHARGE_out")
-
-                
-                
-
-        
-
-        def get_usb_state(self):
-            state = self.usb.getStatus()
-            if state == -1:
-                state = 0
-            return state
-        
-
-    def wifiScan_cb(args):
-            EventMesh.publish(constants.EVENT.WIFIINFO, args)
-            wifiScan.control(0)
-
-    class LocationManager(Abstract):
-
-        def __init__(self):
-            self.gps = None
-            #self.match = GPSMatch()
-            self.timer_read_GPS_info = osTimer()
-            self.wifi_data = []
-            self.gps_data  = {}
-            self.cell_data = []
-            self.location_timer_count = 0
-            self.location_check_data_timer_count = 0
-            self.GGA_count = 0
-            self.RMC_A_count = 0
-            self.location_type = 0 #定位类型,0:正常定位,有gps数据或60秒关闭;1:测试模式,只有发CLOSE_LOCATION消息才关闭
-            self.location_flag = 0
-            self.start_location_flag = 0
-            self.location_thread_id  = 0
-            self.location_queue = Queue(100)
-            self.lpm_fd = None
-            self.start_agps = 0
-            read_data = EventMesh.publish("get_storage_config","isOpenGNSS")#获取是否打开GNSS
-            if read_data != None:
-                self.isOpenGNSS = read_data
-            else:#默认关闭GNSS
-                self.isOpenGNSS = "1"
-                EventMesh.publish("set_storage_config",["isOpenGNSS",self.isOpenGNSS])
-
-            self.isOpenGNSS = EventMesh.publish("get_storage_config","isOpenGNSS")
-            if self.isOpenGNSS == None:
-                self.isOpenGNSS = "1"
-            if self.isOpenGNSS == "1":
-                if quecgnss.init() == -1:
-                    self.isOpenGNSS = "0"
-                    EventMesh.publish("set_storage_config",["isOpenGNSS",self.isOpenGNSS])
-                else:
-                    quecgnss.gnssEnable(0)
-        @staticmethod
-        def get_date():
-            return "{:04d}-{:02d}-{:02d}".format(*utime.localtime()[0:3])
-
-        @staticmethod
-        def get_time():
-            return "{:02d}:{:02d}:{:02d}".format(*utime.localtime()[3:6])
-
-        def post_processor_after_instantiation(self):
-            # _gps_cfg = {
-            #     "UARTn": UART.UART1,
-            #     "buadrate": 115200,
-            #     "databits": 8,
-            #     "parity": 0,
-            #     "stopbits": 1,
-            #     "flowctl": 0,
-            #     "PowerPin": Pin.GPIO2,
-            #     "StandbyPin": Pin.GPIO3,
-            #     "BackupPin": None,
-            #     "gps_mode": 0x01,
-            # }
-            # self.gps = GPS(**_gps_cfg)
-            # self.gps.power_switch(0)#关闭GPS
-            EventMesh.subscribe(constants.EVENT.GPSOPEN, self.gps_open)
-            EventMesh.subscribe(constants.EVENT.GPSCLOSE, self.gps_close)
-            EventMesh.subscribe(constants.EVENT.START_LOCATION, self.start_location)
-            EventMesh.subscribe(constants.EVENT.START_LOCATION_TEST, self.start_location_test)
-            EventMesh.subscribe(constants.EVENT.WIFIINFO, self.WIFI_INFO)
-            EventMesh.subscribe(constants.EVENT.WIFISCANOPEN,self.WIFI_scan_open)
-            EventMesh.subscribe(constants.EVENT.CLOSE_LOCATION,self.close_location)
-            EventMesh.subscribe("get_location_flag",self.get_location_flag)
-            
-            #EventMesh.subscribe(constants.EVENT.GPSCLOSE, self.gps_close)
-        def get_location_flag(self, event, msg):
-            return self.location_flag
-        def start_location(self, event, msg):
-            self.location_queue.put(msg)#测试类型入队
-            self.gps_data = {}
-            self.wifi_data = []
-            self.cell_data = []
-            self.location_timer_count = 0
-            self.GSV_sig_ok_count = 0
-            EventMesh.debug_log("start_location:{}".format(msg))
-            if( self.location_flag == 1):
-                return
-            _thread.stack_size((9+5)*1024)
-            self.location_thread_id  = _thread.start_new_thread(self.location_thread, ())
-            _thread.stack_size(8*1024)
-            
-            self.location_flag = 1
-            self.timer_read_GPS_info.start(1000, 1, self.location_timer)
-            #self.gps_open(event, msg)
-
-
-        def start_location_test(self, event, msg):
-            EventMesh.debug_log("start_location_test")
-            
-            self.location_type = 1
-            if( self.location_flag == 1):
-                return
-            _thread.stack_size((9+4)*1024)
-            self.location_thread_id  = _thread.start_new_thread(self.location_thread, ())
-            _thread.stack_size(8*1024)
-        
-            self.location_timer_count = 0
-            self.location_flag = 1
-            #self.gps_open(event, msg)
-            self.location_type = 1
-            self.timer_read_GPS_info.start(1000, 1, self.location_timer)
-    
-
-        def close_location(self, event, msg):
-            self.location_flag = 0
-            self.location_type = 0
-            self.timer_read_GPS_info.stop()
-
-            
-
-        def WIFI_INFO(self, event, msg):
-            self.wifi_data = msg
-            # EventMesh.debug_log("WIFI_INFO:")
-            # EventMesh.debug_log([msg[0],msg])
-
-        def WIFI_scan_open(self, event, msg):
-            #EventMesh.debug_log("WIFI_scan_open")
-            
-
-            if wifiScan.getState() == False :
-                self.wifi_data = []
-                wifiScan.control(1)
-                wifiScan.setCfgParam(6, 2, 5,  0)  #设置WiFi参数,10秒上层,两轮,最多6个,6秒底层,PS优先
-                wifiScan.setCallback(wifiScan_cb) #注册回调函数
-                wifiScan.asyncStart()
-                #EventMesh.debug_log("wifiScan.asyncStart")
-            else :
-                EventMesh.debug_log("WIFI_scan_open:error1") 
-        def gps_open(self, event, msg):
-            if self.isOpenGNSS == "1":
-                #EventMesh.debug_log("publish:gps_open")
-                #quecgnss.init()
-                quecgnss.gnssEnable(2)
-                #self.gps.__gps_nmea_data_clean()
-        def gps_close(self, event, msg):
-            if self.isOpenGNSS == "1":
-                quecgnss.gnssEnable(0)
-        def location_timer(self, *args, **kwargs):
-            
-            self.location_timer_count = self.location_timer_count +1
-            self.location_check_data_timer_count = self.location_check_data_timer_count+1
-
-        def Location_send(self, msg) :
-            EventMesh.debug_log("Location_send1")
-            if self.location_queue.empty() == True:
-                return
-            EventMesh.debug_log("Location_send2")
-            while True:
-                if self.location_queue.empty() == False:
-                    TYPE = self.location_queue.get()
-                    date = "{:04d}{:02d}{:02d},{:02d}{:02d}{:02d}".format(*utime.localtime()[0:6])
-                    date = date[2:]
-                    #date = "180916,025723"
-                    GPS_type = "V"
-                    latitude = "0.000000,N"
-                    longitude = "0.000000,E"
-                    speed = "0.00"
-                    direction = "0.0"
-                    high = "100.0"
-                    number = "0"
-                    precision = "24"
-                    if msg[0] :#有GPS数据
-                        GPS_type = "A"
-                        # 纬度
-                        latitude = msg[0]["latitude"]
-                        # 经度
-                        longitude = msg[0]["longitude"]
-                        # 速度
-                        speed = msg[0]["speed"]
-                        # 方向
-                        direction = "0"
-                        if msg[0]["direction"] :
-                            direction = msg[0]["direction"]
-                        # 高度
-                        high = msg[0]["high"]
-                        high_tmp = high.split(".")
-                        if len(high_tmp) >= 2 :
-                            high = "%s"%(high_tmp[0])
-                        # 讯号质量:搜索到的卫星数目
-                        number = msg[0]["number"]
-                        precision = msg[0]["precision"]
-                        #date = msg[0]["date"]
-                    
-                    #gsm 信号强度
-                    gsm_sig =  str((100//31)*EventMesh.publish("screen_get_sig"))
-                    # 电池电量百分比 
-                    bat_tmp = EventMesh.publish("screen_get_battery")
-                    battery_caption =  str(bat_tmp[1])
-                    #步数
-                    old_step = 0
-                    step = 0
-                    step = EventMesh.publish("get_old_step_value")
-                    if step != 0:
-                        tmp_data  = EventMesh.publish("get_storage_config","old_step_new")
-                        if tmp_data != None:
-                            old_step = tmp_data
-                        if old_step !=  step:
-                            EventMesh.publish("set_storage_config",["old_step",step])
-                            EventMesh.publish("set_storage_config",["old_step_new",step])
-                            
-                    old_step = step
-                    # step = str(EventMesh.publish(constants.EVENT.GET_STEP)[0])
-                    #翻转次数
-                    turn_count = "0"
-                    #终端状态
-                    state = "%08X"%(EventMesh.publish("get_dev_state"))
-                    #EventMesh.debug_log("TYPE:{}".format(TYPE))
-                    if type(TYPE) == list:#队列里的数据有终端状态,则用队里的终端状态
-                        if len(TYPE)>= 2 :
-                            state = "%08X"%(TYPE[1])
-                    
-                    EventMesh.debug_log("state:{}".format(state))
-                    #基站数据
-                    CELL_num = len(msg[2])
-                    CELL_data = "1," #时延
-                    if msg[2] != []:
-                        for CELL in msg[2] :
-                            if CELL[0] == 0 :
-                                CELL_data += "%X,"%(int(CELL[2])) #MCC
-                                CELL_data += str(CELL[3]) +","#MNC
-                                CELL_data += str(CELL[5]) +","#tac,区域码
-                                CELL_data += str(CELL[1]) +","#基站编号 CID
-                                CELL_data += str(int(CELL[7]+140)) +","#信号强度 rssi
-                            else :
-                                CELL_data += str(CELL[5]) +","#tac,区域码
-                                CELL_data += str(CELL[1]) +","#基站编号 CID
-                                CELL_data += str(int(CELL[7]+140)) +","#信号强度 rssi
-                        CELL_data = CELL_data[:(len(CELL_data)-1)]
-                    #WIFI数据
-                    WIFI_num = 0 
-                    WIFI_data = ""
-                    if msg[1] :
-                        WIFI_num = msg[1][0]
-                        i = 0
-                        for MAC in msg[1][1] :
-                            WIFI_data += "wifi%d,%s,%d,"%(i,str(MAC[0]),MAC[1])
-                            i += 1
-                        WIFI_data = WIFI_data[:(len(WIFI_data)-1)]
-                    WIFI_data = WIFI_data.lower()
-                    #send_data = "UD ,%s ,%s     ,%s       ,%s       ,%s   ,%s       ,%s  ,%s    ,%s     ,%s             ,%s  ,%s        ,%s   ,%d     ,%s       ,%d      ,%s"\
-                    #              %(date,GPS_type,latitude,longitude,speed,direction,high,number,gsm_sig,battery_caption,step,turn_count,state,CELL_num,CELL_data,WIFI_num,WIFI_data)
-                    #定位数据
-                    send_data = "%s,%s,%s"%(date,GPS_type,latitude)
-                    send_data += ",%s,%s,%s"%(longitude,speed,direction)
-                    send_data += ",%s,%s,%s"%(high,number,gsm_sig,)
-                    send_data += ",%s,%s,%s"%(battery_caption,step,turn_count)
-                    send_data += ",%s,%d,%s"%(state,CELL_num,CELL_data)
-                    send_data += ",%d,%s"%(WIFI_num,WIFI_data)
-                    send_data+=",%s"%(precision)
-                    #EventMesh.debug_log("Location_send2:{} q_size:{}".format(send_data,self.location_queue.size()))
-            
-                
-                    EventMesh.debug_log("Location_send3:{}:{}".format(TYPE,send_data))
-                    if type(TYPE) == list:
-                        EventMesh.publish(TYPE[0],send_data)
-                    else:
-                        EventMesh.publish(TYPE,send_data)
-                else :
-                    break
-
-        def GxGGA_latitude(self, gga_data):
-            """Parse latitude from GGA"""
-            if gga_data:
-                latitude_re = ure.search(r",[0-9]+\.[0-9]+,[NS],", gga_data)
-                if latitude_re:
-                    latitude = latitude_re.group(0)[1:-3]
-                    return str(float(latitude[:2]) + float(latitude[2:]) / 60)
-            return ""
-        def GxGGA_longitude(self, gga_data):
-            """Parse longitude from GGA"""
-            if gga_data:
-                longitude_re = ure.search(r",[0-9]+\.[0-9]+,[EW],", gga_data)
-                if longitude_re:
-                    longitude = longitude_re.group(0)[1:-3]
-                    return str(float(longitude[:3]) + float(longitude[3:]) / 60)
-            return ""
-
-        def GxGGA_altitude(self, gga_data):
-            """Parse altitude from GGA"""
-            if gga_data:
-                altitude_re = ure.search(r",-*[0-9]+\.[0-9]+,M,", gga_data)
-                if altitude_re:
-                    return altitude_re.group(0)[1:-3]
-            return ""
-        def location_thread(self):
-            
-            self.wifi_data = []
-            self.gps_data = {}
-            self.cell_data = []
-            gnss_r_data = []
-            self.GSV_sig_ok_count = 0
-            self.GSV_sig_very_ok_count = 0
-            self.GGA_count = 0
-            self.RMC_A_count = 0
-            # if self.start_agps == 1: #开启agps
-            #     self.start_agps = 0
-            #     quecgnss.configSet(2,1)
-            if self.lpm_fd == None:
-                self.lpm_fd = pm.create_wakelock("test_lock", len("test_lock"))
-            pm.wakelock_lock(self.lpm_fd)
-            EventMesh.debug_log("location_thread:1")
-            EventMesh.publish(constants.EVENT.GPSOPEN)
-            EventMesh.debug_log("location_thread:2")
-            #self.timer_read_GPS_info.start(1000, 1, self.location_timer)
-            EventMesh.debug_log("location_thread:3")
-            #utime.sleep_ms(1000)
-            self.location_timer_count = 0
-            #quecgnss.read(4096)#去掉第一次错误数据
-            #EventMesh.txt_log("START_LOCATION")
-            # pm.autosleep(0)#唤醒
-            # pm.sclkEx_set(0, 1, 5)
-            GSV_dict= {}
-            while self.location_flag == 1:
-                try :   
-                    
-                    match_gga_data = []
-                    #match_gsv_data = []
-                    gnss_r_data = []
-                    # if self.location_check_data_timer_count >= 3:
-                    #     pm.autosleep(0)#唤醒
-                    #     pm.sclkEx_set(0, 1, 5)
-                    if self.location_check_data_timer_count >= 1 :#3秒查一次基站数据和wifi数据
-                        self.location_check_data_timer_count = 0
-                        #EventMesh.debug_log(self.location_timer_count)
-                        GSV_dict= {}
-                        if self.isOpenGNSS == "1":                    
-                            #检查GNSS数据
-                            if ( self.gps_data == {} or self.location_type == 1) and quecgnss.get_state() == 2:
-
-                                pass
-                                tmp_ok_count = 0
-                                tmp_very_ok_count = 0
-                                gsv_data = quecgnss.get_gsv()
-                                rmc_data = quecgnss.get_rmc()
-                                gga_data = quecgnss.get_gga()
-                                vtg_data = quecgnss.get_vtg()
-                                # EventMesh.debug_log("gsv:{}".format(quecgnss.get_gsv()))
-                                # EventMesh.debug_log("gga:{}".format(quecgnss.get_gga()))
-                                # EventMesh.debug_log("rmc:{}".format(quecgnss.get_rmc()))
-                                # EventMesh.debug_log("vtg:{}".format(quecgnss.get_vtg())) 
-                                for i in range(len(gsv_data)) :
-                                    
-                                    if i % 2 == 0:
-                                        if i+1 >= len(gsv_data) :
-                                            # EventMesh.debug_log("gsv_data num error!!")
-                                            break
-                                        GSV_dict[gsv_data[i]] = gsv_data[i+1]
-                                        #EventMesh.debug_log("type:gsv_data{}".format(type(gsv_data[i+1])))
-                                        try:
-                                            #EventMesh.debug_log("gsv_tmp[i+3]:{}".format(gsv_tmp[i+3]))
-                                            if gsv_data[i+1] :
-                                                if (gsv_data[i+1])>=20:
-                                                    tmp_ok_count +=1   
-                                                if (gsv_data[i+1])>=30:
-                                                    tmp_very_ok_count +=1  
-                                                    
-                                        except Exception as e:
-                                            usys.print_exception(e)
-                                        
-                                if(tmp_ok_count > self.GSV_sig_ok_count ):
-                                    self.GSV_sig_ok_count = tmp_ok_count
-                                if(tmp_very_ok_count > self.GSV_sig_very_ok_count ):
-                                    self.GSV_sig_very_ok_count = tmp_very_ok_count
-                                match_rmc_data = rmc_data.split(",")
-                                if len (match_rmc_data)>3: #有rmc数据
-                                        if match_rmc_data[2] == 'A':    
-                                            match_gga_data = gga_data.split(",")
-                                            if len(match_gga_data) >4: #数据全
-                                                match_vtg_data = vtg_data.split(",")
-                                                gps_date = "%s,%s"%(match_rmc_data[9],match_rmc_data[1][:6])#日期
-                                                #gps_data_tmp = self.gps.read_coordinates(gnss_r_data[1])
-                                                latitude = "0,N" #纬度
-                                                latitude_tmp = str(self.GxGGA_latitude(gga_data)).split(".")
-                                                if len(latitude_tmp) >= 2 and len(latitude_tmp[1])>=5:
-                                                    latitude = "%s.%s"%(latitude_tmp[0],latitude_tmp[1][:6])
-                                                    latitude = "%s,%s"%(latitude,match_rmc_data[4] )
-
-                                                longitude = "0,E"#经度
-                                                longitude_tmp = str(self.GxGGA_longitude(gga_data)).split(".")
-                                                if len(longitude_tmp) >= 2 and len(longitude_tmp[1])>=5:
-                                                    longitude = "%s.%s"%(longitude_tmp[0],longitude_tmp[1][:6])
-                                                    longitude = "%s,%s"%(longitude,match_rmc_data[6] ) #match_rmc_data[6] + str(gnss_r_data[1])
-                                                
-                                                high = "0"#高度
-                                                high = str(self.GxGGA_altitude(gga_data))
-                                                number = "0"#可用卫星
-                                                precision = "5.8"#精度
-                                                if len(match_gga_data)>5 :
-                                                    if match_gga_data[7]:
-                                                        number = match_gga_data[7]
-                                                    if match_gga_data[8]:
-                                                        precision = match_gga_data[8]
-                                                direction = "249.5" #方向
-                                                speed = '0.00'    #速度    
-                                                if(len(match_vtg_data)>5 ):
-                                                    if match_vtg_data[1]:
-                                                        direction =  match_vtg_data[1]
-                                                    if match_vtg_data[7]:    
-                                                        speed =  match_vtg_data[7]
-                                                self.gps_data = {
-                                                    "latitude": latitude,
-                                                    "longitude": longitude,
-                                                    "high": high,
-                                                    "direction": direction,
-                                                    "speed": speed,
-                                                    "number": number, 
-                                                    "date":  gps_date,
-                                                    "precision":  precision
-                                                }
-    # ***********************************************************************************
-
-
-                    #检查wifi数据
-                    if self.wifi_data == [] or (self.wifi_data != [] and self.wifi_data[0] == 0):#and self.wifi_data[0] <= 0:
-                        EventMesh.publish(constants.EVENT.WIFISCANOPEN)
-                
-                    #检查基站数据
-                    if self.cell_data == []:   
-                        data_tmp = net.getCellInfo()
-                        if(len(data_tmp)>=2):
-                            for cell in data_tmp:
-                                if cell and cell[0][0] == 0 and len(cell[0]) > 1:
-                                    self.cell_data = cell
-                                    break
-
-                    if self.location_type == 1: #测试模式
-                        self.location_timer_count = 0
-                        
-                        EventMesh.publish("PUSH_LOCATION_DATA", [[self.gps_data,GSV_dict],self.wifi_data,self.cell_data]) 
-                        if self.gps_data  != {} : #发送数据 
-                            EventMesh.publish(constants.EVENT.CLOSE_LOCATION)#关闭定位
-                            self.location_queue.put(constants.PROTOCOL.UD_SEND)
-                            self.Location_send([self.gps_data,self.wifi_data,self.cell_data])
-                            
-
-                    elif self.location_type == 0: #正常模式     
-                        if self.gps_data  != {} or self.location_timer_count > 100: #or( self.wifi_data != [] and self.cell_data != []): 
-                            if self.location_queue.empty() == False:#有定位队列
-                                pass
-                                #EventMesh.txt_log("LOCATION timer:{} ok:{} very_ok:{}".format(self.location_timer_count,self.GSV_sig_ok_count))   
-                                #EventMesh.txt_log("LOCATION:timer:{} ok_count:{} ".format(self.location_timer_count,self.GSV_sig_ok_count))
-                            if self.gps_data  == {}: #定位超时,且信噪比多个大于30,下次启动agps
-                                if self.GSV_sig_very_ok_count > 3:#3个超30以上
-                                    self.start_agps = 1
-                                    #EventMesh.txt_log("open agps:{}".format(GSV_dict))
-                            #upload_time = EventMesh.publish("get_upload_data")    
-                            self.Location_send([self.gps_data,self.wifi_data,self.cell_data])
-                            #if upload_time > 200  : 
-                            EventMesh.publish(constants.EVENT.CLOSE_LOCATION)#关闭定位
-                            # else:   #定位间隔小于3分钟不关闭gps,不影响无信号判断
-                            #     self.location_timer_count = 0
-                            #     self.GSV_sig_ok_count = 0
-                                
-                            
-
-                            
-                        if (self.isOpenGNSS != "1" or (self.GSV_sig_ok_count <= 1 and self.location_timer_count > 20)) and self.wifi_data != [] and self.cell_data != [] : #超过40秒且信号大于30的不足3个
-                            EventMesh.publish(constants.EVENT.CLOSE_LOCATION)#关闭定位 
-                            EventMesh.debug_log("Location_send:CLOSE_LOCATION")  
-                            #EventMesh.txt_log("GSV_sig_ok_count<3:timer:{} ok_count:{} ".format(self.location_timer_count,self.GSV_sig_ok_count))
-                            self.Location_send([self.gps_data,self.wifi_data,self.cell_data])
-
-                
-                    
-                except Exception as e:
-                    usys.print_exception(e)
-                    EventMesh.txt_log("location_thread:ERROR:".format(e))
-                    #EventMesh.debug_log("location_thread:ERROR:{}".format(usys.print_exception(e)))
-                    EventMesh.debug_log("self.gps_data{},self.wifi_data{},self.cell_data{}".format(self.gps_data,self.wifi_data,self.cell_data))
-                    #self.Location_send([self.gps_data,self.wifi_data,self.cell_data])
-                    EventMesh.publish(constants.EVENT.CLOSE_LOCATION)#关闭定位 
-                utime.sleep_ms(500)
-
-            #self.timer_read_GPS_info.stop()
-            #self.gps.power_switch(0)
-            wifiScan.control(0)
-            EventMesh.publish(constants.EVENT.GPSCLOSE)
-            # if EventMesh.publish("get_lcd_state" ) == 0:#休眠的时候,恢复休眠
-            #     pm.autosleep(1)
-            #     pm.sclkEx_set(1, 1, 5)
-            if self.lpm_fd != None:
-                pm.wakelock_unlock(self.lpm_fd)
-            #pm.delete_wakelock(lpm_fd)
-            EventMesh.debug_log("CLOSE_LOCATION")
-            #EventMesh.txt_log("CLOSE_LOCATION")
-
-                    
-
-    class AddrBookManager(Abstract):
-        # 通讯录
-        def __init__(self):
-            self.read_phonebook = {}
-            self.check_json = 0
-            self.check_json = ql_fs.path_exists("/usr/static/storage_file/phonebook.json")
-
-            if self.check_json == True:
-                with open("/usr/static/storage_file/phonebook.json","r",encoding="utf-8") as fd:
-                    self.read_phonebook = ujson.load(fd)
-                    EventMesh.debug_log("读取电话本")
-
-        def post_processor_after_instantiation(self):
-            EventMesh.subscribe("get_phonebook_list", self.get)
-            EventMesh.subscribe("set_phonebook_list", self.set)
-            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_num", self.call_phonebook_num)
-
-        def get(self, event, msg):
-            self.check_json = ql_fs.path_exists("/usr/static/storage_file/phonebook.json")
-            return [self.check_json,self.read_phonebook]
-        
-        def call_phonebook_num(self, event, msg):
-            name = ''
-            key_tmp = ''
-            phone_num = int(msg)
-            if self.read_phonebook != {}:
-                if len(self.read_phonebook) >= phone_num:
-                    phonebook_keys = sorted(self.read_phonebook.keys())
-                    name = self.read_phonebook[phonebook_keys[phone_num-1]]
-                    key_tmp = phonebook_keys[phone_num-1]
-                    if len(name) != 0:
-                        EventMesh.publish("save_phonename",str(name))
-                        EventMesh.publish("save_phonenum",str(name))
-                        EventMesh.publish("dial_out_call_center_cb",str(name))#电话拨出去
-                    else:
-                        EventMesh.publish("dial_out_call_center_cb",None)#电话拨出去
-                else:
-                    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))
-
-        def call_phonebook_one_call(self, event, msg):
-            name = ''
-            key_tmp = ''
-            if self.read_phonebook != {}:
-                if len(self.read_phonebook) >= 1:
-                    phonebook_keys = sorted(self.read_phonebook.keys())
-                    name = self.read_phonebook[phonebook_keys[0]]
-                    key_tmp = phonebook_keys[0]
-                    if len(name) != 0:
-                        EventMesh.publish("save_phonename",str(name))
-                        EventMesh.publish("save_phonenum",str(name))
-                        EventMesh.publish("dial_out_call_center_cb",str(name))#电话拨出去
-                    else:
-                        EventMesh.publish("dial_out_call_center_cb",None)#电话拨出去
-                else:
-                    EventMesh.publish("dial_out_call_center_cb",None)#电话拨出去
-            else:
-                EventMesh.publish("dial_out_call_center_cb",None)#电话拨出去
-            EventMesh.debug_log("call_phonebook_one_call name:{} key_tmp:{} len:{}".format(name,key_tmp,len(self.read_phonebook)))
-
-        def call_phonebook_two_call(self, event, msg):
-            name = ''
-            key_tmp = ''
-            if self.read_phonebook != {}:
-                if len(self.read_phonebook) >= 2:
-                    phonebook_keys = sorted(self.read_phonebook.keys())
-                    name = self.read_phonebook[phonebook_keys[1]]
-                    key_tmp = phonebook_keys[1]
-                    if len(name) != 0:
-                        #voiceCall.callStart(str(name))
-                        EventMesh.publish("save_phonename",str(name))
-                        EventMesh.publish("save_phonenum",str(name))
-                        EventMesh.publish("dial_out_call_center_cb",str(name))#电话拨出去
-                    else:
-                        EventMesh.publish("dial_out_call_center_cb",None)#电话拨出去
-                    
-                else:
-                    EventMesh.publish("dial_out_call_center_cb",None)#电话拨出去
-            else:
-                EventMesh.publish("dial_out_call_center_cb",None)#电话拨出去
-                EventMesh.debug_log("call_phonebook_two_call name:{} key_tmp:{}".format(name,key_tmp))
-        
-        def call_phonebook_three_call(self, event, msg):
-            name = ''
-            key_tmp = ''
-            if self.read_phonebook != {}:
-                if len(self.read_phonebook) >= 3:
-                    phonebook_keys = sorted(self.read_phonebook.keys())
-                    name = self.read_phonebook[phonebook_keys[2]]
-                    key_tmp = phonebook_keys[2]
-                    if len(name) != 0:
-                        #voiceCall.callStart(str(name))
-                        EventMesh.publish("save_phonename",str(name))
-                        EventMesh.publish("save_phonenum",str(name))
-                        EventMesh.publish("dial_out_call_center_cb",str(name))#电话拨出去
-                    else:
-                        EventMesh.publish("dial_out_call_center_cb",None)#电话拨出去
-                    
-                else:
-                    EventMesh.publish("dial_out_call_center_cb",None)#电话拨出去
-            else:
-                EventMesh.publish("dial_out_call_center_cb",None)#电话拨出去
-            EventMesh.debug_log("call_phonebook_three_call name:{} key_tmp:{}".format(name,key_tmp))
-
-        def set(self, event, msg):
-            self.check_json = msg[0]
-            self.read_phonebook = msg[1]
-
-    import sms
-    class MsgManager(Abstract):
-        # 短信
-        def __init__(self):
-            self.msg_nums = 0
-            self.msg_detail = ""
-
-        def post_processor_after_instantiation(self):
-            EventMesh.subscribe("get_msg_nums", self.get_msg_nums)
-            # 可通过此push_addr_book_list主动推送
-            EventMesh.subscribe("get_msg_detail", self.get_msg_detail)
-
-        def get_msg_nums(self, event, msg):
-
-            self.msg_nums = sms.getMsgNums() 
-            EventMesh.debug_log("self.msg_nums {}:".format(self.msg_nums))
-            return self.msg_nums
-        
-        def get_msg_detail(self, event, msg):
-            
-            # self.msg_detail = sms.searchTextMsg(self.msg_nums)
-            # EventMesh.debug_log("self.msg_detai {}:".format(self.msg_detai))
-            return{
-                "小明":"有内鬼,停止交易",
-                "小红":"今晚十点一起吃饭"
-            }
-
-    class MsgdetailManager(Abstract):
-        def __init__(self):
-            self.level = 0
-            self.msg_name = ""
-            self.msg_content = ""
-
-        def post_processor_after_instantiation(self):
-            EventMesh.subscribe("save_msg_name", self.save_msg_name)
-            EventMesh.subscribe("save_msg_content", self.save_msg_content)
-            EventMesh.subscribe("get_msg_name", self.get_msg_name)
-            EventMesh.subscribe("get_msg_content", self.get_msg_content)
-
-        def save_msg_name(self, event, msg): 
-            self.msg_name = str(msg)
-            EventMesh.debug_log("save_msg_name:msg".format(msg))
-        
-        def save_msg_content(self, event, msg):
-            self.msg_content = str(msg)
-            EventMesh.debug_log("save_msg_content:msg".format(msg))
-        
-        def get_msg_content(self, event, msg):
-            return self.msg_content
-
-        def get_msg_name(self, event, msg):
-            return self.msg_name
-
-    class CallLogManager(Abstract):
-        # 通话记录
-        def __init__(self):
-            self.read_call_log = {}
-            self.check_json = ql_fs.path_exists("/usr/static/storage_file/Call_log.json")
-
-            if self.check_json == True:
-                with open("/usr/static/storage_file/Call_log.json","r",encoding="utf-8") as fd:
-                    self.read_call_log = ujson.load(fd)
-                    EventMesh.debug_log("读取通话记录")
-
-        def post_processor_after_instantiation(self):
-            EventMesh.subscribe("get_call_log_list", self.get)
-            EventMesh.subscribe("set_call_log_list", self.set)
-
-        def get(self, event, msg):
-            self.check_json = ql_fs.path_exists("/usr/static/storage_file/Call_log.json")
-            return [self.check_json,self.read_call_log]
-
-        def set(self, event, msg):
-            return
-            self.check_json = msg[0]
-            self.read_call_log = msg[1]
-            with open("/usr/static/storage_file/Call_log.json","w+",encoding="utf-8") as fd:
-                ujson.dump(self.read_call_log,fd)
-        # def call_usr(self,event,msg):
-        #     content = self.log[msg]
-        #     # 参数1 姓名  参数2  电话   参数3 1/主动呼叫  0别人呼叫
-        #     EventMesh.publish("call_in", [content[2], content[0], 1])
-
-
-
-    class PhoneCallingManager(Abstract):
-        def __init__(self):
-            self.phonenum = ""
-            self.phonename = ""
-
-        def post_processor_after_instantiation(self):
-            EventMesh.subscribe("save_phonenum", self.save_phonenum)
-            EventMesh.subscribe("get_phonenum", self.get_phonenum)
-            EventMesh.subscribe("get_phonename", self.get_phonename)
-            EventMesh.subscribe("save_phonename", self.save_phonename)
-
-        def get_phonename(self, event, msg): 
-            return self.phonename
-
-        def save_phonename(self, event, msg): 
-            self.phonename = str(msg)
-
-        def save_phonenum(self, event, msg): 
-            self.phonenum = str(msg)
-        
-        def get_phonenum(self, event, msg):
-            return self.phonenum
-
-    #获取心率 血氧 步数历史数据
-    class gethistoryDataManager(Abstract):
-        def __init__(self):
-            self.oldHr = 0
-            self.oldspo2 = 0
-            self.oldstep = 0
-            self.old_step = 0
-            self.read_histroy_hr_data = []
-            self.read_histroy_temp_data = []
-            self.read_histroy_spo2_data = []
-
-            oldHr  = EventMesh.publish("get_storage_config","old_hr")
-            if oldHr != None:
-                self.oldHr = oldHr  
-            old_spo2  = EventMesh.publish("get_storage_config","old_spo2")
-            if old_spo2 != None:
-                self.oldspo2 = old_spo2 
-            old_step  = EventMesh.publish("get_storage_config","old_step")    
-            if old_step != None:
-                self.oldstep = old_step
-
-
-            check_hr= ql_fs.path_exists("/usr/static/storage_file/history_hr.json")
-            if check_hr == True :
-                with open("/usr/static/storage_file/history_hr.json","r") as fd:#音频文件编号
-                    self.read_histroy_hr_data = ujson.load(fd)
-            
-            check_temp= ql_fs.path_exists("/usr/static/storage_file/history_temp.json")
-            if check_temp == True :
-                with open("/usr/static/storage_file/history_temp.json","r") as fd:#音频文件编号
-                    self.read_histroy_temp_data = ujson.load(fd)
-
-            check_spo2= ql_fs.path_exists("/usr/static/storage_file/history_spo2.json")
-            if check_spo2 == True :
-                with open("/usr/static/storage_file/history_spo2.json","r") as fd:#音频文件编号
-                    self.read_histroy_spo2_data = ujson.load(fd)
-            self.temp_value = 0
-            
-            # self.read_histroy_hr_data=[{"timeSec":16789890,"value":90},{"timeSec":16789888,"value":78},{"timeSec":16789688,"value":68},{"timeSec":16789898,"value":58},\
-            #                              {"timeSec":16789897,"value":88},{"timeSec":16789867,"value":77},{"timeSec":16789895,"value":70}]
-
-        def post_processor_after_instantiation(self):
-            EventMesh.subscribe("set_old_hr_data", self.save_hr_value)
-            EventMesh.subscribe("get_old_hr_data", self.get_hr_value)
-            EventMesh.subscribe("set_old_spo2_data", self.save_spo2_value)
-            EventMesh.subscribe("get_old_spo2_data", self.get_spo2_value)
-
-            EventMesh.subscribe("get_old_step_value", self.get_old_step_value)
-            EventMesh.subscribe("set_old_step_value", self.set_old_step_value)
-
-
-            EventMesh.subscribe("get_history_hr_value", self.get_history_hr_value)
-            EventMesh.subscribe("set_history_hr_value", self.set_history_hr_value)
-
-            EventMesh.subscribe("get_history_temp_value", self.get_history_temp_value)
-            EventMesh.subscribe("set_history_temp_value", self.set_history_temp_value)
-
-            EventMesh.subscribe("get_history_spo2_value", self.get_history_spo2_value)
-            EventMesh.subscribe("set_history_spo2_value", self.set_history_spo2_value)
-
-        
-
-        def get_history_spo2_value(self, event, msg): #近7次血氧历史数据统计显示
-            return self.read_histroy_spo2_data
-
-        def set_history_spo2_value(self, event, msg): 
-            pass
-
-
-
-        def get_history_temp_value(self, event, msg): #近7次体温历史数据统计显示
-            return self.read_histroy_temp_data
-
-        def set_history_temp_value(self, event, msg): 
-            self.temp_value = msg
-            if self.temp_value > 0:
-                # date_tmp = utime.localtime()
-                # time_tmp = utime.mktime(date_tmp)
-                # if len(self.read_histroy_temp_data) >= 7:
-                #     sort_new = {}
-                #     sort_new = sorted(self.read_histroy_temp_data, key = lambda i: i['timeSec'],reverse = False)#按照时间戳进行排序 去掉最旧的一次数据如果满了五十条
-                #     EventMesh.debug_log(sort_new)
-                #     for i in range(len(self.read_histroy_temp_data)-1):
-                #         sort_new[i] = sort_new[i+1]#0==1 1== 2 2== 3 3==4 4==5 5==6 6==7
-                #         self.read_histroy_temp_data[i] = sort_new[i]
-                #         pass
-                #     self.read_histroy_temp_data[6] = {"timeSec": time_tmp, "temp": self.temp_value}
-                # else:
-                #     self.read_histroy_temp_data.append({"timeSec": time_tmp, "temp": self.temp_value}) 
-
-                # with open("/usr/static/storage_file/history_temp.json","w",encoding="utf-8") as fd:
-                #     ujson.dump(self.read_histroy_temp_data,fd)
-                #EventMesh.debug_log(self.read_histroy_temp_data)
-                pass
-            else:
-                pass
-
-        def get_history_hr_value(self, event, msg): #近7次心率历史数据统计显示
-            return self.read_histroy_hr_data
-
-        def set_history_hr_value(self, event, msg): 
-            pass
-                
-            
-
-        def save_hr_value(self, event, msg): 
-            if msg >= 50:
-                EventMesh.publish("set_storage_config",["old_hr",msg])
-                self.oldHr = msg
-                
-
-                date_tmp = utime.localtime()
-                time_tmp = utime.mktime(date_tmp)
-                if len(self.read_histroy_hr_data) >= 7:
-                    sort_new = {}
-                    sort_new = sorted(self.read_histroy_hr_data, key = lambda i: i['timeSec'],reverse = False)#按照时间戳进行排序 去掉最旧的一次数据如果满了五十条
-                    EventMesh.debug_log(sort_new)
-                    for i in range(len(self.read_histroy_hr_data)-1):
-                        sort_new[i] = sort_new[i+1]#0==1 1== 2 2== 3 3==4 4==5 5==6 6==7
-                        self.read_histroy_hr_data[i] = sort_new[i]
-                        pass
-                    self.read_histroy_hr_data[6] = {"timeSec": time_tmp, "hr": self.oldHr}
-                else:
-                    self.read_histroy_hr_data.append({"timeSec": time_tmp, "hr": self.oldHr}) 
-
-
-                with open("/usr/static/storage_file/history_hr.json","w",encoding="utf-8") as fd:
-                    ujson.dump(self.read_histroy_hr_data,fd)
-                pass
-            else:
-                EventMesh.publish("set_storage_config",["old_hr",msg])
-                pass
-
-
-        def get_hr_value(self, event, msg): 
-            return self.oldHr
-
-        def save_spo2_value(self, event, msg): 
-            if msg >= 85:
-                # EventMesh.publish("set_storage_config",["old_spo2",msg])
-                # self.oldspo2 = msg
-
-
-                # date_tmp = utime.localtime()
-                # time_tmp = utime.mktime(date_tmp)
-                # if len(self.read_histroy_spo2_data) >= 7:
-                #     sort_new = {}
-                #     sort_new = sorted(self.read_histroy_spo2_data, key = lambda i: i['timeSec'],reverse = False)#按照时间戳进行排序 去掉最旧的一次数据如果满了五十条
-                #     EventMesh.debug_log(sort_new)
-                #     for i in range(len(self.read_histroy_spo2_data)-1):
-                #         sort_new[i] = sort_new[i+1]#0==1 1== 2 2== 3 3==4 4==5 5==6 6==7
-                #         self.read_histroy_spo2_data[i] = sort_new[i]
-                #         pass
-                #     self.read_histroy_spo2_data[6] = {"timeSec": time_tmp, "spo2": self.oldspo2}
-                # else:
-                #     self.read_histroy_spo2_data.append({"timeSec": time_tmp, "spo2": self.oldspo2}) 
-
-                # with open("/usr/static/storage_file/history_spo2.json","w",encoding="utf-8") as fd:
-                #     ujson.dump(self.read_histroy_spo2_data,fd)
-                # #EventMesh.debug_log(self.read_histroy_spo2_data)
-                #播放语音
-                # EventMesh.publish("set_hr_blood_led",2)#测量成功
-                pass
-            else:
-                pass
-                pass
-
-        def get_spo2_value(self, event, msg): 
-            return self.oldspo2
-        
-        def set_old_step_value(self, event, msg): 
-            self.oldstep = msg
-            EventMesh.publish("set_storage_config",["old_step",msg])
-            
-            
-        def get_old_step_value(self, event, msg): 
-            step = EventMesh.publish(constants.EVENT.GET_STEP)
-            self.old_step = self.oldstep + step[0]
-            return self.old_step
-    #获取旧的时间戳
-    class getOldTimeManager(Abstract):
-        # 获取天气数据
-        def __init__(self):
-            self.time_sec = 0
-            self.time_step = 0
-            self.step_second = 0
-            tmp_data = EventMesh.publish("get_storage_config","old_time")
-            if tmp_data !=None :
-                self.time_sec = tmp_data
-            tmp_data = EventMesh.publish("get_storage_config","clear_state")
-            if tmp_data !=None :
-                self.time_step = tmp_data[0]
-                self.step_second = tmp_data[1]
-
-            
-            
-        def post_processor_after_instantiation(self):
-            EventMesh.subscribe("get_old_time_data", self.get_old_time_data)
-            EventMesh.subscribe("set_old_time_data", self.set_old_time_data)
-
-            EventMesh.subscribe("get_old_step_data", self.get_old_step_data)
-            EventMesh.subscribe("set_old_step_data", self.set_old_step_data)
-
-            EventMesh.subscribe("set_test_data1", self.set_test_data1)
-
-            EventMesh.subscribe("set_test_data2", self.set_test_data2)
-
-            EventMesh.subscribe("set_test_data3", self.set_test_data3)
-
-            EventMesh.subscribe("set_test_data4", self.set_test_data4)
-
-            EventMesh.subscribe("set_test_data5", self.set_test_data5)
-
-            EventMesh.subscribe("set_test_data6", self.set_test_data6)
-
-            EventMesh.subscribe("set_test_data7", self.set_test_data7)
-
-            EventMesh.subscribe("set_test_data8", self.set_test_data8)
-        
-
-        def set_test_data1(self, event, msg):
-            EventMesh.publish("set_storage_config",["clear_state1",msg])
-
-        
-        def set_test_data2(self, event, msg):
-            
-            EventMesh.publish("set_storage_config",["clear_state2",msg])
-
-
-        def set_test_data3(self, event, msg):
-            EventMesh.publish("set_storage_config",["clear_state3",msg])
-
-        def set_test_data4(self, event, msg):
-            EventMesh.publish("set_storage_config",["clear_state4",msg])
-
-        def set_test_data5(self, event, msg):
-            EventMesh.publish("set_storage_config",["clear_state5",msg])
-
-        def set_test_data6(self, event, msg):
-            EventMesh.publish("set_storage_config",["clear_state6",msg])
-
-        def set_test_data7(self, event, msg):
-            EventMesh.publish("set_storage_config",["clear_state7",msg])
-
-        def set_test_data8(self, event, msg):
-            EventMesh.publish("set_storage_config",["clear_state8",msg])
-
-        # f = open("/usr/static/storage_file/config.json",'r',encoding="utf-8")
-        # print(f.read())
-
-        def get_old_step_data(self, event, msg):
-            return [self.time_step,self.step_second]
-
-        def get_old_time_data(self, event, msg):
-            return self.time_sec
-        
-        
-
-        def set_old_time_data(self, event, msg):
-            self.time_sec = msg
-            EventMesh.publish("set_storage_config",["old_time",msg])
-
-        def set_old_step_data(self, event, msg):
-            self.time_step = msg[0]
-            self.step_second = msg[1]
-            EventMesh.publish("set_storage_config",["clear_state",msg])
-
-        def get_old_step_data(self, event, msg):
-            return [self.time_step,self.step_second]
-
-
-            
-        
-
-    class getWeatherDataManager(Abstract):
-        # 获取天气数据
-        def __init__(self):
-            self.date = {} #日期23-04-07
-            self.time = {} #14:41:41
-            self.content = {} #天气描述 
-            self.type = None #天气类型
-            self.temp = None #当前温度
-            self.min_temp = None #最低温度
-            self.max_temp = None #最高温度
-            self.city = {} #城市
-            self.no_data = 0#0沒有数据 1有数据
-
-        def post_processor_after_instantiation(self):
-            EventMesh.subscribe("get_weather_data", self.get)
-            EventMesh.subscribe("set_weather_data", self.set)
-
-        def get(self, event, msg):
-            return [self.date,self.time,self.content,self.type,self.temp,self.min_temp,self.max_temp,self.city,self.no_data]
-
-        def set(self, event, msg):
-            self.date = msg[0]
-            self.time = msg[1]
-            self.content = msg[2]
-            self.type = msg[3]
-            self.temp = msg[4]
-            self.min_temp = msg[5]
-            self.max_temp = msg[6]
-            self.city = msg[7]
-            self.no_data = msg[8]
-
-
-    class getHrTimeManager(Abstract):
-        def __init__(self):
-            self.set_time = 0
-            self.set_hr = 0 #0关闭 1手动 2 自动测量按照时间间隔测试心率
-            self.set_spo2 = 0
-            self.open_btn = 0
-            self.set_bgautotime = 0
-            self.bgauto_btn = 0
-            read_data = EventMesh.publish("get_storage_config","measure_time")
-            if read_data != None:
-                self.set_time = read_data  
-            read_data = EventMesh.publish("get_storage_config","open_hr_btn")
-                    
-            if read_data != None:
-                self.open_btn = read_data   
-
-            read_data = EventMesh.publish("get_storage_config","bgauto_time")
-            if read_data != None:
-                self.set_bgautotime = read_data  
-            read_data = EventMesh.publish("get_storage_config","bgauto_btn")
-                    
-            if read_data != None:
-                self.bgauto_btn = read_data   
-
-
-
-        def post_processor_after_instantiation(self):
-            EventMesh.subscribe("set_time_hr", self.set_time_hr)
-            EventMesh.subscribe("get_time_hr", self.get_time_hr)
-            EventMesh.subscribe("set_hr_state", self.set_hr_state)
-            EventMesh.subscribe("get_hr_state", self.get_hr_state)
-            EventMesh.subscribe("set_spo2_state", self.set_spo2_state)
-            EventMesh.subscribe("get_spo2_state", self.get_spo2_state)
-
-            EventMesh.subscribe("set_bgauto_time", self.set_bgauto_time)
-            EventMesh.subscribe("get_bgauto_time", self.get_bgauto_time)
-
-        def set_bgauto_time(self, event, msg): 
-            self.bgauto_btn = msg[0]
-            self.set_bgautotime = msg[1]
-            EventMesh.publish("set_storage_config",["bgauto_btn",self.bgauto_btn])
-            EventMesh.publish("set_storage_config",["bgauto_time",self.set_bgautotime])
-
-        def get_bgauto_time(self, event, msg): 
-            if self.bgauto_btn == None:
-                self.bgauto_btn = 0
-            if self.set_bgautotime == None:
-                self.set_bgautotime = 0
-            return [self.bgauto_btn,self.set_bgautotime]
-        
-
-        def set_time_hr(self, event, msg): 
-            self.open_btn = msg[0]
-            self.set_time = msg[1]
-            EventMesh.publish("set_storage_config",["measure_time",self.set_time])
-            EventMesh.publish("set_storage_config",["open_hr_btn",self.open_btn])
-
-        def get_time_hr(self, event, msg): 
-            return [self.open_btn,self.set_time]
-
-        def set_hr_state(self, event, msg): 
-            # if msg != 0:
-            #     EventMesh.publish("set_hr_blood_led",1)#红绿灯交替闪烁
-            self.set_hr = msg
-            if self.set_hr == 0:
-                EventMesh.publish("clear_health_state")
-            
-
-        def get_hr_state(self, event, msg): 
-            return self.set_hr
-        
-        def set_spo2_state(self, event, msg): 
-            # if msg != 0:
-            #     EventMesh.publish("set_hr_blood_led",1)##红绿灯交替闪烁
-            self.set_spo2 = msg
-            if self.set_spo2 == 0:
-                EventMesh.publish("clear_health_state")
-            
-
-        def get_spo2_state(self, event, msg): 
-            return self.set_spo2
-        
-    #体温
-    class getTempTimeManager(Abstract):
-        def __init__(self):
-            self.set_time = 0
-            self.get_temp = 0
-            read_data = EventMesh.publish("get_storage_config","temp_time")
-
-            if read_data != None:
-                self.set_time = read_data
-
-            self.get_bgstate = 0
-            self.get_bpstate = 0
-
-            self.bptime_on = 0
-            self.bptime_time = 0
-            read_data=EventMesh.publish("get_storage_config","bpauto_btn")
-            if read_data != None:
-                self.bptime_on = read_data
-
-            read_data=EventMesh.publish("get_storage_config","bpauto_time")
-            if read_data != None:
-                self.bptime_time = read_data
-
-            self.spo2time_on = 0
-            self.spo2time_time = 0
-            read_data = EventMesh.publish("get_storage_config","spo2auto_btn")
-            if read_data != None:
-                self.spo2time_on = read_data
-
-            read_data = EventMesh.publish("get_storage_config","spo2auto_time")
-            if read_data != None:
-                self.spo2time_time = read_data
-
-        def post_processor_after_instantiation(self):
-            EventMesh.subscribe("set_temp_time", self.set_temp_time)
-            EventMesh.subscribe("get_temp_time", self.get_temp_time)
-
-            EventMesh.subscribe("set_temp_state", self.set_temp_state)
-            EventMesh.subscribe("get_temp_state", self.get_temp_state)
-
-            EventMesh.subscribe("set_bp_time", self.set_bp_time)
-            EventMesh.subscribe("get_bp_time", self.get_bp_time)
-
-            EventMesh.subscribe("set_bp_state", self.set_bp_state)
-            EventMesh.subscribe("get_bp_state", self.get_bp_state)
-
-
-            EventMesh.subscribe("set_bg_state", self.set_bg_state)
-            EventMesh.subscribe("get_bg_state", self.get_bg_state)
-
-            EventMesh.subscribe("set_spo2_time", self.set_spo2_time)
-            EventMesh.subscribe("get_spo2_time", self.get_spo2_time)
-
-            
-        def set_bg_state(self, event, msg): 
-            self.get_bgstate = msg
-            if self.get_bgstate == 0:
-                EventMesh.publish("clear_health_state")
-            # if msg != 0:
-            #     EventMesh.publish("set_hr_blood_led",1)#红绿灯交替闪烁
-
-        def get_bg_state(self, event, msg): 
-            if self.get_bgstate:
-                return self.get_bgstate
-            else :
-                return 0
-
-        def set_spo2_time(self, event, msg): 
-            self.spo2time_on = msg[0]
-            self.spo2time_time = msg[1]
-            EventMesh.publish("set_storage_config",["spo2auto_btn",self.spo2time_on])
-            EventMesh.publish("set_storage_config",["spo2auto_time",self.spo2time_time])
-
-
-        def get_spo2_time(self, event, msg): 
-            
-            return [self.spo2time_on,self.spo2time_time]
-
-
-        def set_bp_time(self, event, msg): 
-            self.bptime_on = msg[0]
-            self.bptime_time = msg[1]
-            EventMesh.publish("set_storage_config",["bpauto_btn",self.bptime_on])
-            EventMesh.publish("set_storage_config",["bpauto_time",self.bptime_time])
-
-        def get_bp_time(self, event, msg): 
-            if self.bptime_on == None:
-                self.bptime_on = 0
-            if self.bptime_time == None:
-                self.bptime_time = 0
-            return [self.bptime_on,self.bptime_time]
-        
-            
-        def set_bp_state(self, event, msg): 
-            self.get_bpstate = msg
-            if self.get_bpstate == 0:
-                EventMesh.publish("clear_health_state")
-            # if msg != 0:
-                # EventMesh.publish("set_hr_blood_led",1)#红绿灯交替闪烁
-
-        def get_bp_state(self, event, msg): 
-            if self.get_bpstate:
-                return self.get_bpstate
-            else :
-                return 0
-
-
-        def set_temp_time(self, event, msg): 
-            self.set_time = msg
-            EventMesh.publish("set_storage_config",["temp_time",self.set_time])
-
-        def get_temp_time(self, event, msg): 
-            return self.set_time
-        
-        def set_temp_state(self, event, msg): 
-            self.get_temp = msg
-            if self.get_temp == 0:
-                EventMesh.publish("clear_temp_state")
-            # if msg != 0:
-            #     EventMesh.publish("set_hr_blood_led",1)#红绿灯交替闪烁
-
-        def get_temp_state(self, event, msg): 
-            return self.get_temp
-            
-    class getBrightnessManager(Abstract):#获取亮度级别
-        def __init__(self):
-            self.level = 6#默认值6
-            # self.read_data = {}
-            self.time = 5
-            self.PWM_backlight  = None
-
-
-        def post_processor_after_instantiation(self):
-            EventMesh.subscribe("get_brightness_level", self.get_brightness_level)
-            EventMesh.subscribe("push_add_brightness_level", self.add)
-            EventMesh.subscribe("push_reduce_brightness_level", self.reduce)
-            EventMesh.subscribe("set_brightness_level", self.set_brightness_level)
-
-            EventMesh.subscribe("set_brightness_time", self.set_brightness_time)
-            EventMesh.subscribe("get_brightness_time", self.get_brightness_time)
-
-        def set_brightness_level(self, event, msg): 
-            self.level = msg
-            EventMesh.publish("set_storage_config", ["brightness_level",self.level])
-
-        def get_brightness_level(self, event, msg): 
-            tmp = EventMesh.publish("get_storage_config","brightness_level")
-            if tmp != None:
-                self.level = tmp
-            return self.level
-        
-        def set_brightness_time(self, event, msg): 
-            self.time = msg
-            EventMesh.publish("set_storage_config", ["brightness_time",self.time])
-        
-        def get_brightness_time(self, event, msg): 
-            tmp = EventMesh.publish("get_storage_config","brightness_time")
-            if tmp != None:
-                self.time = tmp
-            return self.time
-        
-
-
-        def add(self, event, msg):
-            if self.level < 10:
-                self.level = self.level + 2
-            # self.PWM_backlight = PWM(PWM.PWM1, PWM.ABOVE_MS, self.level, 10)
-            # self.PWM_backlight.open()
-            EventMesh.publish("set_storage_config", ["brightness_level",self.level])
-
-
-        def reduce(self, event, msg):
-            # if self.level > 0:
-            #     self.level = self.level - 2
-            # if self.level <= 0:
-            #     self.PWM_backlight = PWM(PWM.PWM1, PWM.ABOVE_MS, 1, 10)
-            # else:
-            #     self.PWM_backlight = PWM(PWM.PWM1, PWM.ABOVE_MS,self.level, 10)
-
-            # self.PWM_backlight.open()
-            EventMesh.publish("set_storage_config", ["brightness_level",self.level])
-        
-        
-    class getStorageDataManager(Abstract):#获取内存数据
-        def __init__(self):
-            self.config_data = {}
-            check = ql_fs.path_exists("/usr/static/storage_file/config.json")
-            if check == True:
-                with open("/usr/static/storage_file/config.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_data", self.set_storage_data)
-            EventMesh.subscribe("set_storage_config", self.set_storage_config)
-            EventMesh.subscribe("get_storage_data", self.get_storage_data)
-            EventMesh.subscribe("get_storage_config", self.get_storage_config)
-
-        def set_storage_data(self, event, msg): 
-            # EventMesh.debug_log("set_storage_data:{}".format(msg))
-            if msg != None:
-                self.config_data = msg
-                with open("/usr/static/storage_file/config.json",'w+',encoding="utf-8") as fd:
-                    ujson.dump(self.config_data,fd)
-        
-
-        def set_storage_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.json",'w+',encoding="utf-8") as fd:
-                ujson.dump(self.config_data,fd)
-        def get_storage_data(self, event, msg): 
-            # EventMesh.debug_log("get_storage_data:{}".format(self.config_data))
-            return self.config_data 
-        def get_storage_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 getUpLoadDataManager(Abstract):#
-        def __init__(self):
-            self.upload_time = 2*60*60
-            read_data = EventMesh.publish("get_storage_config","upload_time")
-            if read_data != None:
-                self.upload_time = read_data 
-
-        def post_processor_after_instantiation(self):
-            EventMesh.subscribe("set_upload_data", self.set_upload_data)
-            EventMesh.subscribe("get_upload_data", self.get_upload_data)
-
-        def set_upload_data(self, event, msg): 
-            self.upload_time = msg
-
-        def get_upload_data(self, event, msg): 
-            if self.upload_time == None:
-                self.upload_time = 2*60*60
-            return self.upload_time 
-
-    class getplayAudiodStateManager(Abstract):#获取设置播放音频状态
-        def __init__(self):
-            self.play = 0
-
-        def post_processor_after_instantiation(self):
-            EventMesh.subscribe("set_audio_state", self.set_audio_state)
-            EventMesh.subscribe("get_audio_state", self.get_audio_state)
-
-        def set_audio_state(self, event, msg): 
-            self.play = msg
-
-        def get_audio_state(self, event, msg): 
-            return self.play
-        
-    class getVolumSizeManager(Abstract):#设置或获取音量大小数据
-        def __init__(self):
-            self.volume_size = 8
-            read_data = EventMesh.publish("get_storage_config","volum")
-            if read_data != None:
-                self.volume_size = read_data
-        
-        def post_processor_after_instantiation(self):
-            EventMesh.subscribe("set_volum_size", self.set_volum_size)
-            EventMesh.subscribe("get_volum_size", self.get_volum_size)
-
-        def set_volum_size(self, event, msg): 
-            self.volume_size = msg
-            EventMesh.publish("set_storage_config", ["volum",self.volume_size])
-
-        def get_volum_size(self, event, msg): 
-            return self.volume_size
-
-    class getSosFlagManager(Abstract):#设置sos
-        def __init__(self):
-            self.aud = audio.Audio(0)
-            self.sos_flag = 0
-            self.sos_num = 0
-            self.hangup_mode = 0
-            self.call_timer = osTimer()
-            self.sos_numer1 = []
-            self.callnumer =""
-            SOS_NUMBER1 = EventMesh.publish("get_storage_config","SOS_NUMBER1")
-            if SOS_NUMBER1 != None:
-                self.sos_numer1 = SOS_NUMBER1
-            SOS_NUMBER2 = EventMesh.publish("get_storage_config","SOS_NUMBER2")
-            if SOS_NUMBER2 != None:        
-                self.sos_numer1 = [SOS_NUMBER1, SOS_NUMBER2]
-
-            SOS_NUMBER3 = EventMesh.publish("get_storage_config","SOS_NUMBER3")
-            if SOS_NUMBER3 != None:        
-                self.sos_numer1 = [SOS_NUMBER1, SOS_NUMBER2,SOS_NUMBER3]
-
-
-        def post_processor_after_instantiation(self):
-            EventMesh.subscribe("set_sos_flag", self.set_sos_flag)#设置sos拨打标识
-            EventMesh.subscribe("get_sos_flag", self.get_sos_flag)
-
-            EventMesh.subscribe("set_sos_num", self.set_sos_num)#设置拨打循环次数
-            EventMesh.subscribe("get_sos_num", self.get_sos_num)
-
-            EventMesh.subscribe("set_dial_sos_number", self.set_dial_sos_number)
-            EventMesh.subscribe("get_dial_sos_number", self.get_dial_sos_number)#设置家庭号码三个
-
-            EventMesh.subscribe("set_callnumer_cb", self.set_callnumer_cb)#延时回调
-
-            EventMesh.subscribe("close_call_time",self.close_call_time)
-
-            EventMesh.subscribe("set_hangup_mode", self.set_hangup_mode)
-            EventMesh.subscribe("get_hangup_mode", self.get_hangup_mode)#获取挂断方式 是对方挂断 还是手表按键主动挂断
-
-        def get_hangup_mode(self, event, msg): # 1是设备端手表主动挂断 0是手机端
-            return self.hangup_mode
-        
-        def set_hangup_mode(self, event, msg): 
-            self.hangup_mode = msg
-
-        def set_sos_flag(self, event, msg): 
-            self.sos_flag = msg
-            EventMesh.publish("set_sos_state_out")
-            if self.sos_flag == 1:
-                number = EventMesh.publish("get_dial_sos_number")
-            
-                if number != None:
-                    if len(number) > 0:
-                        self.call_timer.stop()
-                        EventMesh.publish("save_phonename",number[0])
-                        EventMesh.publish("save_phonenum",number[0])
-                        EventMesh.publish("set_sos_num",0)
-                        phone_num = EventMesh.publish("get_phonenum")  
-                        EventMesh.publish("sos_out_call_center_cb",phone_num)#电话拨出去
-                    else:
-                        EventMesh.publish("sos_out_call_center_cb",None)#电话拨出去
-
-        def set_callnumer_cb(self, event, msg):
-            if self.sos_flag == 1:
-                EventMesh.publish("set_sos_state_out")
-                self.callnumer = msg
-                self.call_timer.start(5000, 0, self.call_timer_cb)#延迟10S 继续拨打
-
-        def call_timer_cb(self, *args, **kwargs):
-            EventMesh.publish("set_sos_state_out")
-            flag = EventMesh.publish("get_call_state") 
-            fall_down = EventMesh.publish("get_fall_down_state")#跌倒报警标识
-            video_state = EventMesh.publish("get_video_state")
-            if flag != 0 or fall_down != 0 or video_state != 0:#防止不会被中断不会继续拨打sos号码正在通话或者打电话中,跌倒报警 视频通话中不允许拨打sos
-                if self.sos_flag == 1:
-                    self.call_timer.start(5000, 0, self.call_timer_cb)#延迟10S 继续拨打
-                    return
-                else:
-                    self.call_timer.stop()
-                    return
-
-            if self.sos_flag == 1:
-                self.call_timer.stop()
-                EventMesh.publish("save_phonename",str(self.callnumer))
-                EventMesh.publish("save_phonenum",str(self.callnumer))
-                phone_num = EventMesh.publish("get_phonenum")  
-                EventMesh.publish("sos_out_call_center_cb",phone_num)#电话拨出去
-            else:
-                self.call_timer.stop()
-        
-        def close_call_time(self, event, msg): 
-            self.call_timer.stop()
-
-        def get_sos_flag(self, event, msg): 
-            return self.sos_flag
-        
-        def set_sos_num(self, event, msg): 
-            self.sos_num = msg
-
-        def get_sos_num(self, event, msg): 
-            return self.sos_num
-        
-        def set_dial_sos_number(self, event, msg): 
-            self.sos_numer1 = msg
-            
-
-        def get_dial_sos_number(self, event, msg): 
-            return self.sos_numer1
-    class getLowBatManager(Abstract):#低电提醒
-        def __init__(self):
-
-            self.low_btn = 0
-            read_data = EventMesh.publish("get_storage_config","low_on")
-            if read_data != None:
-                self.low_btn = read_data
-
-        def post_processor_after_instantiation(self):
-            EventMesh.subscribe("set_low_bat_btn", self.set_low_bat_btn)#
-            EventMesh.subscribe("get_low_bat_btn", self.get_low_bat_btn)
-
-        def set_low_bat_btn(self, event, msg): 
-            self.low_btn = msg
-            EventMesh.publish("set_storage_config",["low_on",self.low_btn])
-
-        def get_low_bat_btn(self, event, msg): 
-            return self.low_btn
-        
-
-
-    class playPowerAudioManager(Abstract):#播放开关机音频文件
-        def __init__(self):
-            self.aud = audio.Audio(0)
-
-        def post_processor_after_instantiation(self):
-            
-            EventMesh.subscribe("play_poewr_on_event", self.play_poewr_on_event)#
-            EventMesh.subscribe("play_poewr_off_event", self.play_poewr_off_event)
-
-        def play_poewr_on_event(self, event, msg): 
-            self.aud.play(1, 1, 'U:/static/R_POWER_1.mp3')  #播放播放开机铃声
-
-        def play_poewr_off_event(self, event, msg): 
-            self.aud.setVolume(11)
-            self.aud.play(1, 1, 'U:/static/R_POWER_OFF_1.mp3')  #播放关机铃声
-        
-    class getBootOffManager(Abstract):#开关机时间
-        def __init__(self):
-            self.poweroff_time = []
-            read_data = EventMesh.publish("get_storage_config","poweroff_alarm")
-            if read_data != None:
-                self.poweroff_time = read_data
-            else:
-                self.poweroff_time = [{"poweroff_on":0,"start_hour":6,"start_min":0,"end_hour":0,"end_min":0}]
-            
-
-
-        def post_processor_after_instantiation(self):
-            EventMesh.subscribe("set_boot_off_time", self.set_boot_off_time)#设置关机时间
-            EventMesh.subscribe("get_boot_off_time", self.get_boot_off_time)
-
-        def set_boot_off_time(self, event, msg): 
-            EventMesh.debug_log("set_boot_off_time",msg)
-
-            EventMesh.publish("set_storage_config",["poweroff_alarm",msg])
-            self.poweroff_time = msg
-            EventMesh.publish("set_rtc_alarm")
-
-
-        def get_boot_off_time(self, event, msg):
-            return self.poweroff_time
-    class setSmsIndexManager(Abstract):#
-        def __init__(self):
-            self.index = -1
-
-        def post_processor_after_instantiation(self):
-            EventMesh.subscribe("set_sms_index", self.set_sms_index)#设置关机时间
-            EventMesh.subscribe("get_sms_index", self.get_sms_index)
-
-        def set_sms_index(self, event, msg): 
-            self.index = msg
-            
-
-        def get_sms_index(self, event, msg):
-            
-            return self.index
-    import protocol 
-    class testSmsSetIPManager(Abstract):#
-        def __init__(self):
-            self.timer = osTimer()
-            #大锤
-            severdata = protocol.server_init()
-
-            self.newip = severdata[0]
-            self.newcom = severdata[1]
-            self.new_key = severdata[2]
-            self.new_pid = severdata[3]
-            
-            EventMesh.debug_log("testSmsSetIPManager:{}\n".format(severdata))
-
-            self.server_sate = 0
-
-
-
-            tmp_data = EventMesh.publish("get_storage_config","set_new_ip_addr")
-            if tmp_data != None:
-                self.newip = tmp_data
-            tmp_data = EventMesh.publish("get_storage_config","set_new_com")
-            if tmp_data != None:
-                self.newcom = tmp_data
-            tmp_data = EventMesh.publish("get_storage_config","set_new_md5")
-            if tmp_data != None:
-                self.newmd5 = tmp_data    
-
-            tmp_data = EventMesh.publish("get_storage_config","set_new_key")
-            if tmp_data != None:
-                self.new_key = tmp_data 
-
-            tmp_data = EventMesh.publish("get_storage_config","set_new_pid")
-            if tmp_data != None:
-                self.new_pid = tmp_data 
-
-            tmp_data = EventMesh.publish("get_storage_config","get_server_sate")
-            if tmp_data != None:
-                self.server_sate = tmp_data 
-            
-            
-
-
-
-        def post_processor_after_instantiation(self):
-            EventMesh.subscribe("set_new_ip_com", self.set_new_ip_com)#设置关机时间
-            EventMesh.subscribe("get_new_ip_com", self.get_new_ip_com)
-
-            EventMesh.subscribe("set_ip", self.set_ip)#设置关机时间
-            EventMesh.subscribe("get_ip", self.get_ip)
-
-            EventMesh.subscribe("set_com", self.set_com)#设置关机时间
-            EventMesh.subscribe("get_com", self.get_com)
-
-            EventMesh.subscribe("get_new_key", self.get_new_key_cb)#获取key
-            EventMesh.subscribe("set_new_key", self.set_new_key_cb)#获取key
-
-            EventMesh.subscribe("set_new_pid", self.set_new_pid_cb)#获取pid
-            EventMesh.subscribe("get_new_pid", self.get_new_pid_cb)#获取pid
-
-            EventMesh.subscribe("set_server_state", self.set_server_state)#
-            EventMesh.subscribe("get_server_state", self.get_server_state)#
-
-            EventMesh.subscribe("get_new_key_pid", self.get_new_key_pid)#
-
-
-
-        def set_new_key_cb(self, event, msg): 
-            self.new_key = msg
-            # print("set_new_key_cb",msg,self.new_key)
-            EventMesh.publish("set_storage_config",["set_new_key",self.new_key])
-
-        def get_new_key_cb(self, event, msg):
-            # print("get_new_key_cb",self.new_key)
-            return self.new_key
-        
-        def set_new_pid_cb(self, event, msg): 
-            self.new_pid = msg
-            # print("set_new_pid_cb",msg,self.new_pid)
-            EventMesh.publish("set_storage_config",["set_new_pid",self.new_pid])
-
-        def get_new_pid_cb(self, event, msg):
-            # print("get_new_pid_cb",self.new_pid)
-            return self.new_pid
-
-        def set_new_ip_com(self, event, msg): 
-            self.newip = str(msg[0])
-            self.newcom = int(msg[1])
-            # self.newmd5 = str(msg[2])
-            #短信格式:SETIP:api.xcloudtech.com:9000:bZld0ALsZTt15tKEZhOlLPgbsO75BLTP 以冒号分隔 SETIP:ip地址:ip端口号:ip密钥key
-
-            # self.read_data["set_new_md5"] = self.newmd5  #通过短信设置ip的key密钥
-        
-
-            EventMesh.publish("set_storage_config",["set_new_ip_addr",self.newip])
-            EventMesh.publish("set_storage_config",["set_new_com",self.newcom])
-
-
-            number = str(msg[2])
-            sms.sendPduMsg(number, 'set ok', 'UCS2')
-            self.timer.start(10*1000,0,self.fun)
-            
-        def fun(self,*argc):
-            Power.powerRestart()
-
-        def get_new_ip_com(self, event, msg):
-            tmp_addr = EventMesh.publish("get_storage_config","set_new_ip_addr")
-            tmp_com = EventMesh.publish("get_storage_config","set_new_com")
-            if tmp_addr != None:
-                self.newip = tmp_addr
-            if tmp_com != None:
-                self.newcom = tmp_com
-            return [self.newip,self.newcom]
-        
-        def set_ip(self, event, msg): 
-            self.newip = msg
-            EventMesh.publish("set_storage_config",["set_new_ip_addr",self.newip])
-
-        def get_ip(self, event, msg):
-            # print("get_ip",self.newip)
-            return self.newip
-        
-        def set_com(self, event, msg): 
-            self.newcom = msg
-            EventMesh.publish("set_storage_config",["set_new_com",self.newcom])
-
-        def get_com(self, event, msg):
-            # print("get_com",self.newcom)
-            return self.newcom
-
-        def get_new_key_pid(self, event, msg):
-            return [self.new_key,self.new_pid]
-        
-        def set_server_state(self, event, msg):
-            EventMesh.publish("set_storage_config",["get_server_sate",msg])
-            self.server_sate = msg
-
-        def get_server_state(self, event, msg):
-            return self.server_sate
-            
-
-    # MMI Version:UIX8910_C55_DS_D12G_PRO18_FZD_V1.0_Release
-    # Build:07-07-2022 16:12:58
-    # IMEI:861218001025267
-    # IP:api.xcloudtech.com
-    # PORT:9000
-    # UPLOAD:300
-    # Battery:3948, 64
-    # Udebug: 0
-    # ConnectTime: 7
-    import protocol
-
-    class sendDevinfoManager(Abstract):#发送设备信息
-        def __init__(self):
-            self.timer = osTimer()
-            pass
-
-        def post_processor_after_instantiation(self):
-            EventMesh.subscribe("send_devinfo_event", self.send_devinfo_event)#删除短信
-
-        def send_devinfo_event(self, event, msg): 
-            number = str(msg)
-            versions = EventMesh.softversion
-            Build = EventMesh.builTime
-            IMEI = EventMesh.publish(constants.EVENT.GET_IMEI)
-            IP = ""
-            new_ip = EventMesh.publish("get_storage_config","set_new_ip_addr")
-            new_com = EventMesh.publish("get_storage_config","set_new_com")
-            server_data = protocol.server_init()
-        
-            if new_ip != None:
-                if len(new_ip) != 0:
-                    IP = new_ip
-                else:
-                    IP = server_data[0]
-            else:
-                IP = server_data[0]
-            
-            PORT = ""
-            if new_com != None:
-                if len(str(new_com)) != 0:
-                    PORT = str(new_com)
-                else:
-                    PORT = str(server_data[1])
-            else:
-                PORT = str(server_data[1])
-            
-            UPLOAD = EventMesh.publish("get_upload_data")
-
-            level = EventMesh.publish("get_curr_battery_level")
-            if level == None:
-                level = 4200
-            bat = EventMesh.publish("screen_get_battery")[1]
-            if bat == None:
-                bat = 100
-            Battery = str(level) +',' +  str(bat)
-
-            ConnectTime = heartbeat_time//60
-            data1 = "Version:{}\nBuild:{}".format(versions,Build)
-
-            data2 = "IMEI:{}\nIP:{}\nPORT:{}".format(IMEI,IP,PORT)
-            
-            data3 = "UPLOAD:{}\nBattery:{}\nConnectTime:{}".format(UPLOAD,Battery,ConnectTime)
-
-            send_state1 = -1
-            send_state2 = -1
-            # print("data",data1,data2,data3)
-            send_state1 = sms.sendPduMsg(number, data1, 'UCS2')
-
-            if send_state1 == 0:
-                send_state2 = sms.sendPduMsg(number, data2, 'UCS2')
-
-            if send_state2 == 0:
-                sms.sendPduMsg(number, data3, 'UCS2')
-            
-
-    class deleteSmsManager(Abstract):#删除信息
-        def __init__(self):
-            self.timer = osTimer()
-            pass
-
-        def post_processor_after_instantiation(self):
-            EventMesh.subscribe("delete_sms_event", self.delete_sms_event)#删除短信
-            EventMesh.subscribe("remove_all_sms_cb", self.remove_all_sms_cb)#
-
-        def delete_sms_event(self, event, msg): 
-            self.timer.start(4*1000,0,self.fun)
-            
-        def fun(self, *argc): 
-            EventMesh.publish_async("remove_all_sms_cb","",1*1024)
-
-        def remove_all_sms_cb(self, event, msg):
-            sms.deleteMsg(1,4)
-
-    #闹钟信息
-    alarm_list = [{'hour': 6, 'repeart': 10, 'idx': 0, 'enabled': 1, 'days': [0,1,2,3,4,5,6], 'minute': 0},
-                {'hour': 0, 'repeart': 10, 'idx': 1, 'enabled': 1, 'days': [0,1,2,3,4,5,6], 'minute': 0}]
-    #用于显示闹钟列表不包含开关机信息
-
-    class ClockManager(Abstract):
-        def __init__(self):
-            super().__init__()
-            self.rtc = RTC()
-            self.days = 0
-            self.idx = 0
-
-            IFEXIST = ql_fs.path_exists("/usr/static/storage_file/alarm_msg.json") 
-            self.check_alarm_list = []     
-            if IFEXIST == True:
-                with open("/usr/static/storage_file/alarm_msg.json","r",encoding='utf-8') as fd:
-                    self.check_alarm_list = ujson.load(fd)
-            
-            EventMesh.subscribe("push_clock_info", self.set)
-            EventMesh.subscribe("read_alarminjson", self.read_alarminjson)
-            EventMesh.subscribe("add_alarm", self.add_alarm)
-            EventMesh.subscribe("remove_alarm", self.remove_alarm)
-            EventMesh.subscribe("set_rtc_alarm", self.set_rtc_alarm)
-            EventMesh.subscribe("get_alarm_indx", self.get_alarm_indx)
-            EventMesh.subscribe("get_check_alarm_list", self.get_check_alarm_list)
-            EventMesh.subscribe("push_update_alarm_show", self.update_show_info)
-
-        def post_processor_after_instantiation(self):
-        
-            EventMesh.publish("read_alarminjson")
-            # EventMesh.publish("set_rtc_alarm")
-        
-        def update_show_info(self,event,msg):
-            EventMesh.publish("read_alarminjson")
-            # EventMesh.publish("set_rtc_alarm")
-
-        def get_check_alarm_list(self, event, msg):
-            alarm_len = 0
-            global alarm_list
-            EventMesh.publish("read_alarminjson")
-            alarm_len = len(alarm_list)
-            return alarm_len
-
-
-        def set(self, event, msg):
-            global alarm_list
-            EventMesh.debug_log("msg = {}".format(msg))
-            idx = msg.get("idx")
-            EventMesh.debug_log("修改第{}个闹钟信息{}".format(idx,alarm_list[idx]))
-            alarm_list[idx]["hour"] = msg["hour"]
-            alarm_list[idx]["minute"] = msg["minute"]
-            alarm_list[idx]["days"] = msg["days"]
-            alarm_list[idx]["enabled"] = msg["enabled"]
-            alarm_list[idx]["repeart"] = msg["repeart"]
-            with open("/usr/static/storage_file/alarm_msg.json", 'w+',encoding='utf-8') as fd:
-                ujson.dump(alarm_list,fd)
-
-        def read_alarminjson(self, event, msg):
-            IFEXIST = ql_fs.path_exists("/usr/static/storage_file/alarm_msg.json") 
-            global alarm_list     
-            EventMesh.debug_log("IFEXIST:{}".format(IFEXIST))
-            if IFEXIST == True:
-                with open("/usr/static/storage_file/alarm_msg.json","r",encoding='utf-8') as fd:
-                    alarm_list = ujson.load(fd)
-
-            
-            # read_data = EventMesh.publish("get_storage_config","off_on")
-
-            hour1 = str(alarm_list[0]["hour"])+':'+str(alarm_list[0]["minute"])
-            # min1 = str(alarm_list[0]["minute"])
-
-            hour2 = str(alarm_list[1]["hour"])+':'+str(alarm_list[1]["minute"])
-            # min2 = str(alarm_list[1]["minute"]) 
-            # EventMesh.publish("set_boot_off_time",[1,hour1,hour2])
-
-            EventMesh.debug_log("hour1:{}-{}".format(hour1,hour2))
-
-            
-            return alarm_list
-
-        def add_alarm(self, event, msg):
-
-            global alarm_list
-            EventMesh.publish("read_alarminjson")
-            EventMesh.debug_log("msg:{}".format(msg))
-            for i in range(0,2):#开关机固定是 idx 0 1
-                off_msg1 = msg[i+1]
-                msg_tmp1 = off_msg1.split(':')
-                start_hour = int(msg_tmp1[0])
-                start_min = int(msg_tmp1[1])
-                enable = int(msg[0])
-                EventMesh.debug_log("start_hour:{} start_min:{} enable:{}",start_hour,start_min,enable)
-                # EventMesh.publish("set_boot_off_time",[msg[0],msg[1],msg[2]])
-
-                alarm_list[i]["idx"]=i
-                alarm_list[i]["hour"]=start_hour
-                alarm_list[i]["minute"]=start_min
-                alarm_list[i]["days"]=[0,1,2,3,4,5,6]
-                alarm_list[i]["enabled"]=enable
-                alarm_list[i]["repeart"]=10
-
-
-                # alarm_list.append({"idx": i, "hour": start_hour, "minute": start_min, "days":[0,1,2,3,4,5,6], "enabled": enable,"repeart":10})
-
-            
-            # EventMesh.debug_log("alarm_list----len- :{} alarm_list:{}".format(len(alarm_list),alarm_list))
-            with open("/usr/static/storage_file/alarm_msg.json", 'w+',encoding='utf-8') as fd:
-                ujson.dump(alarm_list,fd)
-            EventMesh.publish("push_update_alarm_show")
-            
-        
-                
-            
-
-
-        def remove_alarm(self, event, msg):
-            global alarm_list
-            EventMesh.debug_log("ddddddddddddddddddd:",msg)
-            idx = msg.get("idx")
-            EventMesh.debug_log("delete_here1-----{},{}:".format(idx,msg))
-
-            for i, alarm in enumerate(alarm_list):
-                EventMesh.debug_log("delete_here2-----{},{}:".format(i,alarm))
-
-                if alarm["idx"] == idx:
-                    del alarm_list[i]
-                    EventMesh.debug_log("delete_here3-----",alarm_list)
-
-                    #删除闹钟后,对idx重新排序
-                    if alarm_list:
-                        for j in range(i,len(alarm_list)):
-                            alarm_list[j]["idx"] -= 1
-                            EventMesh.debug_log("delete_here4-----",alarm_list)
-
-            with open("/usr/static/storage_file/alarm_msg.json", 'w+',encoding='utf-8') as fd:
-                ujson.dump(alarm_list,fd)
-
-
-        def get_alarm_indx(self,event,msg):
-            return self.idx
-
-        def _rtc_callback(self,args):
-            #设置下一个闹钟,定时开关机功能
-            msg_data = EventMesh.publish("get_boot_off_time")
-            if msg_data != None:
-                power_offdata = msg_data[0]
-                start_hour = int(power_offdata["start_hour"])
-                start_min = int(power_offdata["start_min"])
-                end_hour = int(power_offdata["end_hour"])
-                end_min = int(power_offdata["end_min"])
-                off_on = int(power_offdata["poweroff_on"])
-
-                rtc_now_time = self.rtc.datetime()
-                current_minute = rtc_now_time[4]*60 + rtc_now_time[5]
-                end_min_total = end_hour*60+end_min
-                next_minute = start_hour*60+start_min #10:11
-                EventMesh.debug_log("off_on:{} {} {}".format(off_on,current_minute,next_minute))
-                if off_on != None:
-                    if off_on == 1:
-                        if end_min_total == current_minute:#结束的时间分钟等于关机时间分钟数则关机
-                            ubs_state = EventMesh.publish("get_usb")#'
-                            
-                            if ubs_state == 2 or ubs_state == 0:
-
-                                if next_minute > current_minute:#开机时间大于当前时间 9:00 > = 8:00 
-                                    interval_minute = next_minute - current_minute
-                                    
-                                    EventMesh.debug_log("开机距离下一次响铃的的分钟数:", interval_minute,next_minute)
-                                else:#8:00 9:00
-                                    #7*60*24 7天一个周期 7*60*24 - 
-                                    interval_minute = next_minute + (24*60-current_minute)
-                                    EventMesh.debug_log("开机08888距离下一次响铃的的分钟数:", interval_minute,next_minute)
-
-                                #反向获取时间戳
-                                time = utime.localtime()
-                                EventMesh.debug_log("开机9获取utime的时间戳:", time)
-                                rtc_mktime = utime.mktime(time)-time[5]
-                                EventMesh.debug_log("开机10反向获取utime的mktime:", rtc_mktime)
-
-                                #加上下一次响铃需要的时间
-                                next_alarm_mktime = rtc_mktime + interval_minute*60 #转换成s单位 时间戳
-                                EventMesh.debug_log("开机11下一次响铃的mktime:", next_alarm_mktime)
-
-                                #格式化时间戳,得到下一次闹钟的时间
-                                next_alarm_time = utime.localtime(next_alarm_mktime)
-                                EventMesh.debug_log("开机12下一次响铃的准确时间:", next_alarm_time)
-                                #将时间转换为rtc的格式
-                                data_l = [2021, 7, 9, 5, 12, 30, 0, 0]
-                                #给rtc时间赋值
-                                data_l[0] = next_alarm_time[0] #year
-                                data_l[1] = next_alarm_time[1] #month                    
-                                data_l[2] = next_alarm_time[2] #day                     
-                                data_l[4] = next_alarm_time[3] #hour               
-                                data_l[5] = next_alarm_time[4] #minute   
-                                data_e=tuple(data_l)
-                                EventMesh.debug_log("开机13将该时间转换为RTC元组:", data_e)
-                                
-                                self.rtc.register_callback(self._rtc_callback)
-
-                                FLAG = self.rtc.set_alarm(data_e)
-                                if FLAG == 0:
-                                    EventMesh.debug_log("开机11成功设置rtc的到期时间:", data_e)
-                                else:
-                                    EventMesh.debug_log("开机时设置rtc的到期时间失败:", data_e)
-                                self.rtc.enable_alarm(1)
-                                
-                                EventMesh.debug_log("结束时设置rtc的到期时间失败:", data_e)
-                                EventMesh.publish("open_power_on", 5)#静音关机
-                                return
-                            else:
-                                EventMesh.publish("set_rtc_alarm")
-                                #self.rtc.datetime([2023, 12, 1, 5, 5, 59, 30, 0])
-                                return
-                
-            EventMesh.publish("set_rtc_alarm")
-
-
-        def set_rtc_alarm(self,event,msg):
-            msg_data = EventMesh.publish("get_boot_off_time")
-            if msg_data != None:
-                power_offdata = msg_data[0]
-                start_hour = int(power_offdata["start_hour"])
-                start_min = int(power_offdata["start_min"])
-                end_hour = int(power_offdata["end_hour"])
-                end_min = int(power_offdata["end_min"])
-                off_on = int(power_offdata["poweroff_on"])
-                if off_on == 1:
-                    next_minute = start_hour*60+start_min #10:11
-
-                    start_total = start_hour*60+start_min #10:11
-                    end_total = end_hour*60+end_min #10:11
-                    rtc_now_time = self.rtc.datetime()
-                    current_minute = rtc_now_time[4]*60 + rtc_now_time[5]#当前时间
-
-
-                    minute_list = []
-                    if start_total != current_minute:
-                        minute_list.append(start_total)#23*60=
-                    if end_total != current_minute:
-                        minute_list.append(end_total)
-                    minute_list.append(current_minute)#[927,927,930]
-                    minute_list = sorted(minute_list)
-                    current_index = minute_list.index(current_minute)
-                    print("minute_list",minute_list,start_total,end_total,current_index,power_offdata)
-                    
-                    
-                    next_index = current_index + 1
-                    if next_index >= len(minute_list):
-                        next_minute = minute_list[0]
-                        print("07下一个闹钟的分钟数:", next_minute)
-                    else:
-                        next_minute = minute_list[next_index]
-                        print("08下一个闹钟的分钟数:", next_minute)
-
-                    print("minute_list1",minute_list,current_index,next_minute)
-                    if next_minute > current_minute:
-                        interval_minute = next_minute - current_minute
-                        print("09距离下一次响铃的的分钟数:", interval_minute)#14 31 14 29 14 31 24*60-
-                    else:
-                        interval_minute = (24*60 - current_minute) + next_minute
-                        print("10距离下一次响铃的的分钟数:", interval_minute)
-
-
-                    #反向获取时间戳
-                    time = utime.localtime()
-                    EventMesh.debug_log("关机09获取utime的时间戳:", time)
-                    time
-                    rtc_mktime = utime.mktime(time)-time[5]
-                    EventMesh.debug_log("关机10反向获取utime的mktime:", rtc_mktime)
-
-                    #加上下一次响铃需要的时间
-                    next_alarm_mktime = rtc_mktime + interval_minute*60 #转换成s单位 时间戳
-                    EventMesh.debug_log("关机11下一次响铃的mktime:", next_alarm_mktime)
-
-                    #格式化时间戳,得到下一次闹钟的时间
-                    next_alarm_time = utime.localtime(next_alarm_mktime)
-                    EventMesh.debug_log("关机12下一次响铃的准确时间:", next_alarm_time)
-                    #将时间转换为rtc的格式
-                    data_l = [2021, 7, 9, 5, 12, 30, 0, 0]
-                    #给rtc时间赋值
-                    data_l[0] = next_alarm_time[0] #year
-                    data_l[1] = next_alarm_time[1] #month                    
-                    data_l[2] = next_alarm_time[2] #day                     
-                    data_l[4] = next_alarm_time[3] #hour               
-                    data_l[5] = next_alarm_time[4] #minute   
-                    data_e=tuple(data_l)
-                    EventMesh.debug_log("关机13将该时间转换为RTC元组:", data_e)
-                    
-                    self.rtc.register_callback(self._rtc_callback)
-
-                    FLAG = self.rtc.set_alarm(data_e)
-                    if FLAG == 0:
-                        EventMesh.debug_log("关机11成功设置rtc的到期时间:", data_e)
-                    else:
-                        EventMesh.debug_log("关机时设置rtc的到期时间失败:", data_e)
-                    self.rtc.enable_alarm(1)
-                else:
-                    self.rtc.enable_alarm(0)
-                    
-
-    class schoolclassManager(Abstract):#
-        def __init__(self):
-            # ['火星情报局', '一年级二班', '柠檬茶']
-            self.school_name = ''
-            self.class_name = ''
-            self.full_name = ''
-            tmp_data = EventMesh.publish("get_storage_config","school_name")
-            if tmp_data != None:
-                self.school_name = tmp_data
-            tmp_data = EventMesh.publish("get_storage_config","class_name")
-            if tmp_data != None:
-                self.class_name = tmp_data
-            tmp_data = EventMesh.publish("get_storage_config","full_name")
-            if tmp_data != None:
-                self.full_name = tmp_data    
-
-            
-
-        def post_processor_after_instantiation(self):
-            EventMesh.subscribe("set_schoolname", self.set_school_name)#
-            EventMesh.subscribe("get_schoolname", self.get_school_name)
-
-            EventMesh.subscribe("set_classname", self.set_classname)#
-            EventMesh.subscribe("get_classname", self.get_classname)
-
-            EventMesh.subscribe("set_fullname", self.set_full_name)#
-            EventMesh.subscribe("get_fullname", self.get_full_name)
-
-        def set_school_name(self, event, msg): 
-            if msg != None:
-                if len(msg) != 0:
-                    self.school_name = str(msg)
-                    EventMesh.publish("set_storage_config",["school_name",str(msg)])
-            
-
-        def get_school_name(self, event, msg):
-            if self.school_name:
-                return self.school_name
-            else:
-                return None
-        
-        def set_classname(self, event, msg): 
-            if msg != None:
-                if len(msg) != 0:
-                    self.class_name = str(msg)
-                    EventMesh.publish("set_storage_config",["class_name",str(msg)])
-                
-            
-        def get_classname(self, event, msg):
-            if self.class_name:
-                return self.class_name
-            else:
-                return None
-        def set_full_name(self, event, msg): 
-            if msg != None:
-                if len(msg) != 0:
-                    self.full_name = str(msg)
-                    EventMesh.publish("set_storage_config",["full_name",str(msg)])
-
-        def get_full_name(self, event, msg):
-            if self.full_name:
-                return self.full_name
-            else:
-                return None
-            
-    
-    class vedioInforManager(Abstract):#
-        def __init__(self):
-            self.call_id = ""
-            self.meet_id = ""#会议id
-            self.call_type = 0 #会议id
-            self.tokens_data= ""#tokens
-            self.timer = osTimer()
-            self.videobook = {}
-            self.check_json = 0
-            self.check_json = ql_fs.path_exists("/usr/static/storage_file/videobook.json")
-
-            if self.check_json == True:
-                with open("/usr/static/storage_file/videobook.json","r",encoding="utf-8") as fd:
-                    self.videobook = ujson.load(fd)
-                    print("读取视频通话账号列表")
-            
-            self.video_state = 0
-            self.video_count = 0
-            self.video_state_time = 0
-
-            self.video_dev_mode = 0
-
-            self.video_led_state = 0
-            self.video_answer = 0
-
-            self.video_timer = 0
-
-            self.video_init = 0
-            self.video_network_end = 0 #网络不好或者信号较差菊风底层挂断当前视频通话
-            self.videoInfo_queue = Queue()
-            _thread.stack_size(10*1024)
-            _thread.start_new_thread(self.videoInfo_queue_thread, ())
-            _thread.stack_size(8*1024)
-            EventMesh.subscribe("publish_message_event_videoInfo",self.publish_message_event_videoInfo)
-            pass
-
-        def videoInfo_queue_thread(self):
-            while True:
-                data = self.videoInfo_queue.get()
-                #EventMesh.debug_log("ledInfo_queue:data = {}".format(data))
-                if data != None:
-                    try:
-                        data["func"](data["data"])
-                    except Exception as e:
-                        EventMesh.debug_log("ledInfo_queue:ERROR:{}".format(e))
-                        usys.print_exception(e)
-        def publish_message_event_videoInfo(self,event,msg):
-            self.videoInfo_queue.put(msg)
-
-        def publish_led_event_cb(self, *args, **kwargs):
-            EventMesh.publish("publish_message_event_videoInfo",{"func":self.video_time_cb,"data":0})
-
-        def post_processor_after_instantiation(self):
-            EventMesh.subscribe("set_vedio_call_id", self.set_vedio_call_id)#
-            EventMesh.subscribe("set_vedio_meet_id", self.set_vedio_meet_id)#
-            EventMesh.subscribe("set_vedio_call_type", self.set_vedio_call_type)#
-            EventMesh.subscribe("set_vedio_tokens_data", self.set_vedio_tokens_data)#
-
-            EventMesh.subscribe("get_vedio_call_id", self.get_vedio_call_id)#
-            EventMesh.subscribe("get_vedio_meet_id", self.get_vedio_meet_id)#
-            EventMesh.subscribe("get_vedio_call_type", self.get_vedio_call_type)#
-            EventMesh.subscribe("get_vedio_tokens_data", self.get_vedio_tokens_data)#
-
-
-            EventMesh.subscribe("open_vedio_infor",self.open_vedio_infor)
-            EventMesh.subscribe("close_jrtc_event",self.close_jrtc_event)
-
-            EventMesh.subscribe("get_videobook_list", self.get_videobook_list)
-            EventMesh.subscribe("set_videobook_list", self.set_videobook_list)
-
-            EventMesh.subscribe("set_video_state", self.set_video_state)
-            EventMesh.subscribe("get_video_state", self.get_video_state)
-
-            EventMesh.subscribe("set_dev_app_mode", self.set_dev_app_mode)
-            EventMesh.subscribe("get_dev_app_mode", self.get_dev_app_mode)
-
-            EventMesh.subscribe("close_video_timer",self.close_video_timer)
-
-            EventMesh.subscribe("call_viode_book_num",self.call_viode_book_num)
-
-            EventMesh.subscribe("app_rtalk_cb",self.app_rtalk_cb)#app拒绝视频通话
-
-            EventMesh.subscribe("video_answer_cb",self.video_answer_cb)#接听视频通话
-
-            EventMesh.subscribe("video_newwork_reject_cb",self.video_newwork_reject_cb)#端挂断视频通话
-            EventMesh.subscribe("video_dev_reject_cb",self.video_dev_reject_cb)#手表端挂断视频或者语音通话
-
-            EventMesh.subscribe("video_no_network",self.video_no_network)#打着突然掉网或者未绑定设备 每10s检测一次
-
-            EventMesh.subscribe("clear_video_timer_state",self.clear_video_timer_state)
-
-            EventMesh.subscribe("set_vedio_init",self.set_vedio_init)
-            
-
-            EventMesh.subscribe("set_app_dev_end_state",self.set_app_dev_end_state)#设置是app 设备 还是主动信号不好的挂断当前的视频通话
-            EventMesh.subscribe("get_app_dev_end_state",self.get_app_dev_end_state)#设置是app 设备 还是主动信号不好的挂断当前的视频通话
-
-        def set_video_state(self, event, msg):#视频通话 1是刚播进去 2 是手机拨进去 3是正在加入中 5是已接通出现画面
-            self.video_state = msg
-
-        def get_video_state(self, event, msg):
-            return self.video_state
-        
-        def set_dev_app_mode(self, event, msg):#设置是手表拨 还是手机app拨视频通话 0未拨打 1是手表设备端  2 手机app拨打视频通话
-            self.video_dev_mode = msg
-
-        def get_dev_app_mode(self, event, msg):
-            return self.video_dev_mode
-        
-        def get_videobook_list(self, event, msg):
-            self.check_json = ql_fs.path_exists("/usr/static/storage_file/videobook.json")
-            return [self.check_json,self.videobook]
-        
-        def set_videobook_list(self, event, msg):
-            print("videolist",msg)
-            self.check_json = msg[0]
-            self.videobook = msg[1]
-
-        def call_viode_book_num(self, event, msg):#默认拨打视频通话列表第一个
-            self.video_led_state = 0
-            self.video_network_end = 0
-            EventMesh.publish("clear_video_timer_state")
-            if EventMesh.publish(constants.EVENT.GET_CONNECT) == 1:#未联网提示关机
-                if len(self.videobook) != 0:#已联网未添加账号
-                    phonebook_keys = sorted(self.videobook.keys())
-                    name = self.videobook[phonebook_keys[0]]
-                    key_tmp = phonebook_keys[0][4:]
-                    print("key_tmp list",key_tmp)
-                    print("calling",key_tmp)
-                    EventMesh.publish("set_vedio_call_id", key_tmp)#
-                    EventMesh.publish("set_vedio_call_type", 1)#
-                    EventMesh.publish("set_video_state", 1)#
-                    EventMesh.publish("set_dev_app_mode", 1)#
-                    EventMesh.publish("close_hr_sop2")##在测试心率血氧 血压体温是关闭测试
-                    EventMesh.publish("video_call_out_cb",1)#视频通话拨进中
-                    EventMesh.publish(constants.PROTOCOL.AGTALK_SEND,[1,key_tmp])
-                else:
-                    EventMesh.publish("video_call_out_cb",None)#视频通话拨进中
-                    print("no video list")
-                    pass
-            else:
-                EventMesh.publish("set_sim_mode")#
-                pass
-        
-
-            
-        def set_vedio_call_id(self, event, msg): 
-            self.call_id = msg
-
-        def set_vedio_meet_id(self, event, msg): 
-            self.meet_id = msg
-
-        def set_vedio_call_type(self, event, msg): 
-            self.call_type = msg
-
-        def set_vedio_tokens_data(self, event, msg): 
-            self.tokens_data= msg
-            
-
-        def get_vedio_call_id(self, event, msg): 
-            return self.call_id
-        
-        def get_vedio_meet_id(self, event, msg): 
-            return self.meet_id
-        
-        def get_vedio_call_type(self, event, msg): 
-            return self.call_type
-        
-        def get_vedio_tokens_data(self, event, msg): 
-            return self.tokens_data
-
-        def set_vedio_init(self, event, msg): 
-            self.video_init = 0
-
-        def open_vedio_infor(self,event,msg):
-            if self.video_init == 0:
-                self.video_init = 1
-                EventMesh.publish(constants.EVENT.SYSTEM_UP)#唤醒休眠
-                call_id = EventMesh.publish("get_vedio_call_id")#对方的账号
-                meet_id = EventMesh.publish("get_vedio_meet_id")#共有的会议id
-                call_type = EventMesh.publish("get_vedio_call_type")#呼叫类型
-                tokens_data = EventMesh.publish("get_vedio_tokens_data")#tookens数据#云米平台不需要tokens
-            
-
-
-                
-                uid = str(call_id)
-                ticket = str(meet_id)
-
-                # data = ['6951832', '876226002021444', '1', '01lqlyqzQ4Gozdz8OJv1Mij2Y3PBq2y3+rtIA26Ge+m2QHTc/Vk=gufkGNMBiYhPjbq1tLCwtLKysLKws7a2tg==']
-
-                tokens = str(tokens_data)
-                appkey = "efe9f8800a39d96244234097"#
-                uid_key = "25v9C652123QL3N8"
-
-                # appkey = "249e7d505516af0a7ed44097"
-                # uid_key = "qQI4gkB9FxH8J2cb"
-                imei = EventMesh.publish(constants.EVENT.GET_IMEI)
-                oneself_id = str(imei)#自己的账号默认是imei号
-
-            
-                
-                print("uid ",uid,ticket,oneself_id)
-
-                
-                self.video_count = 0
-                self.video_state_time = 0
-                self.video_led_state = 0
-                self.video_answer = 0
-                self.video_timer = 0
-                self.timer.start(1*1000,1,self.publish_led_event_cb)
-            
-
-        def video_time_cb(self,data):#1s定时器 实时监测视频通话的状态 3是拨进未接通 5是接通出画面了
-            EventMesh.publish("system_sleep_rest")#防止黑屏 
-            call_state = 1
-            video_state = EventMesh.publish("get_video_state")#这个函数获取为了防止不进回调不置0
-            get_video_state = EventMesh.publish("get_video_in_out_state")
-            dev_mode = EventMesh.publish("get_dev_app_mode")
-            if self.video_led_state == 1 or self.video_timer == 1:#手表挂断不在进入
-                self.timer.stop()
-                return
-
-            if video_state != 0 or call_state != 0:
-                if get_video_state == 0 and call_state != 0:#双方接通如果是信号不好就开始计算30 30s过后还没有出画面就挂断当前视频通话
-                    self.video_count+=1
-                    if self.video_count > 30:
-                        if call_state != 5:
-                            self.video_state = 0
-                            self.video_state_time = 0
-                            self.timer.stop()
-                            EventMesh.publish("video_newwork_reject_cb",5)#挂断视频通话
-                            return
-
-                if call_state == 5:#已经接通出画面了
-                    self.video_count = 0
-                    self.video_answer = 4
-                    EventMesh.publish("set_video_in_out_state",0)
-                    if self.video_state_time == 0:
-                        self.video_state_time = 1
-                        EventMesh.publish("stop_led_timer")#设置参数
-                        EventMesh.publish("close_timer_all")#
-                        EventMesh.publish("video_answer_mode_timer_cb",2)#
-
-                    EventMesh.publish("set_video_state", 5)
-                else:
-                    self.video_state_time = 0 
-                    if call_state != 0:#信号不好的时候正在接听
-                        EventMesh.publish("set_video_state", call_state)
-
-                        if call_state == 4:
-                            EventMesh.publish("stop_led_timer")#设置参数
-                            EventMesh.publish("close_timer_all")#
-
-                        if dev_mode != 0:
-                            if get_video_state == 0 and call_state != 4 and self.video_answer == 0:
-                                EventMesh.publish("video_answer_mode_timer_cb",3)#
-                        
-                    if call_state == 0:
-                        self.timer.stop()
-                        EventMesh.publish("video_newwork_reject_cb",1)
-            else:
-                self.video_state_time = 0
-                self.video_count = 0
-                self.timer.stop()
-                EventMesh.publish("set_video_state", 0)
-                EventMesh.publish("video_newwork_reject_cb",1)
-
-        def video_waite_event_time_cb(self,*argc):#正在接听中,请稍候
-            EventMesh.publish("video_answer_mode_timer_cb",1)
-            pass
-
-        def video_answer_event_time_cb(self,*argc):#对方已接听可以正常视频通话了
-            EventMesh.publish("video_answer_mode_timer_cb",2)
-            pass
-        def video_no_network(self,event,msg):#视频通话无网络
-            if EventMesh.publish(constants.EVENT.GET_CONNECT) == 0:#
-                if EventMesh.publish("get_video_state") != 0:
-                    EventMesh.publish("video_newwork_reject_cb",None)
-                pass
-
-
-        def close_video_timer(self,event,msg):
-            self.timer.stop()
-            pass
-        def close_jrtc_event(self,event,msg):
-            
-            pass
-
-
-        def video_answer_cb(self,event,msg):#手表端拒绝视频通话
-            EventMesh.publish("stop_led_timer")#关闭亮灯模式
-            EventMesh.publish("close_timer_all")##关闭统一的计时器
-            EventMesh.publish("set_video_in_out_state",0)
-            EventMesh.publish("open_vedio_infor")#启动视频通话的SDK相关配置
-
-        
-        def clear_video_timer_state(self,event,msg):#清除标识
-            self.video_timer = 0
-            self.video_network_end = 0
-        
-        def video_newwork_reject_cb(self,event,msg):#信号不好底层SDK挂断
-            if self.video_led_state != 2:#2表示app挂断
-                if self.video_network_end == 1:
-                    return
-                self.video_network_end = 1
-                self.video_timer = 1
-                self.video_init = 0
-                EventMesh.publish("stop_led_timer")#设置参数
-                EventMesh.publish("close_timer_all")#
-                EventMesh.publish("close_video_timer")
-                EventMesh.publish("set_video_state", 0)
-                EventMesh.publish("set_dev_app_mode", 0)
-                EventMesh.publish("set_video_in_out_state",0)
-                call_id = str(EventMesh.publish("get_vedio_call_id"))#
-                meet_id = str(EventMesh.publish("get_vedio_meet_id"))#
-                call_type = int(EventMesh.publish("get_vedio_call_type"))#
-
-                
-                if self.video_led_state == 0:
-                    EventMesh.publish("video_answer_mode_timer_cb",4)#提示对方已挂断
-                    EventMesh.publish(constants.PROTOCOL.RCALLING_SEND,[call_id,meet_id,call_type])
-
-
-        def video_dev_reject_cb(self,event,msg):#手表主动挂断
-            if self.video_timer == 0:
-                self.video_init = 0
-                EventMesh.publish("stop_led_timer")#设置参数
-                EventMesh.publish("close_timer_all")#
-                EventMesh.publish("close_video_timer")
-                EventMesh.publish("set_video_state", 0)
-                EventMesh.publish("set_dev_app_mode", 0)
-                EventMesh.publish("set_video_in_out_state",0)
-                call_id = str(EventMesh.publish("get_vedio_call_id"))#
-                meet_id = str(EventMesh.publish("get_vedio_meet_id"))#
-                call_type = int(EventMesh.publish("get_vedio_call_type"))#
-
-                self.video_led_state = 1
-                self.video_timer = 1
-                EventMesh.publish(constants.PROTOCOL.RCALLING_SEND,[call_id,meet_id,call_type])
-
-
-            
-        def set_app_dev_end_state(self,event,msg):#app拒绝视频通话
-            self.video_led_state = 0 #手表挂断不在进入
-
-        def get_app_dev_end_state(self,event,msg):#app拒绝视频通话
-            return self.video_led_state #手表挂断不在进入
-
-        def app_rtalk_cb(self,event,msg):#app拒绝视频通话
-            dev_mode = EventMesh.publish("get_dev_app_mode")#如果是app主动挂断需要提示音频文件
-            video_state = EventMesh.publish("get_video_state")#清除视频通话状态
-            if self.video_led_state != 0 or self.video_timer != 0:#手表挂断不在进入
-                return
-            
-            self.video_init = 0
-            self.video_timer = 1
-            self.video_led_state = 2
-            EventMesh.publish(constants.EVENT.SYSTEM_UP)#
-
-            EventMesh.publish("stop_led_timer")#设置参数
-            EventMesh.publish("close_timer_all")#
-            EventMesh.publish("close_video_timer")
-            EventMesh.publish("set_dev_app_mode", 0)
-            EventMesh.publish("set_video_state",0)#清除视频通话状态
-            EventMesh.publish("set_video_in_out_state",0)#清除视频通话拨进还是拨出的状态
-            EventMesh.publish("video_answer_mode_timer_cb",4)##提示对方已挂断
-
-
-    def jrtc_cb(close_sta):#注册回调
-        print("jrtc callback:", close_sta)
-        if close_sta == 0 or close_sta == 1:
-            EventMesh.publish("set_video_state", 0)
-            EventMesh.publish("set_video_in_out_state",0)
-            EventMesh.publish("set_vedio_init")
-
-
-
-    import fota
-    class firwDownloadManager(Abstract):#
-        def __init__(self):
-            self.timer = osTimer()
-
-
-        def post_processor_after_instantiation(self):
-            EventMesh.subscribe("firware_download", self.firware_download)#
-
-        def firware_download(self, event, msg): 
-            number = str(msg)
-            sms.sendPduMsg(number, 'set ok', 'UCS2')
-            self.timer.start(10*1000,0,self.fun)
-
-        def fun(self,*argc):
-            fota_obj = fota()
-            fota_obj.httpDownload(url1="http://u-oss.thisiot.com/test/dfota_1.bin",url2="http://u-oss.thisiot.com/test/dfota_2.bin")
-
-
-
-
-
-
-
+from common import Abstract, LogAdapter\r
+import EventMesh\r
+import usocket\r
+import ql_fs\r
+import ujson\r
+import _thread\r
+import modem\r
+import utime\r
+import sim\r
+import net\r
+import dataCall\r
+import checkNet\r
+import osTimer\r
+import constants\r
+import sms\r
+from common import Lock, Abstract, LogAdapter\r
+#from location import GPS, GPSMatch,CellLocator\r
+from misc import USB, Power, ADC\r
+from machine import ExtInt, Pin,Timer,RTC,UART\r
+import EventMesh\r
+import usys\r
+import audio\r
+from machine import I2C\r
+\r
+import pm\r
+import ure\r
+import urandom\r
+  \r
+from machine import RTC\r
+import quecgnss\r
+import wifiScan\r
+import math\r
+import voiceCall\r
+from misc import PWM\r
+from queue import Queue\r
+if EventMesh.model == "D15":\r
+    from led_d15 import led_mode,open_led_green,close_led_green,open_led_red,close_led_red,close_led_white\r
+    heartbeat_time = 7*60 #心跳时间\r
+\r
+    def get_autoblood_value():#血压值\r
+        data = RTC().datetime()\r
+        hour = int(data[4])\r
+        blood_Maxvalue = 0\r
+        blood_Minvalue = 0\r
+        if hour >= 6 and hour <= 10:\r
+            random_numMax = urandom.randint(0, 30)\r
+            random_numMin = urandom.randint(0, 20)\r
+            blood_Maxvalue = 120+random_numMax\r
+            blood_Minvalue = 75+random_numMin\r
+\r
+            print("get_autoblood_value 6 -10",blood_Maxvalue,blood_Minvalue)\r
+            # return [self.blood_Maxvalue,self.blood_Minvalue]\r
+        elif hour > 10 and hour <= 14:#10-14(10,14]\r
+            random_numMax = urandom.randint(0, 20)\r
+            random_numMin = urandom.randint(0, 25)\r
+            blood_Maxvalue = 115+random_numMax\r
+            blood_Minvalue = 60+random_numMin\r
+            print("get_autoblood_value 10 -14",blood_Maxvalue,blood_Minvalue)\r
+            # return [self.blood_Maxvalue,self.blood_Minvalue]\r
+        elif hour > 14 and hour <= 18:#14-18\r
+            random_numMax = urandom.randint(0, 25)\r
+            random_numMin = urandom.randint(0, 15)\r
+            blood_Maxvalue = 115+random_numMax\r
+            blood_Minvalue = 70+random_numMin\r
+\r
+            print("get_autoblood_value 14 -18",blood_Maxvalue,blood_Minvalue)\r
+            # return [self.blood_Maxvalue,self.blood_Minvalue]\r
+        elif hour > 2 and hour < 6:#2-6\r
+            random_numMax = urandom.randint(0, 30)\r
+            random_numMin = urandom.randint(0, 20)\r
+            blood_Maxvalu = 105+random_numMax\r
+            blood_Minvalue = 65+random_numMin\r
+\r
+            \r
+            print("get_autoblood_value 2 -6",blood_Maxvalue,blood_Minvalue)\r
+            # return [self.blood_Maxvalue,self.blood_Minvalue]\r
+        else:#18-2 19 20 21 22 23 1 2\r
+            random_numMax = urandom.randint(0, 30)\r
+            random_numMin = urandom.randint(0, 20)\r
+            blood_Maxvalue = 100+random_numMax\r
+            blood_Minvalue = 60+random_numMin\r
+            print("get_autoblood_value 18 -2",blood_Maxvalue,blood_Minvalue)\r
+        return [blood_Maxvalue,blood_Minvalue]\r
+\r
+    def get_blood_sugar_value():#血糖值\r
+        data = RTC().datetime()\r
+        hour = int(data[4])\r
+        blood_sugar = 0\r
+        if (hour >= 6 and hour <= 8) or (hour >= 12 and hour <= 13) or (hour >= 18 and hour <= 19):#6-8 12-13 18-19 \r
+            random_value = urandom.randint(39, 61)\r
+            blood_sugar = random_value/10\r
+            print("get_blood_sugar_value 6 -10",blood_sugar)\r
+            # return [self.blood_Maxvalue,self.blood_Minvalue]\r
+        elif (hour > 8 and hour <= 9) or (hour >= 14 and hour <= 15) or (hour >= 20 and hour <= 21):#8-9 14-15 20-21\r
+            random_value = urandom.randint(67, 90)\r
+            blood_sugar = random_value/10\r
+            print("get_blood_sugar_value 10 -14",blood_sugar)\r
+        else:#18-2 19 20 21 22 23 1 2 10-11 16-17 21-22\r
+            random_value = urandom.randint(39, 78)\r
+            blood_sugar = random_value/10\r
+            print("get_blood_sugar_value 18 -2",blood_sugar)\r
+        return blood_sugar\r
+\r
+\r
+\r
+\r
+    class PhoneVolumeLevelManager(Abstract):\r
+        def __init__(self):\r
+            self.level = 0\r
+\r
+        def post_processor_after_instantiation(self):\r
+            EventMesh.subscribe("push_add_phonering_level", self.add)\r
+            EventMesh.subscribe("push_reduce_phonering_level", self.reduce)\r
+            EventMesh.subscribe("get_phonering_level", self.get)\r
+\r
+        def add(self, event, msg):\r
+            if self.level < 7:\r
+                self.level = self.level + 1\r
+\r
+        def reduce(self, event, msg):\r
+            if self.level > 0:\r
+                self.level = self.level - 1\r
+\r
+        def get(self, event=None, msg=None):\r
+            return self.level\r
+\r
+    class MsgVolumeLevelManager(Abstract):\r
+        def __init__(self):\r
+            self.level = 0\r
+\r
+        def post_processor_after_instantiation(self):\r
+            EventMesh.subscribe("push_add_msgvolume_level", self.add)\r
+            EventMesh.subscribe("push_reduce_msgvolume_level", self.reduce)\r
+            EventMesh.subscribe("get_msgvolume_level", self.get)\r
+\r
+        def add(self, event, msg):\r
+            if self.level < 7:\r
+                self.level = self.level + 1\r
+\r
+        def reduce(self, event, msg):\r
+            if self.level > 0:\r
+                self.level = self.level - 1\r
+\r
+        def get(self, event=None, msg=None):\r
+            return self.level\r
+\r
+    class AlarmVolumeLevelManager(Abstract):\r
+        def __init__(self):\r
+            self.level = 0\r
+\r
+        def post_processor_after_instantiation(self):\r
+            EventMesh.subscribe("push_add_alarmvolume_level", self.add)\r
+            EventMesh.subscribe("push_reduce_alarmvolume_level", self.reduce)\r
+            EventMesh.subscribe("get_alarmvolume_level", self.get)\r
+\r
+        def add(self, event, msg):\r
+            if self.level < 7:\r
+                self.level = self.level + 1\r
+\r
+        def reduce(self, event, msg):\r
+            if self.level > 0:\r
+                self.level = self.level - 1\r
+\r
+        def get(self, event=None, msg=None):\r
+            return self.level\r
+            \r
+    class StopwatchManager(Abstract):\r
+        def __init__(self):\r
+            self.level = 0\r
+            self.ms_value = 0\r
+            self.sec_value = 0\r
+            self.min_value = 0\r
+            self.timer = Timer(Timer.Timer1)\r
+\r
+        def post_processor_after_instantiation(self):\r
+            EventMesh.subscribe("stopwatch_start", self.start)\r
+            EventMesh.subscribe("stopwatch_stop", self.paused)\r
+            EventMesh.subscribe("stopwatch_reset", self.reset)\r
+            EventMesh.subscribe("get_stopwatch_ms", self.get_ms)\r
+            EventMesh.subscribe("get_stopwatch_sec", self.get_sec)\r
+            EventMesh.subscribe("get_stopwatch_min", self.get_min)\r
+\r
+        def start(self, event, msg):        \r
+            self.timer.start(period=100, mode=self.timer.PERIODIC, callback=self.fun)\r
+        \r
+        def paused(self, event, msg):        \r
+            self.timer.stop()\r
+        \r
+        def reset(self, event, msg):\r
+            self.timer.stop()\r
+\r
+            self.sec_value = 0\r
+            self.min_value = 0\r
+            self.ms_value = 0\r
+\r
+        def fun(self):\r
+            self.ms_value += 1\r
+            if self.ms_value > 9:\r
+                self.ms_value = 0   \r
+                self.sec_value += 1\r
+            if self.sec_value > 60:\r
+                self.sec_value = 0\r
+                self.min_value += 1\r
+            if self.min_value > 60:\r
+                self.timer.stop()\r
+\r
+        def get_ms(self, event=None, msg=None):\r
+            return self.ms_value\r
+\r
+        def get_min(self, event=None, msg=None):\r
+            return self.min_value\r
+\r
+        def get_sec(self, event=None, msg=None):\r
+            return self.sec_value\r
+\r
+    class CountdownManager(Abstract):\r
+        def __init__(self):\r
+            self.sec = 0\r
+            self.min = 0\r
+            self.hour = 0\r
+            self.timer = osTimer()\r
+            self.total = 0\r
+            self.time_cb = 0\r
+            self.time_play = 0\r
+            self.total_sec = 0\r
+\r
+        def post_processor_after_instantiation(self):\r
+            EventMesh.subscribe("add_countdown_sec", self.add_sec)\r
+            EventMesh.subscribe("reduce_countdown_sec", self.reduce_sec)\r
+            EventMesh.subscribe("add_countdown_min", self.add_min)\r
+            EventMesh.subscribe("reduce_countdown_min", self.reduce_min)\r
+            EventMesh.subscribe("add_countdown_hour", self.add_hour)\r
+            EventMesh.subscribe("reduce_countdown_hour", self.reduce_hour)\r
+            EventMesh.subscribe("get_countdown_sec", self.get_sec)\r
+            EventMesh.subscribe("get_countdown_min", self.get_min)\r
+            EventMesh.subscribe("get_countdown_hour", self.get_hour)\r
+\r
+            EventMesh.subscribe("set_countdown_off_state", self.set_countdown_off_state)\r
+            EventMesh.subscribe("get_countdown_off_state", self.get_countdown_off_state)\r
+\r
+\r
+            EventMesh.subscribe("set_countdown_all_time", self.set_countdown_all_time)\r
+            EventMesh.subscribe("get_countdown_all_time", self.get_countdown_all_time)\r
+\r
+            EventMesh.subscribe("countdown_end_cb", self.countdown_end_cb)\r
+\r
+            EventMesh.subscribe("reset_time_countdown",self.reset)\r
+\r
+        def set_countdown_all_time(self, event, msg):\r
+            self.total = msg[0]\r
+            self.total_sec = msg[1]\r
+            # EventMesh.debug_log("self.total:{} self.total_sec:{}".format(self.total,self.total_sec))\r
+\r
+\r
+        def get_countdown_all_time(self, event, msg):\r
+            return self.total\r
+        \r
+        def set_countdown_off_state(self, event, msg):\r
+\r
+            self.time_cb = msg[0]\r
+            self.time_play = msg[1]\r
+            # EventMesh.debug_log("self.time_cb:{} self.total_sec:{}".format(self.time_cb,self.time_play))\r
+\r
+\r
+        def get_countdown_off_state(self, event, msg):\r
+            return [self.time_cb,self.time_play]\r
+        \r
+        def countdown_end_cb(self, event, msg):\r
+            \r
+            if self.time_cb == 1 and self.time_play == 1:\r
+                date_tmp = utime.localtime()\r
+                time_tmp = utime.mktime(date_tmp) \r
+                reduce = time_tmp- self.total_sec\r
+                EventMesh.debug_log("self.time_cb:{} self.time_play:{} self.total:{} self.total_sec:{}".format(self.time_cb,self.time_play, self.total,self.total_sec))\r
+                self.total = self.total - reduce\r
+                if self.total <= 0:\r
+                    self.total = 0\r
+                    self.time_cb = 0\r
+                    self.time_play = 0\r
+                    self.sec = 0\r
+                    self.min = 0\r
+                    self.hour = 0\r
+                    \r
+                    EventMesh.publish("load_screen", {"screen": "countdown_end"})\r
+                    return\r
+                self.total_sec = time_tmp\r
+\r
+\r
+        def add_sec(self, event, msg):\r
+            if self.sec < 59:\r
+                self.sec = self.sec + 1\r
+\r
+        def reduce_sec(self, event, msg):\r
+            if self.sec > 0:\r
+                self.sec = self.sec - 1\r
+\r
+        def add_min(self, event, msg):\r
+            if self.min < 59:\r
+                self.min = self.min + 1\r
+\r
+        def reduce_min(self, event, msg):\r
+            if self.min > 0:\r
+                self.min = self.min - 1\r
+\r
+        def add_hour(self, event, msg):\r
+            if self.hour < 99:\r
+                self.hour = self.hour + 1\r
+\r
+        def reduce_hour(self, event, msg):\r
+            if self.hour > 0:\r
+                self.hour = self.hour - 1\r
+\r
+        def get_sec(self, event=None, msg=None):\r
+            return self.sec\r
+\r
+        def get_min(self, event=None, msg=None):\r
+            return self.min\r
+\r
+        def get_hour(self, event=None, msg=None):\r
+            return self.hour\r
+        \r
+\r
+        \r
+        def reset(self, event=None, msg=None):\r
+            self.hour = 0\r
+            self.min = 0\r
+            self.sec = 0\r
+        \r
+        \r
+\r
+    BATTERY_OCV_TABLE = {\r
+        "nix_coy_mnzo2": {\r
+            55: {\r
+                4290: 100, 4237: 95, 4179: 90, 4123: 85, 4070: 80, 4020: 75, 3963: 70, 3919: 65, 3882: 60, 3847: 55,\r
+                3818: 50, 3794: 45, 3772: 40, 3752: 35, 3733: 30, 3716: 25, 3699: 20, 3677: 15, 3652: 10, 3629: 5, 3400: 0,\r
+            },\r
+            20: {\r
+                4290: 100, 4237: 95, 4179: 90, 4123: 85, 4070: 80, 4020: 75, 3963: 70, 3919: 65, 3882: 60, 3847: 55,\r
+                3818: 50, 3794: 45, 3772: 40, 3752: 35, 3733: 30, 3716: 25, 3699: 20, 3677: 15, 3652: 10, 3629: 5, 3400: 0,\r
+            },\r
+            0: {\r
+                4290: 100, 4237: 95, 4179: 90, 4123: 85, 4070: 80, 4020: 75, 3963: 70, 3919: 65, 3882: 60, 3847: 55,\r
+                3818: 50, 3794: 45, 3772: 40, 3752: 35, 3733: 30, 3716: 25, 3699: 20, 3677: 15, 3652: 10, 3629: 5, 3400: 0,\r
+            },\r
+        },\r
+    }\r
+\r
+\r
+\r
+    class Battery(object):\r
+        """This class is for battery info.\r
+\r
+        This class can get battery voltage and energy.\r
+        if adc_args is not None, use cbc to read battery\r
+\r
+        adc_args: (adc_num, adc_period, factor)\r
+\r
+            adc_num: ADC channel num\r
+            adc_period: Cyclic read ADC cycle period\r
+            factor: calculation coefficient\r
+        """\r
+\r
+        def __init__(self, adc_args=None, chrg_gpion=None, stdby_gpion=None):\r
+            self.__energy = 100\r
+            self.__temp = 55\r
+\r
+            # ADC params\r
+            self.__adc = None\r
+            if adc_args:\r
+                self.__adc_num, self.__adc_period, self.__factor = adc_args\r
+                if not isinstance(self.__adc_num, int):\r
+                    raise TypeError("adc_args adc_num is not int number.")\r
+                if not isinstance(self.__adc_period, int):\r
+                    raise TypeError("adc_args adc_period is not int number.")\r
+                if not isinstance(self.__factor, float):\r
+                    raise TypeError("adc_args factor is not int float.")\r
+                self.__adc = ADC()\r
+\r
+            # Charge params\r
+            self.__charge_callback = None\r
+            self.__charge_status = None\r
+            self.__chrg_gpion = chrg_gpion\r
+            self.__stdby_gpion = stdby_gpion\r
+            self.__chrg_gpio = None\r
+            self.__stdby_gpio = None\r
+            self.__chrg_exint = None\r
+            self.__stdby_exint = None\r
+            if self.__chrg_gpion is not None and self.__stdby_gpion is not None:\r
+                self.__init_charge()\r
+\r
+        def __chrg_callback(self, args):\r
+            self.__update_charge_status()\r
+            if self.__charge_callback is not None:\r
+                self.__charge_callback(self.__charge_status)\r
+\r
+        def __stdby_callback(self, args):\r
+            self.__update_charge_status()\r
+            if self.__charge_callback is not None:\r
+                self.__charge_callback(self.__charge_status)\r
+\r
+        def __update_charge_status(self):\r
+            if self.__chrg_gpio.read() == 1 and self.__stdby_gpio.read() == 1:\r
+                self.__charge_status = 0\r
+            elif self.__chrg_gpio.read() == 0 and self.__stdby_gpio.read() == 1:\r
+                self.__charge_status = 1\r
+            elif self.__chrg_gpio.read() == 1 and self.__stdby_gpio.read() == 0:\r
+                self.__charge_status = 2\r
+            else:\r
+                raise TypeError("CHRG and STDBY cannot be 0 at the same time!")\r
+\r
+        def __init_charge(self):\r
+            self.__chrg_gpio = Pin(self.__chrg_gpion, Pin.IN, Pin.PULL_DISABLE)\r
+            self.__stdby_gpio = Pin(self.__stdby_gpion, Pin.IN, Pin.PULL_DISABLE)\r
+            self.__chrg_exint = ExtInt(self.__chrg_gpion, ExtInt.IRQ_RISING_FALLING, ExtInt.PULL_PU, self.__chrg_callback)\r
+            self.__stdby_exint = ExtInt(self.__stdby_gpion, ExtInt.IRQ_RISING_FALLING, ExtInt.PULL_PU,\r
+                                        self.__stdby_callback)\r
+            self.__chrg_exint.enable()\r
+            self.__stdby_exint.enable()\r
+            self.__update_charge_status()\r
+\r
+        def __get_soc_from_dict(self, key, volt_arg):\r
+            """Get battery energy from map"""\r
+            if key in BATTERY_OCV_TABLE["nix_coy_mnzo2"]:\r
+                volts = sorted(BATTERY_OCV_TABLE["nix_coy_mnzo2"][key].keys(), reverse=True)\r
+                pre_volt = 0\r
+                volt_not_under = 0  # Determine whether the voltage is lower than the minimum voltage value of soc.\r
+                for volt in volts:\r
+                    if volt_arg > volt:\r
+                        volt_not_under = 1\r
+                        soc1 = BATTERY_OCV_TABLE["nix_coy_mnzo2"][key].get(volt, 0)\r
+                        soc2 = BATTERY_OCV_TABLE["nix_coy_mnzo2"][key].get(pre_volt, 0)\r
+                        break\r
+                    else:\r
+                        pre_volt = volt\r
+                # EventMesh.debug_log("__get_soc_from_dict:{}".format(soc2 - (soc2 - soc1) * (pre_volt - volt_arg) // (pre_volt - volt)))\r
+                if pre_volt == 0:  # Input Voltarg > Highest Voltarg\r
+                    return soc1\r
+                elif volt_not_under == 0:\r
+                    return 0\r
+                else:\r
+                    return soc2 - (soc2 - soc1) * (pre_volt - volt_arg) // (pre_volt - volt)\r
+\r
+        def __get_soc(self, temp, volt_arg, bat_type="nix_coy_mnzo2"):\r
+            """Get battery energy by temperature and voltage"""\r
+            if bat_type == "nix_coy_mnzo2":\r
+                if temp > 30:\r
+                    return self.__get_soc_from_dict(55, volt_arg)\r
+                elif temp < 10:\r
+                    return self.__get_soc_from_dict(0, volt_arg)\r
+                else:\r
+                    return self.__get_soc_from_dict(20, volt_arg)\r
+\r
+        def __get_power_vbatt(self):\r
+            return int(sum([Power.getVbatt() for i in range(100)]) / 100)\r
+\r
+        def __get_adc_vbatt(self):\r
+            self.__adc.open()\r
+            utime.sleep_ms(self.__adc_period)\r
+            adc_list = list()\r
+            for i in range(self.__adc_period):\r
+                adc_list.append(self.__adc.read(self.__adc_num))\r
+                utime.sleep_ms(self.__adc_period)\r
+            adc_list.remove(min(adc_list))\r
+            adc_list.remove(max(adc_list))\r
+            adc_value = int(sum(adc_list) / len(adc_list))\r
+            self.__adc.close()\r
+            vbatt_value = adc_value * (self.__factor + 1)\r
+            return vbatt_value\r
+\r
+        def set_temp(self, temp):\r
+            """Set now temperature."""\r
+            if isinstance(temp, int) or isinstance(temp, float):\r
+                self.__temp = temp\r
+                return True\r
+            return False\r
+\r
+        def get_voltage(self):\r
+            """Get battery voltage"""\r
+            if self.__adc is None:\r
+                return self.__get_power_vbatt()\r
+            else:\r
+                return self.__get_adc_vbatt()\r
+\r
+        def get_energy(self,volt_arg ):\r
+            """Get battery energy"""\r
+            if( volt_arg == None) :\r
+                volt_arg = self.get_voltage()\r
+            self.__energy = self.__get_soc(self.__temp, volt_arg)\r
+            # EventMesh.debug_log("get_energy:volt_arg {} __energy{}".format(volt_arg,self.__energy))\r
+            return self.__energy\r
+\r
+        def set_charge_callback(self, charge_callback):\r
+            if self.__chrg_gpion is not None and self.__stdby_gpion is not None:\r
+                if callable(charge_callback):\r
+                    self.__charge_callback = charge_callback\r
+                    return True\r
+            return False\r
+\r
+        def get_charge_status(self):\r
+            return self.__charge_status\r
+\r
+    class BatteryManager(Abstract):\r
+        def __init__(self):\r
+            """电池管理器"""\r
+            self.battery = Battery()\r
+            self.low_battery = False\r
+\r
+        def post_processor_after_instantiation(self):\r
+            """订阅此类所有的事件到 EventMesh中"""\r
+            EventMesh.subscribe("get_battery", self.get_battery)\r
+\r
+        def get_battery(self, event=None, msg=None):\r
+            battery = self.battery.get_energy(msg)\r
+            return battery\r
+\r
+        def get_voltage(self, event=None, msg=None):\r
+            voltage = self.battery.get_voltage()\r
+            return voltage\r
+\r
+    class ConfigStoreManager(Abstract):\r
+        """\r
+        持久化落盘存储\r
+        """\r
+\r
+        def __init__(self):\r
+            self.file_name = "/usr/conf_store.json"\r
+            self.lock = Lock()\r
+            self.map = dict()\r
+\r
+        def post_processor_after_instantiation(self):\r
+            if ql_fs.path_exists(self.file_name):\r
+                self.map = ql_fs.read_json(self.file_name)\r
+            else:\r
+                self.__store()\r
+            EventMesh.subscribe("persistent_config_get", self.__read)\r
+            EventMesh.subscribe("persistent_config_store", self.__store)\r
+\r
+        def __read(self, event, msg):\r
+            with self.lock:\r
+                return self.map.get(msg)\r
+\r
+        def __store(self, event=None, msg=None):\r
+            if msg is None:\r
+                msg = dict()\r
+            with self.lock:\r
+                self.map.update(msg)\r
+                ql_fs.touch(self.file_name, self.map)\r
+            \r
+    class sosInfoCallManager(Abstract):\r
+        # 通讯录\r
+        def __init__(self):\r
+            pass\r
+\r
+        def post_processor_after_instantiation(self):\r
+            EventMesh.subscribe("set_sos_info_call", self.set_sos_info_call)\r
+\r
+        def set_sos_info_call(self, event, msg):\r
+            hangup_mode = EventMesh.publish("get_hangup_mode")\r
+            if hangup_mode == 1:\r
+                EventMesh.publish("set_sos_flag",0)\r
+                EventMesh.publish("set_sos_num",0)\r
+                EventMesh.publish("set_hangup_mode",0)\r
+            EventMesh.debug_log('hangup_mode disconnect',hangup_mode)\r
+            sos_flag = EventMesh.publish("get_sos_flag")\r
+            EventMesh.debug_log('voicecall sos_flag',sos_flag)\r
+            if sos_flag == 0 :\r
+                EventMesh.publish("set_sos_num",0)\r
+            else:\r
+                num = EventMesh.publish("get_sos_num")\r
+                number = EventMesh.publish("get_dial_sos_number")\r
+                if number != None:\r
+                    if len(number) > 0:\r
+                        if num == None:\r
+                            num = 0\r
+                        num+=1\r
+                        num_len = 0\r
+\r
+                        if len(number) == 1:\r
+                            num_len = len(number)+1#三次\r
+                        elif len(number) == 2:\r
+                            num_len = len(number)+1+2 #1+2+1+2\r
+                        elif len(number) == 3:\r
+                            num_len = len(number)+5 #1+3+5\r
+                        # EventMesh.debug_log("number:{} number_len :{} num:{} num_len:{}".format(number,len(number),num,num_len))\r
+                        if num > num_len :\r
+                            if len(number) == 1:\r
+                                number1 = str(number[0])\r
+                                sms.sendPduMsg(number1, '我需要你的帮助', 'UCS2')\r
+                            elif len(number) == 2:\r
+                                number1 = str(number[0])\r
+                                sms.sendPduMsg(number1, '我需要你的帮助', 'UCS2')\r
+\r
+                                number2 = str(number[1])\r
+                                sms.sendPduMsg(number2, '我需要你的帮助', 'UCS2')\r
+                            elif len(number) == 3:\r
+                                number1 = str(number[0])\r
+                                sms.sendPduMsg(number1, '我需要你的帮助', 'UCS2')\r
+                                number2 = str(number[1])\r
+                                sms.sendPduMsg(number2, '我需要你的帮助', 'UCS2')\r
+                                number3 = str(number[2])\r
+                                sms.sendPduMsg(number3, '我需要你的帮助', 'UCS2')\r
+                            EventMesh.publish("set_sos_flag",0)\r
+                            EventMesh.publish("set_sos_num",0)\r
+                        else:\r
+                        # EventMesh.debug_log("number:{} number_len :{}".format(number,len(number)))\r
+                            EventMesh.publish("set_sos_num",num)\r
+                            if len(number) == 1:\r
+                                if len(number[0]) != 0:\r
+                                    EventMesh.publish("set_callnumer_cb",number[0])\r
+                                    EventMesh.debug_log("phone 1")\r
+                            elif len(number) == 2:\r
+                                if num == 1 or num == 3 or num == 5: #1 2 3 4 5 \r
+                                    if len(number[1]) != 0:\r
+                                        EventMesh.debug_log("phone 2")\r
+                                        EventMesh.publish("set_callnumer_cb",number[1])\r
+                                elif num == 2 or num == 4:\r
+                                    if len(number[0]) != 0:\r
+                                        EventMesh.debug_log("phone 3")\r
+                                        EventMesh.publish("set_callnumer_cb",number[0])\r
+                            elif len(number) == 3:\r
+                                if num == 1 or num == 4 or num == 7:\r
+                                    if len(number[1]) != 0:\r
+                                        EventMesh.publish("set_callnumer_cb",number[1])\r
+                                        EventMesh.debug_log("phone 4")\r
+                                elif num == 2 or num == 5 or num == 8:\r
+                                    if len(number[2]) != 0:\r
+                                        EventMesh.debug_log("phone 5")\r
+                                        EventMesh.publish("set_callnumer_cb",number[2])\r
+                                elif num == 3 or num == 6 :\r
+                                    if len(number[0]) != 0:\r
+                                        EventMesh.debug_log("phone 6")\r
+                                        EventMesh.publish("set_callnumer_cb",number[0])   \r
+    \r
+    WL_timer = osTimer()   \r
+    def WL_timer_cb(*args):   \r
+        get_call = EventMesh.publish("get_call_state") \r
+        if get_call == 2:#只有拨进来才给接听\r
+            EventMesh.publish("answer_call_event")#接听电话\r
+    def voice_callback(args):\r
+        EventMesh.debug_log('voicecall iinfo:{}'.format(args))\r
+        if args[0] == 10:\r
+                get_UI_high_priority = EventMesh.publish("get_UI_high_priority")#如果在拨出去或者通话中屏蔽来电\r
+                if get_UI_high_priority == 1:\r
+                    EventMesh.publish("set_interrup_incall",1)\r
+                    return\r
+                EventMesh.debug_log('voicecall incoming call, PhoneNO.: ', args[6])\r
+                size_len = len(str(args[6]))\r
+                tmp = []\r
+                tmp = args[6]\r
+                find_num = tmp[0]\r
+                b = tmp[0].isdigit()#判断是否不是数字开头 暂时不用 因为截取了+判断不了 判断号码是否大于11位数,如果大于11位数 并且第一个字符是数字就按照最后11位做存储\r
+\r
+                if b == True and size_len > 11:\r
+                    tmp = tmp[size_len-11:]\r
+                WLKEY = EventMesh.publish("get_storage_config","WLKEY") \r
+                if WLKEY == "1" or WLKEY == "2":#开启了白名单\r
+                    on_list_flag = 0\r
+                    phonebook = EventMesh.publish("get_phonebook_list")\r
+                    phonebook_list = phonebook[1]\r
+                    EventMesh.debug_log("voice_callback:phonebook_list{}".format(phonebook_list))\r
+                    try:\r
+                        for value in phonebook_list.values():\r
+                            if value == args[6]:\r
+                                on_list_flag = 1\r
+                                break\r
+                    except Exception as e:\r
+                        usys.print_exception(e)\r
+                    EventMesh.debug_log("voice_callback:on_list_flag{}".format(on_list_flag))\r
+                    if on_list_flag == 1:#在白名单里\r
+                        if WLKEY == "2":\r
+                            WL_timer.start(30000, 0, WL_timer_cb)\r
+                    else:\r
+                        EventMesh.debug_log("voice_callback:不在白名单中,挂断")\r
+                        voiceCall.callEnd()\r
+                        return \r
+                viode_state = EventMesh.publish("get_video_state")\r
+                fall_down = EventMesh.publish("get_fall_down_state")#跌倒报警标识\r
+                if viode_state != 0 or fall_down != 0:\r
+                    voiceCall.callEnd()\r
+                    return\r
+\r
+                EventMesh.publish("set_call_state",2) \r
+                EventMesh.publish("dialin_call_event")#电话拨进响铃\r
+                # EventMesh.publish("load_screen", {"screen": "incoming_call","meta":str(tmp)})\r
+\r
+        elif args[0] == 11:\r
+                EventMesh.publish("set_UI_high_priority",0)\r
+                sos_flag = EventMesh.publish("get_sos_flag")\r
+                if sos_flag == 1:\r
+                    sos_flag = 0\r
+\r
+                    EventMesh.publish("set_sos_flag",0)\r
+\r
+                EventMesh.debug_log('voicecall connected, PhoneNO.: ', args[6])\r
+                size_len = len(str(args[6]))\r
+                tmp = []\r
+                tmp = args[6]\r
+                find_num = tmp[0]\r
+                b = tmp[0].isdigit()#判断是否不是数字开头 暂时不用 因为截取了+判断不了\r
+                if b == True and size_len > 11:\r
+                    tmp = tmp[size_len-11:]\r
+                EventMesh.publish("set_call_state",3) \r
+                # if EventMesh.publish("get_call_state") == 2:#打通了才可设置状态 防止挂断太及时,又拨出去了\r
+                #     EventMesh.publish("set_call_state",3) \r
+                # else:\r
+                #     EventMesh.publish("set_call_state",0) \r
+                # EventMesh.publish("load_screen", {"screen": "on_call","meta":str(tmp)})\r
+\r
+        elif args[0] == 12:\r
+                set_interrup_call = EventMesh.publish("get_interrup_incall")#打断这次不需要来电的ui事件 以免通话中退出当前界面进不去了\r
+                if set_interrup_call == 1:\r
+                    EventMesh.publish("set_interrup_incall",0)\r
+                    return\r
+\r
+                EventMesh.publish("set_interrup_incall",0)\r
+                EventMesh.publish("set_UI_high_priority",0)\r
+                \r
+\r
+                \r
+                \r
+                EventMesh.publish("set_sos_info_call")  \r
+                flag = EventMesh.publish("get_call_state") \r
+                if flag == 2:\r
+                    EventMesh.publish("stop_led_timer")#设置参数\r
+                    EventMesh.publish("close_timer_all")#\r
+                    EventMesh.publish("close_motor_infor")#关闭马达和定时器\r
+                    \r
+                EventMesh.publish("set_sos_state_out")\r
+                EventMesh.publish("set_call_state",0) \r
+                EventMesh.debug_log('voicecall disconnect end')\r
+                \r
+\r
+        elif args[0] == 13:\r
+                EventMesh.debug_log('voicecall is waiting, PhoneNO.: ', args[6])\r
+        elif args[0] == 14:\r
+\r
+                EventMesh.debug_log('voicecall dialing, PhoneNO.: ', args[6])\r
+                EventMesh.publish("set_UI_high_priority",0)\r
+                EventMesh.publish("set_call_state",1) \r
+                # EventMesh.publish("load_screen", {"screen": "dialing"})\r
+\r
+                \r
+        elif args[0] == 15:\r
+                EventMesh.debug_log('voicecall alerting, PhoneNO.: ', args[6])\r
+                EventMesh.publish("set_call_state",1) \r
+                \r
+        elif args[0] == 16:\r
+                EventMesh.debug_log('voicecall holding, PhoneNO.: ', args[6])\r
+\r
+    class DeviceInfoManager(Abstract):\r
+        \r
+        """\r
+            设备信息管理\r
+        """\r
+\r
+        def __init__(self):\r
+\r
+            self.DeviceInfo_queue = Queue()\r
+            _thread.stack_size((9+6)*1024)\r
+            _thread.start_new_thread(self.DeviceInfo_queue_thread, ())\r
+            _thread.stack_size(8*1024)\r
+            self.boot_time_count = 0\r
+            self.factory_test_time = 0\r
+            EventMesh.subscribe("publish_message_event_DeviceInfo",self.publish_message_event_DeviceInfo)\r
+            self.key = ""\r
+            self.imei = ""\r
+            self.cid = "ETEST20221014010"\r
+            self.imsi = ""\r
+            self.password = "000000"\r
+            #self.__city = None\r
+            #self.__location = None\r
+            self.timer_push_schedule = osTimer()\r
+            self.timer_pusht_test = osTimer()\r
+            \r
+            #self.battery_push_schedule = osTimer()\r
+            self.check_battery_list = []\r
+            \r
+            self.step = [0,0,0,0]\r
+            self.timer_push=0\r
+            self.timer_push_tmp=60\r
+            self.PING = "0" #绑定状态\r
+            self.connect = 0 #服务器连接状态\r
+            self.KA_time = 0\r
+            self.HR_time = 0\r
+            self.hr_timeSecond = 0\r
+            self.HR_state = 0\r
+            self.HR_Onestate = 0\r
+            self.get_hr_state = 0\r
+            self.get_spo2_state = 0\r
+            self.set_hsenor_crt = 0\r
+            self.HR_OneTime = 0\r
+            self.Hr_Need_Open = 0\r
+            self.Spo2_Need_Open = 0\r
+            self.bat_time = 0\r
+            self.vbat_full_flag = 0\r
+            self.clear_step = 0\r
+            self.test = 0\r
+            self.old_time = 0\r
+            self.UD_time = 0\r
+            self.upload_time = 0\r
+            self.UD_timeout = 7*60\r
+\r
+            self.temp_timeSecond = 0\r
+            self.temp_state = 0\r
+            self.temp_one_state = 0\r
+            self.temp_warning = 0\r
+\r
+            self.bg_timeSecond = 0\r
+\r
+            self.bp_timeSecond = 0\r
+            self.bpauto_state = 0\r
+\r
+            self.spo2_timeSecond = 0\r
+            self.spo2auto_state = 0\r
+\r
+            self.vbat_count = 0\r
+\r
+            self.vbat_buf=[]\r
+\r
+            self.curr_battery_level = 4200\r
+            self.bat_count = 0\r
+\r
+            self.mearsure_btn = 0\r
+            self.mearsure_timer = 0\r
+\r
+            self.old_hr_time = 0\r
+            self.old_spo2_time = 0\r
+\r
+            self.no_smi_count = 0\r
+            self.no_smi_state = 0\r
+\r
+            self.old_bp_time = 0\r
+\r
+            self.medicine_count = 0\r
+            self.medicine_flag  = 0\r
+            self.medicine_oldtotalmin = 0\r
+            \r
+            self.wakeup_flag = 0\r
+            self.wakeup_count = 0\r
+            self.wakeup_oldtotalmin = 0\r
+\r
+            self.sleep_flag = 0\r
+            self.sleep_count = 0\r
+            self.sleep_oldtotalmin = 0\r
+\r
+            self.reset_flag = 0\r
+            self.reset_count = 0\r
+            self.reset_oldtotalmin = 0\r
+\r
+            self.home_flag = 0\r
+            self.home_count = 0\r
+            self.home_oldtotalmin = 0\r
+\r
+            self.normal_flag = 0\r
+            self.normal_count = 0\r
+            self.normal_oldtotalmin = 0\r
+            \r
+            self.charge_full_count = 0\r
+            self.GPS_step_t = 0#记录步数\r
+            self.usb = USB()\r
+            self.usb.setCallback(self.usb_event_cb)\r
+            self.log = LogAdapter(self.__class__.__name__)\r
+            self.rtc = RTC()\r
+            self.aud = audio.Audio(0)\r
+            EventMesh.debug_log("DeviceInfoManager:1")\r
+\r
+            self.old_temp_time = 0\r
+\r
+            EventMesh.debug_log("DeviceInfoManager:3")\r
+            self.i2c0 = I2C(I2C.I2C0, I2C.FAST_MODE)\r
+            self.stop_temp( None, None)\r
+            self.dev_state = 0\r
+            self.wear = 1\r
+            self.BG_state = 0\r
+            self.old_bg_time = 0\r
+\r
+            self.pull_time = 0\r
+\r
+            self.drink_time = 0\r
+\r
+            self.alarm_count = 0\r
+            self.alarm_flag = 0\r
+\r
+            self.time_count = 0\r
+            \r
+            self.auto_spo2_count = 0\r
+\r
+            self.auto_hr_count = 0\r
+\r
+            self.auto_temp_count = 0\r
+\r
+            self.low_power_AL = 0\r
+\r
+        def post_processor_after_instantiation(self):\r
+            EventMesh.debug_log("post_processor_after_instantiation:1")\r
+            """订阅此类所有的事件到 EventMesh中"""\r
+            voiceCall.setCallback(voice_callback)\r
+            EventMesh.subscribe("screen_get_ope", self.get_device_ope)\r
+            EventMesh.subscribe("screen_get_sig", self.get_signal)\r
+            EventMesh.subscribe("screen_get_time", self.get_time)\r
+            EventMesh.subscribe("about_get_imei", self.get_imei)\r
+            EventMesh.subscribe("about_get_iccid", self.get_ic_cid)\r
+            EventMesh.subscribe("get_sim_Status", self.get_sim_Status)\r
+            EventMesh.subscribe("about_get_phonenum", self.get_phone_num)\r
+            EventMesh.subscribe("screen_get_battery", self.get_battery)\r
+            EventMesh.subscribe("set_curr_battery_level", self.set_curr_battery_level)\r
+            EventMesh.subscribe("get_curr_battery_level", self.get_curr_battery_level)\r
+            EventMesh.subscribe("get_fw_version", self.get_device_fw_version)\r
+            EventMesh.subscribe("get_standby_time", self.get_standby_time)\r
+            EventMesh.subscribe(constants.EVENT.GET_STEP, self.get_step_count)\r
+            EventMesh.subscribe("sim_slot_get", self.sim_slot_get)\r
+            EventMesh.subscribe("sim_slot_switch", self.sim_slot_switch)\r
+            EventMesh.subscribe(constants.EVENT.GET_KEY, self.get_key)\r
+            EventMesh.subscribe(constants.EVENT.SET_KEY, self.set_key)\r
+            EventMesh.subscribe(constants.EVENT.GET_IMEI, self.get_imei)\r
+            EventMesh.subscribe(constants.EVENT.GET_CID, self.get_cid)\r
+            EventMesh.subscribe(constants.EVENT.SET_CID, self.set_cid)\r
+            EventMesh.subscribe(constants.EVENT.GET_IMSI, self.get_imsi)\r
+            EventMesh.subscribe(constants.EVENT.GET_PASSWORD, self.get_password)\r
+            EventMesh.subscribe(constants.EVENT.SET_PASSWORD, self.set_password)     \r
+            EventMesh.subscribe(constants.EVENT.SET_PING, self.set_ping)\r
+            EventMesh.subscribe(constants.EVENT.GET_PING, self.get_ping)\r
+            EventMesh.subscribe(constants.EVENT.SET_CONNECT, self.set_connect)\r
+            EventMesh.subscribe(constants.EVENT.GET_CONNECT, self.get_connect)\r
+\r
+            \r
+            EventMesh.subscribe(constants.EVENT.START_BLOOD_OXYGEN, self.start_blood_oxygen)\r
+            EventMesh.subscribe(constants.EVENT.START_HEART, self.start_heart)\r
+            EventMesh.subscribe(constants.EVENT.STOP_BLOOD_OXYGEN, self.stop_blood_oxygen)\r
+            EventMesh.subscribe(constants.EVENT.STOP_HEART, self.stop_heart)\r
+            EventMesh.subscribe(constants.EVENT.GET_BLOOD_OXYGEN, self.get_blood_oxygen)\r
+            EventMesh.subscribe(constants.EVENT.GET_HEART, self.get_heart)\r
+            EventMesh.subscribe(constants.EVENT.GET_WEAR, self.get_wear)\r
+            EventMesh.subscribe("get_Hsensor", self.get_Hsensor)\r
+            EventMesh.subscribe("Hsensor_set_sleep", self.Hsensor_set_sleep)\r
+\r
+            EventMesh.subscribe(constants.EVENT.START_TEMP, self.start_temp)\r
+            EventMesh.subscribe(constants.EVENT.STOP_TEMP, self.stop_temp)\r
+            EventMesh.subscribe(constants.EVENT.GET_TEMP, self.get_temp)\r
+            EventMesh.subscribe("get_boot_time_count", self.get_boot_time_count)\r
+            EventMesh.subscribe("get_factory_test_time", self.get_factory_test_time)\r
+            EventMesh.subscribe("get_dev_state", self.get_dev_state)\r
+            EventMesh.subscribe("set_dev_state", self.set_dev_state)\r
+\r
+            EventMesh.subscribe("clear_health_state", self.clear_health_state)\r
+\r
+            EventMesh.subscribe("clear_home_alarm", self.clear_home_alarm)\r
+            EventMesh.subscribe("clear_medicine_alarm", self.clear_medicine_alarm)\r
+            EventMesh.subscribe("clear_wakeup_alarm", self.clear_wakeup_alarm)\r
+            EventMesh.subscribe("clear_sleep_alarm", self.clear_sleep_alarm)\r
+            EventMesh.subscribe("clear_normal_alarm", self.clear_normal_alarm)\r
+\r
+            EventMesh.subscribe("clear_manual_hr_flag", self.clear_manual_hr_flag)\r
+            EventMesh.subscribe("clear_manual_temp_flag", self.clear_manual_temp_flag)\r
+\r
+\r
+            EventMesh.subscribe("clear_usb_flag", self.clear_usb_flag)\r
+            \r
+            EventMesh.debug_log("post_processor_after_instantiation:2")\r
+            self.timer_push_schedule.start(10000, 1, self.publish_event_cb)\r
+            # self.timer_pusht_test.start(2000, 1, self.publish_test)\r
+            # self.battery_push_schedule.start(3000, 1, self.__check_battery)\r
+            self.log.debug("post_processor_after_instantiation finished")\r
+            #EventMesh.publish(constants.EVENT.START_HEART)\r
+            # 设备开机立刻更新一次参数\r
+            self.publish_event_cb()\r
+            \r
+            EventMesh.debug_log("post_processor_after_instantiation:3")\r
+\r
+        def clear_manual_hr_flag(self,event,msg):\r
+            self.auto_hr_count = 0\r
+        \r
+        def clear_manual_temp_flag(self,event,msg):\r
+            self.auto_temp_count = 0\r
+\r
+        def publish_message_event_DeviceInfo(self,event,msg):\r
+            self.DeviceInfo_queue.put(msg)\r
+\r
+        #DeviceInfo的消息队列处理,防止卡顿\r
+        def DeviceInfo_queue_thread(self):\r
+            while True:\r
+                data = self.DeviceInfo_queue.get()\r
+                #EventMesh.debug_log("DeviceInfo_queue_thread:data = {}".format(data))\r
+                if data != None:\r
+                    try:\r
+                        data["func"](data["data"])\r
+                    except Exception as e:\r
+                        EventMesh.debug_log("DeviceInfo_queue_thread:ERROR:{}".format(e))\r
+                        usys.print_exception(e)\r
+\r
+\r
+        def gsensor_cb(self, para):\r
+            EventMesh.debug_log("gsensor_cb:{}".format(para))\r
+            flip_sw = EventMesh.publish("get_storage_config","flip_sw")\r
+            fall_sw = EventMesh.publish("get_storage_config","fall_sw")\r
+            if para == 0: #跌倒报警\r
+                pass\r
+                if fall_sw == "1":\r
+                    EventMesh.publish("falldown_alarm_event")\r
+                    dev_state =  EventMesh.publish("get_dev_state")\r
+\r
+                    tmp = 1 << 21\r
+                    dev_state = dev_state|tmp #第21位=1\r
+                    EventMesh.publish("set_dev_state",dev_state)\r
+                    EventMesh.publish(constants.EVENT.START_LOCATION,[constants.PROTOCOL.AL_SEND,dev_state]) #开始AL定位\r
+                    pass\r
+                #EventMesh.publish("load_screen", {"screen": "FIND"})\r
+            elif para == 1: #抬腕\r
+                \r
+                if flip_sw == 1:\r
+                    EventMesh.publish(constants.EVENT.SYSTEM_UP)\r
+                \r
+            elif para == 2: #放手\r
+                pass\r
+                # if flip_sw == 1:\r
+                #     EventMesh.publish(constants.EVENT.SYSTEM_SLEEP)\r
+        def get_boot_time_count(self, event, msg):\r
+            return self.boot_time_count\r
+        \r
+        def get_factory_test_time(self, event, msg):\r
+            return self.factory_test_time\r
+        \r
+        def get_dev_state(self, event, msg):\r
+            return self.dev_state\r
+        def set_dev_state(self, event, msg):\r
+            self.dev_state = msg\r
+        \r
+        def publish_event_cb(self, *args, **kwargs):\r
+            open_power = EventMesh.publish("get_power_on_state")#获取开机标识\r
+            if open_power != None:\r
+                if open_power == 1:\r
+                    if self.boot_time_count < 50000000:\r
+                        self.boot_time_count += 10\r
+                    \r
+                    if self.factory_test_time < 300:\r
+                        self.factory_test_time+=10\r
+                #EventMesh.debug_log("boot_time_count:{}".format(self.boot_time_count))\r
+            EventMesh.publish("publish_message_event_DeviceInfo",{"func":self.publish_event,"data":0})  \r
+        def optimize_temp(self,temp):\r
+            temp += 0.5\r
+            get_temp_time  = EventMesh.publish("get_temp_time")\r
+            EventMesh.debug_log("temp:{}".format(temp))\r
+            if temp < 36 :#or temp > 37.5:\r
+                temp = 36+urandom.random()\r
+            if temp > 37.5:\r
+                \r
+                self.temp_warning += 1\r
+                EventMesh.debug_log("temp_warning:{} get_temp_time{}".format(self.temp_warning,get_temp_time))\r
+                \r
+                if self.temp_warning < 5:#高温没连续超过3次,和谐成37.5度以下\r
+                    temp = 37+(urandom.randint(1, 4)/10)\r
+                else:\r
+                    self.temp_warning = 0\r
+            else:\r
+                if self.temp_warning>=1:\r
+                    self.temp_warning -= 1\r
+            if temp >= 40:\r
+                temp = 40\r
+            return temp\r
+        def clear_health_state(self,event,msg):\r
+            print("clear_health_state")\r
+            self.old_bp_time = 0#关闭心率 血压 血氧 体温清除标志\r
+            self.old_time = 0\r
+            self.HR_Onestate = 0\r
+            self.HR_OneTime = 0\r
+            self.HR_state = 0\r
+            self.set_hsenor_crt = 0\r
+            self.old_bg_time = 0\r
+            self.old_hr_time = 0\r
+            self.old_spo2_time = 0\r
+            self.BG_state = 0\r
+            self.bpauto_state = 0\r
+            self.spo2auto_state = 0\r
+            pass\r
+\r
+        def clear_temp_state(self,event,msg):\r
+            print("clear_temp_state")\r
+            self.temp_state = 0\r
+            self.temp_one_state = 0\r
+            self.old_temp_time = 0\r
+            pass\r
+\r
+        def publish_event(self,data):\r
+            """\r
+            定时事件处理\r
+            :param args:\r
+            :param kwargs:\r
+            :return:\r
+            """\r
+\r
+            date_tmp = utime.localtime()\r
+            time_tmp = utime.mktime(date_tmp)\r
+            # EventMesh.debug_log("date_tmp......01....{} time_tmp:{}\r\n".format(date_tmp,time_tmp))\r
+            \r
+\r
+            EventMesh.publish("countdown_end_cb")\r
+            """定时检查是否关闭gps失败"""\r
+            # gnss_state = quecgnss.get_state()\r
+            # get_location_flag = EventMesh.publish("get_location_flag")\r
+            # if get_location_flag != None:\r
+            #     # if gnss_state == 2 and get_location_flag == 0:\r
+            #     #     EventMesh.publish(constants.EVENT.GPSCLOSE)\r
+            #     if(get_location_flag == 0):\r
+            #         EventMesh.publish(constants.EVENT.START_LOCATION,constants.PROTOCOL.UD_SEND) #开始UD定位\r
+\r
+            """7分钟一次心跳"""\r
+            if  math.fabs(time_tmp - self.KA_time) > heartbeat_time: #7分钟一次心跳\r
+                self.KA_time = time_tmp\r
+                EventMesh.publish(constants.PROTOCOL.KA_SEND)\r
+\r
+            """定时定位"""\r
+            #EventMesh.publish("set_upload_data",3*60)\r
+            self.upload_time = EventMesh.publish("get_upload_data")\r
+            #EventMesh.debug_log("self.upload_time:{} math.fabs(time_tmp - self.UD_time):{}".format(self.upload_time,math.fabs(time_tmp - self.UD_time)))\r
+            if self.upload_time != None :\r
+                if  math.fabs(time_tmp - self.UD_time) > self.upload_time: #30分钟一次定位\r
+                    self.UD_time = time_tmp\r
+\r
+                    status_tmp = 4\r
+                    #EventMesh.txt_log("status_count:{}".format(status_tmp))\r
+                    if EventMesh.publish(constants.EVENT.GET_CONNECT) == 1 and status_tmp > 3 :\r
+                        EventMesh.publish(constants.EVENT.START_LOCATION,constants.PROTOCOL.UD_SEND) #开始UD定位\r
+\r
+                    else : #关闭定位\r
+                        #EventMesh.txt_log("NO status")\r
+                        EventMesh.debug_log("NO status")\r
+                        EventMesh.publish(constants.EVENT.CLOSE_LOCATION)#关闭定位 \r
+            \r
+            EventMesh.publish(constants.EVENT.PUSH_STEP, self.get_step_count())\r
+\r
+            """电池平均值"""\r
+            temp = Power.getVbatt()\r
+            if self.bat_count < 10:\r
+                self.vbat_buf.append(temp)\r
+                self.bat_count += 1\r
+            else:\r
+                for i in range(9):\r
+                    self.vbat_buf[i] = self.vbat_buf[i+1]\r
+                self.vbat_buf[9] = temp\r
+            curr_count = len(self.vbat_buf)\r
+            bat_total_value = 0\r
+            for i in range(curr_count):\r
+                bat_total_value += self.vbat_buf[i]\r
+            bat_total_value = bat_total_value//curr_count#一分钟更新一次电量 10个平均值\r
+            EventMesh.publish("set_curr_battery_level",bat_total_value)\r
+            # EventMesh.debug_log("self.vbat_buf:{} curr_count :{} bat_total_value:{} temp:{}".format(self.vbat_buf,curr_count,bat_total_value,temp))\r
+            bat_tmp = EventMesh.publish("screen_get_battery")\r
+            self.vbat_count+=10\r
+            if self.vbat_count >= 60:\r
+                self.vbat_count = 0\r
+                if bat_tmp != None:\r
+                    bat_value = bat_tmp[1]\r
+                    if bat_value <= 0:\r
+                        pass\r
+                        # EventMesh.publish("load_screen", {"screen": "LOW_ONE_POWER"})\r
+            \r
+            \r
+            """"隔天清步数"""\r
+\r
+            data = RTC().datetime()\r
+\r
+            hour = int(data[4])\r
+            min = int(data[5])\r
+\r
+\r
+\r
+            cur_month = int(data[1])\r
+            cur_day = int(data[2])\r
+            cur_year = int(data[0])\r
+\r
+            old_Timesec = EventMesh.publish("get_old_time_data")\r
+            # EventMesh.debug_log("hour:{} {} cur_month:{} {} next_alarm_time:{} old_Timesec:{}".format(hour,min,cur_month,cur_day,next_alarm_time,old_Timesec))\r
+            # EventMesh.debug_log("old_Timesec",old_Timesec)\r
+            if old_Timesec != None:\r
+                next_alarm_time = utime.localtime(int(old_Timesec))\r
+                month = int(next_alarm_time[1]) #00:00 18\r
+                day = int(next_alarm_time[2])\r
+                year = int(next_alarm_time[0])\r
+                if month != cur_month or day != cur_day or year != cur_year:#年 月 日只要其中一个都不一样就清零\r
+                    EventMesh.publish("set_old_time_data",time_tmp)\r
+\r
+\r
+                    EventMesh.publish("set_old_step_value",0)\r
+                    \r
+                    hr = EventMesh.publish("get_old_hr_data")\r
+                    if hr != 0:\r
+                        EventMesh.publish("set_old_hr_data", 0)\r
+                    \r
+                    spo2 = EventMesh.publish("get_old_spo2_data")\r
+                    if spo2 != 0:\r
+                        EventMesh.publish("set_old_spo2_data", 0)\r
+                    EventMesh.debug_log("clear step1111")\r
+                else:\r
+                    pass\r
+                    \r
+                    \r
+            if hour == 23:#清步数23:59\r
+                if min == 59:#58 59\r
+                    # if self.clear_step == 0:\r
+                    #     self.clear_step = 1\r
+                    EventMesh.publish("set_old_time_data",time_tmp)\r
+\r
+                    EventMesh.publish("set_old_step_value",0)\r
+\r
+                    hr = EventMesh.publish("get_old_hr_data")\r
+                    if hr != 0:\r
+                        EventMesh.publish("set_old_hr_data", 0)\r
+                    \r
+                    spo2 = EventMesh.publish("get_old_spo2_data")\r
+                    if spo2 != 0:\r
+                        EventMesh.publish("set_old_spo2_data", 0)\r
+                    EventMesh.debug_log("clear step2222")\r
+\r
+                else:\r
+                    self.clear_step = 0\r
+            else:\r
+                self.clear_step = 0\r
+            \r
+            """电量小于0% 关机"""\r
+            get_low_btn = EventMesh.publish("get_low_bat_btn")#\r
+            battery = EventMesh.publish("screen_get_battery")\r
+\r
+            if battery != None:\r
+                power = int(battery[1])\r
+                if battery[0] != '1':\r
+                    if power == 0:\r
+                        EventMesh.publish("open_power_on",2)#  \r
+                    """"低电报警"""\r
+                    # print("low power!!!!!!!!!!! %d",self.low_power_AL)\r
+                    if power <= 15 and self.low_power_AL==0:\r
+                        self.low_power_AL = 1\r
+                        dev_state =  EventMesh.publish("get_dev_state")\r
+\r
+                        tmp = 1 << 17\r
+                        dev_state = dev_state|tmp #第17位=1\r
+                        EventMesh.publish("set_dev_state",dev_state)\r
+                        EventMesh.publish(constants.EVENT.START_LOCATION,[constants.PROTOCOL.AL_SEND,dev_state]) #开始AL定位\r
+\r
+                if power >= 50:\r
+                    self.low_power_AL = 0\r
+            \r
+            """未联网提示关机"""\r
+            ble=EventMesh.publish(constants.EVENT.GET_CONNECT)\r
+            # EventMesh.debug_log("ble",ble)\r
+            if ble == 0:#未联网提示关机\r
+                if battery[0] != '1':\r
+                    self.no_smi_count+=10\r
+                    # EventMesh.debug_log("self.no_smi_count",self.no_smi_count)\r
+                    if self.no_smi_count >= (15*60):#(15*60)\r
+                        self.no_smi_count = 0\r
+                        EventMesh.publish("open_power_on",2)#  #未检测到sim卡15分钟后关机\r
+                    \r
+            else:\r
+                self.no_smi_count = 0\r
+\r
+            msg_nums = sms.getMsgNums() #获取短信条数\r
+            # EventMesh.debug_log("msg_nums",msg_nums)\r
+            if(msg_nums != -1):\r
+                sms_data = sms.getSaveLoc()\r
+                sms_max = sms_data[0][2]\r
+                if msg_nums >= sms_max-1:\r
+                    EventMesh.publish("delete_sms_event")#\r
+\r
+            #佩戴检测\r
+            WEAR = EventMesh.publish(constants.EVENT.GET_WEAR)#佩戴数据\r
+            if self.wear != WEAR:\r
+                remove_sw = EventMesh.publish("get_storage_config","remove_sw")\r
+                if remove_sw == "1":#开启了佩戴检测的开关\r
+                    dev_state =  EventMesh.publish("get_dev_state")\r
+                    \r
+                    if WEAR != 1:\r
+                        tmp = 1 << 3\r
+                        tmp = ~tmp\r
+                        tmp = 1 << 20\r
+                        dev_state = dev_state|tmp #第20位=1\r
+                    # else :     \r
+                    #     pass              \r
+                        \r
+                    #     tmp = 1 << 20\r
+                    #     dev_state = dev_state|tmp #第20位=1\r
+                    #     tmp = 1 << 3\r
+                    #     dev_state = dev_state|tmp #第三位=1\r
+                        EventMesh.debug_log("佩戴检测:{}".format(dev_state))    \r
+                        EventMesh.publish("set_dev_state",dev_state)\r
+                        EventMesh.publish(constants.EVENT.START_LOCATION,[constants.PROTOCOL.AL_SEND,dev_state]) #开始AL定位,发送报警\r
+                        #EventMesh.publish(constants.PROTOCOL.HELP_SEND,65)\r
+            self.wear = WEAR\r
+            """定时测量心率,血氧,体温"""\r
+            self.get_hr_state = EventMesh.publish("get_hr_state")\r
+            self.get_spo2_state = EventMesh.publish("get_spo2_state")\r
+            get_temp_time  = EventMesh.publish("get_temp_time")\r
+            get_temp_state  = EventMesh.publish("get_temp_state")\r
+            get_bp_state  = EventMesh.publish("get_bp_state")\r
+            get_bg_state  = EventMesh.publish("get_bg_state")\r
+            if get_bg_state == None:\r
+                get_bg_state = 0\r
+            if get_bp_state == None:\r
+                get_bp_state = 0\r
+\r
+            if get_temp_state == None:\r
+                get_temp_state = 0\r
+\r
+            if self.get_hr_state == None:\r
+                self.get_hr_state = 0\r
+            if self.get_spo2_state == None:\r
+                self.get_spo2_state = 0 \r
+\r
+            video_state = EventMesh.publish("get_video_state")#获取\r
+            if video_state == None:\r
+                video_state = 0\r
+                \r
+            call_state = EventMesh.publish("get_call_state")\r
+            if call_state == None:\r
+                call_state = 0\r
+\r
+\r
+            video_state = EventMesh.publish("get_video_state")\r
+            if video_state != None:\r
+                if battery[0] != "1":\r
+                    if get_temp_state != None and call_state != None and video_state != None: #突然脱腕\r
+\r
+                        if get_temp_state > 1  and (WEAR != 1 or call_state != 0 or video_state != 0):\r
+                            EventMesh.publish(constants.EVENT.STOP_TEMP)\r
+                            EventMesh.publish("set_temp_state",0)       \r
+                            EventMesh.txt_log("auto stop_temp:22")\r
+\r
+                        if (self.get_hr_state > 1 or self.get_spo2_state > 1 or get_bp_state > 1 or get_bg_state > 1) and (WEAR != 1 or call_state != 0 or video_state != 0):\r
+                            # print("wear faile")\r
+                            if self.get_hr_state > 1 :\r
+                                EventMesh.txt_log("auto stop_hr:22")\r
+                                EventMesh.publish("set_hr_state",0)#2代表后台进入测试,定时测心率 1ui界面测试洗心率 \r
+                                EventMesh.publish(constants.EVENT.STOP_HEART) \r
+                                if WEAR == 1:\r
+                                    heart_value = EventMesh.publish(constants.EVENT.GET_HEART)\r
+                                    if heart_value >= 50 and heart_value != None:\r
+                                        EventMesh.publish(constants.PROTOCOL.HEART_SEND,heart_value)#上传心率数据\r
+                                \r
+                            if self.get_spo2_state > 1:\r
+                                EventMesh.txt_log("auto stop_spo2:22")\r
+                                EventMesh.publish("set_spo2_state",0)#2代表后台进入测试\r
+\r
+                                EventMesh.publish(constants.EVENT.STOP_BLOOD_OXYGEN)\r
+                                spo2_value = EventMesh.publish(constants.EVENT.GET_BLOOD_OXYGEN)\r
+                                if WEAR == 1:\r
+                                    if spo2_value > 85 and spo2_value != None:\r
+                                        EventMesh.publish(constants.PROTOCOL.OXYGEN_SEND,spo2_value)\r
+                                \r
+                            if get_bp_state > 1:\r
+\r
+                                EventMesh.txt_log("auto stop_bp:22")\r
+                                EventMesh.publish("set_bp_state",0)#2代表后台进入测试\r
+                                EventMesh.publish(constants.EVENT.STOP_HEART)\r
+                                if WEAR == 1:\r
+                                    blood_data = get_autoblood_value()\r
+                                    if blood_data == None:\r
+                                        blood_data[0] = 0\r
+                                        blood_data[1] = 0\r
+\r
+                                    max_value = blood_data[0]\r
+                                    min_value = blood_data[1]\r
+                                    if max_value != 0 and min_value != 0:\r
+                                        EventMesh.publish(constants.PROTOCOL.BLOOD_SEND,[max_value,min_value])\r
+                                \r
+                            if get_bg_state > 1:\r
+                                EventMesh.txt_log("auto stop_bg:22")\r
+                                \r
+                                EventMesh.publish("set_bg_state",0)#2代表后台进入测试\r
+                                EventMesh.publish(constants.EVENT.STOP_HEART)\r
+                                if WEAR == 1:\r
+                                    bg_data = get_blood_sugar_value()\r
+                                    if bg_data == None:\r
+                                        bg_data = 0\r
+                                    if bg_data != 0:\r
+                                        # EventMesh.publish("play_sugar_value", bg_data)#播放血糖数值\r
+                                        EventMesh.publish(constants.PROTOCOL.BLOODGLUSOCE_SEND,bg_data)   \r
+        \r
+            if self.pull_time == 0:\r
+                self.pull_time = time_tmp\r
+            # if EventMesh.publish(constants.EVENT.GET_CONNECT) == 1:#已联网 并且不在充电 佩戴正常 不在通话就给测试心率\r
+            if EventMesh.publish(constants.EVENT.GET_CONNECT) == 1 and battery[0] != "1" and WEAR == 1 and call_state == 0 and video_state == 0:\r
+                #防止时间校时出错\r
+                if time_tmp < self.pull_time :\r
+                    self.pull_time = time_tmp\r
+                if time_tmp < self.temp_timeSecond:\r
+                    self.temp_timeSecond = time_tmp\r
+                if time_tmp < self.hr_timeSecond:\r
+                    self.hr_timeSecond = time_tmp\r
+                if time_tmp < self.spo2_timeSecond :\r
+                    self.spo2_timeSecond = time_tmp\r
+                if time_tmp < self.bp_timeSecond:\r
+                    self.bp_timeSecond = time_tmp\r
+                if time_tmp < self.bg_timeSecond:\r
+                     self.bg_timeSecond = time_tmp\r
+\r
+                if time_tmp - self.pull_time >= 30:\r
+                    # EventMesh.debug_log("shifens:")  \r
+\r
+                    get_hr_state = EventMesh.publish("get_hr_state")\r
+                    get_spo2_state = EventMesh.publish("get_spo2_state")\r
+                    get_bp_state  = EventMesh.publish("get_bp_state")\r
+                    get_bg_state  = EventMesh.publish("get_bg_state")\r
+                    get_temp_state  = EventMesh.publish("get_temp_state")\r
+                    if get_hr_state == None:\r
+                        get_hr_state = 0\r
+                        self.old_hr_time = 0\r
+\r
+                    if get_spo2_state == None:\r
+                        get_spo2_state = 0\r
+                        self.old_spo2_time = 0\r
+\r
+                    if get_temp_state == None:\r
+                        get_temp_state = 0\r
+                        self.temp_one_state = 0\r
+\r
+                    if get_bp_state == None:\r
+                        get_bp_state = 0\r
+                        self.old_bp_time = 0\r
+                    \r
+                    if get_bg_state == None:\r
+                        get_bg_state = 0\r
+                        self.old_bg_time = 0\r
+                    \r
+                    # print("bp get_bp_state ",get_bp_state,self.old_bp_time)\r
+\r
+                    \r
+                    if get_hr_state != None:\r
+                        if get_hr_state == 3:\r
+                            self.old_hr_time+=1\r
+                            if self.old_hr_time == 1:\r
+                                EventMesh.publish("set_hr_state",3)#2代表后台进入测试\r
+                                # EventMesh.publish("set_hr_blood_led",1)\r
+                                EventMesh.publish(constants.EVENT.START_HEART)\r
+                                EventMesh.txt_log("auto start_hr:333")\r
+                            elif self.old_hr_time > 6:\r
+                                self.old_hr_time = 0\r
+                                EventMesh.publish("set_hr_state",0)#2代表后台进入测试\r
+                                EventMesh.txt_log("auto stop_hr:333")\r
+                                EventMesh.publish(constants.EVENT.STOP_HEART)\r
+                                heart_value = EventMesh.publish(constants.EVENT.GET_HEART)\r
+                                EventMesh.debug_log("heart_value:{}".format(heart_value))\r
+                                if heart_value >= 50 and heart_value != None:\r
+                                    EventMesh.publish(constants.PROTOCOL.HEART_SEND,heart_value)#上传心率数据\r
+                                EventMesh.debug_log("STOP_HEART:3")\r
+                        else:\r
+                            self.old_hr_time = 0\r
+                    else:\r
+                        self.old_hr_time = 0\r
+\r
+\r
+                    if get_spo2_state != None:\r
+                        if get_spo2_state == 3:\r
+                            self.old_spo2_time+=1\r
+                            if self.old_spo2_time == 1:\r
+                                EventMesh.publish("set_spo2_state",3)#2代表后台进入测试\r
+                                # EventMesh.publish("set_hr_blood_led",1)\r
+                                EventMesh.publish(constants.EVENT.START_BLOOD_OXYGEN)#K开血氧\r
+                                EventMesh.txt_log("auto start_spo2:333")\r
+                            elif self.old_spo2_time > 6:\r
+                                self.old_spo2_time = 0\r
+                                EventMesh.txt_log("auto stop_spo2:333")\r
+                                EventMesh.publish("set_spo2_state",0)#2代表后台进入测试\r
+                                EventMesh.publish(constants.EVENT.STOP_BLOOD_OXYGEN)\r
+                                spo2_value = EventMesh.publish(constants.EVENT.GET_BLOOD_OXYGEN)\r
+                                if spo2_value > 85 and spo2_value != None:\r
+                                    EventMesh.publish(constants.PROTOCOL.OXYGEN_SEND,spo2_value)\r
+                                    \r
+                        else:\r
+                            self.old_spo2_time = 0\r
+                    else:\r
+                        self.old_spo2_time = 0\r
+\r
+\r
+                    if get_bp_state != None:\r
+                        if get_bp_state == 3:\r
+                            self.old_bp_time+=1\r
+                            if self.old_bp_time == 1:\r
+                                EventMesh.publish("set_bp_state",3)#2代表后台进入测试\r
+                                # EventMesh.publish("set_hr_blood_led",1)\r
+                                EventMesh.publish(constants.EVENT.START_HEART)\r
+                                EventMesh.txt_log("auto start_bp:333")\r
+                            elif self.old_bp_time > 6:\r
+                                self.old_bp_time = 0\r
+                                \r
+                                EventMesh.publish("set_bp_state",0)#2代表后台进入测试\r
+                                # EventMesh.publish("stop_led_timer")#设置参数\r
+                                blood_data = get_autoblood_value()\r
+                                if blood_data == None:\r
+                                    blood_data[0] = 0\r
+                                    blood_data[1] = 0\r
+\r
+                                max_value = blood_data[0]\r
+                                min_value = blood_data[1]\r
+                                if max_value != 0 and min_value != 0:\r
+                                    EventMesh.publish(constants.PROTOCOL.BLOOD_SEND,[max_value,min_value])\r
+                                EventMesh.publish(constants.EVENT.STOP_HEART)\r
+                                EventMesh.txt_log("auto stop_bp:333")\r
+                        else:\r
+                            self.old_bp_time = 0\r
+                    else:\r
+                        self.old_bp_time = 0\r
+\r
+                    if get_bg_state != None:\r
+                        if get_bg_state == 3:\r
+                            self.old_bg_time+=1\r
+                            if self.old_bg_time == 1:\r
+                                EventMesh.publish("set_bg_state",3)#2代表后台进入测试\r
+                                # EventMesh.publish("set_hr_blood_led",1)\r
+                                EventMesh.publish(constants.EVENT.START_HEART)\r
+                                EventMesh.txt_log("auto start_bg:333")\r
+                            elif self.old_bg_time > 6:\r
+                                self.old_bg_time = 0\r
+                                EventMesh.publish("set_bg_state",0)#2代表后台进入测试\r
+                                EventMesh.publish(constants.EVENT.STOP_HEART)\r
+                                # EventMesh.publish("stop_led_timer")#设置参数\r
+                                bg_data = get_blood_sugar_value()\r
+                                if bg_data == None:\r
+                                    bg_data = 0\r
+                                if bg_data != 0:\r
+                                    EventMesh.publish(constants.PROTOCOL.BLOODGLUSOCE_SEND,bg_data)\r
+\r
+                                EventMesh.txt_log("auto stop_bp:333")\r
+                        else:\r
+                            self.old_bg_time = 0\r
+                    else:\r
+                        self.old_bg_time = 0\r
+\r
+                    \r
+                    if get_temp_state != None:\r
+                        if get_temp_state == 3:#单次测量\r
+                            self.temp_one_state+=1\r
+                            if self.temp_one_state == 1:\r
+                                EventMesh.txt_log("auto start_temp:333")\r
+                                EventMesh.debug_log("AUTO one temp:2") \r
+                                EventMesh.publish("set_temp_state",3)\r
+                                # EventMesh.publish("set_hr_blood_led",1)\r
+                                EventMesh.publish(constants.EVENT.START_TEMP)   \r
+                            elif self.temp_one_state > 3:\r
+                                self.temp_one_state = 0\r
+                                temp = EventMesh.publish(constants.EVENT.GET_TEMP) \r
+                                temp = self.optimize_temp(temp)\r
+                                \r
+                                EventMesh.publish("set_temp_state",0)\r
+                                tmp_f_tmp = 0\r
+                                tmp_d_tmp = 0\r
+                                if str(temp).find(".") != -1:\r
+                                    tmp_f = str(temp).split('.')[0] \r
+                                    tmp_f_tmp = int(tmp_f)\r
+                                    \r
+                                    tmp_d = str(temp).split('.')[1][:1]\r
+                                    tmp_d_tmp = int(tmp_d)\r
+                                else:\r
+                                    tmp_f_tmp = temp\r
+                                    \r
+                                if temp != None:\r
+                                    if temp != 0:\r
+                                        EventMesh.publish(constants.PROTOCOL.TEMP_SEND,[tmp_f_tmp,tmp_d_tmp])\r
+                                EventMesh.publish(constants.EVENT.STOP_TEMP)\r
+                                EventMesh.txt_log("auto start_temp:333")\r
+\r
+\r
+        \r
+                    \r
+                    # EventMesh.debug_log("get_temp_time:{} self.temp_one_state:{}".format(get_temp_time,self.temp_one_state))\r
+                    if get_temp_time != None:#定时测量体温\r
+                        if get_temp_time > 0:\r
+                            if get_temp_state != None:\r
+                                get_temp_state  = EventMesh.publish("get_temp_state")\r
+                                if get_temp_state == 0 or get_temp_state == 2:\r
+                                    if (time_tmp-self.temp_timeSecond) >= get_temp_time:#大于一个周期的时间,重新赋值\r
+                                        self.temp_state = 0\r
+                                        self.temp_timeSecond = time_tmp\r
+\r
+                                    if (time_tmp-self.temp_timeSecond) == 0 and self.temp_state == 0:#一开始就测量 测量一分钟停止测量体温\r
+                                        self.temp_state = 1\r
+                                        EventMesh.publish("set_temp_state",2)\r
+                                        # EventMesh.publish("set_hr_blood_led",1)\r
+                                        EventMesh.debug_log("AUTO temp:") \r
+                                        EventMesh.txt_log("auto START_temp:1")\r
+                                        EventMesh.publish(constants.EVENT.START_TEMP)\r
+\r
+                                    elif (time_tmp-self.temp_timeSecond) >= 30 and self.temp_state == 1 and get_temp_state == 2:\r
+                                        self.temp_state = 0\r
+                                        EventMesh.txt_log("auto stop_temp:1")\r
+                                        EventMesh.publish("set_temp_state",0)\r
+                                        temp = EventMesh.publish(constants.EVENT.GET_TEMP) \r
+                                        temp = self.optimize_temp(temp)\r
+                                        \r
+                                        tmp_f_tmp = 0\r
+                                        tmp_d_tmp = 0\r
+                                        if str(temp).find(".") != -1:\r
+                                            tmp_f = str(temp).split('.')[0] \r
+                                            tmp_f_tmp = int(tmp_f)\r
+                                            \r
+                                            tmp_d = str(temp).split('.')[1][:1]\r
+                                            tmp_d_tmp = int(tmp_d)\r
+                                        else:\r
+                                            tmp_f_tmp = temp\r
+                                            \r
+                                        if temp != None:\r
+                                            if temp != 0:\r
+                                                EventMesh.publish(constants.PROTOCOL.TEMP_SEND,[tmp_f_tmp,tmp_d_tmp])\r
+                                        EventMesh.publish(constants.EVENT.STOP_TEMP)\r
+\r
+                                else:\r
+                                    self.temp_state = 0\r
+                                    self.old_temp_time = 0\r
+                        else:\r
+                            temp_state  = EventMesh.publish("get_temp_state") \r
+                            if temp_state == 2:\r
+                                EventMesh.publish("set_temp_state",0)#2代表后台进入测试\r
+                                # EventMesh.publish("stop_led_timer")#设置参数\r
+                                EventMesh.txt_log("auto wear stop_temp:2 ")\r
+                                EventMesh.publish(constants.EVENT.STOP_TEMP)\r
+                            self.temp_state = 0\r
+                            self.temp_timeSecond = 0\r
+                            self.old_temp_time = 0\r
+\r
+\r
+\r
+                    hr_time = EventMesh.publish("get_time_hr")#获取时间是否大于0\r
+                    if hr_time !=  None:\r
+                        self.mearsure_btn = int(hr_time[0])\r
+                        self.mearsure_timer = int(hr_time[1])\r
+\r
+                        if self.mearsure_btn != None and self.mearsure_timer != None:\r
+                            \r
+                            if self.mearsure_btn >= 1 and self.mearsure_timer > 0:#开关打开并且时间大于0就可以测试血糖\r
+                                get_hr_state = EventMesh.publish("get_hr_state")#心率\r
+                                get_spo2_state = EventMesh.publish("get_spo2_state")#血氧\r
+                                get_bp_state  = EventMesh.publish("get_bp_state")#血压\r
+                                get_bg_state  = EventMesh.publish("get_bg_state")#血糖\r
+                                # print("state hr",get_hr_state,get_spo2_state,get_bp_state,get_bg_state)\r
+                                if (get_bg_state == 0 and get_spo2_state == 0 and get_bp_state == 0) and  (get_hr_state == 2 or get_hr_state == 0):#心率血压血氧不在测试就测试血糖自动测量\r
+                                    if (time_tmp-self.hr_timeSecond) >= self.mearsure_timer:#大于一个周期的时间,保存的时间戳时间 1678 0 1678 30 1678 \r
+                                        self.hr_timeSecond = time_tmp\r
+                                        self.HR_Onestate = 0\r
+                                    # print("time_tmp hr",time_tmp,self.hr_timeSecond,time_tmp-self.hr_timeSecond,self.mearsure_timer,self.HR_Onestate)\r
+                                    if (time_tmp - self.hr_timeSecond) == 0 and self.HR_Onestate == 0:\r
+                                        self.HR_Onestate = 1\r
+                                        EventMesh.txt_log("auto START_hr:1")\r
+                                        EventMesh.publish("set_hr_state",2)#2代表后台进入测试\r
+                                        # EventMesh.publish("set_hr_blood_led",1)\r
+                                        EventMesh.publish(constants.EVENT.START_HEART)\r
+                                        \r
+                                    elif (time_tmp - self.hr_timeSecond) >= 60 and self.HR_Onestate == 1 and get_hr_state == 2:\r
+                                        self.HR_Onestate = 0\r
+                                        EventMesh.publish("set_hr_state",0)#2代表后台进入测试\r
+                                        EventMesh.debug_log("stop debug3")\r
+                                        EventMesh.txt_log("auto stop_hr:1")\r
+                                        EventMesh.publish(constants.EVENT.STOP_HEART)\r
+                                        heart_value = EventMesh.publish(constants.EVENT.GET_HEART)\r
+                                        EventMesh.debug_log("heart_value:{}".format(heart_value))\r
+                                        # heart_value = 60+urandom.randint(0,10)\r
+                                        if heart_value >= 50 and heart_value != None:\r
+                                            EventMesh.publish(constants.PROTOCOL.HEART_SEND,heart_value)#上传心率数据\r
+                                        #获取心率数据上传数据app\r
+                                        EventMesh.debug_log("STOP_HEART:")\r
+                                        \r
+                                else:\r
+                                    self.HR_Onestate = 0\r
+                            else:\r
+                                self.hr_timeSecond = 0\r
+                                self.HR_Onestate = 0\r
+                                hr_state = EventMesh.publish("get_hr_state")#心率\r
+                                if hr_state == 2:\r
+                                    EventMesh.publish("set_hr_state",0)#2代表后台进入测试\r
+                                    EventMesh.debug_log("33stop debug3")\r
+                                    # EventMesh.publish("stop_led_timer")#设置参数\r
+                                    EventMesh.publish(constants.EVENT.STOP_HEART)\r
+                                    EventMesh.txt_log("auto wear stop_hr:2 ")\r
+\r
+                    get_spo2time = EventMesh.publish("get_spo2_time")#血压自动测试\r
+                    # print("get_spo2time",get_spo2time)\r
+                    if get_spo2time != None:#血压时间不为0\r
+                        spo2_on = int(get_spo2time[0])\r
+                        spo2_time = int(get_spo2time[1])\r
+                        if spo2_on != 0 and spo2_time != 0:\r
+                            get_hr_state = EventMesh.publish("get_hr_state")\r
+                            get_spo2_state = EventMesh.publish("get_spo2_state")\r
+                            get_bp_state  = EventMesh.publish("get_bp_state")\r
+                            get_bg_state  = EventMesh.publish("get_bg_state")\r
+                            # print("state bg2",get_hr_state,get_spo2_state,get_bp_state,get_bg_state)\r
+                            if (get_hr_state == 0 and get_bp_state == 0 and get_bg_state == 0) and (get_spo2_state == 2 or get_spo2_state == 0):#心率血压血氧不在测试就测试血糖自动测量\r
+                                if (time_tmp-self.spo2_timeSecond) >= spo2_time:#大于一个周期的时间,保存的时间戳时间 1678 0 1678 30 1678 \r
+                                    self.spo2_timeSecond = time_tmp\r
+                                    self.spo2auto_state = 0\r
+                                # print("time_tmp spo2",time_tmp,self.spo2_timeSecond,time_tmp-self.spo2_timeSecond,self.bg_timer,self.bpauto_state)\r
+                                if (time_tmp - self.spo2_timeSecond) == 0 and self.spo2auto_state == 0:\r
+                                    self.spo2auto_state = 1\r
+                                    EventMesh.debug_log("START_spo2:auto")\r
+                                    EventMesh.txt_log("auto START_spo2:1")\r
+                                    EventMesh.publish("set_spo2_state",2)#2代表后台进入测试\r
+                                    EventMesh.publish(constants.EVENT.START_BLOOD_OXYGEN)#K开血氧\r
+                                    \r
+                                elif (time_tmp - self.spo2_timeSecond) >= 60 and self.spo2auto_state == 1 and get_spo2_state == 2:\r
+                                    EventMesh.publish("set_spo2_state",0)#2代表后台进入测试\r
+                                    self.spo2auto_state = 0\r
+                                    EventMesh.publish(constants.EVENT.STOP_BLOOD_OXYGEN)\r
+                                    spo2_value = EventMesh.publish(constants.EVENT.GET_BLOOD_OXYGEN)\r
+                                    if spo2_value > 85 and spo2_value != None:\r
+                                        EventMesh.publish(constants.PROTOCOL.OXYGEN_SEND,spo2_value)\r
+                                    EventMesh.txt_log("auto stop_spo2:1")\r
+                                \r
+                            else:\r
+                                self.spo2auto_state = 0\r
+                        else:\r
+                            self.spo2_timeSecond = 0\r
+                            self.spo2auto_state = 0\r
+                            spo2_state = EventMesh.publish("get_spo2_state")#心率\r
+                            if spo2_state == 2:\r
+                                EventMesh.publish("set_spo2_state",0)#2代表后台进入测试\r
+                                EventMesh.debug_log("spo2 stop debug3")\r
+                                EventMesh.txt_log("auto wear stop_spo2:2 ")\r
+                                EventMesh.publish(constants.EVENT.STOP_BLOOD_OXYGEN)\r
+\r
+\r
+                    get_bptime = EventMesh.publish("get_bp_time")#血压自动测试\r
+                    # print("get_bptime",get_bptime)\r
+                    if get_bptime != None:#血压时间不为0\r
+                        bp_on = int(get_bptime[0])\r
+                        bp_time = int(get_bptime[1])\r
+                        if bp_on != 0 and bp_time != 0:\r
+                            get_hr_state = EventMesh.publish("get_hr_state")\r
+                            get_spo2_state = EventMesh.publish("get_spo2_state")\r
+                            get_bp_state  = EventMesh.publish("get_bp_state")\r
+                            get_bg_state  = EventMesh.publish("get_bg_state")\r
+                            # print("state bg2",get_hr_state,get_spo2_state,get_bp_state,get_bg_state)\r
+                            \r
+                            if (get_hr_state == 0 and get_spo2_state == 0 and get_bg_state == 0) and (get_bp_state == 2 or get_bp_state == 0):#心率血压血氧不在测试就测试血糖自动测量\r
+                                if (time_tmp-self.bp_timeSecond) >= bp_time:#大于一个周期的时间,保存的时间戳时间 1678 0 1678 30 1678 \r
+                                    self.bp_timeSecond = time_tmp\r
+                                    self.bpauto_state = 0\r
+                                # print("time_tmp bp",time_tmp,self.bp_timeSecond,time_tmp-self.bp_timeSecond,self.bg_timer,self.bpauto_state)\r
+                                if (time_tmp - self.bp_timeSecond) == 0 and self.bpauto_state == 0:\r
+                                    self.bpauto_state = 1\r
+                                    EventMesh.debug_log("START_bp:auto")\r
+                                    EventMesh.txt_log("auto START_bp:1")\r
+                                    EventMesh.publish("set_bp_state",2)#2代表后台进入测试\r
+                                    # EventMesh.publish("set_hr_blood_led",1)\r
+                                    EventMesh.publish(constants.EVENT.START_HEART)\r
+                                    \r
+                                elif (time_tmp - self.bp_timeSecond) >= 60 and self.bpauto_state == 1 and get_bp_state == 2:\r
+                                    self.bpauto_state = 0\r
+                                    EventMesh.publish("set_bp_state",0)#2代表后台进入测试\r
+                                    blood_data = get_autoblood_value()\r
+                                    if blood_data == None:\r
+                                        blood_data[0] = 0\r
+                                        blood_data[1] = 0\r
+\r
+                                    max_value = blood_data[0]\r
+                                    min_value = blood_data[1]\r
+                                    if max_value != 0 and min_value != 0:\r
+                                        EventMesh.publish(constants.PROTOCOL.BLOOD_SEND,[max_value,min_value])\r
+                                    EventMesh.publish(constants.EVENT.STOP_HEART)\r
+                                    EventMesh.txt_log("auto stop_bp:1")\r
+                                    \r
+                            else:\r
+                                self.bpauto_state = 0\r
+                        else:\r
+                            self.bp_timeSecond = 0\r
+                            self.bpauto_state = 0\r
+                            bp_state = EventMesh.publish("get_bp_state")#心率\r
+                            if bp_state == 2:\r
+                                EventMesh.publish("set_bp_state",0)#2代表后台进入测试\r
+                                EventMesh.debug_log("bp stop debug3")\r
+                                EventMesh.txt_log("auto wear stop_bp:2 ")\r
+                                # EventMesh.publish("stop_led_timer")#设置参数\r
+                                EventMesh.publish(constants.EVENT.STOP_HEART)\r
+\r
+\r
+\r
+                    bg_time = EventMesh.publish("get_bgauto_time")\r
+                    if bg_time != None:\r
+                    \r
+                        bg_btn = int(bg_time[0])\r
+                        bg_timer = int(bg_time[1]) \r
+                        # print("state bg2",self.bg_btn,self.bg_timer)\r
+                        if bg_btn >= 1 and bg_timer > 0:#开关打开并且时间大于0就可以测试血糖\r
+                            get_hr_state = EventMesh.publish("get_hr_state")\r
+                            get_spo2_state = EventMesh.publish("get_spo2_state")\r
+                            get_bp_state  = EventMesh.publish("get_bp_state")\r
+                            get_bg_state  = EventMesh.publish("get_bg_state")\r
+                            # print("state bg2",get_hr_state,get_spo2_state,get_bp_state,get_bg_state)\r
+                            \r
+                            if (get_hr_state == 0 and get_spo2_state == 0 and get_bp_state == 0) and (get_bg_state == 2 or get_bg_state == 0):#心率血压血氧不在测试就测试血糖自动测量\r
+                                if (time_tmp-self.bg_timeSecond) >= bg_timer:#大于一个周期的时间,保存的时间戳时间 1678 0 1678 30 1678 \r
+                                    self.bg_timeSecond = time_tmp #1780 \r
+                                    self.BG_state = 0\r
+                                # print("time_tmp bg",time_tmp,self.bg_timeSecond,time_tmp-self.bg_timeSecond,bg_timer,self.BG_state)\r
+                                if (time_tmp - self.bg_timeSecond) == 0 and self.BG_state == 0:\r
+                                    EventMesh.debug_log("START_bg:1")\r
+                                    EventMesh.txt_log("auto START_bg:1")\r
+                                    EventMesh.publish("set_bg_state",2)#2代表后台进入测试\r
+                                    # EventMesh.publish("set_hr_blood_led",1)\r
+                                    EventMesh.publish(constants.EVENT.START_HEART)\r
+                                    self.BG_state = 1\r
+                                elif (time_tmp - self.bg_timeSecond) >= 60 and self.BG_state == 1 and get_bg_state == 2:\r
+                                    self.BG_state = 0\r
+                                    EventMesh.publish("set_bg_state",0)#2代表后台进入测试\r
+                                    # EventMesh.publish("stop_led_timer")#设置参数\r
+                                    EventMesh.txt_log("auto stop_bg:1")\r
+                                    EventMesh.debug_log("stop bgdebug3")\r
+                                    EventMesh.publish(constants.EVENT.STOP_HEART)\r
+                                    bgdata = get_blood_sugar_value()\r
+                                    if bgdata == None:\r
+                                        bgdata = 0\r
+                                    if bgdata != 0:\r
+                                        EventMesh.debug_log("bgdata",bgdata)\r
+                                        EventMesh.publish(constants.PROTOCOL.BLOODGLUSOCE_SEND,bgdata)#上传心率数据\r
+                                    \r
+                            else:\r
+                                \r
+                                self.BG_state = 0\r
+                        else:\r
+                            bg_state  = EventMesh.publish("get_bg_state") \r
+                            if bg_state == 2:\r
+                                EventMesh.publish("set_bg_state",0)#2代表后台进入测试\r
+                                # EventMesh.publish("stop_led_timer")#设置参数\r
+                                EventMesh.debug_log("bg stop bgdebug3")\r
+                                EventMesh.txt_log("auto wear stop_bg:2 ")\r
+                                EventMesh.publish(constants.EVENT.STOP_HEART)\r
+                            self.bg_timeSecond = 0\r
+                            self.BG_state = 0\r
+\r
+\r
+\r
+\r
+\r
+                else:\r
+                    self.old_temp_time = 0\r
+                    self.old_time = 0\r
+                    # self.hr_timeSecond = time_tmp\r
+                    self.HR_Onestate = 0\r
+                    self.HR_OneTime = 0\r
+                    self.HR_state = 0\r
+                    self.old_time = 0    \r
+                    self.old_bp_time = 0\r
+                    self.old_hr_time = 0\r
+                    self.old_spo2_time = 0\r
+                    self.set_hsenor_crt = 0\r
+                    self.old_bg_time = 0\r
+                    # self.bg_timeSecond = time_tmp\r
+                    self.BG_state = 0\r
+                    # self.temp_timeSecond = time_tmp\r
+\r
+                    # self.bp_timeSecond = time_tmp\r
+                    self.bpauto_state = 0\r
+\r
+                    # self.spo2_timeSecond = time_tmp\r
+                    self.spo2auto_state = 0\r
+\r
+                    self.temp_state = 0\r
+                    self.temp_one_state = 0\r
+\r
+\r
+            else:\r
+                self.old_temp_time = 0\r
+                self.old_time = 0\r
+                # self.hr_timeSecond = time_tmp\r
+                self.HR_Onestate = 0\r
+                self.HR_OneTime = 0\r
+                self.HR_state = 0\r
+                self.old_time = 0    \r
+                self.old_bp_time = 0\r
+                self.old_hr_time = 0\r
+                self.old_spo2_time = 0\r
+                self.set_hsenor_crt = 0\r
+                self.old_bg_time = 0\r
+                # self.bg_timeSecond = time_tmp\r
+\r
+                self.BG_state = 0\r
+                # self.temp_timeSecond = time_tmp\r
+\r
+                # self.bp_timeSecond = time_tmp\r
+                self.bpauto_state = 0\r
+\r
+                # self.spo2_timeSecond = time_tmp\r
+                self.spo2auto_state = 0\r
+\r
+                self.temp_state = 0\r
+                self.temp_one_state = 0\r
+\r
+                get_hr_state = EventMesh.publish("get_hr_state")\r
+                get_spo2_state = EventMesh.publish("get_spo2_state")\r
+                get_bp_state  = EventMesh.publish("get_bp_state")\r
+                get_bg_state  = EventMesh.publish("get_bg_state")\r
+                if get_hr_state != None and get_spo2_state != None and get_bp_state != None and get_bg_state != None:\r
+                    if get_hr_state > 1:\r
+                        EventMesh.txt_log("auto stop_hr:44")\r
+                        EventMesh.publish("set_hr_state",0)#2代表后台进入测试,定时测心率 1ui界面测试洗心率 \r
+                        # if get_hr_state == 3:\r
+                        #     EventMesh.publish("stop_led_timer")#设置参数\r
+                        EventMesh.debug_log("stop debug8")\r
+                        if WEAR == 1:\r
+                            heart_value = EventMesh.publish(constants.EVENT.GET_HEART)\r
+                            if heart_value >= 50 and heart_value != None:\r
+                                EventMesh.publish(constants.PROTOCOL.HEART_SEND,heart_value)#上传心率数据\r
+                        EventMesh.publish(constants.EVENT.STOP_HEART) \r
+                    elif get_spo2_state > 1:\r
+                        EventMesh.txt_log("auto stop_spo2:44")\r
+                        EventMesh.publish("set_spo2_state",0)#2代表后台进入测试\r
+                        # if get_spo2_state == 3:\r
+                        #     EventMesh.publish("stop_led_timer")#设置参数\r
+                        if WEAR == 1:\r
+                            spo2_value = EventMesh.publish(constants.EVENT.GET_BLOOD_OXYGEN)\r
+                            if spo2_value > 85 and spo2_value != None:\r
+                                EventMesh.publish(constants.PROTOCOL.OXYGEN_SEND,spo2_value)\r
+                        EventMesh.publish(constants.EVENT.STOP_BLOOD_OXYGEN)\r
+                        EventMesh.debug_log("stop debug13")\r
+                    elif get_bp_state > 1:\r
+                        EventMesh.txt_log("auto stop_bp:44")\r
+                        EventMesh.publish("set_bp_state",0)#2代表后台进入测试\r
+                        # if get_bp_state == 3:\r
+                        #     EventMesh.publish("stop_led_timer")#设置参数\r
+                        if WEAR == 1:\r
+                            blood_data = get_autoblood_value()\r
+                            if blood_data == None:\r
+                                blood_data[0] = 0\r
+                                blood_data[1] = 0\r
+\r
+                            max_value = blood_data[0]\r
+                            min_value = blood_data[1]\r
+                            if max_value != 0 and min_value != 0:\r
+                                EventMesh.publish(constants.PROTOCOL.BLOOD_SEND,[max_value,min_value])\r
+                        EventMesh.publish(constants.EVENT.STOP_HEART)\r
+                        EventMesh.debug_log("stop debug14")\r
+                    elif get_bg_state > 1:\r
+                        EventMesh.txt_log("auto stop_bg:44")\r
+                        EventMesh.publish("set_bg_state",0)#2代表后台进入测试\r
+                        # if get_bg_state == 3:\r
+                        #     EventMesh.publish("stop_led_timer")#设置参数\r
+                        EventMesh.publish(constants.EVENT.STOP_HEART)\r
+                        if WEAR == 1:\r
+                            bgdata = get_blood_sugar_value()\r
+                            if bgdata == None:\r
+                                bgdata = 0\r
+                            if bgdata != 0:\r
+                                EventMesh.publish(constants.PROTOCOL.BLOODGLUSOCE_SEND,bgdata)#上传心率数据\r
+                        EventMesh.debug_log("stop debug15")\r
+                get_temp_state  = EventMesh.publish("get_temp_state")\r
+                if get_temp_state != None:\r
+                    if get_temp_state > 1:\r
+                        self.temp_one_state = 0\r
+                        self.temp_state = 0\r
+                        temp = EventMesh.publish(constants.EVENT.GET_TEMP)       \r
+                        temp = self.optimize_temp(temp)\r
+                        EventMesh.txt_log("auto stop_temp:44")\r
+                        EventMesh.publish("set_temp_state",0)\r
+                        if WEAR == 1:\r
+                            tmp_f_tmp = 0\r
+                            tmp_d_tmp = 0\r
+                            if str(temp).find(".") != -1:\r
+                                tmp_f = str(temp).split('.')[0] \r
+                                tmp_f_tmp = int(tmp_f)\r
+                                \r
+                                tmp_d = str(temp).split('.')[1][:1]\r
+                                tmp_d_tmp = int(tmp_d)\r
+                            else:\r
+                                tmp_f_tmp = temp\r
+                                \r
+                            if temp != None:\r
+                                if temp != 0:\r
+                                    EventMesh.publish(constants.PROTOCOL.TEMP_SEND,[tmp_f_tmp,tmp_d_tmp])\r
+                        EventMesh.publish(constants.EVENT.STOP_TEMP)\r
+\r
+\r
+            hr_state = EventMesh.publish("get_hr_state")\r
+            spo2_state = EventMesh.publish("get_spo2_state")\r
+            temp_state  = EventMesh.publish("get_temp_state")\r
+            if hr_state != None or spo2_state != None or temp_state != None:#手动测试\r
+                auto_hr = EventMesh.publish("get_start_measure_time")#设置开始测量的时间戳时间\r
+                if auto_hr == None:\r
+                    auto_hr = 0\r
+                if hr_state == 1:\r
+                    if auto_hr != 0:\r
+                        self.auto_hr_count+=1\r
+                        if  self.auto_hr_count > 6:\r
+                            self.auto_hr_count = 0\r
+                            EventMesh.publish("set_hr_state",0)#0代表g关闭测试\r
+                            EventMesh.debug_log("stop debug7")\r
+                            EventMesh.publish(constants.EVENT.STOP_HEART)\r
+                            heart_value = EventMesh.publish(constants.EVENT.GET_HEART)\r
+                            if heart_value >= 50 and heart_value != None:\r
+                                EventMesh.publish("play_hr_value",heart_value)\r
+                                # EventMesh.publish("set_history_hr_value",heart_value)\r
+                                EventMesh.publish(constants.PROTOCOL.HEART_SEND,heart_value)#上传心率数据\r
+\r
+                                blood_data = get_autoblood_value()\r
+                                if blood_data == None:\r
+                                    blood_data[0] = 0\r
+                                    blood_data[1] = 0\r
+\r
+                                max_value = blood_data[0]\r
+                                min_value = blood_data[1]\r
+                                if max_value != 0 and min_value != 0:\r
+                                    EventMesh.publish(constants.PROTOCOL.BLOOD_SEND,[max_value,min_value])\r
+\r
+                            else:\r
+                                EventMesh.publish("play_hr_value",0) \r
+                        else :\r
+                            if WEAR != 1:\r
+                                EventMesh.publish("set_hr_state",0)#0代表g关闭测试\r
+                                EventMesh.debug_log("stop debug7")\r
+                                EventMesh.publish(constants.EVENT.STOP_HEART)                               \r
+                                EventMesh.publish("play_hr_value",0) \r
+                                \r
+                else:\r
+                    self.auto_hr_count = 0\r
+                    \r
+\r
+                auto_spo2 = EventMesh.publish("get_start_measure_time")#设置开始测量的时间戳时间\r
+                if auto_spo2 == None:\r
+                    auto_spo2 = 0\r
+                if spo2_state == 1:#手动测试血氧\r
+                    if auto_spo2 != None:\r
+                        if auto_spo2 != 0:\r
+                            self.auto_spo2_count+=1\r
+                            if self.auto_spo2_count > 6:\r
+                                self.auto_spo2_count = 0\r
+                                EventMesh.publish("set_spo2_state",0)#0代表g关闭测试\r
+                                EventMesh.debug_log("stop spo2 debug7")\r
+                                EventMesh.publish(constants.EVENT.STOP_BLOOD_OXYGEN)\r
+                                spo2_value = EventMesh.publish(constants.EVENT.GET_BLOOD_OXYGEN)\r
+                                if spo2_value > 85 and spo2_value != None:\r
+                                    EventMesh.publish("play_spo2_value",spo2_value)\r
+                                    EventMesh.publish("set_old_spo2_data",spo2_value)\r
+                                    EventMesh.publish(constants.PROTOCOL.OXYGEN_SEND,spo2_value)\r
+                                else:\r
+                                    EventMesh.publish("play_spo2_value",0)\r
+                            \r
+                            else:\r
+                                if WEAR != 1:\r
+                                    EventMesh.publish("set_spo2_state",0)#0代表g关闭测试\r
+                                    EventMesh.debug_log("stop debug8")\r
+                                    EventMesh.publish(constants.EVENT.STOP_BLOOD_OXYGEN)                               \r
+                                    EventMesh.publish("play_spo2_value",0) \r
+                                    \r
+                else:\r
+                    self.auto_spo2_count = 0\r
+\r
+                if temp_state == 1:#手动测试体温\r
+                    auto_temp = EventMesh.publish("get_start_temp_measure_time")#设置开始测量的时间戳时间\r
+                    if auto_temp == None:\r
+                        auto_temp = 0\r
+                    if auto_temp != None:\r
+                        if auto_temp != 0:\r
+                            self.auto_temp_count += 1\r
+                            if self.auto_temp_count > 6:\r
+                                self.auto_temp_count = 0\r
+                                EventMesh.debug_log("体温测量结束")\r
+                                temp = EventMesh.publish(constants.EVENT.GET_TEMP)       \r
+                                temp = self.optimize_temp(temp)\r
+                                EventMesh.debug_log("temp",temp)\r
+                                EventMesh.publish("set_temp_state",0)\r
+                                tmp_f_tmp = 0\r
+                                tmp_d_tmp = 0\r
+                                if str(temp).find(".") != -1:\r
+                                    tmp_f = str(temp).split('.')[0] \r
+                                    tmp_f_tmp = int(tmp_f)\r
+                                    \r
+                                    tmp_d = str(temp).split('.')[1][:1]\r
+                                    tmp_d_tmp = int(tmp_d)\r
+                                else:\r
+                                    tmp_f_tmp = temp\r
+                                    \r
+                                if temp != None:\r
+                                    if temp != 0:\r
+                                        # EventMesh.publish("set_history_temp_value",temp)\r
+                                        EventMesh.publish("play_temp_value",temp)#播放体温数值\r
+                                        EventMesh.publish(constants.PROTOCOL.TEMP_SEND,[tmp_f_tmp,tmp_d_tmp])\r
+                                    else:\r
+                                        # EventMesh.publish("set_history_temp_value",0)\r
+                                        EventMesh.publish("play_temp_value",0)#播放体温数值\r
+                                \r
+                                EventMesh.publish(constants.EVENT.STOP_TEMP)\r
+\r
+                            else :\r
+                                if WEAR  != 1:\r
+                                    EventMesh.publish("set_temp_state",0)#0代表g关闭测试\r
+                                    EventMesh.debug_log("stop debug9")\r
+                                    EventMesh.publish(constants.EVENT.STOP_TEMP)                               \r
+                                    EventMesh.publish("play_temp_value",0) \r
+                                    \r
+                else:\r
+                    self.auto_temp_count = 0\r
+\r
+            EventMesh.publish("play_unread_wechat_infor")#每10s检测是否有未读语音数据\r
+\r
+            usb_state = EventMesh.publish("get_usb")#\r
+            \r
+            # EventMesh.publish("set_led_time_arg",[1,2,20*11,led_mode.FLASH_LIGHT_RED,20,10,led_mode.OTHER_MEASURE_MODE])#測量成功\r
+            if battery[0] == '1':\r
+                # EventMesh.debug_log("battery[1]",battery[1])\r
+                if self.vbat_full_flag <= 120:\r
+                    self.vbat_full_flag+=10\r
+                    if self.vbat_full_flag == 60:#开机检测一次如果是充电标识为1就不再提示\r
+                        if usb_state != 1:\r
+                            EventMesh.publish("set_usb",1)#\r
+                else:\r
+                    if battery[1] >= 100:\r
+                        if self.charge_full_count == 0:#充电已满\r
+                            EventMesh.publish("set_usb",3)#\r
+                            EventMesh.debug_log("charge R_CHARGE_full")\r
+                            self.charge_full_count = 1\r
+                    \r
+            else:\r
+                self.charge_full_count = 0\r
+                low_power = battery[1]\r
+                if low_power <= 5:#小于5%红色灯慢闪\r
+                    EventMesh.publish("set_led_time_arg",[1,2,20*11,led_mode.FLASH_LIGHT_RED,20,10,led_mode.OTHER_MEASURE_MODE])#測量成功\r
+                    # EventMesh.publish("set_led_time_arg",[1000,400,52,led_mode.FLASH_LIGHT_RED,led_mode.DEFAULT_LONG_LIGHT_MODE,led_mode.OTHER_MEASURE_MODE])#開始測量\r
+\r
+            \r
+            self.normal_alarm()\r
+            #喝水提醒\r
+            self.drink_alarm()\r
+            #该吃药了\r
+            self.medicine_alarm()\r
+            #该起床了\r
+            self.wakeup_alarm()\r
+            #该睡觉了\r
+            self.sleep_alarm()\r
+            #该回家了\r
+            self.home_alarm()\r
+            #该休息了\r
+            self.reset_alarm()\r
+\r
+\r
+            if self.alarm_flag == 0:\r
+                self.alarm_flag = 1\r
+                EventMesh.publish("set_rtc_alarm")\r
+\r
+            EventMesh.publish("video_no_network")\r
+\r
+        def clear_usb_flag(self,event,msg):\r
+            self.charge_full_count = 0\r
+        #普通闹钟\r
+        def normal_alarm(self):\r
+            data = RTC().datetime()\r
+            hour = data[4]\r
+            min = data[5]\r
+\r
+            week = int(data[3])\r
+\r
+            date1 = data[1]\r
+            date2 = data[2]\r
+            cur_total_min = int(hour)*60+int(min)\r
+            # EventMesh.debug_log("self.normal_oldtotalmin",self.normal_oldtotalmin,cur_total_min,self.alarm_flag)\r
+            if self.normal_oldtotalmin == 0:\r
+                self.normal_oldtotalmin = cur_total_min #549\r
+            if self.normal_oldtotalmin != cur_total_min: #上次响过的闹钟分钟数不等于当前的分钟数据需要清零否则下一个不会响铃\r
+                if self.normal_flag == 1:\r
+                    self.normal_flag = 0\r
+                    self.normal_count = 0\r
+            normal_alarm = []\r
+            normal_alarm = EventMesh.publish("get_storage_config","normal_alarm")\r
+            # EventMesh.debug_log("sleep info2",sleep,cur_total_min)\r
+            if self.normal_flag == 1:#表示闹钟响过清除标志\r
+                self.normal_count+=1\r
+                if self.normal_count > 6:\r
+                    self.normal_count = 0\r
+                    self.normal_flag = 0\r
+            if normal_alarm != None:\r
+                if len(normal_alarm) != 0 and normal_alarm != []:\r
+                    j = 0\r
+                    for i in range(len(normal_alarm)):\r
+                        # EventMesh.debug_log("normal_alarm normal_alarm 33",normal_alarm,j)\r
+                        normalalarm_hour = normal_alarm[j]["hour"]\r
+                        normalalarm_min = normal_alarm[j]["min"]\r
+                        normalalarm_day = normal_alarm[j]["day"]\r
+                        normalalarm_enale = normal_alarm[j]["enable"]\r
+                        normalalarm_totalmin = int(normalalarm_hour)*60+int(normalalarm_min)\r
+                        # EventMesh.debug_log("wake alarm",normalalarm_hour,sleep_min,sleep_day,sleep_enale,sleep_totalmin,week)\r
+                        if normalalarm_day == []:#单次闹钟只响一次\r
+                            if normalalarm_enale != 0:\r
+                                if cur_total_min > normalalarm_totalmin:\r
+                                    normal_alarm.pop(j)\r
+                                    self.normal_count = 0\r
+                                    self.normal_flag  = 0 \r
+                                    j=0\r
+                                    # EventMesh.debug_log("wakeup wakeup dayu",sleep,j)\r
+                                    EventMesh.publish("set_storage_config",["normal_alarm",normal_alarm])#删除之后重新保存\r
+                                    # sleep = EventMesh.publish("get_storage_config","sleep_alarm")#删除之后重新保存\r
+                                    continue\r
+                                else:\r
+                                    if normalalarm_totalmin == cur_total_min and self.normal_flag == 0:#14:00\r
+                                        self.normal_count = 0\r
+                                        self.normal_flag  = 0    \r
+                                        normal_alarm.pop(j)\r
+                                        # EventMesh.debug_log("wakeup wakeup1",sleep,j)\r
+                                        EventMesh.publish("set_storage_config",["normal_alarm",normal_alarm])#删除之后重新保存\r
+                                        EventMesh.publish("OPEN_ALARM_RING")                                                                                                                                            \r
+                                        break\r
+                        else:\r
+                            if normalalarm_enale != 0 and (week in normalalarm_day):#记录响过的时间分钟数\r
+                                if normalalarm_totalmin == cur_total_min and self.normal_flag == 0:#14:00\r
+                                    self.normal_flag  = 1\r
+                                    self.normal_count = 0\r
+                                    self.normal_oldtotalmin = normalalarm_totalmin\r
+                                    EventMesh.publish("OPEN_ALARM_RING")#                                                                                                                                                  \r
+                                    break\r
+                        j+=1\r
+\r
+\r
+        #喝水提醒\r
+        def drink_alarm(self):\r
+            date_tmp = utime.localtime()\r
+            time_tmp = utime.mktime(date_tmp)\r
+        \r
+            if self.drink_time == 0:\r
+                self.drink_time = time_tmp\r
+            \r
+            on = EventMesh.publish("get_storage_config","drink_on")\r
+            time = EventMesh.publish("get_storage_config","drink_time")\r
+            # print("drink info2",on,time)\r
+            if on != None and time != None:\r
+                if on != 0 and time != 0:\r
+                    if (time_tmp - self.drink_time) >= (time*60*60):#需要转换成小时3600\r
+                        self.drink_time = time_tmp \r
+                        EventMesh.publish("drink_alarm_event")#该喝水了\r
+                        #该喝水了\r
+                else:\r
+                    self.drink_time = 0\r
+            else:\r
+                self.drink_time = 0\r
+\r
+        #吃药提醒\r
+        def medicine_alarm(self):\r
+            data = RTC().datetime()\r
+            hour = data[4]\r
+            min = data[5]\r
+\r
+            week = int(data[3])\r
+\r
+            date1 = data[1]\r
+            date2 = data[2]\r
+            cur_total_min = int(hour)*60+int(min)\r
+            # print("self.medicine_oldtotalmin",self.medicine_oldtotalmin,cur_total_min,self.alarm_flag)\r
+            if self.medicine_oldtotalmin == 0:\r
+                self.medicine_oldtotalmin = cur_total_min #549\r
+            if self.medicine_oldtotalmin != cur_total_min: #上次响过的闹钟分钟数不等于当前的分钟数据需要清零否则下一个不会响铃\r
+                if self.medicine_flag == 1:\r
+                    self.medicine_flag = 0\r
+                    self.medicine_count = 0\r
+            medicine = EventMesh.publish("get_storage_config","medicine")\r
+            # print("medicine info2",medicine,cur_total_min)\r
+            if self.medicine_flag == 1:#表示闹钟响过清除标志\r
+                self.medicine_count+=1\r
+                if self.medicine_count > 6:\r
+                    self.medicine_count = 0\r
+                    self.medicine_flag = 0\r
+            if medicine != None:\r
+                if len(medicine) != 0 and medicine != []:\r
+                    for i in range(len(medicine)):\r
+                        medicine_hour = medicine[i]["hour"]\r
+                        medicine_min = medicine[i]["min"]\r
+                        medicine_day = medicine[i]["day"]\r
+                        medicine_enale = medicine[i]["enable"]\r
+                        medicine_totalmin = int(medicine_hour)*60+int(medicine_min)\r
+                        # print("medicine alarm",medicine_hour,medicine_min,medicine_day,medicine_enale,medicine_totalmin,week)\r
+                        if medicine_day == []:\r
+                            if medicine_enale != 0:\r
+                                if medicine_totalmin == cur_total_min and self.medicine_flag == 0:#14:00\r
+                                    self.medicine_count = 0\r
+                                    self.medicine_flag  = 1    \r
+                                    self.medicine_oldtotalmin = medicine_totalmin#记录响过的时间分钟数\r
+                                    # print("medicine alarm1")\r
+                                    EventMesh.publish("medicine_alarm_event")#该吃药了                                                                                                                                              \r
+                                    break\r
+                        else:\r
+                            if medicine_enale != 0 and (week in medicine_day):#记录响过的时间分钟数\r
+                                if medicine_totalmin == cur_total_min and self.medicine_flag == 0:#14:00\r
+                                    self.medicine_flag  = 1\r
+                                    self.medicine_count = 0\r
+                                    self.medicine_oldtotalmin = medicine_totalmin\r
+                                    # print("medicine alarm2",)\r
+                                    EventMesh.publish("medicine_alarm_event")#该吃药了                                                                                                                                                   \r
+                                    break\r
+        #该起床了\r
+        def wakeup_alarm(self):\r
+            data = RTC().datetime()\r
+            hour = data[4]\r
+            min = data[5]\r
+\r
+            week = int(data[3])\r
+\r
+            date1 = data[1]\r
+            date2 = data[2]\r
+            cur_total_min = int(hour)*60+int(min)\r
+            # EventMesh.debug_log("self.wakeup_oldtotalmin",self.wakeup_oldtotalmin,cur_total_min,self.alarm_flag)\r
+            if self.wakeup_oldtotalmin == 0:\r
+                self.wakeup_oldtotalmin = cur_total_min #549\r
+            if self.wakeup_oldtotalmin != cur_total_min: #上次响过的闹钟分钟数不等于当前的分钟数据需要清零否则下一个不会响铃\r
+                if self.wakeup_flag == 1:\r
+                    self.wakeup_flag = 0\r
+                    self.wakeup_count = 0\r
+            wakeup = []\r
+            wakeup = EventMesh.publish("get_storage_config","wakeup_alarm")\r
+            # EventMesh.debug_log("wakeup info2",wakeup,cur_total_min)\r
+            if self.wakeup_flag == 1:#表示闹钟响过清除标志\r
+                self.wakeup_count+=1\r
+                if self.wakeup_count > 6:\r
+                    self.wakeup_count = 0\r
+                    self.wakeup_flag = 0\r
+            if wakeup != None:\r
+                if len(wakeup) != 0 and wakeup != []:\r
+                    j = 0\r
+                    for i in range(len(wakeup)):\r
+                        wakeup_hour = wakeup[j]["hour"]\r
+                        wakeup_min = wakeup[j]["min"]\r
+                        wakeup_day = wakeup[j]["day"]\r
+                        wakeup_enale = wakeup[j]["enable"]\r
+                        wakeup_totalmin = int(wakeup_hour)*60+int(wakeup_min)\r
+                        # EventMesh.debug_log("wake alarm",wakeup_hour,wakeup_min,wakeup_day,wakeup_enale,wakeup_totalmin,week)\r
+                        if wakeup_day == []:#单次闹钟只响一次\r
+                            if wakeup_enale != 0:\r
+                                if cur_total_min > wakeup_totalmin:\r
+                                    self.wakeup_count = 0\r
+                                    self.wakeup_flag  = 0    \r
+                                    wakeup.pop(j)\r
+                                    j=0#每次删除都从0开始遍历\r
+                                    # EventMesh.debug_log("wakeup wakeup1 dayu",wakeup,j)\r
+                                    EventMesh.publish("set_storage_config",["wakeup_alarm",wakeup])\r
+                                    continue\r
+                                else:\r
+                                    if wakeup_totalmin == cur_total_min and self.wakeup_flag == 0:#14:00\r
+                                        self.wakeup_count = 0\r
+                                        self.wakeup_flag  = 0    \r
+                                        wakeup.pop(j)\r
+                                        EventMesh.debug_log("wakeup wakeup1",wakeup,j)\r
+                                        EventMesh.publish("set_storage_config",["wakeup_alarm",wakeup])\r
+                                        EventMesh.publish("wakeup_alarm_event")#该吃药了                                                                                                                                              \r
+                                        break\r
+                        else:\r
+                            if wakeup_enale != 0 and (week in wakeup_day):#记录响过的时间分钟数\r
+                                if wakeup_totalmin == cur_total_min and self.wakeup_flag == 0:#14:00\r
+                                    self.wakeup_flag  = 1\r
+                                    self.wakeup_count = 0\r
+                                    self.wakeup_oldtotalmin = wakeup_totalmin\r
+                                    EventMesh.publish("wakeup_alarm_event")#该吃药了                                                                                                                                                   \r
+                                    break\r
+                        j+=1\r
+\r
+\r
+        #该睡觉了\r
+        def sleep_alarm(self):\r
+            data = RTC().datetime()\r
+            hour = data[4]\r
+            min = data[5]\r
+\r
+            week = int(data[3])\r
+\r
+            date1 = data[1]\r
+            date2 = data[2]\r
+            cur_total_min = int(hour)*60+int(min)\r
+            # EventMesh.debug_log("self.sleep_oldtotalmin",self.sleep_oldtotalmin,cur_total_min,self.alarm_flag)\r
+            if self.sleep_oldtotalmin == 0:\r
+                self.sleep_oldtotalmin = cur_total_min #549\r
+            if self.sleep_oldtotalmin != cur_total_min: #上次响过的闹钟分钟数不等于当前的分钟数据需要清零否则下一个不会响铃\r
+                if self.sleep_flag == 1:\r
+                    self.sleep_flag = 0\r
+                    self.sleep_count = 0\r
+            sleep = []\r
+            sleep = EventMesh.publish("get_storage_config","sleep_alarm")\r
+            # EventMesh.debug_log("sleep info2",sleep,cur_total_min)\r
+            if self.sleep_flag == 1:#表示闹钟响过清除标志\r
+                self.sleep_count+=1\r
+                if self.sleep_count > 6:\r
+                    self.sleep_count = 0\r
+                    self.sleep_flag = 0\r
+            if sleep != None:\r
+                if len(sleep) != 0 and sleep != []:\r
+                    j = 0\r
+                    count = int(len(sleep))\r
+                    for i in range(len(sleep)):\r
+                        # EventMesh.debug_log("wakeup wakeup 33",sleep,j)\r
+                        sleep_hour = sleep[j]["hour"]\r
+                        sleep_min = sleep[j]["min"]\r
+                        sleep_day = sleep[j]["day"]\r
+                        sleep_enale = sleep[j]["enable"]\r
+                        sleep_totalmin = int(sleep_hour)*60+int(sleep_min)\r
+                        # EventMesh.debug_log("wake alarm",sleep_hour,sleep_min,sleep_day,sleep_enale,sleep_totalmin,week)\r
+                        if sleep_day == []:#单次闹钟只响一次\r
+                            if sleep_enale != 0:\r
+                                if cur_total_min > sleep_totalmin:\r
+                                    sleep.pop(j)\r
+                                    self.sleep_count = 0\r
+                                    self.sleep_flag  = 0 \r
+                                    j=0\r
+                                    # EventMesh.debug_log("wakeup wakeup dayu",sleep,j)\r
+                                    EventMesh.publish("set_storage_config",["sleep_alarm",sleep])#删除之后重新保存\r
+                                    # sleep = EventMesh.publish("get_storage_config","sleep_alarm")#删除之后重新保存\r
+                                    continue\r
+                                else:\r
+                                    if sleep_totalmin == cur_total_min and self.sleep_flag == 0:#14:00\r
+                                        self.sleep_count = 0\r
+                                        self.sleep_flag  = 0    \r
+                                        sleep.pop(j)\r
+                                        # EventMesh.debug_log("wakeup wakeup1",sleep,j)\r
+                                        EventMesh.publish("set_storage_config",["sleep_alarm",sleep])#删除之后重新保存\r
+                                        EventMesh.publish("sleep_alarm_event")#该吃药了                                                                                                                                              \r
+                                        break\r
+                        else:\r
+                            if sleep_enale != 0 and (week in sleep_day):#记录响过的时间分钟数\r
+                                if sleep_totalmin == cur_total_min and self.sleep_flag == 0:#14:00\r
+                                    self.sleep_flag  = 1\r
+                                    self.sleep_count = 0\r
+                                    self.sleep_oldtotalmin = sleep_totalmin\r
+                                    EventMesh.publish("sleep_alarm_event")#该吃药了                                                                                                                                                   \r
+                                    break\r
+                        j+=1\r
+\r
+\r
+        #该回家了\r
+        def home_alarm(self):\r
+            data = RTC().datetime()\r
+            hour = data[4]\r
+            min = data[5]\r
+\r
+            week = int(data[3])\r
+\r
+            date1 = data[1]\r
+            date2 = data[2]\r
+            cur_total_min = int(hour)*60+int(min)\r
+            # EventMesh.debug_log("self.home_oldtotalmin",self.home_oldtotalmin,cur_total_min,self.alarm_flag)\r
+            if self.home_oldtotalmin == 0:\r
+                self.home_oldtotalmin = cur_total_min #549\r
+            if self.home_oldtotalmin != cur_total_min: #上次响过的闹钟分钟数不等于当前的分钟数据需要清零否则下一个不会响铃\r
+                if self.home_flag == 1:\r
+                    self.home_flag = 0\r
+                    self.home_count = 0\r
+            home = ''\r
+            home = EventMesh.publish("get_storage_config","home_alarm")\r
+            # EventMesh.debug_log("sleep info2",sleep,cur_total_min)\r
+            if self.home_flag == 1:#表示闹钟响过清除标志\r
+                self.home_count+=1\r
+                if self.home_count > 6:\r
+                    self.home_count = 0\r
+                    self.home_flag = 0\r
+            if home != None:\r
+                if len(str(home)) != 0 and str(home) != '':\r
+                    # EventMesh.debug_log("home home 33",home)\r
+                    home_hour = int(str(home).split(":")[0])\r
+                    home_min = int(str(home).split(":")[1])\r
+                    \r
+                    home_totalmin = int(home_hour)*60+int(home_min)\r
+                    if home_totalmin == cur_total_min and self.home_flag == 0:#14:00\r
+                        self.home_flag  = 1\r
+                        self.home_count = 0\r
+                        self.home_oldtotalmin = home_totalmin\r
+                        EventMesh.publish("home_alarm_event")#该回家了                                                                                                                                                   \r
+\r
+\r
+        \r
+        #该休息了\r
+        def reset_alarm(self):\r
+            data = RTC().datetime()\r
+            hour = data[4]\r
+            min = data[5]\r
+\r
+            week = int(data[3])\r
+\r
+            date1 = data[1]\r
+            date2 = data[2]\r
+            cur_total_min = int(hour)*60+int(min)\r
+            # EventMesh.debug_log("self.reset_oldtotalmin",self.reset_oldtotalmin,cur_total_min,self.alarm_flag)\r
+            if self.reset_oldtotalmin == 0:\r
+                self.reset_oldtotalmin = cur_total_min #549\r
+            if self.reset_oldtotalmin != cur_total_min: #上次响过的闹钟分钟数不等于当前的分钟数据需要清零否则下一个不会响铃\r
+                if self.reset_flag == 1:\r
+                    self.reset_flag = 0\r
+                    self.reset_count = 0\r
+            reset_alarm = []\r
+            reset_alarm = EventMesh.publish("get_storage_config","reset_alarm")\r
+            # EventMesh.debug_log("reset_alarm info2",len(reset_alarm),cur_total_min)\r
+            if self.reset_flag == 1:#表示闹钟响过清除标志\r
+                self.reset_count+=1\r
+                if self.reset_count > 6:\r
+                    self.reset_count = 0\r
+                    self.reset_flag = 0\r
+            if reset_alarm != None:\r
+                if len(str(reset_alarm)) != 0 and str(reset_alarm) != []:\r
+                    for i in range(len(reset_alarm)):\r
+                        # print("i",i)\r
+                        start_hour = int(reset_alarm[i]["start_hour"])\r
+                        start_min = int(reset_alarm[i]["start_min"])\r
+\r
+                        end_hour = int(reset_alarm[i]["end_hour"])\r
+                        end_min = int(reset_alarm[i]["end_min"])\r
+\r
+                        # EventMesh.debug_log("reset_alarm home 33",reset_alarm)\r
+                        \r
+                        start_totalmin = int(start_hour)*60+int(start_min)\r
+                        end_totalmin = int(end_hour)*60+int(end_min)\r
+\r
+                        if start_totalmin == cur_total_min and self.reset_flag == 0:#14:00\r
+                            self.reset_flag  = 1\r
+                            self.reset_count = 0\r
+                            self.reset_oldtotalmin = start_totalmin\r
+                            EventMesh.publish("reset_alarm_event")#该休息了     \r
+                            break\r
+\r
+                        if end_totalmin == cur_total_min and self.reset_flag == 0:\r
+                            self.reset_flag  = 1\r
+                            self.reset_count = 0\r
+                            self.reset_oldtotalmin = end_totalmin\r
+                            EventMesh.publish("reset_end_alarm_event")#休息结束了     \r
+                            break\r
+                                                                                                                                                                    \r
+\r
+        def clear_normal_alarm(self,event,msg):#普通闹钟清除标志\r
+            self.normal_flag = 0\r
+            self.normal_count = 0\r
+            self.normal_oldtotalmin = 0\r
+\r
+        def clear_reset_alarm(self,event,msg):#休息清除标志\r
+            self.reset_flag = 0\r
+            self.reset_count = 0\r
+            self.reset_oldtotalmin = 0\r
+\r
+        def clear_home_alarm(self,event,msg):#回家清除标志\r
+            self.home_flag = 0\r
+            self.home_count = 0\r
+            self.home_oldtotalmin = 0\r
+\r
+\r
+        def clear_medicine_alarm(self,event,msg):#吃药清除标志\r
+            self.medicine_count = 0\r
+            self.medicine_flag  = 0\r
+            self.medicine_oldtotalmin = 0\r
+        \r
+\r
+        def clear_wakeup_alarm(self,event,msg):#起床标识\r
+            self.wakeup_flag = 0\r
+            self.wakeup_count = 0\r
+            self.wakeup_oldtotalmin = 0\r
+\r
+        def clear_sleep_alarm(self,event,msg):#睡觉标识\r
+\r
+            self.sleep_flag = 0\r
+            self.sleep_count = 0\r
+            self.sleep_oldtotalmin = 0\r
+\r
+            \r
+\r
+\r
+        def get_sim_Status(self, event, msg):\r
+            return sim.getStatus()\r
+        def get_device_ope(self, event, msg):\r
+            """\r
+            获取设备运营商信息\r
+            :param event:\r
+            :param msg:\r
+            :return: 运营商\r
+            """\r
+            net_ope_map = {\r
+                "UNICOM": "中国联通HD",\r
+                "CMCC": "中国移动HD",\r
+                "CT": "中国电信HD"\r
+            }\r
+            """获取运营商"""\r
+            try:\r
+                short_eons = net.operatorName()[1]\r
+            except Exception:\r
+                return "无"\r
+            return net_ope_map.get(short_eons, None)\r
+\r
+        def get_signal(self, event=None, msg=None):\r
+            """\r
+            获取信号事件\r
+            :param event:\r
+            :param msg:\r
+            :return: int 类型\r
+            """\r
+            return net.csqQueryPoll()\r
+\r
+        def get_time_bucket(self, time):\r
+            if time < 12:\r
+                return '上午'\r
+            else:\r
+                return '下午'\r
+\r
+        def get_week(self, week):\r
+            if week == 1:\r
+                return '一'\r
+            elif week == 2:\r
+                return '二'\r
+            elif week == 3:\r
+                return '三'\r
+            elif week == 4:\r
+                return '四'\r
+            elif week == 5:\r
+                return '五'\r
+            elif week == 6:\r
+                return '六'\r
+            elif week == 7 or week == 0:\r
+                return '日'\r
+\r
+        def get_time(self, event=None, msg=None):\r
+            """\r
+            获取时间事件\r
+            :param event:\r
+            :param msg:\r
+            :return: HH:MM 格式\r
+            """\r
+            rtc_time = self.rtc.datetime()\r
+            \r
+            date = ("%d月%d日" % (rtc_time[1], rtc_time[2]))\r
+            year = ("%04d年" % (rtc_time[0]))\r
+            week = ("星期%s"%(self.get_week(rtc_time[3])))\r
+            week_data = rtc_time[3]\r
+            time = [rtc_time[4], rtc_time[5]]\r
+            time_quantum = ("%s" % (self.get_time_bucket(rtc_time[4])))\r
+            \r
+            result = [time, time_quantum, date , week,year,week_data]\r
+            #时分,上午下午,日期,星期,年 星期\r
+            return result\r
+\r
+        def get_step_count(self, event=None, msg=None):\r
+            """\r
+            获取步数\r
+            """\r
+            # print("11111:{}".format(EventMesh.publish("get_storage_config","clear_state3")))\r
+\r
+            tmp = 0\r
+            step =[0,0,0,0]\r
+\r
+            # EventMesh.debug_log("x:%d,y:%d,z:%d tmp %d",XYZ[0],XYZ[1],XYZ[2],tmp)\r
+            step[0]= tmp \r
+            step[1] = 0\r
+            step[2] = 1\r
+            step[3] = 2\r
+            # print("1222:{}".format(EventMesh.publish("get_storage_config","clear_state3")))\r
+            return step\r
+\r
+        def get_ic_cid(self, event, msg):\r
+            """\r
+            获取ic cid事件\r
+            :param event:\r
+            :param msg:\r
+            :return: str ic cid\r
+            """\r
+            return sim.getIccid()\r
+\r
+        def get_phone_num(self, event, msg):\r
+            """\r
+            获取电话号码事件\r
+            :param event:\r
+            :param msg:\r
+            :return: str number\r
+            """\r
+            return sim.getPhoneNumber()\r
+\r
+        def get_battery(self, event=None, msg=None):\r
+            """\r
+            获取电池事件,暂时没支持\r
+            :param event:\r
+            :param msg:\r
+            :return:\r
+            """\r
+\r
+            charge_state = '0'\r
+            if self.get_usb_state() == 1:\r
+                charge_state = '1'\r
+            else:\r
+                charge_state = '0'\r
+\r
+            #temp = Power.getVbatt()\r
+            temp = EventMesh.publish("get_curr_battery_level")\r
+            vbat = EventMesh.publish("get_battery",temp)\r
+            if vbat == None:\r
+                vbat = 100\r
+            # EventMesh.debug_log("vbat",vbat)\r
+            # if temp != None :\r
+            #     if temp <= 3505:\r
+            #         vbat = 0 \r
+            #     elif temp <= 3699:\r
+            #         vbat = 20 #"E:/vbat_20.jpg"\r
+            #     elif temp <= 3772:\r
+            #         vbat = 40 #"E:/vbat_40.jpg"\r
+            #     elif temp <= 3882:\r
+            #         vbat = 60 #"E:/vbat_60.jpg"\r
+            #     elif temp <= 4070:\r
+            #         vbat = 80 #"E:/vbat_80.jpg"\r
+            #     elif temp <= 4200:\r
+            #         vbat = 90 #\r
+            #     else:\r
+            #         vbat = 100 #"E:/vbat_100.jpg"\r
+            # else:\r
+            #     vbat = 100\r
+\r
+            result = [charge_state, vbat]\r
+\r
+            return result\r
+        #Set the current average battery level\r
+        def set_curr_battery_level(self, event=None, msg=None):\r
+            self.curr_battery_level = msg\r
+        \r
+        def get_curr_battery_level(self, event=None, msg=None):\r
+            return self.curr_battery_level\r
+\r
+        def get_device_fw_version(self, *args):\r
+            '''\r
+            获取设备固件版本号\r
+            '''\r
+            fw_version = modem.getDevFwVersion()\r
+            if isinstance(fw_version, str):\r
+                return fw_version\r
+            return "--"\r
+\r
+        def get_standby_time(self, *args):\r
+            '''\r
+            获取设备单次开机待机时间\r
+            '''\r
+            time_msg = utime.time()\r
+            d = int(\r
+                time_msg / 86400)  # The int call removes the decimals.  Conveniently, it always rounds down.  int(2.9) returns 2 instead of 3, for example.\r
+            time_msg -= (\r
+                    d * 86400)  # This updates the value of x to show that the already counted seconds won't be double counted or anything.\r
+            h = int(time_msg / 3600)\r
+            time_msg -= (h * 3600)\r
+            m = int(time_msg / 60)\r
+            time_msg -= (m * 60)\r
+            s = time_msg\r
+            result = "{}天{}小时{}分".format(d, h, m)\r
+            return result\r
+\r
+        def set_key(self, topic, msg):\r
+            self.key = msg["value"]\r
+        def get_key(self, topic, msg):\r
+            return self.key\r
+\r
+        def get_imei(self, topic, msg):\r
+            if not self.imei:\r
+                self.imei = modem.getDevImei()\r
+            # self.imei = "876226002021444"#视频通话测试账号\r
+            # self.imei = "826226524724963"#视频通话测试账号\r
+            # self.imei = "860132060128634" #860132060128634\r
+            return self.imei\r
+\r
+        def get_cid(self, topic, msg):\r
+            return self.cid\r
+\r
+        def set_cid(self, topic, msg):\r
+            self.cid = msg["value"]\r
+\r
+        def get_imsi(self, topic, msg):\r
+            if not self.imei:\r
+                self.imei = sim.getImsi()\r
+            return self.imsi\r
+\r
+        def get_password(self, topic, msg):\r
+            return self.password\r
+\r
+        def set_password(self, topic, msg):\r
+            self.password = msg["value"]\r
+\r
+        def set_ping(self, topic, msg):\r
+            self.PING = msg\r
+        def get_ping(self, topic, msg):\r
+            return self.PING\r
+\r
+        def set_connect(self, topic, msg):\r
+            #EventMesh.debug_log("set_connect:{}".format(msg))\r
+            self.connect = msg\r
+        def get_connect(self, topic, msg):\r
+            return self.connect\r
+\r
+        def start_blood_oxygen(self, topic, msg):\r
+            EventMesh.debug_log("start_blood_oxygen!!!")\r
+\r
+\r
+        def start_heart(self, topic, msg):\r
+            EventMesh.debug_log("start_heart!!!")\r
+\r
+\r
+        def stop_blood_oxygen(self, topic, msg):\r
+            EventMesh.debug_log("stop_blood_oxygen!!!")\r
+\r
+\r
+        def stop_heart(self, topic, msg):\r
+            EventMesh.debug_log("stop_heart!!!")\r
+\r
+\r
+        def get_blood_oxygen(self, topic, msg):\r
+\r
+            return 0\r
+\r
+        def get_heart(self, topic, msg):\r
+\r
+            return 0\r
+        \r
+        def get_wear(self, topic, msg):\r
+            return 0\r
+        \r
+        def get_Hsensor(self, topic, msg):\r
+            return 0\r
+        \r
+        def Hsensor_set_sleep(self, topic, msg):\r
+            pass\r
+\r
+        def start_temp(self, topic, msg):\r
+            EventMesh.debug_log("start_temp!!!!!!!")\r
+            WHO_AM_I = bytearray([0x01, 0])\r
+            I2C_SLAVE_ADDR = 0x49\r
+            #I2C_SLAVE_ADDR = 0x48\r
+            r_data = bytearray(2)\r
+            data = bytearray([0x61A0, 0])   # 唤醒\r
+            return self.i2c0.write(I2C_SLAVE_ADDR, WHO_AM_I, 1, data, 2)\r
+        def stop_temp(self, topic, msg):\r
+            EventMesh.debug_log("stop_temp!!!!!!!")\r
+            WHO_AM_I = bytearray([0x01, 0])\r
+            I2C_SLAVE_ADDR = 0x49\r
+            #I2C_SLAVE_ADDR = 0x48\r
+            r_data = bytearray(2)\r
+            data = bytearray([0x60A0, 0])   #休眠\r
+            return self.i2c0.write(I2C_SLAVE_ADDR, WHO_AM_I, 1, data, 2)\r
+            \r
+        def get_temp(self, topic, msg):\r
+            WHO_AM_I = bytearray([0x00, 0])\r
+            I2C_SLAVE_ADDR = 0x49\r
+            #I2C_SLAVE_ADDR = 0x48\r
+            r_data = bytearray(2)\r
+            self.i2c0.read(I2C_SLAVE_ADDR, WHO_AM_I, 1, r_data, 2, 0)\r
+            #EventMesh.debug_log("temp_data:{}".format(r_data))\r
+            temp_s = ((r_data[0]<<8) | (r_data[1]))>>4\r
+            #EventMesh.debug_log("temp_s:{}".format(temp_s))\r
+            temp_data = temp_s * 0.0625\r
+            EventMesh.debug_log("temp_data:{}".format(temp_data))\r
+            return temp_data\r
+    \r
+                \r
+\r
+        def sim_slot_get(self, topic=None, msg=None):\r
+            return sim.getCurSimid()\r
+\r
+        def sim_slot_switch(self, topic=None, slot=None):\r
+            """\r
+            sim 卡槽切换\r
+            :param topic:\r
+            :param slot:\r
+            :return: 切换sim卡卡槽  0 切换成功, 1 无需切换, -1 切换失败\r
+            """\r
+            if self.sim_slot_get() == slot:\r
+                return 1\r
+            else:\r
+                return sim.switchCard(slot)\r
+\r
+        def usb_event_cb(self, state):\r
+            status = state\r
+\r
+            if status == 1:#插入USB\r
+                EventMesh.debug_log("charge R_CHARGE_in")\r
+                EventMesh.publish("clear_usb_flag")\r
+                EventMesh.publish("set_usb", 1)#\r
+                pass\r
+            elif status == 0:#拨出usbs\r
+                EventMesh.publish("clear_usb_flag")\r
+                EventMesh.publish("set_usb", 2)#\r
+                EventMesh.debug_log("charge R_CHARGE_out")\r
+\r
+                \r
+                \r
+\r
+        \r
+\r
+        def get_usb_state(self):\r
+            state = self.usb.getStatus()\r
+            if state == -1:\r
+                state = 0\r
+            return state\r
+        \r
+\r
+    def wifiScan_cb(args):\r
+            EventMesh.publish(constants.EVENT.WIFIINFO, args)\r
+            wifiScan.control(0)\r
+\r
+    class LocationManager(Abstract):\r
+\r
+        def __init__(self):\r
+            self.gps = None\r
+            #self.match = GPSMatch()\r
+            self.timer_read_GPS_info = osTimer()\r
+            self.wifi_data = []\r
+            self.gps_data  = {}\r
+            self.cell_data = []\r
+            self.location_timer_count = 0\r
+            self.location_check_data_timer_count = 0\r
+            self.GGA_count = 0\r
+            self.RMC_A_count = 0\r
+            self.location_type = 0 #定位类型,0:正常定位,有gps数据或60秒关闭;1:测试模式,只有发CLOSE_LOCATION消息才关闭\r
+            self.location_flag = 0\r
+            self.start_location_flag = 0\r
+            self.location_thread_id  = 0\r
+            self.location_queue = Queue(100)\r
+            self.lpm_fd = None\r
+            self.start_agps = 0\r
+            read_data = EventMesh.publish("get_storage_config","isOpenGNSS")#获取是否打开GNSS\r
+            if read_data != None:\r
+                self.isOpenGNSS = read_data\r
+            else:#默认关闭GNSS\r
+                self.isOpenGNSS = "1"\r
+                EventMesh.publish("set_storage_config",["isOpenGNSS",self.isOpenGNSS])\r
+\r
+            self.isOpenGNSS = EventMesh.publish("get_storage_config","isOpenGNSS")\r
+            if self.isOpenGNSS == None:\r
+                self.isOpenGNSS = "1"\r
+            if self.isOpenGNSS == "1":\r
+                if quecgnss.init() == -1:\r
+                    self.isOpenGNSS = "0"\r
+                    EventMesh.publish("set_storage_config",["isOpenGNSS",self.isOpenGNSS])\r
+                else:\r
+                    quecgnss.gnssEnable(0)\r
+        @staticmethod\r
+        def get_date():\r
+            return "{:04d}-{:02d}-{:02d}".format(*utime.localtime()[0:3])\r
+\r
+        @staticmethod\r
+        def get_time():\r
+            return "{:02d}:{:02d}:{:02d}".format(*utime.localtime()[3:6])\r
+\r
+        def post_processor_after_instantiation(self):\r
+            # _gps_cfg = {\r
+            #     "UARTn": UART.UART1,\r
+            #     "buadrate": 115200,\r
+            #     "databits": 8,\r
+            #     "parity": 0,\r
+            #     "stopbits": 1,\r
+            #     "flowctl": 0,\r
+            #     "PowerPin": Pin.GPIO2,\r
+            #     "StandbyPin": Pin.GPIO3,\r
+            #     "BackupPin": None,\r
+            #     "gps_mode": 0x01,\r
+            # }\r
+            # self.gps = GPS(**_gps_cfg)\r
+            # self.gps.power_switch(0)#关闭GPS\r
+            EventMesh.subscribe(constants.EVENT.GPSOPEN, self.gps_open)\r
+            EventMesh.subscribe(constants.EVENT.GPSCLOSE, self.gps_close)\r
+            EventMesh.subscribe(constants.EVENT.START_LOCATION, self.start_location)\r
+            EventMesh.subscribe(constants.EVENT.START_LOCATION_TEST, self.start_location_test)\r
+            EventMesh.subscribe(constants.EVENT.WIFIINFO, self.WIFI_INFO)\r
+            EventMesh.subscribe(constants.EVENT.WIFISCANOPEN,self.WIFI_scan_open)\r
+            EventMesh.subscribe(constants.EVENT.CLOSE_LOCATION,self.close_location)\r
+            EventMesh.subscribe("get_location_flag",self.get_location_flag)\r
+            \r
+            #EventMesh.subscribe(constants.EVENT.GPSCLOSE, self.gps_close)\r
+        def get_location_flag(self, event, msg):\r
+            return self.location_flag\r
+        def start_location(self, event, msg):\r
+            self.location_queue.put(msg)#测试类型入队\r
+            self.gps_data = {}\r
+            self.wifi_data = []\r
+            self.cell_data = []\r
+            self.location_timer_count = 0\r
+            self.GSV_sig_ok_count = 0\r
+            EventMesh.debug_log("start_location:{}".format(msg))\r
+            if( self.location_flag == 1):\r
+                return\r
+            _thread.stack_size((9+5)*1024)\r
+            self.location_thread_id  = _thread.start_new_thread(self.location_thread, ())\r
+            _thread.stack_size(8*1024)\r
+            \r
+            self.location_flag = 1\r
+            self.timer_read_GPS_info.start(1000, 1, self.location_timer)\r
+            #self.gps_open(event, msg)\r
+\r
+\r
+        def start_location_test(self, event, msg):\r
+            EventMesh.debug_log("start_location_test")\r
+            \r
+            self.location_type = 1\r
+            if( self.location_flag == 1):\r
+                return\r
+            _thread.stack_size((9+4)*1024)\r
+            self.location_thread_id  = _thread.start_new_thread(self.location_thread, ())\r
+            _thread.stack_size(8*1024)\r
+        \r
+            self.location_timer_count = 0\r
+            self.location_flag = 1\r
+            #self.gps_open(event, msg)\r
+            self.location_type = 1\r
+            self.timer_read_GPS_info.start(1000, 1, self.location_timer)\r
+    \r
+\r
+        def close_location(self, event, msg):\r
+            self.location_flag = 0\r
+            self.location_type = 0\r
+            self.timer_read_GPS_info.stop()\r
+\r
+            \r
+\r
+        def WIFI_INFO(self, event, msg):\r
+            self.wifi_data = msg\r
+            # EventMesh.debug_log("WIFI_INFO:")\r
+            # EventMesh.debug_log([msg[0],msg])\r
+\r
+        def WIFI_scan_open(self, event, msg):\r
+            #EventMesh.debug_log("WIFI_scan_open")\r
+            \r
+\r
+            if wifiScan.getState() == False :\r
+                self.wifi_data = []\r
+                wifiScan.control(1)\r
+                wifiScan.setCfgParam(6, 2, 5,  0)  #设置WiFi参数,10秒上层,两轮,最多6个,6秒底层,PS优先\r
+                wifiScan.setCallback(wifiScan_cb) #注册回调函数\r
+                wifiScan.asyncStart()\r
+                #EventMesh.debug_log("wifiScan.asyncStart")\r
+            else :\r
+                EventMesh.debug_log("WIFI_scan_open:error1") \r
+        def gps_open(self, event, msg):\r
+            if self.isOpenGNSS == "1":\r
+                #EventMesh.debug_log("publish:gps_open")\r
+                #quecgnss.init()\r
+                quecgnss.gnssEnable(2)\r
+                #self.gps.__gps_nmea_data_clean()\r
+        def gps_close(self, event, msg):\r
+            if self.isOpenGNSS == "1":\r
+                quecgnss.gnssEnable(0)\r
+        def location_timer(self, *args, **kwargs):\r
+            \r
+            self.location_timer_count = self.location_timer_count +1\r
+            self.location_check_data_timer_count = self.location_check_data_timer_count+1\r
+\r
+        def Location_send(self, msg) :\r
+            EventMesh.debug_log("Location_send1")\r
+            if self.location_queue.empty() == True:\r
+                return\r
+            EventMesh.debug_log("Location_send2")\r
+            while True:\r
+                if self.location_queue.empty() == False:\r
+                    TYPE = self.location_queue.get()\r
+                    date = "{:04d}{:02d}{:02d},{:02d}{:02d}{:02d}".format(*utime.localtime()[0:6])\r
+                    date = date[2:]\r
+                    #date = "180916,025723"\r
+                    GPS_type = "V"\r
+                    latitude = "0.000000,N"\r
+                    longitude = "0.000000,E"\r
+                    speed = "0.00"\r
+                    direction = "0.0"\r
+                    high = "100.0"\r
+                    number = "0"\r
+                    precision = "24"\r
+                    if msg[0] :#有GPS数据\r
+                        GPS_type = "A"\r
+                        # 纬度\r
+                        latitude = msg[0]["latitude"]\r
+                        # 经度\r
+                        longitude = msg[0]["longitude"]\r
+                        # 速度\r
+                        speed = msg[0]["speed"]\r
+                        # 方向\r
+                        direction = "0"\r
+                        if msg[0]["direction"] :\r
+                            direction = msg[0]["direction"]\r
+                        # 高度\r
+                        high = msg[0]["high"]\r
+                        high_tmp = high.split(".")\r
+                        if len(high_tmp) >= 2 :\r
+                            high = "%s"%(high_tmp[0])\r
+                        # 讯号质量:搜索到的卫星数目\r
+                        number = msg[0]["number"]\r
+                        precision = msg[0]["precision"]\r
+                        #date = msg[0]["date"]\r
+                    \r
+                    #gsm 信号强度\r
+                    gsm_sig =  str((100//31)*EventMesh.publish("screen_get_sig"))\r
+                    # 电池电量百分比 \r
+                    bat_tmp = EventMesh.publish("screen_get_battery")\r
+                    battery_caption =  str(bat_tmp[1])\r
+                    #步数\r
+                    old_step = 0\r
+                    step = 0\r
+                    step = EventMesh.publish("get_old_step_value")\r
+                    if step != 0:\r
+                        tmp_data  = EventMesh.publish("get_storage_config","old_step_new")\r
+                        if tmp_data != None:\r
+                            old_step = tmp_data\r
+                        if old_step !=  step:\r
+                            EventMesh.publish("set_storage_config",["old_step",step])\r
+                            EventMesh.publish("set_storage_config",["old_step_new",step])\r
+                            \r
+                    old_step = step\r
+                    # step = str(EventMesh.publish(constants.EVENT.GET_STEP)[0])\r
+                    #翻转次数\r
+                    turn_count = "0"\r
+                    #终端状态\r
+                    state = "%08X"%(EventMesh.publish("get_dev_state"))\r
+                    #EventMesh.debug_log("TYPE:{}".format(TYPE))\r
+                    if type(TYPE) == list:#队列里的数据有终端状态,则用队里的终端状态\r
+                        if len(TYPE)>= 2 :\r
+                            state = "%08X"%(TYPE[1])\r
+                    \r
+                    EventMesh.debug_log("state:{}".format(state))\r
+                    #基站数据\r
+                    CELL_num = len(msg[2])\r
+                    CELL_data = "1," #时延\r
+                    if msg[2] != []:\r
+                        for CELL in msg[2] :\r
+                            if CELL[0] == 0 :\r
+                                CELL_data += "%X,"%(int(CELL[2])) #MCC\r
+                                CELL_data += str(CELL[3]) +","#MNC\r
+                                CELL_data += str(CELL[5]) +","#tac,区域码\r
+                                CELL_data += str(CELL[1]) +","#基站编号 CID\r
+                                CELL_data += str(int(CELL[7]+140)) +","#信号强度 rssi\r
+                            else :\r
+                                CELL_data += str(CELL[5]) +","#tac,区域码\r
+                                CELL_data += str(CELL[1]) +","#基站编号 CID\r
+                                CELL_data += str(int(CELL[7]+140)) +","#信号强度 rssi\r
+                        CELL_data = CELL_data[:(len(CELL_data)-1)]\r
+                    #WIFI数据\r
+                    WIFI_num = 0 \r
+                    WIFI_data = ""\r
+                    if msg[1] :\r
+                        WIFI_num = msg[1][0]\r
+                        i = 0\r
+                        for MAC in msg[1][1] :\r
+                            WIFI_data += "wifi%d,%s,%d,"%(i,str(MAC[0]),MAC[1])\r
+                            i += 1\r
+                        WIFI_data = WIFI_data[:(len(WIFI_data)-1)]\r
+                    WIFI_data = WIFI_data.lower()\r
+                    #send_data = "UD ,%s ,%s     ,%s       ,%s       ,%s   ,%s       ,%s  ,%s    ,%s     ,%s             ,%s  ,%s        ,%s   ,%d     ,%s       ,%d      ,%s"\\r
+                    #              %(date,GPS_type,latitude,longitude,speed,direction,high,number,gsm_sig,battery_caption,step,turn_count,state,CELL_num,CELL_data,WIFI_num,WIFI_data)\r
+                    #定位数据\r
+                    send_data = "%s,%s,%s"%(date,GPS_type,latitude)\r
+                    send_data += ",%s,%s,%s"%(longitude,speed,direction)\r
+                    send_data += ",%s,%s,%s"%(high,number,gsm_sig,)\r
+                    send_data += ",%s,%s,%s"%(battery_caption,step,turn_count)\r
+                    send_data += ",%s,%d,%s"%(state,CELL_num,CELL_data)\r
+                    send_data += ",%d,%s"%(WIFI_num,WIFI_data)\r
+                    send_data+=",%s"%(precision)\r
+                    #EventMesh.debug_log("Location_send2:{} q_size:{}".format(send_data,self.location_queue.size()))\r
+            \r
+                \r
+                    EventMesh.debug_log("Location_send3:{}:{}".format(TYPE,send_data))\r
+                    if type(TYPE) == list:\r
+                        EventMesh.publish(TYPE[0],send_data)\r
+                    else:\r
+                        EventMesh.publish(TYPE,send_data)\r
+                else :\r
+                    break\r
+\r
+        def GxGGA_latitude(self, gga_data):\r
+            """Parse latitude from GGA"""\r
+            if gga_data:\r
+                latitude_re = ure.search(r",[0-9]+\.[0-9]+,[NS],", gga_data)\r
+                if latitude_re:\r
+                    latitude = latitude_re.group(0)[1:-3]\r
+                    return str(float(latitude[:2]) + float(latitude[2:]) / 60)\r
+            return ""\r
+        def GxGGA_longitude(self, gga_data):\r
+            """Parse longitude from GGA"""\r
+            if gga_data:\r
+                longitude_re = ure.search(r",[0-9]+\.[0-9]+,[EW],", gga_data)\r
+                if longitude_re:\r
+                    longitude = longitude_re.group(0)[1:-3]\r
+                    return str(float(longitude[:3]) + float(longitude[3:]) / 60)\r
+            return ""\r
+\r
+        def GxGGA_altitude(self, gga_data):\r
+            """Parse altitude from GGA"""\r
+            if gga_data:\r
+                altitude_re = ure.search(r",-*[0-9]+\.[0-9]+,M,", gga_data)\r
+                if altitude_re:\r
+                    return altitude_re.group(0)[1:-3]\r
+            return ""\r
+        def location_thread(self):\r
+            \r
+            self.wifi_data = []\r
+            self.gps_data = {}\r
+            self.cell_data = []\r
+            gnss_r_data = []\r
+            self.GSV_sig_ok_count = 0\r
+            self.GSV_sig_very_ok_count = 0\r
+            self.GGA_count = 0\r
+            self.RMC_A_count = 0\r
+            # if self.start_agps == 1: #开启agps\r
+            #     self.start_agps = 0\r
+            #     quecgnss.configSet(2,1)\r
+            if self.lpm_fd == None:\r
+                self.lpm_fd = pm.create_wakelock("test_lock", len("test_lock"))\r
+            pm.wakelock_lock(self.lpm_fd)\r
+            EventMesh.debug_log("location_thread:1")\r
+            EventMesh.publish(constants.EVENT.GPSOPEN)\r
+            EventMesh.debug_log("location_thread:2")\r
+            #self.timer_read_GPS_info.start(1000, 1, self.location_timer)\r
+            EventMesh.debug_log("location_thread:3")\r
+            #utime.sleep_ms(1000)\r
+            self.location_timer_count = 0\r
+            #quecgnss.read(4096)#去掉第一次错误数据\r
+            #EventMesh.txt_log("START_LOCATION")\r
+            # pm.autosleep(0)#唤醒\r
+            # pm.sclkEx_set(0, 1, 5)\r
+            GSV_dict= {}\r
+            while self.location_flag == 1:\r
+                try :   \r
+                    \r
+                    match_gga_data = []\r
+                    #match_gsv_data = []\r
+                    gnss_r_data = []\r
+                    # if self.location_check_data_timer_count >= 3:\r
+                    #     pm.autosleep(0)#唤醒\r
+                    #     pm.sclkEx_set(0, 1, 5)\r
+                    if self.location_check_data_timer_count >= 1 :#3秒查一次基站数据和wifi数据\r
+                        self.location_check_data_timer_count = 0\r
+                        #EventMesh.debug_log(self.location_timer_count)\r
+                        GSV_dict= {}\r
+                        if self.isOpenGNSS == "1":                    \r
+                            #检查GNSS数据\r
+                            if ( self.gps_data == {} or self.location_type == 1) and quecgnss.get_state() == 2:\r
+\r
+                                pass\r
+                                tmp_ok_count = 0\r
+                                tmp_very_ok_count = 0\r
+                                gsv_data = quecgnss.get_gsv()\r
+                                rmc_data = quecgnss.get_rmc()\r
+                                gga_data = quecgnss.get_gga()\r
+                                vtg_data = quecgnss.get_vtg()\r
+                                # EventMesh.debug_log("gsv:{}".format(quecgnss.get_gsv()))\r
+                                # EventMesh.debug_log("gga:{}".format(quecgnss.get_gga()))\r
+                                # EventMesh.debug_log("rmc:{}".format(quecgnss.get_rmc()))\r
+                                # EventMesh.debug_log("vtg:{}".format(quecgnss.get_vtg())) \r
+                                for i in range(len(gsv_data)) :\r
+                                    \r
+                                    if i % 2 == 0:\r
+                                        if i+1 >= len(gsv_data) :\r
+                                            # EventMesh.debug_log("gsv_data num error!!")\r
+                                            break\r
+                                        GSV_dict[gsv_data[i]] = gsv_data[i+1]\r
+                                        #EventMesh.debug_log("type:gsv_data{}".format(type(gsv_data[i+1])))\r
+                                        try:\r
+                                            #EventMesh.debug_log("gsv_tmp[i+3]:{}".format(gsv_tmp[i+3]))\r
+                                            if gsv_data[i+1] :\r
+                                                if (gsv_data[i+1])>=20:\r
+                                                    tmp_ok_count +=1   \r
+                                                if (gsv_data[i+1])>=30:\r
+                                                    tmp_very_ok_count +=1  \r
+                                                    \r
+                                        except Exception as e:\r
+                                            usys.print_exception(e)\r
+                                        \r
+                                if(tmp_ok_count > self.GSV_sig_ok_count ):\r
+                                    self.GSV_sig_ok_count = tmp_ok_count\r
+                                if(tmp_very_ok_count > self.GSV_sig_very_ok_count ):\r
+                                    self.GSV_sig_very_ok_count = tmp_very_ok_count\r
+                                match_rmc_data = rmc_data.split(",")\r
+                                if len (match_rmc_data)>3: #有rmc数据\r
+                                        if match_rmc_data[2] == 'A':    \r
+                                            match_gga_data = gga_data.split(",")\r
+                                            if len(match_gga_data) >4: #数据全\r
+                                                match_vtg_data = vtg_data.split(",")\r
+                                                gps_date = "%s,%s"%(match_rmc_data[9],match_rmc_data[1][:6])#日期\r
+                                                #gps_data_tmp = self.gps.read_coordinates(gnss_r_data[1])\r
+                                                latitude = "0,N" #纬度\r
+                                                latitude_tmp = str(self.GxGGA_latitude(gga_data)).split(".")\r
+                                                if len(latitude_tmp) >= 2 and len(latitude_tmp[1])>=5:\r
+                                                    latitude = "%s.%s"%(latitude_tmp[0],latitude_tmp[1][:6])\r
+                                                    latitude = "%s,%s"%(latitude,match_rmc_data[4] )\r
+\r
+                                                longitude = "0,E"#经度\r
+                                                longitude_tmp = str(self.GxGGA_longitude(gga_data)).split(".")\r
+                                                if len(longitude_tmp) >= 2 and len(longitude_tmp[1])>=5:\r
+                                                    longitude = "%s.%s"%(longitude_tmp[0],longitude_tmp[1][:6])\r
+                                                    longitude = "%s,%s"%(longitude,match_rmc_data[6] ) #match_rmc_data[6] + str(gnss_r_data[1])\r
+                                                \r
+                                                high = "0"#高度\r
+                                                high = str(self.GxGGA_altitude(gga_data))\r
+                                                number = "0"#可用卫星\r
+                                                precision = "5.8"#精度\r
+                                                if len(match_gga_data)>5 :\r
+                                                    if match_gga_data[7]:\r
+                                                        number = match_gga_data[7]\r
+                                                    if match_gga_data[8]:\r
+                                                        precision = match_gga_data[8]\r
+                                                direction = "249.5" #方向\r
+                                                speed = '0.00'    #速度    \r
+                                                if(len(match_vtg_data)>5 ):\r
+                                                    if match_vtg_data[1]:\r
+                                                        direction =  match_vtg_data[1]\r
+                                                    if match_vtg_data[7]:    \r
+                                                        speed =  match_vtg_data[7]\r
+                                                self.gps_data = {\r
+                                                    "latitude": latitude,\r
+                                                    "longitude": longitude,\r
+                                                    "high": high,\r
+                                                    "direction": direction,\r
+                                                    "speed": speed,\r
+                                                    "number": number, \r
+                                                    "date":  gps_date,\r
+                                                    "precision":  precision\r
+                                                }\r
+    # ***********************************************************************************\r
+\r
+\r
+                    #检查wifi数据\r
+                    if self.wifi_data == [] or (self.wifi_data != [] and self.wifi_data[0] == 0):#and self.wifi_data[0] <= 0:\r
+                        EventMesh.publish(constants.EVENT.WIFISCANOPEN)\r
+                \r
+                    #检查基站数据\r
+                    if self.cell_data == []:   \r
+                        data_tmp = net.getCellInfo()\r
+                        if(len(data_tmp)>=2):\r
+                            for cell in data_tmp:\r
+                                if cell and cell[0][0] == 0 and len(cell[0]) > 1:\r
+                                    self.cell_data = cell\r
+                                    break\r
+\r
+                    if self.location_type == 1: #测试模式\r
+                        self.location_timer_count = 0\r
+                        \r
+                        EventMesh.publish("PUSH_LOCATION_DATA", [[self.gps_data,GSV_dict],self.wifi_data,self.cell_data]) \r
+                        if self.gps_data  != {} : #发送数据 \r
+                            EventMesh.publish(constants.EVENT.CLOSE_LOCATION)#关闭定位\r
+                            self.location_queue.put(constants.PROTOCOL.UD_SEND)\r
+                            self.Location_send([self.gps_data,self.wifi_data,self.cell_data])\r
+                            \r
+\r
+                    elif self.location_type == 0: #正常模式     \r
+                        if self.gps_data  != {} or self.location_timer_count > 100: #or( self.wifi_data != [] and self.cell_data != []): \r
+                            if self.location_queue.empty() == False:#有定位队列\r
+                                pass\r
+                                #EventMesh.txt_log("LOCATION timer:{} ok:{} very_ok:{}".format(self.location_timer_count,self.GSV_sig_ok_count))   \r
+                                #EventMesh.txt_log("LOCATION:timer:{} ok_count:{} ".format(self.location_timer_count,self.GSV_sig_ok_count))\r
+                            if self.gps_data  == {}: #定位超时,且信噪比多个大于30,下次启动agps\r
+                                if self.GSV_sig_very_ok_count > 3:#3个超30以上\r
+                                    self.start_agps = 1\r
+                                    #EventMesh.txt_log("open agps:{}".format(GSV_dict))\r
+                            #upload_time = EventMesh.publish("get_upload_data")    \r
+                            self.Location_send([self.gps_data,self.wifi_data,self.cell_data])\r
+                            #if upload_time > 200  : \r
+                            EventMesh.publish(constants.EVENT.CLOSE_LOCATION)#关闭定位\r
+                            # else:   #定位间隔小于3分钟不关闭gps,不影响无信号判断\r
+                            #     self.location_timer_count = 0\r
+                            #     self.GSV_sig_ok_count = 0\r
+                                \r
+                            \r
+\r
+                            \r
+                        if (self.isOpenGNSS != "1" or (self.GSV_sig_ok_count <= 1 and self.location_timer_count > 20)) and self.wifi_data != [] and self.cell_data != [] : #超过40秒且信号大于30的不足3个\r
+                            EventMesh.publish(constants.EVENT.CLOSE_LOCATION)#关闭定位 \r
+                            EventMesh.debug_log("Location_send:CLOSE_LOCATION")  \r
+                            #EventMesh.txt_log("GSV_sig_ok_count<3:timer:{} ok_count:{} ".format(self.location_timer_count,self.GSV_sig_ok_count))\r
+                            self.Location_send([self.gps_data,self.wifi_data,self.cell_data])\r
+\r
+                \r
+                    \r
+                except Exception as e:\r
+                    usys.print_exception(e)\r
+                    EventMesh.txt_log("location_thread:ERROR:".format(e))\r
+                    #EventMesh.debug_log("location_thread:ERROR:{}".format(usys.print_exception(e)))\r
+                    EventMesh.debug_log("self.gps_data{},self.wifi_data{},self.cell_data{}".format(self.gps_data,self.wifi_data,self.cell_data))\r
+                    #self.Location_send([self.gps_data,self.wifi_data,self.cell_data])\r
+                    EventMesh.publish(constants.EVENT.CLOSE_LOCATION)#关闭定位 \r
+                utime.sleep_ms(500)\r
+\r
+            #self.timer_read_GPS_info.stop()\r
+            #self.gps.power_switch(0)\r
+            wifiScan.control(0)\r
+            EventMesh.publish(constants.EVENT.GPSCLOSE)\r
+            # if EventMesh.publish("get_lcd_state" ) == 0:#休眠的时候,恢复休眠\r
+            #     pm.autosleep(1)\r
+            #     pm.sclkEx_set(1, 1, 5)\r
+            if self.lpm_fd != None:\r
+                pm.wakelock_unlock(self.lpm_fd)\r
+            #pm.delete_wakelock(lpm_fd)\r
+            EventMesh.debug_log("CLOSE_LOCATION")\r
+            #EventMesh.txt_log("CLOSE_LOCATION")\r
+\r
+                    \r
+\r
+    class AddrBookManager(Abstract):\r
+        # 通讯录\r
+        def __init__(self):\r
+            self.read_phonebook = {}\r
+            self.check_json = 0\r
+            self.check_json = ql_fs.path_exists("/usr/static/storage_file/phonebook.json")\r
+\r
+            if self.check_json == True:\r
+                with open("/usr/static/storage_file/phonebook.json","r",encoding="utf-8") as fd:\r
+                    self.read_phonebook = ujson.load(fd)\r
+                    EventMesh.debug_log("读取电话本")\r
+\r
+        def post_processor_after_instantiation(self):\r
+            EventMesh.subscribe("get_phonebook_list", self.get)\r
+            EventMesh.subscribe("set_phonebook_list", self.set)\r
+            EventMesh.subscribe("call_phonebook_one_call", self.call_phonebook_one_call)\r
+            EventMesh.subscribe("call_phonebook_two_call", self.call_phonebook_two_call)\r
+            EventMesh.subscribe("call_phonebook_three_call", self.call_phonebook_three_call)\r
+\r
+            EventMesh.subscribe("call_phonebook_num", self.call_phonebook_num)\r
+\r
+        def get(self, event, msg):\r
+            self.check_json = ql_fs.path_exists("/usr/static/storage_file/phonebook.json")\r
+            return [self.check_json,self.read_phonebook]\r
+        \r
+        def call_phonebook_num(self, event, msg):\r
+            name = ''\r
+            key_tmp = ''\r
+            phone_num = int(msg)\r
+            if self.read_phonebook != {}:\r
+                if len(self.read_phonebook) >= phone_num:\r
+                    phonebook_keys = sorted(self.read_phonebook.keys())\r
+                    name = self.read_phonebook[phonebook_keys[phone_num-1]]\r
+                    key_tmp = phonebook_keys[phone_num-1]\r
+                    if len(name) != 0:\r
+                        EventMesh.publish("save_phonename",str(name))\r
+                        EventMesh.publish("save_phonenum",str(name))\r
+                        EventMesh.publish("dial_out_call_center_cb",str(name))#电话拨出去\r
+                    else:\r
+                        EventMesh.publish("dial_out_call_center_cb",None)#电话拨出去\r
+                else:\r
+                    EventMesh.publish("dial_out_call_center_cb",None)#电话拨出去\r
+            else:\r
+                EventMesh.publish("dial_out_call_center_cb",None)#电话拨出去\r
+            EventMesh.debug_log("call_phonebook_call name:{} msg:{}".format(len(self.read_phonebook),msg))\r
+\r
+        def call_phonebook_one_call(self, event, msg):\r
+            name = ''\r
+            key_tmp = ''\r
+            if self.read_phonebook != {}:\r
+                if len(self.read_phonebook) >= 1:\r
+                    phonebook_keys = sorted(self.read_phonebook.keys())\r
+                    name = self.read_phonebook[phonebook_keys[0]]\r
+                    key_tmp = phonebook_keys[0]\r
+                    if len(name) != 0:\r
+                        EventMesh.publish("save_phonename",str(name))\r
+                        EventMesh.publish("save_phonenum",str(name))\r
+                        EventMesh.publish("dial_out_call_center_cb",str(name))#电话拨出去\r
+                    else:\r
+                        EventMesh.publish("dial_out_call_center_cb",None)#电话拨出去\r
+                else:\r
+                    EventMesh.publish("dial_out_call_center_cb",None)#电话拨出去\r
+            else:\r
+                EventMesh.publish("dial_out_call_center_cb",None)#电话拨出去\r
+            EventMesh.debug_log("call_phonebook_one_call name:{} key_tmp:{} len:{}".format(name,key_tmp,len(self.read_phonebook)))\r
+\r
+        def call_phonebook_two_call(self, event, msg):\r
+            name = ''\r
+            key_tmp = ''\r
+            if self.read_phonebook != {}:\r
+                if len(self.read_phonebook) >= 2:\r
+                    phonebook_keys = sorted(self.read_phonebook.keys())\r
+                    name = self.read_phonebook[phonebook_keys[1]]\r
+                    key_tmp = phonebook_keys[1]\r
+                    if len(name) != 0:\r
+                        #voiceCall.callStart(str(name))\r
+                        EventMesh.publish("save_phonename",str(name))\r
+                        EventMesh.publish("save_phonenum",str(name))\r
+                        EventMesh.publish("dial_out_call_center_cb",str(name))#电话拨出去\r
+                    else:\r
+                        EventMesh.publish("dial_out_call_center_cb",None)#电话拨出去\r
+                    \r
+                else:\r
+                    EventMesh.publish("dial_out_call_center_cb",None)#电话拨出去\r
+            else:\r
+                EventMesh.publish("dial_out_call_center_cb",None)#电话拨出去\r
+                EventMesh.debug_log("call_phonebook_two_call name:{} key_tmp:{}".format(name,key_tmp))\r
+        \r
+        def call_phonebook_three_call(self, event, msg):\r
+            name = ''\r
+            key_tmp = ''\r
+            if self.read_phonebook != {}:\r
+                if len(self.read_phonebook) >= 3:\r
+                    phonebook_keys = sorted(self.read_phonebook.keys())\r
+                    name = self.read_phonebook[phonebook_keys[2]]\r
+                    key_tmp = phonebook_keys[2]\r
+                    if len(name) != 0:\r
+                        #voiceCall.callStart(str(name))\r
+                        EventMesh.publish("save_phonename",str(name))\r
+                        EventMesh.publish("save_phonenum",str(name))\r
+                        EventMesh.publish("dial_out_call_center_cb",str(name))#电话拨出去\r
+                    else:\r
+                        EventMesh.publish("dial_out_call_center_cb",None)#电话拨出去\r
+                    \r
+                else:\r
+                    EventMesh.publish("dial_out_call_center_cb",None)#电话拨出去\r
+            else:\r
+                EventMesh.publish("dial_out_call_center_cb",None)#电话拨出去\r
+            EventMesh.debug_log("call_phonebook_three_call name:{} key_tmp:{}".format(name,key_tmp))\r
+\r
+        def set(self, event, msg):\r
+            self.check_json = msg[0]\r
+            self.read_phonebook = msg[1]\r
+\r
+    import sms\r
+    class MsgManager(Abstract):\r
+        # 短信\r
+        def __init__(self):\r
+            self.msg_nums = 0\r
+            self.msg_detail = ""\r
+\r
+        def post_processor_after_instantiation(self):\r
+            EventMesh.subscribe("get_msg_nums", self.get_msg_nums)\r
+            # 可通过此push_addr_book_list主动推送\r
+            EventMesh.subscribe("get_msg_detail", self.get_msg_detail)\r
+\r
+        def get_msg_nums(self, event, msg):\r
+\r
+            self.msg_nums = sms.getMsgNums() \r
+            EventMesh.debug_log("self.msg_nums {}:".format(self.msg_nums))\r
+            return self.msg_nums\r
+        \r
+        def get_msg_detail(self, event, msg):\r
+            \r
+            # self.msg_detail = sms.searchTextMsg(self.msg_nums)\r
+            # EventMesh.debug_log("self.msg_detai {}:".format(self.msg_detai))\r
+            return{\r
+                "小明":"有内鬼,停止交易",\r
+                "小红":"今晚十点一起吃饭"\r
+            }\r
+\r
+    class MsgdetailManager(Abstract):\r
+        def __init__(self):\r
+            self.level = 0\r
+            self.msg_name = ""\r
+            self.msg_content = ""\r
+\r
+        def post_processor_after_instantiation(self):\r
+            EventMesh.subscribe("save_msg_name", self.save_msg_name)\r
+            EventMesh.subscribe("save_msg_content", self.save_msg_content)\r
+            EventMesh.subscribe("get_msg_name", self.get_msg_name)\r
+            EventMesh.subscribe("get_msg_content", self.get_msg_content)\r
+\r
+        def save_msg_name(self, event, msg): \r
+            self.msg_name = str(msg)\r
+            EventMesh.debug_log("save_msg_name:msg".format(msg))\r
+        \r
+        def save_msg_content(self, event, msg):\r
+            self.msg_content = str(msg)\r
+            EventMesh.debug_log("save_msg_content:msg".format(msg))\r
+        \r
+        def get_msg_content(self, event, msg):\r
+            return self.msg_content\r
+\r
+        def get_msg_name(self, event, msg):\r
+            return self.msg_name\r
+\r
+    class CallLogManager(Abstract):\r
+        # 通话记录\r
+        def __init__(self):\r
+            self.read_call_log = {}\r
+            self.check_json = ql_fs.path_exists("/usr/static/storage_file/Call_log.json")\r
+\r
+            if self.check_json == True:\r
+                with open("/usr/static/storage_file/Call_log.json","r",encoding="utf-8") as fd:\r
+                    self.read_call_log = ujson.load(fd)\r
+                    EventMesh.debug_log("读取通话记录")\r
+\r
+        def post_processor_after_instantiation(self):\r
+            EventMesh.subscribe("get_call_log_list", self.get)\r
+            EventMesh.subscribe("set_call_log_list", self.set)\r
+\r
+        def get(self, event, msg):\r
+            self.check_json = ql_fs.path_exists("/usr/static/storage_file/Call_log.json")\r
+            return [self.check_json,self.read_call_log]\r
+\r
+        def set(self, event, msg):\r
+            return\r
+            self.check_json = msg[0]\r
+            self.read_call_log = msg[1]\r
+            with open("/usr/static/storage_file/Call_log.json","w+",encoding="utf-8") as fd:\r
+                ujson.dump(self.read_call_log,fd)\r
+        # def call_usr(self,event,msg):\r
+        #     content = self.log[msg]\r
+        #     # 参数1 姓名  参数2  电话   参数3 1/主动呼叫  0别人呼叫\r
+        #     EventMesh.publish("call_in", [content[2], content[0], 1])\r
+\r
+\r
+\r
+    class PhoneCallingManager(Abstract):\r
+        def __init__(self):\r
+            self.phonenum = ""\r
+            self.phonename = ""\r
+\r
+        def post_processor_after_instantiation(self):\r
+            EventMesh.subscribe("save_phonenum", self.save_phonenum)\r
+            EventMesh.subscribe("get_phonenum", self.get_phonenum)\r
+            EventMesh.subscribe("get_phonename", self.get_phonename)\r
+            EventMesh.subscribe("save_phonename", self.save_phonename)\r
+\r
+        def get_phonename(self, event, msg): \r
+            return self.phonename\r
+\r
+        def save_phonename(self, event, msg): \r
+            self.phonename = str(msg)\r
+\r
+        def save_phonenum(self, event, msg): \r
+            self.phonenum = str(msg)\r
+        \r
+        def get_phonenum(self, event, msg):\r
+            return self.phonenum\r
+\r
+    #获取心率 血氧 步数历史数据\r
+    class gethistoryDataManager(Abstract):\r
+        def __init__(self):\r
+            self.oldHr = 0\r
+            self.oldspo2 = 0\r
+            self.oldstep = 0\r
+            self.old_step = 0\r
+            self.read_histroy_hr_data = []\r
+            self.read_histroy_temp_data = []\r
+            self.read_histroy_spo2_data = []\r
+\r
+            oldHr  = EventMesh.publish("get_storage_config","old_hr")\r
+            if oldHr != None:\r
+                self.oldHr = oldHr  \r
+            old_spo2  = EventMesh.publish("get_storage_config","old_spo2")\r
+            if old_spo2 != None:\r
+                self.oldspo2 = old_spo2 \r
+            old_step  = EventMesh.publish("get_storage_config","old_step")    \r
+            if old_step != None:\r
+                self.oldstep = old_step\r
+\r
+\r
+            check_hr= ql_fs.path_exists("/usr/static/storage_file/history_hr.json")\r
+            if check_hr == True :\r
+                with open("/usr/static/storage_file/history_hr.json","r") as fd:#音频文件编号\r
+                    self.read_histroy_hr_data = ujson.load(fd)\r
+            \r
+            check_temp= ql_fs.path_exists("/usr/static/storage_file/history_temp.json")\r
+            if check_temp == True :\r
+                with open("/usr/static/storage_file/history_temp.json","r") as fd:#音频文件编号\r
+                    self.read_histroy_temp_data = ujson.load(fd)\r
+\r
+            check_spo2= ql_fs.path_exists("/usr/static/storage_file/history_spo2.json")\r
+            if check_spo2 == True :\r
+                with open("/usr/static/storage_file/history_spo2.json","r") as fd:#音频文件编号\r
+                    self.read_histroy_spo2_data = ujson.load(fd)\r
+            self.temp_value = 0\r
+            \r
+            # self.read_histroy_hr_data=[{"timeSec":16789890,"value":90},{"timeSec":16789888,"value":78},{"timeSec":16789688,"value":68},{"timeSec":16789898,"value":58},\\r
+            #                              {"timeSec":16789897,"value":88},{"timeSec":16789867,"value":77},{"timeSec":16789895,"value":70}]\r
+\r
+        def post_processor_after_instantiation(self):\r
+            EventMesh.subscribe("set_old_hr_data", self.save_hr_value)\r
+            EventMesh.subscribe("get_old_hr_data", self.get_hr_value)\r
+            EventMesh.subscribe("set_old_spo2_data", self.save_spo2_value)\r
+            EventMesh.subscribe("get_old_spo2_data", self.get_spo2_value)\r
+\r
+            EventMesh.subscribe("get_old_step_value", self.get_old_step_value)\r
+            EventMesh.subscribe("set_old_step_value", self.set_old_step_value)\r
+\r
+\r
+            EventMesh.subscribe("get_history_hr_value", self.get_history_hr_value)\r
+            EventMesh.subscribe("set_history_hr_value", self.set_history_hr_value)\r
+\r
+            EventMesh.subscribe("get_history_temp_value", self.get_history_temp_value)\r
+            EventMesh.subscribe("set_history_temp_value", self.set_history_temp_value)\r
+\r
+            EventMesh.subscribe("get_history_spo2_value", self.get_history_spo2_value)\r
+            EventMesh.subscribe("set_history_spo2_value", self.set_history_spo2_value)\r
+\r
+        \r
+\r
+        def get_history_spo2_value(self, event, msg): #近7次血氧历史数据统计显示\r
+            return self.read_histroy_spo2_data\r
+\r
+        def set_history_spo2_value(self, event, msg): \r
+            pass\r
+\r
+\r
+\r
+        def get_history_temp_value(self, event, msg): #近7次体温历史数据统计显示\r
+            return self.read_histroy_temp_data\r
+\r
+        def set_history_temp_value(self, event, msg): \r
+            self.temp_value = msg\r
+            if self.temp_value > 0:\r
+                # date_tmp = utime.localtime()\r
+                # time_tmp = utime.mktime(date_tmp)\r
+                # if len(self.read_histroy_temp_data) >= 7:\r
+                #     sort_new = {}\r
+                #     sort_new = sorted(self.read_histroy_temp_data, key = lambda i: i['timeSec'],reverse = False)#按照时间戳进行排序 去掉最旧的一次数据如果满了五十条\r
+                #     EventMesh.debug_log(sort_new)\r
+                #     for i in range(len(self.read_histroy_temp_data)-1):\r
+                #         sort_new[i] = sort_new[i+1]#0==1 1== 2 2== 3 3==4 4==5 5==6 6==7\r
+                #         self.read_histroy_temp_data[i] = sort_new[i]\r
+                #         pass\r
+                #     self.read_histroy_temp_data[6] = {"timeSec": time_tmp, "temp": self.temp_value}\r
+                # else:\r
+                #     self.read_histroy_temp_data.append({"timeSec": time_tmp, "temp": self.temp_value}) \r
+\r
+                # with open("/usr/static/storage_file/history_temp.json","w",encoding="utf-8") as fd:\r
+                #     ujson.dump(self.read_histroy_temp_data,fd)\r
+                #EventMesh.debug_log(self.read_histroy_temp_data)\r
+                pass\r
+            else:\r
+                pass\r
+\r
+        def get_history_hr_value(self, event, msg): #近7次心率历史数据统计显示\r
+            return self.read_histroy_hr_data\r
+\r
+        def set_history_hr_value(self, event, msg): \r
+            pass\r
+                \r
+            \r
+\r
+        def save_hr_value(self, event, msg): \r
+            if msg >= 50:\r
+                EventMesh.publish("set_storage_config",["old_hr",msg])\r
+                self.oldHr = msg\r
+                \r
+\r
+                date_tmp = utime.localtime()\r
+                time_tmp = utime.mktime(date_tmp)\r
+                if len(self.read_histroy_hr_data) >= 7:\r
+                    sort_new = {}\r
+                    sort_new = sorted(self.read_histroy_hr_data, key = lambda i: i['timeSec'],reverse = False)#按照时间戳进行排序 去掉最旧的一次数据如果满了五十条\r
+                    EventMesh.debug_log(sort_new)\r
+                    for i in range(len(self.read_histroy_hr_data)-1):\r
+                        sort_new[i] = sort_new[i+1]#0==1 1== 2 2== 3 3==4 4==5 5==6 6==7\r
+                        self.read_histroy_hr_data[i] = sort_new[i]\r
+                        pass\r
+                    self.read_histroy_hr_data[6] = {"timeSec": time_tmp, "hr": self.oldHr}\r
+                else:\r
+                    self.read_histroy_hr_data.append({"timeSec": time_tmp, "hr": self.oldHr}) \r
+\r
+\r
+                with open("/usr/static/storage_file/history_hr.json","w",encoding="utf-8") as fd:\r
+                    ujson.dump(self.read_histroy_hr_data,fd)\r
+                pass\r
+            else:\r
+                EventMesh.publish("set_storage_config",["old_hr",msg])\r
+                pass\r
+\r
+\r
+        def get_hr_value(self, event, msg): \r
+            return self.oldHr\r
+\r
+        def save_spo2_value(self, event, msg): \r
+            if msg >= 85:\r
+                # EventMesh.publish("set_storage_config",["old_spo2",msg])\r
+                # self.oldspo2 = msg\r
+\r
+\r
+                # date_tmp = utime.localtime()\r
+                # time_tmp = utime.mktime(date_tmp)\r
+                # if len(self.read_histroy_spo2_data) >= 7:\r
+                #     sort_new = {}\r
+                #     sort_new = sorted(self.read_histroy_spo2_data, key = lambda i: i['timeSec'],reverse = False)#按照时间戳进行排序 去掉最旧的一次数据如果满了五十条\r
+                #     EventMesh.debug_log(sort_new)\r
+                #     for i in range(len(self.read_histroy_spo2_data)-1):\r
+                #         sort_new[i] = sort_new[i+1]#0==1 1== 2 2== 3 3==4 4==5 5==6 6==7\r
+                #         self.read_histroy_spo2_data[i] = sort_new[i]\r
+                #         pass\r
+                #     self.read_histroy_spo2_data[6] = {"timeSec": time_tmp, "spo2": self.oldspo2}\r
+                # else:\r
+                #     self.read_histroy_spo2_data.append({"timeSec": time_tmp, "spo2": self.oldspo2}) \r
+\r
+                # with open("/usr/static/storage_file/history_spo2.json","w",encoding="utf-8") as fd:\r
+                #     ujson.dump(self.read_histroy_spo2_data,fd)\r
+                # #EventMesh.debug_log(self.read_histroy_spo2_data)\r
+                #播放语音\r
+                # EventMesh.publish("set_hr_blood_led",2)#测量成功\r
+                pass\r
+            else:\r
+                pass\r
+                pass\r
+\r
+        def get_spo2_value(self, event, msg): \r
+            return self.oldspo2\r
+        \r
+        def set_old_step_value(self, event, msg): \r
+            self.oldstep = msg\r
+            EventMesh.publish("set_storage_config",["old_step",msg])\r
+            \r
+            \r
+        def get_old_step_value(self, event, msg): \r
+            step = EventMesh.publish(constants.EVENT.GET_STEP)\r
+            self.old_step = self.oldstep + step[0]\r
+            return self.old_step\r
+    #获取旧的时间戳\r
+    class getOldTimeManager(Abstract):\r
+        # 获取天气数据\r
+        def __init__(self):\r
+            self.time_sec = 0\r
+            self.time_step = 0\r
+            self.step_second = 0\r
+            tmp_data = EventMesh.publish("get_storage_config","old_time")\r
+            if tmp_data !=None :\r
+                self.time_sec = tmp_data\r
+            tmp_data = EventMesh.publish("get_storage_config","clear_state")\r
+            if tmp_data !=None :\r
+                self.time_step = tmp_data[0]\r
+                self.step_second = tmp_data[1]\r
+\r
+            \r
+            \r
+        def post_processor_after_instantiation(self):\r
+            EventMesh.subscribe("get_old_time_data", self.get_old_time_data)\r
+            EventMesh.subscribe("set_old_time_data", self.set_old_time_data)\r
+\r
+            EventMesh.subscribe("get_old_step_data", self.get_old_step_data)\r
+            EventMesh.subscribe("set_old_step_data", self.set_old_step_data)\r
+\r
+            EventMesh.subscribe("set_test_data1", self.set_test_data1)\r
+\r
+            EventMesh.subscribe("set_test_data2", self.set_test_data2)\r
+\r
+            EventMesh.subscribe("set_test_data3", self.set_test_data3)\r
+\r
+            EventMesh.subscribe("set_test_data4", self.set_test_data4)\r
+\r
+            EventMesh.subscribe("set_test_data5", self.set_test_data5)\r
+\r
+            EventMesh.subscribe("set_test_data6", self.set_test_data6)\r
+\r
+            EventMesh.subscribe("set_test_data7", self.set_test_data7)\r
+\r
+            EventMesh.subscribe("set_test_data8", self.set_test_data8)\r
+        \r
+\r
+        def set_test_data1(self, event, msg):\r
+            EventMesh.publish("set_storage_config",["clear_state1",msg])\r
+\r
+        \r
+        def set_test_data2(self, event, msg):\r
+            \r
+            EventMesh.publish("set_storage_config",["clear_state2",msg])\r
+\r
+\r
+        def set_test_data3(self, event, msg):\r
+            EventMesh.publish("set_storage_config",["clear_state3",msg])\r
+\r
+        def set_test_data4(self, event, msg):\r
+            EventMesh.publish("set_storage_config",["clear_state4",msg])\r
+\r
+        def set_test_data5(self, event, msg):\r
+            EventMesh.publish("set_storage_config",["clear_state5",msg])\r
+\r
+        def set_test_data6(self, event, msg):\r
+            EventMesh.publish("set_storage_config",["clear_state6",msg])\r
+\r
+        def set_test_data7(self, event, msg):\r
+            EventMesh.publish("set_storage_config",["clear_state7",msg])\r
+\r
+        def set_test_data8(self, event, msg):\r
+            EventMesh.publish("set_storage_config",["clear_state8",msg])\r
+\r
+        # f = open("/usr/static/storage_file/config.json",'r',encoding="utf-8")\r
+        # print(f.read())\r
+\r
+        def get_old_step_data(self, event, msg):\r
+            return [self.time_step,self.step_second]\r
+\r
+        def get_old_time_data(self, event, msg):\r
+            return self.time_sec\r
+        \r
+        \r
+\r
+        def set_old_time_data(self, event, msg):\r
+            self.time_sec = msg\r
+            EventMesh.publish("set_storage_config",["old_time",msg])\r
+\r
+        def set_old_step_data(self, event, msg):\r
+            self.time_step = msg[0]\r
+            self.step_second = msg[1]\r
+            EventMesh.publish("set_storage_config",["clear_state",msg])\r
+\r
+        def get_old_step_data(self, event, msg):\r
+            return [self.time_step,self.step_second]\r
+\r
+\r
+            \r
+        \r
+\r
+    class getWeatherDataManager(Abstract):\r
+        # 获取天气数据\r
+        def __init__(self):\r
+            self.date = {} #日期23-04-07\r
+            self.time = {} #14:41:41\r
+            self.content = {} #天气描述 \r
+            self.type = None #天气类型\r
+            self.temp = None #当前温度\r
+            self.min_temp = None #最低温度\r
+            self.max_temp = None #最高温度\r
+            self.city = {} #城市\r
+            self.no_data = 0#0沒有数据 1有数据\r
+\r
+        def post_processor_after_instantiation(self):\r
+            EventMesh.subscribe("get_weather_data", self.get)\r
+            EventMesh.subscribe("set_weather_data", self.set)\r
+\r
+        def get(self, event, msg):\r
+            return [self.date,self.time,self.content,self.type,self.temp,self.min_temp,self.max_temp,self.city,self.no_data]\r
+\r
+        def set(self, event, msg):\r
+            self.date = msg[0]\r
+            self.time = msg[1]\r
+            self.content = msg[2]\r
+            self.type = msg[3]\r
+            self.temp = msg[4]\r
+            self.min_temp = msg[5]\r
+            self.max_temp = msg[6]\r
+            self.city = msg[7]\r
+            self.no_data = msg[8]\r
+\r
+\r
+    class getHrTimeManager(Abstract):\r
+        def __init__(self):\r
+            self.set_time = 0\r
+            self.set_hr = 0 #0关闭 1手动 2 自动测量按照时间间隔测试心率\r
+            self.set_spo2 = 0\r
+            self.open_btn = 0\r
+            self.set_bgautotime = 0\r
+            self.bgauto_btn = 0\r
+            read_data = EventMesh.publish("get_storage_config","measure_time")\r
+            if read_data != None:\r
+                self.set_time = read_data  \r
+            read_data = EventMesh.publish("get_storage_config","open_hr_btn")\r
+                    \r
+            if read_data != None:\r
+                self.open_btn = read_data   \r
+\r
+            read_data = EventMesh.publish("get_storage_config","bgauto_time")\r
+            if read_data != None:\r
+                self.set_bgautotime = read_data  \r
+            read_data = EventMesh.publish("get_storage_config","bgauto_btn")\r
+                    \r
+            if read_data != None:\r
+                self.bgauto_btn = read_data   \r
+\r
+\r
+\r
+        def post_processor_after_instantiation(self):\r
+            EventMesh.subscribe("set_time_hr", self.set_time_hr)\r
+            EventMesh.subscribe("get_time_hr", self.get_time_hr)\r
+            EventMesh.subscribe("set_hr_state", self.set_hr_state)\r
+            EventMesh.subscribe("get_hr_state", self.get_hr_state)\r
+            EventMesh.subscribe("set_spo2_state", self.set_spo2_state)\r
+            EventMesh.subscribe("get_spo2_state", self.get_spo2_state)\r
+\r
+            EventMesh.subscribe("set_bgauto_time", self.set_bgauto_time)\r
+            EventMesh.subscribe("get_bgauto_time", self.get_bgauto_time)\r
+\r
+        def set_bgauto_time(self, event, msg): \r
+            self.bgauto_btn = msg[0]\r
+            self.set_bgautotime = msg[1]\r
+            EventMesh.publish("set_storage_config",["bgauto_btn",self.bgauto_btn])\r
+            EventMesh.publish("set_storage_config",["bgauto_time",self.set_bgautotime])\r
+\r
+        def get_bgauto_time(self, event, msg): \r
+            if self.bgauto_btn == None:\r
+                self.bgauto_btn = 0\r
+            if self.set_bgautotime == None:\r
+                self.set_bgautotime = 0\r
+            return [self.bgauto_btn,self.set_bgautotime]\r
+        \r
+\r
+        def set_time_hr(self, event, msg): \r
+            self.open_btn = msg[0]\r
+            self.set_time = msg[1]\r
+            EventMesh.publish("set_storage_config",["measure_time",self.set_time])\r
+            EventMesh.publish("set_storage_config",["open_hr_btn",self.open_btn])\r
+\r
+        def get_time_hr(self, event, msg): \r
+            return [self.open_btn,self.set_time]\r
+\r
+        def set_hr_state(self, event, msg): \r
+            # if msg != 0:\r
+            #     EventMesh.publish("set_hr_blood_led",1)#红绿灯交替闪烁\r
+            self.set_hr = msg\r
+            if self.set_hr == 0:\r
+                EventMesh.publish("clear_health_state")\r
+            \r
+\r
+        def get_hr_state(self, event, msg): \r
+            return self.set_hr\r
+        \r
+        def set_spo2_state(self, event, msg): \r
+            # if msg != 0:\r
+            #     EventMesh.publish("set_hr_blood_led",1)##红绿灯交替闪烁\r
+            self.set_spo2 = msg\r
+            if self.set_spo2 == 0:\r
+                EventMesh.publish("clear_health_state")\r
+            \r
+\r
+        def get_spo2_state(self, event, msg): \r
+            return self.set_spo2\r
+        \r
+    #体温\r
+    class getTempTimeManager(Abstract):\r
+        def __init__(self):\r
+            self.set_time = 0\r
+            self.get_temp = 0\r
+            read_data = EventMesh.publish("get_storage_config","temp_time")\r
+\r
+            if read_data != None:\r
+                self.set_time = read_data\r
+\r
+            self.get_bgstate = 0\r
+            self.get_bpstate = 0\r
+\r
+            self.bptime_on = 0\r
+            self.bptime_time = 0\r
+            read_data=EventMesh.publish("get_storage_config","bpauto_btn")\r
+            if read_data != None:\r
+                self.bptime_on = read_data\r
+\r
+            read_data=EventMesh.publish("get_storage_config","bpauto_time")\r
+            if read_data != None:\r
+                self.bptime_time = read_data\r
+\r
+            self.spo2time_on = 0\r
+            self.spo2time_time = 0\r
+            read_data = EventMesh.publish("get_storage_config","spo2auto_btn")\r
+            if read_data != None:\r
+                self.spo2time_on = read_data\r
+\r
+            read_data = EventMesh.publish("get_storage_config","spo2auto_time")\r
+            if read_data != None:\r
+                self.spo2time_time = read_data\r
+\r
+        def post_processor_after_instantiation(self):\r
+            EventMesh.subscribe("set_temp_time", self.set_temp_time)\r
+            EventMesh.subscribe("get_temp_time", self.get_temp_time)\r
+\r
+            EventMesh.subscribe("set_temp_state", self.set_temp_state)\r
+            EventMesh.subscribe("get_temp_state", self.get_temp_state)\r
+\r
+            EventMesh.subscribe("set_bp_time", self.set_bp_time)\r
+            EventMesh.subscribe("get_bp_time", self.get_bp_time)\r
+\r
+            EventMesh.subscribe("set_bp_state", self.set_bp_state)\r
+            EventMesh.subscribe("get_bp_state", self.get_bp_state)\r
+\r
+\r
+            EventMesh.subscribe("set_bg_state", self.set_bg_state)\r
+            EventMesh.subscribe("get_bg_state", self.get_bg_state)\r
+\r
+            EventMesh.subscribe("set_spo2_time", self.set_spo2_time)\r
+            EventMesh.subscribe("get_spo2_time", self.get_spo2_time)\r
+\r
+            \r
+        def set_bg_state(self, event, msg): \r
+            self.get_bgstate = msg\r
+            if self.get_bgstate == 0:\r
+                EventMesh.publish("clear_health_state")\r
+            # if msg != 0:\r
+            #     EventMesh.publish("set_hr_blood_led",1)#红绿灯交替闪烁\r
+\r
+        def get_bg_state(self, event, msg): \r
+            if self.get_bgstate:\r
+                return self.get_bgstate\r
+            else :\r
+                return 0\r
+\r
+        def set_spo2_time(self, event, msg): \r
+            self.spo2time_on = msg[0]\r
+            self.spo2time_time = msg[1]\r
+            EventMesh.publish("set_storage_config",["spo2auto_btn",self.spo2time_on])\r
+            EventMesh.publish("set_storage_config",["spo2auto_time",self.spo2time_time])\r
+\r
+\r
+        def get_spo2_time(self, event, msg): \r
+            \r
+            return [self.spo2time_on,self.spo2time_time]\r
+\r
+\r
+        def set_bp_time(self, event, msg): \r
+            self.bptime_on = msg[0]\r
+            self.bptime_time = msg[1]\r
+            EventMesh.publish("set_storage_config",["bpauto_btn",self.bptime_on])\r
+            EventMesh.publish("set_storage_config",["bpauto_time",self.bptime_time])\r
+\r
+        def get_bp_time(self, event, msg): \r
+            if self.bptime_on == None:\r
+                self.bptime_on = 0\r
+            if self.bptime_time == None:\r
+                self.bptime_time = 0\r
+            return [self.bptime_on,self.bptime_time]\r
+        \r
+            \r
+        def set_bp_state(self, event, msg): \r
+            self.get_bpstate = msg\r
+            if self.get_bpstate == 0:\r
+                EventMesh.publish("clear_health_state")\r
+            # if msg != 0:\r
+                # EventMesh.publish("set_hr_blood_led",1)#红绿灯交替闪烁\r
+\r
+        def get_bp_state(self, event, msg): \r
+            if self.get_bpstate:\r
+                return self.get_bpstate\r
+            else :\r
+                return 0\r
+\r
+\r
+        def set_temp_time(self, event, msg): \r
+            self.set_time = msg\r
+            EventMesh.publish("set_storage_config",["temp_time",self.set_time])\r
+\r
+        def get_temp_time(self, event, msg): \r
+            return self.set_time\r
+        \r
+        def set_temp_state(self, event, msg): \r
+            self.get_temp = msg\r
+            if self.get_temp == 0:\r
+                EventMesh.publish("clear_temp_state")\r
+            # if msg != 0:\r
+            #     EventMesh.publish("set_hr_blood_led",1)#红绿灯交替闪烁\r
+\r
+        def get_temp_state(self, event, msg): \r
+            return self.get_temp\r
+            \r
+    class getBrightnessManager(Abstract):#获取亮度级别\r
+        def __init__(self):\r
+            self.level = 6#默认值6\r
+            # self.read_data = {}\r
+            self.time = 5\r
+            self.PWM_backlight  = None\r
+\r
+\r
+        def post_processor_after_instantiation(self):\r
+            EventMesh.subscribe("get_brightness_level", self.get_brightness_level)\r
+            EventMesh.subscribe("push_add_brightness_level", self.add)\r
+            EventMesh.subscribe("push_reduce_brightness_level", self.reduce)\r
+            EventMesh.subscribe("set_brightness_level", self.set_brightness_level)\r
+\r
+            EventMesh.subscribe("set_brightness_time", self.set_brightness_time)\r
+            EventMesh.subscribe("get_brightness_time", self.get_brightness_time)\r
+\r
+        def set_brightness_level(self, event, msg): \r
+            self.level = msg\r
+            EventMesh.publish("set_storage_config", ["brightness_level",self.level])\r
+\r
+        def get_brightness_level(self, event, msg): \r
+            tmp = EventMesh.publish("get_storage_config","brightness_level")\r
+            if tmp != None:\r
+                self.level = tmp\r
+            return self.level\r
+        \r
+        def set_brightness_time(self, event, msg): \r
+            self.time = msg\r
+            EventMesh.publish("set_storage_config", ["brightness_time",self.time])\r
+        \r
+        def get_brightness_time(self, event, msg): \r
+            tmp = EventMesh.publish("get_storage_config","brightness_time")\r
+            if tmp != None:\r
+                self.time = tmp\r
+            return self.time\r
+        \r
+\r
+\r
+        def add(self, event, msg):\r
+            if self.level < 10:\r
+                self.level = self.level + 2\r
+            # self.PWM_backlight = PWM(PWM.PWM1, PWM.ABOVE_MS, self.level, 10)\r
+            # self.PWM_backlight.open()\r
+            EventMesh.publish("set_storage_config", ["brightness_level",self.level])\r
+\r
+\r
+        def reduce(self, event, msg):\r
+            # if self.level > 0:\r
+            #     self.level = self.level - 2\r
+            # if self.level <= 0:\r
+            #     self.PWM_backlight = PWM(PWM.PWM1, PWM.ABOVE_MS, 1, 10)\r
+            # else:\r
+            #     self.PWM_backlight = PWM(PWM.PWM1, PWM.ABOVE_MS,self.level, 10)\r
+\r
+            # self.PWM_backlight.open()\r
+            EventMesh.publish("set_storage_config", ["brightness_level",self.level])\r
+        \r
+        \r
+    class getStorageDataManager(Abstract):#获取内存数据\r
+        def __init__(self):\r
+            self.config_data = {}\r
+            check = ql_fs.path_exists("/usr/static/storage_file/config.json")\r
+            if check == True:\r
+                with open("/usr/static/storage_file/config.json","r") as fd:\r
+                    self.config_data = ujson.load(fd)\r
+            else :\r
+                self.config_data = {'old_time': 0, 'flip_sw': 0}\r
+                pass\r
+\r
+        def post_processor_after_instantiation(self):\r
+            EventMesh.subscribe("set_storage_data", self.set_storage_data)\r
+            EventMesh.subscribe("set_storage_config", self.set_storage_config)\r
+            EventMesh.subscribe("get_storage_data", self.get_storage_data)\r
+            EventMesh.subscribe("get_storage_config", self.get_storage_config)\r
+\r
+        def set_storage_data(self, event, msg): \r
+            # EventMesh.debug_log("set_storage_data:{}".format(msg))\r
+            if msg != None:\r
+                self.config_data = msg\r
+                with open("/usr/static/storage_file/config.json",'w+',encoding="utf-8") as fd:\r
+                    ujson.dump(self.config_data,fd)\r
+        \r
+\r
+        def set_storage_config(self,event,msg): \r
+            # EventMesh.debug_log("set_storage_key_data1:{}".format(msg))\r
+            if len(msg) >= 2:\r
+                self.config_data[msg[0]]=msg[1]\r
+                # EventMesh.debug_log("set_storage_key_data2:{}".format(self.config_data[msg[0]]))\r
+                EventMesh.publish("publish_message_event_ui",{"func":self.set_storage_save,"data":0})\r
+        def set_storage_save(self, data): \r
+            with open("/usr/static/storage_file/config.json",'w+',encoding="utf-8") as fd:\r
+                ujson.dump(self.config_data,fd)\r
+        def get_storage_data(self, event, msg): \r
+            # EventMesh.debug_log("get_storage_data:{}".format(self.config_data))\r
+            return self.config_data \r
+        def get_storage_config(self,event,msg):\r
+            # EventMesh.debug_log("get_storage_key_data1:{}".format(msg))\r
+            b = msg in self.config_data.keys()\r
+            if b == True:\r
+                # EventMesh.debug_log("get_storage_key_data2:{}".format(self.config_data[msg]))\r
+                return self.config_data[msg]\r
+            else :\r
+                return None\r
+            # try:\r
+            #     return self.config_data[msg]\r
+            # except:\r
+            #     EventMesh.debug_log("get_storage_key_data:none key:{}",msg)\r
+            #     return None\r
+    #定位频率\r
+    class getUpLoadDataManager(Abstract):#\r
+        def __init__(self):\r
+            self.upload_time = 2*60*60\r
+            read_data = EventMesh.publish("get_storage_config","upload_time")\r
+            if read_data != None:\r
+                self.upload_time = read_data \r
+\r
+        def post_processor_after_instantiation(self):\r
+            EventMesh.subscribe("set_upload_data", self.set_upload_data)\r
+            EventMesh.subscribe("get_upload_data", self.get_upload_data)\r
+\r
+        def set_upload_data(self, event, msg): \r
+            self.upload_time = msg\r
+\r
+        def get_upload_data(self, event, msg): \r
+            if self.upload_time == None:\r
+                self.upload_time = 2*60*60\r
+            return self.upload_time \r
+\r
+    class getplayAudiodStateManager(Abstract):#获取设置播放音频状态\r
+        def __init__(self):\r
+            self.play = 0\r
+\r
+        def post_processor_after_instantiation(self):\r
+            EventMesh.subscribe("set_audio_state", self.set_audio_state)\r
+            EventMesh.subscribe("get_audio_state", self.get_audio_state)\r
+\r
+        def set_audio_state(self, event, msg): \r
+            self.play = msg\r
+\r
+        def get_audio_state(self, event, msg): \r
+            return self.play\r
+        \r
+    class getVolumSizeManager(Abstract):#设置或获取音量大小数据\r
+        def __init__(self):\r
+            self.volume_size = 8\r
+            read_data = EventMesh.publish("get_storage_config","volum")\r
+            if read_data != None:\r
+                self.volume_size = read_data\r
+        \r
+        def post_processor_after_instantiation(self):\r
+            EventMesh.subscribe("set_volum_size", self.set_volum_size)\r
+            EventMesh.subscribe("get_volum_size", self.get_volum_size)\r
+\r
+        def set_volum_size(self, event, msg): \r
+            self.volume_size = msg\r
+            EventMesh.publish("set_storage_config", ["volum",self.volume_size])\r
+\r
+        def get_volum_size(self, event, msg): \r
+            return self.volume_size\r
+\r
+    class getSosFlagManager(Abstract):#设置sos\r
+        def __init__(self):\r
+            self.aud = audio.Audio(0)\r
+            self.sos_flag = 0\r
+            self.sos_num = 0\r
+            self.hangup_mode = 0\r
+            self.call_timer = osTimer()\r
+            self.sos_numer1 = []\r
+            self.callnumer =""\r
+            SOS_NUMBER1 = EventMesh.publish("get_storage_config","SOS_NUMBER1")\r
+            if SOS_NUMBER1 != None:\r
+                self.sos_numer1 = SOS_NUMBER1\r
+            SOS_NUMBER2 = EventMesh.publish("get_storage_config","SOS_NUMBER2")\r
+            if SOS_NUMBER2 != None:        \r
+                self.sos_numer1 = [SOS_NUMBER1, SOS_NUMBER2]\r
+\r
+            SOS_NUMBER3 = EventMesh.publish("get_storage_config","SOS_NUMBER3")\r
+            if SOS_NUMBER3 != None:        \r
+                self.sos_numer1 = [SOS_NUMBER1, SOS_NUMBER2,SOS_NUMBER3]\r
+\r
+\r
+        def post_processor_after_instantiation(self):\r
+            EventMesh.subscribe("set_sos_flag", self.set_sos_flag)#设置sos拨打标识\r
+            EventMesh.subscribe("get_sos_flag", self.get_sos_flag)\r
+\r
+            EventMesh.subscribe("set_sos_num", self.set_sos_num)#设置拨打循环次数\r
+            EventMesh.subscribe("get_sos_num", self.get_sos_num)\r
+\r
+            EventMesh.subscribe("set_dial_sos_number", self.set_dial_sos_number)\r
+            EventMesh.subscribe("get_dial_sos_number", self.get_dial_sos_number)#设置家庭号码三个\r
+\r
+            EventMesh.subscribe("set_callnumer_cb", self.set_callnumer_cb)#延时回调\r
+\r
+            EventMesh.subscribe("close_call_time",self.close_call_time)\r
+\r
+            EventMesh.subscribe("set_hangup_mode", self.set_hangup_mode)\r
+            EventMesh.subscribe("get_hangup_mode", self.get_hangup_mode)#获取挂断方式 是对方挂断 还是手表按键主动挂断\r
+\r
+        def get_hangup_mode(self, event, msg): # 1是设备端手表主动挂断 0是手机端\r
+            return self.hangup_mode\r
+        \r
+        def set_hangup_mode(self, event, msg): \r
+            self.hangup_mode = msg\r
+\r
+        def set_sos_flag(self, event, msg): \r
+            self.sos_flag = msg\r
+            EventMesh.publish("set_sos_state_out")\r
+            if self.sos_flag == 1:\r
+                number = EventMesh.publish("get_dial_sos_number")\r
+            \r
+                if number != None:\r
+                    if len(number) > 0:\r
+                        self.call_timer.stop()\r
+                        EventMesh.publish("save_phonename",number[0])\r
+                        EventMesh.publish("save_phonenum",number[0])\r
+                        EventMesh.publish("set_sos_num",0)\r
+                        phone_num = EventMesh.publish("get_phonenum")  \r
+                        EventMesh.publish("sos_out_call_center_cb",phone_num)#电话拨出去\r
+                    else:\r
+                        EventMesh.publish("sos_out_call_center_cb",None)#电话拨出去\r
+\r
+        def set_callnumer_cb(self, event, msg):\r
+            if self.sos_flag == 1:\r
+                EventMesh.publish("set_sos_state_out")\r
+                self.callnumer = msg\r
+                self.call_timer.start(5000, 0, self.call_timer_cb)#延迟10S 继续拨打\r
+\r
+        def call_timer_cb(self, *args, **kwargs):\r
+            EventMesh.publish("set_sos_state_out")\r
+            flag = EventMesh.publish("get_call_state") \r
+            fall_down = EventMesh.publish("get_fall_down_state")#跌倒报警标识\r
+            video_state = EventMesh.publish("get_video_state")\r
+            if flag != 0 or fall_down != 0 or video_state != 0:#防止不会被中断不会继续拨打sos号码正在通话或者打电话中,跌倒报警 视频通话中不允许拨打sos\r
+                if self.sos_flag == 1:\r
+                    self.call_timer.start(5000, 0, self.call_timer_cb)#延迟10S 继续拨打\r
+                    return\r
+                else:\r
+                    self.call_timer.stop()\r
+                    return\r
+\r
+            if self.sos_flag == 1:\r
+                self.call_timer.stop()\r
+                EventMesh.publish("save_phonename",str(self.callnumer))\r
+                EventMesh.publish("save_phonenum",str(self.callnumer))\r
+                phone_num = EventMesh.publish("get_phonenum")  \r
+                EventMesh.publish("sos_out_call_center_cb",phone_num)#电话拨出去\r
+            else:\r
+                self.call_timer.stop()\r
+        \r
+        def close_call_time(self, event, msg): \r
+            self.call_timer.stop()\r
+\r
+        def get_sos_flag(self, event, msg): \r
+            return self.sos_flag\r
+        \r
+        def set_sos_num(self, event, msg): \r
+            self.sos_num = msg\r
+\r
+        def get_sos_num(self, event, msg): \r
+            return self.sos_num\r
+        \r
+        def set_dial_sos_number(self, event, msg): \r
+            self.sos_numer1 = msg\r
+            \r
+\r
+        def get_dial_sos_number(self, event, msg): \r
+            return self.sos_numer1\r
+    class getLowBatManager(Abstract):#低电提醒\r
+        def __init__(self):\r
+\r
+            self.low_btn = 0\r
+            read_data = EventMesh.publish("get_storage_config","low_on")\r
+            if read_data != None:\r
+                self.low_btn = read_data\r
+\r
+        def post_processor_after_instantiation(self):\r
+            EventMesh.subscribe("set_low_bat_btn", self.set_low_bat_btn)#\r
+            EventMesh.subscribe("get_low_bat_btn", self.get_low_bat_btn)\r
+\r
+        def set_low_bat_btn(self, event, msg): \r
+            self.low_btn = msg\r
+            EventMesh.publish("set_storage_config",["low_on",self.low_btn])\r
+\r
+        def get_low_bat_btn(self, event, msg): \r
+            return self.low_btn\r
+        \r
+\r
+\r
+    class playPowerAudioManager(Abstract):#播放开关机音频文件\r
+        def __init__(self):\r
+            self.aud = audio.Audio(0)\r
+\r
+        def post_processor_after_instantiation(self):\r
+            \r
+            EventMesh.subscribe("play_poewr_on_event", self.play_poewr_on_event)#\r
+            EventMesh.subscribe("play_poewr_off_event", self.play_poewr_off_event)\r
+\r
+        def play_poewr_on_event(self, event, msg): \r
+            self.aud.play(1, 1, 'U:/static/R_POWER_1.mp3')  #播放播放开机铃声\r
+\r
+        def play_poewr_off_event(self, event, msg): \r
+            self.aud.setVolume(11)\r
+            self.aud.play(1, 1, 'U:/static/R_POWER_OFF_1.mp3')  #播放关机铃声\r
+        \r
+    class getBootOffManager(Abstract):#开关机时间\r
+        def __init__(self):\r
+            self.poweroff_time = []\r
+            read_data = EventMesh.publish("get_storage_config","poweroff_alarm")\r
+            if read_data != None:\r
+                self.poweroff_time = read_data\r
+            else:\r
+                self.poweroff_time = [{"poweroff_on":0,"start_hour":6,"start_min":0,"end_hour":0,"end_min":0}]\r
+            \r
+\r
+\r
+        def post_processor_after_instantiation(self):\r
+            EventMesh.subscribe("set_boot_off_time", self.set_boot_off_time)#设置关机时间\r
+            EventMesh.subscribe("get_boot_off_time", self.get_boot_off_time)\r
+\r
+        def set_boot_off_time(self, event, msg): \r
+            EventMesh.debug_log("set_boot_off_time",msg)\r
+\r
+            EventMesh.publish("set_storage_config",["poweroff_alarm",msg])\r
+            self.poweroff_time = msg\r
+            EventMesh.publish("set_rtc_alarm")\r
+\r
+\r
+        def get_boot_off_time(self, event, msg):\r
+            return self.poweroff_time\r
+    class setSmsIndexManager(Abstract):#\r
+        def __init__(self):\r
+            self.index = -1\r
+\r
+        def post_processor_after_instantiation(self):\r
+            EventMesh.subscribe("set_sms_index", self.set_sms_index)#设置关机时间\r
+            EventMesh.subscribe("get_sms_index", self.get_sms_index)\r
+\r
+        def set_sms_index(self, event, msg): \r
+            self.index = msg\r
+            \r
+\r
+        def get_sms_index(self, event, msg):\r
+            \r
+            return self.index\r
+    import protocol \r
+    class testSmsSetIPManager(Abstract):#\r
+        def __init__(self):\r
+            self.timer = osTimer()\r
+            #大锤\r
+            severdata = protocol.server_init()\r
+\r
+            self.newip = severdata[0]\r
+            self.newcom = severdata[1]\r
+            self.new_key = severdata[2]\r
+            self.new_pid = severdata[3]\r
+            \r
+            EventMesh.debug_log("testSmsSetIPManager:{}\n".format(severdata))\r
+\r
+            self.server_sate = 0\r
+\r
+\r
+\r
+            tmp_data = EventMesh.publish("get_storage_config","set_new_ip_addr")\r
+            if tmp_data != None:\r
+                self.newip = tmp_data\r
+            tmp_data = EventMesh.publish("get_storage_config","set_new_com")\r
+            if tmp_data != None:\r
+                self.newcom = tmp_data\r
+            tmp_data = EventMesh.publish("get_storage_config","set_new_md5")\r
+            if tmp_data != None:\r
+                self.newmd5 = tmp_data    \r
+\r
+            tmp_data = EventMesh.publish("get_storage_config","set_new_key")\r
+            if tmp_data != None:\r
+                self.new_key = tmp_data \r
+\r
+            tmp_data = EventMesh.publish("get_storage_config","set_new_pid")\r
+            if tmp_data != None:\r
+                self.new_pid = tmp_data \r
+\r
+            tmp_data = EventMesh.publish("get_storage_config","get_server_sate")\r
+            if tmp_data != None:\r
+                self.server_sate = tmp_data \r
+            \r
+            \r
+\r
+\r
+\r
+        def post_processor_after_instantiation(self):\r
+            EventMesh.subscribe("set_new_ip_com", self.set_new_ip_com)#设置关机时间\r
+            EventMesh.subscribe("get_new_ip_com", self.get_new_ip_com)\r
+\r
+            EventMesh.subscribe("set_ip", self.set_ip)#设置关机时间\r
+            EventMesh.subscribe("get_ip", self.get_ip)\r
+\r
+            EventMesh.subscribe("set_com", self.set_com)#设置关机时间\r
+            EventMesh.subscribe("get_com", self.get_com)\r
+\r
+            EventMesh.subscribe("get_new_key", self.get_new_key_cb)#获取key\r
+            EventMesh.subscribe("set_new_key", self.set_new_key_cb)#获取key\r
+\r
+            EventMesh.subscribe("set_new_pid", self.set_new_pid_cb)#获取pid\r
+            EventMesh.subscribe("get_new_pid", self.get_new_pid_cb)#获取pid\r
+\r
+            EventMesh.subscribe("set_server_state", self.set_server_state)#\r
+            EventMesh.subscribe("get_server_state", self.get_server_state)#\r
+\r
+            EventMesh.subscribe("get_new_key_pid", self.get_new_key_pid)#\r
+\r
+\r
+\r
+        def set_new_key_cb(self, event, msg): \r
+            self.new_key = msg\r
+            # print("set_new_key_cb",msg,self.new_key)\r
+            EventMesh.publish("set_storage_config",["set_new_key",self.new_key])\r
+\r
+        def get_new_key_cb(self, event, msg):\r
+            # print("get_new_key_cb",self.new_key)\r
+            return self.new_key\r
+        \r
+        def set_new_pid_cb(self, event, msg): \r
+            self.new_pid = msg\r
+            # print("set_new_pid_cb",msg,self.new_pid)\r
+            EventMesh.publish("set_storage_config",["set_new_pid",self.new_pid])\r
+\r
+        def get_new_pid_cb(self, event, msg):\r
+            # print("get_new_pid_cb",self.new_pid)\r
+            return self.new_pid\r
+\r
+        def set_new_ip_com(self, event, msg): \r
+            self.newip = str(msg[0])\r
+            self.newcom = int(msg[1])\r
+            # self.newmd5 = str(msg[2])\r
+            #短信格式:SETIP:api.xcloudtech.com:9000:bZld0ALsZTt15tKEZhOlLPgbsO75BLTP 以冒号分隔 SETIP:ip地址:ip端口号:ip密钥key\r
+\r
+            # self.read_data["set_new_md5"] = self.newmd5  #通过短信设置ip的key密钥\r
+        \r
+\r
+            EventMesh.publish("set_storage_config",["set_new_ip_addr",self.newip])\r
+            EventMesh.publish("set_storage_config",["set_new_com",self.newcom])\r
+\r
+\r
+            number = str(msg[2])\r
+            sms.sendPduMsg(number, 'set ok', 'UCS2')\r
+            self.timer.start(10*1000,0,self.fun)\r
+            \r
+        def fun(self,*argc):\r
+            Power.powerRestart()\r
+\r
+        def get_new_ip_com(self, event, msg):\r
+            tmp_addr = EventMesh.publish("get_storage_config","set_new_ip_addr")\r
+            tmp_com = EventMesh.publish("get_storage_config","set_new_com")\r
+            if tmp_addr != None:\r
+                self.newip = tmp_addr\r
+            if tmp_com != None:\r
+                self.newcom = tmp_com\r
+            return [self.newip,self.newcom]\r
+        \r
+        def set_ip(self, event, msg): \r
+            self.newip = msg\r
+            EventMesh.publish("set_storage_config",["set_new_ip_addr",self.newip])\r
+\r
+        def get_ip(self, event, msg):\r
+            # print("get_ip",self.newip)\r
+            return self.newip\r
+        \r
+        def set_com(self, event, msg): \r
+            self.newcom = msg\r
+            EventMesh.publish("set_storage_config",["set_new_com",self.newcom])\r
+\r
+        def get_com(self, event, msg):\r
+            # print("get_com",self.newcom)\r
+            return self.newcom\r
+\r
+        def get_new_key_pid(self, event, msg):\r
+            return [self.new_key,self.new_pid]\r
+        \r
+        def set_server_state(self, event, msg):\r
+            EventMesh.publish("set_storage_config",["get_server_sate",msg])\r
+            self.server_sate = msg\r
+\r
+        def get_server_state(self, event, msg):\r
+            return self.server_sate\r
+            \r
+\r
+    # MMI Version:UIX8910_C55_DS_D12G_PRO18_FZD_V1.0_Release\r
+    # Build:07-07-2022 16:12:58\r
+    # IMEI:861218001025267\r
+    # IP:api.xcloudtech.com\r
+    # PORT:9000\r
+    # UPLOAD:300\r
+    # Battery:3948, 64\r
+    # Udebug: 0\r
+    # ConnectTime: 7\r
+    import protocol\r
+\r
+    class sendDevinfoManager(Abstract):#发送设备信息\r
+        def __init__(self):\r
+            self.timer = osTimer()\r
+            pass\r
+\r
+        def post_processor_after_instantiation(self):\r
+            EventMesh.subscribe("send_devinfo_event", self.send_devinfo_event)#删除短信\r
+\r
+        def send_devinfo_event(self, event, msg): \r
+            number = str(msg)\r
+            versions = EventMesh.softversion\r
+            Build = EventMesh.builTime\r
+            IMEI = EventMesh.publish(constants.EVENT.GET_IMEI)\r
+            IP = ""\r
+            new_ip = EventMesh.publish("get_storage_config","set_new_ip_addr")\r
+            new_com = EventMesh.publish("get_storage_config","set_new_com")\r
+            server_data = protocol.server_init()\r
+        \r
+            if new_ip != None:\r
+                if len(new_ip) != 0:\r
+                    IP = new_ip\r
+                else:\r
+                    IP = server_data[0]\r
+            else:\r
+                IP = server_data[0]\r
+            \r
+            PORT = ""\r
+            if new_com != None:\r
+                if len(str(new_com)) != 0:\r
+                    PORT = str(new_com)\r
+                else:\r
+                    PORT = str(server_data[1])\r
+            else:\r
+                PORT = str(server_data[1])\r
+            \r
+            UPLOAD = EventMesh.publish("get_upload_data")\r
+\r
+            level = EventMesh.publish("get_curr_battery_level")\r
+            if level == None:\r
+                level = 4200\r
+            bat = EventMesh.publish("screen_get_battery")[1]\r
+            if bat == None:\r
+                bat = 100\r
+            Battery = str(level) +',' +  str(bat)\r
+\r
+            ConnectTime = heartbeat_time//60\r
+            data1 = "Version:{}\nBuild:{}".format(versions,Build)\r
+\r
+            data2 = "IMEI:{}\nIP:{}\nPORT:{}".format(IMEI,IP,PORT)\r
+            \r
+            data3 = "UPLOAD:{}\nBattery:{}\nConnectTime:{}".format(UPLOAD,Battery,ConnectTime)\r
+\r
+            send_state1 = -1\r
+            send_state2 = -1\r
+            # print("data",data1,data2,data3)\r
+            send_state1 = sms.sendPduMsg(number, data1, 'UCS2')\r
+\r
+            if send_state1 == 0:\r
+                send_state2 = sms.sendPduMsg(number, data2, 'UCS2')\r
+\r
+            if send_state2 == 0:\r
+                sms.sendPduMsg(number, data3, 'UCS2')\r
+            \r
+\r
+    class deleteSmsManager(Abstract):#删除信息\r
+        def __init__(self):\r
+            self.timer = osTimer()\r
+            pass\r
+\r
+        def post_processor_after_instantiation(self):\r
+            EventMesh.subscribe("delete_sms_event", self.delete_sms_event)#删除短信\r
+            EventMesh.subscribe("remove_all_sms_cb", self.remove_all_sms_cb)#\r
+\r
+        def delete_sms_event(self, event, msg): \r
+            self.timer.start(4*1000,0,self.fun)\r
+            \r
+        def fun(self, *argc): \r
+            EventMesh.publish_async("remove_all_sms_cb","",1*1024)\r
+\r
+        def remove_all_sms_cb(self, event, msg):\r
+            sms.deleteMsg(1,4)\r
+\r
+    #闹钟信息\r
+    alarm_list = [{'hour': 6, 'repeart': 10, 'idx': 0, 'enabled': 1, 'days': [0,1,2,3,4,5,6], 'minute': 0},\r
+                {'hour': 0, 'repeart': 10, 'idx': 1, 'enabled': 1, 'days': [0,1,2,3,4,5,6], 'minute': 0}]\r
+    #用于显示闹钟列表不包含开关机信息\r
+\r
+    class ClockManager(Abstract):\r
+        def __init__(self):\r
+            super().__init__()\r
+            self.rtc = RTC()\r
+            self.days = 0\r
+            self.idx = 0\r
+\r
+            IFEXIST = ql_fs.path_exists("/usr/static/storage_file/alarm_msg.json") \r
+            self.check_alarm_list = []     \r
+            if IFEXIST == True:\r
+                with open("/usr/static/storage_file/alarm_msg.json","r",encoding='utf-8') as fd:\r
+                    self.check_alarm_list = ujson.load(fd)\r
+            \r
+            EventMesh.subscribe("push_clock_info", self.set)\r
+            EventMesh.subscribe("read_alarminjson", self.read_alarminjson)\r
+            EventMesh.subscribe("add_alarm", self.add_alarm)\r
+            EventMesh.subscribe("remove_alarm", self.remove_alarm)\r
+            EventMesh.subscribe("set_rtc_alarm", self.set_rtc_alarm)\r
+            EventMesh.subscribe("get_alarm_indx", self.get_alarm_indx)\r
+            EventMesh.subscribe("get_check_alarm_list", self.get_check_alarm_list)\r
+            EventMesh.subscribe("push_update_alarm_show", self.update_show_info)\r
+\r
+        def post_processor_after_instantiation(self):\r
+        \r
+            EventMesh.publish("read_alarminjson")\r
+            # EventMesh.publish("set_rtc_alarm")\r
+        \r
+        def update_show_info(self,event,msg):\r
+            EventMesh.publish("read_alarminjson")\r
+            # EventMesh.publish("set_rtc_alarm")\r
+\r
+        def get_check_alarm_list(self, event, msg):\r
+            alarm_len = 0\r
+            global alarm_list\r
+            EventMesh.publish("read_alarminjson")\r
+            alarm_len = len(alarm_list)\r
+            return alarm_len\r
+\r
+\r
+        def set(self, event, msg):\r
+            global alarm_list\r
+            EventMesh.debug_log("msg = {}".format(msg))\r
+            idx = msg.get("idx")\r
+            EventMesh.debug_log("修改第{}个闹钟信息{}".format(idx,alarm_list[idx]))\r
+            alarm_list[idx]["hour"] = msg["hour"]\r
+            alarm_list[idx]["minute"] = msg["minute"]\r
+            alarm_list[idx]["days"] = msg["days"]\r
+            alarm_list[idx]["enabled"] = msg["enabled"]\r
+            alarm_list[idx]["repeart"] = msg["repeart"]\r
+            with open("/usr/static/storage_file/alarm_msg.json", 'w+',encoding='utf-8') as fd:\r
+                ujson.dump(alarm_list,fd)\r
+\r
+        def read_alarminjson(self, event, msg):\r
+            IFEXIST = ql_fs.path_exists("/usr/static/storage_file/alarm_msg.json") \r
+            global alarm_list     \r
+            EventMesh.debug_log("IFEXIST:{}".format(IFEXIST))\r
+            if IFEXIST == True:\r
+                with open("/usr/static/storage_file/alarm_msg.json","r",encoding='utf-8') as fd:\r
+                    alarm_list = ujson.load(fd)\r
+\r
+            \r
+            # read_data = EventMesh.publish("get_storage_config","off_on")\r
+\r
+            hour1 = str(alarm_list[0]["hour"])+':'+str(alarm_list[0]["minute"])\r
+            # min1 = str(alarm_list[0]["minute"])\r
+\r
+            hour2 = str(alarm_list[1]["hour"])+':'+str(alarm_list[1]["minute"])\r
+            # min2 = str(alarm_list[1]["minute"]) \r
+            # EventMesh.publish("set_boot_off_time",[1,hour1,hour2])\r
+\r
+            EventMesh.debug_log("hour1:{}-{}".format(hour1,hour2))\r
+\r
+            \r
+            return alarm_list\r
+\r
+        def add_alarm(self, event, msg):\r
+\r
+            global alarm_list\r
+            EventMesh.publish("read_alarminjson")\r
+            EventMesh.debug_log("msg:{}".format(msg))\r
+            for i in range(0,2):#开关机固定是 idx 0 1\r
+                off_msg1 = msg[i+1]\r
+                msg_tmp1 = off_msg1.split(':')\r
+                start_hour = int(msg_tmp1[0])\r
+                start_min = int(msg_tmp1[1])\r
+                enable = int(msg[0])\r
+                EventMesh.debug_log("start_hour:{} start_min:{} enable:{}",start_hour,start_min,enable)\r
+                # EventMesh.publish("set_boot_off_time",[msg[0],msg[1],msg[2]])\r
+\r
+                alarm_list[i]["idx"]=i\r
+                alarm_list[i]["hour"]=start_hour\r
+                alarm_list[i]["minute"]=start_min\r
+                alarm_list[i]["days"]=[0,1,2,3,4,5,6]\r
+                alarm_list[i]["enabled"]=enable\r
+                alarm_list[i]["repeart"]=10\r
+\r
+\r
+                # alarm_list.append({"idx": i, "hour": start_hour, "minute": start_min, "days":[0,1,2,3,4,5,6], "enabled": enable,"repeart":10})\r
+\r
+            \r
+            # EventMesh.debug_log("alarm_list----len- :{} alarm_list:{}".format(len(alarm_list),alarm_list))\r
+            with open("/usr/static/storage_file/alarm_msg.json", 'w+',encoding='utf-8') as fd:\r
+                ujson.dump(alarm_list,fd)\r
+            EventMesh.publish("push_update_alarm_show")\r
+            \r
+        \r
+                \r
+            \r
+\r
+\r
+        def remove_alarm(self, event, msg):\r
+            global alarm_list\r
+            EventMesh.debug_log("ddddddddddddddddddd:",msg)\r
+            idx = msg.get("idx")\r
+            EventMesh.debug_log("delete_here1-----{},{}:".format(idx,msg))\r
+\r
+            for i, alarm in enumerate(alarm_list):\r
+                EventMesh.debug_log("delete_here2-----{},{}:".format(i,alarm))\r
+\r
+                if alarm["idx"] == idx:\r
+                    del alarm_list[i]\r
+                    EventMesh.debug_log("delete_here3-----",alarm_list)\r
+\r
+                    #删除闹钟后,对idx重新排序\r
+                    if alarm_list:\r
+                        for j in range(i,len(alarm_list)):\r
+                            alarm_list[j]["idx"] -= 1\r
+                            EventMesh.debug_log("delete_here4-----",alarm_list)\r
+\r
+            with open("/usr/static/storage_file/alarm_msg.json", 'w+',encoding='utf-8') as fd:\r
+                ujson.dump(alarm_list,fd)\r
+\r
+\r
+        def get_alarm_indx(self,event,msg):\r
+            return self.idx\r
+\r
+        def _rtc_callback(self,args):\r
+            #设置下一个闹钟,定时开关机功能\r
+            msg_data = EventMesh.publish("get_boot_off_time")\r
+            if msg_data != None:\r
+                power_offdata = msg_data[0]\r
+                start_hour = int(power_offdata["start_hour"])\r
+                start_min = int(power_offdata["start_min"])\r
+                end_hour = int(power_offdata["end_hour"])\r
+                end_min = int(power_offdata["end_min"])\r
+                off_on = int(power_offdata["poweroff_on"])\r
+\r
+                rtc_now_time = self.rtc.datetime()\r
+                current_minute = rtc_now_time[4]*60 + rtc_now_time[5]\r
+                end_min_total = end_hour*60+end_min\r
+                next_minute = start_hour*60+start_min #10:11\r
+                EventMesh.debug_log("off_on:{} {} {}".format(off_on,current_minute,next_minute))\r
+                if off_on != None:\r
+                    if off_on == 1:\r
+                        if end_min_total == current_minute:#结束的时间分钟等于关机时间分钟数则关机\r
+                            ubs_state = EventMesh.publish("get_usb")#'\r
+                            \r
+                            if ubs_state == 2 or ubs_state == 0:\r
+\r
+                                if next_minute > current_minute:#开机时间大于当前时间 9:00 > = 8:00 \r
+                                    interval_minute = next_minute - current_minute\r
+                                    \r
+                                    EventMesh.debug_log("开机距离下一次响铃的的分钟数:", interval_minute,next_minute)\r
+                                else:#8:00 9:00\r
+                                    #7*60*24 7天一个周期 7*60*24 - \r
+                                    interval_minute = next_minute + (24*60-current_minute)\r
+                                    EventMesh.debug_log("开机08888距离下一次响铃的的分钟数:", interval_minute,next_minute)\r
+\r
+                                #反向获取时间戳\r
+                                time = utime.localtime()\r
+                                EventMesh.debug_log("开机9获取utime的时间戳:", time)\r
+                                rtc_mktime = utime.mktime(time)-time[5]\r
+                                EventMesh.debug_log("开机10反向获取utime的mktime:", rtc_mktime)\r
+\r
+                                #加上下一次响铃需要的时间\r
+                                next_alarm_mktime = rtc_mktime + interval_minute*60 #转换成s单位 时间戳\r
+                                EventMesh.debug_log("开机11下一次响铃的mktime:", next_alarm_mktime)\r
+\r
+                                #格式化时间戳,得到下一次闹钟的时间\r
+                                next_alarm_time = utime.localtime(next_alarm_mktime)\r
+                                EventMesh.debug_log("开机12下一次响铃的准确时间:", next_alarm_time)\r
+                                #将时间转换为rtc的格式\r
+                                data_l = [2021, 7, 9, 5, 12, 30, 0, 0]\r
+                                #给rtc时间赋值\r
+                                data_l[0] = next_alarm_time[0] #year\r
+                                data_l[1] = next_alarm_time[1] #month                    \r
+                                data_l[2] = next_alarm_time[2] #day                     \r
+                                data_l[4] = next_alarm_time[3] #hour               \r
+                                data_l[5] = next_alarm_time[4] #minute   \r
+                                data_e=tuple(data_l)\r
+                                EventMesh.debug_log("开机13将该时间转换为RTC元组:", data_e)\r
+                                \r
+                                self.rtc.register_callback(self._rtc_callback)\r
+\r
+                                FLAG = self.rtc.set_alarm(data_e)\r
+                                if FLAG == 0:\r
+                                    EventMesh.debug_log("开机11成功设置rtc的到期时间:", data_e)\r
+                                else:\r
+                                    EventMesh.debug_log("开机时设置rtc的到期时间失败:", data_e)\r
+                                self.rtc.enable_alarm(1)\r
+                                \r
+                                EventMesh.debug_log("结束时设置rtc的到期时间失败:", data_e)\r
+                                EventMesh.publish("open_power_on", 5)#静音关机\r
+                                return\r
+                            else:\r
+                                EventMesh.publish("set_rtc_alarm")\r
+                                #self.rtc.datetime([2023, 12, 1, 5, 5, 59, 30, 0])\r
+                                return\r
+                \r
+            EventMesh.publish("set_rtc_alarm")\r
+\r
+\r
+        def set_rtc_alarm(self,event,msg):\r
+            msg_data = EventMesh.publish("get_boot_off_time")\r
+            if msg_data != None:\r
+                power_offdata = msg_data[0]\r
+                start_hour = int(power_offdata["start_hour"])\r
+                start_min = int(power_offdata["start_min"])\r
+                end_hour = int(power_offdata["end_hour"])\r
+                end_min = int(power_offdata["end_min"])\r
+                off_on = int(power_offdata["poweroff_on"])\r
+                if off_on == 1:\r
+                    next_minute = start_hour*60+start_min #10:11\r
+\r
+                    start_total = start_hour*60+start_min #10:11\r
+                    end_total = end_hour*60+end_min #10:11\r
+                    rtc_now_time = self.rtc.datetime()\r
+                    current_minute = rtc_now_time[4]*60 + rtc_now_time[5]#当前时间\r
+\r
+\r
+                    minute_list = []\r
+                    if start_total != current_minute:\r
+                        minute_list.append(start_total)#23*60=\r
+                    if end_total != current_minute:\r
+                        minute_list.append(end_total)\r
+                    minute_list.append(current_minute)#[927,927,930]\r
+                    minute_list = sorted(minute_list)\r
+                    current_index = minute_list.index(current_minute)\r
+                    print("minute_list",minute_list,start_total,end_total,current_index,power_offdata)\r
+                    \r
+                    \r
+                    next_index = current_index + 1\r
+                    if next_index >= len(minute_list):\r
+                        next_minute = minute_list[0]\r
+                        print("07下一个闹钟的分钟数:", next_minute)\r
+                    else:\r
+                        next_minute = minute_list[next_index]\r
+                        print("08下一个闹钟的分钟数:", next_minute)\r
+\r
+                    print("minute_list1",minute_list,current_index,next_minute)\r
+                    if next_minute > current_minute:\r
+                        interval_minute = next_minute - current_minute\r
+                        print("09距离下一次响铃的的分钟数:", interval_minute)#14 31 14 29 14 31 24*60-\r
+                    else:\r
+                        interval_minute = (24*60 - current_minute) + next_minute\r
+                        print("10距离下一次响铃的的分钟数:", interval_minute)\r
+\r
+\r
+                    #反向获取时间戳\r
+                    time = utime.localtime()\r
+                    EventMesh.debug_log("关机09获取utime的时间戳:", time)\r
+                    time\r
+                    rtc_mktime = utime.mktime(time)-time[5]\r
+                    EventMesh.debug_log("关机10反向获取utime的mktime:", rtc_mktime)\r
+\r
+                    #加上下一次响铃需要的时间\r
+                    next_alarm_mktime = rtc_mktime + interval_minute*60 #转换成s单位 时间戳\r
+                    EventMesh.debug_log("关机11下一次响铃的mktime:", next_alarm_mktime)\r
+\r
+                    #格式化时间戳,得到下一次闹钟的时间\r
+                    next_alarm_time = utime.localtime(next_alarm_mktime)\r
+                    EventMesh.debug_log("关机12下一次响铃的准确时间:", next_alarm_time)\r
+                    #将时间转换为rtc的格式\r
+                    data_l = [2021, 7, 9, 5, 12, 30, 0, 0]\r
+                    #给rtc时间赋值\r
+                    data_l[0] = next_alarm_time[0] #year\r
+                    data_l[1] = next_alarm_time[1] #month                    \r
+                    data_l[2] = next_alarm_time[2] #day                     \r
+                    data_l[4] = next_alarm_time[3] #hour               \r
+                    data_l[5] = next_alarm_time[4] #minute   \r
+                    data_e=tuple(data_l)\r
+                    EventMesh.debug_log("关机13将该时间转换为RTC元组:", data_e)\r
+                    \r
+                    self.rtc.register_callback(self._rtc_callback)\r
+\r
+                    FLAG = self.rtc.set_alarm(data_e)\r
+                    if FLAG == 0:\r
+                        EventMesh.debug_log("关机11成功设置rtc的到期时间:", data_e)\r
+                    else:\r
+                        EventMesh.debug_log("关机时设置rtc的到期时间失败:", data_e)\r
+                    self.rtc.enable_alarm(1)\r
+                else:\r
+                    self.rtc.enable_alarm(0)\r
+                    \r
+\r
+    class schoolclassManager(Abstract):#\r
+        def __init__(self):\r
+            # ['火星情报局', '一年级二班', '柠檬茶']\r
+            self.school_name = ''\r
+            self.class_name = ''\r
+            self.full_name = ''\r
+            tmp_data = EventMesh.publish("get_storage_config","school_name")\r
+            if tmp_data != None:\r
+                self.school_name = tmp_data\r
+            tmp_data = EventMesh.publish("get_storage_config","class_name")\r
+            if tmp_data != None:\r
+                self.class_name = tmp_data\r
+            tmp_data = EventMesh.publish("get_storage_config","full_name")\r
+            if tmp_data != None:\r
+                self.full_name = tmp_data    \r
+\r
+            \r
+\r
+        def post_processor_after_instantiation(self):\r
+            EventMesh.subscribe("set_schoolname", self.set_school_name)#\r
+            EventMesh.subscribe("get_schoolname", self.get_school_name)\r
+\r
+            EventMesh.subscribe("set_classname", self.set_classname)#\r
+            EventMesh.subscribe("get_classname", self.get_classname)\r
+\r
+            EventMesh.subscribe("set_fullname", self.set_full_name)#\r
+            EventMesh.subscribe("get_fullname", self.get_full_name)\r
+\r
+        def set_school_name(self, event, msg): \r
+            if msg != None:\r
+                if len(msg) != 0:\r
+                    self.school_name = str(msg)\r
+                    EventMesh.publish("set_storage_config",["school_name",str(msg)])\r
+            \r
+\r
+        def get_school_name(self, event, msg):\r
+            if self.school_name:\r
+                return self.school_name\r
+            else:\r
+                return None\r
+        \r
+        def set_classname(self, event, msg): \r
+            if msg != None:\r
+                if len(msg) != 0:\r
+                    self.class_name = str(msg)\r
+                    EventMesh.publish("set_storage_config",["class_name",str(msg)])\r
+                \r
+            \r
+        def get_classname(self, event, msg):\r
+            if self.class_name:\r
+                return self.class_name\r
+            else:\r
+                return None\r
+        def set_full_name(self, event, msg): \r
+            if msg != None:\r
+                if len(msg) != 0:\r
+                    self.full_name = str(msg)\r
+                    EventMesh.publish("set_storage_config",["full_name",str(msg)])\r
+\r
+        def get_full_name(self, event, msg):\r
+            if self.full_name:\r
+                return self.full_name\r
+            else:\r
+                return None\r
+            \r
+    \r
+    class vedioInforManager(Abstract):#\r
+        def __init__(self):\r
+            self.call_id = ""\r
+            self.meet_id = ""#会议id\r
+            self.call_type = 0 #会议id\r
+            self.tokens_data= ""#tokens\r
+            self.timer = osTimer()\r
+            self.videobook = {}\r
+            self.check_json = 0\r
+            self.check_json = ql_fs.path_exists("/usr/static/storage_file/videobook.json")\r
+\r
+            if self.check_json == True:\r
+                with open("/usr/static/storage_file/videobook.json","r",encoding="utf-8") as fd:\r
+                    self.videobook = ujson.load(fd)\r
+                    print("读取视频通话账号列表")\r
+            \r
+            self.video_state = 0\r
+            self.video_count = 0\r
+            self.video_state_time = 0\r
+\r
+            self.video_dev_mode = 0\r
+\r
+            self.video_led_state = 0\r
+            self.video_answer = 0\r
+\r
+            self.video_timer = 0\r
+\r
+            self.video_init = 0\r
+            self.video_network_end = 0 #网络不好或者信号较差菊风底层挂断当前视频通话\r
+            self.videoInfo_queue = Queue()\r
+            _thread.stack_size(10*1024)\r
+            _thread.start_new_thread(self.videoInfo_queue_thread, ())\r
+            _thread.stack_size(8*1024)\r
+            EventMesh.subscribe("publish_message_event_videoInfo",self.publish_message_event_videoInfo)\r
+            pass\r
+\r
+        def videoInfo_queue_thread(self):\r
+            while True:\r
+                data = self.videoInfo_queue.get()\r
+                #EventMesh.debug_log("ledInfo_queue:data = {}".format(data))\r
+                if data != None:\r
+                    try:\r
+                        data["func"](data["data"])\r
+                    except Exception as e:\r
+                        EventMesh.debug_log("ledInfo_queue:ERROR:{}".format(e))\r
+                        usys.print_exception(e)\r
+        def publish_message_event_videoInfo(self,event,msg):\r
+            self.videoInfo_queue.put(msg)\r
+\r
+        def publish_led_event_cb(self, *args, **kwargs):\r
+            EventMesh.publish("publish_message_event_videoInfo",{"func":self.video_time_cb,"data":0})\r
+\r
+        def post_processor_after_instantiation(self):\r
+            EventMesh.subscribe("set_vedio_call_id", self.set_vedio_call_id)#\r
+            EventMesh.subscribe("set_vedio_meet_id", self.set_vedio_meet_id)#\r
+            EventMesh.subscribe("set_vedio_call_type", self.set_vedio_call_type)#\r
+            EventMesh.subscribe("set_vedio_tokens_data", self.set_vedio_tokens_data)#\r
+\r
+            EventMesh.subscribe("get_vedio_call_id", self.get_vedio_call_id)#\r
+            EventMesh.subscribe("get_vedio_meet_id", self.get_vedio_meet_id)#\r
+            EventMesh.subscribe("get_vedio_call_type", self.get_vedio_call_type)#\r
+            EventMesh.subscribe("get_vedio_tokens_data", self.get_vedio_tokens_data)#\r
+\r
+\r
+            EventMesh.subscribe("open_vedio_infor",self.open_vedio_infor)\r
+            EventMesh.subscribe("close_jrtc_event",self.close_jrtc_event)\r
+\r
+            EventMesh.subscribe("get_videobook_list", self.get_videobook_list)\r
+            EventMesh.subscribe("set_videobook_list", self.set_videobook_list)\r
+\r
+            EventMesh.subscribe("set_video_state", self.set_video_state)\r
+            EventMesh.subscribe("get_video_state", self.get_video_state)\r
+\r
+            EventMesh.subscribe("set_dev_app_mode", self.set_dev_app_mode)\r
+            EventMesh.subscribe("get_dev_app_mode", self.get_dev_app_mode)\r
+\r
+            EventMesh.subscribe("close_video_timer",self.close_video_timer)\r
+\r
+            EventMesh.subscribe("call_viode_book_num",self.call_viode_book_num)\r
+\r
+            EventMesh.subscribe("app_rtalk_cb",self.app_rtalk_cb)#app拒绝视频通话\r
+\r
+            EventMesh.subscribe("video_answer_cb",self.video_answer_cb)#接听视频通话\r
+\r
+            EventMesh.subscribe("video_newwork_reject_cb",self.video_newwork_reject_cb)#端挂断视频通话\r
+            EventMesh.subscribe("video_dev_reject_cb",self.video_dev_reject_cb)#手表端挂断视频或者语音通话\r
+\r
+            EventMesh.subscribe("video_no_network",self.video_no_network)#打着突然掉网或者未绑定设备 每10s检测一次\r
+\r
+            EventMesh.subscribe("clear_video_timer_state",self.clear_video_timer_state)\r
+\r
+            EventMesh.subscribe("set_vedio_init",self.set_vedio_init)\r
+            \r
+\r
+            EventMesh.subscribe("set_app_dev_end_state",self.set_app_dev_end_state)#设置是app 设备 还是主动信号不好的挂断当前的视频通话\r
+            EventMesh.subscribe("get_app_dev_end_state",self.get_app_dev_end_state)#设置是app 设备 还是主动信号不好的挂断当前的视频通话\r
+\r
+        def set_video_state(self, event, msg):#视频通话 1是刚播进去 2 是手机拨进去 3是正在加入中 5是已接通出现画面\r
+            self.video_state = msg\r
+\r
+        def get_video_state(self, event, msg):\r
+            return self.video_state\r
+        \r
+        def set_dev_app_mode(self, event, msg):#设置是手表拨 还是手机app拨视频通话 0未拨打 1是手表设备端  2 手机app拨打视频通话\r
+            self.video_dev_mode = msg\r
+\r
+        def get_dev_app_mode(self, event, msg):\r
+            return self.video_dev_mode\r
+        \r
+        def get_videobook_list(self, event, msg):\r
+            self.check_json = ql_fs.path_exists("/usr/static/storage_file/videobook.json")\r
+            return [self.check_json,self.videobook]\r
+        \r
+        def set_videobook_list(self, event, msg):\r
+            print("videolist",msg)\r
+            self.check_json = msg[0]\r
+            self.videobook = msg[1]\r
+\r
+        def call_viode_book_num(self, event, msg):#默认拨打视频通话列表第一个\r
+            self.video_led_state = 0\r
+            self.video_network_end = 0\r
+            EventMesh.publish("clear_video_timer_state")\r
+            if EventMesh.publish(constants.EVENT.GET_CONNECT) == 1:#未联网提示关机\r
+                if len(self.videobook) != 0:#已联网未添加账号\r
+                    phonebook_keys = sorted(self.videobook.keys())\r
+                    name = self.videobook[phonebook_keys[0]]\r
+                    key_tmp = phonebook_keys[0][4:]\r
+                    print("key_tmp list",key_tmp)\r
+                    print("calling",key_tmp)\r
+                    EventMesh.publish("set_vedio_call_id", key_tmp)#\r
+                    EventMesh.publish("set_vedio_call_type", 1)#\r
+                    EventMesh.publish("set_video_state", 1)#\r
+                    EventMesh.publish("set_dev_app_mode", 1)#\r
+                    EventMesh.publish("close_hr_sop2")##在测试心率血氧 血压体温是关闭测试\r
+                    EventMesh.publish("video_call_out_cb",1)#视频通话拨进中\r
+                    EventMesh.publish(constants.PROTOCOL.AGTALK_SEND,[1,key_tmp])\r
+                else:\r
+                    EventMesh.publish("video_call_out_cb",None)#视频通话拨进中\r
+                    print("no video list")\r
+                    pass\r
+            else:\r
+                EventMesh.publish("set_sim_mode")#\r
+                pass\r
+        \r
+\r
+            \r
+        def set_vedio_call_id(self, event, msg): \r
+            self.call_id = msg\r
+\r
+        def set_vedio_meet_id(self, event, msg): \r
+            self.meet_id = msg\r
+\r
+        def set_vedio_call_type(self, event, msg): \r
+            self.call_type = msg\r
+\r
+        def set_vedio_tokens_data(self, event, msg): \r
+            self.tokens_data= msg\r
+            \r
+\r
+        def get_vedio_call_id(self, event, msg): \r
+            return self.call_id\r
+        \r
+        def get_vedio_meet_id(self, event, msg): \r
+            return self.meet_id\r
+        \r
+        def get_vedio_call_type(self, event, msg): \r
+            return self.call_type\r
+        \r
+        def get_vedio_tokens_data(self, event, msg): \r
+            return self.tokens_data\r
+\r
+        def set_vedio_init(self, event, msg): \r
+            self.video_init = 0\r
+\r
+        def open_vedio_infor(self,event,msg):\r
+            if self.video_init == 0:\r
+                self.video_init = 1\r
+                EventMesh.publish(constants.EVENT.SYSTEM_UP)#唤醒休眠\r
+                call_id = EventMesh.publish("get_vedio_call_id")#对方的账号\r
+                meet_id = EventMesh.publish("get_vedio_meet_id")#共有的会议id\r
+                call_type = EventMesh.publish("get_vedio_call_type")#呼叫类型\r
+                tokens_data = EventMesh.publish("get_vedio_tokens_data")#tookens数据#云米平台不需要tokens\r
+            \r
+\r
+\r
+                \r
+                uid = str(call_id)\r
+                ticket = str(meet_id)\r
+\r
+                # data = ['6951832', '876226002021444', '1', '01lqlyqzQ4Gozdz8OJv1Mij2Y3PBq2y3+rtIA26Ge+m2QHTc/Vk=gufkGNMBiYhPjbq1tLCwtLKysLKws7a2tg==']\r
+\r
+                tokens = str(tokens_data)\r
+                appkey = "efe9f8800a39d96244234097"#\r
+                uid_key = "25v9C652123QL3N8"\r
+\r
+                # appkey = "249e7d505516af0a7ed44097"\r
+                # uid_key = "qQI4gkB9FxH8J2cb"\r
+                imei = EventMesh.publish(constants.EVENT.GET_IMEI)\r
+                oneself_id = str(imei)#自己的账号默认是imei号\r
+\r
+            \r
+                \r
+                print("uid ",uid,ticket,oneself_id)\r
+\r
+                \r
+                self.video_count = 0\r
+                self.video_state_time = 0\r
+                self.video_led_state = 0\r
+                self.video_answer = 0\r
+                self.video_timer = 0\r
+                self.timer.start(1*1000,1,self.publish_led_event_cb)\r
+            \r
+\r
+        def video_time_cb(self,data):#1s定时器 实时监测视频通话的状态 3是拨进未接通 5是接通出画面了\r
+            EventMesh.publish("system_sleep_rest")#防止黑屏 \r
+            call_state = 1\r
+            video_state = EventMesh.publish("get_video_state")#这个函数获取为了防止不进回调不置0\r
+            get_video_state = EventMesh.publish("get_video_in_out_state")\r
+            dev_mode = EventMesh.publish("get_dev_app_mode")\r
+            if self.video_led_state == 1 or self.video_timer == 1:#手表挂断不在进入\r
+                self.timer.stop()\r
+                return\r
+\r
+            if video_state != 0 or call_state != 0:\r
+                if get_video_state == 0 and call_state != 0:#双方接通如果是信号不好就开始计算30 30s过后还没有出画面就挂断当前视频通话\r
+                    self.video_count+=1\r
+                    if self.video_count > 30:\r
+                        if call_state != 5:\r
+                            self.video_state = 0\r
+                            self.video_state_time = 0\r
+                            self.timer.stop()\r
+                            EventMesh.publish("video_newwork_reject_cb",5)#挂断视频通话\r
+                            return\r
+\r
+                if call_state == 5:#已经接通出画面了\r
+                    self.video_count = 0\r
+                    self.video_answer = 4\r
+                    EventMesh.publish("set_video_in_out_state",0)\r
+                    if self.video_state_time == 0:\r
+                        self.video_state_time = 1\r
+                        EventMesh.publish("stop_led_timer")#设置参数\r
+                        EventMesh.publish("close_timer_all")#\r
+                        EventMesh.publish("video_answer_mode_timer_cb",2)#\r
+\r
+                    EventMesh.publish("set_video_state", 5)\r
+                else:\r
+                    self.video_state_time = 0 \r
+                    if call_state != 0:#信号不好的时候正在接听\r
+                        EventMesh.publish("set_video_state", call_state)\r
+\r
+                        if call_state == 4:\r
+                            EventMesh.publish("stop_led_timer")#设置参数\r
+                            EventMesh.publish("close_timer_all")#\r
+\r
+                        if dev_mode != 0:\r
+                            if get_video_state == 0 and call_state != 4 and self.video_answer == 0:\r
+                                EventMesh.publish("video_answer_mode_timer_cb",3)#\r
+                        \r
+                    if call_state == 0:\r
+                        self.timer.stop()\r
+                        EventMesh.publish("video_newwork_reject_cb",1)\r
+            else:\r
+                self.video_state_time = 0\r
+                self.video_count = 0\r
+                self.timer.stop()\r
+                EventMesh.publish("set_video_state", 0)\r
+                EventMesh.publish("video_newwork_reject_cb",1)\r
+\r
+        def video_waite_event_time_cb(self,*argc):#正在接听中,请稍候\r
+            EventMesh.publish("video_answer_mode_timer_cb",1)\r
+            pass\r
+\r
+        def video_answer_event_time_cb(self,*argc):#对方已接听可以正常视频通话了\r
+            EventMesh.publish("video_answer_mode_timer_cb",2)\r
+            pass\r
+        def video_no_network(self,event,msg):#视频通话无网络\r
+            if EventMesh.publish(constants.EVENT.GET_CONNECT) == 0:#\r
+                if EventMesh.publish("get_video_state") != 0:\r
+                    EventMesh.publish("video_newwork_reject_cb",None)\r
+                pass\r
+\r
+\r
+        def close_video_timer(self,event,msg):\r
+            self.timer.stop()\r
+            pass\r
+        def close_jrtc_event(self,event,msg):\r
+            \r
+            pass\r
+\r
+\r
+        def video_answer_cb(self,event,msg):#手表端拒绝视频通话\r
+            EventMesh.publish("stop_led_timer")#关闭亮灯模式\r
+            EventMesh.publish("close_timer_all")##关闭统一的计时器\r
+            EventMesh.publish("set_video_in_out_state",0)\r
+            EventMesh.publish("open_vedio_infor")#启动视频通话的SDK相关配置\r
+\r
+        \r
+        def clear_video_timer_state(self,event,msg):#清除标识\r
+            self.video_timer = 0\r
+            self.video_network_end = 0\r
+        \r
+        def video_newwork_reject_cb(self,event,msg):#信号不好底层SDK挂断\r
+            if self.video_led_state != 2:#2表示app挂断\r
+                if self.video_network_end == 1:\r
+                    return\r
+                self.video_network_end = 1\r
+                self.video_timer = 1\r
+                self.video_init = 0\r
+                EventMesh.publish("stop_led_timer")#设置参数\r
+                EventMesh.publish("close_timer_all")#\r
+                EventMesh.publish("close_video_timer")\r
+                EventMesh.publish("set_video_state", 0)\r
+                EventMesh.publish("set_dev_app_mode", 0)\r
+                EventMesh.publish("set_video_in_out_state",0)\r
+                call_id = str(EventMesh.publish("get_vedio_call_id"))#\r
+                meet_id = str(EventMesh.publish("get_vedio_meet_id"))#\r
+                call_type = int(EventMesh.publish("get_vedio_call_type"))#\r
+\r
+                \r
+                if self.video_led_state == 0:\r
+                    EventMesh.publish("video_answer_mode_timer_cb",4)#提示对方已挂断\r
+                    EventMesh.publish(constants.PROTOCOL.RCALLING_SEND,[call_id,meet_id,call_type])\r
+\r
+\r
+        def video_dev_reject_cb(self,event,msg):#手表主动挂断\r
+            if self.video_timer == 0:\r
+                self.video_init = 0\r
+                EventMesh.publish("stop_led_timer")#设置参数\r
+                EventMesh.publish("close_timer_all")#\r
+                EventMesh.publish("close_video_timer")\r
+                EventMesh.publish("set_video_state", 0)\r
+                EventMesh.publish("set_dev_app_mode", 0)\r
+                EventMesh.publish("set_video_in_out_state",0)\r
+                call_id = str(EventMesh.publish("get_vedio_call_id"))#\r
+                meet_id = str(EventMesh.publish("get_vedio_meet_id"))#\r
+                call_type = int(EventMesh.publish("get_vedio_call_type"))#\r
+\r
+                self.video_led_state = 1\r
+                self.video_timer = 1\r
+                EventMesh.publish(constants.PROTOCOL.RCALLING_SEND,[call_id,meet_id,call_type])\r
+\r
+\r
+            \r
+        def set_app_dev_end_state(self,event,msg):#app拒绝视频通话\r
+            self.video_led_state = 0 #手表挂断不在进入\r
+\r
+        def get_app_dev_end_state(self,event,msg):#app拒绝视频通话\r
+            return self.video_led_state #手表挂断不在进入\r
+\r
+        def app_rtalk_cb(self,event,msg):#app拒绝视频通话\r
+            dev_mode = EventMesh.publish("get_dev_app_mode")#如果是app主动挂断需要提示音频文件\r
+            video_state = EventMesh.publish("get_video_state")#清除视频通话状态\r
+            if self.video_led_state != 0 or self.video_timer != 0:#手表挂断不在进入\r
+                return\r
+            \r
+            self.video_init = 0\r
+            self.video_timer = 1\r
+            self.video_led_state = 2\r
+            EventMesh.publish(constants.EVENT.SYSTEM_UP)#\r
+\r
+            EventMesh.publish("stop_led_timer")#设置参数\r
+            EventMesh.publish("close_timer_all")#\r
+            EventMesh.publish("close_video_timer")\r
+            EventMesh.publish("set_dev_app_mode", 0)\r
+            EventMesh.publish("set_video_state",0)#清除视频通话状态\r
+            EventMesh.publish("set_video_in_out_state",0)#清除视频通话拨进还是拨出的状态\r
+            EventMesh.publish("video_answer_mode_timer_cb",4)##提示对方已挂断\r
+\r
+\r
+    def jrtc_cb(close_sta):#注册回调\r
+        print("jrtc callback:", close_sta)\r
+        if close_sta == 0 or close_sta == 1:\r
+            EventMesh.publish("set_video_state", 0)\r
+            EventMesh.publish("set_video_in_out_state",0)\r
+            EventMesh.publish("set_vedio_init")\r
+\r
+\r
+\r
+    import fota\r
+    class firwDownloadManager(Abstract):#\r
+        def __init__(self):\r
+            self.timer = osTimer()\r
+\r
+\r
+        def post_processor_after_instantiation(self):\r
+            EventMesh.subscribe("firware_download", self.firware_download)#\r
+\r
+        def firware_download(self, event, msg): \r
+            number = str(msg)\r
+            sms.sendPduMsg(number, 'set ok', 'UCS2')\r
+            self.timer.start(10*1000,0,self.fun)\r
+\r
+        def fun(self,*argc):\r
+            fota_obj = fota()\r
+            fota_obj.httpDownload(url1="http://u-oss.thisiot.com/test/dfota_1.bin",url2="http://u-oss.thisiot.com/test/dfota_2.bin")\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
index 126ed5c..d79939f 100644 (file)
-from common import Abstract
-import osTimer
-import EventMesh
-from machine import Pin
-import utime
-
-from queue import Queue
-import _thread
-import usys
-
-
-motor_pin = Pin(Pin.GPIO36, Pin.OUT, Pin.PULL_PD, 0)
-def open_motor():#开马达
-    motor_pin.write(1)
-
-def close_motor():#关闭马达
-    motor_pin.write(0)
-
-
-
-MOTOR_TIME = 100
-class motorEventManager(Abstract):#马达事件
-    def __init__(self):
-        self.motor_timer = osTimer()
-        self.motorInfo_queue = Queue()
-        self.motor_enable = 0#马达使能
-        self.motor_total_time = 0#总的时间
-        self.motor_open_time = 0 #开马达事件
-        self.motor_close_time = 0#关马达事件100ms
-        self.motor_count = 0
-        self.motor_count_tmp = 0
-        self.motor_mode = 0#模式
-        _thread.start_new_thread(self.motorInfo_queue_thread, ())
-        EventMesh.subscribe("publish_message_event_motorInfo",self.publish_message_event_motorInfo)
-        EventMesh.subscribe("set_motor_time", self.set_motor_time)#设置参数
-        EventMesh.subscribe("close_motor_infor", self.close_motor_infor)#关闭马达和定时器
-        EventMesh.subscribe("get_motor_enable", self.get_motor_enable)#关闭马达和定时器
-        pass
-    def get_motor_enable(self,event=None,msg=None):
-        return self.motor_enable
-
-    def motorInfo_queue_thread(self):
-        while True:
-            data = self.motorInfo_queue.get()
-            #print("ledInfo_queue:data = {}".format(data))
-            if data != None:
-                try:
-                    data["func"](data["data"])
-                except Exception as e:
-                    print("ledInfo_queue:ERROR:{}".format(e))
-                    usys.print_exception(e)
-    def publish_message_event_motorInfo(self,event,msg):
-        self.motorInfo_queue.put(msg)
-
-    def publish_motor_event_cb(self, *args, **kwargs):
-        EventMesh.publish("publish_message_event_motorInfo",{"func":self.motor_fun_cb,"data":0})  
-        
-    def post_processor_after_instantiation(self):
-        pass
-
-    # msg 0马达使能 1 马达振动时间100ms单位 2 震动次数 3 间隔时间振动 4 是否需要长振 5 长振时间  6间隔时间长振 7长振次数1一次 要为200ms的倍数
-    def set_motor_time(self,event,msg):
-        if msg != None:
-            self.motor_enable = msg[0]
-            if self.motor_enable == 1: #马达使能
-                self.motor_mode = msg [1]
-                self.motor_total_time = msg[2]#总的时间
-                self.motor_open_time = msg[3] #开马达事件
-                self.motor_close_time = msg[4]#关马达事件100ms
-                self.motor_total_time_tmp=self.motor_total_time
-                if len(msg) <= 5:
-                    self.motor_count = 0
-                else:
-                    self.motor_count = msg[5]
-
-                self.motor_timer.stop()
-                print("motor msg:{} len:{} self.motor_count:{}".format(msg,len(msg),self.motor_count))
-                close_motor()
-                self.motor_timer.start(MOTOR_TIME,1,self.publish_motor_event_cb)
-
-    def motor_fun_cb(self, data):
-        if self.motor_mode == 0 or self.motor_enable == 0:
-            close_motor()
-            EventMesh.publish("close_motor_infor")#关闭马达和定时器
-            return
-        if self.motor_mode == 1:# 持续振动时间100单位 长振
-            if self.motor_count == 0:
-                self.motor_total_time-=1
-                if self.motor_total_time > 0:
-                    open_motor()
-                else:
-                    close_motor()
-                    EventMesh.publish("close_motor_infor")#关闭马达和定时器
-                    return
-            else:
-                if self.motor_count_tmp > self.motor_count:
-                    close_motor()
-                    EventMesh.publish("close_motor_infor")#关闭马达和定时器
-                    return
-                self.motor_total_time_tmp-=1
-                if self.motor_total_time_tmp > 0:
-                    open_motor()
-                else:
-                    close_motor()
-                    self.motor_total_time_tmp=self.motor_total_time
-                    self.motor_count_tmp+=1
-                    
-                    pass
-        elif self.motor_mode == 2:# 间隔振动
-            # print("self.motor_count",self.motor_count,self.motor_open_time,self.motor_close_time,self.motor_total_time)
-            if self.motor_count % (self.motor_open_time) < self.motor_close_time: # 4 4 2 1%4 = 1 2%4 = 2 3%4 = 3
-                open_motor()
-            else:
-                close_motor()
-            if self.motor_count >= self.motor_total_time-1:
-                close_motor()
-                EventMesh.publish("close_motor_infor")#关闭马达和定时器
-                return
-            self.motor_count+=1
-
-    def close_motor_infor(self,event,msg):
-        print("close_motor_infor!!!")
-        close_motor()
-        self.motor_enable = 0#马达使能
-        self.motor_total_time = 0#总的时间
-        self.motor_open_time = 0 #开马达事件
-        self.motor_close_time = 0#关马达事件100ms
-        self.motor_count = 0
-        self.motor_mode = 0#模式
-        self.motor_timer.stop()
-
-
-
+from common import Abstract\r
+import osTimer\r
+import EventMesh\r
+from machine import Pin\r
+import utime\r
+\r
+from queue import Queue\r
+import _thread\r
+import usys\r
+\r
+\r
+motor_pin = Pin(Pin.GPIO36, Pin.OUT, Pin.PULL_PD, 0)\r
+def open_motor():#开马达\r
+    motor_pin.write(1)\r
+\r
+def close_motor():#关闭马达\r
+    motor_pin.write(0)\r
+\r
+\r
+\r
+MOTOR_TIME = 100\r
+class motorEventManager(Abstract):#马达事件\r
+    def __init__(self):\r
+        self.motor_timer = osTimer()\r
+        self.motorInfo_queue = Queue()\r
+        self.motor_enable = 0#马达使能\r
+        self.motor_total_time = 0#总的时间\r
+        self.motor_open_time = 0 #开马达事件\r
+        self.motor_close_time = 0#关马达事件100ms\r
+        self.motor_count = 0\r
+        self.motor_count_tmp = 0\r
+        self.motor_mode = 0#模式\r
+        _thread.start_new_thread(self.motorInfo_queue_thread, ())\r
+        EventMesh.subscribe("publish_message_event_motorInfo",self.publish_message_event_motorInfo)\r
+        EventMesh.subscribe("set_motor_time", self.set_motor_time)#设置参数\r
+        EventMesh.subscribe("close_motor_infor", self.close_motor_infor)#关闭马达和定时器\r
+        EventMesh.subscribe("get_motor_enable", self.get_motor_enable)#关闭马达和定时器\r
+        pass\r
+    def get_motor_enable(self,event=None,msg=None):\r
+        return self.motor_enable\r
+\r
+    def motorInfo_queue_thread(self):\r
+        while True:\r
+            data = self.motorInfo_queue.get()\r
+            #print("ledInfo_queue:data = {}".format(data))\r
+            if data != None:\r
+                try:\r
+                    data["func"](data["data"])\r
+                except Exception as e:\r
+                    print("ledInfo_queue:ERROR:{}".format(e))\r
+                    usys.print_exception(e)\r
+    def publish_message_event_motorInfo(self,event,msg):\r
+        self.motorInfo_queue.put(msg)\r
+\r
+    def publish_motor_event_cb(self, *args, **kwargs):\r
+        EventMesh.publish("publish_message_event_motorInfo",{"func":self.motor_fun_cb,"data":0})  \r
+        \r
+    def post_processor_after_instantiation(self):\r
+        pass\r
+\r
+    # msg 0马达使能 1 马达振动时间100ms单位 2 震动次数 3 间隔时间振动 4 是否需要长振 5 长振时间  6间隔时间长振 7长振次数1一次 要为200ms的倍数\r
+    def set_motor_time(self,event,msg):\r
+        if msg != None:\r
+            self.motor_enable = msg[0]\r
+            if self.motor_enable == 1: #马达使能\r
+                self.motor_mode = msg [1]\r
+                self.motor_total_time = msg[2]#总的时间\r
+                self.motor_open_time = msg[3] #开马达事件\r
+                self.motor_close_time = msg[4]#关马达事件100ms\r
+                self.motor_total_time_tmp=self.motor_total_time\r
+                if len(msg) <= 5:\r
+                    self.motor_count = 0\r
+                else:\r
+                    self.motor_count = msg[5]\r
+\r
+                self.motor_timer.stop()\r
+                print("motor msg:{} len:{} self.motor_count:{}".format(msg,len(msg),self.motor_count))\r
+                close_motor()\r
+                self.motor_timer.start(MOTOR_TIME,1,self.publish_motor_event_cb)\r
+\r
+    def motor_fun_cb(self, data):\r
+        if self.motor_mode == 0 or self.motor_enable == 0:\r
+            close_motor()\r
+            EventMesh.publish("close_motor_infor")#关闭马达和定时器\r
+            return\r
+        if self.motor_mode == 1:# 持续振动时间100单位 长振\r
+            if self.motor_count == 0:\r
+                self.motor_total_time-=1\r
+                if self.motor_total_time > 0:\r
+                    open_motor()\r
+                else:\r
+                    close_motor()\r
+                    EventMesh.publish("close_motor_infor")#关闭马达和定时器\r
+                    return\r
+            else:\r
+                if self.motor_count_tmp > self.motor_count:\r
+                    close_motor()\r
+                    EventMesh.publish("close_motor_infor")#关闭马达和定时器\r
+                    return\r
+                self.motor_total_time_tmp-=1\r
+                if self.motor_total_time_tmp > 0:\r
+                    open_motor()\r
+                else:\r
+                    close_motor()\r
+                    self.motor_total_time_tmp=self.motor_total_time\r
+                    self.motor_count_tmp+=1\r
+                    \r
+                    pass\r
+        elif self.motor_mode == 2:# 间隔振动\r
+            # print("self.motor_count",self.motor_count,self.motor_open_time,self.motor_close_time,self.motor_total_time)\r
+            if self.motor_count % (self.motor_open_time) < self.motor_close_time: # 4 4 2 1%4 = 1 2%4 = 2 3%4 = 3\r
+                open_motor()\r
+            else:\r
+                close_motor()\r
+            if self.motor_count >= self.motor_total_time-1:\r
+                close_motor()\r
+                EventMesh.publish("close_motor_infor")#关闭马达和定时器\r
+                return\r
+            self.motor_count+=1\r
+\r
+    def close_motor_infor(self,event,msg):\r
+        print("close_motor_infor!!!")\r
+        close_motor()\r
+        self.motor_enable = 0#马达使能\r
+        self.motor_total_time = 0#总的时间\r
+        self.motor_open_time = 0 #开马达事件\r
+        self.motor_close_time = 0#关马达事件100ms\r
+        self.motor_count = 0\r
+        self.motor_mode = 0#模式\r
+        self.motor_timer.stop()\r
+\r
+\r
+\r
index edbbd1b..4dca607 100644 (file)
@@ -1,35 +1,35 @@
-# -*- coding: UTF-8 -*-
-import audio
-from machine import Pin
-import utime
-import uos
-
-def audio_cb(event):
-    if event == 0:
-        print('audio-play start.')
-    elif event == 7:
-        print('audio-play finish.')
-
-aud = audio.Audio(0)
-aud.setCallback(audio_cb)
-
-# 音频流播放
-size = 4*1024 # 保证一次填充的音频数据足够大以便底层连续播放
-format = 3 # 1:PCM RAW;2 :WAVPCM 3mp3
-
-def play_from_fs():
-    file_size = uos.stat("/usr/tesr.mp3")[6]  # 获取文件总字节数
-    print(file_size)
-    with open("/usr/tesr.mp3", "rb")as f:   
-        while 1:
-            b = f.read(size)   # read
-            if not b:
-                break
-            aud.playStream(format, b)
-
-
-play_from_fs()
-# 等待播放完成
-utime.sleep_ms(5000) 
-# 停止本次播放以便不影响下次播放
-aud.stopPlayStream() 
+# -*- coding: UTF-8 -*-\r
+import audio\r
+from machine import Pin\r
+import utime\r
+import uos\r
+\r
+def audio_cb(event):\r
+    if event == 0:\r
+        print('audio-play start.')\r
+    elif event == 7:\r
+        print('audio-play finish.')\r
+\r
+aud = audio.Audio(0)\r
+aud.setCallback(audio_cb)\r
+\r
+# 音频流播放\r
+size = 4*1024 # 保证一次填充的音频数据足够大以便底层连续播放\r
+format = 3 # 1:PCM RAW;2 :WAVPCM 3mp3\r
+\r
+def play_from_fs():\r
+    file_size = uos.stat("/usr/tesr.mp3")[6]  # 获取文件总字节数\r
+    print(file_size)\r
+    with open("/usr/tesr.mp3", "rb")as f:   \r
+        while 1:\r
+            b = f.read(size)   # read\r
+            if not b:\r
+                break\r
+            aud.playStream(format, b)\r
+\r
+\r
+play_from_fs()\r
+# 等待播放完成\r
+utime.sleep_ms(5000) \r
+# 停止本次播放以便不影响下次播放\r
+aud.stopPlayStream() \r
index 8f4750c..29b9868 100644 (file)
-
-import utime
-import audio
-from machine import Pin
-import osTimer
-import _thread
-from queue import Queue
-import uwebsocket
-import usys
-import EventMesh
-import constants
-import ujson
-
-
-import gc
-AI_audio_queue = Queue(100)
-aud = audio.Audio(0)
-aud.set_pa(Pin.GPIO29)
-aud.setVolume(11)
-AI_TTS_str = ""
-AI_client_tts = None
-AI_client_tts_1 = None
-_4S_timer = None
-def AI_client_tts_recv(cli,fd):
-    global AI_TTS_str,AI_client_tts,_4S_timer,AI_client_tts_1
-    while True:
-        try:
-            # 死循环接收数据
-            
-            recv_data = cli.recv()
-            if not recv_data:
-                # 服务器关闭连接或客户端关闭连接
-                print("AI_client_tts_recv close!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\r\n")
-                print("AI_client_tts_recv close!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\r\n")
-                break
-            try:
-                # print("AI_client_tts_recv :{}".format(len(recv_data)))
-                #结束标志{"header":{"event":"EndSynthesis","msg":"success","status":20000000,"task_id":"ffd727e620000803280c5a6498d0e321"}}
-                if isinstance(recv_data, str):
-                    #print("AI_client_tts_recv:str recv_data:{}".format(recv_data))
-                    if recv_data.find('\"state\":\"Listening\"') != -1:
-                        AI_client_VC_RequestToRespond()
-                    if recv_data.find('\"event\":\"RespondingEnded\"') != -1:
-                    
-                        print("EndSynthesis!!!!!!!!!!!!!!!!!\r\n")
-                        print("EndSynthesis!!!!!!!!!!!!!!!!!!\r\n")
-                        #cli.close()
-                        fd.close()
-                        _4S_timer.stop()
-                        # AI_client_tts.close()
-                        # try:
-                        #     AI_client_tts_1._close()
-                        # except Exception as e:
-                        #     usys.print_exception(e)
-                        break
-                else:
-                    fd.write(recv_data)
-                    AI_audio_queue.put([recv_data,""])
-                #utime.sleep_ms(1000)
-            except Exception as e:
-                usys.print_exception(e)
-                
-        except Exception as e:
-                usys.print_exception(e)
-                break
-def _4S_timer_cb(self,*argc):
-    print("_4S_timer_cb!!!!!!!!!!!!!!!!!!!!!")
-    global AI_TTS_str,AI_client_tts,_4S_timer,AI_client_tts_1
-    try:
-        AI_client_VC_ping()
-    except Exception as e:
-        usys.print_exception(e)
-        _4S_timer.stop()
-def websocket_connect_tts(fd_neme,tts_str):
-    global AI_TTS_str,AI_client_tts,_4S_timer,AI_client_tts_1
-    _4S_timer = osTimer()
-    _4S_timer.start(4000,1,_4S_timer_cb)
-    
-    print("websocket_connect_tts {},{}!!!!!!!!!".format(fd_neme,tts_str))
-    fd=open(fd_neme,'w')
-    req_str = ""
-    AI_TTS_str = tts_str
-    lang = "&lang=zh-cn"#普通话测试环境
-      
-    platform = "&platform=huoshan&is_bot=1"
-
-    req_str = "is_auth=0{}{}".format(platform,lang)
-    try:
-       
-        AI_client_tts = uwebsocket.Client.connect('ws://118.145.158.207:22082/voice-chat/ws?{}'.format(req_str), debug=False)
-        AI_client_tts_1 = uwebsocket.Client.connect('ws://118.145.158.207:22082/voice-chat/ws?{}'.format(req_str), debug=False)
-    except Exception as e: #网络连接异常
-        usys.print_exception(e)
-        print("websocket_connect_tts ERROR:{}\r\n".format(e))
-        
-    print("websocket_connect_tts:AI_client_tts {}\r\n".format(AI_client_tts))
-    # 线程接收数据
-
-    #_thread.stack_size(20*1024)
-    AI_client_tts_recv_id = _thread.start_new_thread(AI_client_tts_recv, (AI_client_tts,fd))
-    AI_audio_queue_thread_id = _thread.start_new_thread(AI_audio_queue_thread, ())
-    #_thread.stack_size(8*1024)
-    #开始会话
-    json_data = \
-    {
-        "header": {
-            "trace_id": "0a75ac012af172eb808782150509ee67",
-            "event": "Start"
-            }, 
-        "payload": {
-            "simple_response": True, 
-            "out_format": "mp3", 
-            "custom_variables": {
-                "bot_name": "柒妹妹"
-                }, 
-            "in_format": "pcm", 
-            "space_time": 0, 
-            "dialog_id": "", 
-            "in_sample_rate": 16000, 
-            "device_id": "860132060359338", 
-            "volume": "100", 
-            "sample_rate": 16000, 
-            "user_agent": "python", 
-            "voice": "ICL_zh_female_huoponvhai_tob", 
-            "voice_detection": "enabled"
-            }
-    }
-    AI_client_tts.send(ujson.dumps(json_data))
-    AI_client_tts_1.send(ujson.dumps(json_data))
-   # print("AI_client_tts.send:{}".format(ujson.dumps(json_data)))
-def AI_client_VC_ping():
-    global AI_TTS_str,AI_client_tts,_4S_timer    
-    #AI_client_tts.send("ping")
-    AI_client_tts.send("aaa")
-    print("AI_client_VC_ping")
-
-def AI_client_VC_RequestToRespond():
-        global AI_TTS_str,AI_client_tts
-        json_data = \
-        {
-            "header":{
-                "trace_id":"123456",
-                "event":"RequestToRespond"
-                },
-            "payload":{
-                "dialog_id":"123456",
-                "type":"transcript",#prompt是跳过asr,transcript是跳过asr和大模型
-                "text":""
-                }
-        }
-
-        print("AI_client_VC_RequestToRespond!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")
-        # if VC_state == VC_State_RequestToRespond:
-        #     print("AI_client_VC_RequestToRespond 重复 tts_str:{}\nasr_str:{}".format(AI_TTS_str,AI_ASR_str))
-
-        if AI_TTS_str != "":
-            json_data["payload"]["text"] = AI_TTS_str
-            json_data["payload"]["type"] = "transcript"
-            AI_TTS_str = ""
-        AI_client_tts.send(ujson.dumps(json_data))
-            #AI_ASR_str = ""
-        # utime.sleep_ms(1)
-# 音频队列        
-def AI_audio_queue_thread():
-    while True:
-        try:
-            if AI_audio_queue.empty() :
-                # if count_t%200 == 0:
-                #     print("AI_send_data_queue.empty")
-                utime.sleep_ms(5)
-            else:
-                #print("AI_audio_queue_thread")
-
-                data = AI_audio_queue.get()
-                
-                #AI_client_tts_data_len=len(data)
-                print("audio_queue:len:{} \r\n".format(len(data[0]),data[1]))
-                if len(data[0]) > 1:
-                    try:
-
-                        tmp= aud.playStream(3, data[0])#播放音频流
-
-                        print("出:{}!!!".format(len(data[0])))
-                        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)
-
-                    utime.sleep_ms(2)
-        except Exception as e:
-            print("AI_audio_queue_thread:ERROR:")
-            usys.print_exception(e)
-
-websocket_connect_tts("/usr/didianguanji.mp3","当前使用人数较多,请稍候重试。")
-# for i in range(10):
-#     websocket_connect_tts("/usr/R_READ_TIME_{}.mp3".format(i),"{}。".format(i))
-#     utime.sleep_ms(4000)
-
-# data = "OPQRSTUVWXYZ"
-# #data = "AB"
-# for i in data:
-#     websocket_connect_tts("/usr/R_READ_TIME_{}.mp3".format(i),"-{}。".format(i))
-#     utime.sleep_ms(4000)
-
-# try:
-#     att = None
-#     att.connect()
-# except Exception as e:
-#             str_tmp = str(e)
-#             print("str_tmp:{}".format(str_tmp))
-#             if str_tmp.find("connect") != -1:
-#                 print("find connect!!!!")
-#             print("AI_audio_queue_thread:ERROR:{}".format(e))
+\r
+import utime\r
+import audio\r
+from machine import Pin\r
+import osTimer\r
+import _thread\r
+from queue import Queue\r
+import uwebsocket\r
+import usys\r
+import EventMesh\r
+import constants\r
+import ujson\r
+\r
+\r
+import gc\r
+AI_audio_queue = Queue(100)\r
+aud = audio.Audio(0)\r
+aud.set_pa(Pin.GPIO29)\r
+aud.setVolume(11)\r
+AI_TTS_str = ""\r
+AI_client_tts = None\r
+AI_client_tts_1 = None\r
+_4S_timer = None\r
+def AI_client_tts_recv(cli,fd):\r
+    global AI_TTS_str,AI_client_tts,_4S_timer,AI_client_tts_1\r
+    while True:\r
+        try:\r
+            # 死循环接收数据\r
+            \r
+            recv_data = cli.recv()\r
+            if not recv_data:\r
+                # 服务器关闭连接或客户端关闭连接\r
+                print("AI_client_tts_recv close!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\r\n")\r
+                print("AI_client_tts_recv close!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\r\n")\r
+                break\r
+            try:\r
+                # print("AI_client_tts_recv :{}".format(len(recv_data)))\r
+                #结束标志{"header":{"event":"EndSynthesis","msg":"success","status":20000000,"task_id":"ffd727e620000803280c5a6498d0e321"}}\r
+                if isinstance(recv_data, str):\r
+                    #print("AI_client_tts_recv:str recv_data:{}".format(recv_data))\r
+                    if recv_data.find('\"state\":\"Listening\"') != -1:\r
+                        AI_client_VC_RequestToRespond()\r
+                    if recv_data.find('\"event\":\"RespondingEnded\"') != -1:\r
+                    \r
+                        print("EndSynthesis!!!!!!!!!!!!!!!!!\r\n")\r
+                        print("EndSynthesis!!!!!!!!!!!!!!!!!!\r\n")\r
+                        #cli.close()\r
+                        fd.close()\r
+                        _4S_timer.stop()\r
+                        # AI_client_tts.close()\r
+                        # try:\r
+                        #     AI_client_tts_1._close()\r
+                        # except Exception as e:\r
+                        #     usys.print_exception(e)\r
+                        break\r
+                else:\r
+                    fd.write(recv_data)\r
+                    AI_audio_queue.put([recv_data,""])\r
+                #utime.sleep_ms(1000)\r
+            except Exception as e:\r
+                usys.print_exception(e)\r
+                \r
+        except Exception as e:\r
+                usys.print_exception(e)\r
+                break\r
+def _4S_timer_cb(self,*argc):\r
+    print("_4S_timer_cb!!!!!!!!!!!!!!!!!!!!!")\r
+    global AI_TTS_str,AI_client_tts,_4S_timer,AI_client_tts_1\r
+    try:\r
+        AI_client_VC_ping()\r
+    except Exception as e:\r
+        usys.print_exception(e)\r
+        _4S_timer.stop()\r
+def websocket_connect_tts(fd_neme,tts_str):\r
+    global AI_TTS_str,AI_client_tts,_4S_timer,AI_client_tts_1\r
+    _4S_timer = osTimer()\r
+    _4S_timer.start(4000,1,_4S_timer_cb)\r
+    \r
+    print("websocket_connect_tts {},{}!!!!!!!!!".format(fd_neme,tts_str))\r
+    fd=open(fd_neme,'w')\r
+    req_str = ""\r
+    AI_TTS_str = tts_str\r
+    lang = "&lang=zh-cn"#普通话测试环境\r
+      \r
+    platform = "&platform=huoshan&is_bot=1"\r
+\r
+    req_str = "is_auth=0{}{}".format(platform,lang)\r
+    try:\r
+       \r
+        AI_client_tts = uwebsocket.Client.connect('ws://118.145.158.207:22082/voice-chat/ws?{}'.format(req_str), debug=False)\r
+        AI_client_tts_1 = uwebsocket.Client.connect('ws://118.145.158.207:22082/voice-chat/ws?{}'.format(req_str), debug=False)\r
+    except Exception as e: #网络连接异常\r
+        usys.print_exception(e)\r
+        print("websocket_connect_tts ERROR:{}\r\n".format(e))\r
+        \r
+    print("websocket_connect_tts:AI_client_tts {}\r\n".format(AI_client_tts))\r
+    # 线程接收数据\r
+\r
+    #_thread.stack_size(20*1024)\r
+    AI_client_tts_recv_id = _thread.start_new_thread(AI_client_tts_recv, (AI_client_tts,fd))\r
+    AI_audio_queue_thread_id = _thread.start_new_thread(AI_audio_queue_thread, ())\r
+    #_thread.stack_size(8*1024)\r
+    #开始会话\r
+    json_data = \\r
+    {\r
+        "header": {\r
+            "trace_id": "0a75ac012af172eb808782150509ee67",\r
+            "event": "Start"\r
+            }, \r
+        "payload": {\r
+            "simple_response": True, \r
+            "out_format": "mp3", \r
+            "custom_variables": {\r
+                "bot_name": "柒妹妹"\r
+                }, \r
+            "in_format": "pcm", \r
+            "space_time": 0, \r
+            "dialog_id": "", \r
+            "in_sample_rate": 16000, \r
+            "device_id": "860132060359338", \r
+            "volume": "100", \r
+            "sample_rate": 16000, \r
+            "user_agent": "python", \r
+            "voice": "ICL_zh_female_huoponvhai_tob", \r
+            "voice_detection": "enabled"\r
+            }\r
+    }\r
+    AI_client_tts.send(ujson.dumps(json_data))\r
+    AI_client_tts_1.send(ujson.dumps(json_data))\r
+   # print("AI_client_tts.send:{}".format(ujson.dumps(json_data)))\r
+def AI_client_VC_ping():\r
+    global AI_TTS_str,AI_client_tts,_4S_timer    \r
+    #AI_client_tts.send("ping")\r
+    AI_client_tts.send("aaa")\r
+    print("AI_client_VC_ping")\r
+\r
+def AI_client_VC_RequestToRespond():\r
+        global AI_TTS_str,AI_client_tts\r
+        json_data = \\r
+        {\r
+            "header":{\r
+                "trace_id":"123456",\r
+                "event":"RequestToRespond"\r
+                },\r
+            "payload":{\r
+                "dialog_id":"123456",\r
+                "type":"transcript",#prompt是跳过asr,transcript是跳过asr和大模型\r
+                "text":""\r
+                }\r
+        }\r
+\r
+        print("AI_client_VC_RequestToRespond!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")\r
+        # if VC_state == VC_State_RequestToRespond:\r
+        #     print("AI_client_VC_RequestToRespond 重复 tts_str:{}\nasr_str:{}".format(AI_TTS_str,AI_ASR_str))\r
+\r
+        if AI_TTS_str != "":\r
+            json_data["payload"]["text"] = AI_TTS_str\r
+            json_data["payload"]["type"] = "transcript"\r
+            AI_TTS_str = ""\r
+        AI_client_tts.send(ujson.dumps(json_data))\r
+            #AI_ASR_str = ""\r
+        # utime.sleep_ms(1)\r
+# 音频队列        \r
+def AI_audio_queue_thread():\r
+    while True:\r
+        try:\r
+            if AI_audio_queue.empty() :\r
+                # if count_t%200 == 0:\r
+                #     print("AI_send_data_queue.empty")\r
+                utime.sleep_ms(5)\r
+            else:\r
+                #print("AI_audio_queue_thread")\r
+\r
+                data = AI_audio_queue.get()\r
+                \r
+                #AI_client_tts_data_len=len(data)\r
+                print("audio_queue:len:{} \r\n".format(len(data[0]),data[1]))\r
+                if len(data[0]) > 1:\r
+                    try:\r
+\r
+                        tmp= aud.playStream(3, data[0])#播放音频流\r
+\r
+                        print("出:{}!!!".format(len(data[0])))\r
+                        mem = gc.mem_free()\r
+                        print('1剩余内存RAM:{} KB'.format(mem / 1024))\r
+                    except Exception as e:\r
+                        print("AI_audio_queue_thread:ERROR:")\r
+                        usys.print_exception(e)\r
+\r
+                    utime.sleep_ms(2)\r
+        except Exception as e:\r
+            print("AI_audio_queue_thread:ERROR:")\r
+            usys.print_exception(e)\r
+\r
+websocket_connect_tts("/usr/didianguanji.mp3","当前使用人数较多,请稍候重试。")\r
+# for i in range(10):\r
+#     websocket_connect_tts("/usr/R_READ_TIME_{}.mp3".format(i),"{}。".format(i))\r
+#     utime.sleep_ms(4000)\r
+\r
+# data = "OPQRSTUVWXYZ"\r
+# #data = "AB"\r
+# for i in data:\r
+#     websocket_connect_tts("/usr/R_READ_TIME_{}.mp3".format(i),"-{}。".format(i))\r
+#     utime.sleep_ms(4000)\r
+\r
+# try:\r
+#     att = None\r
+#     att.connect()\r
+# except Exception as e:\r
+#             str_tmp = str(e)\r
+#             print("str_tmp:{}".format(str_tmp))\r
+#             if str_tmp.find("connect") != -1:\r
+#                 print("find connect!!!!")\r
+#             print("AI_audio_queue_thread:ERROR:{}".format(e))\r
 #             usys.print_exception(e)
\ No newline at end of file
index 4d97ab3..50ee875 100644 (file)
@@ -1,69 +1,69 @@
-import dataCall
-import utime as time
-import TiktokRTC
-import atcmd
-import _thread
-
-from machine import Pin
-
-PA = Pin.GPIO29
-
-def show_freemem():
-    while True:
-        print("Remaining memory: ",_thread.get_heap_size())
-        print("\n")
-        time.sleep(50)
-
-
-def enable_pid2():
-    resp = bytearray(50)
-    atcmd.sendSync('AT+qicsgp=2,1,3gnet,"","",0\r\n',resp,'',20)
-    atcmd.sendSync('at+cgact=1,2\r\n',resp,'',20)
-
-def ai_callback(args):
-    global GPIO39
-    event = args[0]
-    msg = args[1]
-    if event == 1:
-        print('TIKTOK_RTC_EVENT_START')
-        GPIO39.write(1)
-    elif event == 2:
-        print('TIKTOK_RTC_EVENT_STOP')
-        GPIO39.write(0)
-    elif event == 3:
-        print('TIKTOK_RTC_EVENT_TTS_TEXT {}'.format(msg))
-        #call.stopAudioService()
-    elif event == 4:
-        print('TIKTOK_RTC_EVENT_ASR_TEXT {}'.format(msg))
-        #call.stopAudioService()
-    elif event == 5:
-        print('TIKTOK_RTC_EVENT_ERROR {}'.format(msg))
-    else:
-        print('TIKTOK_RTC_EVENT UNKNOWN {}'.format(event))
-
-while True:
-    lte = dataCall.getInfo(1, 0)
-    if lte[2][0] == 1:
-        print('lte network normal')
-        break
-    print('wait lte network normal...')
-    time.sleep(3)
-
-_thread.start_new_thread(show_freemem, ())
-
-enable_pid2()
-
-tiktok = TiktokRTC(3000000, ai_callback)
-
-GPIO39 = Pin(PA, Pin.OUT, Pin.PULL_DISABLE, 0)
-time.sleep(2)
-tiktok.config(volume=11)
-print('volume: {}'.format(tiktok.config('volume')))
-tiktok.active(True)
-# time.sleep(40)
-# print("tiktok.active(False)")
-# tiktok.active(False)
-# time.sleep(2)
-# print("tiktok.active(True1)")
-# tiktok.active(True)
+import dataCall\r
+import utime as time\r
+import TiktokRTC\r
+import atcmd\r
+import _thread\r
+\r
+from machine import Pin\r
+\r
+PA = Pin.GPIO29\r
+\r
+def show_freemem():\r
+    while True:\r
+        print("Remaining memory: ",_thread.get_heap_size())\r
+        print("\n")\r
+        time.sleep(50)\r
+\r
+\r
+def enable_pid2():\r
+    resp = bytearray(50)\r
+    atcmd.sendSync('AT+qicsgp=2,1,3gnet,"","",0\r\n',resp,'',20)\r
+    atcmd.sendSync('at+cgact=1,2\r\n',resp,'',20)\r
+\r
+def ai_callback(args):\r
+    global GPIO39\r
+    event = args[0]\r
+    msg = args[1]\r
+    if event == 1:\r
+        print('TIKTOK_RTC_EVENT_START')\r
+        GPIO39.write(1)\r
+    elif event == 2:\r
+        print('TIKTOK_RTC_EVENT_STOP')\r
+        GPIO39.write(0)\r
+    elif event == 3:\r
+        print('TIKTOK_RTC_EVENT_TTS_TEXT {}'.format(msg))\r
+        #call.stopAudioService()\r
+    elif event == 4:\r
+        print('TIKTOK_RTC_EVENT_ASR_TEXT {}'.format(msg))\r
+        #call.stopAudioService()\r
+    elif event == 5:\r
+        print('TIKTOK_RTC_EVENT_ERROR {}'.format(msg))\r
+    else:\r
+        print('TIKTOK_RTC_EVENT UNKNOWN {}'.format(event))\r
+\r
+while True:\r
+    lte = dataCall.getInfo(1, 0)\r
+    if lte[2][0] == 1:\r
+        print('lte network normal')\r
+        break\r
+    print('wait lte network normal...')\r
+    time.sleep(3)\r
+\r
+_thread.start_new_thread(show_freemem, ())\r
+\r
+enable_pid2()\r
+\r
+tiktok = TiktokRTC(3000000, ai_callback)\r
+\r
+GPIO39 = Pin(PA, Pin.OUT, Pin.PULL_DISABLE, 0)\r
+time.sleep(2)\r
+tiktok.config(volume=11)\r
+print('volume: {}'.format(tiktok.config('volume')))\r
+tiktok.active(True)\r
+# time.sleep(40)\r
+# print("tiktok.active(False)")\r
+# tiktok.active(False)\r
+# time.sleep(2)\r
+# print("tiktok.active(True1)")\r
+# tiktok.active(True)\r
 # print("tiktok.active(True2)")
\ No newline at end of file
index de44198..19e871a 100644 (file)
-import utime
-import osTimer
-import EventMesh
-from machine import Timer
-import voiceCall
-import osTimer
-import constants
-from misc import Power
-import pm
-import ujson
-import audio
-import ql_fs
-import audio
-import sms
-from machine import Pin
-from misc import PWM
-import uos
-import gc
-import _thread
-from queue import Queue
-from machine import RTC
-import usys
-def audio_cb(event):
-    if event == 0:
-        EventMesh.publish("set_audio_state", 1)
-        EventMesh.debug_log('audio-play start.') 
-    elif event == 7:
-        EventMesh.publish("set_audio_state", 0)
-        EventMesh.debug_log('audio-play finish.')
-CALL_LOG_MAX = 50
-aud = audio.Audio(0)
-aud.setCallback(audio_cb)
-
-def msg_cb(args):
-    index = args[1]
-    storage = args[2]
-    # EventMesh.debug_log("index:{}".format(index))
-    sms_data = sms.getSaveLoc()
-    sms_max = sms_data[0][2]
-    if index != -1:
-        tmp = sms.searchTextMsg(index)
-        detail = tmp[1]#内容
-        # EventMesh.debug_log("msg_cb:detail {}".format,detail)
-
-        if  detail.find("SETIP:") != -1:#寻找是否有这个字符串
-            tmp_test = detail.split("SETIP:")[1]
-            if  tmp_test.find(":") != -1:
-                new_ip = tmp_test.split(':')[0]
-                # EventMesh.debug_log("tmp_test:{} new_ip:{}".format(tmp_test,new_ip))
-                new_com = tmp_test.split(':')[1]
-                # new_md5 = detail.split(':')[3]
-                if len(new_ip) > 0 and len(new_com) > 0:
-                    EventMesh.publish("set_new_ip_com", [new_ip,new_com,tmp[0]])#
-                    # EventMesh.publish("set_new_ip_com", [new_ip,new_com,new_md5])#设置关机时间
-        if detail.find("ts#") != -1:
-            EventMesh.publish("send_devinfo_event", tmp[0])#删除短信
-            pass
-        if detail.find("SETWHITEPHB:1") != -1:
-            EventMesh.publish("set_storage_config",["WLKEY","2"])#打开自动接听
-            sms.sendPduMsg(tmp[0], 'set ok', 'UCS2')
-            pass
-        if detail.find("SETWHITEPHB:0") != -1:
-            EventMesh.publish("set_storage_config",["WLKEY","0"])#关闭自动接听
-            sms.sendPduMsg(tmp[0], 'set ok', 'UCS2')
-            pass
-        if detail.find("factory#") != -1:#恢复出厂设置
-            EventMesh.publish("app_factory",tmp[0])#app恢复出厂
-        
-        if detail.find("reset#") != -1:#重启
-            EventMesh.publish("app_restart",tmp[0])#
-
-        if detail.find("fota:http://u-oss.thisiot.com/test/") != -1:#固件升级
-            EventMesh.publish("firware_download",tmp[0])#
-        
-    if index >= sms_max-1:#删除短信
-        EventMesh.publish("delete_sms_event")#删除短信
-sms.setCallback(msg_cb)
-
-import audio
-from machine import Pin
-
-
-
-#from usr.ui_WatchFaceScreen import WatchFaceScreen
-class UI(object):
-    def __init__(self):
-        #self.screen = WatchFaceScreen()
-        #self.screen_old = self.screen
-        self.ui_queue = Queue()
-        _thread.stack_size(13*1024)
-        _thread.start_new_thread(self.ui_queue_thread, ())
-        _thread.stack_size(8*1024)
-        self.screen = None
-        self.screen_old = None
-        self.screen_prev = None
-        self.screen_list = []
-        #self.lv = lv
-        self.system_sleep_timer = osTimer()
-        self.system_sleep_timer_count = 0
-        self.sleep_flag = 1
-        self.level = 6
-        self.read_data = {}
-        self.aud = audio.Audio(0)
-        self.aud.set_pa(Pin.GPIO29)
-        self.aud.setVolume(11)
-        # self.level = EventMesh.publish("get_brightness_level")
-        self.read_data = EventMesh.publish("get_storage_data")
-        self.main_flag = 0
-        self.main_id = 0
-        self.set_interrup_flag = 0
-        self.UI_high_priority_flag = 0 #如果=1,则当前ui不被打断
-        # EventMesh.debug_log("self.read_data:{} self.level:{}".format(self.read_data,self.level))
-        # check = ql_fs.path_exists("/usr/static/storage_file/config.json")
-        # if check == True:
-        #     with open("/usr/static/storage_file/config.json","r") as fd:
-        #         self.read_data = ujson.load(fd)
-        #         if self.read_data != {}:
-        #             b = str("brightness_level") in self.read_data.keys()
-        #             if b == True:
-        #                 self.level = self.read_data["brightness_level"]
-        #             else:
-        #                 self.level = 6
-        #                 self.read_data["brightness_level"] = self.level
-        #                 EventMesh.publish("set_storage_data", self.read_data)
-        #                 with open("/usr/static/storage_file/config.json","w",encoding="utf-8") as fd:
-        #                     ujson.dump(self.read_data,fd)
-        # else:
-        #     self.level = 6 #默认是6级别
-        
-        # if self.level == None:
-        #     self.level = 6
-        # self.PWM_backlight = PWM(PWM.PWM1, PWM.ABOVE_MS, self.level, 10)
-        # self.PWM_backlight.open()
-        self.sleep_lock = 0
-
-    def post_processor_after_instantiation(self):
-        # EventMesh.subscribe("load_screen", self.load_screen_cb)
-
-        # EventMesh.subscribe("btn1_press", self.btn_press)
-        # EventMesh.subscribe("btn8_press", self.btn_press)
-        # EventMesh.subscribe("btn8_long_press", self.btn_press)
-
-        # EventMesh.subscribe("btn1_release", self.btn_release)
-        # EventMesh.subscribe("btn8_release", self.btn_release)
-
-        # EventMesh.subscribe("done_left_to_right", self.ui_press)
-        # EventMesh.subscribe("done_right_to_left", self.ui_press)
-        # EventMesh.subscribe("done_bottom_to_top", self.ui_press)
-        # EventMesh.subscribe("done_top_to_bottom", self.ui_press)
-        # EventMesh.subscribe("done_return", self.ui_press)
-        # EventMesh.subscribe("done_click", self.ui_press)
-        # EventMesh.subscribe("done_error", self.ui_press)
-        # EventMesh.subscribe("done_press", self.ui_press)
-        # EventMesh.subscribe("call_in", self.publish_call_in)
-
-        # EventMesh.subscribe("get_lcd_state", self.get_lcd_state)
-        # EventMesh.subscribe("set_lcd_state", self.set_lcd_state)
-        
-        #EventMesh.subscribe("call_in", self.publish_call_in)
-        #EventMesh.subscribe("set_bg_img", self.set_bg_img)
-
-        EventMesh.subscribe(constants.EVENT.SYSTEM_SLEEP, self.system_sleep)
-        EventMesh.subscribe(constants.EVENT.SYSTEM_UP, self.system_up)
-        EventMesh.subscribe("system_sleep_rest", self.system_sleep_rest)
-        # EventMesh.subscribe("set_UI_high_priority", self.set_UI_high_priority)
-        # EventMesh.subscribe("get_UI_high_priority", self.get_UI_high_priority)
-
-        # EventMesh.subscribe("set_interrup_incall", self.set_interrup_incall)
-        # EventMesh.subscribe("get_interrup_incall", self.get_interrup_incall)
-        # EventMesh.subscribe("get_screen_NAME",self.get_screen_NAME)
-        EventMesh.subscribe("publish_message_event_ui",self.publish_message_event_ui)
-        # EventMesh.subscribe("return_prev_screen",self.return_prev_screen)
-
-        self.system_sleep_timer.start(500, 1, self.system_sleep_timer_cb)
-
-    def publish_message_event_ui(self,event,msg):
-        self.ui_queue.put(msg)
-
-    #ui的消息队列处理,防止内存越界 格式:{函数名,数据}
-    def ui_queue_thread(self):
-        while True:
-            data = self.ui_queue.get()
-            #EventMesh.debug_log("ui_queue_thread:data = {}".format(data))
-            if data != None:
-                try:
-                    data["func"](data["data"])
-                except Exception as e:
-                    usys.print_exception(e)
-                    EventMesh.debug_log("ui_queue_thread:ERROR:{}".format(e))
-            # for scr in self.screen_list:
-            #     if scr.handle_message_event(data) == 1 :
-            #         break
-    def return_prev_screen(self, event, msg):
-        if self.screen_prev != None:
-            EventMesh.publish("load_screen", {"screen": self.screen_prev.NAME})
-
-    def set_interrup_incall(self, event, msg):
-        self.set_interrup_flag = msg
-        
-    def get_interrup_incall(self, event, msg):
-        return self.set_interrup_flag
-    
-    def set_UI_high_priority(self, event, msg):
-        self.UI_high_priority_flag = msg
-
-    def get_UI_high_priority(self, event, msg):
-        return self.UI_high_priority_flag
-
-    def get_lcd_state(self, event, key):
-        return self.sleep_flag
-    
-    def set_lcd_state(self, event, key):
-        EventMesh.debug_log("key_:{}".format(key))
-        self.sleep_flag = key
-    
-    def system_sleep_rest(self, event, key):
-        #EventMesh.debug_log("system_sleep_rest!!!!!")
-        self.system_sleep_timeout_rest()
-
-    
-
-    def __lcd_on(self):
-        self.system_sleep_timeout_rest()
-        
-        if self.sleep_flag == 0 :
-            EventMesh.publish("sys_up_cb")#唤醒前回调
-            EventMesh.debug_log("__lcd_on")
-            if self.sleep_lock == 1:
-                EventMesh.debug_log("__lcd_on:sleep_lock:error!")
-            self.sleep_lock = 1
-            self.sleep_flag = 1
-            
-            
-            #lcd_ctrl.write(1)
-            #utime.sleep(10)
-            
-            self.system_sleep_timer.start(500, 1, self.system_sleep_timer_cb)
-            EventMesh.publish("set_lcd_state",self.sleep_flag)
-           
-            #lv.autoSleep(0)
-            pm.autosleep(0)
-            pm.sclkEx_set(0, 1, 5)
-            
-            
-           
-            self.sleep_lock = 0
-            
-
-    def __lcd_off(self):
-        
-        if self.sleep_flag == 1 :
-            EventMesh.debug_log("__lcd_off")
-            if self.sleep_lock == 1:
-                EventMesh.debug_log("__lcd_on:sleep_lock:error!")
-            self.sleep_lock = 1
-            self.sleep_flag = 0
-            EventMesh.publish("sys_sleep_cb")#休眠前回调
-            #lcd_ctrl.write(0)
-            #
-            #lv.autoSleep(1)
-            pm.autosleep(1)
-            pm.sclkEx_set(1, 1, 5)
-            #utime.sleep_ms(2)
-           
-            #utime.sleep_ms(80)
-            #EventMesh.publish("set_lcd_state",self.sleep_flag)
-            
-            self.sleep_lock = 0
-           
-            self.system_sleep_timer.stop()
-            EventMesh.publish("Hsensor_set_sleep") #让系统更快休眠
-
-    def system_sleep(self, event, msg) :
-        self.__lcd_off()
-
-    def system_up(self, event, msg):
-        self.__lcd_on()
-
-    def system_sleep_timer_cb(self, *args):
-        EventMesh.publish("publish_message_event_ui",{"func":self.system_sleep_timer_,"data":0})  
-    def system_sleep_timer_(self,data):
-        time = EventMesh.publish("get_brightness_time")
-        if time == None:
-            time = 20
-        self.system_sleep_timer_count += 1
-        if self.system_sleep_timer_count >= time :
-            self.system_sleep_timer_count = 0
-            self.__lcd_off()
-
-    def system_sleep_timeout_rest(self) :
-        #EventMesh.debug_log("system_sleep_timeout_rest")
-        self.system_sleep_timer_count = 0
-
-    def start(self):
-        #self.post_processor_after_instantiation()
-        pass
-
-    def add_screen(self, screen):
-        self.screen_list.append(screen)
-        return self
-    
-    def get_screen_NAME(self, event, msg):
-        return 0
-    
-    def load_screen_cb(self, topic, msg):
-        EventMesh.publish("publish_message_event_ui",{"func":self.load_screen,"data":msg})  
-
-    def load_screen(self, msg):
-        EventMesh.debug_log("msg1={}".format(msg))
-        if self.UI_high_priority_flag == 1:#电话界面屏蔽其他界面
-            return
-        if self.screen :
-            if self.screen.NAME == msg["screen"]:
-                return
-        for scr in self.screen_list:
-            if scr.NAME == msg["screen"]:
-                # 每次屏幕切换开始息屏倒计时
-                
-                if scr.NAME == 'main_menu':
-                    self.main_flag = 1
-                else :
-                    self.main_flag = 0
-                mem = gc.mem_free()
-                EventMesh.debug_log('1剩余内存RAM:{} KB'.format(mem / 1024))
-    
-                self.screen = scr
-                
-
-                if self.screen_old != None :
-                    self.screen_old.Close() #先关闭上一次界面
-                    # self.lv.img.cache_invalidate_src(None) #清img cache
-                    # self.lv.img.cache_set_size(16) #开img cache
-                    if self.screen_old.meta_type != "popup": #不是弹窗,保存上一个界面,用来返回
-                        self.screen_prev = self.screen_old #
-                self.screen_old = self.screen
-                if msg.get("meta"):
-                    self.screen.meta_info = msg.get("meta")
-                EventMesh.debug_log("load_screen:post_processor_before_initialization")
-                self.screen.post_processor_before_initialization()
-                EventMesh.debug_log("load_screen:initialization")
-                # self.screen.initialization()
-                
-                EventMesh.debug_log("load_screen.load()")
-                # self.screen.load()
-                # self.lv.scr_load(self.screen.get_meta())
-                
-                self.screen.post_processor_after_initialization()
-                # self.__lcd_on()
-                mem = gc.mem_free()
-                EventMesh.debug_log('2剩余内存RAM:{} KB'.format(mem / 1024))
-
-                
-
-
-
+import utime\r
+import osTimer\r
+import EventMesh\r
+from machine import Timer\r
+import voiceCall\r
+import osTimer\r
+import constants\r
+from misc import Power\r
+import pm\r
+import ujson\r
+import audio\r
+import ql_fs\r
+import audio\r
+import sms\r
+from machine import Pin\r
+from misc import PWM\r
+import uos\r
+import gc\r
+import _thread\r
+from queue import Queue\r
+from machine import RTC\r
+import usys\r
+def audio_cb(event):\r
+    if event == 0:\r
+        EventMesh.publish("set_audio_state", 1)\r
+        EventMesh.debug_log('audio-play start.') \r
+    elif event == 7:\r
+        EventMesh.publish("set_audio_state", 0)\r
+        EventMesh.debug_log('audio-play finish.')\r
+CALL_LOG_MAX = 50\r
+aud = audio.Audio(0)\r
+aud.setCallback(audio_cb)\r
+\r
+def msg_cb(args):\r
+    index = args[1]\r
+    storage = args[2]\r
+    # EventMesh.debug_log("index:{}".format(index))\r
+    sms_data = sms.getSaveLoc()\r
+    sms_max = sms_data[0][2]\r
+    if index != -1:\r
+        tmp = sms.searchTextMsg(index)\r
+        detail = tmp[1]#内容\r
+        # EventMesh.debug_log("msg_cb:detail {}".format,detail)\r
+\r
+        if  detail.find("SETIP:") != -1:#寻找是否有这个字符串\r
+            tmp_test = detail.split("SETIP:")[1]\r
+            if  tmp_test.find(":") != -1:\r
+                new_ip = tmp_test.split(':')[0]\r
+                # EventMesh.debug_log("tmp_test:{} new_ip:{}".format(tmp_test,new_ip))\r
+                new_com = tmp_test.split(':')[1]\r
+                # new_md5 = detail.split(':')[3]\r
+                if len(new_ip) > 0 and len(new_com) > 0:\r
+                    EventMesh.publish("set_new_ip_com", [new_ip,new_com,tmp[0]])#\r
+                    # EventMesh.publish("set_new_ip_com", [new_ip,new_com,new_md5])#设置关机时间\r
+        if detail.find("ts#") != -1:\r
+            EventMesh.publish("send_devinfo_event", tmp[0])#删除短信\r
+            pass\r
+        if detail.find("SETWHITEPHB:1") != -1:\r
+            EventMesh.publish("set_storage_config",["WLKEY","2"])#打开自动接听\r
+            sms.sendPduMsg(tmp[0], 'set ok', 'UCS2')\r
+            pass\r
+        if detail.find("SETWHITEPHB:0") != -1:\r
+            EventMesh.publish("set_storage_config",["WLKEY","0"])#关闭自动接听\r
+            sms.sendPduMsg(tmp[0], 'set ok', 'UCS2')\r
+            pass\r
+        if detail.find("factory#") != -1:#恢复出厂设置\r
+            EventMesh.publish("app_factory",tmp[0])#app恢复出厂\r
+        \r
+        if detail.find("reset#") != -1:#重启\r
+            EventMesh.publish("app_restart",tmp[0])#\r
+\r
+        if detail.find("fota:http://u-oss.thisiot.com/test/") != -1:#固件升级\r
+            EventMesh.publish("firware_download",tmp[0])#\r
+        \r
+    if index >= sms_max-1:#删除短信\r
+        EventMesh.publish("delete_sms_event")#删除短信\r
+sms.setCallback(msg_cb)\r
+\r
+import audio\r
+from machine import Pin\r
+\r
+\r
+\r
+#from usr.ui_WatchFaceScreen import WatchFaceScreen\r
+class UI(object):\r
+    def __init__(self):\r
+        #self.screen = WatchFaceScreen()\r
+        #self.screen_old = self.screen\r
+        self.ui_queue = Queue()\r
+        _thread.stack_size(13*1024)\r
+        _thread.start_new_thread(self.ui_queue_thread, ())\r
+        _thread.stack_size(8*1024)\r
+        self.screen = None\r
+        self.screen_old = None\r
+        self.screen_prev = None\r
+        self.screen_list = []\r
+        #self.lv = lv\r
+        self.system_sleep_timer = osTimer()\r
+        self.system_sleep_timer_count = 0\r
+        self.sleep_flag = 1\r
+        self.level = 6\r
+        self.read_data = {}\r
+        self.aud = audio.Audio(0)\r
+        self.aud.set_pa(Pin.GPIO29)\r
+        self.aud.setVolume(11)\r
+        # self.level = EventMesh.publish("get_brightness_level")\r
+        self.read_data = EventMesh.publish("get_storage_data")\r
+        self.main_flag = 0\r
+        self.main_id = 0\r
+        self.set_interrup_flag = 0\r
+        self.UI_high_priority_flag = 0 #如果=1,则当前ui不被打断\r
+        # EventMesh.debug_log("self.read_data:{} self.level:{}".format(self.read_data,self.level))\r
+        # check = ql_fs.path_exists("/usr/static/storage_file/config.json")\r
+        # if check == True:\r
+        #     with open("/usr/static/storage_file/config.json","r") as fd:\r
+        #         self.read_data = ujson.load(fd)\r
+        #         if self.read_data != {}:\r
+        #             b = str("brightness_level") in self.read_data.keys()\r
+        #             if b == True:\r
+        #                 self.level = self.read_data["brightness_level"]\r
+        #             else:\r
+        #                 self.level = 6\r
+        #                 self.read_data["brightness_level"] = self.level\r
+        #                 EventMesh.publish("set_storage_data", self.read_data)\r
+        #                 with open("/usr/static/storage_file/config.json","w",encoding="utf-8") as fd:\r
+        #                     ujson.dump(self.read_data,fd)\r
+        # else:\r
+        #     self.level = 6 #默认是6级别\r
+        \r
+        # if self.level == None:\r
+        #     self.level = 6\r
+        # self.PWM_backlight = PWM(PWM.PWM1, PWM.ABOVE_MS, self.level, 10)\r
+        # self.PWM_backlight.open()\r
+        self.sleep_lock = 0\r
+\r
+    def post_processor_after_instantiation(self):\r
+        # EventMesh.subscribe("load_screen", self.load_screen_cb)\r
+\r
+        # EventMesh.subscribe("btn1_press", self.btn_press)\r
+        # EventMesh.subscribe("btn8_press", self.btn_press)\r
+        # EventMesh.subscribe("btn8_long_press", self.btn_press)\r
+\r
+        # EventMesh.subscribe("btn1_release", self.btn_release)\r
+        # EventMesh.subscribe("btn8_release", self.btn_release)\r
+\r
+        # EventMesh.subscribe("done_left_to_right", self.ui_press)\r
+        # EventMesh.subscribe("done_right_to_left", self.ui_press)\r
+        # EventMesh.subscribe("done_bottom_to_top", self.ui_press)\r
+        # EventMesh.subscribe("done_top_to_bottom", self.ui_press)\r
+        # EventMesh.subscribe("done_return", self.ui_press)\r
+        # EventMesh.subscribe("done_click", self.ui_press)\r
+        # EventMesh.subscribe("done_error", self.ui_press)\r
+        # EventMesh.subscribe("done_press", self.ui_press)\r
+        # EventMesh.subscribe("call_in", self.publish_call_in)\r
+\r
+        # EventMesh.subscribe("get_lcd_state", self.get_lcd_state)\r
+        # EventMesh.subscribe("set_lcd_state", self.set_lcd_state)\r
+        \r
+        #EventMesh.subscribe("call_in", self.publish_call_in)\r
+        #EventMesh.subscribe("set_bg_img", self.set_bg_img)\r
+\r
+        EventMesh.subscribe(constants.EVENT.SYSTEM_SLEEP, self.system_sleep)\r
+        EventMesh.subscribe(constants.EVENT.SYSTEM_UP, self.system_up)\r
+        EventMesh.subscribe("system_sleep_rest", self.system_sleep_rest)\r
+        # EventMesh.subscribe("set_UI_high_priority", self.set_UI_high_priority)\r
+        # EventMesh.subscribe("get_UI_high_priority", self.get_UI_high_priority)\r
+\r
+        # EventMesh.subscribe("set_interrup_incall", self.set_interrup_incall)\r
+        # EventMesh.subscribe("get_interrup_incall", self.get_interrup_incall)\r
+        # EventMesh.subscribe("get_screen_NAME",self.get_screen_NAME)\r
+        EventMesh.subscribe("publish_message_event_ui",self.publish_message_event_ui)\r
+        # EventMesh.subscribe("return_prev_screen",self.return_prev_screen)\r
+\r
+        self.system_sleep_timer.start(500, 1, self.system_sleep_timer_cb)\r
+\r
+    def publish_message_event_ui(self,event,msg):\r
+        self.ui_queue.put(msg)\r
+\r
+    #ui的消息队列处理,防止内存越界 格式:{函数名,数据}\r
+    def ui_queue_thread(self):\r
+        while True:\r
+            data = self.ui_queue.get()\r
+            #EventMesh.debug_log("ui_queue_thread:data = {}".format(data))\r
+            if data != None:\r
+                try:\r
+                    data["func"](data["data"])\r
+                except Exception as e:\r
+                    usys.print_exception(e)\r
+                    EventMesh.debug_log("ui_queue_thread:ERROR:{}".format(e))\r
+            # for scr in self.screen_list:\r
+            #     if scr.handle_message_event(data) == 1 :\r
+            #         break\r
+    def return_prev_screen(self, event, msg):\r
+        if self.screen_prev != None:\r
+            EventMesh.publish("load_screen", {"screen": self.screen_prev.NAME})\r
+\r
+    def set_interrup_incall(self, event, msg):\r
+        self.set_interrup_flag = msg\r
+        \r
+    def get_interrup_incall(self, event, msg):\r
+        return self.set_interrup_flag\r
+    \r
+    def set_UI_high_priority(self, event, msg):\r
+        self.UI_high_priority_flag = msg\r
+\r
+    def get_UI_high_priority(self, event, msg):\r
+        return self.UI_high_priority_flag\r
+\r
+    def get_lcd_state(self, event, key):\r
+        return self.sleep_flag\r
+    \r
+    def set_lcd_state(self, event, key):\r
+        EventMesh.debug_log("key_:{}".format(key))\r
+        self.sleep_flag = key\r
+    \r
+    def system_sleep_rest(self, event, key):\r
+        #EventMesh.debug_log("system_sleep_rest!!!!!")\r
+        self.system_sleep_timeout_rest()\r
+\r
+    \r
+\r
+    def __lcd_on(self):\r
+        self.system_sleep_timeout_rest()\r
+        \r
+        if self.sleep_flag == 0 :\r
+            EventMesh.publish("sys_up_cb")#唤醒前回调\r
+            EventMesh.debug_log("__lcd_on")\r
+            if self.sleep_lock == 1:\r
+                EventMesh.debug_log("__lcd_on:sleep_lock:error!")\r
+            self.sleep_lock = 1\r
+            self.sleep_flag = 1\r
+            \r
+            \r
+            #lcd_ctrl.write(1)\r
+            #utime.sleep(10)\r
+            \r
+            self.system_sleep_timer.start(500, 1, self.system_sleep_timer_cb)\r
+            EventMesh.publish("set_lcd_state",self.sleep_flag)\r
+           \r
+            #lv.autoSleep(0)\r
+            pm.autosleep(0)\r
+            pm.sclkEx_set(0, 1, 5)\r
+            \r
+            \r
+           \r
+            self.sleep_lock = 0\r
+            \r
+\r
+    def __lcd_off(self):\r
+        \r
+        if self.sleep_flag == 1 :\r
+            EventMesh.debug_log("__lcd_off")\r
+            if self.sleep_lock == 1:\r
+                EventMesh.debug_log("__lcd_on:sleep_lock:error!")\r
+            self.sleep_lock = 1\r
+            self.sleep_flag = 0\r
+            EventMesh.publish("sys_sleep_cb")#休眠前回调\r
+            #lcd_ctrl.write(0)\r
+            #\r
+            #lv.autoSleep(1)\r
+            pm.autosleep(1)\r
+            pm.sclkEx_set(1, 1, 5)\r
+            #utime.sleep_ms(2)\r
+           \r
+            #utime.sleep_ms(80)\r
+            #EventMesh.publish("set_lcd_state",self.sleep_flag)\r
+            \r
+            self.sleep_lock = 0\r
+           \r
+            self.system_sleep_timer.stop()\r
+            EventMesh.publish("Hsensor_set_sleep") #让系统更快休眠\r
+\r
+    def system_sleep(self, event, msg) :\r
+        self.__lcd_off()\r
+\r
+    def system_up(self, event, msg):\r
+        self.__lcd_on()\r
+\r
+    def system_sleep_timer_cb(self, *args):\r
+        EventMesh.publish("publish_message_event_ui",{"func":self.system_sleep_timer_,"data":0})  \r
+    def system_sleep_timer_(self,data):\r
+        time = EventMesh.publish("get_brightness_time")\r
+        if time == None:\r
+            time = 20\r
+        self.system_sleep_timer_count += 1\r
+        if self.system_sleep_timer_count >= time :\r
+            self.system_sleep_timer_count = 0\r
+            self.__lcd_off()\r
+\r
+    def system_sleep_timeout_rest(self) :\r
+        #EventMesh.debug_log("system_sleep_timeout_rest")\r
+        self.system_sleep_timer_count = 0\r
+\r
+    def start(self):\r
+        #self.post_processor_after_instantiation()\r
+        pass\r
+\r
+    def add_screen(self, screen):\r
+        self.screen_list.append(screen)\r
+        return self\r
+    \r
+    def get_screen_NAME(self, event, msg):\r
+        return 0\r
+    \r
+    def load_screen_cb(self, topic, msg):\r
+        EventMesh.publish("publish_message_event_ui",{"func":self.load_screen,"data":msg})  \r
+\r
+    def load_screen(self, msg):\r
+        EventMesh.debug_log("msg1={}".format(msg))\r
+        if self.UI_high_priority_flag == 1:#电话界面屏蔽其他界面\r
+            return\r
+        if self.screen :\r
+            if self.screen.NAME == msg["screen"]:\r
+                return\r
+        for scr in self.screen_list:\r
+            if scr.NAME == msg["screen"]:\r
+                # 每次屏幕切换开始息屏倒计时\r
+                \r
+                if scr.NAME == 'main_menu':\r
+                    self.main_flag = 1\r
+                else :\r
+                    self.main_flag = 0\r
+                mem = gc.mem_free()\r
+                EventMesh.debug_log('1剩余内存RAM:{} KB'.format(mem / 1024))\r
+    \r
+                self.screen = scr\r
+                \r
+\r
+                if self.screen_old != None :\r
+                    self.screen_old.Close() #先关闭上一次界面\r
+                    # self.lv.img.cache_invalidate_src(None) #清img cache\r
+                    # self.lv.img.cache_set_size(16) #开img cache\r
+                    if self.screen_old.meta_type != "popup": #不是弹窗,保存上一个界面,用来返回\r
+                        self.screen_prev = self.screen_old #\r
+                self.screen_old = self.screen\r
+                if msg.get("meta"):\r
+                    self.screen.meta_info = msg.get("meta")\r
+                EventMesh.debug_log("load_screen:post_processor_before_initialization")\r
+                self.screen.post_processor_before_initialization()\r
+                EventMesh.debug_log("load_screen:initialization")\r
+                # self.screen.initialization()\r
+                \r
+                EventMesh.debug_log("load_screen.load()")\r
+                # self.screen.load()\r
+                # self.lv.scr_load(self.screen.get_meta())\r
+                \r
+                self.screen.post_processor_after_initialization()\r
+                # self.__lcd_on()\r
+                mem = gc.mem_free()\r
+                EventMesh.debug_log('2剩余内存RAM:{} KB'.format(mem / 1024))\r
+\r
+                \r
+\r
+\r
+\r
index 4534877..d0f3bb7 100644 (file)
-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
-class AI_led(Abstract):
-    def __init__(self):
-        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_white = Pin(Pin.GPIO19, Pin.OUT, Pin.PULL_PD, 1)
-        EventMesh.subscribe("open_led_red",self.open_led_red)
-        EventMesh.subscribe("open_led_white",self.open_led_white)
-        EventMesh.subscribe("open_led_green",self.open_led_green)
-        EventMesh.subscribe("open_led_all",self.open_led_all)
-        EventMesh.subscribe("close_led",self.close_led)
-        EventMesh.publish("open_led_red")
-    def open_led_red(self,event,msg):
-        print("open_led_red")
-        #self.led_red.write(0)
-        self.led_white.write(0)
-        self.led_green.write(0)
-        self.led_red.write(1)
-
-    def open_led_white(self,event,msg):
-        print("open_led_white")
-        self.led_red.write(0)
-        #self.led_white.write(0)
-        self.led_green.write(0)
-        self.led_white.write(1)
-
-    def open_led_green(self,event,msg):
-        print("open_led_green")
-        self.led_red.write(0)
-        self.led_white.write(0)
-        #self.led_green.write(0)
-        self.led_green.write(1)
-
-    def open_led_all(self,event,msg):
-        print("open_led_all")
-        #self.led_red.write(0)
-        self.led_white.write(1)
-        self.led_green.write(1)
-        self.led_red.write(1)
-
-    def close_led(self,event,msg):
-        print("close_led")
-        self.led_red.write(0)
-        self.led_white.write(0)
-        self.led_green.write(0)
-audio_buf = ['dianliangshengyu10', 'dianliangshengyu100', 'dianliangshengyu20', 'dianliangshengyu40', 'dianliangshengyu60', 'dianliangshengyu80', 'dianliangshengyu90', 'IMEIhao', 'jianquancuowu', 'key_prompt', 'liuliangtishi', 'Low_power_warning', 'peizhichenggong', 'qiehuanchenggong', 'R_CHARGE_FULL', 'R_CHARGE_IN', 'R_CHARGE_OUT', 'R_POWER_OFF_1', '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_SIM_FAILE', 'xianyikaiji', 'xinhaoruo1', 'xinhaoruo2', 'yinliangyizuida', 'yinliangyizuixiao', 'zhengzaiguanji']
-
-class AI_dev(Abstract):
-    # AI
-    def __init__(self):
-        self.VBATT_tab = {"charge_full":4300,100 :4250 ,  90:3994 , 80:3883, 60: 3707, 40:3604, 20:3537,  10:3486,}
-        self.KeyAI_status = 0
-        self.KeyAI_timer_count = 0
-        self.KeyAI_long_press = 0
-        self.KeyAI_press = 0
-        self.KeyAI_timer = osTimer()
-        #self.extint_AI = ExtInt(ExtInt.GPIO19,ExtInt.IRQ_RISING_FALLING, ExtInt.PULL_PU, self.keyAI_extint_cb)
-        self.extint_AI = ExtInt(ExtInt.GPIO22,ExtInt.IRQ_RISING_FALLING, ExtInt.PULL_PU, self.keyAI_extint_cb)
-        self.extint_AI.enable()
-        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 = ExtInt(ExtInt.GPIO41, ExtInt.IRQ_RISING_FALLING, ExtInt.PULL_PU, self.pwk_extint_cb)
-        self.pwk_key.enable() 
-        self.btnInfo_queue = Queue()
-        _thread.stack_size(10*1024)
-        _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)
-        
-        self.wdt = WDT(30) #开启看门狗
-        # self.wdt_timer = osTimer()
-        # self.wdt_timer.start(10000, 1, self.wdt_timer_cb)
-        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.AI_dev_timer = osTimer()
-        self.AI_dev_timer.start(10000, 1, self.AI_dev_timer_cb)
-        self.aud = audio.Audio(0)
-        self.VC_TTS_volume =  EventMesh.publish("get_storage_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})
-    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
-            self.aud.stop()
-            #self.aud.play(1,1,'U:/static/R_CHARGE_IN.mp3')
-            EventMesh.publish("audio_montage_play",["R_CHARGE_IN.mp3"])
-            pass
-        elif status == 0:#拨出usbs
-            self.usb_status = 0
-            self.aud.stop()
-            EventMesh.publish("audio_montage_play",["R_CHARGE_OUT.mp3"])
-            #self.aud.play(1,1,'U:/static/R_CHARGE_OUT.mp3')
-    def btnInfo_queue_thread(self):
-        while True:
-            data = self.btnInfo_queue.get()
-            #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):
-        self.btnInfo_queue.put(msg)
-    def powerKey_callback(self, status):
-        print("powerKey_callback:{}".format(status))
-
-    def pwk_extint_cb(self,args):#pwk
-        try:
-            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("AI_key_press")
-                    
-        except Exception as e: 
-            usys.print_exception(e)
-    def pwk_key_timer_cb(self, *args, **kwargs):
-        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("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))
-                if self.pwk_key_timer_count >= 5: #防抖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_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 :
-                    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")
-                    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):
-        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))
-                if self.KeyAI_timer_count >= 5: #防抖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):
-        #print("AI_key_press")
-        EventMesh.publish("AI_key_press")
-    def AI_key_long_press(self):
-        #print("AI_key_long_press")
-        EventMesh.publish("AI_key_long_press")
-        
-    def AI_key_release(self):
-        #print("AI_key_release")
-        EventMesh.publish("AI_key_release")
-    def pwk_key_Long_Press(self):
-        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("open_led_red")
-        utime.sleep_ms(3000)
-        Power.powerDown()
-        #print("AI_key_release")
-        EventMesh.publish("pwk_key_long_press")
-        
-    def pwk_key_release(self):
-        #print("pwk_key_release")
-        EventMesh.publish("pwk_key_release")
-
-    def AI_dev_timer_cb(self, *args, **kwargs):
-        EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_dev_timer_event})  
-    def AI_dev_timer_event(self):
-        self.wdt.feed()
-        Vbatt = Power.getVbatt()
-        if self.usb_charge_flag == 0 and self.usb_status == 1 and Vbatt>=self.VBATT_tab["charge_full"]:#充电充满
-            EventMesh.publish("audio_montage_play",["R_CHARGE_FULL.mp3"])
-            #self.aud.play(1,0,'U:/static/R_CHARGE_FULL.mp3')#充电已满
-            self.usb_charge_flag = 1
-        if self.usb_charge_flag == 0 and self.usb_status == 0 and Vbatt<self.VBATT_tab[10]:#低电报警
-            #self.aud.play(1,0,'Low_power_warning.mp3')
-            EventMesh.publish("audio_montage_play",["Low_power_warning.mp3"])
-            self.usb_charge_flag = 1
-        pass
-    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()
-        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()
-        if iccid != -1 and len(iccid) > 5:
-            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(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])))
-        str_data += '{}.mp3+'.format(audio_buf.index("IMEIhao"))#IMEI号为:
-        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)
-    #鉴权出错,播放imei号
-    def paly_device_res_error(self,event,msg):
-        str_data = 'mp3files={}.mp3+'.format(audio_buf.index("jianquancuowu"))#AI功能异常,请联系客户查询,设备号为:
-        imei  = modem.getDevImei()
-        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.json")
-            if check == True:
-                with open("/usr/static/storage_file/config.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_data", self.set_storage_data)
-            EventMesh.subscribe("set_storage_config", self.set_storage_config)
-            EventMesh.subscribe("get_storage_data", self.get_storage_data)
-            EventMesh.subscribe("get_storage_config", self.get_storage_config)
-
-        def set_storage_data(self, event, msg): 
-            # EventMesh.debug_log("set_storage_data:{}".format(msg))
-            if msg != None:
-                self.config_data = msg
-                with open("/usr/static/storage_file/config.json",'w+',encoding="utf-8") as fd:
-                    ujson.dump(self.config_data,fd)
-        
-
-        def set_storage_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.json",'w+',encoding="utf-8") as fd:
-                ujson.dump(self.config_data,fd)
-        def get_storage_data(self, event, msg): 
-            # EventMesh.debug_log("get_storage_data:{}".format(self.config_data))
-            return self.config_data 
-        def get_storage_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) :
-        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(10000, 1, self.dev_timer_cb)
-        self.dev_res_timerCount = 0
-        self.ud_token_timer = osTimer()
-        self.ud_token_timer.start(30000, 1, self.ud_token_timer_cb)
-        self.ud_token_timer_Count = 0
-        self.dev_token = None
-        self.res_error_count = 0
-        EventMesh.subscribe("get_dev_token", self.get_dev_token)
-        EventMesh.subscribe("update_dev_token", self.update_dev_token)
-        self.dev_active() #设备激活
-        self.dev_sign_in() #设备登入
-        self.ntptime_flag = 0
-
-    def get_dev_token(self, event, msg): 
-        return self.dev_token
-    #网络校时
-    def dev_NTP(self):
-        url = "http://dmp.raisound.com/bz-api/dev/time"
-        response = request.get(url)
-        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))
-            except Exception as e:
-                    usys.print_exception(e)
-    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:
-        if self.dev_token == None:
-            if self.ntptime_flag == 0:
-                self.ntptime_flag  = 1
-                EventMesh.publish("publish_AI_btnInfo",{"func":self.dev_NTP})
-            print("timer:{}!!!!!!!!\r\n".format(utime.localtime()))
-            self.dev_active() #设备激活
-            self.dev_sign_in() #设备登入
-            self.dev_res_timerCount+=1
-            if self.dev_res_timerCount > 6: #开机一分钟内没有获取到密码和token 等下一次更新令牌在走登入 激活流程
-                self.dev_res_timerCount=0
-                self.dev_res_timer.stop()
-    def ud_token_timer_cb(self, *args): 
-        EventMesh.publish("publish_AI_btnInfo",{"func":self.ud_token_timer_cb_}) 
-
-    def ud_token_timer_cb_(self):   
-        #print("ud_token_timer_!!!!")
-        self.ud_token_timer_Count+=1
-        if self.ud_token_timer_Count >= 20: #定时30*200s时更新token
-            self.ud_token_timer_Count = 0
-            EventMesh.publish("update_dev_token")
-            
-    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):
-        signal = net.csqQueryPoll()
-        if signal == -1 or self.get_sim_Status() != 1:#网络不正常
-            print("dev_active 无 SIM卡!!!!!!!!\r\n")
-            return
-        # 签名内容: = deviceId+pid+timeStamp
-        dev_pass = ""
-        dev_pass = EventMesh.publish("get_storage_config","dev_pass")
-        print("dev_pass:{}\r\n".format(dev_pass))
-        if dev_pass == None:
-            dev_pass = ""
-        if dev_pass == "" or dev_pass == None:
-            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 = 0
-            response_result = 0
-            try:
-                response = request.put(url,data=data,headers = headers_T)
-                response_result = 1
-            except Exception as 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_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_config",["dev_pass",decrypt_data])
-                    
-                        
-                print("IV:{}\r\n PASS:{}".format(IV,PASSWORD)) 
-            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):
-        signal = net.csqQueryPoll()
-        if signal == -1 or self.get_sim_Status() != 1:#网络不正常
-            print("dev_sign_in 无 SIM卡!!!!!!!!\r\n")
-            return
-        token = ""
-        token = self.dev_token
-        dev_pass = EventMesh.publish("get_storage_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_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)
-                    response_result = 1
-                except Exception as e:
-                    print("post error!!!!!\r\n")
-                    response_result = 0
-                # {'msg': '', 'code': 20001, 'success': True, 
-                # 'data': {'deviceId': '876226002022574', 
-                # 'token': '95436a9e09fd0ff89feb8825257dca982f'}
-                # }
-                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(token))
-                pass
-    #获取新的令牌 更新token
-    def update_dev_token(self, event, msg):
-        print("update_dev_token")
-        dev_pass = ""
-        dev_pass = EventMesh.publish("get_storage_config","dev_pass")
-        
-        if dev_pass == None:
-            dev_pass = ""
-        if len(dev_pass) == 0: #没有密码走激活
-            print("no dev_pass:{}\r\n".format(dev_pass))
-            self.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()
-
-        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 = 0
-            headers_T = {"bz-dt":"{}".format(token)}
-            try:
-                response = request.get(dev_tokenip,headers = headers_T)
-                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")
-        
-        pass
-
-
-
-
-#阿里voice_chat状态枚举
-VC_State_None=0
-VC_State_Listening=1#听
-VC_State_SpeechStart=2#说开始
-VC_State_SpeechEnd=3#说结束
-VC_State_Thinking=4#想(chat)
-VC_State_Responding=5#音频播放
-VC_State_TTSStart=6
-VC_State_TTSData=7
-VC_State_TTSFinish=8
-VC_State_TTSEnd=9
-VC_State_TTSError=10
-VC_State_DialogError=11
-VC_State_End=12
-
-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_voice_chat_num = 3
-AI_client_asr_num = 4
-class AI_VC(Abstract):
-    # AI
-    
-    def __init__(self):
-        self.record_data_save_flag = 0 #是否保存录音文件
-        self.record_fd = None
-        #self.VC_mode = 0 #0:短按连续问答模式 1:长按录音模式
-        self.VC_mode = EventMesh.publish("get_storage_config","VC_mode")#音色配置
-        if self.VC_mode == None :
-            self.VC_mode = 0
-
-        self.VC_server = 2 #0正式服务器,1:测试服务器1,2:测试服务器2
-        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.VC_TTS_voice_type = {0:"huoshan::zh_female_xinlingjitang_moon_bigtts",1:"huoshan::zh_male_wennuanahu_moon_bigtts",2:"huoshan::ICL_zh_female_huoponvhai_tob",
-                                  3:"aliyun::longjiaxin",4:"huoshan::zh_female_daimengchuanmei_moon_bigtts"}
-        #self.VC_TTS_voice_type = ["aliyun::longxiaoxia","aliyun::longnan","aliyun::longling"]
-        self.VC_TTS_voice_num = EventMesh.publish("get_storage_config","VC_TTS_voice_num")#音色配置
-        if self.VC_TTS_voice_num == None or self.VC_TTS_voice_num>=len(self.VC_TTS_voice_type):
-            self.VC_TTS_voice_num = 0
-         
-        self.VC_TTS_volume =  EventMesh.publish("get_storage_config","VC_TTS_volume")#音量配置
-        if self.VC_TTS_volume == None:
-            self.VC_TTS_volume = 100
-        self.AI_audio_queue_thread_id = 0
-        self.AI_send_data_queue_thread_id = 0
-
-        self.AI_record_tmp_queue = Queue(100)
-        self.AI_send_data_queue = Queue(100)
-        self.AI_audio_queue = Queue(100)
-        self.AI_TTS_str = ""
-        self.AI_ASR_str = ""
-        self.AI_ASR_flag = 0
-        self.AI_ASR_str_tmp = ""
-        # #开始线程
-        # 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_send_data_queue_thread_id == 0:    
-        #     self.AI_send_data_queue_thread_id = _thread.start_new_thread(self.AI_send_data_queue_thread, ())
-            
-        self.voice_chat_state = VC_State_None #阿里ai voice_chat状态
-        self.VC_dialog_id = ""
-        self.VC_message_id=None
-        self.VC_task_id =None
-        self.AI_client_voice_chat = None
-        self.AI_client_voice_chat_recv_id = 0
-        self.AI_client_voice_chat_isconnect =0
-
-        self.asr_state = VC_State_None #阿里VC_ASR voice_chat状态
-        self.VC_asr_dialog_id = ""
-        self.VC_asr_message_id=None
-        self.VC_asr_task_id =None
-        self.AI_client_asr = None
-        self.AI_client_asr_recv_id = 0
-        self.AI_client_asr_isconnect =0
-
-        self.asr_satrt_flag = 0
-
-        self.record_pcm = None
-        self.play_pcm = None
-        self.VC_record_thread_id = 0
-        self.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.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.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
-        EventMesh.subscribe("AI_key_press", self.AI_key_press)
-        EventMesh.subscribe("AI_key_release", self.AI_key_release)
-        EventMesh.subscribe("AI_key_long_press", self.AI_key_long_press)
-        EventMesh.subscribe("pwk_key_release", self.pwk_key_release)
-        EventMesh.subscribe("get_AI_audio_queue", self.get_AI_audio_queue)
-        
-        EventMesh.publish("close_led")
-        #开机提示语,如果联网失败,直接提示信号弱
-        #女,男,童,粤,川
-        self.bot_name = "柒先生"
-        if self.VC_TTS_voice_num == 0 or self.VC_TTS_voice_num == 3 or self.VC_TTS_voice_num == 4:
-            self.bot_name = "柒妹妹"
-        elif self.VC_TTS_voice_num == 1:
-            self.bot_name = "柒先生"
-        elif self.VC_TTS_voice_num == 2:
-            self.bot_name = "柒思思"
-        self.AI_TTS_str = "您好!我是柒牌 AI 智能男装生活好帮手-{}, 很高兴为您服务,我可以帮您解答日常生活、工作,旅游信息、健康咨询、教育与学习、情感交流、全球资讯等问题!请问您有什么需要我帮忙的吗?".format(self.bot_name )
-        EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_VC_start}) 
-
-    def post_processor_after_instantiation(self):
-        pass
-    def get_AI_audio_queue(self, event, msg):
-        return self.AI_audio_queue
-    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(self, event, msg):#按键按下
-        print("AI_key_press")
-        self.aud.aud_tone_play(16,200)#播放按键音
-        self.asr_satrt_flag = 1#
-        self.AI_TTS_str = ""#"你好,有什么吩咐"
-        self.AI_ASR_str = ""
-        self.AI_ASR_str_tmp = ""
-        # if self.voice_chat_state != VC_State_None:
-        #     EventMesh.publish("publish_AI_btnInfo",{"func":self.Close}) 
-        #     EventMesh.publish("publish_AI_btnInfo",{"func":utime.sleep_ms,'data':(10)})
-        EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_VC_start}) 
-        # self.Close()
-        # self.AI_VC_start()
-        self.AI_key_long_press_flag = 0
-
-    def AI_key_release(self, event, msg):#按键弹起
-        print("AI_key_release123")
-        if self.AI_key_long_press_flag == 1 :#有长按
-            self.AI_client_voice_chat_end_speech()
-        else :
-            if self.VC_mode == 1 :#长按单次问答模式
-                EventMesh.publish("audio_montage_play",["key_prompt.mp3"])
-                #self.aud.play(1,1,'U:/static/key_prompt.mp3')#提示请您按住中间的按钮开始讲话,讲完松开即可
-                self.AI_send_data_queue.clear()
-                try:
-                    self.websocket_deconnect_voice_chat()
-                except Exception as e:
-                    usys.print_exception(e)
-                self.VC_Speech_End()
-    def AI_key_long_press(self, event, msg):#按键长按
-        print("AI_key_long_press")
-        self.AI_key_long_press_flag = 1
-
-    def pwk_key_release(self, event, msg):#电源键短按,关闭
-        print("pwk_key_release")
-        EventMesh.publish("publish_AI_btnInfo",{"func":self.Close}) 
-
-    
-#****************************************ASR连接**********************************************************************
-    def websocket_connect_asr(self):
-        print("websocket_connect_asr:{} {}!!!!!!!!!!!!!!!!!!!!!".format(self.AI_client_asr_isconnect,_thread.threadIsRunning(self.AI_client_asr_recv_id)))
-        if self.AI_client_asr_isconnect == 1:
-            return
-        # 创建VC客户端
-        try:
-            signal = net.csqQueryPoll()
-            if signal == -1 or sim.getStatus() != 1:#网络正常
-                self.websocket_error()
-                return
-            # Headers = {'X-NLS-Token':'0c8b8f05a46f423096be64a9c4c46310'}
-            # self.AI_client_asr = uwebsocket.Client.connect('wss://nls-gateway-cn-beijing.aliyuncs.com/ws/v1',headers=Headers, debug=False)
-            if self.VC_server == 1:# 
-                self.AI_client_asr = uwebsocket.Client.connect('ws://118.145.158.207:22080/asr/ws', debug=False)#测试环境
-            elif self.VC_server == 2:# 
-                if self.VC_TTS_voice_num <= 2:
-                    self.AI_client_asr = uwebsocket.Client.connect('ws://118.145.158.207:22080/asr/ws?platform=aliyun&lang=zh-cn', debug=False)#普通话测试环境
-                elif self.VC_TTS_voice_num == 3:
-                    self.AI_client_asr = uwebsocket.Client.connect('ws://118.145.158.207:22080/asr/ws?platform=aliyun&lang=zh-hk', debug=False)#粤语测试环境
-                elif self.VC_TTS_voice_num == 4:
-                    self.AI_client_asr = uwebsocket.Client.connect('ws://118.145.158.207:22080/asr/ws?platform=aliyun&lang=zh-cn-sc', debug=False)#四川话测试环境
-                else :
-                    self.AI_client_asr = uwebsocket.Client.connect('ws://118.145.158.207:22080/asr/ws?platform=aliyun&lang=zh-cn', debug=False)#普通话测试环境
-            else:
-                token = EventMesh.publish("get_dev_token")
-                print("token:{}".format(token))
-                if token != None:
-                    self.AI_client_asr = uwebsocket.Client.connect('ws://amp.raisound.com/asr/ws?dt={}'.format(token), debug=False)
-                else:
-                    pass
-                    return
-        except Exception as e: #网络连接异常
-            usys.print_exception(e)
-            print("websocket_connect_voice_chat error!!!\r\n")
-            #self.connect_timerout_popup(2)  
-            self.websocket_error()
-            return
-        if self.AI_client_asr == None:
-            EventMesh.publish("update_dev_token")#获取token
-            return 
-        # 线程接收数据
-        if self.AI_client_asr_recv_id != 0:
-            try:
-                _thread.stop_thread(self.AI_client_asr_recv_id)
-            except Exception as e:
-                    usys.print_exception(e)
-            self.AI_client_asr_recv_id = 0
-        _thread.stack_size(self.Audio_buf_size+8*1024)
-        self.AI_client_asr_recv_id = _thread.start_new_thread(self.AI_client_asr_recv, (self.AI_client_asr,))
-        _thread.stack_size(8*1024)
-        self.AI_client_asr_isconnect = 1
-        # 
-
-    def websocket_deconnect_asr(self):
-        print("websocket_deconnect_asr {}!!!!!!!".format(self.AI_client_asr_isconnect))
-        print("websocket_deconnect_asr!!!!!!!")
-        if self.AI_client_asr_recv_id != 0:#关闭线程
-            try:
-                _thread.stop_thread(self.AI_client_asr_recv_id)
-            except Exception as e:
-                usys.print_exception(e)
-        self.AI_client_asr_recv_id = 0
-        if self.AI_client_asr_isconnect == 1:
-            self.AI_client_asr_isconnect = 0
-            self.AI_client_asr.close()
-        print("websocket_deconnect_asr {}!!!!!!!".format(self.AI_client_asr_isconnect))
-
-    #websocket发送数据    
-    def AI_client_asr_send(self,data_str):
-        if isinstance(data_str, str):#是字符串
-            print("ASR ASR AI_client_asr_send:{}".format(data_str))
-            pass
-        else:
-            pass
-            #print("ASR ASR AI_client_asr_send:len:{}".format(len(data_str)))
-        self.AI_send_data_queue.put([AI_client_asr_num,data_str]) 
-    #Ai VC websocket返回数据       
-    def AI_client_asr_recv(self,cli):
-        while True:
-            try:
-                # 死循环接收数据
-                utime.sleep_ms(1)
-                recv_data = cli.recv()
-                self.close_timerout = 0#服务器有返回清零退出时间
-                if not recv_data:
-                    # 服务器关闭连接或客户端关闭连接
-                    print("AI_client_asr_recv close!!!!!!!!!!!!!!!!!!!!!!!!!!!")
-                    #self.AI_client_voice_chat_isconnect = 0
-                    #self.websocket_deconnect_voice_chat()
-                    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}) 
-                    break
-                try:
-                    if isinstance(recv_data, str):
-                        jsload_data =  ujson.loads(recv_data)
-                        print("ASR ASR recv_data: {}".format(jsload_data))
-                        if jsload_data["event"] != None:
-                            if jsload_data["event"] == "TranscriptionStarted": #开始录音
-                                pass
-                        if recv_data.find('\"result\"') == -1:
-                        #if jsload_data["result"] == None:
-                            #print("continue recv_data:{}".format(recv_data))
-                            continue 
-                        if jsload_data["result"] == None:
-                            #print("continue recv_data:{}".format(recv_data))
-                            continue 
-                        if jsload_data["result"]["result"]:
-                            #self.AI_listen_text = str(jsload_data["result"]["result"])
-                            text= str(jsload_data["result"]["result"])
-                            
-
-                            print("ASR recv self.voice_chat_state :{}".format(self.voice_chat_state))
-                            if self.voice_chat_state >= VC_State_TTSStart:#开始播音后不响应asr结果
-                                print("asr continue")
-                                continue
-                            EventMesh.publish("open_led_red")
-                            if jsload_data["result"]["is_end"] == True:  #asr结束
-                                # if text.find('你好') != -1:
-                                #     self.asr_satrt_flag = 0
-                                #     self.AI_TTS_str = ""#"你好,有什么吩咐"
-                                #     self.AI_ASR_str = ""
-                                #     self.asr_satrt_flag = 1
-                                #     self.aud.aud_tone_play(16,200)#播放按键音
-                                #     # self.AI_client_asr_StopTranscription_requset()#终止前面合成
-                                #     # self.AI_client_asr_start_requset()#开始新的合成
-                                #     EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_deconnect_voice_chat}) 
-                                #     EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_VC_start}) 
-                                #     EventMesh.publish("open_led_red")
-                                #     continue
-                                #     #self.VC_Play_End()#关闭音频播放
-                                ret= self.check_text(text)
-                                if ret == 0:#配置指令
-                                    #print("check_text ok:{} self.VC_TTS_voice_num:{},{}".format(text,self.VC_TTS_voice_num,self.VC_TTS_voice_type[self.VC_TTS_voice_num]))
-                                    self.AI_send_data_queue.clear()
-                                    EventMesh.publish("open_led_all")
-                                    try:
-                                        EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_deconnect_voice_chat}) 
-                                        #EventMesh.publish("publish_AI_btnInfo",{"func":utime.sleep_ms,'data':(1500)})
-                                        EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_VC_start}) 
-                                    except Exception as e:
-                                        usys.print_exception(e)
-                                    continue
-                                elif ret == 1:#不处理
-                                    pass
-                                else:#正常asr
-                                    if self.AI_ASR_flag == 0:#d第一次识别,没有打断
-                                        self.AI_ASR_str = text#
-                                        self.AI_ASR_str_tmp = self.AI_ASR_str
-                                        self.AI_ASR_flag  = 1
-                                    else:#第二次识别,打断了
-                                        self.AI_ASR_str = self.AI_ASR_str_tmp+text
-                                        print("ASR ASR 打断 续集 AI_ASR_str {}".format(self.AI_ASR_str))
-                                        self.AI_ASR_str_tmp = self.AI_ASR_str
-                                        EventMesh.publish("publish_AI_btnInfo",{"func":self.VC_init2})#关闭vc连接
-                                    EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_VC_start}) 
-
-
-                                    # if self.AI_ASR_str != "":#识别过一次asr,打断当前思考或者tts播放
-                                    #     self.AI_ASR_str_tmp = self.AI_ASR_str
-                                    #     print("ASR ASR 打断1 AI_ASR_str_tmp {}".format(self.AI_ASR_str_tmp))
-                                    #     self.AI_ASR_str = ""
-                                    # if self.AI_ASR_str_tmp != "":
-                                    #     self.AI_ASR_str = self.AI_ASR_str_tmp +text#加上之前的数据
-                                    #     print("ASR ASR 打断 续集 AI_ASR_str {}".format(self.AI_ASR_str))
-                                    # else:
-                                    #     self.AI_ASR_str = text#
-                                    # EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_VC_start}) 
-                                    # self.AI_ASR_str_tmp = ""
-                                        
-                                    
-                            elif jsload_data["result"]["is_end"] == False:
-                                if self.AI_ASR_flag ==1 :#如果已经识别过一次asr
-                                    self.AI_ASR_flag = 2
-                                    print("asr 打断,关闭VC连接")
-                                    EventMesh.publish("publish_AI_btnInfo",{"func":self.VC_init2})#关闭vc连接
-                                    EventMesh.publish("publish_AI_btnInfo",{"func":EventMesh.publish,"data":"open_led_red"})#关闭vc连接
-                                pass
-                except Exception as e:
-                    usys.print_exception(e)
-                
-            except Exception as e:
-                    usys.print_exception(e)
-                    #self.websocket_error()
-                    EventMesh.publish("publish_AI_btnInfo",{"func":self.Close}) 
-                    EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_error})#
-                    break
-        self.AI_client_asr_isconnect = 0
-        self.AI_client_asr_recv_id = 0 
-        print("AI_client_asr_recv END!!!!!!!!!!!!!!!!!!!!!!!!!!!")
-    #ASR开始会话
-    def AI_client_asr_start_requset(self):
-        
-        json_data = \
-        { 
-            "header":{
-                "event":"StartTranscription",
-                "trace_id":self.get_trace_id()
-                },
-            "payload":{
-                "format":"pcm",
-                "sample_rate":self.VC_record_samplerate,
-                }
-            
-        }
-        if self.VC_record_TYPE == VC_record_TYPE_AMR :
-            json_data["payload"]["format"]='amr'
-            pass
-        # if self.VC_mode == 1:
-        #     json_data["payload"]["voice_detection"]='disable'
-
-        self.AI_client_asr_send(ujson.dumps(json_data))
-    #ASR终止
-    def AI_client_asr_StopTranscription_requset(self):   
-        json_data = \
-        {
-            "header":{
-                "event":"StopTranscription",
-                "trace_id":self.get_trace_id()
-                }
-        }
-
-        self.AI_client_asr_send(ujson.dumps(json_data))
-    
-     #开始录音
-    def VC_Speech_Start(self):
-        #self.voice_chat_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.AI_client_asr_start_requset()#开始请求
-            if self.VC_record_thread_id != 0:
-                try:
-                    _thread.stop_thread(self.VC_record_thread_id)
-                except Exception as e:
-                        usys.print_exception(e)
-                self.VC_record_thread_id = 0
-            _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))
-            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))
-            self.VC_record_state_flag = 1
-    #停止录音
-    def VC_Speech_End(self):
-        try:
-            self.AI_ASR_flag = 0
-            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)
-        if self.VC_record_thread_id != 0:
-            try:
-                _thread.stop_thread(self.VC_record_thread_id)
-            except Exception as e:
-                    usys.print_exception(e)
-            self.VC_record_thread_id = 0
-        
-        self.VC_record_state_flag = 0
-        print("VC_Speech_End VC_record_state_flag:{}!!!!!!!!".format(self.VC_record_state_flag))   
-    #获取录音数据
-    def VC_record_thread(self):
-        ##return
-        print("VC_record_thread start!!!!!!!!!!!!!!!!!!!!\r\n")
-        count = 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_voice_chat_send(h_data_b)
-        
-        count = 0
-        while True:
-            try:
-                
-                # 死循环接收数据
-                #if self.voice_chat_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(20)
-                    
-                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])
-                    if self.record_fd != None:
-                        self.record_fd.write(read_buf)
-                    self.AI_client_asr_send(read_buf)
-                    
-                    # if self.voice_chat_state !=  VC_State_SpeechStart:#没发送前先存起来
-                    #     self.AI_record_tmp_queue.put(read_buf)
-                    # else:
-                    #     while True:
-                    #         if self.AI_record_tmp_queue.empty() == True:
-                    #             break
-                    #         else:
-                    #             self.AI_client_voice_chat_send(self.AI_record_tmp_queue.get())  #发送之前存的数据
-                    #     self.AI_client_voice_chat_send(read_buf)   
-                    #print("VC_record_thread:{}".format(len(read_buf)))
-                    count+=len(read_buf)
-                # if count>=500*1024:#结束
-                #     self.AI_client_voice_chat_end_speech()
-                #     break
-                utime.sleep_ms(40)
-                # if self.voice_chat_state >=  VC_State_SpeechEnd:
-                #     break
-                count+=1
-                if count %10 == 0:
-                    print("VC_record_thread on line {} asr recv :{} send:{}".format(Record_len,_thread.threadIsRunning(self.AI_client_asr_recv_id),_thread.threadIsRunning(self.AI_send_data_queue_thread_id)))
-            except Exception as e:
-                    usys.print_exception(e)
-                    #break
-
-        #fd.close()
-        print("VC_record_thread:exit")
-        self.VC_record_thread_id = 0#线程退出
-###################################################### VC ###################################################################################
-    def websocket_connect_voice_chat(self):
-        print("websocket_connect_voice_chat:{}!!!!!!!!!!!!!!!!!!!!!".format(self.AI_client_voice_chat_isconnect))
-        if self.AI_client_voice_chat_isconnect == 1:
-            return
-        # 创建VC客户端
-        try:
-            signal = net.csqQueryPoll()
-            if signal == -1 or sim.getStatus() != 1:#网络正常
-                self.websocket_error()
-                return
-            # Headers = {'X-NLS-Token':'0c8b8f05a46f423096be64a9c4c46310'}
-            # self.AI_client_voice_chat = uwebsocket.Client.connect('wss://nls-gateway-cn-beijing.aliyuncs.com/ws/v1',headers=Headers, debug=False)
-            if self.VC_server == 1:# 
-                self.AI_client_voice_chat = uwebsocket.Client.connect('ws://118.145.158.207:22080/voice-chat/ws', debug=False)#测试环境
-            elif self.VC_server == 2:# 
-                if self.VC_TTS_voice_num <= 2:
-                    self.AI_client_voice_chat = uwebsocket.Client.connect('ws://118.145.158.207:22080/voice-chat/ws?is_auth=0&platform=raisound&lang=zh-cn', debug=False)#普通话测试环境
-                elif self.VC_TTS_voice_num == 3:
-                    self.AI_client_voice_chat = uwebsocket.Client.connect('ws://118.145.158.207:22080/voice-chat/ws?is_auth=0&platform=raisound&lang=zh-hk', debug=False)#粤语测试环境
-                elif self.VC_TTS_voice_num == 4:
-                    self.AI_client_voice_chat = uwebsocket.Client.connect('ws://118.145.158.207:22080/voice-chat/ws?is_auth=0&platform=raisound&lang=zh-cn-sc', debug=False)#四川话测试环境
-                else :
-                    self.AI_client_voice_chat = uwebsocket.Client.connect('ws://118.145.158.207:22080/voice-chat/ws?is_auth=0&platform=raisound&lang=zh-cn', debug=False)#普通话测试环境
-            else:
-                token = EventMesh.publish("get_dev_token")
-                print("token:{}".format(token))
-                if token != None:
-                    self.AI_client_voice_chat = uwebsocket.Client.connect('ws://amp.raisound.com/voice-chat/ws?dt={}'.format(token), debug=False)
-                else:
-                    self.websocket_error()
-                    return
-        except Exception as e: #网络连接异常
-            usys.print_exception(e)
-            print("websocket_connect_voice_chat error!!!\r\n")
-            #self.connect_timerout_popup(2)
-            self.websocket_error()
-            return
-        print("AI_client_voice_chat:{}".format(self.AI_client_voice_chat))
-        if self.AI_client_voice_chat == None:
-            EventMesh.publish("update_dev_token")#获取token
-            self.websocket_error()
-            return
-        utime.sleep_ms(20)
-        # 线程接收数据
-        if self.AI_client_voice_chat_recv_id != 0:
-            try:
-                _thread.stop_thread(self.AI_client_voice_chat_recv_id)
-            except Exception as e:
-                    usys.print_exception(e)
-            self.AI_client_voice_chat_recv_id = 0
-        _thread.stack_size(self.Audio_buf_size+8*1024)
-        self.AI_client_voice_chat_recv_id = _thread.start_new_thread(self.AI_client_voice_chat_recv, (self.AI_client_voice_chat,))
-        _thread.stack_size(8*1024)
-        self.AI_client_voice_chat_isconnect = 1
-    def websocket_error(self):
-        print("websocket_error!!!!")
-        print("websocket_error!!!!")
-        print("websocket_error!!!!")
-        print("websocket_error!!!!")
-        self.websocket_error_count+=1
-        if self.websocket_error_count <=3:
-            EventMesh.publish("audio_montage_play",["xinhaoruo1.mp3"])
-        elif self.websocket_error_count <10 :
-            EventMesh.publish("audio_montage_play",["xinhaoruo2.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')
-        self.AI_send_data_queue.clear()
-        self.AI_audio_queue.clear()
-        #self.VC_Speech_End()
-        EventMesh.publish("close_led")
-        try:
-            self.websocket_deconnect_voice_chat()
-        except Exception as e:
-                usys.print_exception(e)
-        try:
-            self.websocket_deconnect_asr()
-        except Exception as e:
-                usys.print_exception(e)
-
-    def websocket_deconnect_voice_chat(self):
-        print("websocket_deconnect_voice_chat {}!!!!!!!".format(self.AI_client_voice_chat_isconnect))
-        print("websocket_deconnect_voice_chat!!!!!!!")
-        if self.AI_client_voice_chat_recv_id != 0:#关闭线程
-            try:
-                _thread.stop_thread(self.AI_client_voice_chat_recv_id)
-            except Exception as e:
-                usys.print_exception(e)
-        self.AI_client_voice_chat_recv_id = 0
-        if self.AI_client_voice_chat_isconnect == 1:
-            self.AI_client_voice_chat_isconnect = 0
-            self.AI_client_voice_chat.close()
-        print("websocket_deconnect_voice_chat {}!!!!!!!".format(self.AI_client_voice_chat_isconnect))
-    #websocket发送ping
-    def AI_client_voice_chat_ping(self):
-        pass
-        if self.AI_client_voice_chat_isconnect == 1:
-            #self.AI_client_voice_chat.write_frame(0x09,b'ping ping')
-            self.AI_client_voice_chat_send("ping")
-            #print("websocket ping ping")
-
-    #websocket发送数据    
-    def AI_client_voice_chat_send(self,data_str):
-        if isinstance(data_str, str):#是字符串
-            print("AI_client_voice_chat_send:{}".format(data_str))
-            pass
-        # else:
-        #     print("AI_client_voice_chat_send:len{}".format(len(data_str)))
-        self.AI_send_data_queue.put([AI_client_voice_chat_num,data_str]) 
-    
-    #Ai VC websocket返回数据       
-    def AI_client_voice_chat_recv(self,cli):
-        count = 0
-        while True:
-            try:
-                # 死循环接收数据
-                count+=1
-                if self.tts_in_data_len - self.tts_out_data_len > 64*1024 or count>4:
-                    count = 0
-                    utime.sleep_ms(1)
-                recv_data = cli.recv()
-                self.close_timerout = 0#服务器有返回清零退出时间
-                if not recv_data:
-                    # 服务器关闭连接或客户端关闭连接
-                    print("服务器主动关闭连接!!!!!!!!!!!!!!!!!!!!!!!!!!!")
-                    #self.AI_client_voice_chat_isconnect = 0
-                    #self.websocket_error()
-                    EventMesh.publish("publish_AI_btnInfo",{"func":self.Close}) 
-                    EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_error}) 
-                    #EventMesh.publish("publish_AI_btnInfo",{"func":utime.sleep_ms,'data':(1500)})
-                    
-                    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_voice_chat_recv jsload_data = {}".format(jsload_data))
-                        if jsload_data["status"] != 20000000:#返回错误
-                            self.websocket_error()
-                            break
-                        if jsload_data["event"] == "Started" :#会话开始
-                            payload = jsload_data["payload"]
-                            self.VC_dialog_id = payload["dialog_id"] 
-                            self.VC_task_id = jsload_data["task_id"] 
-                            print("VC:Started!!!!!!!!\r\n")
-                        elif jsload_data["event"]  == "SpeechContent" :#asr转译
-                            print("VC:SpeechContent!!!!!!!!\r\n")
-                            payload = jsload_data["payload"]
-                            
-                            
-                            if(payload['finished'] == True):#asr结束
-                                self.voice_chat_state =  VC_State_SpeechEnd
-                                #self.VC_Speech_End()#停止录音
-                                text = payload["text"]
-                                if self.check_text(text) == 0:
-                                    #print("check_text ok:{} self.VC_TTS_voice_num:{},{}".format(text,self.VC_TTS_voice_num,self.VC_TTS_voice_type[self.VC_TTS_voice_num]))
-                                    self.AI_send_data_queue.clear()
-                                    EventMesh.publish("open_led_all")
-                                    try:
-                                        EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_deconnect_voice_chat}) 
-                                        #EventMesh.publish("publish_AI_btnInfo",{"func":utime.sleep_ms,'data':(1500)})
-                                        EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_VC_start}) 
-                                    except Exception as e:
-                                        usys.print_exception(e)
-                                
-                                pass
-                            else:
-                                self.AI_listen_end = 0
-
-                        elif jsload_data["event"]  == "SpeechEnded" :#服务器下发ASR说话结束
-                            self.voice_chat_state =  VC_State_SpeechEnd
-                        elif jsload_data["event"]  == "RespondingContent" :#chat回答      
-                            pass
-                            # payload = jsload_data["payload"]
-
-                            # if(payload['finished'] == True):#chat回答 结束,开始tts
-                            #     self.AI_client_chat_end_flag = 1
-                            #     pass
-                            # else:
-                                
-                            #     self.AI_client_chat_end_flag = 0
-                            #     self.AI_client_tts_data_len = 0
-                            #utime.sleep_ms(5)
-                            
-                        elif jsload_data["event"]  == "RespondingStarted" :#音频开始下发
-                            self.play_flag = 0
-                            self.voice_chat_state = VC_State_TTSStart
-                            self.VC_Speech_End()#停止录音
-                            self.VC_Play_Start()
-                            #self.tts_fd = open('/usr/tts_tesr.pcm','w')
-                            pass
-                        elif jsload_data["event"]  == "RespondingEnded" :#音频下发结束
-                            #if self.voice_chat_state == VC_State_TTSStart:
-                                print("RespondingEnded!!!!!!" )
-                                self.voice_chat_state = VC_State_TTSEnd
-                                if self.asr_satrt_flag == 0 :
-                                    self.asr_satrt_flag =1
-                            #self.tts_fd.close()
-                            #pass
-                        elif jsload_data["event"]  == "DialogStateChanged" :#状态切换事件
-                            payload = jsload_data["payload"]
-                            if payload["state"] == "Listening":
-                                self.voice_chat_state = VC_State_Listening
-                                if self.AI_TTS_str != "" or self.AI_ASR_str != "":#有tts数据,则请求TTS数据,没有就请求开始上传语音
-                                    self.AI_client_voice_chat_RequestToRespond()
-                                else:
-                                    self.VC_Speech_Start()#开启线程获取录音数据
-                                    #self.AI_client_voice_chat_send_speech()#开始上传语音
-                                #self.AI_client_voice_chat_RequestToRespond()#chat请求或者tts请求
-                                EventMesh.publish("open_led_red")
-                            if payload["state"] == "Thinking":#准备开始TTS
-                                self.voice_chat_state = VC_State_Thinking
-                                
-                                self.AI_client_tts_data_total_len = 0
-                                EventMesh.publish("open_led_all")
-                            if payload["state"] == "Responding":
-                                self.voice_chat_state = VC_State_Responding
-                                EventMesh.publish("open_led_green")
-                        elif jsload_data["event"]  == "RequestAccepted" :#请求上传语音被允许
-                            #self.voice_chat_state =  VC_State_Responding
-                            #self.AI_client_voice_chat_send_speech()#开始上传语音
-                            pass
-                    else:#下发音频数据
-                        #填充头
-                        #self.tts_fd.write(recv_data)
-                        #recv_data_len = len(recv_data)
-                        # data_len_b = recv_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 = recv_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
-
-                        #print("下发音频数据1:{}".format(len(recv_data)))
-                        # # self.AI_client_tts_data_total_len += len(recv_data)
-                        # # self.AI_client_tts_data_len += len(recv_data)
-                        # #if self.AI_client_tts_data_total_len >10*1024:
-                        # ret=self.AI_audio_queue.put([recv_data,""])
-                        # print("下发音频数据2:{}".format(len(recv_data)))
-                        if self.voice_chat_state >= VC_State_TTSStart:
-                            self.put_record_data([recv_data,""])
-                        #EventMesh.publish("publish_AI_btnInfo",{"func":self.put_record_data,"data":[recv_data,""]}) 
-                except Exception as e:
-                    usys.print_exception(e)
-                
-            except Exception as e:
-                    usys.print_exception(e)
-                    #self.websocket_error()
-                    EventMesh.publish("publish_AI_btnInfo",{"func":self.Close}) 
-                    EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_error})#
-                    break
-        self.AI_client_voice_chat_isconnect = 0
-        self.AI_client_voice_chat_recv_id = 0 
-        print("AI_client_voice_chat_recv END!!!!!!!!!!!!!!!!!!!!!!!!!!!")
-    def put_record_data(self,data):
-        #print("下发音频数据1:{}".format(len(data[0])))
-        # self.AI_client_tts_data_total_len += len(recv_data)
-        # self.AI_client_tts_data_len += len(recv_data)
-        #if self.AI_client_tts_data_total_len >10*1024:
-        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(self,text):
-        if len(text)>60:
-            return -1
-        try:
-            if isinstance(text, str): 
-                if text.find("更改声音") != -1:
-                    self.VC_TTS_voice_num += 1
-                    if self.VC_TTS_voice_num >= len(self.VC_TTS_voice_type):
-                        self.VC_TTS_voice_num = 0
-                    EventMesh.publish("set_storage_config",["VC_TTS_voice_num",self.VC_TTS_voice_num])
-                    # 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 and (text.find("男声") != -1 or text.find("男生") != -1 ):
-                    self.VC_TTS_voice_num = 1
-                    
-                    EventMesh.publish("set_storage_config",["VC_TTS_voice_num",self.VC_TTS_voice_num])
-                    # 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 and  (text.find("女声") != -1 or text.find("女生") != -1 ):
-                    self.VC_TTS_voice_num = 0
-                    
-                    EventMesh.publish("set_storage_config",["VC_TTS_voice_num",self.VC_TTS_voice_num])
-                    # 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 and  (text.find("同声") != -1 or text.find("童声") != -1 ):
-                    self.VC_TTS_voice_num = 2
-                    
-                    EventMesh.publish("set_storage_config",["VC_TTS_voice_num",self.VC_TTS_voice_num])
-                    # 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 and  (text.find("粤语") != -1 or text.find("越野") != -1 ):
-                    self.VC_TTS_voice_num = 3
-                    
-                    EventMesh.publish("set_storage_config",["VC_TTS_voice_num",self.VC_TTS_voice_num])
-                    # 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 and text.find("四川话") != -1 :
-                    self.VC_TTS_voice_num = 4
-                    
-                    EventMesh.publish("set_storage_config",["VC_TTS_voice_num",self.VC_TTS_voice_num])
-                    # 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 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_config",["VC_TTS_voice_num",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 and 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_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 and 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_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 and text.find("查询") != -1:
-                    battery = EventMesh.publish("get_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 and 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 :
-                    self.factory_mode()
-                    return 1
-                if text.find("信号") != -1 and text.find("查询") != -1:
-                    signal = net.csqQueryPoll()
-                    
-                    self.AI_TTS_str = "当前信号{}".format(signal)
-                    return 0
-                
-                if text.find("再见") != -1 or text.find("拜拜") != -1:
-                    EventMesh.publish("publish_AI_btnInfo",{"func":self.Close}) 
-                    return 1
-        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_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_TYPE == VC_play_TYPE_PCM:
-            if self.VC_play_samplerate == 8000:
-                pass
-            elif self.VC_play_samplerate == 16000:
-                if self.play_pcm == None:        
-                    self.play_pcm = audio.Audio.PCM(0,1,16000,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
-    #停止播放声音
-    def VC_Play_End(self):
-        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()
-   
-    def _1S_timer_cb(self,*argc):
-        EventMesh.publish("system_sleep_rest")#防止黑屏
-        self.close_timerout += 1
-        if self.close_timerout > 30:#20秒没数据就close
-            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))
-        #self.LocalRespondingEnded_timerout+=1
-        if self.voice_chat_state == VC_State_TTSEnd and self.AI_audio_queue.empty()  :#self.AI_audio_queue为空且tts下发结束
-            self.LocalRespondingEnded_timerout += 1
-        if self.LocalRespondingEnded_timerout >= 3:
-            self.LocalRespondingEnded_timerout = 0
-            if self.VC_mode == 1 :#长按单次问答模式
-                EventMesh.publish("publish_AI_btnInfo",{"func":self.Close}) 
-            else:
-                #通知服务器播放结束
-                self.AI_client_voice_chat_LocalRespondingEnded()
-        self.pingping_timerout+=1
-        if self.pingping_timerout>5:
-            self.pingping_timerout=0
-            self.AI_client_voice_chat_ping()
-        
-    #VC开始
-    def AI_VC_start(self):
-        
-        self.VC_Play_End()#关闭音频播放
-        
-        #self.aud.aud_tone_play(16,200)#播放按键音
-        self.LocalRespondingEnded_timerout = 0
-        self.close_timerout = 0
-        self.websocket_connect_asr()
-        if self.AI_client_asr_isconnect == 0:
-            return
-        if self.record_data_save_flag == 1:
-            try:
-                uos.remove('/usr/record_data.pcm')
-            except Exception as e:
-                usys.print_exception(e)
-            self.record_fd = open('/usr/record_data.pcm','w')
-        #utime.sleep_ms(50)
-        if self.AI_client_voice_chat_isconnect == 0:#没连接的时候请求开始
-            self.websocket_connect_voice_chat()#连接服务器
-            self.AI_client_voice_chat_start_requset()
-        else:
-            print("self.voice_chat_state :{}".format(self.voice_chat_state ))
-            if self.voice_chat_state > VC_State_SpeechStart:
-                #客户端打断对话
-                print("打断对话")
-                self.AI_client_voice_chat_RequestToSpeak()
-            elif self.voice_chat_state == VC_State_Listening:
-                #直接chat
-                print("直接chat")
-                self.AI_client_voice_chat_RequestToRespond()
-        if self.AI_client_voice_chat_isconnect == 0:
-            return
-        self.voice_chat_state = VC_State_None
-        if self.AI_TTS_str == "":#没有tts要播放的时候才开始录音
-            #开始asr录音
-            self.VC_Speech_Start()
-            pass
-        #开始线程
-        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 ")
-        if self.AI_send_data_queue_thread_id == 0:    
-            _thread.stack_size(self.Audio_buf_size+8*1024)
-            self.AI_send_data_queue_thread_id = _thread.start_new_thread(self.AI_send_data_queue_thread, ())
-            _thread.stack_size(8*1024)
-            print("AI_VC_start :AI_send_data_queue_thread_id :{} ".format(self.AI_send_data_queue_thread_id))
-        self._1S_timer.start(1000,1,self._1S_timer_cb)
-        self.pingping_timerout = 0
-        
-        
-    #开始会话
-    def AI_client_voice_chat_start_requset(self):
-        
-        json_data = \
-        {
-            "header":{
-                "trace_id":self.get_trace_id(),
-                "event":"Start"
-                },
-            "payload":{
-                "dialog_id":self.VC_dialog_id,
-                "device_id":modem.getDevImei(),
-                "user_agent":"python",
-                "in_format":"pcm",
-                "out_format":"mp3",
-                "in_sample_rate":self.VC_record_samplerate,
-                "sample_rate":self.VC_play_samplerate,
-                "space_time": 150,
-                "volume": str(self.VC_TTS_volume),
-                "voice":self.VC_TTS_voice_type[self.VC_TTS_voice_num],
-                "voice_detection":"enabled",
-                "simple_response":True,
-                "custom_variables":{
-                    "bot_name":"{}".format(self.bot_name)
-                }
-                },
-            
-        }
-        if self.VC_play_TYPE == VC_play_TYPE_PCM:
-            json_data["payload"]["out_format"]='pcm'
-        if self.VC_record_TYPE == VC_record_TYPE_AMR :
-            json_data["payload"]["in_format"]='amr'
-            pass
-        if self.VC_mode == 1:
-            json_data["payload"]["voice_detection"]='disable'
-        self.voice_chat_state = VC_State_None
-        self.AI_client_voice_chat_send(ujson.dumps(json_data))
- 
-    #开始上传语音
-    def AI_client_voice_chat_send_speech(self):
-        json_data = \
-        {
-            "header":{
-                "trace_id":self.get_trace_id(),
-                "event":"SendSpeech"
-                },
-            "payload":
-            {
-                "dialog_id":self.VC_dialog_id
-            }
-        }
-        self.AI_client_voice_chat_send(ujson.dumps(json_data))
-        self.VC_Speech_Start()#开启线程获取录音数据
-        self.voice_chat_state =  VC_State_SpeechStart
-    #结束上传语音
-    def AI_client_voice_chat_end_speech(self):
-        json_data = \
-        {
-            "header":{
-                "trace_id":self.get_trace_id(),
-                "event":"StopSpeech"
-                },
-            "payload":{
-                "dialog_id":self.VC_dialog_id
-                }
-        }
-        self.AI_client_voice_chat_send(ujson.dumps(json_data))
-        self.VC_Speech_End()#停止线程录音
-
-    #通知服务器开始播放
-    def AI_client_voice_chat_LocalRespondingStarted(self):
-        json_data = \
-        {
-            "header":{
-                "trace_id":self.get_trace_id(),
-                "event":"LocalRespondingStarted"
-                },
-            "payload":{
-                "dialog_id":self.VC_dialog_id
-                }
-        }
-        self.AI_client_voice_chat_send(ujson.dumps(json_data))
-    #通知服务器播放结束
-    def AI_client_voice_chat_LocalRespondingEnded(self):
-        json_data = \
-        {
-            "header":{
-                "trace_id":self.get_trace_id(),
-                "event":"LocalRespondingEnded"
-                },
-            "payload":{
-                "dialog_id":self.VC_dialog_id
-                }
-        }
-        EventMesh.publish("publish_AI_btnInfo",{"func":self.VC_init}) 
-        EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_client_voice_chat_send,"data":ujson.dumps(json_data)}) 
-        # utime.sleep_ms(1)
-        # self.AI_client_voice_chat_send(ujson.dumps(json_data))
-        self.voice_chat_state = VC_State_End
-    #客户端打断对话
-    def AI_client_voice_chat_RequestToSpeak(self):
-        json_data = \
-        {
-            "header":{
-                "trace_id":self.get_trace_id(),
-                "event":"RequestToSpeak"
-                },
-            "payload":{
-                "dialog_id":self.VC_dialog_id
-                }
-        }
-        print("AI_client_voice_chat_RequestToSpeak!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")
-        EventMesh.publish("publish_AI_btnInfo",{"func":self.VC_init}) 
-        EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_client_voice_chat_send,"data":ujson.dumps(json_data)}) 
-        # utime.sleep_ms(1)
-    #请求TTS或者chat事件
-    def AI_client_voice_chat_RequestToRespond(self):
-        json_data = \
-        {
-            "header":{
-                "trace_id":self.get_trace_id(),
-                "event":"RequestToRespond"
-                },
-            "payload":{
-                "dialog_id":self.VC_dialog_id,
-                "type":"transcript",#prompt是跳过asr,transcript是跳过asr和大模型
-                "text":""
-                }
-        }
-
-        print("AI_client_voice_chat_RequestToRespond!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")
-        if self.AI_TTS_str != "":
-            json_data["payload"]["text"] = self.AI_TTS_str
-            json_data["payload"]["type"] = "transcript"
-            EventMesh.publish("publish_AI_btnInfo",{"func":self.VC_init}) 
-            EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_client_voice_chat_send,"data":ujson.dumps(json_data)}) 
-            self.AI_TTS_str = ""
-        elif self.AI_ASR_str != "":
-            json_data["payload"]["text"] = self.AI_ASR_str
-            json_data["payload"]["type"] = "prompt"
-            EventMesh.publish("publish_AI_btnInfo",{"func":self.VC_init}) 
-            EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_client_voice_chat_send,"data":ujson.dumps(json_data)})
-            self.AI_ASR_str = ""
-        # utime.sleep_ms(1)
-    #发送数据队列
-    def AI_send_data_queue_thread(self):
-        print("AI_send_data_queue_thread:start")
-        count_t = 0
-        while True:
-            if self.AI_send_data_queue.empty() :#不能去掉,去掉会卡死
-                count_t+=1
-                # if count_t%200 == 0:
-                #     print("self.AI_send_data_queue.empty")
-                utime.sleep_ms(1)
-            else:
-                #data[0]是websocket连接对象编号,data[1]是数据
-                #print("AI_send_data_queue_thread:get")
-                data = self.AI_send_data_queue.get()
-                #print("AI_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_send_data_queue_thread:len:{}".format(len(data[1])))
-                        #print("AI_send_data_queue_thread on line asr recv :{} vc recv:{}".format(_thread.threadIsRunning(self.AI_client_asr_recv_id),_thread.threadIsRunning(self.AI_client_voice_chat_recv_id)))
-                        if data[0] == AI_client_voice_chat_num:
-                            # if self.AI_client_voice_chat_isconnect == 0:
-                            #     try:
-                            #         self.websocket_connect_voice_chat() 
-                            #     except Exception as e: #网络连接异常
-                            #         usys.print_exception(e)
-                            self.pingping_timerout = 0
-                            #print("VC: send_data len:{}".format(len(data[1])))
-                            if self.AI_client_voice_chat != None and self.AI_client_voice_chat_isconnect == 1:
-                                self.AI_client_voice_chat.send(data[1])
-                            #print("VC: send_data end")
-
-                        if data[0] == AI_client_asr_num:
-                            #self.pingping_timerout = 0
-                            #print("VC: send_data len:{}".format(len(data[1])))
-                            if self.AI_client_asr != None and self.AI_client_asr_isconnect == 1:
-                                self.AI_client_asr.send(data[1])
-                        #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_voice_chat_num:
-                            #self.websocket_error()
-                            pass
-                            #self.websocket_deconnect_voice_chat()
-                            self.AI_client_voice_chat_isconnect = 0
-                            try:
-                                self.websocket_error()
-                                #self.websocket_deconnect_voice_chat()
-                            except Exception as e: #网络连接异常
-                                usys.print_exception(e)
-                        if data[0] == AI_client_asr_num: 
-                            EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_connect_asr}) #重连
-                         
-    ############################################
-    # 音频队列        
-    def AI_audio_queue_thread(self):
-        print("AI_audio_queue_thread start")
-        count = 0
-        while True:
-            try:
-                # if self.AI_send_data_queue_thread_id == 0:
-                #     break
-                # print("AI_audio_queue_thread")
-                if self.AI_audio_queue.empty() :
-                    utime.sleep_ms(1)
-                    count+=1
-                    if count%5000 == 1:
-                        print("AI_audio_queue_thread on")
-                else:
-                    data = self.AI_audio_queue.get()
-                    self.close_timerout = 0
-                    if self.play_flag == 0:
-                        self.play_flag =1
-                        print("AI_client_voice_chat_LocalRespondingStarted!!!")
-                        self.AI_client_voice_chat_LocalRespondingStarted()#通知服务器开始播放
-                    #self.AI_client_tts_data_len=len(data)
-                    print("\r\naudio_queue:len:{},data{}".format(len(data[0]),len(data[1])))
-                    if len(data[0]) > 10:
-                        try:
-                            if self.VC_play_TYPE == VC_play_TYPE_PCM:
-                                if self.VC_play_samplerate == 8000:
-                                    tmp= self.aud.playStream(1,data[0] )
-                                elif self.VC_play_samplerate == 16000:
-                                
-                                
-                                    
-                                    write_buf = bytearray(data[0])
-                                    #print("play_pcm.stream_write1!!")
-                                    if self.play_pcm != None:
-                                        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_write:{}".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))
-                            
-                            #print("出:{},{}!!!".format(len(data[0]),self.AI_client_tts_data_len))
-                            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.voice_chat_state == VC_State_TTSEnd and self.AI_audio_queue.empty() :#self.AI_audio_queue为空且tts下发结束
-                    #     #通知服务器播放结束
-                    #     self.AI_client_voice_chat_LocalRespondingEnded()
-            except Exception as e:
-                print("AI_audio_queue_thread:ERROR:")
-                usys.print_exception(e)
-        #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(1000, 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')#切换成功
-
-    def Close(self):
-        print("ai_VC Close1!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")
-        self.tts_in_data_len = 0
-        self.tts_out_data_len = 0
-        
-        print("ai_VC Close1.1!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")
-        self.VC_init()
-        self.VC_Speech_End()
-        print("ai_VC Close1.2!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")
-        if self.AI_send_data_queue.empty()!=True:
-            self.AI_send_data_queue.clear()
-        self.AI_TTS_str = ""
-        self.AI_ASR_str = ""
-        self.AI_ASR_str_tmp = ""
-        self.AI_ASR_flag  = 0
-        print("ai_VC Close1.3!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")
-        try:
-        #销毁线程
-            if self.AI_audio_queue_thread_id != 0:
-                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
-            if self.AI_send_data_queue_thread_id != 0:
-                try:
-                    _thread.stop_thread(self.AI_send_data_queue_thread_id)
-                except Exception as e:
-                    usys.print_exception(e)
-            self.AI_send_data_queue_thread_id = 0
-            
-
-        except Exception as e:
-            usys.print_exception(e)
-        print("ai_VC Close2!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")
-        try:
-            self.websocket_deconnect_voice_chat()
-        except Exception as e:
-            usys.print_exception(e)
-        print("ai_VC Close3!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\r\n")
-        try:
-            self.websocket_deconnect_asr()
-        except Exception as e:
-            usys.print_exception(e)
-        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
-    def VC_init2(self):
-        self.VC_init()
-        if self.AI_send_data_queue.empty()!=True:
-            self.AI_send_data_queue.clear()
-        print("ai_VC VC_init2!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")
-        try:
-            self.websocket_deconnect_voice_chat()
-        except Exception as e:
-            usys.print_exception(e)
-        print("ai_VC Close3!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\r\n")
-        self._1S_timer.stop()
-
-
-    def VC_init(self):
-        
-        print("VC_init:AI_send_data_queue:size:{}".format(self.AI_send_data_queue.size()))
-        if self.AI_audio_queue.empty()!=True:
-            self.AI_audio_queue.clear()
-        
-        print("VC_init2")
-        #self.VC_Speech_End()
-        print("VC_init3")
-        self.VC_Play_End()
-        print("VC_init4")
-        
-        EventMesh.publish("close_led")
-        # num = EventMesh.publish("get_volum_size")
-        # if num == None:
-        #     num = 8
-        # self.aud.setVolume(num)#恢复原始音量
+from common import Abstract, LogAdapter\r
+import EventMesh\r
+import uwebsocket\r
+import usys\r
+import gc\r
+import urandom\r
+import uhashlib\r
+import ubinascii\r
+import ujson\r
+import osTimer\r
+import _thread\r
+from queue import Queue\r
+import utime\r
+import audio\r
+import uos\r
+from machine import Pin\r
+from machine import ExtInt\r
+from machine import WDT\r
+import modem\r
+import sim\r
+import net\r
+import base64\r
+import ucryptolib\r
+import urandom as random\r
+import request\r
+import ql_fs\r
+from misc import Power,USB,PowerKey\r
+import ntptime\r
+import machine\r
+class AI_led(Abstract):\r
+    def __init__(self):\r
+        self.led_red = Pin(Pin.GPIO36, Pin.OUT, Pin.PULL_PD, 0)\r
+        self.led_green = Pin(Pin.GPIO21, Pin.OUT, Pin.PULL_PD, 1)\r
+        self.led_white = Pin(Pin.GPIO19, Pin.OUT, Pin.PULL_PD, 1)\r
+        EventMesh.subscribe("open_led_red",self.open_led_red)\r
+        EventMesh.subscribe("open_led_white",self.open_led_white)\r
+        EventMesh.subscribe("open_led_green",self.open_led_green)\r
+        EventMesh.subscribe("open_led_all",self.open_led_all)\r
+        EventMesh.subscribe("close_led",self.close_led)\r
+        EventMesh.publish("open_led_red")\r
+    def open_led_red(self,event,msg):\r
+        print("open_led_red")\r
+        #self.led_red.write(0)\r
+        self.led_white.write(0)\r
+        self.led_green.write(0)\r
+        self.led_red.write(1)\r
+\r
+    def open_led_white(self,event,msg):\r
+        print("open_led_white")\r
+        self.led_red.write(0)\r
+        #self.led_white.write(0)\r
+        self.led_green.write(0)\r
+        self.led_white.write(1)\r
+\r
+    def open_led_green(self,event,msg):\r
+        print("open_led_green")\r
+        self.led_red.write(0)\r
+        self.led_white.write(0)\r
+        #self.led_green.write(0)\r
+        self.led_green.write(1)\r
+\r
+    def open_led_all(self,event,msg):\r
+        print("open_led_all")\r
+        #self.led_red.write(0)\r
+        self.led_white.write(1)\r
+        self.led_green.write(1)\r
+        self.led_red.write(1)\r
+\r
+    def close_led(self,event,msg):\r
+        print("close_led")\r
+        self.led_red.write(0)\r
+        self.led_white.write(0)\r
+        self.led_green.write(0)\r
+audio_buf = ['dianliangshengyu10', 'dianliangshengyu100', 'dianliangshengyu20', 'dianliangshengyu40', 'dianliangshengyu60', 'dianliangshengyu80', 'dianliangshengyu90', 'IMEIhao', 'jianquancuowu', 'key_prompt', 'liuliangtishi', 'Low_power_warning', 'peizhichenggong', 'qiehuanchenggong', 'R_CHARGE_FULL', 'R_CHARGE_IN', 'R_CHARGE_OUT', 'R_POWER_OFF_1', '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_SIM_FAILE', 'xianyikaiji', 'xinhaoruo1', 'xinhaoruo2', 'yinliangyizuida', 'yinliangyizuixiao', 'zhengzaiguanji']\r
+\r
+class AI_dev(Abstract):\r
+    # AI\r
+    def __init__(self):\r
+        self.VBATT_tab = {"charge_full":4300,100 :4250 ,  90:3994 , 80:3883, 60: 3707, 40:3604, 20:3537,  10:3486,}\r
+        self.KeyAI_status = 0\r
+        self.KeyAI_timer_count = 0\r
+        self.KeyAI_long_press = 0\r
+        self.KeyAI_press = 0\r
+        self.KeyAI_timer = osTimer()\r
+        #self.extint_AI = ExtInt(ExtInt.GPIO19,ExtInt.IRQ_RISING_FALLING, ExtInt.PULL_PU, self.keyAI_extint_cb)\r
+        self.extint_AI = ExtInt(ExtInt.GPIO22,ExtInt.IRQ_RISING_FALLING, ExtInt.PULL_PU, self.keyAI_extint_cb)\r
+        self.extint_AI.enable()\r
+        self.pwk_key_status = 0\r
+        self.pwk_key_timer_count = 0\r
+        self.pwk_key_long_press = 0\r
+        self.pwk_key_press = 0\r
+        self.pwk_key_timer = osTimer()\r
+        #self.pwk_key = ExtInt(ExtInt.GPIO26, ExtInt.IRQ_RISING_FALLING, ExtInt.PULL_DISABLE, self.pwk_extint_cb)\r
+        self.pwk_key = ExtInt(ExtInt.GPIO41, ExtInt.IRQ_RISING_FALLING, ExtInt.PULL_PU, self.pwk_extint_cb)\r
+        self.pwk_key.enable() \r
+        self.btnInfo_queue = Queue()\r
+        _thread.stack_size(10*1024)\r
+        _thread.start_new_thread(self.btnInfo_queue_thread, ())\r
+        _thread.stack_size(8*1024)\r
+        EventMesh.subscribe("publish_AI_btnInfo",self.publish_AI_btnInfo)\r
+        EventMesh.subscribe("get_battery",self.get_battery)\r
+        EventMesh.subscribe("audio_montage_play",self.audio_montage_play)\r
+        EventMesh.subscribe("paly_iccid_imei",self.paly_iccid_imei)\r
+        EventMesh.subscribe("paly_device_res_error",self.paly_device_res_error)\r
+        \r
+        self.wdt = WDT(30) #开启看门狗\r
+        # self.wdt_timer = osTimer()\r
+        # self.wdt_timer.start(10000, 1, self.wdt_timer_cb)\r
+        self.pk = PowerKey()\r
+        self.pk.powerKeyEventRegister(self.powerKey_callback)\r
+        self.usb = USB()\r
+        self.usb.setCallback(self.usb_event_cb)\r
+        self.usb_status = self.usb.getStatus()\r
+        self.usb_charge_flag = 0 \r
+        self.AI_dev_timer = osTimer()\r
+        self.AI_dev_timer.start(10000, 1, self.AI_dev_timer_cb)\r
+        self.aud = audio.Audio(0)\r
+        self.VC_TTS_volume =  EventMesh.publish("get_storage_config","VC_TTS_volume")#音量配置\r
+        if self.VC_TTS_volume == None:\r
+            self.VC_TTS_volume = 100\r
+        self.aud.setVolume(self.VC_TTS_volume //10)\r
+        #self.aud.play(1,0,'U:/static/xianyikaiji.mp3')#开机音频\r
+        #EventMesh.publish("audio_montage_play",["xianyikaiji.mp3"])\r
+        #EventMesh.publish("publish_AI_btnInfo",{"func":self.ntptime_cb})\r
+    def ntptime_cb(self):\r
+        #ntptime.settime(8)\r
+        print("timer:{}!!!!!!!!\r\n".format(utime.localtime()))\r
+    def usb_event_cb(self, state):\r
+        EventMesh.publish("publish_AI_btnInfo",{"func":self.usb_event,"data":state})\r
+    def usb_event(self, state):    \r
+        status = state\r
+        self.usb_charge_flag = 0\r
+        if status == 1:#插入USB\r
+            print("charge R_CHARGE_in")\r
+            self.usb_status = 1\r
+            self.aud.stop()\r
+            #self.aud.play(1,1,'U:/static/R_CHARGE_IN.mp3')\r
+            EventMesh.publish("audio_montage_play",["R_CHARGE_IN.mp3"])\r
+            pass\r
+        elif status == 0:#拨出usbs\r
+            self.usb_status = 0\r
+            self.aud.stop()\r
+            EventMesh.publish("audio_montage_play",["R_CHARGE_OUT.mp3"])\r
+            #self.aud.play(1,1,'U:/static/R_CHARGE_OUT.mp3')\r
+    def btnInfo_queue_thread(self):\r
+        while True:\r
+            data = self.btnInfo_queue.get()\r
+            #EventMesh.debug_log("Info_queue:data = {}".format(data))\r
+            if data != None:\r
+                try:\r
+                    if "data" in data :\r
+                        data["func"](data["data"])\r
+                    else :\r
+                        data["func"]()\r
+                except Exception as e:\r
+                    #EventMesh.debug_log("btnInfo_queue:ERROR:{}".format(e))\r
+                    usys.print_exception(e)\r
+    def publish_AI_btnInfo(self,event,msg):\r
+        self.btnInfo_queue.put(msg)\r
+    def powerKey_callback(self, status):\r
+        print("powerKey_callback:{}".format(status))\r
+\r
+    def pwk_extint_cb(self,args):#pwk\r
+        try:\r
+            self.pwk_key_status = int(args[1])\r
+            if self.pwk_key_status == 0:\r
+                self.pwk_key_status = 1\r
+            else:\r
+                self.pwk_key_status = 0\r
+                pass\r
+            if self.pwk_key_status == 0:#按下\r
+                if self.pwk_key_press == 0 :\r
+                    self.pwk_key.disable()\r
+                    self.pwk_key_press = 1\r
+                    self.pwk_key_long_press = 0\r
+                    self.pwk_key_timer.start(100, 1, self.pwk_key_timer_cb)\r
+                    self.pwk_key_timer_count = 0\r
+                    #EventMesh.publish("AI_key_press")\r
+                    \r
+        except Exception as e: \r
+            usys.print_exception(e)\r
+    def pwk_key_timer_cb(self, *args, **kwargs):\r
+        try:\r
+            self.pwk_key_status = self.pwk_key.read_level()\r
+            self.pwk_key_timer_count +=1\r
+            if self.pwk_key_timer_count >= 10*3: #长按3s \r
+                #print("pwk_key_long_press {}".format(self.pwk_key_long_press))\r
+                if self.pwk_key_long_press == 0:\r
+                        self.pwk_key_long_press = 1\r
+                        #EventMesh.publish("AI_key_long_press")\r
+                        EventMesh.publish("publish_AI_btnInfo",{"func":self.pwk_key_Long_Press})  \r
+            if self.pwk_key_status == 1:#松开\r
+                #print("pwk_key_timer_cb:{}".format(self.pwk_key_timer_count))\r
+                if self.pwk_key_timer_count >= 5: #防抖200ms\r
+                    #EventMesh.publish("AI_key_release")\r
+                    EventMesh.publish("publish_AI_btnInfo",{"func":self.pwk_key_release})\r
+                    self.pwk_key.enable()\r
+                    self.pwk_key_timer.stop()\r
+                    self.pwk_key_timer_count = 0\r
+                    self.pwk_key_press = 0\r
+            \r
+        except Exception as e: \r
+            usys.print_exception(e) \r
+            \r
+    def keyAI_extint_cb(self,args):#call 2\r
+        try:\r
+            #print("AI_btn:keyAI_extint_cb{}".format(args[1]))\r
+            self.KeyAI_status = int(args[1])\r
+            if self.KeyAI_status == 0:\r
+                self.KeyAI_status = 1\r
+            else:\r
+                self.KeyAI_status = 0\r
+            \r
+            if self.KeyAI_status == 0:#按下\r
+                if self.KeyAI_press == 0 :\r
+                    self.extint_AI.disable()\r
+                    self.KeyAI_press = 1\r
+                    self.KeyAI_long_press = 0\r
+                    self.KeyAI_timer.start(100, 1, self.KeyAI_timer_cb)\r
+                    self.KeyAI_timer_count = 0\r
+                    #EventMesh.publish("AI_key_press")\r
+                    EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_key_press})  \r
+        except Exception as e: \r
+            usys.print_exception(e)\r
+    def KeyAI_timer_cb(self, *args, **kwargs):\r
+        try:\r
+            self.KeyAI_status = self.extint_AI.read_level()\r
+            self.KeyAI_timer_count +=1\r
+            if self.KeyAI_timer_count >= 10*1: #长按3s \r
+                if self.KeyAI_long_press == 0:\r
+                        self.KeyAI_long_press = 1\r
+                        #EventMesh.publish("AI_key_long_press")\r
+                        EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_key_long_press})  \r
+            if self.KeyAI_status == 1:#松开\r
+                #print("KeyAI_timer_cb:{}".format(self.KeyAI_timer_count))\r
+                if self.KeyAI_timer_count >= 5: #防抖200ms\r
+                    #EventMesh.publish("AI_key_release")\r
+                    EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_key_release})  \r
+                    self.extint_AI.enable()\r
+                    self.KeyAI_timer.stop()\r
+                    self.KeyAI_timer_count = 0\r
+                    self.KeyAI_press = 0\r
+            \r
+        except Exception as e: \r
+            usys.print_exception(e) \r
+       \r
+    def AI_key_press(self):\r
+        #print("AI_key_press")\r
+        EventMesh.publish("AI_key_press")\r
+    def AI_key_long_press(self):\r
+        #print("AI_key_long_press")\r
+        EventMesh.publish("AI_key_long_press")\r
+        \r
+    def AI_key_release(self):\r
+        #print("AI_key_release")\r
+        EventMesh.publish("AI_key_release")\r
+    def pwk_key_Long_Press(self):\r
+        print("pwk_key_long_press!!!!!!!")\r
+        print("pwk_key_long_press!!!!!!!")\r
+        \r
+        # EventMesh.publish("paly_iccid_imei")\r
+        # return\r
+        EventMesh.publish("audio_montage_play",["zhengzaiguanji.mp3"])\r
+        #self.aud.play(1,0,'U:/static/zhengzaiguanji.mp3')#关机音频\r
+        EventMesh.publish("open_led_red")\r
+        utime.sleep_ms(3000)\r
+        Power.powerDown()\r
+        #print("AI_key_release")\r
+        EventMesh.publish("pwk_key_long_press")\r
+        \r
+    def pwk_key_release(self):\r
+        #print("pwk_key_release")\r
+        EventMesh.publish("pwk_key_release")\r
+\r
+    def AI_dev_timer_cb(self, *args, **kwargs):\r
+        EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_dev_timer_event})  \r
+    def AI_dev_timer_event(self):\r
+        self.wdt.feed()\r
+        Vbatt = Power.getVbatt()\r
+        if self.usb_charge_flag == 0 and self.usb_status == 1 and Vbatt>=self.VBATT_tab["charge_full"]:#充电充满\r
+            EventMesh.publish("audio_montage_play",["R_CHARGE_FULL.mp3"])\r
+            #self.aud.play(1,0,'U:/static/R_CHARGE_FULL.mp3')#充电已满\r
+            self.usb_charge_flag = 1\r
+        if self.usb_charge_flag == 0 and self.usb_status == 0 and Vbatt<self.VBATT_tab[10]:#低电报警\r
+            #self.aud.play(1,0,'Low_power_warning.mp3')\r
+            EventMesh.publish("audio_montage_play",["Low_power_warning.mp3"])\r
+            self.usb_charge_flag = 1\r
+        pass\r
+    def get_battery(self, event=None, msg=None):\r
+        Vbatt = Power.getVbatt()\r
+        if Vbatt>self.VBATT_tab[90]:\r
+            return 100\r
+        if Vbatt>self.VBATT_tab[80]:\r
+            return 90\r
+        if Vbatt>self.VBATT_tab[60]:\r
+            return 80\r
+        if Vbatt>self.VBATT_tab[40]:\r
+            return 60\r
+        if Vbatt>self.VBATT_tab[20]:\r
+            return 40\r
+        if Vbatt>self.VBATT_tab[10]:\r
+            return 20\r
+        if Vbatt<=self.VBATT_tab[10]:\r
+            return 10\r
+    def audio_montage_play(self,event,msg):\r
+        self.aud.stopPlayStream()\r
+        str_data='mp3files='\r
+        for i in msg:\r
+            try:\r
+                str_tmp = i.replace(".mp3","")\r
+                str_data+="{}.mp3+".format(audio_buf.index(str_tmp))\r
+            except Exception as e:\r
+                    usys.print_exception(e)    \r
+        str_data = str_data[:-1]\r
+        print("audio_montage_play:{}".format(str_data))\r
+        self.aud.montage_play('U:/static/audio.bin',1,1,str_data)\r
+    def paly_iccid_imei(self,event,msg):\r
+        str_data = 'mp3files={}.mp3+'.format(audio_buf.index("liuliangtishi"))#流量提示\r
+        imei  = modem.getDevImei()\r
+        iccid = sim.getIccid()\r
+        if iccid != -1 and len(iccid) > 5:\r
+            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(iccid[0]))\\r
+                ,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])),\\r
+                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])),\\r
+                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])),\\r
+                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])))\r
+        str_data += '{}.mp3+'.format(audio_buf.index("IMEIhao"))#IMEI号为:\r
+        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]))\\r
+                ,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])),\\r
+                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])),\\r
+                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])),\\r
+                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])))\r
+        #print("str_data:{}".format(str_data))\r
+        self.aud.montage_play('U:/static/audio.bin',1,1,str_data)\r
+    #鉴权出错,播放imei号\r
+    def paly_device_res_error(self,event,msg):\r
+        str_data = 'mp3files={}.mp3+'.format(audio_buf.index("jianquancuowu"))#AI功能异常,请联系客户查询,设备号为:\r
+        imei  = modem.getDevImei()\r
+        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]))\\r
+                ,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])),\\r
+                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])),\\r
+                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])),\\r
+                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])))\r
+        #print("str_data:{}".format(str_data))\r
+        self.aud.montage_play('U:/static/audio.bin',1,1,str_data)\r
+#存储信息\r
+class getStorageDataManager(Abstract):#获取内存数据\r
+        def __init__(self):\r
+            self.config_data = {}\r
+            check = ql_fs.path_exists("/usr/static/storage_file/config.json")\r
+            if check == True:\r
+                with open("/usr/static/storage_file/config.json","r") as fd:\r
+                    self.config_data = ujson.load(fd)\r
+            else :\r
+                self.config_data = {'old_time': 0, 'flip_sw': 0}\r
+                pass\r
+\r
+        def post_processor_after_instantiation(self):\r
+            EventMesh.subscribe("set_storage_data", self.set_storage_data)\r
+            EventMesh.subscribe("set_storage_config", self.set_storage_config)\r
+            EventMesh.subscribe("get_storage_data", self.get_storage_data)\r
+            EventMesh.subscribe("get_storage_config", self.get_storage_config)\r
+\r
+        def set_storage_data(self, event, msg): \r
+            # EventMesh.debug_log("set_storage_data:{}".format(msg))\r
+            if msg != None:\r
+                self.config_data = msg\r
+                with open("/usr/static/storage_file/config.json",'w+',encoding="utf-8") as fd:\r
+                    ujson.dump(self.config_data,fd)\r
+        \r
+\r
+        def set_storage_config(self,event,msg): \r
+            # EventMesh.debug_log("set_storage_key_data1:{}".format(msg))\r
+            if len(msg) >= 2:\r
+                self.config_data[msg[0]]=msg[1]\r
+                # EventMesh.debug_log("set_storage_key_data2:{}".format(self.config_data[msg[0]]))\r
+                EventMesh.publish("publish_message_event_ui",{"func":self.set_storage_save,"data":0})\r
+        def set_storage_save(self, data): \r
+            with open("/usr/static/storage_file/config.json",'w+',encoding="utf-8") as fd:\r
+                ujson.dump(self.config_data,fd)\r
+        def get_storage_data(self, event, msg): \r
+            # EventMesh.debug_log("get_storage_data:{}".format(self.config_data))\r
+            return self.config_data \r
+        def get_storage_config(self,event,msg):\r
+            # EventMesh.debug_log("get_storage_key_data1:{}".format(msg))\r
+            b = msg in self.config_data.keys()\r
+            if b == True:\r
+                # EventMesh.debug_log("get_storage_key_data2:{}".format(self.config_data[msg]))\r
+                return self.config_data[msg]\r
+            else :\r
+                return None\r
+            # try:\r
+            #     return self.config_data[msg]\r
+            # except:\r
+            #     EventMesh.debug_log("get_storage_key_data:none key:{}",msg)\r
+            #     return None\r
+#设备资源授权平台\r
+class device_res_author(Abstract):\r
+   \r
+    def __init__(self) :\r
+        self.deviceId = modem.getDevImei()#"876226002022574"\r
+        self.SHA1_BLOCK_SIZE = 64\r
+        self.PAD_BLOCK_SIZE = 16\r
+        self.SHA256 = uhashlib.sha256\r
+        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)\r
+        # 除去补16字节的多余字符\r
+        self.unpad = lambda s: s[:-s[-1]]\r
+        #K01\r
+        # self.key = b"MWrMZjdtcPhj41jWuoqFAhTmqyFluqj1" \r
+        # self.pid = "qAtdDOGXgXYjT2HGFr3a"\r
+        #G15\r
+        # self.key = b"3LWfBicxfRZ3ZAqmZCFuvMdGUXdAFWkb" \r
+        # self.pid = "qLx4Pu4mSUQxyfVKGLXG"\r
+        #7pin\r
+        self.key = b"uKLrChwrxA1LklgBc3VwawYjUkbT3BgX" \r
+        self.pid = "cqxJZi5CNgzjS3mX21Zw"\r
+        \r
+        self.dev_res_timer = osTimer()\r
+        self.dev_res_timer.start(10000, 1, self.dev_timer_cb)\r
+        self.dev_res_timerCount = 0\r
+        self.ud_token_timer = osTimer()\r
+        self.ud_token_timer.start(30000, 1, self.ud_token_timer_cb)\r
+        self.ud_token_timer_Count = 0\r
+        self.dev_token = None\r
+        self.res_error_count = 0\r
+        EventMesh.subscribe("get_dev_token", self.get_dev_token)\r
+        EventMesh.subscribe("update_dev_token", self.update_dev_token)\r
+        self.dev_active() #设备激活\r
+        self.dev_sign_in() #设备登入\r
+        self.ntptime_flag = 0\r
+\r
+    def get_dev_token(self, event, msg): \r
+        return self.dev_token\r
+    #网络校时\r
+    def dev_NTP(self):\r
+        url = "http://dmp.raisound.com/bz-api/dev/time"\r
+        response = request.get(url)\r
+        data = response.json()\r
+        print("dev_NTP:{}".format(data))\r
+        if data:\r
+            try:\r
+                timeSecond = data["data"]["timestamp"]//1000\r
+                \r
+                next_alarm_time = utime.localtime(timeSecond)\r
+                print("timeSecond {} next_alarm_time {}".format(timeSecond,next_alarm_time))\r
+                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))\r
+            except Exception as e:\r
+                    usys.print_exception(e)\r
+    def dev_timer_cb(self, *args): #设备资源管理鉴权平台定时器\r
+        EventMesh.publish("publish_AI_btnInfo",{"func":self.dev_timer_cb_}) \r
+\r
+    def dev_timer_cb_(self):    \r
+        #if EventMesh.DEV_RES_MANAGE_AUTHEN_PLATFORM == 1:\r
+        if self.dev_token == None:\r
+            if self.ntptime_flag == 0:\r
+                self.ntptime_flag  = 1\r
+                EventMesh.publish("publish_AI_btnInfo",{"func":self.dev_NTP})\r
+            print("timer:{}!!!!!!!!\r\n".format(utime.localtime()))\r
+            self.dev_active() #设备激活\r
+            self.dev_sign_in() #设备登入\r
+            self.dev_res_timerCount+=1\r
+            if self.dev_res_timerCount > 6: #开机一分钟内没有获取到密码和token 等下一次更新令牌在走登入 激活流程\r
+                self.dev_res_timerCount=0\r
+                self.dev_res_timer.stop()\r
+    def ud_token_timer_cb(self, *args): \r
+        EventMesh.publish("publish_AI_btnInfo",{"func":self.ud_token_timer_cb_}) \r
+\r
+    def ud_token_timer_cb_(self):   \r
+        #print("ud_token_timer_!!!!")\r
+        self.ud_token_timer_Count+=1\r
+        if self.ud_token_timer_Count >= 20: #定时30*200s时更新token\r
+            self.ud_token_timer_Count = 0\r
+            EventMesh.publish("update_dev_token")\r
+            \r
+    def get_sim_Status(self):\r
+        return sim.getStatus() \r
+    def HMAC(self,k, m):\r
+    \r
+        KEY_BLOCK = k + (b'\0' * (self.SHA1_BLOCK_SIZE - len(k)))\r
+        KEY_INNER = bytes((x ^ 0x36) for x in KEY_BLOCK)\r
+        KEY_OUTER = bytes((x ^ 0x5C) for x in KEY_BLOCK)\r
+        inner_message = KEY_INNER + m\r
+        outer_message = KEY_OUTER + self.SHA256(inner_message).digest()\r
+        return self.SHA256(outer_message)\r
+    def get_hmac_sha256(self,k, m):\r
+        data = self.HMAC(k, m).digest()\r
+        # print("HMAC(k, m).digest():", data)\r
+        # print("HMAC(k, m).digest():", ubinascii.hexlify(data))\r
+        hex_data = ubinascii.hexlify(data)\r
+        hex_data = hex_data.decode('ascii')\r
+        return hex_data\r
+    # 加密函数\r
+    def aes_CBC_Encrypt(self,data, key, iv):  # CBC模式的加密函数,data为明文,key为16字节密钥,iv为16字节的偏移量\r
+        key = key.encode('utf-8')\r
+        iv = iv.encode('utf-8')  # CBC 模式下的偏移量\r
+        data = self.pad(data)  # 补位\r
+        data = data.encode('utf-8')\r
+        aes = ucryptolib.aes(key,ucryptolib.MODE_CBC,iv)\r
+        result = base64.b64encode(aes.encrypt(data))\r
+        return str(result, 'utf-8')  # 以字符串的形式返回\r
+\r
+    # 解密函数\r
+    def aes_CBC_Decrypt(self,data, key, iv):  # CBC模式的解密函数,data为密文,key为16字节密钥\r
+        key = key.encode('utf-8')\r
+        iv = iv.encode('utf-8')\r
+        \r
+        aes = ucryptolib.aes(key,ucryptolib.MODE_CBC,iv) #CBC模式\r
+\r
+        # decrypt AES解密  B64decode为base64 转码\r
+        result = aes.decrypt(base64.b64decode(data))\r
+        result = self.unpad(result)  # 除去补16字节的多余字符\r
+        return str(result, 'utf-8')  # 以字符串的形式返回\r
+    #激活接口 没有密码走激活\r
+    def dev_active(self):\r
+        signal = net.csqQueryPoll()\r
+        if signal == -1 or self.get_sim_Status() != 1:#网络不正常\r
+            print("dev_active 无 SIM卡!!!!!!!!\r\n")\r
+            return\r
+        # 签名内容: = deviceId+pid+timeStamp\r
+        dev_pass = ""\r
+        dev_pass = EventMesh.publish("get_storage_config","dev_pass")\r
+        print("dev_pass:{}\r\n".format(dev_pass))\r
+        if dev_pass == None:\r
+            dev_pass = ""\r
+        if dev_pass == "" or dev_pass == None:\r
+            date_tmp = utime.localtime() #获取当前时间\r
+            print("date_tmp:{}\r\n".format(date_tmp)) #转换时间戳s\r
+            timeStamp = (utime.mktime(date_tmp))*1000#获取时间戳ms\r
+            deviceId = self.deviceId #"876226002022574" #以imei号\r
+            pid = self.pid\r
+            key = self.key\r
+            sign_data = "{}{}{}".format(deviceId,pid,timeStamp)  #签名内容\r
+            print("sign_data:{}\r\n".format(sign_data))\r
+            sha256_hex = self.get_hmac_sha256(key,sign_data)\r
+            print("sha256_hex:{}\r\n".format(sha256_hex))\r
+\r
+            data = {\r
+                "deviceId":"{}".format(deviceId), #设备名\r
+                "pid":pid, #产品PID\r
+                "sign":"{}".format(sha256_hex), #HMACSHA256签名后的数据\r
+                "timeStamp":timeStamp, #要以ms的形式\r
+                "signMethod":"HMACSHA256" #签名方式 HMACSHA256\r
+            }\r
+            print(ujson.dumps(data))\r
+            headers_T ={"Content-Type":"application/json"}\r
+            url = "http://dmp.raisound.com/bz-api/dev/auth/active"\r
+            data =ujson.dumps(data)\r
+            response = 0\r
+            response_result = 0\r
+            try:\r
+                response = request.put(url,data=data,headers = headers_T)\r
+                response_result = 1\r
+            except Exception as e:\r
+                print("put error!!!!!\r\n")\r
+                response_result = 0\r
+            \r
+            IV = "" #偏移量\r
+            PASSWORD= "" #服务器返回后的加密内容 密码\r
+            if response_result == 1: #访问成功ip\r
+                if response.status_code == 200:\r
+                    print("headers:{}".format(response.headers))\r
+                    content = response.content\r
+                    c = next(content)\r
+                    # "api.xcloudtech.com"\r
+                    # d_server_port = 9000\r
+                    data =  ujson.loads(c)\r
+                    # data = response.json()\r
+                    print("data-{}".format(data))\r
+                    if data != None:\r
+                        if "success" in data:\r
+                            if data['success'] == True:\r
+                                if "data" in data:\r
+                                    data_tmp = data["data"]\r
+                                    if "nonce" in data_tmp: #偏移量\r
+                                        IV = data_tmp["nonce"]\r
+                                    if "password" in data_tmp:\r
+                                        PASSWORD = data_tmp["password"]\r
+                                        # EventMesh.publish("set_storage_config",["dev_pass",PASS])\r
+                            if data["code"] == 20001:#鉴权成功\r
+                                pass\r
+                            elif data["code"] > 50000:#时间错误\r
+                                self.res_error_count+=1\r
+                                if self.res_error_count>=3:\r
+                                    self.res_error_count = 0\r
+                                    EventMesh.publish("paly_device_res_error")\r
+                                if data["code"] == 50003:#时间错误\r
+                                    self.ntptime_flag  = 0\r
+                    if PASSWORD != None and IV != None:\r
+                        if len(PASSWORD) != 0 and len(IV) != 0:\r
+                            password = PASSWORD\r
+                            iv = IV\r
+                            #解密 之后保存本地下一次登入做使用\r
+                            decrypt_data = self.aes_CBC_Decrypt(password, self.key, iv) #对服务器下发的密码进行解密\r
+                            print("decrypt_data {}".format(decrypt_data))\r
+                            EventMesh.publish("set_storage_config",["dev_pass",decrypt_data])\r
+                    \r
+                        \r
+                print("IV:{}\r\n PASS:{}".format(IV,PASSWORD)) \r
+            return [response_result,PASSWORD,IV]\r
+    #随机生成16个字节的字符串作为加密的IV 偏移量\r
+    def generate_random_string(self,length=16): \r
+        random_str = ""\r
+        chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'\r
+        for i in range(length):\r
+            random_str+=chars[random.randint(0,length)]\r
+        return random_str\r
+\r
+    #设备登入 没有Token 走登入获取token\r
+    def dev_sign_in(self):\r
+        signal = net.csqQueryPoll()\r
+        if signal == -1 or self.get_sim_Status() != 1:#网络不正常\r
+            print("dev_sign_in 无 SIM卡!!!!!!!!\r\n")\r
+            return\r
+        token = ""\r
+        token = self.dev_token\r
+        dev_pass = EventMesh.publish("get_storage_config","dev_pass") \r
+        #print("token:{}\r\n".format(token))\r
+        if token == None:\r
+            token = ""\r
+        if dev_pass == None:\r
+            dev_pass = ""\r
+        if len(dev_pass) == 0:#没有密码\r
+            return\r
+        if token == None or token == "":\r
+            if 1: #返回结果成功\r
+                #获取本地保存的密码\r
+                decrypt_data=EventMesh.publish("get_storage_config","dev_pass")\r
+                # decrypt_data = self.aes_CBC_Decrypt(password, self.key, iv) #对服务器下发的密码进行解密\r
+                print("decrypt_data {}".format(decrypt_data))\r
+                #随机生成16个字符串 设备生成做加密使用\r
+                random_string = self.generate_random_string(16) #随机的16个字符串\r
+                enc_iv = random_string #加密的IV偏移量\r
+                #设备端进行密码加密\r
+                encrypt_data = self.aes_CBC_Encrypt(decrypt_data, self.key, enc_iv)\r
+                print("encrypt_data {}".format(encrypt_data))\r
+\r
+                #登入数据\r
+                deviceId = self.deviceId\r
+                sign_in_data = {\r
+                    "deviceId":"{}".format(deviceId), #设备ID\r
+                    "password":"{}".format(encrypt_data), #加密的数据\r
+                    "nonce":"{}".format(random_string) #随机的16个字符串\r
+                }\r
+                print(ujson.dumps(sign_in_data))\r
+                sign_url = "http://dmp.raisound.com/bz-api/dev/auth/sign_in" #登入地址\r
+                headers_T ={"Content-Type":"application/json"}\r
+                response_result = 0\r
+                response = 0\r
+                try:\r
+                    response = request.post(sign_url,data=ujson.dumps(sign_in_data),headers = headers_T)\r
+                    response_result = 1\r
+                except Exception as e:\r
+                    print("post error!!!!!\r\n")\r
+                    response_result = 0\r
+                # {'msg': '', 'code': 20001, 'success': True, \r
+                # 'data': {'deviceId': '876226002022574', \r
+                # 'token': '95436a9e09fd0ff89feb8825257dca982f'}\r
+                # }\r
+                token = ""\r
+                if response_result == 1:\r
+                    if response.status_code == 200:\r
+                        content = response.content\r
+                        c = next(content)\r
+                        data =  ujson.loads(c)\r
+                        print("data-{}".format(data))\r
+                        if data != None:\r
+                            if "success" in data:\r
+                                if data['success'] == True: #登入成功\r
+                                    if "data" in data:\r
+                                        data_tmp = data["data"]\r
+                                        if "token" in data_tmp: #token\r
+                                            self.dev_token = data_tmp["token"]\r
+                                if data["code"] == 50003:#时间错误\r
+                                    self.ntptime_flag  = 0\r
+                print("token:{}\r\n".format(token))\r
+                pass\r
+    #获取新的令牌 更新token\r
+    def update_dev_token(self, event, msg):\r
+        print("update_dev_token")\r
+        dev_pass = ""\r
+        dev_pass = EventMesh.publish("get_storage_config","dev_pass")\r
+        \r
+        if dev_pass == None:\r
+            dev_pass = ""\r
+        if len(dev_pass) == 0: #没有密码走激活\r
+            print("no dev_pass:{}\r\n".format(dev_pass))\r
+            self.dev_active()\r
+        token = self.dev_token\r
+        if token == None:\r
+            token = ""\r
+        if len(token) == 0: #没有token走登入\r
+            print("no dev_token:{}\r\n".format(token))\r
+            self.dev_sign_in()\r
+\r
+        dev_tokenip = "http://dmp.raisound.com/bz-api/dev/auth/token" #设备新令牌更新地址\r
+        token = self.dev_token\r
+        if token == None:\r
+            token = ""\r
+        if len(token) != 0:\r
+            response_result=0\r
+            response = 0\r
+            headers_T = {"bz-dt":"{}".format(token)}\r
+            try:\r
+                response = request.get(dev_tokenip,headers = headers_T)\r
+                response_result = 1\r
+            except Exception as e:\r
+                print("get error!!!!!\r\n")\r
+                response_result = 0\r
+            if response_result == 1:\r
+                if response.status_code == 200:\r
+                    try:\r
+                        headers_data = response.headers\r
+                        # print("headers_data!!!!! headers_data:{}\r\n".format(headers_data))\r
+                        if "bz-dt" in headers_data: #bz-dt字段是否在头部数据里面 如果有就需要更新\r
+                            bz_dt = headers_data["bz-dt"] \r
+                            self.dev_token = bz_dt.replace(" ", "") #去掉所有的空格符\r
+                            print("update_dev_token:{}".format(self.dev_token))\r
+                    except Exception as e:\r
+                        print("headers_data!!!!! error\r\n")\r
+        \r
+        pass\r
+\r
+\r
+\r
+\r
+#阿里voice_chat状态枚举\r
+VC_State_None=0\r
+VC_State_Listening=1#听\r
+VC_State_SpeechStart=2#说开始\r
+VC_State_SpeechEnd=3#说结束\r
+VC_State_Thinking=4#想(chat)\r
+VC_State_Responding=5#音频播放\r
+VC_State_TTSStart=6\r
+VC_State_TTSData=7\r
+VC_State_TTSFinish=8\r
+VC_State_TTSEnd=9\r
+VC_State_TTSError=10\r
+VC_State_DialogError=11\r
+VC_State_End=12\r
+\r
+VC_record_TYPE_PCM = 0\r
+VC_record_TYPE_AMR = 1\r
+VC_play_TYPE_PCM = 0\r
+VC_play_TYPE_MP3 = 1\r
+\r
+#websocket发送数据编号\r
+# AI_client_asr_num = 0\r
+# AI_client_chat_num = 1\r
+# AI_client_tts_num = 2\r
+AI_client_voice_chat_num = 3\r
+AI_client_asr_num = 4\r
+class AI_VC(Abstract):\r
+    # AI\r
+    \r
+    def __init__(self):\r
+        self.record_data_save_flag = 0 #是否保存录音文件\r
+        self.record_fd = None\r
+        #self.VC_mode = 0 #0:短按连续问答模式 1:长按录音模式\r
+        self.VC_mode = EventMesh.publish("get_storage_config","VC_mode")#音色配置\r
+        if self.VC_mode == None :\r
+            self.VC_mode = 0\r
+\r
+        self.VC_server = 2 #0正式服务器,1:测试服务器1,2:测试服务器2\r
+        self.VC_record_TYPE = VC_record_TYPE_PCM #0:PCM 1:AMR\r
+        self.VC_play_TYPE = VC_play_TYPE_PCM #0:PCM 1:mp3 \r
+        self.VC_record_samplerate = 16000\r
+        self.VC_play_samplerate = 16000\r
+        #女,男,童,粤,川\r
+        self.VC_TTS_voice_type = {0:"huoshan::zh_female_xinlingjitang_moon_bigtts",1:"huoshan::zh_male_wennuanahu_moon_bigtts",2:"huoshan::ICL_zh_female_huoponvhai_tob",\r
+                                  3:"aliyun::longjiaxin",4:"huoshan::zh_female_daimengchuanmei_moon_bigtts"}\r
+        #self.VC_TTS_voice_type = ["aliyun::longxiaoxia","aliyun::longnan","aliyun::longling"]\r
+        self.VC_TTS_voice_num = EventMesh.publish("get_storage_config","VC_TTS_voice_num")#音色配置\r
+        if self.VC_TTS_voice_num == None or self.VC_TTS_voice_num>=len(self.VC_TTS_voice_type):\r
+            self.VC_TTS_voice_num = 0\r
+         \r
+        self.VC_TTS_volume =  EventMesh.publish("get_storage_config","VC_TTS_volume")#音量配置\r
+        if self.VC_TTS_volume == None:\r
+            self.VC_TTS_volume = 100\r
+        self.AI_audio_queue_thread_id = 0\r
+        self.AI_send_data_queue_thread_id = 0\r
+\r
+        self.AI_record_tmp_queue = Queue(100)\r
+        self.AI_send_data_queue = Queue(100)\r
+        self.AI_audio_queue = Queue(100)\r
+        self.AI_TTS_str = ""\r
+        self.AI_ASR_str = ""\r
+        self.AI_ASR_flag = 0\r
+        self.AI_ASR_str_tmp = ""\r
+        # #开始线程\r
+        # if self.AI_audio_queue_thread_id ==0:\r
+        #     self.AI_audio_queue_thread_id = _thread.start_new_thread(self.AI_audio_queue_thread, ())\r
+        # else:\r
+        #     print("AI_VC_start :AI_audio_queue_thread_id != 0 ")\r
+        # if self.AI_send_data_queue_thread_id == 0:    \r
+        #     self.AI_send_data_queue_thread_id = _thread.start_new_thread(self.AI_send_data_queue_thread, ())\r
+            \r
+        self.voice_chat_state = VC_State_None #阿里ai voice_chat状态\r
+        self.VC_dialog_id = ""\r
+        self.VC_message_id=None\r
+        self.VC_task_id =None\r
+        self.AI_client_voice_chat = None\r
+        self.AI_client_voice_chat_recv_id = 0\r
+        self.AI_client_voice_chat_isconnect =0\r
+\r
+        self.asr_state = VC_State_None #阿里VC_ASR voice_chat状态\r
+        self.VC_asr_dialog_id = ""\r
+        self.VC_asr_message_id=None\r
+        self.VC_asr_task_id =None\r
+        self.AI_client_asr = None\r
+        self.AI_client_asr_recv_id = 0\r
+        self.AI_client_asr_isconnect =0\r
+\r
+        self.asr_satrt_flag = 0\r
+\r
+        self.record_pcm = None\r
+        self.play_pcm = None\r
+        self.VC_record_thread_id = 0\r
+        self.pingping_timerout = 0\r
+        \r
+        self.factory_timer = osTimer()\r
+        self._1S_timer = osTimer()\r
+        self.Audio_buf_size = 16*1024\r
+        self.record = audio.Record()\r
+        #self.record.end_callback(self.record_callback)\r
+        self.record.gain_set(4,10)\r
+        self.aud = audio.Audio(0)\r
+        self.aud.setCallback(self.audio_cb)\r
+        #self.aud.setVolume(self.VC_TTS_volume //10)\r
+        self.audio_play_state = 1 #音频播放完状态\r
+        self.close_timerout = 0\r
+        self.LocalRespondingEnded_timerout = 0\r
+        \r
+        self.play_flag = 0\r
+        self.VC_record_state_flag = 0\r
+        self.AI_key_long_press_flag = 0\r
+        self.websocket_error_count = 0\r
+\r
+        self.tts_in_data_len = 0\r
+        self.tts_out_data_len = 0\r
+        EventMesh.subscribe("AI_key_press", self.AI_key_press)\r
+        EventMesh.subscribe("AI_key_release", self.AI_key_release)\r
+        EventMesh.subscribe("AI_key_long_press", self.AI_key_long_press)\r
+        EventMesh.subscribe("pwk_key_release", self.pwk_key_release)\r
+        EventMesh.subscribe("get_AI_audio_queue", self.get_AI_audio_queue)\r
+        \r
+        EventMesh.publish("close_led")\r
+        #开机提示语,如果联网失败,直接提示信号弱\r
+        #女,男,童,粤,川\r
+        self.bot_name = "柒先生"\r
+        if self.VC_TTS_voice_num == 0 or self.VC_TTS_voice_num == 3 or self.VC_TTS_voice_num == 4:\r
+            self.bot_name = "柒妹妹"\r
+        elif self.VC_TTS_voice_num == 1:\r
+            self.bot_name = "柒先生"\r
+        elif self.VC_TTS_voice_num == 2:\r
+            self.bot_name = "柒思思"\r
+        self.AI_TTS_str = "您好!我是柒牌 AI 智能男装生活好帮手-{}, 很高兴为您服务,我可以帮您解答日常生活、工作,旅游信息、健康咨询、教育与学习、情感交流、全球资讯等问题!请问您有什么需要我帮忙的吗?".format(self.bot_name )\r
+        EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_VC_start}) \r
+\r
+    def post_processor_after_instantiation(self):\r
+        pass\r
+    def get_AI_audio_queue(self, event, msg):\r
+        return self.AI_audio_queue\r
+    def audio_cb(self,event):\r
+        if event == 0:\r
+            self.audio_play_state =1\r
+            #EventMesh.publish("set_audio_state", 1)\r
+            print('audio-play start.')\r
+        elif event == 7:\r
+            self.audio_play_state = 0\r
+            #EventMesh.publish("set_audio_state", 0)   \r
+            print('audio-play finish.!!!!!!')\r
+\r
+    def AI_key_press(self, event, msg):#按键按下\r
+        print("AI_key_press")\r
+        self.aud.aud_tone_play(16,200)#播放按键音\r
+        self.asr_satrt_flag = 1#\r
+        self.AI_TTS_str = ""#"你好,有什么吩咐"\r
+        self.AI_ASR_str = ""\r
+        self.AI_ASR_str_tmp = ""\r
+        # if self.voice_chat_state != VC_State_None:\r
+        #     EventMesh.publish("publish_AI_btnInfo",{"func":self.Close}) \r
+        #     EventMesh.publish("publish_AI_btnInfo",{"func":utime.sleep_ms,'data':(10)})\r
+        EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_VC_start}) \r
+        # self.Close()\r
+        # self.AI_VC_start()\r
+        self.AI_key_long_press_flag = 0\r
+\r
+    def AI_key_release(self, event, msg):#按键弹起\r
+        print("AI_key_release123")\r
+        if self.AI_key_long_press_flag == 1 :#有长按\r
+            self.AI_client_voice_chat_end_speech()\r
+        else :\r
+            if self.VC_mode == 1 :#长按单次问答模式\r
+                EventMesh.publish("audio_montage_play",["key_prompt.mp3"])\r
+                #self.aud.play(1,1,'U:/static/key_prompt.mp3')#提示请您按住中间的按钮开始讲话,讲完松开即可\r
+                self.AI_send_data_queue.clear()\r
+                try:\r
+                    self.websocket_deconnect_voice_chat()\r
+                except Exception as e:\r
+                    usys.print_exception(e)\r
+                self.VC_Speech_End()\r
+    def AI_key_long_press(self, event, msg):#按键长按\r
+        print("AI_key_long_press")\r
+        self.AI_key_long_press_flag = 1\r
+\r
+    def pwk_key_release(self, event, msg):#电源键短按,关闭\r
+        print("pwk_key_release")\r
+        EventMesh.publish("publish_AI_btnInfo",{"func":self.Close}) \r
+\r
+    \r
+#****************************************ASR连接**********************************************************************\r
+    def websocket_connect_asr(self):\r
+        print("websocket_connect_asr:{} {}!!!!!!!!!!!!!!!!!!!!!".format(self.AI_client_asr_isconnect,_thread.threadIsRunning(self.AI_client_asr_recv_id)))\r
+        if self.AI_client_asr_isconnect == 1:\r
+            return\r
+        # 创建VC客户端\r
+        try:\r
+            signal = net.csqQueryPoll()\r
+            if signal == -1 or sim.getStatus() != 1:#网络正常\r
+                self.websocket_error()\r
+                return\r
+            # Headers = {'X-NLS-Token':'0c8b8f05a46f423096be64a9c4c46310'}\r
+            # self.AI_client_asr = uwebsocket.Client.connect('wss://nls-gateway-cn-beijing.aliyuncs.com/ws/v1',headers=Headers, debug=False)\r
+            if self.VC_server == 1:# \r
+                self.AI_client_asr = uwebsocket.Client.connect('ws://118.145.158.207:22080/asr/ws', debug=False)#测试环境\r
+            elif self.VC_server == 2:# \r
+                if self.VC_TTS_voice_num <= 2:\r
+                    self.AI_client_asr = uwebsocket.Client.connect('ws://118.145.158.207:22080/asr/ws?platform=aliyun&lang=zh-cn', debug=False)#普通话测试环境\r
+                elif self.VC_TTS_voice_num == 3:\r
+                    self.AI_client_asr = uwebsocket.Client.connect('ws://118.145.158.207:22080/asr/ws?platform=aliyun&lang=zh-hk', debug=False)#粤语测试环境\r
+                elif self.VC_TTS_voice_num == 4:\r
+                    self.AI_client_asr = uwebsocket.Client.connect('ws://118.145.158.207:22080/asr/ws?platform=aliyun&lang=zh-cn-sc', debug=False)#四川话测试环境\r
+                else :\r
+                    self.AI_client_asr = uwebsocket.Client.connect('ws://118.145.158.207:22080/asr/ws?platform=aliyun&lang=zh-cn', debug=False)#普通话测试环境\r
+            else:\r
+                token = EventMesh.publish("get_dev_token")\r
+                print("token:{}".format(token))\r
+                if token != None:\r
+                    self.AI_client_asr = uwebsocket.Client.connect('ws://amp.raisound.com/asr/ws?dt={}'.format(token), debug=False)\r
+                else:\r
+                    pass\r
+                    return\r
+        except Exception as e: #网络连接异常\r
+            usys.print_exception(e)\r
+            print("websocket_connect_voice_chat error!!!\r\n")\r
+            #self.connect_timerout_popup(2)  \r
+            self.websocket_error()\r
+            return\r
+        if self.AI_client_asr == None:\r
+            EventMesh.publish("update_dev_token")#获取token\r
+            return \r
+        # 线程接收数据\r
+        if self.AI_client_asr_recv_id != 0:\r
+            try:\r
+                _thread.stop_thread(self.AI_client_asr_recv_id)\r
+            except Exception as e:\r
+                    usys.print_exception(e)\r
+            self.AI_client_asr_recv_id = 0\r
+        _thread.stack_size(self.Audio_buf_size+8*1024)\r
+        self.AI_client_asr_recv_id = _thread.start_new_thread(self.AI_client_asr_recv, (self.AI_client_asr,))\r
+        _thread.stack_size(8*1024)\r
+        self.AI_client_asr_isconnect = 1\r
+        # \r
+\r
+    def websocket_deconnect_asr(self):\r
+        print("websocket_deconnect_asr {}!!!!!!!".format(self.AI_client_asr_isconnect))\r
+        print("websocket_deconnect_asr!!!!!!!")\r
+        if self.AI_client_asr_recv_id != 0:#关闭线程\r
+            try:\r
+                _thread.stop_thread(self.AI_client_asr_recv_id)\r
+            except Exception as e:\r
+                usys.print_exception(e)\r
+        self.AI_client_asr_recv_id = 0\r
+        if self.AI_client_asr_isconnect == 1:\r
+            self.AI_client_asr_isconnect = 0\r
+            self.AI_client_asr.close()\r
+        print("websocket_deconnect_asr {}!!!!!!!".format(self.AI_client_asr_isconnect))\r
+\r
+    #websocket发送数据    \r
+    def AI_client_asr_send(self,data_str):\r
+        if isinstance(data_str, str):#是字符串\r
+            print("ASR ASR AI_client_asr_send:{}".format(data_str))\r
+            pass\r
+        else:\r
+            pass\r
+            #print("ASR ASR AI_client_asr_send:len:{}".format(len(data_str)))\r
+        self.AI_send_data_queue.put([AI_client_asr_num,data_str]) \r
+    #Ai VC websocket返回数据       \r
+    def AI_client_asr_recv(self,cli):\r
+        while True:\r
+            try:\r
+                # 死循环接收数据\r
+                utime.sleep_ms(1)\r
+                recv_data = cli.recv()\r
+                self.close_timerout = 0#服务器有返回清零退出时间\r
+                if not recv_data:\r
+                    # 服务器关闭连接或客户端关闭连接\r
+                    print("AI_client_asr_recv close!!!!!!!!!!!!!!!!!!!!!!!!!!!")\r
+                    #self.AI_client_voice_chat_isconnect = 0\r
+                    #self.websocket_deconnect_voice_chat()\r
+                    EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_deconnect_asr}) \r
+                    #EventMesh.publish("publish_AI_btnInfo",{"func":utime.sleep_ms,'data':(1500)})\r
+                    EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_connect_asr}) \r
+                    break\r
+                try:\r
+                    if isinstance(recv_data, str):\r
+                        jsload_data =  ujson.loads(recv_data)\r
+                        print("ASR ASR recv_data: {}".format(jsload_data))\r
+                        if jsload_data["event"] != None:\r
+                            if jsload_data["event"] == "TranscriptionStarted": #开始录音\r
+                                pass\r
+                        if recv_data.find('\"result\"') == -1:\r
+                        #if jsload_data["result"] == None:\r
+                            #print("continue recv_data:{}".format(recv_data))\r
+                            continue \r
+                        if jsload_data["result"] == None:\r
+                            #print("continue recv_data:{}".format(recv_data))\r
+                            continue \r
+                        if jsload_data["result"]["result"]:\r
+                            #self.AI_listen_text = str(jsload_data["result"]["result"])\r
+                            text= str(jsload_data["result"]["result"])\r
+                            \r
+\r
+                            print("ASR recv self.voice_chat_state :{}".format(self.voice_chat_state))\r
+                            if self.voice_chat_state >= VC_State_TTSStart:#开始播音后不响应asr结果\r
+                                print("asr continue")\r
+                                continue\r
+                            EventMesh.publish("open_led_red")\r
+                            if jsload_data["result"]["is_end"] == True:  #asr结束\r
+                                # if text.find('你好') != -1:\r
+                                #     self.asr_satrt_flag = 0\r
+                                #     self.AI_TTS_str = ""#"你好,有什么吩咐"\r
+                                #     self.AI_ASR_str = ""\r
+                                #     self.asr_satrt_flag = 1\r
+                                #     self.aud.aud_tone_play(16,200)#播放按键音\r
+                                #     # self.AI_client_asr_StopTranscription_requset()#终止前面合成\r
+                                #     # self.AI_client_asr_start_requset()#开始新的合成\r
+                                #     EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_deconnect_voice_chat}) \r
+                                #     EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_VC_start}) \r
+                                #     EventMesh.publish("open_led_red")\r
+                                #     continue\r
+                                #     #self.VC_Play_End()#关闭音频播放\r
+                                ret= self.check_text(text)\r
+                                if ret == 0:#配置指令\r
+                                    #print("check_text ok:{} self.VC_TTS_voice_num:{},{}".format(text,self.VC_TTS_voice_num,self.VC_TTS_voice_type[self.VC_TTS_voice_num]))\r
+                                    self.AI_send_data_queue.clear()\r
+                                    EventMesh.publish("open_led_all")\r
+                                    try:\r
+                                        EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_deconnect_voice_chat}) \r
+                                        #EventMesh.publish("publish_AI_btnInfo",{"func":utime.sleep_ms,'data':(1500)})\r
+                                        EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_VC_start}) \r
+                                    except Exception as e:\r
+                                        usys.print_exception(e)\r
+                                    continue\r
+                                elif ret == 1:#不处理\r
+                                    pass\r
+                                else:#正常asr\r
+                                    if self.AI_ASR_flag == 0:#d第一次识别,没有打断\r
+                                        self.AI_ASR_str = text#\r
+                                        self.AI_ASR_str_tmp = self.AI_ASR_str\r
+                                        self.AI_ASR_flag  = 1\r
+                                    else:#第二次识别,打断了\r
+                                        self.AI_ASR_str = self.AI_ASR_str_tmp+text\r
+                                        print("ASR ASR 打断 续集 AI_ASR_str {}".format(self.AI_ASR_str))\r
+                                        self.AI_ASR_str_tmp = self.AI_ASR_str\r
+                                        EventMesh.publish("publish_AI_btnInfo",{"func":self.VC_init2})#关闭vc连接\r
+                                    EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_VC_start}) \r
+\r
+\r
+                                    # if self.AI_ASR_str != "":#识别过一次asr,打断当前思考或者tts播放\r
+                                    #     self.AI_ASR_str_tmp = self.AI_ASR_str\r
+                                    #     print("ASR ASR 打断1 AI_ASR_str_tmp {}".format(self.AI_ASR_str_tmp))\r
+                                    #     self.AI_ASR_str = ""\r
+                                    # if self.AI_ASR_str_tmp != "":\r
+                                    #     self.AI_ASR_str = self.AI_ASR_str_tmp +text#加上之前的数据\r
+                                    #     print("ASR ASR 打断 续集 AI_ASR_str {}".format(self.AI_ASR_str))\r
+                                    # else:\r
+                                    #     self.AI_ASR_str = text#\r
+                                    # EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_VC_start}) \r
+                                    # self.AI_ASR_str_tmp = ""\r
+                                        \r
+                                    \r
+                            elif jsload_data["result"]["is_end"] == False:\r
+                                if self.AI_ASR_flag ==1 :#如果已经识别过一次asr\r
+                                    self.AI_ASR_flag = 2\r
+                                    print("asr 打断,关闭VC连接")\r
+                                    EventMesh.publish("publish_AI_btnInfo",{"func":self.VC_init2})#关闭vc连接\r
+                                    EventMesh.publish("publish_AI_btnInfo",{"func":EventMesh.publish,"data":"open_led_red"})#关闭vc连接\r
+                                pass\r
+                except Exception as e:\r
+                    usys.print_exception(e)\r
+                \r
+            except Exception as e:\r
+                    usys.print_exception(e)\r
+                    #self.websocket_error()\r
+                    EventMesh.publish("publish_AI_btnInfo",{"func":self.Close}) \r
+                    EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_error})#\r
+                    break\r
+        self.AI_client_asr_isconnect = 0\r
+        self.AI_client_asr_recv_id = 0 \r
+        print("AI_client_asr_recv END!!!!!!!!!!!!!!!!!!!!!!!!!!!")\r
+    #ASR开始会话\r
+    def AI_client_asr_start_requset(self):\r
+        \r
+        json_data = \\r
+        { \r
+            "header":{\r
+                "event":"StartTranscription",\r
+                "trace_id":self.get_trace_id()\r
+                },\r
+            "payload":{\r
+                "format":"pcm",\r
+                "sample_rate":self.VC_record_samplerate,\r
+                }\r
+            \r
+        }\r
+        if self.VC_record_TYPE == VC_record_TYPE_AMR :\r
+            json_data["payload"]["format"]='amr'\r
+            pass\r
+        # if self.VC_mode == 1:\r
+        #     json_data["payload"]["voice_detection"]='disable'\r
+\r
+        self.AI_client_asr_send(ujson.dumps(json_data))\r
+    #ASR终止\r
+    def AI_client_asr_StopTranscription_requset(self):   \r
+        json_data = \\r
+        {\r
+            "header":{\r
+                "event":"StopTranscription",\r
+                "trace_id":self.get_trace_id()\r
+                }\r
+        }\r
+\r
+        self.AI_client_asr_send(ujson.dumps(json_data))\r
+    \r
+     #开始录音\r
+    def VC_Speech_Start(self):\r
+        #self.voice_chat_state =  VC_State_SpeechStart\r
+        print("VC_Speech_Start VC_record_state_flag:{} self.AI_ASR_flag:{}!!!!!!!!".format(self.VC_record_state_flag,self.AI_ASR_flag))  \r
+        if self.AI_ASR_flag  != 0:\r
+            return\r
+        if self.VC_record_state_flag  == 0:\r
+            self.AI_client_asr_start_requset()#开始请求\r
+            if self.VC_record_thread_id != 0:\r
+                try:\r
+                    _thread.stop_thread(self.VC_record_thread_id)\r
+                except Exception as e:\r
+                        usys.print_exception(e)\r
+                self.VC_record_thread_id = 0\r
+            _thread.stack_size(self.Audio_buf_size+8*1024)\r
+            self.VC_record_thread_id = _thread.start_new_thread(self.VC_record_thread,())\r
+            _thread.stack_size(8*1024)\r
+            print("self.VC_record_thread_id:{}".format(self.VC_record_thread_id))\r
+            if self.VC_record_TYPE == VC_record_TYPE_AMR :\r
+                try :\r
+                    self.record.stream_start(audio.Record.AMRNB, self.VC_record_samplerate, 0)\r
+                except Exception as e:\r
+                        usys.print_exception(e)\r
+            elif self.VC_record_TYPE == VC_record_TYPE_PCM:\r
+                print("record_pcm.stream_read_start()!!!!!!!!!!!!")\r
+                self.record.stream_start(audio.Record.WAV, self.VC_record_samplerate, 0)\r
+                # if self.record_pcm != None:\r
+                #     try:\r
+                #         self.record_pcm.stream_stop()\r
+                #         self.record_pcm.close()\r
+                #         self.record_pcm = None\r
+                #     except Exception as e:\r
+                #         usys.print_exception(e)\r
+                # if self.record_pcm == None:        \r
+                #     ret = self.record_pcm = audio.Audio.PCM(0,1,16000,0,1,2)\r
+                #     print("audio.Audio.PCM:ret:{}".format(ret))\r
+                #     ret = self.record_pcm.stream_read_start()\r
+                #     print("self.record_pcm.stream_read_start:ret:{}".format(ret))\r
+            self.VC_record_state_flag = 1\r
+    #停止录音\r
+    def VC_Speech_End(self):\r
+        try:\r
+            self.AI_ASR_flag = 0\r
+            self.AI_client_asr_StopTranscription_requset()#请求停止\r
+            if self.VC_record_TYPE == VC_record_TYPE_AMR:\r
+                self.record.stream_stop()\r
+                self.record.stop()#关闭录音\r
+                Record_read_buf = bytearray(self.Audio_buf_size)\r
+                for i in range(10):\r
+                    Record_len = self.record.stream_read(Record_read_buf, self.Audio_buf_size)\r
+                    print("Record_len:!!!!!!{}".format(Record_len))\r
+                    if Record_len <= 0:\r
+                        break\r
+            elif self.VC_record_TYPE == VC_record_TYPE_PCM:\r
+                self.record.stream_stop()\r
+                self.record.stop()#关闭录音\r
+                Record_read_buf = bytearray(self.Audio_buf_size)\r
+                for i in range(10):\r
+                    Record_len = self.record.stream_read(Record_read_buf, self.Audio_buf_size)\r
+                    print("Record_len:!!!!!!{}".format(Record_len))\r
+                    if Record_len <= 0:\r
+                        break\r
+                # if self.record_pcm != None:\r
+                #     try:\r
+                #         self.record_pcm.stream_stop()\r
+                #         self.record_pcm.close()\r
+                #         self.record_pcm = None\r
+                #     except Exception as e:\r
+                #         usys.print_exception(e)\r
+        except Exception as e:\r
+            usys.print_exception(e)\r
+        if self.VC_record_thread_id != 0:\r
+            try:\r
+                _thread.stop_thread(self.VC_record_thread_id)\r
+            except Exception as e:\r
+                    usys.print_exception(e)\r
+            self.VC_record_thread_id = 0\r
+        \r
+        self.VC_record_state_flag = 0\r
+        print("VC_Speech_End VC_record_state_flag:{}!!!!!!!!".format(self.VC_record_state_flag))   \r
+    #获取录音数据\r
+    def VC_record_thread(self):\r
+        ##return\r
+        print("VC_record_thread start!!!!!!!!!!!!!!!!!!!!\r\n")\r
+        count = 0\r
+        # try:\r
+        #     uos.remove('/usr/test.pcm')\r
+        # except Exception as e:\r
+        #     usys.print_exception(e)\r
+        #record_data_queue = Queue(100)\r
+        #fd = open('/usr/test.pcm','w')\r
+        # if self.VC_record_TYPE == 1:\r
+        #     h_data= [0x23,0x21 ,0x41 ,0x4D ,0x52 ,0x0A ]\r
+        #     h_data_b = bytes(h_data)\r
+        #     self.AI_client_voice_chat_send(h_data_b)\r
+        \r
+        count = 0\r
+        while True:\r
+            try:\r
+                \r
+                # 死循环接收数据\r
+                #if self.voice_chat_state ==  VC_State_SpeechStart:\r
+                Record_read_buf = bytearray(self.Audio_buf_size)\r
+                \r
+                Record_len = 0\r
+                if self.VC_record_TYPE == VC_record_TYPE_PCM:#pcm\r
+                    Record_len = self.record.stream_read(Record_read_buf, self.Audio_buf_size)\r
+                    utime.sleep_ms(20)\r
+                    \r
+                else :\r
+                    \r
+                    Record_len = self.record.stream_read(Record_read_buf, self.Audio_buf_size)\r
+                    utime.sleep_ms(600)\r
+\r
+                #Record_len = 1024*2\r
+                #print("VC_record_thread:{}".format(Record_len))\r
+                if Record_len > 0:\r
+                    read_buf = bytes(Record_read_buf[:Record_len])\r
+                    if self.record_fd != None:\r
+                        self.record_fd.write(read_buf)\r
+                    self.AI_client_asr_send(read_buf)\r
+                    \r
+                    # if self.voice_chat_state !=  VC_State_SpeechStart:#没发送前先存起来\r
+                    #     self.AI_record_tmp_queue.put(read_buf)\r
+                    # else:\r
+                    #     while True:\r
+                    #         if self.AI_record_tmp_queue.empty() == True:\r
+                    #             break\r
+                    #         else:\r
+                    #             self.AI_client_voice_chat_send(self.AI_record_tmp_queue.get())  #发送之前存的数据\r
+                    #     self.AI_client_voice_chat_send(read_buf)   \r
+                    #print("VC_record_thread:{}".format(len(read_buf)))\r
+                    count+=len(read_buf)\r
+                # if count>=500*1024:#结束\r
+                #     self.AI_client_voice_chat_end_speech()\r
+                #     break\r
+                utime.sleep_ms(40)\r
+                # if self.voice_chat_state >=  VC_State_SpeechEnd:\r
+                #     break\r
+                count+=1\r
+                if count %10 == 0:\r
+                    print("VC_record_thread on line {} asr recv :{} send:{}".format(Record_len,_thread.threadIsRunning(self.AI_client_asr_recv_id),_thread.threadIsRunning(self.AI_send_data_queue_thread_id)))\r
+            except Exception as e:\r
+                    usys.print_exception(e)\r
+                    #break\r
+\r
+        #fd.close()\r
+        print("VC_record_thread:exit")\r
+        self.VC_record_thread_id = 0#线程退出\r
+###################################################### VC ###################################################################################\r
+    def websocket_connect_voice_chat(self):\r
+        print("websocket_connect_voice_chat:{}!!!!!!!!!!!!!!!!!!!!!".format(self.AI_client_voice_chat_isconnect))\r
+        if self.AI_client_voice_chat_isconnect == 1:\r
+            return\r
+        # 创建VC客户端\r
+        try:\r
+            signal = net.csqQueryPoll()\r
+            if signal == -1 or sim.getStatus() != 1:#网络正常\r
+                self.websocket_error()\r
+                return\r
+            # Headers = {'X-NLS-Token':'0c8b8f05a46f423096be64a9c4c46310'}\r
+            # self.AI_client_voice_chat = uwebsocket.Client.connect('wss://nls-gateway-cn-beijing.aliyuncs.com/ws/v1',headers=Headers, debug=False)\r
+            if self.VC_server == 1:# \r
+                self.AI_client_voice_chat = uwebsocket.Client.connect('ws://118.145.158.207:22080/voice-chat/ws', debug=False)#测试环境\r
+            elif self.VC_server == 2:# \r
+                if self.VC_TTS_voice_num <= 2:\r
+                    self.AI_client_voice_chat = uwebsocket.Client.connect('ws://118.145.158.207:22080/voice-chat/ws?is_auth=0&platform=raisound&lang=zh-cn', debug=False)#普通话测试环境\r
+                elif self.VC_TTS_voice_num == 3:\r
+                    self.AI_client_voice_chat = uwebsocket.Client.connect('ws://118.145.158.207:22080/voice-chat/ws?is_auth=0&platform=raisound&lang=zh-hk', debug=False)#粤语测试环境\r
+                elif self.VC_TTS_voice_num == 4:\r
+                    self.AI_client_voice_chat = uwebsocket.Client.connect('ws://118.145.158.207:22080/voice-chat/ws?is_auth=0&platform=raisound&lang=zh-cn-sc', debug=False)#四川话测试环境\r
+                else :\r
+                    self.AI_client_voice_chat = uwebsocket.Client.connect('ws://118.145.158.207:22080/voice-chat/ws?is_auth=0&platform=raisound&lang=zh-cn', debug=False)#普通话测试环境\r
+            else:\r
+                token = EventMesh.publish("get_dev_token")\r
+                print("token:{}".format(token))\r
+                if token != None:\r
+                    self.AI_client_voice_chat = uwebsocket.Client.connect('ws://amp.raisound.com/voice-chat/ws?dt={}'.format(token), debug=False)\r
+                else:\r
+                    self.websocket_error()\r
+                    return\r
+        except Exception as e: #网络连接异常\r
+            usys.print_exception(e)\r
+            print("websocket_connect_voice_chat error!!!\r\n")\r
+            #self.connect_timerout_popup(2)\r
+            self.websocket_error()\r
+            return\r
+        print("AI_client_voice_chat:{}".format(self.AI_client_voice_chat))\r
+        if self.AI_client_voice_chat == None:\r
+            EventMesh.publish("update_dev_token")#获取token\r
+            self.websocket_error()\r
+            return\r
+        utime.sleep_ms(20)\r
+        # 线程接收数据\r
+        if self.AI_client_voice_chat_recv_id != 0:\r
+            try:\r
+                _thread.stop_thread(self.AI_client_voice_chat_recv_id)\r
+            except Exception as e:\r
+                    usys.print_exception(e)\r
+            self.AI_client_voice_chat_recv_id = 0\r
+        _thread.stack_size(self.Audio_buf_size+8*1024)\r
+        self.AI_client_voice_chat_recv_id = _thread.start_new_thread(self.AI_client_voice_chat_recv, (self.AI_client_voice_chat,))\r
+        _thread.stack_size(8*1024)\r
+        self.AI_client_voice_chat_isconnect = 1\r
+    def websocket_error(self):\r
+        print("websocket_error!!!!")\r
+        print("websocket_error!!!!")\r
+        print("websocket_error!!!!")\r
+        print("websocket_error!!!!")\r
+        self.websocket_error_count+=1\r
+        if self.websocket_error_count <=3:\r
+            EventMesh.publish("audio_montage_play",["xinhaoruo1.mp3"])\r
+        elif self.websocket_error_count <10 :\r
+            EventMesh.publish("audio_montage_play",["xinhaoruo2.mp3"])\r
+        elif self.websocket_error_count >=10:\r
+            EventMesh.publish("paly_iccid_imei")    \r
+        else:\r
+            EventMesh.publish("audio_montage_play",["R_SIM_FAILE.mp3"])\r
+        #self.aud.play(1,1,'U:/static/R_SIM_FAILE.mp3')\r
+        self.AI_send_data_queue.clear()\r
+        self.AI_audio_queue.clear()\r
+        #self.VC_Speech_End()\r
+        EventMesh.publish("close_led")\r
+        try:\r
+            self.websocket_deconnect_voice_chat()\r
+        except Exception as e:\r
+                usys.print_exception(e)\r
+        try:\r
+            self.websocket_deconnect_asr()\r
+        except Exception as e:\r
+                usys.print_exception(e)\r
+\r
+    def websocket_deconnect_voice_chat(self):\r
+        print("websocket_deconnect_voice_chat {}!!!!!!!".format(self.AI_client_voice_chat_isconnect))\r
+        print("websocket_deconnect_voice_chat!!!!!!!")\r
+        if self.AI_client_voice_chat_recv_id != 0:#关闭线程\r
+            try:\r
+                _thread.stop_thread(self.AI_client_voice_chat_recv_id)\r
+            except Exception as e:\r
+                usys.print_exception(e)\r
+        self.AI_client_voice_chat_recv_id = 0\r
+        if self.AI_client_voice_chat_isconnect == 1:\r
+            self.AI_client_voice_chat_isconnect = 0\r
+            self.AI_client_voice_chat.close()\r
+        print("websocket_deconnect_voice_chat {}!!!!!!!".format(self.AI_client_voice_chat_isconnect))\r
+    #websocket发送ping\r
+    def AI_client_voice_chat_ping(self):\r
+        pass\r
+        if self.AI_client_voice_chat_isconnect == 1:\r
+            #self.AI_client_voice_chat.write_frame(0x09,b'ping ping')\r
+            self.AI_client_voice_chat_send("ping")\r
+            #print("websocket ping ping")\r
+\r
+    #websocket发送数据    \r
+    def AI_client_voice_chat_send(self,data_str):\r
+        if isinstance(data_str, str):#是字符串\r
+            print("AI_client_voice_chat_send:{}".format(data_str))\r
+            pass\r
+        # else:\r
+        #     print("AI_client_voice_chat_send:len{}".format(len(data_str)))\r
+        self.AI_send_data_queue.put([AI_client_voice_chat_num,data_str]) \r
+    \r
+    #Ai VC websocket返回数据       \r
+    def AI_client_voice_chat_recv(self,cli):\r
+        count = 0\r
+        while True:\r
+            try:\r
+                # 死循环接收数据\r
+                count+=1\r
+                if self.tts_in_data_len - self.tts_out_data_len > 64*1024 or count>4:\r
+                    count = 0\r
+                    utime.sleep_ms(1)\r
+                recv_data = cli.recv()\r
+                self.close_timerout = 0#服务器有返回清零退出时间\r
+                if not recv_data:\r
+                    # 服务器关闭连接或客户端关闭连接\r
+                    print("服务器主动关闭连接!!!!!!!!!!!!!!!!!!!!!!!!!!!")\r
+                    #self.AI_client_voice_chat_isconnect = 0\r
+                    #self.websocket_error()\r
+                    EventMesh.publish("publish_AI_btnInfo",{"func":self.Close}) \r
+                    EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_error}) \r
+                    #EventMesh.publish("publish_AI_btnInfo",{"func":utime.sleep_ms,'data':(1500)})\r
+                    \r
+                    break\r
+                try:\r
+                    self.websocket_error_count = 0\r
+                    if isinstance(recv_data, str):#返回的是字符串\r
+                        print("VC VC:recv_data:{}".format(recv_data))\r
+                        jsload_data =  ujson.loads(recv_data)\r
+                        #print("AI_client_voice_chat_recv jsload_data = {}".format(jsload_data))\r
+                        if jsload_data["status"] != 20000000:#返回错误\r
+                            self.websocket_error()\r
+                            break\r
+                        if jsload_data["event"] == "Started" :#会话开始\r
+                            payload = jsload_data["payload"]\r
+                            self.VC_dialog_id = payload["dialog_id"] \r
+                            self.VC_task_id = jsload_data["task_id"] \r
+                            print("VC:Started!!!!!!!!\r\n")\r
+                        elif jsload_data["event"]  == "SpeechContent" :#asr转译\r
+                            print("VC:SpeechContent!!!!!!!!\r\n")\r
+                            payload = jsload_data["payload"]\r
+                            \r
+                            \r
+                            if(payload['finished'] == True):#asr结束\r
+                                self.voice_chat_state =  VC_State_SpeechEnd\r
+                                #self.VC_Speech_End()#停止录音\r
+                                text = payload["text"]\r
+                                if self.check_text(text) == 0:\r
+                                    #print("check_text ok:{} self.VC_TTS_voice_num:{},{}".format(text,self.VC_TTS_voice_num,self.VC_TTS_voice_type[self.VC_TTS_voice_num]))\r
+                                    self.AI_send_data_queue.clear()\r
+                                    EventMesh.publish("open_led_all")\r
+                                    try:\r
+                                        EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_deconnect_voice_chat}) \r
+                                        #EventMesh.publish("publish_AI_btnInfo",{"func":utime.sleep_ms,'data':(1500)})\r
+                                        EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_VC_start}) \r
+                                    except Exception as e:\r
+                                        usys.print_exception(e)\r
+                                \r
+                                pass\r
+                            else:\r
+                                self.AI_listen_end = 0\r
+\r
+                        elif jsload_data["event"]  == "SpeechEnded" :#服务器下发ASR说话结束\r
+                            self.voice_chat_state =  VC_State_SpeechEnd\r
+                        elif jsload_data["event"]  == "RespondingContent" :#chat回答      \r
+                            pass\r
+                            # payload = jsload_data["payload"]\r
+\r
+                            # if(payload['finished'] == True):#chat回答 结束,开始tts\r
+                            #     self.AI_client_chat_end_flag = 1\r
+                            #     pass\r
+                            # else:\r
+                                \r
+                            #     self.AI_client_chat_end_flag = 0\r
+                            #     self.AI_client_tts_data_len = 0\r
+                            #utime.sleep_ms(5)\r
+                            \r
+                        elif jsload_data["event"]  == "RespondingStarted" :#音频开始下发\r
+                            self.play_flag = 0\r
+                            self.voice_chat_state = VC_State_TTSStart\r
+                            self.VC_Speech_End()#停止录音\r
+                            self.VC_Play_Start()\r
+                            #self.tts_fd = open('/usr/tts_tesr.pcm','w')\r
+                            pass\r
+                        elif jsload_data["event"]  == "RespondingEnded" :#音频下发结束\r
+                            #if self.voice_chat_state == VC_State_TTSStart:\r
+                                print("RespondingEnded!!!!!!" )\r
+                                self.voice_chat_state = VC_State_TTSEnd\r
+                                if self.asr_satrt_flag == 0 :\r
+                                    self.asr_satrt_flag =1\r
+                            #self.tts_fd.close()\r
+                            #pass\r
+                        elif jsload_data["event"]  == "DialogStateChanged" :#状态切换事件\r
+                            payload = jsload_data["payload"]\r
+                            if payload["state"] == "Listening":\r
+                                self.voice_chat_state = VC_State_Listening\r
+                                if self.AI_TTS_str != "" or self.AI_ASR_str != "":#有tts数据,则请求TTS数据,没有就请求开始上传语音\r
+                                    self.AI_client_voice_chat_RequestToRespond()\r
+                                else:\r
+                                    self.VC_Speech_Start()#开启线程获取录音数据\r
+                                    #self.AI_client_voice_chat_send_speech()#开始上传语音\r
+                                #self.AI_client_voice_chat_RequestToRespond()#chat请求或者tts请求\r
+                                EventMesh.publish("open_led_red")\r
+                            if payload["state"] == "Thinking":#准备开始TTS\r
+                                self.voice_chat_state = VC_State_Thinking\r
+                                \r
+                                self.AI_client_tts_data_total_len = 0\r
+                                EventMesh.publish("open_led_all")\r
+                            if payload["state"] == "Responding":\r
+                                self.voice_chat_state = VC_State_Responding\r
+                                EventMesh.publish("open_led_green")\r
+                        elif jsload_data["event"]  == "RequestAccepted" :#请求上传语音被允许\r
+                            #self.voice_chat_state =  VC_State_Responding\r
+                            #self.AI_client_voice_chat_send_speech()#开始上传语音\r
+                            pass\r
+                    else:#下发音频数据\r
+                        #填充头\r
+                        #self.tts_fd.write(recv_data)\r
+                        #recv_data_len = len(recv_data)\r
+                        # data_len_b = recv_data_len.to_bytes(4,'little')#数据长度转16进制数组\r
+                        # h_data = [ 0x52 ,0x49 ,0x46 ,0x46 #,0x24 ,0x00 ,0x00 ,0x00 #文件标识、文件大小\r
+                        #         ,0x57 ,0x41 ,0x56 ,0x45 ,0x66 ,0x6D ,0x74 ,0x20  #文件格式、格式块标识符\r
+                        #         ,0x10 ,0x00 ,0x00 ,0x00 ,0x01 ,0x00 ,0x01 ,0x00 ,0x80 ,0x3E ,0x00 ,0x00  #格式块大小4、音频格式2、声道数2、采样率4\r
+                        #         ,0x80 ,0x3E ,0x00 ,0x00 ,0x02 ,0x00 ,0x10 ,0x00 ,0x64 ,0x61 ,0x74 ,0x61]#每秒字节数4、数据块对齐2、位深度2、data4\r
+                        # h_data_b = bytes(h_data)\r
+                        # file_len = recv_data_len+len(h_data_b)+4+4\r
+                        # file_len_b = file_len.to_bytes(4,'little')#文件长度转16进制数组\r
+                        # h_data_b = h_data_b[:4]+file_len_b+h_data_b[4:]+data_len_b\r
+\r
+                        #print("下发音频数据1:{}".format(len(recv_data)))\r
+                        # # self.AI_client_tts_data_total_len += len(recv_data)\r
+                        # # self.AI_client_tts_data_len += len(recv_data)\r
+                        # #if self.AI_client_tts_data_total_len >10*1024:\r
+                        # ret=self.AI_audio_queue.put([recv_data,""])\r
+                        # print("下发音频数据2:{}".format(len(recv_data)))\r
+                        if self.voice_chat_state >= VC_State_TTSStart:\r
+                            self.put_record_data([recv_data,""])\r
+                        #EventMesh.publish("publish_AI_btnInfo",{"func":self.put_record_data,"data":[recv_data,""]}) \r
+                except Exception as e:\r
+                    usys.print_exception(e)\r
+                \r
+            except Exception as e:\r
+                    usys.print_exception(e)\r
+                    #self.websocket_error()\r
+                    EventMesh.publish("publish_AI_btnInfo",{"func":self.Close}) \r
+                    EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_error})#\r
+                    break\r
+        self.AI_client_voice_chat_isconnect = 0\r
+        self.AI_client_voice_chat_recv_id = 0 \r
+        print("AI_client_voice_chat_recv END!!!!!!!!!!!!!!!!!!!!!!!!!!!")\r
+    def put_record_data(self,data):\r
+        #print("下发音频数据1:{}".format(len(data[0])))\r
+        # self.AI_client_tts_data_total_len += len(recv_data)\r
+        # self.AI_client_tts_data_len += len(recv_data)\r
+        #if self.AI_client_tts_data_total_len >10*1024:\r
+        ret=self.AI_audio_queue.put(data)\r
+        self.tts_in_data_len += len(data[0])\r
+        print("下发音频数据2:{},{}".format(len(data[0]),self.tts_in_data_len))\r
+    def check_text(self,text):\r
+        if len(text)>60:\r
+            return -1\r
+        try:\r
+            if isinstance(text, str): \r
+                if text.find("更改声音") != -1:\r
+                    self.VC_TTS_voice_num += 1\r
+                    if self.VC_TTS_voice_num >= len(self.VC_TTS_voice_type):\r
+                        self.VC_TTS_voice_num = 0\r
+                    EventMesh.publish("set_storage_config",["VC_TTS_voice_num",self.VC_TTS_voice_num])\r
+                    # EventMesh.publish("audio_montage_play",["peizhichenggong.mp3"])\r
+                    #self.aud.play(1,0,'U:/static/peizhichenggong.mp3')#切换成功\r
+                    self.AI_TTS_str = "更改成功"    \r
+                    return 0\r
+                if text.find("声音改为") != -1 and (text.find("男声") != -1 or text.find("男生") != -1 ):\r
+                    self.VC_TTS_voice_num = 1\r
+                    \r
+                    EventMesh.publish("set_storage_config",["VC_TTS_voice_num",self.VC_TTS_voice_num])\r
+                    # EventMesh.publish("audio_montage_play",["peizhichenggong.mp3"])\r
+                    #self.aud.play(1,0,'U:/static/peizhichenggong.mp3')#切换成功\r
+                    self.AI_TTS_str = "更改成功" \r
+                    return 0\r
+                if text.find("声音改为") != -1 and  (text.find("女声") != -1 or text.find("女生") != -1 ):\r
+                    self.VC_TTS_voice_num = 0\r
+                    \r
+                    EventMesh.publish("set_storage_config",["VC_TTS_voice_num",self.VC_TTS_voice_num])\r
+                    # EventMesh.publish("audio_montage_play",["peizhichenggong.mp3"])\r
+                    #self.aud.play(1,0,'U:/static/peizhichenggong.mp3')#切换成功\r
+                    self.AI_TTS_str = "更改成功" \r
+                    return 0\r
+                if text.find("声音改为") != -1 and  (text.find("同声") != -1 or text.find("童声") != -1 ):\r
+                    self.VC_TTS_voice_num = 2\r
+                    \r
+                    EventMesh.publish("set_storage_config",["VC_TTS_voice_num",self.VC_TTS_voice_num])\r
+                    # EventMesh.publish("audio_montage_play",["peizhichenggong.mp3"])\r
+                    #self.aud.play(1,0,'U:/static/peizhichenggong.mp3')#切换成功\r
+                    self.AI_TTS_str = "更改成功" \r
+                    return 0\r
+                if text.find("声音改为") != -1 and  (text.find("粤语") != -1 or text.find("越野") != -1 ):\r
+                    self.VC_TTS_voice_num = 3\r
+                    \r
+                    EventMesh.publish("set_storage_config",["VC_TTS_voice_num",self.VC_TTS_voice_num])\r
+                    # EventMesh.publish("audio_montage_play",["peizhichenggong.mp3"])\r
+                    #self.aud.play(1,0,'U:/static/peizhichenggong.mp3')#切换成功\r
+                    self.AI_TTS_str = "更改成功" \r
+                    return 0\r
+                if text.find("声音改为") != -1 and text.find("四川话") != -1 :\r
+                    self.VC_TTS_voice_num = 4\r
+                    \r
+                    EventMesh.publish("set_storage_config",["VC_TTS_voice_num",self.VC_TTS_voice_num])\r
+                    # EventMesh.publish("audio_montage_play",["peizhichenggong.mp3"])\r
+                    #self.aud.play(1,0,'U:/static/peizhichenggong.mp3')#切换成功\r
+                    self.AI_TTS_str = "更改成功" \r
+                    return 0\r
+                if text.find("切换对话模式") != -1:\r
+                    if self.VC_mode == 0:\r
+                       self.VC_mode = 1\r
+                       self.AI_TTS_str = "已切换到单对话模式" \r
+                    else:\r
+                        self.VC_mode = 0 \r
+                        self.AI_TTS_str = "已切换到长对话模式" \r
+                    EventMesh.publish("set_storage_config",["VC_TTS_voice_num",self.VC_mode])\r
+                    # EventMesh.publish("audio_montage_play",["peizhichenggong.mp3"])\r
+                    #self.aud.play(1,0,'U:/static/peizhichenggong.mp3')#切换成功\r
+\r
+                    return 0\r
+                if text.find("音量") != -1 and text.find("加") != -1 :\r
+                    self.VC_TTS_volume += 10\r
+                    if self.VC_TTS_volume > 100:\r
+                        #EventMesh.publish("audio_montage_play",["yinliangyizuida.mp3"])\r
+                        #self.aud.play(1,0,'U:/static/yinliangyizuida.mp3')#音量已最大\r
+                        self.AI_TTS_str = "音量已最大" \r
+                        self.VC_TTS_volume = 100\r
+                    else:\r
+                        self.aud.setVolume(self.VC_TTS_volume //10)\r
+                        EventMesh.publish("set_storage_config",["VC_TTS_volume",self.VC_TTS_volume])\r
+                        #EventMesh.publish("audio_montage_play",["peizhichenggong.mp3"])\r
+                        #self.aud.play(1,0,'U:/static/peizhichenggong.mp3')#配置成功\r
+                        self.AI_TTS_str = "配置成功,当前音量 {}".format(self.VC_TTS_volume)\r
+                        \r
+                    return 0\r
+                if text.find("音量") != -1 and text.find("减") != -1:\r
+                    self.VC_TTS_volume -= 10\r
+                    if self.VC_TTS_volume < 0:\r
+                        self.VC_TTS_volume = 0\r
+                        #EventMesh.publish("audio_montage_play",["yinliangyizuixiao.mp3"])\r
+                        #self.aud.play(1,0,'U:/static/yinliangyizuixiao.mp3')#音量已最小\r
+                        self.AI_TTS_str = "音量已最小"\r
+                    else:\r
+                        self.aud.setVolume(self.VC_TTS_volume //10)\r
+                        EventMesh.publish("set_storage_config",["VC_TTS_volume",self.VC_TTS_volume])\r
+                        #EventMesh.publish("audio_montage_play",["peizhichenggong.mp3"])\r
+                        #self.aud.play(1,0,'U:/static/peizhichenggong.mp3')#配置成功\r
+                        self.AI_TTS_str = "配置成功,当前音量 {}".format(self.VC_TTS_volume)\r
+                    return 0\r
+                if text.find("电量") != -1 and text.find("查询") != -1:\r
+                    battery = EventMesh.publish("get_battery")\r
+                    #EventMesh.publish("audio_montage_play",["dianliangshengyu{}.mp3".format(battery)])\r
+                    #self.aud.play(1,0,'U:/static/dianliangshengyu{}.mp3'.format(battery))#电量剩余\r
+                    self.AI_TTS_str = "电量剩余百分之{}".format(battery)\r
+                    return 0\r
+                if text.find("电压") != -1 and text.find("查询") != -1:\r
+                    Vbatt = Power.getVbatt()\r
+                    #EventMesh.publish("audio_montage_play",["dianliangshengyu{}.mp3".format(battery)])\r
+                    #self.aud.play(1,0,'U:/static/dianliangshengyu{}.mp3'.format(battery))#电量剩余\r
+                    self.AI_TTS_str = "当前电池电压{}".format(Vbatt)\r
+                    return 0\r
+                if text.find("进入工厂模式") != -1 :\r
+                    self.factory_mode()\r
+                    return 1\r
+                if text.find("信号") != -1 and text.find("查询") != -1:\r
+                    signal = net.csqQueryPoll()\r
+                    \r
+                    self.AI_TTS_str = "当前信号{}".format(signal)\r
+                    return 0\r
+                \r
+                if text.find("再见") != -1 or text.find("拜拜") != -1:\r
+                    EventMesh.publish("publish_AI_btnInfo",{"func":self.Close}) \r
+                    return 1\r
+        except Exception as e:\r
+                usys.print_exception(e)\r
+        return -1\r
+    #获取trace_id\r
+    def get_trace_id(self):\r
+        t = utime.mktime(utime.localtime())\r
+        t = t*1000+urandom.randint(0, 1000)\r
+        md5_data = "{}".format(t)#md5签名\r
+        sign_data = ""\r
+        hash_obj = uhashlib.md5(md5_data)\r
+        res = hash_obj.digest()\r
+\r
+        # 转成十六进制表示\r
+        sign_data = ubinascii.hexlify(res)\r
+        sign_data = sign_data.decode('ascii')\r
+        return sign_data\r
+    def get_new_message_id(self):\r
+        message_id = self.get_trace_id()+"aaa"+self.get_trace_id()\r
+        self.VC_message_id=message_id[:32]\r
+        return self.VC_message_id \r
+    def get_new_task_id(self):\r
+        task_id = self.get_trace_id()+"aaa"+self.get_trace_id()\r
+        self.VC_task_id=task_id[:32]\r
+        return self.VC_task_id\r
+    #开始播放声音\r
+    def VC_Play_Start(self):\r
+        self.tts_in_data_len = 0\r
+        self.tts_out_data_len = 0\r
+        if self.VC_play_TYPE == VC_play_TYPE_PCM:\r
+            if self.VC_play_samplerate == 8000:\r
+                pass\r
+            elif self.VC_play_samplerate == 16000:\r
+                if self.play_pcm == None:        \r
+                    self.play_pcm = audio.Audio.PCM(0,1,16000,1,1,2)\r
+                    #self.play_pcm.setVolume(11)\r
+                    ret = self.play_pcm.stream_write_start()\r
+                    print("self.record_pcm.stream_write_start:ret:{}".format(ret))\r
+        elif self.VC_play_TYPE == VC_play_TYPE_MP3:\r
+            pass\r
+    #停止播放声音\r
+    def VC_Play_End(self):\r
+        if self.VC_play_TYPE == VC_play_TYPE_PCM:\r
+            if self.VC_play_samplerate == 8000:\r
+                self.aud.stopPlayStream()\r
+                self.aud.stopAll()\r
+            elif self.VC_play_samplerate == 16000:\r
+                if self.play_pcm != None:\r
+                    print("Close:play_pcm.close()!!!!!!!!!!!!!!!!!!")\r
+                    try:\r
+                        self.play_pcm.stream_stop()\r
+                        self.play_pcm.close()\r
+                    except Exception as e:\r
+                        usys.print_exception(e)\r
+                    self.play_pcm=None\r
+                self.aud.stopPlayStream()\r
+                self.aud.stopAll()\r
+        elif self.VC_play_TYPE == VC_play_TYPE_MP3:\r
+            self.aud.stopPlayStream()\r
+            self.aud.stopAll()\r
+   \r
+    def _1S_timer_cb(self,*argc):\r
+        EventMesh.publish("system_sleep_rest")#防止黑屏\r
+        self.close_timerout += 1\r
+        if self.close_timerout > 30:#20秒没数据就close\r
+            EventMesh.publish("publish_AI_btnInfo",{"func":self.Close}) \r
+        # print("get_audio_state !!!!!{} {} {}\r\n".format(self.play_end,EventMesh.publish("get_audio_state"),self.play_flag))\r
+        #self.LocalRespondingEnded_timerout+=1\r
+        if self.voice_chat_state == VC_State_TTSEnd and self.AI_audio_queue.empty()  :#self.AI_audio_queue为空且tts下发结束\r
+            self.LocalRespondingEnded_timerout += 1\r
+        if self.LocalRespondingEnded_timerout >= 3:\r
+            self.LocalRespondingEnded_timerout = 0\r
+            if self.VC_mode == 1 :#长按单次问答模式\r
+                EventMesh.publish("publish_AI_btnInfo",{"func":self.Close}) \r
+            else:\r
+                #通知服务器播放结束\r
+                self.AI_client_voice_chat_LocalRespondingEnded()\r
+        self.pingping_timerout+=1\r
+        if self.pingping_timerout>5:\r
+            self.pingping_timerout=0\r
+            self.AI_client_voice_chat_ping()\r
+        \r
+    #VC开始\r
+    def AI_VC_start(self):\r
+        \r
+        self.VC_Play_End()#关闭音频播放\r
+        \r
+        #self.aud.aud_tone_play(16,200)#播放按键音\r
+        self.LocalRespondingEnded_timerout = 0\r
+        self.close_timerout = 0\r
+        self.websocket_connect_asr()\r
+        if self.AI_client_asr_isconnect == 0:\r
+            return\r
+        if self.record_data_save_flag == 1:\r
+            try:\r
+                uos.remove('/usr/record_data.pcm')\r
+            except Exception as e:\r
+                usys.print_exception(e)\r
+            self.record_fd = open('/usr/record_data.pcm','w')\r
+        #utime.sleep_ms(50)\r
+        if self.AI_client_voice_chat_isconnect == 0:#没连接的时候请求开始\r
+            self.websocket_connect_voice_chat()#连接服务器\r
+            self.AI_client_voice_chat_start_requset()\r
+        else:\r
+            print("self.voice_chat_state :{}".format(self.voice_chat_state ))\r
+            if self.voice_chat_state > VC_State_SpeechStart:\r
+                #客户端打断对话\r
+                print("打断对话")\r
+                self.AI_client_voice_chat_RequestToSpeak()\r
+            elif self.voice_chat_state == VC_State_Listening:\r
+                #直接chat\r
+                print("直接chat")\r
+                self.AI_client_voice_chat_RequestToRespond()\r
+        if self.AI_client_voice_chat_isconnect == 0:\r
+            return\r
+        self.voice_chat_state = VC_State_None\r
+        if self.AI_TTS_str == "":#没有tts要播放的时候才开始录音\r
+            #开始asr录音\r
+            self.VC_Speech_Start()\r
+            pass\r
+        #开始线程\r
+        if self.AI_audio_queue_thread_id ==0:\r
+            _thread.stack_size(24*1024)\r
+            self.AI_audio_queue_thread_id = _thread.start_new_thread(self.AI_audio_queue_thread, ())\r
+            _thread.stack_size(8*1024)\r
+            print("AI_VC_start :AI_audio_queue_thread_id :{} ".format(self.AI_audio_queue_thread_id))\r
+        else:\r
+            print("AI_VC_start :AI_audio_queue_thread_id != 0 ")\r
+        if self.AI_send_data_queue_thread_id == 0:    \r
+            _thread.stack_size(self.Audio_buf_size+8*1024)\r
+            self.AI_send_data_queue_thread_id = _thread.start_new_thread(self.AI_send_data_queue_thread, ())\r
+            _thread.stack_size(8*1024)\r
+            print("AI_VC_start :AI_send_data_queue_thread_id :{} ".format(self.AI_send_data_queue_thread_id))\r
+        self._1S_timer.start(1000,1,self._1S_timer_cb)\r
+        self.pingping_timerout = 0\r
+        \r
+        \r
+    #开始会话\r
+    def AI_client_voice_chat_start_requset(self):\r
+        \r
+        json_data = \\r
+        {\r
+            "header":{\r
+                "trace_id":self.get_trace_id(),\r
+                "event":"Start"\r
+                },\r
+            "payload":{\r
+                "dialog_id":self.VC_dialog_id,\r
+                "device_id":modem.getDevImei(),\r
+                "user_agent":"python",\r
+                "in_format":"pcm",\r
+                "out_format":"mp3",\r
+                "in_sample_rate":self.VC_record_samplerate,\r
+                "sample_rate":self.VC_play_samplerate,\r
+                "space_time": 150,\r
+                "volume": str(self.VC_TTS_volume),\r
+                "voice":self.VC_TTS_voice_type[self.VC_TTS_voice_num],\r
+                "voice_detection":"enabled",\r
+                "simple_response":True,\r
+                "custom_variables":{\r
+                    "bot_name":"{}".format(self.bot_name)\r
+                }\r
+                },\r
+            \r
+        }\r
+        if self.VC_play_TYPE == VC_play_TYPE_PCM:\r
+            json_data["payload"]["out_format"]='pcm'\r
+        if self.VC_record_TYPE == VC_record_TYPE_AMR :\r
+            json_data["payload"]["in_format"]='amr'\r
+            pass\r
+        if self.VC_mode == 1:\r
+            json_data["payload"]["voice_detection"]='disable'\r
+        self.voice_chat_state = VC_State_None\r
+        self.AI_client_voice_chat_send(ujson.dumps(json_data))\r
+ \r
+    #开始上传语音\r
+    def AI_client_voice_chat_send_speech(self):\r
+        json_data = \\r
+        {\r
+            "header":{\r
+                "trace_id":self.get_trace_id(),\r
+                "event":"SendSpeech"\r
+                },\r
+            "payload":\r
+            {\r
+                "dialog_id":self.VC_dialog_id\r
+            }\r
+        }\r
+        self.AI_client_voice_chat_send(ujson.dumps(json_data))\r
+        self.VC_Speech_Start()#开启线程获取录音数据\r
+        self.voice_chat_state =  VC_State_SpeechStart\r
+    #结束上传语音\r
+    def AI_client_voice_chat_end_speech(self):\r
+        json_data = \\r
+        {\r
+            "header":{\r
+                "trace_id":self.get_trace_id(),\r
+                "event":"StopSpeech"\r
+                },\r
+            "payload":{\r
+                "dialog_id":self.VC_dialog_id\r
+                }\r
+        }\r
+        self.AI_client_voice_chat_send(ujson.dumps(json_data))\r
+        self.VC_Speech_End()#停止线程录音\r
+\r
+    #通知服务器开始播放\r
+    def AI_client_voice_chat_LocalRespondingStarted(self):\r
+        json_data = \\r
+        {\r
+            "header":{\r
+                "trace_id":self.get_trace_id(),\r
+                "event":"LocalRespondingStarted"\r
+                },\r
+            "payload":{\r
+                "dialog_id":self.VC_dialog_id\r
+                }\r
+        }\r
+        self.AI_client_voice_chat_send(ujson.dumps(json_data))\r
+    #通知服务器播放结束\r
+    def AI_client_voice_chat_LocalRespondingEnded(self):\r
+        json_data = \\r
+        {\r
+            "header":{\r
+                "trace_id":self.get_trace_id(),\r
+                "event":"LocalRespondingEnded"\r
+                },\r
+            "payload":{\r
+                "dialog_id":self.VC_dialog_id\r
+                }\r
+        }\r
+        EventMesh.publish("publish_AI_btnInfo",{"func":self.VC_init}) \r
+        EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_client_voice_chat_send,"data":ujson.dumps(json_data)}) \r
+        # utime.sleep_ms(1)\r
+        # self.AI_client_voice_chat_send(ujson.dumps(json_data))\r
+        self.voice_chat_state = VC_State_End\r
+    #客户端打断对话\r
+    def AI_client_voice_chat_RequestToSpeak(self):\r
+        json_data = \\r
+        {\r
+            "header":{\r
+                "trace_id":self.get_trace_id(),\r
+                "event":"RequestToSpeak"\r
+                },\r
+            "payload":{\r
+                "dialog_id":self.VC_dialog_id\r
+                }\r
+        }\r
+        print("AI_client_voice_chat_RequestToSpeak!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")\r
+        EventMesh.publish("publish_AI_btnInfo",{"func":self.VC_init}) \r
+        EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_client_voice_chat_send,"data":ujson.dumps(json_data)}) \r
+        # utime.sleep_ms(1)\r
+    #请求TTS或者chat事件\r
+    def AI_client_voice_chat_RequestToRespond(self):\r
+        json_data = \\r
+        {\r
+            "header":{\r
+                "trace_id":self.get_trace_id(),\r
+                "event":"RequestToRespond"\r
+                },\r
+            "payload":{\r
+                "dialog_id":self.VC_dialog_id,\r
+                "type":"transcript",#prompt是跳过asr,transcript是跳过asr和大模型\r
+                "text":""\r
+                }\r
+        }\r
+\r
+        print("AI_client_voice_chat_RequestToRespond!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")\r
+        if self.AI_TTS_str != "":\r
+            json_data["payload"]["text"] = self.AI_TTS_str\r
+            json_data["payload"]["type"] = "transcript"\r
+            EventMesh.publish("publish_AI_btnInfo",{"func":self.VC_init}) \r
+            EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_client_voice_chat_send,"data":ujson.dumps(json_data)}) \r
+            self.AI_TTS_str = ""\r
+        elif self.AI_ASR_str != "":\r
+            json_data["payload"]["text"] = self.AI_ASR_str\r
+            json_data["payload"]["type"] = "prompt"\r
+            EventMesh.publish("publish_AI_btnInfo",{"func":self.VC_init}) \r
+            EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_client_voice_chat_send,"data":ujson.dumps(json_data)})\r
+            self.AI_ASR_str = ""\r
+        # utime.sleep_ms(1)\r
+    #发送数据队列\r
+    def AI_send_data_queue_thread(self):\r
+        print("AI_send_data_queue_thread:start")\r
+        count_t = 0\r
+        while True:\r
+            if self.AI_send_data_queue.empty() :#不能去掉,去掉会卡死\r
+                count_t+=1\r
+                # if count_t%200 == 0:\r
+                #     print("self.AI_send_data_queue.empty")\r
+                utime.sleep_ms(1)\r
+            else:\r
+                #data[0]是websocket连接对象编号,data[1]是数据\r
+                #print("AI_send_data_queue_thread:get")\r
+                data = self.AI_send_data_queue.get()\r
+                #print("AI_send_data_queue_thread:num{} len{}".format(data[0],len(data[1])))\r
+                if data != None:\r
+                    try:\r
+                        #data["func"](data["data"])\r
+                        # 发送数据\r
+                        #bytes_data = bytes(data[1])\r
+                        #data[0].send(data[1])\r
+                        #print("AI_send_data_queue_thread:len:{}".format(len(data[1])))\r
+                        #print("AI_send_data_queue_thread on line asr recv :{} vc recv:{}".format(_thread.threadIsRunning(self.AI_client_asr_recv_id),_thread.threadIsRunning(self.AI_client_voice_chat_recv_id)))\r
+                        if data[0] == AI_client_voice_chat_num:\r
+                            # if self.AI_client_voice_chat_isconnect == 0:\r
+                            #     try:\r
+                            #         self.websocket_connect_voice_chat() \r
+                            #     except Exception as e: #网络连接异常\r
+                            #         usys.print_exception(e)\r
+                            self.pingping_timerout = 0\r
+                            #print("VC: send_data len:{}".format(len(data[1])))\r
+                            if self.AI_client_voice_chat != None and self.AI_client_voice_chat_isconnect == 1:\r
+                                self.AI_client_voice_chat.send(data[1])\r
+                            #print("VC: send_data end")\r
+\r
+                        if data[0] == AI_client_asr_num:\r
+                            #self.pingping_timerout = 0\r
+                            #print("VC: send_data len:{}".format(len(data[1])))\r
+                            if self.AI_client_asr != None and self.AI_client_asr_isconnect == 1:\r
+                                self.AI_client_asr.send(data[1])\r
+                        #print("VC: send_data end")\r
+                    except Exception as e:\r
+                        print("DeviceInfo_queue_thread:ERROR:{}".format(e))\r
+                        usys.print_exception(e)\r
+                        if data[0] == AI_client_voice_chat_num:\r
+                            #self.websocket_error()\r
+                            pass\r
+                            #self.websocket_deconnect_voice_chat()\r
+                            self.AI_client_voice_chat_isconnect = 0\r
+                            try:\r
+                                self.websocket_error()\r
+                                #self.websocket_deconnect_voice_chat()\r
+                            except Exception as e: #网络连接异常\r
+                                usys.print_exception(e)\r
+                        if data[0] == AI_client_asr_num: \r
+                            EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_connect_asr}) #重连\r
+                         \r
+    ############################################\r
+    # 音频队列        \r
+    def AI_audio_queue_thread(self):\r
+        print("AI_audio_queue_thread start")\r
+        count = 0\r
+        while True:\r
+            try:\r
+                # if self.AI_send_data_queue_thread_id == 0:\r
+                #     break\r
+                # print("AI_audio_queue_thread")\r
+                if self.AI_audio_queue.empty() :\r
+                    utime.sleep_ms(1)\r
+                    count+=1\r
+                    if count%5000 == 1:\r
+                        print("AI_audio_queue_thread on")\r
+                else:\r
+                    data = self.AI_audio_queue.get()\r
+                    self.close_timerout = 0\r
+                    if self.play_flag == 0:\r
+                        self.play_flag =1\r
+                        print("AI_client_voice_chat_LocalRespondingStarted!!!")\r
+                        self.AI_client_voice_chat_LocalRespondingStarted()#通知服务器开始播放\r
+                    #self.AI_client_tts_data_len=len(data)\r
+                    print("\r\naudio_queue:len:{},data{}".format(len(data[0]),len(data[1])))\r
+                    if len(data[0]) > 10:\r
+                        try:\r
+                            if self.VC_play_TYPE == VC_play_TYPE_PCM:\r
+                                if self.VC_play_samplerate == 8000:\r
+                                    tmp= self.aud.playStream(1,data[0] )\r
+                                elif self.VC_play_samplerate == 16000:\r
+                                \r
+                                \r
+                                    \r
+                                    write_buf = bytearray(data[0])\r
+                                    #print("play_pcm.stream_write1!!")\r
+                                    if self.play_pcm != None:\r
+                                        ret = self.play_pcm.stream_write(write_buf,len(write_buf))\r
+                                        #ret= self.aud.playStream(1, data[0])#播放音频流\r
+                                        self.tts_out_data_len += ret\r
+                                        print("play_pcm.stream_write:{}".format(self.tts_out_data_len))\r
+                            elif self.VC_play_TYPE == VC_play_TYPE_MP3:\r
+                                tmp= self.aud.playStream(3, data[0])#播放音频流\r
+                                \r
+                                if tmp != 0:\r
+                                    print("2playStream:error tmp:{} data len:{}!!!!!!!!!!!!".format(tmp,len(data[0])))\r
+                                    # # #播放失败的时候填充WAV头\r
+                                    # data_len = len(data[0])\r
+                                    # data_len_b = data_len.to_bytes(4,'little')#数据长度转16进制数组\r
+                                    # h_data = [ 0x52 ,0x49 ,0x46 ,0x46 #,0x24 ,0x00 ,0x00 ,0x00 #文件标识、文件大小\r
+                                    #         ,0x57 ,0x41 ,0x56 ,0x45 ,0x66 ,0x6D ,0x74 ,0x20  #文件格式、格式块标识符\r
+                                    #         ,0x10 ,0x00 ,0x00 ,0x00 ,0x01 ,0x00 ,0x01 ,0x00 ,0x80 ,0x3E ,0x00 ,0x00  #格式块大小4、音频格式2、声道数2、采样率4\r
+                                    #         ,0x80 ,0x3E ,0x00 ,0x00 ,0x02 ,0x00 ,0x10 ,0x00 ,0x64 ,0x61 ,0x74 ,0x61]#每秒字节数4、数据块对齐2、位深度2、data4\r
+                                    # h_data_b = bytes(h_data)\r
+                                    # file_len = data_len+len(h_data_b)+4+4\r
+                                    # file_len_b = file_len.to_bytes(4,'little')#文件长度转16进制数组\r
+                                    # h_data_b = h_data_b[:4]+file_len_b+h_data_b[4:]+data_len_b\r
+                                    # #self.aud.playStream(2, h_data_b)#播放音频流\r
+                                    # tmp= self.aud.playStream(2, h_data_b+data[0])#播放音频流\r
+                                    # print("3playStream:tmp:{} !!!!!!!!!!!!".format(tmp))\r
+                            \r
+                            #print("出:{},{}!!!".format(len(data[0]),self.AI_client_tts_data_len))\r
+                            mem = gc.mem_free()\r
+                            #print('1剩余内存RAM:{} KB'.format(mem / 1024))\r
+                        except Exception as e:\r
+                            print("AI_audio_queue_thread:ERROR:")\r
+                            usys.print_exception(e)\r
+                    \r
+                    # if self.voice_chat_state == VC_State_TTSEnd and self.AI_audio_queue.empty() :#self.AI_audio_queue为空且tts下发结束\r
+                    #     #通知服务器播放结束\r
+                    #     self.AI_client_voice_chat_LocalRespondingEnded()\r
+            except Exception as e:\r
+                print("AI_audio_queue_thread:ERROR:")\r
+                usys.print_exception(e)\r
+        #print("AI_audio_queue_thread:exit")\r
+    def factory_mode(self):\r
+        print("factory_mode")\r
+        EventMesh.publish("publish_AI_btnInfo",{"func":self.Close}) \r
+        EventMesh.publish("publish_AI_btnInfo",{"func":self.factory_start}) \r
+    def factory_start(self):\r
+        self.factory_timer.start(1000, 1, self.factory_timer_cb)\r
+    def factory_timer_cb(self, *args, **kwargs):\r
+        print("factory_timer_cb play......")\r
+        self.aud.play(1,0,'U:/static/peizhichenggong.mp3')#切换成功\r
+\r
+    def Close(self):\r
+        print("ai_VC Close1!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")\r
+        self.tts_in_data_len = 0\r
+        self.tts_out_data_len = 0\r
+        \r
+        print("ai_VC Close1.1!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")\r
+        self.VC_init()\r
+        self.VC_Speech_End()\r
+        print("ai_VC Close1.2!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")\r
+        if self.AI_send_data_queue.empty()!=True:\r
+            self.AI_send_data_queue.clear()\r
+        self.AI_TTS_str = ""\r
+        self.AI_ASR_str = ""\r
+        self.AI_ASR_str_tmp = ""\r
+        self.AI_ASR_flag  = 0\r
+        print("ai_VC Close1.3!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")\r
+        try:\r
+        #销毁线程\r
+            if self.AI_audio_queue_thread_id != 0:\r
+                try:\r
+                    _thread.stop_thread(self.AI_audio_queue_thread_id)\r
+                except Exception as e:\r
+                    usys.print_exception(e)\r
+                self.AI_audio_queue_thread_id = 0\r
+            if self.AI_send_data_queue_thread_id != 0:\r
+                try:\r
+                    _thread.stop_thread(self.AI_send_data_queue_thread_id)\r
+                except Exception as e:\r
+                    usys.print_exception(e)\r
+            self.AI_send_data_queue_thread_id = 0\r
+            \r
+\r
+        except Exception as e:\r
+            usys.print_exception(e)\r
+        print("ai_VC Close2!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")\r
+        try:\r
+            self.websocket_deconnect_voice_chat()\r
+        except Exception as e:\r
+            usys.print_exception(e)\r
+        print("ai_VC Close3!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\r\n")\r
+        try:\r
+            self.websocket_deconnect_asr()\r
+        except Exception as e:\r
+            usys.print_exception(e)\r
+        self._1S_timer.stop()\r
+        self.factory_timer.stop()\r
+        \r
+        if self.record_data_save_flag == 1:\r
+            if self.record_fd :\r
+                self.record_fd.close()\r
+            self.record_fd = None\r
+    def VC_init2(self):\r
+        self.VC_init()\r
+        if self.AI_send_data_queue.empty()!=True:\r
+            self.AI_send_data_queue.clear()\r
+        print("ai_VC VC_init2!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")\r
+        try:\r
+            self.websocket_deconnect_voice_chat()\r
+        except Exception as e:\r
+            usys.print_exception(e)\r
+        print("ai_VC Close3!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\r\n")\r
+        self._1S_timer.stop()\r
+\r
+\r
+    def VC_init(self):\r
+        \r
+        print("VC_init:AI_send_data_queue:size:{}".format(self.AI_send_data_queue.size()))\r
+        if self.AI_audio_queue.empty()!=True:\r
+            self.AI_audio_queue.clear()\r
+        \r
+        print("VC_init2")\r
+        #self.VC_Speech_End()\r
+        print("VC_init3")\r
+        self.VC_Play_End()\r
+        print("VC_init4")\r
+        \r
+        EventMesh.publish("close_led")\r
+        # num = EventMesh.publish("get_volum_size")\r
+        # if num == None:\r
+        #     num = 8\r
+        # self.aud.setVolume(num)#恢复原始音量\r
         
\ No newline at end of file
index 13417ef..2c4043a 100644 (file)
@@ -1,65 +1,65 @@
-import uwebsocket
-import _thread
-import utime
-import usys
-import ujson
-# json_data = \
-#         {
-#             "id": "123456895461254",
-#             "event_type": "transcriptions.update",
-#             "data": {
-#                 "input_audio": {         #输入音频格式
-#                     "format": "pcm",       #输入音频格式,支持 pcm/wav/ogg。默认 wav
-#                     "codec": "pcm",         #输入音频编码。 pcm/opus。默认 pcm
-#                     "samplate_rate": 24000,  #采样率
-#                     "channel": 1, #通道数
-#                     "bit_depth": 16 #位深
-#                 },
-#             }
-#         }
-json_data =\
-{
-       "header": {
-               "trace_id": "x70g1n8gfdg",
-               "event": "Start"
-       },
-       "payload": {
-               "device_id": "test_device_id",
-               "user_agent": "python",
-               "dialog_id": "",
-               "in_format": "pcm",
-               "out_format": "pcm",
-               "in_sample_rate": 16000,
-               "volume": "10",
-               "sample_rate": 16000,
-               "voice": "zh_female_shuangkuaisisi_moon_bigtts",
-               "voice_detection": "disable"
-       }
-}
-url="wss://ws.coze.cn/v1/chat"
-url="wss://ws.coze.cn/v1/chat?bot_id=7462617881076351002"
-url = "ws://118.145.158.207:22080/voice-chat/v2/ws?is_auth=0"
-#url="wss://ws.coze.cn/v1/audio/speech"
-print("url:{}".format(url))
-Headers = {"Authorization":"Bearer pat_SSaiOzccrRLaQEaB4sdshvHZQzqjeWD5jq2GWPVoWRx4N8XcdraHWYqdDjK5zpR1"}
-s_client = uwebsocket.Client.connect(url, headers=Headers, debug=True)
-def AI_client_asr_recv(cli):
-        while True:
-            try:
-                # 死循环接收数据
-                
-                utime.sleep_ms(1)
-                recv_data = cli.recv()
-                print("AI_client_asr_recv:recv_data={}".format(recv_data))
-                if not recv_data:
-                    # 服务器关闭连接或客户端关闭连接
-                    print("cli close")
-                    cli.close()
-                    break
-            except Exception as e:
-                    
-                    usys.print_exception(e)
-                    break
-AI_client_asr_recv_id = _thread.start_new_thread(AI_client_asr_recv, (s_client,))
-s_client.send(ujson.dumps(json_data))
-print("send:{}".format(ujson.dumps(json_data)))
+import uwebsocket\r
+import _thread\r
+import utime\r
+import usys\r
+import ujson\r
+# json_data = \\r
+#         {\r
+#             "id": "123456895461254",\r
+#             "event_type": "transcriptions.update",\r
+#             "data": {\r
+#                 "input_audio": {         #输入音频格式\r
+#                     "format": "pcm",       #输入音频格式,支持 pcm/wav/ogg。默认 wav\r
+#                     "codec": "pcm",         #输入音频编码。 pcm/opus。默认 pcm\r
+#                     "samplate_rate": 24000,  #采样率\r
+#                     "channel": 1, #通道数\r
+#                     "bit_depth": 16 #位深\r
+#                 },\r
+#             }\r
+#         }\r
+json_data =\\r
+{\r
+       "header": {\r
+               "trace_id": "x70g1n8gfdg",\r
+               "event": "Start"\r
+       },\r
+       "payload": {\r
+               "device_id": "test_device_id",\r
+               "user_agent": "python",\r
+               "dialog_id": "",\r
+               "in_format": "pcm",\r
+               "out_format": "pcm",\r
+               "in_sample_rate": 16000,\r
+               "volume": "10",\r
+               "sample_rate": 16000,\r
+               "voice": "zh_female_shuangkuaisisi_moon_bigtts",\r
+               "voice_detection": "disable"\r
+       }\r
+}\r
+url="wss://ws.coze.cn/v1/chat"\r
+url="wss://ws.coze.cn/v1/chat?bot_id=7462617881076351002"\r
+url = "ws://118.145.158.207:22080/voice-chat/v2/ws?is_auth=0"\r
+#url="wss://ws.coze.cn/v1/audio/speech"\r
+print("url:{}".format(url))\r
+Headers = {"Authorization":"Bearer pat_SSaiOzccrRLaQEaB4sdshvHZQzqjeWD5jq2GWPVoWRx4N8XcdraHWYqdDjK5zpR1"}\r
+s_client = uwebsocket.Client.connect(url, headers=Headers, debug=True)\r
+def AI_client_asr_recv(cli):\r
+        while True:\r
+            try:\r
+                # 死循环接收数据\r
+                \r
+                utime.sleep_ms(1)\r
+                recv_data = cli.recv()\r
+                print("AI_client_asr_recv:recv_data={}".format(recv_data))\r
+                if not recv_data:\r
+                    # 服务器关闭连接或客户端关闭连接\r
+                    print("cli close")\r
+                    cli.close()\r
+                    break\r
+            except Exception as e:\r
+                    \r
+                    usys.print_exception(e)\r
+                    break\r
+AI_client_asr_recv_id = _thread.start_new_thread(AI_client_asr_recv, (s_client,))\r
+s_client.send(ujson.dumps(json_data))\r
+print("send:{}".format(ujson.dumps(json_data)))\r
index 6b0a159..f9d5e8c 100644 (file)
-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
-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.GPIO41, ExtInt.IRQ_RISING_FALLING, ExtInt.PULL_PU, self.pwk_extint_cb)
-            #self.extint_AI = ExtInt(ExtInt.GPIO19,ExtInt.IRQ_RISING_FALLING, ExtInt.PULL_PU, self.keyAI_extint_cb)
-            self.extint_AI = ExtInt(ExtInt.GPIO22,ExtInt.IRQ_RISING_FALLING, ExtInt.PULL_PU, self.keyAI_extint_cb)
-        self.extint_AI.enable()
-        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)
-        
-        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_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")#充电红灯常亮
-                EventMesh.publish("audio_montage_play",["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")
-                EventMesh.publish("audio_montage_play",["R_CHARGE_OUT.mp3"])
-                #self.aud.play(1,1,'U:/static/R_CHARGE_OUT.mp3')
-    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_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:
-            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("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')#关机音频
-                        EventMesh.publish("open_led_red")
-                        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_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):
-        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")
-        
-    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("open_led_red")
-        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")
-
-    
-    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")#充电红灯常亮
-        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 :
-                EventMesh.publish("audio_montage_play",["R_CHARGE_FULL.mp3"])
-                #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"]:    
-            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.json")
-            if check == True:
-                with open("/usr/static/storage_file/config.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_data", self.set_storage_data)
-            EventMesh.subscribe("set_storage_config", self.set_storage_config)
-            EventMesh.subscribe("get_storage_data", self.get_storage_data)
-            EventMesh.subscribe("get_storage_config", self.get_storage_config)
-
-        def set_storage_data(self, event, msg): 
-            # EventMesh.debug_log("set_storage_data:{}".format(msg))
-            if msg != None:
-                self.config_data = msg
-                with open("/usr/static/storage_file/config.json",'w+',encoding="utf-8") as fd:
-                    ujson.dump(self.config_data,fd)
-        
-
-        def set_storage_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.json",'w+',encoding="utf-8") as fd:
-                ujson.dump(self.config_data,fd)
-        def get_storage_data(self, event, msg): 
-            # EventMesh.debug_log("get_storage_data:{}".format(self.config_data))
-            return self.config_data 
-        def get_storage_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_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_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_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_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_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_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 = 1 #0:短按连续问答模式 1:长按录音模式
-        self.VC_mode = EventMesh.publish("get_storage_config","VC_mode")#
-        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.server_ip = EventMesh.publish("get_storage_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_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_config","speech_rate")#语速配置
-        if self.speech_rate == None:
-            self.speech_rate = 0
-        self.VC_TTS_voice_type = EventMesh.publish("get_storage_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_config",["VC_TTS_voice_type",self.VC_TTS_voice_type])
-
-        try:
-            self.VC_TTS_voice_key = EventMesh.publish("get_storage_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_config","VC_TTS_volume")#音量配置
-        except Exception as e:
-            usys.print_exception(e)
-        #配置词
-        self.commands_mode = 2#=1用大模型判断命令,=0用服务器本地插件判断命令 =2用设备本地判断方式
-        if dev_type == "7PIN_BK":
-            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)
-        EventMesh.subscribe("AI_key_release", self.AI_key_release)
-        EventMesh.subscribe("AI_key_long_press", self.AI_key_long_press)
-        EventMesh.subscribe("pwk_key_release", self.pwk_key_release)
-        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)
-        
-        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)
-                #开机提示语,如果联网失败,直接提示信号弱
-                
-                
-                #EventMesh.publish("get_storage_config",["powerRestart",1])
-                powerRestart =  EventMesh.publish("get_storage_config","powerRestart")#=1非正常重启
-                if powerRestart == None:
-                    powerRestart = 0
-                if powerRestart == 1:
-                    EventMesh.publish("set_storage_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_config","config_version")#音量配置
-                                    if config_version != data["data"]["version"]:
-                                        config_version = data["data"]["version"]
-                                        EventMesh.publish("set_storage_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_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_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_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(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_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(self, event, msg):#按键长按
-        print("AI_key_long_press")
-        self.AI_key_long_press_flag = 1
-
-    def pwk_key_release(self, event, msg):#电源键短按,关闭
-        print("pwk_key_release")
-        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))
-                    #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 >= 20: 
-                                    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_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:
-                                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))
-                        
-                        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!!!!!!!!\r\n")
-                            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" :#会话开始
-                            EventMesh.publish("open_led_red_green")#
-                            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()
-                            EventMesh.publish("open_led_green")#绿色
-                        elif jsload_data["event"] == "tts.completed" :#tts结束
-                            EventMesh.publish("open_led_green")#绿色
-                            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
-                        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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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
-        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_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_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_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_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_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_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_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_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_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_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_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)<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
-        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.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")
-        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="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",
-                           
-                        }
-                    }
-                },
-                "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"]="7462617881076351002"#语言助手
-            # json_data["payload"]["dialog_attributes"]["cfg"]["bot_option"]["workflow_id"]="7462621757327196187"
-            json_data["payload"]["dialog_attributes"]["cfg"]["bot_option"]["bot_id"]="7486697248416989193"#极简
-            json_data["payload"]["dialog_attributes"]["cfg"]["bot_option"]["workflow_id"]="7486698347416649778"
-            #json_data["payload"]["dialog_attributes"]["provider"]="doubao"#豆包
-            json_data["payload"]["inbound_attributes"]["provider"]="volcengine"#火山
-            json_data["payload"]["inbound_attributes"]["vad_silence"] = 200
-        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"] = 1000
-        #
-        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
-        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))
-    
-    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!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")
-        EventMesh.publish("close_led")
-        self.tts_in_data_len = 0
-        self.tts_out_data_len = 0
-        #必须先销毁线程,不然线程会容易报错
-        
-        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)#恢复原始音量
+from common import Abstract, LogAdapter\r
+import EventMesh\r
+import uwebsocket\r
+import usys\r
+import gc\r
+import urandom\r
+import uhashlib\r
+import ubinascii\r
+import ujson\r
+import osTimer\r
+import _thread\r
+from queue import Queue\r
+import utime\r
+import audio\r
+import uos\r
+from machine import Pin\r
+from machine import ExtInt\r
+from machine import WDT\r
+import modem\r
+import sim\r
+import net\r
+import base64\r
+import ucryptolib\r
+import urandom as random\r
+import request\r
+import ql_fs\r
+from misc import Power,USB,PowerKey\r
+import ntptime\r
+import machine\r
+import dataCall\r
+import constants\r
+import versions\r
+import VAD\r
+#dev_type = "G10"\r
+#dev_type = "7PIN_BK"#小瑞\r
+dev_type = "7PIN"#柒牌\r
+#dev_type = 'momo'#食梦貘\r
+#dev_type = 'sjgq'#四季甘泉\r
+#dev_type = 'szbst'#深圳百事通\r
+\r
+class AI_led(Abstract):\r
+    def __init__(self):\r
+        if dev_type == "G10":\r
+            self.led_red = Pin(Pin.GPIO36, Pin.OUT, Pin.PULL_PD, 0)\r
+            self.led_green = Pin(Pin.GPIO44, Pin.OUT, Pin.PULL_PD, 1)\r
+            self.led_blue = Pin(Pin.GPIO21, Pin.OUT, Pin.PULL_PD, 1)\r
+        else:\r
+            self.led_red = Pin(Pin.GPIO36, Pin.OUT, Pin.PULL_PD, 0)\r
+            self.led_green = Pin(Pin.GPIO21, Pin.OUT, Pin.PULL_PD, 1)\r
+            self.led_blue = Pin(Pin.GPIO19, Pin.OUT, Pin.PULL_PD, 1)\r
+\r
+        #=1 红灯闪,=2白灯闪,=3绿灯闪,=4全部灯闪\r
+        self.led_flicker_flag = 0\r
+        self.led_flicker_on_off_flag = 0\r
+        self.led_flicker_timer = osTimer()\r
+        \r
+        EventMesh.subscribe("open_led_red",self.open_led_red)\r
+        EventMesh.subscribe("open_led_blue",self.open_led_blue)\r
+        EventMesh.subscribe("open_led_green",self.open_led_green)\r
+        EventMesh.subscribe("open_led_all",self.open_led_all)\r
+        EventMesh.subscribe("open_led_red_blue",self.open_led_red_blue)\r
+        EventMesh.subscribe("open_led_red_green",self.open_led_red_green)\r
+        EventMesh.subscribe("flicker_led_red",self.flicker_led_red)\r
+        EventMesh.subscribe("flicker_led_blue",self.flicker_led_blue)\r
+        EventMesh.subscribe("flicker_led_green",self.flicker_led_green)\r
+        EventMesh.subscribe("flicker_led_all",self.flicker_led_all)\r
+        EventMesh.subscribe("close_led",self.close_led)\r
+        EventMesh.publish("open_led_red")\r
+\r
+    def flicker_led_red(self,event,msg):\r
+        self.led_flicker_flag = 1\r
+        self.led_flicker_timer.start(1500, 1, self.led_flicker_timer_cb)\r
+\r
+    def flicker_led_blue(self,event,msg):\r
+        self.led_flicker_flag = 2\r
+        self.led_flicker_timer.start(1500, 1, self.led_flicker_timer_cb)\r
+\r
+    def flicker_led_green(self,event,msg):\r
+        self.led_flicker_flag = 3\r
+        self.led_flicker_timer.start(1500, 1, self.led_flicker_timer_cb)\r
+\r
+    def flicker_led_all(self,event,msg):\r
+        self.led_flicker_flag = 4\r
+        self.led_flicker_timer.start(1500, 1, self.led_flicker_timer_cb)\r
+\r
+    def led_flicker_timer_cb(self, *args, **kwargs):\r
+        EventMesh.publish("publish_AI_btnInfo",{"func":self.led_flicker_timer_cb_})  \r
+    def led_flicker_timer_cb_(self):\r
+        if self.led_flicker_flag == 0:\r
+            self.led_flicker_timer.stop()\r
+            return\r
+        if self.led_flicker_on_off_flag == 0:\r
+            self.led_red.write(0)\r
+            self.led_blue.write(0)\r
+            self.led_green.write(0)\r
+            self.led_flicker_on_off_flag = 1\r
+        else:\r
+            self.led_flicker_on_off_flag = 0\r
+            if self.led_flicker_flag == 1:\r
+                self.led_blue.write(0)\r
+                self.led_green.write(0)\r
+                self.led_red.write(1)\r
+            elif self.led_flicker_flag == 2:\r
+                self.led_red.write(0)\r
+                self.led_green.write(0)\r
+                self.led_blue.write(1)\r
+            elif self.led_flicker_flag == 3:\r
+                self.led_red.write(0)\r
+                self.led_blue.write(0)\r
+                self.led_green.write(1)\r
+            elif self.led_flicker_flag == 4:\r
+                self.led_blue.write(1)\r
+                self.led_green.write(1)\r
+                self.led_red.write(1)\r
+\r
+    def open_led_red(self,event,msg):\r
+        #print("open_led_red")\r
+        self.led_flicker_flag = 0\r
+        #self.led_red.write(0)\r
+        self.led_blue.write(0)\r
+        self.led_green.write(0)\r
+        self.led_red.write(1)\r
+\r
+    def open_led_blue(self,event,msg):\r
+        #print("open_led_blue")\r
+        self.led_flicker_flag = 0\r
+        self.led_red.write(0)\r
+        #self.led_blue.write(0)\r
+        self.led_green.write(0)\r
+        self.led_blue.write(1)\r
+\r
+    def open_led_green(self,event,msg):\r
+        #print("open_led_green")\r
+        self.led_flicker_flag = 0\r
+        self.led_red.write(0)\r
+        self.led_blue.write(0)\r
+        #self.led_green.write(0)\r
+        self.led_green.write(1)\r
+\r
+    def open_led_red_blue(self,event,msg):\r
+        #print("open_led_blue")\r
+        self.led_flicker_flag = 0\r
+        self.led_red.write(1)\r
+        #self.led_blue.write(0)\r
+        self.led_green.write(0)\r
+        self.led_blue.write(1)\r
+\r
+    def open_led_red_green(self,event,msg):\r
+        #print("open_led_blue")\r
+        self.led_flicker_flag = 0\r
+        self.led_red.write(1)\r
+        #self.led_blue.write(0)\r
+        self.led_green.write(1)\r
+        self.led_blue.write(0)\r
+\r
+    def open_led_all(self,event,msg):\r
+        #print("open_led_all")\r
+        self.led_flicker_flag = 0\r
+        #self.led_red.write(0)\r
+        self.led_blue.write(1)\r
+        self.led_green.write(1)\r
+        self.led_red.write(1)\r
+\r
+    def close_led(self,event,msg):\r
+        #print("close_led")\r
+        self.led_flicker_flag = 0\r
+        self.led_red.write(0)\r
+        self.led_blue.write(0)\r
+        self.led_green.write(0)\r
+\r
+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']\r
+class AI_dev(Abstract):\r
+    # AI\r
+    def __init__(self):\r
+        self.is_wdt = 0 #是否开启看门狗\r
+\r
+        self.VBATT_tab = {"charge_full":4300,"100" :4250 ,  "90":4179 , "80":4070, "60": 3883, "40":3770, "20":3699,  "10":3652,"5":3600,}\r
+        self.KeyAI_status = 0\r
+        self.KeyAI_timer_count = 0\r
+        self.KeyAI_long_press = 0\r
+        self.KeyAI_press = 0\r
+        if self.is_wdt == 1:\r
+            self.wdt = WDT(30) #开启看门狗\r
+        # self.wdt_timer = osTimer()\r
+        # self.wdt_timer.start(5000, 1, self.wdt_timer_cb)\r
+        count = 0\r
+        while True:\r
+            count += 1\r
+            if count > 20 :\r
+                break\r
+            data = dataCall.getInfo(1, 0)\r
+            print("data call INFO {}".format(data))\r
+            if data[2][0]:\r
+                self.network_state = 1\r
+                break\r
+            print("等待网络 {}...".format(count))\r
+            utime.sleep_ms(500)\r
+        self.KeyAI_timer = osTimer()\r
+        if dev_type == "G10":\r
+            self.extint_AI = ExtInt(ExtInt.GPIO19,ExtInt.IRQ_RISING_FALLING, ExtInt.PULL_PU, self.keyAI_extint_cb)\r
+            self.pwk_key = ExtInt(ExtInt.GPIO26, ExtInt.IRQ_RISING_FALLING, ExtInt.PULL_PU, self.pwk_extint_cb)\r
+        else:\r
+            self.pwk_key = ExtInt(ExtInt.GPIO41, ExtInt.IRQ_RISING_FALLING, ExtInt.PULL_PU, self.pwk_extint_cb)\r
+            #self.extint_AI = ExtInt(ExtInt.GPIO19,ExtInt.IRQ_RISING_FALLING, ExtInt.PULL_PU, self.keyAI_extint_cb)\r
+            self.extint_AI = ExtInt(ExtInt.GPIO22,ExtInt.IRQ_RISING_FALLING, ExtInt.PULL_PU, self.keyAI_extint_cb)\r
+        self.extint_AI.enable()\r
+        self.pwk_key_status = 0\r
+        self.pwk_key_timer_count = 0\r
+        self.pwk_key_long_press = 0\r
+        self.pwk_key_press = 0\r
+        self.pwk_key_timer = osTimer()\r
+        #self.pwk_key = ExtInt(ExtInt.GPIO26, ExtInt.IRQ_RISING_FALLING, ExtInt.PULL_DISABLE, self.pwk_extint_cb)\r
+        \r
+        self.pwk_key.enable() \r
+        print("AI_dev:1")\r
+        self.btnInfo_queue = Queue(100)\r
+        self.btnInfo_queue_count = 0\r
+        _thread.stack_size(16*1024)\r
+        self.btnInfo_queue_thread_id = _thread.start_new_thread(self.btnInfo_queue_thread, ())\r
+        _thread.stack_size(8*1024)\r
+        EventMesh.subscribe("publish_AI_btnInfo",self.publish_AI_btnInfo)\r
+        EventMesh.subscribe("get_battery",self.get_battery)\r
+        EventMesh.subscribe("audio_montage_play",self.audio_montage_play)\r
+        EventMesh.subscribe("paly_iccid_imei",self.paly_iccid_imei)\r
+        EventMesh.subscribe("paly_device_res_error",self.paly_device_res_error)\r
+        EventMesh.subscribe("Power_off",self.pwk_key_Long_Press)\r
+        \r
+        print("AI_dev:2")\r
+        self.pk = PowerKey()\r
+        self.pk.powerKeyEventRegister(self.powerKey_callback)\r
+        self.usb = USB()\r
+        self.usb.setCallback(self.usb_event_cb)\r
+        self.usb_status = self.usb.getStatus()\r
+        self.usb_charge_flag = 0 \r
+        self.Low_power_warning_timer = 0\r
+        self.AI_dev_timer = osTimer()\r
+        self.AI_dev_timer.start(10000, 1, self.AI_dev_timer_cb)\r
+        print("AI_dev:AI_dev_timer")\r
+        self.aud = audio.Audio(0)\r
+        self.Low_power_warning_flag = 0\r
+        self.VC_TTS_volume =  EventMesh.publish("get_storage_config","VC_TTS_volume")#音量配置\r
+        if self.VC_TTS_volume == None:\r
+            self.VC_TTS_volume = 100\r
+        self.aud.setVolume(self.VC_TTS_volume //10)\r
+        #self.aud.play(1,0,'U:/static/xianyikaiji.mp3')#开机音频\r
+        #EventMesh.publish("audio_montage_play",["xianyikaiji.mp3"])\r
+        #EventMesh.publish("publish_AI_btnInfo",{"func":self.ntptime_cb})\r
+        self.check_rest_timer_count = 0\r
+        print("AI_dev:end")\r
+    def ntptime_cb(self):\r
+        #ntptime.settime(8)\r
+        print("timer:{}!!!!!!!!\r\n".format(utime.localtime()))\r
+    def usb_event_cb(self, state):\r
+        EventMesh.publish("publish_AI_btnInfo",{"func":self.usb_event,"data":state})\r
+\r
+    def usb_event(self, state):    \r
+        status = state\r
+        self.usb_charge_flag = 0\r
+        if status == 1:#插入USB\r
+            print("charge R_CHARGE_in")\r
+            self.usb_status = 1\r
+            VC_satrt_flag = EventMesh.publish("get_VC_satrt_flag")#获取vc是否在运行\r
+            if VC_satrt_flag == None:\r
+                VC_satrt_flag = 0\r
+            if VC_satrt_flag == 0:\r
+                self.aud.stop()\r
+                #EventMesh.publish("flicker_led_red")#充电闪灯\r
+                #self.aud.play(1,1,'U:/static/R_CHARGE_IN.mp3')\r
+                EventMesh.publish("open_led_red")#充电红灯常亮\r
+                EventMesh.publish("audio_montage_play",["R_CHARGE_IN.mp3"])\r
+            self.Low_power_warning_flag  = 0\r
+            pass\r
+        elif status == 0:#拨出usbs\r
+            self.usb_status = 0\r
+            VC_satrt_flag = EventMesh.publish("get_VC_satrt_flag")#获取vc是否在运行\r
+            if VC_satrt_flag == None:\r
+                VC_satrt_flag = 0\r
+            if VC_satrt_flag == 0:\r
+                self.aud.stop()\r
+                EventMesh.publish("close_led")\r
+                EventMesh.publish("audio_montage_play",["R_CHARGE_OUT.mp3"])\r
+                #self.aud.play(1,1,'U:/static/R_CHARGE_OUT.mp3')\r
+    def btnInfo_queue_thread(self):\r
+        while True:\r
+            data = self.btnInfo_queue.get()\r
+            self.btnInfo_queue_count-=1\r
+            #EventMesh.debug_log("Info_queue:data = {}".format(data))\r
+            if data != None:\r
+                try:\r
+                    if "data" in data :\r
+                        data["func"](data["data"])\r
+                    else :\r
+                        data["func"]()\r
+                except Exception as e:\r
+                    #EventMesh.debug_log("btnInfo_queue:ERROR:{}".format(e))\r
+                    usys.print_exception(e)\r
+    def publish_AI_btnInfo(self,event,msg):\r
+        #print("publish_AI_btnInfo 1")\r
+        self.btnInfo_queue.put(msg)\r
+        self.btnInfo_queue_count+=1\r
+        if self.btnInfo_queue_count > 80:\r
+            self.btnInfo_queue_count =0\r
+            print("事件处理线程队列出问题,重启!!!!!!!!!!!!!!")\r
+            print("线程:{} 队列:{}".format(_thread.threadIsRunning(self.btnInfo_queue_thread_id),self.btnInfo_queue.size()))\r
+            # if _thread.threadIsRunning(self.btnInfo_queue_thread_id):\r
+            #     _thread.stop_thread(self.btnInfo_queue_thread_id)\r
+            # _thread.stack_size(10*1024)\r
+            # self.btnInfo_queue_thread_id = _thread.start_new_thread(self.btnInfo_queue_thread, ())\r
+            # _thread.stack_size(8*1024)\r
+            # self.btnInfo_queue.clear()\r
+            # self.btnInfo_queue = Queue(100)\r
+            EventMesh.publish("VC_error") #播放报错\r
+            utime.sleep_ms(1000)\r
+            self.aud.stopPlayStream()\r
+            self.aud.stopAll()\r
+            Power.powerRestart()\r
+            EventMesh.publish("set_storage_config",["powerRestart",1])\r
+        #print("publish_AI_btnInfo 2")\r
+    def powerKey_callback(self, status):\r
+        print("powerKey_callback:{}".format(status))\r
+\r
+    def pwk_extint_cb(self,args):#pwk\r
+        try:\r
+            self.pwk_key_status = int(args[1])\r
+            if self.pwk_key_status == 0:\r
+                self.pwk_key_status = 1\r
+            else:\r
+                self.pwk_key_status = 0\r
+                pass\r
+            if self.pwk_key_status == 0:#按下\r
+                \r
+                if self.pwk_key_press == 0 :\r
+                    self.pwk_key.disable()\r
+                    self.pwk_key_press = 1\r
+                    self.pwk_key_long_press = 0\r
+                    self.pwk_key_timer.start(100, 1, self.pwk_key_timer_cb)\r
+                    self.pwk_key_timer_count = 0\r
+                    #EventMesh.publish("AI_key_press")\r
+        except Exception as e: \r
+            usys.print_exception(e)\r
+    def pwk_key_timer_cb(self, *args, **kwargs):\r
+    #     EventMesh.publish("publish_AI_btnInfo",{"func":self.pwk_key_timer_cb_})\r
+    # def pwk_key_timer_cb_(self) :\r
+        try:\r
+            self.pwk_key_status = self.pwk_key.read_level()\r
+            self.pwk_key_timer_count +=1\r
+            if self.pwk_key_timer_count >= 10*3: #长按3s \r
+                #print("pwk_key_long_press {}".format(self.pwk_key_long_press))\r
+                if self.pwk_key_long_press == 0:\r
+                        self.pwk_key_long_press = 1\r
+                        #EventMesh.publish("AI_key_long_press")\r
+                        EventMesh.publish("audio_montage_play",["zhengzaiguanji.mp3"])\r
+                        #self.aud.play(1,0,'U:/static/zhengzaiguanji.mp3')#关机音频\r
+                        EventMesh.publish("open_led_red")\r
+                        utime.sleep_ms(2000)\r
+                        self.aud.stopPlayStream()\r
+                        self.aud.stopAll()\r
+                        Power.powerDown()\r
+                        #print("AI_key_release")\r
+                        #EventMesh.publish("pwk_key_long_press")\r
+                        #EventMesh.publish("publish_AI_btnInfo",{"func":self.pwk_key_Long_Press})  \r
+            if self.pwk_key_status == 1:#松开\r
+                #print("pwk_key_timer_cb:{}".format(self.pwk_key_timer_count))\r
+                key_count = 5\r
+                if dev_type == "7PIN_BK":\r
+                    key_count = 3\r
+                if self.pwk_key_timer_count >= key_count: #防抖200ms\r
+                    #EventMesh.publish("AI_key_release")\r
+                    EventMesh.publish("publish_AI_btnInfo",{"func":self.pwk_key_release})\r
+                    self.pwk_key.enable()\r
+                    self.pwk_key_timer.stop()\r
+                    self.pwk_key_timer_count = 0\r
+                    self.pwk_key_press = 0\r
+            \r
+        except Exception as e: \r
+            usys.print_exception(e) \r
+            \r
+    def keyAI_extint_cb(self,args):#call 2\r
+        try:\r
+            #print("AI_btn:keyAI_extint_cb{}".format(args[1]))\r
+            self.KeyAI_status = int(args[1])\r
+            if self.KeyAI_status == 0:\r
+                self.KeyAI_status = 1\r
+            else:\r
+                self.KeyAI_status = 0\r
+            \r
+            if self.KeyAI_status == 0:#按下\r
+                if self.KeyAI_press == 0 :\r
+                    EventMesh.publish(constants.EVENT.SYSTEM_UP)#唤醒休眠\r
+                    self.extint_AI.disable()\r
+                    self.KeyAI_press = 1\r
+                    self.KeyAI_long_press = 0\r
+                    self.KeyAI_timer.start(100, 1, self.KeyAI_timer_cb)\r
+                    self.KeyAI_timer_count = 0\r
+                    #EventMesh.publish("AI_key_press")\r
+                    if dev_type == "7PIN" :\r
+                        self.aud.aud_tone_play(10,200)#播放按键音\r
+                    EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_key_press})  \r
+        except Exception as e: \r
+            usys.print_exception(e)\r
+    def KeyAI_timer_cb(self, *args, **kwargs):\r
+    #     EventMesh.publish("publish_AI_btnInfo",{"func":self.KeyAI_timer_cb_})\r
+    # def KeyAI_timer_cb_(self):\r
+        try:\r
+            self.KeyAI_status = self.extint_AI.read_level()\r
+            self.KeyAI_timer_count +=1\r
+            if self.KeyAI_timer_count >= 10*1: #长按3s \r
+                if self.KeyAI_long_press == 0:\r
+                        self.KeyAI_long_press = 1\r
+                        #EventMesh.publish("AI_key_long_press")\r
+                        EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_key_long_press})  \r
+            if self.KeyAI_status == 1:#松开\r
+                #print("KeyAI_timer_cb:{}".format(self.KeyAI_timer_count))\r
+                key_count = 5\r
+                if dev_type == "7PIN_BK":\r
+                    key_count = 3\r
+                if self.KeyAI_timer_count >= key_count: #防抖200ms\r
+                    #EventMesh.publish("AI_key_release")\r
+                    EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_key_release})  \r
+                    self.extint_AI.enable()\r
+                    self.KeyAI_timer.stop()\r
+                    self.KeyAI_timer_count = 0\r
+                    self.KeyAI_press = 0\r
+            \r
+        except Exception as e: \r
+            usys.print_exception(e) \r
+       \r
+    def AI_key_press(self):\r
+        self.check_rest_timer_count = 0\r
+        print("AI_key_press")\r
+        EventMesh.publish("AI_key_press")\r
+\r
+    def AI_key_long_press(self):\r
+        self.check_rest_timer_count = 0\r
+        print("AI_key_long_press")\r
+        EventMesh.publish("AI_key_long_press")\r
+        \r
+    def AI_key_release(self):\r
+        print("AI_key_release")\r
+        EventMesh.publish("AI_key_release")\r
+        \r
+    def pwk_key_Long_Press(self,event=None,msg=None):\r
+        self.check_rest_timer_count = 0\r
+        print("pwk_key_long_press!!!!!!!")\r
+        print("pwk_key_long_press!!!!!!!")\r
+        \r
+        # EventMesh.publish("paly_iccid_imei")\r
+        # return\r
+        EventMesh.publish("audio_montage_play",["zhengzaiguanji.mp3"])\r
+        #self.aud.play(1,0,'U:/static/zhengzaiguanji.mp3')#关机音频\r
+        EventMesh.publish("open_led_red")\r
+        utime.sleep_ms(3000)\r
+        self.aud.stopPlayStream()\r
+        self.aud.stopAll()\r
+        Power.powerDown()\r
+        #print("AI_key_release")\r
+        #EventMesh.publish("pwk_key_long_press")\r
+        \r
+    def pwk_key_release(self):\r
+        self.check_rest_timer_count = 0\r
+        #print("pwk_key_release")\r
+        EventMesh.publish("pwk_key_release")\r
+\r
+    \r
+    def wdt_timer_cb(self, *args, **kwargs):\r
+        if self.is_wdt == 1:\r
+            self.wdt.feed()\r
+\r
+    def AI_dev_timer_cb(self, *args, **kwargs):\r
+        #print("AI_dev_timer_cb")\r
+        EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_dev_timer_event})  \r
+    def AI_dev_timer_event(self):\r
+        if self.is_wdt == 1:\r
+            self.wdt.feed()\r
+        VC_satrt_flag = EventMesh.publish("get_VC_satrt_flag")#获取vc是否在运行\r
+        if VC_satrt_flag == None:\r
+            VC_satrt_flag = 0\r
+        Vbatt = Power.getVbatt()\r
+        if self.usb_status == 1 and VC_satrt_flag == 0:\r
+            EventMesh.publish("open_led_red")#充电红灯常亮\r
+        if  self.usb_status == 1 and Vbatt>=self.VBATT_tab["charge_full"]and VC_satrt_flag == 0:#充电充满\r
+            EventMesh.publish("open_led_green")\r
+            if self.usb_charge_flag == 0 :\r
+                EventMesh.publish("audio_montage_play",["R_CHARGE_FULL.mp3"])\r
+                #self.aud.play(1,0,'U:/static/R_CHARGE_FULL.mp3')#充电已满\r
+                self.usb_charge_flag = 1\r
+        if  self.usb_status == 0 and Vbatt<self.VBATT_tab["20"]and VC_satrt_flag == 0 and self.Low_power_warning_flag ==0:#低电报警\r
+            self.Low_power_warning_flag  = 1\r
+            EventMesh.publish("flicker_led_red")\r
+            #self.aud.play(1,0,'Low_power_warning.mp3')\r
+            # self.Low_power_warning_timer+=1\r
+            # if self.Low_power_warning_timer >= 2:\r
+            #     self.Low_power_warning_timer = 0\r
+            EventMesh.publish("audio_montage_play",["Low_power_warning.mp3"])\r
+\r
+        if  self.usb_status == 0 and Vbatt<self.VBATT_tab["5"]:    \r
+            EventMesh.publish("audio_montage_play",["didianguanji.mp3"])\r
+            utime.sleep_ms(4500)\r
+            self.aud.stopPlayStream()\r
+            self.aud.stopAll()\r
+            Power.powerDown()\r
+\r
+        self.check_rest_timer_count += 1\r
+        if self.check_rest_timer_count >= 8640:#24小时没按键,则关机\r
+            self.pwk_key_Long_Press()\r
+        \r
+    def get_battery(self, event=None, msg=None):\r
+        Vbatt = Power.getVbatt()\r
+        if Vbatt>self.VBATT_tab["90"]:\r
+            return 100\r
+        if Vbatt>self.VBATT_tab["80"]:\r
+            return 90\r
+        if Vbatt>self.VBATT_tab["60"]:\r
+            return 80\r
+        if Vbatt>self.VBATT_tab["40"]:\r
+            return 60\r
+        if Vbatt>self.VBATT_tab["20"]:\r
+            return 40\r
+        if Vbatt>self.VBATT_tab["10"]:\r
+            return 20\r
+        if Vbatt<=self.VBATT_tab["10"]:\r
+            return 10\r
+    def audio_montage_play(self,event,msg):\r
+        self.aud.stopPlayStream()\r
+        self.aud.stopAll()\r
+        str_data='mp3files='\r
+        for i in msg:\r
+            try:\r
+                str_tmp = i.replace(".mp3","")\r
+                str_data+="{}.mp3+".format(audio_buf.index(str_tmp))\r
+            except Exception as e:\r
+                    usys.print_exception(e)    \r
+        str_data = str_data[:-1]\r
+        print("audio_montage_play:{}".format(str_data))\r
+        self.aud.montage_play('U:/static/audio.bin',1,1,str_data)\r
+        \r
+    def paly_iccid_imei(self,event,msg):\r
+        str_data = 'mp3files={}.mp3+'.format(audio_buf.index("liuliangtishi"))#流量提示\r
+        imei  = modem.getDevImei()\r
+        iccid = sim.getIccid()\r
+        print("paly_iccid_imei:ICCID:{}".format(iccid))\r
+        if iccid != -1 and len(iccid) > 5:\r
+            iccid = iccid.upper()\r
+            if len(iccid) <20:\r
+                for i in range(20-len(iccid)):\r
+                    iccid = "0"+iccid\r
+            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]))\\r
+                ,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])),\\r
+                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])),\\r
+                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])),\\r
+                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])),\\r
+                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])))\r
+        str_data += '{}.mp3+'.format(audio_buf.index("shouhou"))#可联系售后解决,联系方式见售后客服电话是400-886-8777或到微信公众号柒牌SEVENBRAND自行充值:\r
+        self.aud.montage_play('U:/static/audio.bin',1,1,str_data)\r
+    #鉴权出错,播放imei号\r
+    def paly_device_res_error(self,event,msg):\r
+        str_data = 'mp3files={}.mp3+'.format(audio_buf.index("jianquancuowu"))#AI功能异常,请联系客户查询,设备号为:\r
+        imei  = modem.getDevImei()\r
+        imei = imei.upper()\r
+        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]))\\r
+                ,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])),\\r
+                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])),\\r
+                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])),\\r
+                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])))\r
+        #print("str_data:{}".format(str_data))\r
+        self.aud.montage_play('U:/static/audio.bin',1,1,str_data)\r
+\r
+#存储信息\r
+class getStorageDataManager(Abstract):#获取内存数据\r
+        def __init__(self):\r
+            self.config_data = {}\r
+            check = ql_fs.path_exists("/usr/static/storage_file/config.json")\r
+            if check == True:\r
+                with open("/usr/static/storage_file/config.json","r") as fd:\r
+                    self.config_data = ujson.load(fd)\r
+            else :\r
+                self.config_data = {'old_time': 0, 'flip_sw': 0}\r
+                pass\r
+\r
+        def post_processor_after_instantiation(self):\r
+            EventMesh.subscribe("set_storage_data", self.set_storage_data)\r
+            EventMesh.subscribe("set_storage_config", self.set_storage_config)\r
+            EventMesh.subscribe("get_storage_data", self.get_storage_data)\r
+            EventMesh.subscribe("get_storage_config", self.get_storage_config)\r
+\r
+        def set_storage_data(self, event, msg): \r
+            # EventMesh.debug_log("set_storage_data:{}".format(msg))\r
+            if msg != None:\r
+                self.config_data = msg\r
+                with open("/usr/static/storage_file/config.json",'w+',encoding="utf-8") as fd:\r
+                    ujson.dump(self.config_data,fd)\r
+        \r
+\r
+        def set_storage_config(self,event,msg): \r
+            # EventMesh.debug_log("set_storage_key_data1:{}".format(msg))\r
+            if len(msg) >= 2:\r
+                self.config_data[msg[0]]=msg[1]\r
+                # EventMesh.debug_log("set_storage_key_data2:{}".format(self.config_data[msg[0]]))\r
+                EventMesh.publish("publish_message_event_ui",{"func":self.set_storage_save,"data":0})\r
+        def set_storage_save(self, data): \r
+            with open("/usr/static/storage_file/config.json",'w+',encoding="utf-8") as fd:\r
+                ujson.dump(self.config_data,fd)\r
+        def get_storage_data(self, event, msg): \r
+            # EventMesh.debug_log("get_storage_data:{}".format(self.config_data))\r
+            return self.config_data \r
+        def get_storage_config(self,event,msg):\r
+            # EventMesh.debug_log("get_storage_key_data1:{}".format(msg))\r
+            b = msg in self.config_data.keys()\r
+            if b == True:\r
+                # EventMesh.debug_log("get_storage_key_data2:{}".format(self.config_data[msg]))\r
+                return self.config_data[msg]\r
+            else :\r
+                return None\r
+            # try:\r
+            #     return self.config_data[msg]\r
+            # except:\r
+            #     EventMesh.debug_log("get_storage_key_data:none key:{}",msg)\r
+            #     return None\r
+#设备资源授权平台\r
+class device_res_author(Abstract):\r
+   \r
+    def __init__(self) :\r
+        print("device_res_author __init__ start !!!!!!!!!!!!!!!!!")\r
+        self.deviceId = modem.getDevImei()#"876226002022574"\r
+        self.SHA1_BLOCK_SIZE = 64\r
+        self.PAD_BLOCK_SIZE = 16\r
+        self.SHA256 = uhashlib.sha256\r
+        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)\r
+        # 除去补16字节的多余字符\r
+        self.unpad = lambda s: s[:-s[-1]]\r
+        #K01\r
+        # self.key = b"MWrMZjdtcPhj41jWuoqFAhTmqyFluqj1" \r
+        # self.pid = "qAtdDOGXgXYjT2HGFr3a"\r
+        #G15\r
+        # self.key = b"3LWfBicxfRZ3ZAqmZCFuvMdGUXdAFWkb" \r
+        # self.pid = "qLx4Pu4mSUQxyfVKGLXG"\r
+        #7pin\r
+        self.key = b"uKLrChwrxA1LklgBc3VwawYjUkbT3BgX" \r
+        self.pid = "cqxJZi5CNgzjS3mX21Zw"\r
+        \r
+        self.dev_res_timer = osTimer()\r
+        self.dev_res_timer.start(20000, 1, self.dev_timer_cb)\r
+        self.dev_res_timerCount = 0\r
+        self.ud_token_timer = osTimer()\r
+        self.ud_token_timer.start(10000, 1, self.ud_token_timer_cb)\r
+        self.ud_token_timer_Count = 0\r
+        self.dev_token = None\r
+        self.res_error_count = 0\r
+        self.ntptime_flag = 0\r
+        EventMesh.subscribe("get_dev_token", self.get_dev_token)\r
+        EventMesh.subscribe("update_dev_token", self.update_dev_token)\r
+        EventMesh.subscribe("dev_active", self.dev_active)\r
+        EventMesh.subscribe("dev_sign_in", self.dev_sign_in)\r
+        EventMesh.subscribe("dev_NTP", self.dev_NTP)\r
+        #EventMesh.publish_async("dev_NTP",thread_size = 8192)\r
+\r
+        # count = 0\r
+        # while True:\r
+        #     if self.ntptime_flag == 1:\r
+        #         break\r
+        #     utime.sleep_ms(1)\r
+        #     count+=1\r
+        #     if count>600:\r
+        #         break\r
+        # EventMesh.publish_async("dev_active",thread_size = 8192)\r
+        # EventMesh.publish_async("dev_sign_in",thread_size = 8192)\r
+\r
+        self.dev_NTP()#获取时间\r
+        self.dev_active() #设备激活\r
+        self.dev_sign_in() #设备登入\r
+        print("device_res_author __init__ end !!!!!!!!!!!!!!!!!")\r
+\r
+    def get_dev_token(self, event, msg): \r
+        return self.dev_token\r
+    #网络校时\r
+    def dev_NTP(self, event=None, msg=None):\r
+        response = None\r
+        try:\r
+            print("dev_NTP1")\r
+            url = "http://dmp.raisound.com/bz-api/dev/time"\r
+            response = request.get(url,timeout=5)\r
+            data = response.json()\r
+            print("dev_NTP:{}".format(data))\r
+            if data:\r
+                try:\r
+                    timeSecond = data["data"]["timestamp"]//1000\r
+                    \r
+                    next_alarm_time = utime.localtime(timeSecond)\r
+                    print("timeSecond {} next_alarm_time {}".format(timeSecond,next_alarm_time))\r
+                    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))\r
+                    self.ntptime_flag  = 1\r
+                except Exception as e:\r
+                        usys.print_exception(e)\r
+        except Exception as e:\r
+            usys.print_exception(e)\r
+        if response != None:\r
+            response.close() \r
+        print("dev_NTP end")\r
+    def dev_timer_cb(self, *args): #设备资源管理鉴权平台定时器\r
+        EventMesh.publish("publish_AI_btnInfo",{"func":self.dev_timer_cb_}) \r
+\r
+    def dev_timer_cb_(self):    \r
+        #if EventMesh.DEV_RES_MANAGE_AUTHEN_PLATFORM == 1:\r
+        try:\r
+            if self.dev_token == None:\r
+                if self.ntptime_flag == 0:\r
+                    self.ntptime_flag  = 1\r
+                    EventMesh.publish_async("dev_NTP",thread_size = 8192)\r
+                    #EventMesh.publish("publish_AI_btnInfo",{"func":self.dev_NTP})\r
+                print("timer:{}!!!!!!!!\r\n".format(utime.localtime()))\r
+                EventMesh.publish_async("dev_active",thread_size = 8192)\r
+                EventMesh.publish_async("dev_sign_in",thread_size = 8192)\r
+                # self.dev_active() #设备激活\r
+                # self.dev_sign_in() #设备登入\r
+                self.dev_res_timerCount+=1\r
+                if self.dev_res_timerCount > 3: #开机一分钟内没有获取到密码和token 等下一次更新令牌在走登入 激活流程\r
+                    self.dev_res_timerCount=0\r
+                    self.dev_res_timer.stop()\r
+        except Exception as e:\r
+            usys.print_exception(e)\r
+    def ud_token_timer_cb(self, *args): \r
+        EventMesh.publish("publish_AI_btnInfo",{"func":self.ud_token_timer_cb_}) \r
+\r
+    def ud_token_timer_cb_(self):   \r
+        try:\r
+            #print("ud_token_timer_!!!!")\r
+            self.ud_token_timer_Count+=1\r
+            if self.ud_token_timer_Count >= 720: #定时10*3000s时更新token\r
+                self.ud_token_timer_Count = 0\r
+                EventMesh.publish_async("dev_sign_in",thread_size = 8192)\r
+        except Exception as e:\r
+            usys.print_exception(e)    \r
+    def get_sim_Status(self):\r
+        return sim.getStatus() \r
+    def HMAC(self,k, m):\r
+    \r
+        KEY_BLOCK = k + (b'\0' * (self.SHA1_BLOCK_SIZE - len(k)))\r
+        KEY_INNER = bytes((x ^ 0x36) for x in KEY_BLOCK)\r
+        KEY_OUTER = bytes((x ^ 0x5C) for x in KEY_BLOCK)\r
+        inner_message = KEY_INNER + m\r
+        outer_message = KEY_OUTER + self.SHA256(inner_message).digest()\r
+        return self.SHA256(outer_message)\r
+    def get_hmac_sha256(self,k, m):\r
+        data = self.HMAC(k, m).digest()\r
+        # print("HMAC(k, m).digest():", data)\r
+        # print("HMAC(k, m).digest():", ubinascii.hexlify(data))\r
+        hex_data = ubinascii.hexlify(data)\r
+        hex_data = hex_data.decode('ascii')\r
+        return hex_data\r
+    # 加密函数\r
+    def aes_CBC_Encrypt(self,data, key, iv):  # CBC模式的加密函数,data为明文,key为16字节密钥,iv为16字节的偏移量\r
+        key = key.encode('utf-8')\r
+        iv = iv.encode('utf-8')  # CBC 模式下的偏移量\r
+        data = self.pad(data)  # 补位\r
+        data = data.encode('utf-8')\r
+        aes = ucryptolib.aes(key,ucryptolib.MODE_CBC,iv)\r
+        result = base64.b64encode(aes.encrypt(data))\r
+        return str(result, 'utf-8')  # 以字符串的形式返回\r
+\r
+    # 解密函数\r
+    def aes_CBC_Decrypt(self,data, key, iv):  # CBC模式的解密函数,data为密文,key为16字节密钥\r
+        key = key.encode('utf-8')\r
+        iv = iv.encode('utf-8')\r
+        \r
+        aes = ucryptolib.aes(key,ucryptolib.MODE_CBC,iv) #CBC模式\r
+\r
+        # decrypt AES解密  B64decode为base64 转码\r
+        result = aes.decrypt(base64.b64decode(data))\r
+        result = self.unpad(result)  # 除去补16字节的多余字符\r
+        return str(result, 'utf-8')  # 以字符串的形式返回\r
+    #激活接口 没有密码走激活\r
+    def dev_active(self, event=None, msg=None):\r
+        signal = net.csqQueryPoll()\r
+        if signal == -1 or self.get_sim_Status() != 1:#网络不正常\r
+            print("dev_active 无 SIM卡!!!!!!!!\r\n")\r
+            return\r
+        print("dev_active 1\r\n")\r
+        # 签名内容: = deviceId+pid+timeStamp\r
+        dev_pass = ""\r
+        dev_pass = EventMesh.publish("get_storage_config","dev_pass")\r
+        print("dev_pass:{}\r\n".format(dev_pass))\r
+        if dev_pass == None:\r
+            dev_pass = ""\r
+        if dev_pass == "" or dev_pass == None:\r
+            try:\r
+                date_tmp = utime.localtime() #获取当前时间\r
+                print("date_tmp:{}\r\n".format(date_tmp)) #转换时间戳s\r
+                timeStamp = (utime.mktime(date_tmp))*1000#获取时间戳ms\r
+                deviceId = self.deviceId #"876226002022574" #以imei号\r
+                pid = self.pid\r
+                key = self.key\r
+                sign_data = "{}{}{}".format(deviceId,pid,timeStamp)  #签名内容\r
+                print("sign_data:{}\r\n".format(sign_data))\r
+                sha256_hex = self.get_hmac_sha256(key,sign_data)\r
+                print("sha256_hex:{}\r\n".format(sha256_hex))\r
+\r
+                data = {\r
+                    "deviceId":"{}".format(deviceId), #设备名\r
+                    "pid":pid, #产品PID\r
+                    "sign":"{}".format(sha256_hex), #HMACSHA256签名后的数据\r
+                    "timeStamp":timeStamp, #要以ms的形式\r
+                    "signMethod":"HMACSHA256" #签名方式 HMACSHA256\r
+                }\r
+                print(ujson.dumps(data))\r
+                headers_T ={"Content-Type":"application/json"}\r
+                url = "http://dmp.raisound.com/bz-api/dev/auth/active"\r
+                data =ujson.dumps(data)\r
+                response = None\r
+                response_result = 0\r
+                try:\r
+                    response = request.put(url,data=data,headers = headers_T,timeout=5)\r
+                    response_result = 1\r
+                except Exception as e:\r
+                    usys.print_exception(e)   \r
+                    print("put error!!!!!\r\n")\r
+                    response_result = 0\r
+                \r
+                IV = "" #偏移量\r
+                PASSWORD= "" #服务器返回后的加密内容 密码\r
+                if response_result == 1: #访问成功ip\r
+                    if response.status_code == 200:\r
+                        print("headers:{}".format(response.headers))\r
+                        content = response.content\r
+                        c = next(content)\r
+                        # "api.xcloudtech.com"\r
+                        # d_server_port = 9000\r
+                        data =  ujson.loads(c)\r
+                        # data = response.json()\r
+                        print("data-{}".format(data))\r
+                        if data != None:\r
+                            if "success" in data:\r
+                                if data['success'] == True:\r
+                                    if "data" in data:\r
+                                        data_tmp = data["data"]\r
+                                        if "nonce" in data_tmp: #偏移量\r
+                                            IV = data_tmp["nonce"]\r
+                                        if "password" in data_tmp:\r
+                                            PASSWORD = data_tmp["password"]\r
+                                            # EventMesh.publish("set_storage_config",["dev_pass",PASS])\r
+                                if data["code"] == 20001:#鉴权成功\r
+                                    pass\r
+                                elif data["code"] > 50000:#时间错误\r
+                                    self.res_error_count+=1\r
+                                    if self.res_error_count>=3:\r
+                                        self.res_error_count = 0\r
+                                        #EventMesh.publish("paly_device_res_error")\r
+                                    if data["code"] == 50003:#时间错误\r
+                                        self.ntptime_flag  = 0\r
+                        if PASSWORD != None and IV != None:\r
+                            if len(PASSWORD) != 0 and len(IV) != 0:\r
+                                password = PASSWORD\r
+                                iv = IV\r
+                                #解密 之后保存本地下一次登入做使用\r
+                                decrypt_data = self.aes_CBC_Decrypt(password, self.key, iv) #对服务器下发的密码进行解密\r
+                                print("decrypt_data {}".format(decrypt_data))\r
+                                EventMesh.publish("set_storage_config",["dev_pass",decrypt_data])    \r
+                    print("IV:{}\r\n PASS:{}".format(IV,PASSWORD))\r
+                if response != None:\r
+                    response.close()  \r
+            except Exception as e:\r
+                usys.print_exception(e)   \r
+            print("dev_active end\r\n")\r
+            return [response_result,PASSWORD,IV]\r
+    #随机生成16个字节的字符串作为加密的IV 偏移量\r
+    def generate_random_string(self,length=16): \r
+        random_str = ""\r
+        chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'\r
+        for i in range(length):\r
+            random_str+=chars[random.randint(0,length)]\r
+        return random_str\r
+\r
+    #设备登入 没有Token 走登入获取token\r
+    def dev_sign_in(self, event=None, msg=None):\r
+        signal = net.csqQueryPoll()\r
+        if signal == -1 or self.get_sim_Status() != 1:#网络不正常\r
+            print("dev_sign_in 无 SIM卡!!!!!!!!\r\n")\r
+            return\r
+        print("dev_sign_in 1")\r
+        token = ""\r
+        try:\r
+            token = self.dev_token\r
+            dev_pass = EventMesh.publish("get_storage_config","dev_pass") \r
+            #print("token:{}\r\n".format(token))\r
+            if token == None:\r
+                token = ""\r
+            if dev_pass == None:\r
+                dev_pass = ""\r
+            if len(dev_pass) == 0:#没有密码\r
+                return\r
+            #if token == None or token == "":\r
+            if 1: #返回结果成功\r
+                #获取本地保存的密码\r
+                decrypt_data=EventMesh.publish("get_storage_config","dev_pass")\r
+                # decrypt_data = self.aes_CBC_Decrypt(password, self.key, iv) #对服务器下发的密码进行解密\r
+                print("decrypt_data {}".format(decrypt_data))\r
+                #随机生成16个字符串 设备生成做加密使用\r
+                random_string = self.generate_random_string(16) #随机的16个字符串\r
+                enc_iv = random_string #加密的IV偏移量\r
+                #设备端进行密码加密\r
+                encrypt_data = self.aes_CBC_Encrypt(decrypt_data, self.key, enc_iv)\r
+                print("encrypt_data {}".format(encrypt_data))\r
+\r
+                #登入数据\r
+                deviceId = self.deviceId\r
+                sign_in_data = {\r
+                    "deviceId":"{}".format(deviceId), #设备ID\r
+                    "password":"{}".format(encrypt_data), #加密的数据\r
+                    "nonce":"{}".format(random_string) #随机的16个字符串\r
+                }\r
+                print(ujson.dumps(sign_in_data))\r
+                sign_url = "http://dmp.raisound.com/bz-api/dev/auth/sign_in" #登入地址\r
+                headers_T ={"Content-Type":"application/json"}\r
+                response_result = 0\r
+                response = 0\r
+                try:\r
+                    response = request.post(sign_url,data=ujson.dumps(sign_in_data),headers = headers_T,timeout=5)\r
+                    response_result = 1\r
+                except Exception as e:\r
+                    usys.print_exception(e)   \r
+                    print("post error!!!!!\r\n")\r
+                    response_result = 0\r
+                # {'msg': '', 'code': 20001, 'success': True, \r
+                # 'data': {'deviceId': '876226002022574', \r
+                # 'token': '95436a9e09fd0ff89feb8825257dca982f'}\r
+                # }\r
+                \r
+                #self.dev_token = ""\r
+                if response_result == 1:\r
+                    if response.status_code == 200:\r
+                        content = response.content\r
+                        c = next(content)\r
+                        data =  ujson.loads(c)\r
+                        print("data-{}".format(data))\r
+                        if data != None:\r
+                            if "success" in data:\r
+                                if data['success'] == True: #登入成功\r
+                                    if "data" in data:\r
+                                        data_tmp = data["data"]\r
+                                        if "token" in data_tmp: #token\r
+                                            self.dev_token = data_tmp["token"]\r
+                                if data["code"] == 50003:#时间错误\r
+                                    self.ntptime_flag  = 0\r
+                print("token:{}\r\n".format(self.dev_token))\r
+                if response != None:\r
+                    response.close()\r
+                pass\r
+        except Exception as e:\r
+                    print("post error!!!!!\r\n")\r
+                    response_result = 0\r
+        print("dev_sign_in end")\r
+    #获取新的令牌 更新token\r
+    def update_dev_token(self, event=None, msg=None):\r
+        print("update_dev_token")\r
+        try:\r
+            dev_pass = ""\r
+            dev_pass = EventMesh.publish("get_storage_config","dev_pass")\r
+            \r
+            if dev_pass == None:\r
+                dev_pass = ""\r
+            if len(dev_pass) == 0: #没有密码走激活\r
+                print("no dev_pass:{}\r\n".format(dev_pass))\r
+                EventMesh.publish("dev_active")\r
+            token = self.dev_token\r
+            if token == None:\r
+                token = ""\r
+            if len(token) == 0: #没有token走登入\r
+                print("no dev_token:{}\r\n".format(token))\r
+                #self.dev_sign_in()\r
+                EventMesh.publish("dev_sign_in")\r
+            dev_tokenip = "http://dmp.raisound.com/bz-api/dev/auth/token" #设备新令牌更新地址\r
+            token = self.dev_token\r
+            if token == None:\r
+                token = ""\r
+            if len(token) != 0:\r
+                response_result=0\r
+                response = None\r
+                headers_T = {"bz-dt":"{}".format(token)}\r
+                try:\r
+                    response = request.get(dev_tokenip,headers = headers_T,timeout=5)\r
+                    response_result = 1\r
+                except Exception as e:\r
+                    print("get error!!!!!\r\n")\r
+                    response_result = 0\r
+                if response_result == 1:\r
+                    if response.status_code == 200:\r
+                        try:\r
+                            headers_data = response.headers\r
+                            # print("headers_data!!!!! headers_data:{}\r\n".format(headers_data))\r
+                            if "bz-dt" in headers_data: #bz-dt字段是否在头部数据里面 如果有就需要更新\r
+                                bz_dt = headers_data["bz-dt"] \r
+                                self.dev_token = bz_dt.replace(" ", "") #去掉所有的空格符\r
+                                print("update_dev_token:{}".format(self.dev_token))\r
+                        except Exception as e:\r
+                            print("headers_data!!!!! error\r\n")\r
+                if response != None:\r
+                    response.close()\r
+        except Exception as e:\r
+            usys.print_exception(e)   \r
+        print("update_dev_token end")\r
+        \r
+#OTA升级\r
+class OTA():\r
+    def __init__(self):\r
+        #EventMesh.subscribe("min_sys_ota",self.min_sys_ota)\r
+        self.downloadFileVoURL1= ""\r
+        self.downloadFileVoURL2= ""\r
+    #小系统升级,返回0,没有升级;返回,1有升级,正在执行升级;返回2,电压不够\r
+    def min_sys_ota(self,event=None,msg=None):\r
+        print("min_sys_ota")\r
+        signal = net.csqQueryPoll()\r
+        if signal == -1 or sim.getStatus()  != 1:#网络不正常\r
+            print("min_sys_ota 无 SIM卡!!!!!!!!\r\n")\r
+            return 0\r
+        # return 0\r
+        response = None\r
+        ret_str =0\r
+        self.downloadFileVoURL1= ""\r
+        self.downloadFileVoURL2= ""\r
+        try:\r
+            sourceVersion = versions.Build_Time\r
+            sourceVersion = "7PIN-"+sourceVersion[:10]+"-"+sourceVersion[11:-3]\r
+            print("sourceVersion:{}".format(sourceVersion))\r
+            sourceVersion = sourceVersion.replace(" ", "0")\r
+            print("sourceVersion2:{}".format(sourceVersion))\r
+            #url = "http://iot.api.thisiot.com/ota/task?deviceId=860132060348836&sourceVersion=2024-12-20-15:35-1"\r
+            url = "http://dmp.raisound.com/bz-api/ota/task?deviceId={}&sourceVersion={}".format(modem.getDevImei(),sourceVersion)\r
+            print(url)\r
+            response = request.get(url,timeout=5)\r
+            if response.status_code == 200:\r
+                data = response.json()\r
+                print("min_sys_ota1:{}".format(data))\r
+                \r
+                if data:\r
+                    try:\r
+                        if data["code"] == 20007:#有新版本\r
+                            if "fileList"in data["data"]:\r
+                                if len(data["data"]["fileList"]) == 2:\r
+                                    for fileList in data["data"]["fileList"]:\r
+                                        if fileList["fileName"] == "dfota_2.bin":\r
+                                            self.downloadFileVoURL2 = fileList["url"]\r
+                                        elif fileList["fileName"] == "dfota_1.bin":\r
+                                            self.downloadFileVoURL1 = fileList["url"]\r
+                            \r
+                        if data["code"] == 20006:#已是最新版本\r
+                            ret_str = 0\r
+                                    \r
+                    except Exception as e:\r
+                            usys.print_exception(e)\r
+            else:\r
+                print("min_sys_ota get error")\r
+            response.close()\r
+        except Exception as e:\r
+            usys.print_exception(e)\r
+            if response != None:\r
+                response.close()\r
+        \r
+        print("min_sys_ota:downloadFileVoURL1:{},\ndownloadFileVoURL2:{}".format(self.downloadFileVoURL1,self.downloadFileVoURL2))\r
+        print("min_sys_ota end") \r
+        if self.downloadFileVoURL2!="" and self.downloadFileVoURL1!="":\r
+            battery = EventMesh.publish("get_battery")\r
+            if battery>=40:\r
+                self.ota_timer = osTimer()\r
+                self.ota_timer.start(15000, 0, self.ota_timer_cb)\r
+                ret_str =  1  \r
+            else:\r
+                ret_str =  2\r
+        return ret_str\r
+    \r
+    def ota_timer_cb(self, *args, **kwargs):\r
+        import fota\r
+        fota_obj = fota() \r
+        fota_obj.httpDownload(url1=self.downloadFileVoURL1,url2=self.downloadFileVoURL2)\r
+    #ota升级结果返回,开机时调用一次即可\r
+    def ota_result(self,event=None,msg=None):\r
+        response = None\r
+        try:\r
+            currentVersion = versions.Build_Time\r
+            currentVersion = "7PIN-"+currentVersion[:10]+"-"+currentVersion[11:-3]\r
+            print("currentVersion1:{}".format(currentVersion))\r
+            currentVersion = currentVersion.replace(" ", "0")\r
+            print("currentVersion2:{}".format(currentVersion))\r
+            url = "http://dmp.raisound.com/bz-api/ota/result?deviceId={}&currentVersion={}".format(modem.getDevImei(),currentVersion)\r
+            print(url)\r
+            response = request.post(url,timeout=5)\r
+            if response.status_code == 200:\r
+                data = response.json()\r
+                print("ota_result:{}".format(data))\r
+            else:\r
+                print("ota_result  error!!!!")\r
+                for i in response.text:\r
+                    print(i)\r
+            response.close()\r
+        except Exception as e:\r
+            usys.print_exception(e)\r
+            if response != None:\r
+                response.close()\r
+    #ICCID上传\r
+    def pots_ICCID(self,event=None,msg=None):\r
+        response = None\r
+        try:\r
+            iccid = sim.getIccid()\r
+            if iccid != -1 and len(iccid) > 5:\r
+                print("pots_ICCID:{}".format(iccid))\r
+                #Headers = {'Transfer-Encodong':'chunked'}\r
+                #http://dmp.raisound.com/bz-api/dev/iccid?deviceId=866610001099679&iccid=89860002192307889057\r
+                url = "http://dmp.raisound.com/bz-api/dev/iccid?deviceId={}&iccid={}".format(modem.getDevImei(),iccid)\r
+                print(url)\r
+                response = request.post(url,timeout=5)\r
+                if response.status_code == 200:\r
+                    data = response.json()\r
+                    print("pots_ICCID:{}".format(data))\r
+                else:\r
+                    print("pots_ICCID  error!!!!")\r
+                    for i in response.text:\r
+                        print(i)\r
+                response.close()\r
+        except Exception as e:\r
+            usys.print_exception(e)\r
+            if response != None:\r
+                response.close()\r
+#阿里VC状态枚举\r
+VC_State_None=0\r
+VC_State_Listening=1#听\r
+VC_State_SpeechStart=2#说开始\r
+VC_State_SpeechIng=3#正在说\r
+VC_State_SpeechEnd=4#说结束\r
+VC_State_RequestToRespond=5 #TTS请求或者chat请求\r
+VC_State_Thinking=6#想(chat)\r
+VC_State_Responding=7#音频播放\r
+VC_State_TTSStart=8\r
+VC_State_TTSData=9\r
+VC_State_TTSFinish=10\r
+VC_State_TTSEnd=11\r
+VC_State_TTSError=12\r
+VC_State_DialogError=13\r
+VC_State_End=14\r
+\r
+VC_record_TYPE_PCM = 0\r
+VC_record_TYPE_AMR = 1\r
+VC_play_TYPE_PCM = 0\r
+VC_play_TYPE_MP3 = 1\r
+\r
+#websocket发送数据编号\r
+# AI_client_asr_num = 0\r
+# AI_client_chat_num = 1\r
+# AI_client_tts_num = 2\r
+AI_client_VC_num = 3\r
+AI_client_asr_num = 4\r
+\r
+\r
+class AI_VC(Abstract):\r
+    # AI\r
+    \r
+    def __init__(self):\r
+        try:\r
+            self.http_get_config()#获取/更新配置参数\r
+        except Exception as e:\r
+            usys.print_exception(e)\r
+        self.VC_30S_timer = osTimer()\r
+        self.VC_30S_timer.start(30000, 1, self.VC_30S_timer_cb)\r
+        self.get_config_timer_count = 0\r
+        self.record_data_save_flag = 0 #是否保存录音文件\r
+        self.play_data_save_flag = 0#是否保存tts数据到文件\r
+        self.record_fd = None\r
+        self.play_fd = None\r
+        self.is_VC_ACK = 0 #是否开启ack应答模式\r
+        self.is_long_record = 0 #是否开启长录音模式(语音打断模式)\r
+        self.ai_OTA = OTA()\r
+        self.is_auth = 0 #是否开启dmp鉴权\r
+        #self.VC_mode = 1 #0:短按连续问答模式 1:长按录音模式\r
+        self.VC_mode = EventMesh.publish("get_storage_config","VC_mode")#\r
+        if self.VC_mode == None :\r
+            self.VC_mode = 0\r
+        self.is_up_error= 0 #是否上传错误id\r
+        self.Close_flag =0 #=1时,连续对话播放完音频就退出\r
+        \r
+        self.error_data = []\r
+        self.asr_taskid  = ""\r
+        self.VC_taskid  = ""\r
+        self.VC_server = 86 #0柒牌正式服务器,1:测试服务器1,2:测试服务器2\r
+        \r
+        self.server_ip = EventMesh.publish("get_storage_config","server_ip")#\r
+        if self.server_ip == None:\r
+            if self.VC_server == 1:# \r
+                self.server_ip="118.145.158.207:22083"\r
+            elif self.VC_server == 2:# \r
+                self.server_ip="118.145.158.207:22082"\r
+            elif self.VC_server == 4:# \r
+                self.server_ip="118.145.158.207:22084"\r
+            elif self.VC_server == 5:# \r
+                self.server_ip="amp-wss.raisound.com"\r
+            elif self.VC_server == 6:# \r
+                self.server_ip="118.145.158.207:22080"\r
+            elif self.VC_server == 7:# \r
+                self.server_ip="118.145.158.207:22080"\r
+            elif self.VC_server == 8:# \r
+                self.server_ip="115.190.94.208:22080"\r
+            elif self.VC_server == 86:# \r
+                self.server_ip="118.145.158.207:22086"    \r
+            else:\r
+                #self.server_ip="sevenpin.qipai.com.cn"\r
+                self.server_ip="118.145.158.207:22082"\r
+            if dev_type == 'momo':# \r
+                self.server_ip="118.145.158.207:22080"\r
+            # elif dev_type == "7PIN":\r
+            #     self.server_ip="sevenpin.qipai.com.cn"\r
+\r
+            elif dev_type == "sjgq":\r
+                self.server_ip="118.145.158.207:22084"\r
+\r
+        #开机提示音\r
+        self.power_on_tone = EventMesh.publish("get_storage_config","power_on_tone")#\r
+        if dev_type != "7PIN":\r
+            self.power_on_tone = None\r
+        if self.power_on_tone == None:\r
+            if dev_type == "G10":\r
+                self.power_on_tone = "已开机,您好!我是北科瑞讯智能 AI bot_name"\r
+            elif dev_type == "7PIN_BK":\r
+                self.power_on_tone = "小瑞来了!我们一起来愉快地聊天吧!" \r
+            elif dev_type == "momo":\r
+                self.power_on_tone = "DuloDulo,我是上古神兽食梦貘,主人可以叫我momo,我来自《山海经》,是一只以梦为食的神秘灵兽,每当颜色朦胧、人们入睡时,我就会悄悄飞到人们的床头,用我长长的鼻子把噩梦统统吞噬掉,只留下甜甜的美梦。从今往后,就由我守护在主人身边,一起度过每一个星河璀璨的夜晚。"\r
+            elif dev_type == "sjgq":\r
+                self.power_on_tone = "您好!我是巴马四季甘泉的智能助手。我可以为你解答各种各样的问题,像是有关巴马四季甘泉知识库、中基长寿科学产品、卫斯曼院士国际先进医疗中心的问题,还有日常生活与工作、旅游信息、健康咨询、教育与学习、情感交流、全球资讯、世界文化等方面的问题哦。你有没有这方面的问题想要问我呀?"\r
+            elif dev_type == "szbst":\r
+                self.power_on_tone = "深圳百事通来了!请问您有什么需要我帮忙的吗?" \r
+            else:\r
+                self.power_on_tone = "您好!我是世界首创柒牌男装AI生活好帮手-bot_name, 很高兴为您服务,我可以帮您解答柒牌公司知识库、日常生活与工作、旅游信息、健康与运动咨询、教育与学习、情感交流、全球资讯、世界文化等问题!请问您有什么需要我帮忙的吗?" \r
+                \r
+\r
+        self.VC_record_TYPE = VC_record_TYPE_PCM #0:PCM 1:AMR\r
+        self.VC_play_TYPE = VC_play_TYPE_PCM #0:PCM 1:mp3 \r
+        self.VC_record_samplerate = 16000\r
+        self.VC_play_samplerate = 16000\r
+        self.VAD_data_len = 640 #10ms数据\r
+        self.is_VAD = 0#=1打开vad打断\r
+        # ARG_sample_rate,             // 采样率\r
+        # ARG_channel,                // 通道数\r
+        # ARG_frame_size,              // 每帧字节数\r
+        # ARG_energy_threshold,        // 能量阈值\r
+        # ARG_voice_time,              // 语音持续时间阈值(ms)\r
+        # ARG_silence_time,            // 静音持续时间阈值(ms)\r
+        # ARG_silence_start_threshold, // 静音开始阈值(ms)\r
+        self.vad = None\r
+        if self.is_VAD == 1:\r
+            self.vad = VAD.VAD(self.VC_record_samplerate ,1,self.VAD_data_len,600,100,300,100)\r
+        self.speech_rate = EventMesh.publish("get_storage_config","speech_rate")#语速配置\r
+        if self.speech_rate == None:\r
+            self.speech_rate = 0\r
+        self.VC_TTS_voice_type = EventMesh.publish("get_storage_config","VC_TTS_voice_type")#音色配置\r
+        if self.VC_TTS_voice_type == None or ("男" in self.VC_TTS_voice_type) == False:\r
+            if dev_type == "G10" or  dev_type == "7PIN_BK"or dev_type == "szbst":\r
+                self.VC_TTS_voice_type = {   \r
+                                            "女":{\r
+                                            "bot_name":"小瑞",\r
+                                            "voice":"zh_female_wanwanxiaohe_moon_bigtts" ,\r
+                                            "lang":"zh-cn"\r
+                                            },\r
+                                            "男":{\r
+                                            "bot_name":"小瑞",\r
+                                            "voice":"zh_male_wennuanahu_moon_bigtts"  ,\r
+                                            "lang":"zh-cn"\r
+                                            },\r
+                                            "童":{\r
+                                            "bot_name":"小瑞",\r
+                                            "voice":"ICL_zh_female_huoponvhai_tob"  ,\r
+                                            "lang":"zh-cn"\r
+                                            },\r
+                                            "粤":{\r
+                                            "bot_name":"小瑞",\r
+                                            "voice":"zh_female_wanqudashu_moon_bigtts" ,\r
+                                            "lang":"zh-hk" \r
+                                            },\r
+                                            "四川":{\r
+                                            "bot_name":"小瑞",\r
+                                            "voice":"zh_female_daimengchuanmei_moon_bigtts",\r
+                                            "lang":"&lang=zh-cn-sc"  \r
+                                            },\r
+                                            "个性":{\r
+                                            "bot_name":"小瑞",\r
+                                            "voice":"zh_male_sunwukong_mars_bigtts" ,\r
+                                            "lang":"zh-cn" \r
+                                            }\r
+                                           \r
+                                        }\r
+            elif dev_type == 'momo':\r
+                self.VC_TTS_voice_type = {   \r
+                                            "女":{\r
+                                            "bot_name":"食梦貘",\r
+                                            "voice":"zh_female_shaoergushi_mars_bigtts" ,\r
+                                            "lang":"zh-cn"\r
+                                            },\r
+                                            "男":{\r
+                                            "bot_name":"食梦貘",\r
+                                            "voice":"zh_male_yangguangqingnian_mars_bigtts"  ,\r
+                                            "lang":"zh-cn"\r
+                                            },\r
+                                            "童":{\r
+                                            "bot_name":"食梦貘",\r
+                                            "voice":"ICL_zh_female_huoponvhai_tob"  ,\r
+                                            "lang":"zh-cn"\r
+                                            },\r
+                }\r
+            elif dev_type == 'sjgq':\r
+                self.VC_TTS_voice_type = {   \r
+                                            "女":{\r
+                                            "bot_name":"小巴",\r
+                                            "voice":"zh_female_wanwanxiaohe_moon_bigtts" ,\r
+                                            "lang":"zh-cn"\r
+                                            },\r
+                                            "男":{\r
+                                            "bot_name":"小巴",\r
+                                            "voice":"zh_male_wennuanahu_moon_bigtts"  ,\r
+                                            "lang":"zh-cn"\r
+                                            },\r
+                                            "童":{\r
+                                            "bot_name":"小巴",\r
+                                            "voice":"ICL_zh_female_huoponvhai_tob"  ,\r
+                                            "lang":"zh-cn"\r
+                                            },\r
+                }\r
+            else:\r
+                #女,男,童,粤,川,个性声\r
+                self.VC_TTS_voice_type = {   \r
+                                            "女":{\r
+                                            "bot_name":"柒妹妹",\r
+                                            "voice":"zh_female_wanwanxiaohe_moon_bigtts" ,\r
+                                            "lang":"zh-cn"\r
+                                            },\r
+                                            "男":{\r
+                                            "bot_name":"柒先生",\r
+                                            "voice":"zh_male_wennuanahu_moon_bigtts"  ,\r
+                                            "lang":"zh-cn"\r
+                                            },\r
+                                            "童":{\r
+                                            "bot_name":"柒乐乐",\r
+                                            "voice":"ICL_zh_female_huoponvhai_tob"  ,\r
+                                            "lang":"zh-cn"\r
+                                            },\r
+                                            "粤":{\r
+                                            "bot_name":"柒先生",\r
+                                            "voice":"zh_female_wanqudashu_moon_bigtts" ,\r
+                                            "lang":"zh-hk" \r
+                                            },\r
+                                            "四川":{\r
+                                            "bot_name":"柒妹妹",\r
+                                            "voice":"zh_female_daimengchuanmei_moon_bigtts",\r
+                                            "lang":"&lang=zh-cn-sc"  \r
+                                            },\r
+                                            "个性":{\r
+                                            "bot_name":"柒先生",\r
+                                            "voice":"zh_male_sunwukong_mars_bigtts" ,\r
+                                            "lang":"zh-cn" \r
+                                            },\r
+                                            "英语":{\r
+                                            "bot_name":"柒先生",\r
+                                            "voice":"en_male_smith_mars_bigtts" ,\r
+                                            "lang":"zh-cn" \r
+                                            }\r
+                                            \r
+                                           \r
+                                        }\r
+            \r
+            # self.VC_TTS_voice_type = {0:"zh_female_xinlingjitang_moon_bigtts",1:"zh_male_wennuanahu_moon_bigtts",2:"ICL_zh_female_huoponvhai_tob",\r
+            #                           3:"aliyun::longjiaxin",4:"zh_female_daimengchuanmei_moon_bigtts"}\r
+            #self.VC_TTS_voice_type = ["aliyun::longxiaoxia","aliyun::longnan","aliyun::longling"]\r
+            \r
+            #EventMesh.publish("set_storage_config",["VC_TTS_voice_type",self.VC_TTS_voice_type])\r
+\r
+        try:\r
+            self.VC_TTS_voice_key = EventMesh.publish("get_storage_config","VC_TTS_voice_key")#音色配置\r
+            if self.VC_TTS_voice_key == None :\r
+                if dev_type == "7PIN_BK":\r
+                    self.VC_TTS_voice_key = "童"\r
+                    #self.VC_TTS_voice_key = "男"\r
+                elif dev_type == "momo":\r
+                    self.VC_TTS_voice_key = "男"\r
+                else:\r
+                    self.VC_TTS_voice_key = "男"\r
+            if self.VC_TTS_voice_key in self.VC_TTS_voice_type:\r
+                pass\r
+            else:\r
+                self.VC_TTS_voice_key = list(self.VC_TTS_voice_type.keys())[0]\r
+            print("音色配置:{}:{}\r\n\r\n".format(self.VC_TTS_voice_key,self.VC_TTS_voice_type[self.VC_TTS_voice_key]))\r
+            self.VC_TTS_volume =  EventMesh.publish("get_storage_config","VC_TTS_volume")#音量配置\r
+        except Exception as e:\r
+            usys.print_exception(e)\r
+        #配置词\r
+        self.commands_mode = 2#=1用大模型判断命令,=0用服务器本地插件判断命令 =2用设备本地判断方式\r
+        if dev_type == "7PIN_BK":\r
+            self.commands_mode = 1\r
+        self.commands =  [\r
+            {\r
+                "command": "切换音色",#命令\r
+                "patterns": [ #多种问法,说法\r
+                    "声音改成", "声音改为", "改成", "改为", "换成", "切换成", "变成", "声音"\r
+                    "使用", "设置声音为", "把声音改成", "声音切换到", "用","声音切换的"\r
+                ],\r
+                "exact_matches": ["声音改成", "声音改为", "改成", "改为"],#精确匹配的完整短语\r
+                "has_param": True,# 是否包含参数\r
+                "param_regexp": r"(?P<cmd_parameter>(男|难|女|童|同|粤|广东话|粤语|四川话|川普|四川口音))",#参数提取正则表达式\r
+                "require_full_match": False,#是否要求完全匹配\r
+                "negative_patterns": [],#否定模式(避免误触发)\r
+                "keyword_threshold": 0.6#关键词匹配阈值\r
+            },\r
+            {\r
+                "command": "音量加大",\r
+                "patterns": [\r
+                    "音量加大","音量大", "声音大" ,"声音加大","听不清楚","声音太小","太小声了"\r
+                ],\r
+                "exact_matches": [],\r
+                "has_param": False,\r
+                "param_regexp": "",\r
+                "require_full_match": False,\r
+                "negative_patterns": ["声音太大"],\r
+                "keyword_threshold": 1\r
+            },\r
+            {\r
+                "command": "音量减小",\r
+                "patterns": [\r
+                    "音量减小","音量小", "声音小","你太吵了","声音太大","太大声了"\r
+                ],\r
+                "exact_matches": [],\r
+                "has_param": False,\r
+                "param_regexp": "",\r
+                "require_full_match": False,\r
+                "negative_patterns": ["声音太小"],\r
+                "keyword_threshold": 0.8\r
+            },\r
+            {\r
+                "command": "关机",\r
+                "patterns": [\r
+                    "关机", "关闭电源"\r
+                ],\r
+                "exact_matches": ["关机", "关闭电源"],\r
+                "has_param": False,\r
+                "param_regexp": "",\r
+                "require_full_match": True,\r
+                "negative_patterns": [],\r
+                "keyword_threshold": 0.8\r
+            },\r
+            {\r
+                "command": "进入工厂模式",\r
+                "patterns": [\r
+                    "进入工厂模式"\r
+                ],\r
+                "exact_matches": ["进入工厂模式"],\r
+                "has_param": False,\r
+                "param_regexp": "",\r
+                "require_full_match": True,\r
+                "negative_patterns": [],\r
+                "keyword_threshold": 0.8\r
+            },\r
+            {\r
+            \r
+                "command": "再见",\r
+                "patterns": [\r
+                    "再见","拜拜","我要走了"\r
+                ],\r
+                "exact_matches": [],\r
+                "has_param": False,\r
+                "param_regexp": "",\r
+                "require_full_match": False,\r
+                "negative_patterns": [],\r
+                "keyword_threshold": 0.8\r
+            },\r
+            {\r
+            \r
+                "command": "查询信号",\r
+                "patterns": [\r
+                    "查询信号","信号怎样","信号是多少","信号怎么样"\r
+                ],\r
+                "exact_matches": [],\r
+                "has_param": False,\r
+                "param_regexp": "",\r
+                "require_full_match": False,\r
+                "negative_patterns": ["查询"],\r
+                "keyword_threshold": 0.8\r
+            },   \r
+            {\r
+            \r
+                "command": "查询卡号",\r
+                "patterns": [\r
+                    "查询卡号","卡号","iccid号","ICCID号"\r
+                ],\r
+                "exact_matches": [],\r
+                "has_param": False,\r
+                "param_regexp": "",\r
+                "require_full_match": False,\r
+                "negative_patterns": ["查询"],\r
+                "keyword_threshold": 0.8\r
+            },  \r
+            {\r
+            \r
+                "command": "查询设备号",\r
+                "patterns": [\r
+                    "设备号","查询设备号","查询IMEI号"\r
+                ],\r
+                "exact_matches": [],\r
+                "has_param": False,\r
+                "param_regexp": "",\r
+                "require_full_match": False,\r
+                "negative_patterns": ["查询"],\r
+                "keyword_threshold": 0.8\r
+            },\r
+            {\r
+                "command": "OTA升级",\r
+                "patterns": [\r
+                    "OTA升级"\r
+                ],\r
+                "exact_matches": ["OTA升级"],\r
+                "has_param": False,\r
+                "param_regexp": "",\r
+                "require_full_match": True,\r
+                "negative_patterns": [],\r
+                "keyword_threshold": 1\r
+            },    \r
+            {\r
+                "command": "查询服务器地址",\r
+                "patterns": [\r
+                    "查询服务器地址"\r
+                ],\r
+                "exact_matches": [],\r
+                "has_param": False,\r
+                "param_regexp": "",\r
+                "require_full_match": False,\r
+                "negative_patterns": ["查询"],\r
+                "keyword_threshold": 0.9\r
+            }   \r
+            ,    \r
+            {\r
+                "command": "切换对话模式",\r
+                "patterns": [\r
+                    "切换对话模式","切换兑换模式"\r
+                ],\r
+                "exact_matches": [],\r
+                "has_param": False,\r
+                "param_regexp": "",\r
+                "require_full_match": False,\r
+                "negative_patterns": [],\r
+                "keyword_threshold": 0.8\r
+            },  \r
+            {\r
+                "command": "查询版本",\r
+                "patterns": [\r
+                    "查询版本号","软件版本"\r
+                ],\r
+                "exact_matches": [],\r
+                "has_param": False,\r
+                "param_regexp": "",\r
+                "require_full_match": False,\r
+                "negative_patterns": ["查询"],\r
+                "keyword_threshold": 0.6\r
+            }, \r
+        ]\r
+        if self.VC_TTS_volume == None:\r
+            self.VC_TTS_volume = 100\r
+        self.AI_audio_queue_thread_id = 0\r
+        self.AI_audio_queue_thread_lock = 0\r
+        self.AI_VC_send_data_queue_thread_id = 0\r
+        self.AI_VC_send_data_queue_thread_lock = 0\r
+        self.AI_ASR_send_data_queue_thread_id = 0\r
+        self.AI_ASR_send_data_queue_thread_lock = 0\r
+        self.AI_record_tmp_queue = Queue(100)\r
+        self.AI_ASR_send_data_queue = Queue(200)\r
+        self.AI_VC_send_data_queue = Queue(100)\r
+        self.AI_audio_queue = Queue(100)\r
+        #self.AI_WS_connect_Queue = Queue(100) #释放用\r
+        self.AI_TTS_str = ""\r
+        self.AI_ASR_str = ""\r
+        self.AI_ASR_flag = 0\r
+        self.AI_ASR_str_tmp = ""\r
+        self.AI_ASR_send_buf_len = 0\r
+        self.AI_ASR_text_tmp = ""\r
+        self.AI_ASR_text_repet_count = 0\r
+        # #开始线程\r
+        # if self.AI_audio_queue_thread_id ==0:\r
+        #     self.AI_audio_queue_thread_id = _thread.start_new_thread(self.AI_audio_queue_thread, ())\r
+        # else:\r
+        #     print("AI_VC_start :AI_audio_queue_thread_id != 0 ")\r
+        # if self.AI_VC_send_data_queue_thread_id == 0:    \r
+        #     self.AI_VC_send_data_queue_thread_id = _thread.start_new_thread(self.AI_VC_send_data_queue_thread, ())\r
+            \r
+        self.VC_state = VC_State_None #阿里ai VC状态\r
+        self.VC_dialog_id = ""#\r
+        self.VC_message_id=None\r
+        self.VC_task_id =None\r
+        self.AI_client_VC = None\r
+        self.AI_client_VC_recv_id = 0\r
+        self.AI_client_VC_recv_lock = 0\r
+        self.AI_client_VC_isconnect =0\r
+        self.AI_client_VC_debug =0\r
+\r
+        self.asr_state = VC_State_None #阿里VC_ASR VC状态\r
+        self.key_state = 0\r
+\r
+        self.AI_client_asr = None\r
+        self.AI_client_asr_recv_id = 0\r
+        self.AI_client_asr_recv_lock = 0\r
+        self.AI_client_asr_isconnect =0\r
+        self.AI_ASR_timer =  osTimer()\r
+        self.AI_ASR_timer_count = 0\r
+        self.AI_client_asr_debug =0\r
+        self.AI_ASR_check_timeout = 0\r
+        self.AI_ASR_error_timeout = 0\r
+        self.VC_Thinking_timerout = 0\r
+\r
+        self.record_pcm = None\r
+        self.play_pcm = None\r
+        self.VC_record_thread_id = 0\r
+        self.VC_record_thread_lock = 0\r
+        self.VC_pingping_timerout = 0\r
+        self.asr_pingping_timerout = 0\r
+        self.factory_timer = osTimer()\r
+        self._1S_timer = osTimer()\r
+        self.Audio_buf_size = 16*1024\r
+        self.record = audio.Record()\r
+        #self.record.end_callback(self.record_callback)\r
+        self.record.gain_set(4,10)\r
+        #self.record.gain_set(4,12)\r
+        self.aud = audio.Audio(0)\r
+        self.aud.setCallback(self.audio_cb)\r
+        #self.aud.setVolume(self.VC_TTS_volume //10)\r
+        self.audio_play_state = 1 #音频播放完状态\r
+        self.close_timerout = 0\r
+        self.LocalRespondingEnded_timerout = 0\r
+\r
+        self.VC_Play_flag = 0\r
+        self.play_flag = 0\r
+        self.VC_record_state_flag = 0\r
+        self.AI_key_long_press_flag = 0\r
+        self.websocket_error_count = 0\r
+\r
+        self.tts_in_data_len = 0\r
+        self.tts_out_data_len = 0\r
+        self.VC_satrt_flag = 0\r
+        self.session_id = ""\r
+        EventMesh.subscribe("AI_key_press", self.AI_key_press)\r
+        EventMesh.subscribe("AI_key_release", self.AI_key_release)\r
+        EventMesh.subscribe("AI_key_long_press", self.AI_key_long_press)\r
+        EventMesh.subscribe("pwk_key_release", self.pwk_key_release)\r
+        EventMesh.subscribe("get_AI_audio_queue", self.get_AI_audio_queue)\r
+        EventMesh.subscribe("get_VC_satrt_flag", self.get_VC_satrt_flag)\r
+        EventMesh.subscribe("VC_error", self.VC_error)\r
+        \r
+        EventMesh.publish("close_led")\r
+\r
+        self.bot_name = "柒先生"\r
+        try:\r
+            if "bot_name" in self.VC_TTS_voice_type[self.VC_TTS_voice_key]:\r
+                self.bot_name = self.VC_TTS_voice_type[self.VC_TTS_voice_key]["bot_name"]\r
+            else:\r
+                print("not bot_name!!!!!!!!!!!!!!!!!!!!!!")\r
+        except Exception as e:\r
+            usys.print_exception(e)\r
+        try:\r
+            if self.ai_OTA.min_sys_ota()==1:\r
+            #if 0:    \r
+                self.AI_TTS_str = "检测到有新版本需要升级啦!升级时可千万别断电或乱按哦,升级完成后设备会自动重启,重启就代表升级成功"\r
+                EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_VC_start}) \r
+            # if self.ai_OTA.min_sys_ota()==2:\r
+            #     self.AI_TTS_str = "检测到有新版本需要升级啦!电量低于40%,无法保证升级正常执行,请充满电后重启设备再次升级!"\r
+            #     EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_VC_start}) \r
+            else:\r
+                try:\r
+                    self.ai_OTA.ota_result()\r
+                    self.ai_OTA.pots_ICCID()\r
+                except Exception as e:\r
+                    usys.print_exception(e)\r
+                #开机提示语,如果联网失败,直接提示信号弱\r
+                \r
+                \r
+                #EventMesh.publish("get_storage_config",["powerRestart",1])\r
+                powerRestart =  EventMesh.publish("get_storage_config","powerRestart")#=1非正常重启\r
+                if powerRestart == None:\r
+                    powerRestart = 0\r
+                if powerRestart == 1:\r
+                    EventMesh.publish("set_storage_config",["powerRestart",0])\r
+                    \r
+                else:\r
+                    pass\r
+                    self.AI_TTS_str = self.power_on_tone.replace("bot_name", self.bot_name)\r
+                    print("开机提示:{}".format(self.AI_TTS_str))\r
+                    EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_VC_start}) \r
+                \r
+                \r
+\r
+        except Exception as e:\r
+            usys.print_exception(e)\r
+\r
+        \r
+    def post_processor_after_instantiation(self):\r
+        pass\r
+    def get_AI_audio_queue(self, event, msg):\r
+        return self.AI_audio_queue\r
+    def get_VC_satrt_flag(self, event, msg):\r
+        return self.VC_satrt_flag\r
+\r
+\r
+    def VC_30S_timer_cb(self, *args): #\r
+        EventMesh.publish("publish_AI_btnInfo",{"func":self.VC_30S_timer_cb_}) \r
+\r
+    def VC_30S_timer_cb_(self):    \r
+        self.get_config_timer_count += 1\r
+        if self.get_config_timer_count >= 2*60*2:#2小时更新配置参数\r
+            self.get_config_timer_count = 0\r
+            try:\r
+                self.http_get_config()#获取/更新配置参数\r
+            except Exception as e:\r
+                usys.print_exception(e)\r
+    #提交错误id           \r
+    def ud_error(self,error_data):\r
+        response = None\r
+        if self.is_up_error == 1:\r
+            try:\r
+                # currentVersion = versions.Build_Time\r
+                # currentVersion = "7PIN-"+currentVersion[:10]+"-"+currentVersion[11:-3]\r
+                url = "http://{}/health?task_id={}".format(self.server_ip,error_data[0]+error_data[1])\r
+                print(url)\r
+                response = request.get(url,timeout=5)\r
+                if response.status_code == 200:\r
+\r
+                    print("ud_error:ok")\r
+                else:\r
+                    print("ud_error  error!!!!")\r
+                    for i in response.text:\r
+                        print(i)\r
+                response.close()\r
+            except Exception as e:\r
+                usys.print_exception(e)\r
+                if response != None:\r
+                    response.close()\r
+    #获取配置参数\r
+    def http_get_config(self, event=None, msg=None):\r
+        print("http_get_config")\r
+\r
+        response = None\r
+        #http://180.184.206.142/bz-api/dev/config?deviceId=xxx\r
+        try:\r
+            url = "http://dmp.raisound.com/bz-api/dev/config/{}".format(modem.getDevImei())\r
+            print(url)\r
+            response = request.get(url,timeout=5)\r
+            if response.status_code == 200:\r
+                data = response.json()\r
+                print("http_get_config:{}".format(data))\r
+                \r
+                if data:\r
+                    try:\r
+                        if data["code"] == 20000:#有配置\r
+                            if data["data"] :\r
+                                if "version" in data["data"]:\r
+                                    config_version = EventMesh.publish("get_storage_config","config_version")#音量配置\r
+                                    if config_version != data["data"]["version"]:\r
+                                        config_version = data["data"]["version"]\r
+                                        EventMesh.publish("set_storage_config",["config_version",config_version])\r
+                                        if "VC_TTS_voice_type" in data["data"]:\r
+                                            self.VC_TTS_voice_type = data["data"]["VC_TTS_voice_type"]\r
+                                            EventMesh.publish("set_storage_config",["VC_TTS_voice_type",self.VC_TTS_voice_type])\r
+                                            print("配置VC_TTS_voice_type成功")\r
+                                        if "server_ip" in data["data"]:\r
+                                            self.server_ip = data["data"]["server_ip"]\r
+                                            EventMesh.publish("set_storage_config",["server_ip",self.server_ip])\r
+                                            print("配置server_ip成功")\r
+                                        if "power_on_tone" in data["data"]:\r
+                                            self.power_on_tone = data["data"]["power_on_tone"]\r
+                                            EventMesh.publish("set_storage_config",["power_on_tone",self.power_on_tone])\r
+                                            print("配置power_on_tone成功")\r
+\r
+                    except Exception as e:\r
+                            usys.print_exception(e)\r
+            else:\r
+                print("status_code:{}".format(response.status_code))\r
+                print("http_get_config:error!!!!!!!!!!")\r
+            response.close()\r
+        except Exception as e:\r
+            usys.print_exception(e)\r
+            if response != None:\r
+                response.close()\r
+\r
+    def audio_cb(self,event):\r
+        if event == 0:\r
+            self.audio_play_state =1\r
+            #EventMesh.publish("set_audio_state", 1)\r
+            print('audio-play start.')\r
+        elif event == 7:\r
+            self.audio_play_state = 0\r
+            #EventMesh.publish("set_audio_state", 0)   \r
+            print('audio-play finish.!!!!!!')\r
+\r
+    def AI_key_press(self, event, msg):#按键按下\r
+        print("AI_key_press")\r
+        self.get_config_timer_count = 0\r
+        self.key_state = 1\r
+        self.Close()\r
+        # if dev_type == "7PIN" :\r
+        #     self.aud.aud_tone_play(10,200)#播放按键音\r
+        #self.aud.aud_tone_play(10,200)#播放按键音\r
+        self.AI_TTS_str = ""#"你好,有什么吩咐"\r
+        self.AI_ASR_str = ""\r
+        self.AI_ASR_str_tmp = ""\r
+        self.VC_state = VC_State_None\r
+        # if self.VC_state != VC_State_None:\r
+        #     EventMesh.publish("publish_AI_btnInfo",{"func":self.Close}) \r
+        #     EventMesh.publish("publish_AI_btnInfo",{"func":utime.sleep_ms,'data':(10)})\r
+        #if self.VC_record_state_flag >1:#如果在录音,就先停止录音\r
+        self.VC_Speech_End()\r
+\r
+        self.VC_Speech_Start()    \r
+        self.AI_VC_start() \r
+        #self.chenggong_tone()\r
+        # self.Close()\r
+        # self.AI_VC_start()\r
+        self.AI_key_long_press_flag = 0\r
+        \r
+\r
+    def AI_key_release(self, event, msg):#按键弹起\r
+        print("AI_key_release123")\r
+        self.key_state = 0\r
+        if self.AI_key_long_press_flag == 1 :#有长按\r
+            #self.AI_client_VC_end_speech()\r
+            #EventMesh.publish("publish_AI_btnInfo",{"func":utime.sleep_ms,'data':(1000)})\r
+            #EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_client_asr_StopTranscription_requset})\r
+            #self.AI_client_asr_StopTranscription_requset()#请求停止\r
+            if self.VC_mode == 1 :#长按单次问答模式\r
+                # if self.AI_ASR_str_tmp != "":\r
+                print("AI_key_release:asr_str:{}".format(self.AI_ASR_str))  \r
+                #     EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_VC_start})\r
+                self.AI_client_VC_end_speech()\r
+                pass\r
+            \r
+        else :\r
+            if self.VC_mode == 1 :#长按单次问答模式\r
+                try:\r
+                    EventMesh.publish("publish_AI_btnInfo",{"func":self.Close}) \r
+                except Exception as e:\r
+                    usys.print_exception(e)\r
+                EventMesh.publish("publish_AI_btnInfo",{"func":self.key_prompt})  #提示请您按住中间的按钮开始讲话,讲完松开即可   \r
+                #self.AI_TTS_str = "请您按住中间的按钮开始讲话,讲完松开即可 "\r
+                #EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_VC_start})\r
+                pass\r
+                \r
+                #self.VC_Speech_End()\r
+    def AI_key_long_press(self, event, msg):#按键长按\r
+        print("AI_key_long_press")\r
+        self.AI_key_long_press_flag = 1\r
+\r
+    def pwk_key_release(self, event, msg):#电源键短按,关闭\r
+        print("pwk_key_release")\r
+        EventMesh.publish("publish_AI_btnInfo",{"func":self.Close}) \r
+\r
+    def key_prompt(self):\r
+        EventMesh.publish("audio_montage_play",["key_prompt.mp3"])\r
+        #self.aud.play(1,1,'U:/static/key_prompt.mp3')#提示请您按住中间的按钮开始讲话,讲完松开即可\r
+    def VC_error(self, event, msg):#错误播报\r
+        self.websocket_error()\r
+        #EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_error}) \r
+    def set_VC_record_state_flag(self,data):\r
+        \r
+        self.VC_record_state_flag = data\r
+        print("set_VC_record_state_flag:{}".format(self.VC_record_state_flag))\r
+    #开始录音,不缓存,直接发\r
+    def VC_Speech_Start_now(self):\r
+        self.VC_Speech_Start()\r
+        if self.VC_record_state_flag  == 1:\r
+            self.VC_record_state_flag =2\r
+        print("VC_Speech_Start_now:{}".format(self.VC_record_state_flag))\r
+    #开始录音,先缓存到buf,等服务器响应再发\r
+    def VC_Speech_Start(self):\r
+        try:\r
+            \r
+            #self.VC_state =  VC_State_SpeechStart\r
+            print("VC_Speech_Start VC_record_state_flag:{} self.AI_ASR_flag:{}!!!!!!!!".format(self.VC_record_state_flag,self.AI_ASR_flag))  \r
+            if self.AI_ASR_flag  != 0:\r
+                return\r
+            \r
+            if self.VC_record_state_flag  == 0:\r
+                \r
+                self.VC_record_thread_close()#关闭录音线程\r
+                _thread.stack_size(self.Audio_buf_size+8*1024)\r
+                self.VC_record_thread_id = _thread.start_new_thread(self.VC_record_thread,())\r
+                _thread.stack_size(8*1024)\r
+                print("self.VC_record_thread_id:{}".format(self.VC_record_thread_id))\r
+                try:\r
+                    \r
+                    if self.VC_record_TYPE == VC_record_TYPE_AMR :\r
+                        try :\r
+                            self.record.stream_start(audio.Record.AMRNB, self.VC_record_samplerate, 0)\r
+                        except Exception as e:\r
+                                usys.print_exception(e)\r
+                    elif self.VC_record_TYPE == VC_record_TYPE_PCM:\r
+                        print("record_pcm.stream_read_start()!!!!!!!!!!!!")\r
+                        self.record.stream_start(audio.Record.WAV, self.VC_record_samplerate, 0)\r
+                        # if self.record_pcm != None:\r
+                        #     try:\r
+                        #         self.record_pcm.stream_stop()\r
+                        #         self.record_pcm.close()\r
+                        #         self.record_pcm = None\r
+                        #     except Exception as e:\r
+                        #         usys.print_exception(e)\r
+                        # if self.record_pcm == None:        \r
+                        #     ret = self.record_pcm = audio.Audio.PCM(0,1,16000,0,1,2)\r
+                        #     print("audio.Audio.PCM:ret:{}".format(ret))\r
+                        #     ret = self.record_pcm.stream_read_start()\r
+                        #     print("self.record_pcm.stream_read_start:ret:{}".format(ret))\r
+                except Exception as e:\r
+                    usys.print_exception(e) \r
+                \r
+                self.VC_record_state_flag = 1\r
+                \r
+        except Exception as e:\r
+            self.websocket_error()\r
+            self.VC_record_state_flag = 1\r
+            self.VC_Speech_End()#关闭录音\r
+            usys.print_exception(e)   \r
+    #停止录音\r
+    def VC_Speech_End(self):\r
+        try:\r
+            self.AI_ASR_flag = 0\r
+            self.AI_ASR_str_tmp = ""\r
+            self.AI_ASR_str = ""\r
+            #EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_deconnect_asr})\r
+              \r
+            if self.VC_record_state_flag == 0:\r
+                return\r
+            #self.AI_client_asr_StopTranscription_requset()#请求停止\r
+            if self.VC_record_TYPE == VC_record_TYPE_AMR:\r
+                self.record.stream_stop()\r
+                self.record.stop()#关闭录音\r
+                Record_read_buf = bytearray(self.Audio_buf_size)\r
+                for i in range(10):\r
+                    Record_len = self.record.stream_read(Record_read_buf, self.Audio_buf_size)\r
+                    print("Record_len:!!!!!!{}".format(Record_len))\r
+                    if Record_len <= 0:\r
+                        break\r
+            elif self.VC_record_TYPE == VC_record_TYPE_PCM:\r
+                self.record.stream_stop()\r
+                self.record.stop()#关闭录音\r
+                Record_read_buf = bytearray(self.Audio_buf_size)\r
+                for i in range(10):\r
+                    Record_len = self.record.stream_read(Record_read_buf, self.Audio_buf_size)\r
+                    print("Record_len:!!!!!!{}".format(Record_len))\r
+                    if Record_len <= 0:\r
+                        break\r
+                # if self.record_pcm != None:\r
+                #     try:\r
+                #         self.record_pcm.stream_stop()\r
+                #         self.record_pcm.close()\r
+                #         self.record_pcm = None\r
+                #     except Exception as e:\r
+                #         usys.print_exception(e)\r
+        except Exception as e:\r
+            usys.print_exception(e)\r
+        self.VC_record_thread_close()#关闭录音线程\r
+        if self.AI_record_tmp_queue.empty() != True:\r
+            self.AI_record_tmp_queue.clear()\r
+        \r
+        self.VC_record_state_flag = 0\r
+        print("VC_Speech_End VC_record_state_flag:{}!!!!!!!!".format(self.VC_record_state_flag))   \r
+    #关闭录音线程   \r
+    def VC_record_thread_close(self): \r
+        if self.VC_record_thread_id != 0:\r
+            count =50\r
+            while True:\r
+                count -= 1\r
+                if self.VC_record_thread_lock == 1:\r
+                    self.VC_record_thread_lock = 2\r
+                if self.VC_record_thread_lock == 0 or count <=0:\r
+                    break\r
+                else:\r
+                    print("VC_record_thread_thread going:{}...".format(count))\r
+                    utime.sleep_ms(1)\r
+            self.VC_record_thread_lock = 0\r
+            print("VC_record_thread_thread_close")\r
+            try:\r
+                _thread.stop_thread(self.VC_record_thread_id)\r
+            except Exception as e:\r
+                usys.print_exception(e)\r
+        self.VC_record_thread_id = 0\r
+    #获取录音数据\r
+    def VC_record_thread(self):\r
+        ##return\r
+        print("VC_record_thread start!!!!!!!!!!!!!!!!!!!!\r\n")\r
+        count = 0\r
+        RequestToSpeak_flag = 0\r
+        # try:\r
+        #     uos.remove('/usr/test.pcm')\r
+        # except Exception as e:\r
+        #     usys.print_exception(e)\r
+        #record_data_queue = Queue(100)\r
+        #fd = open('/usr/test.pcm','w')\r
+        # if self.VC_record_TYPE == 1:\r
+        #     h_data= [0x23,0x21 ,0x41 ,0x4D ,0x52 ,0x0A ]\r
+        #     h_data_b = bytes(h_data)\r
+        #     self.AI_client_VC_send(h_data_b)\r
+        AI_record_tmp_queue_len = 0\r
+        vad_buf = bytearray()\r
+        VAD_data_count = 0\r
+        vad_state = 0\r
+        self.VAD_count = 0\r
+        while True:\r
+            try:\r
+                if self.VC_record_thread_lock == 2:\r
+                    break\r
+                self.VC_record_thread_lock = 1\r
+                # 死循环接收数据\r
+                #if self.VC_state ==  VC_State_SpeechStart:\r
+                Record_read_buf = bytearray(self.Audio_buf_size)\r
+                \r
+                Record_len = 0\r
+                if self.VC_record_TYPE == VC_record_TYPE_PCM:#pcm\r
+                    Record_len = self.record.stream_read(Record_read_buf, self.Audio_buf_size)\r
+                    #utime.sleep_ms(60)\r
+                    \r
+                else :\r
+                    \r
+                    Record_len = self.record.stream_read(Record_read_buf, self.Audio_buf_size)\r
+                    utime.sleep_ms(600)\r
+\r
+                #Record_len = 1024*2\r
+                #print("VC_record_thread:{}".format(Record_len))\r
+                if Record_len > 0:\r
+                    read_buf = bytes(Record_read_buf[:Record_len])\r
+                    print("Record_len:{}".format(Record_len))\r
+                    #VAD检测\r
+                    if self.is_VAD == 1:\r
+                        vad_state = 0\r
+                        tmp_c = 1000\r
+                        while True:\r
+                            tmp_c -=1\r
+                            if tmp_c <=0:\r
+                                break\r
+                            #vad_buf_len = len(vad_buf)\r
+                            if VAD_data_count == 0:#没数据的时候\r
+                                vad_buf = Record_read_buf[:self.VAD_data_len]\r
+                                VAD_data_count = self.VAD_data_len\r
+                                self.vad.custom_vad_reset()#重置vad\r
+                            else:#有数据的时候\r
+                                if Record_len - VAD_data_count < self.VAD_data_len :#剩余长度不够一次填充,先保留,但不填算法\r
+                                    vad_buf = Record_read_buf[VAD_data_count:Record_len]\r
+                                    VAD_data_count = 0\r
+                                    break\r
+                                else:#剩余长度够填一次数据\r
+                                    vad_buf = Record_read_buf[VAD_data_count:VAD_data_count+self.VAD_data_len]\r
+                                    VAD_data_count += len(vad_buf)\r
+                            #print("vad_buf_len:{},{}".format(len(vad_buf),VAD_data_count))\r
+                            \r
+                            if len(vad_buf) >= self.VAD_data_len:\r
+                                vad_state = self.vad.custom_vad_process(vad_buf,len(vad_buf))#给vad数据\r
+                                #print("vad_state:{}".format(vad_state))\r
+                                \r
+                            if VAD_data_count >= Record_len:\r
+                                VAD_data_count = 0\r
+                                break\r
+                            if vad_state == 1:\r
+                                print("检测到VAD=1!!!!!!!!!!!!!")\r
+                                print("检测到VAD=1!!!!!!!!!!!!!")\r
+                                print("检测到VAD=1!!!!!!!!!!!!!")\r
+                                \r
+                                EventMesh.publish("publish_AI_btnInfo",{"func":self.VC_Play_Pause,"data":1})#停止音频\r
+                                # EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_client_VC_RequestToSpeak})#打断\r
+                                # RequestToSpeak_flag = 1\r
+                                \r
+                                self.VAD_count+=1\r
+                                if self.VAD_count >= 20: \r
+                                    EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_client_VC_RequestToSpeak})#打断\r
+                                        \r
+                            else:\r
+                                if self.VAD_count != 0:\r
+                                    EventMesh.publish("publish_AI_btnInfo",{"func":self.VC_Play_Pause,"data":0})#恢复音频播放\r
+                                self.VAD_count  = 0\r
+                    if self.VC_state >= VC_State_TTSStart:\r
+                        pass\r
+                        if vad_state == 1:\r
+                            self.AI_record_tmp_queue.put(read_buf)#入缓存队列\r
+                            AI_record_tmp_queue_len += len(read_buf)\r
+                            \r
+                       \r
+                    else:\r
+                        VAD_data_count = 0\r
+                        if self.VC_record_state_flag <=1 :#没发送前先存起来\r
+                            self.AI_record_tmp_queue.put(read_buf)\r
+                            AI_record_tmp_queue_len += len(read_buf)\r
+                        else:\r
+                            AI_record_tmp_queue_len = 0\r
+                            while True:\r
+                                if self.AI_record_tmp_queue.empty() == True:\r
+                                    break\r
+                                else:\r
+                                    pass\r
+                                    self.AI_client_VC_send(self.AI_record_tmp_queue.get())  #发送之前存的数据\r
+                            self.AI_client_VC_send(read_buf)   \r
+                    \r
+                    if self.record_data_save_flag == 1:\r
+                        if self.record_fd == None:\r
+                            try:\r
+                                uos.remove('/usr/record_data.pcm')\r
+                            except Exception as e:\r
+                                usys.print_exception(e)\r
+                            self.record_fd = open('/usr/record_data.pcm','w')\r
+                        if self.record_fd != None:\r
+                            self.record_fd.write(read_buf)\r
+                            print("write record:{}".format(len(read_buf)))\r
+                            # count+=Record_len\r
+                            # if count >150*1024:\r
+                            #     self.record_fd.close()\r
+                                #self.record_fd = None\r
+\r
+                    \r
+                    \r
+\r
+                    #print("VC_record_thread:{}".format(len(read_buf)))\r
+                    #count+=len(read_buf)\r
+                # if count>=500*1024:#结束\r
+                #     self.AI_client_VC_end_speech()\r
+                #     break\r
+                # count+=1\r
+                # if count %10 == 0:\r
+                #     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)))\r
+                \r
+                # if self.VC_state >=  VC_State_SpeechEnd:\r
+                #     break\r
+                \r
+            except Exception as e:\r
+                    usys.print_exception(e)\r
+                    #break\r
+            self.VC_record_thread_lock = 0\r
+            utime.sleep_ms(100)\r
+        #fd.close()\r
+        print("VC_record_thread:exit")\r
+        self.VC_record_thread_id = 0#线程退出\r
+        self.VC_record_thread_lock = 0\r
+###################################################### VC ###################################################################################\r
+    def websocket_connect_VC(self):\r
+        print("websocket_connect_VC:{} e:{}!!!!!!!!!!!!!!!!!!!!!".format(self.AI_client_VC_isconnect,self.AI_client_VC_debug))\r
+        if self.AI_client_VC_isconnect == 1:\r
+            return\r
+        # 创建VC客户端\r
+        try:\r
+            signal = net.csqQueryPoll()\r
+            if signal == -1 or sim.getStatus() != 1:#网络正常\r
+                self.websocket_error()\r
+                return\r
+            \r
+            req_str = ""\r
+            ack = ""\r
+            if self.is_VC_ACK == 1:\r
+                ack = "ack=1"\r
+            lang = "lang=zh-cn"#普通话测试环境\r
+            try:\r
+                if "loang" in self.VC_TTS_voice_type[self.VC_TTS_voice_key]:\r
+                    lang = self.VC_TTS_voice_type[self.VC_TTS_voice_key]["lang"]\r
+                else:\r
+                    print("not lang!!!!!!!!!!!!!!!!!!!!!!")\r
+            except Exception as e:\r
+                usys.print_exception(e)\r
+            if dev_type == "G10":\r
+                platform = "platform=huoshan&is_boot=1"\r
+                #platform = "platform=raisound"\r
+                #platform = "platform=aliyun"\r
+            elif dev_type == "7PIN_BK":\r
+                platform = "platform=huoshan"\r
+                #platform = "platform=raisound&bot_type=dify"   \r
+                platform = "platform=raisound&bot_type=fourseason_water"\r
+                pass\r
+            elif dev_type == 'momo':# \r
+                #22080/voice-chat/v2.1/ws?platform=raisound&bot_type=deepseek\r
+                platform = "platform=raisound&bot_type=shimeng_mo"\r
+            elif dev_type == "sjgq":\r
+                platform = "platform=raisound"\r
+            else:\r
+                platform = "platform=huoshan"\r
+                #platform = "platform=huoshan&is_boot=1"\r
+            #女,男,童,粤,川\r
+            self.bot_name = "柒先生"\r
+            try:\r
+                if "bot_name" in self.VC_TTS_voice_type[self.VC_TTS_voice_key]:\r
+                    self.bot_name = self.VC_TTS_voice_type[self.VC_TTS_voice_key]["bot_name"]\r
+                else:\r
+                    print("not bot_name!!!!!!!!!!!!!!!!!!!!!!")\r
+            except Exception as e:\r
+                usys.print_exception(e)\r
+            \r
+            # Headers = {'X-NLS-Token':'0c8b8f05a46f423096be64a9c4c46310'}\r
+            # self.AI_client_VC = uwebsocket.Client.connect('wss://nls-gateway-cn-beijing.aliyuncs.com/ws/v1',headers=Headers, debug=False)\r
+            token = EventMesh.publish("get_dev_token")\r
+            print("token:{}".format(token))\r
+            if dev_type == 'momo' :# \r
+                req_str = "voice-chat/v2.1/ws?is_auth={}&{}&{}".format(self.is_auth,platform,lang)\r
+            elif dev_type == '7PIN_BK':\r
+                #req_str = "voice-chat/v2.1/ws?is_auth={}&{}&{}".format(self.is_auth,platform,lang)\r
+                req_str = "voice-chat/ws?is_auth={}&{}&{}".format(self.is_auth,platform,lang)\r
+            elif dev_type == "sjgq":\r
+                req_str = "22085/voice-chat/ws?is_auth={}&{}&{}".format(self.is_auth,platform,lang)\r
+            elif dev_type == "G10":\r
+                req_str = "vc/chat?is_auth={}".format(self.is_auth)\r
+            else:\r
+                req_str = "voice-chat/ws?is_auth={}&{}&{}".format(self.is_auth,platform,lang)\r
+            req_str = "vc/chat?is_auth={}".format(self.is_auth)\r
+            url = 'ws://{}/{}&dt={}'.format(self.server_ip,req_str,token)\r
+            #url = 'ws://115.190.94.208:22080/vc/coze?dt={}'.format(token)\r
+            \r
+            print("VC VC:url{}".format(url))\r
+            self.AI_client_VC = uwebsocket.Client.connect(url, debug=True)\r
+            #self.AI_WS_connect_Queue.put(self.AI_client_VC)\r
+\r
+       \r
+            print("websocket_connect_VC:OK!!!!!!!!!!!!!!!!!!!!!")\r
+        except Exception as e: #网络连接异常\r
+            usys.print_exception(e)\r
+            print("websocket_connect_VC error!!!\r\n")\r
+            str_error = str(e)\r
+            if str_error.find("[Errno 22] EINVAL")!= -1: \r
+                print("websocket_connect_VC:str_error:{}".format(str_error))\r
+                print("[Errno 22] EINVAL!!!\r\n")\r
+                print("[Errno 22] EINVAL!!!\r\n")\r
+                print("[Errno 22] EINVAL!!!\r\n")\r
+                print("[Errno 22] EINVAL!!!\r\n")\r
+                self.websocket_error()\r
+                EventMesh.publish("set_storage_config",["powerRestart",1])#调试临时关闭\r
+                utime.sleep_ms(1000)\r
+                self.aud.stopPlayStream()\r
+                self.aud.stopAll()\r
+                Power.powerRestart()\r
+                \r
+            self.websocket_error()\r
+            return\r
+        #print("AI_client_VC:{}".format(self.AI_client_VC))\r
+        if self.AI_client_VC == None:\r
+            EventMesh.publish("update_dev_token")#获取token\r
+            self.websocket_error()\r
+            return\r
+        self.AI_client_VC_debug+=1\r
+        utime.sleep_ms(10)\r
+        self.AI_client_VC.settimeout(5)\r
+        #self.AI_VC_send_data_queue_thread_close()#关闭发送线程\r
+        if self.AI_VC_send_data_queue_thread_id == 0:    \r
+            _thread.stack_size(self.Audio_buf_size+8*1024)\r
+            self.AI_VC_send_data_queue_thread_id = _thread.start_new_thread(self.AI_VC_send_data_queue_thread, ())\r
+            _thread.stack_size(8*1024)\r
+            print("AI_VC_start :AI_VC_send_data_queue_thread_id :{} ".format(self.AI_VC_send_data_queue_thread_id))\r
+        self.AI_client_VC_recv_thread_close()#关闭读线程\r
+        # 线程接收数据\r
+        _thread.stack_size(self.Audio_buf_size+8*1024)\r
+        self.AI_client_VC_recv_id = _thread.start_new_thread(self.AI_client_VC_recv, (self.AI_client_VC,))\r
+        _thread.stack_size(8*1024)\r
+        self.AI_client_VC_isconnect = 1\r
+        print("websocket_connect_VC end")\r
+\r
+    def websocket_error(self,TTS_str=None):\r
+        print("websocket_error1!!!!")\r
+        self.Close()\r
+        print("websocket_error1.1!!!!")\r
+        print("websocket_error!!!!")\r
+        print("websocket_error!!!!")\r
+        self.VC_Thinking_timerout = 0\r
+        self.VC_satrt_flag = 0\r
+        self.AI_TTS_str = ""\r
+        self.AI_ASR_str = ""\r
+        self.AI_ASR_str_tmp = ""\r
+        self.AI_ASR_flag  = 0\r
+        self.VC_Speech_End()\r
+        EventMesh.publish("close_led")\r
+        if TTS_str == None:\r
+            self.websocket_error_count+=1\r
+            # if self.websocket_error_count <=3:\r
+            #     EventMesh.publish("audio_montage_play",["xinhaoruo1.mp3"])\r
+            if self.websocket_error_count <10 :\r
+                EventMesh.publish("audio_montage_play",["xinhaoruo1.mp3"])\r
+            elif self.websocket_error_count >=10:\r
+                EventMesh.publish("paly_iccid_imei")    \r
+            # else:\r
+            #     EventMesh.publish("audio_montage_play",["R_SIM_FAILE.mp3"])\r
+            #self.aud.play(1,1,'U:/static/R_SIM_FAILE.mp3')\r
+            if self.websocket_error_count <3 :\r
+                utime.sleep_ms(3000)\r
+                EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_VC_start})\r
+        else:\r
+            print("websocket_error:tts:{}".format(TTS_str))\r
+            self.AI_TTS_str = TTS_str\r
+            EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_VC_start})\r
+        print("websocket_error2")\r
+       \r
+        \r
+        print("websocket_error4")\r
+        \r
+\r
+    def websocket_deconnect_VC(self):\r
+        #print("websocket_deconnect_VC {}!!!!!!!".format(self.AI_client_VC_isconnect))\r
+        print("websocket_deconnect_VC!!!!!!!")\r
+        self.AI_client_VC_recv_thread_close()#关闭读线程\r
+        self.AI_client_VC_recv_id = 0\r
+        if self.AI_client_VC_isconnect == 1 or self.AI_client_VC!=None:\r
+            try:\r
+                self.AI_client_VC_isconnect = 0\r
+                count = 500\r
+                while True:#等待发完数据\r
+                    count-=1\r
+                    if count <=0 or self.AI_VC_send_data_queue_thread_lock == 0:\r
+                        break\r
+                    utime.sleep_ms(1)\r
+                \r
+                try:\r
+                    self.AI_client_VC.close()\r
+                    self.AI_client_VC_debug -=1\r
+                    #self.AI_client_VC=None\r
+                except Exception as e:\r
+                    usys.print_exception(e)\r
+                    try :\r
+                        self.AI_client_VC.close()\r
+                        self.AI_client_VC_debug -=1\r
+                        #self.AI_client_VC=None\r
+                    except Exception as e:\r
+                        usys.print_exception(e)\r
+                try :\r
+                    self.AI_client_VC._close()\r
+                except Exception as e:\r
+                    usys.print_exception(e)\r
+                self.AI_client_VC = None\r
+            except Exception as e:\r
+                usys.print_exception(e)\r
+        print("websocket_deconnect_VC {}!!!!!!!".format(self.AI_client_VC_isconnect))\r
+    #websocket发送ping\r
+    def AI_client_VC_ping(self):\r
+        pass\r
+        if self.AI_client_VC_isconnect == 1:\r
+            #self.AI_client_VC.write_frame(0x09,b'ping ping')\r
+            self.AI_client_VC_send("ping")\r
+            print("VC: ping ping")\r
+\r
+    #websocket发送数据    \r
+    def AI_client_VC_send(self,data_str):\r
+        # if isinstance(data_str, str):#是字符串\r
+        #     print("AI_client_VC_send:{}".format(data_str))\r
+        #     pass\r
+        # else:\r
+        #     print("AI_client_VC_send:len{}".format(len(data_str)))\r
+        self.AI_VC_send_data_queue.put([AI_client_VC_num,data_str]) \r
+     #关闭数据发送线程\r
+    def AI_VC_send_data_queue_thread_close(self):\r
+        if self.AI_VC_send_data_queue_thread_id != 0:\r
+            count =500\r
+            while True:\r
+                count -= 1\r
+                if self.AI_VC_send_data_queue_thread_lock == 0 or count <=0:\r
+                    break\r
+                else:\r
+                    self.AI_VC_send_data_queue_thread_lock = 2\r
+                    print("AI_VC_send_data_queue_thread going:{}...".format(count))\r
+                    utime.sleep_ms(1)\r
+                    if self.AI_VC_send_data_queue.empty()!=True:\r
+                        self.AI_VC_send_data_queue.clear()\r
+            self.AI_VC_send_data_queue_thread_lock = 0\r
+            print("AI_VC_send_data_queue_thread_close")\r
+            try:\r
+                _thread.stop_thread(self.AI_VC_send_data_queue_thread_id)\r
+            except Exception as e:\r
+                usys.print_exception(e)\r
+        self.AI_VC_send_data_queue_thread_id = 0\r
+    #发送数据队列\r
+    def AI_VC_send_data_queue_thread(self):\r
+        print("AI_VC_send_data_queue_thread:start")\r
+        count_t = 0\r
+        while True:\r
+            if self.AI_VC_send_data_queue_thread_lock == 2:\r
+                print("AI_VC_send_data_queue_thread,该退出了")\r
+                break  \r
+            if self.AI_VC_send_data_queue.empty() :#不能去掉,去掉会卡死\r
+                self.AI_VC_send_data_queue_thread_lock = 0  \r
+                count_t+=1\r
+                # if count_t%200 == 0:\r
+                #     print("self.AI_VC_send_data_queue.empty")\r
+                utime.sleep_ms(1)\r
+            else:\r
+                #data[0]是websocket连接对象编号,data[1]是数据\r
+                #print("AI_VC_send_data_queue_thread:get")\r
+                \r
+                self.AI_VC_send_data_queue_thread_lock = 1\r
+                data = self.AI_VC_send_data_queue.get()\r
+                \r
+                \r
+                #print("AI_VC_send_data_queue_thread:num{} len{}".format(data[0],len(data[1])))\r
+                if data != None:\r
+                    try:\r
+                        #data["func"](data["data"])\r
+                        # 发送数据\r
+                        #bytes_data = bytes(data[1])\r
+                        #data[0].send(data[1])\r
+                        #print("AI_VC_send_data_queue_thread:len:{}".format(len(data[1])))\r
+                        #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)))\r
+                        if data[0] == AI_client_VC_num:\r
+                            \r
+                            if isinstance(data[1], str):#是字符串\r
+                                self.VC_pingping_timerout = 0\r
+                                print("VC VC: send_data:{}".format(data[1]))\r
+                            else:\r
+                                print("VC: send_data len:{}".format(len(data[1])))\r
+                            if self.AI_client_VC != None and self.AI_client_VC_isconnect == 1:\r
+                                self.AI_client_VC.send(data[1])\r
+                            else:\r
+                                print("VC VC: send_data:ERROR:{}".format(len(data[1])))\r
+                            #print("VC: send_data end")\r
+    \r
+                        #print("VC: send_data end")\r
+                    except Exception as e:\r
+                        print("DeviceInfo_queue_thread:ERROR:{}".format(e))\r
+                        usys.print_exception(e)\r
+                        if data[0] == AI_client_VC_num:\r
+                            #self.websocket_error()\r
+                            pass\r
+\r
+                            \r
+                            try:\r
+                                if self.AI_client_VC_isconnect != 0:\r
+                                    print("VC发送数据错误,退出")\r
+                                    EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_error,"data":"VC发送出错了,请重试"}) \r
+                                    self.ud_error(["VC",self.VC_taskid])\r
+                            except Exception as e: #网络连接异常\r
+                                usys.print_exception(e)\r
+\r
+                    utime.sleep_ms(1)\r
+        self.AI_VC_send_data_queue_thread_lock = 0              \r
+    #VC关闭读线程\r
+    def AI_client_VC_recv_thread_close(self):\r
+        if self.AI_client_VC_recv_id != 0:\r
+            count =500\r
+            while True:\r
+                count -= 1\r
+                if self.AI_client_VC_recv_lock == 1:\r
+                    self.AI_client_VC_recv_lock = 2\r
+                if self.AI_client_VC_recv_lock == 0 or count <=0:\r
+                    break\r
+                else:\r
+                    print("AI_client_VC_recv_thread going:{}...".format(count))\r
+                    utime.sleep_ms(1)\r
+            self.AI_client_VC_recv_lock = 0\r
+            print("AI_client_VC_recv_thread_close")\r
+            try:\r
+                _thread.stop_thread(self.AI_client_VC_recv_id)\r
+            except Exception as e:\r
+                usys.print_exception(e)\r
+        self.AI_client_VC_recv_id = 0\r
+    #Ai VC websocket返回数据       \r
+    def AI_client_VC_recv(self,cli):\r
+        count = 0\r
+        asr_led_flag = 0\r
+        tts_led_flag = 0\r
+        while True:\r
+            try:\r
+                # 死循环接收数据\r
+                self.AI_client_VC_recv_lock = 0\r
+\r
+                count+=1\r
+                if self.VC_state >= VC_State_TTSStart and (self.tts_in_data_len - self.tts_out_data_len > 64*1024 or count>5):\r
+                    count = 0\r
+                    utime.sleep_ms(1)\r
+                if self.VC_state < VC_State_TTSStart:\r
+                    utime.sleep_ms(1)\r
+                recv_data = cli.recv()\r
+                if self.AI_client_VC_recv_lock == 2:\r
+                    print("AI_client_VC_recv 该退出了")\r
+                    break\r
+                self.AI_client_VC_recv_lock = 1\r
+                self.close_timerout = 0#服务器有返回清零退出时间\r
+                if recv_data == "websocket close":\r
+                    # 服务器关闭连接\r
+                    print("VC 服务器关闭连接!!!!!!!!!!!!!!!!!!!!!!!!!!!")\r
+                    #self.AI_client_VC_isconnect = 0\r
+                    #self.websocket_deconnect_VC()\r
+                    #EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_deconnect_asr}) \r
+                    # #EventMesh.publish("publish_AI_btnInfo",{"func":utime.sleep_ms,'data':(1500)})\r
+                    #EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_connect_asr}) \r
+                    EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_error,"data":"VC连接断开了,请重试"}) \r
+                    self.ud_error(["VC",self.VC_taskid])\r
+                    break\r
+                elif recv_data == "":#客户端关闭连接\r
+                    print("VC VC :客户端关闭连接")\r
+                    EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_error,"data":"VC连接断开了,请重试"}) \r
+                    self.ud_error(["VC",self.VC_taskid])\r
+                    break\r
+                try:\r
+                    self.websocket_error_count = 0\r
+                    if isinstance(recv_data, str):#返回的是字符串\r
+                        print("VC VC:recv_data:{}".format(recv_data))\r
+                        jsload_data =  ujson.loads(recv_data)\r
+                        #print("AI_client_VC_recv jsload_data = {}".format(jsload_data))\r
+                        \r
+                        if jsload_data["event"] == "started" :#会话开始\r
+                            #payload = jsload_data["payload"]\r
+                            # self.VC_dialog_id = payload["dialog_id"] \r
+                            # self.VC_task_id = jsload_data["task_id"] \r
+                            EventMesh.publish("open_led_blue")\r
+                            print("VC:Started!!!!!!!!\r\n")\r
+                            if self.AI_TTS_str == "":\r
+                                #开始上传语音\r
+                                \r
+                                if self.VC_mode == 0    :\r
+                                    self.VC_record_state_flag  =2\r
+                                else:\r
+                                    EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_client_VC_send_speech})\r
+                                    \r
+                                \r
+                            else:\r
+                                EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_client_VC_synthesis})\r
+                            self.VC_state =  VC_State_None   \r
+                        elif jsload_data["event"] == "asr.started" :#asr开始 \r
+                            self.VC_state =  VC_State_SpeechStart\r
+                            if self.VC_mode == 1    :\r
+                                self.VC_record_state_flag = 2\r
+                            EventMesh.publish("open_led_blue")\r
+                        elif jsload_data["event"] == "asr.result" :#asr结果\r
+                            self.AI_ASR_str = jsload_data["payload"]["content"]\r
+                            if self.commands_mode ==2:\r
+                                ret= self.check_text(self.AI_ASR_str)\r
+                                if ret == 0:#配置指令\r
+                                            \r
+                                    if self.AI_VC_send_data_queue.empty()!=True:\r
+                                        self.AI_VC_send_data_queue.clear()\r
+                                    if self.AI_ASR_send_data_queue.empty()!=True:\r
+                                        self.AI_ASR_send_data_queue.clear()\r
+                                    self.AI_ASR_send_buf_len = 0\r
+                                    EventMesh.publish("open_led_all")\r
+                                    try:\r
+                                        \r
+                                        EventMesh.publish("publish_AI_btnInfo",{"func":self.VC_Speech_End})\r
+                                        EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_deconnect_VC}) \r
+                                        EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_VC_start}) \r
+                                    except Exception as e:\r
+                                        usys.print_exception(e)\r
+                                    continue\r
+                                elif ret == 1:#不处理\r
+                                    pass\r
+                            EventMesh.publish("open_led_blue")\r
+                        elif jsload_data["event"] == "asr.completed" :#asr 终止的标识     \r
+                            #self.VC_Speech_End()\r
+                            #EventMesh.publish("publish_AI_btnInfo",{"func":self.VC_Speech_End})\r
+                            if self.record_data_save_flag == 1:\r
+                                if self.record_fd :\r
+                                    self.record_fd.close()\r
+                                self.record_fd = None\r
+                            # if dev_type != "7PIN" :\r
+                            #EventMesh.publish("publish_AI_btnInfo",{"func":self.send_tone}) \r
+                        elif jsload_data["event"] == "vad.silence" :#VAD 终止的标识 \r
+                            pass\r
+                            #EventMesh.publish("publish_AI_btnInfo",{"func":self.VC_Speech_End})\r
+                        elif jsload_data["event"] == "llm.created" :#会话开始\r
+                            EventMesh.publish("open_led_red_green")#\r
+                            self.VC_state = VC_State_Thinking\r
+                            # EventMesh.publish("publish_AI_btnInfo",{"func":self.VC_Play_Start})\r
+                            pass\r
+                        elif jsload_data["event"] == "llm.delta" :#llm返回数据\r
+                            if self.is_VAD == 0:\r
+                                if self.VC_record_state_flag == 1:#llm返回数据还没停止,就先停止\r
+                                    EventMesh.publish("publish_AI_btnInfo",{"func":self.VC_Speech_End})\r
+                        elif jsload_data["event"] == "tts.started" :#tts开始\r
+                            self.VC_state = VC_State_TTSStart\r
+                            if self.is_VAD == 0:\r
+                                EventMesh.publish("publish_AI_btnInfo",{"func":self.VC_Speech_End})\r
+                            EventMesh.publish("publish_AI_btnInfo",{"func":self.VC_Play_Start})\r
+                            \r
+                            #self.VC_Play_Start()\r
+                            EventMesh.publish("open_led_green")#绿色\r
+                        elif jsload_data["event"] == "tts.completed" :#tts结束\r
+                            EventMesh.publish("open_led_green")#绿色\r
+                            EventMesh.publish("publish_AI_btnInfo",{"func":self.VC_Play_Start})\r
+                            self.LocalRespondingEnded_timerout = 8\r
+                            self.VC_state = VC_State_TTSEnd\r
+                            pass\r
+\r
+                        elif jsload_data["event"] == "canceled" :#打断\r
+                            EventMesh.publish("publish_AI_btnInfo",{"func":self.VC_Speech_Start_now})#开始录音\r
+                            self.VC_state = VC_State_None\r
+                        elif jsload_data["event"] == "completed" :#会话结束\r
+                            #EventMesh.publish("open_led_green")#绿色\r
+                            \r
+                            self.LocalRespondingEnded_timerout = 8\r
+                            self.VC_state = VC_State_End\r
+                            pass\r
+                        elif jsload_data["event"] == "command" :#命令匹配\r
+                            ret = -1\r
+                            try:\r
+                                if self.commands_mode ==1:\r
+                                    if len(jsload_data["payload"]["functions"])>0:\r
+                                        \r
+                                        cmd = jsload_data["payload"]["functions"][0]["function"]["arguments"]\r
+                                        print("llm:cmd:{}".format(cmd))\r
+                                        cmd = ujson.loads(cmd)\r
+                                        ret = self.check_text_llm(cmd)\r
+                                elif self.commands_mode ==0:\r
+\r
+                                    cmd = jsload_data["payload"]\r
+                                    print("server:cmd:{}".format(cmd))\r
+                                    ret = self.check_text_server(cmd)\r
+                            except Exception as e:\r
+                                usys.print_exception(e)       \r
+                            if ret == -1:\r
+                                if self.AI_TTS_str  =="":\r
+                                    self.AI_TTS_str = "抱歉,没找到对应操作,可以换个说法试试" \r
+                            #EventMesh.publish("publish_AI_btnInfo",{"func":utime.sleep_ms,'data':(10)})\r
+                            EventMesh.publish("publish_AI_btnInfo",{"func":self.VC_Speech_End})\r
+                            EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_deconnect_VC}) \r
+                            EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_VC_start}) \r
+                    else:#下发音频数据\r
+                        #self.AI_ASR_str = ""#下发音频后清掉asr结果\r
+                        \r
+                        \r
+                        EventMesh.publish("open_led_green")#绿色\r
+                        \r
+                        print("下发音频数据1:{}".format(len(recv_data)))\r
+                        \r
+                        if self.play_data_save_flag == 1:\r
+                            if self.play_fd ==None:\r
+                                try:\r
+                                    uos.remove('/usr/play_data.pcm')\r
+                                except Exception as e:\r
+                                    usys.print_exception(e)\r
+                                self.play_fd = open('/usr/play_data.pcm','w')\r
+                            if self.play_fd !=None:\r
+                                self.play_fd.write(recv_data)\r
+                        # print("下发音频数据2:{}".format(len(recv_data)))\r
+                        #if self.VC_state >= VC_State_TTSStart:\r
+                            #self.put_record_data([recv_data,""])\r
+                        if self.VC_play_TYPE == VC_play_TYPE_PCM:\r
+                            if self.play_pcm != None:\r
+                                try:\r
+                                    #print("play_pcm.stream_write !!!")\r
+                                    buf_len = self.play_pcm.stream_get_buf_len()\r
+                                    count_tmp = 1000\r
+                                    while buf_len < len(recv_data):\r
+                                        utime.sleep_ms(1)\r
+                                        count_tmp-=1\r
+                                        if count_tmp<=0:\r
+                                            break\r
+                                        buf_len = self.play_pcm.stream_get_buf_len()\r
+                                    #print("buf已满,等待释放:buf_len:{},count_tmp:{}".format(buf_len,count_tmp))\r
+                                except Exception as e:\r
+                                    usys.print_exception(e)\r
+                        EventMesh.publish("publish_AI_btnInfo",{"func":self.put_record_data,"data":[recv_data,""]}) \r
+                        utime.sleep_ms(1)\r
+                except Exception as e:\r
+                    usys.print_exception(e)\r
+                \r
+            except Exception as e:\r
+                    error_str = str(e)\r
+                    #print("VC VC:e:{}".format(error_str))\r
+                    if error_str.find("[Errno 110] ETIMEDOUT")!= -1:\r
+                        #print("VC VC:recv TIMEDOUT 正常")\r
+                        pass\r
+                    else:\r
+                        usys.print_exception(e)\r
+                        #self.websocket_error()\r
+                        print("VC VC :读数据报错,退出")\r
+                        EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_error,"data":"VC出错了,请重试"}) \r
+                        self.ud_error(["VC",self.VC_taskid])\r
+                        break\r
+        self.AI_client_VC_isconnect = 0\r
+        self.AI_client_VC_recv_id = 0 \r
+        self.AI_client_VC_recv_lock = 0\r
+        print("AI_client_VC_recv END!!!!!!!!!!!!!!!!!!!!!!!!!!!")\r
+    def put_record_data(self,data):\r
+        #print("下发音频数据1:{}".format(len(data[0])))\r
+        ret=self.AI_audio_queue.put(data)\r
+        self.tts_in_data_len += len(data[0])\r
+        #print("下发音频数据2:{},{}".format(len(data[0]),self.tts_in_data_len))\r
+    def check_text_server(self,cmd):\r
+        # if len(text)>60:\r
+        #     return -1\r
+        try:\r
+                text = cmd["command"]\r
+                if text.find("切换音色") != -1 :\r
+                    try:\r
+                        text = cmd["params"]["cmd_parameter"]\r
+                        for key in self.VC_TTS_voice_type:\r
+                            if  text.find(key) != -1 :\r
+                                self.VC_TTS_voice_key = key\r
+                                EventMesh.publish("set_storage_config",["VC_TTS_voice_key",self.VC_TTS_voice_key])\r
+                                self.AI_TTS_str = "更改成功" \r
+                                return 0\r
+                    except Exception as e:\r
+                        usys.print_exception(e)    \r
+                    if  text.find("男") != -1 :\r
+                        if "男" in self.VC_TTS_voice_type:\r
+                            self.VC_TTS_voice_key = "男"\r
+                            EventMesh.publish("set_storage_config",["VC_TTS_voice_key",self.VC_TTS_voice_key])\r
+                            # EventMesh.publish("audio_montage_play",["peizhichenggong.mp3"])\r
+                            #self.aud.play(1,0,'U:/static/peizhichenggong.mp3')#切换成功\r
+                            self.AI_TTS_str = "更改成功" \r
+                            return 0\r
+                    if text.find("女") != -1 :\r
+                        if "女" in self.VC_TTS_voice_type:\r
+                            self.VC_TTS_voice_key = "女"\r
+                            EventMesh.publish("set_storage_config",["VC_TTS_voice_key",self.VC_TTS_voice_key])\r
+                            # EventMesh.publish("audio_montage_play",["peizhichenggong.mp3"])\r
+                            #self.aud.play(1,0,'U:/static/peizhichenggong.mp3')#切换成功\r
+                            self.AI_TTS_str = "更改成功" \r
+                            return 0\r
+                    if text.find("同声") != -1 or text.find("童") != -1 :\r
+                        if "童" in self.VC_TTS_voice_type:\r
+                            self.VC_TTS_voice_key = "童"\r
+                            EventMesh.publish("set_storage_config",["VC_TTS_voice_key",self.VC_TTS_voice_key])\r
+                            # EventMesh.publish("audio_montage_play",["peizhichenggong.mp3"])\r
+                            #self.aud.play(1,0,'U:/static/peizhichenggong.mp3')#切换成功\r
+                            self.AI_TTS_str = "更改成功" \r
+                            return 0\r
+                    if text.find("粤") != -1 or text.find("越野") != -1 or text.find("广东话") != -1:\r
+                        if "粤" in self.VC_TTS_voice_type:\r
+                            self.VC_TTS_voice_key = "粤"\r
+                            EventMesh.publish("set_storage_config",["VC_TTS_voice_key",self.VC_TTS_voice_key])\r
+                            # EventMesh.publish("audio_montage_play",["peizhichenggong.mp3"])\r
+                            #self.aud.play(1,0,'U:/static/peizhichenggong.mp3')#切换成功\r
+                            self.AI_TTS_str = "更改成功" \r
+                            return 0\r
+                    if text.find("四川") != -1 :\r
+                        if "四川" in self.VC_TTS_voice_type:\r
+                            self.VC_TTS_voice_key = "四川"\r
+                            EventMesh.publish("set_storage_config",["VC_TTS_voice_key",self.VC_TTS_voice_key])\r
+                            # EventMesh.publish("audio_montage_play",["peizhichenggong.mp3"])\r
+                            #self.aud.play(1,0,'U:/static/peizhichenggong.mp3')#切换成功\r
+                            self.AI_TTS_str = "更改成功" \r
+                            return 0\r
+                    if text.find("个性") != -1 :\r
+                        if "个性" in self.VC_TTS_voice_type:\r
+                            self.VC_TTS_voice_key = "个性"\r
+                            EventMesh.publish("set_storage_config",["VC_TTS_voice_key",self.VC_TTS_voice_key])\r
+                            # EventMesh.publish("audio_montage_play",["peizhichenggong.mp3"])\r
+                            #self.aud.play(1,0,'U:/static/peizhichenggong.mp3')#切换成功\r
+                            self.AI_TTS_str = "更改成功" \r
+                            return 0\r
+                    if text.find("英语") != -1 :\r
+                        if "英语" in self.VC_TTS_voice_type:\r
+                            self.VC_TTS_voice_key = "英语"\r
+                            EventMesh.publish("set_storage_config",["VC_TTS_voice_key",self.VC_TTS_voice_key])\r
+                            # EventMesh.publish("audio_montage_play",["peizhichenggong.mp3"])\r
+                            #self.aud.play(1,0,'U:/static/peizhichenggong.mp3')#切换成功\r
+                            self.AI_TTS_str = "更改成功" \r
+                            return 0\r
+                    self.AI_TTS_str = "更改失败,没找到对应声音" \r
+                    return 0\r
+                if text.find("切换对话模式") != -1:\r
+                    if self.VC_mode == 0:\r
+                       self.VC_mode = 1\r
+                       self.AI_TTS_str = "已切换到单对话模式" \r
+                    else:\r
+                        self.VC_mode = 0 \r
+                        self.AI_TTS_str = "已切换到长对话模式" \r
+                    EventMesh.publish("set_storage_config",["VC_mode",self.VC_mode])\r
+                    # EventMesh.publish("audio_montage_play",["peizhichenggong.mp3"])\r
+                    #self.aud.play(1,0,'U:/static/peizhichenggong.mp3')#切换成功\r
+\r
+                    return 0\r
+                if text.find("音量") != -1:\r
+                    if  text.find("加") != -1 :\r
+                        self.VC_TTS_volume += 10\r
+                        if self.VC_TTS_volume > 100:\r
+                            #EventMesh.publish("audio_montage_play",["yinliangyizuida.mp3"])\r
+                            #self.aud.play(1,0,'U:/static/yinliangyizuida.mp3')#音量已最大\r
+                            self.AI_TTS_str = "音量已最大" \r
+                            self.VC_TTS_volume = 100\r
+                        else:\r
+                            self.aud.setVolume(self.VC_TTS_volume //10)\r
+                            EventMesh.publish("set_storage_config",["VC_TTS_volume",self.VC_TTS_volume])\r
+                            #EventMesh.publish("audio_montage_play",["peizhichenggong.mp3"])\r
+                            #self.aud.play(1,0,'U:/static/peizhichenggong.mp3')#配置成功\r
+                            self.AI_TTS_str = "配置成功,当前音量 {}".format(self.VC_TTS_volume)\r
+                            \r
+                        return 0\r
+                    if text.find("减") != -1:\r
+                        self.VC_TTS_volume -= 10\r
+                        if self.VC_TTS_volume < 0:\r
+                            self.VC_TTS_volume = 0\r
+                            #EventMesh.publish("audio_montage_play",["yinliangyizuixiao.mp3"])\r
+                            #self.aud.play(1,0,'U:/static/yinliangyizuixiao.mp3')#音量已最小\r
+                            self.AI_TTS_str = "音量已最小"\r
+                        else:\r
+                            self.aud.setVolume(self.VC_TTS_volume //10)\r
+                            EventMesh.publish("set_storage_config",["VC_TTS_volume",self.VC_TTS_volume])\r
+                            #EventMesh.publish("audio_montage_play",["peizhichenggong.mp3"])\r
+                            #self.aud.play(1,0,'U:/static/peizhichenggong.mp3')#配置成功\r
+                            self.AI_TTS_str = "配置成功,当前音量 {}".format(self.VC_TTS_volume)\r
+                        return 0\r
+                \r
+                if text.find("进入工厂模式") != -1 :\r
+                    self.factory_mode()\r
+                    return 1\r
+                if text.find("查询") != -1:\r
+\r
+                    if text.find("信号") != -1 :\r
+                        signal = net.csqQueryPoll()\r
+                        \r
+                        self.AI_TTS_str = "当前信号{}".format(signal)\r
+                        return 0\r
+                    if text.find("电量") != -1 :\r
+                        battery = EventMesh.publish("get_battery")\r
+                        print("电量查询:{}".format(battery))\r
+                        #EventMesh.publish("audio_montage_play",["dianliangshengyu{}.mp3".format(battery)])\r
+                        #self.aud.play(1,0,'U:/static/dianliangshengyu{}.mp3'.format(battery))#电量剩余\r
+                        self.AI_TTS_str = "电量剩余百分之{}".format(battery)\r
+                        return 0\r
+                    if text.find("电压") != -1 :\r
+                        Vbatt = Power.getVbatt()\r
+                        #EventMesh.publish("audio_montage_play",["dianliangshengyu{}.mp3".format(battery)])\r
+                        #self.aud.play(1,0,'U:/static/dianliangshengyu{}.mp3'.format(battery))#电量剩余\r
+                        self.AI_TTS_str = "当前电池电压{}".format(Vbatt)\r
+                        return 0\r
+\r
+                    if text.find("卡号") != -1 :\r
+                        iccid = sim.getIccid()\r
+                        if iccid != -1 and len(iccid) > 5:\r
+                            print("iccid{}".format(iccid))\r
+                            self.AI_TTS_str = "当前卡号为:{}".format(iccid)\r
+                        else:\r
+                            self.AI_TTS_str = "卡号查询失败"\r
+                        return 0\r
+                    if text.find("设备号") != -1 :\r
+                        imei = modem.getDevImei()\r
+                        if imei != -1 and len(imei) > 5:\r
+                            print("IMEI:{}".format(imei))\r
+                            self.AI_TTS_str = "当前设备号为:{}".format(imei)\r
+                        else:\r
+                            self.AI_TTS_str = "设备号查询失败"\r
+                        return 0\r
+                    if text.find("版本") != -1 :\r
+                        sourceVersion = versions.Build_Time\r
+                        self.AI_TTS_str ="Mr-Seven-"+sourceVersion\r
+                        return 0\r
+                    if text.find("服务器地址") != -1 :\r
+                        self.AI_TTS_str ="服务器地址"+self.server_ip\r
+                        return 0\r
+                if text.find("升级") != -1 and (text.find("OTA") != -1 or text.find("ota") != -1):\r
+                    if self.ai_OTA.min_sys_ota()==1:\r
+                        self.AI_TTS_str = "有新版本,准备开始升级,升级过程会多次重启设备,请保证流量充足及电量充足"\r
+                    else:\r
+                        self.AI_TTS_str = "当前已是最新版本"\r
+                    return 0\r
+                \r
+                if len(text)<20 and (text.find("再见") != -1 or text.find("拜拜") != -1 or text.find("关闭对话") != -1):\r
+                    #EventMesh.publish("publish_AI_btnInfo",{"func":self.Close}) \r
+                    self.AI_TTS_str = "好嘞,再见,我们下次再聊"\r
+                    self.Close_flag = 1\r
+                    return 0\r
+                if len(text)<12 and (text.find("关机") != -1 ):\r
+                    EventMesh.publish("publish_AI_btnInfo",{"func":self.Close}) \r
+                    EventMesh.publish("Power_off")\r
+                    return 1\r
+        except Exception as e:\r
+                usys.print_exception(e)\r
+        return -1\r
+    def check_text_llm(self,cmd):\r
+        try:\r
+                text = cmd["command"]["chinese_description"]\r
+                if text.find("切换音色") != -1:\r
+                    text = cmd["command"]["params_json"]\r
+                    try:\r
+                        for key in self.VC_TTS_voice_type:\r
+                            if  text.find(key) != -1 :\r
+                                self.VC_TTS_voice_key = key\r
+                                EventMesh.publish("set_storage_config",["VC_TTS_voice_key",self.VC_TTS_voice_key])\r
+                                self.AI_TTS_str = "了解,声音已切换" \r
+                                return 0\r
+                    except Exception as e:\r
+                        usys.print_exception(e)    \r
+                    if  text.find("男") != -1 :\r
+                        if "男" in self.VC_TTS_voice_type:\r
+                            self.VC_TTS_voice_key = "男"\r
+                            EventMesh.publish("set_storage_config",["VC_TTS_voice_key",self.VC_TTS_voice_key])\r
+\r
+                            self.AI_TTS_str = "了解,声音已切换" \r
+                            return 0\r
+                    if text.find("女") != -1 :\r
+                        if "女" in self.VC_TTS_voice_type:\r
+                            self.VC_TTS_voice_key = "女"\r
+                            EventMesh.publish("set_storage_config",["VC_TTS_voice_key",self.VC_TTS_voice_key])\r
+       \r
+                            self.AI_TTS_str = "了解,声音已切换" \r
+                            return 0\r
+                    if text.find("同声") != -1 or text.find("童") != -1 :\r
+                        if "童" in self.VC_TTS_voice_type:\r
+                            self.VC_TTS_voice_key = "童"\r
+                            EventMesh.publish("set_storage_config",["VC_TTS_voice_key",self.VC_TTS_voice_key])\r
+\r
+                            self.AI_TTS_str = "了解,声音已切换" \r
+                            return 0\r
+                    if text.find("粤") != -1 or text.find("越野") != -1 or text.find("广东话") != -1:\r
+                        if "粤" in self.VC_TTS_voice_type:\r
+                            self.VC_TTS_voice_key = "粤"\r
+                            EventMesh.publish("set_storage_config",["VC_TTS_voice_key",self.VC_TTS_voice_key])\r
+\r
+                            self.AI_TTS_str = "了解,声音已切换" \r
+                            return 0\r
+                    if text.find("四川") != -1 :\r
+                        if "四川" in self.VC_TTS_voice_type:\r
+                            self.VC_TTS_voice_key = "四川"\r
+                            EventMesh.publish("set_storage_config",["VC_TTS_voice_key",self.VC_TTS_voice_key])\r
+\r
+                            self.AI_TTS_str = "了解,声音已切换" \r
+                            return 0\r
+                    if text.find("个性") != -1 :\r
+                        if "个性" in self.VC_TTS_voice_type:\r
+                            self.VC_TTS_voice_key = "个性"\r
+                            EventMesh.publish("set_storage_config",["VC_TTS_voice_key",self.VC_TTS_voice_key])\r
+\r
+                            self.AI_TTS_str = "了解,声音已切换" \r
+                            return 0\r
+                    if text.find("英语") != -1 :\r
+                        if "英语" in self.VC_TTS_voice_type:\r
+                            self.VC_TTS_voice_key = "英语"\r
+                            EventMesh.publish("set_storage_config",["VC_TTS_voice_key",self.VC_TTS_voice_key])\r
+\r
+                            self.AI_TTS_str = "了解,声音已切换" \r
+                            return 0\r
+                    self.AI_TTS_str = "很抱歉,没找到对应声音" \r
+                    return 0\r
+                if text.find("切换对话模式") != -1:\r
+                    if self.VC_mode == 0:\r
+                       self.VC_mode = 1\r
+                       self.AI_TTS_str = "了解,已切换到单对话模式" \r
+                    else:\r
+                        self.VC_mode = 0 \r
+                        self.AI_TTS_str = "了解,已切换到长对话模式" \r
+                    EventMesh.publish("set_storage_config",["VC_mode",self.VC_mode])\r
+\r
+\r
+                    return 0\r
+                if text.find("音量调整") != -1:\r
+                        text = cmd["command"]["params_json"]\r
+                        text = ujson.loads(text)\r
+                        volume = text["n"]\r
+                        if volume >100 or volume<0:\r
+                            self.AI_TTS_str = "音量调整超出范围了,只能0-100哦" \r
+                        else:\r
+                            self.VC_TTS_volume = volume\r
+                            self.aud.setVolume(self.VC_TTS_volume //10)\r
+                            EventMesh.publish("set_storage_config",["VC_TTS_volume",self.VC_TTS_volume])\r
+                            self.AI_TTS_str = "了解,音量已经调整,当前音量是{}".format(self.VC_TTS_volume)\r
+                        return 0\r
+                if text.find("音量增大") != -1:\r
+                        self.VC_TTS_volume += 10\r
+                        if self.VC_TTS_volume > 100:\r
+\r
+                            self.AI_TTS_str = "音量已经是最大啦" \r
+                            self.VC_TTS_volume = 100\r
+                        else:\r
+                            self.aud.setVolume(self.VC_TTS_volume //10)\r
+                            EventMesh.publish("set_storage_config",["VC_TTS_volume",self.VC_TTS_volume])\r
+  \r
+                            self.AI_TTS_str = "了解,音量已经调大了,当前音量是{}".format(self.VC_TTS_volume)\r
+                            \r
+                        return 0\r
+                if text.find("音量减小") != -1:\r
+                    self.VC_TTS_volume -= 10\r
+                    if self.VC_TTS_volume < 0:\r
+                        self.VC_TTS_volume = 0\r
+                        #EventMesh.publish("audio_montage_play",["yinliangyizuixiao.mp3"])\r
+                        #self.aud.play(1,0,'U:/static/yinliangyizuixiao.mp3')#音量已最小\r
+                        self.AI_TTS_str = "音量已经是最小啦"\r
+                    else:\r
+                        self.aud.setVolume(self.VC_TTS_volume //10)\r
+                        EventMesh.publish("set_storage_config",["VC_TTS_volume",self.VC_TTS_volume])\r
+\r
+                        self.AI_TTS_str = "好嘞,音量已经调小了,当前音量是{}".format(self.VC_TTS_volume)\r
+                    return 0\r
+                \r
+                if text.find("语速增大") != -1:\r
+                        self.speech_rate += 10\r
+                        if self.speech_rate > 50:\r
+\r
+                            self.AI_TTS_str = "语速已经是最快啦" \r
+                            self.speech_rate = 50\r
+                        else:\r
+                            \r
+                            EventMesh.publish("set_storage_config",["speech_rate",self.speech_rate])\r
+  \r
+                            self.AI_TTS_str = "明白,语速已经调快了,当前语速是{}".format(self.speech_rate)\r
+                            \r
+                        return 0\r
+                if text.find("语速减小") != -1:\r
+                    self.speech_rate -= 10\r
+                    if self.speech_rate < -50:\r
+                        self.speech_rate = -50\r
+                        #EventMesh.publish("audio_montage_play",["yinliangyizuixiao.mp3"])\r
+                        #self.aud.play(1,0,'U:/static/yinliangyizuixiao.mp3')#音量已最小\r
+                        self.AI_TTS_str = "语速已经是最慢啦"\r
+                    else:\r
+                        EventMesh.publish("set_storage_config",["speech_rate",self.speech_rate])\r
+\r
+                        self.AI_TTS_str = "明白,语速已经调慢了,当前语速是{}".format(self.speech_rate)\r
+                    return 0\r
+                \r
+                if text.find("进入工厂模式") != -1 :\r
+                    self.factory_mode()\r
+                    return 1\r
+                if text.find("查询") != -1:\r
+                    if text.find("信号") != -1 :\r
+                        signal = net.csqQueryPoll()\r
+                        \r
+                        self.AI_TTS_str = "当前信号{}".format(signal)\r
+                        return 0\r
+                    if text.find("电量") != -1 :\r
+                        battery = EventMesh.publish("get_battery")\r
+                        print("电量查询:{}".format(battery))\r
+                        #EventMesh.publish("audio_montage_play",["dianliangshengyu{}.mp3".format(battery)])\r
+                        #self.aud.play(1,0,'U:/static/dianliangshengyu{}.mp3'.format(battery))#电量剩余\r
+                        self.AI_TTS_str = "电量剩余百分之{}".format(battery)\r
+                        return 0\r
+                    if text.find("电压") != -1 :\r
+                        Vbatt = Power.getVbatt()\r
+                        #EventMesh.publish("audio_montage_play",["dianliangshengyu{}.mp3".format(battery)])\r
+                        #self.aud.play(1,0,'U:/static/dianliangshengyu{}.mp3'.format(battery))#电量剩余\r
+                        self.AI_TTS_str = "当前电池电压{}".format(Vbatt)\r
+                        return 0\r
+\r
+                    if text.find("卡号") != -1 :\r
+                        iccid = sim.getIccid()\r
+                        if iccid != -1 and len(iccid) > 5:\r
+                            print("iccid{}".format(iccid))\r
+                            self.AI_TTS_str = "当前卡号为:{}".format(iccid)\r
+                        else:\r
+                            self.AI_TTS_str = "卡号查询失败"\r
+                        return 0\r
+                    if text.find("设备号") != -1 :\r
+                        imei = modem.getDevImei()\r
+                        if imei != -1 and len(imei) > 5:\r
+                            print("IMEI:{}".format(imei))\r
+                            self.AI_TTS_str = "当前设备号为:{}".format(imei)\r
+                        else:\r
+                            self.AI_TTS_str = "设备号查询失败"\r
+                        return 0\r
+                    if text.find("版本") != -1 :\r
+                        sourceVersion = versions.Build_Time\r
+                        self.AI_TTS_str ="Mr-Seven-"+sourceVersion\r
+                        return 0\r
+                    if text.find("服务器地址") != -1 :\r
+                        self.AI_TTS_str ="服务器地址"+self.server_ip\r
+                        return 0\r
+                if text.find("升级") != -1 and (text.find("OTA") != -1 or text.find("ota") != -1):\r
+                    if self.ai_OTA.min_sys_ota()==1:\r
+                        self.AI_TTS_str = "有新版本,准备开始升级,升级过程会多次重启设备,请保证流量充足及电量充足"\r
+                    else:\r
+                        self.AI_TTS_str = "当前已是最新版本"\r
+                    return 0\r
+                \r
+                if len(text)<20 and (text.find("再见") != -1 or text.find("拜拜") != -1 or text.find("关闭对话") != -1):\r
+                    #EventMesh.publish("publish_AI_btnInfo",{"func":self.Close}) \r
+                    self.AI_TTS_str = "好嘞,再见,我们下次再聊"\r
+                    self.Close_flag = 1\r
+                    return 0\r
+                if len(text)<12 and (text.find("关机") != -1 ):\r
+                    EventMesh.publish("publish_AI_btnInfo",{"func":self.Close}) \r
+                    EventMesh.publish("Power_off")\r
+                    return 1\r
+        except Exception as e:\r
+                usys.print_exception(e)\r
+        self.AI_TTS_str  = cmd["command"]["fail_prompt"]\r
+        return -1\r
+    def check_text(self,text):\r
+        if len(text)>60:\r
+            return -1\r
+        try:\r
+            if isinstance(text, str): \r
+                if text.find("声音") != -1 and text.find("改") != -1:\r
+                    try:\r
+                        for key in self.VC_TTS_voice_type:\r
+                            if  text.find(key) != -1 :\r
+                                self.VC_TTS_voice_key = key\r
+                                EventMesh.publish("set_storage_config",["VC_TTS_voice_key",self.VC_TTS_voice_key])\r
+                                self.AI_TTS_str = "更改成功" \r
+                                return 0\r
+                    except Exception as e:\r
+                        usys.print_exception(e)    \r
+                    if  text.find("男") != -1 :\r
+                        if "男" in self.VC_TTS_voice_type:\r
+                            self.VC_TTS_voice_key = "男"\r
+                            EventMesh.publish("set_storage_config",["VC_TTS_voice_key",self.VC_TTS_voice_key])\r
+                            # EventMesh.publish("audio_montage_play",["peizhichenggong.mp3"])\r
+                            #self.aud.play(1,0,'U:/static/peizhichenggong.mp3')#切换成功\r
+                            self.AI_TTS_str = "更改成功" \r
+                            return 0\r
+                    if text.find("女") != -1 :\r
+                        if "女" in self.VC_TTS_voice_type:\r
+                            self.VC_TTS_voice_key = "女"\r
+                            EventMesh.publish("set_storage_config",["VC_TTS_voice_key",self.VC_TTS_voice_key])\r
+                            # EventMesh.publish("audio_montage_play",["peizhichenggong.mp3"])\r
+                            #self.aud.play(1,0,'U:/static/peizhichenggong.mp3')#切换成功\r
+                            self.AI_TTS_str = "更改成功" \r
+                            return 0\r
+                    if text.find("同声") != -1 or text.find("童") != -1 :\r
+                        if "童" in self.VC_TTS_voice_type:\r
+                            self.VC_TTS_voice_key = "童"\r
+                            EventMesh.publish("set_storage_config",["VC_TTS_voice_key",self.VC_TTS_voice_key])\r
+                            # EventMesh.publish("audio_montage_play",["peizhichenggong.mp3"])\r
+                            #self.aud.play(1,0,'U:/static/peizhichenggong.mp3')#切换成功\r
+                            self.AI_TTS_str = "更改成功" \r
+                            return 0\r
+                    if text.find("粤") != -1 or text.find("越野") != -1 or text.find("广东话") != -1:\r
+                        if "粤" in self.VC_TTS_voice_type:\r
+                            self.VC_TTS_voice_key = "粤"\r
+                            EventMesh.publish("set_storage_config",["VC_TTS_voice_key",self.VC_TTS_voice_key])\r
+                            # EventMesh.publish("audio_montage_play",["peizhichenggong.mp3"])\r
+                            #self.aud.play(1,0,'U:/static/peizhichenggong.mp3')#切换成功\r
+                            self.AI_TTS_str = "更改成功" \r
+                            return 0\r
+                    if text.find("四川") != -1 :\r
+                        if "四川" in self.VC_TTS_voice_type:\r
+                            self.VC_TTS_voice_key = "四川"\r
+                            EventMesh.publish("set_storage_config",["VC_TTS_voice_key",self.VC_TTS_voice_key])\r
+                            # EventMesh.publish("audio_montage_play",["peizhichenggong.mp3"])\r
+                            #self.aud.play(1,0,'U:/static/peizhichenggong.mp3')#切换成功\r
+                            self.AI_TTS_str = "更改成功" \r
+                            return 0\r
+                    if text.find("个性") != -1 :\r
+                        if "个性" in self.VC_TTS_voice_type:\r
+                            self.VC_TTS_voice_key = "个性"\r
+                            EventMesh.publish("set_storage_config",["VC_TTS_voice_key",self.VC_TTS_voice_key])\r
+                            # EventMesh.publish("audio_montage_play",["peizhichenggong.mp3"])\r
+                            #self.aud.play(1,0,'U:/static/peizhichenggong.mp3')#切换成功\r
+                            self.AI_TTS_str = "更改成功" \r
+                            return 0\r
+                    if text.find("英语") != -1 :\r
+                        if "英语" in self.VC_TTS_voice_type:\r
+                            self.VC_TTS_voice_key = "英语"\r
+                            EventMesh.publish("set_storage_config",["VC_TTS_voice_key",self.VC_TTS_voice_key])\r
+                            # EventMesh.publish("audio_montage_play",["peizhichenggong.mp3"])\r
+                            #self.aud.play(1,0,'U:/static/peizhichenggong.mp3')#切换成功\r
+                            self.AI_TTS_str = "更改成功" \r
+                            return 0\r
+                    self.AI_TTS_str = "更改失败,没找到对应声音" \r
+                    return 0\r
+                if text.find("切换对话模式") != -1:\r
+                    if self.VC_mode == 0:\r
+                       self.VC_mode = 1\r
+                       self.AI_TTS_str = "已切换到单对话模式" \r
+                    else:\r
+                        self.VC_mode = 0 \r
+                        self.AI_TTS_str = "已切换到长对话模式" \r
+                    EventMesh.publish("set_storage_config",["VC_mode",self.VC_mode])\r
+                    # EventMesh.publish("audio_montage_play",["peizhichenggong.mp3"])\r
+                    #self.aud.play(1,0,'U:/static/peizhichenggong.mp3')#切换成功\r
+\r
+                    return 0\r
+                if text.find("音量") != -1:\r
+                    if  text.find("加") != -1 :\r
+                        self.VC_TTS_volume += 10\r
+                        if self.VC_TTS_volume > 100:\r
+                            #EventMesh.publish("audio_montage_play",["yinliangyizuida.mp3"])\r
+                            #self.aud.play(1,0,'U:/static/yinliangyizuida.mp3')#音量已最大\r
+                            self.AI_TTS_str = "音量已最大" \r
+                            self.VC_TTS_volume = 100\r
+                        else:\r
+                            self.aud.setVolume(self.VC_TTS_volume //10)\r
+                            EventMesh.publish("set_storage_config",["VC_TTS_volume",self.VC_TTS_volume])\r
+                            #EventMesh.publish("audio_montage_play",["peizhichenggong.mp3"])\r
+                            #self.aud.play(1,0,'U:/static/peizhichenggong.mp3')#配置成功\r
+                            self.AI_TTS_str = "配置成功,当前音量 {}".format(self.VC_TTS_volume)\r
+                            \r
+                        return 0\r
+                    if text.find("减") != -1:\r
+                        self.VC_TTS_volume -= 10\r
+                        if self.VC_TTS_volume < 0:\r
+                            self.VC_TTS_volume = 0\r
+                            #EventMesh.publish("audio_montage_play",["yinliangyizuixiao.mp3"])\r
+                            #self.aud.play(1,0,'U:/static/yinliangyizuixiao.mp3')#音量已最小\r
+                            self.AI_TTS_str = "音量已最小"\r
+                        else:\r
+                            self.aud.setVolume(self.VC_TTS_volume //10)\r
+                            EventMesh.publish("set_storage_config",["VC_TTS_volume",self.VC_TTS_volume])\r
+                            #EventMesh.publish("audio_montage_play",["peizhichenggong.mp3"])\r
+                            #self.aud.play(1,0,'U:/static/peizhichenggong.mp3')#配置成功\r
+                            self.AI_TTS_str = "配置成功,当前音量 {}".format(self.VC_TTS_volume)\r
+                        return 0\r
+                \r
+                if text.find("进入工厂模式") != -1 :\r
+                    self.factory_mode()\r
+                    return 1\r
+                if text.find("查询") != -1:\r
+\r
+                    if text.find("信号") != -1 :\r
+                        signal = net.csqQueryPoll()\r
+                        \r
+                        self.AI_TTS_str = "当前信号{}".format(signal)\r
+                        return 0\r
+                    if text.find("电量") != -1 :\r
+                        battery = EventMesh.publish("get_battery")\r
+                        print("电量查询:{}".format(battery))\r
+                        #EventMesh.publish("audio_montage_play",["dianliangshengyu{}.mp3".format(battery)])\r
+                        #self.aud.play(1,0,'U:/static/dianliangshengyu{}.mp3'.format(battery))#电量剩余\r
+                        self.AI_TTS_str = "电量剩余百分之{}".format(battery)\r
+                        return 0\r
+                    if text.find("电压") != -1 :\r
+                        Vbatt = Power.getVbatt()\r
+                        #EventMesh.publish("audio_montage_play",["dianliangshengyu{}.mp3".format(battery)])\r
+                        #self.aud.play(1,0,'U:/static/dianliangshengyu{}.mp3'.format(battery))#电量剩余\r
+                        self.AI_TTS_str = "当前电池电压{}".format(Vbatt)\r
+                        return 0\r
+\r
+                    if text.find("卡号") != -1 :\r
+                        iccid = sim.getIccid()\r
+                        if iccid != -1 and len(iccid) > 5:\r
+                            print("iccid{}".format(iccid))\r
+                            self.AI_TTS_str = "当前卡号为:{}".format(iccid)\r
+                        else:\r
+                            self.AI_TTS_str = "卡号查询失败"\r
+                        return 0\r
+                    if text.find("设备号") != -1 :\r
+                        imei = modem.getDevImei()\r
+                        if imei != -1 and len(imei) > 5:\r
+                            print("IMEI:{}".format(imei))\r
+                            self.AI_TTS_str = "当前设备号为:{}".format(imei)\r
+                        else:\r
+                            self.AI_TTS_str = "设备号查询失败"\r
+                        return 0\r
+                    if text.find("版本") != -1 :\r
+                        sourceVersion = versions.Build_Time\r
+                        self.AI_TTS_str ="Mr-Seven-"+sourceVersion\r
+                        return 0\r
+                    if text.find("服务器地址") != -1 :\r
+                        self.AI_TTS_str ="服务器地址"+self.server_ip\r
+                        return 0\r
+                if text.find("升级") != -1 and (text.find("OTA") != -1 or text.find("ota") != -1):\r
+                    if self.ai_OTA.min_sys_ota()==1:\r
+                        self.AI_TTS_str = "有新版本,准备开始升级,升级过程会多次重启设备,请保证流量充足及电量充足"\r
+                    else:\r
+                        self.AI_TTS_str = "当前已是最新版本"\r
+                    return 0\r
+                \r
+                if len(text)<16 and (text.find("再见") != -1 or text.find("拜拜") != -1 or text.find("关闭对话") != -1):\r
+                    #EventMesh.publish("publish_AI_btnInfo",{"func":self.Close}) \r
+                    if dev_type != "7PIN":#柒牌\r
+                        self.AI_TTS_str = "好嘞,再见,我们下次再聊"\r
+                        self.Close_flag = 1\r
+                        return 0\r
+                    else:\r
+                        EventMesh.publish("publish_AI_btnInfo",{"func":self.Close}) \r
+                        return 1\r
+                if len(text)<12 and (text.find("关机") != -1 ):\r
+                    if dev_type == "7PIN":#柒牌\r
+                        EventMesh.publish("publish_AI_btnInfo",{"func":self.Close}) \r
+                        return 1\r
+                    EventMesh.publish("publish_AI_btnInfo",{"func":self.Close}) \r
+                    EventMesh.publish("Power_off")\r
+                    return 1\r
+        except Exception as e:\r
+                usys.print_exception(e)\r
+        return -1\r
+    #获取trace_id\r
+    def get_trace_id(self):\r
+        t = utime.mktime(utime.localtime())\r
+        t = t*1000+urandom.randint(0, 1000)\r
+        md5_data = "{}".format(t)#md5签名\r
+        sign_data = ""\r
+        hash_obj = uhashlib.md5(md5_data)\r
+        res = hash_obj.digest()\r
+\r
+        # 转成十六进制表示\r
+        sign_data = ubinascii.hexlify(res)\r
+        sign_data = sign_data.decode('ascii')\r
+        return sign_data\r
+    \r
+    def get_session_id(self,data = "session_id"):\r
+        t = utime.mktime(utime.localtime())\r
+        t = t*1000+urandom.randint(0, 1000)\r
+        md5_data = "{}{}".format(data,t)#md5签名\r
+        sign_data = ""\r
+        hash_obj = uhashlib.md5(md5_data)\r
+        res = hash_obj.digest()\r
+\r
+        # 转成十六进制表示\r
+        sign_data = ubinascii.hexlify(res)\r
+        sign_data = sign_data.decode('ascii')\r
+        return sign_data\r
+    \r
+    def get_new_message_id(self):\r
+        message_id = self.get_trace_id()+"aaa"+self.get_trace_id()\r
+        self.VC_message_id=message_id[:32]\r
+        return self.VC_message_id \r
+    def get_new_task_id(self):\r
+        task_id = self.get_trace_id()+"aaa"+self.get_trace_id()\r
+        self.VC_task_id=task_id[:32]\r
+        return self.VC_task_id\r
+    #开始播放声音\r
+    def VC_Play_Start(self):\r
+        self.tts_in_data_len = 0\r
+        self.tts_out_data_len = 0\r
+        if self.VC_Play_flag == 0:\r
+            try:\r
+                if self.VC_play_TYPE == VC_play_TYPE_PCM:\r
+                    if self.play_pcm == None:        \r
+                        self.play_pcm = audio.Audio.PCM(0,1,self.VC_play_samplerate,1,1,2)\r
+                        #self.play_pcm.setVolume(11)\r
+                        ret = self.play_pcm.stream_write_start()\r
+                        print("self.record_pcm.stream_write_start:ret:{}".format(ret))\r
+                elif self.VC_play_TYPE == VC_play_TYPE_MP3:\r
+                    pass\r
+                self.VC_Play_flag = 1\r
+            except Exception as e:\r
+                self.VC_Play_End()\r
+                usys.print_exception(e)\r
+    #暂停/继续声音播放   Pause_flag = 1暂停\r
+    def VC_Play_Pause(self,Pause_flag):\r
+        try:\r
+            if self.VC_play_TYPE == VC_play_TYPE_PCM:\r
+                if self.play_pcm != None:    \r
+                    self.play_pcm.stream_pause(Pause_flag)\r
+        except Exception as e:\r
+            self.VC_Play_End()\r
+            usys.print_exception(e)\r
+    #停止播放声音\r
+    def VC_Play_End(self):\r
+        self.VC_Play_flag = 0\r
+        if self.VC_play_TYPE == VC_play_TYPE_PCM:\r
+            if self.VC_play_samplerate == 8000:\r
+                self.aud.stopPlayStream()\r
+                self.aud.stopAll()\r
+            elif self.VC_play_samplerate == 16000:\r
+                if self.play_pcm != None:\r
+                    print("Close:play_pcm.close()!!!!!!!!!!!!!!!!!!")\r
+                    try:\r
+                        self.play_pcm.stream_stop()\r
+                        self.play_pcm.close()\r
+                    except Exception as e:\r
+                        usys.print_exception(e)\r
+                    self.play_pcm=None\r
+                self.aud.stopPlayStream()\r
+                self.aud.stopAll()\r
+        elif self.VC_play_TYPE == VC_play_TYPE_MP3:\r
+            self.aud.stopPlayStream()\r
+            self.aud.stopAll()\r
+        if self.AI_audio_queue.empty()!=True:\r
+            self.AI_audio_queue.clear()\r
+        \r
+\r
+    def _1S_timer_cb(self,*argc):\r
+        EventMesh.publish("publish_AI_btnInfo",{"func":self._1S_timer_cb_}) \r
+\r
+    def _1S_timer_cb_(self):    \r
+    \r
+        EventMesh.publish("system_sleep_rest")#防止黑屏\r
+        self.close_timerout += 1\r
+        if self.close_timerout > 60:#20秒没数据就close\r
+            \r
+            if self.VC_state >= VC_State_SpeechIng:\r
+                print("接口无响应,超时退出")\r
+                EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_error,"data":"接口超时了。请重试"}) \r
+                self.ud_error(["VC",self.VC_taskid])\r
+            else:\r
+                EventMesh.publish("publish_AI_btnInfo",{"func":self.Close}) \r
+        # print("get_audio_state !!!!!{} {} {}\r\n".format(self.play_end,EventMesh.publish("get_audio_state"),self.play_flag))\r
+        if self.LocalRespondingEnded_timerout>0  :#\r
+            self.LocalRespondingEnded_timerout -= 1\r
+            print("LocalRespondingEnded_timerout:{}".format(self.LocalRespondingEnded_timerout))\r
+            if self.LocalRespondingEnded_timerout <= 0 or (self.play_pcm != None and self.play_pcm.stream_is_empty() == 1) :#超时或者音频播放完,\r
+                self.LocalRespondingEnded_timerout = 0\r
+                if self.VC_mode == 1 :#长按单次问答模式\r
+                    EventMesh.publish("publish_AI_btnInfo",{"func":self.Close}) \r
+                else:\r
+                    EventMesh.publish("open_led_blue")\r
+                    if self.Close_flag == 1:\r
+                        self.Close_flag = 0\r
+                        EventMesh.publish("publish_AI_btnInfo",{"func":self.Close}) \r
+                    else:\r
+                        #utime.sleep_ms(1000)\r
+                        EventMesh.publish("publish_AI_btnInfo",{"func":self.VC_Play_End})\r
+                        #EventMesh.publish("publish_AI_btnInfo",{"func":self.chenggong_tone})\r
+                        EventMesh.publish("publish_AI_btnInfo",{"func":self.VC_Speech_Start_now})#开始录音\r
+                        self.VC_state = VC_State_None\r
+                    #通知服务器播放结束\r
+                    #self.AI_client_VC_LocalRespondingEnded()\r
+\r
+        self.VC_pingping_timerout+=1\r
+        if self.VC_pingping_timerout>3:\r
+            self.VC_pingping_timerout=0\r
+            self.AI_client_VC_ping()\r
+        # self.asr_pingping_timerout += 1\r
+        # if self.asr_pingping_timerout>3:\r
+        #     self.asr_pingping_timerout=0\r
+        #     self.AI_client_asr_ping()    \r
+        if self.VC_Thinking_timerout > 0 and self.VC_Thinking_timerout < 100:#VC Thinking超时后重新开始\r
+            print("VC_Thinking_timerout:{}!!!!!!!!!!!!!!!!!!!!!".format(self.VC_Thinking_timerout))\r
+            self.VC_Thinking_timerout -=1\r
+            if self.VC_Thinking_timerout == 0:\r
+                self.VC_Thinking_timerout = 100\r
+                print("Thinking重试,重试!!!!!!!!!!!!!!!!!!!!!")\r
+                self.VC_state = VC_State_None\r
+                EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_VC_start}) \r
+                pass\r
+        \r
+    #VC开始\r
+    def AI_VC_start(self):\r
+        print("AI_VC_start1")\r
+        self.VC_satrt_flag = 1\r
+        if self.VC_Thinking_timerout < 100:\r
+            self.VC_Thinking_timerout = 0\r
+        EventMesh.publish("open_led_all")\r
+        self.VC_Play_End()#关闭音频播放\r
+        print("AI_VC_start2")\r
+        #self.aud.aud_tone_play(16,200)#播放按键音\r
+        self.LocalRespondingEnded_timerout = 0\r
+        self.close_timerout = 0\r
+\r
+        \r
+        #\r
+        if self.AI_client_VC_isconnect == 0:#没连接的时候请求开始\r
+            self.websocket_connect_VC()#连接服务器\r
+            \r
+            #utime.sleep_ms(50)\r
+        else:\r
+            print("self.VC_state :{}".format(self.VC_state ))\r
+            \r
+        if self.AI_client_VC_isconnect == 0:\r
+            return\r
+        self.AI_client_VC_start_requset()\r
+        print("AI_VC_start3")\r
+         \r
+        self.VC_state = VC_State_None\r
+        if self.AI_TTS_str == "":#没有tts要播放的时候才开始录音\r
+            #开始asr录音\r
+            self.VC_Speech_Start()#开启线程获取录音数据\r
+           \r
+                \r
+        #     pass\r
+        print("AI_VC_start4")\r
+        #self.VC_Play_Start()\r
+        #EventMesh.publish("publish_AI_btnInfo",{"func":self.VC_Play_Start})\r
+        #开始线程\r
+        \r
+        # if self.AI_VC_send_data_queue_thread_id == 0:    \r
+        #     _thread.stack_size(self.Audio_buf_size+8*1024)\r
+        #     self.AI_VC_send_data_queue_thread_id = _thread.start_new_thread(self.AI_VC_send_data_queue_thread, ())\r
+        #     _thread.stack_size(8*1024)\r
+        #     print("AI_VC_start :AI_VC_send_data_queue_thread_id :{} ".format(self.AI_VC_send_data_queue_thread_id))\r
+        \r
+        if self.AI_audio_queue_thread_id ==0:\r
+            _thread.stack_size(24*1024)\r
+            self.AI_audio_queue_thread_id = _thread.start_new_thread(self.AI_audio_queue_thread, ())\r
+            _thread.stack_size(8*1024)\r
+            print("AI_VC_start :AI_audio_queue_thread_id :{} ".format(self.AI_audio_queue_thread_id))\r
+        else:\r
+            print("AI_VC_start :AI_audio_queue_thread_id != 0 ")\r
+        self._1S_timer.start(1000,1,self._1S_timer_cb)\r
+        # self.VC_pingping_timerout = 0\r
+        # self.asr_pingping_timerout = 0\r
+        print("AI_VC_start5")\r
+    #开始会话\r
+    def AI_client_VC_start_requset(self):\r
+        voice="zh_male_wennuanahu_moon_bigtts"\r
+        try:\r
+            voice = self.VC_TTS_voice_type[self.VC_TTS_voice_key]["voice"]\r
+        except Exception as e:\r
+            usys.print_exception(e)    \r
+        #voice="zh_female_dongmanxiaoyang_moon_bigtts"\r
+ \r
+        json_data = \\r
+        {\r
+            "header": {\r
+                "event": "Start",\r
+                "trace_id": self.get_trace_id(),\r
+            },\r
+            "payload": {\r
+                "device_id": modem.getDevImei(),\r
+                "user_agent": "AudioClient/1.0",\r
+                "dialog_attributes": {\r
+                    #"provider": "doubao",\r
+                    "provider": "coze",\r
+\r
+                    "cfg": {\r
+                        "disable_empty_prompt" : True,#拦截空字符请求大模型\r
+                        "custom_variables": {\r
+                            "name": self.bot_name,\r
+                            },\r
+                        # "greeting":{\r
+                        #     "enabled":True,\r
+                        #     "content":"小瑞来陪你聊天了!"\r
+                        # }\r
+                        "bot_option": {\r
+                            "use_workflow": True,\r
+                            \r
+                            "bot_id":"7462617881076351002",#语言助手\r
+                            "workflow_id":"7462621757327196187",\r
+                           \r
+                        }\r
+                    }\r
+                },\r
+                "outbound_attributes": {\r
+                    "provider": "volcengine",\r
+                    "cfg": {\r
+                        "format": "pcm",\r
+                        "sample_rate": self.VC_play_samplerate,\r
+                        "bit_rate": 16,\r
+                        "channel": 1,\r
+                        "volume": self.VC_TTS_volume,\r
+                        #"voice": "7426720361732980745",\r
+                        "voice": voice,#音色\r
+                        "speech_rate": self.speech_rate,#语速\r
+                        "chunk_interval_ms": 100,  # 配置每段音频入队间隔时间 100ms\r
+                    }\r
+                },\r
+                "inbound_attributes": {\r
+                    "provider": "xun-fei",#\r
+                    #"provider": "volcengine",\r
+                    "disable_vad":True,\r
+                    "vad_silence":300,\r
+                    "interrupt_options":{\r
+                        "concatenate_results":True,\r
+                        "thinking_time_only": True,\r
+                    },\r
+                    "cfg": {\r
+                        "format": "pcm",\r
+                        "sample_rate": self.VC_record_samplerate,\r
+                        "bit_rate": 16,\r
+                        "channel": 1,\r
+                        "enable_punctuation": True,\r
+                        "enable_itn":True\r
+                    }\r
+                },\r
+                "commands":self.commands,\r
+            }\r
+        }\r
+        # "bot_id":"7481164663863459850",#鸭子\r
+        # "workflow_id":"7480485093845991443",\r
+        # "bot_id":"7462617881076351002",#语言助手\r
+        # "workflow_id":"7462621757327196187",\r
+        # "bot_id":"7469964258592931852",#深圳百事通\r
+        # "workflow_id":"7469968083063603241",\r
+        # "bot_id":"7411071327182438412",#柒牌\r
+        # "workflow_id":"7469049680291610636",\r
+        if dev_type == "7PIN_BK":#小瑞\r
+            # json_data["payload"]["dialog_attributes"]["cfg"]["bot_option"]["bot_id"]="7462617881076351002"#语言助手\r
+            # json_data["payload"]["dialog_attributes"]["cfg"]["bot_option"]["workflow_id"]="7462621757327196187"\r
+            json_data["payload"]["dialog_attributes"]["cfg"]["bot_option"]["bot_id"]="7486697248416989193"#极简\r
+            json_data["payload"]["dialog_attributes"]["cfg"]["bot_option"]["workflow_id"]="7486698347416649778"\r
+            #json_data["payload"]["dialog_attributes"]["provider"]="doubao"#豆包\r
+            json_data["payload"]["inbound_attributes"]["provider"]="volcengine"#火山\r
+            json_data["payload"]["inbound_attributes"]["vad_silence"] = 200\r
+        elif dev_type == "7PIN":#柒牌\r
+            json_data["payload"]["dialog_attributes"]["cfg"]["bot_option"]["bot_id"]="7411071327182438412"#\r
+            json_data["payload"]["dialog_attributes"]["cfg"]["bot_option"]["workflow_id"]="7469049680291610636"\r
+            json_data["payload"]["inbound_attributes"]["vad_silence"] = 1000\r
+        #\r
+        elif dev_type == 'momo':#食梦貘\r
+            pass\r
+        elif dev_type == 'sjgq':#四季甘泉\r
+            json_data["payload"]["dialog_attributes"]["cfg"]["bot_option"]["bot_id"]="7472201279826690111"\r
+            json_data["payload"]["dialog_attributes"]["cfg"]["bot_option"]["workflow_id"]="472203898494500914"\r
+            pass\r
+        elif dev_type == 'szbst':#深圳百事通\r
+            json_data["payload"]["dialog_attributes"]["cfg"]["bot_option"]["bot_id"]="7469964258592931852"\r
+            json_data["payload"]["dialog_attributes"]["cfg"]["bot_option"]["workflow_id"]="7469968083063603241"\r
+        if self.commands_mode !=0:\r
+            json_data["payload"]["commands"] = []\r
+        if self.VC_mode == 0:#长对话模式打开vad\r
+            json_data["payload"]["inbound_attributes"]["disable_vad"] = False\r
+        self.VC_state = VC_State_None\r
+        self.AI_client_VC_send(ujson.dumps(json_data))\r
+ \r
+    #开始上传语音\r
+    def AI_client_VC_send_speech(self):\r
+        json_data = \\r
+        {\r
+            "header": {\r
+                "event": "audio.create",\r
+                \r
+            },\r
+        }\r
+        \r
+        if self.VC_mode == 1:#单对话模式\r
+            self.AI_client_VC_send(ujson.dumps(json_data))\r
+        \r
+\r
+            \r
+            \r
+        \r
+        \r
+        self.VC_state =  VC_State_SpeechStart\r
+    #结束上传语音\r
+    def AI_client_VC_end_speech(self):\r
+        json_data = \\r
+        {\r
+            "header": {\r
+                "event": "audio.completed",\r
+                \r
+            },\r
+        }\r
+        self.AI_client_VC_send(ujson.dumps(json_data))\r
+        EventMesh.publish("publish_AI_btnInfo",{"func":self.VC_Speech_End})\r
+\r
+  \r
+    #客户端打断对话\r
+    def AI_client_VC_RequestToSpeak(self):\r
+        json_data = \\r
+        {\r
+            "event": "cancel",\r
+            "payload": {}\r
+        }\r
+        print("AI_client_VC_RequestToSpeak!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")\r
+        # EventMesh.publish("publish_AI_btnInfo",{"func":self.VC_init}) \r
+        # EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_client_VC_send,"data":ujson.dumps(json_data)}) \r
+        # utime.sleep_ms(1)\r
+        self.websocket_deconnect_VC()\r
+        self.AI_audio_queue_thread_close()\r
+        self.VC_state = VC_State_None\r
+        #self.Close()\r
+        self.AI_VC_start() \r
+    #TTS播放\r
+    def AI_client_VC_synthesis(self):\r
+        json_data = \\r
+        {\r
+            "event": "synthesis",\r
+            "payload": {\r
+                "text": self.AI_TTS_str\r
+            }\r
+        }\r
+        self.AI_TTS_str = ""\r
+        print("AI_client_VC_synthesis!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")\r
+        # if self.VC_state == VC_State_RequestToRespond:\r
+        #     print("AI_client_VC_RequestToRespond 重复 tts_str:{}\nasr_str:{}".format(self.AI_TTS_str,self.AI_ASR_str))\r
+        self.AI_client_VC_send(ujson.dumps(json_data))\r
+    \r
+    def chenggong_tone(self):\r
+        EventMesh.publish("audio_montage_play",["chenggong.mp3"])    \r
+    def send_tone(self):\r
+        EventMesh.publish("audio_montage_play",["send_tone.mp3"])\r
+    #给服务器回应ack\r
+\r
+      \r
+    ############################################\r
+    #关闭音频播放线程\r
+    def AI_audio_queue_thread_close(self):\r
+        print("AI_audio_queue_thread_close1!!!!!!!!!!!!!!!!!!!!!!")\r
+        if self.AI_audio_queue_thread_id != 0:\r
+            count =500\r
+            while True:\r
+                count -= 1\r
+                if self.AI_audio_queue_thread_lock == 0 or count <=0:\r
+                    break\r
+                else:\r
+                    self.AI_audio_queue_thread_lock = 2\r
+                    print("AI_audio_queue_thread going:{}...".format(count))\r
+                    utime.sleep_ms(1)\r
+            self.AI_audio_queue_thread_lock = 0\r
+            print("AI_audio_queue_thread_close2!!!!!!!!!!!!!!!!!")\r
+            try:\r
+                _thread.stop_thread(self.AI_audio_queue_thread_id)\r
+            except Exception as e:\r
+                usys.print_exception(e)\r
+        self.AI_audio_queue_thread_id = 0\r
+    # 音频队列        \r
+    def AI_audio_queue_thread(self):\r
+        print("AI_audio_queue_thread start")\r
+        count = 0\r
+        if self.AI_audio_queue.empty()!=True:\r
+            self.AI_audio_queue.clear()\r
+            print("音频数据还有剩余!!!!!!!!!!!!")\r
+        while True:\r
+            try:\r
+                if self.AI_audio_queue_thread_lock == 2:\r
+                        print("AI_audio_queue_thread 该退出了")\r
+                        break\r
+                #\r
+                count+=1\r
+                if count%500 == 1:\r
+                    print("AI_audio_queue_thread on")\r
+                utime.sleep_ms(1)\r
+                #print("AI_audio_queue_thread")\r
+                if self.AI_audio_queue.empty() :\r
+                    self.AI_audio_queue_thread_lock = 0\r
+                    \r
+                    \r
+                else:\r
+                    self.AI_audio_queue_thread_lock = 1\r
+                    data = self.AI_audio_queue.get()\r
+                    self.close_timerout = 0\r
+                    if self.play_flag == 0:\r
+                        self.play_flag =1\r
+                    #self.AI_client_tts_data_len=len(data)\r
+                    #print("audio_queue:len:{}".format(len(data[0])))\r
+                    \r
+                    if len(data[0]) > 10:\r
+                        for i in range(5): \r
+                            if self.VC_Play_flag == 0:\r
+                                self.VC_Play_Start()\r
+                                utime.sleep_ms(2)\r
+                            else:\r
+                                break\r
+                        try:\r
+                            if self.VC_play_TYPE == VC_play_TYPE_PCM:\r
+                                # if self.VC_play_samplerate == 8000:\r
+                                #     tmp= self.aud.playStream(1,data[0] )\r
+                                # else:\r
+                                    write_buf = bytearray(data[0])\r
+                                    #print("play_pcm.stream_write1 len:{}".format(len(write_buf)))\r
+                                    if self.play_pcm != None:\r
+                                        #print("play_pcm.stream_write !!!")\r
+                                        ret = self.play_pcm.stream_write(write_buf,len(write_buf))\r
+                                        #ret= self.aud.playStream(1, data[0])#播放音频流\r
+                                        self.tts_out_data_len += ret\r
+                                        #print("play_pcm.stream_write2:{}".format(self.tts_out_data_len))\r
+                            elif self.VC_play_TYPE == VC_play_TYPE_MP3:\r
+                                tmp= self.aud.playStream(3, data[0])#播放音频流\r
+                                \r
+                                if tmp != 0:\r
+                                    print("2playStream:error tmp:{} data len:{}!!!!!!!!!!!!".format(tmp,len(data[0])))\r
+                                    # # #播放失败的时候填充WAV头\r
+                                    # data_len = len(data[0])\r
+                                    # data_len_b = data_len.to_bytes(4,'little')#数据长度转16进制数组\r
+                                    # h_data = [ 0x52 ,0x49 ,0x46 ,0x46 #,0x24 ,0x00 ,0x00 ,0x00 #文件标识、文件大小\r
+                                    #         ,0x57 ,0x41 ,0x56 ,0x45 ,0x66 ,0x6D ,0x74 ,0x20  #文件格式、格式块标识符\r
+                                    #         ,0x10 ,0x00 ,0x00 ,0x00 ,0x01 ,0x00 ,0x01 ,0x00 ,0x80 ,0x3E ,0x00 ,0x00  #格式块大小4、音频格式2、声道数2、采样率4\r
+                                    #         ,0x80 ,0x3E ,0x00 ,0x00 ,0x02 ,0x00 ,0x10 ,0x00 ,0x64 ,0x61 ,0x74 ,0x61]#每秒字节数4、数据块对齐2、位深度2、data4\r
+                                    # h_data_b = bytes(h_data)\r
+                                    # file_len = data_len+len(h_data_b)+4+4\r
+                                    # file_len_b = file_len.to_bytes(4,'little')#文件长度转16进制数组\r
+                                    # h_data_b = h_data_b[:4]+file_len_b+h_data_b[4:]+data_len_b\r
+                                    # #self.aud.playStream(2, h_data_b)#播放音频流\r
+                                    # tmp= self.aud.playStream(2, h_data_b+data[0])#播放音频流\r
+                                    # print("3playStream:tmp:{} !!!!!!!!!!!!".format(tmp))\r
+                            \r
+                            \r
+                            mem = gc.mem_free()\r
+                            #print('1剩余内存RAM:{} KB'.format(mem / 1024))\r
+                        except Exception as e:\r
+                            print("AI_audio_queue_thread:ERROR:")\r
+                            usys.print_exception(e)\r
+                    \r
+                    # if self.VC_state == VC_State_TTSEnd and self.AI_audio_queue.empty() :#self.AI_audio_queue为空且tts下发结束\r
+                    #     #通知服务器播放结束\r
+                    #     self.AI_client_VC_LocalRespondingEnded()\r
+            except Exception as e:\r
+                print("AI_audio_queue_thread:ERROR:")\r
+                usys.print_exception(e)\r
+        self.AI_audio_queue_thread_lock = 0\r
+        #print("AI_audio_queue_thread:exit")\r
+    def factory_mode(self):\r
+        print("factory_mode")\r
+        EventMesh.publish("publish_AI_btnInfo",{"func":self.Close}) \r
+        EventMesh.publish("publish_AI_btnInfo",{"func":self.factory_start}) \r
+    def factory_start(self):\r
+        self.factory_timer.start(3000, 1, self.factory_timer_cb)\r
+    def factory_timer_cb(self, *args, **kwargs):\r
+        print("factory_timer_cb play......")\r
+        #self.aud.play(1,0,'U:/static/peizhichenggong.mp3')#切换成功\r
+        EventMesh.publish("audio_montage_play",["xinhaoruo1.mp3"])\r
+\r
+    def Close(self):\r
+        self.VC_Thinking_timerout = 0\r
+        self.VC_satrt_flag = 0\r
+        self.AI_TTS_str = ""\r
+        self.AI_ASR_str = ""\r
+        self.AI_ASR_str_tmp = ""\r
+        self.AI_ASR_flag  = 0\r
+        self.AI_ASR_check_timeout = 0\r
+        self.AI_ASR_error_timeout = 0\r
+        print("ai_VC Close1!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")\r
+        EventMesh.publish("close_led")\r
+        self.tts_in_data_len = 0\r
+        self.tts_out_data_len = 0\r
+        #必须先销毁线程,不然线程会容易报错\r
+        \r
+        try:\r
+            self.AI_audio_queue_thread_close()#销毁音频线程\r
+        except Exception as e:\r
+            usys.print_exception(e)\r
+        try:\r
+            self.AI_VC_send_data_queue_thread_close()#销毁数据发送线程\r
+        except Exception as e: \r
+            usys.print_exception(e)\r
+        \r
+        self.VC_Speech_End()\r
+        \r
+        print("ai_VC Close1.1!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")\r
+        self.VC_init()\r
+        print("ai_VC Close1.2!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")\r
+        \r
+        try:\r
+            self.websocket_deconnect_VC()\r
+        except Exception as e:\r
+            usys.print_exception(e)\r
+        \r
+\r
+        \r
+\r
+\r
+        print("ai_VC Close1.3!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")\r
+        \r
+        print("ai_VC Close2!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")\r
+        \r
+        \r
+        self.AI_ASR_timer.stop()\r
+        self._1S_timer.stop()\r
+        self.factory_timer.stop()\r
+        \r
+        if self.record_data_save_flag == 1:\r
+            if self.record_fd :\r
+                self.record_fd.close()\r
+            self.record_fd = None\r
+        if self.play_data_save_flag == 1:\r
+            if self.play_fd !=None:\r
+                self.play_fd.close()\r
+                self.play_fd = None\r
+        print("ai_VC Close3!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\r\n")\r
+        \r
+        if self.AI_VC_send_data_queue.empty()!=True:\r
+            self.AI_VC_send_data_queue.clear()\r
+\r
+        self.AI_ASR_send_buf_len = 0\r
+        #self.AI_WS_connect_Queue.put(self.AI_client_VC)\r
+\r
+        # try:\r
+        #     while True:\r
+        #         if self.AI_WS_connect_Queue.empty()!=True:\r
+        #             AI_WS_connect = self.AI_WS_connect_Queue.get()\r
+        #             if AI_WS_connect :\r
+        #                 try:\r
+        #                     AI_WS_connect._close()\r
+        #                     AI_WS_connect = None\r
+        #                 except Exception as e:\r
+        #                     usys.print_exception(e)\r
+        #             else:\r
+        #                 print("websocket链接已为空")\r
+        #         else:\r
+        #             break\r
+        # except Exception as e:\r
+        #     usys.print_exception(e)\r
+\r
+    def VC_init2(self):\r
+        self.VC_init()\r
+        \r
+        print("ai_VC VC_init2!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")\r
+        try:\r
+            self.websocket_deconnect_VC()\r
+        except Exception as e:\r
+            usys.print_exception(e)\r
+        print("ai_VC Close3!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\r\n")\r
+        self._1S_timer.stop()\r
+        if self.AI_VC_send_data_queue.empty()!=True:\r
+            self.AI_VC_send_data_queue.clear()\r
+\r
+        self.AI_ASR_send_buf_len = 0\r
+        if self.AI_audio_queue.empty()!=True:\r
+            self.AI_audio_queue.clear()\r
+    def VC_init(self):\r
+        \r
+        print("VC_init:AI_VC_send_data_queue:size:{}".format(self.AI_VC_send_data_queue.size()))\r
+        \r
+        \r
+        print("VC_init2")\r
+        #self.VC_Speech_End()\r
+        print("VC_init3")\r
+        self.VC_Play_End()\r
+        print("VC_init4")\r
+        \r
+        if self.AI_audio_queue.empty()!=True:\r
+            self.AI_audio_queue.clear()\r
+        # num = EventMesh.publish("get_volum_size")\r
+        # if num == None:\r
+        #     num = 8\r
+        # self.aud.setVolume(num)#恢复原始音量\r
         
\ No newline at end of file
index 3987aba..66cac41 100644 (file)
@@ -1,23 +1,23 @@
-# Copyright (c) Quectel Wireless Solution, Co., Ltd.All Rights Reserved.
-#  
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#  
-#     http://www.apache.org/licenses/LICENSE-2.0
-#  
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-
-NAME := EG810MCN_GA_VOLTE
-
-GLOBAL_INCS = include
-
-$(NAME)_ARCHIVES = \
-       libraries/libHeliosAPI.lib \
-       libraries/ql_common_api.lib \
-
+# Copyright (c) Quectel Wireless Solution, Co., Ltd.All Rights Reserved.\r
+#  \r
+# Licensed under the Apache License, Version 2.0 (the "License");\r
+# you may not use this file except in compliance with the License.\r
+# You may obtain a copy of the License at\r
+#  \r
+#     http://www.apache.org/licenses/LICENSE-2.0\r
+#  \r
+# Unless required by applicable law or agreed to in writing, software\r
+# distributed under the License is distributed on an "AS IS" BASIS,\r
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+# See the License for the specific language governing permissions and\r
+# limitations under the License.\r
+\r
+\r
+NAME := EG810MCN_GA_VOLTE\r
+\r
+GLOBAL_INCS = include\r
+\r
+$(NAME)_ARCHIVES = \\r
+       libraries/libHeliosAPI.lib \\r
+       libraries/ql_common_api.lib \\r
+\r
index c48d290..049ba1d 100644 (file)
@@ -1,50 +1,50 @@
-/*
- *
- * Automatically generated file; DO NOT EDIT.
- * Helios SDK Configuration
- *
- */
-
-
-#define PROJECT_NAME_G3_7PIN  1  //项目宏定义
-
-
-// #define CONFIG_LVGL_SPAN 1
-// #define CONFIG_LVGL_FS_HELIOS 1
-// #define CONFIG_LVGL_GIF_DECODE 1
-// #define CONFIG_LVGL_SPINNER 1
-//#define CONFIG_LCD 1
-// #define CONFIG_LVGL_ANIMIMG 1
-// #define CONFIG_LVGL_KEYBOARD 1
-// #define CONFIG_LVGL_CALENDAR 1
-// #define CONFIG_LVGL_LED 1
-#define CONFIG_VIOCE_CALL 1
-// #define CONFIG_LVGL_FS_EXTFLASH_HELIOS 1
-// #define CONFIG_LVGL_TABVIEW 1
-//#define CONFIG_LVGL_LINE 1
-//#define CONFIG_LVGL 1
-// #define CONFIG_LVGL_CHART 1
-// #define CONFIG_LVGL_LIST 1
-// #define CONFIG_LVGL_MSGBOX 1
-// #define CONFIG_LVGL_ARC 1
-// #define CONFIG_LVGL_METER 1
-//#define CONFIG_LVGL_JPG_DECODE 1
-// #define CONFIG_LVGL_PNG_DECODE 1
-// #define CONFIG_LVGL_IMGBTN 1
-//#define CONFIG_GH301x 1
-//#define CONFIG_HX3918 1
-#define CONFIG_MBEDTLS 1
-//#define CONFIG_SC7A20 1
-// #define CONFIG_LVGL_WIN 1
-// #define CONFIG_LVGL_COLORWHEEL 1
-// #define CONFIG_LVGL_CANVAS 1
-// #define CONFIG_LVGL_SPINBOX 1
-// #define CONFIG_LVGL_QRCODE 1
-// #define CONFIG_LVGL_TILEVIEW 1
-// #define CONFIG_LVGL_HANDLER_TASK_PRIORITY 80
-//#define CONFIG_CAMERA 1
-//#define CONFIG_JPEG 1
-#define CONFIG_CAMERA_SAVEPHOTOS 1
-#define CONFIG_VAD 1
-//菊风视频通话
-//#define CONFIG_juphoon 1
+/*\r
+ *\r
+ * Automatically generated file; DO NOT EDIT.\r
+ * Helios SDK Configuration\r
+ *\r
+ */\r
+\r
+\r
+#define PROJECT_NAME_G3_7PIN  1  //项目宏定义\r
+\r
+\r
+// #define CONFIG_LVGL_SPAN 1\r
+// #define CONFIG_LVGL_FS_HELIOS 1\r
+// #define CONFIG_LVGL_GIF_DECODE 1\r
+// #define CONFIG_LVGL_SPINNER 1\r
+//#define CONFIG_LCD 1\r
+// #define CONFIG_LVGL_ANIMIMG 1\r
+// #define CONFIG_LVGL_KEYBOARD 1\r
+// #define CONFIG_LVGL_CALENDAR 1\r
+// #define CONFIG_LVGL_LED 1\r
+#define CONFIG_VIOCE_CALL 1\r
+// #define CONFIG_LVGL_FS_EXTFLASH_HELIOS 1\r
+// #define CONFIG_LVGL_TABVIEW 1\r
+//#define CONFIG_LVGL_LINE 1\r
+//#define CONFIG_LVGL 1\r
+// #define CONFIG_LVGL_CHART 1\r
+// #define CONFIG_LVGL_LIST 1\r
+// #define CONFIG_LVGL_MSGBOX 1\r
+// #define CONFIG_LVGL_ARC 1\r
+// #define CONFIG_LVGL_METER 1\r
+//#define CONFIG_LVGL_JPG_DECODE 1\r
+// #define CONFIG_LVGL_PNG_DECODE 1\r
+// #define CONFIG_LVGL_IMGBTN 1\r
+//#define CONFIG_GH301x 1\r
+//#define CONFIG_HX3918 1\r
+#define CONFIG_MBEDTLS 1\r
+//#define CONFIG_SC7A20 1\r
+// #define CONFIG_LVGL_WIN 1\r
+// #define CONFIG_LVGL_COLORWHEEL 1\r
+// #define CONFIG_LVGL_CANVAS 1\r
+// #define CONFIG_LVGL_SPINBOX 1\r
+// #define CONFIG_LVGL_QRCODE 1\r
+// #define CONFIG_LVGL_TILEVIEW 1\r
+// #define CONFIG_LVGL_HANDLER_TASK_PRIORITY 80\r
+//#define CONFIG_CAMERA 1\r
+//#define CONFIG_JPEG 1\r
+#define CONFIG_CAMERA_SAVEPHOTOS 1\r
+#define CONFIG_VAD 1\r
+//菊风视频通话\r
+//#define CONFIG_juphoon 1\r
index 343bad7..86ce1df 100644 (file)
@@ -1,15 +1,15 @@
-
-mainmenu "Helios SDK Configuration"
-
-menu "System Configuration"
-source "../system/config.in"
-endmenu
-
-menu "EG810MCN_GA_VOLTE"
-source "../services/microPython/config/config.in"
-source "../components/poc/poc_option.in"
-source "../components/GH301x/GH301x_option.in"
-source "../components/SC7A20/SC7A20_option.in"
-source "../components/juphoon/juphoon_option.in"
-endmenu
-
+\r
+mainmenu "Helios SDK Configuration"\r
+\r
+menu "System Configuration"\r
+source "../system/config.in"\r
+endmenu\r
+\r
+menu "EG810MCN_GA_VOLTE"\r
+source "../services/microPython/config/config.in"\r
+source "../components/poc/poc_option.in"\r
+source "../components/GH301x/GH301x_option.in"\r
+source "../components/SC7A20/SC7A20_option.in"\r
+source "../components/juphoon/juphoon_option.in"\r
+endmenu\r
+\r
index a1d5967..2dd020e 100644 (file)
@@ -1,66 +1,66 @@
-#
-# Automatically generated file; DO NOT EDIT.
-# Helios SDK Configuration
-#
-PROJECT_NAME_G3_7PIN=y
-#
-# System Configuration
-#
-CONFIG_MBEDTLS=y
-
-#
-# EG810MCN_GA_VOLTE
-#
-# CONFIG_LVGL=y
-
-#
-# lvgl option
-#
-# CONFIG_LVGL_PNG_DECODE=y
-# CONFIG_LVGL_GIF_DECODE is not set
-# CONFIG_LVGL_JPG_DECODE=y
-#CONFIG_LVGL_FS_HELIOS=y
-# CONFIG_LVGL_FS_SD_HELIOS is not set
-# CONFIG_LVGL_FS_EXTFLASH_HELIOS=y
-# CONFIG_LVGL_CUSTOMER_FONT_SUPPORT is not set
-# CONFIG_LVGL_QRCODE=y
-# CONFIG_LVGL_FONT is not set
-# CONFIG_LVGL_ARC is not set
-#CONFIG_LVGL_IMGBTN=y
-#CONFIG_LVGL_LINE=y
-#CONFIG_LVGL_LIST=y
-# CONFIG_LVGL_CHART is not set
-# CONFIG_LVGL_LED is not set
-# CONFIG_LVGL_CANVAS=y
-# CONFIG_LVGL_WIN=y
-# CONFIG_LVGL_TABVIEW is not set
-# CONFIG_LVGL_TILEVIEW=y
-# CONFIG_LVGL_MSGBOX=y
-# CONFIG_LVGL_METER is not set
-# CONFIG_LVGL_CALENDAR is not set
-# CONFIG_LVGL_SPINNER is not set
-# CONFIG_LVGL_SPINBOX is not set
-# CONFIG_LVGL_ANIMIMG is not set
-# CONFIG_LVGL_COLORWHEEL is not set
-# CONFIG_LVGL_KEYBOARD=y
-# CONFIG_LVGL_SPAN=y
-# CONFIG_LVGL_HANDLER_TASK_PRIORITY=80
-# CONFIG_QRCODE is not set
-#CONFIG_CAMERA=y
-# CONFIG_CAMERA_DECODE is not set
-CONFIG_CAMERA_SAVEPHOTOS=y
-# CONFIG_QUECTHING is not set
-# CONFIG_SPINAND is not set
-# CONFIG_RTMP is not set
-#CONFIG_JPEG=y
-# CONFIG_SPI_SDCARD is not set
-CONFIG_VIOCE_CALL=y
-# CONFIG_TTS is not set
-#CONFIG_LCD=y
-# CONFIG_UART_SLIP is not set
-# CONFIG_POC is not set
-#CONFIG_GH301x=y
-#CONFIG_HX3918=y
-#CONFIG_SC7A20=y
-CONFIG_VAD=y
-#CONFIG_juphoon=y
+#\r
+# Automatically generated file; DO NOT EDIT.\r
+# Helios SDK Configuration\r
+#\r
+PROJECT_NAME_G3_7PIN=y\r
+#\r
+# System Configuration\r
+#\r
+CONFIG_MBEDTLS=y\r
+\r
+#\r
+# EG810MCN_GA_VOLTE\r
+#\r
+# CONFIG_LVGL=y\r
+\r
+#\r
+# lvgl option\r
+#\r
+# CONFIG_LVGL_PNG_DECODE=y\r
+# CONFIG_LVGL_GIF_DECODE is not set\r
+# CONFIG_LVGL_JPG_DECODE=y\r
+#CONFIG_LVGL_FS_HELIOS=y\r
+# CONFIG_LVGL_FS_SD_HELIOS is not set\r
+# CONFIG_LVGL_FS_EXTFLASH_HELIOS=y\r
+# CONFIG_LVGL_CUSTOMER_FONT_SUPPORT is not set\r
+# CONFIG_LVGL_QRCODE=y\r
+# CONFIG_LVGL_FONT is not set\r
+# CONFIG_LVGL_ARC is not set\r
+#CONFIG_LVGL_IMGBTN=y\r
+#CONFIG_LVGL_LINE=y\r
+#CONFIG_LVGL_LIST=y\r
+# CONFIG_LVGL_CHART is not set\r
+# CONFIG_LVGL_LED is not set\r
+# CONFIG_LVGL_CANVAS=y\r
+# CONFIG_LVGL_WIN=y\r
+# CONFIG_LVGL_TABVIEW is not set\r
+# CONFIG_LVGL_TILEVIEW=y\r
+# CONFIG_LVGL_MSGBOX=y\r
+# CONFIG_LVGL_METER is not set\r
+# CONFIG_LVGL_CALENDAR is not set\r
+# CONFIG_LVGL_SPINNER is not set\r
+# CONFIG_LVGL_SPINBOX is not set\r
+# CONFIG_LVGL_ANIMIMG is not set\r
+# CONFIG_LVGL_COLORWHEEL is not set\r
+# CONFIG_LVGL_KEYBOARD=y\r
+# CONFIG_LVGL_SPAN=y\r
+# CONFIG_LVGL_HANDLER_TASK_PRIORITY=80\r
+# CONFIG_QRCODE is not set\r
+#CONFIG_CAMERA=y\r
+# CONFIG_CAMERA_DECODE is not set\r
+# CONFIG_CAMERA_SAVEPHOTOS=y\r
+# CONFIG_QUECTHING is not set\r
+# CONFIG_SPINAND is not set\r
+# CONFIG_RTMP is not set\r
+#CONFIG_JPEG=y\r
+# CONFIG_SPI_SDCARD is not set\r
+CONFIG_VIOCE_CALL=y\r
+# CONFIG_TTS is not set\r
+#CONFIG_LCD=y\r
+# CONFIG_UART_SLIP is not set\r
+# CONFIG_POC is not set\r
+#CONFIG_GH301x=y\r
+#CONFIG_HX3918=y\r
+#CONFIG_SC7A20=y\r
+CONFIG_VAD=y\r
+#CONFIG_juphoon=y\r
index ea734f6..1d007a2 100644 (file)
-/*
- * Copyright (c) Quectel Wireless Solution, Co., Ltd.All Rights Reserved.
- *  
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *  
- *     http://www.apache.org/licenses/LICENSE-2.0
- *  
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
- 
-#ifndef __MPCONFIGBOARD_H__
-#define __MPCONFIGBOARD_H__
-
-#define MICROPY_QPY_MODULE_ATCMD            (1)
-#define MICROPY_QPY_MODULE_UOS              (1)
-#define MICROPY_QPY_MODULE_MACHINE          (1)
-#define MICROPY_QPY_MODULE_USOCKET          (1)
-#define MICROPY_QPY_MODULE_MISC             (1)
-#define MICROPY_QPY_MODULE_OSTIMER          (1)
-#define MICROPY_QPY_MODULE_EXAMPLE          (1)
-#define MICROPY_QPY_MODULE_DATACALL         (1)
-#define MICROPY_QPY_MODULE_MODEM            (1)
-#define MICROPY_QPY_MODULE_UTIME            (1)
-#define MICROPY_QPY_MODULE_UTILS            (1)
-#define MICROPY_QPY_MODULE_HMACSHA1         (1)
-#define MICROPY_QPY_MODULE_SMS              (1)
-#define MICROPY_QPY_MODULE_SIM              (1)
-#define MICROPY_QPY_MODULE_DUALSIM          (1)
-#define MICROPY_QPY_MODULE_LPM              (1)
-#define MICROPY_QPY_MODULE_NET              (1)
-#define MICROPY_QPY_MODULE_CELLLOCATOR      (0)
-#define MICROPY_QPY_MODULE_CELLLOCATOR_QPY  (1)
-#define MICROPY_QPY_MODULE_AUDIO            (1)
-#define MICROPY_QPY_MODULE_FOTA             (1)
-#define MICROPY_QPY_MODULE_WIFISCAN         (1)
-#define MICROPY_QPY_MODULE_QUECGNSS         (1)
-#define MICROPY_QPY_MODULE_WIFILOCATOR      (1)
-#define MICROPY_QPY_MODULE_ETHERNET         (0)
-#define MICROPY_QPY_MODULE_SENSOR           (1)
-#define MICROPY_QPY_MODULE_SECUREDATA       (1)
-#define MICROPY_QPY_MODULE_SLIP             (0)
-#define MICROPY_QPY_MODULE_TP               (1)
-#define MICROPY_QPY_MODULE_AUDIOCODEC       (0)
-#define MICROPY_QPY_MODULE_CSD              (0)
-#define MICROPY_QPY_MODULE_LWM2M            (0)
-#define MICROPY_QPY_MODULE_NB               (0)
-#define MICROPY_QPY_MODULE_UHASHLIB         (1)
-#define MICROPY_QPY_MODULE_UCRYPTOLIB       (1)
-#define MICROPY_QPY_MODULE_ALIPAY           (0)
-#define MICROPY_QPY_MODULE_VFS_THREADSAFE   (1)
-#define MICROPY_QPY_CAMERA_LVGL_PREVIEW     (1)
-#if CONFIG_MBEDTLS
-    #define MICROPY_QPY_MODULE_USSL         (1)
-    #define MICROPY_QPY_SSL_MBEDTLS         (1)
-#endif
-
-#if CONFIG_QUECTHING
-    #define MICROPY_QPY_MODULE_QUECIOT          (1)
-#else
-    #define MICROPY_QPY_MODULE_QUECIOT          (0)
-#endif
-
-#if CONFIG_LVGL
-    #define MICROPY_QPY_MODULE_LVGL             (1)
-#else
-    #define MICROPY_QPY_MODULE_LVGL             (0)
-#endif
-
-#if CONFIG_CAMERA
-    #define MICROPY_QPY_MODULE_CAMERA           (1)
-#else
-    #define MICROPY_QPY_MODULE_CAMERA           (0)
-#endif
-
-#if CONFIG_RTMP
-    #define MICROPY_QPY_MODULE_RTMP             (1)
-#else
-    #define MICROPY_QPY_MODULE_RTMP             (0)
-#endif
-#if CONFIG_VIOCE_CALL
-    #define MICROPY_QPY_MODULE_VIOCE_CALL       (1)
-#else
-    #define MICROPY_QPY_MODULE_VIOCE_CALL       (0)
-#endif
-
-#if CONFIG_POC
-    #define MICROPY_QPY_MODULE_POC              (1)
-#else
-    #define MICROPY_QPY_MODULE_POC              (0)
-#endif
-#if CONFIG_QRCODE
-    #define MICROPY_QPY_MODULE_QRCODE           (1)
-#else
-    #define MICROPY_QPY_MODULE_QRCODE           (0)
-#endif
-
-#ifdef CONFIG_QUEC_PROJECT_FEATURE_BLE_GATT
-    #define MICROPY_QPY_MODULE_BLE              (1)
-#else
-    #define MICROPY_QPY_MODULE_BLE              (0)
-#endif
-
-#ifdef CONFIG_QUEC_PROJECT_FEATURE_CLASSIC_BT
-    #define MICROPY_QPY_MODULE_BT               (1)
-#else
-    #define MICROPY_QPY_MODULE_BT               (0)
-#endif
-
-
-//modmachine
-#if MICROPY_QPY_MODULE_MACHINE
-    #define MICROPY_QPY_MACHINE_TIMER           (1)
-    #define MICROPY_QPY_MACHINE_RTC             (1)
-    #define MICROPY_QPY_MACHINE_WDT             (1)
-    #define MICROPY_QPY_MACHINE_PIN             (1)
-    #define MICROPY_QPY_MACHINE_EXTINT          (1)
-    #define MICROPY_QPY_MACHINE_UART            (1)
-    #define MICROPY_QPY_MACHINE_SPI             (1)
-    #define MICROPY_QPY_MACHINE_I2C             (1)
-    #define MICROPY_QPY_MACHINE_I2C_SOFT        (1)
-    #ifdef CONFIG_LCD
-        #define MICROPY_QPY_MACHINE_LCD             (1)
-#else
-        #define MICROPY_QPY_MACHINE_LCD             (0)
-#endif
-    #define MICROPY_QPY_MACHINE_KEYPAD          (1)
-    #ifdef CONFIG_SPINAND
-        #define MICROPY_QPY_MACHINE_NANDFLASH       (1)
-    #else
-        #define MICROPY_QPY_MACHINE_NANDFLASH       (0)
-    #endif
-
-#if MICROPY_QPY_MACHINE_UART
-       #define MICROPY_QPY_UART4 (1)
-#endif
-
-#endif
-
-#if MICROPY_QPY_MODULE_MISC
-    #define MICROPY_QPY_MISC_POWER              (1)
-    #define MICROPY_QPY_MISC_ADC                (1)
-    #define MICROPY_QPY_MISC_POWERKEY           (1)
-    #define MICROPY_QPY_MISC_TEMPERATURE        (0)
-    #define MICROPY_QPY_MISC_PWM                (1)
-    #define MICROPY_QPY_MISC_USB                (1)
-    #define MICROPY_QPY_MISC_USBNET             (1)
-#endif
-
-#if MICROPY_QPY_MODULE_AUDIO
-    #define MICROPY_QPY_AUDIO_AUDIO             (1)
-    #if CONFIG_TTS
-        #define MICROPY_QPY_AUDIO_TTS               (1)
-    #else
-        #define MICROPY_QPY_AUDIO_TTS               (0)
-    #endif
-    #define MICROPY_QPY_AUDIO_RECORD            (1)
-#endif
-
-#if MICROPY_QPY_MODULE_ETHERNET
-    #define MICROPY_QPY_ETHERNET_DM9051         (0)
-    #define MICROPY_QPY_ETHERNET_W5500          (0)
-#endif
-
-#if MICROPY_QPY_MODULE_TP
-    #define MICROPY_QPY_TP_XPT2046              (0)
-    #define MICROPY_QPY_TP_GT9XX                (0)
-    #define MICROPY_QPY_TP_CST816               (1)
-#endif
-
-#if MICROPY_QPY_MODULE_AUDIOCODEC
-    #define MICROPY_QPY_AUDIOCODEC_RT5616       (0)
-#endif
-
-#if MICROPY_QPY_MODULE_SENSOR
-    #define MICROPY_QPY_SENSOR_SN95500          (0)
-       #define MICROPY_QPY_SENSOR_ICC_KEY                      (0)
-       #define MICROPY_QPY_SENSOR_GNSS                         (1)
-#endif
-
-#if MICROPY_QPY_MODULE_CAMERA
-    #define MICROPY_QPY_CAMERA_CAMPREVIEW       (1)
-    #if CONFIG_CAMERA_SAVEPHOTOS
-        #define MICROPY_QPY_CAMERA_CAMCAPTURE       (1)
-    #else
-        #define MICROPY_QPY_CAMERA_CAMCAPTURE       (0)
-    #endif
-    #ifdef CONFIG_CAMERA_DECODE
-        #define MICROPY_QPY_CAMERA_CAMSCANDECODE    (1)
-    #else
-        #define MICROPY_QPY_CAMERA_CAMSCANDECODE    (0)
-    #endif
-#endif
-
-#define MICROPY_QPY_DEVICE_REPORT           (1)
-
-/***********************micropython opts*******************************/
-#define MICROPY_QPY_DEBUG_PRINTERS                     (0)  //flash 4160 Byte
-#define MICROPY_QPY_PY_MATH                            (1)  //flash 14880 Byte
-#define MICROPY_QPY_PY_CMATH                           (0)  //flash 3136 Byte
-#define MICROPY_QPY_PY_USELECT                         (0)  //flash 1792 Byte
-#define MICROPY_QPY_PY_UCTYPES                         (0)  //flash 2816 Byte
-#define MICROPY_QPY_PY_UZLIB                           (0)  //flash 3072 Byte
-#define MICROPY_QPY_PY_UASYNCIO                        (0)  //flash 2048 Byte
-#define MICROPY_QPY_PY_ENABLE_WEBSERVER                        (0)  //flash 3424 Byte
-#define MICROPY_QPY_PERSISTENT_CODE_LOAD        (1)  //flash 2048 Byte
-#define MICROPY_QPY_EMIT_XTENSAWIN              (0)  //flash 19776 Byte
-#define MICROPY_QPY_MODULE_VFS_THREADSAFE       (1)
-#define MICROPY_QPY_GC_HEAP_SIZE       (1000 * 1024)
+/*\r
+ * Copyright (c) Quectel Wireless Solution, Co., Ltd.All Rights Reserved.\r
+ *  \r
+ * Licensed under the Apache License, Version 2.0 (the "License");\r
+ * you may not use this file except in compliance with the License.\r
+ * You may obtain a copy of the License at\r
+ *  \r
+ *     http://www.apache.org/licenses/LICENSE-2.0\r
+ *  \r
+ * Unless required by applicable law or agreed to in writing, software\r
+ * distributed under the License is distributed on an "AS IS" BASIS,\r
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ * See the License for the specific language governing permissions and\r
+ * limitations under the License.\r
+ */\r
+ \r
+#ifndef __MPCONFIGBOARD_H__\r
+#define __MPCONFIGBOARD_H__\r
+\r
+#define MICROPY_QPY_MODULE_ATCMD            (1)\r
+#define MICROPY_QPY_MODULE_UOS              (1)\r
+#define MICROPY_QPY_MODULE_MACHINE          (1)\r
+#define MICROPY_QPY_MODULE_USOCKET          (1)\r
+#define MICROPY_QPY_MODULE_MISC             (1)\r
+#define MICROPY_QPY_MODULE_OSTIMER          (1)\r
+#define MICROPY_QPY_MODULE_EXAMPLE          (1)\r
+#define MICROPY_QPY_MODULE_DATACALL         (1)\r
+#define MICROPY_QPY_MODULE_MODEM            (1)\r
+#define MICROPY_QPY_MODULE_UTIME            (1)\r
+#define MICROPY_QPY_MODULE_UTILS            (0)\r
+#define MICROPY_QPY_MODULE_HMACSHA1         (1)\r
+#define MICROPY_QPY_MODULE_SMS              (1)\r
+#define MICROPY_QPY_MODULE_SIM              (1)\r
+#define MICROPY_QPY_MODULE_DUALSIM          (0)\r
+#define MICROPY_QPY_MODULE_LPM              (1)\r
+#define MICROPY_QPY_MODULE_NET              (1)\r
+#define MICROPY_QPY_MODULE_CELLLOCATOR      (0)\r
+#define MICROPY_QPY_MODULE_CELLLOCATOR_QPY  (0)\r
+#define MICROPY_QPY_MODULE_AUDIO            (1)\r
+#define MICROPY_QPY_MODULE_FOTA             (1)\r
+#define MICROPY_QPY_MODULE_WIFISCAN         (1)\r
+#define MICROPY_QPY_MODULE_QUECGNSS         (1)\r
+#define MICROPY_QPY_MODULE_WIFILOCATOR      (0)\r
+#define MICROPY_QPY_MODULE_ETHERNET         (0)\r
+#define MICROPY_QPY_MODULE_SENSOR           (1)\r
+#define MICROPY_QPY_MODULE_SECUREDATA       (1)\r
+#define MICROPY_QPY_MODULE_SLIP             (0)\r
+#define MICROPY_QPY_MODULE_TP               (0)\r
+#define MICROPY_QPY_MODULE_AUDIOCODEC       (0)\r
+#define MICROPY_QPY_MODULE_CSD              (0)\r
+#define MICROPY_QPY_MODULE_LWM2M            (0)\r
+#define MICROPY_QPY_MODULE_NB               (0)\r
+#define MICROPY_QPY_MODULE_UHASHLIB         (1)\r
+#define MICROPY_QPY_MODULE_UCRYPTOLIB       (1)\r
+#define MICROPY_QPY_MODULE_ALIPAY           (0)\r
+#define MICROPY_QPY_MODULE_VFS_THREADSAFE   (1)\r
+#define MICROPY_QPY_CAMERA_LVGL_PREVIEW     (0)\r
+#if CONFIG_MBEDTLS\r
+    #define MICROPY_QPY_MODULE_USSL         (1)\r
+    #define MICROPY_QPY_SSL_MBEDTLS         (1)\r
+#endif\r
+\r
+#if CONFIG_QUECTHING\r
+    #define MICROPY_QPY_MODULE_QUECIOT          (1)\r
+#else\r
+    #define MICROPY_QPY_MODULE_QUECIOT          (0)\r
+#endif\r
+\r
+#if CONFIG_LVGL\r
+    #define MICROPY_QPY_MODULE_LVGL             (1)\r
+#else\r
+    #define MICROPY_QPY_MODULE_LVGL             (0)\r
+#endif\r
+\r
+#if CONFIG_CAMERA\r
+    #define MICROPY_QPY_MODULE_CAMERA           (1)\r
+#else\r
+    #define MICROPY_QPY_MODULE_CAMERA           (0)\r
+#endif\r
+\r
+#if CONFIG_RTMP\r
+    #define MICROPY_QPY_MODULE_RTMP             (1)\r
+#else\r
+    #define MICROPY_QPY_MODULE_RTMP             (0)\r
+#endif\r
+#if CONFIG_VIOCE_CALL\r
+    #define MICROPY_QPY_MODULE_VIOCE_CALL       (1)\r
+#else\r
+    #define MICROPY_QPY_MODULE_VIOCE_CALL       (0)\r
+#endif\r
+\r
+#if CONFIG_POC\r
+    #define MICROPY_QPY_MODULE_POC              (1)\r
+#else\r
+    #define MICROPY_QPY_MODULE_POC              (0)\r
+#endif\r
+#if CONFIG_QRCODE\r
+    #define MICROPY_QPY_MODULE_QRCODE           (1)\r
+#else\r
+    #define MICROPY_QPY_MODULE_QRCODE           (0)\r
+#endif\r
+\r
+#ifdef CONFIG_QUEC_PROJECT_FEATURE_BLE_GATT\r
+    #define MICROPY_QPY_MODULE_BLE              (1)\r
+#else\r
+    #define MICROPY_QPY_MODULE_BLE              (0)\r
+#endif\r
+\r
+#ifdef CONFIG_QUEC_PROJECT_FEATURE_CLASSIC_BT\r
+    #define MICROPY_QPY_MODULE_BT               (1)\r
+#else\r
+    #define MICROPY_QPY_MODULE_BT               (0)\r
+#endif\r
+\r
+\r
+//modmachine\r
+#if MICROPY_QPY_MODULE_MACHINE\r
+    #define MICROPY_QPY_MACHINE_TIMER           (1)\r
+    #define MICROPY_QPY_MACHINE_RTC             (1)\r
+    #define MICROPY_QPY_MACHINE_WDT             (1)\r
+    #define MICROPY_QPY_MACHINE_PIN             (1)\r
+    #define MICROPY_QPY_MACHINE_EXTINT          (1)\r
+    #define MICROPY_QPY_MACHINE_UART            (1)\r
+    #define MICROPY_QPY_MACHINE_SPI             (1)\r
+    #define MICROPY_QPY_MACHINE_I2C             (1)\r
+    #define MICROPY_QPY_MACHINE_I2C_SOFT        (1)\r
+    #ifdef CONFIG_LCD\r
+        #define MICROPY_QPY_MACHINE_LCD             (1)\r
+#else\r
+        #define MICROPY_QPY_MACHINE_LCD             (0)\r
+#endif\r
+    #define MICROPY_QPY_MACHINE_KEYPAD          (1)\r
+    #ifdef CONFIG_SPINAND\r
+        #define MICROPY_QPY_MACHINE_NANDFLASH       (1)\r
+    #else\r
+        #define MICROPY_QPY_MACHINE_NANDFLASH       (0)\r
+    #endif\r
+\r
+#if MICROPY_QPY_MACHINE_UART\r
+       #define MICROPY_QPY_UART4 (1)\r
+#endif\r
+\r
+#endif\r
+\r
+#if MICROPY_QPY_MODULE_MISC\r
+    #define MICROPY_QPY_MISC_POWER              (1)\r
+    #define MICROPY_QPY_MISC_ADC                (1)\r
+    #define MICROPY_QPY_MISC_POWERKEY           (1)\r
+    #define MICROPY_QPY_MISC_TEMPERATURE        (0)\r
+    #define MICROPY_QPY_MISC_PWM                (1)\r
+    #define MICROPY_QPY_MISC_USB                (1)\r
+    #define MICROPY_QPY_MISC_USBNET             (1)\r
+#endif\r
+\r
+#if MICROPY_QPY_MODULE_AUDIO\r
+    #define MICROPY_QPY_AUDIO_AUDIO             (1)\r
+    #if CONFIG_TTS\r
+        #define MICROPY_QPY_AUDIO_TTS               (1)\r
+    #else\r
+        #define MICROPY_QPY_AUDIO_TTS               (0)\r
+    #endif\r
+    #define MICROPY_QPY_AUDIO_RECORD            (1)\r
+#endif\r
+\r
+#if MICROPY_QPY_MODULE_ETHERNET\r
+    #define MICROPY_QPY_ETHERNET_DM9051         (0)\r
+    #define MICROPY_QPY_ETHERNET_W5500          (0)\r
+#endif\r
+\r
+#if MICROPY_QPY_MODULE_TP\r
+    #define MICROPY_QPY_TP_XPT2046              (0)\r
+    #define MICROPY_QPY_TP_GT9XX                (0)\r
+    #define MICROPY_QPY_TP_CST816               (1)\r
+#endif\r
+\r
+#if MICROPY_QPY_MODULE_AUDIOCODEC\r
+    #define MICROPY_QPY_AUDIOCODEC_RT5616       (0)\r
+#endif\r
+\r
+#if MICROPY_QPY_MODULE_SENSOR\r
+    #define MICROPY_QPY_SENSOR_SN95500          (0)\r
+       #define MICROPY_QPY_SENSOR_ICC_KEY                      (0)\r
+       #define MICROPY_QPY_SENSOR_GNSS                         (1)\r
+#endif\r
+\r
+#if MICROPY_QPY_MODULE_CAMERA\r
+    #define MICROPY_QPY_CAMERA_CAMPREVIEW       (1)\r
+    #if CONFIG_CAMERA_SAVEPHOTOS\r
+        #define MICROPY_QPY_CAMERA_CAMCAPTURE       (1)\r
+    #else\r
+        #define MICROPY_QPY_CAMERA_CAMCAPTURE       (0)\r
+    #endif\r
+    #ifdef CONFIG_CAMERA_DECODE\r
+        #define MICROPY_QPY_CAMERA_CAMSCANDECODE    (1)\r
+    #else\r
+        #define MICROPY_QPY_CAMERA_CAMSCANDECODE    (0)\r
+    #endif\r
+#endif\r
+\r
+#define MICROPY_QPY_DEVICE_REPORT           (1)\r
+\r
+/***********************micropython opts*******************************/\r
+#define MICROPY_QPY_DEBUG_PRINTERS                     (0)  //flash 4160 Byte\r
+#define MICROPY_QPY_PY_MATH                            (1)  //flash 14880 Byte\r
+#define MICROPY_QPY_PY_CMATH                           (0)  //flash 3136 Byte\r
+#define MICROPY_QPY_PY_USELECT                         (0)  //flash 1792 Byte\r
+#define MICROPY_QPY_PY_UCTYPES                         (0)  //flash 2816 Byte\r
+#define MICROPY_QPY_PY_UZLIB                           (0)  //flash 3072 Byte\r
+#define MICROPY_QPY_PY_UASYNCIO                        (0)  //flash 2048 Byte\r
+#define MICROPY_QPY_PY_ENABLE_WEBSERVER                        (0)  //flash 3424 Byte\r
+#define MICROPY_QPY_PERSISTENT_CODE_LOAD        (1)  //flash 2048 Byte\r
+#define MICROPY_QPY_EMIT_XTENSAWIN              (0)  //flash 19776 Byte\r
+#define MICROPY_QPY_MODULE_VFS_THREADSAFE       (1)\r
+#define MICROPY_QPY_GC_HEAP_SIZE       (1000 * 1024)\r
 #endif
\ No newline at end of file
index 33e3ed4..80c7a39 100644 (file)
@@ -1,11 +1,11 @@
-
-#ifndef __APP_LINK_START_ADDR_H__
-#define __APP_LINK_START_ADDR_H__
-
-#define APP_LINK_START_ADDR  0x80521000
-#define APP_FLASH_MAX_SIZE 0x120000
-
-#define APP_RAM_START 0x7E3E0000
-#define APP_RAM_MAX_SIZE 0x180000
-
-#endif
+\r
+#ifndef __APP_LINK_START_ADDR_H__\r
+#define __APP_LINK_START_ADDR_H__\r
+\r
+#define APP_LINK_START_ADDR  0x80521000\r
+#define APP_FLASH_MAX_SIZE 0x120000\r
+\r
+#define APP_RAM_START 0x7E3E0000\r
+#define APP_RAM_MAX_SIZE 0x180000\r
+\r
+#endif\r
index 68ba3ff..013be00 100644 (file)
@@ -1,2 +1,2 @@
-import main_init 
+import main_init \r
 main_init.main_init()
\ No newline at end of file