You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

358 lines
11 KiB
TypeScript

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

import Taro from "@tarojs/taro";
import { debounce } from "lodash";
import {
notifyBLECharacteristicValueChange,
sendCommand,
} from "@/utils/bluetoothWXAPI";
import {
deviceCommandSamples,
bleCommandSamples,
} from "@/components/bluetoot/connection/wl200";
/** 基础版:脸部/眼部/PRO 设备使用时,会自动开启暂停 */
const BaseModeType: string[] = [
"face",
"eyes",
"nasolabialFold",
"mandibularLine",
"headLiftingPro",
];
/**
* @name 蓝牙控制函数
* @description 响应功能需要直接修改私有函数,仅仅是蓝牙解耦,将从页面中抽离出来。
*/
export default class BluetoothContainer {
bluetoothInfo: any;
deviceToolKitInstance: any;
that: any;
counter: number = 0; // 初始化后,同步执行次数
constructor(bluetoothInfo: any, deviceToolKitInstance: any, that: any) {
this.bluetoothInfo = bluetoothInfo;
this.deviceToolKitInstance = deviceToolKitInstance;
this.that = that;
}
/** @name 设备响应:待机 */
private syncStandby(jsonStatus) {
if (BaseModeType.includes(jsonStatus.workMode)) {
this.that.openTips("检测到您的设备没有紧贴肌肤,请紧贴肌肤");
}
}
/** @name 设备响应:工作 */
private syncWorking(jsonStatus) {
// 脸部模式
if (BaseModeType.includes(jsonStatus.workMode)) {
this.that.closeTips();
}
}
/** @name 设备响应:暂停 */
private syncPause(jsonStatus) {
if (BaseModeType.includes(jsonStatus.workMode)) {
this.that.openTips(
"检测到您的设备没有紧贴肌肤,请紧贴肌肤后重新尝试"
);
}
}
/** @name 查询信息响应 */
private InfoQuery = {
/** @name 设备响应:离线记录 */
syncOfflineClockInInfo: function (jsonStatus) {
console.log("离线记录", jsonStatus);
},
/** @name 设备响应:版本信息 */
syncVersionInfo: function (jsonStatus) {
console.log("版本信息", jsonStatus);
},
/** @name 设备响应:时间同步 */
syncTimeSync: function (jsonStatus) {
console.log("时间同步", jsonStatus);
}
}
/** @name 设备响应:通用状态响应 */
private syncCommonStatus(jsonStatus) {
// 1.判断是否水分测试
if (jsonStatus.workMode === "moistureTest") {
if (jsonStatus.testStatus === "success") {
let waterStepList = this.that.state.waterStepList;
// 到达第几个step
let waterStepIndex = this.that.state.waterStepIndex;
// 代表5秒以后最后拿到的结果
if (waterStepList[waterStepIndex].finish) {
// 获取等级
waterStepList[waterStepIndex].forehead =
jsonStatus.waterLevel;
// 检测完成
if (waterStepIndex === 2) {
this.that.setState({
isRuningTest: 4,
});
} else {
// 启动检测
this.that.setState({
isRuningTest: 1,
});
}
// 一共有3条数据
let num = waterStepIndex;
if (waterStepIndex < 2) {
num = waterStepIndex + 1;
this.that.waterTestNext(num);
}
this.that.setState({
waterStepIndex: num,
waterStepList,
});
}
} else {
let waterStepList = this.that.state.waterStepList;
let waterStepIndex = this.that.state.waterStepIndex;
// 5秒后获取的结果
if (waterStepList[waterStepIndex].finish) {
// 获取失败后把进度条清理0
waterStepList[waterStepIndex].schedule = 0;
waterStepList[waterStepIndex].finish = false;
this.that.setState({
waterStepList,
isRuningTest: 3,
});
}
}
}
// 2.判断工作状态是否与选中仪器一致
if (jsonStatus?.workMode === this.that.state.ActiveModeItem?.modeType) {
if (this.that.state.workMode !== jsonStatus?.workMode) {
this.that.setState({
workMode: jsonStatus?.workMode, // 仅当设备上报模式与小程序一致时,才允许改变小程序变量缓存
});
}
console.log("this.that.isRuning",this.that.isRuning)
// 判断设备是否在运行中(护理中)
// 仅当设备模式与小程序是否一致,才允许更改设备运行时间
if (this.that.isRuning) {
if (
this.that.state.DeviceConnectStatus === 1 &&
jsonStatus.workStatus !== 'end'
) {
// 水分测试手动检测时间,不自动计算倒计时
if (jsonStatus?.workMode !== "moistureTest")
this.that.updateDeviceSyncData(
{
totalWorkingMinutes: jsonStatus.totalWorkingMinutes,
totalWorkingSeconds: jsonStatus.totalWorkingSeconds,
},
jsonStatus
);
}
}
}
}
/** @name 设备响应:控制指令响应 */
private syncDeviceControl(jsonStatus) {
console.log("设备控制响应", jsonStatus);
if (jsonStatus.responseStatus == "OK") {
console.log("发送控制指令成功");
this.that.workJsonStatus = jsonStatus;
this.that.workStatus = jsonStatus.workStatus;
setTimeout(() => console.log("this.workStatus", this.that.workStatus));
if (jsonStatus.battery) {
this.that.setState({
Electricity: jsonStatus.battery,
});
}
// 判断设备主动上报的关机事件
if (jsonStatus.workStatus === 'end') {
// 判断id是否一致, 一致的话则生成护理报表, 并提示
if (jsonStatus.id == this.that.FR200NursingHistory.id) {
debounce(
this.that.checkInstrumentRecord.bind(this, jsonStatus),
500
);
}
return;
}
if (jsonStatus?.workMode === this.that.state.ActiveModeItem?.modeType) {
this.that.setState({
workMode: jsonStatus?.workMode, // 仅当设备上报模式与小程序一致时,才允许改变小程序变量缓存
});
// 判断是否在isRuning(护理中)
// 仅当设备模式与小程序是否一致,才允许更改设备运行时间
if (
this.that.state.DeviceConnectStatus === 1 &&
this.that.isRuning &&
jsonStatus.workStatus !== 'end'
) {
this.that.updateDeviceSyncData(
{
totalWorkingMinutes: jsonStatus.totalWorkingMinutes,
totalWorkingSeconds: jsonStatus.totalWorkingSeconds,
},
jsonStatus
);
}
}
if (
jsonStatus.workMode === 'working' &&
this.that.isRuning
) {
const { ActiveModeItem } = this.that.state;
const item = ActiveModeItem;
if (jsonStatus.workMode !== item?.modeType) {
// clearTimeout(loadingTipsTimer);
this.that.setState({
isShowCountdown: false,
});
}
}
}
}
notifyBLECharacteristicValueChange() {
notifyBLECharacteristicValueChange({
deviceId: this.bluetoothInfo.deviceId,
servicesuuid: this.bluetoothInfo.servicesuuid,
characteristicsuuid1: this.bluetoothInfo.characteristicsuuid1,
characteristicsuuid0: this.bluetoothInfo.characteristicsuuid0,
}).then((res) => {
Taro.onBLECharacteristicValueChange((value) => {
const jsonStatus: any = this.deviceToolKitInstance.toJsonStatus(value.value);
console.log("onBLECharacteristicValueChange 订阅改变:", jsonStatus);
if (!jsonStatus || jsonStatus == null) {
return;
}
this.that.workStatus = jsonStatus.workStatus; // 记录工作状态
// end 和 endWork 都是护理结束, endWork不关机, end 关机, 对小程序而言处理流程都一样
if (jsonStatus.workStatus && jsonStatus.workStatus == "endWork") {
jsonStatus.workStatus = "end";
console.log(jsonStatus.workStatus, "护理结束");
}
switch (jsonStatus?.commandType) {
//设备配对和连接的返回
case "BleMatch":
// 蓝牙相关指令
this.that.switchBLEMatch(jsonStatus);
break;
//设备状态同步
case "DeviceStatusSync":
if (jsonStatus.battery) {
// 防止抖动
this.that.setState({
Electricity: jsonStatus.battery,
});
}
switch (jsonStatus.workStatus) {
case "standby":
//设备的待机状态 可能workMode字段为空
this.syncStandby(jsonStatus)
break;
case "pause":
this.syncPause(jsonStatus)
break;
case "working":
this.syncWorking(jsonStatus)
break;
default:
break;
}
this.syncCommonStatus(jsonStatus);
break;
//设备对控制指令的响应
case "DeviceControl":
this.syncDeviceControl(jsonStatus);
break;
// 设备对信息查询指令的响应
case "InfoQuery":
console.log("设备对信息查询指令的响应 InfoQuery", jsonStatus);
switch (jsonStatus.infoQueryType) {
// 离线记录
case "offlineClockInInfo":
this.InfoQuery.syncOfflineClockInInfo(jsonStatus);
break;
// 版本信息
case "versionInfo":
this.InfoQuery.syncVersionInfo(jsonStatus);
break;
// 时间同步
case "timeSync":
this.InfoQuery.syncTimeSync(jsonStatus);
break;
default:
break;
}
break;
default:
break;
}
});
if (this.counter < 3) {
/**
* 延迟600毫秒获取附属设备状态
*/
const querySubDeviceArrayBuffer = this.deviceToolKitInstance.toBleCommand({
...bleCommandSamples.querySubDevice,
queryType: "WL200",
} as any);
setTimeout(() => {
console.log("发送查询附属设备指令 querySubDeviceArrayBuffer");
sendCommand({
value: querySubDeviceArrayBuffer,
});
}, 600);
/**
* 延迟500毫秒获取设备电量
*/
const queryDeviceArrayBuffer = this.deviceToolKitInstance.toBleCommand(
bleCommandSamples.queryDeviceStatus as any
);
setTimeout(() => {
console.log("发送查询设备电量指令");
sendCommand({
value: queryDeviceArrayBuffer,
});
}, 500);
this.counter++;
} else {
/**
* 延迟500毫秒获取设备电量
*/
const queryDeviceArrayBuffer = this.deviceToolKitInstance.toBleCommand(
bleCommandSamples.queryDeviceStatus as any
);
setTimeout(() => {
console.log("发送查询设备电量指令");
sendCommand({
value: queryDeviceArrayBuffer,
});
}, 20000);
}
});
}
}