htd-lync
Version:
This library is meant to be used to interact with an HTD Lync 12
750 lines (715 loc) • 16.4 kB
JavaScript
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);
}