From: p15692025051 <846603105@qq.com> Date: Tue, 15 Jul 2025 02:37:45 +0000 (+0800) Subject: 7ping1.5初始化 X-Git-Url: http://git.snicker.com.cn/Users/apple/Desktop/static/gitweb.css?a=commitdiff_plain;h=a4c087778e2b62123579fb907424e9104512b8ba;p=mirrors%2FASR1603_G5.git 7ping1.5初始化 --- diff --git a/2.sdk/project/7PIN_1_5/audio.bin b/2.sdk/project/7PIN_1_5/audio.bin new file mode 100644 index 00000000..e02e6afe Binary files /dev/null and b/2.sdk/project/7PIN_1_5/audio.bin differ diff --git a/2.sdk/project/7PIN_1_5/audio/IMEIhao.mp3 b/2.sdk/project/7PIN_1_5/audio/IMEIhao.mp3 new file mode 100644 index 00000000..a3d5ab1a Binary files /dev/null and b/2.sdk/project/7PIN_1_5/audio/IMEIhao.mp3 differ diff --git a/2.sdk/project/7PIN_1_5/audio/Low_power_warning.mp3 b/2.sdk/project/7PIN_1_5/audio/Low_power_warning.mp3 new file mode 100644 index 00000000..8308a76f Binary files /dev/null and b/2.sdk/project/7PIN_1_5/audio/Low_power_warning.mp3 differ diff --git a/2.sdk/project/7PIN_1_5/audio/R_CHARGE_FULL.mp3 b/2.sdk/project/7PIN_1_5/audio/R_CHARGE_FULL.mp3 new file mode 100644 index 00000000..3a777914 Binary files /dev/null and b/2.sdk/project/7PIN_1_5/audio/R_CHARGE_FULL.mp3 differ diff --git a/2.sdk/project/7PIN_1_5/audio/R_CHARGE_IN.mp3 b/2.sdk/project/7PIN_1_5/audio/R_CHARGE_IN.mp3 new file mode 100644 index 00000000..f728271b Binary files /dev/null and b/2.sdk/project/7PIN_1_5/audio/R_CHARGE_IN.mp3 differ diff --git a/2.sdk/project/7PIN_1_5/audio/R_CHARGE_OUT.mp3 b/2.sdk/project/7PIN_1_5/audio/R_CHARGE_OUT.mp3 new file mode 100644 index 00000000..cb7349dc Binary files /dev/null and b/2.sdk/project/7PIN_1_5/audio/R_CHARGE_OUT.mp3 differ diff --git a/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_0.mp3 b/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_0.mp3 new file mode 100644 index 00000000..ef1e1e62 Binary files /dev/null and b/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_0.mp3 differ diff --git a/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_1.mp3 b/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_1.mp3 new file mode 100644 index 00000000..b11b6c9d Binary files /dev/null and b/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_1.mp3 differ diff --git a/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_2.mp3 b/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_2.mp3 new file mode 100644 index 00000000..33b95860 Binary files /dev/null and b/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_2.mp3 differ diff --git a/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_3.mp3 b/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_3.mp3 new file mode 100644 index 00000000..238cce3f Binary files /dev/null and b/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_3.mp3 differ diff --git a/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_4.mp3 b/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_4.mp3 new file mode 100644 index 00000000..fc240357 Binary files /dev/null and b/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_4.mp3 differ diff --git a/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_5.mp3 b/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_5.mp3 new file mode 100644 index 00000000..f7121cd5 Binary files /dev/null and b/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_5.mp3 differ diff --git a/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_6.mp3 b/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_6.mp3 new file mode 100644 index 00000000..a25d7231 Binary files /dev/null and b/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_6.mp3 differ diff --git a/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_7.mp3 b/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_7.mp3 new file mode 100644 index 00000000..6db018c1 Binary files /dev/null and b/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_7.mp3 differ diff --git a/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_8.mp3 b/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_8.mp3 new file mode 100644 index 00000000..010b21e6 Binary files /dev/null and b/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_8.mp3 differ diff --git a/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_9.mp3 b/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_9.mp3 new file mode 100644 index 00000000..daee9a2e Binary files /dev/null and b/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_9.mp3 differ diff --git a/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_A.mp3 b/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_A.mp3 new file mode 100644 index 00000000..9e3b496b Binary files /dev/null and b/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_A.mp3 differ diff --git a/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_B.mp3 b/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_B.mp3 new file mode 100644 index 00000000..afb6dcd8 Binary files /dev/null and b/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_B.mp3 differ diff --git a/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_C.mp3 b/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_C.mp3 new file mode 100644 index 00000000..8f8e258e Binary files /dev/null and b/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_C.mp3 differ diff --git a/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_D.mp3 b/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_D.mp3 new file mode 100644 index 00000000..d6fbbc43 Binary files /dev/null and b/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_D.mp3 differ diff --git a/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_E.mp3 b/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_E.mp3 new file mode 100644 index 00000000..95939c59 Binary files /dev/null and b/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_E.mp3 differ diff --git a/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_F.mp3 b/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_F.mp3 new file mode 100644 index 00000000..2325b443 Binary files /dev/null and b/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_F.mp3 differ diff --git a/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_G.mp3 b/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_G.mp3 new file mode 100644 index 00000000..94ff84fb Binary files /dev/null and b/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_G.mp3 differ diff --git a/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_H.mp3 b/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_H.mp3 new file mode 100644 index 00000000..72b95a87 Binary files /dev/null and b/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_H.mp3 differ diff --git a/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_I.mp3 b/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_I.mp3 new file mode 100644 index 00000000..e33c235e Binary files /dev/null and b/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_I.mp3 differ diff --git a/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_J.mp3 b/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_J.mp3 new file mode 100644 index 00000000..f40ce369 Binary files /dev/null and b/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_J.mp3 differ diff --git a/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_K.mp3 b/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_K.mp3 new file mode 100644 index 00000000..7b6e8f58 Binary files /dev/null and b/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_K.mp3 differ diff --git a/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_L.mp3 b/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_L.mp3 new file mode 100644 index 00000000..9ba631b2 Binary files /dev/null and b/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_L.mp3 differ diff --git a/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_M.mp3 b/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_M.mp3 new file mode 100644 index 00000000..63a1d507 Binary files /dev/null and b/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_M.mp3 differ diff --git a/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_N.mp3 b/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_N.mp3 new file mode 100644 index 00000000..5dd67d3c Binary files /dev/null and b/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_N.mp3 differ diff --git a/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_O.mp3 b/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_O.mp3 new file mode 100644 index 00000000..773b0446 Binary files /dev/null and b/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_O.mp3 differ diff --git a/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_P.mp3 b/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_P.mp3 new file mode 100644 index 00000000..116774a0 Binary files /dev/null and b/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_P.mp3 differ diff --git a/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_Q.mp3 b/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_Q.mp3 new file mode 100644 index 00000000..c4567c13 Binary files /dev/null and b/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_Q.mp3 differ diff --git a/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_R.mp3 b/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_R.mp3 new file mode 100644 index 00000000..3b4b93e5 Binary files /dev/null and b/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_R.mp3 differ diff --git a/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_S.mp3 b/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_S.mp3 new file mode 100644 index 00000000..d5ab4bd6 Binary files /dev/null and b/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_S.mp3 differ diff --git a/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_T.mp3 b/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_T.mp3 new file mode 100644 index 00000000..02a7d019 Binary files /dev/null and b/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_T.mp3 differ diff --git a/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_U.mp3 b/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_U.mp3 new file mode 100644 index 00000000..d08163ba Binary files /dev/null and b/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_U.mp3 differ diff --git a/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_V.mp3 b/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_V.mp3 new file mode 100644 index 00000000..72b78db6 Binary files /dev/null and b/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_V.mp3 differ diff --git a/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_W.mp3 b/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_W.mp3 new file mode 100644 index 00000000..13fbd530 Binary files /dev/null and b/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_W.mp3 differ diff --git a/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_X.mp3 b/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_X.mp3 new file mode 100644 index 00000000..e58fd7b4 Binary files /dev/null and b/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_X.mp3 differ diff --git a/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_Y.mp3 b/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_Y.mp3 new file mode 100644 index 00000000..4d6ba45a Binary files /dev/null and b/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_Y.mp3 differ diff --git a/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_Z.mp3 b/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_Z.mp3 new file mode 100644 index 00000000..f5a10c26 Binary files /dev/null and b/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_Z.mp3 differ diff --git a/2.sdk/project/7PIN_1_5/audio/chaobingfatis.mp3 b/2.sdk/project/7PIN_1_5/audio/chaobingfatis.mp3 new file mode 100644 index 00000000..ed46c4f8 Binary files /dev/null and b/2.sdk/project/7PIN_1_5/audio/chaobingfatis.mp3 differ diff --git a/2.sdk/project/7PIN_1_5/audio/chenggong.mp3 b/2.sdk/project/7PIN_1_5/audio/chenggong.mp3 new file mode 100644 index 00000000..23a28b7e Binary files /dev/null and b/2.sdk/project/7PIN_1_5/audio/chenggong.mp3 differ diff --git a/2.sdk/project/7PIN_1_5/audio/didianguanji.mp3 b/2.sdk/project/7PIN_1_5/audio/didianguanji.mp3 new file mode 100644 index 00000000..00f82796 Binary files /dev/null and b/2.sdk/project/7PIN_1_5/audio/didianguanji.mp3 differ diff --git a/2.sdk/project/7PIN_1_5/audio/jianquancuowu.mp3 b/2.sdk/project/7PIN_1_5/audio/jianquancuowu.mp3 new file mode 100644 index 00000000..2b376798 Binary files /dev/null and b/2.sdk/project/7PIN_1_5/audio/jianquancuowu.mp3 differ diff --git a/2.sdk/project/7PIN_1_5/audio/key_prompt.mp3 b/2.sdk/project/7PIN_1_5/audio/key_prompt.mp3 new file mode 100644 index 00000000..2baf48b2 Binary files /dev/null and b/2.sdk/project/7PIN_1_5/audio/key_prompt.mp3 differ diff --git a/2.sdk/project/7PIN_1_5/audio/liuliangtishi.mp3 b/2.sdk/project/7PIN_1_5/audio/liuliangtishi.mp3 new file mode 100644 index 00000000..0e28be68 Binary files /dev/null and b/2.sdk/project/7PIN_1_5/audio/liuliangtishi.mp3 differ diff --git a/2.sdk/project/7PIN_1_5/audio/send_tone.mp3 b/2.sdk/project/7PIN_1_5/audio/send_tone.mp3 new file mode 100644 index 00000000..42cef222 Binary files /dev/null and b/2.sdk/project/7PIN_1_5/audio/send_tone.mp3 differ diff --git a/2.sdk/project/7PIN_1_5/audio/shouhou.mp3 b/2.sdk/project/7PIN_1_5/audio/shouhou.mp3 new file mode 100644 index 00000000..9b72f65c Binary files /dev/null and b/2.sdk/project/7PIN_1_5/audio/shouhou.mp3 differ diff --git a/2.sdk/project/7PIN_1_5/audio/xinhaoruo1.mp3 b/2.sdk/project/7PIN_1_5/audio/xinhaoruo1.mp3 new file mode 100644 index 00000000..2c497118 Binary files /dev/null and b/2.sdk/project/7PIN_1_5/audio/xinhaoruo1.mp3 differ diff --git a/2.sdk/project/7PIN_1_5/audio/zhengzaiguanji.mp3 b/2.sdk/project/7PIN_1_5/audio/zhengzaiguanji.mp3 new file mode 100644 index 00000000..0f59a860 Binary files /dev/null and b/2.sdk/project/7PIN_1_5/audio/zhengzaiguanji.mp3 differ diff --git a/2.sdk/project/7PIN_1_5/images/customer_fs.bin b/2.sdk/project/7PIN_1_5/images/customer_fs.bin new file mode 100644 index 00000000..4633dda0 Binary files /dev/null and b/2.sdk/project/7PIN_1_5/images/customer_fs.bin differ diff --git a/2.sdk/project/7PIN_1_5/list.json b/2.sdk/project/7PIN_1_5/list.json new file mode 100644 index 00000000..af90ba1e --- /dev/null +++ b/2.sdk/project/7PIN_1_5/list.json @@ -0,0 +1 @@ +['chaobingfatis', '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'] \ No newline at end of file diff --git a/2.sdk/project/7PIN_1_5/merge_bin.py b/2.sdk/project/7PIN_1_5/merge_bin.py new file mode 100644 index 00000000..c12eb7ae --- /dev/null +++ b/2.sdk/project/7PIN_1_5/merge_bin.py @@ -0,0 +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 + +output_list = merge_bin(".\\usr\\static\\audio.bin", ".\\audio\\") \ No newline at end of file diff --git a/2.sdk/project/7PIN_1_5/new.bat b/2.sdk/project/7PIN_1_5/new.bat new file mode 100644 index 00000000..bd2d9eaa --- /dev/null +++ b/2.sdk/project/7PIN_1_5/new.bat @@ -0,0 +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 .. +:exit \ No newline at end of file diff --git a/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/EventMesh.py b/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/EventMesh.py new file mode 100644 index 00000000..912b3d07 --- /dev/null +++ b/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/EventMesh.py @@ -0,0 +1,133 @@ +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") diff --git a/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/Makefile b/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/Makefile new file mode 100644 index 00000000..80fbcdd2 --- /dev/null +++ b/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/Makefile @@ -0,0 +1,1177 @@ +# 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 \ + +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. diff --git "a/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/TTS\351\237\263\351\242\221\347\224\237\346\210\220.py" "b/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/TTS\351\237\263\351\242\221\347\224\237\346\210\220.py" new file mode 100644 index 00000000..9c1eb2e8 --- /dev/null +++ "b/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/TTS\351\237\263\351\242\221\347\224\237\346\210\220.py" @@ -0,0 +1,124 @@ + +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): +# websocket_connect_tts("/usr/static/R_READ_TIME_{}.mp3".format(i),"{}".format(i)) \ No newline at end of file diff --git a/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/ai_VC.py b/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/ai_VC.py new file mode 100644 index 00000000..a60a2a78 --- /dev/null +++ b/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/ai_VC.py @@ -0,0 +1,4231 @@ +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 +try: + import VAD +except Exception as e: + usys.print_exception(e) +try: + import usr.ai_alarm as _ai_alarm +except Exception as e: + usys.print_exception(e) + import ai_alarm as _ai_alarm +#dev_type = "G10" +dev_type = "7PIN_BK"#小瑞 +#dev_type = "7PIN_BK_coze"#k扣子小瑞 +#dev_type = "7PIN_BK_EU"#英文小瑞 +#dev_type = "7PIN_coze"#柒牌扣子 +#dev_type = "7PIN"#柒牌 +#dev_type = 'momo'#食梦貘 +#dev_type = 'sjgq'#四季甘泉 +#dev_type = 'szbst'#深圳百事通 +#dev_type = 'jswm'#金三完美 +#dev_type = 'jswm_BOX'#金三完美柒牌盒子 +#dev_type = 'csh'#慈善会 +class AI_led(Abstract): + def __init__(self): + if dev_type == "G10" or dev_type == 'jswm': + 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) + elif dev_type == "7PIN_BK_EU": + 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_green = Pin(Pin.GPIO8, Pin.OUT, Pin.PULL_PD, 1) + self.led_blue = Pin(Pin.GPIO19, 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) +def set_ipv4_datacall(): + # 获取第一路的APN,ipType 等信息 + pdpCtx = dataCall.getPDPContext(1) + if pdpCtx != -1: + if pdpCtx[0] != 0: + # 如果不是用户需要的ipv4,使用如下方式配置,使用如下方式配置 + ret = dataCall.setPDPContext(1, 0,pdpCtx[1],pdpCtx[2],pdpCtx[3],pdpCtx[4]) + if ret == 0: + print('配置成功。') + # cfun0/1后按照配置的信息进行拨号 + net.setModemFun(0) + net.setModemFun(1) + else: + print('配置失败。') + else: + print('已经配置为IPv4') + else: + print('获取PDP Context失败。') +audio_buf = ['chaobingfatis', '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): + # if(dev_type != "7PIN"): + # set_ipv4_datacall() + self.is_wdt = 0 #是否开启看门狗 + #AT+QDAI=1,0,0,1,0,0,1,1PCM音频输出设置为主模式、短同步、16 kHz采样率和256 kHz时钟频率,采样位深为16bit,使用的时间间隙数量为1,并且使用第一个时间间隙。 + audio.set_qdai_cfg(1,0,0,2,0,1,1,1) + 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) + elif dev_type == 'jswm': + self.extint_AI = ExtInt(ExtInt.GPIO26,ExtInt.IRQ_RISING_FALLING, ExtInt.PULL_PU, self.keyAI_extint_cb) + self.pwk_key = ExtInt(ExtInt.GPIO19, ExtInt.IRQ_RISING_FALLING, ExtInt.PULL_PU, self.pwk_extint_cb) + elif dev_type == "7PIN_BK_EU": + self.pwk_key = ExtInt(ExtInt.GPIO41, ExtInt.IRQ_RISING_FALLING, ExtInt.PULL_PU, self.pwk_extint_cb) + self.extint_AI = ExtInt(ExtInt.GPIO5,ExtInt.IRQ_RISING_FALLING, ExtInt.PULL_PU, self.keyAI_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)) + if "data" in data : + print(data["data"]) + 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" or dev_type == "7PIN_BK_EU"or dev_type == "7PIN_BK_coze": + 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" or dev_type == "7PIN_coze" : + 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 : #长按1s + 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}) + elif self.KeyAI_timer_count >= 10*8:#关机 + if dev_type == 'jswm' or dev_type == 'jswm_BOX': + 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() + if self.KeyAI_status == 1:#松开 + #print("KeyAI_timer_cb:{}".format(self.KeyAI_timer_count)) + key_count = 5 + if dev_type == "7PIN_BK"or dev_type == "7PIN_BK_EU"or dev_type == "7PIN_BK_coze": + 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): + #EventMesh.publish("audio_montage_play",["liuliangtishi.mp3"]) + 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= 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["20"]and VC_satrt_flag == 0:#没有充电,电量又正常,关灯 + EventMesh.publish("close_led") + + if self.usb_status == 0 and Vbatt= 8640:#24小时没按键,则关机 + self.pwk_key_Long_Press() + + def get_battery(self, event=None, msg=None): + Vbatt = Power.getVbatt() + if Vbatt>self.VBATT_tab["90"]: + return 100 + if Vbatt>self.VBATT_tab["80"]: + return 90 + if Vbatt>self.VBATT_tab["60"]: + return 80 + if Vbatt>self.VBATT_tab["40"]: + return 60 + if Vbatt>self.VBATT_tab["20"]: + return 40 + if Vbatt>self.VBATT_tab["10"]: + return 20 + if Vbatt<=self.VBATT_tab["10"]: + return 10 + def audio_montage_play(self,event,msg): + self.aud.stopPlayStream() + self.aud.stopAll() + str_data='mp3files=' + for i in msg: + try: + str_tmp = i.replace(".mp3","") + str_data+="{}.mp3+".format(audio_buf.index(str_tmp)) + except Exception as e: + usys.print_exception(e) + str_data = str_data[:-1] + print("audio_montage_play:{}".format(str_data)) + self.aud.montage_play('U:/static/audio.bin',1,1,str_data) + + def paly_iccid_imei(self,event,msg): + str_data = 'mp3files={}.mp3+'.format(audio_buf.index("liuliangtishi"))#流量提示 + imei = modem.getDevImei() + iccid = sim.getIccid() + print("paly_iccid_imei:ICCID:{}".format(iccid)) + if iccid != -1 and len(iccid) > 5: + iccid = iccid.upper() + if len(iccid) <20: + for i in range(20-len(iccid)): + iccid = "0"+iccid + str_data += '{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+'.format(audio_buf.index("R_READ_TIME_{}".format(iccid[0]))\ + ,audio_buf.index("R_READ_TIME_{}".format(iccid[1])),audio_buf.index("R_READ_TIME_{}".format(iccid[2])),audio_buf.index("R_READ_TIME_{}".format(iccid[3])),\ + audio_buf.index("R_READ_TIME_{}".format(iccid[4])),audio_buf.index("R_READ_TIME_{}".format(iccid[5])),audio_buf.index("R_READ_TIME_{}".format(iccid[6])),audio_buf.index("R_READ_TIME_{}".format(iccid[7])),\ + audio_buf.index("R_READ_TIME_{}".format(iccid[8])),audio_buf.index("R_READ_TIME_{}".format(iccid[9])),audio_buf.index("R_READ_TIME_{}".format(iccid[10])),audio_buf.index("R_READ_TIME_{}".format(iccid[11])),\ + audio_buf.index("R_READ_TIME_{}".format(iccid[12])),audio_buf.index("R_READ_TIME_{}".format(iccid[13])),audio_buf.index("R_READ_TIME_{}".format(iccid[14])),audio_buf.index("R_READ_TIME_{}".format(iccid[15])),\ + audio_buf.index("R_READ_TIME_{}".format(iccid[16])),audio_buf.index("R_READ_TIME_{}".format(iccid[17])),audio_buf.index("R_READ_TIME_{}".format(iccid[18])),audio_buf.index("R_READ_TIME_{}".format(iccid[19]))) + str_data += '{}.mp3+'.format(audio_buf.index("shouhou"))#可联系售后解决,联系方式见售后客服电话是400-886-8777或到微信公众号柒牌SEVENBRAND自行充值: + self.aud.montage_play('U:/static/audio.bin',1,1,str_data) + #鉴权出错,播放imei号 + def paly_device_res_error(self,event,msg): + str_data = 'mp3files={}.mp3+'.format(audio_buf.index("jianquancuowu"))#AI功能异常,请联系客户查询,设备号为: + imei = modem.getDevImei() + imei = imei.upper() + str_data += '{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(imei[0]))\ + ,audio_buf.index("R_READ_TIME_{}".format(imei[1])),audio_buf.index("R_READ_TIME_{}".format(imei[2])),audio_buf.index("R_READ_TIME_{}".format(imei[3])),\ + audio_buf.index("R_READ_TIME_{}".format(imei[4])),audio_buf.index("R_READ_TIME_{}".format(imei[5])),audio_buf.index("R_READ_TIME_{}".format(imei[6])),audio_buf.index("R_READ_TIME_{}".format(imei[7])),\ + audio_buf.index("R_READ_TIME_{}".format(imei[8])),audio_buf.index("R_READ_TIME_{}".format(imei[9])),audio_buf.index("R_READ_TIME_{}".format(imei[10])),audio_buf.index("R_READ_TIME_{}".format(imei[11])),\ + audio_buf.index("R_READ_TIME_{}".format(imei[12])),audio_buf.index("R_READ_TIME_{}".format(imei[13])),audio_buf.index("R_READ_TIME_{}".format(imei[14]))) + #print("str_data:{}".format(str_data)) + self.aud.montage_play('U:/static/audio.bin',1,1,str_data) + +#存储信息 +class getStorageDataManager(Abstract):#获取内存数据 + def __init__(self): + self.config_data = {} + check = ql_fs.path_exists("/usr/static/storage_file/config.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" + # if dev_type == 'jswm' or dev_type == 'jswm_BOX':#金三完美 + # self.key = b"FuXG4ptpGbzvKbdB4vpUypisbENgy2nB" + # self.pid = "DieBeXahZHLrjSnORbgN" + 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 =None + if dev_type == "7PIN_BK_EU":#英文小瑞 + url = "http://dmp-global.raisound.com/bz-api/dev/time" + else: + 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 =None + if dev_type == "7PIN_BK_EU":#英文小瑞 + url = "http://dmp-global.raisound.com/bz-api/dev/auth/active" + else: + 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 =None + if dev_type == "7PIN_BK_EU":#英文小瑞 + sign_url = "http://dmp-global.raisound.com/bz-api/dev/auth/sign_in" #登入地址 + else: + 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"] + else:#报错清空密钥 + print("登录失败,清空密钥") + EventMesh.publish("set_storage_config",["dev_pass",""]) + 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 =None + if dev_type == "7PIN_BK_EU":#英文小瑞 + dev_tokenip = "http://dmp-global.raisound.com/bz-api/dev/auth/token" #设备新令牌更新地址 + else: + 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 =None + if dev_type == "7PIN_BK_EU":#英文小瑞 + url = "http://dmp-global.raisound.com/bz-api/ota/task?deviceId={}&sourceVersion={}".format(modem.getDevImei(),sourceVersion) + if dev_type == "7PIN" or dev_type == "7PIN_coze":#柒牌 + url = "http://ota.qipai.com/bz-cmp-api/api/task?deviceId={}&sourceVersion={}".format(modem.getDevImei(),sourceVersion) + else: + 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("OTA升级请求:{}".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 =None + if dev_type == "7PIN_BK_EU":#英文小瑞 + url = "http://dmp-global.raisound.com/bz-api/ota/result?deviceId={}¤tVersion={}".format(modem.getDevImei(),currentVersion) + if dev_type == "7PIN" or dev_type == "7PIN_coze":#柒牌 + url = "http://ota.qipai.com/bz-cmp-api/api/result?deviceId={}¤tVersion={}".format(modem.getDevImei(),currentVersion) + else: + url = "http://dmp.raisound.com/bz-api/ota/result?deviceId={}¤tVersion={}".format(modem.getDevImei(),currentVersion) + print(url) + response = request.post(url,timeout=5) + if response.status_code == 200: + data = response.json() + print("OTA升级结果上报:{}".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'} + token = EventMesh.publish("get_dev_token") + headers_T = None + if token: + headers_T = {"bz-dt":"{}".format(token)} + #http://dmp.raisound.com/bz-api/dev/iccid?deviceId=866610001099679&iccid=89860002192307889057 + url =None + if dev_type == "7PIN_BK_EU":#英文小瑞 + url = "http://dmp-global.raisound.com/bz-api/dev/iccid?deviceId={}&iccid={}".format(modem.getDevImei(),iccid) + else: + url = "http://dmp.raisound.com/bz-api/dev/iccid?deviceId={}&iccid={}".format(modem.getDevImei(),iccid) + print("{} H:{}".format(url,headers_T)) + response = request.post(url,headers = headers_T,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): + # import voiceCall + # voiceCall.callStart("10086") + # return + + 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 = 1 #是否开启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时,连续对话播放完音频就退出 + EventMesh.subscribe("play_tts",self.play_tts) + self.AI_alarm = _ai_alarm.AI_alarm() + self.error_data = [] + self.asr_taskid = "" + self.VC_taskid = "" + self.VC_server = 2 #0柒牌正式服务器,1:测试服务器1,2:测试服务器2 + + EventMesh.publish("AI_alarm_open")# + 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 == 'jswm' or dev_type == 'jswm_BOX':# + #self.server_ip="115.190.94.208:22080" + self.server_ip="118.145.158.207:22086" + elif dev_type == "7PIN" : + #self.server_ip="sevenpin.qipai.com.cn" + # self.server_ip="220.160.104.34" + # self.server_ip="118.145.158.207:22082" + # self.server_ip="118.145.158.207:22080/22087" + self.server_ip="ai.qipai.com" + #self.server_ip="sevenpin1.qipai.com.cn:22082" + elif dev_type == "G10": + self.server_ip="115.190.94.208:22080" + elif dev_type == "sjgq": + self.server_ip="118.145.158.207:22084" + elif dev_type == "7PIN_BK" or dev_type == 'csh'or dev_type == "7PIN_BK_coze"or dev_type == 'momo': + #self.server_ip="amp.raisound.com" + self.server_ip="118.145.158.207:22086" + #self.server_ip="115.190.94.208:22080" + elif dev_type == "7PIN_coze": + self.server_ip="118.145.158.207:22086" + elif dev_type == "7PIN_BK_EU": + #self.server_ip="amp-global.raisound.com" + self.server_ip="amp-cdn-test.raisound.com" + + #开机提示音 + self.power_on_tone = EventMesh.publish("get_storage_config","power_on_tone")# + if dev_type != "7PIN" and dev_type != "7PIN_coze"and dev_type != "jswm" and dev_type != 'jswm_BOX' and dev_type != "7PIN_BK": + 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"or dev_type == "7PIN_BK_coze": + self.power_on_tone = "-bot_name来了!我们一起来愉快地聊天吧!" + elif dev_type == "7PIN_BK_EU": + self.power_on_tone = "Hi. May I help you ?" + 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 = "深圳百事通来了!请问您有什么需要我帮忙的吗?" + elif dev_type == 'jswm'or dev_type == 'jswm_BOX': + self.power_on_tone = "我来陪你聊天了" + elif dev_type == 'csh': + 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.vad_silence = EventMesh.publish("get_storage_config","vad_silence")#语速配置 + if self.vad_silence == None: + if dev_type == "7PIN" or dev_type == "7PIN_coze": + self.vad_silence = 200 + else: + self.vad_silence = 300 + + self.VC_TTS_voice_type = EventMesh.publish("get_storage_config","VC_TTS_voice_type")#音色配置 + if self.VC_TTS_voice_type == None : + 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_tiancaitongsheng_mars_bigtts", + "lang":"&lang=zh-cn-sc" , + "bot_id":"7491251662036811816",#瑞小蜜 + }, + "瑞小粉":{ + "bot_name":"瑞小粉", + "voice":"ICL_zh_female_tiaopigongzhu_tob", + "bot_id":"7501268622456045603",#瑞小粉 + "lang":"&lang=zh-cn-sc" + }, + "个性":{ + "bot_name":"小瑞", + "voice":"zh_male_sunwukong_mars_bigtts" , + "lang":"zh-cn" + } + + } + elif dev_type == "7PIN_BK_coze": + self.VC_TTS_voice_type = { + "女":{ + "bot_name":"小瑞", + "voice":"7468518753626488869" , + "lang":"zh-cn" + }, + "男":{ + "bot_name":"小瑞", + "voice":"7426720361732980745" , + "lang":"zh-cn" + }, + "ç«¥":{ + "bot_name":"小瑞", + "voice":"7468512265151676443" , + "lang":"zh-cn" + }, + "粤":{ + "bot_name":"啊瑞", + "voice":"7481299960428888103" , + "lang":"zh-hk" + }, + "四川":{ + "bot_name":"小瑞", + "voice":"7426720361732931593", + "lang":"&lang=zh-cn-sc" + }, + "个性":{ + "bot_name":"小瑞", + "voice":"7468512265134850099" , + "lang":"zh-cn" + } + + } + elif dev_type == "7PIN_BK_EU": + self.VC_TTS_voice_type = { + "女":{ + "bot_name":"Rose", + "voice":"zh_female_shuangkuaisisi_emo_v2_mars_bigtts" , + "lang":"zh-cn" + }, + "男":{ + "bot_name":"Jack", + "voice":"zh_male_wennuanahu_moon_bigtts" , + "lang":"zh-cn" + }, + "ç«¥":{ + "bot_name":"Ray", + "voice":"zh_female_mengyatou_mars_bigtts" , + "lang":"zh-cn" + }, + + } + elif dev_type == "csh": + 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" + }, + } + elif dev_type == 'jswm'or dev_type == 'jswm_BOX': + self.VC_TTS_voice_type = { + + "林悦":{ + "bot_name":"林悦", + #"voice":"ICL_zh_female_xingganyujie_tob", + "voice":"zh_female_yuanqinvyou_moon_bigtts" , + "lang":"&lang=zh-cn-sc" , + "bot_id":"7490824341572075555",#AI语音APP女神经理 + "workflow_id":"", + "openai_option":{ + # "model": "intimate-pro-32k-250115", + # "system":{ + # "type": "file", + # "content": "1567d9e19ac09269d8ce6c887494ff01", + # }, + }, + + }, + "黄文新":{ + "bot_name":"黄文新", + "voice":"zh_male_wennuanahu_moon_bigtts" , + "lang":"zh-cn" , + "bot_id":"7490825075302973440",#开朗男友 + "workflow_id":"", + "openai_option":{ + # "model": "intimate-pro-32k-250115", + # "system":{ + # "type": "file", + # "content": "2731e1e9d7150807795c4b5ab1e01e1b", + # }, + }, + }, + + } + elif dev_type == 'momo': + self.VC_TTS_voice_type = { + "女":{ + "bot_name":"食梦貘", + "voice":"zh_female_linjia_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" + }, + } + elif dev_type == "7PIN_coze": + self.VC_TTS_voice_type = { + "女":{ + "bot_name":"柒妹妹", + "voice":"7468518753626488869" , + "lang":"zh-cn" + }, + "男":{ + "bot_name":"柒先生", + "voice":"7426720361732980745" , + "lang":"zh-cn" + }, + "ç«¥":{ + "bot_name":"柒乐乐", + "voice":"7468512265151676443" , + "lang":"zh-cn" + }, + "粤":{ + "bot_name":"柒先生", + "voice":"7481299960428888103" , + "lang":"zh-hk" + }, + "四川":{ + "bot_name":"柒妹妹", + "voice":"7426720361732931593", + "lang":"&lang=zh-cn-sc" + }, + "个性":{ + "bot_name":"柒先生", + "voice":"7468512265134850099" , + "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"or dev_type == "7PIN_BK_EU"or dev_type == "7PIN_BK_coze": + self.VC_TTS_voice_key = "ç«¥" + #self.VC_TTS_voice_key = "男" + elif dev_type == 'momo': + self.VC_TTS_voice_key = "女" + elif dev_type == "jswm"or dev_type == 'jswm_BOX': + 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"or dev_type == "7PIN_BK_EU"or dev_type == "7PIN_BK_coze": + self.commands_mode = 2 + self.commands = [ + { + "command": "切换音色",#命令 + "patterns": [ #多种问法,说法 + "声音改成", "声音改为", "改成", "改为", "换成", "切换成", "变成", "声音" + "使用", "设置声音为", "把声音改成", "声音切换到", "用","声音切换的" + ], + "exact_matches": ["声音改成", "声音改为", "改成", "改为"],#精确匹配的完整短语 + "has_param": True,# 是否包含参数 + "param_regexp": r"(?P(男|难|女|ç«¥|同|粤|广东话|粤语|四川话|川普|四川口音))",#参数提取正则表达式 + "require_full_match": False,#是否要求完全匹配 + "negative_patterns": [],#否定模式(避免误触发) + "keyword_threshold": 0.6#关键词匹配阈值 + }, + { + "command": "音量加大", + "patterns": [ + "音量加大","音量大", "声音大" ,"声音加大","听不清楚","声音太小","太小声了" + ], + "exact_matches": [], + "has_param": False, + "param_regexp": "", + "require_full_match": False, + "negative_patterns": ["声音太大"], + "keyword_threshold": 1 + }, + { + "command": "音量减小", + "patterns": [ + "音量减小","音量小", "声音小","你太吵了","声音太大","太大声了" + ], + "exact_matches": [], + "has_param": False, + "param_regexp": "", + "require_full_match": False, + "negative_patterns": ["声音太小"], + "keyword_threshold": 0.8 + }, + { + "command": "关机", + "patterns": [ + "关机", "关闭电源" + ], + "exact_matches": ["关机", "关闭电源"], + "has_param": False, + "param_regexp": "", + "require_full_match": True, + "negative_patterns": [], + "keyword_threshold": 0.8 + }, + { + "command": "进入工厂模式", + "patterns": [ + "进入工厂模式" + ], + "exact_matches": ["进入工厂模式"], + "has_param": False, + "param_regexp": "", + "require_full_match": True, + "negative_patterns": [], + "keyword_threshold": 0.8 + }, + { + + "command": "再见", + "patterns": [ + "再见","拜拜","我要走了" + ], + "exact_matches": [], + "has_param": False, + "param_regexp": "", + "require_full_match": False, + "negative_patterns": [], + "keyword_threshold": 0.8 + }, + { + + "command": "查询信号", + "patterns": [ + "查询信号","信号怎样","信号是多少","信号怎么样" + ], + "exact_matches": [], + "has_param": False, + "param_regexp": "", + "require_full_match": False, + "negative_patterns": ["查询"], + "keyword_threshold": 0.8 + }, + { + + "command": "查询卡号", + "patterns": [ + "查询卡号","卡号","iccid号","ICCID号" + ], + "exact_matches": [], + "has_param": False, + "param_regexp": "", + "require_full_match": False, + "negative_patterns": ["查询"], + "keyword_threshold": 0.8 + }, + { + + "command": "查询设备号", + "patterns": [ + "设备号","查询设备号","查询IMEI号" + ], + "exact_matches": [], + "has_param": False, + "param_regexp": "", + "require_full_match": False, + "negative_patterns": ["查询"], + "keyword_threshold": 0.8 + }, + { + "command": "OTA升级", + "patterns": [ + "OTA升级" + ], + "exact_matches": ["OTA升级"], + "has_param": False, + "param_regexp": "", + "require_full_match": True, + "negative_patterns": [], + "keyword_threshold": 1 + }, + { + "command": "查询服务器地址", + "patterns": [ + "查询服务器地址" + ], + "exact_matches": [], + "has_param": False, + "param_regexp": "", + "require_full_match": False, + "negative_patterns": ["查询"], + "keyword_threshold": 0.9 + } + , + { + "command": "切换对话模式", + "patterns": [ + "切换对话模式","切换兑换模式" + ], + "exact_matches": [], + "has_param": False, + "param_regexp": "", + "require_full_match": False, + "negative_patterns": [], + "keyword_threshold": 0.8 + }, + { + "command": "查询版本", + "patterns": [ + "查询版本号","软件版本" + ], + "exact_matches": [], + "has_param": False, + "param_regexp": "", + "require_full_match": False, + "negative_patterns": ["查询"], + "keyword_threshold": 0.6 + }, + ] + if self.VC_TTS_volume == None: + self.VC_TTS_volume = 100 + self.AI_audio_queue_thread_id = 0 + self.AI_audio_queue_thread_lock = 0 + self.AI_VC_send_data_queue_thread_id = 0 + self.AI_VC_send_data_queue_thread_lock = 0 + self.AI_ASR_send_data_queue_thread_id = 0 + self.AI_ASR_send_data_queue_thread_lock = 0 + self.AI_record_tmp_queue = Queue(100) + self.AI_ASR_send_data_queue = Queue(200) + self.AI_VC_send_data_queue = Queue(100) + self.AI_audio_queue = Queue(100) + #self.AI_WS_connect_Queue = Queue(100) #释放用 + self.AI_TTS_str = "" + self.AI_ASR_str = "" + self.AI_ASR_flag = 0 + self.AI_ASR_str_tmp = "" + self.AI_ASR_send_buf_len = 0 + self.AI_ASR_text_tmp = "" + self.AI_ASR_text_repet_count = 0 + # #开始线程 + # if self.AI_audio_queue_thread_id ==0: + # self.AI_audio_queue_thread_id = _thread.start_new_thread(self.AI_audio_queue_thread, ()) + # else: + # print("AI_VC_start :AI_audio_queue_thread_id != 0 ") + # if self.AI_VC_send_data_queue_thread_id == 0: + # self.AI_VC_send_data_queue_thread_id = _thread.start_new_thread(self.AI_VC_send_data_queue_thread, ()) + + self.VC_state = VC_State_None #阿里ai VC状态 + self.VC_dialog_id = ""# + self.VC_message_id=None + self.VC_task_id =None + self.AI_client_VC = None + self.AI_client_VC_recv_id = 0 + self.AI_client_VC_recv_lock = 0 + self.AI_client_VC_isconnect =0 + self.AI_client_VC_debug =0 + + self.asr_state = VC_State_None #阿里VC_ASR VC状态 + self.key_state = 0 + + self.AI_client_asr = None + self.AI_client_asr_recv_id = 0 + self.AI_client_asr_recv_lock = 0 + self.AI_client_asr_isconnect =0 + self.AI_ASR_timer = osTimer() + self.AI_ASR_timer_count = 0 + self.AI_client_asr_debug =0 + self.AI_ASR_check_timeout = 0 + self.AI_ASR_error_timeout = 0 + self.VC_Thinking_timerout = 0 + + self.record_pcm = None + self.play_pcm = None + self.VC_record_thread_id = 0 + self.VC_record_thread_lock = 0 + self.VC_pingping_timerout = 0 + self.asr_pingping_timerout = 0 + self.factory_timer = osTimer() + self._1S_timer = osTimer() + self.Audio_buf_size = 16*1024 + self.record = audio.Record() + #self.record.end_callback(self.record_callback) + self.record.gain_set(4,10) + #self.record.gain_set(4,12) + self.aud = audio.Audio(0) + self.aud.setCallback(self.audio_cb) + #self.aud.setVolume(self.VC_TTS_volume //10) + self.audio_play_state = 1 #音频播放完状态 + self.close_timerout = 0 + self.LocalRespondingEnded_timerout = 0 + + self.VC_Play_flag = 0 + self.play_flag = 0 + self.VC_record_state_flag = 0 + self.AI_key_long_press_flag = 0 + self.websocket_error_count = 0 + + self.tts_in_data_len = 0 + self.tts_out_data_len = 0 + self.VC_satrt_flag = 0 + self.session_id = "" + EventMesh.subscribe("AI_key_press", self.AI_key_press) + 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.subscribe("audio_test", self.audio_test) + EventMesh.subscribe("audio_test_close", self.audio_test_close) + EventMesh.subscribe("set_record_data_save_flag", self.set_record_data_save_flag) + EventMesh.publish("close_led") + self.dialog_attributes_provider = EventMesh.publish("get_storage_config","dialog_attributes_provider")#智能体类型配置 + if self.dialog_attributes_provider == None: + self.dialog_attributes_provider = "coze" + self.outbound_attributess_provider = EventMesh.publish("get_storage_config","outbound_attributess_provider")#tts服务选择 + if self.outbound_attributess_provider == None: + self.outbound_attributess_provider = "volcengine" + self.inbound_attributess_provider = EventMesh.publish("get_storage_config","inbound_attributess_provider")#tts服务选择 + if self.inbound_attributess_provider == None: + if dev_type == "7PIN" or dev_type == "7PIN_coze" : + self.inbound_attributess_provider = "xun-fei" + else: + self.inbound_attributess_provider = "volcengine" + 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 audio_test(self,event = None, msg = None): + self.VC_Speech_Start() + self.VC_Play_Start() + def audio_test_close(self,event = None, msg = None): + self.VC_Speech_End() + self.VC_Play_End() + if self.record_data_save_flag == 1: + if self.record_fd : + self.record_fd.close() + self.record_fd = None + def set_record_data_save_flag(self,event = None, msg = None): + self.record_data_save_flag = msg + 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=None + if dev_type == "7PIN_BK_EU":#英文小瑞 + url = "http://dmp-global.raisound.com/bz-api/dev/config/{}".format(modem.getDevImei()) + elif dev_type == "7PIN" or dev_type == "7PIN_coze":#柒牌 + url = "http://ota.qipai.com/bz-cmp-api/api/config/{}".format(modem.getDevImei()) + else: + 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成功") + if "dialog_attributes_provider" in data["data"]: + self.dialog_attributes_provider = data["data"]["dialog_attributes_provider"] + EventMesh.publish("set_storage_config",["dialog_attributes_provider",self.dialog_attributes_provider]) + if "outbound_attributess_provider" in data["data"]: + self.outbound_attributess_provider = data["data"]["outbound_attributess_provider"] + EventMesh.publish("set_storage_config",["outbound_attributess_provider",self.outbound_attributess_provider]) + if "inbound_attributess_provider" in data["data"]: + self.inbound_attributess_provider = data["data"]["inbound_attributess_provider"] + EventMesh.publish("set_storage_config",["inbound_attributess_provider",self.inbound_attributess_provider]) + 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() + # if dev_type != "7PIN": + # 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}) #提示请您按住中间的按钮开始讲话,讲完松开即可 + if dev_type == "7PIN_BK_EU": + self.AI_TTS_str = "Please press and hold the button to speak. " + else: + 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") + if dev_type == 'jswm' or dev_type == 'jswm_BOX' : + self.Close() + else: + 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) + + #女,男,童,粤,川 + 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)) + + req_str = "vc/chat?is_auth={}".format(self.is_auth) + if dev_type == '7PIN_BK_coze' or dev_type == '7PIN_coze': + req_str = "vc/coze?is_auth={}".format(self.is_auth) + elif dev_type == 'jswm' or dev_type == 'jswm_BOX': + req_str = "vc/agent?is_auth={}".format(self.is_auth) + + if(token): + url = 'ws://{}/{}&dt={}'.format(self.server_ip,req_str,token) + else: + url = 'ws://{}/{}'.format(self.server_ip,req_str) + #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}) + self.Close_flag = 1 + 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 dev_type != "7PIN" and dev_type != "7PIN_coze": + self.chenggong_tone() + 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"] == "config.update" :#配置更新中,需要停止录音 + self.VC_state = VC_State_End + EventMesh.publish("publish_AI_btnInfo",{"func":self.VC_Speech_End}) + + 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"] + + EventMesh.publish("open_led_blue") + elif jsload_data["event"] == "asr.completed" :#asr 终止的标识 + print("self.commands_mode:{}".format(self.commands_mode)) + 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 + #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) + else: + cmd = jsload_data["payload"]["functions"][0]["function"]["arguments"] + print("llm:cmd:{}".format(cmd)) + cmd = ujson.loads(cmd) + ret = self.check_text_llm(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}) + elif jsload_data["event"] == "failed":#接口返回错误 + if jsload_data["payload"]["error"] == "concurrency_limit_exceeded": + EventMesh.publish("publish_AI_btnInfo",{"func":self.concurrency_limit_exceeded_tone}) + + #utime.sleep_ms(4000) + + else: + EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_error,"data":jsload_data["payload"]["message"]}) + pass + 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 or self.play_pcm == None: + 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 or error_str.find("[Errno 115] ")!= -1: + print("VC VC:recv 正常报错:{}".format(error_str)) + 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)) + #msg[0]是tts播放字符串,msg[1]是是否关闭当前tts + def play_tts(self,event = None,msg= None): + EventMesh.publish("publish_AI_btnInfo",{"func":self.play_tts_cb,"data":msg}) + + def play_tts_cb(self,data): + try: + tts_str = data[0] + is_close_VC = data[1] + if tts_str != "": + self.AI_TTS_str = tts_str + if is_close_VC != None: + self.Close_flag = is_close_VC + 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() + EventMesh.publish("open_led_all") + self.AI_ASR_send_buf_len = 0 + self.VC_Speech_End() + self.websocket_deconnect_VC() + self.AI_VC_start() + + # 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) + pass + def check_text_server(self,cmd): + 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 + if text.find("闹钟设定") != -1: + + # { + # "event":"command", + # "payload":{ + # "dialog_id":"d5ef6fc424834bc4915107c76b2c6d7e_1750671489126798340", + # "functions":[ + # { + # "id":"56867702528670853", + # "type":"function", + # "function":{ + # "name":"device_action", + # "arguments":"{\"command\":{\"chinese_description\":\"闹钟设定\",\"english_description\":\"alarm\",\"fail_prompt\":\"设定闹钟失败\",\"params_json\":\"{\\\"alarm\\\": [{\\\"alarm_content\\\": \\\"无\\\", \\\"alarm_timer\\\": \\\"7:00\\\", \\\"alarm_type\\\": \\\"单次\\\", \\\"repeat_day\\\": [\\\"2025-06-24\\\"], \\\"repeat_min\\\": 0, \\\"valid_time\\\": \\\"\\\"}]}\",\"succeed_prompt\":\"设定闹钟成功\"}}" + # } + # } + # ] + # }, + # "sid":"d5ef6fc424834bc4915107c76b2c6d7e" + # } + + text = cmd["command"]["params_json"] + print("params_json:{}".format(text)) + + try: + alarm = ujson.loads(text) + add_alarm_tmp = EventMesh.publish("AI_add_alarm",alarm["alarm"]) + if add_alarm_tmp[0]> 0: + self.AI_TTS_str = add_alarm_tmp[1] + return 1 + except Exception as e: + usys.print_exception(e) + except Exception as e: + usys.print_exception(e) + self.AI_TTS_str = cmd["command"]["fail_prompt"] + return -1 + def check_text(self,text): + print("check_text:len:{}".format(len(text))) + if len(text)>60: + return -1 + try: + if isinstance(text, str): + if dev_type != 'jswm' and dev_type != 'jswm_BOX':#金三完美,不使用设备切换角色 + # if len(text)<25 and (text.find("你好") != -1 or 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 = "嗨,{}来了,有什么吩咐".format(self.VC_TTS_voice_key) + # return 0 + # except Exception as e: + # usys.print_exception(e) + # return -1 + 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 dev_type == "7PIN_BK_EU": + if self.VC_mode == 0: + self.VC_mode = 1 + self.AI_TTS_str = "change dialogue mode" + else: + self.VC_mode = 0 + self.AI_TTS_str = "pushtalk mode" + else: + 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 or text.find("说话") != -1: + if text.find("å¿«") != -1 and 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 and 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 len(text)<22 and(text.find("聆听") != -1 or text.find("明天")!= -1) : + #print("text len :{}".format(len(text))) + if text.find("å¿«") != -1 and text.find("太") == -1 : + self.vad_silence -= 200 + if self.vad_silence < 100: + + self.AI_TTS_str = "已经是最快了" + self.vad_silence = 100 + else: + self.AI_TTS_str = "配置成功,当前语音断句速度是{}毫秒".format(self.vad_silence) + EventMesh.publish("set_storage_config",["vad_silence",self.vad_silence]) + return 0 + if text.find("慢") != -1 and text.find("太") == -1 : + self.vad_silence += 200 + if self.vad_silence > 2000: + self.vad_silence = 2000 + #EventMesh.publish("audio_montage_play",["yinliangyizuixiao.mp3"]) + #self.aud.play(1,0,'U:/static/yinliangyizuixiao.mp3')#音量已最小 + self.AI_TTS_str = "已经是最慢了" + else: + self.AI_TTS_str = "配置成功,当前语音断句速度是{}毫秒".format(self.vad_silence) + EventMesh.publish("set_storage_config",["vad_silence",self.vad_silence]) + 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" and dev_type != "7PIN_coze":#柒牌 + 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" or dev_type == "7PIN_coze":#柒牌 + 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 and self.VC_mode != 1 :#:#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 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": { + "simple_response": True,#不返回llm过程文本 + "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":False, + "content":"" + }, + "openai_option":{ + }, + + "bot_option": { + "use_workflow": True, + #"input_format": "text", + "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": 30, # 配置每段音频入队间隔时间 100ms + } + }, + "inbound_attributes": { + "provider": "xun-fei",# + #"provider": "volcengine", + "disable_vad":True, + "vad_silence":self.vad_silence, + "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, + "keywords":[] + } + }, + "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", + json_data["payload"]["outbound_attributes"]["provider"]=self.outbound_attributess_provider#TTS音色服务选择,火山 + json_data["payload"]["inbound_attributes"]["provider"]=self.inbound_attributess_provider#ASR服务选择,火山 + if dev_type == "7PIN_BK"or dev_type == "7PIN_BK_coze"or dev_type == "G10":#小瑞 + 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"]["vad_silence"] = 200 + #if self.VC_TTS_voice_type[self.VC_TTS_voice_key]["bot_id"] !="": + if "bot_id" in self.VC_TTS_voice_type[self.VC_TTS_voice_key]: + json_data["payload"]["dialog_attributes"]["cfg"]["bot_option"]["bot_id"]=self.VC_TTS_voice_type[self.VC_TTS_voice_key]["bot_id"] + if "workflow_id" in self.VC_TTS_voice_type[self.VC_TTS_voice_key]: + json_data["payload"]["dialog_attributes"]["cfg"]["bot_option"]["workflow_id"]= self.VC_TTS_voice_type[self.VC_TTS_voice_key]["workflow_id"] + else: + json_data["payload"]["dialog_attributes"]["cfg"]["bot_option"]["workflow_id"]="" + if json_data["payload"]["dialog_attributes"]["cfg"]["bot_option"]["workflow_id"] == "": + json_data["payload"]["dialog_attributes"]["cfg"]["bot_option"]["use_workflow"]=False + + + keywords = []#热词 + for key in self.VC_TTS_voice_type: + keywords.append(key) + json_data["payload"]["inbound_attributes"]["cfg"]["keywords"] = keywords + elif dev_type == "7PIN_BK_EU": + json_data["payload"]["dialog_attributes"]["cfg"]["bot_option"]["bot_id"]="7493368740600446995"#英文 + json_data["payload"]["dialog_attributes"]["cfg"]["bot_option"]["workflow_id"]="7493369551587213323" + elif dev_type == "csh": + json_data["payload"]["dialog_attributes"]["cfg"]["bot_option"]["bot_id"]="7490852493640384538"#慈善会 + json_data["payload"]["dialog_attributes"]["cfg"]["bot_option"]["use_workflow"]=False + json_data["payload"]["dialog_attributes"]["cfg"]["bot_option"]["workflow_id"]="" + elif dev_type == "7PIN" :#柒牌 + json_data["payload"]["dialog_attributes"]["cfg"]["bot_option"]["bot_id"]=""# + json_data["payload"]["dialog_attributes"]["cfg"]["bot_option"]["workflow_id"]="" + #json_data["payload"]["inbound_attributes"]["vad_silence"] = 1000 + elif dev_type == "7PIN_coze": + json_data["payload"]["dialog_attributes"]["cfg"]["bot_option"]["bot_id"]=""# + json_data["payload"]["dialog_attributes"]["cfg"]["bot_option"]["workflow_id"]="" + json_data["payload"]["dialog_attributes"]["provider"]="qipai" + # + elif dev_type == 'momo':#食梦貘 + json_data["payload"]["dialog_attributes"]["cfg"]["bot_option"]["bot_id"]="7491256313561825332" + json_data["payload"]["dialog_attributes"]["cfg"]["bot_option"]["workflow_id"]="" + json_data["payload"]["dialog_attributes"]["cfg"]["bot_option"]["use_workflow"]=False + if "bot_id" in self.VC_TTS_voice_type[self.VC_TTS_voice_key]: + json_data["payload"]["dialog_attributes"]["cfg"]["bot_option"]["bot_id"]=self.VC_TTS_voice_type[self.VC_TTS_voice_key]["bot_id"] + if "workflow_id" in self.VC_TTS_voice_type[self.VC_TTS_voice_key]: + json_data["payload"]["dialog_attributes"]["cfg"]["bot_option"]["workflow_id"]= self.VC_TTS_voice_type[self.VC_TTS_voice_key]["workflow_id"] + else: + json_data["payload"]["dialog_attributes"]["cfg"]["bot_option"]["workflow_id"]="" + if json_data["payload"]["dialog_attributes"]["cfg"]["bot_option"]["workflow_id"] == "": + json_data["payload"]["dialog_attributes"]["cfg"]["bot_option"]["use_workflow"]=False + + + keywords = []#热词 + for key in self.VC_TTS_voice_type: + keywords.append(key) + json_data["payload"]["inbound_attributes"]["cfg"]["keywords"] = keywords + 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" + elif dev_type == 'jswm' or dev_type == 'jswm_BOX':#金三完美 + #json_data["payload"]["device_id"]= "WangQunTestID" + if self.VC_TTS_voice_type[self.VC_TTS_voice_key]["bot_id"] !="": + json_data["payload"]["dialog_attributes"]["cfg"]["bot_option"]["bot_id"]=self.VC_TTS_voice_type[self.VC_TTS_voice_key]["bot_id"] + if self.VC_TTS_voice_type[self.VC_TTS_voice_key]["workflow_id"] == "": + json_data["payload"]["dialog_attributes"]["cfg"]["bot_option"]["use_workflow"]=False + json_data["payload"]["dialog_attributes"]["cfg"]["bot_option"]["workflow_id"]= "" + else: + json_data["payload"]["dialog_attributes"]["cfg"]["bot_option"]["workflow_id"]= self.VC_TTS_voice_type[self.VC_TTS_voice_key]["workflow_id"] + if self.VC_TTS_voice_type[self.VC_TTS_voice_key]["openai_option"] : + json_data["payload"]["dialog_attributes"]["cfg"]["openai_option"] =self.VC_TTS_voice_type[self.VC_TTS_voice_key]["openai_option"] + keywords = []#热词 + for key in self.VC_TTS_voice_type: + keywords.append(key) + json_data["payload"]["inbound_attributes"]["cfg"]["keywords"] = keywords + if self.dialog_attributes_provider != None: + json_data["payload"]["dialog_attributes"]["provider"] = self.dialog_attributes_provider + if self.commands_mode !=0 : + json_data["payload"]["commands"] = [] + if self.VC_mode == 0 :#and dev_type != "7PIN_BK_coze":#长对话模式打开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"]) + def concurrency_limit_exceeded_tone(self): + self.Close() + EventMesh.publish("audio_montage_play",["chaobingfatis.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 + self.LocalRespondingEnded_timerout = 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) + EventMesh.publish("close_led") + # 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)#恢复原始音量 + + diff --git a/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/ai_VC_coze.py b/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/ai_VC_coze.py new file mode 100644 index 00000000..a39f20e4 --- /dev/null +++ b/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/ai_VC_coze.py @@ -0,0 +1,3629 @@ +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= 2: + # self.Low_power_warning_timer = 0 + EventMesh.publish("audio_montage_play",["Low_power_warning.mp3"]) + + if self.usb_status == 0 and Vbatt= 8640:#24小时没按键,则关机 + self.pwk_key_Long_Press() + + def get_battery(self, event=None, msg=None): + Vbatt = Power.getVbatt() + if Vbatt>self.VBATT_tab["90"]: + return 100 + if Vbatt>self.VBATT_tab["80"]: + return 90 + if Vbatt>self.VBATT_tab["60"]: + return 80 + if Vbatt>self.VBATT_tab["40"]: + return 60 + if Vbatt>self.VBATT_tab["20"]: + return 40 + if Vbatt>self.VBATT_tab["10"]: + return 20 + if Vbatt<=self.VBATT_tab["10"]: + return 10 + def audio_montage_play(self,event,msg): + self.aud.stopPlayStream() + self.aud.stopAll() + str_data='mp3files=' + for i in msg: + try: + str_tmp = i.replace(".mp3","") + str_data+="{}.mp3+".format(audio_buf.index(str_tmp)) + except Exception as e: + usys.print_exception(e) + str_data = str_data[:-1] + print("audio_montage_play:{}".format(str_data)) + self.aud.montage_play('U:/static/audio.bin',1,1,str_data) + + def paly_iccid_imei(self,event,msg): + str_data = 'mp3files={}.mp3+'.format(audio_buf.index("liuliangtishi"))#流量提示 + imei = modem.getDevImei() + iccid = sim.getIccid() + print("paly_iccid_imei:ICCID:{}".format(iccid)) + if iccid != -1 and len(iccid) > 5: + iccid = iccid.upper() + if len(iccid) <20: + for i in range(20-len(iccid)): + iccid = "0"+iccid + str_data += '{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+'.format(audio_buf.index("R_READ_TIME_{}".format(iccid[0]))\ + ,audio_buf.index("R_READ_TIME_{}".format(iccid[1])),audio_buf.index("R_READ_TIME_{}".format(iccid[2])),audio_buf.index("R_READ_TIME_{}".format(iccid[3])),\ + audio_buf.index("R_READ_TIME_{}".format(iccid[4])),audio_buf.index("R_READ_TIME_{}".format(iccid[5])),audio_buf.index("R_READ_TIME_{}".format(iccid[6])),audio_buf.index("R_READ_TIME_{}".format(iccid[7])),\ + audio_buf.index("R_READ_TIME_{}".format(iccid[8])),audio_buf.index("R_READ_TIME_{}".format(iccid[9])),audio_buf.index("R_READ_TIME_{}".format(iccid[10])),audio_buf.index("R_READ_TIME_{}".format(iccid[11])),\ + audio_buf.index("R_READ_TIME_{}".format(iccid[12])),audio_buf.index("R_READ_TIME_{}".format(iccid[13])),audio_buf.index("R_READ_TIME_{}".format(iccid[14])),audio_buf.index("R_READ_TIME_{}".format(iccid[15])),\ + audio_buf.index("R_READ_TIME_{}".format(iccid[16])),audio_buf.index("R_READ_TIME_{}".format(iccid[17])),audio_buf.index("R_READ_TIME_{}".format(iccid[18])),audio_buf.index("R_READ_TIME_{}".format(iccid[19]))) + str_data += '{}.mp3+'.format(audio_buf.index("shouhou"))#可联系售后解决,联系方式见售后客服电话是400-886-8777或到微信公众号柒牌SEVENBRAND自行充值: + self.aud.montage_play('U:/static/audio.bin',1,1,str_data) + #鉴权出错,播放imei号 + def paly_device_res_error(self,event,msg): + str_data = 'mp3files={}.mp3+'.format(audio_buf.index("jianquancuowu"))#AI功能异常,请联系客户查询,设备号为: + imei = modem.getDevImei() + imei = imei.upper() + str_data += '{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(imei[0]))\ + ,audio_buf.index("R_READ_TIME_{}".format(imei[1])),audio_buf.index("R_READ_TIME_{}".format(imei[2])),audio_buf.index("R_READ_TIME_{}".format(imei[3])),\ + audio_buf.index("R_READ_TIME_{}".format(imei[4])),audio_buf.index("R_READ_TIME_{}".format(imei[5])),audio_buf.index("R_READ_TIME_{}".format(imei[6])),audio_buf.index("R_READ_TIME_{}".format(imei[7])),\ + audio_buf.index("R_READ_TIME_{}".format(imei[8])),audio_buf.index("R_READ_TIME_{}".format(imei[9])),audio_buf.index("R_READ_TIME_{}".format(imei[10])),audio_buf.index("R_READ_TIME_{}".format(imei[11])),\ + audio_buf.index("R_READ_TIME_{}".format(imei[12])),audio_buf.index("R_READ_TIME_{}".format(imei[13])),audio_buf.index("R_READ_TIME_{}".format(imei[14]))) + #print("str_data:{}".format(str_data)) + self.aud.montage_play('U:/static/audio.bin',1,1,str_data) + +#存储信息 +class getStorageDataManager(Abstract):#获取内存数据 + def __init__(self): + self.config_data = {} + check = ql_fs.path_exists("/usr/static/storage_file/config.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={}¤tVersion={}".format(modem.getDevImei(),currentVersion) + print(url) + response = request.post(url,timeout=5) + if response.status_code == 200: + data = response.json() + print("ota_result:{}".format(data)) + else: + print("ota_result error!!!!") + for i in response.text: + print(i) + response.close() + except Exception as e: + usys.print_exception(e) + if response != None: + response.close() + #ICCID上传 + def pots_ICCID(self,event=None,msg=None): + response = None + try: + iccid = sim.getIccid() + if iccid != -1 and len(iccid) > 5: + print("pots_ICCID:{}".format(iccid)) + #Headers = {'Transfer-Encodong':'chunked'} + #http://dmp.raisound.com/bz-api/dev/iccid?deviceId=866610001099679&iccid=89860002192307889057 + url = "http://dmp.raisound.com/bz-api/dev/iccid?deviceId={}&iccid={}".format(modem.getDevImei(),iccid) + print(url) + response = request.post(url,timeout=5) + if response.status_code == 200: + data = response.json() + print("pots_ICCID:{}".format(data)) + else: + print("pots_ICCID error!!!!") + for i in response.text: + print(i) + response.close() + except Exception as e: + usys.print_exception(e) + if response != None: + response.close() +#阿里VC状态枚举 +VC_State_None=0 +VC_State_Listening=1#听 +VC_State_SpeechStart=2#说开始 +VC_State_SpeechIng=3#正在说 +VC_State_SpeechEnd=4#说结束 +VC_State_RequestToRespond=5 #TTS请求或者chat请求 +VC_State_Thinking=6#想(chat) +VC_State_Responding=7#音频播放 +VC_State_TTSStart=8 +VC_State_TTSData=9 +VC_State_TTSFinish=10 +VC_State_TTSEnd=11 +VC_State_TTSError=12 +VC_State_DialogError=13 +VC_State_End=14 + +VC_record_TYPE_PCM = 0 +VC_record_TYPE_AMR = 1 +VC_play_TYPE_PCM = 0 +VC_play_TYPE_MP3 = 1 + +#websocket发送数据编号 +# AI_client_asr_num = 0 +# AI_client_chat_num = 1 +# AI_client_tts_num = 2 +AI_client_VC_num = 3 +AI_client_asr_num = 4 + + +class AI_VC(Abstract): + # AI + + def __init__(self): + try: + self.http_get_config()#获取/更新配置参数 + except Exception as e: + usys.print_exception(e) + self.VC_30S_timer = osTimer() + self.VC_30S_timer.start(30000, 1, self.VC_30S_timer_cb) + self.get_config_timer_count = 0 + self.record_data_save_flag = 0 #是否保存录音文件 + self.play_data_save_flag = 0 #是否保存tts数据到文件 + self.record_fd = None + self.play_fd = None + self.is_VC_ACK = 0 #是否开启ack应答模式 + self.is_long_record = 0 #是否开启长录音模式(语音打断模式) + self.ai_OTA = OTA() + self.is_auth = 0 #是否开启dmp鉴权 + #self.VC_mode = 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)#恢复原始音量 + \ No newline at end of file diff --git a/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/ai_alarm.py b/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/ai_alarm.py new file mode 100644 index 00000000..5085bac2 --- /dev/null +++ b/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/ai_alarm.py @@ -0,0 +1,212 @@ +#ai闹钟 +import EventMesh +import usys +import ujson +import osTimer +import utime +class AI_alarm(): + """ + sjon格式{ + "alarm_type":"间隔闹钟", #闹钟类型。示例值:间隔闹钟(喝水提醒,重复每天闹钟)、单次闹钟(会议提醒) + "alarm_timestamp":1750402089,#单次闹钟触发时间戳,单位:秒。只有单次闹钟有效 + "repeat_day":["周一","周二","周三","2025-06-20"],#按天循环规则。示例值:周一,周五,每天,2025-06-20(自定义日期) + "repeat_min":60,#当天是否按多少分钟循环,为0时每天只响应一次,为120时每隔2小时触发一次。示例值:120 + "valid_time":"9-18",# 当天循环有效时间,只有当repeat_min不为0时有效。repeat_min=60时,在有效时间内1小时循环响应1次。等于空值时,当天24小时有效 + "alarm_timer":"06:50",#触发时间。示例值:06:50 ,6点50分时触发闹钟 + "alarm_content":"周例会",#闹钟提醒内容。为空时,播放本地默认音频,不为空时,tts循环播放内容。示例值:"喝水提醒" + } + """ + def __init__(self): + self.alarm_array = EventMesh.publish("get_storage_config","alarm_array")#读取闹钟数组 + if self.alarm_array ==None: + self.alarm_array =[] + self.AI_alarm_timer = osTimer() + self.alarm_min_repeat_tmp = 0 + self.alarm_min_one_tmp = 0 + EventMesh.subscribe("AI_alarm_close",self.AI_alarm_close) + EventMesh.subscribe("AI_alarm_open",self.AI_alarm_open) + EventMesh.subscribe("AI_alarm_poll_extern",self.AI_alarm_poll_extern) + EventMesh.subscribe("AI_add_alarm",self.AI_add_alarm) + + def AI_alarm_open(self,event=None,msg=None): + self.AI_alarm_timer.start(20000, 1, self.AI_alarm_timer_cb) + + def AI_alarm_timer_cb(self, *args): + EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_alarm_poll}) + pass + + + def AI_alarm_poll(self):#轮询调用 + is_alarm = 0 #是否触发闹钟 + alarm_TTS_str =""#闹钟播放tts字符串 + repeat_day_flag = 0 + alarm_timer_flag = 0 + if len(self.alarm_array)>0: + try: + now_time = utime.localtime() + for _alarm in self.alarm_array : + if _alarm["alarm_type"] == "重复": + weekday = now_time[6] + weekday_str = "" + if weekday == 0: + weekday_str = "周一" + elif weekday == 1: + weekday_str = "周二" + elif weekday == 2: + weekday_str = "周三" + elif weekday == 3: + weekday_str = "周四" + elif weekday == 4: + weekday_str = "周五" + elif weekday == 5: + weekday_str = "周六" + elif weekday == 6: + weekday_str = "周日" + week = _alarm["repeat_day"] + for _week in week : + if weekday_str == _week:#符合周判断 + repeat_day_flag = 1 + break + if repeat_day_flag == 0:#周不符合 + continue + if _alarm["repeat_min"] ==0: #每天只提醒一次,已添加闹钟1,周一,周二,周三,6:50分提醒您周例会 + alarm_timer = _alarm["alarm_timer"] + H_M = alarm_timer.split(':') + if len(H_M) != 2: + continue + hour = int(H_M[0]) + min = int(H_M[1]) + if hour == now_time[3] and min == now_time[4]: + alarm_timer_flag =1 + else:#时间不符合 + continue + + + if alarm_timer_flag==1:#时间符合,触发闹钟 + alarm_TTS_str += _alarm["alarm_content"] + is_alarm = 1 + break + else:#每天循环间提醒。已添加闹钟1,周一,周二,周三,9点到18点每隔60分钟提醒您喝水 + valid_time = _alarm["valid_time"] + H_H = valid_time.split('-') + if len(H_H) != 2: + continue + start_time = H_H[0].split(':') + end_time = H_H[1].split(':') + if len(start_time)<2 or len(end_time)<2: + continue + start_time_int = int(start_time) + end_time_int = int(end_time) + now_h = now_time[3] + if now_h>=start_time_int and now_h <= end_time_int:#在有效时间范围 + now_m = now_time[4] + repeat_min_int = _alarm["repeat_min"] + if (now_m + repeat_min_int)%repeat_min_int == 0 and self.alarm_min_repeat_tmp != now_m:#每分钟符合 + self.alarm_min_repeat_tmp = now_m + alarm_TTS_str += _alarm["alarm_content"] + is_alarm = 1 + continue + + else: + continue + + elif _alarm["alarm_type"] == "单次": + alarm_timer = _alarm["alarm_timer"] + H_M = alarm_timer.split(':') + if len(H_M) != 2: + continue + repeat_day = _alarm["repeat_day"] + #print("repeat_day:{}".format(repeat_day[0])) + Y_M_D = repeat_day[0].split('-') + #print("Y_M_D:{}".format(Y_M_D)) + if len(Y_M_D)<3: + continue + year_int = int(Y_M_D[0]) + month_int = int(Y_M_D[1]) + day_int = int(Y_M_D[2]) + hour_int = int(H_M[0]) + minute_int = int(H_M[1]) + if year_int == now_time[0] and month_int == now_time[1]and day_int == now_time[2]and hour_int == now_time[3]and minute_int == now_time[4]: + if self.alarm_min_one_tmp != now_time[4]: + self.alarm_min_one_tmp = now_time[4] + alarm_TTS_str += _alarm["alarm_content"] + is_alarm = 1 + continue + #ret_str += "{},{}点{}分提醒您:{}。".format(_alarm["repeat_day"],H_M[0],H_M[1],_alarm["alarm_content"]) + if is_alarm == 1 : + EventMesh.publish("audio_montage_play",["chenggong.mp3"]) + EventMesh.publish("play_tts",["小瑞提醒您该{}了,小瑞提醒您该{}了,小瑞提醒您该{}了".format(alarm_TTS_str,alarm_TTS_str,alarm_TTS_str),1]) + print("闹钟提醒:小瑞提醒您该{}了,小瑞提醒您该{}了,小瑞提醒您该{}了".format(alarm_TTS_str,alarm_TTS_str,alarm_TTS_str)) + except Exception as e: + usys.print_exception(e) + pass + + def AI_alarm_poll_extern(self,event=None,msg=None):#外部调用轮询间隔,关闭定时器调用 + self.AI_alarm_timer.stop() + EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_alarm_poll}) + + def AI_add_alarm(self,event=None,alarm_array_u=None):#添加闹钟数组 + ret = 0 + alarm_array_tmp = self.alarm_array + #已添加闹钟1,周一,周二,周三,6:50分提醒您周例会 + ret_str = "已添加" + print("AI_add_alarm:{}".format(alarm_array_u)) + try: + for _alarm in alarm_array_u : + if ("alarm_content" in _alarm )and (_alarm["alarm_type" ] == "重复" or _alarm["alarm_type" ] == "单次" ):#简单的判断这个配置是合法的 + + ret +=1 + alarm_array_tmp.append(_alarm) + ret_str += "闹钟{},".format(len(alarm_array_tmp)) + + + if _alarm["alarm_type"] == "重复": + + if _alarm["repeat_min"] ==0: #每天只提醒一次,已添加闹钟1,周一,周二,周三,6:50分提醒您周例会 + alarm_timer = _alarm["alarm_timer"] + H_M = alarm_timer.split(':') + if len(H_M) != 2: + return [-1] + ret_str += "{},{}点{}分提醒您{}。".format(_alarm["repeat_day"],H_M[0],H_M[1],_alarm["alarm_content"]) + else:#每天循环间提醒。已添加闹钟1,周一,周二,周三,9点到18点每隔60分钟提醒您喝水 + valid_time = _alarm["valid_time"] + H_H = valid_time.split('-') + if len(H_H) != 2: + return [-1] + start_time = H_H[0].split(':') + end_time = H_H[1].split(':') + if len(start_time)<2 or len(end_time)<2: + return [-1] + ret_str += "{},{}点{}分到{}点{}分,每隔{}分钟提醒您{}。".format(_alarm["repeat_day"], + start_time[0],start_time[1],end_time[0],end_time[1], + _alarm["repeat_min"],_alarm["alarm_content"]) + elif _alarm["alarm_type"] == "单次": + alarm_timer = _alarm["alarm_timer"] + H_M = alarm_timer.split(':') + if len(H_M) != 2: + return [-1] + repeat_day = _alarm["repeat_day"] + print("repeat_day:{}".format(repeat_day[0])) + Y_M_D = repeat_day[0].split('-') + print("Y_M_D:{}".format(Y_M_D)) + if len(Y_M_D)<3: + return [-1] + ret_str += "{}å¹´{}月{}日,{}点{}分提醒您:{}。".format(Y_M_D[0],Y_M_D[1],Y_M_D[2],H_M[0],H_M[1],_alarm["alarm_content"]) + + else: + return [-1] + except Exception as e: + usys.print_exception(e) + return [-1] + if ret == 0: + self.alarm_array = alarm_array_tmp + EventMesh.publish("set_storage_config",["alarm_array",self.alarm_array]) + return [ret,ret_str] + + def AI_delete_alarm(self,event=None,Num=None):#删除闹钟 + + EventMesh.publish("set_storage_config",["alarm_array",self.alarm_array]) + + def AI_alarm_close(self): + self.AI_alarm_timer.stop() + diff --git a/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/audio_gain.nvm b/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/audio_gain.nvm new file mode 100644 index 00000000..fe06d817 Binary files /dev/null and b/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/audio_gain.nvm differ diff --git a/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/audio_ve.nvm b/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/audio_ve.nvm new file mode 100644 index 00000000..a33dd45a Binary files /dev/null and b/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/audio_ve.nvm differ diff --git a/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/btn_device_ec800m.py b/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/btn_device_ec800m.py new file mode 100644 index 00000000..9bbf5e90 --- /dev/null +++ b/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/btn_device_ec800m.py @@ -0,0 +1,3000 @@ +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() diff --git a/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/btn_device_ec800m_d15.py b/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/btn_device_ec800m_d15.py new file mode 100644 index 00000000..3f31f1c8 --- /dev/null +++ b/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/btn_device_ec800m_d15.py @@ -0,0 +1,4012 @@ +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() diff --git a/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/config.json b/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/config.json new file mode 100644 index 00000000..334b3b6b --- /dev/null +++ b/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/config.json @@ -0,0 +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" +} \ No newline at end of file diff --git a/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/constants.py b/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/constants.py new file mode 100644 index 00000000..38d92147 --- /dev/null +++ b/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/constants.py @@ -0,0 +1,225 @@ +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" diff --git a/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/led.py b/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/led.py new file mode 100644 index 00000000..a1b19e0e --- /dev/null +++ b/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/led.py @@ -0,0 +1,587 @@ +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 + diff --git a/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/led_d15.py b/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/led_d15.py new file mode 100644 index 00000000..4680da96 --- /dev/null +++ b/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/led_d15.py @@ -0,0 +1,590 @@ +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 + diff --git a/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/main_1.py b/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/main_1.py new file mode 100644 index 00000000..c14a3dcc --- /dev/null +++ b/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/main_1.py @@ -0,0 +1,239 @@ +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)) + + diff --git a/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/main_init.py b/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/main_init.py new file mode 100644 index 00000000..73c9839d --- /dev/null +++ b/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/main_init.py @@ -0,0 +1,293 @@ +import sms +import atcmd +import net +import machine +import EventMesh +import usys + + +resp=bytearray(50) +# atcmd.sendSync('AT+log=52,1\r\n',resp,'',200) +# EventMesh.debug_log("AT+log=52,1:{}".format(resp)) +from common import Abstract +class App(object): + def __init__(self): + self.managers = [] + + 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() + + +#开机执行下面函数就可以配置成ipv4拨号 +import dataCall +import net + +def set_ipv4_datacall(): + # 获取第一路的APN,ipType 等信息 + pdpCtx = dataCall.getPDPContext(1) + if pdpCtx != -1: + if pdpCtx[0] != 0: + # 如果不是用户需要的ipv4,使用如下方式配置,使用如下方式配置 + ret = dataCall.setPDPContext(1, 0,pdpCtx[1],pdpCtx[2],pdpCtx[3],pdpCtx[4]) + if ret == 0: + print('配置成功。') + # cfun0/1后按照配置的信息进行拨号 + net.setModemFun(0) + net.setModemFun(1) + else: + print('配置失败。') + else: + print('已经配置为IPv4') + else: + print('获取PDP Context失败。') +def main_init(): +# if __name__ == '__main__': + #set_ipv4_datacall() + import uos + import ql_fs + import utime + import EventMesh + + # if ql_fs.path_exists("/ext") == False: + # ldev = uos.VfsLfs1(32, 32, 32, "ext_fs",0,3) + # uos.mount(ldev,'/ext') + res = uos.statvfs("/usr") + res = list(res) + EventMesh.debug_log('总usr空间:{} MB,剩余空间:{} MB'.format((((res[0] * res[2]) / 1024 / 1024)),((res[0] * res[3]) / 1024 / 1024))) + EventMesh.debug_log("init1:{}".format(utime.localtime())) + + + EventMesh.debug_log("init2:{}".format(utime.localtime())) + EventMesh.debug_log("init3:{}".format(utime.localtime())) + + + import ui as _ui + + + # import ui as _ui + EventMesh.debug_log("init4:{}".format(utime.localtime())) + ui = _ui.UI() + ui.post_processor_after_instantiation() + + + + + app = watchApp() + app.set_ui(ui) + # if EventMesh.model == "D15": + # from motor import motorEventManager + # app.append_manager(motorEventManager()) + + # app.append_manager(mgr.getStorageDataManager()) + # app.append_manager(mgr.AlarmVolumeLevelManager()) \ + # .append_manager(mgr.MsgVolumeLevelManager()) \ + # .append_manager(mgr.PhoneVolumeLevelManager()) \ + # .append_manager(mgr.DeviceInfoManager()) \ + # .append_manager(mgr.BatteryManager()) \ + # .append_manager(intervManager())\ + # .append_manager(ledEventManager())\ + # .append_manager(playImeiManager())\ + # .append_manager(playCurStepManager())\ + # .append_manager(usbStateManager())\ + # .append_manager(hrandBloodOxgenManager())\ + # .append_manager(simManager())\ + # .append_manager(PoweronManager())\ + # .append_manager(sosManager())\ + # .append_manager(playCurTimeManager()) + # .append_manager(mgr.StopwatchManager()) \ + # .append_manager(mgr.CountdownManager()) \ + + + # app.append_manager(mgr.ConfigStoreManager()) + # app.append_manager(protocol.NetManager()) + # app.append_manager(mgr.LocationManager()) + # app.append_manager(mgr.AddrBookManager()) + # app.append_manager(mgr.MsgManager()) + # app.append_manager(mgr.MsgdetailManager()) + # app.append_manager(mgr.CallLogManager()) + # app.append_manager(mgr.getWeatherDataManager()) + # app.append_manager(mgr.PhoneCallingManager()) + # app.append_manager(mgr.ClockManager()) + # app.append_manager(mgr.sendDevinfoManager()) + + # app.append_manager(mgr.gethistoryDataManager()) + # app.append_manager(mgr.getHrTimeManager()) + # app.append_manager(mgr.getBrightnessManager()) + + # app.append_manager(mgr.getUpLoadDataManager()) + # app.append_manager(mgr.getVolumSizeManager()) + # app.append_manager(mgr.getTempTimeManager()) + # app.append_manager(mgr.getplayAudiodStateManager()) + # app.append_manager(mgr.getLowBatManager()) + # app.append_manager(mgr.getBootOffManager()) + # app.append_manager(mgr.getOldTimeManager()) + # app.append_manager(mgr.getSosFlagManager()) + # app.append_manager(mgr.CountdownManager()) + # app.append_manager(mgr.sosInfoCallManager()) + # app.append_manager(mgr.testSmsSetIPManager()) + # app.append_manager(mgr.deleteSmsManager()) + # app.append_manager(mgr.schoolclassManager()) + # app.append_manager(mgr.firwDownloadManager()) + # if EventMesh.model == "D15": + # app.append_manager(mgr.vedioInforManager()) + try: + try: + import usr.ai_VC_t as _ai + except Exception as e: + usys.print_exception(e) + + try: + import usr.ai_VC as _ai + except Exception as e: + usys.print_exception(e) + + try: + import usr.ai_VC_7PIN as _ai + except Exception as e: + usys.print_exception(e) + try: + import usr.ai_VC_G15 as _ai + except Exception as e: + usys.print_exception(e) + try: + import ai_VC as _ai + except Exception as e: + usys.print_exception(e) + + #app.append_manager(intervManager()) + try: + app.append_manager(_ai.getStorageDataManager()) + except Exception as e: + usys.print_exception(e) + try: + app.append_manager(_ai.AI_led()) + except Exception as e: + usys.print_exception(e) + try: + app.append_manager(_ai.AI_dev()) + except Exception as e: + usys.print_exception(e) + + try: + app.append_manager(_ai.device_res_author()) + except Exception as e: + usys.print_exception(e) + + try: + app.append_manager(_ai.AI_VC()) + except Exception as e: + usys.print_exception(e) + + except Exception as e: + usys.print_exception(e) + + EventMesh.debug_log("init21:{}".format(utime.localtime())) + + EventMesh.debug_log("init11:{}".format(utime.localtime())) + + #EventMesh.publish("open_power_on", 1)# + # pcr = protocol.ProtoColResolver() + # pcr.add_support(protocol.LK_ProtoCol()) + # pcr.add_support(protocol.PING_ProtoCol()) + # pcr.add_support(protocol.KA_ProtoCol()) + # pcr.add_support(protocol.UD_ProtoCol()) + # pcr.add_support(protocol.CR_ProtoCol()) + # pcr.add_support(protocol.AL_ProtoCol()) + # pcr.add_support(protocol.FIND_ProtoCol()) + # pcr.add_support(protocol.POWEROFF_ProtoCol()) + # pcr.add_support(protocol.PHL_ProtoCol()) + # pcr.add_support(protocol.TK_ProtoCol()) + # pcr.add_support(protocol.TKS_ProtoCol()) + # pcr.add_support(protocol.MESSAGE_ProtoCol()) + # pcr.add_support(protocol.WT_ProtoCol()) + # pcr.add_support(protocol.REMIND_ProtoCol()) + # pcr.add_support(protocol.HRSTART_ProtoCol()) + # pcr.add_support(protocol.HEART_ProtoCol()) + # pcr.add_support(protocol.OXYGEN_ProtoCol()) + # pcr.add_support(protocol.OXYGEN_One_ProtoCol()) + # pcr.add_support(protocol.TEMP_ProtoCol()) + # pcr.add_support(protocol.DLT_ProtoCol()) + # pcr.add_support(protocol.UPLOAD_ProtoCol()) + # pcr.add_support(protocol.MONITOR_ProtoCol()) + # # pcr.add_support(protocol.CENTER_ProtoCol()) + # pcr.add_support(protocol.CENTER_ProtoCol()) + # pcr.add_support(protocol.bootoff_ProtoCol()) + # pcr.add_support(protocol.WDSTART_ProtoCol()) + # pcr.add_support(protocol.LOWBAT_ProtoCol()) + # pcr.add_support(protocol.sosHome_dial_ProtoCol()) + # pcr.add_support(protocol.Time_ProtoCol()) + # pcr.add_support(protocol.SILENCETIME2_ProtoCol()) + # pcr.add_support(protocol.FALLDOWN_ProtoCol()) + # pcr.add_support(protocol.HELP_ProtoCol()) + # pcr.add_support(protocol.REMOVE_ProtoCol()) + # pcr.add_support(protocol.UD_ProtoCol()) + # pcr.add_support(protocol.bldstart_ProtoCol()) + # pcr.add_support(protocol.blood_ProtoCol()) + # pcr.add_support(protocol.bgstart_ProtoCol()) + # pcr.add_support(protocol.bloodglucose_ProtoCol()) + # pcr.add_support(protocol.REMIND_CHDRINK_ProtoCol()) + # pcr.add_support(protocol.REMIND_CHMEDICINE2_ProtoCol()) + # pcr.add_support(protocol.WLKEY_ProtoCol()) + # pcr.add_support(protocol.REMIND_CH_WAKEUP_ProtoCol()) + # pcr.add_support(protocol.REMIND_CH_SLEEP_ProtoCol()) + # pcr.add_support(protocol.REMIND_CH_HOME_ProtoCol()) + # pcr.add_support(protocol.REMIND_CH_REST_ProtoCol()) + # pcr.add_support(protocol.SLEEP_DATA_ProtoCol()) + # pcr.add_support(protocol.SLEEPTIME_ProtoCol()) + # pcr.add_support(protocol.FACTORY_ProtoCol()) + # pcr.add_support(protocol.RESET_ProtoCol()) + # pcr.add_support(protocol.REMIND_CH_SIT_ProtoCol()) + # pcr.add_support(protocol.SCREEN_SHOWProtoCol()) + + + + + + # sm = protocol.SockManager() + # sm.add_support_resolver(pcr) + # app.append_manager(sm) + EventMesh.debug_log("init11.0:{}".format(utime.localtime())) + app.start() + + sms_data = sms.getSaveLoc() + if(sms_data != -1): + sms_lacv = sms_data[0][0] + if sms_lacv != 'SM':#每次开机设置一下短信的存储位置 + sms.setSaveLoc('SM', 'SM', 'SM') + EventMesh.debug_log("init12:{}".format(utime.localtime())) + # timer_t = net.nitzTime() + # EventMesh.debug_log("timer_t:{}".format(timer_t)) + # if(timer_t != -1): + # timeSecond = int(timer_t[1]) + # if timeSecond != 0: + # next_alarm_time = utime.localtime(timeSecond) + # 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)) + + + + # EventMesh.publish("load_screen", {"screen": "main_menu"}) + + diff --git a/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/mgr.py b/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/mgr.py new file mode 100644 index 00000000..de38bf64 --- /dev/null +++ b/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/mgr.py @@ -0,0 +1,5072 @@ +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 = "866610001011658" #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() + 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 diff --git a/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/mgr_d15.py b/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/mgr_d15.py new file mode 100644 index 00000000..eb9ddecb --- /dev/null +++ b/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/mgr_d15.py @@ -0,0 +1,5450 @@ +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") + + + + + + + diff --git a/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/motor.py b/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/motor.py new file mode 100644 index 00000000..cd31639b --- /dev/null +++ b/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/motor.py @@ -0,0 +1,112 @@ +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.GPIO20, 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_mode = 0#模式 + _thread.start_new_thread(self.motorInfo_queue_thread, ()) + EventMesh.subscribe("publish_message_event_motorInfo",self.publish_message_event_motorInfo) + pass + + 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): + EventMesh.subscribe("set_motor_time", self.set_motor_time)#设置参数 + EventMesh.subscribe("close_motor_infor", self.close_motor_infor)#关闭马达和定时器 + + # msg 0马达使能 1 马达振动时间100ms单位 2 震动次数 3 间隔时间振动 4 是否需要长振 5 长振时间 6间隔时间长振 7长振次数1一次 要为200ms的倍数 + def set_motor_time(self,event,msg): + open_power = EventMesh.publish("get_power_on_state")#获取开机标识 + if open_power != None: + if open_power == 0: + return + 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_count = 0 + self.motor_timer.stop() + # print("motor msg",msg) + 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:# + if self.motor_total_time > 0: + self.motor_total_time-=1 + if self.motor_total_time > 0: + open_motor() + else: + close_motor() + EventMesh.publish("close_motor_infor")#关闭马达和定时器 + return + 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: + 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() + + + diff --git a/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/pcm_stream_play_test.py b/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/pcm_stream_play_test.py new file mode 100644 index 00000000..edbbd1b1 --- /dev/null +++ b/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/pcm_stream_play_test.py @@ -0,0 +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() diff --git a/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/protocol.py b/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/protocol.py new file mode 100644 index 00000000..2ab81a55 --- /dev/null +++ b/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/protocol.py @@ -0,0 +1,3760 @@ +import ujson +import utime +import EventMesh +import constants +from common import Abstract +import uhashlib +import ubinascii +from misc import Power +import audio +from machine import Pin +import ujson +import ql_fs +import dataCall +import checkNet +import net +import usocket +import osTimer + +import machine +import urandom +import _thread +import usys +import request +import umqtt +import modem +SHA256 = uhashlib.sha256 +import SecureData +def server_init(server_type = None): + #服务器选择1,防走丢,2大锤,3三基同创,4童信,5云米,6荣为 8:ds未知 dey.hinwatch. com:9968 9:183.62.239.121:31869 10:183.62.239.121:33461 + if server_type == None: + server_type = 2 + #EventMesh.debug_log("server_init:server_type:{}".format(server_type)) + + d_server_addr = "api.xcloudtech.com" + d_server_port = 9000 + d_md5_key = "bZld0ALsZTt15tKEZhOlLPgbsO75BLTP" + d_PID = "SZKW" + if server_type == 1: + pass + + elif server_type == 2: + # test.iot.socket.thisiot.com:9999 + # iot.socket .thisiot.com:9999 + # d_server_addr = "test.iot.socket.thisiot.com" + # d_server_port = 9999 + # d_md5_key = "3JyCjsw4ryXKzjzudayY" + # d_PID = "qAELPTKmFanR4RHe" + + d_server_addr = "iot.socket.thisiot.com" + d_server_port = 9999 + d_md5_key = "SZYhyGhroQ3xFKFWZq1g" + d_PID = "oxLwDqcwJCtiPSRu" + + elif server_type == 3: + d_server_addr = "tcp.zhihuixuexiao.com" + d_server_port = 2346 + d_md5_key = "" + d_PID = "3G" + elif server_type == 4: + d_server_addr = "tcp.tx.kidxin.com" + d_server_port = 20500 + elif server_type == 5: + d_server_addr = "device.miwitracker.com" + d_server_port = 8505 + d_md5_key = "" + d_PID = "3G" + elif server_type == 6: + d_server_addr = "120.26.104.21" + d_server_port = 9968 + d_md5_key = "bZld0ALsZTt15tKEZhOlLPgbsO75BLTP" + d_PID = "SZKW" + elif server_type == 7: + d_server_addr = "8.134.68.15" + d_server_port = 30346 + d_PID="KnHnj1Cd5VxcO3Ft" + d_md5_key = "evxThVhMBmRNiQ1Twigw" + elif server_type == 99: + d_server_addr = "lab.xcloudtech.com" + d_server_port = 9000 + elif server_type == 8: + d_server_addr = "dev.hxinwatch.com" + d_server_port = 9968 + elif server_type == 9: + d_server_addr = "183.62.239.121" + d_server_port = 31869 + elif server_type == 10: + d_server_addr = "183.62.239.121" + d_server_port = 33461 + + return [d_server_addr,d_server_port,d_md5_key,d_PID] +from queue import Queue +def unicode_to_utf8(src): + ref = 0xe08080 + result = ref + + #取最后六位 + a = src & 0x3f + + #将最后六位放在ref最后六位的空位置 + result = result | a + src = src >> 6 + + #取接下来的六位 + a = src & 0x3f + + #放在ref对应的六个位置 + result = result | (a << 8) + + #保留最后四位 + src = src >> 6 + + #放在ref对应的四个位置 + result = result | (src << 16) + return result + +def UnicodeHexStr_To_Utf8Str(str): + odata = 0 + + result = bytes() + su =str.upper() + + i = 0 + for c in su: + tmp=ord(c) + if tmp <= ord('9') : + odata = odata << 4 + odata += tmp - ord('0') + + elif ord('A') <= tmp <= ord('F'): + odata = odata << 4 + odata += tmp - ord('A') + 10 + if(i%4==3): #每2字节获取一个int,拿到转换后的unicode int + #print(odata.to_bytes(2, 'big')) + #result.append(odata) + if odata > 255: + tmp = unicode_to_utf8(odata)#拿到转换后的utf8 int + tmp2 = tmp.to_bytes(3, 'big') #转bytes + else : + tmp2 = odata.to_bytes(1, 'big') + #print("tmp2:{}".format(tmp2)) + result = result + tmp2 + odata = 0 + i+=1 + return result.decode('utf-8') #返回utf8的str + +def gewu_init(): + productKey = "cu1shld45y4hjr1L" + return productKey +mqtt_state = 0 +def mqttsub_cb(topic, msg): + global mqtt_state + print("Subscribe Recv: Topic={},Msg={}".format(topic.decode(), msg.decode())) + jsload_data = ujson.loads(msg.decode()) + print("jsload_data-{} type:{}".format(jsload_data,type(msg.decode()))) + # jsload_data = {'data':'111','protocolType':'', 'host':'device.miwitracker.com', 'secretKey': 'bZld0ALsZTt15tKEZhOlLPgbsO75BLTP', 'port':8505, 'bid': '3G', 'extJsonStr': ''} + # ujson.loads(c) + # $sys/cu1shld45y4hjr1L/866610001011658/ext/regist + #data = {"messageId":"25","params":{"deviceSecret":"C1D75A63C0338978438E9197372FC698""}} + if "params" in jsload_data: + params_str = jsload_data["params"] + if "deviceSecret" in params_str: + str_tmp = params_str["deviceSecret"] + print(str_tmp) + EventMesh.publish("set_deviceSecret",str_tmp) + mqtt_state = 1 +def mqtterr_cb(error): + ''' + 接收umqtt线程内异常的回调函数 + ''' + print("error!!!!!!!!!!!".format(error)) + +def HMAC(k, m): + SHA1_BLOCK_SIZE = 64 + KEY_BLOCK = k + (b'\0' * (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 + SHA256(inner_message).digest() + return SHA256(outer_message) + + +def get_hmac_sha256(k, m): + data = 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 mqtt_client_pro_init():#一型一密 + client = 0 + + # 创建一个mqtt实例 +# + # {"productKey":"cu1r1rjjrjdhz0lx","deviceKey":"DD86000000001","deviceSecret":"93FEEC6D16D30E2B90FE0DBC2FFCDB14"} 设备基本信息 + # hmac_sha256(deviceIddeviceKeyproductKey,deviceSecret) mqttclientId + deviceId = ""#"bOOSGN5FlXEjt15" + deviceKey = ''#"bOOSGN5FlXEjt15" + imei = EventMesh.publish(constants.EVENT.GET_IMEI) + deviceId = str(imei) + deviceKey = str(imei) + productKey = gewu_init() + + EventMesh.publish("set_product_key",productKey) + data = "{}{}{}".format(deviceId,deviceKey,productKey)#需要用户定义产品是提供数据 + # data = b"The data to encrypt" + # 密钥 + productSecret = b"765fc66242616852209d1c57e51b0744" #765fc66242616852209d1c57e51b0744 ,productSecret + + # {"productKey":"cu1shld45y4hjr1L","deviceKey":"bOOSGN5FlXEjt15","deviceSecret":"9234577490038E0949B800C243BF4321"} + checkpassword = get_hmac_sha256(productSecret,data) + # print(checkpassword) + # {deviceId}|{productKey}|{signMethod}|{authType}|{operator};连接id格式 + + Client_id = "{}|{}|0|1|0".format(deviceId,productKey) # + # print(Client_id) + server = "dmp-mqtts.cuiot.cn"#"dmp-mqtt.cuiot.cn" + port = 8883 + # {deviceKey}|{productKey} mqttUsername + userName = "{}|{}".format(deviceKey,productKey) + userpassword = checkpassword + # print(userName) + # print(userpassword) + # client = umqtt.MQTTClient("866610001011658|cu1shld45y4hjr1L|0|1|0","dmp-mqtt.cuiot.cn", 1883, "866610001011658|cu1shld45y4hjr1L","675f6fbfb15a729bbc280273632ce3a96f8b38d4736fbaf888fe8a48fd7aee09") + # client = umqtt.MQTTClient("lxRXQayZ4poQz8G|cujg06l29iav591b|0|0|0","dmp-mqtt.cuiot.cn", 1883, "lxRXQayZ4poQz8G|cujg06l29iav591b","1f8c69d29afca0505d967066b39d84a5eb1e54302b87e337b405f99d029a9242") + client = umqtt.MQTTClient(Client_id,server, port, userName,"{}".format(userpassword),reconn=False,ssl=True) + # client = MqttClient(Client_id, server, port, userName,"{}".format(userpassword)) + # 设置消息回调 + client.set_callback(mqttsub_cb) + # 设置异常回调 + client.error_register_cb(mqtterr_cb) + return client + +def mqtt_client_dev_init():#一机一密 + client = 0 + + # 创建一个mqtt实例 +# + # {"productKey":"cu1r1rjjrjdhz0lx","deviceKey":"DD86000000001","deviceSecret":"93FEEC6D16D30E2B90FE0DBC2FFCDB14"} 设备基本信息 + # hmac_sha256(deviceIddeviceKeyproductKey,deviceSecret) mqttclientId + deviceId = '' #"bOOSGN5FlXEjt15" + deviceKey = ''#"bOOSGN5FlXEjt15" + imei = EventMesh.publish(constants.EVENT.GET_IMEI) + deviceId = str(imei) + deviceKey = str(imei) + productKey = gewu_init() + data = "{}{}{}".format(deviceId,deviceKey,productKey)#需要用户定义产品是提供数据 + # data = b"The data to encrypt" + # 密钥 + deviceSecret_tmp = EventMesh.publish("get_deviceSecret") + subscribe_msg = deviceSecret_tmp.encode('ascii') + deviceSecret = subscribe_msg #765fc66242616852209d1c57e51b0744 ,productSecret + print(deviceSecret) + + checkpassword = get_hmac_sha256(deviceSecret,data) + print(checkpassword) + # {deviceId}|{productKey}|{signMethod}|{authType}|{operator};连接id格式 + Client_id = "{}|{}|0|0|0".format(deviceId,productKey) # 860132060346475|cu1shld45y4hjr1L|0|0|0 + server = "dmp-mqtts.cuiot.cn"#"dmp-mqtt.cuiot.cn" + port = 8883 + # {deviceKey}|{productKey} mqttUsername + userName = "{}|{}".format(deviceKey,productKey) + userpassword = checkpassword + + client = umqtt.MQTTClient(Client_id,server, port, userName,"{}".format(userpassword),reconn=False,ssl=True) + # client = MqttClient(Client_id, server, port, userName,"{}".format(userpassword)) + # 设置消息回调 + client.set_callback(mqttsub_cb) + # 设置异常回调 + client.error_register_cb(mqtterr_cb) + return client + + + +class SockManager(Abstract): + def __init__(self): + self.sock = None + self.resolver = None + self.run_flag = False + self.lost_conn_check_time = 5 * 60 * 30 + self.monitor_timer = osTimer() + self.publish_timer = osTimer() + self.reconnect_timer = osTimer() + self.mqtt_recv_timer = osTimer() + self.reconnect_time = 1000 + self.reconnect_flag = 0 + self.connect_tmp = 0 + server_data = server_init() + # EventMesh.debug_log("SockManager:server_data:{}".format(server_data)) + # self.server_addr = server_data[0] + # self.server_port = server_data[1] + self.server_addr = "" + self.server_port = "" + self.device_id = "" + self.device_key = "" + self.product_key = gewu_init() + self.deviceSecret = "" + self.client = 0 + self.client_dev = 0 + self.client_state = 0 + self.mqtt_client_count = 0 + ip_infor = {} + ip_infor = EventMesh.publish("get_new_ip_com") + EventMesh.debug_log("ip_infor1:{} \n\n\n".format(ip_infor)) + + if ip_infor != None: #已经改过服务器 + self.server_addr = ip_infor[0] + self.server_port = ip_infor[1] + else: + self.server_addr = server_data[0] + self.server_port = server_data[1] + + EventMesh.debug_log("server_addr:{} server_port:{}".format(self.server_addr,self.server_port)) + _thread.stack_size((9+3)*1024) + _thread.start_new_thread(self.connect, ()) + _thread.stack_size(8*1024) + + + self.socket_send_queue = Queue() + _thread.stack_size((9+2)*1024) + _thread.start_new_thread(self.socket_send_queue_thread, ()) + _thread.stack_size(8*1024) + EventMesh.subscribe("set_device_id",self.set_device_id) + EventMesh.subscribe("set_device_key",self.set_device_key) + EventMesh.subscribe("set_product_key",self.set_product_key) + + EventMesh.subscribe("get_device_id",self.get_device_id) + EventMesh.subscribe("get_device_key",self.get_device_key) + EventMesh.subscribe("get_product_key",self.get_product_key) + + EventMesh.subscribe("set_deviceSecret",self.set_deviceSecret) + + EventMesh.subscribe("get_deviceSecret",self.get_deviceSecret) + if EventMesh.platform == "gewu": + str = "deviceSecret:" + buf = bytearray(32+len(str)) + length = SecureData.Read(2, buf, 32+len(str)) + deviceSecret = buf.decode() + print(type(deviceSecret)) + if deviceSecret != "": + if "deviceSecret" in deviceSecret: + self.deviceSecret = deviceSecret.split(":")[1] + else: + self.deviceSecret = " " + if EventMesh.platform == "gewu": + self.client = mqtt_client_pro_init() + + def post_processor_after_instantiation(self): + EventMesh.subscribe("get_mqtt_pro_connect_state",self.get_mqtt_pro_connect_state) + EventMesh.subscribe("get_mqtt_dev_connect_state",self.get_mqtt_dev_connect_state) + EventMesh.subscribe(constants.EVENT.CHANNEL_SOCKET_SEND, self.send) + self.monitor_timer.start(7 * 60 * 1000, 1, self.check) + + def add_support_resolver(self, resolver): + self.resolver = resolver + + def initialization(self, *args, **kwargs): + _thread.stack_size(16*1024) + _thread.start_new_thread(self.recv, ()) + _thread.stack_size(8*1024) + + def set_device_id(self,event,msg): + self.device_id = str(msg) + + def get_device_id(self,event,msg): + + return self.device_id + def set_device_key(self,event,msg): + self.device_key = str(msg) + return + def get_device_key(self,event,msg): + + return self.device_key + + def set_product_key(self,event,msg): + self.product_key = str(msg) + + def get_product_key(self,event,msg): + + return self.product_key + + def set_deviceSecret(self,event,msg): + if EventMesh.platform == "gewu": + self.deviceSecret = str(msg) + deviceSecret_tmp = "deviceSecret:{}".format(msg) + SecureData.Store(2, deviceSecret_tmp, len(deviceSecret_tmp)) + + def get_deviceSecret(self,event,msg): + return self.deviceSecret + + def connect(self): + EventMesh.debug_log("connect1{}:{}".format(self.server_addr, self.server_port)) + if EventMesh.publish("get_sim_Status") != 1: #没sim + return + try: + if(self.sock != None) : + self.sock.close() + self.sock = usocket.socket(usocket.AF_INET, usocket.SOCK_STREAM) + #self.sock.setblocking(False) &self.sock.settimeout(0)不阻塞 + self.sock.connect((self.server_addr, self.server_port)) + + self.publish_timer.start(2000, 1, self.publish_timer_cb) + if EventMesh.platform == "gewu": + self.mqtt_client_count = 0 + self.mqtt_recv_timer.start(5000, 1, self.mqtt_recv_timer_cb) + + utime.sleep_ms(500) + EventMesh.publish(constants.PROTOCOL.LK_SEND) + # 发送数据 + + + except Exception as e: + usys.print_exception(e) + self.run_flag = False + else: + self.run_flag = True + EventMesh.debug_log("connect2{}:{}".format(self.server_addr, self.server_port)) + self.reconnect_flag = 0 + def publish_timer_cb(self, *args): + self.authen_set() + + def authen_set(self): + sever_state = EventMesh.publish("get_server_state")#获取修改服务器状态 + # print("sever_state{}".format(sever_state)) + if sever_state != None: + if sever_state == 0: + imei = EventMesh.publish(constants.EVENT.GET_IMEI) + server_data = EventMesh.publish("get_new_key_pid")#获取pid和key + key_data = "" + pid_data = "" + if server_data != None: + key_data = server_data[0] + pid_data = server_data[1] + else: + server_data = server_init() + key_data = server_data[2] + pid_data = server_data[3] + + # server_data = server_init() + # key_data = server_data[2] + # pid_data = server_data[3] + + sonce_data = str(urandom.getrandbits(32))#随机生成32位的随机数 + md5_data = "{}*{}*{}*{}".format(imei,pid_data,sonce_data,key_data)#md5签名 + sign_data = "" + hash_obj = uhashlib.md5(md5_data) + res = hash_obj.digest() + + # 转成十六进制表示 + sign_data = ubinascii.hexlify(res) + sign_data = sign_data.decode('ascii') + # print("sign_data:{} sonce_data:{}".format(md5_data,sign_data)) + # sign_data = MD5_head + # http://8.134.110.49:31379/dev/device/check?imei=&bid=sonce=sign= + # ip_addr = "test.iot.api.thisiot.com" + # ip_addr = "app.api.thisiot.com" + # http://app.api.thisiot.com/ + url = "http://app.api.thisiot.com/dev/device/check?imei={}&bid={}&sonce={}&sign={}".format(imei,pid_data,sonce_data,sign_data) + + # print("url:{}".format(url)) + response = request.get(url) + data_tmp ={} + # d_server_addr = "device.miwitracker.com" + # d_server_port = 8505 + # d_md5_key = "" + # d_PID = "3G" + # response.content = {'protocolType': '', 'host': 'device.miwitracker.com', 'secretKey': '', 'port': 8505, 'bid': '3G', 'extJsonStr': ''} + # response.status_code=200 + print("test-{}".format(response.status_code)) + if response.status_code == 200: + content = response.content + c = next(content) + # "api.xcloudtech.com" + # d_server_port = 9000 + jsload_data = ujson.loads(c) + print("jsload_data-{}".format(jsload_data)) + # jsload_data = {'data':'111','protocolType':'', 'host':'device.miwitracker.com', 'secretKey': 'bZld0ALsZTt15tKEZhOlLPgbsO75BLTP', 'port':8505, 'bid': '3G', 'extJsonStr': ''} + # ujson.loads(c) + + if "success" in jsload_data: + success = jsload_data["success"] + if success == True:#合法设备 + if "data" in jsload_data: + data_tmp = jsload_data["data"]#返回的数据 + print("data_tmp:{}".format(data_tmp)) + code = jsload_data["code"] + if code == 20000:#合法的设备 + protocloType = data_tmp["protocolType"]#协议类型 + host = data_tmp["host"]#服务骑地址 + secretKey = data_tmp["secretKey"]# + pid = data_tmp["bid"]#产品型号 + port = data_tmp["port"]#端口号 + + + + if host != '' and (port != '' and port != -1): + if host != '': + self.server_addr = host + EventMesh.publish("set_ip",str(self.server_addr)) + + if port != '' and port != -1: + self.server_port = port + EventMesh.publish("set_com",self.server_port) + EventMesh.publish("set_new_key", str(secretKey))#获取pid和key + EventMesh.publish("set_new_pid",str(pid))#获取pid和key + # self.reconnect_timer_cb()#重连设备 + print("self.reconnect_flag",self.reconnect_flag) + self.reconnect_flag = 0 + self.reconnect()#重连设备 + self.publish_timer.stop() + EventMesh.publish("set_server_state",1)#获取修改服务器状态 + else: + self.publish_timer.stop() + + + + def mqtt_recv_timer_cb(self, *args): + self.mqtt_clien_cb() + + + + def mqtt_clien_cb(self): + if EventMesh.platform != "gewu": + return + # 需要加密的数据 + get_deviceSecret = EventMesh.publish("get_deviceSecret") + if get_deviceSecret != None: + if self.mqtt_client_count == 0: + self.mqtt_client_count = 1 + self.mqtt_recv_timer.stop() + get_deviceSecret = EventMesh.publish("get_deviceSecret")#获取设备的秘钥 只获取一次 + print("get_deviceSecret{}".format(get_deviceSecret)) + if get_deviceSecret == '':#如果为空就获取一次 + # print("self.client:{}".format(self.client)) + mqtt_connect = -1 + try: + mqtt_connect = self.client.connect() + except Exception as e: + print(e) + mqtt_connect = -1 + print("mqtt_connect:{}".format(mqtt_connect)) + if mqtt_connect == 0 : + # 订阅主题 + get_device_id = EventMesh.publish(constants.EVENT.GET_IMEI) + get_deviceKey = EventMesh.publish(constants.EVENT.GET_IMEI) + get_productKey = gewu_init() + #$sys/{productKey}/{deviceKey}/ext/regist + client_msg = "$sys/{}/{}/ext/regist".format(get_productKey,get_deviceKey) + # client_msg = "$sys/cu1shld45y4hjr1L/866610001011658/ext/regist" + subscribe_msg = client_msg.encode('ascii') + print(subscribe_msg) + + self.client.subscribe(subscribe_msg,0)#订阅消息主题 + + + self.client.wait_msg() # 阻塞函数,监听消息 + utime.sleep(5) + get_deviceSecret = EventMesh.publish("get_deviceSecret") + if get_deviceSecret != '': + self.client.disconnect() + self.client_dev = mqtt_client_dev_init() + print(self.client_dev) + # mqtt_connect = self.client_dev.connect() + try: + mqtt_connect = self.client_dev.connect() + except Exception as e: + print(e) + mqtt_connect = -1 + if mqtt_connect == 0: + # $sys/cu1shld45y4hjr1L/bOOSGN5FlXEjt15/property/batch_reply + msg_reply = "$sys/{}/{}/property/batch_reply".format(get_productKey,get_deviceKey) + sub_msg = msg_reply.encode('ascii') + self.client_dev.subscribe(sub_msg,0)#订阅消息主题 + print("Connected to dmp-mqtt.cuiot.cn, subscribed to /public/TEST/quecpython topic") + # 发布消息 + # UnicodeHexStr_To_Utf8Str(str_data) + date_tmp = utime.localtime() + time_tmp = utime.mktime(date_tmp)#需要转换成毫秒级别 + updataTime = "{}".format(time_tmp*1000) + # imei_tmp= modem.getDevImei() + imei_tmp = EventMesh.publish(constants.EVENT.GET_IMEI) + bat_tmp = EventMesh.publish("screen_get_battery") + imei = "{}".format(imei_tmp) + power = 0 + power = int(bat_tmp[1]) + hr = 0 + hr = EventMesh.publish("get_old_hr_data") + if hr == None: + hr = 0 + deviceTime = "{}".format(time_tmp) + manufactury = "fengda" + DeviceState = "online" + + data_info = { + "messageId":"0", + "params": { + "data": [ + { + "key":"deviceOffOn", + "value": { + "deviceStatus":"Poweron", + "updateTime":updataTime, + "Imei":imei + } + + }, + { + "key":"HeartRate", + "value":{ + "heartRate":hr, + "updateTme":updataTime, + "Imei":imei + } + }, + { + "key":"powerSavingMode", + "value":0 + }, + { + "key":"IMEI", + "value":imei + }, + { + "key":"DEVICE_TIME", + "value":deviceTime + }, + { + "key":"MANUFACTURER", + "value":manufactury + }, + { + "key":"REMAINING_POWER", + "value":power + }, + { + "key":"DeviceState", + "value":DeviceState + } + ] + } + } + + data_json = ujson.dumps(data_info) + # print("data_json:{}",data_json) + # $sys/cu1shld45y4hjr1L/{deviceKey}/property/batch + msg_pub = "$sys/{}/{}/property/batch".format(get_productKey,get_deviceKey) + pub_msg = msg_pub.encode('ascii') + self.client_dev.publish(pub_msg,data_json,0)#publis主题内容 + + print("Publish topic: /public/TEST/quecpython758, msg: my name is Quecpython") + pass + + else: + mqtt_dev_connect = -1 + mqtt_ret_connect = -1 + mqtt_pro_connect = -1 + if self.client_dev == 0: + self.client_dev = mqtt_client_dev_init() + try: + mqtt_dev_connect = self.client_dev.connect() + except Exception as e: + print("erro!{}".format(e)) + mqtt_dev_connect = -2 + # Server Actively FIN Disconnected.Need Check Connection parameters + err_dis = "FIN Disconnected" in str(e) + err_parm1 = "107" in str(e) + err_parm2 = "4" in str(e) + # print("err_parm1!{} {} {} {}".format(err_parm1,err_parm2,err_info,err_dis)) + # Connect Error='4' MQTT Connect error= + if err_dis == True or err_parm1 == True or err_parm2 == True: + mqtt_dev_connect = -1 + + + if mqtt_dev_connect != 0:#连接参数错误可能是deviceScrete出错重新获取 + + try: + mqtt_ret_connect = self.client.connect()#重新获取deviceScrete + except Exception as e: + print(e) + mqtt_ret_connect = -1 + # mqtt_connect = self.client.connect() + print("mqtt_ret_connect:{}".format(mqtt_ret_connect)) + if mqtt_ret_connect == 0: + # 订阅主题 + get_device_id = EventMesh.publish(constants.EVENT.GET_IMEI) + get_deviceKey = EventMesh.publish(constants.EVENT.GET_IMEI) + get_productKey = gewu_init() + #$sys/{productKey}/{deviceKey}/ext/regist + client_msg = "$sys/{}/{}/ext/regist".format(get_productKey,get_deviceKey) + # client_msg = "$sys/cu1shld45y4hjr1L/866610001011658/ext/regist" + subscribe_msg = client_msg.encode('ascii') + print(subscribe_msg) + + self.client.subscribe(subscribe_msg,0)#订阅消息主题 + + self.client.wait_msg() # 阻塞函数,监听消息 + utime.sleep(5) + + self.client.disconnect() + self.client_dev = mqtt_client_dev_init() + # print(self.client_dev) + try: + mqtt_pro_connect = self.client_dev.connect() + except Exception as e: + print(e) + mqtt_pro_connect = -1 + # print("no deviceScret!!!!!!!{}".format(self.client_dev)) + # 设备秘钥不为空 重连获取设备失败不连接 第一次连接失败不连接不发送数据 + if EventMesh.publish("get_deviceSecret") != "" and (mqtt_pro_connect == 0 or mqtt_dev_connect == 0): + get_device_id = EventMesh.publish(constants.EVENT.GET_IMEI) + get_deviceKey = EventMesh.publish(constants.EVENT.GET_IMEI) + get_productKey = gewu_init() + # $sys/cu1shld45y4hjr1L/bOOSGN5FlXEjt15/property/batch_reply + msg_reply = "$sys/{}/{}/property/batch_reply".format(get_productKey,get_deviceKey) + sub_msg = msg_reply.encode('ascii') + # print(" deviceScret!!!!!!!{} msg_reply:{} sub_msg:{}".format(self.client_dev,msg_reply,sub_msg)) + self.client_dev.subscribe(sub_msg,0)#订阅消息主题 + print("Connected to dmp-mqtt.cuiot.cn, subscribed to /public/TEST/quecpython topic") + # 发布消息 + # UnicodeHexStr_To_Utf8Str(str_data) + date_tmp = utime.localtime() + time_tmp = utime.mktime(date_tmp)#需要转换成毫秒级别 + updataTime = "{}".format(time_tmp*1000) + imei_tmp = EventMesh.publish(constants.EVENT.GET_IMEI) + imei = "{}".format(imei_tmp) + bat_tmp = EventMesh.publish("screen_get_battery") + power = 0 + power = int(bat_tmp[1]) + hr = 0 + hr = EventMesh.publish("get_old_hr_data") + if hr == None: + hr = 0 + deviceTime = "{}".format(time_tmp) + manufactury = "fengda" + DeviceState = "online" + + data_info = { + "messageId":"0", + "params": { + "data": [ + { + "key":"deviceOffOn", + "value": { + "deviceStatus":"Poweron", + "updateTime":updataTime, + "Imei":imei + } + + }, + { + "key":"HeartRate", + "value":{ + "heartRate":hr, + "updateTme":updataTime, + "Imei":imei + } + }, + { + "key":"powerSavingMode", + "value":0 + }, + { + "key":"IMEI", + "value":imei + }, + { + "key":"DEVICE_TIME", + "value":deviceTime + }, + { + "key":"MANUFACTURER", + "value":manufactury + }, + { + "key":"REMAINING_POWER", + "value":power + }, + { + "key":"DeviceState", + "value":DeviceState + } + ] + } + } + + data_json = ujson.dumps(data_info) + # print("data_json:{}",data_json) + # $sys/cu1shld45y4hjr1L/{deviceKey}/property/batch + msg_pub = "$sys/{}/{}/property/batch".format(get_productKey,get_deviceKey) + pub_msg = msg_pub.encode('ascii') + self.client_dev.publish(pub_msg,data_json,0)#publis主题内容 + + print("Publish topic: /public/TEST/quecpython758, msg: my name is Quecpython") + + def get_mqtt_pro_connect_state(self,event,msg): + return self.client + def get_mqtt_dev_connect_state(self,event,msg): + return self.client_dev + + def check(self, *args): + if (not self.run_flag) or (self.connect_tmp == 0) : #7分钟无数据读取,则认为是掉线了 + EventMesh.debug_log("tcp reconnect!!!!!!!!!!!!!!!!!!") + EventMesh.publish(constants.EVENT.SET_CONNECT,0) #标记断网 + self.reconnect() + self.connect_tmp = 0 + def reconnect(self): + if(self.reconnect_flag == 1): + return + self.reconnect_flag = 1 + self.reconnect_timer.start(self.reconnect_time, 0, self.reconnect_timer_cb) + if self.reconnect_time < 600*1000: + self.reconnect_time += 30*1000 + + def reconnect_timer_cb(self, *args): + _thread.stack_size((9+1)*1024) + _thread.start_new_thread(self.connect, ()) + _thread.stack_size(8*1024) + + def socket_send_queue_thread(self): + while True: + data = self.socket_send_queue.get() + EventMesh.debug_log("TCP:send data1 len:{}".format(len(data))) + + #EventMesh.debug_log("ui_queue_thread:data = {}".format(data)) + socketsta = self.sock.getsocketsta() + if(socketsta == -1): #给释放了或者出错了 + continue + if(socketsta == 4):#正常连击 + if data != None: + try: + self.sock.send(data) + EventMesh.debug_log("TCP:send data2 len:{}".format(len(data))) + except Exception as e: + self.reconnect() + self.socket_send_queue.put(data)#重新把数据加回队列 + #EventMesh.debug_log("socket_send_queue_thread1:ERROR:") + #usys.print_exception(e) + elif socketsta < 4:#正在连接,等待连接成功重新发送 + count = 0 + while True: + if count > 15 : + break + utime.sleep(1) + if(self.sock.getsocketsta() == 4):# + try: + self.sock.send(data) + EventMesh.debug_log("TCP:send data3 len:{}".format(len(data))) + except Exception as e: + self.reconnect() + self.socket_send_queue.put(data)#重新把数据加回队列 + #EventMesh.debug_log("socket_send_queue_thread2:ERROR:") + #usys.print_exception(e) + break + else :#连接错误 + EventMesh.debug_log("socket_send_queue_thread:ERROR:reconnect") + self.reconnect() + utime.sleep(1) + + def send(self, topic, msg): + # EventMesh.debug_log("TCP:send data:{}".format(msg)) + if EventMesh.publish("get_sim_Status") != 1: #没sim,则不发送 + EventMesh.publish(constants.EVENT.SET_CONNECT, 0)#标记断网 + EventMesh.debug_log("dataCall not connect") + return + else : + try: + self.socket_send_queue.put(msg) + except Exception as e: + EventMesh.debug_log("self.socket_send_queue.put:ERROR:") + usys.print_exception(e) + # self.run_flag = False + + def recv(self): + data = b'' + while True: + try: + r = b'' + r = self.sock.recv(1024*5) + + if not r: + self.run_flag = False + self.reconnect() + + data = data + r + EventMesh.debug_log("TCP recv: data:len:{}".format(len(data))) + # EventMesh.debug_log("TCP recv: data:{}".format(data)) + if data[-1] != 0x5d and len(data)<20*1024: #']': + continue + self.connect_tmp = 1 #有数据,就认为是连接状态 + self.reconnect_time = 1000 + EventMesh.publish(constants.EVENT.SET_CONNECT, 1) + data_str = data.decode('ascii') + data_str = data_str.split(']') + if len(data_str) < 3 : + self.resolver.handler(data) + else : + for i in range(len(data_str)-1): + self.resolver.handler(data_str[i]) + + data = b'' + except Exception as e: + #EventMesh.debug_log("TCP:ERROR:recv:") + #usys.print_exception(e) + self.run_flag = False + self.reconnect() + + data = b'' + utime.sleep(2) + + + +class NetManager(Abstract): + THRESHOLD = 10 + + def __init__(self): + self.__data_call = dataCall + self.__net = net + self.check_net = checkNet.CheckNetwork("QuecPython_Helios_Framework", "this latest version") + EventMesh.subscribe("get_network_state", self.get_network_state) + self.network_state = 0 + + def post_processor_after_instantiation(self, *args, **kwargs): + count = 0 + while True: + count += 1 + if count > 5 : + return + data = dataCall.getInfo(1, 0) + EventMesh.debug_log("data call INFO {}".format(data)) + if data[2][0]: + self.network_state = 1 + break + utime.sleep(1) + self.__data_call.start(2, 0, "", "", "", 0) + self.__data_call.setCallback(self.__datacall_cb) + + def __datacall_cb(self, args): + pdp = args[0] + nw_sta = args[1] + if nw_sta == 1: + self.network_state = 1 + EventMesh.debug_log("*** network %d connected! ***" % pdp) + + else: + self.network_state = 0 + EventMesh.debug_log("*** network %d not connected! ***" % pdp) + + def get_network_state(self, topic, msg): + return self.network_state + + +class ProtoCol(Abstract): + TYPE = "" + HEADER = "#@{}@#;" + SEPARATOR = ";" + END = ";" + chr(0x01) + #PID = "SZKW" + #PID = "qAELPTKmFanR4RHe" + md5_key = '' + PID = '' + + def __init__(self): + self.content = None + self.check_sum = None + self.password = EventMesh.publish(constants.EVENT.GET_PASSWORD) + self.imei = EventMesh.publish(constants.EVENT.GET_IMEI) + self.cid = EventMesh.publish(constants.EVENT.GET_CID) + self.imsi = EventMesh.publish(constants.EVENT.GET_IMSI) + self.key = EventMesh.publish(constants.EVENT.GET_KEY) + self.HEADER = self.HEADER.format(self.TYPE) + + self.md5_key = '' + self.PID = '' + server_data = EventMesh.publish("get_new_key_pid")#获取pid和key + if server_data == None: + server_data = server_init()#如果获取的数据是None,就用默认的大锤key和pid + self.md5_key = server_data[2] + self.PID = server_data[3] + else: + self.md5_key = server_data[0] + self.PID = server_data[1] + + # EventMesh.debug_log("md5_key:--",self.md5_key,self.PID) + # ip_infor = {} + # ip_infor = EventMesh.publish("get_new_ip_com") + # if ip_infor != None: + # self.md5_key = ip_infor[2] + # EventMesh.debug_log("md5_key",self.md5_key) + + def initialization(self, *args, **kwargs): + EventMesh.subscribe(self.TYPE + "_SEND", self.handler) + EventMesh.subscribe(self.TYPE + "_RECV", self.handler) + #EventMesh.debug_log("ProtoCol:{}".format(self.TYPE + "_SEND")) + + def handler(self, event, msg): + #EventMesh.debug_log("ProtoCol:handler:{}".format(event)) + self.password = EventMesh.publish(constants.EVENT.GET_PASSWORD) + self.imei = EventMesh.publish(constants.EVENT.GET_IMEI)#"867387060319166"#EventMesh.publish(constants.EVENT.GET_IMEI)#"867387060319166" #EventMesh.publish(constants.EVENT.GET_IMEI)#"867387060319166"#EventMesh.publish(constants.EVENT.GET_IMEI) #"867387060319166"#EventMesh.publish(constants.EVENT.GET_IMEI) #"867387060319166"#"867387060319188"#"867387060319177"#"867387060319166"#"860132060004322"#"867387060319166"#"860132060004322"#EventMesh.publish(constants.EVENT.GET_IMEI) + self.cid = EventMesh.publish(constants.EVENT.GET_CID) + self.imsi = EventMesh.publish(constants.EVENT.GET_IMSI) + self.key = EventMesh.publish(constants.EVENT.GET_KEY) + if event.endswith("_SEND"): + self.send(event, msg) + else: + self.recv(event, msg) + + def send(self, event, msg): + pass + + def recv(self, event, msg): + pass + + @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 calc_crc(self): + data = self.content + if not isinstance(data, bytes): + data = data.encode() + count = 0 + for x in data: + count += x + self.check_sum = 100 - count % 100 + + def pack(self): + self.calc_crc() + return self.HEADER.encode() + self.content.encode() + self.SEPARATOR.encode() + int(self.check_sum).to_bytes(1,'little') + self.END.encode() + + def pack_MD5_head(self,data): + #key = "bZld0ALsZTt15tKEZhOlLPgbsO75BLTP" + self.md5_key=EventMesh.publish("get_new_key") + if self.md5_key == None: + self.md5_key = server_init[2] + + if(self.md5_key == ""): + return "" + MD5_head = "" + hash_obj = uhashlib.md5(data+self.md5_key) + res = hash_obj.digest() + + # 转成十六进制表示 + MD5_head = ubinascii.hexlify(res) + MD5_head = MD5_head.decode('ascii') + #EventMesh.debug_log("data+self.md5_key:{}".format(data+self.md5_key)) + #EventMesh.debug_log(res) + #EventMesh.debug_log(MD5_head) + return MD5_head + +class LK_ProtoCol(ProtoCol): + """链路保持""" + TYPE = "LK" + + def send(self, event, msg): + #[SZKW*334588000000156*0002*LK] + #EventMesh.debug_log('self.imei:%s'%(self.imei)) + send_data = EventMesh.publish("get_new_pid")+"*%s*0002*LK"%(self.imei) + MD5_SIGN = self.pack_MD5_head(send_data) + data = "[%s%s]"%(str(MD5_SIGN),send_data) + # EventMesh.debug_log("LK_ProtoCol:send:%s"%(data)) + + + # 通过socket发送到服务器端 + EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND, data) + + def recv(self, event, msg): + """ + + @param event: LK成功 + @param msg: 接收到的下行数据 + """ + EventMesh.debug_log("LK_ProtoCol:recv:%s"%(msg)) + EventMesh.publish(constants.PROTOCOL.PING_SEND) + EventMesh.publish(constants.PROTOCOL.KA_SEND) + EventMesh.publish(constants.PROTOCOL.TIME_SEND) + + EventMesh.publish(constants.EVENT.START_LOCATION,constants.PROTOCOL.UD_SEND) #开始UD定位 + EventMesh.publish(constants.EVENT.START_LOCATION,constants.PROTOCOL.WT_SEND) #开始WT定位 + if EventMesh.model == 'D15': + EventMesh.publish(constants.PROTOCOL.MEMBERS_SEND) + +class PING_ProtoCol(ProtoCol): + """获取绑定状态""" + TYPE = "PING" + + def send(self, event, msg): + #[SZKWT*YYYYYYYYYYYYYYY*LEN*PING] + send_data = EventMesh.publish("get_new_pid")+"*%s*0004*PING"%(self.imei) + MD5_SIGN = self.pack_MD5_head(send_data) + data = "[%s%s]"%(str(MD5_SIGN),send_data) + #EventMesh.debug_log("PING_ProtoCol:send:%s"%(data)) + # 通过socket发送到服务器端 + EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND, data) + + def recv(self, event, msg): + """ + + @param event: PING + @param msg: 接收到的下行数据 + """ + #EventMesh.debug_log("PING_ProtoCol:recv:%s"%(msg)) + data_tmp = msg.decode('ascii') + data_tmp = data_tmp.split(']')[0] #去掉] + EventMesh.publish(constants.EVENT.SET_PING, data_tmp.split(',')[1]) + if EventMesh.model == 'D15': + EventMesh.publish(constants.PROTOCOL.JPREG_SEND) + EventMesh.publish(constants.PROTOCOL.MEMBERS_SEND) + +class KA_ProtoCol(ProtoCol): + """心跳""" + TYPE = "KA" + count = 0 + roll_count = 0 + def send(self, event, msg): + #"{:04d}-{:02d}-{:02d}".format(*utime.localtime()[0:3]) + #[XT*YYYYYYYYYYYYYYY*LEN*KA,日期,步数,翻滚次数,电量百分数,车载里程数(km)] 实例:[XT*334588000000156*0014*KA,120414,50,100,100,100.12] + date = "{:04d}{:02d}{:02d}".format(*utime.localtime()[0:3]) + date = date[2:] + #EventMesh.debug_log("date:",date) + #步数 + old_step = 0 + step = 0 + step = EventMesh.publish("get_old_step_value") + if step != None: + if step != 0: + read_data = EventMesh.publish("get_storage_config","old_step_new") + if read_data != None: + old_step = read_data + + if old_step != step: + # EventMesh.debug_log("old_step:send:%d %d"%(old_step,step)) + EventMesh.publish("set_storage_config",["old_step_new",step+10]) + EventMesh.publish("set_storage_config",["old_step_new",step]) + + old_step = step + # step = EventMesh.publish(constants.EVENT.GET_STEP)[0] + # 电池电量百分比 + + bat_tmp = EventMesh.publish("screen_get_battery") + sleep_time = EventMesh.publish("get_storage_config","sleep_time") + if sleep_time != None: + if len(sleep_time) != 0: + hour = utime.localtime()[3] + min = utime.localtime()[4] + cur_time = hour*60+min + start_hour = int(sleep_time["start_hour"]) + start_min = int(sleep_time["start_min"]) + start_total = start_hour*60+start_min + + end_hour = int(sleep_time["end_hour"]) + end_min = int(sleep_time["end_min"]) + end_total = end_hour*60+end_min + # EventMesh.debug_log("ka roll_:",hour,min,cur_time,start_total,end_total) + if cur_time >= start_total and cur_time <= end_total: + self.roll_count = int(hour) + if self.roll_count == 0: + self.roll_count+=1 + else: + self.roll_count = 0 + else: + self.roll_count = 0 + else: + self.roll_count = 0 + hour = utime.localtime()[3] + min = utime.localtime()[4] + EventMesh.txt_log("ka step:{} hour:{} min:{}".format(step,hour,min)) + + battery_caption = bat_tmp[1] + send_data = "KA,%s,%d,%d,%d"%(date,step,self.roll_count,battery_caption) + send_len = len(send_data) + + send_data = EventMesh.publish("get_new_pid")+"*%s*%04X*%s"%(self.imei,send_len,send_data) + MD5_head_data = EventMesh.publish("get_new_pid")+"*%s*%04X*%s"%(self.imei,send_len,"KA") + + MD5_SIGN = self.pack_MD5_head(MD5_head_data) + data = "[%s%s]"%(str(MD5_SIGN),send_data) + #EventMesh.debug_log("KA_ProtoCol:send:%s"%(data)) + + + # 通过socket发送到服务器端 + EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND, data) + + def recv(self, event, msg): + """ + + @param event: PING + @param msg: 接收到的下行数据 + """ + #EventMesh.debug_log("KA_ProtoCol:recv:%s"%(msg)) + +class UD_ProtoCol(ProtoCol): + """位置信息""" + TYPE = "UD" + UD_count = 0#每6次定位获取一次天气数据 + def send(self, event, msg): + #EventMesh.debug_log("UD:send:%s"%(msg)) + #"{:04d}-{:02d}-{:02d}".format(*utime.localtime()[0:3]) + #[6f62cfc40fc50173f9a7b21e87be3424IS*861217001020120*00f6*UD,220726,211210,A,22.649529,N,114.119165,E,0.28,137.4,100.0,8,24,63,119,0,00000000,2,1,460,11,30472,125667122,24,30472,218944048,19,4, + # wifi0,34:93:44:01:28:b9,-74,wifi1,34:20:03:96:35:ad,-78,wifi2,ea:b5:7b:e8:56:54,-80,wifi3,c4:49:bb:d4:d9:78,-88] + + + self.UD_count+=1 + #每6次定位获取一次天气数据 + if self.UD_count>=6: + self.UD_count = 0 + EventMesh.publish(constants.PROTOCOL.WT_SEND,msg) + + send_data ="UD,"+msg + send_len = len(send_data) + #wt_data = "%s"%(send_data) + send_data = EventMesh.publish("get_new_pid")+"*%s*%04X*%s"%(self.imei,send_len,send_data) + MD5_head_data = EventMesh.publish("get_new_pid")+"*%s*%04X*%s"%(self.imei,send_len,"UD") + + MD5_SIGN = self.pack_MD5_head(MD5_head_data) + data = "[%s%s]"%(str(MD5_SIGN),send_data) + # EventMesh.debug_log("{}".format(data)) + # wt_data = EventMesh.publish("get_weather_data") + # # #如果没有天气数据,则获取天气数据 + # if wt_data != None or wt_data[0] == None : + # + EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND, data) + if EventMesh.platform == "gewu": + if(msg != ""): + client = EventMesh.publish("get_mqtt_dev_connect_state") + if client != 0: + mqtt_connect = -1 + try: + mqtt_connect = client.connect() + except Exception as e: + print(e) + mqtt_connect = -1 + print("mqtt_connect:{}".format(mqtt_connect)) + if mqtt_connect == 0: + # 订阅主题 + get_device_id = EventMesh.publish(constants.EVENT.GET_IMEI) + get_deviceKey = EventMesh.publish(constants.EVENT.GET_IMEI) + get_productKey = gewu_init() + #$sys/{productKey}/{deviceKey}/ext/regist + event_msg = "$sys/{}/{}/event/pub_reply".format(get_productKey,get_deviceKey) + # client_msg = "$sys/cu1shld45y4hjr1L/866610001011658/ext/regist" + subscribe_msg = event_msg.encode('ascii') + + client.subscribe(subscribe_msg,0)#订阅事件消息消息主题 + print("Connected to dmp-mqtt.cuiot.cn, subscribed to /public/TEST/quecpython topic") + msg_tmp = msg.decode('ascii') + msg_tmp = msg_tmp.split(',') + longitude = float(msg_tmp[3]) + latitude = float(msg_tmp[5]) + date_tmp = utime.localtime() + time_tmp = utime.mktime(date_tmp)#需要转换成毫秒级别 + updataTime = "{}".format(time_tmp*1000) + data_info = { + "messageId":"0", + "params": { + "key":"location", + "info": [ + { + "key":"longitude", + "value":longitude + }, + { + "key":"latitude", + "value":latitude + }, + { + "key":"UpdateTime", + "value":updataTime + } + ] + } + } + data_json = ujson.dumps(data_info) + event_pub_msg = "$sys/{}/{}/event/pub".format(get_productKey,get_deviceKey) + pub_msg = event_pub_msg.encode('ascii') + client.publish(pub_msg,data_json,0)#publis主题内容 + + print("Publish topic: /public/TEST/quecpython758, msg: my name is Quecpython") + + + + def recv(self, event, msg): + pass + # EventMesh.debug_log("UD_ProtoCol:recv:%s"%(msg)) + +class CR_ProtoCol(ProtoCol): + """立即定位""" + TYPE = "CR" + + def send(self, event, msg): + #[SZKWT*YYYYYYYYYYYYYYY*LEN*PING] + send_data = EventMesh.publish("get_new_pid")+"*%s*0002*CR"%(self.imei) + MD5_SIGN = self.pack_MD5_head(send_data) + data = "[%s%s]"%(str(MD5_SIGN),send_data) + #EventMesh.debug_log("CR_ProtoCol:send:%s"%(data)) + # 通过socket发送到服务器端 + EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND, data) + + def recv(self, event, msg): + """ + + @param event: PING + @param msg: 接收到的下行数据 + """ + EventMesh.publish(constants.PROTOCOL.CR_SEND) + EventMesh.publish(constants.EVENT.START_LOCATION,constants.PROTOCOL.UD_SEND) #开始ud定位 + #EventMesh.debug_log("CR_ProtoCol:recv:%s"%(msg)) + +class AL_ProtoCol(ProtoCol): + """报警数据上报""" + TYPE = "AL" + timer_repetition_send = None + repetition_queue = None + + def send(self, event, msg): + if EventMesh.platform != "gewu": + if self.timer_repetition_send == None: + self.timer_repetition_send = osTimer() + if self.repetition_queue == None: + self.repetition_queue = Queue(100) + + + send_data ="AL,"+msg + send_len = len(send_data) + #wt_data = "%s"%(send_data) + send_data = EventMesh.publish("get_new_pid")+"*%s*%04X*%s"%(self.imei,send_len,send_data) + MD5_head_data = EventMesh.publish("get_new_pid")+"*%s*%04X*%s"%(self.imei,send_len,"AL") + + MD5_SIGN = self.pack_MD5_head(MD5_head_data) + data = "[%s%s]"%(str(MD5_SIGN),send_data) + # EventMesh.debug_log("AL_ProtoCol:send:{}".format(data)) + # 通过socket发送到服务器端 + EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND, data) + if EventMesh.platform != "gewu": + self.repetition_queue.put(data)#发送入队 + self.timer_repetition_send.start(10000, 1, self.repetition_timer_cb) + EventMesh.publish("set_dev_state",0) + def recv(self, event, msg): + """ + + @param event: PING + @param msg: 接收到的下行数据 + """ + #EventMesh.publish(constants.PROTOCOL.CR_SEND) + #EventMesh.publish(constants.EVENT.START_LOCATION,constants.PROTOCOL.UD_SEND) #开始ud定位 + # print("报警数据上报:recv:%s"%(msg)) + EventMesh.debug_log("报警数据上报:recv:{}".format(msg)) + # + if EventMesh.platform != "gewu": + if self.repetition_queue.empty() == False: + self.repetition_queue.get()#出队 + else: + self.timer_repetition_send.stop() + + def repetition_timer_cb(self, *args, **kwargs):#每隔10秒发送一次 + if self.repetition_queue.empty() == False: + data = self.repetition_queue.get()#出队 + self.repetition_queue.put(data)#发送入队 + EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND, data) + else: + self.timer_repetition_send.stop() + +class FIND_ProtoCol(ProtoCol): + """查找设备""" + TYPE = "FIND" + + def send(self, event, msg): + #[SZKWT*YYYYYYYYYYYYYYY*LEN*PING] + send_data = EventMesh.publish("get_new_pid")+"*%s*0004*FIND"%(self.imei) + MD5_SIGN = self.pack_MD5_head(send_data) + data = "[%s%s]"%(str(MD5_SIGN),send_data) + #EventMesh.debug_log("FIND_ProtoCol:send:%s"%(data)) + # 通过socket发送到服务器端 + EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND, data) + + def recv(self, event, msg): + """ + + @param event: FIND,播放铃声 + @param msg: 接收到的下行数据 + """ + EventMesh.publish(constants.PROTOCOL.FIND_SEND) + # a = audio.Audio(0) + # a.set_pa(Pin.GPIO29) + # a.setVolume(10) + # a.play(1, 1, 'E:/audio_find_haixiu.mp3') #文件名前面要加上路径 + + # EventMesh.publish("load_screen", {"screen": "FIND"}) + EventMesh.publish("OPEN_FIND_WATCH")# + #EventMesh.debug_log("FIND_ProtoCol:recv:%s"%(msg)) + +class POWEROFF_ProtoCol(ProtoCol): + """关机""" + TYPE = "POWEROFF" + + def send(self, event, msg): + # [SZKW*867387060319491*0008*POWEROFF] + send_data = EventMesh.publish("get_new_pid")+"*%s*0008*POWEROFF"%(self.imei) + MD5_SIGN = self.pack_MD5_head(send_data) + data = "[%s%s]"%(str(MD5_SIGN),send_data) + #EventMesh.debug_log("POWEROFF_ProtoCol:send:%s"%(data)) + # 通过socket发送到服务器端 + EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND, data) + + def recv(self, event, msg): + """ + + @param event: POWEROFF关机 + @param msg: 接收到的下行数据 + """ + EventMesh.publish(constants.PROTOCOL.POWEROFF_SEND) + #EventMesh.debug_log("POWEROFF_ProtoCol:recv:%s"%(msg)) + battery = EventMesh.publish("screen_get_battery") + if battery != None: + if battery[0] != "1": + EventMesh.publish("open_power_on", 2)# #远程关机 + +class PHL_ProtoCol(ProtoCol): + """电话本同步""" + TYPE = "PHL" + + + def send(self, event, msg): + # [SZKW*867387060319491*0008*PHL] + send_data = EventMesh.publish("get_new_pid")+"*%s*0003*PHL"%(self.imei) + MD5_SIGN = self.pack_MD5_head(send_data) + data = "[%s%s]"%(str(MD5_SIGN),send_data) + #EventMesh.debug_log("POWEROFF_ProtoCol:send:%s"%(data)) + # 通过socket发送到服务器端 + EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND, data) + + def recv(self, event, msg): + """ + + @param event: 电话本同步 + @param msg: 接收到的下行数据 + """ + msg = msg[1:-1] + # EventMesh.debug_log("phonebook:msg:%s\r\n"%msg) + msg_tmp = msg.decode('ascii') + msg_tmp = msg_tmp.split(',') + # EventMesh.debug_log("phonebook:len:{}\r\n data:{}".format(len(msg_tmp),msg_tmp)) + + phonebook = {} + msg_tmp = msg_tmp[1:] + + j = 0 + i = 0 + phonebook_oldtmp = {} + # 0 1 2 3 + for phonebook_tmp in msg_tmp: + j+=1 + # EventMesh.debug_log("phonebook_tmp:{} len:{}".format(phonebook_tmp,len(phonebook_tmp))) + + if (j%2) == 0: + i+=1 + if len(phonebook_tmp) != 0: + phonebook_name = UnicodeHexStr_To_Utf8Str(phonebook_tmp) + phonebook_name = "{}:{}".format("%03d"%i,phonebook_name) + phonebook[phonebook_name] = phonebook_oldtmp + + phonebook_oldtmp = phonebook_tmp + # EventMesh.debug_log("phonebook_oldtmp!!!:{}".format(str(phonebook_oldtmp))) + # EventMesh.debug_log("phonebook!!!:{}".format(str(phonebook))) + with open("/usr/static/storage_file/phonebook.json","w",encoding="utf-8") as fd: + ujson.dump(phonebook,fd) + EventMesh.debug_log("创建电话簿") + + EventMesh.publish(constants.PROTOCOL.PHL_SEND) + EventMesh.publish("set_phonebook_list",[1,phonebook]) + EventMesh.publish("contact_updata_list_show") + + +class WT_ProtoCol(ProtoCol): + """天气数据""" + TYPE = "WT" + WT_T = 0 + + def send(self, event, msg): + # [SZKW*867387060319491*0008*WT] + # if self.WT_T != 0: + # tmp_WT = + if(msg != ""): + msg_tmp = "WT," + msg + data_len = len(msg_tmp) + MD5_head_data = EventMesh.publish("get_new_pid")+"*%s*%04X*WT"%(self.imei,data_len) + MD5_SIGN = self.pack_MD5_head(MD5_head_data) + send_data = EventMesh.publish("get_new_pid")+"*%s*%04X*%s"%(self.imei,data_len,msg_tmp) + data = "[%s%s]"%(str(MD5_SIGN),send_data) + EventMesh.debug_log("WT_ProtoCol:send:%s"%(data)) + # 通过socket发送到服务器端 + EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND, data) + + def recv(self, event, msg): + """ + + @param event: T天气温度数据下发 + @param msg: 接收到的下行数据 + """ + # b'SZKW*860132060004322*0035*WT,23-04-06,14:41:06,b6e0d4c6,1,27,-1,40,6DF157335E02' + msg = msg[1:-1] + msg_tmp = msg.decode('ascii') + msg_tmp = msg_tmp.split('WT,') + # EventMesh.debug_log("phonebook:len:{}\r\n data:{}".format(len(msg_tmp),msg_tmp)) + msg_tmp = str(msg_tmp[1]) + + # EventMesh.debug_log("msg_tmp :%s"%(msg_tmp)) + + msg_date = msg_tmp.split(',')[0] + + msg_time = msg_tmp.split(',')[1] + msg_weather_content = msg_tmp.split(',')[2] + msg_type = msg_tmp.split(',')[3] + msg_temp = msg_tmp.split(',')[4] + msg_min_temp = msg_tmp.split(',')[5] + msg_max_temp = msg_tmp.split(',')[6] + msg_city = msg_tmp.split(',')[7] + + msg_city = UnicodeHexStr_To_Utf8Str(msg_city) + msg_weather_content = UnicodeHexStr_To_Utf8Str(msg_weather_content) + # EventMesh.debug_log("msg_date:{} msg_time:{} msg_weather_content:{} msg_type:{} msg_temp:{} msg_min_temp:{} msg_max_temp:{} msg_city:{}".format(msg_date,msg_time,\ + # msg_weather_content,msg_type,msg_temp,msg_min_temp,msg_max_temp,msg_city)) + EventMesh.debug_log("WT_ProtoCol RECV msg:%s"%(msg)) + + EventMesh.publish("set_weather_data",[msg_date,msg_time,msg_weather_content,msg_type,msg_temp,msg_min_temp,msg_max_temp,msg_city,1]) + EventMesh.publish("updata_weather_show") +class REMIND_ProtoCol(ProtoCol):#普通闹钟 + """ + + 平台发送: + [XT*YYYYYYYYYYYYYYY*LEN*REMIND,,时间1-开关,时间2-开关,周几] + 实例:[XT*334588000000156*0008*REMIND,,时间1-开关,时间2-开关,周几] + 终端回复: + [XT*YYYYYYYYYYYYYYY*LEN*REMIND] + """ + TYPE = "REMIND" + + def send(self, event, msg): + send_data = EventMesh.publish("get_new_pid")+"*%s*0006*REMIND"%(self.imei) + MD5_SIGN = self.pack_MD5_head(send_data) + data = "[%s%s]"%(str(MD5_SIGN),send_data) + #Wechat_log("POWEROFF_ProtoCol:send:%s"%(data)) + # 通过socket发送到服务器端 + EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND, data) + + def recv(self, event, msg): + # SZKW*860132060346475*0013*REMIND_CH_MEDICINE2,4-1 + msg = msg[1:-1] + msg_tmp = msg.decode('ascii') + msg_tmp_new = str(msg_tmp.split('REMIND,')[1]) + msg_tmp_data = str(msg_tmp.split('REMIND')[1]) + count = 0 + for i in str(msg_tmp_data): + # print("i",i) + if i == ",": + count+=1 + + normal_alarm_save = [] + # # ("handler -> b'[SZKW*860132060346475*001C*REMIND,08:00-1-1,,]'",) + # b'[SZKW*860132060346475*001B*REMIND,08:00-1-1,,]'",) + # medicine_alarmday = str(msg_data[4]) + # alarmday=[] + alarm_day = [] + alarm_switch = 0 + + print("count",count,msg_tmp_new) + if count >= 3: + count = 3 + for i in range(0,count):#默认是三个时间多了也不保存 + alarm_day = [] + alarm_data = str(msg_tmp_new.split(',')[i]) + # print("i",i,sleep_data) + if len(alarm_data) != 0: + b = alarm_data.find('-') + if b != -1: + alarm_time = alarm_data.split('-')[0]#-作为分隔符 + alarm_switch = int(alarm_data.split('-')[1])#开关 + alarm_repeat = int(alarm_data.split('-')[2])#是单次还是每天 还是自定义 + + alarm_hour = int(alarm_time.split(":")[0])#时间 + alarm_min = int(alarm_time.split(":")[1])#冒号分隔时间 时 分 + + + if alarm_repeat == 2:#每一天 + alarm_day = [0,1,2,3,4,5,6] + elif alarm_repeat == 3:#自定义 + alarm_day_tmp = alarm_data.split('-')[3]#-作为分隔符 + if len(str(alarm_day_tmp)) != 0: + for i in range(0,7): + if alarm_day_tmp[i] != '0': + alarm_day.append(i) + else:#单次 1 + alarm_day=[] + if alarm_switch != 0: + normal_alarm_save.append({"hour":alarm_hour,"min":alarm_min,"day":alarm_day,"enable":alarm_switch}) + + EventMesh.publish("set_storage_config",["normal_alarm",normal_alarm_save]) + # normal_alarm = EventMesh.publish("get_storage_config","normal_alarm") + + # EventMesh.debug_log("recv REMIND_SEND:{} normal_alarm ;{}".format(msg,normal_alarm)) + + EventMesh.publish(constants.PROTOCOL.REMIND_SEND) + EventMesh.publish("clear_normal_alarm") + + + + + + + +class HRSTART_ProtoCol(ProtoCol): + """心率频率数据""" + TYPE = "hrtstart" + + + def send(self, event, msg): + # [SZKW*867387060319491*0008*hrtstart] + send_data = EventMesh.publish("get_new_pid")+"*%s*0008*hrtstart"%(self.imei) + MD5_SIGN = self.pack_MD5_head(send_data) + data = "[%s%s]"%(str(MD5_SIGN),send_data) + # EventMesh.debug_log("HRSTART_ProtoCol:send:%s"%(data)) + # 通过socket发送到服务器端 + EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND,data) + + def recv(self, event, msg): + """ + @param event: 心率数据下发 + @param msg: 接收到的下行数据 + """ + # b'SZKW*860132060004322*0035*REMIND,23-04-06,14:41:06,b6e0d4c6,1,27,-1,40,6DF157335E02' + # EventMesh.debug_log("REMIND_ProtoCol RECV msg:%s"%(msg)) + # HRSTART_ProtoCol RECV msg:b'SZKW*860132060004322*000D*hrtstart,7200' msg_:7200 + msg = msg[1:-1] + msg_tmp = msg.decode('ascii') + msg_tmp = msg_tmp.split(',') + msg_tmp = msg_tmp[1] + EventMesh.debug_log("HRSTART_ProtoCol RECV msg:{} msg_:{}".format(msg,msg_tmp)) + hrTotal = int(msg_tmp) + if hrTotal == 1:#单次测量 + EventMesh.debug_log("HRSTART_ 2".format(hrTotal)) + 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 == 3 ) or (get_spo2_state == 0 and get_hr_state == 0):#只要两个不在测量 单次优先级最低 + if (get_spo2_state == 0 and get_hr_state == 0 and get_bg_state == 0 and get_bp_state == 0): + battery = EventMesh.publish("screen_get_battery") + if battery != None: + if battery[0] != "1": + EventMesh.publish("set_hr_state",3)#3代表单次测量 + pass + else: + if hrTotal > 0 and hrTotal <= 300: + hrTotal = 300 + elif hrTotal >= 65536: + hrTotal = 65536 + EventMesh.debug_log("HRSTART_ 3".format(hrTotal)) + on = 0 + if hrTotal != 0: + on = 1 + EventMesh.publish("set_time_hr",[on,hrTotal]) + + + EventMesh.publish(constants.PROTOCOL.HRTSTART_SEND) + +class HEART_ProtoCol(ProtoCol): + """心率数据""" + TYPE = "heart" + + + def send(self, event, msg): + # [SZKW*334588000000156*len*heart,x] + # EventMesh.debug_log("HEART:send:{}".format(msg)) + len_size = len(str(msg))+len("heart,") + send_data = EventMesh.publish("get_new_pid")+"*%s*%04X*heart"%(self.imei,len_size) + MD5_head_data = EventMesh.publish("get_new_pid")+"*%s*%04X*%s"%(self.imei,len_size,"heart") + MD5_SIGN = self.pack_MD5_head(MD5_head_data) + data = "[%s%s,%d]"%(str(MD5_SIGN),send_data,msg) + # EventMesh.debug_log("HEART_ProtoCol:data:%s"%(data)) + # 通过socket发送到服务器端 + EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND,data) + + def recv(self, event, msg): + """ + @param event: 心率数据下发 + @param msg: 接收到的下行数据 + """ + # EventMesh.debug_log("HRSTART_ProtoCol RECV msg:") + #EventMesh.publish(constants.PROTOCOL.HEART_SEND) +class OXYGEN_ProtoCol(ProtoCol): + """上传血氧测试数据""" + TYPE = "oxygen" + def send(self, event, msg): + # [SZKW*334588000000156*len*heart,x] + # EventMesh.debug_log("oxstart:send:{}".format(msg)) + len_size = len(str(msg))+len("oxygen,") + send_data = EventMesh.publish("get_new_pid")+"*%s*%04X*oxygen"%(self.imei,len_size) + MD5_head_data = EventMesh.publish("get_new_pid")+"*%s*%04X*%s"%(self.imei,len_size,"oxygen") + MD5_SIGN = self.pack_MD5_head(MD5_head_data) + data = "[%s%s,%d]"%(str(MD5_SIGN),send_data,msg) + # EventMesh.debug_log("HEART_ProtoCol:data:%s"%(data)) + # 通过socket发送到服务器端 + EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND,data) + + def recv(self, event, msg): + """ + @param event: 心率数据下发 + @param msg: 接收到的下行数据 + """ + # EventMesh.debug_log("HRSTART_ProtoCol RECV msg:") + #EventMesh.publish(constants.PROTOCOL.OXYGEN_SEND) + +class OXYGEN_One_ProtoCol(ProtoCol):#单次测量 + """上传单次测量测试数据""" + TYPE = "oxstart" + +# 终端发送[XT*YYYYYYYYYYYYYYY*LEN*oxygen,x] +# x 表示血氧饱和度 +# 示例[XT*334588000000156*0009*oxygen,15] +# 平台回复:handler -> b'[SZKW*860132060004322*0009*oxstart,1]' +# [XT*334588000000156*0006*oxygen] + def send(self, event, msg): + # [SZKW*334588000000156*len*heart,x] + EventMesh.debug_log("oxstart:") + send_data = EventMesh.publish("get_new_pid")+"*%s*0007*oxstart"%(self.imei) + MD5_SIGN = self.pack_MD5_head(send_data) + data = "[%s%s]"%(str(MD5_SIGN),send_data) + # EventMesh.debug_log("HEART_ProtoCol:data:%s"%(data)) + # 通过socket发送到服务器端 + EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND,data) + + def recv(self, event, msg): + """ + @param event: 血氧单次测量下发 + @param msg: 接收到的下行数据 + """ + EventMesh.debug_log("oxstart:{}".format(msg)) + msg = msg[1:-1] + msg_tmp = msg.decode('ascii') + msg_tmp = msg_tmp.split(',') + msg_tmp = msg_tmp[1] + + oxstartTotal = int(msg_tmp) + # oxstartTotal = 300 + print("oxstartTotal:{}".format(oxstartTotal)) + if oxstartTotal == 1:#单次测量 + get_bp_state = EventMesh.publish("get_bp_state") + get_hr_state = EventMesh.publish("get_hr_state") + get_spo2_state = EventMesh.publish("get_spo2_state") + get_bg_state = EventMesh.publish("get_bp_state") + print("get_bp_state:{}".format(get_bp_state)) + if get_bp_state == 0 and get_hr_state == 0 and get_spo2_state == 0 and get_bg_state == 0:#只要两个不在测量 单次优先级最低 + battery = EventMesh.publish("screen_get_battery") + if battery != None: + if battery[0] != "1": + EventMesh.publish("set_spo2_state",3)#3代表单次测量 + else: + if oxstartTotal > 0 and oxstartTotal <= 300: + oxstartTotal = 300 + elif oxstartTotal >= 65536: + oxstartTotal = 65536 + + # if oxstartTotal == 0:#关闭自动测量 + # EventMesh.debug_log("bpSTART_ 1") + # EventMesh.publish("set_spo2_time",[0,0]) + # else: + on = 0 + if oxstartTotal != 0: + on = 1 + EventMesh.publish("set_spo2_time",[on,oxstartTotal]) + + EventMesh.publish(constants.PROTOCOL.OXSTART_SEND) + +class TEMP_ProtoCol(ProtoCol): + """上传体温测试数据""" + TYPE = "temp" + def send(self, event, msg): + # [SZKW*334588000000156*len*heart,x] + # EventMesh.debug_log("temp:send:{}".format(msg)) + len_size = len(str(msg[0]))+len("temp,")+1+len(str(msg[1])) + EventMesh.debug_log("temp:send:{} len:{}".format(msg,len_size)) + # 实例:[XT*334588000000156*0009*temp,36.2] + # 代表终端的温度为:36.2 + # 平台回复: + # [XT*334588000000156*0004*temp] + send_data = EventMesh.publish("get_new_pid")+"*%s*%04X*temp"%(self.imei,len_size) + MD5_head_data = EventMesh.publish("get_new_pid")+"*%s*%04X*%s"%(self.imei,len_size,"temp") + MD5_SIGN = self.pack_MD5_head(MD5_head_data) + data = "[%s%s,%d.%d]"%(str(MD5_SIGN),send_data,msg[0],msg[1]) + # EventMesh.debug_log("temp:data:%s"%(data)) + # 通过socket发送到服务器端 + EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND,data) + + def recv(self, event, msg): + """ + @param event: + @param msg: 接收到的下行数据 + """ + # EventMesh.debug_log("HRSTART_ProtoCol RECV msg:") + #EventMesh.publish(constants.PROTOCOL.TEMP_SEND) + +class WDSTART_ProtoCol(ProtoCol): + """上传体温频率""" + TYPE = "wdstart" + def send(self, event, msg): + #[XT*334588000000156*len*wdstart,300] + send_data = EventMesh.publish("get_new_pid")+"*%s*0007*wdstart"%(self.imei) + MD5_SIGN = self.pack_MD5_head(send_data) + data = "[%s%s]"%(str(MD5_SIGN),send_data) + # EventMesh.debug_log("temp:data:%s"%(data)) + # 通过socket发送到服务器端 + EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND,data) + + def recv(self, event, msg): + """ + @param event: 体温下发频率数据 + @param msg: 接收到的下行数据 + """ + # EventMesh.debug_log("WDSTART_ProtoCol RECV msg:") + EventMesh.debug_log("wdstart:{}".format(msg)) + msg = msg[1:-1] + msg_tmp = msg.decode('ascii') + msg_tmp = msg_tmp.split(',') + msg_tmp = msg_tmp[1] + + tempTotal = int(msg_tmp) + EventMesh.debug_log("tempTotal:{}".format(tempTotal)) + if tempTotal == 1:#单次测量 + get_temp_state = EventMesh.publish("get_temp_state") + EventMesh.debug_log("get_temp_state:{}".format(get_temp_state)) + if get_temp_state == 0:#只要两个不在测量 单次优先级最低 + battery = EventMesh.publish("screen_get_battery") + if battery != None: + if battery[0] != "1": + EventMesh.publish("set_temp_state",3)#3代表单次测量 + else: + if tempTotal > 0 and tempTotal <= 300: + tempTotal = 300 + elif tempTotal >= 65536: + tempTotal = 65536 + + EventMesh.publish("set_temp_time",tempTotal) + + + + EventMesh.publish(constants.PROTOCOL.WDSTART_SEND) +#解绑 +# 设置血压上传频率 +# 平台发送[XT*YYYYYYYYYYYYYYY*LEN*bldstart,x] +# x为上传间隔时间,单位秒,连续上传时最小时间不小于300秒,最大不超过65535. +# 示例[XT*334588000000156*0008*bldstart,300] +# 终端回复: +# [XT*334588000000156*0005*bldstart] +# x为1则代表终端单次上传。 +# x为0则代表终端上传关闭。 +class bldstart_ProtoCol(ProtoCol): + """app下发血压测试频率""" + TYPE = "bldstart" + def send(self, event, msg): + #[XT*334588000000156*len*wdstart,300] + send_data = EventMesh.publish("get_new_pid")+"*%s*0008*bldstart"%(self.imei) + MD5_SIGN = self.pack_MD5_head(send_data) + data = "[%s%s]"%(str(MD5_SIGN),send_data) + # print("temp:data:%s"%(data)) + # 通过socket发送到服务器端 + EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND,data) + + def recv(self, event, msg): + """ + @param event: 体温下发频率数据 + @param msg: 接收到的下行数据 + """ + # print("WDSTART_ProtoCol RECV msg:") + print("bldstart:{}".format(msg)) + msg = msg[1:-1] + msg_tmp = msg.decode('ascii') + msg_tmp = msg_tmp.split(',') + msg_tmp = msg_tmp[1] + + bldstartTotal = int(msg_tmp) + # bldstartTotal = 300 + print("bldstartTotal:{}".format(bldstartTotal)) + if bldstartTotal == 1:#单次测量 + get_bp_state = EventMesh.publish("get_bp_state") + get_hr_state = EventMesh.publish("get_hr_state") + get_spo2_state = EventMesh.publish("get_spo2_state") + get_bg_state = EventMesh.publish("get_bg_state") + print("get_bp_state:{}".format(get_bp_state)) + if get_bp_state == 0 and get_hr_state == 0 and get_spo2_state == 0 and get_bg_state == 0:#只要两个不在测量 单次优先级最低 + battery = EventMesh.publish("screen_get_battery") + if battery != None: + if battery[0] != "1": + EventMesh.publish("set_bp_state",3)#3代表单次测量 + else: + if bldstartTotal > 0 and bldstartTotal <= 300: + bldstartTotal = 300 + elif bldstartTotal >= 65536: + bldstartTotal = 65536 + + on = 0 + if bldstartTotal != 0:#关闭自动测量 + on = 1 + print("on:{} bldstartTotal:{} ".format(on,bldstartTotal)) + EventMesh.publish("set_bp_time",[on,bldstartTotal]) + + EventMesh.publish(constants.PROTOCOL.BLDSTART_SEND) + + +# 注:回复完后开始测量血压并上传(一般测一次90秒,app端会提醒用户两分钟后刷新页面查看) +# 上传血压数据 +# 终端发送[XT*YYYYYYYYYYYYYYY*LEN*blood,x,y] +# x 是收缩压(高压) +# y 是舒张压(低压) +# 示例[XT*334588000000156*000C*blood,150,70] +# 平台回复: +# [XT*334588000000156*0005*blood] +class blood_ProtoCol(ProtoCol): + """上传血压测试数据""" + TYPE = "blood" + def send(self, event, msg): + len_size = len(str(msg[0]))+len("blood,")+1+len(str(msg[1])) + print("blood:send:{} len:{}".format(msg,len_size)) + # 实例:[XT*334588000000156*0009*blood,36,2] + # 代表终端的 + # 平台回复: + # [XT*334588000000156*0004*blood] + send_data = EventMesh.publish("get_new_pid")+"*%s*%04X*blood"%(self.imei,len_size) + MD5_head_data = EventMesh.publish("get_new_pid")+"*%s*%04X*%s"%(self.imei,len_size,"blood") + MD5_SIGN = self.pack_MD5_head(MD5_head_data) + data = "[%s%s,%d,%d]"%(str(MD5_SIGN),send_data,msg[0],msg[1]) + print("blood:data:%s"%(data)) + # 通过socket发送到服务器端 + EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND,data) + + def recv(self, event, msg): + """ + @param event: + @param msg: 接收到的下行数据 + """ + # print("HRSTART_ProtoCol RECV msg:") + #EventMesh.publish(constants.PROTOCOL.TEMP_SEND) + + + + +# 设置血糖上传频率 +# 平台发送: +# [XT*334588000000156*len*bgstart,x] +# x为上传间隔时间,单位秒,连续上传时最小时间不小于300秒,最大不超过65535. +# 实例:[XT*334588000000156*len*bgstart,300] +# 终端会每隔300秒检测一次 + +# x为1则代表终端单次上传。 +# x为0则代表终端上传关闭。 +class bgstart_ProtoCol(ProtoCol): + """app下发血糖测试频率""" + TYPE = "bgstart" + def send(self, event, msg): + #[XT*334588000000156*len*wdstart,300] + send_data = EventMesh.publish("get_new_pid")+"*%s*0007*bgstart"%(self.imei) + MD5_SIGN = self.pack_MD5_head(send_data) + data = "[%s%s]"%(str(MD5_SIGN),send_data) + # print("temp:data:%s"%(data)) + # 通过socket发送到服务器端 + EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND,data) + + def recv(self, event, msg): + """ + @param event: 体温下发频率数据 + @param msg: 接收到的下行数据 + """ + # print("WDSTART_ProtoCol RECV msg:") + print("bgstart:{}".format(msg)) + msg = msg[1:-1] + msg_tmp = msg.decode('ascii') + msg_tmp = msg_tmp.split(',') + msg_tmp = msg_tmp[1] + + bgstartTotal = int(msg_tmp) + print("bgstartTotal:{}".format(bgstartTotal)) + if bgstartTotal == 1:#单次测量 + get_bp_state = EventMesh.publish("get_bp_state") + get_hr_state = EventMesh.publish("get_hr_state") + get_spo2_state = EventMesh.publish("get_spo2_state") + get_bg_state = EventMesh.publish("get_bg_state") + print("get_bg_state:{}".format(get_bg_state)) + if get_bp_state == 0 and get_hr_state == 0 and get_spo2_state == 0 and get_bg_state == 0:#只要两个不在测量 单次优先级最低 + battery = EventMesh.publish("screen_get_battery") + if battery != None: + if battery[0] != "1": + EventMesh.publish("set_bg_state",3)#3代表单次测量 + else: + if bgstartTotal > 0 and bgstartTotal <= 300: + bgstartTotal = 300 + elif bgstartTotal >= 65536: + bgstartTotal = 65536 + + # if bgstartTotal == 0:#关闭自动测量 + # EventMesh.debug_log("bgSTART_ 1") + # EventMesh.publish("set_bgauto_time",[0,0]) + # else: + on = 0 + if bgstartTotal != 0: + on = 1 + EventMesh.publish("set_bgauto_time",[on,bgstartTotal]) + + EventMesh.publish(constants.PROTOCOL.BGSTART_SEND) + +# 上传血糖数据 +# 终端发送[XT*YYYYYYYYYYYYYYY*LEN*bloodglucose,x] +# x 表示血糖,单位mmol/L +# 示例[XT*334588000000156*0010*bloodglucose,6.1] +# 平台回复: +# [XT*334588000000156*000B*bloodglucose] +class bloodglucose_ProtoCol(ProtoCol): + """上传血糖测试数据""" + TYPE = "bloodglucose" + def send(self, event, msg): + len_size = len("bloodglucose,")+1+len(str(msg)) + print("bloodglucose:send:{} len:{}".format(msg,len_size)) + # 实例:[XT*334588000000156*0009*blood,36,2] + # 代表终端的 + # 平台回复: + # [XT*334588000000156*0004*blood] + send_data = EventMesh.publish("get_new_pid")+"*%s*%04X*bloodglucose"%(self.imei,len_size) + MD5_head_data = EventMesh.publish("get_new_pid")+"*%s*%04X*%s"%(self.imei,len_size,"bloodglucose") + MD5_SIGN = self.pack_MD5_head(MD5_head_data) + data = "[%s%s,%s]"%(str(MD5_SIGN),send_data,msg) + print("bloodglucose:data:%s"%(data)) + # 通过socket发送到服务器端 + EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND,data) + + def recv(self, event, msg): + """ + @param event: + @param msg: 接收到的下行数据 + """ + # print("HRSTART_ProtoCol RECV msg:") + #EventMesh.publish(constants.PROTOCOL.TEMP_SEND) + +# [XT*334588000000156*0003*DLT] +def reset_factory(msg): + if msg == 1: + Power.powerRestart() +class DLT_ProtoCol(ProtoCol): + """解绑数据""" + TYPE = "DLT" + def send(self, event, msg): + # [XT*334588000000156*0004*temp] + send_data = EventMesh.publish("get_new_pid")+"*%s*0003*DLT"%(self.imei) + MD5_SIGN = self.pack_MD5_head(send_data) + data = "[%s%s]"%(str(MD5_SIGN),send_data) + EventMesh.debug_log("temp:data:%s"%(data)) + # 通过socket发送到服务器端 + EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND,data) + + def recv(self, event, msg): + """ + @param event: + @param msg: 接收到的下行数据 + """ + # EventMesh.debug_log("DLT_ProtoCol RECV msg:") + + +#定位频率 +class UPLOAD_ProtoCol(ProtoCol): + """定位频率数据""" + TYPE = "UPLOAD" + def send(self, event, msg): + # [XT*334588000000156*0004*temp] + send_data = EventMesh.publish("get_new_pid")+"*%s*0006*UPLOAD"%(self.imei) + MD5_SIGN = self.pack_MD5_head(send_data) + data = "[%s%s]"%(str(MD5_SIGN),send_data) + + # 通过socket发送到服务器端 + EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND,data) + + def recv(self, event, msg): + """ + @param event: + @param msg: 接收到的下行数据 + """ + # b'[SZKW*867387060319166*000A*UPLOAD,600]' + # EventMesh.debug_log("DLT_ProtoCol RECV msg:".format(msg)) + msg = msg[1:-1] + msg_tmp = msg.decode('ascii') + msg_tmp = msg_tmp.split(',') + msg_tmp = msg_tmp[1] + upload_time = int(msg_tmp) + EventMesh.publish("set_storage_config",["upload_time",upload_time]) + + EventMesh.publish("set_upload_data", upload_time) + EventMesh.publish(constants.PROTOCOL.UPLOAD_SEND) + +#设置快捷号码 +class CENTER_ProtoCol(ProtoCol): + """设置快捷号码""" + TYPE = "CENTER" + def send(self, event, msg): + # [XT*334588000000156*0004*temp] + send_data = EventMesh.publish("get_new_pid")+"*%s*0006*CENTER"%(self.imei) + MD5_SIGN = self.pack_MD5_head(send_data) + data = "[%s%s]"%(str(MD5_SIGN),send_data) + EventMesh.debug_log("UPLOAD:data:%s"%(data)) + # 通过socket发送到服务器端 + EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND,data) + + def recv(self, event, msg): + """ + @param event: + @param msg: 接收到的下行数据 + """ + # b'[SZKW*867387060319166*000A*UPLOAD,600]' + # EventMesh.debug_log("DLT_ProtoCol RECV msg:".format(msg)) + msg = msg[1:-1] + msg_tmp = msg.decode('ascii') + msg_tmp = msg_tmp.split(',') + msg_tmp = msg_tmp[1] + EventMesh.debug_log("CENTER_ProtoCol RECV msg:{} msg_:{}".format(msg,msg_tmp)) + center_dial = str(msg_tmp) + EventMesh.publish("set_storage_config",["center_dial",center_dial]) + EventMesh.publish(constants.PROTOCOL.CENTER_SEND) + +#呼叫快捷电话号码 +import voiceCall +class MONITOR_ProtoCol(ProtoCol): + """呼叫快捷号码""" + TYPE = "MONITOR" + def send(self, event, msg): + # [XT*334588000000156*0004*MONITOR] + send_data = EventMesh.publish("get_new_pid")+"*%s*0007*MONITOR"%(self.imei) + MD5_SIGN = self.pack_MD5_head(send_data) + data = "[%s%s]"%(str(MD5_SIGN),send_data) + EventMesh.debug_log("MONITOR:data:%s"%(data)) + # 通过socket发送到服务器端 + EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND,data) + + def recv(self, event, msg): + """ + @param event: + @param msg: 接收到的下行数据 + """ + # b'[SZKW*867387060319166*000A*MONITOR]' + msg = msg[1:-1] + msg_tmp = msg.decode('ascii') + msg_tmp = msg_tmp.split('MONITOR') + msg_tmp = msg_tmp[1] + EventMesh.debug_log("MONITOR_ProtoCol RECV msg:{} msg_:{}".format(msg,len(msg_tmp))) + if len(msg_tmp) != 0: + EventMesh.publish("save_phonename", contact) + EventMesh.publish("save_phonenum", contact) + EventMesh.publish("dial_out_call_center_cb",contact)#电话拨出去 + else: + read_data = EventMesh.publish("get_storage_config","center_dial") + EventMesh.debug_log("MONITOR:data:%s"%(read_data)) + if read_data != None: + contact = read_data + if len(contact) > 0: + EventMesh.debug_log("MONITOR RECV msg:{} {}".format(contact,type(contact))) + EventMesh.publish("save_phonename", contact) + EventMesh.publish("save_phonenum", contact) + EventMesh.publish("dial_out_call_center_cb",contact)#电话拨出去 + EventMesh.publish(constants.PROTOCOL.MONITOR_SEND) + +#定时开关机 +class bootoff_ProtoCol(ProtoCol): + """定时开关机""" + TYPE = "BOOTOFF" + def send(self, event, msg): + # [XT*334588000000156*0004*MONITOR] + send_data = EventMesh.publish("get_new_pid")+"*%s*0007*BOOTOFF"%(self.imei) + MD5_SIGN = self.pack_MD5_head(send_data) + data = "[%s%s]"%(str(MD5_SIGN),send_data) + EventMesh.debug_log("BOOTOFF:data:%s"%(data)) + # 通过socket发送到服务器端 + EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND,data) + def recv(self, event, msg): + """ + @param event: + @param msg: 接收到的下行数据 + """ + # b'[SZKW*867387060319166*000A*SOS_SEND]' + msg = msg[1:-1] + msg_tmp = msg.decode('ascii') + msg_tmp = msg_tmp.split(',') + on_bt = int(msg_tmp[1]) + start_hour = int(str(msg_tmp[2]).split(":")[0]) + start_min = int(str(msg_tmp[2]).split(":")[1]) + + end_hour = int(str(msg_tmp[3]).split(":")[0]) + end_min = int(str(msg_tmp[3]).split(":")[1]) + + EventMesh.debug_log("BOOTOFF:send data:",on_bt,start_hour,start_min,end_hour,end_min) + poweroff = [] + poweroff.append({"poweroff_on":on_bt,"start_hour":start_hour,"start_min":start_min,"end_hour":end_hour,"end_min":end_min}) + #b'[SZKW*860132060006970*0015*BOOTOFF,1,06:00,23:59]' + EventMesh.publish("set_boot_off_time",poweroff)#设置关机时间 + + EventMesh.publish(constants.PROTOCOL.BOOTOFF_SEND) + + +#sos家庭号码 +class sosHome_dial_ProtoCol(ProtoCol): + """sos家庭号码""" + TYPE = "SOS" + def send(self, event, msg): + # [XT*334588000000156*0004*MONITOR] + send_data = EventMesh.publish("get_new_pid")+"*%s*0003*SOS"%(self.imei) + MD5_SIGN = self.pack_MD5_head(send_data) + data = "[%s%s]"%(str(MD5_SIGN),send_data) + print("sosHome_dial_ProtoCol:data:%s"%(data)) + # 通过socket发送到服务器端 + EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND,data) + + def recv(self, event, msg): + """ + @param event: + @param msg: 接收到的下行数据 + """ + + # b'[SZKW*867387060319166*000A*SOS_SEND]' + msg = msg[1:-1] + msg_tmp = msg.decode('ascii') + msg_tmp = msg_tmp.split(',') + + # print("sosHome_dial_ProtoCol:send data :{} {}".format(len(msg_tmp),msg_tmp)) + #b'[SZKW*860132060006970*0015*sosHome_dial_ProtoCol,15521469561,10086,15521469561]' + i = 0 + num = 0 + count = 0 + print("sos msg_tmp",msg_tmp) + if len(msg_tmp) > 4: + num = 3 + else: + num = len(msg_tmp)-1 + data = [] + for i in range(num): + # print("sos:send data :{}".format(msg_tmp[i+1])) + if len(msg_tmp[i+1]) != 0: + EventMesh.publish("set_storage_config",["SOS_NUMBER{}".format(i+1),msg_tmp[i+1]]) + data.append(str(msg_tmp[i+1])) + count+=1 + print("data:{}".format(data)) + EventMesh.publish("set_dial_sos_number",data) + + EventMesh.publish(constants.PROTOCOL.SOS_SEND) + + +# 低电提醒 +#[XT*334588000000156*0008*LOWBAT,1] +class LOWBAT_ProtoCol(ProtoCol): + """低电提醒""" + TYPE = "LOWBAT" + def send(self, event, msg): + # [XT*334588000000156*0006*LOWBAT] + send_data = EventMesh.publish("get_new_pid")+"*%s*0006*LOWBAT"%(self.imei) + MD5_SIGN = self.pack_MD5_head(send_data) + data = "[%s%s]"%(str(MD5_SIGN),send_data) + EventMesh.debug_log("LOWBAT:data:%s"%(data)) + # 通过socket发送到服务器端 + EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND,data) + + def recv(self, event, msg): + """ + @param event: + @param msg: 接收到的下行数据 + """ + # b'[SZKW*867387060319166*000A*LOWBAT]' + + msg = msg[1:-1] + msg_tmp = msg.decode('ascii') + msg_tmp = msg_tmp.split(',') + on_bt = msg_tmp[1] + EventMesh.debug_log("LOWBAT:send data:{}".format(on_bt)) + #b'[SZKW*860132060006970*0015*LOWBAT,1,06:00,23:59]' + EventMesh.publish("set_low_bat_btn",on_bt) + EventMesh.publish(constants.PROTOCOL.LOWBAT_SEND) + +# 设置系统时间 +# +class Time_ProtoCol(ProtoCol): + """设置系统时间""" + TYPE = "Time" + def send(self, event, msg): + # + send_data = EventMesh.publish("get_new_pid")+"*%s*0004*Time"%(self.imei) + MD5_SIGN = self.pack_MD5_head(send_data) + data = "[%s%s]"%(str(MD5_SIGN),send_data) + EventMesh.debug_log("Time:data:%s"%(data)) + # 通过socket发送到服务器端 + EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND,data) + + def recv(self, event, msg): + """ + @param event: + @param msg: 接收到的下行数据 + """ + # rtc = RTC() + msg = msg[1:-1] + msg_tmp = msg.decode('ascii') + msg_data = msg_tmp.split(',') + + timeSecond = int(msg_data[1]) + #EventMesh.debug_log("type {} timeSecond {}".format((msg_data[1]),timeSecond)) + # timeSecond = 1703001360 + next_alarm_time = utime.localtime(timeSecond) + #EventMesh.debug_log("next_alarm_time",next_alarm_time) + #EventMesh.debug_log("local time",msg) + # machine.RTC().datetime((tm[0], tm[1], tm[2], tm[6], tm[3], tm[4], tm[5], 0)) + + 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)) + #next_alarm_time = utime.localtime(old_Timesec)#年月日时分秒星期365中的第几天 + EventMesh.publish("set_rtc_alarm") + #EventMesh.publish(constants.PROTOCOL.TIME_SEND) + + + + +#免打扰 +class SILENCETIME2_ProtoCol(ProtoCol): + """免打扰""" + TYPE = "SILENCETIME2" + def send(self, event, msg): + # [XT*334588000000156*0006*SILENCETIME2] + send_data = EventMesh.publish("get_new_pid")+"*%s*000C*SILENCETIME2"%(self.imei) + MD5_SIGN = self.pack_MD5_head(send_data) + data = "[%s%s]"%(str(MD5_SIGN),send_data) + # EventMesh.debug_log("KEYBRD:data:%s"%(data)) + # EventMesh.debug_log("SILENCETIME2!!!!!!!!!!!!!",msg) + # 通过socket发送到服务器端 + EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND,data) + + def recv(self, event, msg): + """ + @param event: + @param msg: 接收到的下行数据 + """ + # b'[SZKW*867387060319166*000A*KEYBRD]' + # EventMesh.debug_log("SILENCETIME2!!!!!!!!!!!!!",msg) + EventMesh.publish(constants.PROTOCOL.SILENCETIME2_SEND) + +#键盘开关 +class KEYBRD_ProtoCol(ProtoCol): + """免打扰""" + TYPE = "KEYBRD" + def send(self, event, msg): + # [XT*334588000000156*0006*SILENCETIME2] + send_data = EventMesh.publish("get_new_pid")+"*%s*0006*KEYBRD"%(self.imei) + MD5_SIGN = self.pack_MD5_head(send_data) + data = "[%s%s]"%(str(MD5_SIGN),send_data) + # EventMesh.debug_log("KEYBRD:data:%s"%(data)) + # EventMesh.debug_log("KEYBRD!!!!!!!!!!!!!",msg) + # 通过socket发送到服务器端 + EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND,data) + + def recv(self, event, msg): + """ + @param event: + @param msg: 接收到的下行数据 + """ + # b'[SZKW*867387060319166*000A*KEYBRD]' + # EventMesh.debug_log("KEYBRD!!!!!!!!!!!!!",msg) + EventMesh.publish(constants.PROTOCOL.KEYBRD_SEND) + +class TK_ProtoCol(ProtoCol): + """微聊""" + TYPE = "TK" + + + def send(self, event, msg): + EventMesh.debug_log("TK send:") + if len(str(msg)) == 1: + + len_size = len(str(msg))+len("TK,") + # 实例:[XT*334588000000156*0009*TK,1] + send_data = EventMesh.publish("get_new_pid")+"*%s*%04X*TK"%(self.imei,len_size) + MD5_head_data = EventMesh.publish("get_new_pid")+"*%s*%04X*%s"%(self.imei,len_size,"TK") + MD5_SIGN = self.pack_MD5_head(MD5_head_data) + data = "[%s%s,%d]"%(str(MD5_SIGN),send_data,msg) + EventMesh.debug_log("TK:data:%s"%(data)) + # 通过socket发送到服务器端 + EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND,data) + else: + # [SZKW*YYYYYYYYYYYYYYY*LEN*TK,AMR 格式音频数据] + #[XT*YYYYYYYYYYYYYYY*LEN*TKS,秒数(十进制),AMR 格式音频数据] + arm_data = msg + # arm_sec = msg[0] + # EventMesh.debug_log("TK_ProtoCol:msgtype:{} arm_sec:{}".format(len(msg[1]),arm_sec)) + + arm = bytearray() + for i in range(len(arm_data)): + if arm_data[i] == 0x7d: + arm.extend(b'\x7d\x01') + elif arm_data[i] == 0x5b : + arm.extend(b'\x7d\x02') + elif arm_data[i] == 0x5d : + arm.extend(b'\x7d\x03') + elif arm_data[i] == 0x2c : + arm.extend(b'\x7d\x04') + elif arm_data[i] == 0x2a : + arm.extend(b'\x7d\x05') + else : + arm.append(arm_data[i]) + + datalen = len(arm) + len("TK,")+1 + #Wechat_log("len(str(arm_sec)):{}".format(len(str(arm_sec))+1)) + send_data = bytearray(EventMesh.publish("get_new_pid")+"*%s*%04X*TK,"%(self.imei,datalen)) + send_data.extend(arm) + MD5_head_data = EventMesh.publish("get_new_pid")+"*%s*%04X*%s"%(self.imei,datalen,"TK") + MD5_SIGN = self.pack_MD5_head(MD5_head_data) + data = bytearray('[') + data.extend(MD5_SIGN) + data.extend(send_data) + data.extend(']') + # EventMesh.debug_log("TK:send data:%s MD5_head_data:%s"%(data,MD5_head_data)) + EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND, data) + + + def recv(self, event, msg): + """ + + ("TK_ProtoCol:datalen:{} {} {}".format(wechat_num,MXA_MSG,wechat_recode_list)) + @param event: 微聊 + @param msg: 接收到的下行数据 + [SZKW*860132060004322*20BD*TK,#!AMR...] + """ + #Wechat_log("K_ProtoCol:recv:data:{}".format(msg)) + + msg_tmp = msg.decode('ascii') + str = msg_tmp.split('TK,') + # Wechat_log("TK_ProtoCol:recv:len:{} {} {}".format(len(msg),len(str),msg_tmp.find("#!AMR"))) + + read_AMR_flag = msg_tmp.find("#!AMR") + #EventMesh.debug_log("TK recv:read_AMR_flag:{} ,{}".format(read_AMR_flag,EventMesh.publish("get_wechat_record_flag"))) + # if EventMesh.publish("get_wechat_record_flag") != 1 and read_AMR_flag != -1: #是否是服务器下发音频数据 + if read_AMR_flag != -1: #是否是服务器下发音频数据 + # Wechat_log("TK_ProtoCol:recv:datalen{}".format(len(msg))) + arm_data = bytearray(str[1])#获取amr输出 + get_wechat_data = EventMesh.publish("get_wechat_data") + MXA_MSG = get_wechat_data[0] + wechat_recode_list = get_wechat_data[1] + wechat_num = int(wechat_recode_list["num"]) + # Wechat_log("TK_ProtoCol:datalen:{} {} {}".format(wechat_num,MXA_MSG,wechat_recode_list)) + + if wechat_num >= MXA_MSG: + wechat_num = 0 + if wechat_num == 0: + wechat_num += 1 + elif wechat_num > 0: + wechat_num += 1 + + + EventMesh.debug_log("num_total:datalen:{} {}".format(MXA_MSG,wechat_recode_list)) + wechat_recode_list["%02d"%(wechat_num)] = "read:1" + wechat_recode_list['num'] = wechat_num + EventMesh.publish("set_wechat_data",[MXA_MSG,wechat_recode_list]) + #写语音文件数据 + + # path = "/usr/static/storage_file/wechat.amr" + path = "/usr/static/storage_file/{}.amr".format(wechat_num) + with open(path,"w") as fd: + arm = bytearray() + j = 0 + for i in range(len(arm_data)): + if arm_data[j] == 0x7d and arm_data[j+1] == 0x01: + arm.extend(b'\x7d') + j+=1 + elif arm_data[j] == 0x7d and arm_data[j+1] == 0x02: + arm.extend(b'\x5b') + j+=1 + elif arm_data[j] == 0x7d and arm_data[j+1] == 0x03: + arm.extend(b'\x5d') + j+=1 + elif arm_data[j] == 0x7d and arm_data[j+1] == 0x04: + arm.extend(b'\x2c') + j+=1 + elif arm_data[j] == 0x7d and arm_data[j+1] == 0x05: + arm.extend(b'\x2a') + j+=1 + else : + arm.append(arm_data[j]) + j+=1 + if j >= len(arm_data): + break + fd.write(arm) + EventMesh.publish("recv_wechat_audio")# + EventMesh.publish(constants.PROTOCOL.TK_SEND,1) + EventMesh.debug_log("constants.PROTOCOL.TK_SEND1!!!") + else : + if read_AMR_flag != -1: + EventMesh.publish(constants.PROTOCOL.TK_SEND,0) + +class TKS_ProtoCol(ProtoCol): + """微聊""" + TYPE = "TKS" + + + def send(self, event, msg): + EventMesh.debug_log("TKS send:") + if len(str(msg)) == 1: + len_size = len(str(msg))+len("TKS,") + # 实例:[XT*334588000000156*0009*TK,1] + send_data = EventMesh.publish("get_new_pid")+"*%s*%04X*TKS"%(self.imei,len_size) + MD5_head_data = EventMesh.publish("get_new_pid")+"*%s*%04X*%s"%(self.imei,len_size,"TKS") + MD5_SIGN = self.pack_MD5_head(MD5_head_data) + data = "[%s%s,%d]"%(str(MD5_SIGN),send_data,msg) + EventMesh.debug_log("TKS:data:%s"%(data)) + # 通过socket发送到服务器端 + EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND,data) + else: + # [SZKW*YYYYYYYYYYYYYYY*LEN*TK,AMR 格式音频数据] + #[XT*YYYYYYYYYYYYYYY*LEN*TKS,秒数(十进制),AMR 格式音频数据] + arm_data = msg[1] + arm_sec = msg[0] + EventMesh.debug_log("TK_ProtoCol:msgtype:{} arm_sec:{}".format(len(msg[1]),arm_sec)) + + arm = bytearray() + for i in range(len(arm_data)): + if arm_data[i] == 0x7d: + arm.extend(b'\x7d\x01') + elif arm_data[i] == 0x5b : + arm.extend(b'\x7d\x02') + elif arm_data[i] == 0x5d : + arm.extend(b'\x7d\x03') + elif arm_data[i] == 0x2c : + arm.extend(b'\x7d\x04') + elif arm_data[i] == 0x2a : + arm.extend(b'\x7d\x05') + else : + arm.append(arm_data[i]) + + datalen = len(arm) + len("TKS,")+len(str(arm_sec))+1 + #Wechat_log("len(str(arm_sec)):{}".format(len(str(arm_sec))+1)) + send_data = bytearray(EventMesh.publish("get_new_pid")+"*%s*%04X*TKS,%d,"%(self.imei,datalen,arm_sec)) + send_data.extend(arm) + MD5_head_data = EventMesh.publish("get_new_pid")+"*%s*%04X*%s"%(self.imei,datalen,"TKS") + MD5_SIGN = self.pack_MD5_head(MD5_head_data) + data = bytearray('[') + data.extend(MD5_SIGN) + data.extend(send_data) + data.extend(']') + # EventMesh.debug_log("TK:send data:%s MD5_head_data:%s"%(data,MD5_head_data)) + EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND, data) + + + def recv(self, event, msg): + """ + + ("TK_ProtoCol:datalen:{} {} {}".format(wechat_num,MXA_MSG,wechat_recode_list)) + @param event: 微聊 + @param msg: 接收到的下行数据 + [SZKW*860132060004322*20BD*TK,#!AMR...] + """ + #Wechat_log("K_ProtoCol:recv:data:{}".format(msg)) + # EventMesh.debug_log("TK recv:{}".format(msg)) + msg_tmp = msg.decode('ascii') + str = msg_tmp.split('TKS,') + # Wechat_log("TK_ProtoCol:recv:len:{} {} {}".format(len(msg),len(str),msg_tmp.find("#!AMR"))) + read_AMR_flag = msg_tmp.find("#!AMR") + # if EventMesh.publish("get_wechat_record_flag") != 1 and read_AMR_flag != -1: #是否是服务器下发音频数据 + if read_AMR_flag != -1: #是否是服务器下发音频数据 + # Wechat_log("TK_ProtoCol:recv:datalen{}".format(len(msg))) + arm_data = bytearray(str[1])#获取amr输出 + get_wechat_data = EventMesh.publish("get_wechat_data") + MXA_MSG = get_wechat_data[0] + wechat_recode_list = get_wechat_data[1] + wechat_num = int(wechat_recode_list["num"]) + # Wechat_log("TK_ProtoCol:datalen:{} {} {}".format(wechat_num,MXA_MSG,wechat_recode_list)) + + if wechat_num >= MXA_MSG: + wechat_num = 0 + if wechat_num == 0: + wechat_num += 1 + elif wechat_num > 0: + wechat_num += 1 + + + EventMesh.debug_log("num_total:datalen:{} {}".format(MXA_MSG,wechat_recode_list)) + wechat_recode_list["%02d"%(wechat_num)] = "read:1" + wechat_recode_list['num'] = wechat_num + EventMesh.publish("set_wechat_data",[MXA_MSG,wechat_recode_list]) + #写语音文件数据 + + # path = "/usr/static/storage_file/wechat.amr" + path = "/usr/static/storage_file/{}.amr".format(wechat_num) + with open(path,"w") as fd: + arm = bytearray() + j = 0 + for i in range(len(arm_data)): + if arm_data[j] == 0x7d and arm_data[j+1] == 0x01: + arm.extend(b'\x7d') + j+=1 + elif arm_data[j] == 0x7d and arm_data[j+1] == 0x02: + arm.extend(b'\x5b') + j+=1 + elif arm_data[j] == 0x7d and arm_data[j+1] == 0x03: + arm.extend(b'\x5d') + j+=1 + elif arm_data[j] == 0x7d and arm_data[j+1] == 0x04: + arm.extend(b'\x2c') + j+=1 + elif arm_data[j] == 0x7d and arm_data[j+1] == 0x05: + arm.extend(b'\x2a') + j+=1 + else : + arm.append(arm_data[j]) + j+=1 + if j >= len(arm_data): + break + fd.write(arm) + EventMesh.publish("recv_wechat_audio")# + EventMesh.publish(constants.PROTOCOL.TKS_SEND,1)#返回接收成功 + else : + if read_AMR_flag != -1 : + EventMesh.publish(constants.PROTOCOL.TKS_SEND,0)#返回接收失败 + + + + + + + +class MESSAGE_ProtoCol(ProtoCol): + """微聊""" + TYPE = "MESSAGE" + + + def send(self, event, msg): + #[XT*334588000000156*0007*MESSAGE] + send_data = EventMesh.publish("get_new_pid")+"*%s*0007*MESSAGE"%(self.imei) + MD5_SIGN = self.pack_MD5_head(send_data) + data = "[%s%s]"%(str(MD5_SIGN),send_data) + #Wechat_log("POWEROFF_ProtoCol:send:%s"%(data)) + # 通过socket发送到服务器端 + EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND, data) + + def recv(self, event, msg): + """ + + @param event: 微聊文字 + @param msg: 接收到的下行数据 + """ + # msg = msg[1:-1] + + # msg_s = msg.decode('ascii') + # msg_s = msg_s.split(',') + # msg_s = msg_s[1] + # # Wechat_log("msg_tmp:len:{}\r\n data:{}".format(len(msg_s),msg_s)) + + + # get_wechat_data = EventMesh.publish("get_wechat_data") + + # MXA_MSG = get_wechat_data[0] + # wechat_recode_list = get_wechat_data[1] + # wechat_num = wechat_recode_list["num"] + # # Wechat_log("TK_ProtoCol:datalen:{} {} {}".format(wechat_num,MXA_MSG,wechat_recode_list)) + + # if wechat_num >= MXA_MSG: + # wechat_num = 0 + # if wechat_num == 0: + # wechat_num += 1 + # elif wechat_num > 0: + # wechat_num += 1 + # msg_txt = {} + # # 0 1 2 3 + # Wechat_log("wechat_num:init {}".format(wechat_num)) + # msg_txt = UnicodeHexStr_To_Utf8Str(msg_s) + # # Wechat_log("msg_txt:{}".format(msg_txt)) + # wechat_recode_list["%02d"%(wechat_num)] = "T:{}".format(msg_txt) + # wechat_recode_list['num'] = wechat_num + # EventMesh.publish("set_wechat_data",[MXA_MSG,wechat_recode_list]) + # # Wechat_log("wechat_recode_list:len data:{}".format(wechat_recode_list)) + + # screen_NAME = EventMesh.publish("get_screen_NAME") + # get_lcd_state = EventMesh.publish("get_lcd_state") + # if screen_NAME != "wechat" or get_lcd_state == 0: + # EventMesh.publish("load_screen", {"screen": "wechat_popup"}) + # else: + # EventMesh.publish("wechat_updata_list_show") + EventMesh.publish(constants.PROTOCOL.MESSAGE_SEND) + # EventMesh.publish("recv_wechat_audio")# + +class FALLDOWN_ProtoCol(ProtoCol): + """ + 跌倒提醒开关 + 服务器下发跌倒报警设置命令 + [XT*334588000000156*LEN*FALLDOWN,ONOFF] + ONOFF: 1:开启,0:关闭。 + 终端回复 + [XT*334588000000156*LEN*FALLDOWN] + """ + TYPE = "FALLDOWN" + + def send(self, event, msg): + + #[XT*334588000000156*LEN*FALLDOWN] + send_data = EventMesh.publish("get_new_pid")+"*%s*0008*FALLDOWN"%(self.imei) + MD5_SIGN = self.pack_MD5_head(send_data) + data = "[%s%s]"%(str(MD5_SIGN),send_data) + #Wechat_log("POWEROFF_ProtoCol:send:%s"%(data)) + # 通过socket发送到服务器端 + EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND, data) + + def recv(self, event, msg): + """ + [SZKW*860132060341484*000A*FALLDOWN,1] + """ + msg = msg[1:-1] + msg_tmp = msg.decode('ascii') + msg_data = msg_tmp.split(',') + + Falldowm = msg_data[1] + EventMesh.debug_log("FALLDOWN:{}".format(Falldowm)) + EventMesh.publish("set_storage_config",["fall_sw",Falldowm]) + + EventMesh.publish(constants.PROTOCOL.FALLDOWN_SEND) + +class REMOVE_ProtoCol(ProtoCol): + """ + 取下手环报警开关 + 平台发送: + [XT*YYYYYYYYYYYYYYY*LEN*REMOVE,0或者1] + 实例:[XT*334588000000156*0008*REMOVE,1] + 终端回复: + [XT*YYYYYYYYYYYYYYY*LEN*REMOVE] + """ + TYPE = "REMOVE" + + def send(self, event, msg): + send_data = EventMesh.publish("get_new_pid")+"*%s*0006*REMOVE"%(self.imei) + MD5_SIGN = self.pack_MD5_head(send_data) + data = "[%s%s]"%(str(MD5_SIGN),send_data) + #Wechat_log("POWEROFF_ProtoCol:send:%s"%(data)) + # 通过socket发送到服务器端 + EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND, data) + + def recv(self, event, msg): + msg = msg[1:-1] + msg_tmp = msg.decode('ascii') + msg_data = msg_tmp.split(',') + Falldowm = msg_data[1] + EventMesh.debug_log("REMOVE:{}".format(Falldowm)) + EventMesh.publish("set_storage_config",["remove_sw",Falldowm]) + EventMesh.publish(constants.PROTOCOL.REMOVE_SEND) + +class HELP_ProtoCol(ProtoCol): + """ +一键报警 + [XT*YYYYYYYYYYYYYYY*LEN*HELP,状态] + 状态值为整数:60或不带默认是普通报警,61光电式感烟火灾报警,62检测环境温度(高温报警,温度变化报警), + 63人体活动检测报警,64电池欠压提醒功能,65设备脱落提醒功能,66离线报警,67测试报警,123气感报警, + 124烟感报警,125水浸报警 + 实例: + [XT*334588000000156*0004*HELP,60] + """ + TYPE = "HELP" + + def send(self, event, msg): + #[XT*334588000000156*LEN*FALLDOWN] + send_data = EventMesh.publish("get_new_pid")+"*%s*0008*HELP,%d"%(self.imei,msg) + MD5_SIGN = self.pack_MD5_head(send_data) + data = "[%s%s]"%(str(MD5_SIGN),send_data) + #Wechat_log("POWEROFF_ProtoCol:send:%s"%(data)) + # 通过socket发送到服务器端 + EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND, data) + + def recv(self, event, msg): + """ + [XT*334588000000156*0004*HELP,60] + """ + + pass + + +#喝水闹钟提示 +# 喝水闹钟设置指令 +# 平台发送: +# [XT*YYYYYYYYYYYYYYY*LEN*REMIND_CH_DRINK,时间间隔(小时),开关(0为关,1为开)] +# 实例: +# [XT*334588000000156*0026*REMIND_CH_DRINK,4,0] +# 终端回复: +# [XT*YYYYYYYYYYYYYYY*LEN*REMIND_CH_DRINK] +# 实例:[XT*334588000000156*000E*REMIND_CH_DRINK] +class REMIND_CHDRINK_ProtoCol(ProtoCol): + """ + + 平台发送: + [XT*YYYYYYYYYYYYYYY*LEN*REMIND_CH_DRINK,时间间隔(小时),开关(0为关,1为开)] + 实例:[XT*334588000000156*0008*REMIND_CH_DRINK,时间间隔(小时),开关(0为关,1为开)] + 终端回复: + [XT*YYYYYYYYYYYYYYY*LEN*REMIND_CH_DRINK] + """ + TYPE = "REMIND_CH_DRINK" + + def send(self, event, msg): + send_data = EventMesh.publish("get_new_pid")+"*%s*000F*REMIND_CH_DRINK"%(self.imei) + MD5_SIGN = self.pack_MD5_head(send_data) + data = "[%s%s]"%(str(MD5_SIGN),send_data) + #Wechat_log("POWEROFF_ProtoCol:send:%s"%(data)) + # 通过socket发送到服务器端 + EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND, data) + + def recv(self, event, msg): + # SZKW*860132060346475*0013*REMIND_CH_DRINK,4-1 + msg = msg[1:-1] + msg_tmp = msg.decode('ascii') + msg_data = msg_tmp.split(',') + data = str(msg_data[1]) + hour = int(data.split('-')[0]) + btn_on = int(data.split('-')[1]) + + EventMesh.debug_log("recv REMIND_CH_DRINK:{}-{}-{}".format(hour,btn_on,msg)) + EventMesh.publish("set_storage_config",["drink_on",btn_on]) + EventMesh.publish("set_storage_config",["drink_time",hour]) + EventMesh.publish(constants.PROTOCOL.REMIND_CH_DRINK_SEND) + +# 自定义服药闹钟设置指令 +# 平台发送: +# [XT*YYYYYYYYYYYYYYY*LEN*REMIND_CH_MEDICINE2,时间1-开关,时间2-开关,周几] +# 实例: +# [XT*334588000000156*0026*REMIND_CH_MEDICINE2,08:10-0,09:10-0,1000001] +# 终端回复: +# [XT*YYYYYYYYYYYYYYY*LEN*REMIND_CH_MEDICINE2] +# 实例:[XT*334588000000156*000E*REMIND_CH_MEDICINE2] +# 说明:闹铃格式为:时间-开关(0/1),周几(周六到周日) + +#REMIND_CH_MEDICINE2,09:00-1,14:00-0,18:00-0,1111111]'",) +class REMIND_CHMEDICINE2_ProtoCol(ProtoCol):#吃药提醒 + """ + + 平台发送: + [XT*YYYYYYYYYYYYYYY*LEN*REMIND_CH_MEDICINE2,,时间1-开关,时间2-开关,周几] + 实例:[XT*334588000000156*0008*REMIND_CH_MEDICINE2,,时间1-开关,时间2-开关,周几] + 终端回复: + [XT*YYYYYYYYYYYYYYY*LEN*REMIND_CH_MEDICINE2] + """ + TYPE = "REMIND_CH_MEDICINE2" + + def send(self, event, msg): + send_data = EventMesh.publish("get_new_pid")+"*%s*0013*REMIND_CH_MEDICINE2"%(self.imei) + MD5_SIGN = self.pack_MD5_head(send_data) + data = "[%s%s]"%(str(MD5_SIGN),send_data) + #Wechat_log("POWEROFF_ProtoCol:send:%s"%(data)) + # 通过socket发送到服务器端 + EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND, data) + + def recv(self, event, msg): + # SZKW*860132060346475*0013*REMIND_CH_MEDICINE2,4-1 + msg = msg[1:-1] + msg_tmp = msg.decode('ascii') + + msg_data = str(msg_tmp.split('REMIND_CH_MEDICINE2,')[1]) + msg_data_tmp = str(msg_tmp.split('REMIND_CH_MEDICINE2')[1]) + + medicin_data = [] + alarmday=[] + count = 0 + for i in str(msg_data_tmp): + # print("i",i) + if i == ",": + count+=1 + + if count >= 3: + count = 3 + medicine_alarmday = [] + for i in range(0,count):#默认是三个时间多了也不保存 + medicine_alarmday = str(msg_data.split(",")[count]) + # print("i",i) + medicine_alarm = str(msg_data.split(",")[i]) + if str(medicine_alarm).find("-") != -1: + on = int(medicine_alarm.split('-')[1]) + if on != 0: + alarmday = [] + data = str(medicine_alarm.split('-')[0]) + hour = int(data.split(":")[0]) + min = int(data.split(":")[1]) + for i in range(0,7): + # print("medicine_alarmday",medicine_alarmday,medicine_alarmday[i]) + if medicine_alarmday[i] != '0': + alarmday.append(i) + enable = 1 + medicin_data.append({"hour":hour,"min":min,"day":alarmday,"enable":enable}) + + EventMesh.publish("set_storage_config",["medicine",medicin_data]) + EventMesh.debug_log("recv REMIND_CH_MEDICINE2:{} medicin_data ;{}".format(msg,medicin_data)) + + EventMesh.publish(constants.PROTOCOL.REMIND_CH_MEDICINE2_SEND) + EventMesh.publish("clear_medicine_alarm") + +# 回家闹钟设置指令 +# 可设置闹钟的提醒文字 +# 平台发送: +# [XT*YYYYYYYYYYYYYYY*LEN*REMIND_CH_HOME,闹钟1,闹钟2,闹钟3] +# 实例: +# [XT*334588000000156*0018*REMIND_CH_HOME,08:10,12:10] +# 终端回复: +# [XT*YYYYYYYYYYYYYYY*LEN*REMIND_CH_HOME] +# 实例:[XT*334588000000156*0006*REMIND_CH_HOME] +# 说明:闹钟为时间点; +class REMIND_CH_HOME_ProtoCol(ProtoCol):#回家提醒 + """ + + 平台发送: + [XT*YYYYYYYYYYYYYYY*LEN*REMIND_CH_HOME,,时间1-开关,时间2-开关,周几] + 实例:[XT*334588000000156*0008*REMIND_CH_HOME,,时间1-开关,时间2-开关,周几] + 终端回复: + [XT*YYYYYYYYYYYYYYY*LEN*REMIND_CH_HOME] + """ + TYPE = "REMIND_CH_HOME" + + def send(self, event, msg): + send_data = EventMesh.publish("get_new_pid")+"*%s*000E*REMIND_CH_HOME"%(self.imei) + MD5_SIGN = self.pack_MD5_head(send_data) + data = "[%s%s]"%(str(MD5_SIGN),send_data) + #Wechat_log("POWEROFF_ProtoCol:send:%s"%(data)) + # 通过socket发送到服务器端 + EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND, data) + + def recv(self, event, msg): + # SZKW*860132060346475*0013*REMIND_CH_MEDICINE2,4-1 + msg = msg[1:-1] + msg_tmp = msg.decode('ascii') + msg_data = msg_tmp.split(',') + + # [SZKW*860132060346475*0014*REMIND_CH_HOME,00:00',) + home_data = str(msg_data[1]) + + EventMesh.debug_log("recv REMIND_CH_HOME:{} medicin_data ;{}".format(msg,home_data)) + if len(home_data) != 0: + EventMesh.publish("set_storage_config",["home_alarm",home_data]) + EventMesh.publish("clear_home_alarm") + EventMesh.publish(constants.PROTOCOL.REMIND_CH_HOME_SEND) +# 起床闹钟设置指令 +# 平台发送: +# [XT*YYYYYYYYYYYYYYY*LEN*REMIND_CH_WAKEUP,闹钟1,闹钟2] +# 实例: +# [XT*334588000000156*0026*REMIND_CH_WAKEUP,08:10-0-3-1000001,09:10-0-3-1000001] +# 闹钟格式为:时间-开关-频率(1:一次;2:每天;3:自定义) +# 08:10-1-1:闹钟时间8:10,打开,响铃一次 +# 08:10-1-2:闹钟时间8:10,打开,每天响铃 +# 08:10-1-3-0111110:闹钟时间8:10,打开,自定义周一至周五打开 +# 最左边是周日,最右边是周六,即0111110的顺序是:周日,周一,周二,周三,周四,周五,周六(1为打开,0为关闭),其中周一至周五打开闹钟 +# 终端回复: +# [XT*YYYYYYYYYYYYYYY*LEN*REMIND_CH_WAKEUP] +# 实例:[XT*334588000000156*000E*REMIND_CH_WAKEUP] +# 说明:闹铃格式为:时间-开关-周几(周六到周日) +class REMIND_CH_WAKEUP_ProtoCol(ProtoCol):#该起床了 + """ + + 平台发送: + [XT*YYYYYYYYYYYYYYY*LEN*REMIND_CH_WAKEUP,,时间1-开关,时间2-开关,周几] + 实例:[XT*334588000000156*0008*REMIND_CH_WAKEUP,,时间1-开关,时间2-开关,周几] + 终端回复: + [XT*YYYYYYYYYYYYYYY*LEN*REMIND_CH_WAKEUP] + """ + TYPE = "REMIND_CH_WAKEUP" + + def send(self, event, msg): + send_data = EventMesh.publish("get_new_pid")+"*%s*0011*REMIND_CH_WAKEUP"%(self.imei) + MD5_SIGN = self.pack_MD5_head(send_data) + data = "[%s%s]"%(str(MD5_SIGN),send_data) + #Wechat_log("POWEROFF_ProtoCol:send:%s"%(data)) + # 通过socket发送到服务器端 + EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND, data) + + def recv(self, event, msg): + # SZKW*860132060346475*0013*REMIND_CH_MEDICINE2,4-1 + msg = msg[1:-1] + msg_tmp = msg.decode('ascii') + msg_tmp_new = str(msg_tmp.split('REMIND_CH_WAKEUP,')[1]) + msg_tmp_data = str(msg_tmp.split('REMIND_CH_WAKEUP')[1]) + count = 0 + for i in str(msg_tmp_data): + # print("i",i) + if i == ",": + count+=1 + wakeup_data_save = [] + # # ("handler -> b'[SZKW*860132060346475*001C*REMIND_CH_WAKEUP,08:00-1-1,,]'",) + # medicine_alarmday = str(msg_data[4]) + # alarmday=[] + wakeup_day = [] + wakeup_switch = 0 + + print("count",count) + if count >= 3: + count = 3 + for i in range(0,count):#默认是三个时间多了也不保存 + wakeup_day = [] + wakeup_data = str(msg_tmp_new.split(',')[i]) + # print("i",i,wakeup_data) + if len(wakeup_data) != 0: + b = wakeup_data.find('-') + if b != -1: + wakeup_time = wakeup_data.split('-')[0]#-作为分隔符 + wakeup_switch = int(wakeup_data.split('-')[1])#开关 + wakeup_repeat = int(wakeup_data.split('-')[2])#是单次还是每天 还是自定义 + + wakeup_hour = int(wakeup_time.split(":")[0])#时间 + wakeup_min = int(wakeup_time.split(":")[1])#冒号分隔时间 时 分 + + + if wakeup_repeat == 2:#每一天 + wakeup_day = [0,1,2,3,4,5,6] + elif wakeup_repeat == 3:#自定义 + wakeup_day_tmp = wakeup_data.split('-')[3]#-作为分隔符 + for i in range(0,7): + if wakeup_day_tmp[i] != '0': + wakeup_day.append(i) + else:#单次 1 + wakeup_day=[] + if wakeup_switch != 0: + wakeup_data_save.append({"hour":wakeup_hour,"min":wakeup_min,"day":wakeup_day,"enable":wakeup_switch}) + + EventMesh.publish("set_storage_config",["wakeup_alarm",wakeup_data_save]) + wakeup = EventMesh.publish("get_storage_config","wakeup_alarm") + + EventMesh.debug_log("recv REMIND_CH_WAKEUP:{} wakeup ;{}".format(msg,wakeup)) + + EventMesh.publish(constants.PROTOCOL.REMIND_CH_WAKEUP_SEND) + + EventMesh.publish("clear_wakeup_alarm") + + + +# 睡觉闹钟设置指令 +# 平台发送: +# [XT*YYYYYYYYYYYYYYY*LEN*REMIND_CH_SLEEP,闹钟1,闹钟2] +# 实例: +# [XT*334588000000156*0026*REMIND_CH_SLEEP,08:10-0-3-1000001,09:10-0-3-1000001] +# 闹钟格式为:时间-开关-频率(1:一次;2:每天;3:自定义) +# 08:10-1-1:闹钟时间8:10,打开,响铃一次 +# 08:10-1-2:闹钟时间8:10,打开,每天响铃 +# 08:10-1-3-0111110:闹钟时间8:10,打开,自定义周一至周五打开 +# 最左边是周日,最右边是周六,即0111110的顺序是:周日,周一,周二,周三,周四,周五,周六(1为打开,0为关闭),其中周一至周五打开闹钟 +# 终端回复: +# [XT*YYYYYYYYYYYYYYY*LEN*REMIND_CH_SLEEP] +# 实例:[XT*334588000000156*000E*REMIND_CH_SLEEP] +# 说明:闹铃格式为:时间-开关-周几(周六到周日) +class REMIND_CH_SLEEP_ProtoCol(ProtoCol):#该睡觉了 + """ + + 平台发送: + [XT*YYYYYYYYYYYYYYY*LEN*REMIND_CH_SLEEP,,时间1-开关,时间2-开关,周几] + 实例:[XT*334588000000156*0008*REMIND_CH_SLEEP,,时间1-开关,时间2-开关,周几] + 终端回复: + [XT*YYYYYYYYYYYYYYY*LEN*REMIND_CH_SLEEP] + """ + TYPE = "REMIND_CH_SLEEP" + + def send(self, event, msg): + send_data = EventMesh.publish("get_new_pid")+"*%s*0011*REMIND_CH_SLEEP"%(self.imei) + MD5_SIGN = self.pack_MD5_head(send_data) + data = "[%s%s]"%(str(MD5_SIGN),send_data) + #Wechat_log("POWEROFF_ProtoCol:send:%s"%(data)) + # 通过socket发送到服务器端 + EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND, data) + + def recv(self, event, msg): + # SZKW*860132060346475*0013*REMIND_CH_MEDICINE2,4-1 + msg = msg[1:-1] + msg_tmp = msg.decode('ascii') + msg_tmp_new = str(msg_tmp.split('REMIND_CH_SLEEP,')[1]) + msg_tmp_data = str(msg_tmp.split('REMIND_CH_SLEEP')[1]) + count = 0 + for i in str(msg_tmp_data): + # print("i",i) + if i == ",": + count+=1 + + sleep_data_save = [] + # # ("handler -> b'[SZKW*860132060346475*001C*REMIND_CH_SLEEP,08:00-1-1,,]'",) + # b'[SZKW*860132060346475*001B*REMIND_CH_SLEEP,08:00-1-1,,]'",) + # medicine_alarmday = str(msg_data[4]) + # alarmday=[] + sleep_day = [] + sleep_switch = 0 + + print("count",count) + if count >= 3: + count = 3 + for i in range(0,count):#默认是三个时间多了也不保存 + sleep_day = [] + sleep_data = str(msg_tmp_new.split(',')[i]) + # print("i",i,sleep_data) + if len(sleep_data) != 0: + b = sleep_data.find('-') + if b != -1: + sleep_time = sleep_data.split('-')[0]#-作为分隔符 + sleep_switch = int(sleep_data.split('-')[1])#开关 + sleep_repeat = int(sleep_data.split('-')[2])#是单次还是每天 还是自定义 + + sleep_hour = int(sleep_time.split(":")[0])#时间 + sleep_min = int(sleep_time.split(":")[1])#冒号分隔时间 时 分 + + + if sleep_repeat == 2:#每一天 + sleep_day = [0,1,2,3,4,5,6] + elif sleep_repeat == 3:#自定义 + sleep_day_tmp = sleep_data.split('-')[3]#-作为分隔符 + for i in range(0,7): + if sleep_day_tmp[i] != '0': + sleep_day.append(i) + else:#单次 1 + sleep_day=[] + if sleep_switch != 0: + sleep_data_save.append({"hour":sleep_hour,"min":sleep_min,"day":sleep_day,"enable":sleep_switch}) + + EventMesh.publish("set_storage_config",["sleep_alarm",sleep_data_save]) + # sleep = EventMesh.publish("get_storage_config","sleep_alarm") + + # EventMesh.debug_log("recv REMIND_CH_SLEEP_SEND:{} sleep ;{}".format(msg,sleep)) + + EventMesh.publish(constants.PROTOCOL.REMIND_CH_SLEEP_SEND) + EventMesh.publish("clear_sleep_alarm") + + +# 可设置闹钟的提醒文字 +# 平台发送: +# [XT*YYYYYYYYYYYYYYY*LEN*REMIND_CH_REST,时间间隔1,时间间隔2,时间间隔3] +# 实例: +# [XT*334588000000156*0026*REMIND_CH_REST,08:10-10:00,12:10-15:00] +# 终端回复: +# [XT*YYYYYYYYYYYYYYY*LEN*REMIND_CH_REST] +# 实例:[XT*334588000000156*000E*REMIND_CH_REST] +# 说明:时间间隔 【起始-结束】,起始为开始休息,结束为休息结束 + +class REMIND_CH_REST_ProtoCol(ProtoCol):#该休息了 + """ + + 平台发送: + [XT*YYYYYYYYYYYYYYY*LEN*REMIND_CH_REST,,时间1-开关,时间2-开关,周几] + 实例:[XT*334588000000156*0008*REMIND_CH_REST,,时间1-开关,时间2-开关,周几] + 终端回复: + [XT*YYYYYYYYYYYYYYY*LEN*REMIND_CH_REST] + """ + TYPE = "REMIND_CH_REST" + + def send(self, event, msg): + send_data = EventMesh.publish("get_new_pid")+"*%s*000E*REMIND_CH_REST"%(self.imei) + MD5_SIGN = self.pack_MD5_head(send_data) + data = "[%s%s]"%(str(MD5_SIGN),send_data) + #Wechat_log("POWEROFF_ProtoCol:send:%s"%(data)) + # 通过socket发送到服务器端 + EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND, data) + + def recv(self, event, msg): + # SZKW*860132060346475*0013*REMIND_CH_REST,4-1 + msg = msg[1:-1] + msg_tmp = msg.decode('ascii') + msg_data = str(msg_tmp.split('REMIND_CH_REST,')[1]) + msg_data_new = str(msg_tmp.split('REMIND_CH_REST')[1]) + print("REMIND_CH_REST",len(msg_data),msg_data) + + reset_data_save = [] + count = 0 + for i in str(msg_data_new): + # print("i",i) + if i == ",": + count+=1 + + if count >= 2: + count = 2 + + for i in range(0,count):#默认是三个时间多了也不保存 + reset_data = str(msg_data.split(',')[i]) + print("i",i,reset_data) + if len(reset_data) != 0: + b = reset_data.find('-') + if b != -1: + start_time = reset_data.split('-')[0]#-作为分隔符 + end_time = reset_data.split('-')[1]#-作为分隔符 + + start_hour = int(start_time.split(":")[0]) + start_min = int(start_time.split(":")[1]) + + end_hour = int(end_time.split(":")[0]) + end_min = int(end_time.split(":")[1]) + + reset_data_save.append({"start_hour":start_hour,"start_min":start_min,"end_hour":end_hour,"end_min":end_min}) + + EventMesh.publish("set_storage_config",["reset_alarm",reset_data_save]) + # reset = EventMesh.publish("get_storage_config","reset_alarm") + + # EventMesh.debug_log("recv REMIND_CH_REST:{} reset ;{}".format(msg,reset)) + + EventMesh.publish(constants.PROTOCOL.REMIND_CH_REST_SEND) + EventMesh.publish("clear_reset_alarm") + + + +class WLKEY_ProtoCol(ProtoCol):#白名单开关 + """ + 白名单开关 + [XT*YYYYYYYYYYYYYYY*LEN*WLKEY,ONOFF] ONOFF: 1:开启,0:关闭,2:30秒后自动接听。 + 实例:[XT*334588000000156*0008*WLKEY,1] + 终端回复 + [XT*YYYYYYYYYYYYYYY*LEN*WLKEY] + 实例:[XT*334588000000156*0006*WLKEY] + """ + TYPE = "WLKEY" + + def send(self, event, msg): + send_data = EventMesh.publish("get_new_pid")+"*%s*00006*WLKEY"%(self.imei) + MD5_SIGN = self.pack_MD5_head(send_data) + data = "[%s%s]"%(str(MD5_SIGN),send_data) + #Wechat_log("POWEROFF_ProtoCol:send:%s"%(data)) + # 通过socket发送到服务器端 + EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND, data) + + def recv(self, event, msg): + + msg = msg[1:-1] + msg_tmp = msg.decode('ascii') + msg_data = msg_tmp.split(',') + EventMesh.debug_log("WLKEY_ProtoCol".format(msg_data[1])) + EventMesh.publish("set_storage_config",["WLKEY",msg_data[1]]) + + + EventMesh.publish(constants.PROTOCOL.WLKEY_SEND) +# 终端发送: +# [XT*YYYYYYYYYYYYYYY*LEN*SLEEP_DATA,清醒时间(分钟),浅睡时间(分钟),深睡时间(分钟),日期(年月日)] +# 实例: [XT*334588000000156*0004*SLEEP_DATA,120,240,360,20221008] +# 实例表示:上传睡眠数据 +#[XT*334588000000156*0010*SleepReport,2022-02-09,80,2,532,164,164,25,25,25,25,21:45-0-164-155-3,22:00-1-162-155-0,22:15-2-162-155-0] +class SLEEP_DATA_ProtoCol(ProtoCol):#睡眠时间 + """ + 白名单开关 + [XT*YYYYYYYYYYYYYYY*LEN*WLKEY,ONOFF] ONOFF: 1:开启,0:关闭,2:30秒后自动接听。 + 实例:[XT*334588000000156*0008*WLKEY,1] + 终端回复 + [XT*YYYYYYYYYYYYYYY*LEN*WLKEY] + 实例:[XT*334588000000156*0006*WLKEY] + """ + TYPE = "SleepReport" + + def send(self, event, msg): + send_data = EventMesh.publish("get_new_pid")+"*%s*0000b*SleepReport"%(self.imei) + MD5_SIGN = self.pack_MD5_head(send_data) + data = "[%s%s,%s]"%(str(MD5_SIGN),send_data,msg) + EventMesh.debug_log("SLEEP_DATA:send:%s"%(data)) + # 通过socket发送到服务器端 + EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND, data) + + def recv(self, event, msg): + + EventMesh.debug_log("SLEEP_DATA!!!!!!!!!") + # msg = msg[1:-1] + # msg_tmp = msg.decode('ascii') + # msg_data = msg_tmp.split(',') + # EventMesh.debug_log("WLKEY_ProtoCol".format(msg_data[1])) + # EventMesh.publish("set_storage_config",["WLKEY",msg_data[1]]) + + + # EventMesh.publish(constants.PROTOCOL.WLKEY_SEND) + +class SLEEPTIME_ProtoCol(ProtoCol):#睡眠时间 + """ + """ + TYPE = "SLEEPTIME" + + def send(self, event, msg): + send_data = EventMesh.publish("get_new_pid")+"*%s*00009*SLEEPTIME"%(self.imei) + MD5_SIGN = self.pack_MD5_head(send_data) + data = "[%s%s]"%(str(MD5_SIGN),send_data) + EventMesh.debug_log("SLEEPTIME:send:%s"%(data)) + # 通过socket发送到服务器端 + EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND, data) + + def recv(self, event, msg): + # 实例:[XT*5678901234*0014*SLEEPTIME,23:30-7:30] + EventMesh.debug_log("SLEEPTIME!!!!!!!!!") + msg = msg[1:-1] + msg_tmp = msg.decode('ascii') + msg_data = str(msg_tmp.split(',')[1]) + data = {} + if len(msg_data) == 0: + EventMesh.publish("set_storage_config",["sleep_time",data]) + pass + else: + sleep_start = msg_data.split("-")[0] + sleep_end = msg_data.split("-")[1] + start_hour = int(sleep_start.split(":")[0]) + start_min = int(sleep_start.split(":")[1]) + + end_hour = int(sleep_end.split(":")[0]) + end_min = int(sleep_end.split(":")[1]) + + data = {"start_hour":start_hour,"start_min":start_min,"end_hour":end_hour,"end_min":end_min} + # EventMesh.debug_log("SLEEPTIME".format(data)) + EventMesh.publish("set_storage_config",["sleep_time",data]) + # sleep_time = EventMesh.publish("get_storage_config","sleep_time") + # EventMesh.debug_log("sleep_time:{}".format(sleep_time)) + + EventMesh.publish(constants.PROTOCOL.SLEEPTIME_SEND) + +# 平台发送: +# [XT*YYYYYYYYYYYYYYY*LEN*FACTORY] +# 实例:[XT*334588000000156*0007*FACTORY] +# 终端回复: +# [XT*YYYYYYYYYYYYYYY*LEN*FACTORY] +# 实例:[XT*334588000000156*0007*FACTORY] +# 说明:终端恢复出厂设置,里面设置的号码都将清空 +class FACTORY_ProtoCol(ProtoCol):#睡眠时间 + """ + 实例:[XT*334588000000156*0008*FACTORY] + 终端回复 + [XT*YYYYYYYYYYYYYYY*LEN*WLKEY] + 实例:[XT*334588000000156*0006*FACTORY] + """ + TYPE = "FACTORY" + + def send(self, event, msg): + send_data = EventMesh.publish("get_new_pid")+"*%s*0007*FACTORY"%(self.imei) + MD5_SIGN = self.pack_MD5_head(send_data) + data = "[%s%s]"%(str(MD5_SIGN),send_data) + EventMesh.debug_log("FACTORY:send:%s"%(data)) + # 通过socket发送到服务器端 + EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND, data) + + def recv(self, event, msg): + + EventMesh.debug_log("FACTORY!!!!!!!!!") + # msg = msg[1:-1] + # msg_tmp = msg.decode('ascii') + # msg_data = msg_tmp.split(',') + # EventMesh.debug_log("WLKEY_ProtoCol".format(msg_data[1])) + # EventMesh.publish("set_storage_config",["WLKEY",msg_data[1]]) + + EventMesh.publish(constants.PROTOCOL.FACTORY_SEND) + EventMesh.publish("app_factory",None)#app恢复出厂 + +# 平台发送: +# [3G*YYYYYYYYYY*LEN*RESET] +# 实例:[3g*5678901234*0005*RESET] +# 终端回复: +# [3G*YYYYYYYYYY*LEN*RESET] +class RESET_ProtoCol(ProtoCol):#重启 + """ + 实例:[XT*334588000000156*0008*RESET] + 终端回复 + [XT*YYYYYYYYYYYYYYY*LEN*RESET] + 实例:[XT*334588000000156*0006*RESET] + """ + TYPE = "RESET" + + def send(self, event, msg): + send_data = EventMesh.publish("get_new_pid")+"*%s*0005*RESET"%(self.imei) + MD5_SIGN = self.pack_MD5_head(send_data) + data = "[%s%s]"%(str(MD5_SIGN),send_data) + EventMesh.debug_log("RESET:send:%s"%(data)) + # 通过socket发送到服务器端 + EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND, data) + + def recv(self, event, msg): + + EventMesh.debug_log("RESET!!!!!!!!!") + # msg = msg[1:-1] + # msg_tmp = msg.decode('ascii') + # msg_data = msg_tmp.split(',') + # EventMesh.debug_log("WLKEY_ProtoCol".format(msg_data[1])) + # EventMesh.publish("set_storage_config",["WLKEY",msg_data[1]]) + + EventMesh.publish(constants.PROTOCOL.RESET_SEND) + Power.powerRestart() + +# 平台发送: +# [XT*YYYYYYYYYYYYYYY*LEN*REMIND_CH_SIT,时间间隔(分钟),总开关(0为关,1为开),午间休息时段,晚间休息时段] +# 午间/晚间休息时段格式为:开始时间(hh:mm)-结束时间(hh:mm)-开关(0为关,1为开),例如 12:00-15:00-1。 +# 久坐默认值为20分钟。 +# 午间和晚间默认值,午间12:00-14:00,晚上20:00-07:00。 +# 实例: +# [XT*334588000000156*0026*REMIND_CH_SIT,20,0,12:00-15:00-1,20:00-07:00-1] +# 终端回复: +# [XT*YYYYYYYYYYYYYYY*LEN*REMIND_CH_SIT] +# 实例:[XT*334588000000156*000E*REMIND_CH_SIT] +class REMIND_CH_SIT_ProtoCol(ProtoCol):#久坐提醒 + """ + 实例:[XT*334588000000156*0008*REMIND_CH_SIT] + 终端回复 + [XT*YYYYYYYYYYYYYYY*LEN*REMIND_CH_SIT] + 实例:[XT*334588000000156*0006*REMIND_CH_SIT] + """ + TYPE = "REMIND_CH_SIT" + + def send(self, event, msg): + send_data = EventMesh.publish("get_new_pid")+"*%s*000d*REMIND_CH_SIT"%(self.imei) + MD5_SIGN = self.pack_MD5_head(send_data) + data = "[%s%s]"%(str(MD5_SIGN),send_data) + EventMesh.debug_log("REMIND_CH_SIT:send:%s"%(data)) + # 通过socket发送到服务器端 + EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND, data) + + def recv(self, event, msg): + + EventMesh.debug_log("REMIND_CH_SIT!!!!!!!!!") + # msg = msg[1:-1] + # msg_tmp = msg.decode('ascii') + # msg_data = msg_tmp.split(',') + # EventMesh.debug_log("WLKEY_ProtoCol".format(msg_data[1])) + # EventMesh.publish("set_storage_config",["WLKEY",msg_data[1]]) + + EventMesh.publish(constants.PROTOCOL.REMIND_CH_SIT_SEND) + +# 平台发送: +# [XT*YYYYYYYYYYYYYYY*LEN*SCREEN_SHOW,参数内容] +# 实例:[XT*334588000000156*0016*SCREEN_SHOW,00000000000] +# 参数内容用 unicode 编码呈现,设备收到后需解码。 +# 解码后的参数内容可能有多个参数,不同参数用逗号分隔,设备自己决定如何在屏幕中显示这些参数。比如 "SCREEN_SHOW,深圳第一中学,三年1班、张三" +# 终端回复: +# [XT*YYYYYYYYYYYYYYY*LEN*SCREEN_SHOW] +# 实例:[XT*334588000000156*000B*SCREEN_SHOW] + +class SCREEN_SHOWProtoCol(ProtoCol): + """开屏显示""" + TYPE = "SCREEN_SHOW" + def send(self, event, msg): + # [XT*334588000000156*0006*SILENCETIME2] + send_data = EventMesh.publish("get_new_pid")+"*%s*000B*SCREEN_SHOW"%(self.imei) + MD5_SIGN = self.pack_MD5_head(send_data) + data = "[%s%s]"%(str(MD5_SIGN),send_data) + # print("KEYBRD:data:%s"%(data)) + # print("KEYBRD!!!!!!!!!!!!!",msg) + # 通过socket发送到服务器端 + EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND,data) + + def recv(self, event, msg): + """ + @param event: + @param msg: 接收到的下行数据 + """ + msg = msg[1:-1] + msg_tmp = msg.decode('ascii') + msg_tmp = msg_tmp.split(',') + msg_tmp = msg_tmp[1:] + msg_tmp = msg_tmp[0] + print("screen_school_data msg",msg) + + j = 0 + i = 0 + videobook_old = {} + videobook_name_tmp = UnicodeHexStr_To_Utf8Str(msg_tmp) + lst = videobook_name_tmp.split(",") + print("lst data",lst) + + # 0 1 2 3 + screen_school_data = ""#学校 + screen_class_data = ""#班级 + screen_fullname_data = ""#姓名 + if len(lst) != 0: + count = len(lst) + if count > 3: + count = 3 + for i in range(count): + if i == 0: + screen_school_data = lst[0] + EventMesh.publish("set_schoolname", screen_school_data)# + elif i == 1: + screen_class_data = lst[1] + EventMesh.publish("set_classname", screen_class_data)# + else: + screen_fullname_data= lst[2] + EventMesh.publish("set_fullname", screen_fullname_data)# + + # EventMesh.publish("update_screen_show")#更新开屏显示 + + print("screen_school_data!!!:",screen_school_data,screen_class_data,screen_fullname_data) + + EventMesh.publish(constants.PROTOCOL.SCREEN_SHOW_SEND) + +# #小见平台视频通话 +# # [XT*YYYYYYYYYYYYYYY*LEN*JPREG] +# # 实例: +# # [XT*334588000000156*0004*JPREG] +# # 平台回复: +# # [XT*设备ID*LEN*JPREG,账号(整型)] +# # 实例:[XT*334588000000156*0010*JPREG,1087654321] +class JPREG_ProtoCol(ProtoCol):#登入注册 + """""" + TYPE = "JPREG" + def send(self, event, msg): + + # [XT*334588000000156*0005*WLKEY] + send_data = EventMesh.publish("get_new_pid")+"*%s*0005*JPREG"%(self.imei) + MD5_SIGN = self.pack_MD5_head(send_data) + data = "[%s%s]"%(str(MD5_SIGN),send_data) + # print("WLKEY:data:%s"%(data)) + # print("WLKEY!!!!!!!!!!!!!") + # 通过socket发送到服务器端 + EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND,data) + + def recv(self, event, msg): + """ + @param event: + @param msg: 接收到的下行数据 + """ + # b'[SZKW*867387060319166*000A*KEYBRD]' + print("JPREG!!!!!!!!!!!!!",msg,EventMesh.publish("get_new_pid")) + # EventMesh.publish(constants.PROTOCOL.JPREG_SEND) + +# # (声网,佰锐的账号是整型) +# # [XT*YYYYYYYYYYYYYYY*LEN*MEMBERS] +# # 实例:[XT*334588000000156*0007*MEMBERS] +# # 平台回复:[XT*设备ID*LEN*MEMBERS,账号1,昵称1,电话1,账号2,昵称2,电话2.....] +# # 实例: +# # [XT*334588000000156*003F*MEMBERS,d3e2f759f9d5af3858f3530,爸爸,13662313580,妈妈,555] +# # 以上数据部分使用Unicode编码,最终上面示例传到服务端将是: + +class MEMBERS_ProtoCol(ProtoCol):#获取账号列表 + """""" + TYPE = "MEMBERS" + def send(self, event, msg): + + # [XT*334588000000156*0005*WLKEY] + send_data = EventMesh.publish("get_new_pid")+"*%s*0007*MEMBERS"%(self.imei) + MD5_SIGN = self.pack_MD5_head(send_data) + data = "[%s%s]"%(str(MD5_SIGN),send_data) + print("MEMBERS SEND:data:%s"%(data)) + # print("WLKEY!!!!!!!!!!!!!") + # 通过socket发送到服务器端 + EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND,data) + + def recv(self, event, msg): + """ + @param event: + @param msg: 接收到的下行数据 + """ + # b'[SZKW*876226002021444*0048*MEMBERS,0036003900350031003800330032002C563F563FD83CDF410020D83CDF42002C]' + print("MEMBERS!!!!!!!!!!!!!",msg,EventMesh.publish("get_new_pid")) + msg = msg[1:-1] + msg_tmp = msg.decode('ascii') + msg_tmp = msg_tmp.split(',') + + videobook = {} + msg_tmp = msg_tmp[1:] + msg_tmp = msg_tmp[0] + + j = 0 + i = 0 + videobook_old = {} + videobook_name_tmp = UnicodeHexStr_To_Utf8Str(msg_tmp) + lst = videobook_name_tmp.split(",") + + print("msg_tmp:{} phonebook_oldtmp:{} type:{}".format(msg_tmp,videobook_name_tmp,lst)) + # 0 1 2 3 + for vediobook_tmp in lst: + + if (j % 3) == 0:#账号 + videobook_old = vediobook_tmp + elif (j % 3) == 1:#名称 + i+=1 + videobook_name_cont= "{}:{}".format("%03d"%(i),videobook_old) + videobook[videobook_name_cont] = vediobook_tmp + j+=1 + print("videobook!!!:{}".format(str(videobook))) + # print("phonebook!!!:{}".format(str(phonebook))) + with open("/usr/static/storage_file/videobook.json","w",encoding="utf-8") as fd: + ujson.dump(videobook,fd) + print("创建视频通话账号") + + EventMesh.publish("set_videobook_list",[1,videobook]) + # EventMesh.publish("video_updata_list_show") + # EventMesh.publish(constants.PROTOCOL.MEMBERS_SEND) + +# # [X*Y*LEN*CALLING,呼叫者id,会议id,通话类型,Token] + +# # 设备回复 +# # [X*Y*LEN*CALLING,音视频状态] +# # 音视频状态:为0表示正常可通讯状态,否则填上用音视频返回的状态码,比如200,如果未获取到返回状态码,则填1 +class CALLING_ProtoCol(ProtoCol):#app发起视频通话 + """""" + TYPE = "CALLING" + def send(self, event, msg): + + # [XT*334588000000156*0005*WLKEY] + send_data = EventMesh.publish("get_new_pid")+"*%s*0007*CALLING"%(self.imei) + MD5_SIGN = self.pack_MD5_head(send_data) + data = "[%s%s,%d]"%(str(MD5_SIGN),send_data,msg) + # print("CALLING:send data:%s"%(data)) + # print("WLKEY!!!!!!!!!!!!!") + # 通过socket发送到服务器端 + EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND,data) + + def recv(self, event, msg): + """ + @param event: + @param msg: 接收到的下行数据 + """ + # b'[SZKW*867387060319166*000A*CALLING]' + print("CALLING!!!!!!!!!!!!!",msg) + if EventMesh.model == "D10":#D10没有视频通话 + EventMesh.publish(constants.PROTOCOL.CALLING_SEND,1) + return + msg = msg[1:-1] + msg_tmp = msg.decode('ascii') + msg_tmp_d = msg_tmp.split(',') + call_id = msg_tmp_d[1]#id + meet_id = msg_tmp_d[2]#会议id + call_type = int(msg_tmp_d[3])#会议id# 0音频 1视频 + tokens_data = msg_tmp_d[4]#tokens + EventMesh.publish("set_vedio_call_id", call_id)# + EventMesh.publish("set_vedio_meet_id", meet_id)# + EventMesh.publish("set_vedio_call_type", call_type)# + EventMesh.publish("set_vedio_tokens_data", tokens_data)# + + 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") + sos_dialing = EventMesh.publish("get_sos_state_out")#正在拨打sos电话 + if flag != 0 or fall_down != 0 or video_state != 0 or sos_dialing != 0: #电话在打入或者 在充电不允许视频通话 + EventMesh.publish(constants.PROTOCOL.CALLING_SEND,1) + else: + EventMesh.publish(constants.PROTOCOL.CALLING_SEND,0) + EventMesh.publish("set_video_state", 6) + EventMesh.publish("set_dev_app_mode", 2)# + EventMesh.publish("close_hr_sop2")# + EventMesh.publish("video_call_in_event",call_type) + +# # [XT*YYYYYYYYYYYYYYY*LEN*RCALLING,呼叫者id,会议id/声网频道名(没有则留空,但位置保留),音频还是视频(0为音频,1为视频)] +# # 实例: +# # [XT*334588000000156*0007*RCALLING,d3e2f759f9d5af3858f3530b,,0] +# # 终端回复: +# # [XT*设备ID*LEN*RCALLING] +# # 实例:[XT*334588000000156*0009*RCALLING] +# # +class RCALLING_ProtoCol(ProtoCol):#设备拒接接听 + """""" + TYPE = "RCALLING" + def send(self, event, msg): + + # [XT*334588000000156*0005*WLKEY] + send_data = EventMesh.publish("get_new_pid")+"*%s*0008*RCALLING"%(self.imei) + MD5_SIGN = self.pack_MD5_head(send_data) + data = "[%s%s,%s,%s,%d]"%(str(MD5_SIGN),send_data,msg[0],msg[1],msg[2]) + # print("RCALLING:send data:%s"%(data)) + # print("WLKEY!!!!!!!!!!!!!") + # 通过socket发送到服务器端 + EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND,data) + # print("RCALLING:send data end:%s"%(data)) + + def recv(self, event, msg): + """ + @param event: + @param msg: 接收到的下行数据 + """ + # b'[SZKW*867387060319166*000A*RCALLING]' + print("RCALLING!!!!!!!!!!!!!") + +class AGTALK_ProtoCol(ProtoCol):#设备发起视频通话与app接听视频通话 + """""" + TYPE = "AGTALK" + def send(self, event, msg): + + # [XT*334588000000156*0005*WLKEY] + send_data = EventMesh.publish("get_new_pid")+"*%s*0006*AGTALK"%(self.imei) + MD5_SIGN = self.pack_MD5_head(send_data) + data = "[%s%s,%d,%s]"%(str(MD5_SIGN),send_data,msg[0],msg[1]) + print("AGTALK:send data:%s"%(data)) + # print("WLKEY!!!!!!!!!!!!!") + # 通过socket发送到服务器端 + EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND,data) + + def recv(self, event, msg): + """ + @param event: + @param msg: 接收到的下行数据 + """ + # b'[SZKW*876226002021444*007B*AGTALK,0,01lqlyqzzQHpfwv5g7jFVC2H6Ha2tHFpMlfSm5sd2uo7o55JEcc=OVxewje6MjP0NgEODwsLDwkJCwkLCA0NDQ==,8762260020214441701226895]' + # print("AGTALK!!!!!!!!!!!!!") + msg = msg[1:-1] + msg_tmp = msg.decode('ascii') + msg_tmp_d = msg_tmp.split(',') + call_state = int(msg_tmp_d[1])#返回是否可以视频通话 + if call_state == 0:#可正常通话 + if EventMesh.publish("get_video_state") != 0: + # print("AGTALK!!!!!!!!!!!!!answer") + tokens_data = msg_tmp_d[2]#会议id + meet_id = msg_tmp_d[3]#会议id + EventMesh.publish("set_vedio_meet_id", meet_id)# + EventMesh.publish("set_vedio_tokens_data", tokens_data)# + EventMesh.publish("open_vedio_infor") + + else: + #不能视频通话 + tokens_data = msg_tmp_d[2]#token数据 + meet_id = msg_tmp_d[3]#会议id + EventMesh.publish("set_vedio_meet_id", meet_id)# + EventMesh.publish("set_vedio_tokens_data", tokens_data)# + EventMesh.publish("video_newwork_reject_cb",None)#挂断视频通话 + # print("AGTALK no!!!!!!!!!!!!!") + + print("AGTALK!!!!!!!!!!!!!") + + +class RTALK_ProtoCol(ProtoCol):#app拒接视频通话 + """""" + TYPE = "RTALK" + def send(self, event, msg): + + # [XT*334588000000156*0005*WLKEY] + send_data = EventMesh.publish("get_new_pid")+"*%s*0005*RTALK"%(self.imei) + MD5_SIGN = self.pack_MD5_head(send_data) + data = "[%s%s,%d,%s]"%(str(MD5_SIGN),send_data,msg[0],msg[1]) + # print("AGTALK:send data:%s"%(data)) + # print("WLKEY!!!!!!!!!!!!!") + # 通过socket发送到服务器端 + EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND,data) + + def recv(self, event, msg): + """ + @param event: + @param msg: 接收到的下行数据 + """ + # b'[SZKW*867387060319166*000A*RTALK]' + print("RTALK!!!!!!!!!!!!!") + # [SZKW*876226002021444*003A*RTALK,3ef20e64f3abb84b27f7d764,8762260020214441701226522,1]' + msg = msg[1:-1] + msg_tmp = msg.decode('ascii') + msg_tmp_d = msg_tmp.split(',') + EventMesh.publish("app_rtalk_cb",1) + + + + +class ProtoColResolver(object): + def __init__(self): + self.protocol_list = [] + + def add_support(self, prot): + self.protocol_list.append(prot) + prot.initialization() + + def handler(self, data): + # 这里接收数据 + + EventMesh.debug_log("handler -> {}".format(data)) + # if data.startswith('Init;'): + # data = data[5:] + # EventMesh.publish(constants.EVENT.SET_KEY, {"value": ujson.loads(data)['KEY']}) + + # elif data.startswith("Update;"): + # data = data[7:] + # EventMesh.publish(constants.PROTOCOL.H04_RECV, data) + try: + if len(data) > 0: + #EventMesh.debug_log("handler:{}".format(len(data))) + data_tmp = data.decode('ascii') + data_tmp = data_tmp.split(']')[0] #去掉] + ProtoCol_type = data_tmp.split('*')[3] #拿到协议标识 + ProtoCol_type = ProtoCol_type.split(',')[0] + ProtoCol_type = "%s_RECV"%(ProtoCol_type) + # EventMesh.debug_log("ProtoColResolver:ProtoCol_type:%s\r\ndata:%s"%(ProtoCol_type,data)) + EventMesh.publish(ProtoCol_type, data) #返回协议read + except Exception as e: + EventMesh.debug_log("handler:ERROR:") + usys.print_exception(e) + EventMesh.debug_log("handler:error data:{}".format(len(data))) diff --git a/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/sleep_test.py b/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/sleep_test.py new file mode 100644 index 00000000..8f4750c8 --- /dev/null +++ b/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/sleep_test.py @@ -0,0 +1,215 @@ + +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)) +# usys.print_exception(e) \ No newline at end of file diff --git a/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/tesr.mp3 b/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/tesr.mp3 new file mode 100644 index 00000000..9aad4b0e Binary files /dev/null and b/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/tesr.mp3 differ diff --git a/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/tiktok_rtc_demo.py b/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/tiktok_rtc_demo.py new file mode 100644 index 00000000..4d97ab35 --- /dev/null +++ b/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/tiktok_rtc_demo.py @@ -0,0 +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) +# print("tiktok.active(True2)") \ No newline at end of file diff --git a/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/tts_tesr.mp3 b/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/tts_tesr.mp3 new file mode 100644 index 00000000..0be5a241 Binary files /dev/null and b/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/tts_tesr.mp3 differ diff --git a/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/tts_tesr_01.wav b/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/tts_tesr_01.wav new file mode 100644 index 00000000..3213143a Binary files /dev/null and b/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/tts_tesr_01.wav differ diff --git a/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/ui.py b/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/ui.py new file mode 100644 index 00000000..1ed017ee --- /dev/null +++ b/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/ui.py @@ -0,0 +1,351 @@ +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.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 + + #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.debug_log("system_sleep_timer_count:{}".format(self.system_sleep_timer_count)) + 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)) + + + + + diff --git a/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/usr/R_READ_TIME_AB.mp3 b/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/usr/R_READ_TIME_AB.mp3 new file mode 100644 index 00000000..a82319cd Binary files /dev/null and b/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/usr/R_READ_TIME_AB.mp3 differ diff --git a/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/usr/ai_VC.py b/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/usr/ai_VC.py new file mode 100644 index 00000000..45348774 --- /dev/null +++ b/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/usr/ai_VC.py @@ -0,0 +1,2175 @@ +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 Vbattself.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)#恢复原始音量 + \ No newline at end of file diff --git a/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/usr/ai_test.py b/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/usr/ai_test.py new file mode 100644 index 00000000..13417eff --- /dev/null +++ b/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/usr/ai_test.py @@ -0,0 +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))) diff --git a/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/usr/test.mp3 b/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/usr/test.mp3 new file mode 100644 index 00000000..52644ccc Binary files /dev/null and b/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/usr/test.mp3 differ diff --git a/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/usr/test1.py b/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/usr/test1.py new file mode 100644 index 00000000..6b0a1598 --- /dev/null +++ b/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/usr/test1.py @@ -0,0 +1,3854 @@ +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= 2: + # self.Low_power_warning_timer = 0 + EventMesh.publish("audio_montage_play",["Low_power_warning.mp3"]) + + if self.usb_status == 0 and Vbatt= 8640:#24小时没按键,则关机 + self.pwk_key_Long_Press() + + def get_battery(self, event=None, msg=None): + Vbatt = Power.getVbatt() + if Vbatt>self.VBATT_tab["90"]: + return 100 + if Vbatt>self.VBATT_tab["80"]: + return 90 + if Vbatt>self.VBATT_tab["60"]: + return 80 + if Vbatt>self.VBATT_tab["40"]: + return 60 + if Vbatt>self.VBATT_tab["20"]: + return 40 + if Vbatt>self.VBATT_tab["10"]: + return 20 + if Vbatt<=self.VBATT_tab["10"]: + return 10 + def audio_montage_play(self,event,msg): + self.aud.stopPlayStream() + self.aud.stopAll() + str_data='mp3files=' + for i in msg: + try: + str_tmp = i.replace(".mp3","") + str_data+="{}.mp3+".format(audio_buf.index(str_tmp)) + except Exception as e: + usys.print_exception(e) + str_data = str_data[:-1] + print("audio_montage_play:{}".format(str_data)) + self.aud.montage_play('U:/static/audio.bin',1,1,str_data) + + def paly_iccid_imei(self,event,msg): + str_data = 'mp3files={}.mp3+'.format(audio_buf.index("liuliangtishi"))#流量提示 + imei = modem.getDevImei() + iccid = sim.getIccid() + print("paly_iccid_imei:ICCID:{}".format(iccid)) + if iccid != -1 and len(iccid) > 5: + iccid = iccid.upper() + if len(iccid) <20: + for i in range(20-len(iccid)): + iccid = "0"+iccid + str_data += '{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+'.format(audio_buf.index("R_READ_TIME_{}".format(iccid[0]))\ + ,audio_buf.index("R_READ_TIME_{}".format(iccid[1])),audio_buf.index("R_READ_TIME_{}".format(iccid[2])),audio_buf.index("R_READ_TIME_{}".format(iccid[3])),\ + audio_buf.index("R_READ_TIME_{}".format(iccid[4])),audio_buf.index("R_READ_TIME_{}".format(iccid[5])),audio_buf.index("R_READ_TIME_{}".format(iccid[6])),audio_buf.index("R_READ_TIME_{}".format(iccid[7])),\ + audio_buf.index("R_READ_TIME_{}".format(iccid[8])),audio_buf.index("R_READ_TIME_{}".format(iccid[9])),audio_buf.index("R_READ_TIME_{}".format(iccid[10])),audio_buf.index("R_READ_TIME_{}".format(iccid[11])),\ + audio_buf.index("R_READ_TIME_{}".format(iccid[12])),audio_buf.index("R_READ_TIME_{}".format(iccid[13])),audio_buf.index("R_READ_TIME_{}".format(iccid[14])),audio_buf.index("R_READ_TIME_{}".format(iccid[15])),\ + audio_buf.index("R_READ_TIME_{}".format(iccid[16])),audio_buf.index("R_READ_TIME_{}".format(iccid[17])),audio_buf.index("R_READ_TIME_{}".format(iccid[18])),audio_buf.index("R_READ_TIME_{}".format(iccid[19]))) + str_data += '{}.mp3+'.format(audio_buf.index("shouhou"))#可联系售后解决,联系方式见售后客服电话是400-886-8777或到微信公众号柒牌SEVENBRAND自行充值: + self.aud.montage_play('U:/static/audio.bin',1,1,str_data) + #鉴权出错,播放imei号 + def paly_device_res_error(self,event,msg): + str_data = 'mp3files={}.mp3+'.format(audio_buf.index("jianquancuowu"))#AI功能异常,请联系客户查询,设备号为: + imei = modem.getDevImei() + imei = imei.upper() + str_data += '{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(imei[0]))\ + ,audio_buf.index("R_READ_TIME_{}".format(imei[1])),audio_buf.index("R_READ_TIME_{}".format(imei[2])),audio_buf.index("R_READ_TIME_{}".format(imei[3])),\ + audio_buf.index("R_READ_TIME_{}".format(imei[4])),audio_buf.index("R_READ_TIME_{}".format(imei[5])),audio_buf.index("R_READ_TIME_{}".format(imei[6])),audio_buf.index("R_READ_TIME_{}".format(imei[7])),\ + audio_buf.index("R_READ_TIME_{}".format(imei[8])),audio_buf.index("R_READ_TIME_{}".format(imei[9])),audio_buf.index("R_READ_TIME_{}".format(imei[10])),audio_buf.index("R_READ_TIME_{}".format(imei[11])),\ + audio_buf.index("R_READ_TIME_{}".format(imei[12])),audio_buf.index("R_READ_TIME_{}".format(imei[13])),audio_buf.index("R_READ_TIME_{}".format(imei[14]))) + #print("str_data:{}".format(str_data)) + self.aud.montage_play('U:/static/audio.bin',1,1,str_data) + +#存储信息 +class getStorageDataManager(Abstract):#获取内存数据 + def __init__(self): + self.config_data = {} + check = ql_fs.path_exists("/usr/static/storage_file/config.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={}¤tVersion={}".format(modem.getDevImei(),currentVersion) + print(url) + response = request.post(url,timeout=5) + if response.status_code == 200: + data = response.json() + print("ota_result:{}".format(data)) + else: + print("ota_result error!!!!") + for i in response.text: + print(i) + response.close() + except Exception as e: + usys.print_exception(e) + if response != None: + response.close() + #ICCID上传 + def pots_ICCID(self,event=None,msg=None): + response = None + try: + iccid = sim.getIccid() + if iccid != -1 and len(iccid) > 5: + print("pots_ICCID:{}".format(iccid)) + #Headers = {'Transfer-Encodong':'chunked'} + #http://dmp.raisound.com/bz-api/dev/iccid?deviceId=866610001099679&iccid=89860002192307889057 + url = "http://dmp.raisound.com/bz-api/dev/iccid?deviceId={}&iccid={}".format(modem.getDevImei(),iccid) + print(url) + response = request.post(url,timeout=5) + if response.status_code == 200: + data = response.json() + print("pots_ICCID:{}".format(data)) + else: + print("pots_ICCID error!!!!") + for i in response.text: + print(i) + response.close() + except Exception as e: + usys.print_exception(e) + if response != None: + response.close() +#阿里VC状态枚举 +VC_State_None=0 +VC_State_Listening=1#听 +VC_State_SpeechStart=2#说开始 +VC_State_SpeechIng=3#正在说 +VC_State_SpeechEnd=4#说结束 +VC_State_RequestToRespond=5 #TTS请求或者chat请求 +VC_State_Thinking=6#想(chat) +VC_State_Responding=7#音频播放 +VC_State_TTSStart=8 +VC_State_TTSData=9 +VC_State_TTSFinish=10 +VC_State_TTSEnd=11 +VC_State_TTSError=12 +VC_State_DialogError=13 +VC_State_End=14 + +VC_record_TYPE_PCM = 0 +VC_record_TYPE_AMR = 1 +VC_play_TYPE_PCM = 0 +VC_play_TYPE_MP3 = 1 + +#websocket发送数据编号 +# AI_client_asr_num = 0 +# AI_client_chat_num = 1 +# AI_client_tts_num = 2 +AI_client_VC_num = 3 +AI_client_asr_num = 4 + + +class AI_VC(Abstract): + # AI + + def __init__(self): + try: + self.http_get_config()#获取/更新配置参数 + except Exception as e: + usys.print_exception(e) + self.VC_30S_timer = osTimer() + self.VC_30S_timer.start(30000, 1, self.VC_30S_timer_cb) + self.get_config_timer_count = 0 + self.record_data_save_flag = 0 #是否保存录音文件 + self.play_data_save_flag = 0#是否保存tts数据到文件 + self.record_fd = None + self.play_fd = None + self.is_VC_ACK = 0 #是否开启ack应答模式 + self.is_long_record = 0 #是否开启长录音模式(语音打断模式) + self.ai_OTA = OTA() + self.is_auth = 0 #是否开启dmp鉴权 + #self.VC_mode = 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(男|难|女|ç«¥|同|粤|广东话|粤语|四川话|川普|四川口音))",#参数提取正则表达式 + "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)#恢复原始音量 + \ No newline at end of file diff --git a/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/versions.py b/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/versions.py new file mode 100644 index 00000000..023b98ec --- /dev/null +++ b/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/versions.py @@ -0,0 +1,2 @@ +Version="V1.0" +Build_Time="2025-07-04 16:48:41" diff --git a/2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/EG810MCN_GA_VOLTE.mk b/2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/EG810MCN_GA_VOLTE.mk new file mode 100644 index 00000000..3987aba0 --- /dev/null +++ b/2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/EG810MCN_GA_VOLTE.mk @@ -0,0 +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 \ + diff --git a/2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/autoconf.h b/2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/autoconf.h new file mode 100644 index 00000000..c48d2904 --- /dev/null +++ b/2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/autoconf.h @@ -0,0 +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 diff --git a/2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/config.in b/2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/config.in new file mode 100644 index 00000000..343bad71 --- /dev/null +++ b/2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/config.in @@ -0,0 +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 + diff --git a/2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/config.mk b/2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/config.mk new file mode 100644 index 00000000..a1d59675 --- /dev/null +++ b/2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/config.mk @@ -0,0 +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 diff --git a/2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lcd.h b/2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lcd.h new file mode 100644 index 00000000..e69de29b diff --git a/2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl.h b/2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl.h new file mode 100644 index 00000000..e69de29b diff --git a/2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/animimg.h b/2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/animimg.h new file mode 100644 index 00000000..e69de29b diff --git a/2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/arc.h b/2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/arc.h new file mode 100644 index 00000000..e69de29b diff --git a/2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/calendar.h b/2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/calendar.h new file mode 100644 index 00000000..e69de29b diff --git a/2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/canvas.h b/2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/canvas.h new file mode 100644 index 00000000..e69de29b diff --git a/2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/chart.h b/2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/chart.h new file mode 100644 index 00000000..e69de29b diff --git a/2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/colorwheel.h b/2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/colorwheel.h new file mode 100644 index 00000000..e69de29b diff --git a/2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/fs/helios.h b/2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/fs/helios.h new file mode 100644 index 00000000..e69de29b diff --git a/2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/handler/task/priority.h b/2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/handler/task/priority.h new file mode 100644 index 00000000..e69de29b diff --git a/2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/imgbtn.h b/2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/imgbtn.h new file mode 100644 index 00000000..e69de29b diff --git a/2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/jpg/decode.h b/2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/jpg/decode.h new file mode 100644 index 00000000..e69de29b diff --git a/2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/keyboard.h b/2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/keyboard.h new file mode 100644 index 00000000..e69de29b diff --git a/2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/led.h b/2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/led.h new file mode 100644 index 00000000..e69de29b diff --git a/2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/line.h b/2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/line.h new file mode 100644 index 00000000..e69de29b diff --git a/2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/list.h b/2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/list.h new file mode 100644 index 00000000..e69de29b diff --git a/2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/meter.h b/2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/meter.h new file mode 100644 index 00000000..e69de29b diff --git a/2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/msgbox.h b/2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/msgbox.h new file mode 100644 index 00000000..e69de29b diff --git a/2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/png/decode.h b/2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/png/decode.h new file mode 100644 index 00000000..e69de29b diff --git a/2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/qrcode.h b/2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/qrcode.h new file mode 100644 index 00000000..e69de29b diff --git a/2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/span.h b/2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/span.h new file mode 100644 index 00000000..e69de29b diff --git a/2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/spinbox.h b/2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/spinbox.h new file mode 100644 index 00000000..e69de29b diff --git a/2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/spinner.h b/2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/spinner.h new file mode 100644 index 00000000..e69de29b diff --git a/2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/tabview.h b/2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/tabview.h new file mode 100644 index 00000000..e69de29b diff --git a/2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/tileview.h b/2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/tileview.h new file mode 100644 index 00000000..e69de29b diff --git a/2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/win.h b/2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/win.h new file mode 100644 index 00000000..e69de29b diff --git a/2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/mbedtls.h b/2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/mbedtls.h new file mode 100644 index 00000000..e69de29b diff --git a/2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/vioce/call.h b/2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/vioce/call.h new file mode 100644 index 00000000..e69de29b diff --git a/2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/mpconfigboard.h b/2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/mpconfigboard.h new file mode 100644 index 00000000..ea734f6d --- /dev/null +++ b/2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/mpconfigboard.h @@ -0,0 +1,215 @@ +/* + * 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) +#endif \ No newline at end of file diff --git a/2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/images/DBG.7z b/2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/images/DBG.7z new file mode 100644 index 00000000..a3aef00a Binary files /dev/null and b/2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/images/DBG.7z differ diff --git a/2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/images/firmware_base.json b/2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/images/firmware_base.json new file mode 100644 index 00000000..e69de29b diff --git a/2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/images/firmware_base_release_pack.zip b/2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/images/firmware_base_release_pack.zip new file mode 100644 index 00000000..0d7491a1 Binary files /dev/null and b/2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/images/firmware_base_release_pack.zip differ diff --git a/2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/images/rf.bin b/2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/images/rf.bin new file mode 100644 index 00000000..29a150e0 Binary files /dev/null and b/2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/images/rf.bin differ diff --git a/2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/include/app_link_start_addr.h b/2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/include/app_link_start_addr.h new file mode 100644 index 00000000..33e3ed4f --- /dev/null +++ b/2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/include/app_link_start_addr.h @@ -0,0 +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 diff --git a/2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/libraries/ByteRTCLite.lib b/2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/libraries/ByteRTCLite.lib new file mode 100644 index 00000000..5e3ddcc5 Binary files /dev/null and b/2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/libraries/ByteRTCLite.lib differ diff --git a/2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/libraries/libHeliosAPI.lib b/2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/libraries/libHeliosAPI.lib new file mode 100644 index 00000000..bf46984e Binary files /dev/null and b/2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/libraries/libHeliosAPI.lib differ diff --git a/2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/libraries/ql_common_api.lib b/2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/libraries/ql_common_api.lib new file mode 100644 index 00000000..149f6cbd Binary files /dev/null and b/2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/libraries/ql_common_api.lib differ diff --git a/2.sdk/project/7PIN_1_5/usr/audio_gain.nvm b/2.sdk/project/7PIN_1_5/usr/audio_gain.nvm new file mode 100644 index 00000000..97148da6 Binary files /dev/null and b/2.sdk/project/7PIN_1_5/usr/audio_gain.nvm differ diff --git a/2.sdk/project/7PIN_1_5/usr/audio_ve.nvm b/2.sdk/project/7PIN_1_5/usr/audio_ve.nvm new file mode 100644 index 00000000..a33dd45a Binary files /dev/null and b/2.sdk/project/7PIN_1_5/usr/audio_ve.nvm differ diff --git a/2.sdk/project/7PIN_1_5/usr/main.py b/2.sdk/project/7PIN_1_5/usr/main.py new file mode 100644 index 00000000..68ba3fff --- /dev/null +++ b/2.sdk/project/7PIN_1_5/usr/main.py @@ -0,0 +1,2 @@ +import main_init +main_init.main_init() \ No newline at end of file diff --git a/2.sdk/project/7PIN_1_5/usr/static/audio.bin b/2.sdk/project/7PIN_1_5/usr/static/audio.bin new file mode 100644 index 00000000..6c106cc3 Binary files /dev/null and b/2.sdk/project/7PIN_1_5/usr/static/audio.bin differ diff --git a/2.sdk/project/7PIN_1_5/usr/static/storage_file/wechat_record.json b/2.sdk/project/7PIN_1_5/usr/static/storage_file/wechat_record.json new file mode 100644 index 00000000..acd65639 --- /dev/null +++ b/2.sdk/project/7PIN_1_5/usr/static/storage_file/wechat_record.json @@ -0,0 +1 @@ +{ "num": "0" } \ No newline at end of file