UNPKG

node-aurora

Version:

Provides an interface to the Aurora Dreamband.

333 lines (227 loc) 10 kB
'use strict'; var _slicedToArray2 = require('babel-runtime/helpers/slicedToArray'); var _slicedToArray3 = _interopRequireDefault(_slicedToArray2); var _keys = require('babel-runtime/core-js/object/keys'); var _keys2 = _interopRequireDefault(_keys); var _getIterator2 = require('babel-runtime/core-js/get-iterator'); var _getIterator3 = _interopRequireDefault(_getIterator2); var _promise = require('babel-runtime/core-js/promise'); var _promise2 = _interopRequireDefault(_promise); var _moment = require('moment'); var _moment2 = _interopRequireDefault(_moment); var _isPlainObject = require('lodash/isPlainObject'); var _isPlainObject2 = _interopRequireDefault(_isPlainObject); var _camelCase = require('lodash/camelCase'); var _camelCase2 = _interopRequireDefault(_camelCase); var _AuroraConstants = require('./AuroraConstants'); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } exports.sleep = function () { var ms = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0; return new _promise2.default(function (resolve) { return setTimeout(resolve, ms); }); }; exports.promisify = function (fn) { var context = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null; return function () { for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } return new _promise2.default(function (resolve, reject) { fn.apply(context, args.concat(function (error, result) { if (error) return reject(error); resolve(result); })); }); }; }; exports.promisifyStream = function (stream) { return new _promise2.default(function (resolve, reject) { stream.once('close', resolve); stream.once('error', reject); stream.once('end', resolve); }); }; exports.parseValueString = function (value) { value = value.trim(); var valWithoutNumericSymbols = value.replace(/[$%,]+|(ms$)/g, ''); if (!isNaN(valWithoutNumericSymbols)) { return +valWithoutNumericSymbols; } //support the funky date format GCC uses for __TIME__ constant var date = _moment2.default.utc(value, [_moment2.default.ISO_8601, "YYYY-MM-DD HH:mm:ss:SSS", "MMM D YYYY - HH:mm:ss", "MMM D YYYY - HH:mm:ss", "MMM DD YYYY - HH:mm:ss"], true); if (date.isValid()) { return +date; } //TODO: eventually remove this, as in the future, uppercase will be //required to trigger conversion var valueUC = value.toUpperCase(); if (valueUC === 'TRUE' || valueUC === 'ON' || valueUC === 'ACTIVE' || valueUC === 'YES') { return true; } else if (valueUC === 'FALSE' || valueUC === 'OFF' || valueUC === 'INACTIVE' || valueUC === 'NO' || valueUC === 'NONE') { return false; } else if (valueUC === 'UNKNOWN') { return 0; } return value; }; exports.camelCaseObjectKeys = function (object) { var camelCaseObject = {}; var _iteratorNormalCompletion = true; var _didIteratorError = false; var _iteratorError = undefined; try { for (var _iterator = (0, _getIterator3.default)((0, _keys2.default)(object)), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { var key = _step.value; var value = object[key]; if ((0, _isPlainObject2.default)(value)) { value = exports.camelCaseObjectKeys(value); } camelCaseObject[(0, _camelCase2.default)(key)] = value; } } catch (err) { _didIteratorError = true; _iteratorError = err; } finally { try { if (!_iteratorNormalCompletion && _iterator.return) { _iterator.return(); } } finally { if (_didIteratorError) { throw _iteratorError; } } } return camelCaseObject; }; exports.maskFromIds = function () { for (var _len2 = arguments.length, ids = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { ids[_key2] = arguments[_key2]; } return ids.reduce(function (mask, id) { return mask + (1 << id); }, 0); }; exports.versionToString = function (version) { if (!version) return "UNKNOWN"; var major = Math.floor(version / 10000); var minor = Math.floor((version - major * 10000) / 100); var build = version - major * 10000 - minor * 100; return 'v' + major + '.' + minor + '.' + build; }; exports.stringToVersion = function (versionString) { var version = versionString.split('.'); if (version.length != 3) return 0; return parseInt(version[0]) * 10000 + parseInt(version[1]) * 100 + parseInt(version[2]); }; exports.buzzSongObjToCmd = function (songObj) { var song = songObj.song, repeat = songObj.repeat, volume = songObj.volume, tempoAdjust = songObj.tempoAdjust, pitchAdjust = songObj.pitchAdjust; if (!song) throw new Error("Song field is required."); repeat = parseInt(repeat); if (isNaN(repeat)) { repeat = 0; } volume = parseInt(volume); volume = isNaN(volume) ? 100 : Math.min(100, Math.max(0, volume)); tempoAdjust = parseFloat(tempoAdjust); tempoAdjust = isNaN(tempoAdjust) ? 1 : Math.min(2.5, Math.max(.25, tempoAdjust)); pitchAdjust = parseInt(pitchAdjust); pitchAdjust = isNaN(pitchAdjust) ? 0 : Math.min(12, Math.max(-12, pitchAdjust)); return 'buzz-song ' + song + ' ' + repeat + ' ' + volume + ' ' + tempoAdjust + ' ' + pitchAdjust; }; exports.ledEffectObjToCmd = function (effectObj) { var effect = _AuroraConstants.LedEffects.find(function (e) { return e.name == effectObj.effect; }); if (!effect) { throw new Error("Invalid effect specified."); } var _map = ['eyes', 'state1Eyes', 'state2Eyes'].map(function (option) { var eyesOption = effectObj[option]; if (typeof eyesOption == 'string') { switch (eyesOption.toLowerCase()) { case 'right': return '0x02'; case 'left': return '0x01'; case 'none': return '0x00'; case 'both': default: return '0x03'; } } else { var eye = parseInt(eyesOption); return isNaN(eyes) || eyes < 0 || eyes > 3 ? 3 : eyes; } return 3; }), _map2 = (0, _slicedToArray3.default)(_map, 3), eyes = _map2[0], state1Eyes = _map2[1], state2Eyes = _map2[2]; var _map3 = ['brightness', 'state1Brightness', 'state2Brightness'].map(function (option) { var brightnessOption = effectObj[option]; var brightness = parseInt(brightnessOption); if (isNaN(brightness) || brightness > 255 || brightness < 0) { return '0xFF'; } return '0x' + ("00" + Math.round(brightness * (255 / 100)).toString(16)).slice(-2).toUpperCase(); }), _map4 = (0, _slicedToArray3.default)(_map3, 3), brightness = _map4[0], state1Brightness = _map4[1], state2Brightness = _map4[2]; var _map5 = ['color', 'state1Color', 'state2Color'].map(function (option) { var colorOption = effectObj[option]; if (!colorOption || colorOption == 'off' || colorOption == 'black') { return '0x000000'; } var color = _AuroraConstants.LedColors.find(function (c) { return c.name == colorOption; }); color = !color ? colorOption : color.value; color = color.replace('#', '0x'); return isNaN(parseInt(color)) ? '0x000000' : color.toUpperCase(); }), _map6 = (0, _slicedToArray3.default)(_map5, 3), color = _map6[0], state1Color = _map6[1], state2Color = _map6[2]; var _map7 = ['state1Duration', 'state2Duration', 'transitionDuration'].map(function (option) { var durationOption = effectObj[option]; var duration = parseFloat(durationOption); if (isNaN(duration)) { return 1000; } return Math.round(duration * 1000); }), _map8 = (0, _slicedToArray3.default)(_map7, 3), state1Duration = _map8[0], state2Duration = _map8[1], transitionDuration = _map8[2]; var shutoffDelay = parseInt(effectObj.shutoffDelay); shutoffDelay = isNaN(shutoffDelay) ? 0 : Math.round(shutoffDelay * 1000); switch (effect.name) { case 'set': return effect.cmd + ' ' + eyes + ' ' + color + ' ' + brightness + ' ' + shutoffDelay; case 'blink': var blinkCount = parseInt(effectObj.blinkCount); blinkCount = isNaN(blinkCount) ? 1 : blinkCount; var blinkRate = parseFloat(effectObj.blinkRate); blinkRate = isNaN(blinkRate) ? 500 : Math.round(blinkRate * 1000); return effect.cmd + ' ' + eyes + ' ' + color + ' ' + brightness + ' ' + blinkCount + ' ' + blinkRate + ' ' + shutoffDelay; case 'alternate': var alternateCount = parseInt(effectObj.alternateCount); alternateCount = isNaN(alternateCount) ? 1 : alternateCount; return effect.cmd + ' ' + state1Eyes + ' ' + state1Color + ' ' + state1Brightness + ' ' + state1Duration + ' ' + state2Eyes + ' ' + state2Color + ' ' + state2Brightness + ' ' + state2Duration + ' ' + alternateCount + ' ' + shutoffDelay; case 'transition': var transitionRewind = effectObj.transitionRewind ? 1 : 0; return effect.cmd + ' ' + state1Eyes + ' ' + state1Color + ' ' + state1Brightness + ' ' + state2Eyes + ' ' + state2Color + ' ' + state2Brightness + ' ' + transitionDuration + ' ' + transitionRewind + ' ' + shutoffDelay; } };