1
0
Fork 0
mirror of https://github.com/sensebox/blockly-app synced 2025-02-23 16:23:59 +01:00
blockly-app/assets/blockly/ardublockly/sensebox_extensions.js
2019-03-29 17:53:55 +00:00

198 lines
7 KiB
JavaScript

'use strict';
/** Create a namespace for the application. */
var SenseboxExtension = SenseboxExtension || {};
SenseboxExtension.SUPPORTED_BOARDS = {
'sensebox': 'Arduino/Genuino UNO',
'sensebox-mcu': 'senseBox MCU'
};
/** Initialize function for senseBox extensions, to be called on page load. */
SenseboxExtension.init = function () {
sessionStorage.setItem('no_thanks', 'false');
var location = window.location;
const compilerOnline = 'https://compiler.sensebox.de';
//const compilerOnline = 'http://localhost:3000'
var urlParams = new URLSearchParams(location.search);
Ardublockly.changeBlocklyArduinoBoard('sensebox_mcu');
Ardublockly.loadServerXmlFile(Ardublockly.options.blocklyPath + '/ardublockly/start.xml');
if (urlParams.has('board')) {
window.BOARD = urlParams.get('board');
} else {
window.BOARD = 'sensebox';
}
if (location.hostname !== 'localhost') {
//TODO hide all features of running ardublockly locally
var buttons_offline = document.getElementById('buttons_offline');
var buttons_online = document.getElementById('buttons_online');
buttons_offline.classList.add('hidden');
buttons_online.classList.remove('hidden');
//Hide offline settings
var settings_online = document.getElementsByClassName('modal_section online');
for (let index = 0; index < settings_online.length; index++) {
const element = settings_online[index];
element.classList.add('hidden');
}
var settings_offline = document.getElementsByClassName('modal_section offline')[0];
settings_offline.classList.remove('hidden');
SenseboxExtension.populateBoards();
}
//TODO hide old and new blocks depending on selected senseBox version
switch (window.BOARD) {
case 'sensebox':
// ArdublocklyServer.setArduinoBoard('Uno', function(jsonObj) {
// var newEl = ArdublocklyServer.jsonToHtmlDropdown(jsonObj);
// Ardublockly.setArduinoBoardsHtml(newEl);
// });
window.EXTENSION = 'hex';
break;
case 'sensebox-mcu':
window.EXTENSION = 'bin';
break;
}
var clipboard = new ClipboardJS('.copy-btn');
clipboard.on('success', function (e) {
console.log(e);
Ardublockly.MaterialToast(Ardublockly.getLocalStr('code_copied'));
});
clipboard.on('error', function (e) {
console.log(e);
});
document.getElementById("button_copy_clipboard").setAttribute("data-tooltip", Ardublockly.getLocalStr('save_to_clipboard'));
document.getElementById("button_compile_sketch").setAttribute("data-tooltip", Ardublockly.getLocalStr('compile_sketch'));
var compile = document.getElementById('button_compile_sketch');
var compiling = false;
compile.addEventListener('click', function () {
if (!compiling) {
addClass(compile, "sb-disabled");
addClass(compile, "running");
compiling = true;
var sketch = Ardublockly.generateArduino();
var data = {
"board": window.BOARD,
"sketch": sketch
};
var request = ArdublocklyServer.createRequest();
// The data received is JSON, so it needs to be converted into the right
// format to be displayed in the page.
var onReady = function () {
compiling = false;
removeClass(compile, "sb-disabled");
removeClass(compile, "running");
if (request.readyState == 4) {
if (request.status == 200) {
var response = null;
try{
var download = function(){
response = JSON.parse(request.response);
var filename = document.getElementById('sketch_name').value;
window.open(compilerOnline + '/download?id=' + response.data.id + '&board=' + window.BOARD + '&filename=' + filename, '_self');
}
var no_thanks = sessionStorage.getItem('no_thanks');
// If no cookie with our chosen name (e.g. no_thanks)...
if (no_thanks == "false") {
window.setTimeout(Ardublockly.alertMessage(
Ardublockly.getLocalStr('sketch_compiled'),
Ardublockly.getLocalStr('copy_paste_mcu')),1000);
}
window.setTimeout(download, 1000);
$(".nothanks").click(function() {
sessionStorage.setItem('no_thanks', document.getElementById("checkbox").checked);
console.log(sessionStorage.getItem('no_thanks'));
});
}
/*response = JSON.parse(request.response);
window.open('https://compiler.sensebox.de/download?id='+response.data.id+'&board='+window.BOARD, '_self');
Ardublockly.MaterialToast(Ardublockly.getLocalStr('sketch_compiled'));*/
catch (e) {
throw e;
}
} else if (request.status == 500) {
response = JSON.parse(request.response);
var data = {
ide_data: {
std_output: '',
err_output: response.message
},
errors: [{
id: 1
}]
}
var dataBack = ArdublocklyServer.jsonToIdeModal(data);
Ardublockly.arduinoIdeOutput(dataBack);
var outputHeader = document.getElementById('ide_output_collapsible_header');
if (!outputHeader.className.match('active')) {
outputHeader.click();
}
} else {
Ardublockly.MaterialToast(Ardublockly.getLocalStr('arduinoOpErrorTitle'));
return null;
}
}
};
try {
Ardublockly.resetIdeOutputContent();
request.open('POST', compilerOnline + '/compile', true);
request.setRequestHeader('Content-Type', 'application/json');
request.onreadystatechange = onReady;
request.send(JSON.stringify(data));
} catch (e) {
console.log('Error: ', e);
throw e;
}
}
});
};
SenseboxExtension.changeBoard = function (event) {
window.BOARD = event.target.value;
}
SenseboxExtension.populateBoards = function () {
$('#boards-online').material_select('destroy');
var boardsMenu = document.getElementById('boards-online');
boardsMenu.options.length = 0;
for (var board in SenseboxExtension.SUPPORTED_BOARDS) {
var option = new Option(SenseboxExtension.SUPPORTED_BOARDS[board], board);
if (board == window.BOARD) {
option.selected = true;
}
boardsMenu.options.add(option);
}
boardsMenu.onchange = SenseboxExtension.changeBoard;
$('#boards-online').material_select();
}
function hasClass(el, className) {
if (el.classList)
return el.classList.contains(className);
return !!el.className.match(new RegExp('(\\s|^)' + className + '(\\s|$)'));
}
function addClass(el, className) {
if (el.classList)
el.classList.add(className)
else if (!hasClass(el, className))
el.className += " " + className;
}
function removeClass(el, className) {
if (el.classList)
el.classList.remove(className)
else if (hasClass(el, className)) {
var reg = new RegExp('(\\s|^)' + className + '(\\s|$)');
el.className = el.className.replace(reg, ' ');
}
}