UNPKG

node-hca

Version:

Node.js client for HCA

166 lines (125 loc) 5.03 kB
'use strict'; 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; })();