UNPKG

meoser

Version:

meos protocol engine

126 lines (119 loc) 4.21 kB
import { ascii2Str } from './util'; import Transport from './transport'; import {genEvent} from './emitter'; import { REQUEST_TOPIC } from './setting'; /** * 命令:用于发送协议 */ class Command { constructor() { this.emiter = null; } init(emiter){ this.emiter = emiter; } /** * 文件协议上传 * @param {Array} bytes 文件切片协议 * @return {Promise} */ upload(bytes) { let sendPromise = new Promise((resolve, reject) => { let timer; let handler_ = (data) => { clearTimeout(timer); resolve(data); }; // 绑定一次性事件 let fileEvent_ = genEvent(REQUEST_TOPIC.FLASH_FILE, this.emiter)(handler_, true); // 发送协议 Transport.send(bytes); // 超时报错 timer = setTimeout(() => { fileEvent_(); reject({ 'err': 'system error, please check the connection.' }); }, 3000); }) return sendPromise.then((resData) => { let err = null; // try 处理解析报错问题 try { let statusCode = resData[9]; // 0x00 表示 ok // 0x01 表示 error // 0xf0 文件校验失败 if (resData[0] === 0xf3 && resData[resData.length - 1] === 0xf4) { if (statusCode === 0x01) { err = `file upload error, status code: ${statusCode}, please check the firmware.`; } else if (statusCode === 0xf0) { err = `file check error, status code: ${statusCode}, please make sure encode file rightly.`; } else if (statusCode !== 0x00) { err = `unkown status error, status code: ${statusCode}, please check the firmware.`; } } else { console.warn(`status code parsed error with buffer: ${ascii2Str(resData)}`); } } catch (e) { err = 'parse data error, please check the response data.'; //下位机响应数据 } return Promise.resolve({ err }); }).catch((err) => { return Promise.resolve({ err }); }) } /** * 请求响应模型,用于读值请求、查询、握手 * @param {Array} bytes 请求协议 * @example * [243,251,8,0, 4, 2, 44,1, 0,0,0,0, 51,244] * @return {Promise} */ request(requestType, bytes, options) { let msg_ = 'please check the connection or the firmware version.'; let watchTimer = options.time || 5000; let desc = options.desc; return new Promise((resolve, reject) => { let timer; /** * * @param {Oject} result 结果对象 * @param {Oject.String} result.msg 成功、失败的结果描述 * @param {Boolean} isSuccess */ let handler_ = (result, isSuccess=true) => { // {sensor_id, action} clearTimeout(timer); // console.log('成功', requestType.toString()) if(isSuccess) { // 成功 resolve(result); }else { // 失败 let err = result.msg ? `${desc} ${result.msg}`: `${desc} request error, ${msg_}`; result.err = err; resolve(result); } }; // 绑定一次性事件 let requestEvent_ = genEvent(requestType, this.emiter)(handler_, true); // 发送协议 Transport.send(bytes); // 超时报错 timer = setTimeout(() => { // console.log('失败', requestType.toString()) requestEvent_(); resolve({ 'err': `timeout error, ${msg_}` }); }, watchTimer); }) } } export default new Command();