160 lines
6.0 KiB
JavaScript
160 lines
6.0 KiB
JavaScript
(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.jiboTunableClient = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){
|
|
/**
|
|
* @fileOverview
|
|
*
|
|
* Created on 5/21/16.
|
|
* @author Siggi Orn <siggi@jibo.com>
|
|
*/
|
|
"use strict";
|
|
exports.ReqType = {
|
|
INIT: 'INIT',
|
|
NEW_FIELD: 'NEW_FIELD',
|
|
PLAY: 'PLAY',
|
|
PLAYING: 'PLAYING',
|
|
DONE_PLAYING: 'DONE_PLAYING',
|
|
VALUE_UPDATE: 'VALUE_UPDATE',
|
|
};
|
|
var gui;
|
|
var Client = (function () {
|
|
function Client(port) {
|
|
var _this = this;
|
|
this.wsHandlers = new Map();
|
|
this.folders = new Map();
|
|
// Setup gui for first time
|
|
if (!gui) {
|
|
gui = new dat.GUI({ autoPlace: false });
|
|
var container = document.getElementById('gui-container');
|
|
container.appendChild(gui.domElement);
|
|
gui.width = 400;
|
|
}
|
|
this.ws = new WebSocket('ws://' + window.location.hostname + ':' + port);
|
|
// When the connection is open, send some data to the server
|
|
this.ws.onopen = function () {
|
|
var msg = {
|
|
type: exports.ReqType.INIT,
|
|
data: ''
|
|
};
|
|
_this.sendWS(msg);
|
|
};
|
|
this.ws.onclose = function (ev) {
|
|
console.log('WebSocket closed: ', ev);
|
|
_this.cleanup();
|
|
};
|
|
// Log errors
|
|
this.ws.onerror = function (error) {
|
|
console.error('WebSocket Error: ', error);
|
|
_this.cleanup();
|
|
};
|
|
// Log messages from the server
|
|
this.ws.onmessage = function (incoming) {
|
|
console.log('Got WS message: ' + incoming.data);
|
|
var msg = JSON.parse(incoming.data);
|
|
var handler = _this.wsHandlers.get(msg.type);
|
|
if (handler) {
|
|
var resp = handler(msg.data);
|
|
if (resp) {
|
|
_this.sendWS(resp);
|
|
}
|
|
}
|
|
};
|
|
this.addWsHandler(exports.ReqType.VALUE_UPDATE, function (data) {
|
|
var folder = _this.folders.get(data.folderName);
|
|
if (!folder) {
|
|
throw new Error("No folder of name '" + data.folderName + "'");
|
|
}
|
|
folder.obj[data.fieldName] = data.value;
|
|
// Update display value of all children of folder
|
|
folder.gui.__controllers.forEach(function (c) {
|
|
c.updateDisplay();
|
|
});
|
|
});
|
|
/**
|
|
* Install handler for new fields
|
|
*/
|
|
this.addWsHandler(exports.ReqType.NEW_FIELD, function (data) {
|
|
var folderName = data.folderName;
|
|
var fieldName = data.fieldName;
|
|
var folder = _this.folders.get(folderName);
|
|
if (!folder) {
|
|
folder = {
|
|
obj: {},
|
|
gui: gui.addFolder(folderName)
|
|
};
|
|
_this.folders.set(folderName, folder);
|
|
}
|
|
folder.gui.open();
|
|
folder.obj[fieldName] = data.field._current;
|
|
var el;
|
|
var type = data.field.type;
|
|
if (type === 'string') {
|
|
el = folder.gui.add(folder.obj, fieldName, data.field.options);
|
|
}
|
|
else if (type === 'boolean') {
|
|
el = folder.gui.add(folder.obj, fieldName);
|
|
}
|
|
else if (type === 'number') {
|
|
el = folder.gui.add(folder.obj, fieldName, data.field.min, data.field.max);
|
|
el.step(data.field.step);
|
|
}
|
|
else if (type === 'button') {
|
|
folder.obj[fieldName] = function () {
|
|
//let a = arguments;
|
|
//debugger;
|
|
//this.sendWS({
|
|
// type: ReqType.VALUE_UPDATE,
|
|
// data: {
|
|
// folderName,
|
|
// fieldName,
|
|
// value: true
|
|
// }
|
|
//});
|
|
};
|
|
el = folder.gui.add(folder.obj, fieldName);
|
|
}
|
|
else {
|
|
throw new Error("Can't handle field of type '" + data.field.type + "'");
|
|
}
|
|
_this.addChangeListener(el, folderName, fieldName);
|
|
});
|
|
}
|
|
Client.prototype.sendWS = function (msg) {
|
|
this.ws.send(JSON.stringify(msg));
|
|
};
|
|
Client.prototype.addWsHandler = function (type, handler) {
|
|
this.wsHandlers.set(type, handler);
|
|
};
|
|
Client.prototype.addChangeListener = function (el, folderName, fieldName) {
|
|
var _this = this;
|
|
el.onChange(function (value) {
|
|
_this.sendWS({
|
|
type: exports.ReqType.VALUE_UPDATE,
|
|
data: {
|
|
folderName: folderName,
|
|
fieldName: fieldName,
|
|
value: value,
|
|
}
|
|
});
|
|
});
|
|
};
|
|
Client.prototype.cleanup = function () {
|
|
if (gui) {
|
|
this.folders.forEach(function (folder, key) {
|
|
var clone = folder.gui.__controllers.slice(0);
|
|
clone.forEach(function (fCon) { return folder.gui.remove(fCon); });
|
|
});
|
|
}
|
|
this.folders.clear();
|
|
gui.destroy();
|
|
gui = undefined;
|
|
};
|
|
return Client;
|
|
}());
|
|
exports.Client = Client;
|
|
var root = window || global;
|
|
root.Client = Client;
|
|
|
|
},{}]},{},[1])(1)
|
|
});
|
|
|
|
//# sourceMappingURL=jibo-tunable-client.js.map
|