node-aurora
Version:
Provides an interface to the Aurora Dreamband.
333 lines (227 loc) • 10 kB
JavaScript
;
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;
}
};