修改睡眠数据获取方式,睡眠增加缓存

main
sjchen 4 months ago
parent 706936f927
commit 384376afd9

@ -18,6 +18,7 @@ Page({
sleepDataBuffer: new DynamicArrayBuffer(), // 创建缓存对象
isDataComplete: false, // 判断数据是否上传完毕
sleepList:[],
sleepCount:0,//获取睡眠的次数
},
// 页面加载时触发的函数,用于初始化蓝牙适配器
@ -81,8 +82,8 @@ Page({
// 连接指定设备
// if(device.deviceId=="03:02:02:07:65:98"){
// if(device.deviceId=="03:02:02:07:5C:B7"){
// if(device.deviceId=="03:02:02:07:65:98"){
if(device.deviceId=="03:02:02:07:5E:BE"){
if(device.deviceId=="03:02:02:07:62:A3"){
// if(device.deviceId=="03:02:02:07:5E:BE"){
this.connectToDevice(device.deviceId);
}
});
@ -309,12 +310,25 @@ Page({
let result = CommonUtil.sortSleep(arr);
console.log("接口需要的睡眠数据:",result);
// // 更新缓存
// HealthDataCache.updateSleepData(list[0].date);
// 从缓存中获取睡眠日期
let field = CommonUtil.commandToField(0x53);// 根据指令获取字段
// console.log("field>>>:",field);
let lastDate = HealthDataCache.getLastTimeField(field);
console.log("lastDate>>>:",lastDate);
let data = CommonUtil.removeBeforeDate(result,lastDate);
console.log("data:",data)
// 更新缓存
HealthDataCache.updateSleepData(result[result.length-1].date);
// 调用接口传睡眠后,清空数据
this.setData({
sleepList: []
});
// 清空累加睡眠次数
this.setData({
sleepCount : 0
});
}
} else {
let sleepList = ParseDataPacket.parseSleepList(dataView,0);
@ -327,12 +341,26 @@ Page({
let currentSleepList = this.data.sleepList || [];
// 将 sleepList 放在前面currentSleepList 放在后面,实现新的数据插入在前
let updatedSleepList = sleepList.concat(currentSleepList);;
let updatedSleepList = sleepList.concat(currentSleepList);
// 更新 data 中的 sleepList
this.setData({
sleepList: updatedSleepList
});
// 累加睡眠获取次数
this.setData({
sleepCount : this.data.sleepCount + 1
});
if(this.data.sleepCount % 50 == 0){
// 如果大于等于50次都没有获取到睡眠结束符则再次从上一次的位置获取睡眠数据
const sleepPacket = DataPacket.generateReadSleepDataPacket();
console.log("继续获取睡眠数据:",sleepPacket)
console.log("sleepCount:",this.data.sleepCount)
SendCommandUtil.sendPackage(this.data.deviceId,sleepPacket);
}
}
break;
default:
@ -443,7 +471,7 @@ Page({
getHealthData(){
// 睡眠数据
const sleepPacket = DataPacket.generateReadSleepDataPacket(0x53);
const sleepPacket = DataPacket.generateReadSleepDataPacket();
SendCommandUtil.sendPackage(this.data.deviceId,sleepPacket);

@ -377,7 +377,42 @@ const CommonUtil = {
return result;
},
// 获取下一个日期
getNextDay(dateString) {
// 解析传入的日期字符串
let date = new Date(dateString);
// 将日期加一天
date.setDate(date.getDate() + 1);
// 格式化为 "YYYY-MM-DD" 格式
let year = date.getFullYear();
let month = ('0' + (date.getMonth() + 1)).slice(-2); // 月份需要 +1且补充 0
let day = ('0' + date.getDate()).slice(-2); // 日期补充 0
return `${year}${month}${day}`;
},
/**
* 删除已上传的睡眠数据
* @param {} arr
* @param {*} targetDate
*/
removeBeforeDate(arr, targetDate) {
// 将目标日期字符串转换为 Date 对象
let target = new Date(targetDate.substring(0, 4), targetDate.substring(4, 6) - 1, targetDate.substring(6, 8));
// 过滤掉日期小于或等于目标日期的项
return arr.filter(item => {
// 将数组中每个日期转换为 Date 对象
let itemDate = new Date(item.date.substring(0, 4), item.date.substring(4, 6) - 1, item.date.substring(6, 8));
// 只保留日期大于目标日期的项
return itemDate > target;
});
}
}

@ -151,22 +151,35 @@ const DataPacket = {
const packet = new Uint8Array(16);
packet[0] = command; // 命令字节
// 判断 command 是否是 0x53
packet[1] = 0x00; //0x99: 删除数据0x00读取最近数据0x01读取指定位置数据0x02继续读取上一次位置
let field = CommonUtil.commandToField(command);// 根据指令获取字段
// console.log("field>>>:",field);
let lastTime = HealthDataCache.getLastTimeField(field);// 根据字段获取最近一次同步数据的时间戳
// console.log("lastTime1>>>:",lastTime);
let date = CommonUtil.getDateByTimestamp(lastTime);
packet[2] = 0x00; // 占位
packet[3] = 0x00; // 占位
packet[4] = "0x"+ date.year; //年
packet[5] = "0x"+ date.month; //月
packet[6] = "0x"+ date.day; //日
packet[7] = "0x"+ date.hours; //时
packet[8] = "0x"+ date.minutes; //分
packet[9] = "0x"+ date.seconds; //秒
if(command != 0x53){
let date = CommonUtil.getDateByTimestamp(lastTime);
packet[4] = "0x"+ date.year; //年
packet[5] = "0x"+ date.month; //月
packet[6] = "0x"+ date.day; //日
packet[7] = "0x"+ date.hours; //时
packet[8] = "0x"+ date.minutes; //分
packet[9] = "0x"+ date.seconds; //秒
} else {
packet[4] = "0x00"; //年
packet[5] = "0x00"; //月
packet[6] = "0x00"; //日
packet[7] = "0x00"; //时
packet[8] = "0x00"; //分
packet[9] = "0x00"; //秒
}
packet.fill(0x00, 10, 15); // 填充其他字节为0
@ -218,7 +231,7 @@ const DataPacket = {
const packet = new Uint8Array(16);
// 填充命令数据包
packet[0] = 0x53;
packet[1] = 0x00;
packet[1] = 0x02;
packet.fill(0x00, 2, 15);
// 计算并设置 CRC 校验字节

@ -376,11 +376,13 @@ const parseDataPacket = {
// 开始循环遍历 sleepData 数据
for (let i = 0; i < secondPart.length; i++) {
const status = secondPart[i];
let date = CommonUtil.getNextDay(`${parseInt(year) + 2000}-${month}-${day}`);
// 处理每分钟的睡眠数据
result.push({
minute: currentMinute, // 分钟递增
status: this.mapSleepStatus(status), // 映射睡眠状态
yyyyMMdd: `${parseInt(year) + 2000}${month}${(parseInt(day) + 1).toString().padStart(2, '0')}`, // 格式化为yyyyMMdd
// yyyyMMdd: `${parseInt(year) + 2000}${month}${(parseInt(day) + 1).toString().padStart(2, '0')}`, // 格式化为yyyyMMdd
yyyyMMdd: date
});
// 递增分钟数

Loading…
Cancel
Save