- * MCTX3420 2013 GUI stuff.
- * Coding style:
- * - Always end statements with semicolons
- * - Egyptian brackets are highly recommended (*cough*).
- * - Don't use synchronous stuff - hook events into callbacks
- * - $.fn functions should return either themselves or some useful object
- * to allow for chaining of method calls
- */
+* MCTX3420 2013 GUI stuff.
+* Coding style:
+* - Always end statements with semicolons
+* - Egyptian brackets are highly recommended (*cough*).
+* - Don't use synchronous stuff - hook events into callbacks
+* - $.fn functions should return either themselves or some useful object
+* to allow for chaining of method calls
+*/
+mctx.menu = [
+ {'text' : 'Home', href : mctx.location + 'index.html'},
+ {'text' : 'Experiment control', href : mctx.location + 'control.html'},
+ {'text' : 'Pin debugging', href : mctx.location + 'pintest.html'},
+ {'text' : 'Help', href : mctx.location + 'help.html'}
+];
+
- 0 : {name : "Strain gauge 1"},
- 1 : {name : "Strain gauge 2"},
- 2 : {name : "Strain gauge 3"},
- 3 : {name : "Strain gauge 4"},
- 4 : {name : "Pressure sensor 1"},
- 5 : {name : "Pressure sensor 2"},
- 6 : {name : "Pressure sensor 3"}
+ 0 : {name : "Strain gauge 1"},
+ 1 : {name : "Strain gauge 2"},
+ 2 : {name : "Strain gauge 3"},
+ 3 : {name : "Strain gauge 4"},
+ 4 : {name : "Pressure sensor 1"},
+ 5 : {name : "Pressure sensor 2"},
+ 6 : {name : "Pressure sensor 3"}
- 0 : {name : "Solenoid 1"},
- 1 : {name : "Solenoid 2"},
- 2 : {name : "Solenoid 3"},
- 3 : {name : "Pressure regulator"}
+ 0 : {name : "Solenoid 1"},
+ 1 : {name : "Solenoid 2"},
+ 2 : {name : "Solenoid 3"},
+ 3 : {name : "Pressure regulator"}
- * Logs a message if mctx.debug is enabled. This function takes
- * a variable number of arguments and passes them
- * to alert or console.log (based on browser support).
- * @returns {undefined}
- */
+* Logs a message if mctx.debug is enabled. This function takes
+* a variable number of arguments and passes them
+* to alert or console.log (based on browser support).
+* @returns {undefined}
+*/
- if (mctx.debug) {
- if (typeof console === "undefined" || typeof console.log === "undefined") {
- for (var i = 0; i < arguments.length; i++) {
- alert(arguments[i]);
- }
- } else {
- console.log.apply(this, arguments);
+ if (mctx.debug) {
+ if (typeof console === "undefined" || typeof console.log === "undefined") {
+ for (var i = 0; i < arguments.length; i++) {
+ alert(arguments[i]);
+ }
+ } else {
+ console.log.apply(this, arguments);
+ }
- * Should be run before the load of any GUI page.
- * To hook events to be called after this function runs,
- * use the 'always' method, e.g runBeforeLoad().always(function() {my stuff});
- * @param {type} isLoginPage
- * @returns The return value of calling $.ajax
- */
+* Should be run before the load of any GUI page.
+* To hook events to be called after this function runs,
+* use the 'always' method, e.g runBeforeLoad().always(function() {my stuff});
+* @param {type} isLoginPage
+* @returns The return value of calling $.ajax
+*/
- return $.ajax({
- url : mctx.api + "identify"
- }).done(function (data) {
- if (data.logged_in && isLoginPage) {
- if (mctx.debug) {
- debugLog("Redirect disabled!");
- } else {
- window.location = mctx.location;
- }
- } else if (!data.logged_in && !isLoginPage) {
- if (mctx.debug) {
- debugLog("Redirect disabled!");
- } else {
- //Note: this only clears the nameless cookie
- document.cookie = "";
- window.location = mctx.location + "login.html";
- }
- } else {
- mctx.friendlyName = data.friendly_name;
- }
- }).fail(function (jqHXR) {
- if (mctx.debug) {
- debugLog("Failed to ident server. Is API running?")
- } else if (!isLoginPage) {
- window.location = mctx.location + "login.html";
- }
- });
+ return $.ajax({
+ url : mctx.api + "identify"
+ }).done(function (data) {
+ if (data.logged_in && isLoginPage) {
+ if (mctx.debug) {
+ debugLog("Redirect disabled!");
+ } else {
+ window.location = mctx.location;
+ }
+ } else if (!data.logged_in && !isLoginPage) {
+ if (mctx.debug) {
+ debugLog("Redirect disabled!");
+ } else {
+ //Note: this only clears the nameless cookie
+ document.cookie = "";
+ window.location = mctx.location + "login.html";
+ }
+ } else {
+ mctx.friendlyName = data.friendly_name;
+ }
+ }).fail(function (jqHXR) {
+ if (mctx.debug) {
+ debugLog("Failed to ident server. Is API running?")
+ } else if (!isLoginPage) {
+ window.location = mctx.location + "login.html";
+ }
+ }).always(function () {
+
+ });
- * Populates a submenu of the navigation bar
- * @param {string} header The header
- * @param {object} items An object representing the submenu items
- * @param {function} translator A function that translates an object item
- * into a text and href.
- * @returns {$.fn} Itself
- */
-$.fn.populateSubmenu = function(header, items, translator) {
- var submenuHeader = $("<li/>").append($("<a/>", {text : header, href : "#"}));
- var submenu = $("<ul/>", {"class" : "submenu"});
-
- for (var item in items) {
- var info = translator(item, items);
- submenu.append($("<li/>").append(
- $("<a/>", {text : info.text,
- href : info.href, target : "_blank"})
- ));
- }
-
- this.append(submenuHeader.append(submenu));
- return this;
-};
-
-/**
- * Populates the navigation bar
+ * Populates the navigation menu.
-$.fn.populateNavbar = function () {
- var menu = $("<ul/>", {"class" : "menu"});
- var sensorTranslator = function(item, items) {
- var href = mctx.api + "sensors?start_time=0&format=tsv&id=" + item;
- return {text : items[item].name, href : href};
- };
- var actuatorTranslator = function(item, items) {
- var href = mctx.api + "actuators?start_time=0&format=tsv&id=" + item;
- return {text : items[item].name, href : href};
- };
-
- menu.populateSubmenu("Sensor data", mctx.sensors, sensorTranslator);
- menu.populateSubmenu("Actuator data", mctx.actuators, actuatorTranslator);
- menu.appendTo(this);
- return this;
+$.fn.populateNavMenu = function() {
+ var root = $("<ul/>")
+ for (var i = 0; i < mctx.menu.length; i++) {
+ var item = mctx.menu[i];
+ var entry = $("<li/>").append(
+ $("<a/>", {text : item.text, href: item.href})
+ );
+ root.append(entry);
+ }
+ $(this).append(root);
+ return this;
- //Stop updating if we can't retrieve an image!
- this.error(function() {
- update = false;
- });
-
- var parent = this;
-
- var updater = function() {
- if (!update) {
- alert("Cam fail");
- parent.attr("src", "");
- return;
- }
-
- parent.attr("src", url + "#" + (new Date()).getTime());
-
- setTimeout(updater, 1000);
- };
-
- updater();
- return this;
+ //Stop updating if we can't retrieve an image!
+ this.error(function() {
+ update = false;
+ });
+
+ var parent = this;
+
+ var updater = function() {
+ if (!update) {
+ alert("Cam fail");
+ parent.attr("src", "");
+ return;
+ }
+
+ parent.attr("src", url + "#" + (new Date()).getTime());
+
+ setTimeout(updater, 10000);
+ };
+
+ updater();
+ return this;
- var sensor_url = mctx.api + "sensors";
- var graphdiv = this;
-
- var updater = function () {
- var time_limit = mctx.strain_gauges.time_limit;
- var responses = new Array(mctx.strain_gauges.ids.length);
-
- for (var i = 0; i < mctx.strain_gauges.ids.length; i++) {
- var parameters = {id : i, start_time: -time_limit};
- responses[i] = $.ajax({url : sensor_url, data : parameters});
- }
-
- $.when.apply(this, responses).then(function () {
- var data = new Array(arguments.length);
- for (var i = 0; i < arguments.length; i++) {
- var raw_data = arguments[i][0].data;
- var pruned_data = [];
- var step = ~~(raw_data.length/100);
- for (var j = 0; j < raw_data.length; j += step)
- pruned_data.push(raw_data[j]);
- data[i] = pruned_data;
- }
- $.plot(graphdiv, data);
- setTimeout(updater, 500);
- }, function () {debugLog("It crashed");});
- };
-
- updater();
- return this;
+ var sensor_url = mctx.api + "sensors";
+ var graphdiv = this;
+
+ var updater = function () {
+ var time_limit = mctx.strain_gauges.time_limit;
+ var responses = new Array(mctx.strain_gauges.ids.length);
+
+ for (var i = 0; i < mctx.strain_gauges.ids.length; i++) {
+ var parameters = {id : i, start_time: -time_limit};
+ responses[i] = $.ajax({url : sensor_url, data : parameters});
+ }
+
+ $.when.apply(this, responses).then(function () {
+ var data = new Array(arguments.length);
+ for (var i = 0; i < arguments.length; i++) {
+ var raw_data = arguments[i][0].data;
+ var pruned_data = [];
+ var step = ~~(raw_data.length/100);
+ for (var j = 0; j < raw_data.length; j += step)
+ pruned_data.push(raw_data[j]);
+ data[i] = pruned_data;
+ }
+ $.plot(graphdiv, data);
+ setTimeout(updater, 1000);
+ }, function () {debugLog("It crashed");});
+ };
+
+ updater();
+ return this;
- var username = this.find("input[name='username']").val();
- var password = this.find("input[name='pass']").val();
- var out = this.find("#result");
- var redirect = function () {
- window.location.href = mctx.location;
- };
-
- out.removeAttr("class");
- out.text("Logging in...");
-
- return $.ajax({
- url : mctx.api + "bind",
- data : {user: username, pass : password}
- }).done(function (data) {
- if (data.status < 0) {
- mctx.has_control = false;
- out.attr("class", "fail");
- out.text("Login failed: " + data.description);
- } else {
- //todo: error check
- mctx.has_control = true;
- out.attr("class", "pass");
- out.text("Login ok!");
- setTimeout(redirect, 800);
- }
- }).fail(function (jqXHR) {
- mctx.has_control = false;
- out.attr("class", "fail");
- out.text("Login request failed - connection issues.")
- });
+ var username = this.find("input[name='username']").val();
+ var password = this.find("input[name='pass']").val();
+ var out = this.find("#result");
+ var redirect = function () {
+ window.location.href = mctx.location;
+ };
+
+ out.removeAttr("class");
+ out.text("Logging in...");
+
+ return $.ajax({
+ url : mctx.api + "bind",
+ data : {user: username, pass : password}
+ }).done(function (data) {
+ if (data.status < 0) {
+ mctx.has_control = false;
+ out.attr("class", "fail");
+ out.text("Login failed: " + data.description);
+ } else {
+ //todo: error check
+ mctx.has_control = true;
+ out.attr("class", "pass");
+ out.text("Login ok!");
+ setTimeout(redirect, 800);
+ }
+ }).fail(function (jqXHR) {
+ mctx.has_control = false;
+ out.attr("class", "fail");
+ out.text("Login request failed - connection issues.")
+ });
- * Performs a logout request. The nameless cookie is
- * always cleared and the browser redirected to the login page,
- * independent of whether or not logout succeeded.
- * @returns The AJAX object of the logout request.
- */
+* Performs a logout request. The nameless cookie is
+* always cleared and the browser redirected to the login page,
+* independent of whether or not logout succeeded.
+* @returns The AJAX object of the logout request.
+*/
- return $.ajax({
- url : mctx.api + "unbind"
- }).always(function () {
- //Note: this only clears the nameless cookie
- document.cookie = "";
- window.location = mctx.location + "login.html";
- });
+ return $.ajax({
+ url : mctx.api + "unbind"
+ }).always(function () {
+ //Note: this only clears the nameless cookie
+ document.cookie = "";
+ window.location = mctx.location + "login.html";
+ });
- var url = mctx.api + "errorlog";
- var outdiv = this;
-
- var updater = function () {
- $.ajax({url : url}).done(function (data) {
- outdiv.text(data);
- outdiv.scrollTop(
- outdiv[0].scrollHeight - outdiv.height()
- );
- setTimeout(updater, 2000);
- }).fail(function (jqXHR) {
- if (jqXHR.status === 502 || jqXHR.status === 0) {
- outdiv.text("Failed to retrieve the error log.");
- }
- setTimeout(updater, 4000);
- });
- };
-
- updater();
- return this;
+ var url = mctx.api + "errorlog";
+ var outdiv = this;
+
+ var updater = function () {
+ $.ajax({url : url}).done(function (data) {
+ outdiv.text(data);
+ outdiv.scrollTop(
+ outdiv[0].scrollHeight - outdiv.height()
+ );
+ setTimeout(updater, 3000);
+ }).fail(function (jqXHR) {
+ if (jqXHR.status === 502 || jqXHR.status === 0) {
+ outdiv.text("Failed to retrieve the error log.");
+ }
+ setTimeout(updater, 10000); //poll at slower rate
+ });
+ };
+
+ updater();
+ return this;