weblab-instrument
Version:
communication with instrument through usb
375 lines (365 loc) • 12.4 kB
JavaScript
const propMethod = require('../dev/propMethod.js');
const debug = require('debug');
const log = debug('dsosys:log');
let header = '';
let tmpbuffer = Buffer.allocUnsafe(8192);
let tmplength = 0;
function SysCmd() {
this.sysLock = 'OFF';
this.dispData = Buffer.allocUnsafe(2000000);
this.AutosetMode = 'FITSCREEN';
this.dataCount = 0;
this.headerlen = 0;
this.dataValidLen = 0;
this.usbdelay = 'OFF';
this.recCount = 0;
this.staWeight = '2';
this.staMode = 'OFF';
this.autosetenable = 'ON';
this.measureenable = 'ON';
this.cursorenable = 'ON';
this.lrn = [];
this.image = Buffer.allocUnsafe(2000000);
}
SysCmd.prototype.cmdHandler = {
IDN: {
getHandler(sysObj, res) {
log(res);
return true;
},
},
LRN: {
getHandler(sysObj, res) {
log(res);
sysObj.lrn = res;
return true;
},
},
RST: {
setHelper(sysObj) {
log('sent RST command');
log(sysObj.cmdHandler);
return true;
},
},
SysLock: {
setHelper(sysObj, arg) {
log('sent SysLock command');
log(sysObj.cmdHandler);
sysObj.sysLock = arg;
return true;
},
getHandler(sysObj, res) {
log(res);
res = res.slice(0, -1);
sysObj.sysLock = res.toString();
return true;
},
},
USBDelay: {
setHelper(sysObj, arg) {
log(sysObj.cmdHandler);
sysObj.usbdelay = arg;
return true;
},
getHandler(sysObj, res) {
log(res);
res = res.slice(0, 1);
sysObj.usbdelay = res.toString();
return true;
},
},
AutosetEnable: {
setHelper(sysObj, arg) {
log(sysObj.cmdHandler);
sysObj.autosetenable = arg;
return true;
},
getHandler(sysObj, res) {
log(res);
res = res.slice(0, -1);
sysObj.autosetenable = res.toString();
return true;
},
},
MeasureEnable: {
setHelper(sysObj, arg) {
log(sysObj.cmdHandler);
sysObj.measureenable = arg;
return true;
},
getHandler(sysObj, res) {
log(res);
res = res.slice(0, -1);
sysObj.measureenable = res.toString();
return true;
},
},
CursorEnable: {
setHelper(sysObj, arg) {
log(sysObj.cmdHandler);
sysObj.cursorenable = arg;
return true;
},
getHandler(sysObj, res) {
log(res);
res = res.slice(0, -1);
sysObj.cursorenable = res.toString();
return true;
},
},
SysErr: { //
getHandler(dsoObj, res) {
log(res.toString());
if (res.toString() === '+0, \'No error.\'') {
dsoObj.dev.state.errCode.message = '';
} else {
log(`command error: ${res.toString()}`);
dsoObj.dev.state.errCode.message = res.toString();
}
return true;
},
},
AutosetMode: {
setHelper(sysObj) {
log('sent SysLock command');
log(sysObj.cmdHandler);
return true;
},
getHandler(sysObj, res) {
log(res);
res = res.slice(0, -1);
sysObj.AutosetMode = res.toString();
return true;
},
},
QRCode: {
setHelper(sysObj, arg) {
log('QRCode');
log(arg);
return true;
},
},
QRCodeTitle: {
setHelper(sysObj, arg) {
log('QRCodeTitle');
log(arg);
return true;
},
},
DispOut: {
getHandler(sysObj, data) {
if (sysObj.dataCount === 0) {
data.copy(tmpbuffer, tmplength);
tmplength += data.length;
if (data.length > 20) {
header += data.slice(0, 20).toString();
} else {
header += data.toString();
}
// console.log(header);
// log('data length = '+data.length);
// log('data[0] = '+data[0]);
if (header[0] === '#') {
const num = Number(header[1]);
const numstr = header.slice(2, Number(header[1]) + 2);
if (isNaN(header[1])) {
return false;
}
if (header.length < num + 2) {
return false;
}
sysObj.headerlen = num + 2;
log(`numstr=${numstr}`);
// block data length + NL
sysObj.dataCount = parseInt(numstr, 10) + 1;
// delete sysCmd.dispData;
log(`sysObj.dataCount = ${sysObj.dataCount}`);
tmpbuffer.copy(sysObj.dispData, sysObj.recCount, 0, tmplength);
sysObj.recCount += tmplength;
tmplength = 0;
if (data.length >= (Number(header[1]) + 2)) {
header = '';
log('=======');
if (sysObj.recCount >= (sysObj.dataCount + sysObj.headerlen)) {
// if (sysObj.recCount > sysObj.dataCount) {
// sysObj.dispData = sysObj.dispData.slice(0, -1);
// }
sysObj.dataValidLen = sysObj.recCount;
sysObj.recCount = 0;
sysObj.dataCount = 0;
log(`last 1 byte = ${data[data.length - 1]}`);
return true;
}
}
} else {
tmplength = 0;
header = '';
}
} else {
log(`sysObj.recCount=${sysObj.recCount},data.length= ${data.length},headerlen= ${sysObj.headerlen}`);
data.copy(sysObj.dispData, sysObj.recCount, 0, data.length);
sysObj.recCount += data.length;
// log('sysObj.recCount='+sysObj.recCount+',data.length='+data.length);
if (sysObj.recCount >= (sysObj.dataCount + sysObj.headerlen)) {
if ((data[data.length - 1] === 0x0a) || (data === 0x0a)) {
log(`sysObj.dataCount length=${sysObj.dataCount}`);
log(`sysObj.headerlen length=${sysObj.headerlen}`);
// sysObj.recCount += data.length;
sysObj.dataValidLen = sysObj.recCount;
sysObj.recCount = 0;
sysObj.dataCount = 0;
header = '';
return true;
}
log('data more then expect');
}
}
return false;
},
},
PngOutput: {
getHandler(sysObj, data) {
if (sysObj.dataCount === 0) {
data.copy(tmpbuffer, tmplength);
tmplength += data.length;
if (data.length > 10) {
header += data.slice(0, 10).toString();
} else {
header += data.toString();
}
log(header);
// log('data length = '+data.length);
// log('data[0] = '+data[0]);
if (header[0] === '#') {
const num = Number(header[1]);
const numstr = header.slice(2, Number(header[1]) + 2);
if (header.length < num + 2) {
return false;
}
log(`numstr=${numstr}`);
sysObj.dataCount = parseInt(numstr, 10);
// delete sysCmd.image;
sysObj.image = new Buffer(sysObj.dataCount + 1);
log(`sysObj.dataCount = ${sysObj.dataCount}`);
// log(sysObj);
sysObj.image = sysObj.image.slice(0, sysObj.dataCount + 1);
if (data.length >= (Number(header[1]) + 2)) {
if (tmplength != 0) {
log(`before slice data length = ${tmpbuffer.length}`);
tmpbuffer = tmpbuffer.slice((Number(header[1]) + 2), tmplength);
log(`sliced data length = ${tmpbuffer.length}`);
tmpbuffer.copy(sysObj.image, sysObj.recCount);
sysObj.recCount += tmpbuffer.length;
tmpbuffer = new Buffer(8192);
tmplength = 0;
} else {
log(`before slice data length = ${data.length}`);
data = data.slice((Number(header[1]) + 2), data.length);
log(`slice data length = ${data.length}`);
data.copy(sysObj.image, sysObj.recCount);
sysObj.recCount += data.length;
}
header = '';
log('=======');
if (sysObj.recCount > sysObj.dataCount) {
// if (sysObj.recCount > sysObj.dataCount) {
// sysObj.image = sysObj.image.slice(0, -1);
// }
sysObj.recCount = 0;
sysObj.dataCount = 0;
log(`last 1 byte=${data[data.length - 1]}`);
return true;
}
}
}
} else {
data.copy(sysObj.image, sysObj.recCount);
sysObj.recCount += data.length;
// log('sysObj.recCount='+sysObj.recCount+',data.length='+data.length);
if (sysObj.recCount > sysObj.dataCount) {
// if(sysObj.recCount>sysObj.dataCount){
// sysObj.image=sysObj.image.slice(0,-1);
// }
// log('sysObj.recCount='+sysObj.recCount);
log(`sysObj.image length=${sysObj.image.length}`);
sysObj.recCount = 0;
sysObj.dataCount = 0;
header = '';
return true;
}
}
return false;
},
},
CLS: {
setHelper() {
return true;
},
},
RUN: {
setHelper() {
return true;
},
},
STOP: {
setHelper() {
return true;
},
},
SINGLE: {
setHelper() {
log('SINGLE ......');
return true;
},
},
FORCE: {
setHelper() {
return true;
},
},
AUTOSET: {
setHelper() {
return true;
},
},
StatisticReset: {
setHelper() {
return true;
},
},
StatisticStaWeight: {
getHandler(sysObj, res) {
res = res.slice(0, -1);
sysObj.staWeight = res.toString();
return true;
},
setHelper(sysObj, arg) {
sysObj.staWeight = arg;
return true;
},
},
StatisticMode: {
getHandler(sysObj, res) {
res = res.slice(0, -1);
sysObj.staMode = res.toString();
return true;
},
setHelper(sysObj, arg) {
sysObj.staMode = arg;
return true;
},
},
};
SysCmd.prototype.setToDefault = function setToDefault(sysObj) {
sysObj.recCount = 0;
sysObj.dataCount = 0;
// tmpbuffer = new Buffer(8192);
tmplength = 0;
header = '';
};
exports.initSysObj = function initSysObj(id) {
const sysCmd = new SysCmd();
sysCmd.prop = propMethod.CreatMethod.call(this, id);
return sysCmd;
};