Lots of jsdoc

This commit is contained in:
Ian Gulliver
2014-04-23 13:06:59 -07:00
parent 1e87699ca1
commit 5c18510205

View File

@@ -15,14 +15,6 @@ limitations under the License.
*/ */
var cameraGrid = {}; var cameraGrid = {};
/**
* @function CameraGrid~getUrl
* @param {String} sourceUrl Base URL of the camera
* @param {number} width Valid resolution width in pixels
* @param {number} height Valid resolution height in pixels
* @return String
*/
/** /**
* @constructor * @constructor
* @export * @export
@@ -32,26 +24,45 @@ var cameraGrid = {};
* @param {function(String,number,number):String=} getUrl Callback to generate URL for a given camera * @param {function(String,number,number):String=} getUrl Callback to generate URL for a given camera
*/ */
cameraGrid.CameraGrid = function(container, sourceUrls, resolutions, getUrl) { cameraGrid.CameraGrid = function(container, sourceUrls, resolutions, getUrl) {
/** @type {Node} */
this.container_ = container; this.container_ = container;
/** @type {Array.<String>} */
this.sourceUrls_ = sourceUrls; this.sourceUrls_ = sourceUrls;
/** @type {Array.<Array.<number>>} */
this.resolutions_ = resolutions || this.defaultResolutions_; this.resolutions_ = resolutions || this.defaultResolutions_;
/** @type {function(String,number,number):String */
this.getUrl_ = getUrl || this.defaultGetUrl_; this.getUrl_ = getUrl || this.defaultGetUrl_;
/** @type {number} */
this.tileScaleWidth_ = this.resolutions_[0][0]; this.tileScaleWidth_ = this.resolutions_[0][0];
/** @type {number} */
this.tileScaleHeight_ = this.resolutions_[0][1]; this.tileScaleHeight_ = this.resolutions_[0][1];
/** @type {number} */
this.gridWidthCells_ = 0; this.gridWidthCells_ = 0;
/** @type {number} */
this.gridHeightCells_ = 0; this.gridHeightCells_ = 0;
/** @type {number} */
this.imgWidthPx_ = 0; this.imgWidthPx_ = 0;
/** @type {number} */
this.imgHeightPx_ = 0; this.imgHeightPx_ = 0;
/** @type {String} */
this.constraint_ = null; this.constraint_ = null;
/** @type {number} */
this.containerImgWidthPx_ = 0; this.containerImgWidthPx_ = 0;
/** @type {number} */
this.ctonainerImgHeightPx_ = 0; this.ctonainerImgHeightPx_ = 0;
/** @type {String} */
this.containerConstraint_ = null; this.containerConstraint_ = null;
/** @type {number?} */
this.selected_ = null; this.selected_ = null;
/** @type {boolean} */
this.scanning_ = false; this.scanning_ = false;
this.buildCells_(); this.buildCells_();
@@ -68,8 +79,11 @@ cameraGrid.CameraGrid = function(container, sourceUrls, resolutions, getUrl) {
window.setInterval(this.onScanTimer_.bind(this), 3000); window.setInterval(this.onScanTimer_.bind(this), 3000);
}; };
// Resolution list must be sorted ascending. /**
// All resolutions must be the same aspect ratio. * Default resolution list.
* List must be sorted ascending. All resolutions must be the same aspect ratio.
* @type {Array.<Array.<number>>}
*/
cameraGrid.CameraGrid.prototype.defaultResolutions_ = [ cameraGrid.CameraGrid.prototype.defaultResolutions_ = [
[ 160, 120 ], [ 160, 120 ],
[ 240, 180 ], [ 240, 180 ],
@@ -81,10 +95,20 @@ cameraGrid.CameraGrid.prototype.defaultResolutions_ = [
[ 1280, 960 ], [ 1280, 960 ],
]; ];
/**
* Generate a URL for a given camera and (valid) resolution. This version was
* tested with an Axis P3384-V.
* @param {String} sourceUrl Base URL for a camera
* @param {number} width Width in pixels of a valid resolution
* @param {number} height Height in pixels of a valid resolition
*/
cameraGrid.CameraGrid.prototype.defaultGetUrl_ = function(sourceUrl, width, height) { cameraGrid.CameraGrid.prototype.defaultGetUrl_ = function(sourceUrl, width, height) {
return sourceUrl + 'mjpg/video.mjpg?resolution=' + width + 'x' + height; return sourceUrl + 'mjpg/video.mjpg?resolution=' + width + 'x' + height;
}; };
/**
* Stop timed scanning through feeds and downres any non-selected images.
*/
cameraGrid.CameraGrid.prototype.disableScanning_ = function() { cameraGrid.CameraGrid.prototype.disableScanning_ = function() {
if (this.scanning_) { if (this.scanning_) {
this.scanning_ = false; this.scanning_ = false;
@@ -93,11 +117,20 @@ cameraGrid.CameraGrid.prototype.disableScanning_ = function() {
} }
}; };
/**
* Set the current feed selected for full-screen display, and disable timed
* scanning (in response to a user action that is expected to pause).
* @param {number} index Index into this.cells_ to select
*/
cameraGrid.CameraGrid.prototype.setSelectedNoScan_ = function(index) { cameraGrid.CameraGrid.prototype.setSelectedNoScan_ = function(index) {
this.setSelected_(index); this.setSelected_(index);
this.disableScanning_(); this.disableScanning_();
}; };
/**
* Set the current feed selected for full-screen display.
* @param {number} index Index into this.cells_ to select
*/
cameraGrid.CameraGrid.prototype.setSelected_ = function(index) { cameraGrid.CameraGrid.prototype.setSelected_ = function(index) {
var old_index = null; var old_index = null;
@@ -126,6 +159,9 @@ cameraGrid.CameraGrid.prototype.setSelected_ = function(index) {
} }
}; };
/**
* Construct cameraGridCell options for insertion into the DOM.
*/
cameraGrid.CameraGrid.prototype.buildCells_ = function() { cameraGrid.CameraGrid.prototype.buildCells_ = function() {
this.cells_ = []; this.cells_ = [];
for (var i = 0; i < this.sourceUrls_.length; i++) { for (var i = 0; i < this.sourceUrls_.length; i++) {
@@ -134,6 +170,11 @@ cameraGrid.CameraGrid.prototype.buildCells_ = function() {
} }
}; };
/**
* Add a CSS class to a node if it doesn't already have it.
* @param {Node} node Node object to add class to
* @param {String} className Name of class to add
*/
cameraGrid.CameraGrid.prototype.addCSSClass_ = function(node, className) { cameraGrid.CameraGrid.prototype.addCSSClass_ = function(node, className) {
var classes = node.className.split(' ').filter(function(className) { return className; }); var classes = node.className.split(' ').filter(function(className) { return className; });
if (classes.indexOf(className) != -1) { if (classes.indexOf(className) != -1) {
@@ -144,6 +185,11 @@ cameraGrid.CameraGrid.prototype.addCSSClass_ = function(node, className) {
node.className = classes.join(' '); node.className = classes.join(' ');
} }
/**
* Remove a CSS class to a node if it has it.
* @param {Node} node Node object to remove class from
* @param {String} className Name of class to remove
*/
cameraGrid.CameraGrid.prototype.removeCSSClass_ = function(node, className) { cameraGrid.CameraGrid.prototype.removeCSSClass_ = function(node, className) {
var classes = node.className.split(' ').filter(function(className) { return className; }); var classes = node.className.split(' ').filter(function(className) { return className; });
var i = classes.indexOf(className); var i = classes.indexOf(className);
@@ -155,6 +201,9 @@ cameraGrid.CameraGrid.prototype.removeCSSClass_ = function(node, className) {
node.className = classes.join(' '); node.className = classes.join(' ');
} }
/**
* Construct our stylesheet and insert it into the DOM.
*/
cameraGrid.CameraGrid.prototype.buildStylesheet_ = function() { cameraGrid.CameraGrid.prototype.buildStylesheet_ = function() {
var style = document.createElement('style'); var style = document.createElement('style');
document.head.appendChild(style); document.head.appendChild(style);
@@ -179,6 +228,12 @@ cameraGrid.CameraGrid.prototype.buildStylesheet_ = function() {
this.addCSSClass_(this.container_, 'cameraGridContainer'); this.addCSSClass_(this.container_, 'cameraGridContainer');
}; };
/**
* Calculate optimal grid sizing.
* This pile of magic math calculates the optimal grid width and height to
* maximize the size of all video feeds while preserving their aspect ratios.
* @returns {Object.<number, number, String, String, number, number>
*/
cameraGrid.CameraGrid.prototype.calculateGrid_ = function() { cameraGrid.CameraGrid.prototype.calculateGrid_ = function() {
var containerWidth = this.container_.offsetWidth; var containerWidth = this.container_.offsetWidth;
var containerHeight = this.container_.offsetHeight; var containerHeight = this.container_.offsetHeight;
@@ -246,6 +301,12 @@ cameraGrid.CameraGrid.prototype.calculateGrid_ = function() {
}; };
}; };
/**
* Calculate minimum feed resolution that is larger than the given tile size.
* @param {number} tileWidth Target tile width in pixels
* @param {number} tileHeight Target tile height in pixels
* @returns {Object.<number, number>}
*/
cameraGrid.CameraGrid.prototype.findMinimumResolution_ = function(tileWidth, tileHeight) { cameraGrid.CameraGrid.prototype.findMinimumResolution_ = function(tileWidth, tileHeight) {
for (var i = 0; i < this.resolutions_.length; i++) { for (var i = 0; i < this.resolutions_.length; i++) {
var resolution = this.resolutions_[i]; var resolution = this.resolutions_[i];