feat(mp): Veepoo M2 BLE 管线扩展 — 精准睡眠数据 + 自动测量 + UI 重构
- 新增 VeepooBridge API:精准睡眠读取(readPreciseSleepData)、B3自动测量配置 (readAutoTestConfig/setAutoTestConfig)、开关设置(setAutoHeartRate/BP/Temp)、 体温自动数据读取(readAutoTemperatureData),共 10 个新 API - 新增 SDK 事件类型:SDK_EVENT_SLEEP(4)、SDK_EVENT_AUTO_TEST(54) - VeepooPipeline 新增:readSleepData/readAllSleepData(enableAutoMeasurement 睡眠数据 Promise 化读取 + 自动测量一键开启 - VeepooHistoryReader 新增:uploadSleepReadings 睡眠数据上传 - stores/veepoo.ts 实装:注册 onSleepData 回调、syncHistory 实际读取+上传、 readSleepData 状态管理、enableAutoMeasurement、连接后自动触发三件事 - 原生页面(native/pkg-veepoo):_onReady 后自动读取 3 天睡眠 + 开启自动测量, 新增 _readSleepData/_handleSleepEvent/_enableAutoMeasurement - UI 重构:测量页药丸式选择器+SVG 圆环仪表盘+健康评估标签 - 数据上传页:2 列结果卡片网格+彩色条标识+睡眠数据卡片(★评分+总时长) - 修复上传按钮无响应 bug:patientId 增加 URL fallback + 错误提示不再静默 - 设计原型:docs/design/veepoo-measure-prototype.html(4 状态预览)
This commit is contained in:
@@ -15,11 +15,14 @@ const { veepooBle, veepooFeature, veepooLogger } = require('./libs/veepoo-sdk');
|
||||
|
||||
var SDK_EVENT_AUTH = 1;
|
||||
var SDK_EVENT_BATTERY = 2;
|
||||
var SDK_EVENT_SLEEP = 4;
|
||||
var SDK_EVENT_DAILY = 5;
|
||||
var SDK_EVENT_TEMPERATURE = 6;
|
||||
var SDK_EVENT_BLOOD_PRESSURE = 18;
|
||||
var SDK_EVENT_BLOOD_OXYGEN = 31;
|
||||
var SDK_EVENT_HEART_RATE = 51;
|
||||
var SDK_EVENT_PRESSURE = 58;
|
||||
var SDK_EVENT_AUTO_TEST = 54;
|
||||
|
||||
var MEASURE_TYPES = [
|
||||
{ type: 'heart_rate', label: '心率', unit: 'bpm', icon: '♥', color: '#EF4444', sdkType: SDK_EVENT_HEART_RATE },
|
||||
@@ -271,6 +274,10 @@ Page({
|
||||
console.log('[veepoo-native] 认证成功,设备就绪');
|
||||
this.setData({ phase: 'ready' });
|
||||
veepooFeature.veepooReadElectricQuantityManager();
|
||||
|
||||
// 认证成功后自动读取 3 天睡眠数据 + 开启自动测量
|
||||
this._readSleepData();
|
||||
this._enableAutoMeasurement();
|
||||
},
|
||||
|
||||
// ── SDK 事件路由 ──
|
||||
@@ -301,6 +308,25 @@ Page({
|
||||
return;
|
||||
}
|
||||
|
||||
// 睡眠数据回调(type=4)
|
||||
if (type === SDK_EVENT_SLEEP) {
|
||||
this._handleSleepEvent(data);
|
||||
return;
|
||||
}
|
||||
|
||||
// 日常数据回调(type=5)
|
||||
if (type === SDK_EVENT_DAILY) {
|
||||
// 日常数据用于历史同步,原生页面暂不处理
|
||||
return;
|
||||
}
|
||||
|
||||
// 自动测量配置回调(type=54)
|
||||
if (type === SDK_EVENT_AUTO_TEST) {
|
||||
// eslint-disable-next-line no-undef
|
||||
console.log('[veepoo-native] 自动测量配置回调');
|
||||
return;
|
||||
}
|
||||
|
||||
for (var i = 0; i < MEASURE_TYPES.length; i++) {
|
||||
if (MEASURE_TYPES[i].sdkType === type) {
|
||||
this._handleMeasureEvent(MEASURE_TYPES[i].type, data);
|
||||
@@ -516,4 +542,96 @@ Page({
|
||||
break;
|
||||
}
|
||||
},
|
||||
|
||||
// ── 睡眠数据读取 ──
|
||||
|
||||
_sleepResults: null,
|
||||
_sleepDay: 0,
|
||||
|
||||
_readSleepData: function () {
|
||||
this._sleepResults = [];
|
||||
this._sleepDay = 0;
|
||||
// eslint-disable-next-line no-undef
|
||||
console.log('[veepoo-native] 开始读取睡眠数据(3天)');
|
||||
|
||||
// 依次读取 3 天睡眠
|
||||
var self = this;
|
||||
veepooFeature.veepooSendReadPreciseSleepManager({ day: 0 });
|
||||
|
||||
// 延迟读取后续天(避免并发冲突)
|
||||
// eslint-disable-next-line no-undef
|
||||
setTimeout(function () { veepooFeature.veepooSendReadPreciseSleepManager({ day: 1 }); }, 3000);
|
||||
// eslint-disable-next-line no-undef
|
||||
setTimeout(function () { veepooFeature.veepooSendReadPreciseSleepManager({ day: 2 }); }, 6000);
|
||||
},
|
||||
|
||||
_handleSleepEvent: function (data) {
|
||||
var progress = data.Progress || 0;
|
||||
if (progress < 100) return;
|
||||
|
||||
var content = data.content || {};
|
||||
var readDay = data.readDay || 0;
|
||||
var totalTime = Number(content.sleepTotalTime || 0);
|
||||
|
||||
if (totalTime <= 0) return;
|
||||
|
||||
var sleepResult = {
|
||||
day: readDay,
|
||||
deepSleepMinutes: Number(content.deepSleepTime || 0),
|
||||
lightSleepMinutes: Number(content.lightSleepTime || 0),
|
||||
totalSleepMinutes: totalTime,
|
||||
qualityScore: Number(content.sleepQuality || 0),
|
||||
fallAsleepTime: String(content.fallAsleepTime || ''),
|
||||
exitSleepTime: String(content.exitSleepTime || ''),
|
||||
};
|
||||
|
||||
if (!this._sleepResults) this._sleepResults = [];
|
||||
this._sleepResults.push(sleepResult);
|
||||
|
||||
// eslint-disable-next-line no-undef
|
||||
console.log('[veepoo-native] 睡眠数据 day=' + readDay + ' 总时长=' + totalTime + '分钟 质量=' + sleepResult.qualityScore + '星');
|
||||
|
||||
// 保存到 Storage 供 Taro 页面读取
|
||||
try {
|
||||
// eslint-disable-next-line no-undef
|
||||
wx.setStorageSync('hms:veepoo_sleep_results', JSON.stringify(this._sleepResults));
|
||||
} catch (_) { /* ignore */ }
|
||||
},
|
||||
|
||||
// ── 自动测量 ──
|
||||
|
||||
_enableAutoMeasurement: function () {
|
||||
// eslint-disable-next-line no-undef
|
||||
console.log('[veepoo-native] 开启自动测量功能');
|
||||
|
||||
// 开启心率自动监测
|
||||
try {
|
||||
veepooFeature.veepooSendSwitchSettingDataManager({
|
||||
VPSettingAutomaticHRTest: 'open',
|
||||
});
|
||||
} catch (e) {
|
||||
// eslint-disable-next-line no-undef
|
||||
console.warn('[veepoo-native] 开启心率自动监测失败:', e);
|
||||
}
|
||||
|
||||
// 开启血压自动监测
|
||||
try {
|
||||
veepooFeature.veepooSendSwitchSettingDataManager({
|
||||
VPSettingAutomaticBPTest: 'open',
|
||||
});
|
||||
} catch (e) {
|
||||
// eslint-disable-next-line no-undef
|
||||
console.warn('[veepoo-native] 开启血压自动监测失败:', e);
|
||||
}
|
||||
|
||||
// 开启体温自动监测
|
||||
try {
|
||||
veepooFeature.veepooSendSwitchSettingDataManager({
|
||||
VPSettingAutomaticTemperatureTest: 'open',
|
||||
});
|
||||
} catch (e) {
|
||||
// eslint-disable-next-line no-undef
|
||||
console.warn('[veepoo-native] 开启体温自动监测失败:', e);
|
||||
}
|
||||
},
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user