睡眠排序优化

main
sjchen 5 months ago
parent c8b58c1a58
commit 9355d9743a

@ -80,8 +80,8 @@ Page({
console.log("advertisData: ",hexStr) console.log("advertisData: ",hexStr)
// 连接指定设备 // 连接指定设备
// if(device.deviceId=="03:02:02:07:65:98"){ // if(device.deviceId=="03:02:02:07:65:98"){
// if(device.deviceId=="03:02:02:07:5F:AF"){ if(device.deviceId=="03:02:02:07:5F:AF"){
if(device.deviceId=="03:02:02:07:64:B4"){ // if(device.deviceId=="03:02:02:07:5E:BE"){
this.connectToDevice(device.deviceId); this.connectToDevice(device.deviceId);
} }
}); });
@ -172,7 +172,7 @@ Page({
const dataView = new DataView(res.value); const dataView = new DataView(res.value);
// 获取第一个字节 // 获取第一个字节
let cmdType = dataView.getUint8(0); let cmdType = dataView.getUint8(0);
console.log("cmdType",cmdType); // console.log("cmdType",cmdType);
switch (cmdType) { switch (cmdType) {
case 0x01: case 0x01:
console.log("同步时间成功"); console.log("同步时间成功");
@ -216,17 +216,23 @@ Page({
break; break;
case 0x52: case 0x52:
let stepDetailList = ParseDataPacket.parseStepDetailList(dataView,0); let stepDetailList = ParseDataPacket.parseStepDetailList(dataView,0);
console.log("步数详情数据:",stepDetailList); if(dataView.byteLength % 25 == 2){
console.log("收到步数结束符号,最后一条指令【结束】",dataView.byteLength)
}
// console.log("步数详情数据:",stepDetailList);
// 调用后台接口 todo .... // 调用后台接口 todo ....
// 更新缓存 // 更新缓存
HealthDataCache.updateStepData(stepDetailList[0].startTime); HealthDataCache.updateStepData(stepDetailList[0].startTime);
break; break;
case 0x55: case 0x55:
let heartRateList = ParseDataPacket.parseDataList(dataView,0); let heartRateList = ParseDataPacket.parseDataList(dataView,0);
let respList = this.getRespiratoryList(heartRateList); let respList = this.getRespiratoryList(heartRateList);
console.log("心率数据:",heartRateList); if(dataView.byteLength % 10 == 2){
console.log("收到心率结束符号>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>",dataView.byteLength)
// 需要调用下一个指令(血氧)
this.sendHealthCommand(0x66)
}
// console.log("心率数据:",heartRateList);
// console.log("呼吸率数据:",respList); // console.log("呼吸率数据:",respList);
// 调用后台接口 todo .... // 调用后台接口 todo ....
@ -236,7 +242,12 @@ Page({
break; break;
case 0x56: case 0x56:
let parseBloodList = ParseDataPacket.parseBloodPressureList(dataView,0); let parseBloodList = ParseDataPacket.parseBloodPressureList(dataView,0);
console.log("血压数据:",parseBloodList); if(dataView.byteLength % 15 == 2){
console.log("收到血压结束符号>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>",dataView.byteLength)
// 需要调用下一个指令(体温)
this.sendHealthCommand(0x65)
}
// console.log("血压数据:",parseBloodList);
// 调用后台接口 todo .... // 调用后台接口 todo ....
// 更新缓存 // 更新缓存
@ -248,17 +259,27 @@ Page({
break; break;
case 0x66: case 0x66:
let bloodOxygenList = ParseDataPacket.parseDataList(dataView,0); let bloodOxygenList = ParseDataPacket.parseDataList(dataView,0);
console.log("血氧数据:",bloodOxygenList); if(dataView.byteLength % 10 == 2){
console.log("收到血氧结束符号>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>",dataView.byteLength)
// 需要调用下一个指令(血压)
this.sendHealthCommand(0x56)
}
// console.log("血氧数据:",bloodOxygenList);
// 调用后台接口 todo .... // 调用后台接口 todo ....
// 更新缓存 // 更新缓存
HealthDataCache.updateBloodOxygenData(bloodOxygenList[0].time); HealthDataCache.updateBloodOxygenData(bloodOxygenList[0].time);
break; break;
case 0x65: case 0x65:
let tempList = ParseDataPacket.parseTempList(dataView,0); let tempList = ParseDataPacket.parseTempList(dataView,0);
if(dataView.byteLength % 11 == 2){
console.log("收到体温结束符号>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>",dataView.byteLength)
// 需要调用下一个指令(体温)
this.sendHealthCommand(0x53)
}
// 目前返回的包括环境温度,后续固件改成只采集佩戴情况下的体温,暂时过滤掉 oneValue 小于 35.0 的数据 // 目前返回的包括环境温度,后续固件改成只采集佩戴情况下的体温,暂时过滤掉 oneValue 小于 35.0 的数据
const filteredData = tempList.filter(item => item.oneValue >= 35.0); const filteredData = tempList.filter(item => item.oneValue >= 35.0);
console.log("体温数据:",tempList); // console.log("体温数据:",tempList);
if(filteredData.length > 0){ if(filteredData.length > 0){
// todo 调用后端接口 // todo 调用后端接口
@ -271,17 +292,35 @@ Page({
let id = dataView.getUint8(1); let id = dataView.getUint8(1);
// 睡眠数据结束符 // 睡眠数据结束符
if(dataView.byteLength == 2 && id == 0xff){ if(dataView.byteLength == 2 && id == 0xff){
let list = this.data.sleepList; console.log("收到睡眠结束符号>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>",dataView.byteLength)
let arr = CommonUtil.assembleSleepData(list); // 需要调用下一个指令(体温)
console.log("接口需要的睡眠数据:",arr); // this.sendHealthCommand(0x52)
// // 更新缓存
// HealthDataCache.updateSleepData(list[0].time);
// 调用接口传睡眠后,清空数据 let list = this.data.sleepList;
this.setData({ if(list.length > 0){
sleepList: [] let arr = CommonUtil.assembleSleepData(list);
}); arr.forEach(item =>{
// 排序算法
item.sleepList.sort((a, b) => {
// 先比较 yyyyMMdd
if (a.yyyyMMdd !== b.yyyyMMdd) {
return a.yyyyMMdd.localeCompare(b.yyyyMMdd);
}
// 再比较 minute
return a.minute - b.minute;
});
})
console.log("接口需要的睡眠数据:",arr);
// // 更新缓存
// HealthDataCache.updateSleepData(list[0].time);
// 调用接口传睡眠后,清空数据
this.setData({
sleepList: []
});
}
} else { } else {
let sleepList = ParseDataPacket.parseSleepList(dataView,0); let sleepList = ParseDataPacket.parseSleepList(dataView,0);
// 排序minute 越大排前面 // 排序minute 越大排前面
@ -299,7 +338,7 @@ Page({
this.setData({ this.setData({
sleepList: updatedSleepList sleepList: updatedSleepList
}); });
console.log("data数据:",this.data.sleepList)
} }
break; break;
default: default:
@ -322,8 +361,10 @@ Page({
getPower(){ getPower(){
// 获取电量 // 获取电量
const batteryPacket = DataPacket.generateBatteryCheckPacket(); // const batteryPacket = DataPacket.generateBatteryCheckPacket();
SendCommandUtil.sendPackage(this.data.deviceId,batteryPacket); // SendCommandUtil.sendPackage(this.data.deviceId,batteryPacket);
this.sendHealthCommand(0x53)
}, },
getStep(){ getStep(){
@ -332,60 +373,70 @@ Page({
SendCommandUtil.sendPackage(this.data.deviceId,stepPacket); SendCommandUtil.sendPackage(this.data.deviceId,stepPacket);
}, },
sendHealthCommand(){ sendHealthCommand(cmd){
// 指令依次是:心率,血氧、血压、体温、睡眠、步数 // 如果不传则默认发送心率
// 0x55,0x66,0x56,0x65,0x53,0x52 if(cmd == null){
const commands = [0x55]; cmd = 0x55;
// 递归发送命令并加上 5 秒延迟
function sendNextCommand(index = 0) {
if (index >= commands.length) return; // 所有命令发送完毕,结束
const cmd = commands[index];
const packet = DataPacket.generateReadDataPacket(cmd);
console.log("hexStr", this.uint8ArrayToHex(packet));
// 发送命令包
SendCommandUtil.sendPackage(this.data.deviceId, packet);
// 每发送完一个命令后,等待 3 秒继续发送下一个
setTimeout(() => {
sendNextCommand.call(this, index + 1);
}, 3500); // 延迟 3.5 秒
} }
let packet = DataPacket.generateReadDataPacket(cmd);
// 开始发送第一个命令,并保持 `this` 上下文 console.log("发送指令到设备端>>>:", this.uint8ArrayToHex(packet));
sendNextCommand.call(this,0); SendCommandUtil.sendPackage(this.data.deviceId, packet);
}, },
// sendHealthCommand2(){
// // 指令依次是:心率,血氧、血压、体温、睡眠、步数
// // 0x55,0x66,0x56,0x65,0x53,0x52
// const commands = [0x55];
// // 递归发送命令并加上 5 秒延迟
// function sendNextCommand(index = 0) {
// if (index >= commands.length) return; // 所有命令发送完毕,结束
// const cmd = commands[index];
// const packet = DataPacket.generateReadDataPacket(cmd);
// console.log("hexStr", this.uint8ArrayToHex(packet));
// // 发送命令包
// SendCommandUtil.sendPackage(this.data.deviceId, packet);
// // 每发送完一个命令后,等待 3 秒继续发送下一个
// setTimeout(() => {
// sendNextCommand.call(this, index + 1);
// }, 3500); // 延迟 3.5 秒
// }
// // 开始发送第一个命令,并保持 `this` 上下文
// sendNextCommand.call(this,0);
// },
// 获取健康数据 // 获取健康数据
getHealthData(){ getHealthData(){
// 睡眠数据 // 睡眠数据
// const sleepPacket = DataPacket.generateReadSleepDataPacket(); const sleepPacket = DataPacket.generateReadSleepDataPacket(0x53);
// SendCommandUtil.sendPackage(this.data.deviceId,sleepPacket); SendCommandUtil.sendPackage(this.data.deviceId,sleepPacket);
// 获取当前时间 // 获取当前时间
let currentTime = Math.floor(new Date().getTime() / 1000); // let currentTime = Math.floor(new Date().getTime() / 1000);
// 如果是第一次调用则不判断时间如果是第二次调用要判断本次调用与上次是否间隔18秒因手表机制问题不能频繁发送指令给手表端 // // 如果是第一次调用则不判断时间如果是第二次调用要判断本次调用与上次是否间隔18秒因手表机制问题不能频繁发送指令给手表端
console.log(this.data.initTime,this.data.initIndex) // console.log(this.data.initTime,this.data.initIndex)
if(this.data.initIndex === 0){ // if(this.data.initIndex === 0){
this.sendHealthCommand(); // this.sendHealthCommand();
this.setData({ // this.setData({
initIndex: this.data.initIndex + 1, // initIndex: this.data.initIndex + 1,
initTime: currentTime // initTime: currentTime
}) // })
} else { // } else {
// 初始时间 // // 初始时间
let initTime = this.data.initTime // let initTime = this.data.initTime
let timeDifference = currentTime - initTime; // let timeDifference = currentTime - initTime;
if(this.data.initIndex > 0 && timeDifference > 18){ // if(this.data.initIndex > 0 && timeDifference > 18){
console.log(timeDifference,this.data.initIndex) // console.log(timeDifference,this.data.initIndex)
this.setData({ // this.setData({
initIndex: this.data.initIndex + 1, // initIndex: this.data.initIndex + 1,
initTime: currentTime // initTime: currentTime
}) // })
this.sendHealthCommand(); // this.sendHealthCommand();
} // }
} // }
}, },

@ -37,10 +37,10 @@ const parseDataPacket = {
switch (status) { switch (status) {
case 1: case 1:
case 0: case 0:
return 2; // 深 return 1; // 浅
case 2: case 2:
case 3: case 3:
return 1; // 浅 return 2; // 深
// case 3: // case 3:
// return 4; // REM // return 4; // REM
case 4: case 4:
@ -287,7 +287,7 @@ const parseDataPacket = {
const second = dataView.getUint8(offset + 8).toString(16).padStart(2, '0'); // 秒BCD格式 const second = dataView.getUint8(offset + 8).toString(16).padStart(2, '0'); // 秒BCD格式
let time = this.dateFormat(year,month,day,hour,minute,second); let time = this.dateFormat(year,month,day,hour,minute,second);
// 解析血压->高压 // 解析血压->高压
const high = dataView.getUint8(offset + 13); const high = dataView.getUint8(offset + 13);
// 解析血压->高压 // 解析血压->高压
const low = dataView.getUint8(offset + 14); const low = dataView.getUint8(offset + 14);

Loading…
Cancel
Save