htd-lync
Version:
This library is meant to be used to interact with an HTD Lync 12
402 lines (342 loc) • 11.8 kB
JavaScript
var socket;
document.addEventListener('deviceready', function onDeviceReady() {
connectToTCPSocket();
createZoneList();
createVolumeBar(1);
}, false);
//TODO - put back
//setInterval(checkTimeLastMessage, 1000);
function checkTimeLastMessage() {
var difference = new Date() - timeLastMessage;
if (difference > 30000 && lastPage == "home") {
timeLastMessage = new Date();
//TODO Test closing the socket before reloading page.
closeTCPSocket();
window.location.reload(true);
}
}
var firstLoadSocket = true;
var lastMsg;
var lastCommand;
var socketTCP;
var socketTcpId;
var timeLastMessage = new Date();
function wsSendBinary(command, hasCRCAlready) {
//Pass this function an array of hex values.
timeLastMessage = new Date();
if (!controllerConnected) {
console.log("Controller is offline");
}
//Add the checksum
if (!hasCRCAlready) {
var withCRC = addCRC(command);
console.log("Sending: " + withCRC)
} else {
var withCRC = command;
}
//Format as a string
var hexValInput = formatHexString(withCRC)
var byteArray = new Uint8Array(hexValInput.length);
if (hexValInput.length % 2 != 0) {
var sendArray = new Uint8Array((hexValInput.length + 1) / 2);
} else {
var sendArray = new Uint8Array(hexValInput.length / 2);
}
var i;
byteArray = hexValInput;
for (i = 0; i < sendArray.length; i++) {
if ((byteArray[i * 2] >= '0' && byteArray[i * 2] <= '9') || (byteArray[i * 2] >= 'A' && byteArray[i * 2] <= 'F') || (byteArray[i * 2] >= 'a' && byteArray[i * 2] <= 'f')) {
sendArray[i] = parseInt(byteArray[i * 2], 16) * 16 + parseInt(byteArray[i * 2 + 1], 16);
} else
console.log('Can not transfer into HEX format!');
}
//Here I push the command into a buffer array.
commandBuffer.push(sendArray);
}
function sendOverTCPSocket(sendDT) {
var buf = new ArrayBuffer(sendDT.length);
var bufView = new Uint8Array(buf);
for (i = 0; i < sendDT.length; i++) {
bufView[i] = sendDT[i];
}
console.log("Sending to TCP Socket: " + bufView);
chrome.sockets.tcp.setPaused(socketTcpId, false, function(result3) {})
chrome.sockets.tcp.send(socketTcpId, buf);
}
function closeTCPSocket() {
console.log("close TCP socket")
controllerConnected = false;
$("#connectedCircle").attr("src", "images/redCircle.png");
chrome.sockets.tcp.close(socketTcpId);
chrome.sockets.tcp.disconnect(socketTcpId);
$("#redBar").show();
//firstLoadSocket = true;
}
function checkRedBar() {
if (controllerConnected == false) {
$('#redBar').show();
}
}
function connectToTCPSocket() {
//This creates the TCP connection. It does it on page load.
chrome.sockets.tcp.create({}, function(createInfo) {
socketTcpId = createInfo.socketId;
console.log("connecting to tcp socket", systems[systemIdx].system.ip, systems[systemIdx].system.port, socketTcpId);
setTimeout(checkRedBar, 1000)
chrome.sockets.tcp.connect(socketTcpId, systems[systemIdx].system.ip, systems[systemIdx].system.port * 1, function(result) {
// chrome.sockets.tcp.setKeepAlive(socketTcpId, true, 500, function(result2) {
// console.log("keep alive: " + result2)
// })
chrome.sockets.tcp.setPaused(socketTcpId, false, function(result3) {
console.log("set paused: " + result3)
})
if (result === 0) {
$("#connectedCircle").attr("src", "images/whiteCircle.png");
$('#redBar').hide();
if (firstLoadSocket) {
firstLoadSocket = false;
sOpen();
}
controllerConnected = true;
/// connection ok, send the packet
} else {
console.log("connection failed", socketTcpId, systems[systemIdx].system.ipp)
$("#connectedCircle").attr("src", "images/redCircle.png");
$('#redBar').show();
}
});
chrome.sockets.tcp.onReceiveError.addListener(function(error) {
//// This listens for errors on receive. It never occurs.
console.log("TCP error: ", JSON.stringify(error));
controllerConnected = false;
$("#connectedCircle").attr("src", "images/redCircle.png");
$('#redBar').show();
chrome.sockets.tcp.close(socketTcpId);
chrome.sockets.tcp.disconnect(socketTcpId);
window.location.href = 'index2.html'
});
chrome.sockets.tcp.onReceive.addListener(function(info) {
try {
/// This handels the incoming messages and converts them to HEX format.
var dat = arrayBuffer2HEX(info.data);
timeLastMessage = new Date();
lastMsg = dat;
//check for grouped messages. source names come grouped.
var msgData = dat.split(" ");
console.log("------------Received HEX: " + dat);
var tempStr = dat;
checkForSplits(tempStr);
} catch (e) {
console.log("catch error: ", e)
}
});
});
}
function checkForSplits(tempStr) {
//console.log("--CHECK FOR SPLITS---")
//new split logic
var splitChars = ['1 ', '2 ', '3 ', '4 ', '5 ', '6 ', '7 ', '8 ', '9 ', 'a ', 'b ', 'c ', 'd ', 'e ', 'f '] //removed 0
var tempArr = [];
//find first split
var idx = tempStr.length;
for (var i = 0; i < splitChars.length; i++) {
var idx2 = tempStr.indexOf(" 2 0 " + splitChars[i]);
//handle multiples of the same type
var indices = getIndicesOf(" 2 0 " + splitChars[i], tempStr);
//console.log(indicies)
if (indices.length > 1) {
idx2 = indices[1];
}
//logic to find the first split.
if (idx2 < idx && idx2 > 0) { //make sure its not finding the first one
//console.log(idx2);
idx = idx2;
}
}
//console.log("final IDX: " + idx)
if (idx < tempStr.length) {
//console.log("We have a message that needs splitting:" + idx + ":" + tempStr.length)
//process the first message
var splitMsg = tempStr.slice(1, idx);
//console.log("1st Message: " + splitMsg);
obj = splitMsg.split(" ");
processMessage(obj);
//get remaining message
var remainingMsg = tempStr.slice(idx, tempStr.length);
//console.log("remaining msg: " + remainingMsg);
//console.log(idx + ":" + tempStr.length)
checkForSplits(remainingMsg);
} else {
//console.log("complete message: " + tempStr);
//tempStr = tempStr.slice(1, tempStr.length);
obj = tempStr.split(" ");
if (obj[0] == "") {
obj.shift();
}
processMessage(obj);
}
}
function getIndicesOf(searchStr, str) {
var searchStrLen = searchStr.length;
if (searchStrLen == 0) {
return [];
}
var startIndex = 0,
index, indices = [];
while ((index = str.indexOf(searchStr, startIndex)) > -1) {
indices.push(index);
startIndex = index + searchStrLen;
}
return indices;
}
function sOpen() {
//When the socket opens, this runs. It asks for the ID of the system.
//After we receive the ID (different file), it requests more data.
console.log('connect success! sOpen');
controllerConnected = true;
getFirmware();
getID();
setInterval(getFirmware, 30000)
setTimeout(setDoorbell, 45000);
}
var controllerConnected = false;
function sError() {
console.log('connect error');
$('#pageName').addClass("red")
}
function checkForMassMessage(dat) {
console.log("check for mass message");
var mp3Name = dat.indexOf('2 0 0 12');
//console.log("mp3Name", mp3Name)
if (mp3Name > 1) {
var data = dat.split('2 0 0 12');
data[1] = "2 0 0 12" + data[1];
//console.log(data);
for (var i = 0; i < 2; i++) {
var dataString = formatHexString(data[i]);
dataString = dataString.split(" ");
if (dataString.length > 5) {
//var passCRC = checkCRC(dataString);
//if (passCRC) {
processMessage(dataString);
//}
}
}
return;
}
for (var i = 1; i < 14; i++) {
var subStr = dat.split("2 0 " + i.toString(16))[0];
dat = "2 0 " + i.toString(16) + dat.split("2 0 " + i.toString(16))[1];
var dataString = formatHexString(subStr);
dataString = dataString.split(" ");
if (dataString.length > 5) {
processMessage(dataString);
}
}
}
function sClose() {
console.log('connect close')
controllerConnected = false;
$('#pageName').addClass("red")
setTimeout(connectx, 500);
}
function checkCRC(hexArray, hideLog) {
//var hexValInput = ["02", "00", "00", "6E", "00"];
if (hexArray.length < 3) {
console.log("Message too short");
console.log(hexArray);
return;
}
var index;
var checksum = 0;
//console.log(hexArray);
for (index = 0; index < hexArray.length - 2; index++) {
checksum += parseInt(hexArray[index], 16);
//console.log(checksum);
}
var checkSumString = checksum.toString(16);
checkSumString = checkSumString.toLowerCase();
//console.log("checksumString:" + checkSumString, checkSumString.length);
if (checkSumString.length > 2) {
checkSumString = checkSumString.slice(checkSumString.length - 2, checkSumString.length);
//console.log(checkSumString)
}
var CRCpass = false;
var checksumRcvd = hexArray[hexArray.length - 2];
if (checksumRcvd.length == 1) {
checksumRcvd = "0" + checksumRcvd;
}
if (checksumRcvd == checkSumString) {
CRCpass = true;
} else {
if (!hideLog) {
console.log("Bad checksum received-------------------------------------------");
console.log("checksum received", hexArray[hexArray.length - 2], "calculated checksum", checkSumString);
var dataString = formatHexString(hexArray);
console.log(dataString);
console.log("-------------------------------------------");
}
//check for allowed commands for it to pass
if (hexArray[0] == "4c" || hexArray[hexArray.length - 2] == 0 || hexArray[3] == "11") {
console.log("Allowed to pass")
CRCpass = true;
}
}
return CRCpass;
}
function addCRC(hexArray) {
//var hexValInput = ["02", "00", "00", "6E", "00"];
var index;
var checksum = 0;
for (index = 0; index < hexArray.length; index++) {
checksum += parseInt(hexArray[index], 16);
}
var checkSumString = checksum.toString(16);
checkSumString = checkSumString.toUpperCase();
//console.log("checksumString:" + checkSumString, checkSumString.length);
if (checkSumString.length > 2) {
checkSumString = checkSumString.slice(checkSumString.length - 2, checkSumString.length);
//console.log(checkSumString)
}
if (checkSumString.length == 1) {
checkSumString = "0" + checkSumString;
}
//console.log(checkSumString.toString(16))
hexArray.push(checkSumString);
//console.log(hexArray)
return hexArray;
// console.log(checksum);
}
function formatHexString(hexArray) {
var hexString = ""
for (i = 0; i < hexArray.length; i++) {
//console.log(hexArray[i])
if (hexArray.length == 1) {
hexString += "0" + hexArray[i]
} else {
hexString += hexArray[i];
}
}
//console.log(hexString);
return (hexString);
}
var commandBufferTime = 175;
var commandBuffer = [];
handleSendBuffer();
function handleSendBuffer() {
//This runs ever 50ms. It checks if the system is connected, then checks if there are any commands to send.
//console.log("controllerConnected:" + controllerConnected)
if (commandBuffer[0] && controllerConnected) {
//$('.bottom-buttons-connected').addClass("green");
$("#connectedCircle").attr("src", "images/greenCircle.png");
console.log("Sending Buffer to Controller: " + commandBuffer[0])
console.log("Command Buffer length: " + commandBuffer.length)
//socket.send(commandBuffer[0]);
sendOverTCPSocket(commandBuffer[0]);
commandBuffer.shift();
} else if (commandBuffer.length == 0 && controllerConnected) {
//$('.bottom-buttons-connected').removeClass("green");
$("#connectedCircle").attr("src", "images/whiteCircle.png");
}
setTimeout(handleSendBuffer, commandBufferTime);
}