146 lines
4.0 KiB
JavaScript
146 lines
4.0 KiB
JavaScript
import { uint32ToUint8Array, uint8ArrayToHex } from "./utils";
|
|
|
|
export class Command {
|
|
// 测量序号
|
|
static measureId = 1;
|
|
|
|
// 命令完整响应的长度
|
|
responseSize = 0;
|
|
// 命令发送的数据
|
|
content = new Uint8Array(0);
|
|
// 命令响应的数据
|
|
response = new Uint8Array(0);
|
|
// 等待响应的超时时间
|
|
timeout = 3000;
|
|
// 发送的数据是否需要生成和校验值
|
|
needSign = true;
|
|
|
|
|
|
/**
|
|
* @param {Uint8Array|ArrayBuffer|number[]} content
|
|
* @param {number} responseSize
|
|
* @param {number} timeout
|
|
* @param {boolean} needSign
|
|
*/
|
|
constructor(content, responseSize, timeout = 3000, needSign = true) {
|
|
if (content instanceof Uint8Array) {
|
|
this.content = content;
|
|
} else {
|
|
this.content = new Uint8Array(content);
|
|
}
|
|
this.responseSize = responseSize;
|
|
if (typeof timeout === 'number' && timeout >= 0) {
|
|
this.timeout = timeout;
|
|
}
|
|
this.needSign = needSign;
|
|
}
|
|
|
|
/**
|
|
* 返回一个 ArrayBuffer 数组, 用于发送
|
|
* @returns {ArrayBuffer[]}
|
|
*/
|
|
get data() {
|
|
if (this.content.length === 0) throw new Error('正文内容不能为空');
|
|
const data = [];
|
|
const b = new Uint8Array(this.content.buffer);
|
|
if (this.needSign) {
|
|
b[b.length - 1] = Command.getSign(b);
|
|
}
|
|
for (let i = 0; i < b.length; i += 20) {
|
|
data.push(b.slice(i, i + 20).buffer);
|
|
}
|
|
return data;
|
|
}
|
|
|
|
/** 是否接收完成 */
|
|
get isComplete() {
|
|
return this.response.length >= this.responseSize;
|
|
}
|
|
|
|
/** 是否有效 */
|
|
get isValid() {
|
|
return Command.getSign(this.response) === this.response[this.response.length - 1];
|
|
}
|
|
|
|
/**
|
|
* 填充响应数组
|
|
* @param {ArrayBuffer} buffer
|
|
*/
|
|
fillResponse(buffer) {
|
|
this.response = new Uint8Array([...this.response, ...(new Uint8Array(buffer))]);
|
|
}
|
|
|
|
|
|
/**
|
|
* 获取和校验值
|
|
* @param {ArrayBuffer|Uint8Array} buffer
|
|
*/
|
|
static getSign(buffer) {
|
|
const _b = buffer instanceof Uint8Array ? buffer : new Uint8Array(buffer);
|
|
let sum = 0;
|
|
_b.slice(0, _b.length - 1).forEach(i => sum += i);
|
|
return new Uint8Array([sum])[0];
|
|
}
|
|
|
|
// 唤醒命令
|
|
static WakeUp = new Command([0xf0], 0, 0, false);
|
|
|
|
/**
|
|
* 获取测量命令
|
|
* @param {number} mode
|
|
*/
|
|
static measure(mode = 0) {
|
|
Command.measureId += 1;
|
|
const measureId = uint32ToUint8Array(Command.measureId);
|
|
return new Command([0xbb, 1, mode, ...measureId, 0, 0xff, 0], 10, 1500);
|
|
}
|
|
|
|
/**
|
|
* 获取测量数据 (Lab)
|
|
* @param {number} mode
|
|
*/
|
|
static getLab(mode = 0) {
|
|
return new Command([0xbb, 3, mode, 0, 0, 0, 0, 0, 0xff, 0], 20, 1500);
|
|
}
|
|
|
|
/**
|
|
* 获取测量数据 (RGB)
|
|
* @param {number} mode
|
|
*/
|
|
static getRGB(mode = 0) {
|
|
return new Command([0xbb, 4, mode, 0, 0, 0, 0, 0, 0xff, 0], 20, 1500);
|
|
}
|
|
|
|
/**
|
|
* 获取测量的光谱数据
|
|
* @param {number} mode
|
|
*/
|
|
static getSpectral(mode = 0) {
|
|
return new Command([0xbb, 2, 0x10 + mode, 0, 0, 0 ,0 ,0, 0xff, 0], 200, 5000);
|
|
}
|
|
|
|
/**
|
|
* 白校准
|
|
* @param {number} check 是否判断校准成功 1 判断 0 不判断
|
|
*/
|
|
static whiteCalibrate(check = 1) {
|
|
return new Command([0xbb, 0x11, check, 0, 0, 0, 0, 0, 0xff, 0], 10, 1500);
|
|
}
|
|
|
|
|
|
/**
|
|
* 黑校准
|
|
* @param {number} check 是否判断校准成功
|
|
*/
|
|
static blackCalibrate(check = 1) {
|
|
return new Command([0xbb, 0x10, check, 0, 0, 0, 0, 0, 0xff, 0], 10, 1500);
|
|
}
|
|
|
|
|
|
/** 获取校准状态 */
|
|
static GetCalibrationInf = new Command([0xbb, 0x1e, 0, 0, 0, 0, 0, 0, 0xff, 0], 20, 1500);
|
|
|
|
|
|
|
|
static GetDeviceInf = new Command([0xbb, 0x12, 0x01, 0, 0, 0, 0, 0, 0xff, 0], 200, 5000);
|
|
} |