Merge pull request #89 from sensebox/add-phyphox

Add phyphox
This commit is contained in:
Mario Pesch 2021-05-21 12:21:26 +02:00 committed by GitHub
commit 5ecc776db2
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
13 changed files with 1639 additions and 1142 deletions

View File

@ -1,24 +1,25 @@
import './loops'; import "./loops";
import './sensebox'; import "./sensebox";
import './logic'; import "./logic";
import './sensebox-sensors'; import "./sensebox-sensors";
import './sensebox-telegram'; import "./sensebox-telegram";
import './sensebox-osem'; import "./sensebox-osem";
import './sensebox-web'; import "./sensebox-web";
import './sensebox-display'; import "./sensebox-display";
import './sensebox-lora'; import "./sensebox-lora";
import './sensebox-led'; import "./sensebox-led";
import './sensebox-sd'; import "./sensebox-ble";
import './mqtt'; import "./sensebox-sd";
import './text'; import "./mqtt";
import './io'; import "./text";
import './audio'; import "./io";
import './math'; import "./audio";
import './map'; import "./math";
import './procedures'; import "./map";
import './time'; import "./procedures";
import './variables'; import "./time";
import './lists'; import "./variables";
import './webserver'; import "./lists";
import "./webserver";
import '../helpers/types' import "../helpers/types";

View File

@ -0,0 +1,145 @@
import * as Blockly from "blockly";
import { getColour } from "../helpers/colour";
Blockly.Blocks["sensebox_phyphox_init"] = {
init: function () {
this.setColour(getColour().phyphox);
this.appendDummyInput()
.appendField(Blockly.Msg.sensebox_phyphox_init)
.appendField(new Blockly.FieldTextInput("Geräte Name"), "devicename");
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setTooltip(Blockly.Msg.sensebox_phyphox_init_tooltip);
},
};
Blockly.Blocks["sensebox_phyphox_experiment"] = {
init: function () {
this.setColour(getColour().phyphox);
this.appendDummyInput().appendField(
Blockly.Msg.sensebox_phyphox_createExperiment
);
this.appendDummyInput()
.appendField(Blockly.Msg.sensebox_phyphox_experimentTitle)
.appendField(new Blockly.FieldTextInput("Experiment Title"), "title");
this.appendDummyInput()
.appendField(Blockly.Msg.sensebox_phyphox_experimentDescription)
.appendField(
new Blockly.FieldTextInput(
Blockly.Msg.sensebox_phyphox_experiment_description
),
"description"
);
this.appendStatementInput("view").appendField(
Blockly.Msg.sensebox_phyphox_createView
);
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setTooltip(Blockly.Msg.sensebox_phyphox_experiment_tooltip);
},
};
Blockly.Blocks["sensebox_phyphox_graph"] = {
init: function () {
this.setColour(getColour().phyphox);
this.appendDummyInput()
.appendField(Blockly.Msg.sensebox_phyphox_createGraph)
.appendField(Blockly.Msg.sensebox_phyphox_graphLabel)
.appendField(new Blockly.FieldTextInput("Label"), "label");
this.appendDummyInput()
.appendField(Blockly.Msg.sensebox_phyphox_unitx)
.appendField(new Blockly.FieldTextInput("Unit X"), "unitx");
this.appendDummyInput()
.appendField(Blockly.Msg.sensebox_phyphox_unity)
.appendField(new Blockly.FieldTextInput("Unit Y"), "unity");
this.appendDummyInput()
.appendField(Blockly.Msg.sensebox_phyphox_labelx)
.appendField(new Blockly.FieldTextInput("Label X"), "labelx");
this.appendDummyInput()
.appendField(Blockly.Msg.sensebox_phyphox_labely)
.appendField(new Blockly.FieldTextInput("Label Y"), "labely");
this.appendDummyInput()
.appendField(Blockly.Msg.sensebox_phyphox_graphStyle)
.appendField(
new Blockly.FieldDropdown([
[Blockly.Msg.sensebox_phyphox_style_dots, "dots"],
[Blockly.Msg.sensebox_phyphox_style_line, "line"],
]),
"style"
);
this.appendValueInput("channel0").appendField(
Blockly.Msg.sensebox_phyphox_channel0
);
this.appendValueInput("channel1").appendField(
Blockly.Msg.sensebox_phyphox_channel1
);
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setTooltip(Blockly.Msg.sensebox_phyphox_graph_tooltip);
},
};
Blockly.Blocks["sensebox_phyphox_timestamp"] = {
init: function () {
this.setColour(getColour().phyphox);
this.appendDummyInput().appendField(Blockly.Msg.sensebox_phyphox_timestamp);
this.setOutput(true);
this.setTooltip(Blockly.Msg.sensebox_phyphox_timestamp_tooltip);
},
};
Blockly.Blocks["sensebox_phyphox_channel"] = {
init: function () {
this.setColour(getColour().phyphox);
this.appendDummyInput()
.appendField(Blockly.Msg.sensebox_phyphox_channel)
.appendField(
new Blockly.FieldDropdown([
["1", "1"],
["2", "2"],
["3", "3"],
["4", "4"],
["5", "5"],
]),
"channel"
);
this.setOutput(true);
this.setTooltip(Blockly.Msg.sensebox_phyphox_channel_tooltip);
},
};
Blockly.Blocks["sensebox_phyphox_sendchannel"] = {
init: function () {
this.setColour(getColour().phyphox);
this.appendValueInput("value")
.appendField(Blockly.Msg.sensebox_phyphox_sendchannel)
.appendField(
new Blockly.FieldDropdown([
["1", "1"],
["2", "2"],
["3", "3"],
["4", "4"],
["5", "5"],
]),
"channel"
);
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setTooltip(Blockly.Msg.sensebox_phyphox_sendchannel_tooltip);
},
};
Blockly.Blocks["sensebox_phyphox_experiment_send"] = {
init: function () {
this.setColour(getColour().phyphox);
this.appendStatementInput("sendValues").appendField(
Blockly.Msg.sensebox_phyphox_writeValues
);
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setTooltip(Blockly.Msg.sensebox_phyphox_experiment_send_tooltip);
},
};

View File

@ -24,13 +24,13 @@
// More on generating code: // More on generating code:
// https://developers.google.com/blockly/guides/create-custom-blocks/generating-code // https://developers.google.com/blockly/guides/create-custom-blocks/generating-code
import * as Blockly from 'blockly/core'; import * as Blockly from "blockly/core";
/** /**
* Arduino code generator. * Arduino code generator.
* @type !Blockly.Generator * @type !Blockly.Generator
*/ */
Blockly['Arduino'] = new Blockly.Generator('Arduino'); Blockly["Arduino"] = new Blockly.Generator("Arduino");
/** /**
* List of illegal variable names. * List of illegal variable names.
@ -39,49 +39,46 @@ Blockly['Arduino'] = new Blockly.Generator('Arduino');
* accidentally clobbering a built-in object or function. * accidentally clobbering a built-in object or function.
* @private * @private
*/ */
Blockly['Arduino'].addReservedWords( Blockly["Arduino"].addReservedWords(
// http://arduino.cc/en/Reference/HomePage // http://arduino.cc/en/Reference/HomePage
'setup,loop,if,else,for,switch,case,while,' + "setup,loop,if,else,for,switch,case,while," +
'do,break,continue,return,goto,define,include,' + "do,break,continue,return,goto,define,include," +
'HIGH,LOW,INPUT,OUTPUT,INPUT_PULLUP,true,false,' + "HIGH,LOW,INPUT,OUTPUT,INPUT_PULLUP,true,false," +
'interger, constants,floating,point,void,boolean,char,' + "interger, constants,floating,point,void,boolean,char," +
'unsigned,byte,int,word,long,float,double,string,String,array,' + "unsigned,byte,int,word,long,float,double,string,String,array," +
'static, volatile,const,sizeof,pinMode,digitalWrite,digitalRead,' + "static, volatile,const,sizeof,pinMode,digitalWrite,digitalRead," +
'analogReference,analogRead,analogWrite,tone,noTone,shiftOut,shitIn,' + "analogReference,analogRead,analogWrite,tone,noTone,shiftOut,shitIn," +
'pulseIn,millis,micros,delay,delayMicroseconds,min,max,abs,constrain,' + "pulseIn,millis,micros,delay,delayMicroseconds,min,max,abs,constrain," +
'map,pow,sqrt,sin,cos,tan,randomSeed,random,lowByte,highByte,bitRead,' + "map,pow,sqrt,sin,cos,tan,randomSeed,random,lowByte,highByte,bitRead," +
'bitWrite,bitSet,bitClear,ultraSonicDistance,parseDouble,setNeoPixelColor,' + "bitWrite,bitSet,bitClear,ultraSonicDistance,parseDouble,setNeoPixelColor," +
'bit,attachInterrupt,detachInterrupt,interrupts,noInterrupts', "bit,attachInterrupt,detachInterrupt,interrupts,noInterrupts",
'short', "short",
'isBtnPressed' "isBtnPressed"
); );
/** /**
* Order of operation ENUMs. * Order of operation ENUMs.
* *
*/ */
Blockly['Arduino'].ORDER_ATOMIC = 0; // 0 "" ... Blockly["Arduino"].ORDER_ATOMIC = 0; // 0 "" ...
Blockly['Arduino'].ORDER_UNARY_POSTFIX = 1; // expr++ expr-- () [] . Blockly["Arduino"].ORDER_UNARY_POSTFIX = 1; // expr++ expr-- () [] .
Blockly['Arduino'].ORDER_UNARY_PREFIX = 2; // -expr !expr ~expr ++expr --expr Blockly["Arduino"].ORDER_UNARY_PREFIX = 2; // -expr !expr ~expr ++expr --expr
Blockly['Arduino'].ORDER_MULTIPLICATIVE = 3; // * / % ~/ Blockly["Arduino"].ORDER_MULTIPLICATIVE = 3; // * / % ~/
Blockly['Arduino'].ORDER_ADDITIVE = 4; // + - Blockly["Arduino"].ORDER_ADDITIVE = 4; // + -
Blockly['Arduino'].ORDER_LOGICAL_NOT = 4.4; // ! Blockly["Arduino"].ORDER_LOGICAL_NOT = 4.4; // !
Blockly['Arduino'].ORDER_SHIFT = 5; // << >> Blockly["Arduino"].ORDER_SHIFT = 5; // << >>
Blockly['Arduino'].ORDER_MODULUS = 5.3; // % Blockly["Arduino"].ORDER_MODULUS = 5.3; // %
Blockly['Arduino'].ORDER_RELATIONAL = 6; // is is! >= > <= < Blockly["Arduino"].ORDER_RELATIONAL = 6; // is is! >= > <= <
Blockly['Arduino'].ORDER_EQUALITY = 7; // === !== === !== Blockly["Arduino"].ORDER_EQUALITY = 7; // === !== === !==
Blockly['Arduino'].ORDER_BITWISE_AND = 8; // & Blockly["Arduino"].ORDER_BITWISE_AND = 8; // &
Blockly['Arduino'].ORDER_BITWISE_XOR = 9; // ^ Blockly["Arduino"].ORDER_BITWISE_XOR = 9; // ^
Blockly['Arduino'].ORDER_BITWISE_OR = 10; // | Blockly["Arduino"].ORDER_BITWISE_OR = 10; // |
Blockly['Arduino'].ORDER_LOGICAL_AND = 11; // && Blockly["Arduino"].ORDER_LOGICAL_AND = 11; // &&
Blockly['Arduino'].ORDER_LOGICAL_OR = 12; // || Blockly["Arduino"].ORDER_LOGICAL_OR = 12; // ||
Blockly['Arduino'].ORDER_CONDITIONAL = 13; // expr ? expr : expr Blockly["Arduino"].ORDER_CONDITIONAL = 13; // expr ? expr : expr
Blockly['Arduino'].ORDER_ASSIGNMENT = 14; // = *= /= ~/= %= += -= <<= >>= &= ^= |= Blockly["Arduino"].ORDER_ASSIGNMENT = 14; // = *= /= ~/= %= += -= <<= >>= &= ^= |=
Blockly['Arduino'].ORDER_COMMA = 18; // , Blockly["Arduino"].ORDER_COMMA = 18; // ,
Blockly['Arduino'].ORDER_NONE = 99; // (...) Blockly["Arduino"].ORDER_NONE = 99; // (...)
/** /**
* *
@ -90,49 +87,49 @@ Blockly['Arduino'].ORDER_NONE = 99; // (...)
* Blockly Types * Blockly Types
*/ */
/** /**
* Initialise the database of variable names. * Initialise the database of variable names.
* @param {!Blockly.Workspace} workspace Workspace to generate code from. * @param {!Blockly.Workspace} workspace Workspace to generate code from.
*/ */
Blockly['Arduino'].init = function (workspace) { Blockly["Arduino"].init = function (workspace) {
// Create a dictionary of definitions to be printed before the code. // Create a dictionary of definitions to be printed before the code.
Blockly['Arduino'].libraries_ = Object.create(null); Blockly["Arduino"].libraries_ = Object.create(null);
Blockly['Arduino'].definitions_ = Object.create(null); Blockly["Arduino"].definitions_ = Object.create(null);
// creates a list of code to be setup before the setup block // creates a list of code to be setup before the setup block
Blockly['Arduino'].setupCode_ = Object.create(null); Blockly["Arduino"].setupCode_ = Object.create(null);
// creates a list of code to be setup before the setup block // creates a list of code to be setup before the setup block
Blockly['Arduino'].loraSetupCode_ = Object.create(null); Blockly["Arduino"].phyphoxSetupCode_ = Object.create(null);
// creates a list of code to be setup before the setup block
Blockly["Arduino"].loraSetupCode_ = Object.create(null);
// creates a list of code for the loop to be runned once // creates a list of code for the loop to be runned once
Blockly['Arduino'].loopCodeOnce_ = Object.create(null) Blockly["Arduino"].loopCodeOnce_ = Object.create(null);
// creates a list of code for the loop to be runned once // creates a list of code for the loop to be runned once
Blockly['Arduino'].codeFunctions_ = Object.create(null) Blockly["Arduino"].codeFunctions_ = Object.create(null);
// creates a list of code variables // creates a list of code variables
Blockly['Arduino'].variables_ = Object.create(null) Blockly["Arduino"].variables_ = Object.create(null);
// Create a dictionary mapping desired function names in definitions_ // Create a dictionary mapping desired function names in definitions_
// to actual function names (to avoid collisions with user functions). // to actual function names (to avoid collisions with user functions).
Blockly['Arduino'].functionNames_ = Object.create(null); Blockly["Arduino"].functionNames_ = Object.create(null);
Blockly['Arduino'].variablesInitCode_ = ''; Blockly["Arduino"].variablesInitCode_ = "";
if (!Blockly['Arduino'].variableDB_) { if (!Blockly["Arduino"].variableDB_) {
Blockly['Arduino'].variableDB_ = new Blockly.Names( Blockly["Arduino"].variableDB_ = new Blockly.Names(
Blockly['Arduino'].RESERVED_WORDS_ Blockly["Arduino"].RESERVED_WORDS_
); );
} else { } else {
Blockly['Arduino'].variableDB_.reset(); Blockly["Arduino"].variableDB_.reset();
} }
Blockly['Arduino'].variableDB_.setVariableMap(workspace.getVariableMap()); Blockly["Arduino"].variableDB_.setVariableMap(workspace.getVariableMap());
// We don't have developer variables for now // We don't have developer variables for now
// // Add developer variables (not created or named by the user). // // Add developer variables (not created or named by the user).
@ -142,53 +139,53 @@ Blockly['Arduino'].init = function (workspace) {
// Blockly.Names.DEVELOPER_VARIABLE_TYPE)); // Blockly.Names.DEVELOPER_VARIABLE_TYPE));
// } // }
const doubleVariables = workspace.getVariablesOfType('Number'); const doubleVariables = workspace.getVariablesOfType("Number");
let i = 0; let i = 0;
let variableCode = ''; let variableCode = "";
for (i = 0; i < doubleVariables.length; i += 1) { for (i = 0; i < doubleVariables.length; i += 1) {
variableCode += variableCode +=
'double ' + "double " +
Blockly['Arduino'].variableDB_.getName( Blockly["Arduino"].variableDB_.getName(
doubleVariables[i].getId(), doubleVariables[i].getId(),
Blockly.Variables.NAME_TYPE Blockly.Variables.NAME_TYPE
) + ) +
' = 0; \n\n'; " = 0; \n\n";
} }
const stringVariables = workspace.getVariablesOfType('String'); const stringVariables = workspace.getVariablesOfType("String");
for (i = 0; i < stringVariables.length; i += 1) { for (i = 0; i < stringVariables.length; i += 1) {
variableCode += variableCode +=
'String ' + "String " +
Blockly['Arduino'].variableDB_.getName( Blockly["Arduino"].variableDB_.getName(
stringVariables[i].getId(), stringVariables[i].getId(),
Blockly.Variables.NAME_TYPE Blockly.Variables.NAME_TYPE
) + ) +
' = ""; \n\n'; ' = ""; \n\n';
} }
const booleanVariables = workspace.getVariablesOfType('Boolean'); const booleanVariables = workspace.getVariablesOfType("Boolean");
for (i = 0; i < booleanVariables.length; i += 1) { for (i = 0; i < booleanVariables.length; i += 1) {
variableCode += variableCode +=
'boolean ' + "boolean " +
Blockly['Arduino'].variableDB_.getDistinctName( Blockly["Arduino"].variableDB_.getDistinctName(
booleanVariables[i].getId(), booleanVariables[i].getId(),
Blockly.Variables.NAME_TYPE Blockly.Variables.NAME_TYPE
) + ) +
' = false; \n\n'; " = false; \n\n";
} }
const colourVariables = workspace.getVariablesOfType('Colour'); const colourVariables = workspace.getVariablesOfType("Colour");
for (i = 0; i < colourVariables.length; i += 1) { for (i = 0; i < colourVariables.length; i += 1) {
variableCode += variableCode +=
'RGB ' + "RGB " +
Blockly['Arduino'].variableDB_.getName( Blockly["Arduino"].variableDB_.getName(
colourVariables[i].getId(), colourVariables[i].getId(),
Blockly.Variables.NAME_TYPE Blockly.Variables.NAME_TYPE
) + ) +
' = {0, 0, 0}; \n\n'; " = {0, 0, 0}; \n\n";
} }
Blockly['Arduino'].variablesInitCode_ = variableCode; Blockly["Arduino"].variablesInitCode_ = variableCode;
}; };
/** /**
@ -196,86 +193,93 @@ Blockly['Arduino'].init = function (workspace) {
* @param {string} code Generated code. * @param {string} code Generated code.
* @return {string} Completed code. * @return {string} Completed code.
*/ */
Blockly['Arduino'].finish = function (code) { Blockly["Arduino"].finish = function (code) {
let libraryCode = ''; let libraryCode = "";
let variablesCode = ''; let variablesCode = "";
let codeFunctions = ''; let codeFunctions = "";
let functionsCode = ''; let functionsCode = "";
let definitionsCode = ''; let definitionsCode = "";
let loopCodeOnce = ''; let phyphoxSetupCode = "";
let setupCode = ''; let loopCodeOnce = "";
let preSetupCode = ''; let setupCode = "";
let loraSetupCode = ''; let preSetupCode = "";
let devVariables = '\n'; let loraSetupCode = "";
let devVariables = "\n";
for (const key in Blockly['Arduino'].libraries_) { for (const key in Blockly["Arduino"].libraries_) {
libraryCode += Blockly['Arduino'].libraries_[key] + '\n'; libraryCode += Blockly["Arduino"].libraries_[key] + "\n";
} }
for (const key in Blockly['Arduino'].variables_) { for (const key in Blockly["Arduino"].variables_) {
variablesCode += Blockly['Arduino'].variables_[key] + '\n'; variablesCode += Blockly["Arduino"].variables_[key] + "\n";
} }
for (const key in Blockly['Arduino'].definitions_) { for (const key in Blockly["Arduino"].definitions_) {
definitionsCode += Blockly['Arduino'].definitions_[key] + '\n'; definitionsCode += Blockly["Arduino"].definitions_[key] + "\n";
} }
for (const key in Blockly['Arduino'].loopCodeOnce_) { for (const key in Blockly["Arduino"].loopCodeOnce_) {
loopCodeOnce += Blockly['Arduino'].loopCodeOnce_[key] + '\n'; loopCodeOnce += Blockly["Arduino"].loopCodeOnce_[key] + "\n";
} }
for (const key in Blockly['Arduino'].codeFunctions_) { for (const key in Blockly["Arduino"].codeFunctions_) {
codeFunctions += Blockly['Arduino'].codeFunctions_[key] + '\n'; codeFunctions += Blockly["Arduino"].codeFunctions_[key] + "\n";
} }
for (const key in Blockly['Arduino'].functionNames_) { for (const key in Blockly["Arduino"].functionNames_) {
functionsCode += Blockly['Arduino'].functionNames_[key] + '\n'; functionsCode += Blockly["Arduino"].functionNames_[key] + "\n";
} }
for (const key in Blockly["Arduino"].setupCode_) {
preSetupCode += Blockly["Arduino"].setupCode_[key] + "\n" || "";
for (const key in Blockly['Arduino'].setupCode_) {
preSetupCode += Blockly['Arduino'].setupCode_[key] || '';
} }
for (const key in Blockly['Arduino'].loraSetupCode_) { for (const key in Blockly["Arduino"].loraSetupCode_) {
loraSetupCode += Blockly['Arduino'].loraSetupCode_[key] || ''; loraSetupCode += Blockly["Arduino"].loraSetupCode_[key] + "\n" || "";
} }
for (const key in Blockly["Arduino"].phyphoxSetupCode_) {
phyphoxSetupCode += Blockly["Arduino"].phyphoxSetupCode_[key] + "\n" || "";
}
setupCode = '\nvoid setup() { \n' + preSetupCode + '\n' + loraSetupCode + '\n}\n'; setupCode =
"\nvoid setup() { \n" +
let loopCode = '\nvoid loop() { \n' + loopCodeOnce + code + '\n}\n'; preSetupCode +
"\n" +
phyphoxSetupCode +
"\n" +
loraSetupCode +
"\n}\n";
let loopCode = "\nvoid loop() { \n" + loopCodeOnce + code + "\n}\n";
// Convert the definitions dictionary into a list. // Convert the definitions dictionary into a list.
code = code =
devVariables + devVariables +
'\n' + "\n" +
libraryCode + libraryCode +
'\n' + "\n" +
variablesCode + variablesCode +
'\n' + "\n" +
definitionsCode + definitionsCode +
'\n' + "\n" +
codeFunctions + codeFunctions +
'\n' + "\n" +
Blockly['Arduino'].variablesInitCode_ + Blockly["Arduino"].variablesInitCode_ +
'\n' + "\n" +
functionsCode + functionsCode +
'\n' + "\n" +
setupCode + setupCode +
'\n' + "\n" +
loopCode loopCode;
;
// Clean up temporary data. // Clean up temporary data.
delete Blockly['Arduino'].definitions_; delete Blockly["Arduino"].definitions_;
delete Blockly['Arduino'].functionNames_; delete Blockly["Arduino"].functionNames_;
delete Blockly['Arduino'].loopCodeOnce_; delete Blockly["Arduino"].loopCodeOnce_;
delete Blockly['Arduino'].variablesInitCode_; delete Blockly["Arduino"].variablesInitCode_;
delete Blockly['Arduino'].libraries_; delete Blockly["Arduino"].libraries_;
Blockly['Arduino'].variableDB_.reset(); Blockly["Arduino"].variableDB_.reset();
return code; return code;
}; };
@ -286,8 +290,8 @@ Blockly['Arduino'].finish = function (code) {
* @param {string} line Line of generated code. * @param {string} line Line of generated code.
* @return {string} Legal line of code. * @return {string} Legal line of code.
*/ */
Blockly['Arduino'].scrubNakedValue = function (line) { Blockly["Arduino"].scrubNakedValue = function (line) {
return line + ';\n'; return line + ";\n";
}; };
/** /**
@ -297,12 +301,12 @@ Blockly['Arduino'].scrubNakedValue = function (line) {
* @return {string} Arduino string. * @return {string} Arduino string.
* @private * @private
*/ */
Blockly['Arduino'].quote_ = function (string) { Blockly["Arduino"].quote_ = function (string) {
// Can't use goog.string.quote since Google's style guide recommends // Can't use goog.string.quote since Google's style guide recommends
// JS string literals use single quotes. // JS string literals use single quotes.
string = string string = string
.replace(/\\/g, '\\\\') .replace(/\\/g, "\\\\")
.replace(/\n/g, '\\\n') .replace(/\n/g, "\\\n")
.replace(/'/g, "\\'"); .replace(/'/g, "\\'");
return '"' + string + '"'; return '"' + string + '"';
}; };
@ -317,26 +321,25 @@ Blockly['Arduino'].quote_ = function (string) {
* @return {string} Arduino code with comments and subsequent blocks added. * @return {string} Arduino code with comments and subsequent blocks added.
* @private * @private
*/ */
Blockly['Arduino'].scrub_ = function (block, code) { Blockly["Arduino"].scrub_ = function (block, code) {
let commentCode = ''; let commentCode = "";
// Only collect comments for blocks that aren't inline. // Only collect comments for blocks that aren't inline.
if (!block.outputConnection || !block.outputConnection.targetConnection) { if (!block.outputConnection || !block.outputConnection.targetConnection) {
// Collect comment for this block. // Collect comment for this block.
let comment = block.getCommentText(); let comment = block.getCommentText();
//@ts-ignore //@ts-ignore
comment = comment ? Blockly.utils.string.wrap( comment = comment
comment, ? Blockly.utils.string.wrap(comment, Blockly["Arduino"].COMMENT_WRAP - 3)
Blockly['Arduino'].COMMENT_WRAP - 3 : null;
) : null;
if (comment) { if (comment) {
if (block.getProcedureDef) { if (block.getProcedureDef) {
// Use a comment block for function comments. // Use a comment block for function comments.
commentCode += commentCode +=
'/**\n' + "/**\n" +
Blockly['Arduino'].prefixLines(comment + '\n', ' * ') + Blockly["Arduino"].prefixLines(comment + "\n", " * ") +
' */\n'; " */\n";
} else { } else {
commentCode += Blockly['Arduino'].prefixLines(comment + '\n', '// '); commentCode += Blockly["Arduino"].prefixLines(comment + "\n", "// ");
} }
} }
// Collect comments for all value arguments. // Collect comments for all value arguments.
@ -345,15 +348,15 @@ Blockly['Arduino'].scrub_ = function (block, code) {
if (block.inputList[i].type === Blockly.INPUT_VALUE) { if (block.inputList[i].type === Blockly.INPUT_VALUE) {
const childBlock = block.inputList[i].connection.targetBlock(); const childBlock = block.inputList[i].connection.targetBlock();
if (childBlock) { if (childBlock) {
const comment = Blockly['Arduino'].allNestedComments(childBlock); const comment = Blockly["Arduino"].allNestedComments(childBlock);
if (comment) { if (comment) {
commentCode += Blockly['Arduino'].prefixLines(comment, '// '); commentCode += Blockly["Arduino"].prefixLines(comment, "// ");
} }
} }
} }
} }
} }
const nextBlock = block.nextConnection && block.nextConnection.targetBlock(); const nextBlock = block.nextConnection && block.nextConnection.targetBlock();
const nextCode = Blockly['Arduino'].blockToCode(nextBlock); const nextCode = Blockly["Arduino"].blockToCode(nextBlock);
return commentCode + code + nextCode; return commentCode + code + nextCode;
}; };

View File

@ -1,24 +1,23 @@
import './generator'; import "./generator";
import './loops'; import "./loops";
import './sensebox-sensors'; import "./sensebox-sensors";
import './sensebox-telegram'; import "./sensebox-telegram";
import './sensebox-osem'; import "./sensebox-osem";
import './sensebox-web'; import "./sensebox-web";
import './sensebox-display'; import "./sensebox-display";
import './sensebox-lora'; import "./sensebox-lora";
import './sensebox-led'; import "./sensebox-led";
import './sensebox-sd'; import "./sensebox-ble";
import './mqtt'; import "./sensebox-sd";
import './logic'; import "./mqtt";
import './text'; import "./logic";
import './math'; import "./text";
import './map'; import "./math";
import './io'; import "./map";
import './audio'; import "./io";
import './procedures'; import "./audio";
import './time'; import "./procedures";
import './variables'; import "./time";
import './lists'; import "./variables";
import './webserver'; import "./lists";
import "./webserver";

View File

@ -1,5 +1,4 @@
import * as Blockly from "blockly/core";
import * as Blockly from 'blockly/core';
/** /**
* @license Licensed under the Apache License, Version 2.0 (the "License"): * @license Licensed under the Apache License, Version 2.0 (the "License"):
@ -19,13 +18,13 @@ import * as Blockly from 'blockly/core';
* @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['math_number'] = function (block) { Blockly.Arduino["math_number"] = function (block) {
// Numeric value. // Numeric value.
var code = parseFloat(block.getFieldValue('NUM')); var code = parseFloat(block.getFieldValue("NUM"));
if (code === Infinity) { if (code === Infinity) {
code = 'INFINITY'; code = "INFINITY";
} else if (code === -Infinity) { } else if (code === -Infinity) {
code = '-INFINITY'; code = "-INFINITY";
} }
return [code, Blockly.Arduino.ORDER_ATOMIC]; return [code, Blockly.Arduino.ORDER_ATOMIC];
}; };
@ -37,23 +36,23 @@ Blockly.Arduino['math_number'] = 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['math_arithmetic'] = function (block) { Blockly.Arduino["math_arithmetic"] = function (block) {
var OPERATORS = { var OPERATORS = {
ADD: [' + ', Blockly.Arduino.ORDER_ADDITIVE], ADD: [" + ", Blockly.Arduino.ORDER_ADDITIVE],
MINUS: [' - ', Blockly.Arduino.ORDER_ADDITIVE], MINUS: [" - ", Blockly.Arduino.ORDER_ADDITIVE],
MULTIPLY: [' * ', Blockly.Arduino.ORDER_MULTIPLICATIVE], MULTIPLY: [" * ", Blockly.Arduino.ORDER_MULTIPLICATIVE],
DIVIDE: [' / ', Blockly.Arduino.ORDER_MULTIPLICATIVE], DIVIDE: [" / ", Blockly.Arduino.ORDER_MULTIPLICATIVE],
POWER: [null, Blockly.Arduino.ORDER_NONE] // Handle power separately. POWER: [null, Blockly.Arduino.ORDER_NONE], // Handle power separately.
}; };
var tuple = OPERATORS[block.getFieldValue('OP')]; var tuple = OPERATORS[block.getFieldValue("OP")];
var operator = tuple[0]; var operator = tuple[0];
var order = tuple[1]; var order = tuple[1];
var argument0 = Blockly.Arduino.valueToCode(block, 'A', order) || '0'; var argument0 = Blockly.Arduino.valueToCode(block, "A", order) || "0";
var argument1 = Blockly.Arduino.valueToCode(block, 'B', order) || '0'; var argument1 = Blockly.Arduino.valueToCode(block, "B", order) || "0";
var code; var code;
// Power in C++ requires a special case since it has no operator. // Power in C++ requires a special case since it has no operator.
if (!operator) { if (!operator) {
code = 'Math.pow(' + argument0 + ', ' + argument1 + ')'; code = "Math.pow(" + argument0 + ", " + argument1 + ")";
return [code, Blockly.Arduino.ORDER_UNARY_POSTFIX]; return [code, Blockly.Arduino.ORDER_UNARY_POSTFIX];
} }
code = argument0 + operator + argument1; code = argument0 + operator + argument1;
@ -66,65 +65,78 @@ Blockly.Arduino['math_arithmetic'] = 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['math_single'] = function (block) { Blockly.Arduino["math_single"] = function (block) {
var operator = block.getFieldValue('OP'); var operator = block.getFieldValue("OP");
var code; var code;
var arg; var arg;
if (operator === 'NEG') { if (operator === "NEG") {
// Negation is a special case given its different operator precedents. // Negation is a special case given its different operator precedents.
arg = Blockly.Arduino.valueToCode(block, 'NUM', arg =
Blockly.Arduino.ORDER_UNARY_PREFIX) || '0'; Blockly.Arduino.valueToCode(
if (arg[0] === '-') { block,
"NUM",
Blockly.Arduino.ORDER_UNARY_PREFIX
) || "0";
if (arg[0] === "-") {
// --3 is not legal in C++ in this context. // --3 is not legal in C++ in this context.
arg = ' ' + arg; arg = " " + arg;
} }
code = '-' + arg; code = "-" + arg;
return [code, Blockly.Arduino.ORDER_UNARY_PREFIX]; return [code, Blockly.Arduino.ORDER_UNARY_PREFIX];
} }
if (operator === 'ABS' || operator.substring(0, 5) === 'ROUND') { if (operator === "ABS" || operator.substring(0, 5) === "ROUND") {
arg = Blockly.Arduino.valueToCode(block, 'NUM', arg =
Blockly.Arduino.ORDER_UNARY_POSTFIX) || '0'; Blockly.Arduino.valueToCode(
} else if (operator === 'SIN' || operator === 'COS' || operator === 'TAN') { block,
arg = Blockly.Arduino.valueToCode(block, 'NUM', "NUM",
Blockly.Arduino.ORDER_MULTIPLICATIVE) || '0'; Blockly.Arduino.ORDER_UNARY_POSTFIX
) || "0";
} else if (operator === "SIN" || operator === "COS" || operator === "TAN") {
arg =
Blockly.Arduino.valueToCode(
block,
"NUM",
Blockly.Arduino.ORDER_MULTIPLICATIVE
) || "0";
} else { } else {
arg = Blockly.Arduino.valueToCode(block, 'NUM', arg =
Blockly.Arduino.ORDER_NONE) || '0'; Blockly.Arduino.valueToCode(block, "NUM", Blockly.Arduino.ORDER_NONE) ||
"0";
} }
// First, handle cases which generate values that don't need parentheses. // First, handle cases which generate values that don't need parentheses.
switch (operator) { switch (operator) {
case 'ABS': case "ABS":
code = 'abs(' + arg + ')'; code = "abs(" + arg + ")";
break; break;
case 'ROOT': case "ROOT":
code = 'sqrt(' + arg + ')'; code = "sqrt(" + arg + ")";
break; break;
case 'LN': case "LN":
code = 'log(' + arg + ')'; code = "log(" + arg + ")";
break; break;
case 'EXP': case "EXP":
code = 'exp(' + arg + ')'; code = "exp(" + arg + ")";
break; break;
case 'POW10': case "POW10":
code = 'pow(10,' + arg + ')'; code = "pow(10," + arg + ")";
break; break;
case 'ROUND': case "ROUND":
code = 'round(' + arg + ')'; code = "round(" + arg + ")";
break; break;
case 'ROUNDUP': case "ROUNDUP":
code = 'ceil(' + arg + ')'; code = "ceil(" + arg + ")";
break; break;
case 'ROUNDDOWN': case "ROUNDDOWN":
code = 'floor(' + arg + ')'; code = "floor(" + arg + ")";
break; break;
case 'SIN': case "SIN":
code = 'sin(' + arg + ' / 180 * Math.PI)'; code = "sin(" + arg + " / 180 * Math.PI)";
break; break;
case 'COS': case "COS":
code = 'cos(' + arg + ' / 180 * Math.PI)'; code = "cos(" + arg + " / 180 * Math.PI)";
break; break;
case 'TAN': case "TAN":
code = 'tan(' + arg + ' / 180 * Math.PI)'; code = "tan(" + arg + " / 180 * Math.PI)";
break; break;
default: default:
break; break;
@ -134,20 +146,20 @@ Blockly.Arduino['math_single'] = function (block) {
} }
// Second, handle cases which generate values that may need parentheses. // Second, handle cases which generate values that may need parentheses.
switch (operator) { switch (operator) {
case 'LOG10': case "LOG10":
code = 'log(' + arg + ') / log(10)'; code = "log(" + arg + ") / log(10)";
break; break;
case 'ASIN': case "ASIN":
code = 'asin(' + arg + ') / M_PI * 180'; code = "asin(" + arg + ") / M_PI * 180";
break; break;
case 'ACOS': case "ACOS":
code = 'acos(' + arg + ') / M_PI * 180'; code = "acos(" + arg + ") / M_PI * 180";
break; break;
case 'ATAN': case "ATAN":
code = 'atan(' + arg + ') / M_PI * 180'; code = "atan(" + arg + ") / M_PI * 180";
break; break;
default: default:
throw new Error('Unknown math operator: ' + operator); throw new Error("Unknown math operator: " + operator);
} }
return [code, Blockly.Arduino.ORDER_MULTIPLICATIVE]; return [code, Blockly.Arduino.ORDER_MULTIPLICATIVE];
}; };
@ -161,16 +173,16 @@ Blockly.Arduino['math_single'] = 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['math_constant'] = function (block) { Blockly.Arduino["math_constant"] = function (block) {
var CONSTANTS = { var CONSTANTS = {
'PI': ['M_PI', Blockly.Arduino.ORDER_UNARY_POSTFIX], PI: ["M_PI", Blockly.Arduino.ORDER_UNARY_POSTFIX],
'E': ['M_E', Blockly.Arduino.ORDER_UNARY_POSTFIX], E: ["M_E", Blockly.Arduino.ORDER_UNARY_POSTFIX],
'GOLDEN_RATIO': ['(1 + sqrt(5)) / 2', Blockly.Arduino.ORDER_MULTIPLICATIVE], GOLDEN_RATIO: ["(1 + sqrt(5)) / 2", Blockly.Arduino.ORDER_MULTIPLICATIVE],
'SQRT2': ['M_SQRT2', Blockly.Arduino.ORDER_UNARY_POSTFIX], SQRT2: ["M_SQRT2", Blockly.Arduino.ORDER_UNARY_POSTFIX],
'SQRT1_2': ['M_SQRT1_2', Blockly.Arduino.ORDER_UNARY_POSTFIX], SQRT1_2: ["M_SQRT1_2", Blockly.Arduino.ORDER_UNARY_POSTFIX],
'INFINITY': ['INFINITY', Blockly.Arduino.ORDER_ATOMIC] INFINITY: ["INFINITY", Blockly.Arduino.ORDER_ATOMIC],
}; };
return CONSTANTS[block.getFieldValue('CONSTANT')]; return CONSTANTS[block.getFieldValue("CONSTANT")];
}; };
/** /**
@ -180,58 +192,67 @@ Blockly.Arduino['math_constant'] = 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['math_number_property'] = function (block) { Blockly.Arduino["math_number_property"] = function (block) {
var number_to_check = Blockly.Arduino.valueToCode(block, 'NUMBER_TO_CHECK', var number_to_check =
Blockly.Arduino.ORDER_MULTIPLICATIVE) || '0'; Blockly.Arduino.valueToCode(
var dropdown_property = block.getFieldValue('PROPERTY'); block,
"NUMBER_TO_CHECK",
Blockly.Arduino.ORDER_MULTIPLICATIVE
) || "0";
var dropdown_property = block.getFieldValue("PROPERTY");
var code; var code;
if (dropdown_property === 'PRIME') { if (dropdown_property === "PRIME") {
var func = [ var func = [
'boolean ' + Blockly.Arduino.DEF_FUNC_NAME + '(int n) {', "boolean " + Blockly.Arduino.DEF_FUNC_NAME + "(int n) {",
' // https://en.wikipedia.org/wiki/Primality_test#Naive_methods', " // https://en.wikipedia.org/wiki/Primality_test#Naive_methods",
' if (n == 2 || n == 3) {', " if (n == 2 || n == 3) {",
' return true;', " return true;",
' }', " }",
' // False if n is NaN, negative, is 1.', " // False if n is NaN, negative, is 1.",
' // And false if n is divisible by 2 or 3.', " // And false if n is divisible by 2 or 3.",
' if (isnan(n) || (n <= 1) || (n == 1) || (n % 2 == 0) || ' + " if (isnan(n) || (n <= 1) || (n == 1) || (n % 2 == 0) || " +
'(n % 3 == 0)) {', "(n % 3 == 0)) {",
' return false;', " return false;",
' }', " }",
' // Check all the numbers of form 6k +/- 1, up to sqrt(n).', " // Check all the numbers of form 6k +/- 1, up to sqrt(n).",
' for (int x = 6; x <= sqrt(n) + 1; x += 6) {', " for (int x = 6; x <= sqrt(n) + 1; x += 6) {",
' if (n % (x - 1) == 0 || n % (x + 1) == 0) {', " if (n % (x - 1) == 0 || n % (x + 1) == 0) {",
' return false;', " return false;",
' }', " }",
' }', " }",
' return true;', " return true;",
'}']; "}",
var funcName = Blockly.Arduino.addFunction('mathIsPrime', func.join('\n')); ];
Blockly.Arduino.addInclude('math', '#include <math.h>'); var funcName = Blockly.Arduino.addFunction("mathIsPrime", func.join("\n"));
code = funcName + '(' + number_to_check + ')'; Blockly.Arduino.addInclude("math", "#include <math.h>");
code = funcName + "(" + number_to_check + ")";
return [code, Blockly.Arduino.ORDER_UNARY_POSTFIX]; return [code, Blockly.Arduino.ORDER_UNARY_POSTFIX];
} }
switch (dropdown_property) { switch (dropdown_property) {
case 'EVEN': case "EVEN":
code = number_to_check + ' % 2 == 0'; code = number_to_check + " % 2 == 0";
break; break;
case 'ODD': case "ODD":
code = number_to_check + ' % 2 == 1'; code = number_to_check + " % 2 == 1";
break; break;
case 'WHOLE': case "WHOLE":
Blockly.Arduino.addInclude('math', '#include <math.h>'); Blockly.Arduino.addInclude("math", "#include <math.h>");
code = '(floor(' + number_to_check + ') == ' + number_to_check + ')'; code = "(floor(" + number_to_check + ") == " + number_to_check + ")";
break; break;
case 'POSITIVE': case "POSITIVE":
code = number_to_check + ' > 0'; code = number_to_check + " > 0";
break; break;
case 'NEGATIVE': case "NEGATIVE":
code = number_to_check + ' < 0'; code = number_to_check + " < 0";
break; break;
case 'DIVISIBLE_BY': case "DIVISIBLE_BY":
var divisor = Blockly.Arduino.valueToCode(block, 'DIVISOR', var divisor =
Blockly.Arduino.ORDER_MULTIPLICATIVE) || '0'; Blockly.Arduino.valueToCode(
code = number_to_check + ' % ' + divisor + ' == 0'; block,
"DIVISOR",
Blockly.Arduino.ORDER_MULTIPLICATIVE
) || "0";
code = number_to_check + " % " + divisor + " == 0";
break; break;
default: default:
break; break;
@ -247,19 +268,25 @@ Blockly.Arduino['math_number_property'] = 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['math_change'] = function (block) { Blockly.Arduino["math_change"] = function (block) {
var argument0 = Blockly.Arduino.valueToCode(block, 'DELTA', var argument0 =
Blockly.Arduino.ORDER_ADDITIVE) || '0'; Blockly.Arduino.valueToCode(
block,
"DELTA",
Blockly.Arduino.ORDER_ADDITIVE
) || "0";
var varName = Blockly.Arduino.variableDB_.getName( var varName = Blockly.Arduino.variableDB_.getName(
block.getFieldValue('VAR'), Blockly.Variables.NAME_TYPE); block.getFieldValue("VAR"),
return varName + ' += ' + argument0 + ';\n'; Blockly.Variables.NAME_TYPE
);
return varName + " += " + argument0 + ";\n";
}; };
/** Rounding functions have a single operand. */ /** Rounding functions have a single operand. */
Blockly.Arduino['math_round'] = Blockly.Arduino['math_single']; Blockly.Arduino["math_round"] = Blockly.Arduino["math_single"];
/** Trigonometry functions have a single operand. */ /** Trigonometry functions have a single operand. */
Blockly.Arduino['math_trig'] = Blockly.Arduino['math_single']; Blockly.Arduino["math_trig"] = Blockly.Arduino["math_single"];
/** /**
* Generator for the math function to a list. * Generator for the math function to a list.
@ -268,7 +295,7 @@ Blockly.Arduino['math_trig'] = Blockly.Arduino['math_single'];
* @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['math_on_list'] = Blockly.Arduino.noGeneratorCodeInline; Blockly.Arduino["math_on_list"] = Blockly.Arduino.noGeneratorCodeInline;
/** /**
* Generator for the math modulo function (calculates remainder of X/Y). * Generator for the math modulo function (calculates remainder of X/Y).
@ -276,12 +303,20 @@ Blockly.Arduino['math_on_list'] = Blockly.Arduino.noGeneratorCodeInline;
* @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['math_modulo'] = function (block) { Blockly.Arduino["math_modulo"] = function (block) {
var argument0 = Blockly.Arduino.valueToCode(block, 'DIVIDEND', var argument0 =
Blockly.Arduino.ORDER_MULTIPLICATIVE) || '0'; Blockly.Arduino.valueToCode(
var argument1 = Blockly.Arduino.valueToCode(block, 'DIVISOR', block,
Blockly.Arduino.ORDER_MULTIPLICATIVE) || '0'; "DIVIDEND",
var code = argument0 + ' % ' + argument1; Blockly.Arduino.ORDER_MULTIPLICATIVE
) || "0";
var argument1 =
Blockly.Arduino.valueToCode(
block,
"DIVISOR",
Blockly.Arduino.ORDER_MULTIPLICATIVE
) || "0";
var code = argument0 + " % " + argument1;
return [code, Blockly.Arduino.ORDER_MULTIPLICATIVE]; return [code, Blockly.Arduino.ORDER_MULTIPLICATIVE];
}; };
@ -291,17 +326,33 @@ Blockly.Arduino['math_modulo'] = 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['math_constrain'] = function (block) { Blockly.Arduino["math_constrain"] = function (block) {
// Constrain a number between two limits. // Constrain a number between two limits.
var argument0 = Blockly.Arduino.valueToCode(block, 'VALUE', var argument0 =
Blockly.Arduino.ORDER_NONE) || '0'; Blockly.Arduino.valueToCode(block, "VALUE", Blockly.Arduino.ORDER_NONE) ||
var argument1 = Blockly.Arduino.valueToCode(block, 'LOW', "0";
Blockly.Arduino.ORDER_NONE) || '0'; var argument1 =
var argument2 = Blockly.Arduino.valueToCode(block, 'HIGH', Blockly.Arduino.valueToCode(block, "LOW", Blockly.Arduino.ORDER_NONE) ||
Blockly.Arduino.ORDER_NONE) || '0'; "0";
var code = '(' + argument0 + ' < ' + argument1 + ' ? ' + argument1 + var argument2 =
' : ( ' + argument0 + ' > ' + argument2 + ' ? ' + argument2 + ' : ' + Blockly.Arduino.valueToCode(block, "HIGH", Blockly.Arduino.ORDER_NONE) ||
argument0 + '))'; "0";
var code =
"(" +
argument0 +
" < " +
argument1 +
" ? " +
argument1 +
" : ( " +
argument0 +
" > " +
argument2 +
" ? " +
argument2 +
" : " +
argument0 +
"))";
return [code, Blockly.Arduino.ORDER_UNARY_POSTFIX]; return [code, Blockly.Arduino.ORDER_UNARY_POSTFIX];
}; };
@ -312,28 +363,26 @@ Blockly.Arduino['math_constrain'] = 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['math_random_int'] = function (block) { Blockly.Arduino["math_random_int"] = function (block) {
var argument0 = Blockly.Arduino.valueToCode(block, 'FROM', var argument0 =
Blockly.Arduino.ORDER_NONE) || '0'; Blockly.Arduino.valueToCode(block, "FROM", Blockly.Arduino.ORDER_NONE) ||
var argument1 = Blockly.Arduino.valueToCode(block, 'TO', "0";
Blockly.Arduino.ORDER_NONE) || '0'; var argument1 =
var functionName = Blockly.Arduino.variableDB_.getDistinctName( Blockly.Arduino.valueToCode(block, "TO", Blockly.Arduino.ORDER_NONE) || "0";
'math_random_int', Blockly.Generator.NAME_TYPE); Blockly.Arduino.setupCode_["init_rand"] = "randomSeed(analogRead(0));";
Blockly.Arduino.setups_['init_rand'] = 'randomSeed(analogRead(0));'; Blockly.Arduino.functionNames_[
Blockly.Arduino.math_random_int.random_function = functionName; "math_random_int"
var func = [ ] = `int mathRandomInt (int min, int max) {\n
'int ' + Blockly.Arduino.DEF_FUNC_NAME + '(int min, int max) {', if (min > max) {
' if (min > max) {', int temp = min;
' // Swap min and max to ensure min is smaller.', min = max;
' int temp = min;', max = temp;
' min = max;', }
' max = temp;', return min + (rand() % (max - min + 1));
' }', }
' return min + (rand() % (max - min + 1));', `;
'}']; var code = `mathRandomInt(${argument0},${argument1});`;
var funcName = Blockly.Arduino.addFunction('mathRandomInt', func.join('\n')); return [code, Blockly.Arduino.ORDER_ATOMIC];
var code = funcName + '(' + argument0 + ', ' + argument1 + ')';
return [code, Blockly.Arduino.ORDER_UNARY_POSTFIX];
}; };
/** /**
@ -342,6 +391,6 @@ Blockly.Arduino['math_random_int'] = 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['math_random_float'] = function (block) { Blockly.Arduino["math_random_float"] = function (block) {
return ['(rand() / RAND_MAX)', Blockly.Arduino.ORDER_UNARY_POSTFIX]; return ["(rand() / RAND_MAX)", Blockly.Arduino.ORDER_UNARY_POSTFIX];
}; };

View File

@ -0,0 +1,127 @@
import * as Blockly from "blockly/core";
Blockly.Arduino.sensebox_phyphox_init = function () {
var name = this.getFieldValue("devicename");
Blockly.Arduino.libraries_["phyphox_library"] = `#include <phyphoxBle.h>`;
Blockly.Arduino.libraries_["library_senseBoxMCU"] =
'#include "SenseBoxMCU.h"';
Blockly.Arduino.phyphoxSetupCode_[
"phyphox_start"
] = `PhyphoxBLE::start("${name}");`;
var code = ``;
return code;
};
Blockly.Arduino.sensebox_phyphox_experiment = function () {
var experimentname = "experiment";
var title = this.getFieldValue("title").replace(/[^a-zA-Z0-9]/g, "");
var description = this.getFieldValue("description");
var branch = Blockly.Arduino.statementToCode(this, "view");
Blockly.Arduino.phyphoxSetupCode_[
`PhyphoxBleExperiment_${experimentname}`
] = `PhyphoxBleExperiment ${experimentname};`;
Blockly.Arduino.phyphoxSetupCode_[
`setTitle_${title}`
] = `${experimentname}.setTitle("${title}");`;
Blockly.Arduino.phyphoxSetupCode_[
`setCategory_senseBoxExperiments}`
] = `${experimentname}.setCategory("senseBox Experimente");`;
Blockly.Arduino.phyphoxSetupCode_[
`setDescription_${description}`
] = `${experimentname}.setDescription("${description}");`;
Blockly.Arduino.phyphoxSetupCode_[
`addView_${experimentname}`
] = `PhyphoxBleExperiment::View firstView;\nfirstView.setLabel("Messwerte"); //Create a "view"`;
Blockly.Arduino.phyphoxSetupCode_[`addGraph`] = `${branch}`;
Blockly.Arduino.phyphoxSetupCode_[
`addView_firstview`
] = `${experimentname}.addView(firstView);`; //Attach view to experiment
Blockly.Arduino.phyphoxSetupCode_[
`addExperiment_${experimentname}`
] = `PhyphoxBLE::addExperiment(${experimentname});`; //Attach experiment to server
var code = ``;
return code;
};
Blockly.Arduino["sensebox_phyphox_timestamp"] = function () {
var code = 0;
return [code, Blockly.Arduino.ORDER_ATOMIC];
};
Blockly.Arduino["sensebox_phyphox_channel"] = function () {
var channel = parseFloat(this.getFieldValue("channel"));
var code = channel;
return [code, Blockly.Arduino.ORDER_ATOMIC];
};
Blockly.Arduino.sensebox_phyphox_sendchannel = function (block) {
var channel = this.getFieldValue("channel");
var value =
Blockly.Arduino.valueToCode(this, "value", Blockly.Arduino.ORDER_ATOMIC) ||
"1";
var code = `float channel${channel} = ${value};\n`;
return code;
};
Blockly.Arduino.sensebox_phyphox_graph = function () {
var label = this.getFieldValue("label").replace(/[^a-zA-Z0-9]/g, "");
var unitx = this.getFieldValue("unitx");
var unity = this.getFieldValue("unity");
var labelx = this.getFieldValue("labelx");
var labely = this.getFieldValue("labely");
var style = this.getFieldValue("style");
var channelX =
Blockly.Arduino.valueToCode(
this,
"channel0",
Blockly.Arduino.ORDER_ATOMIC
) || 0;
var channelY =
Blockly.Arduino.valueToCode(
this,
"channel1",
Blockly.Arduino.ORDER_ATOMIC
) || 1;
var code = `PhyphoxBleExperiment::Graph ${label};\n`; //Create graph which will plot random numbers over time
code += `${label}.setLabel("${label}");\n`;
code += `${label}.setUnitX("${unitx}");\n`;
code += `${label}.setUnitY("${unity}");\n`;
code += `${label}.setLabelX("${labelx}");\n`;
code += `${label}.setLabelY("${labely}");\n`;
code += `${label}.setStyle("${style}");\n`;
code += `${label}.setChannel(${channelX}, ${channelY});\n`;
code += `firstView.addElement(${label});\n`;
return code;
};
Blockly.Arduino.sensebox_phyphox_experiment_send = function () {
var branch = Blockly.Arduino.statementToCode(this, "sendValues");
var blocks = this.getDescendants();
console.log(blocks);
var count = 0;
if (blocks !== undefined) {
for (var i = 0; i < blocks.length; i++) {
if (blocks[i].type === "sensebox_phyphox_sendchannel") {
count++;
}
}
}
if (count === 5) {
}
var string = "";
for (var j = 1; j <= count; j++) {
console.log("append");
if (string === "") {
string += `channel${j}`;
} else if (string !== "") {
string += `, channel${j}`;
}
}
Blockly.Arduino.loopCodeOnce_["phyphox_poll"] = `PhyphoxBLE::poll();`;
var code = `${branch}\nPhyphoxBLE::write(${string});`;
return code;
};

View File

@ -1,4 +1,3 @@
const colours = { const colours = {
sensebox: 120, sensebox: 120,
logic: 210, logic: 210,
@ -12,11 +11,10 @@ const colours = {
audio: 250, audio: 250,
arrays: 33, arrays: 33,
mqtt: 90, mqtt: 90,
webserver: 40 webserver: 40,
} phyphox: 25,
};
export const getColour = () => { export const getColour = () => {
return colours; return colours;
}; };

View File

@ -1,29 +1,30 @@
import { AUDIO } from "./de/audio";
import { AUDIO } from './de/audio'; import { BLE } from "./de/sensebox-ble";
import { FAQ } from './de/faq'; import { FAQ } from "./de/faq";
import { IO } from './de/io'; import { IO } from "./de/io";
import { LOGIC } from './de/logic'; import { LOGIC } from "./de/logic";
import { LOOPS } from './de/loops'; import { LOOPS } from "./de/loops";
import { MATH } from './de/math'; import { MATH } from "./de/math";
import { MQTT } from './de/mqtt'; import { MQTT } from "./de/mqtt";
import { DISPLAY } from './de/sensebox-display'; import { DISPLAY } from "./de/sensebox-display";
import { LED } from './de/sensebox-led'; import { LED } from "./de/sensebox-led";
import { LORA } from './de/sensebox-lora'; import { LORA } from "./de/sensebox-lora";
import { OSEM } from './de/sensebox-osem'; import { OSEM } from "./de/sensebox-osem";
import { SD } from './de/sensebox-sd'; import { SD } from "./de/sensebox-sd";
import { SENSORS } from './de/sensebox-sensors'; import { SENSORS } from "./de/sensebox-sensors";
import { TELEGRAM } from './de/sensebox-telegram'; import { TELEGRAM } from "./de/sensebox-telegram";
import { WEB } from './de/sensebox-web'; import { WEB } from "./de/sensebox-web";
import { TEXT } from './de/text'; import { TEXT } from "./de/text";
import { TIME } from './de/time'; import { TIME } from "./de/time";
import { TOURS } from './de/tours'; import { TOURS } from "./de/tours";
import { TRANSLATIONS } from './de/translations'; import { TRANSLATIONS } from "./de/translations";
import { UI } from './de/ui'; import { UI } from "./de/ui";
import { VARIABLES } from './de/variables'; import { VARIABLES } from "./de/variables";
import { WEBSERVER } from './de/webserver'; import { WEBSERVER } from "./de/webserver";
export const De = { export const De = {
...AUDIO, ...AUDIO,
...BLE,
...FAQ, ...FAQ,
...IO, ...IO,
...LOGIC, ...LOGIC,
@ -44,5 +45,5 @@ export const De = {
...TRANSLATIONS, ...TRANSLATIONS,
...UI, ...UI,
...VARIABLES, ...VARIABLES,
...WEBSERVER ...WEBSERVER,
} };

View File

@ -0,0 +1,41 @@
export const BLE = {
/**
* Phyphox Blöcke
*/
sensebox_phyphox_init: "Initialisiere Phyphox Gerät mit Namen:",
sensebox_phyphox_createExperiment: "Erstelle Experiment",
sensebox_phyphox_experimentName: "Name des Experiments",
sensebox_phyphox_experimentTitle: "Titel",
sensebox_phyphox_experimentCategory: "Kategorie",
sensebox_phyphox_experimentDescription: "Beschreibung",
sensebox_phyphox_experiment_description: "Kurze Beschreibung des Experiments",
sensebox_phyphox_writeValues: "Sende Werte",
sensebox_phyphox_createView: "Mit Graphen:",
sensebox_phyphox_createGraph: "Erstelle Graph",
sensebox_phyphox_graphLabel: "",
sensebox_phyphox_unitx: "Einheit x-Achse",
sensebox_phyphox_unity: "Einheit y-Achse",
sensebox_phyphox_labelx: "Beschriftung x-Achse",
sensebox_phyphox_labely: "Beschriftung y-Achse",
sensebox_phyphox_channel0: "Wert x-Achse",
sensebox_phyphox_channel1: "Wert y-Achse",
sensebox_phyphox_style_dots: "Punkte",
sensebox_phyphox_style_line: "Linie",
sensebox_phyphox_timestamp: "Zeitstempel",
sensebox_phyphox_channel: "Kanal",
sensebox_phyphox_sendchannel: "sende an Kanal:",
sensebox_phyphox_graphStyle: "Stil",
sensebox_phyphox_init_tooltip:
"Initialisere das Bluetooth Bee. Stecke diese auf dem Steckplatz **XBEE1**. Gib dem Phphox Messgerät einen eindeutigen Namen, damit du dieses in der App wiederfindest",
sensebox_phyphox_experiment_tooltip:
"Erstelle ein Experiment und vergib einen eindeutigen Namen und eine kurze Beschreibung. Füge bis zu 5 verschiedene Graphen in der Ansicht hinzu. ",
sensebox_phyphox_graph_tooltip:
"Erstellt einen neuen Graph für das Experiment. Gibt die Einheit und Beschriftung für die Achsen an und wähle den Stil der Visualisuerng der Messwerte. Füge an die Schnittstellen für die Werte der X- und Y-Achse den Kanal an auf dem die Messwerte später gesendet werden. Möchtest du einen Zeitstempel über die Phyphox App erstellen lassen verbinde den Block *Zeitstempel*",
sensebox_phyphox_timestamp_tooltip:
"Verwende diesen Block, um einen Zeitstempel über die Phyphox App erstellen zu lassen",
sensebox_phyphox_sendchannel_tooltip:
"Sendet einen Messwert an den ausgewählten Kanal",
sensebox_phyphox_experiment_send_tooltip:
"Sendet die Messwerte an die Phyphox App",
};

View File

@ -6,8 +6,10 @@ export const LED = {
senseBox_ws2818_rgb_led_init: "RGB LED (WS2818) initialisieren", senseBox_ws2818_rgb_led_init: "RGB LED (WS2818) initialisieren",
senseBox_ws2818_rgb_led_position: "Position", senseBox_ws2818_rgb_led_position: "Position",
senseBox_ws2818_rgb_led_brightness: "Helligkeit", senseBox_ws2818_rgb_led_brightness: "Helligkeit",
senseBox_ws2818_rgb_led_tooltip: "Verändere mit diesem Block die Farbe deiner RGB-LED. Verbinde einen Block für die Farbe. Wenn mehrere RGB-LEDs miteinander verkettet werden kannst du über die Position bestimmen welche LED angesteuert wird. ", senseBox_ws2818_rgb_led_tooltip:
senseBox_ws2818_rgb_led_init_tooltip: "Schließe die RGB-LED an einen der drei **digital/analog Ports** an. Wenn mehrere RGB-LEDs miteinander verkettet werden kannst du über die Position bestimmen welche LED angesteuert wird. ", "Verändere mit diesem Block die Farbe deiner RGB-LED. Verbinde einen Block für die Farbe. Wenn mehrere RGB-LEDs miteinander verkettet werden kannst du über die Position bestimmen welche LED angesteuert wird. ",
senseBox_ws2818_rgb_led_init_tooltip:
"Schließe die RGB-LED an einen der drei **digital/analog Ports** an. Wenn mehrere RGB-LEDs miteinander verkettet werden kannst du über die Position bestimmen welche LED angesteuert wird. ",
senseBox_ws2818_rgb_led_color: "Farbe", senseBox_ws2818_rgb_led_color: "Farbe",
senseBox_ws2818_rgb_led_number: "Anzahl", senseBox_ws2818_rgb_led_number: "Anzahl",
@ -20,9 +22,11 @@ export const LED = {
COLOUR_BLEND_HELPURL: "http://meyerweb.com/eric/tools/color-blend/", COLOUR_BLEND_HELPURL: "http://meyerweb.com/eric/tools/color-blend/",
COLOUR_BLEND_RATIO: "im Verhältnis", COLOUR_BLEND_RATIO: "im Verhältnis",
COLOUR_BLEND_TITLE: "mische", COLOUR_BLEND_TITLE: "mische",
COLOUR_BLEND_TOOLTIP: "Vermische 2 Farben mit konfigurierbaren Farbverhältnis (0.0 - 1.0).", COLOUR_BLEND_TOOLTIP:
"Vermische 2 Farben mit konfigurierbaren Farbverhältnis (0.0 - 1.0).",
COLOUR_PICKER_HELPURL: "https://de.wikipedia.org/wiki/Farbe", COLOUR_PICKER_HELPURL: "https://de.wikipedia.org/wiki/Farbe",
COLOUR_PICKER_TOOLTIP: "Wähle eine Farbe aus der Palette. Die Farbe wird automatisch in RGB-Werte konvertiert.", COLOUR_PICKER_TOOLTIP:
"Wähle eine Farbe aus der Palette. Die Farbe wird automatisch in RGB-Werte konvertiert.",
COLOUR_RANDOM_HELPURL: "http://randomcolour.com", // untranslated COLOUR_RANDOM_HELPURL: "http://randomcolour.com", // untranslated
COLOUR_RANDOM_TITLE: "zufällige Farbe", COLOUR_RANDOM_TITLE: "zufällige Farbe",
COLOUR_RANDOM_TOOLTIP: "Erstelle eine Farbe nach dem Zufallsprinzip.", COLOUR_RANDOM_TOOLTIP: "Erstelle eine Farbe nach dem Zufallsprinzip.",
@ -31,6 +35,6 @@ export const LED = {
COLOUR_RGB_HELPURL: "https://de.wikipedia.org/wiki/RGB-Farbraum", COLOUR_RGB_HELPURL: "https://de.wikipedia.org/wiki/RGB-Farbraum",
COLOUR_RGB_RED: "rot", COLOUR_RGB_RED: "rot",
COLOUR_RGB_TITLE: "Farbe mit", COLOUR_RGB_TITLE: "Farbe mit",
COLOUR_RGB_TOOLTIP: "Erstelle eine Farbe mit selbst definierten Rot-, Grün- und Blauwerten. Alle Werte müssen zwischen 0 und 255 liegen. 0 ist hierbei die geringte Intensität der Farbe 255 die höchste.", COLOUR_RGB_TOOLTIP:
"Erstelle eine Farbe mit selbst definierten Rot-, Grün- und Blauwerten. Alle Werte müssen zwischen 0 und 255 liegen. 0 ist hierbei die geringte Intensität der Farbe 255 die höchste.",
} };

View File

@ -1,28 +1,30 @@
import { AUDIO } from './en/audio'; import { AUDIO } from "./en/audio";
import { FAQ } from './en/faq'; import { BLE } from "./en/sensebox-ble";
import { IO } from './en/io'; import { FAQ } from "./en/faq";
import { LOGIC } from './en/logic'; import { IO } from "./en/io";
import { LOOPS } from './en/loops'; import { LOGIC } from "./en/logic";
import { MATH } from './en/math'; import { LOOPS } from "./en/loops";
import { MQTT } from './en/mqtt'; import { MATH } from "./en/math";
import { DISPLAY } from './en/sensebox-display'; import { MQTT } from "./en/mqtt";
import { LED } from './en/sensebox-led'; import { DISPLAY } from "./en/sensebox-display";
import { LORA } from './en/sensebox-lora'; import { LED } from "./en/sensebox-led";
import { OSEM } from './en/sensebox-osem'; import { LORA } from "./en/sensebox-lora";
import { SD } from './en/sensebox-sd'; import { OSEM } from "./en/sensebox-osem";
import { SENSORS } from './en/sensebox-sensors'; import { SD } from "./en/sensebox-sd";
import { TELEGRAM } from './en/sensebox-telegram'; import { SENSORS } from "./en/sensebox-sensors";
import { WEB } from './en/sensebox-web'; import { TELEGRAM } from "./en/sensebox-telegram";
import { TEXT } from './en/text'; import { WEB } from "./en/sensebox-web";
import { TIME } from './en/time'; import { TEXT } from "./en/text";
import { TOURS } from './en/tours'; import { TIME } from "./en/time";
import { TRANSLATIONS } from './en/translations'; import { TOURS } from "./en/tours";
import { UI } from './en/ui'; import { TRANSLATIONS } from "./en/translations";
import { VARIABLES } from './en/variables'; import { UI } from "./en/ui";
import { WEBSERVER } from './en/webserver'; import { VARIABLES } from "./en/variables";
import { WEBSERVER } from "./en/webserver";
export const En = { export const En = {
...AUDIO, ...AUDIO,
...BLE,
...FAQ, ...FAQ,
...IO, ...IO,
...LOGIC, ...LOGIC,
@ -43,5 +45,5 @@ export const En = {
...TRANSLATIONS, ...TRANSLATIONS,
...UI, ...UI,
...VARIABLES, ...VARIABLES,
...WEBSERVER ...WEBSERVER,
} };

View File

@ -0,0 +1,42 @@
export const BLE = {
/**
* Phyphox Init
*/
sensebox_phyphox_init: "Initialise Phyphox device with name:",
sensebox_phyphox_createExperiment: "Create experiment",
sensebox_phyphox_experimentName: "Name of experiment",
sensebox_phyphox_experimentTitle: "Title",
sensebox_phyphox_experimentCategory: "Category",
sensebox_phyphox_experimentDescription: "Description",
sensebox_phyphox_experiment_description:
"Short description of the experiment",
sensebox_phyphox_writeValues: "Send values",
sensebox_phyphox_createView: "With graphs:",
sensebox_phyphox_createGraph: "Create Graph",
sensebox_phyphox_graphLabel: "",
sensebox_phyphox_unitx: "Unit x-axis",
sensebox_phyphox_unity: "Unit y-axis",
sensebox_phyphox_labelx: "Label x-axis",
sensebox_phyphox_labely: "Label y-axis",
sensebox_phyphox_channel0: "x-axis value",
sensebox_phyphox_channel1: "y-axis value",
sensebox_phyphox_style_dots: "Dots",
sensebox_phyphox_style_line: "Line",
sensebox_phyphox_timestamp: "Timestamp",
sensebox_phyphox_channel: "Channel",
sensebox_phyphox_sendchannel: "send to channel:",
sensebox_phyphox_graphStyle: "style",
sensebox_phyphox_init_tooltip:
"Initialise the Bluetooth Bee. Plug it into the **XBEE1** slot. Give the Phphox meter a unique name so you can find it in the app",
sensebox_phyphox_experiment_tooltip:
"Create an experiment and give it a unique name and a short description. Add up to 5 different graphs in the view. ",
sensebox_phyphox_graph_tooltip:
"Creates a new graph for the experiment. Specify the unit and label for the axes and choose the style of visualisation of the measured values. Add to the interfaces for the values of the X- and Y-axis the channel on which the measured values will be sent later. If you want to create a timestamp via the Phyphox app, connect the block *Timestamp*",
sensebox_phyphox_timestamp_tooltip:
"Use this block to have a timestamp created via the Phyphox app",
sensebox_phyphox_sendchannel_tooltip:
"Sends a reading to the selected channel",
sensebox_phyphox_experiment_send_tooltip:
"Sends the measured values to the Phyphox App",
};

View File

@ -1,30 +1,42 @@
import React from 'react'; import React from "react";
import { Block, Value, Field, Shadow, Category } from '../'; import { Block, Value, Field, Shadow, Category } from "../";
import { getColour } from '../helpers/colour' import { getColour } from "../helpers/colour";
import '@blockly/block-plus-minus'; import "@blockly/block-plus-minus";
import { TypedVariableModal } from '@blockly/plugin-typed-variable-modal'; import { TypedVariableModal } from "@blockly/plugin-typed-variable-modal";
import * as Blockly from 'blockly/core'; import * as Blockly from "blockly/core";
class Toolbox extends React.Component { class Toolbox extends React.Component {
componentDidUpdate() { componentDidUpdate() {
this.props.workspace.registerToolboxCategoryCallback('CREATE_TYPED_VARIABLE', this.createFlyout); this.props.workspace.registerToolboxCategoryCallback(
"CREATE_TYPED_VARIABLE",
this.createFlyout
);
const typedVarModal = new TypedVariableModal(this.props.workspace, 'callbackName', [['SHORT_NUMBER', 'char'], ['NUMBER', 'int'], ['DECIMAL', 'float'], ['TEXT', 'String'], ['ARRAY', 'Array'], ['CHARACTER', 'char'], ['BOOLEAN', 'boolean'], ['NULL', 'void'], ['UNDEF', 'undefined']]); const typedVarModal = new TypedVariableModal(
this.props.workspace,
"callbackName",
[
["SHORT_NUMBER", "char"],
["NUMBER", "int"],
["DECIMAL", "float"],
["TEXT", "String"],
["ARRAY", "Array"],
["CHARACTER", "char"],
["BOOLEAN", "boolean"],
["NULL", "void"],
["UNDEF", "undefined"],
]
);
typedVarModal.init(); typedVarModal.init();
} }
createFlyout(workspace) { createFlyout(workspace) {
let xmlList = []; let xmlList = [];
// Add your button and give it a callback name. // Add your button and give it a callback name.
const button = document.createElement('button'); const button = document.createElement("button");
button.setAttribute('text', 'Create Typed Variable'); button.setAttribute("text", "Create Typed Variable");
button.setAttribute('callbackKey', 'callbackName'); button.setAttribute("callbackKey", "callbackName");
xmlList.push(button); xmlList.push(button);
@ -33,12 +45,20 @@ class Toolbox extends React.Component {
const blockList = Blockly.VariablesDynamic.flyoutCategoryBlocks(workspace); const blockList = Blockly.VariablesDynamic.flyoutCategoryBlocks(workspace);
xmlList = xmlList.concat(blockList); xmlList = xmlList.concat(blockList);
return xmlList; return xmlList;
}; }
render() { render() {
return ( return (
<xml xmlns="https://developers.google.com/blockly/xml" id="blockly" style={{ display: 'none' }} ref={this.props.toolbox}> <xml
<Category name={Blockly.Msg.toolbox_sensors} colour={getColour().sensebox}> xmlns="https://developers.google.com/blockly/xml"
id="blockly"
style={{ display: "none" }}
ref={this.props.toolbox}
>
<Category
name={Blockly.Msg.toolbox_sensors}
colour={getColour().sensebox}
>
<Block type="sensebox_sensor_temp_hum" /> <Block type="sensebox_sensor_temp_hum" />
<Block type="sensebox_sensor_uv_light" /> <Block type="sensebox_sensor_uv_light" />
<Block type="sensebox_sensor_bmx055_accelerometer" /> <Block type="sensebox_sensor_bmx055_accelerometer" />
@ -54,7 +74,7 @@ class Toolbox extends React.Component {
<Block type="sensebox_sensor_watertemperature" /> <Block type="sensebox_sensor_watertemperature" />
{/* <Block type="sensebox_windspeed" /> */} {/* <Block type="sensebox_windspeed" /> */}
<Block type="sensebox_soundsensor_dfrobot" /> <Block type="sensebox_soundsensor_dfrobot" />
</Category > </Category>
<Category name="WIFI" colour={getColour().sensebox}> <Category name="WIFI" colour={getColour().sensebox}>
<Block type="sensebox_wifi" /> <Block type="sensebox_wifi" />
<Block type="sensebox_startap" /> <Block type="sensebox_startap" />
@ -157,19 +177,16 @@ class Toolbox extends React.Component {
<Field name="TEXT">Unit</Field> <Field name="TEXT">Unit</Field>
</Block> </Block>
</Value> </Value>
</Block > </Block>
<Block type="sensebox_display_plotDisplay"> <Block type="sensebox_display_plotDisplay">
<Value name="Title"> <Value name="Title">
<Block type="text"> <Block type="text"></Block>
</Block>
</Value> </Value>
<Value name="YLabel"> <Value name="YLabel">
<Block type="text"> <Block type="text"></Block>
</Block>
</Value> </Value>
<Value name="XLabel"> <Value name="XLabel">
<Block type="text"> <Block type="text"></Block>
</Block>
</Value> </Value>
<Value name="XRange1"> <Value name="XRange1">
<Block type="math_number"> <Block type="math_number">
@ -261,16 +278,32 @@ class Toolbox extends React.Component {
</Block> </Block>
<Block type="sensebox_send_to_osem" /> <Block type="sensebox_send_to_osem" />
</Category> </Category>
<Category id="catSenseBoxOutput_LoRa" name=" LoRa" colour={getColour().sensebox}> <Category
<Category id="catSenseBoxOutput_LoRa_activation" name=" Aktivierung" colour={getColour().sensebox}> id="catSenseBoxOutput_LoRa"
name=" LoRa"
colour={getColour().sensebox}
>
<Category
id="catSenseBoxOutput_LoRa_activation"
name=" Aktivierung"
colour={getColour().sensebox}
>
<Block type="sensebox_lora_initialize_otaa" /> <Block type="sensebox_lora_initialize_otaa" />
<Block type="sensebox_lora_initialize_abp" /> <Block type="sensebox_lora_initialize_abp" />
</Category> </Category>
<Category id="catSenseBoxOutput_LoRa_loramessage" name=" Lora Message" colour={getColour().sensebox}> <Category
id="catSenseBoxOutput_LoRa_loramessage"
name=" Lora Message"
colour={getColour().sensebox}
>
<Block type="sensebox_lora_message_send" /> <Block type="sensebox_lora_message_send" />
<Block type="sensebox_send_lora_sensor_value" /> <Block type="sensebox_send_lora_sensor_value" />
</Category> </Category>
<Category id="catSenseBoxOutput_Map" name=" TTN Mapper" colour={getColour().sensebox}> <Category
id="catSenseBoxOutput_Map"
name=" TTN Mapper"
colour={getColour().sensebox}
>
<Block type="sensebox_lora_ttn_mapper"> <Block type="sensebox_lora_ttn_mapper">
<Value name="Latitude"> <Value name="Latitude">
<Block type="sensebox_gps"> <Block type="sensebox_gps">
@ -299,7 +332,11 @@ class Toolbox extends React.Component {
</Value> </Value>
</Block> </Block>
</Category> </Category>
<Category id="catSenseBoxOutput_LoRa_cayenne" name=" Cayenne LPP" colour={getColour().sensebox}> <Category
id="catSenseBoxOutput_LoRa_cayenne"
name=" Cayenne LPP"
colour={getColour().sensebox}
>
<Block type="sensebox_lora_cayenne_send" /> <Block type="sensebox_lora_cayenne_send" />
<Block type="sensebox_lora_cayenne_temperature" /> <Block type="sensebox_lora_cayenne_temperature" />
<Block type="sensebox_lora_cayenne_humidity" /> <Block type="sensebox_lora_cayenne_humidity" />
@ -310,7 +347,35 @@ class Toolbox extends React.Component {
<Block type="sensebox_lora_cayenne_gps" /> <Block type="sensebox_lora_cayenne_gps" />
</Category> </Category>
</Category> </Category>
<Category id="webserver" name="Webserver" colour={getColour().webserver}> <Category id="phyphox" name="Phyphox" colour={getColour().phyphox}>
<Block type="sensebox_phyphox_init"></Block>
<Block type="sensebox_phyphox_experiment">
<Value name="view">
<Block type="sensebox_phyphox_graph">
<Value name="channel0">
<Block type="sensebox_phyphox_timestamp"></Block>
</Value>
<Value name="channel1">
<Block type="sensebox_phyphox_channel"></Block>
</Value>
</Block>
</Value>
</Block>
<Block type="sensebox_phyphox_experiment_send">
<Value name="sendValues">
<Block type="sensebox_phyphox_sendchannel"></Block>
</Value>
</Block>
<Block type="sensebox_phyphox_graph"></Block>
<Block type="sensebox_phyphox_timestamp"></Block>
<Block type="sensebox_phyphox_channel"></Block>
<Block type="sensebox_phyphox_sendchannel"></Block>
</Category>
<Category
id="webserver"
name="Webserver"
colour={getColour().webserver}
>
<Block type="sensebox_initialize_http_server"></Block> <Block type="sensebox_initialize_http_server"></Block>
<Block type="sensebox_http_on_client_connect"></Block> <Block type="sensebox_http_on_client_connect"></Block>
<Block type="sensebox_ip_address"></Block> <Block type="sensebox_ip_address"></Block>
@ -338,7 +403,11 @@ class Toolbox extends React.Component {
<Block type="logic_boolean" /> <Block type="logic_boolean" />
<Block type="switch_case" /> <Block type="switch_case" />
</Category> </Category>
<Category id="loops" name={Blockly.Msg.toolbox_loops} colour={getColour().loops}> <Category
id="loops"
name={Blockly.Msg.toolbox_loops}
colour={getColour().loops}
>
<Block type="controls_repeat_ext"> <Block type="controls_repeat_ext">
<Value name="TIMES"> <Value name="TIMES">
<Block type="math_number"> <Block type="math_number">
@ -353,13 +422,13 @@ class Toolbox extends React.Component {
<Field name="NUM">1</Field> <Field name="NUM">1</Field>
</Block> </Block>
</Value> </Value>
<Value name="TO" > <Value name="TO">
<Block type="math_number" > <Block type="math_number">
<Field name="NUM">10</Field> <Field name="NUM">10</Field>
</Block> </Block>
</Value> </Value>
<Value name="BY" > <Value name="BY">
<Block Type="math_number" > <Block Type="math_number">
<Field name="NUM">1</Field> <Field name="NUM">1</Field>
</Block> </Block>
</Value> </Value>
@ -377,7 +446,11 @@ class Toolbox extends React.Component {
<Block type="text_length" /> <Block type="text_length" />
<Block type="text_isEmpty" /> <Block type="text_isEmpty" />
</Category> </Category>
<Category id="time" name={Blockly.Msg.toolbox_time} colour={getColour().time}> <Category
id="time"
name={Blockly.Msg.toolbox_time}
colour={getColour().time}
>
<Block type="time_delay"> <Block type="time_delay">
<Value name="DELAY_TIME_MILI"> <Value name="DELAY_TIME_MILI">
<Block type="math_number"> <Block type="math_number">
@ -397,7 +470,11 @@ class Toolbox extends React.Component {
<Block type="infinite_loop"></Block> <Block type="infinite_loop"></Block>
<Block type="sensebox_interval_timer"></Block> <Block type="sensebox_interval_timer"></Block>
</Category> </Category>
<Category id="math" name={Blockly.Msg.toolbox_math} colour={getColour().math}> <Category
id="math"
name={Blockly.Msg.toolbox_math}
colour={getColour().math}
>
<Block type="math_number"></Block> <Block type="math_number"></Block>
<Block type="math_arithmetic"></Block> <Block type="math_arithmetic"></Block>
<Block type="math_single"></Block> <Block type="math_single"></Block>
@ -450,13 +527,21 @@ class Toolbox extends React.Component {
</Block> </Block>
<Block type="io_notone"></Block> <Block type="io_notone"></Block>
</Category> </Category>
<Category name={Blockly.Msg.toolbox_variables} colour={getColour().variables} custom="CREATE_TYPED_VARIABLE"></Category> <Category
<Category name="Arrays" colour={getColour().arrays} > name={Blockly.Msg.toolbox_variables}
colour={getColour().variables}
custom="CREATE_TYPED_VARIABLE"
></Category>
<Category name="Arrays" colour={getColour().arrays}>
<Block type="lists_create_empty" /> <Block type="lists_create_empty" />
<Block type="array_getIndex" /> <Block type="array_getIndex" />
<Block type="lists_length" /> <Block type="lists_length" />
</Category> </Category>
<Category name={Blockly.Msg.toolbox_functions} colour={getColour().procedures} custom="PROCEDURE"></Category> <Category
name={Blockly.Msg.toolbox_functions}
colour={getColour().procedures}
custom="PROCEDURE"
></Category>
<sep></sep> <sep></sep>
<Category name={Blockly.Msg.toolbox_io} colour={getColour().io}> <Category name={Blockly.Msg.toolbox_io} colour={getColour().io}>
<Block type="io_digitalwrite"></Block> <Block type="io_digitalwrite"></Block>
@ -489,7 +574,7 @@ class Toolbox extends React.Component {
*/} */}
</xml> </xml>
); );
}; }
} }
export default Toolbox; export default Toolbox;