From 8a65bf21c140e515733d6f9fe3ee60e775ce8983 Mon Sep 17 00:00:00 2001 From: Emil Varughese Date: Mon, 8 May 2017 10:24:01 +0400 Subject: [PATCH] Added the following blocks INPUT_PULLUP: A standard block that can be used to configure any pin as either INPUT, OUTPUT or INPUT_PULLUP Useful for interfacing switches and other devices that require a pullup resistor Liquid Crystal library: Added blocks for: 1. Begin() 2. print()/println() 3. clear() 4. setCursor() Thereby allowing basic lcd functionalities. --- ardublockly/ardublockly_blockly.js | 2 +- ardublockly/ardublockly_toolbox.js | 48 ++++++++ ardublockly/index.html | 2 + ardublockly/msg/en.js | 1 + blockly/blocks/arduino/io.js | 17 +++ blockly/blocks/arduino/liquidcrystal.js | 129 ++++++++++++++++++++ blockly/generators/arduino.js | 3 +- blockly/generators/arduino/io.js | 26 ++++ blockly/generators/arduino/liquidcrystal.js | 85 +++++++++++++ blockly/msg/js/en.js | 15 +++ blockly/msg/messages_ardublockly.js | 16 +++ package/ardublocklydocs/ardublockly.wiki | 2 +- 12 files changed, 343 insertions(+), 3 deletions(-) create mode 100644 blockly/blocks/arduino/liquidcrystal.js create mode 100644 blockly/generators/arduino/liquidcrystal.js diff --git a/ardublockly/ardublockly_blockly.js b/ardublockly/ardublockly_blockly.js index 1d0ba2a984..958d171863 100644 --- a/ardublockly/ardublockly_blockly.js +++ b/ardublockly/ardublockly_blockly.js @@ -214,7 +214,7 @@ Ardublockly.changeBlocklyArduinoBoard = function(newBoard) { Ardublockly.updateToolboxLanguage = function() { var categories = ['catLogic', 'catLoops', 'catMath', 'catText', 'catVariables', 'catFunctions', 'catInputOutput', - 'catTime', 'catAudio', 'catMotors', 'catComms']; + 'catTime', 'catAudio', 'catMotors', 'catComms', 'catDisplay']; var categoryNodes = Ardublockly.xmlTree.getElementsByTagName('category'); for (var i = 0, cat; cat = categoryNodes[i]; i++) { var catId = cat.getAttribute('id'); diff --git a/ardublockly/ardublockly_toolbox.js b/ardublockly/ardublockly_toolbox.js index 28c3c6283f..2e53a2f663 100644 --- a/ardublockly/ardublockly_toolbox.js +++ b/ardublockly/ardublockly_toolbox.js @@ -123,6 +123,7 @@ Ardublockly.TOOLBOX_XML = ' ' + ' ' + ' ' + +' ' + ' ' + ' ' + ' ' + @@ -231,4 +232,51 @@ Ardublockly.TOOLBOX_XML = ' ' + ' ' + ' ' + +' ' + +' ' + +' ' + +' 12' + +' 11' + +' 5' + +' 4' + +' 3' + +' 2' + +' ' + +' ' + +' 16' + +' ' + +' ' + +' ' + +' ' + +' 2' + +' ' + +' ' + +' ' + +' ' + +' ' + +' ' + +' ' + +' ' + +' ' + +' ' + +' ' + +' ' + +' ' + +' ' + +' ' + +' ' + +' ' + +' ' + +' ' + +' ' + +' 0' + +' ' + +' ' + +' ' + +' ' + +' 0' + +' ' + +' ' + +' ' + +' ' + ''; diff --git a/ardublockly/index.html b/ardublockly/index.html index 75fa9a3538..c417d00067 100644 --- a/ardublockly/index.html +++ b/ardublockly/index.html @@ -27,6 +27,7 @@ + @@ -39,6 +40,7 @@ + diff --git a/ardublockly/msg/en.js b/ardublockly/msg/en.js index 94481312e8..9bb29171db 100644 --- a/ardublockly/msg/en.js +++ b/ardublockly/msg/en.js @@ -102,4 +102,5 @@ Ardublockly.LOCALISED_TEXT = { catAudio: "Audio", catMotors: "Motors", catComms: "Comms", + catDisplay: "Display", }; diff --git a/blockly/blocks/arduino/io.js b/blockly/blocks/arduino/io.js index bf59259067..77d320aced 100644 --- a/blockly/blocks/arduino/io.js +++ b/blockly/blocks/arduino/io.js @@ -260,3 +260,20 @@ Blockly.Blocks['io_pulsetimeout'] = { return Blockly.Types.NUMBER; } }; + +Blockly.Blocks['io_input_pullup'] = { + init: function() { + this.appendDummyInput() + .appendField(Blockly.Msg.ARD_SET_PIN) + .appendField(new Blockly.FieldDropdown( + Blockly.Arduino.Boards.selected.digitalPins), 'PIN') + .appendField(Blockly.Msg.ARD_MODE_TO) + .appendField(new Blockly.FieldDropdown([[Blockly.Msg.ARD_PULLUP,"INPUT_PULLUP"],[Blockly.Msg.ARD_INPUT,"INPUT"], [Blockly.Msg.ARD_OUTPUT,"OUTPUT"]]), "STATE"); + this.setColour(Blockly.Blocks.io.HUE); + this.setTooltip(Blockly.Msg.ARD_PULLUP_TIP); + this.setHelpUrl('https://www.arduino.cc/en/Reference/Constants'); + }, + getBlockType: function() { + return Blockly.Types.SHORT_NUMBER; + } +}; \ No newline at end of file diff --git a/blockly/blocks/arduino/liquidcrystal.js b/blockly/blocks/arduino/liquidcrystal.js new file mode 100644 index 0000000000..ccf657c87e --- /dev/null +++ b/blockly/blocks/arduino/liquidcrystal.js @@ -0,0 +1,129 @@ +/** + * @license Licensed under the Apache License, Version 2.0 (the "License"): + * http://www.apache.org/licenses/LICENSE-2.0 + */ + +/** + * @fileoverview Blocks for Arduino Liquid Crystal library. + * The Arduino Liquid Crystal functions syntax can be found in the following URL: + * https://www.arduino.cc/en/Reference/LiquidCrystal + * Note that this block uses the Blockly.FieldInstance instead of + * Blockly.FieldDropdown which generates a unique instance per setup block + * in the workspace. + */ + +'use strict'; + +goog.provide('Blockly.Blocks.LiquidCrystal'); + +goog.require('Blockly.Blocks'); +goog.require('Blockly.Types'); + +/** Common HSV hue for all blocks in this category. */ +Blockly.Blocks.LiquidCrystal.HUE = 300; + +Blockly.Blocks['liquidcrystal_config'] = { + init: function() { + this.appendDummyInput() + .appendField(Blockly.Msg.ARD_LIQUIDCRYSTAL_CONFIG) + .appendField(new Blockly.FieldInstance('LCD',Blockly.Msg.ARD_LIQUIDCRYSTAL_DEFAULT_NAME,true,true,false), "liquidcrystal_name"); + this.appendDummyInput() + .setAlign(Blockly.ALIGN_RIGHT) + .appendField("RS:") + .appendField(new Blockly.FieldDropdown(Blockly.Arduino.Boards.selected.digitalPins), "LCD_RS") + .appendField("EN:") + .appendField(new Blockly.FieldDropdown(Blockly.Arduino.Boards.selected.digitalPins), "LCD_EN") + .appendField("D4:") + .appendField(new Blockly.FieldDropdown(Blockly.Arduino.Boards.selected.digitalPins), "LCD_D4"); + this.appendDummyInput() + .setAlign(Blockly.ALIGN_RIGHT) + .appendField("D5:") + .appendField(new Blockly.FieldDropdown(Blockly.Arduino.Boards.selected.digitalPins), "LCD_D5") + .appendField("D6:") + .appendField(new Blockly.FieldDropdown(Blockly.Arduino.Boards.selected.digitalPins), "LCD_D6") + .appendField("D7:") + .appendField(new Blockly.FieldDropdown(Blockly.Arduino.Boards.selected.digitalPins), "LCD_D7"); + this.appendValueInput("LCD_COLUMN") + .setCheck("Number") + .setAlign(Blockly.ALIGN_RIGHT) + .appendField("No. of Columns:"); + this.appendValueInput("LCD_ROW") + .setCheck("Number") + .setAlign(Blockly.ALIGN_RIGHT) + .appendField("No. of Rows:"); + this.setColour(Blockly.Blocks.LiquidCrystal.HUE); + this.setTooltip(Blockly.Msg.ARD_LIQUIDCRYSTAL_DEFAULT_TIP); + this.setHelpUrl('https://www.arduino.cc/en/Reference/LiquidCrystal'); + } +}; + +Blockly.Blocks['liquidcrystal_variable'] = { + init: function() { + this.appendDummyInput() + .appendField(new Blockly.FieldInstance('LCD',Blockly.Msg.ARD_LIQUIDCRYSTAL_DEFAULT_NAME,false,true,false), "liquidcrystal_name"); + this.setOutput(true, null); + this.setColour(Blockly.Blocks.LiquidCrystal.HUE); + this.setTooltip(''); + this.setHelpUrl('https://www.arduino.cc/en/Reference/LiquidCrystal'); + } +}; + +Blockly.Blocks['liquidcrystal_clear'] = { + init: function() { + this.appendValueInput("LCD_NAME") + .setCheck("String") + .appendField(Blockly.Msg.ARD_LIQUIDCRYSTAL_CLEAR_DISPLAY); + this.setPreviousStatement(true, null); + this.setNextStatement(true, null); + this.setColour(Blockly.Blocks.LiquidCrystal.HUE); + this.setTooltip(Blockly.Msg.ARD_LIQUIDCRYSTAL_CLEAR_DISPLAY_TIP); + this.setHelpUrl('https://www.arduino.cc/en/Reference/LiquidCrystal'); + } +}; + +Blockly.Blocks['liquidcrystal_print'] = { + /** + * Block for creating a write to serial com function. + * @this Blockly.Block + */ + init: function() { + this.setHelpUrl('http://www.arduino.cc/en/Serial/Print'); + this.setColour(Blockly.Blocks.LiquidCrystal.HUE); + this.appendDummyInput() + .appendField(Blockly.Msg.ARD_SERIAL_PRINT); + this.appendValueInput('CONTENT') + .setCheck(Blockly.Types.TEXT.checkList); + this.appendValueInput('LCD_NAME') + .appendField(Blockly.Msg.ARD_LIQUIDCRYSTAL_PRINT_ON_DISPLAY); + this.appendDummyInput() + .appendField(new Blockly.FieldCheckbox('TRUE'), 'NEW_LINE') + .appendField(Blockly.Msg.ARD_SERIAL_PRINT_NEWLINE); + this.setInputsInline(true); + this.setPreviousStatement(true, null); + this.setNextStatement(true, null); + this.setTooltip(Blockly.Msg.ARD_LIQUIDCRYSTAL_PRINT_TIP); + this.setHelpUrl('https://www.arduino.cc/en/Reference/LiquidCrystal'); + } +}; + +Blockly.Blocks['liquidcrystal_set_cursor'] = { + init: function() { + this.appendValueInput("LCD_NAME") + .setCheck("String") + .appendField(Blockly.Msg.ARD_LIQUIDCRYSTAL_SET_CURSOR); + this.appendValueInput("LCD_COLUMN") + .setCheck("Number") + .setAlign(Blockly.ALIGN_RIGHT) + .appendField("Column:"); + this.appendValueInput("LCD_ROW") + .setCheck("Number") + .setAlign(Blockly.ALIGN_RIGHT) + .appendField("Rows:"); + this.setInputsInline(false); + this.setPreviousStatement(true, null); + this.setNextStatement(true, null); + this.setColour(Blockly.Blocks.LiquidCrystal.HUE); + this.setTooltip(Blockly.Msg.ARD_LIQUIDCRYSTAL_SET_CURSOR_TIP); + this.setHelpUrl('https://www.arduino.cc/en/Reference/LiquidCrystal'); + } +}; \ No newline at end of file diff --git a/blockly/generators/arduino.js b/blockly/generators/arduino.js index f68be2e382..4e74e01285 100644 --- a/blockly/generators/arduino.js +++ b/blockly/generators/arduino.js @@ -73,7 +73,8 @@ Blockly.Arduino.PinTypes = { STEPPER: 'STEPPER', SERIAL: 'SERIAL', I2C: 'I2C/TWI', - SPI: 'SPI' + SPI: 'SPI', + LCD: 'LCD' }; /** diff --git a/blockly/generators/arduino/io.js b/blockly/generators/arduino/io.js index 0c3bce5ff6..baabbafc9d 100644 --- a/blockly/generators/arduino/io.js +++ b/blockly/generators/arduino/io.js @@ -13,6 +13,32 @@ goog.provide('Blockly.Arduino.IO'); goog.require('Blockly.Arduino'); +Blockly.Arduino['io_input_pullup'] = function(block) { + var pin = block.getFieldValue('PIN'); + var stateOutput = block.getFieldValue('STATE'); + + if(stateOutput =='OUTPUT') + { + Blockly.Arduino.reservePin( + block, pin, Blockly.Arduino.PinTypes.OUTPUT, 'Digital Write'); + } + + else if(stateOutput =='INPUT') + { + Blockly.Arduino.reservePin( + block, pin, Blockly.Arduino.PinTypes.INPUT, 'Digital Read'); + } + else if(stateOutput == 'INPUT_PULLUP') + { + Blockly.Arduino.reservePin( + block, pin, Blockly.Arduino.PinTypes.INPUT, 'Digital Read'); + } + + var pinSetupCode = 'pinMode(' + pin + ','+stateOutput+');'; + Blockly.Arduino.addSetup('io_' + pin, pinSetupCode, false); + + return ''; +}; /** * Function for 'set pin' (X) to a state (Y). diff --git a/blockly/generators/arduino/liquidcrystal.js b/blockly/generators/arduino/liquidcrystal.js new file mode 100644 index 0000000000..7cde165e24 --- /dev/null +++ b/blockly/generators/arduino/liquidcrystal.js @@ -0,0 +1,85 @@ +'use strict'; + +goog.provide('Blockly.Arduino.LiquidCrystal'); + +goog.require('Blockly.Arduino'); + +Blockly.Arduino['liquidcrystal_config'] = function(block) { + + var pinType = Blockly.Arduino.PinTypes.LCD; + + var rs = block.getFieldValue('LCD_RS'); + var en = block.getFieldValue('LCD_EN'); + var d4 = block.getFieldValue('LCD_D4'); + var d5 = block.getFieldValue('LCD_D5'); + var d6 = block.getFieldValue('LCD_D6'); + var d7 = block.getFieldValue('LCD_D7'); + + var lcdName = block.getFieldValue("liquidcrystal_name"); + + var lcdRows = Blockly.Arduino.valueToCode(block, 'LCD_ROW', + Blockly.Arduino.ORDER_ATOMIC) || '2'; + var lcdColumns = Blockly.Arduino.valueToCode(block, 'LCD_COLUMN', + Blockly.Arduino.ORDER_ATOMIC) || '16'; + + Blockly.Arduino.reservePin(block, rs, pinType, 'LCD'); + Blockly.Arduino.reservePin(block, en, pinType, 'LCD'); + Blockly.Arduino.reservePin(block, d4, pinType, 'LCD'); + Blockly.Arduino.reservePin(block, d5, pinType, 'LCD'); + Blockly.Arduino.reservePin(block, d6, pinType, 'LCD'); + Blockly.Arduino.reservePin(block, d7, pinType, 'LCD'); + + Blockly.Arduino.addInclude('lcd', '#include '); + + var globalCode = 'LiquidCrystal ' + lcdName + '(' + rs + ', ' + en + ', ' + d4 + ', ' + d5 + ', ' + d6 + ', ' + d7 + ');'; + Blockly.Arduino.addDeclaration(lcdName, globalCode); + + var setupCode = lcdName + '.begin(' + lcdColumns + ',' + lcdRows + ');'; + Blockly.Arduino.addSetup(lcdName, setupCode, true); + + return ''; +} + +Blockly.Arduino['liquidcrystal_variable'] = function(block) { + var code = block.getFieldValue("liquidcrystal_name"); + return [code, Blockly.Arduino.ORDER_ATOMIC]; +} + +Blockly.Arduino['liquidcrystal_clear'] = function(block) { + var lcdName = Blockly.Arduino.valueToCode( + block, 'LCD_NAME', Blockly.Arduino.ORDER_ATOMIC) || Blockly.Msg.ARD_LIQUIDCRYSTAL_DEFAULT_NAME; + var code = lcdName+'.clear();\n'; + return code; +} + +Blockly.Arduino['liquidcrystal_print'] = function(block) { + var lcdName = Blockly.Arduino.valueToCode( + block, 'LCD_NAME', Blockly.Arduino.ORDER_ATOMIC) || Blockly.Msg.ARD_LIQUIDCRYSTAL_DEFAULT_NAME; + var content = Blockly.Arduino.valueToCode( + block, 'CONTENT', Blockly.Arduino.ORDER_ATOMIC) || '0'; + var checkbox_name = (block.getFieldValue('NEW_LINE') == 'TRUE'); + + if (checkbox_name) { + var code = lcdName + '.println(' + content + ');\n'; + } else { + var code = lcdName + '.print(' + content + ');\n'; + } + return code; +}; + +Blockly.Arduino['liquidcrystal_set_cursor'] = function(block) { + + var pinType = Blockly.Arduino.PinTypes.LCD; + + var lcdName = Blockly.Arduino.valueToCode( + block, 'LCD_NAME', Blockly.Arduino.ORDER_ATOMIC) || Blockly.Msg.ARD_LIQUIDCRYSTAL_DEFAULT_NAME; + + var lcdRows = Blockly.Arduino.valueToCode(block, 'LCD_ROW', + Blockly.Arduino.ORDER_ATOMIC) || '0'; + var lcdColumns = Blockly.Arduino.valueToCode(block, 'LCD_COLUMN', + Blockly.Arduino.ORDER_ATOMIC) || '0'; + + var code = lcdName + '.setCursor(' + lcdColumns + ',' + lcdRows + ');\n'; + + return code; +} \ No newline at end of file diff --git a/blockly/msg/js/en.js b/blockly/msg/js/en.js index 86b68a37f4..015670d7f7 100644 --- a/blockly/msg/js/en.js +++ b/blockly/msg/js/en.js @@ -510,3 +510,18 @@ Blockly.Msg.NEW_INSTANCE = "New instance..."; Blockly.Msg.NEW_INSTANCE_TITLE = "New instance name:"; Blockly.Msg.RENAME_INSTANCE = "Rename instance..."; Blockly.Msg.RENAME_INSTANCE_TITLE = "Rename all '%1' instances to:"; +Blockly.Msg.ARD_LIQUIDCRYSTAL_CONFIG = 'Setup LCD'; +Blockly.Msg.ARD_LIQUIDCRYSTAL_DEFAULT_NAME = 'LCD'; +Blockly.Msg.ARD_LIQUIDCRYSTAL_DEFAULT_TIP = 'Configures the LCD pinout and other settings.'; +Blockly.Msg.ARD_PULLUP_TIP = 'Sets pin # into Pull Up mode'; +Blockly.Msg.ARD_PULLUP = 'INPUT_PULLUP'; +Blockly.Msg.ARD_LIQUIDCRYSTAL_PRINT_TIP = 'Prints data to display.'; +Blockly.Msg.ARD_LIQUIDCRYSTAL_PRINT_ON_DISPLAY = 'on display: '; +Blockly.Msg.ARD_LIQUIDCRYSTAL_CLEAR_DISPLAY = 'Clear display: '; +Blockly.Msg.ARD_LIQUIDCRYSTAL_CLEAR_DISPLAY_TIP = 'Clears the display'; +Blockly.Msg.ARD_LIQUIDCRYSTAL_SET_CURSOR = 'Set cursor on display: '; +Blockly.Msg.ARD_LIQUIDCRYSTAL_SET_CURSOR_TIP = 'Sets the position of the cursor'; +Blockly.Msg.ARD_SET_PIN = 'Set pin#'; +Blockly.Msg.ARD_MODE_TO = 'mode to'; +Blockly.Msg.ARD_INPUT = 'INPUT'; +Blockly.Msg.ARD_OUTPUT = 'OUTPUT'; \ No newline at end of file diff --git a/blockly/msg/messages_ardublockly.js b/blockly/msg/messages_ardublockly.js index dc799c043f..2618b4d495 100644 --- a/blockly/msg/messages_ardublockly.js +++ b/blockly/msg/messages_ardublockly.js @@ -176,3 +176,19 @@ Blockly.Msg.RENAME_INSTANCE = 'Rename instance...'; Blockly.Msg.NEW_INSTANCE_TITLE = 'New instance name:'; /// Instances - Confirmation message that a number of instances will be renamed to a new name Blockly.Msg.RENAME_INSTANCE_TITLE = 'Rename all "%1" instances to:'; + +Blockly.Msg.ARD_LIQUIDCRYSTAL_CONFIG = 'Setup LCD'; +Blockly.Msg.ARD_LIQUIDCRYSTAL_DEFAULT_NAME = 'LCD'; +Blockly.Msg.ARD_LIQUIDCRYSTAL_DEFAULT_TIP = 'Configures the LCD pinout and other settings.'; +Blockly.Msg.ARD_PULLUP_TIP = 'Sets pin # into Pull Up mode'; +Blockly.Msg.ARD_PULLUP = 'INPUT_PULLUP'; +Blockly.Msg.ARD_LIQUIDCRYSTAL_PRINT_TIP = 'Prints data to display.'; +Blockly.Msg.ARD_LIQUIDCRYSTAL_PRINT_ON_DISPLAY = 'on display: '; +Blockly.Msg.ARD_LIQUIDCRYSTAL_CLEAR_DISPLAY = 'Clear display: '; +Blockly.Msg.ARD_LIQUIDCRYSTAL_CLEAR_DISPLAY_TIP = 'Clears the display'; +Blockly.Msg.ARD_LIQUIDCRYSTAL_SET_CURSOR = 'Set cursor on display: '; +Blockly.Msg.ARD_LIQUIDCRYSTAL_SET_CURSOR_TIP = 'Sets the position of the cursor'; +Blockly.Msg.ARD_SET_PIN = 'Set pin#'; +Blockly.Msg.ARD_MODE_TO = 'mode to'; +Blockly.Msg.ARD_INPUT = 'INPUT'; +Blockly.Msg.ARD_OUTPUT = 'OUTPUT'; \ No newline at end of file diff --git a/package/ardublocklydocs/ardublockly.wiki b/package/ardublocklydocs/ardublockly.wiki index b563677958..30d13b91cc 160000 --- a/package/ardublocklydocs/ardublockly.wiki +++ b/package/ardublocklydocs/ardublockly.wiki @@ -1 +1 @@ -Subproject commit b56367795804920124eb58cb5d967d62aa2b50f4 +Subproject commit 30d13b91cc4703962de14eb63d0b5de287365032