UNPKG

htd-lync

Version:

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

750 lines (715 loc) 16.4 kB
function processMessage(msgData) { console.log("Process message: ", msgData, msgData[3]) if (msgData[3] == "d") { zoneNameRcvd(msgData); } else if (msgData[3] == "e") { sourceNameRcvd(msgData); } else if (msgData[0] == "4c") { console.log("ID"); receiveID(msgData); } else if (msgData[3] == "5") { zoneStatusRcvd(msgData); } else if (msgData[3] == "11") { console.log("mp3 file name") mp3FileNameReceived(msgData); } else if (msgData[3] == "12") { console.log("mp3 artist") mp3ArtistNameReceived(msgData); } else if (msgData[3] == "33") { console.log("firmware v3"); firmware = "v3"; } } var firmware = "v2"; function zoneStatusRcvd(msgData) { var zone = parseInt(msgData[2], 16); console.log("ZONE STATUS RECEIVED", zone); console.log("Message", msgData, msgData[4]) if (!systems[systemIdx].zones[zone]) { //addZone(zone); } if (msgData[4] == "80" || msgData[4] == "0") { systems[systemIdx].zones[zone].powerOn = false; } else if (msgData[4] == "81" || msgData[4] == "1") { systems[systemIdx].zones[zone].powerOn = true; systems[systemIdx].zones[zone].muteOn = false; systems[systemIdx].zones[zone].dndOn = false; } else if (msgData[4] == "83" || msgData[4] == "3") { systems[systemIdx].zones[zone].powerOn = true; systems[systemIdx].zones[zone].muteOn = true; systems[systemIdx].zones[zone].dndOn = false; } else if (msgData[4] == "85" || msgData[4] == "5") { systems[systemIdx].zones[zone].powerOn = true; systems[systemIdx].zones[zone].muteOn = false; systems[systemIdx].zones[zone].dndOn = true; } else if (msgData[4] == "87" || msgData[4] == "7") { systems[systemIdx].zones[zone].powerOn = true; systems[systemIdx].zones[zone].muteOn = true; systems[systemIdx].zones[zone].dndOn = true; } //console.log("MP3 REPEAT", msgData[6]) if (msgData[6] == 10 || msgData[6] == 30) { // console.log("change") $('#mp3RepeatImg').attr("src", "images/rowActive.png") } else if (msgData[6] == 20) { $('#mp3RepeatImg').attr("src", "images/shuffleActive.png") } else { $('#mp3RepeatImg').attr("src", "images/row.png") } if (msgData[8]) { //console.log("Source: " + msgData[8]) if (msgData[8] == "a") { systems[systemIdx].zones[zone].source = 11; } else if (msgData[8] == "b") { systems[systemIdx].zones[zone].source = 12; } else if (msgData[8] == "c") { systems[systemIdx].zones[zone].source = 13; if (systems[systemIdx].system.model == "Lync6") { firmware = "v3"; } } else if (msgData[8] == "d") { systems[systemIdx].zones[zone].source = 14; } else if (msgData[8] == "e") { systems[systemIdx].zones[zone].source = 15; } else if (msgData[8] == "f") { systems[systemIdx].zones[zone].source = 16; } else if (msgData[8] == "10") { systems[systemIdx].zones[zone].source = 17; } else if (msgData[8] == "11") { systems[systemIdx].zones[zone].source = 18; } else if (msgData[8] == "12") { systems[systemIdx].zones[zone].source = 19; firmware = "v3"; } else if (msgData[8] == "13") { systems[systemIdx].zones[zone].source = 20; } else if (msgData[8] != "FF") { //console.log("other source", msgData[8]) systems[systemIdx].zones[zone].source = msgData[8] * 1 + 1; } //console.log("new Source: " + zones[zone].source) } updateBass(zone, msgData[11]); updateTreble(zone, msgData[10]); updateBalance(zone, msgData[12]); updateVolume(msgData); updateGUI(zone); if (zone == Gzone) { //console.log("global zone") makeSourceHeaderZonePage(Gzone); updateButtons(Gzone); updateVolumeBar(Gzone); } updateData(); //console.log(JSON.stringify(zones)) } function updateBass(zone, hexBass) { if (!hexBass) { hexBass = 2; } var val = getBassTrebleBalValue(hexBass); systems[systemIdx].zones[zone].bass = val; //console.log("updateBass", zone, hexBass, val) updateData(); updateGUI(zone); updateZoneSettings(); if (zone == Gzone) { var bassSlider = document.getElementById('bassSlider'); bassSlider.noUiSlider.set(systems[systemIdx].zones[Gzone].bass); } } function updateTreble(zone, hexBass) { if (!hexBass) { hexBass = 2; } var val = getBassTrebleBalValue(hexBass); systems[systemIdx].zones[zone].treble = val; //console.log("UpdateTreble:" + hexBass + ":" + val) updateGUI(zone); updateData(); if (zone == Gzone) { var trebleSlider = document.getElementById('trebleSlider'); trebleSlider.noUiSlider.set(systems[systemIdx].zones[Gzone].treble); } } function updateBalance(zone, hexBal) { //console.log(hexBal) var val; switch (hexBal) { case "f6": val = -10; break; case "f7": val = -9; break; case "f8": val = -8; break; case "f9": val = -7; break; case "fa": val = -6; break; case "fa": val = -6; break; case "fb": val = -5; break; case "fc": val = -4; break; case "fd": val = -3; break; case "fe": val = -2; break; case "ff": val = -1; break; case "0": val = 0; break; case "1": val = 1; break; case "2": val = 2; break; case "3": val = 3; break; case "4": val = 4; break; case "5": val = 5; break; case "6": val = 6; break; case "7": val = 7; break; case "8": val = 8; break; case "9": val = 9; break; case "a": val = 10; break; } //console.log("Balance " + hexBal + ":" + val) systems[systemIdx].zones[zone].balance = val; updateGUI(zone); updateData(); if (zone == Gzone) { //console.log("update bal") $("input[name=balanceSlider][value=" + systems[systemIdx].zones[zone].balance + "]").prop("checked", true); } } function getBassTrebleBalValue(input) { var val; switch (input) { case "f6": val = -10; break; case "f7": val = -9; break; case "f8": val = -8; break; case "f9": val = -7; break; case "fa": val = -6; break; case "fb": val = -5; break; case "fc": val = -4; break; case "fd": val = -3; break; case "fe": val = -2; break; case "ff": val = -1; break; case "0": val = 0; break; case "1": val = 1; break; case "2": val = 2; break; case "3": val = 3; break; case "4": val = 4; break; case "5": val = 5; break; case "6": val = 6; break; case "7": val = 7; break; case "8": val = 8; break; case "9": val = 9; break; case "a": val = 10; break; } return val; } function updateVolume(msgData) { //console.log("update volume") var zone = parseInt(msgData[2], 16); if (!msgData[9]) { return; } var volumeHex = msgData[9].toUpperCase(); var gVolume = 0; // console.log("update volume zone: " + zone, volumeHex); switch (volumeHex) { case "C4": gVolume = 0; break; case "C5": gVolume = 1; break; case "C6": gVolume = 2; break; case "C7": gVolume = 3; break; case "C8": gVolume = 4; break; case "C9": gVolume = 5; break; case "CA": gVolume = 6; break; case "CB": gVolume = 7; break; case "CC": gVolume = 8; break; case "CD": gVolume = 9; break; case "CE": gVolume = 10; break; case "CF": gVolume = 11; break; case "D0": gVolume = 12; break; case "D1": gVolume = 13; break; case "D2": gVolume = 14; break; case "D3": gVolume = 15; break; case "D4": gVolume = 16; break; case "D5": gVolume = 17; break; case "D6": gVolume = 18; break; case "D7": gVolume = 19; break; case "D8": gVolume = 20; break; case "D9": gVolume = 21; break; case "DA": gVolume = 22; break; case "DB": gVolume = 23; break; case "DC": gVolume = 24; break; case "DD": gVolume = 25; break; case "DE": gVolume = 26; break; case "DF": gVolume = 27; break; case "E0": gVolume = 28; break; case "E1": gVolume = 29; break; case "E2": gVolume = 30; break; case "E3": gVolume = 31; break; case "E4": gVolume = 32; break; case "E5": gVolume = 33; break; case "E6": gVolume = 34; break; case "E7": gVolume = 35; break; case "E8": gVolume = 36; break; case "E9": gVolume = 37; break; case "EA": gVolume = 38; break; case "EB": gVolume = 39; break; case "EC": gVolume = 40; break; case "ED": gVolume = 41; break; case "EE": gVolume = 42; break; case "EF": gVolume = 43; break; case "F0": gVolume = 44; break; case "F1": gVolume = 45; break; case "F2": gVolume = 46; break; case "F3": gVolume = 47; break; case "F4": gVolume = 48; break; case "F5": gVolume = 49; break; case "F6": gVolume = 50; break; case "F7": gVolume = 51; break; case "F8": gVolume = 52; break; case "F9": gVolume = 53; break; case "FA": gVolume = 54; break; case "FB": gVolume = 55; break; case "FC": gVolume = 56; break; case "FD": gVolume = 57; break; case "FE": gVolume = 58; break; case "FF": gVolume = 59; break; case "00": case "0": case 0: gVolume = 60; break; } //console.log("Update zone Volume: " + zone + ":" + gVolume) //console.log("set gVolume 465") systems[systemIdx].zones[zone].vol = gVolume; if (gVolume == 0) { systems[systemIdx].zones[zone].muteOn = true; } if (waitingToUpdateGroups == false) { updateGUI(zone); } updateData(); if (zone == Gzone) { //console.log("global") updateVolumeBar(Gzone); } } //This starts the data getting process function receiveID(msgData) { var msgString = formatHexString(msgData); var str = ''; for (var n = 0; n < msgData.length - 1; n++) { str += (String.fromCharCode(parseInt(msgData[n], 16))); } console.log("system model: " + str) if (str.indexOf("Lync1") >= 0) { str = "Lync12"; } else { str = "Lync6"; } //console.log(str, msgData); console.log("systemID: " + str) //console.log("zones", zones); systems[systemIdx].system.model = str; //create the empty zones if local storage is empty. if (!systems[systemIdx].zones || systems[systemIdx].zones.length == 0) { zones = []; if (systems[systemIdx].system.model == "Lync12") { for (i = 1; i <= 12; i++) { console.log("Creating zone " + i) zones[i] = { name: "Zone " + i, appName: "", vol: 0, source: 1, powerOn: false, muteOn: false, dndOn: false, bass: 0, treble: 0, balance: 0, mp31: "", mp32: "", reportOn: false, enabled: true, enableDoorbell: true } } } else { for (i = 1; i <= 6; i++) { console.log("Creating zone " + i) zones[i] = { name: "Zone " + i, appName: "", vol: 0, source: 1, powerOn: false, muteOn: false, dndOn: false, bass: 0, treble: 0, balance: 0, mp31: "", mp32: "", reportOn: false, enabled: true, doorbellEnabled: true } } } } if (!systems[systemIdx].sources || systems[systemIdx].sources.length == 0) { sources = []; if (systems[systemIdx].system.model == "Lync12") { var numOfSources = 18; if (firmware == "v3") { numOfSources = 19; } for (i = 1; i <= numOfSources; i++) { console.log("adding source " + i) if (i == 18) { sources[i] = { name: "MP3 Player", appName: "MP3 Player", mp31: "", mp32: "", enabled: true } } else if (i == 19 && firmware == "v3") { sources[i] = { name: "Intercom", appName: "Intercom", mp31: "", mp32: "", enabled: true } } else { console.log("Adding source " + i) sources[i] = { name: "Source " + i, appName: "", mp31: "", mp32: "", enabled: true } } } } else { for (i = 1; i <= 13; i++) { if (i == 12) { sources[i] = { name: "MP3 Player", appName: "MP3 Player", mp31: "", mp32: "", enabled: true } } else if (i == 13) { sources[i] = { name: "Intercom", appName: "Intercom", mp31: "", mp32: "", enabled: true } } else { sources[i] = { name: "Source " + i, appName: "", mp31: "", mp32: "", enabled: true } } } } } console.log("update data after getting ID"); updateData(); getZoneNames(1); } function isValid(str) { var ascii = /^[ -~]+$/; if (!ascii.test(str)) { // string has non-ascii characters return false; } else { return true; } } function addZone(zone) { systems[systemIdx].zones[zone] = { name: "Zone " + zone, appName: "Zone " + zone, vol: 0, source: 0, powerOn: false, muteOn: false, dndOn: false, bass: 0, treble: 0, balance: 0, mp31: "", mp32: "", reportOn: false, enabled: true, enableDoorbell: true } updateData(); updateGUI(zone); } var gotStatus = false; function mp3FileNameReceived(msgData) { //var source = msgData[15]; //var hex = formatHexString(msgData) //force conversion console.log("mp3 filename msg ", msgData); var str = ''; var n = 4; for (n; n < msgData.length - 2; n++) { var hex = formatHexString(msgData[n]); var isCharacter = isValid(String.fromCharCode(parseInt(hex, 16))) if (isCharacter) { str += (String.fromCharCode(parseInt(hex, 16))); } else { console.log("Bad character!") break; } //console.log(String.fromCharCode(parseInt(hex.substr(n, 2), 16))) } //str = str.replace(/\W/g, '') //str = str.replace(/[^\w\s]/gi, '') str = str.replace(".mp3", ""); console.log("mp3 name", str); if (systems[systemIdx].system.model == "Lync 6" || systems[systemIdx].sources.length < 15) { systems[systemIdx].sources[12].mp31 = str; } else { systems[systemIdx].sources[18].mp31 = str; } updateData() $("#songName").text(str); } function mp3ArtistNameReceived(msgData) { //var source = msgData[15]; console.log("mp3 artist msg ", msgData); var str = ''; var n = 4; for (n; n < msgData.length - 2; n++) { var hex = formatHexString(msgData[n]); //console.log(String.fromCharCode(parseInt(hex, 16))); var isCharacter = isValid(String.fromCharCode(parseInt(hex, 16))) if (isCharacter) { str += (String.fromCharCode(parseInt(hex, 16))); } else { console.log("Bad character!") break; } } //str = str.replace(/\W/g, '') //str = str.replace(/[^\w\s]/gi, '') str = str.replace(".mp3", ""); console.log("mp32 name", str); if (systems[systemIdx].system.model == "Lync6") { sources[12].mp32 = str; } else { sources[18].mp32 = str; } updateData() $("#artistName").text(str); }