/** * @license Licensed under the Apache License, Version 2.0 (the "License"): * http://www.apache.org/licenses/LICENSE-2.0 */ /** * @fileoverview Blocks for Arduino Digital and Analogue input and output * functions. The Arduino function syntax can be found at * http://arduino.cc/en/Reference/HomePage * * TODO: maybe change this to a "PIN" BlocklyType */ import Blockly from "blockly/core"; import { selectedBoard } from "../helpers/board"; import * as Types from "../helpers/types"; Blockly.Blocks["io_digitalwrite"] = { /** * Block for creating a 'set pin' to a state. * @this Blockly.Block */ init: function () { this.setHelpUrl("http://arduino.cc/en/Reference/DigitalWrite"); this.setColour(250); this.appendValueInput("STATE") .appendField(Blockly.Msg.ARD_DIGITALWRITE) .appendField( new Blockly.FieldDropdown(selectedBoard().digitalPins), "PIN" ) .appendField(Blockly.Msg.ARD_WRITE_TO) .setCheck(Types.BOOLEAN.checkList); this.setInputsInline(false); this.setPreviousStatement(true, null); this.setNextStatement(true, null); this.setTooltip(Blockly.Msg.ARD_DIGITALWRITE_TIP); }, /** * Updates the content of the the pin related fields. * @this Blockly.Block */ updateFields: function () { Blockly.Arduino.Boards.refreshBlockFieldDropdown( this, "PIN", "digitalPins" ); }, }; Blockly.Blocks["io_digitalread"] = { /** * Block for creating a 'read pin'. * @this Blockly.Block */ init: function () { this.setHelpUrl("http://arduino.cc/en/Reference/DigitalRead"); this.setColour(250); this.appendDummyInput() .appendField(Blockly.Msg.ARD_DIGITALREAD) .appendField( new Blockly.FieldDropdown(selectedBoard().digitalPins), "PIN" ); this.setOutput(true, "boolean"); this.setTooltip(Blockly.Msg.ARD_DIGITALREAD_TIP); }, /** @return {!string} The type of return value for the block, an integer. */ getBlockType: function () { return Types.BOOLEAN; }, /** * Updates the content of the the pin related fields. * @this Blockly.Block */ updateFields: function () { Blockly.Arduino.Boards.refreshBlockFieldDropdown( this, "PIN", "digitalPins" ); }, }; Blockly.Blocks["io_builtin_led"] = { /** * Block for setting built-in LED to a state. * @this Blockly.Block */ init: function () { this.setHelpUrl("http://arduino.cc/en/Reference/DigitalWrite"); this.setColour(250); this.appendValueInput("STATE") .appendField(Blockly.Msg.ARD_BUILTIN_LED) .appendField( new Blockly.FieldDropdown(selectedBoard().builtinLed), "BUILT_IN_LED" ) .appendField(Blockly.Msg.ARD_WRITE_TO) .setCheck(Types.BOOLEAN.compatibleTypes); this.setInputsInline(false); this.setPreviousStatement(true, null); this.setNextStatement(true, null); this.setTooltip(Blockly.Msg.ARD_BUILTIN_LED_TIP); }, /** * Updates the content of the the pin related fields. * @this Blockly.Block */ updateFields: function () { Blockly.Arduino.Boards.refreshBlockFieldDropdown( this, "BUILT_IN_LED", "builtinLed" ); }, /** @return {!string} The type of input value for the block, an integer. */ getBlockType: function () { return Types.BOOLEAN; }, }; Blockly.Blocks["io_analogwrite"] = { /** * Block for creating a 'set pin' to an analogue value. * @this Blockly.Block */ init: function () { this.setHelpUrl("http://arduino.cc/en/Reference/AnalogWrite"); this.setColour(250); this.appendValueInput("NUM") .appendField(Blockly.Msg.ARD_ANALOGWRITE) .appendField(new Blockly.FieldDropdown(selectedBoard().pwmPins), "PIN") .appendField(Blockly.Msg.ARD_WRITE_TO) .setCheck(Types.NUMBER.compatibleTypes); this.setInputsInline(false); this.setPreviousStatement(true, null); this.setNextStatement(true, null); this.setTooltip(Blockly.Msg.ARD_ANALOGWRITE_TIP); }, /** * Updates the content of the the pin related fields. * @this Blockly.Block */ updateFields: function () { Blockly.Arduino.Boards.refreshBlockFieldDropdown(this, "PIN", "pwmPins"); }, /** @return {!string} The type of input value for the block, an integer. */ getBlockType: function () { return Types.NUMBER; }, }; Blockly.Blocks["io_analogread"] = { /** * Block for reading an analogue input. * @this Blockly.Block */ init: function () { this.setHelpUrl("http://arduino.cc/en/Reference/AnalogRead"); this.setColour(250); this.appendDummyInput() .appendField(Blockly.Msg.ARD_ANALOGREAD) .appendField( new Blockly.FieldDropdown(selectedBoard().analogPins), "PIN" ); this.setOutput(true, Types.NUMBER.typeName); this.setTooltip(Blockly.Msg.ARD_ANALOGREAD_TIP); }, /** @return {!string} The type of return value for the block, an integer. */ getBlockType: function () { return Types.NUMBER.typeName; }, /** * Updates the content of the the pin related fields. * @this Blockly.Block */ updateFields: function () { Blockly.Arduino.Boards.refreshBlockFieldDropdown(this, "PIN", "analogPins"); }, }; Blockly.Blocks["io_highlow"] = { /** * Block for creating a pin state. * @this Blockly.Block */ init: function () { this.setHelpUrl("http://arduino.cc/en/Reference/Constants"); this.setColour(250); this.appendDummyInput().appendField( new Blockly.FieldDropdown([ [Blockly.Msg.ARD_HIGH, "HIGH"], [Blockly.Msg.ARD_LOW, "LOW"], ]), "STATE" ); this.setOutput(true, Types.BOOLEAN.typeName); this.setTooltip(Blockly.Msg.ARD_HIGHLOW_TIP); }, /** @return {!string} The type of return value for the block, an integer. */ getBlockType: function () { return Types.BOOLEAN; }, }; Blockly.Blocks["io_pulsein"] = { /** * Block for measuring the duration of a pulse in an input pin. * @this Blockly.Block */ init: function () { this.jsonInit({ type: "math_foo", message0: Blockly.Msg.ARD_PULSE_READ, args0: [ { type: "input_value", name: "PULSETYPE", check: Types.BOOLEAN.compatibleTypes, }, { type: "field_dropdown", name: "PULSEPIN", options: selectedBoard().digitalPins, }, ], output: Types.NUMBER.typeName, inputsInline: true, colour: 250, tooltip: Blockly.Msg.ARD_PULSE_TIP, helpUrl: "https://www.arduino.cc/en/Reference/PulseIn", }); }, /** @return {!string} The type of input value for the block, an integer. */ getBlockType: function () { return Types.NUMBER.typeName; }, }; Blockly.Blocks["io_pulsetimeout"] = { /** * Block for measuring (with a time-out) the duration of a pulse in an input * pin. * @this Blockly.Block */ init: function () { this.jsonInit({ type: "math_foo", message0: Blockly.Msg.ARD_PULSE_READ_TIMEOUT, args0: [ { type: "input_value", name: "PULSETYPE", check: Types.BOOLEAN.compatibleTypes, }, { type: "field_dropdown", name: "PULSEPIN", options: selectedBoard().digitalPins, }, { type: "input_value", name: "TIMEOUT", check: Types.NUMBER.compatibleTypes, }, ], output: Types.NUMBER.typeName, inputsInline: true, colour: 250, tooltip: Blockly.Msg.ARD_PULSETIMEOUT_TIP, helpUrl: "https://www.arduino.cc/en/Reference/PulseIn", }); }, /** @return {!string} The type of input value for the block, an integer. */ getBlockType: function () { return Types.NUMBER.typeName; }, };