f414a82fc327dd88fec5d67c1aee328945808bed
[matches/MCTX3420.git] / testing / MCTXWeb / public_html / static / mctx.control.js
1 /**
2  * Code for the controls page.
3  * @date 19-10-2013
4  */
5
6 mctx.control = {};
7 mctx.control.api = mctx.api + 'control'
8 mctx.control.states = {
9   start : 0,
10   pause : 1,
11   resume : 2,
12   stop : 3,
13   emergency : 4
14 };
15 mctx.control.state = null;
16
17 function toggleControls(running) {
18   if (running) {
19     $("#experiment-stop").show();
20     $("#pressure-widget").show();
21     $("#start-widget").hide();
22   } else {
23     $("#start-widget").show();
24     $("#experiment-stop").hide();
25     $("#pressure-widget").hide();
26   }
27 }
28
29 function setSampleRate(id, val, result) {
30   var n = Number(val);
31   if (isNaN(n) || n < 0) {
32     result.text("You must give positive numeric values.").addClass("fail");
33     return;
34   }
35   
36   $.ajax({
37     url : mctx.api + 'sensors',
38     data : {id : id, sample_s : n}
39   }).done(function(data) {
40     if (!result.checkStatus(data)) {
41       return;
42     }
43     
44     result.text("Set ok!").removeClass("fail").addClass("pass");
45   });
46 };
47
48 $.fn.loadSensorList = function (result, input) {
49   var select = this;
50   select.empty(); //Reset list
51   
52   $.ajax({
53     url : mctx.api + 'identify',
54     data : {'sensors' : 1}
55   }).done(function(data) {
56     if (!result.checkStatus(data)) {
57       return;
58     }
59     for (var id in data.sensors) {
60       var option = $("<option/>", {value : id, text : data.sensors[id].name});
61       select.append(option);
62     }
63   });
64 }
65
66 $.fn.setStatusUpdater = function () {
67   var result = this;
68   
69   var updater = function () {
70     $.ajax({
71       url : mctx.control.api,
72       data : {'action' : 'identify'}
73     }).done(function (data) {
74       if (!result.checkStatus(data)) {
75         $(result).parent().addClass("fail");
76         setTimeout(updater, 4000);
77         return;
78       }
79
80       var text;
81       var running = false;
82       var fail = false;
83       switch (data.control_state_id) {
84         case mctx.control.states.start:
85           text = "Experiment started - '" + data.control_experiment_name +
86                  "' by " + data.control_user_name;
87           running = true;
88         break;
89         case mctx.control.states.pause:
90           text = "Experiment paused - '" + data.control_experiment_name +
91                  "' by " + data.control_user_name;
92           running = true;
93         break;
94         case mctx.control.states.stop:
95           text = "No experiment running.";
96         break;
97         case mctx.control.states.emergency:
98           text = "Emergency mode - '" + data.control_experiment_name +
99                  "' by " + data.control_user_name;
100           running = true;
101           fail = true;
102         default:
103           text = "Unknown mode: " + data.control_state_id;
104           fail = true;
105       }
106       
107       if (data.control_state_id !== mctx.control.state) {   
108         //Set logic for sensor sample rate thing
109         $("#sensor-select").loadSensorList($("#samplerate-result"));      
110         toggleControls(running);
111         $(result).text(text);
112         if (fail) {
113           $(result).parent().addClass("fail").removeClass("pass");
114         } else {
115           $(result).parent().addClass("pass").removeClass("fail");
116         }
117         
118         mctx.control.state = data.control_state_id;
119       }
120       
121       setTimeout(updater, 2000);
122     })
123    .fail(function () {
124      $(result).text("Connection failed.").parent().addClass("fail");
125      setTimeout(updater, 4000);
126    });
127   };
128   
129   updater();
130 };
131
132
133 $.fn.startExperiment = function (group, experiment, force, result) {
134  $(group).attr('disabled', 'disabled');
135  
136  var can_number = ($(this).attr("name") === "start_strain") ? 0 : 1;
137  
138  if (!experiment || !experiment.match(/^[a-zA-Z0-9_-]+$/)) {
139    result.text("Experiment names must be composed of alphanumeric characters" + 
140                " or the characters -_-").addClass("fail");
141    $(group).removeAttr('disabled');
142    return;
143  } 
144  
145  var data = {action : "start", name : experiment};
146  if (force) {
147    data.force = 1;
148  }
149  
150  //Start the experiment
151  $.ajax({
152    url : mctx.control.api,
153    data : data
154  }).done(function (data) {
155    if (!result.checkStatus(data)) {
156     $(group).removeAttr('disabled');
157     return;
158    }
159    
160    //Select the can
161    $.ajax({
162     url : mctx.api + "actuators",
163     data : {name : "can_select", set : can_number}
164    }).done(function (data) {
165     if (!result.checkStatus(data)) {
166      $(group).removeAttr('disabled');
167      return;
168     }
169     
170     //Enable the can
171     $.ajax({
172       url : mctx.api + 'actuators',
173       data : {name : "can_enable", set : 1}
174     }).done(function (data) {
175       if (!result.checkStatus(data)) {
176         $(group).removeAttr('disabled');
177         return;
178       }
179       result.html("&nbsp;");
180       toggleControls(true);
181     }).fail(function () {
182       $(group).removeAttr('disabled');
183     });
184    }).fail(function () {
185     $(group).removeAttr('disabled');
186    });
187  }).fail(function () {
188    $(group).removeAttr('disabled');
189  });
190 };
191
192 $.fn.stopExperiment = function (result) {
193   var stop = this;
194   stop.attr('disabled', 'disabled');
195   result.text("Stopping the experiment...");
196   
197   $.ajax({
198     url : mctx.control.api,
199     data : {action : "stop"}
200   }).done(function (data) {
201     if (!result.checkStatus(data)) {
202       return;
203     }
204     result.html("&nbsp;");
205     toggleControls(false);
206   }).always(function () {
207     stop.removeAttr('disabled');
208   });
209 };
210
211 $.fn.setPressure = function(pressure, result) {
212   result.html("&nbsp;");
213   
214   for (var k in pressure) {
215     var n = Number(pressure[k]);
216     if (isNaN(n) || n < 0) {
217       result.text("You must give positive numeric values.").addClass("fail");
218       return;
219     }
220     pressure[k] = n;
221   }
222   
223   var set = pressure['set'] + "_" + pressure['wait'] + "_" +
224             pressure['step'] + "_" + pressure['count'];
225   return $.ajax({
226     url : mctx.api + "actuators",
227     data : {name : "pregulator", set : set}
228   }).done(function (data) {
229     if (!result.checkStatus(data)) {
230       return;
231     }
232     
233     result.text("Set ok!").removeClass("fail").addClass("pass");
234   });
235 };

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