123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124 |
- /**
- * @license Licensed under the Apache License, Version 2.0 (the "License"):
- * http://www.apache.org/licenses/LICENSE-2.0
- */
- /**
- * @fileoverview Arduino ode generator for SPI library blocks.
- * The Arduino SPI library docs: http://arduino.cc/en/Reference/SPI
- */
- 'use strict';
- goog.provide('Blockly.Python.spi');
- goog.require('Blockly.Python');
- /**
- * Code generator for the SPI configuration block. It does not add any LoC to
- * the loop(), but it generates code for the setup() function.
- * Arduino code: #include <SPI.h>
- * setup() { SPI.setBitOrder(X);
- * SPI.setDataMode(Y);
- * SPI.setClockDivider(Z);
- * SPI.begin(); }
- * @param {!Blockly.Block} block Block to generate the code from.
- * @return {string} Completed code.
- */
- Blockly.Python['spi_setup'] = function(block) {
- var spiId = block.getFieldValue('SPI_ID');
- var spiShift = block.getFieldValue('SPI_SHIFT_ORDER');
- var spiClockDivide = block.getFieldValue('SPI_CLOCK_DIVIDE');
- var spiMode = block.getFieldValue('SPI_MODE');
- Blockly.Python.addInclude('spi', '#include <SPI.h>');
- Blockly.Python.addSetup('spi_order',
- spiId + '.setBitOrder(' + spiShift + ');', true);
- Blockly.Python.addSetup('spi_mode',
- spiId + '.setDataMode(' + spiMode + ');', true);
- Blockly.Python.addSetup('spi_div',
- spiId + '.setClockDivider(' + spiClockDivide + ');', true);
- Blockly.Python.addSetup('spi_begin',
- spiId + '.begin();', true);
- return '';
- };
- /**
- * Code generator for the SPI transfer block.
- * SPI bus can have several slaves, which are selected using a digital output
- * as a SS pin. This digital pin will be configured as a normal output.
- * Arduino code: #include <SPI.h>
- * setup { pinMode(X, OUTPUT); }
- * loop { digitalWrite(X, HIGH);
- * SPI.transfer(0);
- * digitalWrite(X, LOW); }
- * @param {!Blockly.Block} block Block to generate the code from.
- * @return {string} Completed code.
- */
- Blockly.Python['spi_transfer'] = function(block) {
- var spiId = block.getFieldValue('SPI_ID');
- var spiSs = block.getFieldValue('SPI_SS');
- var spiData = Blockly.Python.valueToCode(
- block, 'SPI_DATA', Blockly.Python.ORDER_ATOMIC) || '0';
- Blockly.Python.addInclude('spi', '#include <SPI.h>');
- Blockly.Python.addSetup('spi_begin', spiId + '.begin();', false);
- // Reserve SPI pins MOSI, MISO, and SCK
- var spiPins = Blockly.Python.Boards.selected.spiPins[spiId];
- for (var i = 0; i < spiPins.length; i++) {
- Blockly.Python.reservePin(block, spiPins[i][1],
- Blockly.Python.PinTypes.SPI, 'SPI ' + spiPins[i][0]);
- }
- // Configure the Slave Select as a normal output if a pin is used
- if (spiSs !== 'none') {
- Blockly.Python.reservePin(
- block, spiSs, Blockly.Python.PinTypes.OUTPUT, 'SPI Slave pin');
- var setupCode = 'pinMode(' + spiSs + ', OUTPUT);';
- Blockly.Python.addSetup('io_' + spiSs, setupCode, false);
- } // else means the SS pin is always set for the device
- // Add the code, but only use a SS pin if one is selected
- var code = [];
- if (spiSs !== 'none') {
- code.push('digitalWrite(' + spiSs + ', HIGH);');
- }
- code.push(spiId + '.transfer(' + spiData + ');');
- if (spiSs !== 'none') {
- code.push('digitalWrite(' + spiSs + ', LOW);');
- }
- return code.join('\n') + '\n';
- };
- /**
- * Code generator for the SPI transfer block with a return value.
- * The rest is the same as the spi_transfer block.
- * @param {!Blockly.Block} block Block to generate the code from.
- * @return {string} Completed code.
- */
- Blockly.Python['spi_transfer_return'] = function(block) {
- var spiId = block.getFieldValue('SPI_ID');
- var spiSs = block.getFieldValue('SPI_SS');
- var spiData = Blockly.Python.valueToCode(
- block, 'SPI_DATA', Blockly.Python.ORDER_ATOMIC) || '0';
- // The spi_transfer block invoked to generate all setup stuff, code discarded
- var spiTransferOnlyCode = Blockly.Python['spi_transfer'](block);
- if (spiSs === 'none') {
- var code = spiId + '.transfer(' + spiData + ')';
- } else {
- var func = [
- 'int ' + Blockly.Python.DEF_FUNC_NAME + '() {',
- ' int spiReturn = 0;',
- ' digitalWrite(' + spiSs + ', HIGH);',
- ' spiReturn = ' + spiId + '.transfer(' + spiData + ');',
- ' digitalWrite(' + spiSs + ', LOW);',
- ' return spiReturn;',
- '}'];
- var functionName = Blockly.Python.addFunction(
- 'spiReturnSlave' + spiSs, func.join('\n'));
- var code = functionName + '()';
- }
- return [code, Blockly.Python.ORDER_UNARY_POSTFIX];
- };
|