node-hca
Version:
Node.js client for HCA
166 lines (125 loc) • 5.03 kB
JavaScript
;
var util = require('util'),
EventEmitter = require('events').EventEmitter,
message = require('../Messaging/message'),
Display = require('./Display');
(function() {
var self,
connection,
displayIndex = 0,
displays = [];
var DisplayManager = function(conn) {
if (!conn) {
throw Error('A Connection instance is required.');
return;
}
// Superclass constructor.
EventEmitter.call(this);
self = this;
connection = conn;
this.topics = {
displaysReceived: 'Displays:Received',
displayUpdated: 'Display:Updated',
displayUpdatedId: 'Display:Updated:{id}'
};
};
util.inherits(DisplayManager, EventEmitter);
DisplayManager.prototype.init = function() {
// Reset initial values in case of a reconnect.
displayIndex = 0;
displays.length = 0;
// Remove event listeners
connection.removeListener(connection.topics.messageReceived, onMessageReceived);
var params = ['HCAApp', 'GetDisplays', '0'];
connection.on('GetDisplays', onChunk);
connection.send(params);
};
DisplayManager.prototype.getDisplayCount = function() {
return displays.length;
};
DisplayManager.prototype.getDisplay = function(displayId) {
var display = displays.filter(function(obj) {
return obj.id == parseInt(displayId);
});
return display[0];
};
DisplayManager.prototype.getDisplays = function() {
return displays;
};
var onChunk = function(response) {
if (response.code == -1) { // end of displays.
connection.removeListener('GetDisplays', onChunk);
connection.on(connection.topics.messageReceived, onMessageReceived);
self.emit(self.topics.displaysReceived, null);
return;
}
decodeData(response.data);
};
var onMessageReceived = function(response) {
if (response.command !== 'Update')
return;
updateItem(response);
};
var decodeData = function(data) {
var displays = message.decode(data[0]);
for (var i = 0; i < displays.length; i++) {
var itemParams = message.decode(displays[i]);
var existingItem = self.getDisplay(itemParams[0]);
// Do not allow duplicate entries.
if (existingItem)
continue;
addDisplay(itemParams);
}
displayIndex++;
// Get next chunk.
var params = ['HCAApp', 'GetDisplays', displayIndex.toString()];
connection.send(params);
};
var addDisplay = function(itemParams) {
var display = new Display();
display.displayName = itemParams[0];
display.id = parseInt(itemParams[1]);
display.currentState = parseInt(itemParams[2]);
display.iconName = itemParams[3];
display.shortTapAction = parseInt(itemParams[4]);
display.longTapAction = parseInt(itemParams[5]);
display.noShow = parseInt(itemParams[6]);
display.displayNameFormat = parseInt(itemParams[7]);
display.currentIconName = itemParams[8];
display.currentIconLabel = itemParams[9];
display.displayType = parseInt(itemParams[10]);
display.displayNameFormatLegacy = parseInt(itemParams[11]);
display.itemIds = itemParams[12];
display.iconRepresentation = parseInt(itemParams[13]);
// These parameters don't appear be available.
display.backgroundType = parseInt(itemParams[14]);
display.backgroundPath = itemParams[15];
display.noAutoClose = parseInt(itemParams[16]);
display.displayLabelName = itemParams[17];
display.htmlPath = itemParams[18];
display.htmlUrl = itemParams[19];
display.themeName = itemParams[20];
display.objectType = parseInt(itemParams[21]);
display.alexaName = itemParams[22];
displays.push(display);
return display;
};
var updateItem = function(response) {
var data = response.data,
id = parseInt(data[0]),
display = self.getDisplay(id);
if (!(display instanceof Display))
return;
// TODO: Update other properties.
// Ex: 11 Jan 15:06:35 - [RCV] {"code":"0","group":"HCAApp","command":"Update","data":["5021","0","0","0","","","100","20160111150634"]}
display.currentState = parseInt(data[1]);
// display.suspend = parseInt(data[2]);
// display.buttonState = data[3];
// display.iconName = data[4];
// display.iconLabel = data[5];
// display.currentIconRepresentation = parseInt(data[6]);
self.emit(self.topics.displayUpdated);
self.emit(self.topics.displayUpdated + ':' + id, display); // Emit with id of updated item.
};
module.exports = DisplayManager;
})();