add multi interval feature

This commit is contained in:
Mario Pesch 2021-04-22 15:28:30 +02:00
parent b74aef8167
commit 5901caa278
11 changed files with 1180 additions and 1105 deletions

File diff suppressed because it is too large Load Diff

View File

@ -1,80 +1,103 @@
import * as Blockly from 'blockly/core'; import * as Blockly from "blockly/core";
import { getColour } from '../helpers/colour'; import { getColour } from "../helpers/colour";
var checkFileName = function (filename) {
var length = filename.length;
if (length > 8) {
alert("dateiname sollte kleiner als 8 Zeichen sein");
return filename.slice(0, 8);
}
return filename;
};
Blockly.Blocks['sensebox_sd_open_file'] = { Blockly.Blocks["sensebox_sd_open_file"] = {
init: function () { init: function () {
this.appendDummyInput() this.appendDummyInput()
.appendField(Blockly.Msg.senseBox_sd_open_file) .appendField(Blockly.Msg.senseBox_sd_open_file)
.setAlign(Blockly.ALIGN_LEFT) .setAlign(Blockly.ALIGN_LEFT)
.appendField( .appendField(
new Blockly.FieldTextInput('Data.txt'), new Blockly.FieldTextInput("Data", checkFileName),
'Filename'); "Filename"
this.appendStatementInput('SD') )
.setCheck(null); .appendField(".")
this.setPreviousStatement(true, null); .appendField(
this.setNextStatement(true, null); new Blockly.FieldDropdown([
this.setColour(getColour().sensebox); ["txt", "txt"],
this.setTooltip(Blockly.Msg.senseBox_sd_open_file_tooltip); ["csv", "csv"],
this.setHelpUrl('https://docs.sensebox.de/hardware/bee-sd/'); ]),
"extension"
);
this.appendStatementInput("SD").setCheck(null);
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setColour(getColour().sensebox);
this.setTooltip(Blockly.Msg.senseBox_sd_open_file_tooltip);
this.setHelpUrl("https://docs.sensebox.de/hardware/bee-sd/");
},
};
Blockly.Blocks["sensebox_sd_create_file"] = {
init: function () {
this.appendDummyInput()
.appendField(Blockly.Msg.senseBox_sd_create_file)
.setAlign(Blockly.ALIGN_LEFT)
.appendField(
new Blockly.FieldTextInput("Data", checkFileName),
"Filename"
)
.appendField(".")
.appendField(
new Blockly.FieldDropdown([
["txt", "txt"],
["csv", "csv"],
]),
"extension"
);
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setColour(getColour().sensebox);
this.setTooltip(Blockly.Msg.senseBox_sd_create_file_tooltip);
this.setHelpUrl("https://docs.sensebox.de/hardware/bee-sd/");
},
};
Blockly.Blocks["sensebox_sd_write_file"] = {
init: function () {
this.appendDummyInput()
.appendField(Blockly.Msg.senseBox_sd_write_file)
.setAlign(Blockly.ALIGN_LEFT);
this.appendValueInput("DATA").setCheck(null);
this.appendDummyInput("CheckboxText")
.appendField(Blockly.Msg.senseBox_output_linebreak)
.appendField(new Blockly.FieldCheckbox("TRUE"), "linebreak");
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setColour(getColour().sensebox);
this.setTooltip(Blockly.Msg.senseBox_sd_write_file_tooltip);
this.setHelpUrl("https://docs.sensebox.de/hardware/bee-sd/");
},
/**
* Called whenever anything on the workspace changes.
* Add warning if block is not nested inside a the correct loop.
* @param {!Blockly.Events.Abstract} e Change event.
* @this Blockly.Block
*/
onchange: function (e) {
var legal = false;
// Is the block nested in a loop?
var block = this;
do {
if (this.LOOP_TYPES.indexOf(block.type) !== -1) {
legal = true;
break;
}
block = block.getSurroundParent();
} while (block);
if (legal) {
this.setWarningText(null);
} else {
this.setWarningText(Blockly.Msg.CONTROLS_FLOW_STATEMENTS_WARNING);
} }
}; },
LOOP_TYPES: ["sensebox_sd_open_file"],
Blockly.Blocks['sensebox_sd_create_file'] = {
init: function () {
this.appendDummyInput()
.appendField(Blockly.Msg.senseBox_sd_create_file)
.setAlign(Blockly.ALIGN_LEFT)
.appendField(Blockly.Msg.senseBox_output_filename)
.appendField(
new Blockly.FieldTextInput('Data.txt'),
'Filename');
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setColour(getColour().sensebox);
this.setTooltip(Blockly.Msg.senseBox_sd_create_file_tooltip);
this.setHelpUrl('https://docs.sensebox.de/hardware/bee-sd/');
}
};
Blockly.Blocks['sensebox_sd_write_file'] = {
init: function () {
this.appendDummyInput()
.appendField(Blockly.Msg.senseBox_sd_write_file)
.setAlign(Blockly.ALIGN_LEFT);
this.appendValueInput('DATA')
.setCheck(null);
this.appendDummyInput('CheckboxText')
.appendField(Blockly.Msg.senseBox_output_linebreak)
.appendField(new Blockly.FieldCheckbox('TRUE'), 'linebreak');
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setColour(getColour().sensebox);
this.setTooltip(Blockly.Msg.senseBox_sd_write_file_tooltip);
this.setHelpUrl('https://docs.sensebox.de/hardware/bee-sd/');
},
/**
* Called whenever anything on the workspace changes.
* Add warning if block is not nested inside a the correct loop.
* @param {!Blockly.Events.Abstract} e Change event.
* @this Blockly.Block
*/
onchange: function (e) {
var legal = false;
// Is the block nested in a loop?
var block = this;
do {
if (this.LOOP_TYPES.indexOf(block.type) !== -1) {
legal = true;
break;
}
block = block.getSurroundParent();
} while (block);
if (legal) {
this.setWarningText(null);
} else {
this.setWarningText(Blockly.Msg.CONTROLS_FLOW_STATEMENTS_WARNING);
}
},
LOOP_TYPES: ['sensebox_sd_open_file'],
}; };

View File

@ -8,123 +8,118 @@
* The arduino built in functions syntax can be found in * The arduino built in functions syntax can be found in
* http://arduino.cc/en/Reference/HomePage * http://arduino.cc/en/Reference/HomePage
*/ */
import Blockly from 'blockly'; import Blockly from "blockly";
import { getColour } from '../helpers/colour' import { getColour } from "../helpers/colour";
import * as Types from '../helpers/types' import * as Types from "../helpers/types";
Blockly.Blocks["time_delay"] = {
Blockly.Blocks['time_delay'] = { /**
/** * Delay block definition
* Delay block definition * @this Blockly.Block
* @this Blockly.Block */
*/ init: function () {
init: function () { this.setHelpUrl("http://arduino.cc/en/Reference/Delay");
this.setHelpUrl('http://arduino.cc/en/Reference/Delay'); this.setColour(getColour().time);
this.setColour(getColour().time); this.appendValueInput("DELAY_TIME_MILI")
this.appendValueInput('DELAY_TIME_MILI') .setCheck(Types.NUMBER.checkList)
.setCheck(Types.NUMBER.checkList) .appendField(Blockly.Msg.ARD_TIME_DELAY);
.appendField(Blockly.Msg.ARD_TIME_DELAY); this.appendDummyInput().appendField(Blockly.Msg.ARD_TIME_MS);
this.appendDummyInput() this.setInputsInline(true);
.appendField(Blockly.Msg.ARD_TIME_MS); this.setPreviousStatement(true, null);
this.setInputsInline(true); this.setNextStatement(true, null);
this.setPreviousStatement(true, null); this.setTooltip(Blockly.Msg.ARD_TIME_DELAY_TIP);
this.setNextStatement(true, null); },
this.setTooltip(Blockly.Msg.ARD_TIME_DELAY_TIP);
}
}; };
Blockly.Blocks['time_delaymicros'] = { Blockly.Blocks["time_delaymicros"] = {
/** /**
* delayMicroseconds block definition * delayMicroseconds block definition
* @this Blockly.Block * @this Blockly.Block
*/ */
init: function () { init: function () {
this.setHelpUrl('http://arduino.cc/en/Reference/DelayMicroseconds'); this.setHelpUrl("http://arduino.cc/en/Reference/DelayMicroseconds");
this.setColour(getColour().time); this.setColour(getColour().time);
this.appendValueInput('DELAY_TIME_MICRO') this.appendValueInput("DELAY_TIME_MICRO")
.setCheck(Types.NUMBER.checkList) .setCheck(Types.NUMBER.checkList)
.appendField(Blockly.Msg.ARD_TIME_DELAY); .appendField(Blockly.Msg.ARD_TIME_DELAY);
this.appendDummyInput() this.appendDummyInput().appendField(Blockly.Msg.ARD_TIME_DELAY_MICROS);
.appendField(Blockly.Msg.ARD_TIME_DELAY_MICROS); this.setInputsInline(true);
this.setInputsInline(true); this.setPreviousStatement(true, null);
this.setPreviousStatement(true, null); this.setNextStatement(true, null);
this.setNextStatement(true, null); this.setTooltip(Blockly.Msg.ARD_TIME_DELAY_MICRO_TIP);
this.setTooltip(Blockly.Msg.ARD_TIME_DELAY_MICRO_TIP); },
}
}; };
Blockly.Blocks['time_millis'] = { Blockly.Blocks["time_millis"] = {
/** /**
* Elapsed time in milliseconds block definition * Elapsed time in milliseconds block definition
* @this Blockly.Block * @this Blockly.Block
*/ */
init: function () { init: function () {
this.setHelpUrl('http://arduino.cc/en/Reference/Millis'); this.setHelpUrl("http://arduino.cc/en/Reference/Millis");
this.setColour(getColour().time); this.setColour(getColour().time);
this.appendDummyInput() this.appendDummyInput().appendField(Blockly.Msg.ARD_TIME_MILLIS);
.appendField(Blockly.Msg.ARD_TIME_MILLIS); this.setOutput(true, Types.LARGE_NUMBER.typeId);
this.setOutput(true, Types.LARGE_NUMBER.typeId); this.setTooltip(Blockly.Msg.ARD_TIME_MILLIS_TIP);
this.setTooltip(Blockly.Msg.ARD_TIME_MILLIS_TIP); },
}, /** @return {string} The type of return value for the block, an integer. */
/** @return {string} The type of return value for the block, an integer. */ getBlockType: function () {
getBlockType: function () { return Blockly.Types.LARGE_NUMBER;
return Blockly.Types.LARGE_NUMBER; },
}
}; };
Blockly.Blocks['time_micros'] = { Blockly.Blocks["time_micros"] = {
/** /**
* Elapsed time in microseconds block definition * Elapsed time in microseconds block definition
* @this Blockly.Block * @this Blockly.Block
*/ */
init: function () { init: function () {
this.setHelpUrl('http://arduino.cc/en/Reference/Micros'); this.setHelpUrl("http://arduino.cc/en/Reference/Micros");
this.setColour(getColour().time); this.setColour(getColour().time);
this.appendDummyInput() this.appendDummyInput().appendField(Blockly.Msg.ARD_TIME_MICROS);
.appendField(Blockly.Msg.ARD_TIME_MICROS); this.setOutput(true, Types.LARGE_NUMBER.typeId);
this.setOutput(true, Types.LARGE_NUMBER.typeId); this.setTooltip(Blockly.Msg.ARD_TIME_MICROS_TIP);
this.setTooltip(Blockly.Msg.ARD_TIME_MICROS_TIP); },
}, /**
/** * Should be a long (32bit), but for for now an int.
* Should be a long (32bit), but for for now an int. * @return {string} The type of return value for the block, an integer.
* @return {string} The type of return value for the block, an integer. */
*/ getBlockType: function () {
getBlockType: function () { return Types.LARGE_NUMBER;
return Types.LARGE_NUMBER; },
}
}; };
Blockly.Blocks['infinite_loop'] = { Blockly.Blocks["infinite_loop"] = {
/** /**
* Waits forever, end of program. * Waits forever, end of program.
* @this Blockly.Block * @this Blockly.Block
*/ */
init: function () { init: function () {
this.setHelpUrl(''); this.setHelpUrl("");
this.setColour(getColour().time); this.setColour(getColour().time);
this.appendDummyInput() this.appendDummyInput().appendField(Blockly.Msg.ARD_TIME_INF);
.appendField(Blockly.Msg.ARD_TIME_INF); this.setInputsInline(true);
this.setInputsInline(true); this.setPreviousStatement(true);
this.setPreviousStatement(true); this.setTooltip(Blockly.Msg.ARD_TIME_INF_TIP);
this.setTooltip(Blockly.Msg.ARD_TIME_INF_TIP); },
}
}; };
Blockly.Blocks['sensebox_interval_timer'] = { Blockly.Blocks["sensebox_interval_timer"] = {
init: function () { init: function () {
this.setTooltip(Blockly.Msg.senseBox_interval_timer_tip); this.setTooltip(Blockly.Msg.senseBox_interval_timer_tip);
this.setInputsInline(true); this.setInputsInline(true);
this.setHelpUrl(''); this.setHelpUrl("");
this.setColour(getColour().time); this.setColour(getColour().time);
this.appendDummyInput() this.appendDummyInput()
.appendField(Blockly.Msg.senseBox_interval_timer); .appendField(Blockly.Msg.senseBox_interval_timer)
this.appendDummyInput() .appendField(new Blockly.FieldTextInput("name"), "name");
.setAlign(Blockly.ALIGN_LEFT) this.appendDummyInput()
.appendField(new Blockly.FieldTextInput("10000"), "interval") .appendField(Blockly.Msg.senseBox_interval_time)
.appendField(Blockly.Msg.senseBox_interval); .setAlign(Blockly.ALIGN_LEFT)
this.appendStatementInput('DO') .appendField(new Blockly.FieldTextInput("10000"), "interval")
.setCheck(null); .appendField(Blockly.Msg.senseBox_interval);
this.setPreviousStatement(true, null); this.appendStatementInput("DO").setCheck(null);
this.setNextStatement(true, null); this.setPreviousStatement(true, null);
} this.setNextStatement(true, null);
},
}; };

View File

@ -1,43 +1,43 @@
import Blockly from 'blockly/core'; import Blockly from "blockly/core";
import { getColour } from '../helpers/colour'; import { getColour } from "../helpers/colour";
import { getCompatibleTypes } from '../helpers/types' import { getCompatibleTypes } from "../helpers/types";
Blockly.Blocks["variables_set_dynamic"] = {
init: function () {
// const type = myVar.type;
this.setColour(getColour().variables);
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.appendValueInput("VALUE")
.appendField("set", "set")
.appendField("", "type")
.appendField(new Blockly.FieldVariable("VAR"), "VAR")
.appendField("to");
},
onchange: function (e) {
let variableID = this.getFieldValue("VAR");
let variable = Blockly.getMainWorkspace()
.getVariableMap()
.getVariableById(variableID);
this.getField("type").setValue(variable.type);
this.getInput("VALUE").setCheck(getCompatibleTypes(variable.type));
},
};
Blockly.Blocks['variables_set_dynamic'] = { Blockly.Blocks["variables_get_dynamic"] = {
init: function () { init: function () {
this.setColour(getColour().variables);
// const type = myVar.type; this.appendDummyInput()
this.setColour(getColour().variables); .appendField("", "type")
this.setPreviousStatement(true, null); .appendField(new Blockly.FieldVariable("VAR"), "VAR");
this.setNextStatement(true, null); this.setOutput(true);
this.appendValueInput('VALUE') },
.appendField('set', 'set') onchange: function (e) {
.appendField('', 'type') let variableID = this.getFieldValue("VAR");
.appendField(new Blockly.FieldVariable('VAR'), 'VAR') let variable = Blockly.getMainWorkspace()
.appendField('to'); .getVariableMap()
}, .getVariableById(variableID);
onchange: function (e) { this.getField("type").setValue(variable.type);
let variableID = this.getFieldValue('VAR'); this.setOutput(true, variable.type);
let variable = Blockly.getMainWorkspace().getVariableMap().getVariableById(variableID) },
this.getField('type').setValue(variable.type); };
this.getInput('VALUE').setCheck(getCompatibleTypes(variable.type));
}
}
Blockly.Blocks['variables_get_dynamic'] = {
init: function () {
this.setColour(getColour().variables);
this.appendDummyInput()
.appendField('', 'type')
.appendField(new Blockly.FieldVariable('VAR'), 'VAR');
this.setOutput(true);
},
onchange: function (e) {
let variableID = this.getFieldValue('VAR');
let variable = Blockly.getMainWorkspace().getVariableMap().getVariableById(variableID)
this.getField('type').setValue(variable.type);
}
}

View File

@ -1,5 +1,4 @@
import Blockly from 'blockly'; import Blockly from "blockly";
/* SD-Card Blocks using the Standard SD Library*/ /* SD-Card Blocks using the Standard SD Library*/
/** /**
@ -10,45 +9,49 @@ import Blockly from 'blockly';
*/ */
Blockly.Arduino.sensebox_sd_create_file = function (block) { Blockly.Arduino.sensebox_sd_create_file = function (block) {
var filename = this.getFieldValue('Filename'); var filename = this.getFieldValue("Filename");
var res = filename.slice(0, 4); var extension = this.getFieldValue("extension");
Blockly.Arduino.libraries_['library_spi'] = '#include <SPI.h>'; var newFileName = filename.concat(".", extension);
Blockly.Arduino.libraries_['library_sd'] = '#include <SD.h>'; Blockly.Arduino.libraries_["library_spi"] = "#include <SPI.h>";
Blockly.Arduino.definitions_['define_' + res] = 'File dataFile' + res + ';'; Blockly.Arduino.libraries_["library_sd"] = "#include <SD.h>";
Blockly.Arduino.setupCode_['sensebox_sd'] = 'SD.begin(28);'; Blockly.Arduino.definitions_["define_" + filename] = `File ${filename};`;
Blockly.Arduino.setupCode_['sensebox_sd' + filename] = 'dataFile' + res + ' = SD.open("' + filename + '", FILE_WRITE);\ndataFile' + res + '.close();\n'; Blockly.Arduino.setupCode_["sensebox_sd"] = "SD.begin(28);\n";
var code = ''; Blockly.Arduino.setupCode_[
return code; "sensebox_sd" + filename
] = `${filename} = SD.open("${newFileName}", FILE_WRITE);\n${filename}.close();\n`;
var code = "";
return code;
}; };
Blockly.Arduino.sensebox_sd_open_file = function (block) { Blockly.Arduino.sensebox_sd_open_file = function (block) {
var filename = this.getFieldValue('Filename'); var filename = this.getFieldValue("Filename");
var res = filename.slice(0, 4); var extension = this.getFieldValue("extension");
var branch = Blockly.Arduino.statementToCode(block, 'SD'); var newFileName = filename.concat(".", extension);
var code = 'dataFile' + res + ' = SD.open("' + filename + '", FILE_WRITE);\n' var branch = Blockly.Arduino.statementToCode(block, "SD");
code += branch; var code = `${filename} = SD.open("${newFileName}", FILE_WRITE);\n`;
code += 'dataFile' + res + '.close();\n' code += branch;
return code; code += `${filename}.close();\n`;
return code;
}; };
Blockly.Arduino.sensebox_sd_write_file = function (block) { Blockly.Arduino.sensebox_sd_write_file = function (block) {
if (this.parentBlock_ != null) { if (this.parentBlock_ != null) {
var filename = this.getSurroundParent().getFieldValue('Filename'); var filename = this.getSurroundParent().getFieldValue("Filename");
} }
var res = filename.slice(0, 4); var branch =
var text = Blockly.Arduino.valueToCode(this, 'DATA', Blockly.Arduino.ORDER_ATOMIC) || '"Keine Eingabe"'; Blockly.Arduino.valueToCode(this, "DATA", Blockly.Arduino.ORDER_ATOMIC) ||
var linebreak = this.getFieldValue('linebreak'); '"Keine Eingabe"';
if (linebreak === "TRUE") { var linebreak = this.getFieldValue("linebreak");
linebreak = "ln"; if (linebreak === "TRUE") {
} else { linebreak = "ln";
linebreak = ""; } else {
} linebreak = "";
var code = ''; }
if (text === "gps.getLongitude()" || text === "gps.getLatitude()") { var code = "";
code = 'dataFile' + res + '.print' + linebreak + '(' + text + ',5);\n' if (branch === "gps.getLongitude()" || branch === "gps.getLatitude()") {
} code = `${filename}.print${linebreak}(${branch},5);\n`;
else { } else {
code = 'dataFile' + res + '.print' + linebreak + '(' + text + ');\n' code = `${filename}.print${linebreak}(${branch});\n`;
} }
return code; return code;
}; };

View File

@ -1,4 +1,4 @@
import Blockly from 'blockly'; import Blockly from "blockly";
/** /**
* @license Licensed under the Apache License, Version 2.0 (the "License"): * @license Licensed under the Apache License, Version 2.0 (the "License"):
@ -16,11 +16,15 @@ import Blockly from 'blockly';
* @param {!Blockly.Block} block Block to generate the code from. * @param {!Blockly.Block} block Block to generate the code from.
* @return {string} Completed code. * @return {string} Completed code.
*/ */
Blockly.Arduino['time_delay'] = function (block) { Blockly.Arduino["time_delay"] = function (block) {
var delayTime = Blockly.Arduino.valueToCode( var delayTime =
block, 'DELAY_TIME_MILI', Blockly.Arduino.ORDER_ATOMIC) || '0'; Blockly.Arduino.valueToCode(
var code = 'delay(' + delayTime + ');\n'; block,
return code; "DELAY_TIME_MILI",
Blockly.Arduino.ORDER_ATOMIC
) || "0";
var code = "delay(" + delayTime + ");\n";
return code;
}; };
/** /**
@ -29,11 +33,15 @@ Blockly.Arduino['time_delay'] = function (block) {
* @param {!Blockly.Block} block Block to generate the code from. * @param {!Blockly.Block} block Block to generate the code from.
* @return {string} Completed code. * @return {string} Completed code.
*/ */
Blockly.Arduino['time_delaymicros'] = function (block) { Blockly.Arduino["time_delaymicros"] = function (block) {
var delayTimeMs = Blockly.Arduino.valueToCode( var delayTimeMs =
block, 'DELAY_TIME_MICRO', Blockly.Arduino.ORDER_ATOMIC) || '0'; Blockly.Arduino.valueToCode(
var code = 'delayMicroseconds(' + delayTimeMs + ');\n'; block,
return code; "DELAY_TIME_MICRO",
Blockly.Arduino.ORDER_ATOMIC
) || "0";
var code = "delayMicroseconds(" + delayTimeMs + ");\n";
return code;
}; };
/** /**
@ -42,9 +50,9 @@ Blockly.Arduino['time_delaymicros'] = function (block) {
* @param {!Blockly.Block} block Block to generate the code from. * @param {!Blockly.Block} block Block to generate the code from.
* @return {array} Completed code with order of operation. * @return {array} Completed code with order of operation.
*/ */
Blockly.Arduino['time_millis'] = function (block) { Blockly.Arduino["time_millis"] = function (block) {
var code = 'millis()'; var code = "millis()";
return [code, Blockly.Arduino.ORDER_ATOMIC]; return [code, Blockly.Arduino.ORDER_ATOMIC];
}; };
/** /**
@ -53,9 +61,9 @@ Blockly.Arduino['time_millis'] = function (block) {
* @param {!Blockly.Block} block Block to generate the code from. * @param {!Blockly.Block} block Block to generate the code from.
* @return {array} Completed code with order of operation. * @return {array} Completed code with order of operation.
*/ */
Blockly.Arduino['time_micros'] = function (block) { Blockly.Arduino["time_micros"] = function (block) {
var code = 'micros()'; var code = "micros()";
return [code, Blockly.Arduino.ORDER_ATOMIC]; return [code, Blockly.Arduino.ORDER_ATOMIC];
}; };
/** /**
@ -64,17 +72,22 @@ Blockly.Arduino['time_micros'] = function (block) {
* @param {!Blockly.Block} block Block to generate the code from. * @param {!Blockly.Block} block Block to generate the code from.
* @return {string} Completed code. * @return {string} Completed code.
*/ */
Blockly.Arduino['infinite_loop'] = function (block) { Blockly.Arduino["infinite_loop"] = function (block) {
return 'while(true);\n'; return "while(true);\n";
}; };
Blockly.Arduino.sensebox_interval_timer = function (block) { Blockly.Arduino.sensebox_interval_timer = function (block) {
var interval = this.getFieldValue('interval'); var intervalTime = this.getFieldValue("interval");
Blockly.Arduino.variables_['define_interval_variables'] = 'const long interval = ' + interval + ';\nlong time_start = 0;\nlong time_actual = 0;'; var intervalName = this.getFieldValue("name");
var branch = Blockly.Arduino.statementToCode(block, 'DO'); Blockly.Arduino.variables_[`define_interval_variables${intervalName}`] = `
var code = 'time_start = millis();\n'; const long interval${intervalName} = ${intervalTime};
code += 'if (time_start > time_actual + interval) {\n time_actual = millis();\n' long time_start${intervalName} = 0;
code += branch; long time_actual${intervalName} = 0;`;
code += '}\n' var branch = Blockly.Arduino.statementToCode(block, "DO");
return code; var code = `time_start${intervalName} = millis();\n`;
}; code += `
if (time_start${intervalName} > time_actual${intervalName} + interval${intervalName}) {\n time_actual${intervalName} = millis();\n`;
code += branch;
code += "}\n";
return code;
};

View File

@ -1,114 +1,127 @@
import Blockly from 'blockly'; import Blockly from "blockly";
/** /**
* Webserver Blocks by Lucas Steinmann * Webserver Blocks by Lucas Steinmann
* *
*/ */
Blockly.Arduino.sensebox_initialize_http_server = function (block) { Blockly.Arduino.sensebox_initialize_http_server = function (block) {
var box_id = this.getFieldValue('Port'); var box_id = this.getFieldValue("Port");
Blockly.Arduino.libraries_['library_senseBoxMCU'] = '#include "SenseBoxMCU.h"'; Blockly.Arduino.libraries_["library_senseBoxMCU"] =
Blockly.Arduino.codeFunctions_['define_wifi_server'] = 'WiFiServer server(' + box_id + ');'; '#include "SenseBoxMCU.h"';
Blockly.Arduino.setupCode_['sensebox_wifi_server_beging'] = 'server.begin();'; Blockly.Arduino.codeFunctions_["define_wifi_server"] =
return ''; "WiFiServer server(" + box_id + ");";
Blockly.Arduino.setupCode_["sensebox_wifi_server_beging"] = "server.begin();";
return "";
}; };
Blockly.Arduino.sensebox_http_on_client_connect = function (block) { Blockly.Arduino.sensebox_http_on_client_connect = function (block) {
var onConnect = Blockly.Arduino.statementToCode(block, 'ON_CONNECT'); var onConnect = Blockly.Arduino.statementToCode(block, "ON_CONNECT");
var code = ''; var code = "";
code += 'WiFiClient client = server.available();\n'; code += "WiFiClient client = server.available();\n";
code += 'if (client && client.available()) {\n'; code += "if (client && client.available()) {\n";
code += ' String request_string = listenClient(client);\n'; code += " String request_string = listenClient(client);\n";
code += ' Request request;\n'; code += " Request request;\n";
code += ' if (parseRequestSafe(request_string, request)) {\n'; code += " if (parseRequestSafe(request_string, request)) {\n";
code += onConnect; code += onConnect;
code += ' }\n'; code += " }\n";
code += ' delay(1);\n'; code += " delay(1);\n";
code += ' client.stop();\n'; code += " client.stop();\n";
code += ' delay(1);\n'; code += " delay(1);\n";
code += '}\n'; code += "}\n";
return code; return code;
}; };
Blockly.Arduino.sensebox_http_method = function (block) { Blockly.Arduino.sensebox_http_method = function (block) {
var code = "request.method"; var code = "request.method";
return [code, Blockly.Arduino.ORDER_ATOMIC]; return [code, Blockly.Arduino.ORDER_ATOMIC];
}; };
Blockly.Arduino.sensebox_http_uri = function (block) { Blockly.Arduino.sensebox_http_uri = function (block) {
var code = "request.uri"; var code = "request.uri";
return [code, Blockly.Arduino.ORDER_ATOMIC]; return [code, Blockly.Arduino.ORDER_ATOMIC];
}; };
Blockly.Arduino.sensebox_http_protocol_version = function (block) { Blockly.Arduino.sensebox_http_protocol_version = function (block) {
var code = "request.protocol_version"; var code = "request.protocol_version";
return [code, Blockly.Arduino.ORDER_ATOMIC]; return [code, Blockly.Arduino.ORDER_ATOMIC];
}; };
Blockly.Arduino.sensebox_http_user_agent = function (block) { Blockly.Arduino.sensebox_http_user_agent = function (block) {
var code = "request.user_agent"; var code = "request.user_agent";
return [code, Blockly.Arduino.ORDER_ATOMIC]; return [code, Blockly.Arduino.ORDER_ATOMIC];
}; };
Blockly.Arduino.sensebox_generate_html_doc = function (block) { Blockly.Arduino.sensebox_generate_html_doc = function (block) {
var header = Blockly.Arduino.valueToCode(block, 'HEADER', Blockly.Arduino.ORDER_NONE) || '""'; var header =
var body = Blockly.Arduino.valueToCode(block, 'BODY', Blockly.Arduino.ORDER_NONE) || '""'; Blockly.Arduino.valueToCode(block, "HEADER", Blockly.Arduino.ORDER_NONE) ||
var code = 'buildHTML(' + header + ', ' + body + ')'; '""';
return [code, Blockly.Arduino.ORDER_ATOMIC]; var body =
Blockly.Arduino.valueToCode(block, "BODY", Blockly.Arduino.ORDER_NONE) ||
'""';
var code = "buildHTML(" + header + ", " + body + ")";
return [code, Blockly.Arduino.ORDER_ATOMIC];
}; };
Blockly.Arduino.sensebox_generate_http_succesful_response = function (block) { Blockly.Arduino.sensebox_generate_http_succesful_response = function (block) {
var content = Blockly.Arduino.valueToCode(block, 'CONTENT', Blockly.Arduino.ORDER_NONE) || '""'; var content =
var code = 'client.println(buildSuccessfulResponse(request, ' + content + '));\n'; Blockly.Arduino.valueToCode(block, "CONTENT", Blockly.Arduino.ORDER_NONE) ||
return code; '""';
var code =
"client.println(buildSuccessfulResponse(request, " + content + "));\n";
return code;
}; };
Blockly.Arduino.sensebox_generate_http_not_found_response = function (block) { Blockly.Arduino.sensebox_generate_http_not_found_response = function (block) {
var code = 'client.println(buildNotFoundResponse(request));\n'; var code = "client.println(buildNotFoundResponse(request));\n";
return code; return code;
}; };
Blockly.Arduino.sensebox_ip_address = function (block) { Blockly.Arduino.sensebox_ip_address = function (block) {
var code = "b->getIpAddress()"; var code = "b->getIpAddress()";
return [code, Blockly.Arduino.ORDER_ATOMIC]; return [code, Blockly.Arduino.ORDER_ATOMIC];
}; };
Blockly.Arduino.sensebox_general_html_tag = function (block) { Blockly.Arduino.sensebox_general_html_tag = function (block) {
var tag = this.getFieldValue('TAG'); var tag = this.getFieldValue("TAG");
var code = 'buildTag("' + tag + '",'; var code = 'buildTag("' + tag + '",';
var n = 0; var n = 0;
var branch = Blockly.Arduino.valueToCode(block, 'DO' + n, Blockly.Arduino.ORDER_NONE); var branch = Blockly.Arduino.valueToCode(
if (branch.length > 0) { block,
code += '\n ' + branch; "DO" + n,
} else { Blockly.Arduino.ORDER_NONE
code += '""'; );
} if (branch.length > 0) {
for (n = 1; n <= block.additionalChildCount_; n++) { code += "\n " + branch;
branch = Blockly.Arduino.valueToCode(block, 'DO' + n, Blockly.Arduino.ORDER_NONE); } else {
code += ' +' + branch; code += '""';
} }
return [code + ')', Blockly.Arduino.ORDER_ATOMIC]; for (n = 1; n <= block.additionalChildCount_; n++) {
branch = Blockly.Arduino.valueToCode(
block,
"DO" + n,
Blockly.Arduino.ORDER_NONE
);
code += " +" + branch;
}
return [code + ")", Blockly.Arduino.ORDER_ATOMIC];
}; };
Blockly.Arduino.sensebox_web_readHTML = function (block) { Blockly.Arduino.sensebox_web_readHTML = function (block) {
var filename = this.getFieldValue('FILENAME'); var filename = this.getFieldValue("FILENAME");
Blockly.Arduino.libraries_['library_spi'] = '#include <SPI.h>'; Blockly.Arduino.libraries_["library_spi"] = "#include <SPI.h>";
Blockly.Arduino.libraries_['library_sd'] = '#include <SD.h>'; Blockly.Arduino.libraries_["library_sd"] = "#include <SD.h>";
Blockly.Arduino.codeFunctions_['define_sd' + filename] = 'File webFile;'; Blockly.Arduino.codeFunctions_["define_sd" + filename] = "File webFile;";
Blockly.Arduino.setupCode_['sensebox_sd'] = 'SD.begin(28);'; Blockly.Arduino.setupCode_["sensebox_sd"] = "SD.begin(28);";
var func = [ Blockly.Arduino.codeFunctions_["generateHTML"] = `
'String generateHTML(){', String generateHTML(){
' webFile = SD.open("' + filename + '", FILE_READ);', webFile = SD.open("${filename}", FILE_READ);
' String finalString ="";', String finalString ="";
' while (webFile.available())', while (webFile.available())
' {', {
' finalString+=(char)webFile.read();', finalString+=(char)webFile.read();
' }', }
' return finalString;', return finalString;
'}']; }`;
var functionName = Blockly.Arduino.addFunction( var code = `generateHTML()`;
'generateHTML', func.join('\n')); return [code, Blockly.Arduino.ORDER_ATOMIC];
var code = functionName + '()'; };
return [code, Blockly.Arduino.ORDER_ATOMIC];
};

View File

@ -8,103 +8,110 @@
* types. * types.
*/ */
/** Single character. */ /** Single character. */
export const CHARACTER = { export const CHARACTER = {
typeId: 'Character', typeId: "Character",
typeName: 'char', typeName: "char",
typeMsgName: 'ARD_TYPE_CHAR', typeMsgName: "ARD_TYPE_CHAR",
} };
export const BOOLEAN = { export const BOOLEAN = {
typeId: 'Boolean', typeId: "Boolean",
typeName: 'boolean', typeName: "boolean",
typeMsgName: 'ARD_TYPE_BOOL', typeMsgName: "ARD_TYPE_BOOL",
} };
/** Text string. */ /** Text string. */
export const TEXT = { export const TEXT = {
typeId: 'Text', typeId: "Text",
typeName: 'String', typeName: "String",
typeMsgName: 'ARD_TYPE_TEXT', typeMsgName: "ARD_TYPE_TEXT",
} };
/** Short integer number. */ /** Short integer number. */
export const SHORT_NUMBER = { export const SHORT_NUMBER = {
typeId: 'Short_Number', typeId: "Short_Number",
typeName: 'int', typeName: "int",
typeMsgName: 'ARD_TYPE_SHORT', typeMsgName: "ARD_TYPE_SHORT",
} };
/** Integer number. */ /** Integer number. */
export const NUMBER = { export const NUMBER = {
typeId: 'Number', typeId: "Number",
typeName: 'int', typeName: "int",
typeMsgName: 'ARD_TYPE_NUMBER', typeMsgName: "ARD_TYPE_NUMBER",
} };
/** Large integer number. */ /** Large integer number. */
export const LARGE_NUMBER = { export const LARGE_NUMBER = {
typeId: 'Large Number', typeId: "Large Number",
typeName: 'long', typeName: "long",
typeMsgName: 'ARD_TYPE_LONG', typeMsgName: "ARD_TYPE_LONG",
} };
/** Decimal/floating point number. */ /** Decimal/floating point number. */
export const DECIMAL = { export const DECIMAL = {
typeId: 'Decimal', typeId: "Decimal",
typeName: 'float', typeName: "float",
typeMsgName: 'ARD_TYPE_DECIMAL', typeMsgName: "ARD_TYPE_DECIMAL",
} };
/** Array/List of items. */ /** Array/List of items. */
export const ARRAY = { export const ARRAY = {
typeId: 'Array', typeId: "Array",
typeName: 'Array', typeName: "Array",
typeMsgName: 'ARD_TYPE_ARRAY', typeMsgName: "ARD_TYPE_ARRAY",
compatibleTypes: [] compatibleTypes: [],
} };
/** Null indicate there is no type. */ /** Null indicate there is no type. */
export const NULL = { export const NULL = {
typeId: 'Null', typeId: "Null",
typeName: 'void', typeName: "void",
typeMsgName: 'ARD_TYPE_NULL', typeMsgName: "ARD_TYPE_NULL",
} };
/** Type not defined, or not yet defined. */ /** Type not defined, or not yet defined. */
export const UNDEF = { export const UNDEF = {
typeId: 'Undefined', typeId: "Undefined",
typeName: 'undef', typeName: "undef",
typeMsgName: 'ARD_TYPE_UNDEF', typeMsgName: "ARD_TYPE_UNDEF",
} };
/** Set when no child block (meant to define the variable type) is connected. */ /** Set when no child block (meant to define the variable type) is connected. */
export const CHILD_BLOCK_MISSING = { export const CHILD_BLOCK_MISSING = {
typeId: 'ChildBlockMissing', typeId: "ChildBlockMissing",
typeMsgName: 'ARD_TYPE_CHILDBLOCKMISSING', typeMsgName: "ARD_TYPE_CHILDBLOCKMISSING",
compatibleTypes: [] compatibleTypes: [],
}
const compatibleTypes = {
Array: ['Array'],
boolean: ['boolean'],
int: ['int', 'long', 'double', 'float'],
char: ['char'],
String: ['String'],
void: ['void'],
long: ['int', 'long'],
double: ['int', 'long', 'double'],
float: ['int', 'long', 'double', 'float'],
null: ['null']
}
export const getCompatibleTypes = (type) => {
return compatibleTypes[type];
}; };
export const VARIABLE_TYPES = [['SHORT_NUMBER', 'char'], ['NUMBER', 'int'], ['DECIMAL', 'long'], ['TEXT', 'String'], ['CHARACTER', 'char'], ['BOOLEAN', 'boolean'], ['NULL', 'void'], ['UNDEF', 'undefined']]; const compatibleTypes = {
Array: ["Array"],
boolean: ["boolean"],
int: ["int", "long", "double", "float"],
char: ["char"],
String: ["String"],
void: ["void"],
long: ["int", "long"],
double: ["int", "long", "double"],
float: ["int", "long", "double", "float"],
null: ["null"],
};
export const getCompatibleTypes = (type) => {
return compatibleTypes[type];
};
export const VARIABLE_TYPES = [
["SHORT_NUMBER", "char"],
["NUMBER", "int"],
["DECIMAL", "long"],
["TEXT", "String"],
["CHARACTER", "char"],
["BOOLEAN", "boolean"],
["NULL", "void"],
["UNDEF", "undefined"],
];
// /** // /**
// * Some Types have circular dependencies on their compatibilities, so add them // * Some Types have circular dependencies on their compatibilities, so add them
@ -233,7 +240,3 @@ export const VARIABLE_TYPES = [['SHORT_NUMBER', 'char'], ['NUMBER', 'int'], ['DE
// } // }
// return Blockly.Types.NULL; // return Blockly.Types.NULL;
// }; // };

View File

@ -1,13 +1,16 @@
export const SD = { export const SD = {
/** /**
* SD-Block * SD-Block
*/ */
senseBox_sd_create_file: "Erstelle Datei auf SD-Karte", senseBox_sd_create_file: "Erstelle Datei auf SD-Karte",
senseBox_sd_write_file: "Schreibe Daten auf SD-Karte", senseBox_sd_write_file: "Schreibe Daten auf SD-Karte",
senseBox_sd_open_file: "Öffne eine Datei auf der SD-Karte", senseBox_sd_open_file: "Öffne Datei auf der SD-Karte",
senseBox_sd_create_file_tooltip: "Erstellt eine Datei auf der Karte. Stecke das SD-Bee auf den Steckplatz **XBEE2**. Die **maximale** Länge des Dateinamen sind **8 Zeichen**. Die Datei sollte zuerst im *Setup()* erstellt werden", senseBox_sd_create_file_tooltip:
senseBox_sd_write_file_tooptip: "Schreibe Daten auf die SD-Karte. Beachte, dass die Datei zuerst geöffnet werden muss.", "Erstellt eine Datei auf der Karte. Stecke das SD-Bee auf den Steckplatz **XBEE2**. Die **maximale** Länge des Dateinamen sind **8 Zeichen**. Die Datei sollte zuerst im *Setup()* erstellt werden",
senseBox_sd_open_file_tooltip: "Öffne die Datei auf der SD-Karte, um Dateien zu speichern. Am Ende der Schleife wird die Datei automatisch wieder geschlossen.", senseBox_sd_write_file_tooptip:
sensebox_sd_filename: "Daten", "Schreibe Daten auf die SD-Karte. Beachte, dass die Datei zuerst geöffnet werden muss.",
senseBox_sd_decimals: "Dezimalen", senseBox_sd_open_file_tooltip:
} "Öffne die Datei auf der SD-Karte, um Dateien zu speichern. Am Ende der Schleife wird die Datei automatisch wieder geschlossen.",
sensebox_sd_filename: "Daten",
senseBox_sd_decimals: "Dezimalen",
};

View File

@ -1,20 +1,22 @@
export const TIME = { export const TIME = {
/**
/** * Interval Block
* Interval Block */
*/ senseBox_interval_timer: "Intervall:",
senseBox_interval_timer: "Messintervall", senseBox_interval: "ms",
senseBox_interval: "ms", senseBox_interval_timer_tip: "Intervall",
senseBox_interval_timer_tip: "Intervall", senseBox_interval_time: "Zeit: ",
ARD_TIME_DELAY: "Warte", ARD_TIME_DELAY: "Warte",
ARD_TIME_DELAY_MICROS: "Mikrosekunden", ARD_TIME_DELAY_MICROS: "Mikrosekunden",
ARD_TIME_DELAY_MICRO_TIP: "Warte eine spezifischen Zeit in Microsekunden", ARD_TIME_DELAY_MICRO_TIP: "Warte eine spezifischen Zeit in Microsekunden",
ARD_TIME_DELAY_TIP: "Warte spezifische Zeit in Millisekunden", ARD_TIME_DELAY_TIP: "Warte spezifische Zeit in Millisekunden",
ARD_TIME_INF: "Warte für immer (Beende Programm)", ARD_TIME_INF: "Warte für immer (Beende Programm)",
ARD_TIME_INF_TIP: "Stoppt das Programm.", ARD_TIME_INF_TIP: "Stoppt das Programm.",
ARD_TIME_MICROS: "Bereits vergangen Zeit (Mikrosekunden)", ARD_TIME_MICROS: "Bereits vergangen Zeit (Mikrosekunden)",
ARD_TIME_MICROS_TIP: "Gibt eine Zahl in Microsekunden zurück, die der Zeitdauer des Aktuellen Programms entspricht. Muss als positiven Integer gespeichert werden", // untranslated ARD_TIME_MICROS_TIP:
ARD_TIME_MILLIS: "Bereits vergangen Zeit (Millisekunden)", "Gibt eine Zahl in Microsekunden zurück, die der Zeitdauer des Aktuellen Programms entspricht. Muss als positiven Integer gespeichert werden", // untranslated
ARD_TIME_MILLIS_TIP: "Gibt eine Zahl in Millisekunden zurück, die der Zeitdauer des Aktuellen Programms entspricht. Muss als positiven Integer gespeichert werden", // untranslated ARD_TIME_MILLIS: "Bereits vergangen Zeit (Millisekunden)",
ARD_TIME_MS: "Millisekunden", ARD_TIME_MILLIS_TIP:
} "Gibt eine Zahl in Millisekunden zurück, die der Zeitdauer des Aktuellen Programms entspricht. Muss als positiven Integer gespeichert werden", // untranslated
ARD_TIME_MS: "Millisekunden",
};

View File

@ -1,17 +1,19 @@
export const TIME = { export const TIME = {
senseBox_interval: "ms",
senseBox_interval: "ms", senseBox_interval_timer: "Interval",
senseBox_interval_timer: "Measuring interval", senseBox_interval_timer_tip: "Setup an Interval",
senseBox_interval_timer_tip: "Setup an Intervall", senseBox_interval_time: "time",
ARD_TIME_DELAY: "wait", ARD_TIME_DELAY: "wait",
ARD_TIME_DELAY_MICROS: "microseconds", ARD_TIME_DELAY_MICROS: "microseconds",
ARD_TIME_DELAY_MICRO_TIP: "Wait specific time in microseconds", ARD_TIME_DELAY_MICRO_TIP: "Wait specific time in microseconds",
ARD_TIME_DELAY_TIP: "Wait specific time in milliseconds", ARD_TIME_DELAY_TIP: "Wait specific time in milliseconds",
ARD_TIME_INF: "wait forever (end program)", ARD_TIME_INF: "wait forever (end program)",
ARD_TIME_INF_TIP: "Wait indefinitely, stopping the program.", ARD_TIME_INF_TIP: "Wait indefinitely, stopping the program.",
ARD_TIME_MICROS: "current elapsed Time (microseconds)", ARD_TIME_MICROS: "current elapsed Time (microseconds)",
ARD_TIME_MICROS_TIP: "Returns the number of microseconds since the Arduino board began running the current program. Has to be stored in a positive long integer", ARD_TIME_MICROS_TIP:
ARD_TIME_MILLIS: "current elapsed Time (milliseconds)", "Returns the number of microseconds since the Arduino board began running the current program. Has to be stored in a positive long integer",
ARD_TIME_MILLIS_TIP: "Returns the number of milliseconds since the Arduino board began running the current program. Has to be stored in a positive long integer", ARD_TIME_MILLIS: "current elapsed Time (milliseconds)",
ARD_TIME_MS: "milliseconds", ARD_TIME_MILLIS_TIP:
} "Returns the number of milliseconds since the Arduino board began running the current program. Has to be stored in a positive long integer",
ARD_TIME_MS: "milliseconds",
};