diff options
Diffstat (limited to 'js')
-rw-r--r-- | js/codeq/robot.js | 75 |
1 files changed, 42 insertions, 33 deletions
diff --git a/js/codeq/robot.js b/js/codeq/robot.js index 51965d4..442cfb1 100644 --- a/js/codeq/robot.js +++ b/js/codeq/robot.js @@ -138,7 +138,6 @@ var //problem = info.problem, jqDescriptionContent = jqDescription.find('.description'), jqEditor = jqCode.find('.code_editor'), - jqTerminal = jqConsole.find('.console'), jqHints = jqInfo.find('.hints'), editor = codeq.makeEditor(jqEditor[0], { mode: 'python', @@ -146,11 +145,36 @@ value: currentSolution || '' }), activityHandler = codeq.makeActivityHandler(editor, problemDef.id), - terminal = makeRobotTerminalHandler(jqTerminal, editor, problemDef.id, activityHandler), hinter = codeq.makeHinter(jqHints, jqEditor, editor, 'robot_hints', problemDef, commonDef), commError = function (error) { alert(error); - }; + }, + reconnectTimer = null, + address = '192.168.1.174:8000', // TODO get this from settings + url = 'ws://' + address + '/', + socket = eio(url); + + // set up the websocket events + socket.on('close', function (data) { + console.log('websocket closed, trying to reopen in 1 s'); + reconnectTimer = setTimeout(function () { + reconnectTimer = null; + socket.open(); + }, 1000); + }); + socket.on('message', function(data) { + //console.log('Received: ' + data); + var json_obj = JSON.parse(data), + sensors, sensor, text = ''; + if (json_obj.event == 'update') { + sensors = json_obj.sensors; + for (sensor in sensors) { + if (!sensors.hasOwnProperty(sensor)) continue; + text += sensor + ': ' + sensors[sensor] + '<br />\n' + } + $('div.console').html('<p style="color: lightgreen; font-family: monospace;">'+text+'</p>'); + } + }); codeq.tr.registerDictionary('robot', problemDef.translations); codeq.tr.translateDom(jqScreen); @@ -189,7 +213,7 @@ hinter.handle(data.hints); } else { - terminal.append('error: ' + data.message); + commError('error: ' + data.message); } }) .fail(commError) @@ -199,35 +223,12 @@ var url = 'http://' + $('#robot_ip').val() + ':8000/run', doc = editor.getDoc(); - $.ajax(url, { - method: 'POST', - data: JSON.stringify({program: doc.getValue()}) - }).done(function (data) { - if (data.code === 0) { - terminal.append('<run>\n', 'output'); - } - else { - terminal.append('error: ' + data.message + '\n'); - } - }).fail(function (jqXHR, textStatus, err) { - commError('Could not access '+url); - }); + socket.send(JSON.stringify({action: 'run', program: doc.getValue()})); }); jqBtnStop.on('click', function () { var url = 'http://' + $('#robot_ip').val() + ':8000/stop'; - $.ajax(url, { - method: 'POST' - }).done(function (data) { - if (data.code === 0) { - terminal.append('<stop>\n', 'output'); - } - else { - terminal.append('error: ' + data.message + '\n'); - } - }).fail(function (jqXHR, textStatus, err) { - commError('Could not access '+url); - }); + socket.send(JSON.stringify({action: 'stop'})); }); codeq.comms.loadProblem(problemDef.id).done(); @@ -235,19 +236,27 @@ return { destroy: function () { codeq.comms.endProblem().done(); + + if (socket) { + socket.off('close'); + socket.off('message'); + socket.close(); + socket = null; + } + if (reconnectTimer !== null) { + clearTimeout(reconnectTimer); + reconnectTimer = null; + } + $('#screen_robot .title').text('');//empty the title text jqAllButtons.off(); editor.off('change'); - codeq.comms.off('terminal_output'); // stop listening for the terminal events from server activityHandler.flush(); hinter.destroy(); - terminal.destroy(); jqDescriptionContent.empty(); jqEditor.empty(); // TODO: perhaps you do not want to "free" the editor, just empty it - jqTerminal.empty(); // TODO: the same with the console jqDescriptionContent = null; jqEditor = null; - jqTerminal = null; jqHints = null; codeq.tr.registerDictionary('robot', codeq.tr.emptyDictionary); } |