Skip to content

Commit 734267f

Browse files
committed
Transition server and handlers to use new Bottle implementation
Moving from SimpleHTTPServer to a Bottle + Waitress implementation of the Ardublockly Server. The request have been changed slightly to be more "RESTful" (but not really) and te actions module had to be updated accordingly. The front end JavaScript had to be updated as well to work with the new version.
1 parent 4e932b0 commit 734267f

File tree

10 files changed

+779
-703
lines changed

10 files changed

+779
-703
lines changed

ardublockly/ardublockly.js

Lines changed: 65 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,8 @@ Ardublockly.init = function() {
2626
Ardublockly.bindActionFunctions();
2727
Ardublockly.bindBlocklyEventListeners();
2828

29-
// Check if not running locally
30-
if (document.location.hostname != 'localhost') {
29+
// Hackish way to check if not running locally
30+
if (document.location.hostname != '127.0.0.1') {
3131
Ardublockly.openNotConnectedModal();
3232
}
3333
};
@@ -92,12 +92,16 @@ Ardublockly.bindActionFunctions = function() {
9292

9393
// Settings modal input field listeners
9494
Ardublockly.bindClick_('settings_compiler_location', function() {
95-
ArdublocklyServer.requestNewCompilerLocation(
96-
Ardublockly.setCompilerLocationHtml);
95+
ArdublocklyServer.requestNewCompilerLocation(function(jsonObj) {
96+
Ardublockly.setCompilerLocationHtml(
97+
ArdublocklyServer.jsonToHtmlTextInput(jsonObj));
98+
});
9799
});
98100
Ardublockly.bindClick_('settings_sketch_location', function() {
99-
ArdublocklyServer.requestNewSketchLocation(
100-
Ardublockly.setSketchLocationHtml);
101+
ArdublocklyServer.requestNewSketchLocation(function(jsonObj) {
102+
Ardublockly.setSketchLocationHtml(
103+
ArdublocklyServer.jsonToHtmlTextInput(jsonObj));
104+
});
101105
});
102106
};
103107

@@ -154,14 +158,9 @@ Ardublockly.initialiseIdeButtons = function() {
154158
Ardublockly.getLocalStr('verifySketch');
155159
document.getElementById('button_ide_large').title =
156160
Ardublockly.getLocalStr('uploadSketch');
157-
ArdublocklyServer.requestIdeOptions(function(jsonResponse) {
158-
if (jsonResponse != null) {
159-
var parsedJson = JSON.parse(jsonResponse);
160-
// "response_type" : "settings_board",
161-
// "element" : "dropdown",
162-
// "options" : [ {"value" : "XXX", "text" : "XXX"}, ...]
163-
// "selected": "selected key"}
164-
Ardublockly.changeIdeButtons(parsedJson.selected);
161+
ArdublocklyServer.requestIdeOptions(function(jsonObj) {
162+
if (jsonObj != null) {
163+
Ardublockly.changeIdeButtons(jsonObj.selected);
165164
} // else Null: Ardublockly server is not running, do nothing
166165
});
167166
};
@@ -325,12 +324,25 @@ Ardublockly.saveTextFileAs = function(fileName, content) {
325324
* and opens the Settings modal dialog.
326325
*/
327326
Ardublockly.openSettings = function() {
328-
ArdublocklyServer.requestCompilerLocation(
329-
Ardublockly.setCompilerLocationHtml);
330-
ArdublocklyServer.requestSketchLocation(Ardublockly.setSketchLocationHtml);
331-
ArdublocklyServer.requestArduinoBoards(Ardublockly.setArduinoBoardsHtml);
332-
ArdublocklyServer.requestSerialPorts(Ardublockly.setSerialPortsHtml);
333-
ArdublocklyServer.requestIdeOptions(Ardublockly.setIdeHtml);
327+
ArdublocklyServer.requestCompilerLocation(function(jsonObj) {
328+
Ardublockly.setCompilerLocationHtml(
329+
ArdublocklyServer.jsonToHtmlTextInput(jsonObj));
330+
});
331+
ArdublocklyServer.requestSketchLocation(function(jsonObj) {
332+
Ardublockly.setSketchLocationHtml(
333+
ArdublocklyServer.jsonToHtmlTextInput(jsonObj));
334+
});
335+
ArdublocklyServer.requestArduinoBoards(function(jsonObj) {
336+
Ardublockly.setArduinoBoardsHtml(
337+
ArdublocklyServer.jsonToHtmlDropdown(jsonObj));
338+
});
339+
ArdublocklyServer.requestSerialPorts(function(jsonObj) {
340+
Ardublockly.setSerialPortsHtml(
341+
ArdublocklyServer.jsonToHtmlDropdown(jsonObj));
342+
});
343+
ArdublocklyServer.requestIdeOptions(function(jsonObj) {
344+
Ardublockly.setIdeHtml(ArdublocklyServer.jsonToHtmlDropdown(jsonObj));
345+
});
334346
// Language menu only set on page load within Ardublockly.initLanguage()
335347
Ardublockly.openSettingsModal();
336348
};
@@ -340,11 +352,11 @@ Ardublockly.openSettings = function() {
340352
* @param {element} jsonResponse JSON data coming back from the server.
341353
* @return {undefined} Might exit early if response is null.
342354
*/
343-
Ardublockly.setCompilerLocationHtml = function(jsonResponse) {
344-
if (jsonResponse === null) return Ardublockly.openNotConnectedModal();
345-
var newEl = ArdublocklyServer.createElementFromJson(jsonResponse);
355+
Ardublockly.setCompilerLocationHtml = function(newEl) {
356+
if (newEl === null) return Ardublockly.openNotConnectedModal();
357+
346358
var compLocIp = document.getElementById('settings_compiler_location');
347-
if (compLocIp != null) {
359+
if (compLocIp != null && newEl.value) {
348360
compLocIp.value = newEl.value;
349361
}
350362
};
@@ -354,9 +366,9 @@ Ardublockly.setCompilerLocationHtml = function(jsonResponse) {
354366
* @param {element} jsonResponse JSON data coming back from the server.
355367
* @return {undefined} Might exit early if response is null.
356368
*/
357-
Ardublockly.setSketchLocationHtml = function(jsonResponse) {
358-
if (jsonResponse === null) return Ardublockly.openNotConnectedModal();
359-
var newEl = ArdublocklyServer.createElementFromJson(jsonResponse);
369+
Ardublockly.setSketchLocationHtml = function(newEl) {
370+
if (newEl === null) return Ardublockly.openNotConnectedModal();
371+
360372
var sketchLocIp = document.getElementById('settings_sketch_location');
361373
if (sketchLocIp != null) {
362374
sketchLocIp.value = newEl.value;
@@ -366,12 +378,12 @@ Ardublockly.setSketchLocationHtml = function(jsonResponse) {
366378
/**
367379
* Replaces the Arduino Boards form data with a new HTMl element.
368380
* Ensures there is a change listener to call 'setSerialPort' function
369-
* @param {element} jsonResponse JSON data coming back from the server.
381+
* @param {element} jsonObj JSON data coming back from the server.
370382
* @return {undefined} Might exit early if response is null.
371383
*/
372-
Ardublockly.setArduinoBoardsHtml = function(jsonResponse) {
373-
if (jsonResponse === null) return Ardublockly.openNotConnectedModal();
374-
var newEl = ArdublocklyServer.createElementFromJson(jsonResponse);
384+
Ardublockly.setArduinoBoardsHtml = function(newEl) {
385+
if (newEl === null) return Ardublockly.openNotConnectedModal();
386+
375387
var boardDropdown = document.getElementById('board');
376388
if (boardDropdown !== null) {
377389
// Restarting the select elements built by materialize
@@ -391,9 +403,10 @@ Ardublockly.setArduinoBoardsHtml = function(jsonResponse) {
391403
Ardublockly.setBoard = function() {
392404
var el = document.getElementById('board');
393405
var boardValue = el.options[el.selectedIndex].value;
394-
//TODO: Check how ArdublocklyServer deals with invalid data and sanitise
395-
ArdublocklyServer.setArduinoBoard(
396-
boardValue, Ardublockly.setArduinoBoardsHtml);
406+
ArdublocklyServer.setArduinoBoard(boardValue, function(jsonObj) {
407+
var newEl = ArdublocklyServer.jsonToHtmlDropdown(jsonObj);
408+
Ardublockly.setArduinoBoardsHtml(newEl);
409+
});
397410
Ardublockly.changeBlocklyArduinoBoard(
398411
boardValue.toLowerCase().replace(/ /g, '_'));
399412
};
@@ -404,9 +417,9 @@ Ardublockly.setBoard = function() {
404417
* @param {element} jsonResponse JSON data coming back from the server.
405418
* @return {undefined} Might exit early if response is null.
406419
*/
407-
Ardublockly.setSerialPortsHtml = function(jsonResponse) {
408-
if (jsonResponse === null) return Ardublockly.openNotConnectedModal();
409-
var newEl = ArdublocklyServer.createElementFromJson(jsonResponse);
420+
Ardublockly.setSerialPortsHtml = function(newEl) {
421+
if (newEl === null) return Ardublockly.openNotConnectedModal();
422+
410423
var serialDropdown = document.getElementById('serial_port');
411424
if (serialDropdown !== null) {
412425
// Restarting the select elements built by materialize
@@ -424,9 +437,10 @@ Ardublockly.setSerialPortsHtml = function(jsonResponse) {
424437
Ardublockly.setSerial = function() {
425438
var el = document.getElementById('serial_port');
426439
var serialValue = el.options[el.selectedIndex].value;
427-
//TODO: check how ArdublocklyServer deals with invalid data and sanitise
428-
ArdublocklyServer.setSerialPort(
429-
serialValue, Ardublockly.setSerialPortsHtml);
440+
ArdublocklyServer.setSerialPort(serialValue, function(jsonObj) {
441+
var newEl = ArdublocklyServer.jsonToHtmlDropdown(jsonObj);
442+
Ardublockly.setSerialPortsHtml(newEl);
443+
});
430444
};
431445

432446
/**
@@ -435,9 +449,9 @@ Ardublockly.setSerial = function() {
435449
* @param {element} jsonResponse JSON data coming back from the server.
436450
* @return {undefined} Might exit early if response is null.
437451
*/
438-
Ardublockly.setIdeHtml = function(jsonResponse) {
439-
if (jsonResponse === null) return Ardublockly.openNotConnectedModal();
440-
var newEl = ArdublocklyServer.createElementFromJson(jsonResponse);
452+
Ardublockly.setIdeHtml = function(newEl) {
453+
if (newEl === null) return Ardublockly.openNotConnectedModal();
454+
441455
var ideDropdown = document.getElementById('ide_settings');
442456
if (ideDropdown !== null) {
443457
// Restarting the select elements built by materialize
@@ -466,8 +480,9 @@ Ardublockly.setIdeSettings = function(e, preset) {
466480
var ideValue = el.options[el.selectedIndex].value;
467481
}
468482
Ardublockly.changeIdeButtons(ideValue);
469-
//TODO: check how ArdublocklyServer deals with invalid data and sanitise here
470-
ArdublocklyServer.setIdeOptions(ideValue, Ardublockly.setIdeHtml);
483+
ArdublocklyServer.setIdeOptions(ideValue, function(jsonObj) {
484+
Ardublockly.setIdeHtml(ArdublocklyServer.jsonToHtmlDropdown(jsonObj));
485+
});
471486
};
472487

473488
/**
@@ -483,10 +498,10 @@ Ardublockly.sendCode = function() {
483498
* @param {element} jsonResponse JSON data coming back from the server.
484499
* @return {undefined} Might exit early if response is null.
485500
*/
486-
var sendCodeReturn = function(jsonResponse) {
501+
var sendCodeReturn = function(jsonObj) {
487502
Ardublockly.largeIdeButtonSpinner(false);
488-
if (jsonResponse === null) return Ardublockly.openNotConnectedModal();
489-
var dataBack = ArdublocklyServer.createElementFromJson(jsonResponse);
503+
if (jsonObj === null) return Ardublockly.openNotConnectedModal();
504+
var dataBack = ArdublocklyServer.jsonToIdeModal(jsonObj);
490505
Ardublockly.arduinoIdeOutput(dataBack);
491506
};
492507

@@ -642,7 +657,7 @@ Ardublockly.importExtraBlocks = function() {
642657
};
643658
// Reads the JSON data containing all block categories from ./blocks directory
644659
// TODO: Now reading a local file, to be replaced by server generated JSON
645-
Ardublockly.getJsonData('../blocks/blocks_data.json', jsonDataCb);
660+
ArdublocklyServer.getJson('../blocks/blocks_data.json', jsonDataCb);
646661
};
647662

648663
/** Opens a modal with a list of categories to add or remove to the toolbox */
@@ -678,7 +693,7 @@ Ardublockly.openExtraCategoriesSelect = function() {
678693
};
679694
// Reads the JSON data containing all block categories from ./blocks directory
680695
// TODO: Now reading a local file, to be replaced by server generated JSON
681-
Ardublockly.getJsonData('../blocks/blocks_data.json', jsonDataCb);
696+
ArdublocklyServer.getJson('../blocks/blocks_data.json', jsonDataCb);
682697
};
683698

684699
/** Informs the user that the selected function is not yet implemented. */

ardublockly/ardublockly_lang.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,7 @@ Ardublockly.injectLanguageJsSources = function(langKey) {
124124

125125
// Retrieve and inject Ardublockly translations synchronously
126126
var appLangJsLoad = document.createElement('script');
127-
var request = ArdublocklyServer.createAjaxRequest();
127+
var request = ArdublocklyServer.createRequest();
128128
var appLangJdPath = 'msg/' + langKey + '.js';
129129
try {
130130
request.open('GET', appLangJdPath, false);

0 commit comments

Comments
 (0)