util.js
4.13 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
/**
* @fileOverview 工具方法库
* @module lib/util
* @author qiqi.zhou@yoho.cn
*/
import config from '../config';
import log4js from 'log4js';
import _ from 'lodash';
log4js.loadAppender('file');
log4js.addAppender(log4js.appenders.file(config.log), 'log');
let loger = log4js.getLogger('log');
loger.setLevel(config.logLevel); //配置日志
/**
* @mixes 日志记录对象
* @exports util/log
*/
export let log = loger;
/**
* @method 无符号转16进制
* @exports util/tenToHex
* @param {Number} number 十进制数
* @return {Number} 16进制数字
*/
export let tenToHex = function (number) {
return (parseInt(number, 10) >>> 0).toString(16);
};
/**
* @method 无符号16进制转10进制
* @exports util/hexToTen
* @param {Number} number 十六机制数
* @param {Boolean} minus true表示负数,false表示正数
* @return {Number} 十进制数字
*/
export let hexToTen = function (number, minus) {
if (minus) {
return parseInt('FFFF' + number, 16) >> 0;
} else {
return parseInt(number, 16);
}
};
/**
* @method 转16进制
* @exports util/toHex
* @param {Buff} data 返回数据流
* @return {Array} 转成16进制的数组
*/
export let toHex = function (data) {
let arr = [];
for (let i = 0; i < data.length; i++) {
arr[i] = tenToHex(data.readUIntLE(i));
}
return arr;
};
/**
* @method 处理返回码
* @exports util/returnProc
* @param {Array} data 指令结果
* @param {Array} ip 读写器IP
* @param {Object} output 标准输出的规格对象
* @return {object} 标准输出
*/
export let returnProc = function (data, ip, output) {
if (!_.isArray(data) || _.size(data) < 1) {
return false;
}
let ret = data.join('');
if (!output[ret]) {
return false;
}
//log.info("读写器(" + ip + ")返回:" + output[ret].message + " 返回码:" + ret);
output[ret].hex = data;
return output[ret];
};
/**
* @method 返回结果拆分
* @exports util/spliteRet
* @param {Array} mq 发起指令的数组集合
* @param {String} data 得到的指令数据结果集
* @return {Object} 返回拆分结果和拆分依据的指令头
*/
export let spliteRet = function (mq, data) {
let indexes = [],
rets = [],
i,
k,
j,
leftMq = [],
prevIndex = -1;
for (i = 0; i < mq.length; i++) { //按照顺序获取所有的指令的第一位标示位置
prevIndex = _.indexOf(data, mq[i], prevIndex + 1);
if (prevIndex < 0) {
leftMq = mq.slice(i);
break;
}
indexes.push(prevIndex);
}
for (k = 0; k < indexes.length; k++) { //拆分结果集
if (indexes[k + 1]) {
rets.push(data.slice(indexes[k], indexes[k + 1]));
} else {
rets.push(data.slice(indexes[k]));
break;
}
}
if (indexes.length < 2) { //如果是拆分点小于2的,直接返回结果集
rets = [data];
}
let allRets = [];
for (j = 0; j < rets.length; j++) {
if (rets[j][0] == 'f1' || rets[j][1] != '2') { //对于盘点一次指令,多次返回,盘点特殊处理
let length = hexToTen(rets[j][1]);
let allLength = rets[j].length;
if (allLength > length + 2) {
allRets.push(rets[j].slice(0, length + 2));
allRets.push(rets[j].slice(length + 2));
} else {
allRets.push(rets[j]);
}
} else {
allRets.push(rets[j]);
}
}
return {
rets: allRets,
mq: leftMq,
};
};
/**
* @method 定位指令名称
* @exports util/spliteRet
* @param {Array} orders 指令规格数组
* @param {Array} data 返回的结果集 eg. ['f0','2','0','0']
* @return {Object} 返回定位到的指令
*/
export let locateOrder = function (orders, data) {
let orderRet = {};
_.forIn(orders, function (val, key) {
var order = val.input.toLowerCase();
var prefix = data[0].toLowerCase();
if (_.startsWith(order, prefix)) {
orderRet.name = key;
orderRet.val = val;
}
});
return orderRet;
};