function irTransceive(type, name, id)
{
this.CanService(type, name, id);
}
extend(irTransceive, CanService);
irTransceive.prototype.canMessageHandler = function(canMessage)
{
/*if (canMessage.getDirectionFlag() == "From_Owner")
{
switch (canMessage.getCommandName())
{
case "IR":
break;
}
}*/
this.CanService.prototype.canMessageHandler.call(this, canMessage);
}
irTransceive.prototype.sendClick = function(channel, remoteName, buttonName, time)
{
this.sendButton(channel, remoteName, buttonName, true);
if (time)
{
sleep(time);
}
else
{
sleep(50000);
}
this.sendButton(channel, remoteName, buttonName, false);
}
irTransceive.prototype.sendButton = function(channel, remoteName, buttonName, down)
{
var remotesStore = DataStore.getStore("IRRemotes");
if (remotesStore)
{
for (var n = 0; n < remotesStore['remotes'].length; n++)
{
if (remotesStore['remotes'][n]['name'] == remoteName)
{
for (var code in remotesStore['remotes'][n]['codes'])
{
if (remotesStore['remotes'][n]['codes'][code] == buttonName)
{
this.sendData(channel, remotesStore['remotes'][n]['protocol'], code, down ? "Pressed" : "Released");
return;
}
}
}
}
}
}
irTransceive.prototype.sendData = function(channel, protocol, data, status)
{
var canMessage = new CanMessage("sns", "To_Owner", this.myName, this.myId, "IR");
canMessage.setData("Channel", channel);
canMessage.setData("Status", status);
canMessage.setData("Protocol", protocol);
canMessage.setData("IRdata", data);
sendMessage(canMessage);
}
irTransceive.prototype.sendConfig = function(channel, direction, power, modfreq)
{
var canMessage2 = new CanMessage("sns", "To_Owner", this.myName, this.myId, "IrConfig");
canMessage2.setData("Channel", channel);
canMessage2.setData("Direction", direction);
canMessage2.setData("Transmit power", power);
canMessage2.setData("Modulation divider", modfreq);
sendMessage(canMessage2);
}
irTransceive.prototype.sendProntoTest = function(channel)
{
// pronto start
var msg = new CanMessage("sns", "To_Owner", this.myName, this.myId, "IrProntoStart");
msg.setData("Channel", channel);
msg.setData("Format", 0);
msg.setData("wFrqDiv", 109); // 4.145146MHz / 38kHz
msg.setData("OnceSeqLen", 7);
msg.setData("RepSeqLen", 0);
sendMessage(msg);
sleep(10);
// pronto data
msg = new CanMessage("sns", "To_Owner", this.myName, this.myId, "IrProntoData1");
msg.setData("Act1", 150); // 3.9
msg.setData("Pas1", 45); // 1.2
msg.setData("Act2", 40); // 1.2
msg.setData("Pas2", 65); // 1.7
msg.setData("Act3", 37); // 0.98
msg.setData("Pas3", 26); // 0.7
msg.setData("Act4", 40); // 1.05
msg.setData("Pas4", 62); // 1.6
sendMessage(msg);
sleep(10);
// pronto data/end
msg = new CanMessage("sns", "To_Owner", this.myName, this.myId, "IrProntoEnd2");
msg.setData("Act1", 93); // 2.4
msg.setData("Pas1", 40); // 1.1
msg.setData("Act2", 40); // 1.1
msg.setData("Pas2", 80); // 2.1
msg.setData("Act3", 80); // 2.1
msg.setData("Pas3", 83);
msg.setData("Repeat", 0);
sendMessage(msg);
sleep(10);
}
function hexString2NumberArray(hexString)
{
var tokens = hexString.split(' ');
var numbers = new Array();
for (var i=0; i<tokens.length; i++) {
numbers[i] = parseInt(tokens[i], 16)
}
return numbers;
}
// prontoHexString is a space-separated hex string, including both the pronto header and the data
irTransceive.prototype.sendProntoHex = function(channel, prontoHexString)
{
var prontoNumbers = hexString2NumberArray(prontoHexString);
// header
var format = prontoNumbers[0];
var frqDiv = prontoNumbers[1];
var onceSeqLen = prontoNumbers[2];
var repSeqLen = prontoNumbers[3];
print("Sending START. CH=" + channel + ", fmt=" + format + ", wFrqDiv=" + frqDiv + ", onceLen=" + onceSeqLen + ", repLen=" + repSeqLen + "\n");
var msg = new CanMessage("sns", "To_Owner", this.myName, this.myId, "IrProntoStart");
msg.setData("Channel", channel);
msg.setData("Format", format);
msg.setData("wFrqDiv", frqDiv);
msg.setData("OnceSeqLen", onceSeqLen);
msg.setData("RepSeqLen", repSeqLen);
sendMessage(msg);
sleep(10);
// data
var nrBytes = 0;
var bytes = new Array();
var seqNr = 0;
for (var i=4; i<prontoNumbers.length; i++) {
// 8bit value?
if (prontoNumbers[i] <= 255) {
// compress into single byte
bytes[nrBytes] = prontoNumbers[i];
nrBytes++;
}
// 16bit value?
else {
// occupy 3 bytes to describe this value
bytes[nrBytes] = (prontoNumbers[i] & 0xFF00) >> 8;
bytes[nrBytes+1] = 0x00;
bytes[nrBytes+2] = (prontoNumbers[i] & 0x00FF) >> 0;
nrBytes += 3;
}
// time to send?
if (nrBytes >= 8) {
print("Sending DATA. " + nrBytes + " bytes: " + bytes + " (SEQ NR:" + (seqNr+1) + ")\n");
msg = new CanMessage("sns", "To_Owner", this.myName, this.myId, "IrProntoData" + (seqNr+1));
msg.setData("Act1", bytes[0]);
msg.setData("Pas1", bytes[1]);
msg.setData("Act2", bytes[2]);
msg.setData("Pas2", bytes[3]);
msg.setData("Act3", bytes[4]);
msg.setData("Pas3", bytes[5]);
msg.setData("Act4", bytes[6]);
msg.setData("Pas4", bytes[7]);
sendMessage(msg);
sleep(10);
bytes = new Array();
nrBytes = 0;
seqNr = (seqNr + 1) % 16;
}
}
print("Sending END. " + nrBytes + " bytes: " + bytes + " (SEQ NR:" + (seqNr+1) + ")\n");
msg = new CanMessage("sns", "To_Owner", this.myName, this.myId, "IrProntoEnd" + (seqNr+1));
if (nrBytes > 1) msg.setData("Act1", bytes[0]);
if (nrBytes > 2) msg.setData("Pas1", bytes[1]);
if (nrBytes > 3) msg.setData("Act2", bytes[2]);
if (nrBytes > 4) msg.setData("Pas2", bytes[3]);
if (nrBytes > 5) msg.setData("Act3", bytes[4]);
if (nrBytes > 6) msg.setData("Pas3", bytes[5]);
msg.setData("Repeat", 0x00);
sendMessage(msg);
sleep(10);
}
function sendProntoTest()
{
var ir = ServiceManager.getService("Can","irTransceive",1);
ir.sendProntoHex(1, "0000 006d 0022 0002 0156 00ad 0016 0016 0016 0041 0016 0041 0016 0041 0016 0016 0016 0041 0016 0041 0016 0041 0016 0041 0016 0041 0016 0041 0016 0016 0016 0016 0016 0016 0016 0016 0016 0041 0016 0016 0016 0041 0016 0016 0016 0041 0016 0016 0016 0016 0016 0016 0016 0016 0016 0016 0016 0016 0016 0016 0016 0041 0016 0041 0016 0016 0016 0016 0016 0041 0016 05ed 0156 0056 0016 0e62");
}