480 lines
12 KiB
Vue
480 lines
12 KiB
Vue
|
<template>
|
|||
|
<view class="uni-wrap">
|
|||
|
<uni-section class="mb-10" title="设备信息" type="line" titleFontSize="16">
|
|||
|
<template v-slot:right>
|
|||
|
<view @click="scanQR" :disabled="connected">
|
|||
|
<uni-icons type="scan" size="16"></uni-icons>
|
|||
|
<text style="padding-left: 5px;">扫码绑定</text>
|
|||
|
</view>
|
|||
|
</template>
|
|||
|
<uni-row>
|
|||
|
<uni-col :span="20">
|
|||
|
<text class="title">{{deviceId ? `已绑定设备:${deviceId}` : '未绑定设备'}}</text>
|
|||
|
<text class="title" v-if="power>0" style="padding-left: 5px;">电量:{{power}}</text>
|
|||
|
</uni-col>
|
|||
|
<uni-col :span="4">
|
|||
|
<button @click="toggleConnect()" type="primary" :plain="connected" :disabled="deviceId == ''" size="mini">
|
|||
|
{{connected ? '断开' : '连接'}}
|
|||
|
</button>
|
|||
|
</uni-col>
|
|||
|
</uni-row>
|
|||
|
</uni-section>
|
|||
|
<uni-section class="mb-10" title="数据测量" type="line" titleFontSize="16">
|
|||
|
<!-- <uni-data-select
|
|||
|
label="选择设备"
|
|||
|
v-model="r.device_name"
|
|||
|
:localdata="devices"
|
|||
|
:clear="false"
|
|||
|
>
|
|||
|
</uni-data-select>
|
|||
|
<uni-data-select
|
|||
|
label="选择测点"
|
|||
|
v-model="r.check_point"
|
|||
|
:localdata="checkPoints"
|
|||
|
:clear="false"
|
|||
|
>
|
|||
|
</uni-data-select> -->
|
|||
|
<uni-row>
|
|||
|
<uni-col :span="12">
|
|||
|
<button @click="collectVib()" type="primary" :disabled="!connected || processing">测振</button>
|
|||
|
</uni-col>
|
|||
|
<uni-col :span="12">
|
|||
|
<view class="padding">
|
|||
|
<button @click="collectTemp()" type="primary" :disabled="!connected || processing">测温</button>
|
|||
|
</view>
|
|||
|
</uni-col>
|
|||
|
</uni-row>
|
|||
|
<uni-row class="text">
|
|||
|
<uni-col>
|
|||
|
<text class="title">速度:{{r.velocity}} mm/s</text>
|
|||
|
</uni-col>
|
|||
|
</uni-row>
|
|||
|
<uni-row class="text">
|
|||
|
<uni-col>
|
|||
|
<text class="title">加速度:{{r.acceleration}} m/s<sup>2</sup></text>
|
|||
|
</uni-col>
|
|||
|
</uni-row>
|
|||
|
<uni-row class="text">
|
|||
|
<uni-col>
|
|||
|
<text class="title">位移:{{r.displacement}} µm</text>
|
|||
|
</uni-col>
|
|||
|
</uni-row>
|
|||
|
<uni-row class="text">
|
|||
|
<uni-col>
|
|||
|
<text class="title">温度:{{r.temperature}} °C</text>
|
|||
|
</uni-col>
|
|||
|
</uni-row>
|
|||
|
<uni-row>
|
|||
|
<uni-col>
|
|||
|
<view class="padding">
|
|||
|
<button @click="save()" type="primary" :disabled="saved">保存</button>
|
|||
|
</view>
|
|||
|
</uni-col>
|
|||
|
</uni-row>
|
|||
|
</uni-section>
|
|||
|
<uni-section class="mb-10" title="数据查看" type="line" titleFontSize="16">
|
|||
|
<uni-row>
|
|||
|
<uni-col :span="12">
|
|||
|
<view class="padding">
|
|||
|
<button @click="toPage('/pages/records/records')" type="primary">查看历史数据</button>
|
|||
|
</view>
|
|||
|
</uni-col>
|
|||
|
<uni-col :span="12">
|
|||
|
<view class="padding">
|
|||
|
<button @click="toPage('/pages/records/chart')" type="primary">查看趋势图</button>
|
|||
|
</view>
|
|||
|
</uni-col>
|
|||
|
</uni-row>
|
|||
|
</uni-section>
|
|||
|
<view class="content">
|
|||
|
<text>{{msg}}</text>
|
|||
|
</view>
|
|||
|
<uni-popup ref="popup" :is-mask-click="false">
|
|||
|
<view class="chart-pop">
|
|||
|
<uni-card>
|
|||
|
<uni-row>
|
|||
|
<uni-col>
|
|||
|
<l-echart ref="wChart" @finished="initChart" custom-style="width:100%;"></l-echart>
|
|||
|
</uni-col>
|
|||
|
</uni-row>
|
|||
|
<uni-row>
|
|||
|
<uni-col :span="8">
|
|||
|
<view class="center">
|
|||
|
<button @click="closePop()" size="mini">取消</button>
|
|||
|
</view>
|
|||
|
</uni-col>
|
|||
|
<uni-col :span="8">
|
|||
|
<view class="center">
|
|||
|
<button @click="collectVib()" size="mini">重测</button>
|
|||
|
</view>
|
|||
|
</uni-col>
|
|||
|
<uni-col :span="8">
|
|||
|
<view class="center">
|
|||
|
<button @click="saveCheck()" size="mini" type="primary">保存</button>
|
|||
|
</view>
|
|||
|
</uni-col>
|
|||
|
</uni-row>
|
|||
|
</uni-card>
|
|||
|
</view>
|
|||
|
</uni-popup>
|
|||
|
</view>
|
|||
|
</template>
|
|||
|
|
|||
|
<script>
|
|||
|
import Vue from 'vue';
|
|||
|
import db from '@/service/db';
|
|||
|
import {devices, checkPoints} from '@/service/common';
|
|||
|
import * as echarts from '@/uni_modules/lime-echart/static/echarts.min';
|
|||
|
|
|||
|
const Ewg = uni.requireNativePlugin('UniCollectionUtils');
|
|||
|
let vibData = {
|
|||
|
velocity: null,
|
|||
|
acceleration: null,
|
|||
|
displacement: null,
|
|||
|
wave: [],
|
|||
|
power: -1,
|
|||
|
};
|
|||
|
|
|||
|
function now() {
|
|||
|
const _now = formatTime(new Date());
|
|||
|
return _now;
|
|||
|
}
|
|||
|
function formatTime(d, fmt = 'yyyy-MM-dd hh:mm:ss') {
|
|||
|
const opt = {
|
|||
|
'y+': d.getFullYear().toString(), // 年
|
|||
|
'M+': (d.getMonth() + 1).toString(), // 月
|
|||
|
'd+': d.getDate().toString(), // 日
|
|||
|
'h+': d.getHours().toString(), // 时
|
|||
|
'm+': d.getMinutes().toString(), // 分
|
|||
|
's+': d.getSeconds().toString() // 秒
|
|||
|
}
|
|||
|
let dateString = fmt;
|
|||
|
for (const k in opt) {
|
|||
|
const ret = new RegExp('(' + k + ')').exec(dateString);
|
|||
|
if (ret) {
|
|||
|
if (/(y+)/.test(k)) {
|
|||
|
dateString = dateString.replace(ret[1], opt[k].substring(4 - ret[1].length))
|
|||
|
} else {
|
|||
|
dateString = dateString.replace(ret[1], (ret[1].length === 1) ? (opt[k]) : (opt[k].padStart(ret[1].length, '0')))
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
return dateString;
|
|||
|
}
|
|||
|
|
|||
|
export default Vue.extend({
|
|||
|
data() {
|
|||
|
const r = {
|
|||
|
temperature: null,
|
|||
|
velocity: null,
|
|||
|
acceleration: null,
|
|||
|
displacement: null,
|
|||
|
create_time: null,
|
|||
|
operate_time: null,
|
|||
|
wave: null,
|
|||
|
};
|
|||
|
return {
|
|||
|
buttonTitle: '连接设备',
|
|||
|
msg: '.',
|
|||
|
deviceId: '',
|
|||
|
power: -1,
|
|||
|
connected: false,
|
|||
|
processing: false,
|
|||
|
saved: true,
|
|||
|
r,
|
|||
|
extraIcon: {
|
|||
|
size: '22',
|
|||
|
type: 'list'
|
|||
|
},
|
|||
|
devices,
|
|||
|
checkPoints
|
|||
|
};
|
|||
|
},
|
|||
|
onLoad() {
|
|||
|
uni.setNavigationBarTitle({
|
|||
|
title: '蓝牙测振Demo V' + uni.getAppBaseInfo().appVersion
|
|||
|
});
|
|||
|
uni.getStorage({
|
|||
|
key: 'deviceId',
|
|||
|
success: (res) => {
|
|||
|
console.log(`get deivceId: ${res.data}`);
|
|||
|
this.deviceId = res.data;
|
|||
|
}
|
|||
|
});
|
|||
|
plus.android.requestPermissions(["android.permission.ACCESS_FINE_LOCATION"], (i) => {
|
|||
|
console.log('permission granted: ' + i);
|
|||
|
}, (e) => {
|
|||
|
console.error('prmission grant error: ' + e);
|
|||
|
});
|
|||
|
// initBL();
|
|||
|
},
|
|||
|
onUnload() {
|
|||
|
},
|
|||
|
methods: {
|
|||
|
toggleConnect() {
|
|||
|
uni.showLoading({ title: '加载中' });
|
|||
|
if (this.connected) {
|
|||
|
Ewg.disConnect(this.deviceId, (res) => {
|
|||
|
console.log("断开设备", JSON.stringify((res)));
|
|||
|
this.msg = '设备已断开';
|
|||
|
this.connected = false;
|
|||
|
uni.hideLoading();
|
|||
|
});
|
|||
|
}
|
|||
|
else {
|
|||
|
Ewg.connect(this.deviceId, (res) => {
|
|||
|
console.log("连接设备", JSON.stringify((res)))
|
|||
|
this.msg = '设备已连接';
|
|||
|
this.connected = true;
|
|||
|
uni.hideLoading();
|
|||
|
});
|
|||
|
}
|
|||
|
},
|
|||
|
collectTemp() {
|
|||
|
this.msg = '正在测温';
|
|||
|
uni.showLoading({ title: this.msg });
|
|||
|
this.processing = true;
|
|||
|
this.r.temperature = null;
|
|||
|
Ewg.collectTemp("0.95", (res) => {
|
|||
|
console.log("测温", JSON.stringify((res)));
|
|||
|
this.stop();
|
|||
|
if (res.result == 0) {
|
|||
|
this.r.temperature = res.temperature;
|
|||
|
this.r.operate_time = now();
|
|||
|
this.power = res.battery;
|
|||
|
this.msg = `温度结果:${JSON.stringify((res))}`;
|
|||
|
this.saved = false;
|
|||
|
}
|
|||
|
else {
|
|||
|
this.r.temperature = null;
|
|||
|
this.power = -1;
|
|||
|
this.msg = `测温异常:${JSON.stringify((res))}`;
|
|||
|
}
|
|||
|
uni.hideLoading();
|
|||
|
});
|
|||
|
},
|
|||
|
collectVib() {
|
|||
|
this.msg = '正在测振';
|
|||
|
this.openPop();
|
|||
|
uni.showLoading({ title: this.msg });
|
|||
|
// TODO: 调整清除数据的内容
|
|||
|
this.processing = true;
|
|||
|
this.r.velocity = null;
|
|||
|
this.r.acceleration = null;
|
|||
|
this.r.displacement = null;
|
|||
|
this.r.wave = null;
|
|||
|
console.log('开始测振');
|
|||
|
// 0 --加速度 1--速度 2--位移
|
|||
|
Ewg.collectVib(1, true, (res) => { // 注意:只有带波形时才会把在个值都返回
|
|||
|
this.stop();
|
|||
|
if (res.result == 0) {
|
|||
|
vibData.velocity = res.speedValue;
|
|||
|
vibData.acceleration = res.accValue;
|
|||
|
vibData.displacement = res.disValue;
|
|||
|
vibData.wave = res.waveData;
|
|||
|
vibData.power = res.battery;
|
|||
|
this.waveChart();
|
|||
|
// this.r.velocity = res.speedValue;
|
|||
|
// this.r.acceleration = res.accValue;
|
|||
|
// this.r.displacement = res.disValue;
|
|||
|
// this.r.wave = res.waveData!.join(',');
|
|||
|
// this.r.operate_time = now();
|
|||
|
// this.power = res.battery;
|
|||
|
// this.msg = `温振完成`;
|
|||
|
// this.saved = false;
|
|||
|
}
|
|||
|
else {
|
|||
|
this.r.velocity = null;
|
|||
|
this.r.acceleration = null;
|
|||
|
this.r.displacement = null;
|
|||
|
this.r.wave = null;
|
|||
|
this.power = -1;
|
|||
|
this.msg = `测振异常:${JSON.stringify((res))}`;
|
|||
|
}
|
|||
|
uni.hideLoading();
|
|||
|
});
|
|||
|
},
|
|||
|
stop() {
|
|||
|
Ewg.stopCollect();
|
|||
|
this.msg = '停止测量';
|
|||
|
this.processing = false;
|
|||
|
},
|
|||
|
scanQR() {
|
|||
|
uni.scanCode({
|
|||
|
onlyFromCamera: true,
|
|||
|
scanType: ['qrCode'],
|
|||
|
success: (res) => {
|
|||
|
const did = res.result;
|
|||
|
console.log(`条码内容:${did}`);
|
|||
|
if (did?.startsWith('expert-')) {
|
|||
|
this.deviceId = did.substring('expert-'.length);
|
|||
|
uni.setStorageSync('deviceId', this.deviceId);
|
|||
|
}
|
|||
|
else {
|
|||
|
this.msg = `error device: ${did}`;
|
|||
|
}
|
|||
|
}
|
|||
|
});
|
|||
|
},
|
|||
|
save() {
|
|||
|
console.log(JSON.stringify(this.r));
|
|||
|
// if (!this.r.check_point || !this.r.device_name) {
|
|||
|
// uni.showModal({
|
|||
|
// title: '提醒',
|
|||
|
// showCancel: false,
|
|||
|
// content: `请选择'设备'及'测点'`
|
|||
|
// });
|
|||
|
// return;
|
|||
|
// }
|
|||
|
db.insertTableData('records', this.r).then(
|
|||
|
() => {
|
|||
|
this.saved = true;
|
|||
|
this.msg = '测量数据已保存';
|
|||
|
uni.showToast({
|
|||
|
title: '保存成功',
|
|||
|
icon: 'success',
|
|||
|
mask: true
|
|||
|
});
|
|||
|
},
|
|||
|
(e) => {
|
|||
|
this.saved = false;
|
|||
|
console.log(`保存失败:${JSON.stringify(e)}`);
|
|||
|
this.msg = '测量数据保存失败';
|
|||
|
uni.showModal({
|
|||
|
title: '保存失败',
|
|||
|
showCancel: false,
|
|||
|
content: JSON.stringify(e)
|
|||
|
});
|
|||
|
}
|
|||
|
);
|
|||
|
},
|
|||
|
toPage(path) {
|
|||
|
uni.navigateTo({
|
|||
|
url: path
|
|||
|
});
|
|||
|
},
|
|||
|
openPop() {
|
|||
|
this.$refs.popup.open();
|
|||
|
},
|
|||
|
async initChart() {
|
|||
|
this.$refs.wChart.init(echarts,
|
|||
|
chart => chart.setOption({
|
|||
|
// grid: {
|
|||
|
// left: 40,
|
|||
|
// right: 110
|
|||
|
// },
|
|||
|
// tooltip: {
|
|||
|
// },
|
|||
|
xAxis: {
|
|||
|
type: 'category',
|
|||
|
name: '时间(ms)',
|
|||
|
splitLine: {
|
|||
|
show: true
|
|||
|
},
|
|||
|
axisLabel: {
|
|||
|
formatter: function (value, index) {
|
|||
|
return Math.round(value * 10) / 10;
|
|||
|
},
|
|||
|
// showMaxLabel: true,
|
|||
|
},
|
|||
|
},
|
|||
|
yAxis: [
|
|||
|
// {
|
|||
|
// type: 'value',
|
|||
|
// boundaryGap: [0, '100%'],
|
|||
|
// splitLine: {
|
|||
|
// show: false
|
|||
|
// }
|
|||
|
{
|
|||
|
position: 'left',
|
|||
|
type: 'value',
|
|||
|
name: '速度(mm/s)',
|
|||
|
axisLine: {
|
|||
|
show: true
|
|||
|
},
|
|||
|
splitLine: {
|
|||
|
show: true
|
|||
|
}
|
|||
|
}
|
|||
|
],
|
|||
|
series: [{
|
|||
|
type: 'line',
|
|||
|
smooth: true,
|
|||
|
name: '速度',
|
|||
|
yAxisIndex: 0,
|
|||
|
}]
|
|||
|
}),
|
|||
|
{ locale: "ZH" },
|
|||
|
);
|
|||
|
uni.onWindowResize(res => {
|
|||
|
this.$refs.wChart?.resize();
|
|||
|
});
|
|||
|
},
|
|||
|
closePop() {
|
|||
|
this.$refs.popup.close();
|
|||
|
},
|
|||
|
saveCheck() {
|
|||
|
this.r.acceleration = vibData.acceleration;
|
|||
|
this.r.displacement = vibData.displacement;
|
|||
|
this.r.velocity = vibData.velocity;
|
|||
|
this.r.wave = vibData.wave.join(',');
|
|||
|
this.r.operate_time = now();
|
|||
|
this.power = vibData.power;
|
|||
|
this.msg = `温振完成`;
|
|||
|
this.saved = false;
|
|||
|
this.closePop();
|
|||
|
},
|
|||
|
waveChart() {
|
|||
|
const wave = vibData.wave;
|
|||
|
const point = wave.length;
|
|||
|
const samplingRate = 5120;
|
|||
|
const times = [];
|
|||
|
const duration = (1000 * point) / samplingRate;
|
|||
|
console.log(`duration: ${duration}`);
|
|||
|
const timespace = duration / (point - 1);
|
|||
|
for (let i = 0; i < point; i++) {
|
|||
|
times.push(i * timespace);
|
|||
|
}
|
|||
|
this.$refs.wChart.setOption({xAxis: {data: times}, series: [{data: wave}]});
|
|||
|
}
|
|||
|
}
|
|||
|
});
|
|||
|
</script>
|
|||
|
|
|||
|
<style>
|
|||
|
.uni-wrap {
|
|||
|
background-color: #efeff4;
|
|||
|
}
|
|||
|
|
|||
|
.uni-row {
|
|||
|
padding: 10px;
|
|||
|
}
|
|||
|
|
|||
|
.uni-row.text {
|
|||
|
padding-top: 2px;
|
|||
|
padding-bottom: 2px;
|
|||
|
}
|
|||
|
|
|||
|
.padding {
|
|||
|
padding: 0 5px;
|
|||
|
}
|
|||
|
|
|||
|
.mb-10 {
|
|||
|
margin-bottom: 10px;
|
|||
|
}
|
|||
|
|
|||
|
.content {
|
|||
|
padding: 20px;
|
|||
|
background-color: #fff;
|
|||
|
}
|
|||
|
.title {
|
|||
|
font-size: 16px;
|
|||
|
}
|
|||
|
.chart-pop {
|
|||
|
width: 100vw;
|
|||
|
}
|
|||
|
.center {
|
|||
|
display:flex;
|
|||
|
justify-content:center;
|
|||
|
}
|
|||
|
</style>
|