UNPKG

sensorium

Version:

makeblock mainboards protocol api

73 lines (69 loc) 2.44 kB
/** * @fileOverview Board 主控板的基类. * @author Jeremy */ import Version from '../electronic/version' /** * Create id for electronic module joined into the mainboard * @param {Object} eModuleObj 包含电子模块类和电子模块的名称 * @param {Array} argsList [description] * @param {String} eModuleName 模块的名称,为生成 id 为准备 * @return {String} 当前实例 id * @private */ const createModuleId = function (eModuleObj, argsList){ // 注意,不能使用 eModule.name,在编译压缩的时候,变量会被替换,不同的 eModule, // 都会被替换成同一个变量名称,会导致 id 生成重复。 let name = eModuleObj.name; let eModule = eModuleObj.eModule; let expectLength = eModule.length; let argsLength = argsList.length; if(argsLength < expectLength){ //参数不足的提示 let dl = expectLength - argsLength; let more = argsLength > 0 ? ' more':''; //更多 console.warn(`you need to pass in ${dl} argument${dl>1?'s':''}${more}, otherwise the ${name} sensor may not work as a result`); }else if(argsLength > expectLength){ //参数多余 argsList.splice(expectLength); } return [name].concat(argsList).join('_').toLowerCase(); } class Board { /** * Create a board * @private * @param {Object} conf configure */ constructor(conf){ //私有的配置对象 this.config_ = conf || {}; //已连接电子模块 this.connecting = {}; // 版本 this.version = Version; } /** * 电子模块实例工厂 * @private * @param {Object} eModuleObj 包含电子模块类和电子模块的名称 * @param {Array-Like} args [port, slot, id...] * @param {String} host 电子模块的宿主,即主控板名——大部分电子模块是无需识别宿主的,少数电子模块因为宿主不同而表现不同特征 * @return {Object} 电子模块实例 */ eModuleFactory(eModuleObj, args, host){ let argsList = [...args]; //转数组 let eModule = eModuleObj.eModule; let id = createModuleId(eModuleObj, argsList); if(this.connecting[id]){ return this.connecting[id]; }else{ let params = argsList.length?args:[undefined]; //这里 es6 有坑 let emodule = new eModule(...params, host); // 保存模块 this.connecting[id] = emodule; return emodule; } } } export default Board;