Merge pull request #85 from Callum-/dilatometer
[matches/MCTX3420.git] / testing / CansWebInterface / To Be Ammended / mctx.gui2.js
1 /**
2  * MCTX3420 2013 GUI stuff.
3  */
4
5 mctx = {};
6 mctx.api = location.protocol + "//" +  location.host + "/api/";
7 mctx.expected_api_version = 0;
8 mctx.key = undefined;
9 mctx.has_control = false;
10
11 mctx.return_codes = {
12   "1" : "Ok",
13   "-1" : "General error",
14   "-2" : "Unauthorized",
15   "-3" : "Not running",
16   "-4" : "Already exists"
17 };
18
19 mctx.sensors = {
20   0 : {name : "Strain gauge 1"},
21   1 : {name : "Strain gauge 2"},
22   2 : {name : "Strain gauge 3"},
23   3 : {name : "Strain gauge 4"},
24   4 : {name : "Pressure sensor 1"},
25   5 : {name : "Pressure sensor 2"}
26 };
27
28 mctx.actuators = {
29   0 : {name : "Solenoid 1"},
30   1 : {name : "Solenoid 2"},
31   2 : {name : "Solenoid 3"},
32   3 : {name : "Pressure regulator"}
33 };
34
35 mctx.strain_gauges = {};
36 mctx.strain_gauges.ids = [0, 1, 2, 3];
37 mctx.strain_gauges.time_limit = 20;
38
39 /**
40  * Writes the current date to wherever it's called.
41  */
42 function getDate(){
43         document.write((new Date()).toDateString());
44 }
45
46 /**
47  * Populates a submenu of the navigation bar
48  * @param {string} header The header
49  * @param {object} items An object representing the submenu items
50  * @param {function} translator A function that translates an object item
51  *                              into a text and href.
52  * @returns {$.fn} Itself
53  */
54 $.fn.populateSubmenu = function(header, items, translator) {
55   var submenuHeader = $("<li/>").append($("<a/>", {text : header, href : "#"}));
56   var submenu = $("<ul/>", {"class" : "submenu"});
57   
58   for (var item in items) {
59     var info = translator(item, items);
60     submenu.append($("<li/>").append(
61           $("<a/>", {text : info.text, 
62                      href : info.href, target : "_blank"})
63     ));
64   }
65   
66   this.append(submenuHeader.append(submenu));
67   return this;
68 };
69
70 /** 
71  * Populates the navigation bar
72  */
73 $.fn.populateNavbar = function () {
74   var menu = $("<ul/>", {"class" : "menu"});
75   var sensorTranslator = function(item, items) {
76     var href = mctx.api + "sensors?start_time=0&format=tsv&id=" + item;
77     return {text : items[item].name, href : href};
78   };
79   var actuatorTranslator = function(item, items) {
80     var href = mctx.api + "actuators?start_time=0&format=tsv&id=" + item;
81     return {text : items[item].name, href : href};
82   };
83   
84   menu.populateSubmenu("Home", mctx.home, sensorTranslator);
85   menu.populateSubmenu("Setup", mctx.setup, actuatorTranslator);
86   menu.populateSubmenu("Admin", mctx.admin, actuatorTranslator);
87   menu.populateSubmenu("Help", mctx.help, actuatorTranslator);
88   menu.appendTo(this);
89   return this;
90 }
91
92 /**
93  * Sets the camera autoupdater
94  * @returns {$.fn}
95  */
96 $.fn.setCamera = function () {
97   var url = mctx.api + "image";  //http://beaglebone/api/image
98   var update = true;
99
100   //Stop updating if we can't retrieve an image!
101   this.error(function() {
102     update = false;
103   });
104   
105   var parent = this;
106   
107   var updater = function() {
108     if (!update) {
109       alert("Cam fail");
110       parent.attr("src", "");
111       return;
112     }
113     
114     parent.attr("src", url + "#" + (new Date()).getTime());
115     
116     setTimeout(updater, 1000);
117   };
118   
119   updater();
120   return this;
121 };
122
123 $.fn.setStrainGraphs = function () {
124   var sensor_url = mctx.api + "sensors";
125   var graphdiv = this;
126   
127   var updater = function () {
128     var time_limit = mctx.strain_gauges.time_limit;
129     var responses = new Array(mctx.strain_gauges.ids.length);
130     
131     for (var i = 0; i < mctx.strain_gauges.ids.length; i++) {
132       var parameters = {id : i, start_time: -time_limit};
133       responses[i] = $.ajax({url : sensor_url, data : parameters});
134     }
135     
136     $.when.apply(this, responses).then(function () {
137       var data = new Array(arguments.length);
138       for (var i = 0; i < arguments.length; i++) {
139         var raw_data = arguments[i][0].data;
140         var pruned_data = [];
141         var step = ~~(raw_data.length/100);
142         for (var j = 0; j < raw_data.length; j += step)
143           pruned_data.push(raw_data[j]); 
144         data[i] = pruned_data;
145       }
146       $.plot(graphdiv, data);
147       setTimeout(updater, 500);
148     }, function () {alert("It crashed");});
149   };
150   
151   updater();
152   return this;
153 };
154
155 $.fn.login = function () {
156   var username = this.find("input[name='username']").val();
157   var password = this.find("input[name='pass']").val();
158   var force = this.find("input[name='force']").is(":checked");
159   var url = mctx.api + "control";
160   
161   var authFunc = function(xhr) {
162     xhr.setRequestHeader("Authorization",
163         "Basic " + base64.encode(username + ":" + password));
164   };
165
166   $.ajax({
167     url : url,
168     data : {action : "lock", force : (force ? true : undefined)},
169     beforeSend : authFunc
170   }).done(function (data) {
171     mctx.key = data.key;
172     if (data.status < 0) {
173       alert("no - " + data.description);
174     } else {
175       mctx.has_control = true;
176       alert("Login Successful - " + mctx.key);
177     }
178   }).fail(function (jqXHR) {
179     mctx.key = undefined;
180     mctx.has_control = false;
181     alert("Login Failed: Please ensure your pheme Username and Password are correct");
182   });
183 };
184
185 $.fn.setErrorLog = function () {
186   var url = mctx.api + "errorlog";
187   var outdiv = this;
188   
189   var updater = function () {
190     $.ajax({url : url}).done(function (data) {
191       outdiv.text(data);
192       setTimeout(updater, 1000);
193     }).fail(function (jqXHR) {
194       outdiv.text("Failed to retrieve the error log.");
195     });
196   };
197   
198   updater();
199 };

UCC git Repository :: git.ucc.asn.au