GUI -- TopoView - mockserver.js -- re-instated the "auto-advance" feature.
Change-Id: I867430cf42483fa7f2cacdd0b6fdd97d0eaa90a9
Showing
1 changed file
with
51 additions
and
14 deletions
... | @@ -18,6 +18,7 @@ var lastcmd, // last command executed | ... | @@ -18,6 +18,7 @@ var lastcmd, // last command executed |
18 | scdone, // shows when scenario is over | 18 | scdone, // shows when scenario is over |
19 | eventsById, // map of event file names | 19 | eventsById, // map of event file names |
20 | maxEvno, // highest loaded event number | 20 | maxEvno, // highest loaded event number |
21 | + autoLast, // last event number for auto-advance | ||
21 | evno, // next event number | 22 | evno, // next event number |
22 | evdata; // event data | 23 | evdata; // event data |
23 | 24 | ||
... | @@ -119,6 +120,7 @@ function doCli() { | ... | @@ -119,6 +120,7 @@ function doCli() { |
119 | case 'c': connStatus(); break; | 120 | case 'c': connStatus(); break; |
120 | case 'm': customMessage(str); break; | 121 | case 'm': customMessage(str); break; |
121 | case 's': setScenario(str); break; | 122 | case 's': setScenario(str); break; |
123 | + case 'a': autoAdvance(); break; | ||
122 | case 'n': nextEvent(); break; | 124 | case 'n': nextEvent(); break; |
123 | case 'r': restartScenario(); break; | 125 | case 'r': restartScenario(); break; |
124 | case 'q': quit(); break; | 126 | case 'q': quit(); break; |
... | @@ -140,7 +142,7 @@ var helptext = '\n' + | ... | @@ -140,7 +142,7 @@ var helptext = '\n' + |
140 | 'm {text} - send custom message to client\n' + | 142 | 'm {text} - send custom message to client\n' + |
141 | 's {id} - load scenario {id}\n' + | 143 | 's {id} - load scenario {id}\n' + |
142 | 's - show scenario status\n' + | 144 | 's - show scenario status\n' + |
143 | - //'a - auto-send events\n' + | 145 | + 'a - auto-send events\n' + |
144 | 'n - send next event\n' + | 146 | 'n - send next event\n' + |
145 | 'r - restart the scenario\n' + | 147 | 'r - restart the scenario\n' + |
146 | 'q - exit the server\n' + | 148 | 'q - exit the server\n' + |
... | @@ -202,6 +204,10 @@ function initScenario(verb) { | ... | @@ -202,6 +204,10 @@ function initScenario(verb) { |
202 | scdata.description.forEach(function (d) { | 204 | scdata.description.forEach(function (d) { |
203 | console.log(' ' + d); | 205 | console.log(' ' + d); |
204 | }); | 206 | }); |
207 | + autoLast = (scdata.params && scdata.params.lastAuto) || 0; | ||
208 | + if (autoLast) { | ||
209 | + console.log('[auto-advance: ' + autoLast + ']'); | ||
210 | + } | ||
205 | evno = 1; | 211 | evno = 1; |
206 | scdone = false; | 212 | scdone = false; |
207 | readEventFilenames(); | 213 | readEventFilenames(); |
... | @@ -263,26 +269,56 @@ function restartScenario() { | ... | @@ -263,26 +269,56 @@ function restartScenario() { |
263 | rl.prompt(); | 269 | rl.prompt(); |
264 | } | 270 | } |
265 | 271 | ||
266 | -function nextEvent() { | 272 | +function eventAvailable() { |
267 | - var path; | ||
268 | - | ||
269 | if (!scid) { | 273 | if (!scid) { |
270 | console.log('No scenario loaded.'); | 274 | console.log('No scenario loaded.'); |
271 | rl.prompt(); | 275 | rl.prompt(); |
272 | - } else if (!connection) { | 276 | + return false; |
273 | - console.warn('No current connection.'); | 277 | + } |
278 | + | ||
279 | + if (!connection) { | ||
280 | + console.log('No current connection.'); | ||
274 | rl.prompt(); | 281 | rl.prompt(); |
275 | - } else { | 282 | + return false; |
283 | + } | ||
284 | + | ||
276 | if (Number(evno) > Number(maxEvno)) { | 285 | if (Number(evno) > Number(maxEvno)) { |
277 | - // done | ||
278 | scdone = true; | 286 | scdone = true; |
279 | console.log('Scenario DONE.'); | 287 | console.log('Scenario DONE.'); |
280 | - } else { | 288 | + return false; |
281 | - // fire next event | 289 | + } |
282 | - path = scenarioPath(evno); | 290 | + return true; |
291 | +} | ||
292 | + | ||
293 | +function autoAdvance() { | ||
294 | + if (evno > autoLast) { | ||
295 | + console.log('[auto done]'); | ||
296 | + return; | ||
297 | + } | ||
298 | + | ||
299 | + // need to recurse with a callback, since each event send relies | ||
300 | + // on an async load of event data... | ||
301 | + function callback() { | ||
302 | + if (eventAvailable() && evno <= autoLast) { | ||
303 | + _nextEvent(callback); | ||
304 | + } | ||
305 | + } | ||
306 | + | ||
307 | + callback(); | ||
308 | +} | ||
309 | + | ||
310 | +function nextEvent() { | ||
311 | + if (eventAvailable()) { | ||
312 | + _nextEvent(); | ||
313 | + } | ||
314 | +} | ||
315 | + | ||
316 | +function _nextEvent(callback) { | ||
317 | + var path = scenarioPath(evno); | ||
318 | + | ||
283 | fs.readFile(path, 'utf8', function (err, data) { | 319 | fs.readFile(path, 'utf8', function (err, data) { |
284 | if (err) { | 320 | if (err) { |
285 | - console.log('Oops error: ' + err); | 321 | + console.error('Oops error: ' + err); |
286 | } else { | 322 | } else { |
287 | evdata = JSON.parse(data); | 323 | evdata = JSON.parse(data); |
288 | console.log(); // get past prompt | 324 | console.log(); // get past prompt |
... | @@ -290,9 +326,10 @@ function nextEvent() { | ... | @@ -290,9 +326,10 @@ function nextEvent() { |
290 | '] from ' + eventsById[evno].fname); | 326 | '] from ' + eventsById[evno].fname); |
291 | connection.sendUTF(data); | 327 | connection.sendUTF(data); |
292 | evno++; | 328 | evno++; |
329 | + if (callback) { | ||
330 | + callback(); | ||
331 | + } | ||
293 | } | 332 | } |
294 | rl.prompt(); | 333 | rl.prompt(); |
295 | }); | 334 | }); |
296 | - } | ||
297 | - } | ||
298 | } | 335 | } | ... | ... |
-
Please register or login to post a comment