'use strict';
/**
* Batch update all the properties of an object.
* @param {Object} obj
* @param {Object} descriptor
* @param {boolean} [descriptor.configurable]
* @param {boolean} [descriptor.enumerable]
* @param {*} [descriptor.value]
* @param {boolean} [descriptor.writable]
* @param {function} [descriptor.get]
* @param {function} [descriptor.set]
* @return {void}
*/
module.exports.updateProperties = function(obj, descriptor) {
Object.getOwnPropertyNames(obj).forEach(function(prop) {
Object.defineProperty(obj, prop, descriptor);
});
};
module.exports.capabilityMap = {
PLATFORM_APLITE: {
platforms: ['aplite'],
minFwMajor: 0,
minFwMinor: 0
},
PLATFORM_BASALT: {
platforms: ['basalt'],
minFwMajor: 0,
minFwMinor: 0
},
PLATFORM_CHALK: {
platforms: ['chalk'],
minFwMajor: 0,
minFwMinor: 0
},
PLATFORM_DIORITE: {
platforms: ['diorite'],
minFwMajor: 0,
minFwMinor: 0
},
PLATFORM_EMERY: {
platforms: ['emery'],
minFwMajor: 0,
minFwMinor: 0
},
BW: {
platforms: ['aplite', 'diorite'],
minFwMajor: 0,
minFwMinor: 0
},
COLOR: {
platforms: ['basalt', 'chalk', 'emery'],
minFwMajor: 0,
minFwMinor: 0
},
MICROPHONE: {
platforms: ['basalt', 'chalk', 'diorite', 'emery'],
minFwMajor: 0,
minFwMinor: 0
},
SMARTSTRAP: {
platforms: ['basalt', 'chalk', 'diorite', 'emery'],
minFwMajor: 3,
minFwMinor: 4
},
SMARTSTRAP_POWER: {
platforms: ['basalt', 'chalk', 'emery'],
minFwMajor: 3,
minFwMinor: 4
},
HEALTH: {
platforms: ['basalt', 'chalk', 'diorite', 'emery'],
minFwMajor: 3,
minFwMinor: 10
},
RECT: {
platforms: ['aplite', 'basalt', 'diorite', 'emery'],
minFwMajor: 0,
minFwMinor: 0
},
ROUND: {
platforms: ['chalk'],
minFwMajor: 0,
minFwMinor: 0
},
DISPLAY_144x168: {
platforms: ['aplite', 'basalt', 'diorite'],
minFwMajor: 0,
minFwMinor: 0
},
DISPLAY_180x180_ROUND: {
platforms: ['chalk'],
minFwMajor: 0,
minFwMinor: 0
},
DISPLAY_200x228: {
platforms: ['emery'],
minFwMajor: 0,
minFwMinor: 0
}
};
/**
* Checks if all of the provided capabilities are compatible with the watch
* @param {Object} activeWatchInfo
* @param {Array<string>} [capabilities]
* @return {boolean}
*/
module.exports.includesCapability = function(activeWatchInfo, capabilities) {
var notRegex = /^NOT_/;
var result = [];
if (!capabilities || !capabilities.length) {
return true;
}
for (var i = capabilities.length - 1; i >= 0; i--) {
var capability = capabilities[i];
var mapping = module.exports.capabilityMap[capability.replace(notRegex, '')];
if (!mapping ||
mapping.platforms.indexOf(activeWatchInfo.platform) === -1 ||
mapping.minFwMajor > activeWatchInfo.firmware.major ||
mapping.minFwMajor === activeWatchInfo.firmware.major &&
mapping.minFwMinor > activeWatchInfo.firmware.minor
) {
result.push(!!capability.match(notRegex));
} else {
result.push(!capability.match(notRegex));
}
}
return result.indexOf(false) === -1;
};