From 71d57fc628d4583b10a2d3943bf73c75a3d33b5f Mon Sep 17 00:00:00 2001 From: blak-kong <546598185@qq.com> Date: Tue, 26 Mar 2024 18:02:02 +0800 Subject: [PATCH] . --- src/moduleIOT/pages/iotCarePlan/FR200.tsx | 297 +-------------- .../iotCarePlan/components/Bluetoot/FR200.ts | 357 ++++++++++++++++++ 2 files changed, 374 insertions(+), 280 deletions(-) create mode 100644 src/moduleIOT/pages/iotCarePlan/components/Bluetoot/FR200.ts diff --git a/src/moduleIOT/pages/iotCarePlan/FR200.tsx b/src/moduleIOT/pages/iotCarePlan/FR200.tsx index 774d027..ff050d4 100644 --- a/src/moduleIOT/pages/iotCarePlan/FR200.tsx +++ b/src/moduleIOT/pages/iotCarePlan/FR200.tsx @@ -22,10 +22,7 @@ import { Button, } from "@tarojs/components"; -import { - notifyBLECharacteristicValueChange, - sendCommand, -} from "@/utils/bluetoothWXAPI"; +import { sendCommand } from "@/utils/bluetoothWXAPI"; import { deviceCommandSamples, bleCommandSamples, @@ -69,6 +66,8 @@ import Gears from "./components/Gears"; import "./FR200.less"; +import BluetoothContainer from "./components/Bluetoot/FR200"; + const deviceToolKitInstanceFR200 = new DeviceToolKitWM("FR200"); let deviceToolKitInstance = deviceToolKitInstanceFR200; @@ -469,9 +468,16 @@ class IotCarePlanFR200 extends Component { // 监听蓝牙连接状态改变 Taro.onBLEConnectionStateChange(this.listener); - await this.notifyBLECharacteristicValueChange(); + let bluetoothContainer = new BluetoothContainer( + this.props.bluetoothInfo, + deviceToolKitInstance, + this + ); + bluetoothContainer.notifyBLECharacteristicValueChange(); - // this.handleWorkStatus(false, MODE_WORKING_ENUM.STANDBY); + setTimeout(() => { + this.handleWorkStatus(false, MODE_WORKING_ENUM.STANDBY); + }, 1000); } listener = (res) => { console.log("listener res", res); @@ -973,275 +979,6 @@ class IotCarePlanFR200 extends Component { } }; - // 蓝牙特征更改 - notifyBLECharacteristicValueChange = () => { - console.log("notifyBLECharacteristicValueChange deviceInfo 参数为=>"); - const bluetoothInfo = this.props.bluetoothInfo; - notifyBLECharacteristicValueChange({ - deviceId: bluetoothInfo.deviceId, - servicesuuid: bluetoothInfo.servicesuuid, - characteristicsuuid1: bluetoothInfo.characteristicsuuid1, - characteristicsuuid0: bluetoothInfo.characteristicsuuid0, - }).then((res) => { - Taro.onBLECharacteristicValueChange((value) => { - const jsonStatus: any = deviceToolKitInstance.toJsonStatus(value.value); - console.log( - "onBLECharacteristicValueChange jsonStatus => ", - jsonStatus - ); - if (!jsonStatus || jsonStatus == null) { - return; - } - this.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.switchBLEMatch(jsonStatus); - break; - //设备状态同步 - case "DeviceStatusSync": - if (jsonStatus.battery) { - // 防止抖动 - this.setState({ - Electricity: jsonStatus.battery, - }); - } - - switch (jsonStatus.workStatus) { - case "standby": - //设备的待机状态 可能workMode字段为空 - console.log("设备状态同步 待机状态", jsonStatus); - if (this.BaseModeType.includes(jsonStatus.workMode)) { - this.openTips("检测到您的设备没有紧贴肌肤,请紧贴肌肤"); - } - break; - case "pause": - //设备的暂停状态 - console.log("设备状态同步 暂停状态", jsonStatus); - if (this.BaseModeType.includes(jsonStatus.workMode)) { - this.openTips( - "检测到您的设备没有紧贴肌肤,请紧贴肌肤后重新尝试" - ); - } - break; - case "working": - //设备的运行中状态 - console.log("设备状态同步 工作中状态", jsonStatus.workMode); - - // 脸部模式 - if (this.BaseModeType.includes(jsonStatus.workMode)) { - this.closeTips(); - } - - break; - default: - break; - } - if (jsonStatus.workMode === "moistureTest") { - if ("success" === jsonStatus.testStatus) { - let waterStepList = this.state.waterStepList; - // 到达第几个step - let waterStepIndex = this.state.waterStepIndex; - - // 代表5秒以后最后拿到的结果 - if (waterStepList[waterStepIndex].finish) { - // 获取等级 - waterStepList[waterStepIndex].forehead = - jsonStatus.waterLevel; - // 检测完成 - if (waterStepIndex === 2) { - this.setState({ - isRuningTest: 4, - }); - } else { - // 启动检测 - this.setState({ - isRuningTest: 1, - }); - } - // 一共有3条数据 - let num = waterStepIndex; - if (waterStepIndex < 2) { - num = waterStepIndex + 1; - this.waterTestNext(num); - } - this.setState({ - waterStepIndex: num, - waterStepList, - }); - } - } else { - let waterStepList = this.state.waterStepList; - let waterStepIndex = this.state.waterStepIndex; - // 5秒后获取的结果 - if (waterStepList[waterStepIndex].finish) { - // 获取失败后,把进度条清理0 - waterStepList[waterStepIndex].schedule = 0; - waterStepList[waterStepIndex].finish = false; - this.setState({ - waterStepList, - isRuningTest: 3, - }); - } - } - // 水分测试 - // testStatus:success - } - - console.log("设备运行中?", this.isRuning); - if (jsonStatus?.workMode === this.state.ActiveModeItem.modeType) { - if (this.state.workMode !== jsonStatus?.workMode) { - this.setState({ - workMode: jsonStatus?.workMode, // 仅当设备上报模式与小程序一致时,才允许改变小程序变量缓存 - }); - } - - // 判断设备是否在运行中(护理中) - // 仅当设备模式与小程序是否一致,才允许更改设备运行时间 - if (this.isRuning) { - if ( - this.state.DeviceConnectStatus === 1 && - jsonStatus.workStatus !== MODE_WORKING_ENUM.END - ) { - // 水分测试手动检测时间,不自动计算倒计时 - if (jsonStatus?.workMode !== "moistureTest") - this.updateDeviceSyncData( - { - totalWorkingMinutes: jsonStatus.totalWorkingMinutes, - totalWorkingSeconds: jsonStatus.totalWorkingSeconds, - }, - jsonStatus - ); - } - } - } - - break; - //设备对控制指令的响应 - case "DeviceControl": - console.log("设备控制响应", jsonStatus); - if (jsonStatus.responseStatus == "OK") { - console.log("发送控制指令成功"); - this.workJsonStatus = jsonStatus; - this.workStatus = jsonStatus.workStatus; - - setTimeout(() => console.log("this.workStatus", this.workStatus)); - if (jsonStatus.battery) { - this.setState({ - Electricity: jsonStatus.battery, - }); - } - - // 判断设备主动上报的关机事件 - if (jsonStatus.workStatus === MODE_WORKING_ENUM.END) { - // 判断id是否一致, 一致的话则生成护理报表, 并提示 - if (jsonStatus.id == this.FR200NursingHistory.id) { - debounce( - this.checkInstrumentRecord.bind(this, jsonStatus), - 500 - ); - } - return; - } - - if (jsonStatus?.workMode === this.state.ActiveModeItem.modeType) { - this.setState({ - workMode: jsonStatus?.workMode, // 仅当设备上报模式与小程序一致时,才允许改变小程序变量缓存 - }); - - // 判断是否在isRuning(护理中) - // 仅当设备模式与小程序是否一致,才允许更改设备运行时间 - if ( - this.state.DeviceConnectStatus === 1 && - this.isRuning && - jsonStatus.workStatus !== MODE_WORKING_ENUM.END - ) { - this.updateDeviceSyncData( - { - totalWorkingMinutes: jsonStatus.totalWorkingMinutes, - totalWorkingSeconds: jsonStatus.totalWorkingSeconds, - }, - jsonStatus - ); - } - } - - if ( - jsonStatus.workMode === MODE_WORKING_ENUM.WORKING && - this.isRuning - ) { - const { ActiveModeItem } = this.state; - const item = ActiveModeItem; - if (jsonStatus.workMode !== item.modeType) { - clearTimeout(loadingTipsTimer); - this.setState({ - isShowCountdown: false, - }); - } - } - } - break; - // 设备对信息查询指令的响应 - case "InfoQuery": - console.log("设备对信息查询指令的响应 InfoQuery", jsonStatus); - switch (jsonStatus.infoQueryType) { - // 离线记录 - case "offlineClockInInfo": - console.log("离线记录", jsonStatus); - break; - // 版本信息 - case "versionInfo": - console.log("版本信息", jsonStatus); - break; - // 时间同步 - case "timeSync": - console.log("时间同步", jsonStatus); - break; - default: - break; - } - break; - default: - break; - } - }); - - /** - * 延迟600毫秒获取附属设备状态 - */ - const querySubDeviceArrayBuffer = deviceToolKitInstance.toBleCommand({ - ...bleCommandSamples.querySubDevice, - queryType: "WL200", - } as any); - setTimeout(() => { - console.log("发送查询附属设备指令 querySubDeviceArrayBuffer"); - sendCommand({ - value: querySubDeviceArrayBuffer, - }); - }, 600); - - /** - * 延迟500毫秒获取设备电量 - */ - const queryDeviceArrayBuffer = deviceToolKitInstance.toBleCommand( - bleCommandSamples.queryDeviceStatus as any - ); - setTimeout(() => { - console.log("发送查询设备电量指令"); - sendCommand({ - value: queryDeviceArrayBuffer, - }); - }, 500); - }); - }; - /**监听关机事件*/ onEndDevice = () => { this.rmFR200NursingHistory(this.FR200NursingHistory, true); @@ -1270,15 +1007,15 @@ class IotCarePlanFR200 extends Component { const { totalWorkingMinutes, totalWorkingSeconds } = DeviceSyncData; let { ActiveModeItem, currentTime } = this.state; const totalTime = totalWorkingMinutes * 60 + totalWorkingSeconds; - console.log("仪器上报的已经运行的总秒数", totalTime); - console.log("时间校准频率,默认5秒一次", TIME_CALIBRATION_FREQUENCY); + // console.log("仪器上报的已经运行的总秒数", totalTime); + // console.log("时间校准频率,默认5秒一次", TIME_CALIBRATION_FREQUENCY); //对比仪器上报运行的总秒数 和小程序页面运行的已经运行的总秒数,如果不一致就进行校准 let sceneTime = ActiveModeItem?.breakTimeStr ? minSecToS(ActiveModeItem.breakTimeStr) : minSecToS(this.state.currentVideoTime); // 场景时间 - console.log("场景时间 sceneTime", sceneTime); - console.log("当前显示时间 currentTime", currentTime); + // console.log("场景时间 sceneTime", sceneTime); + // console.log("当前显示时间 currentTime", currentTime); console.log("设备运行时间 totalTime", totalTime); // 更新界面倒计时 @@ -2137,7 +1874,7 @@ class IotCarePlanFR200 extends Component { } Taro.setStorageSync("FR200NursingHistory", params); - console.log("更新updateFR200NursingHistory"); + // console.log("更新updateFR200NursingHistory"); // 基础模式可在这里调用函数更新图标Echarts // 最新一条数据jsonStatus diff --git a/src/moduleIOT/pages/iotCarePlan/components/Bluetoot/FR200.ts b/src/moduleIOT/pages/iotCarePlan/components/Bluetoot/FR200.ts new file mode 100644 index 0000000..e6d1c77 --- /dev/null +++ b/src/moduleIOT/pages/iotCarePlan/components/Bluetoot/FR200.ts @@ -0,0 +1,357 @@ +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, // 仅当设备上报模式与小程序一致时,才允许改变小程序变量缓存 + }); + } + // 判断设备是否在运行中(护理中) + // 仅当设备模式与小程序是否一致,才允许更改设备运行时间 + 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); + } + }); + } +} \ No newline at end of file