UNPKG

htd-lync

Version:

This library is meant to be used to interact with an HTD Lync 12

402 lines (342 loc) 11.8 kB
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); }