UNPKG

sensorium

Version:

makeblock mainboards protocol api

135 lines (126 loc) 3.7 kB
/** * @fileOverview Sensorium Class * @author Jeremy */ import Transport from './communicate/transport'; import Control from './core/control'; import Version from './electronic/version'; import { SUPPORTLIST, FIRMWARE_ID } from './settings'; import BoardsObj from './mainboard/index'; /** * Sensorium * @description Sensorium is the only namespace of this repository * @namespace */ class Sensorium { /** * Create a sensorium. * @example * let sensorium = new Sensorium(); * // creat the mcore mainboard instance * let mcore = sensorium.createMcore(); * // create the auriga mainboard instance * let auriga = sensorium.createAuriga(); */ constructor(){ for(let name of SUPPORTLIST){ this['create' + name] = (opts) => this.create(name, opts); } } /** * Create a mainboard instance * @param {String} mainboardName both upperCase and lowerCase are allowed: 'mcore', 'mCore' * @param {Object} opts (optional) * @example * // create a mcore with a given mainboardName * let mcore1 = sensorium.create('mcore'); * let mcore2 = sensorium.create('mCore'); * console.log(mcore1 === mcore2) // true */ create(mainboardName, opts){ let board = BoardsObj[mainboardName.toLowerCase()]; if(typeof board == 'undefined'){ throw new Error(`sorry, the board ${mainboardName} could not be supported! You need pass in one of ${this.getSupported().join(',')} as the first argument}`); } return new board(opts); } /** * Set the sender from bluetooth、serialport、wifi * @param {Function} sender the send method * @example * // supposed the `socket.io.js` have been used as the communication method * let sender = (buf) => { * socket.emit('send', { buf }); * } * sensorium.setSender(sender); */ setSender(sender){ Transport.sender = sender; } /** * Receive data from bluetooth、serialport、wifi * @param {Buffer|Array} buff * @example * // supposed the `socket.io.js` have been used as the communication method * socket.on('received', function (data) { * // the format of the data should be adjusted to fit the interface * sensorium.doReceived(JSON.parse(data)); * }); */ doReceived (buff) { Control.pipe(buff); } /** * Read firmware info,which contains the version and the name. * Usually we use this interface to get the hardware information, * and decide to switch current device or update current hardware to the latest one. * @return {Promise} a promise * @example * sensorium.readFirmwareInfo() * .then(val => console.log(val)); */ async readFirmwareInfo(){ return await Version.getData().then((val) =>{ let id, name; if(val){ id = val.split('.')[0]; name = FIRMWARE_ID[parseInt(id)]; } return {name, val}; }); } /** * Write protocol buffer. * This interface is just for debug the protocol * @param {Array} buf * @example * sensorium.send([0xff, 0x55, 0x01...]); */ send (buf){ Control.write(buf); } /** * Read protocol buffer * This interface is just for debug the protocol * @param {Array} buf * @example * sensorium.send([0xff, 0x55, 0x01...]); */ async read (buf){ return await Control.read(buf); } /** * Get supported mainboard * @return {Array} the support list * @example * let sopport = sensorium.SUPPORT; * conosole.log(sopport); // ['auriga', 'mcore', 'megapi', 'orion', 'megapipro', 'arduino'] */ get SUPPORT() { return Object.keys(BoardsObj); } } //webpack umd module.exports = Sensorium; // export default Sensorium;