195 lines
6.6 KiB
JavaScript
195 lines
6.6 KiB
JavaScript
/*jshint esversion: 6 */
|
|
const path = require('path');
|
|
const db = require(path.resolve(__dirname, '../_helpers/db.js'));
|
|
const ptzHelper = require(path.resolve(__dirname, '../_helpers/ptzHelper.js'));
|
|
const socket = require(path.resolve(__dirname, '../_helpers/socket.js'));
|
|
const Camera = db.Camera;
|
|
|
|
module.exports = {
|
|
preset: _presets,
|
|
motion: _motion,
|
|
focus: _focus,
|
|
zoom: _zoom
|
|
};
|
|
|
|
async function _presets({id, mode, speed = null, memNum = null}) {
|
|
let memCmd;
|
|
|
|
switch(mode.toLowerCase()) {
|
|
case 'speed':
|
|
const recallSpeed = ptzHelper.numToHexStr(speed).padStart(2, "0");
|
|
memCmd = "81010601" + recallSpeed + "FF";
|
|
break;
|
|
case 'call':
|
|
memCmd = "8101043F02" + ptzHelper.numToHexStr(memNum).padStart(2, "0") + "FF";
|
|
break;
|
|
case 'set':
|
|
memCmd = "8101043F01" + ptzHelper.numToHexStr(memNum).padStart(2, "0") + "FF";
|
|
break;
|
|
case 'reset':
|
|
memCmd = "8101043F00" + ptzHelper.numToHexStr(memNum).padStart(2, "0") + "FF";
|
|
break;
|
|
default:
|
|
throw "The preset mode " + mode + " is not a recognizable preset method.";
|
|
}
|
|
|
|
try {
|
|
return await socket.sendCmd(id, memCmd);
|
|
} catch(err) {
|
|
throw err;
|
|
}
|
|
}
|
|
|
|
async function _motion({id, mode, pan = null, tilt = null, panSpeed = null, tiltSpeed = null, direction = null}) {
|
|
if (mode === 'absolute' || mode === 'relative' || mode === 'standard') {
|
|
panTiltSpeedArr = ptzHelper.sanitizeSpeed(panSpeed, tiltSpeed);
|
|
if (mode === 'absolute' || mode === 'relative') {
|
|
pan = ptzHelper.numToHexStr(pan);
|
|
tilt = ptzHelper.numToHexStr(tilt);
|
|
}
|
|
}
|
|
|
|
let motionHex;
|
|
switch(mode.toLowerCase()) {
|
|
case 'home':
|
|
motionHex = "81010604FF";
|
|
break;
|
|
case 'absolute':
|
|
motionHex = "81010602" + panTiltSpeedArr[0] + panTiltSpeedArr[1] + pan + tilt +"FF";
|
|
break;
|
|
case 'relative':
|
|
motionHex = "81010603" + panTiltSpeedArr[0] + panTiltSpeedArr[1] + pan + tilt +"FF";
|
|
break;
|
|
case 'standard':
|
|
motionHex = "81010601" + panTiltSpeedArr[0] + panTiltSpeedArr[1] + ptzHelper.translateDirection(direction);
|
|
break;
|
|
case 'current':
|
|
motionHex = "81090612FF";
|
|
break;
|
|
default:
|
|
throw "The option " + mode + " is not a recognizable motion method.";
|
|
}
|
|
|
|
try {
|
|
return await socket.sendCmd(id, motionHex);
|
|
} catch(err) {
|
|
throw err;
|
|
}
|
|
}
|
|
|
|
async function _focus({id, mode, option = null, focusPos = null, intensity = null}) {
|
|
let focusHex = '';
|
|
switch(mode.toLowerCase()) {
|
|
case 'standard':
|
|
focusHex = "81010408";
|
|
|
|
if (option === 'stop') {
|
|
focusHex += "00FF";
|
|
} else if (option === 'tele') {
|
|
focusHex += "03FF";
|
|
} else if (option === 'wide') {
|
|
focusHex += "02FF";
|
|
} else {
|
|
throw "The focus option " + option + " is not a recognizable standard focus option";
|
|
}
|
|
break;
|
|
case 'variable':
|
|
focusHex = "81010408";
|
|
if (option === 'tele') {
|
|
focusHex += '3' + intensity + "FF";
|
|
} else if (option === 'wide') {
|
|
focusHex += '2' + intensity + "FF";
|
|
} else {
|
|
throw "The focus option " + option + " is not a recognizable variable focus option";
|
|
}
|
|
break;
|
|
case 'direct':
|
|
focusPos = numToHexStr(focusPos).split('').reduce((str, char) => {
|
|
return '0' + char;
|
|
});
|
|
focusPos = focusPos.padStart(8, "0");
|
|
focusHex = "81010448" + focusPos + "FF";
|
|
break;
|
|
case 'focusmode':
|
|
focusHex = "810";
|
|
if (option === 'auto') {
|
|
focusHex += "1043802FF";
|
|
} else if (option === 'manual') {
|
|
focusHex += "1043803FF";
|
|
} else if (option === 'toggle') {
|
|
focusHex += "1043810FF";
|
|
} else if (option === 'lock') {
|
|
focusHex += "A046802FF";
|
|
} else if (option === 'unlock') {
|
|
focusHex += "A046803FF";
|
|
} else {
|
|
throw "The focus option " + option + " is not a recognizable focus mode option";
|
|
}
|
|
break;
|
|
case 'afzone':
|
|
focusHex = "810104AA";
|
|
if (option === 'top') {
|
|
focusHex += "00FF";
|
|
} else if (option === 'center') {
|
|
focusHex += "01FF";
|
|
} else if (option === 'bottom') {
|
|
focusHex += "02FF";
|
|
} else {
|
|
throw "The focus option " + option + " is not a recognizable auto focus-zone option";
|
|
}
|
|
break;
|
|
default:
|
|
throw "The focus mode " + mode + " is not a recognizable focus method.";
|
|
}
|
|
|
|
try {
|
|
return await socket.sendCmd(id, focusHex);
|
|
} catch(err) {
|
|
throw err;
|
|
}
|
|
}
|
|
|
|
async function _zoom({id, mode, option = null, zoomPos = null, intensity}) {
|
|
let zoomHex = '';
|
|
|
|
switch (mode) {
|
|
case 'standard':
|
|
zoomHex = "81010407";
|
|
if (option === "stop") {
|
|
zoomHex += "00FF";
|
|
} else if (option === "tele") {
|
|
zoomHex += "02FF";
|
|
} else if (option === 'wide') {
|
|
zoomHex += "03FF";
|
|
} else {
|
|
throw "The zoom option " + option + " is not a recognizable standard zoom option";
|
|
}
|
|
break;
|
|
case 'variable':
|
|
zoomHex = "81010407";
|
|
if (option === 'tele') {
|
|
zoomHex += '2' + intensity + "FF";
|
|
} else if (option === 'wide') {
|
|
zoomHex += '3' + intensity + "FF";
|
|
} else {
|
|
throw "The zoom option " + option + " is not a recognizable variable zoom option";
|
|
}
|
|
break;
|
|
case 'direct':
|
|
zoomPos = numToHexStr(zoomPos).split('').reduce((str, char) => {
|
|
return '0' + char;
|
|
});
|
|
zoomPos = zoomPos.padStart(8, "0");
|
|
zoomHex = "81010447" + zoomPos + "FF";
|
|
break;
|
|
default:
|
|
throw "The zoom mode " + mode + " is not a recognizable zoom method.";
|
|
}
|
|
|
|
try {
|
|
return await socket.sendCmd(id, zoomHex);
|
|
} catch(err) {
|
|
throw err;
|
|
}
|
|
}
|