iobroker.pjlink
Version:
PJLink Projector controll
406 lines (311 loc) • 8.87 kB
JavaScript
var util = require('util'),
extend = require('extend'),
response= require('./response');
var Command = function(cmd, args, cb){
this.cmd = cmd || "INVA";
if(typeof args!=='object' && typeof args!=='undefined' && args!==null){
args = [args];
}
this.args = args;
this.cb = cb;
}
Command.prototype.toString = function(){
var str = this.cmd;
if(this.args){
for(var i=0; i<this.args.length; i++){
str += ' ' + this.args[i];
}
}
return str;
}
Command.prototype.handleResponse = function(resp){
//no callback, so return
if(!this.cb) return;
if(resp.isError()){
this.cb(resp.getError());
return;
}
if(resp.cmd!=this.cmd){
this.cb(response.getError(response.ERRORS.ERRM));
return;
}
if(!resp.hasArgs()){
this.cb();
return;
}
var args = this.formatResult(resp.getArgs());
if(util.isArray(args)){
args.unshift(null);
}else{
args = [null, args];
}
this.cb.apply(null, args);
}
Command.prototype.formatResult = function(args){
return args;
}
/************* POWER ************/
Command.POWER = {
OFF: 0, ON: 1, COOLING_DOWN: 2, WARMING_UP: 3,
STANDBY: 0
}
Command.PowerCommand = function(){
var cb;
var data = '?';
var args = Array.prototype.slice.call(arguments, 0);
if(typeof args[args.length-1]==='function') cb = args.pop();
if(args.length>0){
data = args.shift();
}
Command.call(this, 'POWR', data, cb);
}
util.inherits(Command.PowerCommand, Command);
Command.PowerCommand.prototype.formatResult = function(args){
if(args.length>0){
return parseInt(args[0]);
}
}
/************* INPUT ************/
Command.INPUT = {
RGB: 1, VIDEO: 2, DIGITAL: 3, STORAGE: 4, NETWORK: 5
}
Command.InputCommand = function(){
var cb;
var data = '?';
var args = Array.prototype.slice.call(arguments, 0);
if(typeof args[args.length-1]==='function') cb = args.pop();
if(args.length>0){
var input = {source: 'rgb', channel: 1}
if(typeof args[0]=='object'){
input = extend(input, args[0]);
}else if(typeof args[0]=='string' && args[0].length==2){ //string code
// @ts-ignore
input.source = parseInt(args[0].substr(0,1));
input.channel = parseInt(args[0].substr(1,1));
}else if(typeof args[0]=='number' && args[0]>=10){ //number code
input.channel = args[0]%10;
// @ts-ignore
input.source = (args[0]-input.channel)/10;
}else{
input.source = args.shift();
if(args.length) input.channel = args.shift();
}
if(typeof input.source==='string'){
input.source = Command.INPUT[input.source.toUpperCase()];
}
data = input.source + '' + input.channel;
}
Command.call(this, 'INPT', data, cb);
}
util.inherits(Command.InputCommand, Command);
Command.InputCommand.prototype.formatResult = function(args){
if(args.length>0){
args = args[0];
if(typeof args==='string' && args.length>1){
try{
var source = parseInt(args.substr(0,1));
var channel = parseInt(args.substr(1,1));
return {source: source, channel: channel, code: args, name: findSourceName(source, channel)};
}catch(e){}
}
}
}
var findSourceName = function(source, channel){
for(var key in Command.INPUT){
if(Command.INPUT[key]==source){
return key + ' - ' + channel;
}
}
return 'unknown';
}
/************* MUTE ************/
Command.MuteCommand = function(){
var cb;
var data = '?';
var args = Array.prototype.slice.call(arguments, 0);
if(typeof args[args.length-1]==='function') cb = args.pop();
if(args.length>0){
var mute = {audio: false, video: false};
if(typeof args[0]=='number') {
// handling of extendet mute status
// @ts-ignore
data = args[0];
} else {
if (typeof args[0]=='object'){
mute = extend(mute, args[0]);
} else {
mute.video = args.shift();
if(args.length) mute.audio = args.shift();
}
//if both the same
if (mute.audio==mute.video){
if (mute.audio){
data = '31';
} else {
data = '30';
}
} else {
if (mute.video){
data = '11';
} else {
data = '21';
}
}
}
}
Command.call(this, 'AVMT', data, cb);
}
util.inherits(Command.MuteCommand, Command);
Command.MuteCommand.prototype.formatResult = function(args){
// Added extended mute status
var mute = {audio: false, video: false, status: 30}
if(args.length>0){
args = args[0];
if(typeof args==='string' && args.length>1){
var c = args.substr(0,1);
var v = (args.substr(1,1)=='1');
mute.status = parseInt(args);
switch(c){
case '1':
mute.video = v;
break;
case '2':
mute.audio = v;
break;
case '3':
mute.video = mute.audio = v;
break;
}
}
}
return mute;
}
/************* ERRORS ************/
Command.ErrorsCommand = function(){
var cb;
var data = '?';
var args = Array.prototype.slice.call(arguments, 0);
if(typeof args[args.length-1]==='function') cb = args.pop();
Command.call(this, 'ERST', data, cb);
}
util.inherits(Command.ErrorsCommand, Command);
Command.ErrorsCommand.prototype.formatResult = function(args){
if(args.length>0){
args = args[0];
if(typeof args==='string' && args.length==6){
if(parseInt(args)!=0){
var err = {
fan: args.substr(0,1),
lamp: args.substr(1,1),
temperature: args.substr(2,1),
cover: args.substr(3,1),
filter: args.substr(4,1),
other: args.substr(5,1)
}
for(const k in err){
if(err.hasOwnProperty(k)){
err[k] = (err[k]=='2'?'error':(err[k]=='1')?'warning':false);
}
}
return err;
}
}
}
return null;
}
/************* LAMP ************/
Command.LampCommand = function(){
var cb;
var data = '?';
var args = Array.prototype.slice.call(arguments, 0);
if(typeof args[args.length-1]==='function') cb = args.pop();
Command.call(this, 'LAMP', data, cb);
}
util.inherits(Command.LampCommand, Command);
Command.LampCommand.prototype.formatResult = function(args){
var lamps = [];
if(args.length>0 && args.length%2==0){
for(var i=0; i<args.length; i+=2){
var lamp = {
hours: parseInt(args[i]),
on: (args[i+1]=='1')
}
lamps.push(lamp);
}
}
return [lamps];
}
/************* INPUTS ************/
Command.InputsCommand = function(){
var cb;
var data = '?';
var args = Array.prototype.slice.call(arguments, 0);
if(typeof args[args.length-1]==='function') cb = args.pop();
Command.call(this, 'INST', data, cb);
}
util.inherits(Command.InputsCommand, Command);
Command.InputsCommand.prototype.formatResult = function(args){
var inputs = [];
for(var i=0; i<args.length; i++){
var input = args[i];
if(typeof input==='string' && input.length>1){
try{
var source = parseInt(input.substr(0,1));
var channel = parseInt(input.substr(1,1));
inputs.push(
{source: source, channel: channel, code: input, name: findSourceName(source, channel)}
);
}catch(e){}
}
}
return [inputs];
}
/************* Name ************/
Command.NameCommand = function(){
var cb;
var data = '?';
var args = Array.prototype.slice.call(arguments, 0);
if(typeof args[args.length-1]==='function') cb = args.pop();
Command.call(this, 'NAME', data, cb);
}
util.inherits(Command.NameCommand, Command);
/************* MANUFACTURER ************/
Command.ManufacturerCommand = function(){
var cb;
var data = '?';
var args = Array.prototype.slice.call(arguments, 0);
if(typeof args[args.length-1]==='function') cb = args.pop();
Command.call(this, 'INF1', data, cb);
}
util.inherits(Command.ManufacturerCommand, Command);
/************* MODEL ************/
Command.ModelCommand = function(){
var cb;
var data = '?';
var args = Array.prototype.slice.call(arguments, 0);
if(typeof args[args.length-1]==='function') cb = args.pop();
Command.call(this, 'INF2', data, cb);
}
util.inherits(Command.ModelCommand, Command);
Command.ModelCommand.prototype.formatResult = function(args) {
return args.join(" ");
}
/************* INFO ************/
Command.InfoCommand = function(){
var cb;
var data = '?';
var args = Array.prototype.slice.call(arguments, 0);
if(typeof args[args.length-1]==='function') cb = args.pop();
Command.call(this, 'INFO', data, cb);
}
util.inherits(Command.InfoCommand, Command);
/************* CLASS ************/
Command.ClassCommand = function(){
var cb;
var data = '?';
var args = Array.prototype.slice.call(arguments, 0);
if(typeof args[args.length-1]==='function') cb = args.pop();
Command.call(this, 'CLSS', data, cb);
}
util.inherits(Command.ClassCommand, Command);
module.exports = Command;