From 5c09e1af28465540e23e1f619902ede9938cc1f8 Mon Sep 17 00:00:00 2001
From: sjchen <13418980720@163.com>
Date: Wed, 29 Oct 2025 09:07:56 +0800
Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0ET620?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
app.json | 3 +-
pages/hrv/hrv.js | 66 ++
pages/hrv/hrv.json | 3 +
pages/hrv/hrv.wxml | 208 +++++
pages/hrv/hrv.wxss | 1692 +++++++++++++++++++++++++++++++++++
pages/sjchen/sjchen.js | 264 ++++++
pages/sjchen/sjchen.json | 3 +
pages/sjchen/sjchen.wxml | 25 +
pages/sjchen/sjchen.wxss | 17 +
utils/DataPointCacheUtil.js | 99 ++
utils/DayConverter.js | 179 ++++
utils/ET620ParseDataUtil.js | 280 ++++++
utils/RequestParamUtil.js | 61 ++
utils/TimePointUtils.js | 70 ++
utils/bleSDKLoader.js | 35 +
veeoopSDK/sdk/index.d.ts | 3 +
veeoopSDK/sdk/index.js | 1 +
17 files changed, 3008 insertions(+), 1 deletion(-)
create mode 100644 pages/hrv/hrv.js
create mode 100644 pages/hrv/hrv.json
create mode 100644 pages/hrv/hrv.wxml
create mode 100644 pages/hrv/hrv.wxss
create mode 100644 pages/sjchen/sjchen.js
create mode 100644 pages/sjchen/sjchen.json
create mode 100644 pages/sjchen/sjchen.wxml
create mode 100644 pages/sjchen/sjchen.wxss
create mode 100644 utils/DataPointCacheUtil.js
create mode 100644 utils/DayConverter.js
create mode 100644 utils/ET620ParseDataUtil.js
create mode 100644 utils/RequestParamUtil.js
create mode 100644 utils/TimePointUtils.js
create mode 100644 utils/bleSDKLoader.js
create mode 100644 veeoopSDK/sdk/index.d.ts
create mode 100644 veeoopSDK/sdk/index.js
diff --git a/app.json b/app.json
index a21f410..7dd8cc7 100644
--- a/app.json
+++ b/app.json
@@ -1,12 +1,13 @@
{
"pages": [
+ "pages/hrv/hrv",
"pages/sjchen/sjchen",
"index/index",
"ecg/index",
"ecg2/index"
+
],
-
"window": {
"backgroundTextStyle": "light",
"navigationBarBackgroundColor": "#fff",
diff --git a/pages/hrv/hrv.js b/pages/hrv/hrv.js
new file mode 100644
index 0000000..9b47eea
--- /dev/null
+++ b/pages/hrv/hrv.js
@@ -0,0 +1,66 @@
+// pages/hrv/hrv.js
+Page({
+
+ /**
+ * 页面的初始数据
+ */
+ data: {
+
+ },
+
+ /**
+ * 生命周期函数--监听页面加载
+ */
+ onLoad(options) {
+
+ },
+
+ /**
+ * 生命周期函数--监听页面初次渲染完成
+ */
+ onReady() {
+
+ },
+
+ /**
+ * 生命周期函数--监听页面显示
+ */
+ onShow() {
+
+ },
+
+ /**
+ * 生命周期函数--监听页面隐藏
+ */
+ onHide() {
+
+ },
+
+ /**
+ * 生命周期函数--监听页面卸载
+ */
+ onUnload() {
+
+ },
+
+ /**
+ * 页面相关事件处理函数--监听用户下拉动作
+ */
+ onPullDownRefresh() {
+
+ },
+
+ /**
+ * 页面上拉触底事件的处理函数
+ */
+ onReachBottom() {
+
+ },
+
+ /**
+ * 用户点击右上角分享
+ */
+ onShareAppMessage() {
+
+ }
+})
\ No newline at end of file
diff --git a/pages/hrv/hrv.json b/pages/hrv/hrv.json
new file mode 100644
index 0000000..8835af0
--- /dev/null
+++ b/pages/hrv/hrv.json
@@ -0,0 +1,3 @@
+{
+ "usingComponents": {}
+}
\ No newline at end of file
diff --git a/pages/hrv/hrv.wxml b/pages/hrv/hrv.wxml
new file mode 100644
index 0000000..7e4e89b
--- /dev/null
+++ b/pages/hrv/hrv.wxml
@@ -0,0 +1,208 @@
+
+
+
+ 06-17 15:45
+
+
+
+
+
+ 200
+ 160
+ 120
+ 80
+ 40
+ 0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 04:57
+ 04:58
+ 04:59
+ 05:00
+ 05:01
+ 05:02
+ 05:03
+ 05:04
+
+
+ 平均值/10分钟
+
+
+
+ 82
+
+ 心脏健康指数:
+ 正常
+
+
+
+
+
+
+
+
+
+
+
+ 0
+ 40
+ 异常
+ 轻度
+ 正常
+ 60
+ 100
+
+
+
+ HRV概况
+
+
+
+ 最大值
+ 18.1
+ ms
+
+
+
+
+ 最小值
+ 75.24
+ ms
+
+
+
+
+ 平均值
+ 17.2
+ ms
+
+
+
+
+
+
+
+ 散点图
+ 热度图
+
+
+
+
+
+
+ 2000
+ RRN+1(ms)
+ 0
+
+
+
+
+
+
+
+
+
+
+ 0
+ 2000
+ RRN(ms)
+
+
+
+ 无数据
+
+
+
+
+
+
+
+
+
+
+
+ 最新血压
+
+
+
+ 心率变化
+
+
+
+
+
+
+
+
+ 测量期间心率的最大变化正常,心率变化的范围偏低,一般身体素质较好,有良好睡眠习惯的人群,夜间心率的变化范围会较低,但有较小概率为心动过缓,如无不适,无需特别治疗,以观察为主。
+
+
+
+
+ 心率突变
+
+
+
+
+
+
+
+
+ 心率最大突变发生于正常范围,突变程度正常。
+
+
+
+
+ 神经状态
+
+
+
+
+
+ 有轻微的早搏风险,可发生于正常人(情绪激动,神经紧张,疲劳,消化不良,过度吸烟、饮酒或喝浓茶等),如无不适,建议长期观察
+
+
+
+
+ 心律变化
+
+
+
+
+
+ 夜间心律平稳,心脏状况良好。
+
+
+
+ 温馨提示:健康手环数据仅作为参考,不作为诊断治疗依据
+
+
\ No newline at end of file
diff --git a/pages/hrv/hrv.wxss b/pages/hrv/hrv.wxss
new file mode 100644
index 0000000..7925ba7
--- /dev/null
+++ b/pages/hrv/hrv.wxss
@@ -0,0 +1,1692 @@
+/* pages/hrv/hrv.wxss */
+
+view,
+text,
+image {
+ box-sizing: border-box;
+}
+image {
+ width: auto;
+ height: auto;
+}
+.hrv {
+ isolation: isolate;
+ background-color: #f8f8f8;
+ flex-direction: column;
+ align-items: flex-start;
+ width: 100%;
+ height: auto;
+ min-height: 100%;
+ display: flex;
+ position: relative;
+ overflow: hidden;
+}
+.group_75 {
+ margin-left: 48rpx;
+ margin-top: 23rpx;
+ position: relative;
+}
+.group_62 {
+ width: 143rpx;
+ height: 46rpx;
+ margin-top: 79rpx;
+ margin-left: 535rpx;
+ border-radius: 90rpx;
+ isolation: isolate;
+ background-color: rgba(255, 255, 255, 0.3);
+ border: 1px solid rgba(255, 255, 255, 0.5);
+ flex-direction: row;
+ align-items: flex-start;
+ display: flex;
+ position: relative;
+}
+.group_61 {
+ width: 30rpx;
+ height: 30rpx;
+ z-index: 1;
+ margin-left: 90rpx;
+ margin-top: 8rpx;
+ flex-direction: column;
+ align-items: flex-start;
+ display: flex;
+ position: relative;
+}
+.ellipse_14 {
+ background: url(https://seal-img.nos-jd.163yun.com/obj/w5rCgMKVw6DCmGzCmsK-/62007229841/9e06/9794/11db/237ce4047dfc444e80c5f7c66075ce38.png) 50% / cover no-repeat;
+ flex-direction: column;
+ align-items: flex-start;
+ width: 100%;
+ height: 100%;
+ display: flex;
+ position: absolute;
+ top: 0%;
+ bottom: 0%;
+ left: 0%;
+ right: 0%;
+}
+.ellipse_15 {
+ width: 40%;
+ height: 40%;
+ position: absolute;
+ top: 30%;
+ bottom: 30%;
+ left: 30%;
+ right: 30%;
+}
+.rectangle_44 {
+ z-index: 0;
+ background-color: rgba(255, 255, 255, 0.5);
+ width: 0.6993%;
+ height: 60.8696%;
+ position: absolute;
+ top: 19.5652%;
+ bottom: 19.5652%;
+ left: 49.6503%;
+ right: 49.6503%;
+}
+.vector {
+ z-index: 2;
+ width: 26.5734%;
+ height: 30.4348%;
+ position: absolute;
+ top: 34.7826%;
+ bottom: 34.7826%;
+ left: 14.6853%;
+ right: 58.7413%;
+}
+.div {
+ object-fit: cover;
+ width: 96.4602%;
+ height: 21.6%;
+ position: absolute;
+ top: 0%;
+ bottom: 78.4%;
+ left: 0%;
+ right: 3.5398%;
+}
+
+.group_220 {
+ width: 686rpx;
+ height: 552rpx;
+ border-radius: 16rpx;
+ isolation: isolate;
+ z-index: 1;
+ margin-top: 30rpx;
+ background-color: #fff;
+ flex-direction: column;
+ align-items: flex-start;
+ margin-left: auto;
+ margin-right: auto;
+ display: flex;
+ position: relative;
+}
+.frame_1120 {
+ width: 215rpx;
+ height: 42rpx;
+ z-index: 2;
+ margin-top: 30rpx;
+ margin-left: 238rpx;
+ flex-direction: row;
+ align-items: flex-start;
+ display: flex;
+ position: relative;
+}
+.text_1 {
+ font-size: 28rpx;
+ color: #333;
+ white-space: pre;
+ top: 0;
+ left: 0;
+ right: 58rpx;
+ width: max-content;
+ margin-left: auto;
+ margin-right: auto;
+ font-family: PingFang SC;
+ font-weight: 500;
+ line-height: 42px;
+ position: absolute;
+}
+.vector_3 {
+ width: 13.9535%;
+ height: 71.4286%;
+ position: absolute;
+ top: 11.9048%;
+ bottom: 16.6667%;
+ left: 86.0465%;
+ right: 0%;
+}
+.frame_1068 {
+ width: 626rpx;
+ height: 366rpx;
+ z-index: 1;
+ margin-top: 30rpx;
+ flex-direction: column;
+ align-items: flex-start;
+ margin-left: auto;
+ margin-right: auto;
+ display: flex;
+ position: relative;
+}
+.flexcontainer_2 {
+ width: 100%;
+ height: 338rpx;
+ isolation: isolate;
+ flex-direction: row;
+ align-items: flex-start;
+ margin-top: 0;
+ margin-left: 0;
+ display: flex;
+ position: relative;
+}
+.frame_289 {
+ width: 36rpx;
+ height: 338rpx;
+ z-index: 1;
+ flex-direction: column;
+ align-items: flex-start;
+ margin-top: 0;
+ margin-left: 0;
+ display: flex;
+ position: relative;
+}
+.text_2 {
+ font-size: 20rpx;
+ color: #999;
+ white-space: pre;
+ width: 100%;
+ margin-top: 0;
+ margin-left: 0;
+ font-family: PingFang SC;
+ font-weight: 400;
+ line-height: 28px;
+ position: relative;
+}
+.text_3,
+.text_4 {
+ font-size: 20rpx;
+ color: #999;
+ white-space: pre;
+ margin-top: 34rpx;
+ margin-left: 3rpx;
+ font-family: PingFang SC;
+ font-weight: 400;
+ line-height: 28px;
+ position: relative;
+}
+.text_5,
+.text_6 {
+ font-size: 20rpx;
+ color: #999;
+ white-space: pre;
+ margin-top: 34rpx;
+ margin-left: 12rpx;
+ font-family: PingFang SC;
+ font-weight: 400;
+ line-height: 28px;
+ position: relative;
+}
+.text_7 {
+ font-size: 20rpx;
+ color: #999;
+ white-space: pre;
+ margin-top: 34rpx;
+ margin-left: 24rpx;
+ font-family: PingFang SC;
+ font-weight: 400;
+ line-height: 28px;
+ position: relative;
+}
+.flexcontainer_3 {
+ width: 584rpx;
+ height: 338rpx;
+ z-index: 0;
+ margin-left: 6rpx;
+ flex-direction: column;
+ align-items: flex-start;
+ margin-top: 0;
+ display: flex;
+ position: relative;
+}
+.group_288 {
+ width: 100%;
+ height: 248rpx;
+ margin-top: 76rpx;
+ flex-direction: column;
+ align-items: flex-start;
+ margin-left: 0;
+ display: flex;
+ position: relative;
+}
+.line_3 {
+ border: 0.5px solid #eee;
+ width: 100%;
+ height: 0;
+ margin-top: 0;
+ margin-left: 0;
+ position: relative;
+}
+.line_4,
+.line_5,
+.line_6,
+.line_7 {
+ width: 100%;
+ height: 0;
+ margin-top: 62rpx;
+ border: 0.5px solid #eee;
+ margin-left: 0;
+ position: relative;
+}
+.frame_292 {
+ width: 545rpx;
+ height: 196.5rpx;
+ isolation: isolate;
+ margin-top: -196rpx;
+ flex-direction: column;
+ align-items: flex-start;
+ margin-left: auto;
+ margin-right: auto;
+ display: flex;
+ position: relative;
+}
+.flexcontainer_4 {
+ width: 100%;
+ height: 110rpx;
+ isolation: isolate;
+ z-index: 1;
+ flex-direction: column;
+ flex-shrink: 0;
+ align-items: flex-start;
+ margin-top: 0;
+ margin-left: 0;
+ display: flex;
+ position: relative;
+}
+.ellipse_30 {
+ width: 13rpx;
+ height: 13rpx;
+ z-index: 3;
+ margin-top: 0;
+ margin-left: 532rpx;
+ position: relative;
+}
+.vector_2_1 {
+ width: 537rpx;
+ height: 104rpx;
+ z-index: 0;
+ margin-top: -10rpx;
+ background: url(https://seal-img.nos-jd.163yun.com/obj/w5rCgMKVw6DCmGzCmsK-/62007238028/38fd/d591/afdf/30a1882d0bdc90981ed95c350969718a.png) 50% / cover no-repeat;
+ flex-direction: column;
+ align-items: flex-start;
+ margin-left: auto;
+ margin-right: auto;
+ display: flex;
+ position: relative;
+}
+.flexcontainer_5 {
+ width: 100%;
+ height: 32rpx;
+ isolation: isolate;
+ margin-top: 7rpx;
+ flex-direction: row;
+ align-items: flex-start;
+ margin-left: 0;
+ display: flex;
+ position: relative;
+}
+.ellipse_32 {
+ width: 13rpx;
+ height: 13rpx;
+ z-index: 1;
+ margin-left: 71rpx;
+ margin-top: 0;
+ position: relative;
+}
+.ellipse_26 {
+ width: 23rpx;
+ height: 23rpx;
+ z-index: 0;
+ margin-left: 139rpx;
+ margin-top: 9rpx;
+ position: relative;
+}
+.ellipse_28 {
+ width: 13rpx;
+ height: 13rpx;
+ z-index: 2;
+ margin-left: 129rpx;
+ margin-top: 13rpx;
+ position: relative;
+}
+.flexcontainer_6 {
+ width: 100%;
+ height: 17rpx;
+ margin-top: 9rpx;
+ flex-direction: row;
+ align-items: flex-start;
+ margin-left: 0;
+ display: flex;
+ position: relative;
+}
+.ellipse_27 {
+ width: 13rpx;
+ height: 13rpx;
+ margin-left: 299rpx;
+ margin-top: 0;
+ position: relative;
+}
+.ellipse_29 {
+ width: 13rpx;
+ height: 13rpx;
+ margin-left: 139rpx;
+ margin-top: 4rpx;
+ position: relative;
+}
+.ellipse_33 {
+ width: 13rpx;
+ height: 13rpx;
+ z-index: 2;
+ margin-top: -43rpx;
+ margin-left: 0;
+ position: relative;
+}
+.ellipse_31 {
+ width: 13rpx;
+ height: 13rpx;
+ z-index: 1;
+ margin-top: 20rpx;
+ margin-left: 152rpx;
+ position: relative;
+}
+.vector_1_1 {
+ width: 533rpx;
+ height: 192rpx;
+ z-index: 0;
+ margin-top: -105rpx;
+ flex-shrink: 0;
+ margin-left: auto;
+ margin-right: auto;
+ position: relative;
+}
+.flexcontainer_7 {
+ width: 100%;
+ height: 28rpx;
+ isolation: isolate;
+ flex-direction: row;
+ align-items: flex-start;
+ margin-top: 0;
+ margin-left: 0;
+ display: flex;
+ position: relative;
+}
+.text_8 {
+ font-size: 20rpx;
+ color: #999;
+ white-space: pre;
+ z-index: 0;
+ margin-left: 40rpx;
+ margin-top: 0;
+ font-family: PingFang SC;
+ font-weight: 400;
+ line-height: 28px;
+ position: relative;
+}
+.text_9 {
+ font-size: 20rpx;
+ color: #999;
+ white-space: pre;
+ z-index: 1;
+ margin-left: 23rpx;
+ margin-top: 0;
+ font-family: PingFang SC;
+ font-weight: 400;
+ line-height: 28px;
+ position: relative;
+}
+.text_10 {
+ font-size: 20rpx;
+ color: #999;
+ white-space: pre;
+ z-index: 3;
+ margin-left: 22rpx;
+ margin-top: 0;
+ font-family: PingFang SC;
+ font-weight: 400;
+ line-height: 28px;
+ position: relative;
+}
+.text_11 {
+ font-size: 20rpx;
+ color: #999;
+ white-space: pre;
+ z-index: 5;
+ margin-left: 22rpx;
+ margin-top: 0;
+ font-family: PingFang SC;
+ font-weight: 400;
+ line-height: 28px;
+ position: relative;
+}
+.text_12 {
+ font-size: 20rpx;
+ color: #999;
+ white-space: pre;
+ z-index: 2;
+ margin-left: 22rpx;
+ margin-top: 0;
+ font-family: PingFang SC;
+ font-weight: 400;
+ line-height: 28px;
+ position: relative;
+}
+.text_13 {
+ font-size: 20rpx;
+ color: #999;
+ white-space: pre;
+ z-index: 4;
+ margin-left: 26rpx;
+ margin-top: 0;
+ font-family: PingFang SC;
+ font-weight: 400;
+ line-height: 28px;
+ position: relative;
+}
+.text_14 {
+ font-size: 20rpx;
+ color: #999;
+ white-space: pre;
+ z-index: 6;
+ margin-left: 22rpx;
+ margin-top: 0;
+ font-family: PingFang SC;
+ font-weight: 400;
+ line-height: 28px;
+ position: relative;
+}
+.text_15 {
+ font-size: 20rpx;
+ color: #999;
+ white-space: pre;
+ z-index: 7;
+ margin-left: 22rpx;
+ margin-top: 0;
+ font-family: PingFang SC;
+ font-weight: 400;
+ line-height: 28px;
+ position: relative;
+}
+.text_16 {
+ font-size: 24rpx;
+ color: #666;
+ white-space: pre;
+ z-index: 0;
+ margin-top: 20rpx;
+ margin-left: auto;
+ margin-right: auto;
+ font-family: PingFang SC;
+ font-weight: 400;
+ line-height: 34px;
+ position: relative;
+}
+.group_44 {
+ width: 686rpx;
+ height: 265rpx;
+ border-radius: 16rpx;
+ isolation: isolate;
+ z-index: 2;
+ margin-top: 30rpx;
+ background-color: #fff;
+ flex-direction: column;
+ align-items: flex-start;
+ margin-left: auto;
+ margin-right: auto;
+ display: flex;
+ position: relative;
+}
+.group_14 {
+ width: 234rpx;
+ height: 109rpx;
+ z-index: 1;
+ margin-top: 30rpx;
+ flex-direction: column;
+ align-items: flex-start;
+ margin-left: auto;
+ margin-right: auto;
+ display: flex;
+ position: relative;
+}
+.text_17 {
+ text-align: right;
+ font-size: 60rpx;
+ color: #333;
+ white-space: pre;
+ width: max-content;
+ margin-top: 0;
+ margin-left: auto;
+ margin-right: auto;
+ font-family: Impact;
+ font-weight: 400;
+ line-height: 73px;
+ position: relative;
+}
+.div_2 {
+ white-space: pre;
+ width: 100%;
+ margin-top: 0;
+ margin-left: auto;
+ margin-right: auto;
+ line-height: 36px;
+ position: relative;
+}
+.text_18 {
+ font-size: 26rpx;
+ color: #666;
+ margin-left: auto;
+ margin-right: auto;
+ font-family: PingFang SC;
+ font-weight: 400;
+ line-height: 36px;
+}
+.text_19 {
+ font-size: 26rpx;
+ color: #008465;
+ margin-left: auto;
+ margin-right: auto;
+ font-family: PingFang SC;
+ font-weight: 400;
+ line-height: 36px;
+}
+.flexcontainer_8 {
+ width: 100%;
+ height: 56rpx;
+ isolation: isolate;
+ z-index: 2;
+ margin-top: 2rpx;
+ flex-direction: row;
+ align-items: flex-start;
+ margin-left: 0;
+ display: flex;
+ position: relative;
+}
+.flexcontainer_9 {
+ width: 208rpx;
+ height: 56rpx;
+ isolation: isolate;
+ z-index: 2;
+ margin-left: 448rpx;
+ flex-direction: row;
+ align-items: flex-start;
+ margin-top: 0;
+ display: flex;
+ position: relative;
+}
+.subtract {
+ width: 56rpx;
+ height: 56rpx;
+ z-index: 1;
+ margin-left: 86rpx;
+ margin-top: 0;
+ position: relative;
+}
+.rectangle_7 {
+ width: 100%;
+ height: 20rpx;
+ top: 18rpx;
+ border-radius: 0 12rpx 12rpx 0;
+ z-index: 0;
+ background-color: #008465;
+ margin-left: auto;
+ margin-right: auto;
+ position: absolute;
+ left: 0;
+ right: 0;
+}
+.rectangle_5 {
+ width: 208rpx;
+ height: 20rpx;
+ top: 18rpx;
+ border-radius: 12rpx 0 0 12rpx;
+ left: 0;
+ right: 418rpx;
+ z-index: 0;
+ background-color: #ed1c24;
+ margin-left: auto;
+ margin-right: auto;
+ position: absolute;
+}
+.rectangle_6 {
+ width: 208rpx;
+ height: 20rpx;
+ top: 18rpx;
+ z-index: 1;
+ background-color: #fe8d02;
+ margin-left: auto;
+ margin-right: auto;
+ position: absolute;
+ left: 0;
+ right: 0;
+}
+.flexcontainer_10 {
+ width: 100%;
+ height: 36rpx;
+ z-index: 0;
+ margin-top: 2rpx;
+ flex-direction: row;
+ align-items: flex-start;
+ margin-left: 0;
+ display: flex;
+ position: relative;
+}
+.text_20 {
+ text-align: center;
+ font-size: 26rpx;
+ color: #666;
+ white-space: pre;
+ top: 0;
+ left: 0;
+ right: 610rpx;
+ width: max-content;
+ margin-left: auto;
+ margin-right: auto;
+ font-family: PingFang SC;
+ font-weight: 400;
+ line-height: 36px;
+ position: absolute;
+}
+.text_21 {
+ text-align: center;
+ font-size: 26rpx;
+ color: #666;
+ white-space: pre;
+ top: 0;
+ left: 0;
+ right: 210rpx;
+ width: max-content;
+ margin-left: auto;
+ margin-right: auto;
+ font-family: PingFang SC;
+ font-weight: 400;
+ line-height: 36px;
+ position: absolute;
+}
+.text_22 {
+ text-align: center;
+ font-size: 26rpx;
+ color: #666;
+ white-space: pre;
+ top: 0;
+ left: 0;
+ right: 418rpx;
+ width: max-content;
+ margin-left: auto;
+ margin-right: auto;
+ font-family: PingFang SC;
+ font-weight: 400;
+ line-height: 36px;
+ position: absolute;
+}
+.text_23 {
+ text-align: center;
+ font-size: 26rpx;
+ color: #666;
+ white-space: pre;
+ width: max-content;
+ margin-left: auto;
+ margin-right: auto;
+ font-family: PingFang SC;
+ font-weight: 400;
+ line-height: 36px;
+ position: absolute;
+ top: 0;
+ left: 0;
+ right: 0;
+}
+.text_24 {
+ top: 0;
+ left: 418rpx;
+ text-align: center;
+ font-size: 26rpx;
+ color: #666;
+ white-space: pre;
+ width: max-content;
+ margin-left: auto;
+ margin-right: auto;
+ font-family: PingFang SC;
+ font-weight: 400;
+ line-height: 36px;
+ position: absolute;
+ right: 0;
+}
+.text_25 {
+ top: 0;
+ left: 208rpx;
+ text-align: center;
+ font-size: 26rpx;
+ color: #666;
+ white-space: pre;
+ width: max-content;
+ margin-left: auto;
+ margin-right: auto;
+ font-family: PingFang SC;
+ font-weight: 400;
+ line-height: 36px;
+ position: absolute;
+ right: 0;
+}
+.text_26 {
+ top: 0;
+ left: 584rpx;
+ text-align: center;
+ font-size: 26rpx;
+ color: #666;
+ white-space: pre;
+ width: max-content;
+ margin-left: auto;
+ margin-right: auto;
+ font-family: PingFang SC;
+ font-weight: 400;
+ line-height: 36px;
+ position: absolute;
+ right: 0;
+}
+.group_221 {
+ width: 686rpx;
+ height: 346rpx;
+ border-radius: 16rpx;
+ z-index: 6;
+ margin-top: 30rpx;
+ background-color: #fff;
+ flex-direction: column;
+ align-items: flex-start;
+ margin-left: auto;
+ margin-right: auto;
+ display: flex;
+ position: relative;
+}
+.text_27 {
+ font-size: 34rpx;
+ color: #333;
+ white-space: pre;
+ margin-top: 30rpx;
+ margin-left: 30rpx;
+ font-family: PingFang SC;
+ font-weight: 500;
+ line-height: 48px;
+ position: relative;
+}
+.frame_1087 {
+ width: 627rpx;
+ height: 208rpx;
+ margin-top: 30rpx;
+ flex-direction: row;
+ align-items: flex-start;
+ margin-left: auto;
+ margin-right: auto;
+ display: flex;
+ position: relative;
+}
+.frame_1084 {
+ width: 195rpx;
+ height: 208rpx;
+ border-radius: 12rpx;
+ background-color: #fafafa;
+ flex-direction: column;
+ align-items: flex-start;
+ margin-top: 0;
+ margin-left: 0;
+ display: flex;
+ position: relative;
+}
+.frame_573 {
+ width: 72rpx;
+ height: 148rpx;
+ margin-top: 30rpx;
+ flex-direction: column;
+ align-items: flex-start;
+ margin-left: auto;
+ margin-right: auto;
+ display: flex;
+ position: relative;
+}
+.text_28 {
+ text-align: center;
+ font-size: 24rpx;
+ color: #666;
+ white-space: pre;
+ width: 100%;
+ margin-top: 0;
+ margin-left: 0;
+ font-family: PingFang SC;
+ font-weight: 400;
+ line-height: 34px;
+ position: relative;
+}
+.text_29 {
+ text-align: center;
+ font-size: 48rpx;
+ color: #333;
+ white-space: pre;
+ margin-top: 12rpx;
+ width: 100%;
+ margin-left: 0;
+ font-family: Impact;
+ font-weight: 400;
+ line-height: 59px;
+ position: relative;
+}
+.text_30 {
+ text-align: center;
+ font-size: 22rpx;
+ color: #aaa;
+ white-space: pre;
+ margin-top: 12rpx;
+ margin-left: auto;
+ margin-right: auto;
+ font-family: PingFang SC;
+ font-weight: 400;
+ line-height: 31px;
+ position: relative;
+}
+.frame_1085 {
+ width: 195rpx;
+ height: 208rpx;
+ border-radius: 12rpx;
+ margin-left: 21rpx;
+ background-color: #fafafa;
+ flex-direction: column;
+ align-items: flex-start;
+ margin-top: 0;
+ display: flex;
+ position: relative;
+}
+.frame_573_1 {
+ width: 102rpx;
+ height: 148rpx;
+ margin-top: 30rpx;
+ flex-direction: column;
+ align-items: flex-start;
+ margin-left: auto;
+ margin-right: auto;
+ display: flex;
+ position: relative;
+}
+.text_31 {
+ text-align: center;
+ font-size: 24rpx;
+ color: #666;
+ white-space: pre;
+ margin-top: 0;
+ margin-left: auto;
+ margin-right: auto;
+ font-family: PingFang SC;
+ font-weight: 400;
+ line-height: 34px;
+ position: relative;
+}
+.text_32 {
+ text-align: center;
+ font-size: 48rpx;
+ color: #333;
+ white-space: pre;
+ margin-top: 12rpx;
+ width: 100%;
+ margin-left: 0;
+ font-family: Impact;
+ font-weight: 400;
+ line-height: 59px;
+ position: relative;
+}
+.text_33 {
+ text-align: center;
+ font-size: 22rpx;
+ color: #aaa;
+ white-space: pre;
+ margin-top: 12rpx;
+ margin-left: auto;
+ margin-right: auto;
+ font-family: PingFang SC;
+ font-weight: 400;
+ line-height: 31px;
+ position: relative;
+}
+.frame_1086 {
+ width: 195rpx;
+ height: 208rpx;
+ border-radius: 12rpx;
+ margin-left: 21rpx;
+ background-color: #fafafa;
+ flex-direction: column;
+ align-items: flex-start;
+ margin-top: 0;
+ display: flex;
+ position: relative;
+}
+.frame_573_2 {
+ width: 72rpx;
+ height: 148rpx;
+ margin-top: 30rpx;
+ flex-direction: column;
+ align-items: flex-start;
+ margin-left: auto;
+ margin-right: auto;
+ display: flex;
+ position: relative;
+}
+.text_34 {
+ text-align: center;
+ font-size: 24rpx;
+ color: #666;
+ white-space: pre;
+ width: 100%;
+ margin-top: 0;
+ margin-left: 0;
+ font-family: PingFang SC;
+ font-weight: 400;
+ line-height: 34px;
+ position: relative;
+}
+.text_35 {
+ text-align: center;
+ font-size: 48rpx;
+ color: #333;
+ white-space: pre;
+ margin-top: 12rpx;
+ margin-left: 1rpx;
+ width: 100%;
+ font-family: Impact;
+ font-weight: 400;
+ line-height: 59px;
+ position: relative;
+}
+.text_36 {
+ text-align: center;
+ font-size: 22rpx;
+ color: #aaa;
+ white-space: pre;
+ margin-top: 12rpx;
+ margin-left: auto;
+ margin-right: auto;
+ font-family: PingFang SC;
+ font-weight: 400;
+ line-height: 31px;
+ position: relative;
+}
+.group_219 {
+ width: 686rpx;
+ height: 1050rpx;
+ border-radius: 16rpx;
+ isolation: isolate;
+ z-index: 7;
+ margin-top: 30rpx;
+ background-color: #fff;
+ flex-direction: column;
+ align-items: flex-start;
+ margin-left: auto;
+ margin-right: auto;
+ display: flex;
+ position: relative;
+}
+.frame_897 {
+ width: 265rpx;
+ height: 66rpx;
+ z-index: 0;
+ margin-top: 30rpx;
+ flex-direction: column;
+ align-items: flex-start;
+ margin-left: auto;
+ margin-right: auto;
+ display: flex;
+ position: relative;
+}
+.flexcontainer_11 {
+ width: 100%;
+ height: 42rpx;
+ flex-direction: row;
+ align-items: flex-start;
+ margin-top: 0;
+ margin-left: 0;
+ display: flex;
+ position: relative;
+}
+.text_37 {
+ text-align: center;
+ font-size: 30rpx;
+ color: #008465;
+ white-space: pre;
+ top: 0;
+ left: 0;
+ right: 175rpx;
+ width: max-content;
+ margin-left: auto;
+ margin-right: auto;
+ font-family: PingFang SC;
+ font-weight: 500;
+ line-height: 42px;
+ position: absolute;
+}
+.text_38 {
+ top: 0;
+ left: 175rpx;
+ font-size: 30rpx;
+ color: #999;
+ white-space: pre;
+ width: max-content;
+ margin-left: auto;
+ margin-right: auto;
+ font-family: PingFang SC;
+ font-weight: 400;
+ line-height: 42px;
+ position: absolute;
+ right: 0;
+}
+.frame_1075 {
+ width: 30rpx;
+ height: 6rpx;
+ border-radius: 30rpx;
+ margin-top: 18rpx;
+ margin-left: 30rpx;
+ background-color: #008465;
+ position: relative;
+}
+.flexcontainer_12 {
+ width: 100%;
+ height: 360rpx;
+ isolation: isolate;
+ z-index: 3;
+ margin-top: 34rpx;
+ flex-direction: column;
+ align-items: flex-start;
+ margin-left: 0;
+ display: flex;
+ position: relative;
+}
+.frame_1068_1 {
+ width: 640rpx;
+ height: 360rpx;
+ isolation: isolate;
+ z-index: 1;
+ margin-top: 0;
+ margin-left: 16rpx;
+ flex-direction: row;
+ align-items: flex-start;
+ display: flex;
+ position: relative;
+}
+.frame_289_1 {
+ width: 48rpx;
+ height: 338rpx;
+ z-index: 1;
+ flex-direction: column;
+ align-items: flex-start;
+ margin-top: 0;
+ margin-left: 0;
+ display: flex;
+ position: relative;
+}
+.text_39 {
+ font-size: 20rpx;
+ color: #999;
+ white-space: pre;
+ width: 100%;
+ margin-top: 0;
+ margin-left: 0;
+ font-family: PingFang SC;
+ font-weight: 400;
+ line-height: 28px;
+ position: relative;
+}
+.text_40 {
+ font-size: 20rpx;
+ color: #999;
+ white-space: pre;
+ margin-top: 127.5rpx;
+ margin-left: -17.5rpx;
+ font-family: PingFang SC;
+ font-weight: 400;
+ line-height: 28px;
+ position: relative;
+ transform: rotate(90deg);
+}
+.text_41 {
+ font-size: 20rpx;
+ color: #999;
+ white-space: pre;
+ margin-top: 126.5rpx;
+ margin-left: 36rpx;
+ font-family: PingFang SC;
+ font-weight: 400;
+ line-height: 28px;
+ position: relative;
+}
+.flexcontainer_13 {
+ width: 586rpx;
+ height: 360rpx;
+ z-index: 0;
+ margin-left: 6rpx;
+ flex-direction: column;
+ align-items: flex-start;
+ margin-top: 0;
+ display: flex;
+ position: relative;
+}
+.group_288_1 {
+ width: 100%;
+ height: 248rpx;
+ margin-top: 76rpx;
+ margin-left: 2rpx;
+ flex-direction: column;
+ align-items: flex-start;
+ display: flex;
+ position: relative;
+}
+.line_3_1 {
+ border: 0.5px solid #eee;
+ width: 100%;
+ height: 0;
+ margin-top: 0;
+ margin-left: 0;
+ position: relative;
+}
+.line_4_1,
+.line_5_1,
+.line_6_1,
+.line_7_1 {
+ width: 100%;
+ height: 0;
+ margin-top: 62rpx;
+ border: 0.5px solid #eee;
+ margin-left: 0;
+ position: relative;
+}
+.flexcontainer_14 {
+ width: 100%;
+ height: 28rpx;
+ isolation: isolate;
+ margin-top: 8rpx;
+ flex-direction: row;
+ align-items: flex-start;
+ margin-left: 0;
+ display: flex;
+ position: relative;
+}
+.text_42 {
+ font-size: 20rpx;
+ color: #999;
+ white-space: pre;
+ z-index: 0;
+ margin-top: 0;
+ margin-left: 0;
+ font-family: PingFang SC;
+ font-weight: 400;
+ line-height: 28px;
+ position: relative;
+}
+.text_43 {
+ font-size: 20rpx;
+ color: #999;
+ white-space: pre;
+ z-index: 2;
+ margin-left: 520rpx;
+ margin-top: 0;
+ font-family: PingFang SC;
+ font-weight: 400;
+ line-height: 28px;
+ position: relative;
+}
+.text_44 {
+ top: 0;
+ left: 2rpx;
+ font-size: 20rpx;
+ color: #999;
+ white-space: pre;
+ z-index: 1;
+ width: max-content;
+ margin-left: auto;
+ margin-right: auto;
+ font-family: PingFang SC;
+ font-weight: 400;
+ line-height: 28px;
+ position: absolute;
+ right: 0;
+}
+.text_45 {
+ font-size: 26rpx;
+ color: #999;
+ white-space: pre;
+ z-index: 0;
+ width: max-content;
+ margin-left: calc(50% - 18px);
+ margin-right: auto;
+ margin-top: -209rpx;
+ font-family: PingFang SC;
+ font-weight: 400;
+ line-height: 36px;
+ position: relative;
+}
+.group_1 {
+ width: 100%;
+ height: 473rpx;
+ z-index: 1;
+ margin-top: 30rpx;
+ margin-left: 0;
+ position: relative;
+}
+.group_217 {
+ width: 148rpx;
+ height: 8rpx;
+ z-index: 2;
+ margin-top: 20rpx;
+ flex-direction: row;
+ align-items: flex-start;
+ margin-left: auto;
+ margin-right: auto;
+ display: flex;
+ position: relative;
+}
+.rectangle_56 {
+ width: 36rpx;
+ height: 8rpx;
+ border-radius: 4rpx;
+ background-color: #008465;
+ margin-top: 0;
+ margin-left: 0;
+ position: relative;
+}
+.rectangle_57,
+.rectangle_58,
+.rectangle_59,
+.rectangle_60 {
+ width: 16rpx;
+ height: 8rpx;
+ border-radius: 4rpx;
+ margin-left: 12rpx;
+ background-color: #eee;
+ margin-top: 0;
+ position: relative;
+}
+.group_218 {
+ width: 686rpx;
+ height: 1001rpx;
+ border-radius: 16rpx;
+ z-index: 3;
+ margin-top: 30rpx;
+ background-color: #fff;
+ flex-direction: column;
+ align-items: flex-start;
+ margin-left: auto;
+ margin-right: auto;
+ display: flex;
+ position: relative;
+}
+.text_46 {
+ font-size: 34rpx;
+ color: #333;
+ white-space: pre;
+ margin-top: 30rpx;
+ margin-left: 30rpx;
+ font-family: PingFang SC;
+ font-weight: 500;
+ line-height: 48px;
+ position: relative;
+}
+.frame_9 {
+ width: 626rpx;
+ height: 869rpx;
+ justify-content: flex-start;
+ align-items: flex-start;
+ gap: 24rpx;
+ margin-top: 24rpx;
+ flex-direction: column;
+ margin-left: auto;
+ margin-right: auto;
+ display: flex;
+ position: relative;
+}
+.frame_8 {
+ width: 626rpx;
+ justify-content: flex-start;
+ align-items: flex-start;
+ gap: 12rpx;
+ flex-direction: column;
+ flex-shrink: 0;
+ display: flex;
+ position: relative;
+}
+.frame_7 {
+ width: 626rpx;
+ font-size: 30rpx;
+ color: #008465;
+ white-space: pre;
+ flex-direction: row;
+ flex-shrink: 0;
+ justify-content: space-between;
+ align-items: center;
+ font-family: PingFang SC;
+ font-weight: 500;
+ line-height: 42px;
+ display: flex;
+ position: relative;
+}
+.text_47 {
+ flex-shrink: 0;
+}
+.frame_571 {
+ width: 180rpx;
+ height: 28rpx;
+ isolation: isolate;
+ flex-direction: row;
+ flex-shrink: 0;
+ align-items: flex-start;
+ display: flex;
+ position: relative;
+}
+.frame_2 {
+ width: 28rpx;
+ height: 28rpx;
+ z-index: 0;
+ margin-top: 0;
+ margin-left: 0;
+ position: relative;
+}
+.frame_3 {
+ width: 28rpx;
+ height: 28rpx;
+ z-index: 2;
+ margin-left: 10rpx;
+ margin-top: 0;
+ position: relative;
+}
+.frame_4 {
+ width: 28rpx;
+ height: 28rpx;
+ z-index: 1;
+ margin-left: 10rpx;
+ margin-top: 0;
+ position: relative;
+}
+.frame_5 {
+ width: 28rpx;
+ height: 28rpx;
+ z-index: 3;
+ margin-left: 10rpx;
+ margin-top: 0;
+ position: relative;
+}
+.frame_6 {
+ width: 28rpx;
+ height: 28rpx;
+ z-index: 4;
+ margin-left: 10rpx;
+ margin-top: 0;
+ position: relative;
+}
+.text_48 {
+ width: 626rpx;
+ text-align: justify;
+ font-size: 30rpx;
+ color: #555;
+ flex-shrink: 0;
+ font-family: PingFang SC;
+ font-weight: 400;
+ line-height: 46px;
+}
+.rectangle_62 {
+ width: 626rpx;
+ height: 1rpx;
+ background-color: #eee;
+ flex-shrink: 0;
+}
+.frame_9_1 {
+ width: 626rpx;
+ justify-content: flex-start;
+ align-items: flex-start;
+ gap: 12rpx;
+ flex-direction: column;
+ flex-shrink: 0;
+ display: flex;
+ position: relative;
+}
+.frame_7_1 {
+ width: 626rpx;
+ font-size: 30rpx;
+ color: #008465;
+ white-space: pre;
+ flex-direction: row;
+ flex-shrink: 0;
+ justify-content: space-between;
+ align-items: center;
+ font-family: PingFang SC;
+ font-weight: 500;
+ line-height: 42px;
+ display: flex;
+ position: relative;
+}
+.text_49 {
+ flex-shrink: 0;
+}
+.frame_571_1 {
+ width: 180rpx;
+ height: 28rpx;
+ isolation: isolate;
+ flex-direction: row;
+ flex-shrink: 0;
+ align-items: flex-start;
+ display: flex;
+ position: relative;
+}
+.frame_2_1 {
+ width: 28rpx;
+ height: 28rpx;
+ z-index: 0;
+ margin-top: 0;
+ margin-left: 0;
+ position: relative;
+}
+.frame_3_1 {
+ width: 28rpx;
+ height: 28rpx;
+ z-index: 2;
+ margin-left: 10rpx;
+ margin-top: 0;
+ position: relative;
+}
+.frame_4_1 {
+ width: 28rpx;
+ height: 28rpx;
+ z-index: 1;
+ margin-left: 10rpx;
+ margin-top: 0;
+ position: relative;
+}
+.frame_5_1 {
+ width: 28rpx;
+ height: 28rpx;
+ z-index: 3;
+ margin-left: 10rpx;
+ margin-top: 0;
+ position: relative;
+}
+.frame_6_1 {
+ width: 28rpx;
+ height: 28rpx;
+ z-index: 4;
+ margin-left: 10rpx;
+ margin-top: 0;
+ position: relative;
+}
+.text_50 {
+ width: 626rpx;
+ text-align: justify;
+ font-size: 30rpx;
+ color: #555;
+ flex-shrink: 0;
+ font-family: PingFang SC;
+ font-weight: 400;
+ line-height: 46px;
+}
+.rectangle_63 {
+ width: 626rpx;
+ height: 1rpx;
+ background-color: #eee;
+ flex-shrink: 0;
+}
+.frame_10 {
+ width: 626rpx;
+ justify-content: flex-start;
+ align-items: flex-start;
+ gap: 12rpx;
+ flex-direction: column;
+ flex-shrink: 0;
+ display: flex;
+ position: relative;
+}
+.frame_7_2 {
+ width: 626rpx;
+ font-size: 30rpx;
+ color: #008465;
+ white-space: pre;
+ flex-direction: row;
+ flex-shrink: 0;
+ justify-content: space-between;
+ align-items: center;
+ font-family: PingFang SC;
+ font-weight: 500;
+ line-height: 42px;
+ display: flex;
+ position: relative;
+}
+.text_51 {
+ flex-shrink: 0;
+}
+.frame_571_2 {
+ width: 66rpx;
+ height: 28rpx;
+ flex-direction: row;
+ flex-shrink: 0;
+ align-items: flex-start;
+ display: flex;
+ position: relative;
+}
+.frame_2_2 {
+ width: 28rpx;
+ height: 28rpx;
+ margin-top: 0;
+ margin-left: 0;
+ position: relative;
+}
+.frame_3_2 {
+ width: 28rpx;
+ height: 28rpx;
+ margin-left: 10rpx;
+ margin-top: 0;
+ position: relative;
+}
+.text_52 {
+ width: 626rpx;
+ text-align: justify;
+ font-size: 30rpx;
+ color: #555;
+ flex-shrink: 0;
+ font-family: PingFang SC;
+ font-weight: 400;
+ line-height: 46px;
+}
+.rectangle_64 {
+ width: 626rpx;
+ height: 1rpx;
+ background-color: #eee;
+ flex-shrink: 0;
+}
+.frame_11 {
+ width: 626rpx;
+ justify-content: flex-start;
+ align-items: flex-start;
+ gap: 12rpx;
+ flex-direction: column;
+ flex-shrink: 0;
+ display: flex;
+ position: relative;
+}
+.frame_7_3 {
+ width: 626rpx;
+ font-size: 30rpx;
+ color: #008465;
+ white-space: pre;
+ flex-direction: row;
+ flex-shrink: 0;
+ justify-content: space-between;
+ align-items: center;
+ font-family: PingFang SC;
+ font-weight: 500;
+ line-height: 42px;
+ display: flex;
+ position: relative;
+}
+.text_53 {
+ flex-shrink: 0;
+}
+.frame_571_3 {
+ width: 66rpx;
+ height: 28rpx;
+ flex-direction: row;
+ flex-shrink: 0;
+ align-items: flex-start;
+ display: flex;
+ position: relative;
+}
+.frame_2_3 {
+ width: 28rpx;
+ height: 28rpx;
+ margin-top: 0;
+ margin-left: 0;
+ position: relative;
+}
+.frame_3_3 {
+ width: 28rpx;
+ height: 28rpx;
+ margin-left: 10rpx;
+ margin-top: 0;
+ position: relative;
+}
+.text_54 {
+ width: 626rpx;
+ text-align: justify;
+ font-size: 30rpx;
+ color: #555;
+ white-space: pre;
+ flex-shrink: 0;
+ font-family: PingFang SC;
+ font-weight: 400;
+ line-height: 46px;
+}
+.text_55 {
+ width: 686rpx;
+ font-size: 30rpx;
+ color: #666;
+ z-index: 4;
+ margin-left: auto;
+ margin-right: auto;
+ margin-top: 30rpx;
+ font-family: PingFang SC;
+ font-weight: 400;
+ line-height: 45px;
+ position: relative;
+}
+.home_indicator {
+ position: absolute;
+ top: auto;
+ bottom: 0;
+ left: 0;
+}
+.home_indicator_1 {
+ width: 268rpx;
+ height: 10rpx;
+ top: auto;
+ left: 2rpx;
+ border-radius: 200rpx;
+ right: 0;
+ bottom: 16rpx;
+ background-color: #000;
+ margin-left: auto;
+ margin-right: auto;
+ position: absolute;
+}
diff --git a/pages/sjchen/sjchen.js b/pages/sjchen/sjchen.js
new file mode 100644
index 0000000..2c03040
--- /dev/null
+++ b/pages/sjchen/sjchen.js
@@ -0,0 +1,264 @@
+import { veepooBle,veepooFeature} from '../../veeoopSDK/sdk/index';
+import timePointUtils from '../../utils/TimePointUtils';
+import dataPointCacheUtil from '../../utils/DataPointCacheUtil';
+const ET620ParseDataUtil = require('../../utils/ET620ParseDataUtil.js');
+import DayConverter from '../../utils/DayConverter'
+
+
+Page({
+
+ /**
+ * 页面的初始数据
+ */
+ data: {
+ bleReady: false,
+ devices: [],
+ sleepFlagBitType: 0,// 精准睡眠标识
+ ET620Param: {},//请求参数
+ },
+
+ // 开始连接蓝牙并且监听数据
+ connectDevice(event){
+ const device = event.currentTarget.dataset.item;
+ console.log("连接设备信息:",device)
+ veepooBle.veepooWeiXinSDKBleConnectionServicesCharacteristicsNotifyManager(device, res => {
+
+ if(res.connection){
+ console.log('veepooBle已连接手表')
+ // 监听返回数据
+ veepooBle.veepooWeiXinSDKNotifyMonitorValueChange(res => {
+ // console.log("收到设备端上报的数据", res)
+ if(res!== undefined && res.name == '读取日常数据' ){
+ // res.type:5 等于5表示日常数据回调
+ // res.progress 表示进度 0~100
+ // res.content 表示健康数据
+ if(res.content!== undefined ){
+ console.log("获取日常数据:>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>",res.content);
+ let heartArray = ET620ParseDataUtil.parseHeartRateOrBloodOxygenData(res.content,1);
+ let bloodOxygenArray = ET620ParseDataUtil.parseHeartRateOrBloodOxygenData(res.content,3);
+ let bpArray = ET620ParseDataUtil.parseBloodPressureData(res.content);
+ let bodyTempArray = ET620ParseDataUtil.parseBodyTemperatureData(res.content);
+ let stepArray = ET620ParseDataUtil.parseStepData(res.content,'TOM',571);
+ const totalSteps = stepArray.reduce((sum, item) => sum + item.step, 0);
+ console.log("总步数",totalSteps)
+ // 血压接口 todo...
+ console.log("心率数据长度:",heartArray.length)
+ console.log("血氧数据长度:",bloodOxygenArray.length)
+ console.log("血压数据长度:",bpArray.length)
+ console.log("体温数据长度:",bodyTempArray.length)
+ console.log("步数数据长度:",stepArray.length)
+
+ console.log("心率数据返回:",heartArray)
+ console.log("血氧数据返回:",bloodOxygenArray)
+ console.log("血压数据返回:",bpArray)
+ console.log("体温数据返回:",bodyTempArray)
+ console.log("步数数据返回:",stepArray)
+
+ // res.content.forEach((item, index) => {
+ // heartArray.forEach((item, index) => {
+ // console.log(`心率[${index}]`, item);
+ // });
+
+ // bloodOxygenArray.forEach((item, index) => {
+ // console.log(`血氧[${index}]`, item);
+ // });
+
+ // bpArray.forEach((item, index) => {
+ // console.log(`血压[${index}]`, item);
+ // });
+
+ // bodyTempArray.forEach((item, index) => {
+ // console.log(`体温[${index}]`, item);
+ // });
+
+ // stepArray.forEach((item, index) => {
+ // console.log(`步数[${index}]`, item);
+ // });
+
+ if(res.content != undefined && res.content.length > 0){
+ // 缓存point
+ this.setCachePoint(res.content[res.content.length-1].date);
+ }
+ // 重新构建请求参数
+ // this.buildRequestParam();
+ }
+ }
+
+ /**
+ * 在手环功能汇总 》 package=2
+ * sleepFlagBitType [1-精准睡眠, 2-无睡眠 ,4-精准睡眠,数据结构与1一致,曲线修改为2bit表示,其他-普通睡眠]
+ */
+ if(res!== undefined && res.name == '手环功能汇总' && res.package === 2){
+ this.setData({
+ sleepFlagBitType : res.sleepFlagBitType
+ })
+ }
+ if(res!== undefined && res.name == '精准睡眠数据'){
+ if(res.content!== undefined && res.content.length > 0){
+ /**
+ * 解析睡眠,ET620只返回精准睡眠
+ */
+ let sleepArray = ET620ParseDataUtil.parseSleepData(res,1);
+ console.log("睡眠数据返回:",sleepArray)
+ }
+ }
+
+
+ })
+ // 密钥确认
+ veepooFeature.veepooBlePasswordCheckManager()
+
+ // 1、读取健康数据
+ this.readHealthData();
+ // 3、读取实时计步、卡路里、距离
+ veepooFeature.veepooReadStepCalorieDistanceManager({
+ })
+ }
+ })
+ },
+
+ startScan(){
+ // 开始扫描蓝牙
+ veepooBle.veepooWeiXinSDKStartScanDeviceAndReceiveScanningDevice((res) => {
+ console.log('res=>',res)
+ res.forEach(device => {
+ if (device?.localName === 'ET620') {
+ veepooBle.veepooWeiXinSDKStopSearchBleManager((res) => {
+ console.log("veepooBle停止扫描", res)
+ })
+ }
+ this.setData({
+ devices:res,
+ bleReady:true
+ })
+ })
+ })
+ },
+
+ // 等待工具函数
+ sleep(ms) {
+ return new Promise(resolve => setTimeout(resolve, ms));
+ },
+ // 读取健康数据
+ async readHealthData(){
+
+ let params = this.data.ET620Param;
+ for (const item of params) {
+ // 读取日常数据
+ veepooFeature.veepooSendReadDailyDataManager(item);
+ // 读取精准睡眠数据
+ veepooFeature.veepooSendReadPreciseSleepManager(item);
+ if(params.length > 0){
+ await this.sleep(12000); // 预计耗时12秒才读完1天的数据
+ }
+ }
+ },
+
+ /**
+ * 读取数据的point缓存到本地,便于下一次读取
+ * @param {*} datetime
+ */
+ setCachePoint(datetime){
+ dataPointCacheUtil.setDateTime(dataPointCacheUtil.CACHE_KEY,datetime);
+ },
+
+ /**
+ * 构建日常数据请求参数
+ * @returns 返回读取数据的point => package 和 day
+ */
+ buildRequestParam(){
+ let point = 0;
+ let cacheDateTime = dataPointCacheUtil.getDateTime(dataPointCacheUtil.CACHE_KEY);
+ let params = [];
+ if(cacheDateTime != null){
+ const HHmm = timePointUtils.getHHmmFromDateTime(cacheDateTime);
+ point = timePointUtils.getPackageByHHmm(HHmm);
+ params = DayConverter.getDayParam(cacheDateTime,point);
+ } else {
+ // 默认返回3天的数据请求参数
+ params = [{"day":0,"package":0},{"day":1,"package":0},{"day":2,"package":point}];
+ // params = [{"day":0,"package":0}];
+ }
+
+ this.setData({
+ ET620Param:params
+ })
+ console.log(`---------------------请求参数: ${params}, 参数长度: ${params.length}----------------------------`);
+ },
+
+ /**
+ * 同步历史数据
+ */
+ synchronizeHistoricalData(){
+ // 清除缓存
+ dataPointCacheUtil.remove(dataPointCacheUtil.CACHE_KEY);
+ // 构建请求参数
+ this.buildRequestParam();
+ // 开始读取健康数据
+ this.readHealthData();
+ },
+
+ test(){
+ dataPointCacheUtil.remove(dataPointCacheUtil.CACHE_KEY);
+ console.log("清除缓存的TOKEN");
+ this.buildRequestParam();
+ },
+
+
+
+ onLoad(){
+ // 开始扫描
+ this.startScan()
+ // 先构建请求参数
+ this.buildRequestParam();
+
+ },
+ /**
+ * 生命周期函数--监听页面初次渲染完成
+ */
+ onReady() {
+
+ },
+
+ /**
+ * 生命周期函数--监听页面显示
+ */
+ onShow() {
+
+ },
+
+ /**
+ * 生命周期函数--监听页面隐藏
+ */
+ onHide() {
+
+ },
+
+ /**
+ * 生命周期函数--监听页面卸载
+ */
+ onUnload() {
+
+ },
+
+ /**
+ * 页面相关事件处理函数--监听用户下拉动作
+ */
+ onPullDownRefresh() {
+
+ },
+
+ /**
+ * 页面上拉触底事件的处理函数
+ */
+ onReachBottom() {
+
+ },
+
+ /**
+ * 用户点击右上角分享
+ */
+ onShareAppMessage() {
+
+ }
+})
\ No newline at end of file
diff --git a/pages/sjchen/sjchen.json b/pages/sjchen/sjchen.json
new file mode 100644
index 0000000..8835af0
--- /dev/null
+++ b/pages/sjchen/sjchen.json
@@ -0,0 +1,3 @@
+{
+ "usingComponents": {}
+}
\ No newline at end of file
diff --git a/pages/sjchen/sjchen.wxml b/pages/sjchen/sjchen.wxml
new file mode 100644
index 0000000..e6c6c22
--- /dev/null
+++ b/pages/sjchen/sjchen.wxml
@@ -0,0 +1,25 @@
+
+
+
+ 蓝牙功能初始化中...
+
+
+
+
+
+
+
+
+ MAC:{{item.mac}}
+ 信号强度: {{item.RSSI}}dBm
+
+
+
+ 未发现设备,请点击扫描
+
+
+
+
+
\ No newline at end of file
diff --git a/pages/sjchen/sjchen.wxss b/pages/sjchen/sjchen.wxss
new file mode 100644
index 0000000..aaebc74
--- /dev/null
+++ b/pages/sjchen/sjchen.wxss
@@ -0,0 +1,17 @@
+/* pages/sjchen/sjchen.wxss */
+.tip {
+ color: #000;
+ text-align: center;
+ margin: 20px;
+}
+
+.device-list {
+ margin-top: 15px;
+}
+
+.device-item {
+ padding: 12px;
+ border-bottom: 1px solid #eee;
+ display: flex;
+ justify-content: space-between;
+}
\ No newline at end of file
diff --git a/utils/DataPointCacheUtil.js b/utils/DataPointCacheUtil.js
new file mode 100644
index 0000000..ffdb4b5
--- /dev/null
+++ b/utils/DataPointCacheUtil.js
@@ -0,0 +1,99 @@
+// utils/DataPointCacheUtil.js
+class DataPointCacheUtil {
+
+ // 定义常量 key
+ static CACHE_KEY = 'ET620_HEALTH_DATA_POINT';
+ /**
+ * 比较两个时间字符串
+ * @param {string} time1 - 当前时间
+ * @param {string} time2 - 缓存的时间
+ * @returns {number} true 大于, false 小于
+ */
+ static compareDateTime(time1, time2) {
+
+ let currentTime = this.convertToTimestamp(time1);
+ let cacheTime = this.convertToTimestamp(time2);
+ // console.log("currentTime:",currentTime)
+ // console.log("cacheTime:",cacheTime)
+ console.log("对比结果:",currentTime > cacheTime)
+ return currentTime > cacheTime;
+ }
+
+ /**
+ * 将 yyyy-MM-dd-HH-mm 格式转换为时间戳
+ * @param {string} datetime - 时间字符串
+ * @returns {number} 时间戳(毫秒)
+ */
+ static convertToTimestamp(datetime) {
+ const [year, month, day, hour, minute] = datetime.split('-').map(Number);
+ return new Date(year, month - 1, day, hour, minute).getTime();
+ }
+
+ /**
+ * 永久存储时间数据
+ * @param {string} key - 存储键名
+ * @param {string} datetime - 时间字符串,格式 yyyy-MM-dd-HH-mm
+ */
+ static setDateTime(key, datetime) {
+ try {
+ // 验证时间格式
+ if (!/^\d{4}-\d{2}-\d{2}-\d{2}-\d{2}$/.test(datetime)) {
+ throw new Error('时间格式应为 yyyy-MM-dd-HH-mm');
+ }
+
+ // 获取已缓存的时间
+ const cacheDateTime = this.getDateTime(key);
+ // 如果缓存中没有时间,或者新时间大于缓存时间,则存储
+ if (cacheDateTime != null) {
+ if(this.compareDateTime(datetime, cacheDateTime)){
+ console.log("后续设置缓存成功:",datetime);
+ wx.setStorageSync(key, datetime);
+ return true;
+ }
+ } else {
+ console.log("首次设置缓存成功:",datetime);
+ // 使用同步API存储,确保立即生效
+ wx.setStorageSync(key, datetime);
+ return true;
+ }
+
+ } catch (err) {
+ console.error('存储失败:', err);
+ return false;
+ }
+ }
+
+ /**
+ * 获取永久存储的时间数据
+ * @param {string} key - 存储键名
+ * @returns {string|null} 时间字符串或null
+ */
+ static getDateTime(key) {
+ try {
+ const datetime = wx.getStorageSync(key);
+ console.log("获取缓存成功:",datetime);
+ // 二次验证数据格式
+ if (datetime && /^\d{4}-\d{2}-\d{2}-\d{2}-\d{2}$/.test(datetime)) {
+ return datetime;
+ }
+ return null;
+ } catch (err) {
+ return null;
+ }
+ }
+
+ /**
+ * 移除永久存储的数据
+ * @param {string} key - 存储键名
+ */
+ static remove(key) {
+ try {
+ wx.removeStorageSync(key);
+ return true;
+ } catch (err) {
+ return false;
+ }
+ }
+}
+
+export default DataPointCacheUtil;
\ No newline at end of file
diff --git a/utils/DayConverter.js b/utils/DayConverter.js
new file mode 100644
index 0000000..dc9d8ad
--- /dev/null
+++ b/utils/DayConverter.js
@@ -0,0 +1,179 @@
+class DayConverter {
+ constructor(data) {
+ this.nameToValueMap = {};
+ this.valueToNameMap = {};
+
+ // 初始化映射关系
+ data.forEach(item => {
+ this.nameToValueMap[item.dayName] = item.dayValue;
+ this.valueToNameMap[item.dayValue] = item.dayName;
+ });
+ }
+
+ // 根据dayName获取dayValue
+ getValueByName(dayName) {
+ return this.nameToValueMap[dayName];
+ }
+
+ // 根据dayValue获取dayName
+ getNameByValue(dayValue) {
+ return this.valueToNameMap[dayValue];
+ }
+
+ // 根据dayName获取对应日期
+ getDateByDayName(dayName) {
+ const today = new Date();
+ const dayValue = this.getValueByName(dayName);
+
+ if (dayValue === undefined) {
+ throw new Error(`Invalid dayName: ${dayName}`);
+ }
+
+ const targetDate = new Date(today);
+ targetDate.setDate(today.getDate() - dayValue);
+
+ // 格式化为YYYY-MM-DD
+ const year = targetDate.getFullYear();
+ const month = String(targetDate.getMonth() + 1).padStart(2, '0');
+ const day = String(targetDate.getDate()).padStart(2, '0');
+
+ return `${year}-${month}-${day}`;
+ // return targetDate;
+ }
+
+ /**
+ * -1 获取今天、昨天、前天的数据
+ * 0 获取今天
+ * 1 获取昨天
+ * 2 获取前天
+ * @param {时间} dateTime
+ */
+ getDayParam(dateTime,point){
+
+ console.log(`获取参数,dateTime: ${dateTime},point:${point}`);
+ // 正确解析日期(处理时区问题)
+ const parseDate = (dateStr) => {
+ const [year, month, day] = dateStr.split('-').slice(0, 3).map(Number);
+ return new Date(year, month - 1, day); // 月份要减1
+ };
+
+ const cachedDateObj = parseDate(dateTime);
+ if (isNaN(cachedDateObj.getTime())) {
+ console.error('无效的日期');
+ return -1;
+ }
+
+ // 获取今天、昨天、前天的日期(统一时区处理)
+ const now = new Date();
+ const today = new Date(now.getFullYear(), now.getMonth(), now.getDate());
+
+ const yesterday = new Date(today);
+ yesterday.setDate(yesterday.getDate() - 1);
+
+ const dayBeforeYesterday = new Date(today);
+ dayBeforeYesterday.setDate(dayBeforeYesterday.getDate() - 2);
+
+ // 比较日期
+ if (this.isSameDay(cachedDateObj, today)) {
+ return [{"day": 0, "package": point}]; // 今天
+ } else if (this.isSameDay(cachedDateObj, yesterday)) {
+ return [{"day": 0, "package": 0}, {"day": 1, "package": point}]; // 昨天
+ }
+ // else if (this.isSameDay(cachedDateObj, dayBeforeYesterday)) {
+ // return [{"day": 0, "package": 0}, {"day": 1, "package": 0}, {"day": 2, "package": point}]; //
+ // }
+ else {
+ return [{"day": 0, "package": 0}, {"day": 1, "package": 0}, {"day": 2, "package": point}]; // 前天或更早的日期
+ }
+ }
+
+ /**
+ * 判断两个Date对象是否是同一天
+ * @param {Date} date1
+ * @param {Date} date2
+ * @returns {boolean}
+ */
+ isSameDay(date1, date2) {
+ return date1.getFullYear() === date2.getFullYear() &&
+ date1.getMonth() === date2.getMonth() &&
+ date1.getDate() === date2.getDate();
+ }
+
+ /**
+ * 13 位时间戳,例子:1751295900000
+ * @param {string} fallAsleepTime 例子:06-30-23-05
+ */
+ formatFullDateTime(fallAsleepTime){
+ if (!fallAsleepTime || typeof fallAsleepTime !== 'string') {
+ throw new Error('Invalid fallAsleepTime format. Expected "MM-dd-HH-mm"');
+ }
+ const currentYear = new Date().getFullYear();
+ // 拼接成 "2025-06-30-23-05"
+ const fullDateTimeString = `${currentYear}-${fallAsleepTime}`;
+
+ // 转换为标准格式 "2025-06-30T23:05"
+ const isoFormat = fullDateTimeString.replace(/-(\d{2})-(\d{2})$/, 'T$1:$2');
+
+ // 创建 Date 对象并获取时间戳
+ const timestamp = new Date(isoFormat).getTime();
+ console.log("完整日期时间字符串:", fullDateTimeString);
+ console.log("ISO 格式:", isoFormat);
+ console.log("时间戳:", timestamp);
+ return timestamp;
+ }
+
+ /**
+ * 计算时间戳对应的当天分钟数(0-1439)
+ * @param {number} timestamp - 13位毫秒级时间戳
+ * @returns {number} 分钟数
+ */
+ getMinuteOfDay(timestamp) {
+ const date = new Date(timestamp);
+ return date.getHours() * 60 + date.getMinutes();
+ }
+
+ /**
+ * 睡眠片段日期格式化
+ * @param {*} timestamp
+ */
+ formatDate(timestamp) {
+ const date = new Date(timestamp);
+ const year = date.getFullYear();
+ const month = String(date.getMonth() + 1).padStart(2, '0');
+ const day = String(date.getDate()).padStart(2, '0');
+ return `${year}${month}${day}`;
+ }
+
+ /**
+ * 获取1天的第N分钟
+ * @param {Number} timeString 例子:06-30-23-05
+ */
+ getMinutesFromTime(timeString) {
+ const dateParts = timeString.split('-');
+ if (dateParts.length !== 4) {
+ throw new Error("时间格式必须是 MM-DD-HH-mm");
+ }
+
+ const hour = parseInt(dateParts[2], 10); // 明确转换为十进制整数
+ const minute = parseInt(dateParts[3], 10);
+
+ if (isNaN(hour) || isNaN(minute)) {
+ throw new Error("小时和分钟必须是数字");
+ }
+ if (hour < 0 || hour >= 24 || minute < 0 || minute >= 60) {
+ throw new Error("小时需在 0-23 之间,分钟需在 0-59 之间");
+ }
+
+ return hour * 60 + minute;
+ }
+}
+
+// 使用示例
+const data = [
+ {"dayName":"today","dayValue":0},
+ {"dayName":"yesterday","dayValue":1},
+ {"dayName":"dayBeforeYesterday","dayValue":2}
+];
+
+const dayConverter = new DayConverter(data);
+export default dayConverter;
\ No newline at end of file
diff --git a/utils/ET620ParseDataUtil.js b/utils/ET620ParseDataUtil.js
new file mode 100644
index 0000000..b9aa665
--- /dev/null
+++ b/utils/ET620ParseDataUtil.js
@@ -0,0 +1,280 @@
+import DayConverter from './DayConverter';
+import CommonUtil from './CommonUtil.js';
+
+const ET620ParseDataUtil = {
+
+ /**
+ * @returns {Array} data 心率或血氧数据
+ * @param {Array} data 手表SDK数据
+ * @param {Number} dataType 数据类型 1-心率 3-血氧
+ */
+ parseHeartRateOrBloodOxygenData(data,dataType){
+ if (!Array.isArray(data)) {
+ console.error('输入数据必须是数组');
+ return [];
+ }
+ return ET620ParseDataUtil.get10MinuteAverage(data,dataType);
+ },
+
+ /**
+ *
+ * @param {Array} data 手表SDK数据
+ */
+ parseBodyTemperatureData(data){
+ if (!Array.isArray(data)) {
+ console.error('输入数据必须是数组');
+ return [];
+ }
+ return data
+ .filter(item => this.isValidBodyTemperature(item.bodyTemperature))
+ .map(item => this.formatBodyTemperatureItem(item));
+ },
+ parseBloodPressureData(data){
+ if (!Array.isArray(data)) {
+ console.error('输入数据必须是数组');
+ return [];
+ }
+ return data
+ .filter(item => this.isValidBloodPressure(item.bloodPressure))
+ .map(item => this.formatBloodPressureItem(item));
+ },
+
+ /**
+ * @returns {Object} 返回血压数据
+ * @param {Number} bp
+ */
+ isValidBloodPressure(bp) {
+ return bp &&
+ bp.bloodPressureHigh > 0 &&
+ bp.bloodPressureLow > 0;
+ },
+
+ /**
+ * @returns {Object} 返回体温数据
+ * @param {} bt
+ */
+ isValidBodyTemperature(bt) {
+ return bt &&
+ bt.bodyTemperature > 0.0 ;
+ },
+
+ /**
+ * @returns {Object} 返回体温数据
+ * @param {Number} bt
+ */
+ isValidStep(step){
+ return step &&
+ step.stepCount > 0 ;
+ },
+ /**
+ * 组装体温数据
+ * @param {Object} item
+ */
+ formatBodyTemperatureItem(item) {
+ let timestamp = this.getTimestamp(item.date)
+ // const tempStr = item.bodyTemperature.bodyTemperature.toFixed(1); // "36.0"
+ const [integerPart, decimalPart] = item.bodyTemperature.bodyTemperature.split('.');
+ return {
+ type: 4, // 4.体温
+ oneValue: integerPart, // 体温整数部分
+ twoValue: decimalPart, // 体温小数部分
+ time: timestamp, // 11位时间戳
+ stringTime: item.date
+ };
+ },
+ /**
+ * 组装步数数据
+ * @param {Object} item
+ */
+ formatStepItem(item,name,userId) {
+ let timestamp = this.getTimestamp(item.date)
+ return {
+ calories: item.step.calorie,
+ distance: item.step.distance,
+ step: item.step.stepCount,
+ startTime: timestamp - (5 * 60), // 开始时间
+ endTime: timestamp, // 结束时间
+ createBy: name, // 体温整数部分
+ createTime: timestamp * 1000, // 体温小数部分
+ updateTime: timestamp * 1000, // 11位时间戳
+ userId: userId
+ };
+ },
+ /**
+ * 组装血压数据
+ * @param {Object} item
+ */
+ formatBloodPressureItem(item) {
+ let timestamp = this.getTimestamp(item.date)
+ return {
+ type: 2, // 2.血压
+ oneValue: item.bloodPressure.bloodPressureHigh, // 高压
+ twoValue: item.bloodPressure.bloodPressureLow, // 低压
+ time: timestamp, // 11位时间戳
+ stringTime: item.date // 直接使用原始date字段
+ };
+ },
+
+ /**
+ * 解析心率、血氧数据,心率和血氧开启科学睡眠后,是1分钟采集1次,按每10分钟分组并计算平均值,传给后端
+ * @param {Array} data - 心率数据数组,格式为[{date: "YYYY-MM-DD-HH-mm", pulseReat: [number...]}, ...]
+ * @returns {Array} - 分组后的结果数组
+ */
+ get10MinuteAverage(data,dataType) {
+ // 1. 创建用于分组的Map
+ const groupMap = new Map();
+
+ // 2. 遍历每个数据点
+ for (const item of data) {
+ // 解析日期和时间
+ const [year, month, day, hour, minute] = item.date.split('-').map(Number);
+
+ // 计算分组标识 (每10分钟一组)
+ const groupMinute = Math.floor(minute / 10) * 10;
+ const groupKey = `${year}-${month.toString().padStart(2, '0')}-${day.toString().padStart(2, '0')}-${hour.toString().padStart(2, '0')}-${groupMinute.toString().padStart(2, '0')}`;
+
+ // 提取有效值(大于0) SDK文档有心率字段,实际没有心率字段,与厂家确认,使用脉率 pulseReat
+ const validPulseRates = dataType== 1 ? item.pulseReat.filter(rate => rate > 0) : item.bloodOxygen.oxygens.filter(rate => rate > 0);
+
+ // 添加到分组
+ if (!groupMap.has(groupKey)) {
+ groupMap.set(groupKey, []);
+ }
+ groupMap.get(groupKey).push(...validPulseRates);
+ }
+
+ // 3. 计算每个分组的平均值
+ const result = [];
+
+ groupMap.forEach((values, groupKey) => {
+ let average = 0;
+
+ if (values.length > 0) {
+ // 计算平均值
+ const sum = values.reduce((total, rate) => total + rate, 0);
+ average = Math.round(sum / values.length);// 四舍五入
+ }
+
+ let timestamp = this.getTimestamp(groupKey)
+ if(average > 0){
+ result.push({
+ type: dataType, // 1.心率 , 3.血氧
+ oneValue: average,
+ time: timestamp, // 11位时间戳
+ stringTime: groupKey // 直接使用原始date字段
+ });
+ }
+ });
+ // 4. 按时间排序(可选)
+ result.sort((a, b) => a.stringTime.localeCompare(b.stringTime));
+ return result;
+ },
+
+ /**
+ * 步数详情
+ * @param {Array} data 手表SDK数据
+ * @param {string} name 用户姓名
+ * @param {Number} userId
+ */
+ parseStepData(data,name,userId){
+ if (!Array.isArray(data)) {
+ console.error('输入数据必须是数组');
+ return [];
+ }
+ return data
+ .filter(item => this.isValidStep(item.step))
+ .map(item => this.formatStepItem(item,name,userId));
+ },
+ /**
+ * 获取11位的时间戳
+ * @param {Long} date
+ */
+ getTimestamp(date){
+ const dateParts = date.split('-');
+ const year = dateParts[0];
+ const month = dateParts[1];
+ const day = dateParts[2];
+ const hour = dateParts[3];
+ const minute = dateParts[4];
+
+ // 创建Date对象并获取时间戳
+ const dateObj = new Date(
+ `${year}-${month}-${day}T${hour}:${minute}:00`
+ );
+ // 单独 +5 分钟:使数据的时间更接近现在的时刻
+ const timestamp = (dateObj.getTime() / 1000) + (5 * 60);
+ return timestamp;
+ },
+
+ /**
+ * 解析睡眠数据
+ * @param {*} data 睡眠数据
+ * @param {*} sleepFlagBitType 1-精准睡眠, 2-无睡眠 ,4-精准睡眠,数据结构与1一致,曲线修改为2bit表示,其他-普通睡眠
+ */
+ parseSleepData(data,sleepFlagBitType){
+ let sleepList = [];
+ console.log("data.content ===============================================",data.content)
+ data.content.forEach(item=>{
+ // 睡眠片段的入睡时间,13位时间戳
+ let startTimestamp = DayConverter.formatFullDateTime(item.fallAsleepTime);
+ // 计算睡眠曲线
+ const timeline = item.sleepCurve.map((state, index) => {
+ const currentTimestamp = startTimestamp + index * 60000; // 每分钟 +60,000ms
+ /**
+ * 睡眠:一个字符代表1分钟时长,0深睡,1浅睡,2快速眼动,3失眠,4苏醒
+ */
+ // console.log(`minute: ${DayConverter.getMinuteOfDay(currentTimestamp)}, status: ${state}, yyyyMMdd: ${DayConverter.formatDate(currentTimestamp)}`);
+ return {
+ yyyyMMdd: DayConverter.formatDate(currentTimestamp),
+ timestamp: currentTimestamp,
+ minute: DayConverter.getMinuteOfDay(currentTimestamp),
+ status: this.et620SleepStatus(state)
+ };
+ });
+ sleepList.push(...timeline);
+ })
+ console.log("解析后格式:",sleepList.length)
+ let completeList = CommonUtil.completeMissingData(sleepList);
+ console.log("完整的数据:",completeList.length)
+ // 组装数据
+ let arr = CommonUtil.assembleSleepData(completeList);
+ arr[0].date = DayConverter.getDateByDayName(data.readDay);
+ console.log("睡眠日期:",DayConverter.getDateByDayName(data.readDay))
+ return arr;
+
+ },
+
+ /**
+ * 普通睡眠
+ */
+ calculateNormalSleep(){
+
+ },
+
+ /**
+ * 精准睡眠
+ */
+ calculatePreciseSleep(){
+
+ },
+
+ /**
+ * 0深睡,1浅睡,2快速眼动,3失眠,4苏醒
+ * @param {*} status
+ */
+ et620SleepStatus(status) {
+ switch (status) {
+ case 0:
+ return 2; // 深睡
+ case 1:
+ return 1; // 浅睡
+ case 2:
+ return 4; // 快速眼动
+ default:
+ return 3; // 清醒
+ }
+ },
+}
+
+// 导出模块
+module.exports = ET620ParseDataUtil;
\ No newline at end of file
diff --git a/utils/RequestParamUtil.js b/utils/RequestParamUtil.js
new file mode 100644
index 0000000..8fb4459
--- /dev/null
+++ b/utils/RequestParamUtil.js
@@ -0,0 +1,61 @@
+// utils/RequestParamUtil.js
+class RequestParamUtil {
+ /**
+ * 判断日期是前天、昨天还是今天
+ * @param {string} cachedDate - 缓存的日期字符串,格式为 yyyy-MM-dd-HH-mm
+ * @returns {number} 前天返回2,昨天返回1,今天返回0,其他情况返回-1
+ */
+ static judgeRecentDate(cachedDate) {
+ // 验证日期格式
+ if (!/^\d{4}-\d{2}-\d{2}-\d{2}-\d{2}$/.test(cachedDate)) {
+ console.error('日期格式不正确,应为 yyyy-MM-dd-HH-mm');
+ return -1;
+ }
+
+ // 提取日期部分(忽略时间)
+ const dateStr = cachedDate.split('-').slice(0, 3).join('-');
+
+ // 转换为Date对象
+ const cachedDateObj = new Date(dateStr);
+ if (isNaN(cachedDateObj.getTime())) {
+ console.error('无效的日期');
+ return -1;
+ }
+
+ // 获取今天、昨天、前天的日期
+ const today = new Date();
+ today.setHours(0, 0, 0, 0);
+
+ const yesterday = new Date(today);
+ yesterday.setDate(yesterday.getDate() - 1);
+
+ const dayBeforeYesterday = new Date(today);
+ dayBeforeYesterday.setDate(dayBeforeYesterday.getDate() - 2);
+
+ // 比较日期
+ if (this.isSameDay(cachedDateObj, today)) {
+ return 0; // 今天
+ } else if (this.isSameDay(cachedDateObj, yesterday)) {
+ return 1; // 昨天
+ } else if (this.isSameDay(cachedDateObj, dayBeforeYesterday)) {
+ return 2; // 前天
+ } else {
+ return -1; // 更早的日期
+ }
+ }
+
+ /**
+ * 判断两个Date对象是否是同一天
+ * @param {Date} date1
+ * @param {Date} date2
+ * @returns {boolean}
+ */
+ static isSameDay(date1, date2) {
+ return date1.getFullYear() === date2.getFullYear() &&
+ date1.getMonth() === date2.getMonth() &&
+ date1.getDate() === date2.getDate();
+ }
+
+}
+
+export default RequestParamUtil;
\ No newline at end of file
diff --git a/utils/TimePointUtils.js b/utils/TimePointUtils.js
new file mode 100644
index 0000000..83398a9
--- /dev/null
+++ b/utils/TimePointUtils.js
@@ -0,0 +1,70 @@
+// timePointUtils.js
+class TimePointUtils {
+ constructor() {
+ this.timePoints = this.generateTimePoints();
+ }
+
+ // 生成时间点数组,格式如下:[{"HHmm":"0000","package":0},{"HHmm":"0005","package":1},{"HHmm":"0010","package":2},...]
+ generateTimePoints() {
+ const points = [];
+ for (let hour = 0; hour < 24; hour++) {
+ for (let minute = 0; minute < 60; minute += 5) {
+ const hh = hour.toString().padStart(2, '0');
+ const mm = minute.toString().padStart(2, '0');
+ const packageNum = hour * 12 + minute / 5;
+ points.push({
+ HHmm: hh + mm,
+ package: packageNum
+ });
+ }
+ }
+ return points;
+ }
+
+ // 通过HHmm获取package编号
+ getPackageByHHmm(hhmm) {
+ if (!/^([0-1][0-9]|2[0-3])([0-5][0-9])$/.test(hhmm)) {
+ console.error('Invalid HHmm format, should be like "0000", "2355"');
+ return null;
+ }
+
+ const point = this.timePoints.find(item => item.HHmm === hhmm);
+ return point ? point.package : null;
+ }
+
+ // 通过package编号获取HHmm
+ getHHmmByPackage(packageNum) {
+ if (packageNum < 0 || packageNum > 287 || !Number.isInteger(packageNum)) {
+ console.error('Invalid package number, should be integer between 0 and 287');
+ return null;
+ }
+
+ const point = this.timePoints.find(item => item.package === packageNum);
+ return point ? point.HHmm : null;
+ }
+
+ /**
+ * 从yyyy-MM-dd-HH-mm格式的时间字符串中提取HHmm部分
+ * @param {string} datetime - 格式为"yyyy-MM-dd-HH-mm"的时间字符串,例如"2025-06-27-10-40"
+ * @returns {string} 返回HHmm格式的时间字符串,例如"1040"
+ */
+ getHHmmFromDateTime(datetime) {
+ // 验证输入格式
+ if (!/^\d{4}-\d{2}-\d{2}-\d{2}-\d{2}$/.test(datetime)) {
+ console.error('Invalid datetime format, should be "yyyy-MM-dd-HH-mm"');
+ return null;
+ }
+
+ // 分割字符串获取小时和分钟部分
+ const parts = datetime.split('-');
+ const hours = parts[3]; // 小时部分
+ const minutes = parts[4]; // 分钟部分
+
+ // 组合成HHmm格式
+ return hours + minutes;
+ }
+
+}
+// 导出单例
+const timePointUtils = new TimePointUtils();
+export default timePointUtils;
\ No newline at end of file
diff --git a/utils/bleSDKLoader.js b/utils/bleSDKLoader.js
new file mode 100644
index 0000000..038c54e
--- /dev/null
+++ b/utils/bleSDKLoader.js
@@ -0,0 +1,35 @@
+// // utils/bleSDKLoader.js
+// export const loadVeepooSDK = () => {
+// return new Promise((resolve, reject) => {
+// // 使用分包的绝对路径(从项目根目录开始)
+// require.async('/veepooSDK/sdk/index.js', (sdkModule) => {
+// // 检查模块导出结构
+// if (sdkModule?.default) { // 兼容不同导出方式
+// sdkModule = sdkModule.default;
+// }
+
+// const { veepooBle, veepooFeature } = sdkModule;
+
+// if (!veepooBle || !veepooFeature) {
+// reject(new Error('SDK模块加载不完整'));
+// return;
+// }
+
+// resolve({ veepooBle, veepooFeature });
+// }, (err) => {
+// console.error("子包加载失败",err.message)
+// reject(new Error(`子包加载失败: ${err.message}`));
+// });
+// });
+// };
+
+const { veepooBle, veepooFeature } = require('./veepooSDK/sdk/index.js');
+console.log(veepooBle,veepooFeature)
+
+export const loadVeepooSDK = () => {
+ return Promise.resolve({ veepooBle, veepooFeature });
+};
+
+// 也可以提供同步加载选项
+export const getVeepooBle = () => veepooBle;
+export const getVeepooFeature = () => veepooFeature;
\ No newline at end of file
diff --git a/veeoopSDK/sdk/index.d.ts b/veeoopSDK/sdk/index.d.ts
new file mode 100644
index 0000000..b2cf3be
--- /dev/null
+++ b/veeoopSDK/sdk/index.d.ts
@@ -0,0 +1,3 @@
+declare let veepooBle: any;
+declare let veepooFeature: any;
+export { veepooBle, veepooFeature };
diff --git a/veeoopSDK/sdk/index.js b/veeoopSDK/sdk/index.js
new file mode 100644
index 0000000..331a023
--- /dev/null
+++ b/veeoopSDK/sdk/index.js
@@ -0,0 +1 @@
+function a0_0x1b9c(_0x41fd11,_0x1f48dd){var _0x205ea6=a0_0x205e();return a0_0x1b9c=function(_0x1b9c21,_0x151247){_0x1b9c21=_0x1b9c21-0x159;var _0x503266=_0x205ea6[_0x1b9c21];return _0x503266;},a0_0x1b9c(_0x41fd11,_0x1f48dd);}function a0_0x205e(){var _0x442fbb=['veepooSendAppStartMovementPatternD5Data','slice','weatherType1','convertToBinaryAndShift','dateTime','p_disease_types','VPCustomDialScreenType360_360Circle_JL','sos','811167EgcUmA','checkTrueValues','normal','VPCustomDialScreenType390_390Circle_JL','fourDaysAgo','done','getSendDataCRC','1778585UWmyLg','averageArray','Friday','bodyMergeMultipleArrays','ffffffff','VPSettingLinkedln','==>','test','setup','beMeasuringAuto','VPDeviceBeMeasuringHeartRate','VPSettingFlickr','bloodGlucoseValueParses','unitUricAcid','sendNotStorageSMSPush','reserveRecords','窦性⼼律失常','veepooSendReadBodyCompositionTestIdData','体温检测','ReadBodyCompositionTestIdParses','F0080003-0451-4000-B000-000000000000','pushChinese','HRVDataParses','getBLEDeviceServices','notify','DeviceSwitchParses','padStart','VPCustomDialScreenType240_280Square_JL_Apple','getStorageSync','getCurrentTime','读取失败','没有此功能','sendHeartRateTestInfo','toFixed','sendSetupSedentaryToastTimeData','authorize','wrongfulValue','VPCustomDialScreenType135_240Square_QFN','VPSettingwhatsapp','没有表盘数据','sendReadIdTestSeavData','开始进入数据传输\x20responce=>','血氧手动测量','ecg\x20PTT\x20波形数据','VPDeviceBTState','parsesPackage4','flash\x20responce=>','metricSystem','noneBloodOxygen','房颤——粗','veepooSendWeatherForecastData','F0080001-0451-4000-B000-000000000000','every','veepooSendReadDeviceUnitSettingData','sendGetProductInfo','VPCustomDialScreenType240_284Square_JL','fourIndex','sendReadTime','splice','sendBloodPressurePrivateData','unitBloodLipid','VPCustomDialScreenType412_412Circle_JL','veepooSendReadPPTTestData','VPCustomDialScreenType240_240Square','VPDeviceThreeDaysAgo','removeStorageSync','lowDensity','content','getA1PwdVerifyWearFlag','isChinese','VPCustomDialScreenType240_240Circle_QFN','leadStatus','wristbandStatus','DeviceUIStyleType','血液成分校准写入value==>','Data_ConvertForZeSheng','maxHeartRate','5438','Data_ConvertFor1182_5515','sendLanguageSetup','VPCustomDialScreenType412_412Circle_JL_Apple','setBLEMTU','toUpperCase','DeviceHealthWarn','getLorentzScatterPlotData','beBusy','Features4','sendAdjustContactPersonData','血液成分校准value==>','sendBloodOxygenControlData','Success','mac','sleep','setupSedentaryToastAck','早期\x202\x20型室性早搏','minFahrenheit','pageIndex','sendSettingWeatherForecastData','steps','sendSetAlarmClockData','fallWarning','绘图颜色控制设置参数错误','sendReadBodyCompositionTestIdData','androidCode','getSetting','sendECGmeasureData','openBluetoothAdapter','抬手亮屏','设置失败','fromCharCode','veepooSendReadUniversalBloodPressureData','VPSettingLine','whitelist','isArray','uint8ArrayToString','VPCustomDialScreenType240_240Circle_JL','abs','duration','5284','veepooSynchronizingPersonalInformation','sendResettingTheDeviceData','getValSwitchText','ecgMultipleService','读取运动模式','toString','bloodMeasureType','offBLECharacteristicValueChange','ECG\x20自动测量保存数据ID','操作失败','结性⼼率','openTakeAImage','FFFF','血压私人定制设置','yesterday','lowVoltage','getMediaSwitchStatus','timeHexTo10','E02','VPReadElectricQuantityCommand','开始查找','Female','sendGetCustomDialInfo','⼼室颤动','VPCustomDialScreenType172_320Square_QFN','minute','search','VPCustomDialScreenType240_284Square_JL_Apple','onBLEConnectionStateChange','cholesterol','veepooSendFemaleInstructionsData','deviceControl','房性早博','wearNotPass','DeviceRespiratoryRate','parsesTypeEqualTo1','9687','scale16ToScale10','监听ecg特征成功=>','5155','crc','timeButtomPosition','DeviceReadPreciseSleep','5286','ohos','utlis.littleEndToHex16(value.slice(1,\x203))=>','readSuccessful\x20','age','maxFahrenheit','nothisFeature','sendBloodComponentCheckData','getTakeAPicture','5375','charging','unitLength','VPSettingDingTalk','startTransfer','getSendWeatherInfoData','#8B00FF','getValSwitch','读取运动数据','ab2hex','has','VPCustomDialScreenType480_480Circle_JL','veepooSendReadTestSeavDataIdData','sendSettingContactPersonData','dialShape','getFullYear','378146KEIXmP','deleteAlarmClockData','getA1PwdVerifyDeviceId','VPSettingAutomaticHRVTest','getBTState','hex16Length2','threeDaysAgo','ecgManualTest','read','sendReadPreciseSleep','5385','name','VPCustomDialScreenType416_416Circle_JL','veepooSendECGmeasureStopData','successful','next','alarmHexTo8Bit','getMinutes','message','todayData','VPDeviceAtLowVoltage','deviceDialNotifyService','sliceB2Data','连接超时','writeData','parsesPackage3','MessageDecode','module','xvalue','FEE7','reverse','parsesA0','weatherType3','weatherType2','sendAndroidCodeData','VPCustomDialScreenType240_240Circle_JL_Apple','receiveAppTestAdcBigBlock','veepooWeiXinSDKWriteBLECharacteristicValueManager','sqrt','scientificSleep','1911','暂无此功能','fifth_line','includes','F0030003-0451-4000-B000-000000000000','sendMultipleLeadsData','UI服务通道=》','ecg多导测量失败','veepooSendSixBloodGlucoseCalibrateValueData','mergeMultipleArrays','HRV_LorenzDetection','from','bodyCompositionTestParses','new','publicOxygenFuction','getA1PwdVerifyVersion','sendSyncTime','5096','month','productTPVersion','rrLorenzPointInfoList.size\x20==\x20','3602','sendDisconnectBluetoothData','非法天数','wristbandWearStatus','write\x20Service:','删除联系人','体温自动检测','sendFemaleInstructionsData','VPDeviceWristbandStatus','veepooSendResetData','weatherStatus','1912','yvalue','platform','symbol=>','sendReadUniversalBloodPressureData','veepooSendGetCustomDialInfo','pageSize','Thursday','setupSuccessful','value','testNoneVerifyFeature','stringToUtf8Array','yesHealthWarn','array1','type','deviceWriteService','readFailed','weatherType4','VPDeviceWrongfulValue','sendAutoTestSwitchData','VPDeviceYesterday','房室节期前收缩','veepooSendReadWeatherForecastData','bodyCompositionContentDataParses','publicFemaleFuction','sendSixBloodGlucoseCalibrateValueData','同步天气信息','fill','VPCustomDialScreenType410_502Square_JL','读取日常数据','createBLEConnection','veepooSendReadCustomBackgroundDail','sendReadDeviceUnitSettingData','监听ecg特征失败err=>','properties','getMetricEnglishSystem','5322','pwv','littleEndToHex16','getHourSystem','getA1PwdVerifyMac','publicDefine','VPSettingAutomaticBPTest','R\x20on\x20T\x202\x20型室性早搏','ffff','obtainHandleHeartArray','setUint8','VPCustomDialScreenType320_386Square_JL_Apple','testYesVerifyFeature','hex16','VPSettingMusicControl','veepooSendAndroidCodeData','sex','dateDataParses','屏幕常亮时长设置','hexTo10StepCalorieDistance','获取生产信息','veepooStartTransfer','calibration','5285','veepooSendBodyCompositionIdReadData','5531','VPCustomDialScreenType410_502Square_JL_Apple','设置自定义照片表盘','sendHealthToastFeatureData','3018','forEach','sendAndroidCodeNotStorageMobilePhone','charCodeAt','parsesPackage2','mainAspectsToHex16','afterBreakfast','veepooSendLightUpTimeData','length','久坐功能提醒','房颤——细','身体成分检测设备主动上报','startDataTransfer','VPCustomDialScreenType240_292Square_JL','endTime','VPDeviceReadStepDay','isWhitelistedVersion','veepooReadStepNumberData','scale10ToSCale16','arrayTime','VPCustomDialScreenType368_448Square_JL_Apple','020202','initWithResult','hexTo16','808080','原始数据','veepooSendReadContactPersonData','bloodGlucoseUnit','deviceChipStatus','关闭心率报警功能','uricAcidUnit','sleepDay','value=心率测量指令=>','pow','HrvFuction','array','0001','veepooSendDisconnectBluetoothData','initSimilarity','pttSwitch','select_y','2\x20型室性早搏','atLowVoltage','english','sendAndroidCodeStorageMobilePhone','9227','维亿魄\x20蓝牙状态=>','content=>','veepooSendBloodOxygenControlData','stepCount','binaryToDecimal','设置文字闹钟','Tuesday','结束传输\x20时间==》','手动测量ECG主动上报','VPSettingOtherConnected2','noThisFeature','VPCustomDialScreenType240_286Square_QFN','veepooSendPrivateBloodPressureData','veepooSendSetupSedentaryToastTimeData','血液成分校准','queue','9282','RetrieveDataByIdParses','9320','VPCustomDialScreenType240_240Square_JL','deviceChip','veepooBle','veepooSendPhoneLookBraceletData','sending','VPCustomDialScreenType360_360Circle_JL_Apple','身体成分读取测量保存的数据ID','wholeDaySimulate','VPSettingOxygenLowerRemind','veepooSendSetAlarmClockData','dataId','deviceNotifyService','读取运动数据的CRC','血糖测量','sendBloodComponentData','HealthToastFeatureType','getBLEDeviceCharacteristics','processSliceData','decimalToBinary','heartRateParses','VPSettingAutomaticPPGTest','degreeCelsius','5244','everydayData','I\x20度传导阻滞','心率测量','onBLECharacteristicValueChange','pushEnglish','setColorTh','VPSettingFaceBook','sendStorageSMSPush','R\x20on\x20T\x201\x20型室性早搏','merageEcgArray','readAlarmClockData','booldPressureState','unshift','开始传输\x20时间==》','电池电量读取','ECG\x20手动测量保存数据ID','serverId','round','======================================','VPCustomDialScreenType320_386Square_JL','veepooSendMultipleLeadsData','format','minHeartRate','setAlarmClockData','bloodComponents','date','babySex','error','ProgressSecondParses','characteristics','VPDeviceBeMeasuringBloodPressure','ultravioletLight','ecg','5387','stopBluetoothDevicesDiscovery','sleepDataParses','VPSettingBaseFunctionSwitchTypePackage2','addGlobalDayValue','bloodPressureLow','veepooSendDeleteContactPersonData','II\x20度传导阻滞','timeTopPosition','fahrenheit','version','VPCustomDialScreenType240_286Square_JL_Apple','精准睡眠数据','bloodPressureHigh','addr','VPSettingSearchPhoneInterFace','bleDevice','ecg测量','VPDeviceStepCalorieDistanceDay','veepooSendECGmeasureStartData','request','Luoentz_Class','timeColor','getLanguageNumber','Data_ConvertForTI4950','getA1PwdVerifyFindPhone','binProtocol','MetricEnglishPackage2','open','divideAndRound','#FF0000','180D','publiEcgDisearseFuction','fahrenheitToCelsius','getLorentzScatterPlotSimilarity','bloodOxygenParses','mtu','usable','设置不成功','停止查找','__esModule','binToHex','5523','multipleLeadsDataParses','getA1PwdVerifyAck','华氏度','weatherType5','https://www.vphband.com:9001/api/system/getthemespage','movementData','veepooSendHeartRateTestSwitch','128320kccRgr','bodyTemperature','ecg多导每秒进度信息','darkSkin','select_x','unitBloodSugar','BTFeature','veepooReadElectricQuantity','sendReadTestSeavDataIdData','autoBodyTemperatureData','VPSettingVoiceAnnouncements','读取自定义照片表盘','DeviceReadElectricQuantity','VPDeviceToday','5272','veepooSendANCSSwitchControlData','VPSettingOtherTikTok','scope.bluetooth','F0030002-0451-4000-B000-000000000000','stopBreath','parsesB8Info','读取市场表盘信息','StreamController','parsesA2','notifyCharacteristicId','languages\x2012','sendBodyCompositionTestData','veepooSendFindYourPhoneData','WeatherForecast','主动上报运动数据的CRC','parsesPackage1','VPDeviceBeMeasuringBloodOxygen','wholeDayHRV','右束⽀传导阻滞','Data_ConvertForG01','getFemaleInstructionsData','theOld','VPSettingSnapchat','btStateDisConnect','洛伦兹相似度','notifyBLECharacteristicValueChange','III\x20度传导阻滞','读取ui风格','VPCustomDialScreenType240_295Square','VPDevicePower','根据Id获取身体成分数据','publicHrvFuction','dataLength','movementModule','VPCustomDialScreenType320_380Square_JL_Apple','feFilledWith','Wednesday','bloodBreath','VPSettingOtherTelegram','beMeasuringHeartRate','VPSettingWechat','blePasswordCheck','third_line','getSwitchStatus','veepooSendReadThreeDayPreciseSleep','sendWeatherForecastData','receivePTTTestAdcBigBlock','1318368npDcaV','Saturday','veepooSendResettingTheDeviceData','血糖校准模式','intervalTime','5154','find','sendLightUpTimeData','读取实时计步数,卡路里,距离','9238','veepooSendReadMovementPatternD4Data','μmol/L','beMeasuringFatigue','veepooSendReadAllDayBloodOxygenData','hour','9842','sendBodyCompositionIdReadData','exports','concat','map','write','ecgTestType2Parses','VPCustomDialScreenType240_240Circle','p_average_results','contactPersonData','veepooSendReadPreciseSleep','sosId','VPCustomDialScreenType240_280Square_QFN','女性经期','deviceLowVoltage','truncateString','floor','veepooSendReadUIStyleData','读取全天血氧','setupSedentaryToastStatus','更改发送状态','sendResetData','DeviceWeChatMovement','mg/dl','BT功能','VPCustomDialScreenType240_296Square_JL_Apple','bloodPressure','sendTakeAPictureData','5520','nameSMS','DeviceIsPercent','deviceLevel','menstruationTime','同步失败','failure','veepooWeiXinSDKWriteBLECharacteristicValueLengthManager','ECG根据ID获取手动测量数据','开启运动模式','prototype','ecgTestSuccessfulParses','F0020003-0451-4000-B000-000000000000','ECGmeasure','5384','veepooSendSettingContactPersonData','totalQuery','MergingArrays','getLorentzScatterPlotStarIndex','getConnectedBluetoothDevices','deviceDialWriteService','bleDate','A1PwdVerifyACK','sendReadAllDayBloodOxygenData','apply','menstruationLength','DeviceTakeAImage','RRUtils','veepooSendTakeAPictureData','VPSettingWeChatWork','语言设置','VPCustomDialScreenType466_466Circle_JL','parsesA1','Math.min(rr_len,\x20rr_data_temp.length)===>','VPDeviceTheDayBeforeYesterday','chunkSize','heartRate','VPSettingSkype','0x00','VPSettingQQ','F8F8','198frGCAf','VPCustomDialScreenType320_360Square_JL','veepooDeviceVersion','bloodOxygenOnce','veepooReadAutoTemperatureMeasurementData','VPSettingBaseFunctionSwitchTypePackage1','readMovementModuleParses','VPSettingExercise','VPDeviceBeMeasuringAuto','writeDataLength','readPackage','mmol/L','DeviceReadDailyData','ecg多导测量成功','VPSettingInstagram','#FFA500','恢复出厂设置','ylabel','convertToMvWithValue','scope.address','VPSettingGMail','con','VPCustomDialScreenType172_320Square_JL','year','beforeBreakfast','acquiesce','log','otherFeatures','applyNotificationSwitch','非法值','getSeconds','advertisData','getValueParses','publicOxygenAllDataFuction','alarmId','VPDeviceTemperatureMeasurementAck','getSendValue','second_line','veepooSendHealthToastFeatureData','VPSettingOthers','rrLorenzConvertWithColor','VPCustomDialScreenType240_296Square_JL','weatherByDay','notPassTheWearing','startTime','deviceBusy','sendSetUIStyleData','读取血压','close','VPCustomDialScreenType320_380Square_QFN','测量失败','SubContentPrases','VPCustomDialScreenType360_360Circle_QFN','receivePTTTestAdcBytes','sendMessagePush','p_waveforms_info','读取设备表盘可写入长度','VPCustomDialScreenType228_460Square_JL','VPSettingAutomaticHRTest','height','data','convertNumber','VPCustomDialScreenType368_448Square_JL','veepooSendBloodComponentCheckData','contactPersonDataParses','1796608xgWRlf','getANCSSwitchControl','VPSettingCall','deviceDialService','BloodComponent','pulseRateParses','toId','sendReadAlarmClockData','VPCustomDialScreenType240_280Square_JL','byteLength','设备更改闹钟开关','早期\x201\x20型室性早搏','leadThrough','VPSettingLedGrade','sendReadMovementPatternD4Data','1\x20型室性早搏','bodyTemperatureDataFunction','ios','deviceId','updateProgressBar','receiveAppTestAdcBytes','beforeDinner','室上性⼼动过速','#00FF00','手环功能汇总','package','veepooSendBodyCompositionTestStopData','RR数据必须超过2000个','convertToPercentage','passwordVerify','VPCustomDialScreenType240_280Square','heart','设置失败,没有此功能','deviceService','PTT数据','VPCustomDialScreenType200_320Square_JL','veepooSendUnitSettingData','onBluetoothDeviceFound','status','sendReadPPTTestData','respiratoryRateParses','F0030001-0451-4000-B000-000000000000','verifyNotPass','parses2IntData','sendReadDailyData','MovementPatternDataType','deviceType','ecgMultipleWriteService','theDayBeforeYesterday','sendReadWeatherForecastData','VPCustomDialScreenType466_466Circle_JL_Apple','call','setStorageSync','getAlarmCrc16','DeviceBloodOxygen','pttTestModule','VPSettingMetric','Reset','add','sendBloodGlucoseCalibrateModuleData','sendDeleteContactPersonData','navigateBack','syncTimeParses','DeviceRaiseHandFeature','getDeviceControlValue','VPSettingTimeFormat','5097','luoentz_class','bloodPressureRES','5386','设备添加了一条闹钟','day','getA6ContentData','xlabel','successfulVerification','VPCustomDialScreenType240_286Square_JL','uuid','读取手环天气信息','Features3','开启心率报警功能','switch','5153','设置天气基本信息','veepooSendReadDailyData','多源性室性早搏','Cannot\x20call\x20a\x20class\x20as\x20a\x20function','血糖6个校准模式','读取联系人','beMeasuringBodyTemperature','DeviceHRVFeature','veepooSendBloodGlucoseMeasurementData','beforeLunch','getBodyIdData','getA1PwdVerifyRaiseHand','getSystemInfo','parseSleepLine','veepooSendSettingWeatherForecastInfo','心率报警功能','bloodLipidUnit','stop','ecg波形数据','select_len','getItemBloodGlucoseValue','9832','VPDeviceStartRealTimeStep','veepooSendHeartRateAlarmIntervalData','VPSettingSina','13239lmDbhv','DeviceWeatherFeature','veepooSendReadAlarmClockData','VPSettingKakaoTalk','settingContactPersonSend','start','noThisFunction','设备删除了一条闹钟','DevicePushNotificationSwitch','time','enter','F0020002-0451-4000-B000-000000000000','veepooSendDeleteAlarmClockData','VPSettingJingYou','rawDataStatus','getDate','VPCustomDialScreenType240_284Square_QFN','VPSettingMessenger','摄氏度','公英制新增开关','devices','VPCustomDialScreenType240_292Square_JL_Apple','VPDeviceBeMeasuringFatigue','noAverage','updateStatus','secondIndex','关闭血液单项测量','#00FFFF','split','luoentz_pro','number','value==>','MultipleLeads','phone','parsesA3','sendAppStartMovementPatternD5Data','sendBloodGlucoseMeasurementData','openIOSTakeAImage','sendReadStepCalorieDistanceData','VPCustomDialScreenType240_295Square_QFN','setPlotControl','alarmClockData','VPCustomDialScreenType390_450Square_JL','startRealTimeStep','today','veepooSendSetUIStyleData','push','5212','startBluetoothDevicesDiscovery','vison','services','VPSettingMessageSwitchTypePackage2','Features2','sendAutoTemperatureMeasurementReadData','getBluetoothDevices','getHours','veepooSendTemperatureMeasurementSwitch','yes','btStateAdvertising','veepooSendBloodPressurePrivateData','洛伦兹散点图','bloodGlucoseValue','同步手环时间','alarmRepeat','bloodPressureParses','getA5ContentData','⼆联律','bloodGlucose','join','洛伦兹星级','veepooSendBloodComponentData','serviceId','MetricEnglishPackage1','getLEDGearPosition','设备编辑闹钟','getSendSixBloodGlucoseValue','1.28.7','writeBLECharacteristicValue','VPSettingMessageSwitchTypePackage1','language','stepCountParses','VPCustomDialScreenType080_160Square_QFN','first_line','veepooSendSyncTime','beMeasuringBloodOxygen','VPSettingSMS','authSetting','android','mergeSubContentData','342xjodzA','btStateConnected','Sunday','updateFalsh','fouth_line'];a0_0x205e=function(){return _0x442fbb;};return a0_0x205e();}(function(_0x4a31f2,_0x2e1e0c){var _0x67cb4f=a0_0x1b9c,_0x3fd499=_0x4a31f2();while(!![]){try{var _0x2eb7fc=-parseInt(_0x67cb4f(0x19d))/0x1+-parseInt(_0x67cb4f(0x363))/0x2*(parseInt(_0x67cb4f(0x40f))/0x3)+parseInt(_0x67cb4f(0x3a4))/0x4+parseInt(_0x67cb4f(0x47c))/0x5+-parseInt(_0x67cb4f(0x30f))/0x6+-parseInt(_0x67cb4f(0x475))/0x7+-parseInt(_0x67cb4f(0x2d1))/0x8*(-parseInt(_0x67cb4f(0x468))/0x9);if(_0x2eb7fc===_0x2e1e0c)break;else _0x3fd499['push'](_0x3fd499['shift']());}catch(_0x35c5af){_0x3fd499['push'](_0x3fd499['shift']());}}}(a0_0x205e,0x40643),((()=>{'use strict';var _0x29f077=a0_0x1b9c;var _0x2e19fb={0x188:(_0x69fd0a,_0x2681f4)=>{var _0x23c9b5=a0_0x1b9c;_0x2681f4[_0x23c9b5(0x2c7)]=!0x0,(_0x2681f4[_0x23c9b5(0x2ef)]=function(_0x380fc0){return{'bloodPressureType':_0x380fc0[0x0],'drinkingAlcoholType':_0x380fc0[0x1],'healthTipsType':_0x380fc0[0x2],'skinColorType':_0x380fc0[0x3],'WechatCampaignType':_0x380fc0[0x4],'cameraType':_0x380fc0[0x5],'fatigueType':_0x380fc0[0x6],'bloodOxygenTyep':_0x380fc0[0x7],'tipPackType':_0x380fc0[0x8],'heartRateAlarmType':_0x380fc0[0x9],'brightScreenType':_0x380fc0[0xa],'femaleType':_0x380fc0[0xb],'brightnessAdjustmentType':_0x380fc0[0xc],'precisionWatchType':_0x380fc0[0xe],'highEndBloodPressureType':_0x380fc0[0xf],'alarmClockType':_0x380fc0[0x10],'heartRateFunctionType':_0x380fc0[0x11]};},_0x2681f4[_0x23c9b5(0x22a)]=function(_0x1586d9){return{'countdownTimeType':_0x1586d9[0x0],'dailyDataReadDayType':_0x1586d9[0x1],'informationPushType':_0x1586d9[0x2],'HIDFunctionType':_0x1586d9[0x3],'modeOfMotionStorageNumberType':_0x1586d9[0x4],'UIStyleType':_0x1586d9[0x5],'respiratoryRateFunctionType':_0x1586d9[0x6],'HRVType':_0x1586d9[0x7],'weatherFunctionType':_0x1586d9[0x8],'newAgreementUploadType':_0x1586d9[0x9],'screenDurationType':_0x1586d9[0xb],'sleepFlagBitType':_0x1586d9[0xc],'clearDataBitsType':_0x1586d9[0xd],'ECGFunction':_0x1586d9[0xe],'motionModeType':_0x1586d9[0xf],'lowPowerType':_0x1586d9[0x10],'TPType':_0x1586d9[0x11]};},_0x2681f4['parsesPackage3']=function(_0x202ef3){return{'transferProcessType':_0x202ef3[0x0],'dialNumberType':_0x202ef3[0x1],'agingTestType':_0x202ef3[0x2],'addressBookType':_0x202ef3[0x3],'bootPageType':_0x202ef3[0x4],'musicFunctionType':_0x202ef3[0x5],'bodyTemperatureFunctionType':_0x202ef3[0x6],'lookupFunctionType':_0x202ef3[0x7],'AGPFunctionType':_0x202ef3[0x8],'GPSFunctionType':_0x202ef3[0x9],'geomagneticFunctionType':_0x202ef3[0xa],'resetPasswordFunctionType':_0x202ef3[0xb],'testMicrophoneFunctionType':_0x202ef3[0xc],'broadcastingFunctionType':_0x202ef3[0xd],'bloodGlucoseFunction':_0x202ef3[0xe],'chipSeriesType':_0x202ef3[0xf],'metaFunctionType':_0x202ef3[0x10],'pressureFunctionType':_0x202ef3[0x11]};},_0x2681f4[_0x23c9b5(0x4a9)]=function(_0x46c9ab){return{'bloodComponentType\x20':_0x46c9ab[0x0],'bodyCompositionType':_0x46c9ab[0x1],'worldClockType':_0x46c9ab[0x2]};});},0x2f8:(_0x3aa565,_0x140d15,_0x5cd091)=>{var _0x538985=a0_0x1b9c;function _0x148dce(_0x1d7931,_0xed51c8){var _0x36384c=a0_0x1b9c;if(!(_0x1d7931 instanceof _0xed51c8))throw new TypeError(_0x36384c(0x3f9));}_0x140d15[_0x538985(0x2c7)]=!0x0;var _0x37a47d=_0x5cd091(0x1a);_0x140d15['A1PwdVerifyACK']=(function(){var _0x33fcd3=_0x538985;function _0x432295(){_0x148dce(this,_0x432295);}return _0x432295[_0x33fcd3(0x2cb)]=function(_0x4b65a0){var _0x39285a=_0x33fcd3;return 0x0==_0x4b65a0?_0x39285a(0x3ce):0x1==_0x4b65a0?'passTheVerification':0x2==_0x4b65a0?'setupFailed':0x3==_0x4b65a0?_0x39285a(0x1ed):0x4==_0x4b65a0?_0x39285a(0x1f5):0x5==_0x4b65a0?_0x39285a(0x187):0x6==_0x4b65a0?_0x39285a(0x3ee):void 0x0;},_0x432295[_0x33fcd3(0x19f)]=function(_0x54eda1){var _0x5d5f45=_0x33fcd3,_0x5affab=_0x54eda1[0x0]+_0x54eda1[0x1];return _0x37a47d[_0x5d5f45(0x17e)](_0x5affab);},_0x432295[_0x33fcd3(0x1d4)]=function(_0xde30a9,_0x32c6d8){var _0x1896ba=_0x33fcd3,_0x547e81=_0xde30a9[0x0]+'.'+_0xde30a9[0x1]+'.'+_0xde30a9[0x2]+'.'+_0xde30a9[0x3]+'-'+_0x32c6d8;return wx[_0x1896ba(0x3d8)](_0x1896ba(0x365),_0x547e81),_0x547e81;},_0x432295['getA1PwdVerifyMac']=function(_0x4d10e8){var _0x15e9fb=_0x33fcd3;return(_0x4d10e8[0x5]+':'+_0x4d10e8[0x4]+':'+_0x4d10e8[0x3]+':'+_0x4d10e8[0x2]+':'+_0x4d10e8[0x1]+':'+_0x4d10e8[0x0])[_0x15e9fb(0x4ce)]();},_0x432295['getA1PwdVerifyRaiseHand']=function(_0x44a811){var _0x29d9a6=_0x33fcd3;return 0x1==_0x44a811?'open':0x2==_0x44a811?_0x29d9a6(0x25e):void 0x0;},_0x432295[_0x33fcd3(0x2b8)]=function(_0x1f2166){var _0x1c07be=_0x33fcd3;return 0x0==_0x1f2166?_0x1c07be(0x25e):0x1==_0x1f2166?_0x1c07be(0x2bb):0x2==_0x1f2166?_0x1c07be(0x393):void 0x0;},_0x432295[_0x33fcd3(0x4c0)]=function(_0x298fe7){var _0x493f0a=_0x33fcd3;return 0x0==_0x298fe7?'noThisFeature':0x1==_0x298fe7?_0x493f0a(0x2bb):0x2==_0x298fe7?_0x493f0a(0x393):void 0x0;},_0x432295;}()),_0x140d15[_0x538985(0x2d7)]=(function(){var _0x5e6df3=_0x538985;function _0x3a4b00(){_0x148dce(this,_0x3a4b00);}return _0x3a4b00[_0x5e6df3(0x1a1)]=function(_0x1e3e13){var _0xa1bef=_0x5e6df3;return 0x0==_0x1e3e13?_0xa1bef(0x2f7):0x1==_0x1e3e13?_0xa1bef(0x469):0x2==_0x1e3e13?_0xa1bef(0x449):void 0x0;},_0x3a4b00['getBTSwitchStatus']=function(_0x51190f){var _0x45a117=_0x5e6df3;return 0x0==_0x51190f?_0x45a117(0x393):0x1==_0x51190f?_0x45a117(0x2bb):void 0x0;},_0x3a4b00[_0x5e6df3(0x169)]=function(_0x4b05f2){var _0x57a2d0=_0x5e6df3;return 0x0==_0x4b05f2?_0x57a2d0(0x393):0x1==_0x4b05f2?_0x57a2d0(0x2bb):void 0x0;},_0x3a4b00;}()),_0x140d15[_0x538985(0x495)]=(function(){var _0x5244ee=_0x538985;function _0x56d4df(){_0x148dce(this,_0x56d4df);}return _0x56d4df[_0x5244ee(0x208)]=function(_0x518379){var _0x4ce386=_0x5244ee;return 0x0==_0x518379?_0x4ce386(0x25e):0x1==_0x518379?_0x4ce386(0x4ab):0x2==_0x518379?_0x4ce386(0x251):void 0x0;},_0x56d4df['getHourSystem']=function(_0x429de0){var _0x5a4c3e=_0x5244ee;return 0x0==_0x429de0?_0x5a4c3e(0x18a):0x1==_0x429de0?0x18:0x2==_0x429de0?0xc:void 0x0;},_0x56d4df[_0x5244ee(0x30b)]=function(_0x132eb4){return 0x0==_0x132eb4?'noThisFeature':0x1==_0x132eb4?'open':0x2==_0x132eb4?'close':void 0x0;},_0x56d4df[_0x5244ee(0x458)]=function(_0x39d227){var _0x341553=_0x5244ee;return 0x0==_0x39d227?'noThisFeature':0x1==_0x39d227?'normal':0x2==_0x39d227?_0x341553(0x2d4):void 0x0;},_0x56d4df[_0x5244ee(0x2d2)]=function(_0x1afe19){var _0x1f94ac=_0x5244ee;return 0x0==_0x1afe19?_0x1f94ac(0x25e):0x1==_0x1afe19?'degreeCelsius':0x2==_0x1afe19?_0x1f94ac(0x2a8):void 0x0;},_0x56d4df[_0x5244ee(0x241)]=function(_0x5c8290){var _0x3c840e=_0x5244ee;return 0x0==_0x5c8290?_0x3c840e(0x25e):0x1==_0x5c8290?'mmol/L':0x2==_0x5c8290?'mg/dl':void 0x0;},_0x56d4df[_0x5244ee(0x244)]=function(_0x1b97e4){var _0x590634=_0x5244ee;return 0x0==_0x1b97e4?_0x590634(0x25e):0x1==_0x1b97e4?_0x590634(0x31a):0x2==_0x1b97e4?_0x590634(0x335):void 0x0;},_0x56d4df[_0x5244ee(0x406)]=function(_0x1f5c14){var _0x2bb5b6=_0x5244ee;return 0x0==_0x1f5c14?_0x2bb5b6(0x25e):0x1==_0x1f5c14?_0x2bb5b6(0x36e):0x2==_0x1f5c14?_0x2bb5b6(0x335):void 0x0;},_0x56d4df;}()),_0x140d15[_0x538985(0x417)]=(function(){var _0x58be8c=_0x538985;function _0x2ce477(){_0x148dce(this,_0x2ce477);}return _0x2ce477[_0x58be8c(0x37f)]=function(_0xa52066){var _0x327602=_0x58be8c;return 0x0==_0xa52066?_0x327602(0x25e):0x1==_0xa52066?_0x327602(0x414):0x2==_0xa52066?_0x327602(0x407):void 0x0;},_0x2ce477;}()),_0x140d15['FeatureClassTotal']=(function(){var _0x35a418=_0x538985;function _0x1982dd(){_0x148dce(this,_0x1982dd);}return _0x1982dd['DeviceTippleFeature']=function(_0x55ae68){var _0x443cd6=a0_0x1b9c;return 0x0==_0x55ae68?'noThisFeature':0x1==_0x55ae68?_0x443cd6(0x2f5):0x2==_0x55ae68?_0x443cd6(0x1d2):void 0x0;},_0x1982dd[_0x35a418(0x4cf)]=function(_0x39beb1){var _0xe5029c=_0x35a418;return 0x0==_0x39beb1?_0xe5029c(0x25e):0x1==_0x39beb1?'yesSedentarinessWarn':0x2==_0x39beb1?_0xe5029c(0x1f1):void 0x0;},_0x1982dd[_0x35a418(0x334)]=function(_0x11663c){var _0x169fd8=_0x35a418;return 0x0==_0x11663c?_0x169fd8(0x25e):0x1==_0x11663c?_0x169fd8(0x448):0x2==_0x11663c?'yesJerry':void 0x0;},_0x1982dd[_0x35a418(0x354)]=function(_0x3cf5e0){var _0x3713c2=_0x35a418;return 0x0==_0x3cf5e0?_0x3713c2(0x25e):0x1==_0x3cf5e0?_0x3713c2(0x164):0x2==_0x3cf5e0?_0x3713c2(0x434):void 0x0;},_0x1982dd[_0x35a418(0x3da)]=function(_0x2a144c){var _0xafc02f=_0x35a418;return 0x0==_0x2a144c?'noThisFeature':0x1==_0x2a144c?_0xafc02f(0x1ef):0x2==_0x2a144c?_0xafc02f(0x215):0x3==_0x2a144c?'bloodOxygenHandle':0x4==_0x2a144c?_0xafc02f(0x2e4):0x5==_0x2a144c?'KHBloodOxygen':0x6==_0x2a144c?'wholeDayBloodOxygen':0x7==_0x2a144c?_0xafc02f(0x26e):_0x2a144c==parseInt(0xe0,0x10)?_0xafc02f(0x366):_0x2a144c==parseInt(0xfd,0x10)?_0xafc02f(0x48b):_0x2a144c==parseInt(0xfe,0x10)?_0xafc02f(0x4ac):void 0x0;},_0x1982dd['DeviceFemaleProject']=function(_0x4da7ed){var _0xdd3aac=_0x35a418;return 0x0==_0x4da7ed?_0xdd3aac(0x25e):0x1==_0x4da7ed?_0xdd3aac(0x491):0x2==_0x4da7ed?_0xdd3aac(0x282):0x3==_0x4da7ed?_0xdd3aac(0x2ea):void 0x0;},_0x1982dd['DeviceHeartRateFeature']=function(_0x13ec37){var _0x2fc7b0=_0x35a418;return 0x0==_0x13ec37?_0x2fc7b0(0x37c):0x1==_0x13ec37?_0x2fc7b0(0x25e):0x2==_0x13ec37?'G':0x3==_0x13ec37?_0x2fc7b0(0x226):0x4==_0x13ec37?'1182':0x5==_0x13ec37?_0x2fc7b0(0x16b):0x6==_0x13ec37?'TI4950':void 0x0;},_0x1982dd[_0x35a418(0x3e3)]=function(_0x37a3e7){var _0x127cb9=_0x35a418;return 0x0==_0x37a3e7?'showtheOld':0x1==_0x37a3e7?_0x127cb9(0x448):0x2==_0x37a3e7?_0x127cb9(0x25e):void 0x0;},_0x1982dd[_0x35a418(0x4c5)]=function(_0x229c44){var _0x402fce=_0x35a418;return 0x0==_0x229c44?_0x402fce(0x25e):_0x229c44;},_0x1982dd[_0x35a418(0x17b)]=function(_0x2380a1){var _0x37f6ee=_0x35a418;return 0x0==_0x2380a1?_0x37f6ee(0x25e):0x1==_0x2380a1?_0x37f6ee(0x305):0x2==_0x2380a1?_0x37f6ee(0x29e):void 0x0;},_0x1982dd[_0x35a418(0x410)]=function(_0x51265a){var _0x9bb17e=_0x35a418;return 0x0==_0x51265a?_0x9bb17e(0x25e):0x1==_0x51265a?_0x9bb17e(0x46f):0x2==_0x51265a?_0x9bb17e(0x1be):0x3==_0x51265a?_0x9bb17e(0x1bd):0x4==_0x51265a?_0x9bb17e(0x1f6):0x5==_0x51265a?_0x9bb17e(0x2cd):0x6==_0x51265a?'weatherType6':void 0x0;},_0x1982dd[_0x35a418(0x3fd)]=function(_0x5446a1){var _0x3b21e4=_0x35a418;return 0x0==_0x5446a1?_0x3b21e4(0x25e):0x1==_0x5446a1?'bloodOxygen':0x2==_0x5446a1?_0x3b21e4(0x29e):0x3==_0x5446a1?_0x3b21e4(0x2f1):0x4==_0x5446a1?_0x3b21e4(0x1da):void 0x0;},_0x1982dd;}());},0xc1:(_0xf4e3f5,_0x2291b6)=>{var _0x45d474=a0_0x1b9c;_0x2291b6[_0x45d474(0x2c7)]=!0x0,_0x2291b6[_0x45d474(0x23c)]=function(_0x15548f){var _0x198e32=_0x45d474,_0x572945=_0x32c84(_0x15548f);return[{'type':0x1,'starIndex':_0x572945[_0x198e32(0x428)],'code':_0x15548f[_0x198e32(0x388)]},{'type':0x2,'starIndex':_0x572945['threeIndex'],'code':_0x15548f['third_line']},{'type':0x3,'starIndex':_0x572945[_0x198e32(0x4b4)],'code':_0x15548f[_0x198e32(0x46c)]},{'type':0x4,'starIndex':_0x572945['fiveIndex'],'code':_0x15548f[_0x198e32(0x1c7)]}];};var _0x32c84=function(_0x524bd6){var _0x55bcc3=_0x45d474;return{'secondIndex':0xb==_0x524bd6['second_line']?0x5:0xc==_0x524bd6[_0x55bcc3(0x388)]?0x4:0xd==_0x524bd6['second_line']||0x15==_0x524bd6[_0x55bcc3(0x388)]||0x16==_0x524bd6[_0x55bcc3(0x388)]?0x3:0x17==_0x524bd6['second_line']||0x1f==_0x524bd6['second_line']?0x2:0x20==_0x524bd6[_0x55bcc3(0x388)]||0x21==_0x524bd6[_0x55bcc3(0x388)]||0x22==_0x524bd6[_0x55bcc3(0x388)]||0x23==_0x524bd6[_0x55bcc3(0x388)]?0x1:0x0,'threeIndex':0xb==_0x524bd6['third_line']?0x5:0x16==_0x524bd6[_0x55bcc3(0x30a)]?0x4:0xc==_0x524bd6['third_line']||0x15==_0x524bd6[_0x55bcc3(0x30a)]||0xd==_0x524bd6[_0x55bcc3(0x30a)]?0x3:0x1f==_0x524bd6[_0x55bcc3(0x30a)]||0x20==_0x524bd6[_0x55bcc3(0x30a)]?0x2:0x17==_0x524bd6[_0x55bcc3(0x30a)]||0xe==_0x524bd6[_0x55bcc3(0x30a)]||0x22==_0x524bd6['third_line']||0x21==_0x524bd6[_0x55bcc3(0x30a)]?0x1:0x0,'fourIndex':0xf==_0x524bd6[_0x55bcc3(0x46c)]?0x5:0xe==_0x524bd6[_0x55bcc3(0x46c)]||0x10==_0x524bd6[_0x55bcc3(0x46c)]?0x4:0xb==_0x524bd6[_0x55bcc3(0x46c)]||0xc==_0x524bd6[_0x55bcc3(0x46c)]||0xd==_0x524bd6[_0x55bcc3(0x46c)]||0x12==_0x524bd6[_0x55bcc3(0x46c)]?0x3:0x11==_0x524bd6[_0x55bcc3(0x46c)]||0x13==_0x524bd6[_0x55bcc3(0x46c)]||0x15==_0x524bd6['fouth_line']?0x2:0x16==_0x524bd6[_0x55bcc3(0x46c)]||0x17==_0x524bd6[_0x55bcc3(0x46c)]||0x1e==_0x524bd6['fouth_line']?0x1:0x0,'fiveIndex':0xb==_0x524bd6[_0x55bcc3(0x1c7)]?0x5:0xc==_0x524bd6['fifth_line']||0xd==_0x524bd6[_0x55bcc3(0x1c7)]||0xe==_0x524bd6[_0x55bcc3(0x1c7)]?0x4:0x15==_0x524bd6[_0x55bcc3(0x1c7)]||0x17==_0x524bd6[_0x55bcc3(0x1c7)]||0x19==_0x524bd6['fifth_line']?0x3:0x16==_0x524bd6[_0x55bcc3(0x1c7)]||0x18==_0x524bd6[_0x55bcc3(0x1c7)]||0x1a==_0x524bd6[_0x55bcc3(0x1c7)]||0x1f==_0x524bd6[_0x55bcc3(0x1c7)]?0x2:0x20==_0x524bd6[_0x55bcc3(0x1c7)]||0x21==_0x524bd6['fifth_line']||0x28==_0x524bd6['fifth_line']?0x1:0x0};};_0x2291b6[_0x45d474(0x24c)]=function(_0x3dc311){};},0x331:(_0x5837b9,_0x3587cf)=>{var _0x1de65d=a0_0x1b9c;_0x3587cf[_0x1de65d(0x2c7)]=!0x0,_0x3587cf[_0x1de65d(0x1cf)]=_0x475146,_0x3587cf[_0x1de65d(0x212)]=_0x521168;var _0x333f58=0x1,_0x58fd8b=0x3840,_0x48fc2c=0x5dc,_0x3614d5=0x14,_0x642ea0=0x14,_0x149320=0x4,_0x2386e1=0x14,_0x223574=0xa,_0x1720de=0x14,_0xc8256e=0x14,_0x4c8dbf=0xe,_0x17c584=0xf,_0x8eef4e=0x14,_0x21b937=0x32,_0x5bade2=0x78,_0x1b7639=0xb4,_0x4e4422=0xbb8,_0x545e32=0x640,_0x144954=0x4b0,_0x3a4bde={'vison':0x0,'first_line':0x0,'second_line':0x0,'third_line':0x0,'fouth_line':0x0,'fifth_line':0x0,'flag':0x0},_0x44d0f5={'xlabel':[],'xvalue':[],'ylabel':[],'yvalue':[]},_0x5ee031={'xlabel':[],'xvalue':[],'ylabel':[],'yvalue':[]},_0x8d91f4={'xlabel':[],'xvalue':[],'ylabel':[],'yvalue':[]},_0xd0cf5f={'xlabel':[],'xvalue':[],'ylabel':[],'yvalue':[]},_0x175497=0x0,_0xb48cc3=0x0;function _0x2eecf4(){var _0x2b1eb6=_0x1de65d;return _0x3a4bde[_0x2b1eb6(0x440)]=_0x333f58,_0x333f58;}function _0xdbff8c(_0x371fa2,_0xc6b1d1){var _0xe5fbf2=0x0,_0x3cea0b=0x0,_0xb1c041=0x0,_0x215ead=0x0;for(_0x3cea0b=0x0;_0x3cea0b<_0xc6b1d1;_0x3cea0b++)0x0!=_0xb48cc3?_0x371fa2[_0x3cea0b]-_0xb48cc3>=0x1&&(0x1==++_0x215ead&&(_0xe5fbf2=_0x371fa2[_0x3cea0b]),_0x371fa2[_0x3cea0b]<_0xe5fbf2&&(_0xe5fbf2=_0x371fa2[_0x3cea0b])):0x0!=_0x371fa2[_0x3cea0b]&&(0x1==++_0xb1c041&&(_0xe5fbf2=_0x371fa2[_0x3cea0b]),_0x371fa2[_0x3cea0b]<_0xe5fbf2&&(_0xe5fbf2=_0x371fa2[_0x3cea0b]));return _0xe5fbf2;}function _0x48d17a(_0xf2a99c,_0x3ead28){var _0x5b2d5a=0x0,_0x4d7484=0x0,_0x3234d8=0x0;for(_0x5b2d5a=0x0;_0x5b2d5a<_0x3ead28;_0x5b2d5a++)0x0!=_0xb48cc3?_0xb48cc3-_0xf2a99c[_0x5b2d5a]>=0x1&&(0x1==++_0x4d7484&&(_0x3234d8=_0xf2a99c[_0x5b2d5a]),_0xf2a99c[_0x5b2d5a]>_0x3234d8&&(_0x3234d8=_0xf2a99c[_0x5b2d5a])):0x0!=_0xf2a99c[_0x5b2d5a]&&(0x1==_0x4d7484&&(_0x3234d8=_0xf2a99c[_0x5b2d5a]),_0xf2a99c[_0x5b2d5a]>_0x3234d8&&(_0x3234d8=_0xf2a99c[_0x5b2d5a]));return _0x3234d8;}function _0x2d5faf(_0xc37bfd,_0x45fefb,_0x1b8430){var _0x1265fd=_0x1de65d,_0x293613=0x0,_0x388838=0x0,_0x427d9b=0x0,_0x4889f6=0x0;for(_0x293613=0x0;_0x293613<_0x1b8430-0x1;_0x293613++)_0x388838=Math[_0x1265fd(0x4f0)](_0xc37bfd[_0x293613]-_0x45fefb[_0x293613]),0x0!=_0x175497?_0x175497-_0x388838>=0x1&&(0x1==++_0x4889f6&&(_0x427d9b=_0x388838),_0x388838>_0x427d9b&&(_0x427d9b=_0x388838)):(0x0==_0x293613&&(_0x427d9b=_0x388838),_0x388838>_0x427d9b&&(_0x427d9b=_0x388838));return _0x427d9b;}function _0x399999(_0x2f5d27,_0x49790f,_0x1a82e3,_0xb0be63,_0x1be897){var _0x50b5c1=_0x1de65d,_0x441e73=0x0,_0x7a5f67=0x0;for(_0x441e73=0x0;_0x441e73<_0x1a82e3-0x1;_0x441e73++)Math[_0x50b5c1(0x4f0)](_0x2f5d27[_0x441e73]-_0x49790f[_0x441e73])===_0xb0be63&&(0x1===_0x1be897?(_0xd0cf5f[_0x50b5c1(0x3ed)][_0x7a5f67]=_0x441e73,_0xd0cf5f[_0x50b5c1(0x1b9)][_0x7a5f67]=_0x2f5d27[_0x441e73],_0xd0cf5f[_0x50b5c1(0x374)][_0x7a5f67]=_0x441e73,_0xd0cf5f[_0x50b5c1(0x1e6)][_0x7a5f67]=_0x49790f[_0x441e73],_0x7a5f67++):0x2===_0x1be897&&(_0x8d91f4[_0x50b5c1(0x3ed)][_0x7a5f67]=_0x441e73,_0x8d91f4['xvalue'][_0x7a5f67]=_0x2f5d27[_0x441e73],_0x8d91f4[_0x50b5c1(0x374)][_0x7a5f67]=_0x441e73,_0x8d91f4[_0x50b5c1(0x1e6)][_0x7a5f67]=_0x49790f[_0x441e73],_0x7a5f67++));return _0x7a5f67;}function _0x3b4472(_0x47df15,_0x48121b,_0x9212f0,_0x2ebdad,_0x53a71e,_0x392334){var _0x418f01=_0x1de65d,_0xe5bc52=0x0,_0x6d7b5=0x0;for(_0xe5bc52=0x0;_0xe5bc52<_0x48121b-0x1;_0xe5bc52++)_0x47df15[_0xe5bc52]===_0x53a71e&&(0x1===_0x392334?(_0x44d0f5['xlabel'][_0x6d7b5]=_0xe5bc52,_0x44d0f5[_0x418f01(0x1b9)][_0x6d7b5]=_0x9212f0[_0xe5bc52],_0x44d0f5[_0x418f01(0x374)][_0x6d7b5]=_0xe5bc52,_0x44d0f5[_0x418f01(0x1e6)][_0x6d7b5]=_0x2ebdad[_0xe5bc52],_0x6d7b5++):0x2===_0x392334&&(_0x5ee031[_0x418f01(0x3ed)][_0x6d7b5]=_0xe5bc52,_0x5ee031[_0x418f01(0x1b9)][_0x6d7b5]=_0x9212f0[_0xe5bc52],_0x5ee031['ylabel'][_0x6d7b5]=_0xe5bc52,_0x5ee031['yvalue'][_0x6d7b5]=_0x2ebdad[_0xe5bc52],_0x6d7b5++));return _0x6d7b5;}function _0x3880e8(_0x5146c7,_0x29a767){var _0x8cc608=_0x1de65d,_0x1898f3=0x0,_0x55435f=0x0,_0x56a0f9=0x0,_0x37f290=0x0;if(0x1==_0x29a767){for(_0x1898f3=0x0;_0x1898f3<_0x5146c7;_0x1898f3++)_0x44d0f5[_0x8cc608(0x3ed)][_0x1898f3]>0x0&&(_0x56a0f9+=_0x44d0f5['xvalue'][_0x1898f3],_0x37f290+=_0x44d0f5[_0x8cc608(0x1e6)][_0x1898f3],_0x55435f++);return _0x55435f>0x0&&(_0x44d0f5[_0x8cc608(0x1b9)][0x0]=Math[_0x8cc608(0x32e)](_0x56a0f9/_0x55435f),_0x44d0f5[_0x8cc608(0x1e6)][0x0]=Math[_0x8cc608(0x32e)](_0x37f290/_0x55435f)),_0x44d0f5;}if(0x2==_0x29a767){for(_0x1898f3=0x0;_0x1898f3<_0x5146c7;_0x1898f3++)_0x5ee031[_0x8cc608(0x3ed)][_0x1898f3]>0x0&&(_0x56a0f9+=_0x5ee031[_0x8cc608(0x1b9)][_0x1898f3],_0x37f290+=_0x5ee031[_0x8cc608(0x1e6)][_0x1898f3],_0x55435f++);return _0x55435f>0x0&&(_0x5ee031[_0x8cc608(0x1b9)][0x0]=Math['floor'](_0x56a0f9/_0x55435f),_0x5ee031['yvalue'][0x0]=Math['floor'](_0x37f290/_0x55435f)),_0x5ee031;}if(0x3==_0x29a767){for(_0x1898f3=0x0;_0x1898f3<_0x5146c7;_0x1898f3++)_0x8d91f4[_0x8cc608(0x3ed)][_0x1898f3]>0x0&&(_0x56a0f9+=_0x8d91f4[_0x8cc608(0x1b9)][_0x1898f3],_0x37f290+=_0x8d91f4[_0x8cc608(0x1e6)][_0x1898f3],_0x55435f++);return _0x55435f>0x0&&(_0x8d91f4['xvalue'][0x0]=Math[_0x8cc608(0x32e)](_0x56a0f9/_0x55435f),_0x8d91f4[_0x8cc608(0x1e6)][0x0]=Math[_0x8cc608(0x32e)](_0x37f290/_0x55435f)),_0x8d91f4;}if(0x4==_0x29a767){for(_0x1898f3=0x0;_0x1898f3<_0x5146c7;_0x1898f3++)_0xd0cf5f[_0x8cc608(0x3ed)][_0x1898f3]>0x0&&(_0x56a0f9+=_0xd0cf5f[_0x8cc608(0x1b9)][_0x1898f3],_0x37f290+=_0xd0cf5f[_0x8cc608(0x1e6)][_0x1898f3],_0x55435f++);return _0x55435f>0x0&&(_0xd0cf5f[_0x8cc608(0x1b9)][0x0]=Math['floor'](_0x56a0f9/_0x55435f),_0xd0cf5f[_0x8cc608(0x1e6)][0x0]=Math[_0x8cc608(0x32e)](_0x37f290/_0x55435f)),_0x8d91f4;}return _0x55435f;}function _0x1d0038(){_0x3a4bde={'vison':0x0,'first_line':0x0,'second_line':0x0,'third_line':0x0,'fouth_line':0x0,'fifth_line':0x0,'flag':0x0},_0x44d0f5={'xlabel':[],'xvalue':[],'ylabel':[],'yvalue':[]},_0x5ee031={'xlabel':[],'xvalue':[],'ylabel':[],'yvalue':[]},_0x8d91f4={'xlabel':[],'xvalue':[],'ylabel':[],'yvalue':[]},_0xd0cf5f={'xlabel':[],'xvalue':[],'ylabel':[],'yvalue':[]};}function _0x475146(_0x535223,_0xbb2579){var _0x5c02d5=_0x1de65d,_0x267e0d=0x0,_0x51234a=0x0,_0x532aa3=0x0,_0xbc800=0x0,_0x14704a=0x0,_0x3492dd=0x0,_0x4eefca=0x0,_0x24a26e=0x0,_0x60419c=0x0,_0x348751=0x0,_0x27391a=0x0,_0x208dfb=0x0,_0x584377=0x0,_0x1352c5=0x0,_0x1d5d56=0x0,_0x599e43=0x0,_0xa20d49=0x0,_0x1429e8=0x0,_0x182340=0x0,_0x2e0f36=0x0,_0x306c91=0x0,_0x429881=0x0,_0x32479a=0x0,_0x59152b=0x0,_0x21989f=0x0,_0x2fbda6=0x0,_0x3adcde=0x0,_0x898cad=0x0,_0x4759f4=0x0,_0x2bae9e=0x0,_0x11f06c=0x0,_0x3ade54=0x0,_0x401246=0x0,_0x1a8ab7=0x0,_0x5964b1=0x0,_0x416faf=new Array(_0x58fd8b-0x1)[_0x5c02d5(0x200)](0x0),_0x10c3d9=new Array(_0x58fd8b-0x1)['fill'](0x0),_0x196ed0=new Array(_0x58fd8b-0x1)[_0x5c02d5(0x200)](0x0),_0xef026b=new Array(_0x58fd8b-0x1)[_0x5c02d5(0x200)](0x0),_0x24f909=new Array(_0x58fd8b-0x1)['fill'](0x0),_0x18125e=new Array(_0x58fd8b-0x1)[_0x5c02d5(0x200)](0x0),_0x2fa1b3=new Array(_0x58fd8b-0x1)[_0x5c02d5(0x200)](0x0);if(_0x1d0038(),_0x2eecf4(),_0xbb2579<_0x48fc2c)return _0x3a4bde[_0x5c02d5(0x461)]=0x0,_0x3a4bde['second_line']=0x0,_0x3a4bde['third_line']=0x0,_0x3a4bde[_0x5c02d5(0x46c)]=0x0,_0x3a4bde['fifth_line']=0x0,_0x3a4bde;for(_0x3a4bde['first_line']=0x1,_0x532aa3=0x0;_0x532aa3<_0xbb2579-0x1;_0x532aa3++)(_0x5964b1=Math[_0x5c02d5(0x4f0)](_0x535223[_0x532aa3]-_0x535223[_0x532aa3+0x1]))<=_0x3614d5&&(_0x24f909[_0x532aa3]=_0x535223[_0x532aa3],_0x18125e[_0x532aa3]=_0x535223[_0x532aa3+0x1]),_0x535223[_0x532aa3]<_0x535223[_0x532aa3+0x1]?(_0x416faf[_0x532aa3]=_0x535223[_0x532aa3],_0x10c3d9[_0x532aa3]=_0x535223[_0x532aa3+0x1]):_0x535223[_0x532aa3]>_0x535223[_0x532aa3+0x1]&&(_0x196ed0[_0x532aa3]=_0x535223[_0x532aa3],_0xef026b[_0x532aa3]=_0x535223[_0x532aa3+0x1]),_0x5964b1<=_0x8eef4e?_0x1d5d56++:_0x5964b1<=_0x21b937?_0x599e43++:_0x5964b1<=_0x5bade2?_0xa20d49++:_0x5964b1<=_0x1b7639?_0x1429e8++:_0x182340++,(_0x21989f=_0x535223[_0x532aa3]+_0x535223[_0x532aa3+0x1])<=_0x4e4422&&_0x21989f>_0x545e32?_0x2fbda6++:_0x21989f<=_0x545e32&&_0x21989f>_0x144954?_0x3adcde++:_0x21989f<=_0x144954?_0x898cad++:_0x4759f4++;for(_0x532aa3=0x0;_0x532aa3<_0xbb2579-0x1;_0x532aa3++)_0x2fa1b3[_0x532aa3]=Math[_0x5c02d5(0x1c3)](_0x24f909[_0x532aa3]*_0x24f909[_0x532aa3]+_0x18125e[_0x532aa3]*_0x18125e[_0x532aa3]);for(;;){for(_0x208dfb++,_0xbc800=_0x3b4472(_0x2fa1b3,_0xbb2579,_0x24f909,_0x18125e,_0x584377=_0xdbff8c(_0x2fa1b3,_0xbb2579),0x1),_0xb48cc3=_0x584377,_0x3880e8(_0xbc800,0x1),_0x532aa3=0x0;_0x532aa3<_0xbb2579-0x1;_0x532aa3++)if(_0x24f909[_0x532aa3]!=_0x44d0f5['xvalue'][0x0]&&_0x18125e[_0x532aa3]!=_0x44d0f5[_0x5c02d5(0x1e6)][0x0]&&(_0x1a8ab7=Math[_0x5c02d5(0x4f0)](_0x24f909[_0x532aa3]-_0x44d0f5['xvalue'][0x0])*Math['abs'](_0x24f909[_0x532aa3]-_0x44d0f5[_0x5c02d5(0x1b9)][0x0])+Math['abs'](_0x18125e[_0x532aa3]-_0x44d0f5[_0x5c02d5(0x1e6)][0x0])*Math[_0x5c02d5(0x4f0)](_0x18125e[_0x532aa3]-_0x44d0f5[_0x5c02d5(0x1e6)][0x0]),(_0x1a8ab7=Math[_0x5c02d5(0x1c3)](_0x1a8ab7))<=_0x642ea0*Math[_0x5c02d5(0x1c3)](0x2)&&++_0x267e0d>=_0x149320)){_0xb48cc3=0x0;break;}if(!(_0x267e0d<_0x149320)){_0x267e0d=0x0,_0xb48cc3=0x0;break;}if(_0x267e0d=0x0,_0x44d0f5={'xvalue':[0x0],'yvalue':[0x0],'ylabel':[0x0],'xlabel':[0x0]},_0x208dfb>=0x1068){_0x208dfb=0x0,_0x267e0d=0x0,_0xb48cc3=0x0;break;}}for(;;){for(_0x208dfb++,_0xbc800=_0x3b4472(_0x2fa1b3,_0xbb2579,_0x24f909,_0x18125e,_0x1352c5=_0x48d17a(_0x2fa1b3,_0xbb2579),0x2),_0xb48cc3=_0x1352c5,_0x3880e8(_0xbc800,0x2),_0x532aa3=0x0;_0x532aa3<_0xbb2579-0x1;_0x532aa3++)if(_0x24f909[_0x532aa3]!=_0x5ee031[_0x5c02d5(0x1b9)][0x0]&&_0x18125e[_0x532aa3]!=_0x5ee031[_0x5c02d5(0x1e6)][0x0]&&(_0x1a8ab7=Math[_0x5c02d5(0x4f0)](_0x24f909[_0x532aa3]-_0x5ee031[_0x5c02d5(0x1b9)][0x0])*Math[_0x5c02d5(0x4f0)](_0x24f909[_0x532aa3]-_0x5ee031[_0x5c02d5(0x1b9)][0x0])+Math['abs'](_0x18125e[_0x532aa3]-_0x5ee031[_0x5c02d5(0x1e6)][0x0])*Math['abs'](_0x18125e[_0x532aa3]-_0x5ee031[_0x5c02d5(0x1e6)][0x0]),(_0x1a8ab7=Math['sqrt'](_0x1a8ab7))<=_0x2386e1*Math[_0x5c02d5(0x1c3)](0x2)&&++_0x51234a>=_0x223574)){_0xb48cc3=0x0;break;}if(!(_0x51234a<_0x223574)){_0x51234a=0x0,_0xb48cc3=0x0;break;}if(_0x51234a=0x0,_0x5ee031={'xlabel':[0x0],'xvalue':[0x0],'ylabel':[0x0],'yvalue':[0x0]},_0x208dfb>=0x1068){_0x208dfb=0x0,_0x51234a=0x0,_0xb48cc3=0x0;break;}}for(_0x208dfb=0x0,(_0x14704a=_0x5ee031[_0x5c02d5(0x1b9)][0x0]-_0x44d0f5['xvalue'][0x0])>0x12c&&_0x14704a<0x258?_0x44d0f5[_0x5c02d5(0x1b9)][0x0]>=0x1f4&&_0x44d0f5[_0x5c02d5(0x1b9)][0x0]<0x2bc?_0x3a4bde[_0x5c02d5(0x388)]=0xb:_0x44d0f5[_0x5c02d5(0x1b9)][0x0]>=0x2bc?_0x3a4bde[_0x5c02d5(0x388)]=0xc:_0x3a4bde[_0x5c02d5(0x388)]=0xd:_0x14704a<=0x12c?_0x44d0f5[_0x5c02d5(0x1b9)][0x0]>=0x1f4&&_0x44d0f5[_0x5c02d5(0x1b9)][0x0]<0x2bc?_0x3a4bde[_0x5c02d5(0x388)]=0x15:_0x44d0f5['xvalue'][0x0]>=0x2bc?_0x3a4bde[_0x5c02d5(0x388)]=0x16:_0x3a4bde[_0x5c02d5(0x388)]=0x17:_0x44d0f5['xvalue'][0x0]>=0x1f4&&_0x44d0f5[_0x5c02d5(0x1b9)][0x0]<0x2bc?_0x3a4bde['second_line']=0x1f:_0x44d0f5[_0x5c02d5(0x1b9)][0x0]>=0x2bc?(_0x3a4bde[_0x5c02d5(0x388)]=0x20,_0x5ee031['xvalue'][0x0]>0x708&&(_0x3a4bde[_0x5c02d5(0x388)]=0x22)):(_0x3a4bde[_0x5c02d5(0x388)]=0x21,_0x44d0f5[_0x5c02d5(0x1b9)][0x0]<0x14a&&(_0x3a4bde['second_line']=0x23));_0x208dfb++,!((_0x24a26e=_0x2d5faf(_0x416faf,_0x10c3d9,_0xbb2579))<0xa);){for(_0xbc800=_0x399999(_0x416faf,_0x10c3d9,_0xbb2579,_0x24a26e,0x2),_0x175497=_0x24a26e,_0x3880e8(_0xbc800,0x3),_0x532aa3=0x0;_0x532aa3<_0xbb2579-0x1;_0x532aa3++)if(_0x416faf[_0x532aa3]!=_0x8d91f4['xvalue'][0x0]&&_0x10c3d9[_0x532aa3]!=_0x8d91f4[_0x5c02d5(0x1e6)][0x0]&&(_0x1a8ab7=Math['abs'](_0x416faf[_0x532aa3]-_0x8d91f4[_0x5c02d5(0x1b9)][0x0])*Math[_0x5c02d5(0x4f0)](_0x416faf[_0x532aa3]-_0x8d91f4['xvalue'][0x0])+Math['abs'](_0x10c3d9[_0x532aa3]-_0x8d91f4[_0x5c02d5(0x1e6)][0x0])*Math[_0x5c02d5(0x4f0)](_0x10c3d9[_0x532aa3]-_0x8d91f4[_0x5c02d5(0x1e6)][0x0]),(_0x1a8ab7=Math[_0x5c02d5(0x1c3)](_0x1a8ab7))<=_0x1720de*Math[_0x5c02d5(0x1c3)](0x2)&&++_0x267e0d>=_0x4c8dbf)){_0x175497=0x0;break;}if(!(_0x267e0d<_0x4c8dbf)){_0x267e0d=0x0,_0x175497=0x0;break;}if(_0x267e0d=0x0,_0x8d91f4={'xlabel':[0x0],'xvalue':[0x0],'ylabel':[0x0],'yvalue':[0x0]},_0x208dfb>=0x1068){_0x208dfb=0x0,_0x267e0d=0x0,_0x175497=0x0;break;}}for(_0x208dfb=0x0;_0x208dfb++,!((_0x60419c=_0x2d5faf(_0x196ed0,_0xef026b,_0xbb2579))<0xa);){for(_0xbc800=_0x399999(_0x196ed0,_0xef026b,_0xbb2579,_0x60419c,0x1),_0x175497=_0x24a26e,_0x3880e8(_0xbc800,0x4),_0x532aa3=0x0;_0x532aa3<_0xbb2579-0x1;_0x532aa3++)if(_0x196ed0[_0x532aa3]!=_0xd0cf5f[_0x5c02d5(0x1b9)][0x0]&&_0x196ed0[_0x532aa3]!=_0xd0cf5f['yvalue'][0x0]&&(_0x1a8ab7=Math['abs'](_0x196ed0[_0x532aa3]-_0xd0cf5f[_0x5c02d5(0x1b9)][0x0])*Math[_0x5c02d5(0x4f0)](_0x196ed0[_0x532aa3]-_0xd0cf5f[_0x5c02d5(0x1b9)][0x0])+Math[_0x5c02d5(0x4f0)](_0xef026b[_0x532aa3]-_0xd0cf5f[_0x5c02d5(0x1e6)][0x0])*Math[_0x5c02d5(0x4f0)](_0xef026b[_0x532aa3]-_0xd0cf5f[_0x5c02d5(0x1e6)][0x0]),(_0x1a8ab7=Math[_0x5c02d5(0x1c3)](_0x1a8ab7))<=_0xc8256e*Math['sqrt'](0x2)&&++_0x267e0d>=_0x4c8dbf)){_0x175497=0x0;break;}if(!(_0x267e0d<_0x4c8dbf)){_0x267e0d=0x0,_0x175497=0x0;break;}if(_0x267e0d=0x0,_0xd0cf5f={'xlabel':[0x0],'xvalue':[0x0],'ylabel':[0x0],'yvalue':[0x0]},_0x208dfb>=0x1068){_0x208dfb=0x0,_0x267e0d=0x0,_0x175497=0x0;break;}}return _0x3492dd=Math['sqrt'](Math[_0x5c02d5(0x247)](_0x8d91f4[_0x5c02d5(0x1b9)][0x0],0x2)+Math[_0x5c02d5(0x247)](_0x8d91f4[_0x5c02d5(0x1e6)][0x0],0x2)),_0x4eefca=Math[_0x5c02d5(0x1c3)](Math[_0x5c02d5(0x247)](_0xd0cf5f[_0x5c02d5(0x1b9)][0x0],0x2)+Math['pow'](_0xd0cf5f[_0x5c02d5(0x1e6)][0x0],0x2)),Math[_0x5c02d5(0x4f0)](_0x3492dd-_0x4eefca)>_0x17c584*Math[_0x5c02d5(0x1c3)](0x2)?_0x60419c>=_0x24a26e?(_0x24a26e=_0x60419c,_0x348751=_0xd0cf5f['xvalue'][0x0]):(_0x60419c=_0x24a26e,_0x348751=_0x8d91f4['xvalue'][0x0]):_0x348751=_0x60419c>=_0x24a26e?_0xd0cf5f[_0x5c02d5(0x1b9)][0x0]:_0x8d91f4[_0x5c02d5(0x1b9)][0x0],(_0x27391a=_0x60419c+_0x24a26e)>0xc8&&_0x27391a<0x1f4?_0x3a4bde[_0x5c02d5(0x30a)]=_0x348751>=0x1f4&&_0x348751<=0x2bc?0x15:_0x348751>=0x2bc?0xb:0x1f:_0x27391a<=0xc8?_0x3a4bde['third_line']=_0x348751>=0x1f4&&_0x348751<=0x2bc?0x16:_0x348751>=0x2bc?0xc:0x20:_0x348751>=0x1f4&&_0x348751<=0x2bc?_0x3a4bde[_0x5c02d5(0x30a)]=0x17:_0x348751>=0x2bc?(_0x3a4bde['third_line']=0xd,_0x348751>0x708&&(_0x3a4bde[_0x5c02d5(0x30a)]=0xe)):(_0x3a4bde[_0x5c02d5(0x30a)]=0x21,_0x348751<0x14a&&(_0x3a4bde[_0x5c02d5(0x30a)]=0x22)),_0xbb2579>0x1&&(_0x2e0f36=_0x1d5d56/(_0xbb2579-0x1),_0x306c91=_0x599e43/(_0xbb2579-0x1),_0x429881=_0xa20d49/(_0xbb2579-0x1),_0x32479a=_0x1429e8/(_0xbb2579-0x1),_0x59152b=_0x182340/(_0xbb2579-0x1),_0x2bae9e=_0x2fbda6/(_0xbb2579-0x1),_0x11f06c=_0x3adcde/(_0xbb2579-0x1),_0x3ade54=_0x898cad/(_0xbb2579-0x1),_0x401246=_0x4759f4/(_0xbb2579-0x1)),_0x3a4bde[_0x5c02d5(0x46c)]=_0x2e0f36+_0x306c91+_0x429881>=0.92?_0x429881>=0.25?_0x2e0f36-_0x306c91>=0.3?0xb:_0x2e0f36-_0x306c91>=0.1?0xc:0xd:_0x429881>=0.08?_0x2e0f36-_0x306c91>=0.4?0xe:_0x2e0f36-_0x306c91>=0.1?0xf:0x10:_0x2e0f36-_0x306c91>=0.3?0x11:_0x2e0f36-_0x306c91>=0.1?0x12:0x13:_0x32479a+_0x59152b>=0.08?_0x32479a>0.04?0x15:_0x59152b>0.06?0x16:0x17:0x1e,_0x3a4bde['fifth_line']=_0x2bae9e+_0x11f06c>0.9?_0x2bae9e>0.8?0xb:_0x2bae9e>=0.6?0xc:_0x2bae9e>=0.5?0xd:0xe:_0x2bae9e+_0x11f06c>0.8?_0x2bae9e>0.7?_0x3ade54>=0.05?0x15:0x16:_0x2bae9e>0.4?_0x3ade54>=0.05?0x17:0x18:_0x3ade54>=0.05?0x19:0x1a:_0x3ade54+_0x401246>=0.2?_0x3ade54>0.15?0x1f:_0x401246>0.15?0x20:0x21:0x28,_0x3a4bde;}function _0x521168(_0x4783ee){var _0x5222b2=_0x1de65d,_0x31f891=[],_0x1014b5=_0x4783ee,_0xf689e5=Array[_0x5222b2(0x4ed)](_0x1014b5),_0x163826=0x0;for(_0x1014b5=_0xf689e5?_0x1014b5:_0x1014b5[Symbol['iterator']]();;){var _0x26ecca;if(_0xf689e5){if(_0x163826>=_0x1014b5['length'])break;_0x26ecca=_0x1014b5[_0x163826++];}else{if((_0x163826=_0x1014b5[_0x5222b2(0x1ac)]())[_0x5222b2(0x47a)])break;_0x26ecca=_0x163826[_0x5222b2(0x1ee)];}var _0x1a7fd1=parseInt(_0x26ecca,0xa);_0x1a7fd1>=0x1e&&_0x1a7fd1<=0xd2&&_0x31f891['push'](String(0xa*_0x1a7fd1));}var _0x134f83=0x2,_0x2a16e8=[];if(_0x31f891[_0x5222b2(0x22e)]>_0x134f83)for(var _0x4d6e3e=0x0;_0x4d6e3e<_0x31f891[_0x5222b2(0x22e)]-_0x134f83+0x1;_0x4d6e3e++){for(var _0x42af95=0x0,_0x394eba=0x0;_0x394eba<_0x134f83;_0x394eba++)_0x42af95+=parseInt(_0x31f891[_0x4d6e3e+_0x394eba],0xa);_0x42af95=Math[_0x5222b2(0x32e)](_0x42af95/_0x134f83),_0x2a16e8[_0x5222b2(0x43d)](_0x42af95);}return[][_0x5222b2(0x321)](_0x2a16e8);}},0x34f:(_0x152c0d,_0x4664de)=>{var _0x2ca01d=a0_0x1b9c;_0x4664de[_0x2ca01d(0x2c7)]=!0x0,_0x4664de[_0x2ca01d(0x2b4)]=_0x765308;var _0x33844d=0x18,_0x1bf72d=0x4,_0x31c1b6={'luoentz_class':[0x0,0x0,0x0,0x0],'luoentz_pro':[0x0,0x0,0x0,0x0]},_0x2df206=[[632.870445,79.056942,99.247166,91.923882,96.046864,63.63961,0.019749,0.049106,0.140112,0.26688,0.394182,0.129971],[562.161009,0x0,58.5235,91.787799,63.63961,71.063352,0.002054,0.007191,0.026194,0.160247,0.617103,0.187211],[565.685425,71.589105,81.394103,88.45903,82.006097,68.007353,0.014178,0.074785,0.293578,0.373645,0.202391,0.041423],[696.509153,123.794184,0x96,160.078106,124.197423,71.063352,0.04514,0.168683,0.265875,0.292657,0.171058,0.056587],[763.708059,77.781746,99.247166,93.005376,95.524866,91.923882,0.149578,0.191561,0.140928,0.116878,0.277426,0.123629],[852.071006,0x0,53.851648,90.138782,78.102497,0x32,0.000528,0.008719,0.094055,0.28745,0.56856,0.040687],[714.317856,174.140748,172.046505,163.248277,153.052279,61.846584,0.054377,0.207993,0.323274,0.251223,0.131049,0.032083],[318.198052,0x4b,84.852814,67.26812,67.26812,49.497475,0.013447,0.050122,0.233985,0.362836,0.282396,0.057213],[548.11039,89.022469,91.787799,104.04326,106.301458,71.063352,0.025652,0.083208,0.086657,0.185169,0.492347,0.126967],[1145.600279,92.195445,0x0,71.589105,129.711218,93.005376,0.086221,0.06321,0.003881,0.232603,0.480455,0.133629],[615.1829,0x23,92.195445,116.726175,95.524866,78.102497,0.004963,0.03187,0.137931,0.322362,0.382184,0.12069],[399.530975,118.532696,120.415946,99.247166,96.046864,53.150729,0.015275,0.076884,0.175407,0.392312,0.282841,0.057281],[774.289997,0x19,14.142136,60.207973,106.066017,74.330344,0.03342,0.005959,0.052591,0.260363,0.454404,0.193264],[632.870445,72.111026,93.005376,104.04326,92.195445,78.102497,0.015625,0.081833,0.312235,0.363347,0.183263,0.043697],[1085.414667,0x0,0x32,132.003788,118.004237,98.994949,0.000448,0.01545,0.063368,0.254814,0.510972,0.154948],[441.95588,107.004673,0x91,152.069063,123.794184,67.26812,0.064366,0.178172,0.294776,0.245336,0.165112,0.052239],[753.077021,79.056942,163.248277,159.138305,137.931142,95.524866,0.027065,0.191406,0.313895,0.279576,0.142578,0.04548],[912.195155,108.166538,42.426407,7.071068,90.138782,89.022469,0.132213,0.132579,0.01534,0.051863,0.43572,0.232286],[937.243298,60.207973,82.764727,161.012422,139.283883,105.948101,0.112787,0.111913,0.184918,0.309508,0.227322,0.053552],[1216.737441,83.216585,65.192024,0x19,88.600226,99.624294,0.145019,0.154439,0.0334,0.093919,0.409649,0.163574],[848.528137,68.007353,72.111026,81.394103,98.994949,78.102497,0.093659,0.232688,0.202176,0.177766,0.25126,0.042452],[555.090083,60.207973,73.824115,117.153745,86.023253,42.426407,0.001598,0.027171,0.106819,0.438998,0.385189,0.040224],[799.06195,82.764727,0x28,332.340187,162.788206,107.703296,0.023803,0.018989,0x0,0.112062,0.575555,0.269591],[1283.403678,50.249378,0x19,131.244047,102.591423,35.355339,0.004952,0.017186,0.103408,0.617827,0.251384,0.005243]];function _0x24c476(_0x3ff17b,_0x2ae4b3){var _0x5738c8=_0x2ca01d;for(var _0x3b093b=[],_0x806004=0x0,_0x38e7c2=0x0;_0x38e7c2<_0x2ae4b3;_0x38e7c2++)_0x806004=0x0,_0x806004=_0x38e7c2==_0x2ae4b3-0x1?(_0x3ff17b[_0x38e7c2]+_0x3ff17b[_0x38e7c2-0x1])/0x2:(_0x3ff17b[_0x38e7c2]+_0x3ff17b[_0x38e7c2+0x1])/0x2,_0x3b093b[_0x5738c8(0x43d)](Math[_0x5738c8(0x32e)](_0x806004));return _0x3b093b;}function _0x2f8262(_0x265879,_0x4a6d0c,_0x20f1d1){var _0xc04de6=_0x2ca01d;for(var _0x1af98a=[],_0x1cff1d=[],_0x14aac3=0x0;_0x14aac3<_0x265879['length']-0x1;_0x14aac3++)_0x1af98a[_0xc04de6(0x43d)](_0x265879[_0x14aac3]),_0x1cff1d[_0xc04de6(0x43d)](_0x265879[_0x14aac3+0x1]);for(var _0x3cc547=[],_0x3b3054=[],_0x9b4b27=0x0,_0x1b3932=0x0,_0x221896=0x0;_0x221896<_0x265879['length'];_0x221896++){_0x1b3932=0x0;for(var _0x3d06fe=0x0;_0x3d06fe<_0x265879[_0xc04de6(0x22e)];_0x3d06fe++){if(Math['sqrt'](_0x1af98a[_0x221896]-_0x1af98a[_0x3d06fe]^_0x1cff1d[_0x221896]-_0x1cff1d[_0x3d06fe]+0x2^0x2)