1 | 'use strict';
|
---|
2 | if (!("Handler_Function_class" in this)){
|
---|
3 | var Handler_Function_class = {
|
---|
4 | Handler : function(name){
|
---|
5 | this.name = name;
|
---|
6 | this.handler_function_list = [];
|
---|
7 | },
|
---|
8 | Handler_Function: function(server_name){
|
---|
9 | this.name = server_name;
|
---|
10 | this.definition = {
|
---|
11 | final_states: new Set([]),
|
---|
12 | just_wait_states: new Set([]),
|
---|
13 | reset_wait_states: new Set([]),
|
---|
14 | action_states: {},
|
---|
15 | };
|
---|
16 | this.wait_state = undefined;
|
---|
17 | this.done = false;
|
---|
18 |
|
---|
19 | this.current_state = undefined;
|
---|
20 | this.last_state = undefined;
|
---|
21 | },
|
---|
22 | send_command_expect_state: function(command, expectation){
|
---|
23 | return function(){
|
---|
24 | console.out(this.name+'in '+this.current_state.name
|
---|
25 | +"..."+command+".");
|
---|
26 | dim.send(command);
|
---|
27 | this.wait_state = expectation;
|
---|
28 | }
|
---|
29 | },
|
---|
30 | throw_string_exception: function(message){
|
---|
31 | return function(){
|
---|
32 | throw message;
|
---|
33 | }
|
---|
34 | },
|
---|
35 | throw_error: function(){
|
---|
36 | throw new Error(this.name+':'
|
---|
37 | +state.name+"["+state.index+"] in error state.");
|
---|
38 | },
|
---|
39 | };
|
---|
40 | }
|
---|
41 | else{
|
---|
42 | console.out("multiple include of 'Handler_Function_class.js'");
|
---|
43 | }
|
---|
44 |
|
---|
45 |
|
---|
46 | /*
|
---|
47 | add a handler_function
|
---|
48 | to the internal handler_function_list.
|
---|
49 |
|
---|
50 | A handler_function tries every time it is invoked,
|
---|
51 | to get a certain subsystem into a certain *fixed* state.
|
---|
52 | When it succeeded, it return an empty string "".
|
---|
53 | if it not (yet) acomplished its goal it will return:
|
---|
54 | * The name of the state it waits for.
|
---|
55 | * undefined, when it does not know, what state to wait for.
|
---|
56 |
|
---|
57 | It is important to feed it back, the wait_state_name it returned
|
---|
58 | last time, so it knows, it should not do any action, while waiting
|
---|
59 | for a certain state.
|
---|
60 | */
|
---|
61 | Handler_Function_class.Handler.prototype.add = function(func)
|
---|
62 | {
|
---|
63 | this.handler_function_list.push(func);
|
---|
64 | }
|
---|
65 |
|
---|
66 | /* run each handler_function in the handler_function_list
|
---|
67 | until either all of them return the empty string ""
|
---|
68 | or the timeout occured.
|
---|
69 |
|
---|
70 | */
|
---|
71 | Handler_Function_class.Handler.prototype.run = function(timeout)
|
---|
72 | {
|
---|
73 | console.out(this.name+":start");
|
---|
74 |
|
---|
75 | var rc = [];
|
---|
76 |
|
---|
77 | var start_date = new Date();
|
---|
78 | while (!timeout || (new Date()-start_date)<timeout)
|
---|
79 | {
|
---|
80 | var done = true;
|
---|
81 | for (var i=0; i<this.handler_function_list.length; i++)
|
---|
82 | {
|
---|
83 | var current_handler_function = this.handler_function_list[i];
|
---|
84 | if (!current_handler_function.call())
|
---|
85 | done = false;
|
---|
86 | }
|
---|
87 |
|
---|
88 | if (done)
|
---|
89 | {
|
---|
90 | console.out(this.name+":success [time="+(new Date()-start_date)+"ms]");
|
---|
91 | return true;
|
---|
92 | }
|
---|
93 |
|
---|
94 | v8.sleep();
|
---|
95 | }
|
---|
96 |
|
---|
97 | console.out(this.name+":timeout ["+timeout+"ms]");
|
---|
98 | return false;
|
---|
99 | }
|
---|
100 |
|
---|
101 |
|
---|
102 | // ------------------------------------------------------------------------------
|
---|
103 |
|
---|
104 | Handler_Function_class.Handler_Function.prototype.call = function(){
|
---|
105 | this.last_state = state;
|
---|
106 | var state = dim.state(this.server_name);
|
---|
107 | this.current_state = state;
|
---|
108 |
|
---|
109 | if (state === undefined){
|
---|
110 | // if the current state is undefined, we cannot be done!
|
---|
111 | this.wait_state=undefined;
|
---|
112 | this.done = false;
|
---|
113 | return false;
|
---|
114 | }
|
---|
115 | else if(this.done){
|
---|
116 | return true;
|
---|
117 | }
|
---|
118 | else if (this.wait_state && state.name!=this.wait_state){
|
---|
119 | // if we *have* a state to actually wait for, we just wait
|
---|
120 | return false;
|
---|
121 | }else if(state.name in this.definition.final_states){
|
---|
122 | this.we_are_done();
|
---|
123 | }else if(state.name in this.definition.just_wait_states){
|
---|
124 | this.wait();
|
---|
125 | }else if(state.name in this.definition.reset_wait_states){
|
---|
126 | this.set_wait_state_undefined();
|
---|
127 | }else if(state.name in this.definition.action_states){
|
---|
128 | this.definition.action_states[state.name]();
|
---|
129 | }
|
---|
130 | else
|
---|
131 | throw new Error(this.name+":"+state.name+"["+state.index+"] unknown or not handled.");
|
---|
132 | }
|
---|
133 |
|
---|
134 | Handler_Function_class.Handler_Function.prototype.set_wait_state_undefined = function(){
|
---|
135 | console.log("set_wait_state_undefined: this:");
|
---|
136 | print_object(this);
|
---|
137 | this.wait_state = undefined;
|
---|
138 | }
|
---|
139 |
|
---|
140 | Handler_Function_class.Handler_Function.prototype.wait = function(){
|
---|
141 | console.log("wait: this:"+this);
|
---|
142 | // we do nothing here,
|
---|
143 | // esp. we do not alter the wait_state
|
---|
144 | }
|
---|
145 |
|
---|
146 | Handler_Function_class.Handler_Function.prototype.we_are_done = function(){
|
---|
147 | this.done = true;
|
---|
148 | }
|
---|
149 |
|
---|
150 | //--------- bias_voltage_off
|
---|
151 |
|
---|
152 | Handler_Function_class.bias_voltage_off = new Handler_Function_class.Handler_Function("BIAS_CONTROL");
|
---|
153 | Handler_Function_class.bias_voltage_off.definition = {
|
---|
154 | final_states: new Set(["VoltageOff"]),
|
---|
155 | just_wait_states: new Set(["Connecting", "Initializing", "Connected", "Ramping"]),
|
---|
156 | reset_wait_states: new Set([]),
|
---|
157 | action_states: {
|
---|
158 | "Locked": function(){
|
---|
159 | console.out("WARNING - Bias is LOCKED. Please report, "
|
---|
160 | +"this is serious, unlock manually and go on.");
|
---|
161 | this.done=true;
|
---|
162 | },
|
---|
163 | "Disconnected": Handler_Function_class.send_command_expect_state(
|
---|
164 | "BIAS_CONTROL/RECONNECT", "VoltageOff"),
|
---|
165 | "NotReferenced": Handler_Function_class.send_command_expect_state(
|
---|
166 | "BIAS_CONTROL/SET_ZERO_VOLTAGE", "VoltageOff"),
|
---|
167 | "VoltageOn": Handler_Function_class.send_command_expect_state(
|
---|
168 | "BIAS_CONTROL/SET_ZERO_VOLTAGE", "VoltageOff"),
|
---|
169 | "OverCurrent" : Handler_Function_class.throw_string_exception("BIAS_CONTROL in OverCurrent"),
|
---|
170 | "ExpertMode": Handler_Function_class.throw_string_exception("BIAS_CONTROL in expert mode"),
|
---|
171 | },
|
---|
172 | };
|
---|
173 | //--------- power_camera_on
|
---|
174 | Handler_Function_class.power_camera_on = new Handler_Function("PWR_CONTROL");
|
---|
175 | Handler_Function_class.set_camera_power_on = function (wait_for_state){
|
---|
176 | return function(){
|
---|
177 | this.wait_state=wait_for_state;
|
---|
178 | console.out(this.name+" in "+this.current_state.name
|
---|
179 | +"... sending CAMERA_POWER ON... waiting for "+this.wait_state+".");
|
---|
180 | };
|
---|
181 | };
|
---|
182 | Handler_Function_class.power_camera_on.definition ={
|
---|
183 | final_states: new Set(["DriveOff", "SystemOn"]),
|
---|
184 | just_wait_states: new Set(["CameraOn", "BiasOn", "CameraOff", "BiasOff"]),
|
---|
185 | reset_wait_states: new Set(["Disconnected", "Connected", "NoConnection"]),
|
---|
186 | action_states: {
|
---|
187 | "PowerOff" : Handler_Function_class.set_camera_power_on("DriveOff"),
|
---|
188 | "DriveOn": Handler_Function_class.set_camera_power_on("SystemOn"),
|
---|
189 | "CoolingFailure": function (){
|
---|
190 | throw new Error("Cooling unit reports failure... please check.");
|
---|
191 | },
|
---|
192 | },
|
---|
193 | };
|
---|
194 | //--------- make_ftm_idle
|
---|
195 | Handler_Function_class.make_ftm_idle = new Handler_Function_class.Handler_Function("FTM_CONTROL");
|
---|
196 | Handler_Function_class.make_ftm_idle.definitions = {
|
---|
197 | final_states = new Set(["Valid"]),
|
---|
198 | action_states = {
|
---|
199 | "Disconnected": Handler_Function_class.send_command_expect_state(
|
---|
200 | "FTM_CONTROL/RECONNECT", "Valid"),
|
---|
201 | "Idle": Handler_Function_class.send_command_expect_state(
|
---|
202 | "FTM_CONTROL/DISCONNECT", "Disconnected"),
|
---|
203 | "TriggerOn": Handler_Function_class.send_command_expect_state(
|
---|
204 | "FTM_CONTROL/STOP_TRIGGER", "Valid"),
|
---|
205 | "Configuring1": Handler_Function_class.send_command_expect_state(
|
---|
206 | "FTM_CONTROL/RESET_CONFIGURE", "Valid"),
|
---|
207 | "Configuring2": Handler_Function_class.send_command_expect_state(
|
---|
208 | "FTM_CONTROL/RESET_CONFIGURE", "Valid"),
|
---|
209 | "Configured1": Handler_Function_class.send_command_expect_state(
|
---|
210 | "FTM_CONTROL/RESET_CONFIGURE", "Valid"),
|
---|
211 | "Configured2": function(){
|
---|
212 | this.wait_state = "TriggerOn";
|
---|
213 | },
|
---|
214 | "ConfigError1": Handler_Function_class.throw_error,
|
---|
215 | "ConfigError2": Handler_Function_class.throw_error,
|
---|
216 | "ConfigError3": Handler_Function_class.throw_error,
|
---|
217 | }
|
---|
218 | };
|
---|
219 | //--------- connect_fsc
|
---|
220 | Handler_Function_class.connect_fsc = new Handler_Function_class.Handler_Function("FSC_CONTROL");
|
---|
221 | Handler_Function_class.connect_fsc.definition = {
|
---|
222 | final_states : new Set(["Connected"]),
|
---|
223 | action_states : {
|
---|
224 | "Disconnected" : Handler_Function_class.send_command_expect_state(
|
---|
225 | "FSC_CONTROL/RECONNECT", "Connected"),
|
---|
226 | },
|
---|
227 | };
|
---|
228 | //--------- connect_feedback
|
---|
229 | var send_stop_expect_calibrated = Handler_Function_class.send_command_expect_state("FEEDBACK/STOP", "Calibrated");
|
---|
230 |
|
---|
231 | Handler_Function_class.connect_feedback = new Handler_Function_class.Handler_Function("FEEDBACK");
|
---|
232 | Handler_Function_class.connect_feedback.definition = {
|
---|
233 | final_states: new Set(["Connected", "Calibrated"]),
|
---|
234 | reset_wait_states: new Set(["Disconnected", "Connecting"]),
|
---|
235 | action_states: {
|
---|
236 | "Calibrating" : Handler_Function_class.send_command_expect_state(
|
---|
237 | "FEEDBACK/STOP", "Connected"),
|
---|
238 | "WaitingForData": send_stop_expect_calibrated,
|
---|
239 | "OnStandby": send_stop_expect_calibrated,
|
---|
240 | "InProgress": send_stop_expect_calibrated,
|
---|
241 | "Warning": send_stop_expect_calibrated,
|
---|
242 | "Critical": send_stop_expect_calibrated,
|
---|
243 | },
|
---|
244 | };
|
---|
245 | //--------- connect_ratecontrol
|
---|
246 | var send_stop_wait_for_connected = send_command_expect_state("RATE_CONTROL/STOP", "Connected");
|
---|
247 |
|
---|
248 | Handler_Function_class.connect_ratecontrol = new Handler_Function_class.Handler_Function("RATE_CONTROL");
|
---|
249 | Handler_Function_class.connect_ratecontrol.definition = {
|
---|
250 | final_states: new Set(["Connected"]),
|
---|
251 | reset_wait_states: new Set(["DimNetworkNotAvailable", "Disconnected"]),
|
---|
252 | action_states: {
|
---|
253 | "Calibrating": send_stop_wait_for_connected,
|
---|
254 | "GlobalThresholdSet": send_stop_wait_for_connected,
|
---|
255 | "InProgress": send_stop_wait_for_connected,
|
---|
256 | }
|
---|
257 | };
|
---|
258 | //--------- close_lid
|
---|
259 | var send_close_wait_for_closed = Handler_Function_class.send_command_expect_state(
|
---|
260 | "LID_CONTROL/CLOSE", "Closed");
|
---|
261 |
|
---|
262 | Handler_Function_class.close_lid = new Handler_Function_class.Handler_Function("LID_CONTROL");
|
---|
263 | Handler_Function_class.close_lid.definition = {
|
---|
264 | final_states: new Set(["Closed"]),
|
---|
265 | just_wait_states: new Set(["NotReady", "Ready",
|
---|
266 | "NoConnection", "Connected", "Moving"]),
|
---|
267 | action_states: {
|
---|
268 | "Unknown": send_close_wait_for_closed,
|
---|
269 | "Inconsistent": send_close_wait_for_closed,
|
---|
270 | "PowerProblem": send_close_wait_for_closed,
|
---|
271 | "Open": send_close_wait_for_closed,
|
---|
272 | }
|
---|
273 | };
|
---|
274 | //--------- connect_fad
|
---|
275 | var send_reset_configure = Handler_Function_class.send_command_expect_state(
|
---|
276 | "FAD_CONTROL/RESET_CONFIGURE", "Connected");
|
---|
277 | var send_start = Handler_Function_class.send_command_expect_state(
|
---|
278 | "FAD_CONTROL/START", "Connected");
|
---|
279 | var send_close_files = Handler_Function_class.send_command_expect_state(
|
---|
280 | "FAD_CONTROL/CLOSE_OPEN_FILES", "Connected");
|
---|
281 |
|
---|
282 | var check_final_state = function(){
|
---|
283 | var sub_con = new Subscription("FAD_CONTROL/CONNECTIONS");
|
---|
284 | var con = sub_con.get(5000);
|
---|
285 | var all = true;
|
---|
286 | for (var i=0; i<40; i++)
|
---|
287 | if (con.obj['status'][i]&66!=66)
|
---|
288 | {
|
---|
289 | console.out("Board "+i+" not connected... sending CONNECT... waiting for 'Connected'.");
|
---|
290 | dim.send("FAD_CONTROL/CONNECT", i);
|
---|
291 | all = false;
|
---|
292 | }
|
---|
293 | sub_con.close();
|
---|
294 | if (all)
|
---|
295 | this.done = true;
|
---|
296 | else
|
---|
297 | this.wait_state = "Connected";
|
---|
298 | }
|
---|
299 |
|
---|
300 | Handler_Function_class.connect_fad = new Handler_Function_class.Handler_Function("FAD_CONTROL");
|
---|
301 | Handler_Function_class.connect_fad.definitions = {
|
---|
302 | reset_wait_states: new Set(["Offline"]),
|
---|
303 | just_wait_states: new Set(["Connecting"]),
|
---|
304 | action_states: {
|
---|
305 | "Disconnected": Handler_Function_class.send_command_expect_state(
|
---|
306 | "FAD_CONTROL/START", "Connected"),
|
---|
307 | "Configuring1": send_reset_configure,
|
---|
308 | "Configuring2": send_reset_configure,
|
---|
309 | "Configuring3": send_reset_configure,
|
---|
310 | "Configured": send_reset_configure,
|
---|
311 | "Disengaged": send_start,
|
---|
312 | "RunInProgress": send_close_files,
|
---|
313 | "Connected": check_final_state,
|
---|
314 | },
|
---|
315 | };
|
---|
316 | //--------- arm_drive
|
---|
317 | var send_stop = Handler_Function_class.send_command_expect_state("DRIVE_CONTROL", "Armed");
|
---|
318 |
|
---|
319 | Handler_Function_class.arm_drive = new Handler_Function_class.Handler_Function("DRIVE_CONTROL")
|
---|
320 | Handler_Function_class.arm_drive.definitions = {
|
---|
321 | final_states: new Set(["Armed"]),
|
---|
322 | reset_wait_states: new Set(["Disconnected", "Connected", "Ready"]),
|
---|
323 | action_states: {
|
---|
324 | "Moving" : send_stop,
|
---|
325 | "Tracking": send_stop,
|
---|
326 | "OnTrack": send_stop,
|
---|
327 | "NotReady": function(){
|
---|
328 | send_stop(),
|
---|
329 | dim.wait("DRIVE_CONTROL", "Armed", 60000);
|
---|
330 | this.wait_state = undefined;
|
---|
331 | },
|
---|
332 | "ERROR": function(){
|
---|
333 | send_stop(),
|
---|
334 | dim.wait("DRIVE_CONTROL", "Armed", 60000);
|
---|
335 | this.wait_state = undefined;
|
---|
336 | },
|
---|
337 | "Locked": function(){
|
---|
338 | console.out("WARNING - Drive is LOCKED. Please unlock manually.");
|
---|
339 | this.done = true;
|
---|
340 | },
|
---|
341 | },
|
---|
342 | };
|
---|