修改蓝牙断开问题,增加剩料收集页面

This commit is contained in:
liuwu 2023-11-03 16:30:27 +08:00
parent c4e435b40b
commit d114d3a7b8
5 changed files with 431 additions and 82 deletions

288
html/config.html Normal file
View File

@ -0,0 +1,288 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<link rel="stylesheet" href="../css/mui_min.css">
<link href="../css/mui_picker_min.css" rel="stylesheet"/>
<link href="../css/mui_poppicker_css" rel="stylesheet"/>
<script src="../script/api.js"></script>
<script src="../script/mui.min.js"></script>
<script src="../script/mui.picker.min.js"></script>
<script src="../script/mui.poppicker.js"></script>
</head>
<style>
.head {
height: 10vh;
box-sizing: border-box;
border: 1px solid #a3caef;
}
.content{
height: 79vh;
box-sizing: border-box; border: 1px solid #a3caef;
}
.footer{
height: 10vh;
box-sizing: border-box; border: 1px solid #a3caef;
}
/*.content {*/
/* width: 100%;*/
/* height: 100vh;*/
/* box-sizing: border-box;*/
/* !* background-color: #007aff; *!*/
/* border: 1px solid #a3caef;*/
/*}*/
.form {
box-sizing: border-box;
border: 1px solid #a3caef;
margin: 10px;
padding: 10px;
}
input {
font-size: xx-large;
width: 300px;
box-sizing: border-box;
border: 1px solid #a3caef;
}
button {
border-radius: 20px;
}
.flex {
/*flex 布局*/
display: flex;
/*实现垂直居中*/
align-items: center;
/*实现水平居中*/
justify-content: center;
text-align: justify;
width: 100%;
}
.flex1 {
/*flex 布局*/
display: flex;
/*实现垂直居中*/
align-items: center;
/*实现水平居中*/
justify-content: flex-start;
text-align: justify;
width: 100%;
}
</style>
<body>
<div class="mui-row">
<div class="head flex mui-row">
<div class="mui-col-sm-3" style="display:flex;align-items: center;">
<button class="btnc mui-btn-inline mui-btn-danger" onclick="handleBackMain()">返回</button>
</div>
<div class="mui-col-sm-9" style="display:flex;justify-content: flex-end;">
<button class="btnc mui-btn-inline mui-btn-danger" onclick="closeApp()" type='button'>关闭系统</button>
</div>
</div>
<!--中间内容开始-->
<div class="mui-row content">
<div class="mui-col-sm-4">
<div class="mui-row form flex1">
<button class="mui-btn-inline mui-btn-info" style="font-size: large;" type='button'>绑定设备</button>
<button id='initsb' class="mui-btn-inline mui-btn-primary" style="font-size: large;" type='button'>
请选择设备
</button>
<button class="mui-btn-inline mui-btn-success" style="font-size: large;" onclick="initsb()">保存
</button>
</div>
<div class="mui-row form flex1">
<button class="mui-btn-inline mui-btn-info" style="font-size: large;" type='button'>默认页面</button>
<button id='initpage' class="mui-btn-inline mui-btn-primary" style="font-size: large;" type='button'>
请选择页面
</button>
<input id="indexPage" type="hidden" value="">
<button class="mui-btn-inline mui-btn-success" style="font-size: large;" onclick="initpage()">保存
</button>
</div>
</div>
<div class="mui-col-sm-4">
</div>
</div>
<div class="footer flex mui-row">
<div class="mui-col-sm-12 flex"style="width:100%;height:8vh;white-space: nowrap !important;overflow-x: scroll;" id="list">
</div>
</div>
</div>
<script>
var carListener = null;
var pageListener = null;
var userPicker;
var pagePicker;
var pickData = [];
var btnArray = ['取消', '<b style="font-weight:900">确认</b>'];
var pageData = []
pageData.push({value: "index", text: "首页"})
pageData.push({value: "index1", text: "装料页面"})
pageData.push({value: "collection", text: "剩料收集页面"})
pageData.push({value: "config", text: "设置页面"})
function init() {
}
var apiready = function apiready() {
initSbList()
init()
muiInitPage()
var indexPage = api.getPrefs({
sync: true,
key: 'initpage'
});
if (indexPage) {
pageData.forEach(p => {
if (indexPage === p.value) {
document.getElementById('initpage').innerHTML = p.text
}
})
}
}
//返回主页
function handleBackMain() {
api.closeWin();
}
function closeApp() {
mui.confirm('确认关闭TMR饲喂系统', '提示', btnArray, function (e) {
if (e.index == 0) {
} else {
api.closeWidget({
id: api.appId, //应用ID
retData: {name: 'closeWidget'},
silent: true
});
}
});
}
// 初始化设备查询
function initSbList() {
pickData = [];
api.ajax({
url: 'https://tmr.nxcyx.com/api/app/tmr/sbList?sourceCow=' + api.getPrefs({sync: true, key: 'sourceCow'}),
method: 'get',
timeout: 5
}, function (ret, err) {
if (ret) {
var initsb = api.getPrefs({
sync: true,
key: 'initsb'
});
ret.data.forEach(function (e) {
if (initsb === e.name) {
var json = {value: e.sbId, text: e.name};
pickData.push(json);
}
});
ret.data.forEach(function (e) {
if (initsb !== e.name) {
var json = {value: e.sbId, text: e.name};
pickData.push(json);
}
});
document.getElementById('initsb').innerHTML = pickData[0].text;
muiInit();
} else {
mui.alert("sbList:" + err.msg);
}
});
}
// 初始化设备下拉
function muiInit() {
(function ($, doc) {
$.init();
$.ready(function () {
/**
* 获取对象属性的值
* 主要用于过滤三级联动中,可能出现的最低级的数据不存在的情况,实际开发中需要注意这一点;
* @param {Object} obj 对象
* @param {String} param 属性名
*/
var _getParam = function _getParam(obj, param) {
return obj[param] || '';
};
if (userPicker) {
} else {
userPicker = new $.PopPicker();
var showUserPickerButton = doc.getElementById('initsb');
carListener = null;
carListener = showUserPickerButton.addEventListener('tap', function (event) {
userPicker.show(function (items) {
console.log('设备切换');
showUserPickerButton.innerHTML = items[0].text;
});
}, false);
}
userPicker.setData(pickData);
});
})(mui, document);
}
function muiInitPage() {
(function ($, doc) {
$.init();
$.ready(function () {
/**
* 获取对象属性的值
* 主要用于过滤三级联动中,可能出现的最低级的数据不存在的情况,实际开发中需要注意这一点;
* @param {Object} obj 对象
* @param {String} param 属性名
*/
var _getParam = function _getParam(obj, param) {
return obj[param] || '';
};
if (pagePicker) {
} else {
pagePicker = new $.PopPicker();
var showPagePickerButton = doc.getElementById('initpage');
pageListener = null;
pageListener = showPagePickerButton.addEventListener('tap', function (event) {
pagePicker.show(function (items) {
console.log('设备切换');
document.getElementById('indexPage').value = items[0].value;
showPagePickerButton.innerHTML = items[0].text;
});
}, false);
}
pagePicker.setData(pageData);
});
})(mui, document);
}
function initsb() {
// var value = document.getElementById('initsb').value;
var value = document.getElementById('initsb').innerHTML
if (value) {
api.setPrefs({
key: 'initsb',
value: value
});
mui.alert('绑定设备"' + value + '"成功');
}
}
function initpage() {
var value = document.getElementById('indexPage').value;
if (value) {
api.setPrefs({
key: 'initpage',
value: value
});
var name = document.getElementById('initpage').innerHTML;
mui.alert('默认页面"' + name + '"设置成功');
}
}
</script>
</body>
</html>

View File

@ -109,13 +109,15 @@
<div class="mui-row">
<!--头部信息开始-->
<div class="head flex mui-row">
<div class="mui-col-xs-5" style="display:flex;align-items: center;">
<div class="mui-col-xs-6" style="display:flex;align-items: center;">
<button class="btnc mui-btn-inline mui-btn-danger" onclick="handleBackMain()">返回</button>
<button id='showUserPicker' class="btnc mui-btn-inline mui-btn-primary" type='button'>请选择设备</button>
<text id='batchName' style="font-size: x-large;margin-left:15px;font-weight: 900;"></text>
<button class="btnc mui-btn-inline mui-btn-primary" type='button' onclick="refreshDayPlan()">更新计划</button>
<!-- <button class="btnc mui-btn-inline mui-btn-primary" type='button' onclick="reloadPage()">刷新页面</button> -->
</div>
<div class="mui-col-xs-7" style="display:flex;justify-content: flex-end;">
<div class="mui-col-xs-6" style="display:flex;justify-content: flex-end;">
<button class="btnc mui-btn-inline mui-btn-danger" onclick="closeApp()" type='button'>关闭系统</button>
<button id="driveName" class="btnc mui-btn-info" type="button" onclick="handleBackSys()">机车手</button>
<button id='wifiDom' class="btnc mui-btn-inline mui-btn-info"
@ -210,7 +212,7 @@
var textInterval = null;
var echartsType = '';
var weightStatus = true;
var IFlyVoice = null;
// var IFlyVoice = null;
var text = '';
var speed = '30';
var zfk;
@ -253,8 +255,8 @@
clearInterval(resultInterval);
clearInterval(totalInterval);
clearInterval(textInterval);
IFlyVoice = api.require('IFlyVoice');
IFlyVoice.initSpeechSynthesizer(function (ret) {
// IFlyVoice = api.require('IFlyVoice');
// IFlyVoice.initSpeechSynthesizer(function (ret) {
// textInterval = setInterval(function () {
// console.log(text);
// if (text.length > 0) {
@ -263,24 +265,22 @@
// speed = '30';
// }
// }, 2000);
});
// });
initPage();
setTimeout(function(){
initService()
},1000)
api.addEventListener({
name: 'keyback'
}, function (ret, err) {
mui.confirm('确认关闭TMR饲喂系统', '提示', btnArray, function (e) {
if (e.index == 0) {} else {
api.closeWidget({
id: api.appId, //应用ID
retData: { name: 'closeWidget' },
silent: true
});
}
});
});
initService()
// api.addEventListener({
// name: 'keyback'
// }, function (ret, err) {
// mui.confirm('确认关闭TMR饲喂系统', '提示', btnArray, function (e) {
// if (e.index == 0) {} else {
// api.closeWidget({
// id: api.appId, //应用ID
// retData: { name: 'closeWidget' },
// silent: true
// });
// }
// });
// });
};
function rescan(){
@ -637,7 +637,14 @@ function getDateStr(date) {
allow = json[0].allow;
// 计划
_planSum = json[0].weight.toFixed(0);
allowAuto = _planSum >= 100;
renderUnload();
feedMyChart.setOption({
dataset: {
source: [[1, _feedNum]]
}
});
// 误差小于100必须校准才能自动跳转
allowAuto = false;
document.getElementById('feedNum').innerHTML = '<font style="color:blue">:' + _planSum + '</font>/<font style="color:green">已装:' + _feedNum + '</font>';
text = feedName + _planSum;
batchName = e.className + e.trainNumber;
@ -709,12 +716,26 @@ function getDateStr(date) {
networkStatus = true;
api.hideProgress();
document.getElementById('text').innerHTML = '设备初始化成功';
sbId = ret.data[0].sbId;
document.getElementById('showUserPicker').innerHTML = ret.data[0].name;
ret.data.forEach(function (e) {
var json = { value: e.sbId, text: e.name };
pickData.push(json);
var initsb = api.getPrefs({
sync: true,
key: 'initsb'
});
ret.data.forEach(function (e) {
if (initsb === e.name){
var json = { value: e.sbId, text: e.name };
pickData.push(json);
}
});
ret.data.forEach(function (e) {
if (initsb !== e.name){
var json = { value: e.sbId, text: e.name };
pickData.push(json);
}
});
// sbId = ret.data[0].sbId;
// document.getElementById('showUserPicker').innerHTML = ret.data[0].name;
sbId = pickData[0].value;
document.getElementById('showUserPicker').innerHTML = pickData[0].text;
muiInit();
initTime();
} else {
@ -727,11 +748,16 @@ function getDateStr(date) {
}
// 刷新页面
function reloadPage() {
mui.confirm('确认重新初始化页面么?', '提示', btnArray, function (e) {
if (e.index == 0) {} else {
getWifiInfo();
}
});
api.openWin({
name: 'collection',
reload:true,
url:'../html/collection.html'
})
// mui.confirm('确认重新初始化页面么?', '提示', btnArray, function (e) {
// if (e.index == 0) {} else {
// getWifiInfo();
// }
// });
}
var sid;
// 获取WiFi信息并刷新页面数据

View File

@ -59,7 +59,7 @@ export default {
api.openWin({
name: 'index',
reload:true,
url:'../html/index1.html'
url:'../html/index.html'
})
}
},
@ -263,7 +263,7 @@ export default {
api.openWin({
name: 'index',
reload:true,
url:'../html/index1.html'
url:'../html/index.html'
})
// if (ret.loginUser.sourceCow !=2 ) {
// api.openWin({

View File

@ -3,7 +3,6 @@
function initManager(param) {
ble.initManager(param, function (ret) {
if (ret.state === "poweredOn") {
// console.log("初始化成功");
scan({clean: true});
} else if (ret.state === 'poweredOff') {
api.hideProgress();
@ -46,6 +45,7 @@ function scan(param) {
modal: true
});
}else {
stopScan()
clearInterval(scanInter)
getPeripheral();
}
@ -53,6 +53,11 @@ function scan(param) {
}
});
}
function stopScan(){
ble.stopScan()
}
/*获取扫描结果*/
function getPeripheral() {
ble.getPeripheral(function (ret) {
@ -126,12 +131,22 @@ function connect(param) {
document.getElementById('text').innerHTML = '设备已连接';
text = '设备已连接';
console.log('主机端连接成功')
initWeight();
discoverService({peripheralUUID: param.peripheralUUID});
ble.setMtu({
peripheralUUID: param.peripheralUUID,
mtu:50
},function(ret){
if(ret.status){
initWeight();
discoverService({peripheralUUID: param.peripheralUUID});
}else{
mui.alert(ret.code)
}
});
}else {
connetcedStatus = false
connectTimes ++;
console.log('主机端连接失败'+connectTimes+' '+uuid)
addNotice(sbId + '主机端连接失败'+connectTimes+'次 '+uuid);
wifiDom.innerHTML = '连接失败';
api.hideProgress();
setTimeout(function (){
@ -173,10 +188,11 @@ var serviceUUID =''
var characteristicUUID =''
// 蓝牙待发送消息列表
var msgList = [];
var timerMsgList = null;
// 清除消息定时任务
clearInterval(timerMsgList)
/*蓝牙消息发送定时任务150ms*/
var timerMsgList = setInterval(function(){
timerMsgList = setInterval(function(){
// console.log(new Date().getSeconds()+ ' ' + new Date().getMilliseconds() +' ' + msgList.length)
if (msgList.length > 0) {
// 发送报文
@ -186,7 +202,8 @@ var timerMsgList = setInterval(function(){
peripheralUUID: peripheralUUID,
serviceUUID: serviceUUID,
characteristicUUID: characteristicUUID,
value: msg
value: msg,
writeType:'withoutResponse'
};
if(connetcedStatus && peripheralUUID && serviceUUID && characteristicUUID){
writeValueForCharacteristic(param1, function (ret) {
@ -195,6 +212,7 @@ var timerMsgList = setInterval(function(){
}
}
},150)
// 未装料状态计数采集达到10次发送一次停止蜂鸣指令
var bleConunt=0;
// 默认不自动跳转
@ -212,6 +230,10 @@ function discoverService(param) {
serviceUUID: ret4,
peripheralUUID: param.peripheralUUID
}, function (ret5) {
if(ret5.indexOf("0000ffe2")!==-1){
return false
}
console.log(ret5)
peripheralUUID = param.peripheralUUID;
serviceUUID =ret4;
characteristicUUID =ret5;
@ -226,8 +248,15 @@ function discoverService(param) {
return false
}
nowWeight = ret6;
getMess({
peripheralUUID: param.peripheralUUID,
serviceUUID: ret4,
characteristicUUID: ret5,
value: ret6
}, function (ret7) {
});
// 装料状态
if(feedStatus){
if(feedStatus && allowAuto){
if (first) {
first = false;
beforeWeight = nowWeight;
@ -249,18 +278,18 @@ function discoverService(param) {
}
serviceUUID = ret4;
characteristicUUID = ret5;
// 组装led报文
if (ledStatus && !isNaN(nowWeight)) {
getMess({
peripheralUUID: param.peripheralUUID,
serviceUUID: ret4,
characteristicUUID: ret5,
value: ret6
}, function (ret7) {
});
}
// // 组装led报文
// if (ledStatus && !isNaN(nowWeight)) {
// // getMess({
// // peripheralUUID: param.peripheralUUID,
// // serviceUUID: ret4,
// // characteristicUUID: ret5,
// // value: ret6
// // }, function (ret7) {
// // });
// }
// 装料状态
if(feedStatus){
if(feedStatus && allowAuto){
// 计划-饲喂
var feedErr = _planSum-_feedNum;
if (isNaN(feedErr)) {
@ -293,7 +322,6 @@ function discoverService(param) {
} else if (0.1 < ration && ration <= 0.2) {
time = "05";
if (!statusEle || lastTime !== time) {
console.log(feedErr + ' ' + allow + ' ' + _feedNum + ' ' + _planSum);
lastTime = time;
ledStatus = false;
status = '间隔';
@ -308,7 +336,6 @@ function discoverService(param) {
} else if (0.05 < ration && ration <= 0.1) {
time = "03";
if (!statusEle || lastTime !== time) {
console.log(feedErr + ' ' + allow + ' ' + _feedNum + ' ' + _planSum);
lastTime = time;
ledStatus = false;
status = '间隔';
@ -323,7 +350,6 @@ function discoverService(param) {
} else if (0.02 < ration && ration <= 0.05) {
time = "01";
if (!statusEle || lastTime !== time) {
console.log(feedErr + ' ' + allow + ' ' + _feedNum + ' ' + _planSum);
lastTime = time;
ledStatus = false;
status = '间隔';
@ -337,7 +363,6 @@ function discoverService(param) {
}
} else {
if (status === '间隔' || status === '') {
console.log(feedErr + ' ' + allow + ' ' + _feedNum + ' ' + _planSum);
ledStatus = false;
status = '长鸣';
statusEle = true;
@ -422,7 +447,6 @@ function StringToNum(hexx){
/*监听蓝牙数据,转换重量数据*/
function setNotify(param, callback) {
ble.setNotify(param, function (ret) {
// console.log(JSON.stringify(ret))
var value = ret.characteristic.value;
// if (ret && value.indexOf('ff01') !== -1) {
if (ret && value.substr(0,4) === 'ff01') {
@ -434,11 +458,11 @@ function setNotify(param, callback) {
callback(wei);
});
}
/*发送消息到蓝牙*/
function writeValueForCharacteristic(param, callback) {
if (param.value && connetcedStatus){
ble.writeValueForCharacteristic(param, function (ret) {
// console.log(JSON.stringify(ret));
if (ret.status) {
// console.log("发送成功");
} else {
@ -450,7 +474,7 @@ function writeValueForCharacteristic(param, callback) {
}
var lastTime = new Date().getSeconds()*1000+ new Date().getMilliseconds();
// 接收重量数据计数
var count = 0;
var countLED = 0;
/*组装报文并发数*/
function getMess(param, callback) {
var param1 = {
@ -509,22 +533,22 @@ function getMess(param, callback) {
param1.msg = newmsg + Math.abs(Number(_planSum - _feedNum)).toFixed(0) + 'kg';
}
// param1.msg = newmsg + Math.abs(Number(param.value)).toFixed(0) + 'kg'
console.log(param1.msg)
// console.log(param1.msg)
//组装字符卡LED报文
zfk.getMsg(param1, function (ret, err) {
var str = ret.sendMsg;
str = str.replace(/\s+/g, "");
var num = str.length / 2;
param.value = "FF0500" + num.toString(16) + str;
count ++;
countLED ++;
// 称重量数据3包取1包
if (count >= 3){
if (countLED >= 3){
msgList.push(param.value);
// var ms = strToHex(sbId,4)+strToHex(classCode,2)+strToHex(trainNumber,2)+strToHex(feedIndex,2)+strToHex(_planSum,4)+strToHex(_feedNum,4)+strToHex(nowWeight,4);
// var num1 = ms.length / 2;
// 同步刷新图表
// 饲喂状态刷新实时状态,否则不刷新装料信息
if(feedStatus){
if(feedStatus && allowAuto){
renderUnload();
feedMyChart.setOption({
dataset: {
@ -538,7 +562,7 @@ function getMess(param, callback) {
source: [[1, nowWeight]]
}
});
count = 0 ;
countLED = 0 ;
}
});
}

View File

@ -173,8 +173,14 @@ function submitData() {
document.querySelector('#feed_' + feedIndex).scrollIntoView(true);
allow = feedList[feedIndex].allow;
_planSum = feedList[feedIndex].weight.toFixed(0);
renderUnload();
feedMyChart.setOption({
dataset: {
source: [[1, _feedNum]]
}
});
// 误差小于100必须校准才能自动跳转
allowAuto = _planSum >= 100;
allowAuto = false;
text = feedName + _planSum;
document.getElementById('nowFeed').innerHTML = '<font style="color:blue;margin-left:10px;">' + batchName + ',' + feedName + '</font>';
ledStatus = false;
@ -595,24 +601,30 @@ function hex2a(hexx) {
}return str;
}
function speakTest(text, speed) {
// IFlyVoice.stopSpeaking();
IFlyVoice.startSynthetic({
text: text,
commonPath_Android: 'widget://res/aisound/common.jet',
pronouncePath_Android: 'widget://res/aisound/xiaofeng.jet',
commonPath_iOS: 'widget://res/aisound/common.jet',
pronouncePath_iOS: 'widget://res/aisound/xiaofeng.jet',
pronounceName: 'xiaofeng',
volume: '100',
speed: speed
}, function (ret, err) {
if (ret.status) {
console.log('合成成功');
} else {}
// function speakTest(text, speed) {
// // IFlyVoice.stopSpeaking();
// IFlyVoice.startSynthetic({
// text: text,
// commonPath_Android: 'widget://res/aisound/common.jet',
// pronouncePath_Android: 'widget://res/aisound/xiaofeng.jet',
// commonPath_iOS: 'widget://res/aisound/common.jet',
// pronouncePath_iOS: 'widget://res/aisound/xiaofeng.jet',
// pronounceName: 'xiaofeng',
// volume: '100',
// speed: speed
// }, function (ret, err) {
// if (ret.status) {
// console.log('合成成功');
// } else {}
// });
// }
function handleBackMain() {
mui.confirm('确认返回到首页?', '提示', btnArray, function (e) {
if (e.index == 0) {} else {
api.closeWin();
}
});
}
function closeApp() {
mui.confirm('确认关闭TMR饲喂系统', '提示', btnArray, function (e) {
if (e.index == 0) {} else {
@ -656,7 +668,6 @@ var WeightDataFilter = function () {
this.dataBuffer.shift();
}
var filteredValue = this.getAverageValue();
// console.log(filteredValue,Math.abs(filteredValue - this.lastValidValue),this.maxDeviation);
if (isNaN(this.lastValidValue) || Math.abs(filteredValue - this.lastValidValue) <= this.maxDeviation) {
this.lastValidValue = filteredValue;
return filteredValue;