add new blocks
This commit is contained in:
@@ -0,0 +1,65 @@
|
||||
import Blockly from 'blockly/core';
|
||||
import { selectedBoard } from '../helpers/board'
|
||||
import * as Types from '../helpers/types'
|
||||
import { getColour } from '../helpers/colour';
|
||||
|
||||
|
||||
Blockly.Blocks['io_tone'] = {
|
||||
init: function () {
|
||||
this.appendDummyInput()
|
||||
.appendField(Blockly.Msg.ARD_SETTONE)
|
||||
.appendField(new Blockly.FieldDropdown(
|
||||
selectedBoard().digitalPins), "TONEPIN");
|
||||
this.appendValueInput("FREQUENCY")
|
||||
.setCheck(Types.NUMBER.checkList)
|
||||
.appendField(Blockly.Msg.ARD_TONEFREQ);
|
||||
this.appendDummyInput()
|
||||
.appendField("Hz");
|
||||
this.setInputsInline(true);
|
||||
this.setPreviousStatement(true);
|
||||
this.setNextStatement(true);
|
||||
this.setColour(getColour().audio);
|
||||
this.setTooltip(Blockly.Msg.ARD_TONE_TIP);
|
||||
this.setHelpUrl('https://www.arduino.cc/en/Reference/tone');
|
||||
},
|
||||
/**
|
||||
* Called whenever anything on the workspace changes.
|
||||
* It checks frequency values and sets a warning if out of range.
|
||||
* @this Blockly.Block
|
||||
*/
|
||||
onchange: function (event) {
|
||||
if (!this.workspace || event.type === Blockly.Events.MOVE ||
|
||||
event.type === Blockly.Events.UI) {
|
||||
return; // Block deleted or irrelevant event
|
||||
}
|
||||
var freq = Blockly.Arduino.valueToCode(
|
||||
this, "FREQUENCY", Blockly.Arduino.ORDER_ATOMIC)
|
||||
if (freq < 31 || freq > 65535) {
|
||||
this.setWarningText(Blockly.Msg.ARD_TONE_WARNING, 'io_tone');
|
||||
} else {
|
||||
this.setWarningText(null, 'io_tone');
|
||||
}
|
||||
},
|
||||
/** @return {!string} The type of input value for the block, an integer. */
|
||||
getBlockType: function () {
|
||||
return Blockly.Types.NUMBER;
|
||||
}
|
||||
};
|
||||
|
||||
Blockly.Blocks['io_notone'] = {
|
||||
init: function () {
|
||||
this.appendDummyInput()
|
||||
.appendField(Blockly.Msg.ARD_NOTONE)
|
||||
.appendField(new Blockly.FieldDropdown(
|
||||
selectedBoard().digitalPins), "TONEPIN");
|
||||
this.setPreviousStatement(true);
|
||||
this.setNextStatement(true);
|
||||
this.setColour(getColour().audio);
|
||||
this.setTooltip(Blockly.Msg.ARD_NOTONE_TIP);
|
||||
this.setHelpUrl('https://www.arduino.cc/en/Reference/noTone');
|
||||
},
|
||||
/** @return {!string} The type of input value for the block, an integer. */
|
||||
getBlockType: function () {
|
||||
return Blockly.Types.NUMBER;
|
||||
}
|
||||
};
|
||||
@@ -8,11 +8,14 @@ import './sensebox-web';
|
||||
import './sensebox-display';
|
||||
import './sensebox-lora';
|
||||
import './sensebox-led';
|
||||
import './sensebox-sd';
|
||||
import './text';
|
||||
import './io';
|
||||
import './audio';
|
||||
import './math';
|
||||
import './map';
|
||||
import './procedures';
|
||||
import './time';
|
||||
|
||||
import './variables';
|
||||
|
||||
import '../helpers/types'
|
||||
@@ -1,6 +1,5 @@
|
||||
import Blockly from 'blockly/core';
|
||||
|
||||
|
||||
import { getColour } from '../helpers/colour';
|
||||
|
||||
|
||||
Blockly.defineBlocksWithJsonArray([ // BEGIN JSON EXTRACT
|
||||
@@ -232,4 +231,169 @@ Blockly.defineBlocksWithJsonArray([ // Mutator blocks. Do not extract.
|
||||
]);
|
||||
|
||||
|
||||
Blockly.Blocks['switch_case'] = {
|
||||
init: function () {
|
||||
this.setColour(getColour().logic);
|
||||
this.setPreviousStatement(true);
|
||||
this.setNextStatement(true);
|
||||
this.appendValueInput('CONDITION')
|
||||
.appendField(Blockly.Msg.cases_switch);
|
||||
this.appendValueInput('CASECONDITION0')
|
||||
.appendField(Blockly.Msg.cases_condition);
|
||||
this.appendStatementInput('CASE0')
|
||||
.appendField(Blockly.Msg.cases_do);
|
||||
this.setMutator(new Blockly.Mutator(['case_incaseof', 'case_default']));
|
||||
this.setTooltip('Does something if the condition is true. If there isn\'t a matching case the default function will be executed.');
|
||||
this.caseCount_ = 0;
|
||||
this.defaultCount_ = 0;
|
||||
},
|
||||
|
||||
mutationToDom: function () {
|
||||
if (!this.caseCount_ && !this.defaultCount_) {
|
||||
return null;
|
||||
}
|
||||
var container = document.createElement('mutation');
|
||||
if (this.caseCount_) {
|
||||
container.setAttribute('case', this.caseCount_);
|
||||
}
|
||||
if (this.defaultCount_) {
|
||||
container.setAttribute('default', 1);
|
||||
}
|
||||
return container;
|
||||
},
|
||||
|
||||
domToMutation: function (xmlElement) {
|
||||
this.caseCount_ = parseInt(xmlElement.getAttribute('case'), 10);
|
||||
this.defaultCount_ = parseInt(xmlElement.getAttribute('default'), 10);
|
||||
for (var x = 0; x <= this.caseCount_; x++) {
|
||||
this.appendValueInput('CASECONDITION' + x)
|
||||
.appendField(Blockly.Msg.cases_condition);
|
||||
this.appendStatementInput('CASE' + x)
|
||||
.appendField(Blockly.Msg.cases_do);
|
||||
}
|
||||
if (this.defaultCount_) {
|
||||
this.appendStatementInput('ONDEFAULT')
|
||||
.appendField('default');
|
||||
}
|
||||
},
|
||||
|
||||
decompose: function (workspace) {
|
||||
var containerBlock = workspace.newBlock('control_case');
|
||||
containerBlock.initSvg();
|
||||
var connection = containerBlock.getInput('STACK').connection;
|
||||
for (var x = 1; x <= this.caseCount_; x++) {
|
||||
var caseBlock = workspace.newBlock('case_incaseof');
|
||||
caseBlock.initSvg();
|
||||
connection.connect(caseBlock.previousConnection);
|
||||
connection = caseBlock.nextConnection;
|
||||
}
|
||||
if (this.defaultCount_) {
|
||||
var defaultBlock = Blockly.Block.obtain(workspace, 'case_default');
|
||||
defaultBlock.initSvg();
|
||||
connection.connect(defaultBlock.previousConnection);
|
||||
}
|
||||
return containerBlock;
|
||||
},
|
||||
|
||||
compose: function (containerBlock) {
|
||||
//Disconnect all input blocks and remove all inputs.
|
||||
if (this.defaultCount_) {
|
||||
this.removeInput('ONDEFAULT');
|
||||
}
|
||||
this.defaultCount_ = 0;
|
||||
for (var x = this.caseCount_; x > 0; x--) {
|
||||
this.removeInput('CASECONDITION' + x);
|
||||
this.removeInput('CASE' + x);
|
||||
}
|
||||
this.caseCount_ = 0;
|
||||
var caseBlock = containerBlock.getInputTargetBlock('STACK');
|
||||
while (caseBlock) {
|
||||
switch (caseBlock.type) {
|
||||
case 'case_incaseof':
|
||||
this.caseCount_++;
|
||||
var caseconditionInput = this.appendValueInput('CASECONDITION' + this.caseCount_)
|
||||
.appendField(Blockly.Msg.cases_condition);
|
||||
var caseInput = this.appendStatementInput('CASE' + this.caseCount_)
|
||||
.appendField(Blockly.Msg.cases_do);
|
||||
if (caseBlock.valueConnection_) {
|
||||
caseconditionInput.connection.connect(caseBlock.valueConnection_);
|
||||
}
|
||||
if (caseBlock.statementConnection_) {
|
||||
caseInput.connection.connect(caseBlock.statementConnection_);
|
||||
}
|
||||
break;
|
||||
case 'case_default':
|
||||
this.defaultCount_++;
|
||||
var defaultInput = this.appendStatementInput('ONDEFAULT')
|
||||
.appendField('default');
|
||||
if (caseBlock.statementConnection_) {
|
||||
defaultInput.connection.connect(caseBlock.statementConnection_);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
throw 'Unknown block type.';
|
||||
}
|
||||
caseBlock = caseBlock.nextConnection &&
|
||||
caseBlock.nextConnection.targetBlock();
|
||||
}
|
||||
},
|
||||
|
||||
saveConnections: function (containerBlock) {
|
||||
var caseBlock = containerBlock.getInputTargetBlock('STACK');
|
||||
var x = 1;
|
||||
while (caseBlock) {
|
||||
switch (caseBlock.type) {
|
||||
case 'case_incaseof':
|
||||
var caseconditionInput = this.getInput('CASECONDITION' + x);
|
||||
var caseInput = this.getInput('CASE' + x);
|
||||
caseBlock.valueConnection_ = caseconditionInput && caseconditionInput.connection.targetConnection;
|
||||
caseBlock.statementConnection_ = caseInput && caseInput.connection.targetConnection;
|
||||
x++;
|
||||
break;
|
||||
case 'case_default':
|
||||
var defaultInput = this.getInput('ONDEFAULT');
|
||||
caseBlock.satementConnection_ = defaultInput && defaultInput.connection.targetConnection;
|
||||
break;
|
||||
default:
|
||||
throw 'Unknown block type';
|
||||
}
|
||||
caseBlock = caseBlock.nextConnection &&
|
||||
caseBlock.nextConnection.targetBlock();
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
Blockly.Blocks['control_case'] = {
|
||||
init: function () {
|
||||
this.setColour(getColour().logic);
|
||||
this.appendDummyInput()
|
||||
.appendField(Blockly.Msg.cases_switch);
|
||||
this.appendStatementInput('STACK');
|
||||
this.setTooltip('--Placeholder--');
|
||||
this.contextMenu = false;
|
||||
}
|
||||
};
|
||||
|
||||
Blockly.Blocks['case_incaseof'] = {
|
||||
init: function () {
|
||||
this.setColour(getColour().logic);
|
||||
this.appendDummyInput()
|
||||
.appendField(Blockly.Msg.cases_add);
|
||||
this.setPreviousStatement(true);
|
||||
this.setNextStatement(true);
|
||||
this.setTooltip('--Placeholder--');
|
||||
this.contextMenu = false;
|
||||
}
|
||||
};
|
||||
|
||||
Blockly.Blocks['case_default'] = {
|
||||
init: function () {
|
||||
this.setColour(getColour().logic);
|
||||
this.appendValueInput('default')
|
||||
.appendField('default');
|
||||
this.setPreviousStatement(true);
|
||||
this.setNextStatement(false);
|
||||
this.setTooltip('This function will run if there aren\'t any matching cases.');
|
||||
this.contextMenu = false;
|
||||
}
|
||||
};
|
||||
|
||||
@@ -2,7 +2,6 @@ import * as Blockly from 'blockly/core';
|
||||
import { getColour } from '../helpers/colour';
|
||||
import * as Types from '../helpers/types'
|
||||
import { FieldSlider } from '@blockly/field-slider';
|
||||
import { Field } from '..';
|
||||
|
||||
|
||||
Blockly.Blocks['sensebox_display_beginDisplay'] = {
|
||||
|
||||
@@ -0,0 +1,80 @@
|
||||
import * as Blockly from 'blockly/core';
|
||||
import { getColour } from '../helpers/colour';
|
||||
|
||||
|
||||
Blockly.Blocks['sensebox_sd_open_file'] = {
|
||||
init: function () {
|
||||
this.appendDummyInput()
|
||||
.appendField(Blockly.Msg.senseBox_sd_open_file)
|
||||
.setAlign(Blockly.ALIGN_LEFT)
|
||||
.appendField(
|
||||
new Blockly.FieldTextInput('Data.txt'),
|
||||
'Filename');
|
||||
this.appendStatementInput('SD')
|
||||
.setCheck(null);
|
||||
this.setPreviousStatement(true, null);
|
||||
this.setNextStatement(true, null);
|
||||
this.setColour(getColour().sensebox);
|
||||
this.setTooltip(Blockly.Msg.senseBox_output_safetosd_tip);
|
||||
this.setHelpUrl('https://sensebox.de/books');
|
||||
}
|
||||
};
|
||||
|
||||
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_output_safetosd_tip);
|
||||
this.setHelpUrl('https://sensebox.de/books');
|
||||
}
|
||||
};
|
||||
|
||||
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_output_safetosd_tip);
|
||||
this.setHelpUrl('https://sensebox.de/books');
|
||||
},
|
||||
/**
|
||||
* 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'],
|
||||
};
|
||||
@@ -0,0 +1 @@
|
||||
|
||||
@@ -0,0 +1,167 @@
|
||||
import Blockly from 'blockly/core';
|
||||
import { getColour } from '../helpers/colour';
|
||||
|
||||
Blockly.defineBlocksWithJsonArray([
|
||||
// BEGIN JSON EXTRACT
|
||||
{
|
||||
type: 'variables_get_number',
|
||||
message0: '= number variable %1',
|
||||
args0: [
|
||||
{
|
||||
type: 'field_variable',
|
||||
name: 'VAR',
|
||||
variable: null,
|
||||
variableTypes: ['Number'],
|
||||
defaultType: 'Number',
|
||||
},
|
||||
],
|
||||
output: 'Number',
|
||||
colour: getColour().variables,
|
||||
tooltip: '',
|
||||
helpUrl: '',
|
||||
},
|
||||
{
|
||||
type: 'variables_set_number',
|
||||
message0: 'Number variable %1 = %2',
|
||||
args0: [
|
||||
{
|
||||
type: 'field_variable',
|
||||
name: 'VAR',
|
||||
variable: null,
|
||||
variableTypes: ['Number'],
|
||||
defaultType: 'Number',
|
||||
createNewVariable: false,
|
||||
},
|
||||
{
|
||||
type: 'input_value',
|
||||
name: 'VALUE',
|
||||
check: 'Number',
|
||||
},
|
||||
],
|
||||
previousStatement: null,
|
||||
nextStatement: null,
|
||||
colour: getColour().variables,
|
||||
tooltip: '',
|
||||
helpUrl: '',
|
||||
},
|
||||
{
|
||||
type: 'variables_get_colour',
|
||||
message0: '= color variable %1',
|
||||
args0: [
|
||||
{
|
||||
type: 'field_variable',
|
||||
name: 'VAR',
|
||||
variable: null,
|
||||
variableTypes: ['Colour'],
|
||||
defaultType: 'Colour',
|
||||
},
|
||||
],
|
||||
output: 'Colour',
|
||||
colour: getColour().variables,
|
||||
tooltip: '',
|
||||
helpUrl: '',
|
||||
},
|
||||
{
|
||||
type: 'variables_set_colour',
|
||||
message0: 'Color variable %1 = %2',
|
||||
args0: [
|
||||
{
|
||||
type: 'field_variable',
|
||||
name: 'VAR',
|
||||
variable: null,
|
||||
variableTypes: ['Colour'],
|
||||
defaultType: 'Colour',
|
||||
},
|
||||
{
|
||||
type: 'input_value',
|
||||
name: 'VALUE',
|
||||
check: 'Colour',
|
||||
},
|
||||
],
|
||||
previousStatement: null,
|
||||
nextStatement: null,
|
||||
colour: getColour().variables,
|
||||
tooltip: '',
|
||||
helpUrl: '',
|
||||
},
|
||||
{
|
||||
type: 'variables_get_string',
|
||||
message0: '= text variable %1',
|
||||
args0: [
|
||||
{
|
||||
type: 'field_variable',
|
||||
name: 'VAR',
|
||||
variable: null,
|
||||
variableTypes: ['String'],
|
||||
defaultType: 'String',
|
||||
},
|
||||
],
|
||||
output: 'String',
|
||||
colour: getColour().variables,
|
||||
tooltip: '',
|
||||
helpUrl: '',
|
||||
},
|
||||
{
|
||||
type: 'variables_set_string',
|
||||
message0: 'Text variable %1 = %2',
|
||||
args0: [
|
||||
{
|
||||
type: 'field_variable',
|
||||
name: 'VAR',
|
||||
variable: null,
|
||||
variableTypes: ['String'],
|
||||
defaultType: 'String',
|
||||
},
|
||||
{
|
||||
type: 'input_value',
|
||||
name: 'VALUE',
|
||||
check: 'String',
|
||||
},
|
||||
],
|
||||
previousStatement: null,
|
||||
nextStatement: null,
|
||||
colour: getColour().variables,
|
||||
tooltip: '',
|
||||
helpUrl: '',
|
||||
},
|
||||
{
|
||||
type: 'variables_get_boolean',
|
||||
message0: '= boolean variable %1',
|
||||
args0: [
|
||||
{
|
||||
type: 'field_variable',
|
||||
name: 'VAR',
|
||||
variable: null,
|
||||
variableTypes: ['Boolean'],
|
||||
defaultType: 'Boolean',
|
||||
},
|
||||
],
|
||||
output: 'Boolean',
|
||||
colour: getColour().variables,
|
||||
tooltip: '',
|
||||
helpUrl: '',
|
||||
},
|
||||
{
|
||||
type: 'variables_set_boolean',
|
||||
message0: 'Boolean variable %1 = %2',
|
||||
args0: [
|
||||
{
|
||||
type: 'field_variable',
|
||||
name: 'VAR',
|
||||
variable: null,
|
||||
variableTypes: ['Boolean'],
|
||||
defaultType: 'Boolean',
|
||||
},
|
||||
{
|
||||
type: 'input_value',
|
||||
name: 'VALUE',
|
||||
check: 'Boolean',
|
||||
},
|
||||
],
|
||||
previousStatement: null,
|
||||
nextStatement: null,
|
||||
colour: getColour().variables,
|
||||
tooltip: '',
|
||||
helpUrl: '',
|
||||
},
|
||||
]); // END JSON EXTRACT (Do not delete this comment.)
|
||||
Reference in New Issue
Block a user