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

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