diff --git a/blockly/arduino_compressed.js b/blockly/arduino_compressed.js index 571943f3eb..21fcdf6eac 100644 --- a/blockly/arduino_compressed.js +++ b/blockly/arduino_compressed.js @@ -254,7 +254,8 @@ Blockly.Arduino.ledupkidz_led_onoff=function(a){var c=Blockly.Arduino.valueToCod var g,h="if";if(f)for(g in d){e="LED"+d[g][1];var k=f.getInputTargetBlock(d[g][0]);k&&k.getVars&&(e=k.getVars()[0]);a+=" "+h+" (lednr == "+d[g][1]+" && state) { digitalWrite("+e+", "+e+"_ON);}\n";h="else if";a+=" "+h+" (lednr == "+d[g][1]+" && !state) { digitalWrite("+e+", !"+e+"_ON);}\n"}Blockly.Arduino.addDeclaration("ledupkidz_onoff",a+"}\n");return"set_ledupkidz_onoff("+c+", "+b+");\n"};Blockly.Arduino.map={};Blockly.Arduino.base_map=function(a){var c=Blockly.Arduino.valueToCode(a,"NUM",Blockly.Arduino.ORDER_NONE)||"0";a=Blockly.Arduino.valueToCode(a,"DMAX",Blockly.Arduino.ORDER_ATOMIC)||"0";return["map("+c+", 0, 1024, 0, "+a+")",Blockly.Arduino.ORDER_NONE]};Blockly.Arduino.variables={};Blockly.Arduino.variables_get=function(a){return[Blockly.Arduino.variableDB_.getName(a.getFieldValue("VAR"),Blockly.Variables.NAME_TYPE),Blockly.Arduino.ORDER_ATOMIC]};Blockly.Arduino.variables_set=function(a){var c=Blockly.Arduino.valueToCode(a,"VALUE",Blockly.Arduino.ORDER_ASSIGNMENT)||"0";return Blockly.Arduino.variableDB_.getName(a.getFieldValue("VAR"),Blockly.Variables.NAME_TYPE)+" = "+c+";\n"}; Blockly.Arduino.variables_set_type=function(a){var c=Blockly.Arduino.valueToCode(a,"VARIABLE_SETTYPE_INPUT",Blockly.Arduino.ORDER_ASSIGNMENT)||"0";return["("+Blockly.Arduino.getArduinoType_(Blockly.Types[a.getFieldValue("VARIABLE_SETTYPE_TYPE")])+")("+c+")",Blockly.Arduino.ORDER_ATOMIC]};Blockly.Arduino.light={};function hexToRgb(a){return 0===a.lastIndexOf("rgb",0)?(a=a.substring(4,a.length-1).replace(/ /g,"").split(","),{r:parseInt(a[0],10),g:parseInt(a[1],10),b:parseInt(a[2],10)}):(a=/^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(a))?{r:parseInt(a[1],16),g:parseInt(a[2],16),b:parseInt(a[3],16)}:{r:0,g:0,b:0}} Blockly.Arduino.led_config_hub=function(a){var c=a.getFieldValue("LEDNAME"),b="HIGH";"neg"==a.getFieldValue("POLARITY")&&(b="LOW");var d=(a.connector||["0","1"])[0];Blockly.Arduino.reservePin(a,d,Blockly.Arduino.PinTypes.OUTPUT,"Digital Write to LED");Blockly.Arduino.addVariable(c,"int "+c+" = "+d+";\nboolean "+c+"_ON = "+b+";",!0);Blockly.Arduino.addSetup("io_"+c,"pinMode("+c+", OUTPUT);",!1);return""}; -Blockly.Arduino.led_digitalwrite=function(a){var c=a.getFieldValue("LEDNAME");a=Blockly.Arduino.valueToCode(a,"STATE",Blockly.Arduino.ORDER_ATOMIC)||"LOW";return"digitalWrite("+c+", "+a+");\n"};Blockly.Arduino.led_digitalwrite_onoff=function(a){var c=a.getFieldValue("LEDNAME");a=a.getFieldValue("STATE");var b=c+"_ON";"off"==a&&(b="! ("+b+")");return"digitalWrite("+c+", "+b+");\n"}; +Blockly.Arduino.led_digitalwrite=function(a){var c=a.getFieldValue("LEDNAME");a=Blockly.Arduino.valueToCode(a,"STATE",Blockly.Arduino.ORDER_ATOMIC)||"LOW";return"digitalWrite("+c+", "+a+");\n"}; +Blockly.Arduino.led_digitalwrite_onoff=function(a){var c=a.getFieldValue("LEDNAME");a=a.getFieldValue("STATE");var b=c+"_ON";"off"==a&&(b="! ("+b+")");return"digitalWrite("+c+", "+b+");\n"}; Blockly.Arduino.neopixel_config_hub=function(a){var c=a.getFieldValue("LEDNAME"),b=Blockly.Arduino.valueToCode(a,"NUMBER",Blockly.Arduino.ORDER_ATOMIC)||"1",d=a.getFieldValue("KHZ"),e=a.getFieldValue("NEOPIXEL_TYPE"),f=(a.connector||["0","1"])[0];Blockly.Arduino.reservePin(a,f,Blockly.Arduino.PinTypes.OUTPUT,"Digital Write to Neopixel");Blockly.Arduino.addVariable(c,"int "+c+" = "+f+";",!0);a="myNeo_"+c;Blockly.Arduino.addDeclaration(a,"#include \nAdafruit_NeoPixel "+a+" = Adafruit_NeoPixel("+ b+", "+f+", "+e+" + "+d+");");Blockly.Arduino.addSetup("io_"+a,a+".begin();\n "+a+".show();",!1);return""}; Blockly.Arduino.neopixel_write=function(a){var c=a.getFieldValue("NEONAME"),b=Blockly.Arduino.valueToCode(a,"LEDPIXEL",Blockly.Arduino.ORDER_ATOMIC)||"0",d=Blockly.Arduino.valueToCode(a,"RED",Blockly.Arduino.ORDER_ATOMIC)||"255",e=Blockly.Arduino.valueToCode(a,"GREEN",Blockly.Arduino.ORDER_ATOMIC)||"255";a=Blockly.Arduino.valueToCode(a,"BLUE",Blockly.Arduino.ORDER_ATOMIC)||"255";return"myNeo_"+c+".setPixelColor("+b+"-1, myNeo_"+c+".Color("+d+","+e+","+a+"));\n"+("myNeo_"+c+".show();\n")}; diff --git a/blockly/blocks/arduino/ledup_blocks.js b/blockly/blocks/arduino/ledup_blocks.js index 23baa86273..3d4ebc5f3d 100644 --- a/blockly/blocks/arduino/ledup_blocks.js +++ b/blockly/blocks/arduino/ledup_blocks.js @@ -15,7 +15,7 @@ goog.provide('Blockly.Blocks.ledup_blocks'); goog.require('Blockly.Blocks'); -// The Hub block +// The Hub block V1 Blockly.Blocks['ledup_hub'] = { init: function() { this.appendDummyInput() @@ -133,3 +133,122 @@ Blockly.Blocks['ledupkidz_led_onoff'] = { this.setTooltip(Blockly.Msg.ARD_LEDUP_LED_ONOFF_TIP); } }; + +/** + * LEDUPKIDZ V2 blocks + * + */ + +// The Hub block V2 +Blockly.Blocks['ledup_hub_V2'] = { + init: function() { + this.appendDummyInput() + .appendField(Blockly.Msg.ARD_LEDUP_HUB_V2); + this.appendDummyInput() + .setAlign(Blockly.ALIGN_RIGHT) + .appendField(new Blockly.FieldDropdown([ + [Blockly.Msg.ARD_LEDUP_GADGET, "DEST_GADGET"], //For the attiny85 gadget + [Blockly.Msg.ARD_LEDUP_PROTO, "DEST_PROTOTYPE"], //For prototype on Arduino Uno + ]), "TARGET"); + this.setPreviousStatement(false, "MD_BLOCK"); + this.setNextStatement(false, "MD_BLOCK"); + this.setColour('#a54a59'); + this.setTooltip(Blockly.Msg.ARD_LEDUP_HUB_TIP); + this.setHelpUrl('http://ingegno.be/01-blockly-4-arduino/'); + }, + /** @return {!boolean} True if the block instance is in the workspace. */ + getLedUpKidzInstance: function() { + return true; + }, + /** + * Returns the Arduino Board name that is required for this block. + * @return {!string} Board name. + * @this Blockly.Block + */ + getBoardName: function() { + var target = this.getFieldValue('TARGET'); + if (target == 'DEST_GADGET') { + return 'attiny85'; + } else { + return 'uno' + } + }, + /** + * Called whenever anything on the workspace changes. + * It checks if the board selected corresponds to what it should be + * block if not valid data is found. + * @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 + } + + // Iterate through top level blocks to find if there are other board modules + var blocks = this.workspace.getAllBlocks(); + var otherBoardPresent = false; + for (var x = 0; x < blocks.length; x++) { + var func = blocks[x].getBoardName; + if (func) { + var BoardName = func.call(blocks[x]); + if (BoardName != this.getBoardName()) { + otherBoardPresent = true; + } + if (this != blocks[x]) { + // no two ledupkidx blocks allowed. + otherBoardPresent = true; + } + } + } + + if (otherBoardPresent) { + // Set a warning to select a valid stepper config + this.setWarningText(Blockly.Msg.ARD_BOARD_WARN.replace('%1', Blockly.Msg.ARD_COMPONENT_BOARD), 'board'); + } else { + Blockly.Arduino.Boards.changeBoard(this.workspace, this.getBoardName()); + this.setWarningText(null, 'board'); + } + }, +}; + + +Blockly.Blocks['ledupkidzv2_bitSetClear'] = { + /** + * Block for setting led pin of ledupkidzv2 to a state. + * @this Blockly.Block + */ + init: function() { + this.setHelpUrl('https://www.arduino.cc/en/Tutorial/ShiftOut'); + this.setColour(Blockly.Blocks.light.HUE); + this.appendValueInput('STATE') + .appendField(Blockly.Msg.ARD_LEDLEG_SET) + .appendField( + new Blockly.FieldDropdown( + [['1', '0'], + ['2', '1'], + ['3', '2'], + ['4', '3'], + ['5', '4'], + ['6', '5'], + ]), 'LEDNAME') + .setCheck(Blockly.Types.BOOLEAN.checkList); + this.setInputsInline(false); + this.setPreviousStatement(true, 'ARD_BLOCK'); + this.setNextStatement(true, 'ARD_BLOCK'); + this.setTooltip(Blockly.Msg.ARD_DIGITALWRITE_TIP); + }, + /** + * Called whenever anything on the workspace changes. + * It checks the instances of ledleg config and attaches a warning to this + * block if not valid data is found. + * @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 + } + + } +}; diff --git a/blockly/generators/arduino/ledup_blocks.js b/blockly/generators/arduino/ledup_blocks.js index 9c6e04af95..23a6f2a691 100644 --- a/blockly/generators/arduino/ledup_blocks.js +++ b/blockly/generators/arduino/ledup_blocks.js @@ -88,7 +88,6 @@ Blockly.Arduino['ledup_hub'] = function(block) { return ''; }; - /** * Function for setting a specific LED of LedUpKidz to a state. * @param {!Blockly.Block} block Block to generate the code from. @@ -135,3 +134,100 @@ Blockly.Arduino['ledupkidz_led_onoff'] = function(block) { var code = 'set_ledupkidz_onoff(' + LEDNumber + ', ' + stateOutput + ');\n'; return code; } + +/** + * LEDUPKIDZ V2 blocks + * + * Hub, bitset + */ + +/** + * Function for setting a specific LED of LedUpKidz to a state. + * @param {!Blockly.Block} block Block to generate the code from. + * @return {array} Completed code with order of operation. + */ + +Blockly.Arduino['ledup_hub_V2'] = function(block) { + + function parseInput(block, name, connectors) { + var targetBlock = block.getInputTargetBlock(name); + if (targetBlock) { + targetBlock.setHubConnector(connectors); + } + var code = Blockly.Arduino.blockToCode(targetBlock); + if (!goog.isString(code)) { + throw 'Expecting code from statement block "' + targetBlock.type + '".'; + } + if (code) { + // blocks should only init data ... + console.log('Unexpected code in mcookie_hub', code); + } + return code; + } + + var setfunc = 'void updateShiftRegister() {\n digitalWrite(latchPin, LOW);\n shiftOut(dataPin, clockPin, MSBFIRST, leds);\n digitalWrite(latchPin, HIGH);\n}'; + var code = ''; + var nr; + + var target = block.getFieldValue('TARGET'); + + if (target == "DEST_PROTOTYPE") { + var blockinputs = [["latchPin", ['11']], ["clockPin", ['12']], ["dataPin", ['10']] ]; + + code += '// Attiny wiring of the shift register\n' + + '/*' + + 'int dataPin = 0;\n' + + 'int latchPin = 1;\n' + + 'int clockPin = 2;\n' + + 'byte register = 0;' + + '*/\n\n\n'+ + '// Prototype wiring of the shift register\n' + + 'int dataPin = 10;\n' + + 'int latchPin = 11;\n' + + 'int clockPin = 12;\n' + + 'byte register = 0;' + + '\n'; + + } else { + var blockinputs = [["latchPin", ['1']], ["clockPin", ['2']], ["dataPin", ['0']] ]; + + code += '// Prototype wiring of the shift register\n' + + '/*' + + 'int dataPin = 10;\n' + + 'int latchPin = 11;\n' + + 'int clockPin = 12;\n' + + 'byte register = 0;' + + '*/\n\n\n' + + '// Attiny wiring of the shift register\n' + + 'int dataPin = 0;\n' + + 'int latchPin = 1;\n' + + 'int clockPin = 2;\n' + + 'byte register = 0;' + + '\n'; + } + + Blockly.Arduino.addInclude('ledupkidzV2', code); + Blockly.Arduino.addDeclaration('ledupkidz_updateShiftRegister', setfunc); + Blockly.Arduino.addSetup('ledupkidzV2', 'pinMode(latchPin, OUTPUT);\n pinMode(clockPin, OUTPUT);\n pinMode(dataPin, OUTPUT);\n register=0;\n updateShiftRegister();', false); + + return ''; +} + +Blockly.Arduino['ledupkidzv2_bitSetClear'] = function(block) { + + var stateOutput = Blockly.Arduino.valueToCode( + block, 'STATE', Blockly.Arduino.ORDER_ATOMIC) || 'true'; + + var setfunc = 'void set_ledupkidz_bitSetClear {\n '; + var chosenLED = block.getFieldValue('LEDNAME'); + + + var code = ''; + if (stateOutput == 'true') { + code += 'bitSet(register, ' + chosenLED + ');\nupdateShiftRegister();'; + } else { + code += 'bitClear(register, ' + chosenLED + ');\nupdateShiftRegister();'; + } + + return code; +} diff --git a/blockly/index.html b/blockly/index.html index 00071e185c..415656f2e3 100644 --- a/blockly/index.html +++ b/blockly/index.html @@ -14,12 +14,12 @@ - + - + @@ -872,8 +872,18 @@ - - + + + + + + + TRUE + + + + + diff --git a/blockly/msg/js/nl.js b/blockly/msg/js/nl.js index 4ef5b1bd6d..ad1e856de9 100644 --- a/blockly/msg/js/nl.js +++ b/blockly/msg/js/nl.js @@ -599,7 +599,8 @@ Blockly.Msg.ARD_LEDLEG_ON = "AAN"; Blockly.Msg.ARD_LEDLEG_SET = "Zet LED"; Blockly.Msg.ARD_LEDLEG_TIP = "Een LED licht, een van de beentjes (de positieve of de negatieve) is verbonden aan de Arduino. Kan AAN of UIT zijn."; Blockly.Msg.ARD_LEDUP_GADGET = "Gadget LedUpKidz"; -Blockly.Msg.ARD_LEDUP_HUB = "LedUpKidz, bestemming: "; +Blockly.Msg.ARD_LEDUP_HUB = "LedUpKidz V1, bestemming: "; +Blockly.Msg.ARD_LEDUP_HUB_V2 = "LedUpKidz V2, bestemming: "; Blockly.Msg.ARD_LEDUP_HUB_TIP = "LedUpKidz is een gadget met 6 LED die je kunt programmeren. Er is een groot prototype via een Arduino UNO, kies prototype voor code daarvoor bestemd. Het gadget werkt op een kleine attiny85 microchip, voor code die daarop werkt, kies bestemming gadget."; Blockly.Msg.ARD_LEDUP_LED0 = "LED 0"; Blockly.Msg.ARD_LEDUP_LED1 = "LED 1"; @@ -823,6 +824,9 @@ Blockly.Msg.UPLOAD_CLICK_2 = " 1. klik op de Arduino tab"; Blockly.Msg.UPLOAD_CLICK_3 = " 2. selecteeer alle code, en copieer (CTRL+A en CTRL+C)"; Blockly.Msg.UPLOAD_CLICK_4 = " 3. In de Arduino IDE of online via een http://codebender.cc sketch, plak je gecopieerde code (CTRL+V)"; Blockly.Msg.UPLOAD_CLICK_5 = " 4. Laad de code op naar je geconnecteerde Arduino"; +Blockly.Msg.LATCH = "Latch"; +Blockly.Msg.CLOCK= "Clock"; +Blockly.Msg.DATA = "Data"; Blockly.Msg.ARD_CONTROLS_EFFECT_MSG_THEN = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; Blockly.Msg.ARD_CONTROLS_EFFECT_IF_TITLE_IF = Blockly.Msg.ARD_CONTROLS_EFFECT_MSG_IF; Blockly.Msg.ARD_CONTROLS_EFFECT_IF_TOOLTIP = Blockly.Msg.CONTROLS_IF_IF_TOOLTIP;