123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207 |
- /**
- * @license Licensed under the Apache License, Version 2.0 (the "License"):
- * http://www.apache.org/licenses/LICENSE-2.0
- */
- /**
- * @fileoverview Blocks for Arduino SPI library.
- * The Arduino SPI functions syntax can be found in:
- * http://arduino.cc/en/Reference/SPI
- */
- 'use strict';
- goog.provide('Blockly.Blocks.spi');
- goog.require('Blockly.Blocks');
- goog.require('Blockly.Types');
- /** Common HSV hue for all blocks in this category. */
- Blockly.Blocks.spi.HUE = 80;
- Blockly.Blocks['spi_setup'] = {
- /**
- * Block for the spi configuration. Info in the setHelpUrl link.
- * @this Blockly.Block
- */
- init: function() {
- this.setHelpUrl('http://arduino.cc/en/Reference/SPI');
- this.setColour(Blockly.Blocks.spi.HUE);
- this.appendDummyInput()
- .appendField(Blockly.Msg.ARD_SPI_SETUP)
- .appendField(new Blockly.FieldDropdown(
- Blockly.Python.Boards.selected.spi), 'SPI_ID')
- .appendField(Blockly.Msg.ARD_SPI_SETUP_CONF);
- this.appendDummyInput()
- .appendField(Blockly.Msg.ARD_SPI_SETUP_SHIFT)
- .appendField(
- new Blockly.FieldDropdown(
- [[Blockly.Msg.ARD_SPI_SETUP_MSBFIRST, 'MSBFIRST'],
- [Blockly.Msg.ARD_SPI_SETUP_LSBFIRST, 'LSBFIRST']]),
- 'SPI_SHIFT_ORDER');
- this.appendDummyInput()
- .appendField(Blockly.Msg.ARD_SPI_SETUP_DIVIDE)
- .appendField(
- new Blockly.FieldDropdown(
- Blockly.Python.Boards.selected.spiClockDivide),
- 'SPI_CLOCK_DIVIDE');
- this.appendDummyInput()
- .appendField(Blockly.Msg.ARD_SPI_SETUP_MODE)
- .appendField(
- new Blockly.FieldDropdown(
- [[Blockly.Msg.ARD_SPI_SETUP_MODE0, 'SPI_MODE0'],
- [Blockly.Msg.ARD_SPI_SETUP_MODE1, 'SPI_MODE1'],
- [Blockly.Msg.ARD_SPI_SETUP_MODE2, 'SPI_MODE2'],
- [Blockly.Msg.ARD_SPI_SETUP_MODE3, 'SPI_MODE3']]),
- 'SPI_MODE');
- this.setTooltip(Blockly.Msg.ARD_SPI_SETUP_TIP);
- },
- /**
- * Returns the selected SPI instance.
- * @return {!string} SPI instance name.
- * @this Blockly.Block
- */
- getSpiSetupInstance: function() {
- return this.getFieldValue('SPI_ID');
- },
- /**
- * Updates the content of the the board SPI related fields.
- * @this Blockly.Block
- */
- updateFields: function() {
- Blockly.Python.Boards.refreshBlockFieldDropdown(
- this, 'SPI_ID', 'spi');
- Blockly.Python.Boards.refreshBlockFieldDropdown(
- this, 'SPI_CLOCK_DIVIDE', 'spiClockDivide');
- }
- };
- Blockly.Blocks['spi_transfer'] = {
- /**
- * Block for for the spi transfer. Info in the setHelpUrl link.
- * @this Blockly.Block
- */
- init: function() {
- // Drop down list to contain all digital pins plus an option for 'none'
- var slaveNone = [[Blockly.Msg.ARD_SPI_TRANS_NONE, 'none']];
- var digitalPinsExtended = slaveNone.concat(
- Blockly.Python.Boards.selected.digitalPins);
- this.setHelpUrl('http://arduino.cc/en/Reference/SPITransfer');
- this.setColour(Blockly.Blocks.spi.HUE);
- this.appendDummyInput()
- .appendField(new Blockly.FieldDropdown(
- Blockly.Python.Boards.selected.spi), 'SPI_ID');
- this.appendValueInput('SPI_DATA')
- .setCheck(Blockly.Types.NUMBER.checkList)
- .appendField(Blockly.Msg.ARD_SPI_TRANS_VAL);
- this.appendDummyInput()
- .appendField(Blockly.Msg.ARD_SPI_TRANS_SLAVE)
- .appendField(
- new Blockly.FieldDropdown(digitalPinsExtended), 'SPI_SS');
- this.setInputsInline(true);
- this.setPreviousStatement(true, null);
- this.setNextStatement(true, null);
- this.setTooltip(Blockly.Msg.ARD_SPI_TRANS_TIP);
- },
- /**
- * Called whenever anything on the workspace changes.
- * It checks the instances of stepper_config and attaches a warning to this
- * block if not valid data is found.
- * @this Blockly.Block
- */
- onchange: function() {
- if (!this.workspace) { return; } // Block has been deleted.
- // Get the Serial instance from this block
- var thisInstanceName = this.getFieldValue('SPI_ID');
- // Iterate through top level blocks to find a setup instance for the SPI id
- var blocks = Blockly.mainWorkspace.getTopBlocks();
- var setupInstancePresent = false;
- for (var x = 0, length_ = blocks.length; x < length_; x++) {
- var func = blocks[x].getSpiSetupInstance;
- if (func) {
- var setupBlockInstanceName = func.call(blocks[x]);
- if (thisInstanceName == setupBlockInstanceName) {
- setupInstancePresent = true;
- }
- }
- }
- if (!setupInstancePresent) {
- this.setWarningText(Blockly.Msg.ARD_SPI_TRANS_WARN1.replace('%1', thisInstanceName),
- 'spi_setup');
- } else {
- this.setWarningText(null, 'spi_setup');
- }
- },
- /**
- * Retrieves the type of the selected variable, Arduino code returns a byte,
- * for now set it to integer.
- * @return {!string} Blockly type.
- */
- getBlockType: function() {
- return Blockly.Types.NUMBER;
- },
- /**
- * Updates the content of the board SPI related fields.
- * @this Blockly.Block
- */
- updateFields: function() {
- // Special case, otherwise Blockly.Python.Boards.refreshBlockFieldDropdown
- var field = this.getField('SPI_SS');
- var fieldValue = field.getValue();
- var slaveNone = [[Blockly.Msg.ARD_SPI_TRANS_NONE, 'none']];
- field.menuGenerator_ =
- slaveNone.concat(Blockly.Python.Boards.selected['digitalPins']);
- var currentValuePresent = false;
- for (var i = 0, length_ = field.menuGenerator_.length; i < length_; i++) {
- if (fieldValue == field.menuGenerator_[i][1]) {
- currentValuePresent = true;
- }
- }
- // If the old value is not present any more, add a warning to the block.
- if (!currentValuePresent) {
- this.setWarningText(Blockly.Msg.ARD_SPI_TRANS_WARN2.replace('%1', fieldValue),
- 'bPin');
- } else {
- this.setWarningText(null, 'bPin');
- }
- }
- };
- Blockly.Blocks['spi_transfer_return'] = {
- /**
- * Block for for the spi transfer with a return value.
- * @this Blockly.Block
- */
- init: function() {
- // Drop down list to contain all digital pins plus an option for 'none'
- var slaveNone = [[Blockly.Msg.ARD_SPI_TRANS_NONE, 'none']];
- var digitalPinsExtended = slaveNone.concat(
- Blockly.Python.Boards.selected.digitalPins);
- this.setHelpUrl('http://arduino.cc/en/Reference/SPITransfer');
- this.setColour(Blockly.Blocks.spi.HUE);
- this.appendDummyInput()
- .appendField(new Blockly.FieldDropdown(
- Blockly.Python.Boards.selected.spi), 'SPI_ID');
- this.appendValueInput('SPI_DATA')
- .appendField(Blockly.Msg.ARD_SPI_TRANS_VAL);
- this.appendDummyInput()
- .appendField(Blockly.Msg.ARD_SPI_TRANS_SLAVE)
- .appendField(
- new Blockly.FieldDropdown(digitalPinsExtended), 'SPI_SS');
- this.setInputsInline(true);
- this.setOutput(true);
- this.setTooltip(Blockly.Msg.ARD_SPI_TRANSRETURN_TIP);
- },
- /** Same as spi_transfer block */
- onchange: Blockly.Blocks['spi_transfer'].onchange,
- /** Same as spi_transfer block */
- getBlockType: Blockly.Blocks['spi_transfer'].getBlockType,
- /** Same as spi_transfer block */
- updateFields: Blockly.Blocks['spi_transfer'].updateFields
- };
|