-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathnode_compressed_generator.js
115 lines (114 loc) · 49.2 KB
/
node_compressed_generator.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
// Do not edit this file; automatically generated by nodejs node_compress_generator.js
'use strict';
/*
Licensed under the Apache License, Version 2.0 (the "License"):
http://www.apache.org/licenses/LICENSE-2.0
*/
Blockly.mbed=new Blockly.Generator("mbed");Blockly.mbed.StaticTyping=new Blockly.StaticTyping;
Blockly.mbed.addReservedWords("Blockly,"+"setup,loop,if,else,for,switch,case,while,do,break,continue,return,goto,"+"define,include,HIGH,LOW,INPUT,OUTPUT,INPUT_PULLUP,true,false,integer,"+"constants,floating,point,void,boolean,char,unsigned,byte,int,word,long,"+"float,double,string,String,array,static,volatile,const,sizeof,pinMode,"+"digitalWrite,digitalRead,analogReference,analogRead,analogWrite,tone,"+"noTone,shiftOut,shitIn,pulseIn,millis,micros,delay,delayMicroseconds,"+"min,max,abs,constrain,map,pow,sqrt,sin,cos,tan,randomSeed,random,"+
"lowByte,highByte,bitRead,bitWrite,bitSet,bitClear,bit,attachInterrupt,"+"detachInterrupt,interrupts,noInterrupts");Blockly.mbed.ORDER_ATOMIC=0;Blockly.mbed.ORDER_UNARY_POSTFIX=1;Blockly.mbed.ORDER_MEMBER=1.2;Blockly.mbed.ORDER_UNARY_PREFIX=2;Blockly.mbed.ORDER_MULTIPLICATIVE=3;Blockly.mbed.ORDER_ADDITIVE=4;Blockly.mbed.ORDER_SHIFT=5;Blockly.mbed.ORDER_RELATIONAL=6;Blockly.mbed.ORDER_EQUALITY=7;Blockly.mbed.ORDER_BITWISE_AND=8;Blockly.mbed.ORDER_BITWISE_XOR=9;Blockly.mbed.ORDER_BITWISE_OR=10;
Blockly.mbed.ORDER_LOGICAL_AND=11;Blockly.mbed.ORDER_LOGICAL_OR=12;Blockly.mbed.ORDER_CONDITIONAL=13;Blockly.mbed.ORDER_ASSIGNMENT=14;Blockly.mbed.ORDER_COMMA=17;Blockly.mbed.ORDER_NONE=99;Blockly.mbed.PinTypes={INPUT:"INPUT",OUTPUT:"OUTPUT",PWM:"PWM",SERVO:"SERVO",STEPPER:"STEPPER",SERIAL:"SERIAL",I2C:"I2C/TWI",SPI:"SPI"};Blockly.mbed.DEF_FUNC_NAME=Blockly.mbed.FUNCTION_NAME_PLACEHOLDER_;
Blockly.mbed.init=function(workspace){Blockly.mbed.includes_=Object.create(null);Blockly.mbed.definitions_=Object.create(null);Blockly.mbed.variables_=Object.create(null);Blockly.mbed.codeFunctions_=Object.create(null);Blockly.mbed.userFunctions_=Object.create(null);Blockly.mbed.functionNames_=Object.create(null);Blockly.mbed.setups_=Object.create(null);Blockly.mbed.pins_=Object.create(null);if(!Blockly.mbed.variableDB_)Blockly.mbed.variableDB_=new Blockly.Names(Blockly.mbed.RESERVED_WORDS_);else Blockly.mbed.variableDB_.reset();
var varsWithTypes=Blockly.mbed.StaticTyping.collectVarsWithTypes(workspace);Blockly.mbed.StaticTyping.setProcedureArgs(workspace,varsWithTypes);for(var varName in varsWithTypes)Blockly.mbed.addVariable(varName,Blockly.mbed.getmbedType_(varsWithTypes[varName])+" "+Blockly.mbed.variableDB_.getName(varName,Blockly.Variables.NAME_TYPE)+";")};
Blockly.mbed.finish=function(code){var includes=["#define HIGH 1","#define LOW 0",'#include "mbed.h"',"#include \x3cstring\x3e","typedef bool boolean;","typedef std::string String;"],definitions=[],variables=[],functions=[];for(var name in Blockly.mbed.includes_)includes.push(Blockly.mbed.includes_[name]);if(includes.length)includes.push("\n");for(var name in Blockly.mbed.variables_)variables.push(Blockly.mbed.variables_[name]);if(variables.length)variables.push("\n");for(var name in Blockly.mbed.definitions_)definitions.push(Blockly.mbed.definitions_[name]);
if(definitions.length)definitions.push("\n");for(var name in Blockly.mbed.codeFunctions_)functions.push(Blockly.mbed.codeFunctions_[name]);for(var name in Blockly.mbed.userFunctions_)functions.push(Blockly.mbed.userFunctions_[name]);if(functions.length)functions.push("\n");var setups=[""],userSetupCode="";if(Blockly.mbed.setups_["userSetupCode"]!==undefined){userSetupCode="\n"+Blockly.mbed.setups_["userSetupCode"];delete Blockly.mbed.setups_["userSetupCode"]}for(var name in Blockly.mbed.setups_)setups.push(Blockly.mbed.setups_[name]);
if(userSetupCode)setups.push(userSetupCode);delete Blockly.mbed.includes_;delete Blockly.mbed.definitions_;delete Blockly.mbed.codeFunctions_;delete Blockly.mbed.userFunctions_;delete Blockly.mbed.functionNames_;delete Blockly.mbed.setups_;delete Blockly.mbed.pins_;Blockly.mbed.variableDB_.reset();var allDefs=includes.join("\n")+variables.join("\n")+definitions.join("\n")+functions.join("\n\n");var loop="int main() {\n "+code.replace(/\n/g,"\n ")+"\n}";return allDefs+loop};
Blockly.mbed.addInclude=function(includeTag,code){if(Blockly.mbed.includes_[includeTag]===undefined)Blockly.mbed.includes_[includeTag]=code};Blockly.mbed.addDeclaration=function(declarationTag,code){if(Blockly.mbed.definitions_[declarationTag]===undefined)Blockly.mbed.definitions_[declarationTag]=code};
Blockly.mbed.addVariable=function(varName,code,overwrite){var overwritten=false;if(overwrite||Blockly.mbed.variables_[varName]===undefined){var codeSplit=code.split(/\s+/);if(codeSplit.length==4)code=codeSplit[0]+" "+codeSplit[3].replace(";","")+"[]\x3d"+codeSplit[2]+";";Blockly.mbed.variables_[varName]=code;overwritten=true}return overwritten};
Blockly.mbed.addSetup=function(setupTag,code,overwrite){var overwritten=false;if(overwrite||Blockly.mbed.setups_[setupTag]===undefined){Blockly.mbed.setups_[setupTag]=code;overwritten=true}return overwritten};
Blockly.mbed.addFunction=function(preferedName,code){if(Blockly.mbed.codeFunctions_[preferedName]===undefined){var uniqueName=Blockly.mbed.variableDB_.getDistinctName(preferedName,Blockly.Generator.NAME_TYPE);Blockly.mbed.codeFunctions_[preferedName]=code.replace(Blockly.mbed.DEF_FUNC_NAME,uniqueName);Blockly.mbed.functionNames_[preferedName]=uniqueName}return Blockly.mbed.functionNames_[preferedName]};
Blockly.mbed.reservePin=function(block,pin,pinType,warningTag){if(Blockly.mbed.pins_[pin]!==undefined)if(Blockly.mbed.pins_[pin]!=pinType)block.setWarningText(Blockly.Msg.MBED_PIN_WARN1.replace("%1",pin).replace("%2",warningTag).replace("%3",pinType).replace("%4",Blockly.mbed.pins_[pin]),warningTag);else block.setWarningText(null,warningTag);else{Blockly.mbed.pins_[pin]=pinType;block.setWarningText(null,warningTag)}};Blockly.mbed.scrubNakedValue=function(line){return line+";\n"};
Blockly.mbed.quote_=function(string){string=string.replace(/\\/g,"\\\\").replace(/\n/g,"\\\n").replace(/\$/g,"\\$").replace(/'/g,"\\'");return'"'+string+'"'};
Blockly.mbed.scrub_=function(block,code){if(code===null)return"";var commentCode="";if(!block.outputConnection||!block.outputConnection.targetConnection){var comment=block.getCommentText();if(comment)commentCode+=this.prefixLines(comment,"// ")+"\n";for(var x=0;x<block.inputList.length;x++)if(block.inputList[x].type==Blockly.INPUT_VALUE){var childBlock=block.inputList[x].connection.targetBlock();if(childBlock){var comment=this.allNestedComments(childBlock);if(comment)commentCode+=this.prefixLines(comment,
"// ")}}}var nextBlock=block.nextConnection&&block.nextConnection.targetBlock();var nextCode=this.blockToCode(nextBlock);return commentCode+code+nextCode};
Blockly.mbed.getmbedType_=function(typeBlockly){switch(typeBlockly.typeId){case Blockly.Types.SHORT_NUMBER.typeId:return"char";case Blockly.Types.NUMBER.typeId:return"int";case Blockly.Types.LARGE_NUMBER.typeId:return"long";case Blockly.Types.DECIMAL.typeId:return"float";case Blockly.Types.TEXT.typeId:return"String";case Blockly.Types.CHARACTER.typeId:return"char";case Blockly.Types.BOOLEAN.typeId:return"boolean";case Blockly.Types.NULL.typeId:return"void";case Blockly.Types.UNDEF.typeId:return"undefined";
case Blockly.Types.CHILD_BLOCK_MISSING.typeId:return"int";case "Array":return Blockly.mbed.getmbedType_(typeBlockly.typeAtom)+" ["+typeBlockly.typeLength+"]"+" "+typeBlockly.typeContent;case "DigitalOut":return Blockly.Types.DigitalOut.typeId;default:return"Invalid Blockly Type"}};Blockly.mbed.noGeneratorCodeInline=function(){return["",Blockly.mbed.ORDER_ATOMIC]};Blockly.mbed.noGeneratorCodeLine=function(){return""};
Blockly.mbed.getAdjusted=function(block,atId,opt_delta,opt_negate,opt_order){var delta=opt_delta||0;var order=opt_order||Blockly.mbed.ORDER_NONE;if(block.workspace.options.oneBasedIndex)delta--;var defaultAtIndex=block.workspace.options.oneBasedIndex?"1":"0";if(delta>0)var at=Blockly.mbed.valueToCode(block,atId,Blockly.mbed.ORDER_ADDITION)||defaultAtIndex;else if(delta<0)var at=Blockly.mbed.valueToCode(block,atId,Blockly.mbed.ORDER_SUBTRACTION)||defaultAtIndex;else if(opt_negate)var at=Blockly.mbed.valueToCode(block,
atId,Blockly.mbed.ORDER_UNARY_NEGATION)||defaultAtIndex;else var at=Blockly.mbed.valueToCode(block,atId,order)||defaultAtIndex;if(Blockly.isNumber(at)){at=parseFloat(at)+delta;if(opt_negate)at=-at}else{if(delta>0){at=at+" + "+delta;var innerOrder=Blockly.mbed.ORDER_ADDITION}else if(delta<0){at=at+" - "+-delta;var innerOrder=Blockly.mbed.ORDER_SUBTRACTION}if(opt_negate){if(delta)at="-("+at+")";else at="-"+at;var innerOrder=Blockly.mbed.ORDER_UNARY_NEGATION}innerOrder=Math.floor(innerOrder);order=Math.floor(order);
if(innerOrder&&order>=innerOrder)at="("+at+")"}return at};Blockly.mbed.boards={};Blockly.mbed.Boards=new Object;Blockly.mbed.Boards["profiles"]=new Object;Blockly.mbed.Boards["generateAnalogIo"]=function(pinStart,pinEnd){var analogIo=[];for(var i=pinStart;i<pinEnd+1;i++)analogIo.push(["A"+i.toString(),"A"+i.toString()]);return analogIo};
Blockly.mbed.Boards["profiles"]["nucleo_f103rb"]={name:"NUCLEO F103RB",description:"mbed NUCLEO standard compatible board",digitalPins:[["PA_0","PA_0"],["PA_1","PA_1"],["PA_10","PA_10"],["PA_11","PA_11"],["PA_12","PA_12"],["PA_13","PA_13"],["PA_14","PA_14"],["PA_15","PA_15"],["PA_2","PA_2"],["PA_3","PA_3"],["PA_4","PA_4"],["PA_5","PA_5"],["PA_6","PA_6"],["PA_7","PA_7"],["PA_8","PA_8"],["PA_9","PA_9"],["PB_0","PB_0"],["PB_1","PB_1"],["PB_10","PB_10"],["PB_11","PB_11"],["PB_12","PB_12"],["PB_13","PB_13"],
["PB_14","PB_14"],["PB_15","PB_15"],["PB_2","PB_2"],["PB_3","PB_3"],["PB_4","PB_4"],["PB_5","PB_5"],["PB_6","PB_6"],["PB_7","PB_7"],["PB_8","PB_8"],["PB_9","PB_9"],["PC_0","PC_0"],["PC_1","PC_1"],["PC_10","PC_10"],["PC_11","PC_11"],["PC_12","PC_12"],["PC_13","PC_13"],["PC_14","PC_14"],["PC_15","PC_15"],["PC_2","PC_2"],["PC_3","PC_3"],["PC_4","PC_4"],["PC_5","PC_5"],["PC_6","PC_6"],["PC_7","PC_7"],["PC_8","PC_8"],["PC_9","PC_9"],["PD_2","PD_2"],["PF_0","PF_0"],["PF_1","PF_1"]],analogPins:Blockly.mbed.Boards.generateAnalogIo(0,
5),pwmPins:[["PA_1","PA_1"],["PA_10","PA_10"],["PA_11","PA_11"],["PA_15","PA_15"],["PA_2","PA_2"],["PA_3","PA_3"],["PA_6","PA_6"],["PA_7","PA_7"],["PA_8","PA_8"],["PA_9","PA_9"],["PB_0","PB_0"],["PB_1","PB_1"],["PB_10","PB_10"],["PB_11","PB_11"],["PB_13","PB_13"],["PB_14","PB_14"],["PB_15","PB_15"],["PB_3","PB_3"],["PB_4","PB_4"],["PB_5","PB_5"],["PC_4","PC_4"],["PC_6","PC_6"],["PC_7","PC_7"],["PC_8","PC_8"],["PC_9","PC_9"]],serialPinsRX:[["PA_10","PA_10"],["PA_3","PA_3"],["PB_11","PB_11"],["PB_7",
"PB_7"],["PC_11","PC_11"]],serialPinsTX:[["PB_6","PB_6"],["PC_10","PC_10"],["PA_9","PA_9"],["PB_10","PB_10"],["PA_2","PA_2"]],serialPins:[["Serial_1","Serial_1"],["Serial_2","Serial_2"],["Serial_3","Serial_3"]],serialMapper:{"PC_10":"Serial_3","PB_7":"Serial_1","PC_11":"Serial_3","PB_6":"Serial_1","PA_9":"Serial_1","PB_10":"Serial_3","PA_10":"Serial_1","PA_2":"Serial_2","PA_3":"Serial_2","PB_11":"Serial_3"},serialSpeed:[["9600","9600"],["300","300"],["600","600"],["1200","1200"],["2400","2400"],["4800",
"4800"],["14400","14400"],["19200","19200"],["28800","28800"],["31250","31250"],["38400","38400"],["57600","57600"],["115200","115200"]],spi:[["SPI2","SPI2"],["SPI1","SPI1"]],spi1_choice:[["PA_5,PA_6,PA_7","PA_5,PA_6,PA_7"],["PB_3,PB_4,PB_5","PB_3,PB_4,PB_5"]],spi1_alternative:{"MOSI":"PB_5","MISO":"PB_4","SCK":"PB_3"},spiPins:{SPI1:{"MOSI":"PA_7","MISO":"PA_6","SCK":"PA_5"},SPI2:{"MOSI":"PB_15","MISO":"PB_14","SCK":"PB_13"}},i2c:[["I2C","Wire"]],i2cPins:{Wire:[["SDA","A4"],["SCL","A5"]]},i2cSpeed:[["100kHz",
"100000L"],["400kHz","400000L"]],builtinLed:[["LED_1","PA_5"]],interrupt:[["interrupt0","2"],["interrupt1","3"]]};Blockly.mbed.Boards["selected"]=Blockly.mbed.Boards["profiles"]["nucleo_f103rb"];
Blockly.mbed.Boards["refreshBlockFieldDropdown"]=function(block,fieldName,boardKey){var field=block.getField(fieldName);var fieldValue=field.getValue();var dataArray=Blockly.mbed.Boards.selected[boardKey];field.menuGenerator_=dataArray;var currentValuePresent=false;for(var i=0;i<dataArray.length;i++)if(fieldValue==dataArray[i][1])currentValuePresent=true;if(!currentValuePresent)block.setWarningText("The old pin value "+fieldValue+" is no longer available.","bPin");else block.setWarningText(null,"bPin")};Blockly.mbed.colour={};Blockly.mbed["colour_picker"]=Blockly.mbed.noGeneratorCodeInline;Blockly.mbed["colour_random"]=Blockly.mbed.noGeneratorCodeInline;Blockly.mbed["colour_rgb"]=Blockly.mbed.noGeneratorCodeInline;Blockly.mbed["colour_blend"]=Blockly.mbed.noGeneratorCodeInline;Blockly.mbed.IO={};Blockly.mbed["io_digitalwrite"]=function(block){var pin=block.getFieldValue("PIN");var stateOutput=Blockly.mbed.valueToCode(block,"STATE",Blockly.mbed.ORDER_ATOMIC)||"LOW";Blockly.mbed.reservePin(block,pin,Blockly.mbed.PinTypes.OUTPUT,"Digital Write");var digitalOut_Name="myDigitalOut"+pin;Blockly.mbed.addDeclaration(digitalOut_Name,"DigitalOut "+digitalOut_Name+"("+pin+");");var code=digitalOut_Name+".write("+stateOutput+");\n";return code};
Blockly.mbed["io_digitalread"]=function(block){var pin=block.getFieldValue("PIN");Blockly.mbed.reservePin(block,pin,Blockly.mbed.PinTypes.INPUT,"Digital Read");var digitalIn_Name="myDigitalIn"+pin;Blockly.mbed.addDeclaration(digitalIn_Name,"DigitalIn "+digitalIn_Name+"("+pin+");");var code=digitalIn_Name+".read()";return[code,Blockly.mbed.ORDER_ATOMIC]};
Blockly.mbed["io_builtin_led"]=function(block){var pin=block.getFieldValue("BUILT_IN_LED");var stateOutput=Blockly.mbed.valueToCode(block,"STATE",Blockly.mbed.ORDER_ATOMIC)||"LOW";Blockly.mbed.reservePin(block,pin,Blockly.mbed.PinTypes.OUTPUT,"Set LED");var digitalOut_Name="myDigitalOut"+pin;Blockly.mbed.addDeclaration(digitalOut_Name,"DigitalOut "+digitalOut_Name+"("+pin+");");var code=digitalOut_Name+".write("+stateOutput+");\n";return code};
Blockly.mbed["io_analogwrite"]=function(block){var pin=block.getFieldValue("PIN");var stateOutput=Blockly.mbed.valueToCode(block,"NUM",Blockly.mbed.ORDER_ATOMIC)||"0";Blockly.mbed.reservePin(block,pin,Blockly.mbed.PinTypes.OUTPUT,"Analogue Write");var pinSetupCode="pinMode("+pin+", OUTPUT);";Blockly.mbed.addSetup("io_"+pin,pinSetupCode,false);if(stateOutput<0||stateOutput>255)block.setWarningText("The analogue value set must be between 0 and 255","pwm_value");else block.setWarningText(null,"pwm_value");
var code="analogWrite("+pin+", "+stateOutput+");\n";return code};Blockly.mbed["io_analogread"]=function(block){var pin=block.getFieldValue("PIN");Blockly.mbed.reservePin(block,pin,Blockly.mbed.PinTypes.INPUT,"Analogue Read");var ioName="myIO"+pin;Blockly.mbed.addDeclaration("io_"+pin,"AnalogIn "+ioName+"("+pin+");");var code=ioName+".read()";return[code,Blockly.mbed.ORDER_ATOMIC]};Blockly.mbed["io_highlow"]=function(block){var code=block.getFieldValue("STATE");return[code,Blockly.mbed.ORDER_ATOMIC]};
Blockly.mbed["io_pulsein"]=function(block){var pin=block.getFieldValue("PULSEPIN");var type=Blockly.mbed.valueToCode(block,"PULSETYPE",Blockly.mbed.ORDER_ATOMIC);Blockly.mbed.reservePin(block,pin,Blockly.mbed.PinTypes.INPUT,"Pulse Pin");var pinSetupCode="pinMode("+pin+", INPUT);\n";Blockly.mbed.addSetup("io_"+pin,pinSetupCode,false);var code="pulseIn("+pin+", "+type+")";return[code,Blockly.mbed.ORDER_ATOMIC]};
Blockly.mbed["io_pulsetimeout"]=function(block){var pin=block.getFieldValue("PULSEPIN");var type=Blockly.mbed.valueToCode(block,"PULSETYPE",Blockly.mbed.ORDER_ATOMIC);var timeout=Blockly.mbed.valueToCode(block,"TIMEOUT",Blockly.mbed.ORDER_ATOMIC);Blockly.mbed.reservePin(block,pin,Blockly.mbed.PinTypes.INPUT,"Pulse Pin");var pinSetupCode="pinMode("+pin+", INPUT);\n";Blockly.mbed.addSetup("io_"+pin,pinSetupCode,false);var code="pulseIn("+pin+", "+type+", "+timeout+")";return[code,Blockly.mbed.ORDER_ATOMIC]};Blockly.mbed.lists={};Blockly.mbed["lists_create_empty"]=Blockly.mbed.noGeneratorCodeInline;Blockly.mbed["lists_create_with"]=function(block){return""};Blockly.mbed["lists_repeat"]=Blockly.mbed.noGeneratorCodeInline;Blockly.mbed["lists_length"]=Blockly.mbed.noGeneratorCodeInline;Blockly.mbed["lists_isEmpty"]=Blockly.mbed.noGeneratorCodeInline;Blockly.mbed["lists_indexOf"]=Blockly.mbed.noGeneratorCodeInline;
Blockly.mbed["lists_getIndex"]=function(block){var mode=block.getFieldValue("MODE")||"GET";var where=block.getFieldValue("WHERE")||"FROM_START";var listOrder=where=="RANDOM"?Blockly.mbed.ORDER_COMMA:Blockly.mbed.ORDER_MEMBER;var list=Blockly.mbed.valueToCode(block,"VALUE",listOrder)||"[]";switch(where){case "FIRST":if(mode=="GET"){var code=list+"[0]";return[code,Blockly.mbed.ORDER_MEMBER]}else if(mode=="GET_REMOVE"){var code=list+".shift()";return[code,Blockly.mbed.ORDER_MEMBER]}else if(mode=="REMOVE")return list+
".shift();\n";break;case "LAST":if(mode=="GET"){var code=list+"[sizeof("+list+")/sizeof("+list+"[0])-1]";return[code,Blockly.mbed.ORDER_MEMBER]}else if(mode=="GET_REMOVE"){var code=list+".pop()";return[code,Blockly.mbed.ORDER_MEMBER]}else if(mode=="REMOVE")return list+".pop();\n";break;case "FROM_START":var at=Blockly.mbed.getAdjusted(block,"AT");if(mode=="GET"){var code=list+"["+at+"]";return[code,Blockly.mbed.ORDER_MEMBER]}else if(mode=="GET_REMOVE"){var code=list+".splice("+at+", 1)[0]";return[code,
Blockly.mbed.ORDER_FUNCTION_CALL]}else if(mode=="REMOVE")return list+".splice("+at+", 1);\n";break;case "FROM_END":var at=Blockly.mbed.getAdjusted(block,"AT",1,true);if(mode=="GET"){var code=list+".slice("+at+")[0]";return[code,Blockly.mbed.ORDER_FUNCTION_CALL]}else if(mode=="GET_REMOVE"){var code=list+".splice("+at+", 1)[0]";return[code,Blockly.mbed.ORDER_FUNCTION_CALL]}else if(mode=="REMOVE")return list+".splice("+at+", 1);";break;case "RANDOM":var functionName=Blockly.mbed.provideFunction_("listsGetRandomItem",
["function "+Blockly.mbed.FUNCTION_NAME_PLACEHOLDER_+"(list, remove) {"," var x \x3d Math.floor(Math.random() * list.length);"," if (remove) {"," return list.splice(x, 1)[0];"," } else {"," return list[x];"," }","}"]);code=functionName+"("+list+", "+(mode!="GET")+")";if(mode=="GET"||mode=="GET_REMOVE")return[code,Blockly.mbed.ORDER_FUNCTION_CALL];else if(mode=="REMOVE")return code+";\n";break}throw"Unhandled combination (lists_getIndex).";};
Blockly.mbed["lists_setIndex"]=function(block){var list=Blockly.mbed.valueToCode(block,"LIST",Blockly.mbed.ORDER_MEMBER)||"[]";var mode=block.getFieldValue("MODE")||"GET";var where=block.getFieldValue("WHERE")||"FROM_START";var value=Blockly.mbed.valueToCode(block,"TO",Blockly.mbed.ORDER_ASSIGNMENT)||"null";function cacheList(){if(list.match(/^\w+$/))return"";var listVar=Blockly.mbed.variableDB_.getDistinctName("tmpList",Blockly.Variables.NAME_TYPE);var code="var "+listVar+" \x3d "+list+";\n";list=
listVar;return code}switch(where){case "FIRST":if(mode=="SET")return list+"[0] \x3d "+value+";\n";else if(mode=="INSERT")return list+".unshift("+value+");\n";break;case "LAST":if(mode=="SET"){var code=cacheList();code+=list+"[sizeof("+list+")/sizeof("+list+"[0])-1]"+"\x3d "+value+";\n";return code}else if(mode=="INSERT")return list+".push("+value+");\n";break;case "FROM_START":var at=Blockly.mbed.getAdjusted(block,"AT");if(mode=="SET")return list+"["+at+"] \x3d "+value+";\n";else if(mode=="INSERT")return list+
".splice("+at+", 0, "+value+");\n";break;case "FROM_END":var at=Blockly.mbed.getAdjusted(block,"AT",1,false,Blockly.mbed.ORDER_SUBTRACTION);var code=cacheList();if(mode=="SET"){code+=list+"["+list+".length - "+at+"] \x3d "+value+";\n";return code}else if(mode=="INSERT"){code+=list+".splice("+list+".length - "+at+", 0, "+value+");\n";return code}break;case "RANDOM":var code=cacheList();var xVar=Blockly.mbed.variableDB_.getDistinctName("tmpX",Blockly.Variables.NAME_TYPE);code+="var "+xVar+" \x3d Math.floor(Math.random() * "+
list+".length);\n";if(mode=="SET"){code+=list+"["+xVar+"] \x3d "+value+";\n";return code}else if(mode=="INSERT"){code+=list+".splice("+xVar+", 0, "+value+");\n";return code}break}throw"Unhandled combination (lists_setIndex).";};Blockly.mbed.logic={};
Blockly.mbed["controls_if"]=function(block){var n=0;var argument=Blockly.mbed.valueToCode(block,"IF"+n,Blockly.mbed.ORDER_NONE)||"false";var branch=Blockly.mbed.statementToCode(block,"DO"+n);var code="if ("+argument+") {\n"+branch+"}";for(n=1;n<=block.elseifCount_;n++){argument=Blockly.mbed.valueToCode(block,"IF"+n,Blockly.mbed.ORDER_NONE)||"false";branch=Blockly.mbed.statementToCode(block,"DO"+n);code+=" else if ("+argument+") {\n"+branch+"}"}if(block.elseCount_){branch=Blockly.mbed.statementToCode(block,"ELSE");
code+=" else {\n"+branch+"}"}return code+"\n"};
Blockly.mbed["logic_compare"]=function(block){var OPERATORS={"EQ":"\x3d\x3d","NEQ":"!\x3d","LT":"\x3c","LTE":"\x3c\x3d","GT":"\x3e","GTE":"\x3e\x3d"};var operator=OPERATORS[block.getFieldValue("OP")];var order=operator=="\x3d\x3d"||operator=="!\x3d"?Blockly.mbed.ORDER_EQUALITY:Blockly.mbed.ORDER_RELATIONAL;var argument0=Blockly.mbed.valueToCode(block,"A",order)||"0";var argument1=Blockly.mbed.valueToCode(block,"B",order)||"0";var code=argument0+" "+operator+" "+argument1;return[code,order]};
Blockly.mbed["logic_operation"]=function(block){var operator=block.getFieldValue("OP")=="AND"?"\x26\x26":"||";var order=operator=="\x26\x26"?Blockly.mbed.ORDER_LOGICAL_AND:Blockly.mbed.ORDER_LOGICAL_OR;var argument0=Blockly.mbed.valueToCode(block,"A",order)||"false";var argument1=Blockly.mbed.valueToCode(block,"B",order)||"false";if(!argument0&&!argument1){argument0="false";argument1="false"}else{var defaultArgument=operator=="\x26\x26"?"true":"false";if(!argument0)argument0=defaultArgument;if(!argument1)argument1=
defaultArgument}var code=argument0+" "+operator+" "+argument1;return[code,order]};Blockly.mbed["logic_negate"]=function(block){var order=Blockly.mbed.ORDER_UNARY_PREFIX;var argument0=Blockly.mbed.valueToCode(block,"BOOL",order)||"false";var code="!"+argument0;return[code,order]};Blockly.mbed["logic_boolean"]=function(block){var code=block.getFieldValue("BOOL")=="TRUE"?"true":"false";return[code,Blockly.mbed.ORDER_ATOMIC]};Blockly.mbed["logic_null"]=function(block){var code="NULL";return[code,Blockly.mbed.ORDER_ATOMIC]};
Blockly.mbed["logic_ternary"]=function(block){var valueIf=Blockly.mbed.valueToCode(block,"IF",Blockly.mbed.ORDER_CONDITIONAL)||"false";var valueThen=Blockly.mbed.valueToCode(block,"THEN",Blockly.mbed.ORDER_CONDITIONAL)||"null";var valueElse=Blockly.mbed.valueToCode(block,"ELSE",Blockly.mbed.ORDER_CONDITIONAL)||"null";var code=valueIf+" ? "+valueThen+" : "+valueElse;return[code,Blockly.mbed.ORDER_CONDITIONAL]};Blockly.mbed.loops={};Blockly.mbed["controls_repeat"]=function(block){var repeats=Number(block.getFieldValue("TIMES"));var branch=Blockly.mbed.statementToCode(block,"DO");branch=Blockly.mbed.addLoopTrap(branch,block.id);var loopVar=Blockly.mbed.variableDB_.getDistinctName("count",Blockly.Variables.NAME_TYPE);var code="for (int "+loopVar+" \x3d 0; "+loopVar+" \x3c "+repeats+"; "+loopVar+"++) {\n"+branch+"}\n";return code};
Blockly.mbed["controls_repeat_ext"]=function(block){var repeats=Blockly.mbed.valueToCode(block,"TIMES",Blockly.mbed.ORDER_ADDITIVE)||"0";var branch=Blockly.mbed.statementToCode(block,"DO");branch=Blockly.mbed.addLoopTrap(branch,block.id);var code="";var loopVar=Blockly.mbed.variableDB_.getDistinctName("count",Blockly.Variables.NAME_TYPE);var endVar=repeats;if(!repeats.match(/^\w+$/)&&!Blockly.isNumber(repeats)){var endVar=Blockly.mbed.variableDB_.getDistinctName("repeat_end",Blockly.Variables.NAME_TYPE);
code+="int "+endVar+" \x3d "+repeats+";\n"}code+="for (int "+loopVar+" \x3d 0; "+loopVar+" \x3c "+endVar+"; "+loopVar+"++) {\n"+branch+"}\n";return code};
Blockly.mbed["controls_whileUntil"]=function(block){var until=block.getFieldValue("MODE")=="UNTIL";var argument0=Blockly.mbed.valueToCode(block,"BOOL",until?Blockly.mbed.ORDER_LOGICAL_OR:Blockly.mbed.ORDER_NONE)||"false";var branch=Blockly.mbed.statementToCode(block,"DO");branch=Blockly.mbed.addLoopTrap(branch,block.id);if(until){if(!argument0.match(/^\w+$/))argument0="("+argument0+")";argument0="!"+argument0}return"while ("+argument0+") {\n"+branch+"}\n"};
Blockly.mbed["controls_for"]=function(block){var variable0=Blockly.mbed.variableDB_.getName(block.getFieldValue("VAR"),Blockly.Variables.NAME_TYPE);var argument0=Blockly.mbed.valueToCode(block,"FROM",Blockly.mbed.ORDER_ASSIGNMENT)||"0";var argument1=Blockly.mbed.valueToCode(block,"TO",Blockly.mbed.ORDER_ASSIGNMENT)||"0";var increment=Blockly.mbed.valueToCode(block,"BY",Blockly.mbed.ORDER_ASSIGNMENT)||"1";var branch=Blockly.mbed.statementToCode(block,"DO");branch=Blockly.mbed.addLoopTrap(branch,block.id);
var code;if(Blockly.isNumber(argument0)&&Blockly.isNumber(argument1)&&Blockly.isNumber(increment)){var up=parseFloat(argument0)<=parseFloat(argument1);code="for ("+variable0+" \x3d "+argument0+"; "+variable0+(up?" \x3c\x3d ":" \x3e\x3d ")+argument1+"; "+variable0;var step=Math.abs(parseFloat(increment));if(step==1)code+=up?"++":"--";else code+=(up?" +\x3d ":" -\x3d ")+step;code+=") {\n"+branch+"}\n"}else{code="";var startVar=argument0;if(!argument0.match(/^\w+$/)&&!Blockly.isNumber(argument0)){var startVar=
Blockly.mbed.variableDB_.getDistinctName(variable0+"_start",Blockly.Variables.NAME_TYPE);code+="int "+startVar+" \x3d "+argument0+";\n"}var endVar=argument1;if(!argument1.match(/^\w+$/)&&!Blockly.isNumber(argument1)){var endVar=Blockly.mbed.variableDB_.getDistinctName(variable0+"_end",Blockly.Variables.NAME_TYPE);code+="int "+endVar+" \x3d "+argument1+";\n"}var incVar=Blockly.mbed.variableDB_.getDistinctName(variable0+"_inc",Blockly.Variables.NAME_TYPE);code+="int "+incVar+" \x3d ";if(Blockly.isNumber(increment))code+=
Math.abs(increment)+";\n";else code+="abs("+increment+");\n";code+="if ("+startVar+" \x3e "+endVar+") {\n";code+=Blockly.mbed.INDENT+incVar+" \x3d -"+incVar+";\n";code+="}\n";code+="for ("+variable0+" \x3d "+startVar+";\n"+" "+incVar+" \x3e\x3d 0 ? "+variable0+" \x3c\x3d "+endVar+" : "+variable0+" \x3e\x3d "+endVar+";\n"+" "+variable0+" +\x3d "+incVar+") {\n"+branch+"}\n"}return code};Blockly.mbed["controls_forEach"]=Blockly.mbed.noGeneratorCodeLine;
Blockly.mbed["controls_flow_statements"]=function(block){switch(block.getFieldValue("FLOW")){case "BREAK":return"break;\n";case "CONTINUE":return"continue;\n"}throw"Unknown flow statement.";};Blockly.mbed.macro={};Blockly.mbed["macro_get"]=function(block){var code=Blockly.mbed.variableDB_.getName(block.getFieldValue("MACRO_NAME"),Blockly.Macro.NAME_TYPE);return[code,Blockly.mbed.ORDER_ATOMIC]};
Blockly.mbed["macro_define"]=function(block){var argument0=Blockly.mbed.valueToCode(block,"MACRO_DEFINE_AS",Blockly.mbed.ORDER_ASSIGNMENT)||"0";var varName=Blockly.mbed.variableDB_.getName(block.getFieldValue("MACRO_NAME"),Blockly.Macro.NAME_TYPE);Blockly.mbed.addDeclaration(varName,"#define "+varName+" "+argument0);return""};Blockly.mbed.map={};Blockly.mbed["base_map"]=function(block){var valueNum=Blockly.mbed.valueToCode(block,"NUM",Blockly.mbed.ORDER_NONE)||"0";var valueDmax=Blockly.mbed.valueToCode(block,"DMAX",Blockly.mbed.ORDER_ATOMIC)||"0";var code="map("+valueNum+", 0, 1024, 0, "+valueDmax+")";return[code,Blockly.mbed.ORDER_NONE]};Blockly.mbed.math={};Blockly.mbed["math_number"]=function(block){var code=parseFloat(block.getFieldValue("NUM"));if(code==Infinity)code="INFINITY";else if(code==-Infinity)code="-INFINITY";return[code,Blockly.mbed.ORDER_ATOMIC]};
Blockly.mbed["math_arithmetic"]=function(block){var OPERATORS={ADD:[" + ",Blockly.mbed.ORDER_ADDITIVE],MINUS:[" - ",Blockly.mbed.ORDER_ADDITIVE],MULTIPLY:[" * ",Blockly.mbed.ORDER_MULTIPLICATIVE],DIVIDE:[" / ",Blockly.mbed.ORDER_MULTIPLICATIVE],POWER:[null,Blockly.mbed.ORDER_NONE],BITWISE_AND:[" \x26 ",Blockly.mbed.ORDER_BITWISE_AND],BITWISE_OR:[" | ",Blockly.mbed.ORDER_BITWISE_OR]};var tuple=OPERATORS[block.getFieldValue("OP")];var operator=tuple[0];var order=tuple[1];var argument0=Blockly.mbed.valueToCode(block,
"A",order)||"0";var argument1=Blockly.mbed.valueToCode(block,"B",order)||"0";var code;if(!operator){code="Math.pow("+argument0+", "+argument1+")";return[code,Blockly.mbed.ORDER_UNARY_POSTFIX]}code=argument0+operator+argument1;return[code,order]};
Blockly.mbed["math_single"]=function(block){var operator=block.getFieldValue("OP");var code;var arg;if(operator=="NEG"){arg=Blockly.mbed.valueToCode(block,"NUM",Blockly.mbed.ORDER_UNARY_PREFIX)||"0";if(arg[0]=="-")arg=" "+arg;code="-"+arg;return[code,Blockly.mbed.ORDER_UNARY_PREFIX]}if(operator=="ABS"||operator.substring(0,5)=="ROUND")arg=Blockly.mbed.valueToCode(block,"NUM",Blockly.mbed.ORDER_UNARY_POSTFIX)||"0";else if(operator=="SIN"||operator=="COS"||operator=="TAN")arg=Blockly.mbed.valueToCode(block,
"NUM",Blockly.mbed.ORDER_MULTIPLICATIVE)||"0";else arg=Blockly.mbed.valueToCode(block,"NUM",Blockly.mbed.ORDER_NONE)||"0";switch(operator){case "BITWISE_NOT":code="~"+arg;break;case "ABS":code="abs("+arg+")";break;case "ROOT":code="sqrt("+arg+")";break;case "LN":code="log("+arg+")";break;case "EXP":code="exp("+arg+")";break;case "POW10":code="pow(10,"+arg+")";break;case "ROUND":code="round("+arg+")";break;case "ROUNDUP":code="ceil("+arg+")";break;case "ROUNDDOWN":code="floor("+arg+")";break;case "SIN":code=
"sin("+arg+" / 180 * Math.PI)";break;case "COS":code="cos("+arg+" / 180 * Math.PI)";break;case "TAN":code="tan("+arg+" / 180 * Math.PI)";break}if(code)return[code,Blockly.mbed.ORDER_UNARY_POSTFIX];switch(operator){case "LOG10":code="log("+arg+") / log(10)";break;case "ASIN":code="asin("+arg+") / M_PI * 180";break;case "ACOS":code="acos("+arg+") / M_PI * 180";break;case "ATAN":code="atan("+arg+") / M_PI * 180";break;default:throw"Unknown math operator: "+operator;}return[code,Blockly.mbed.ORDER_MULTIPLICATIVE]};
Blockly.mbed["math_constant"]=function(block){var CONSTANTS={"PI":["M_PI",Blockly.mbed.ORDER_UNARY_POSTFIX],"E":["M_E",Blockly.mbed.ORDER_UNARY_POSTFIX],"GOLDEN_RATIO":["(1 + sqrt(5)) / 2",Blockly.mbed.ORDER_MULTIPLICATIVE],"SQRT2":["M_SQRT2",Blockly.mbed.ORDER_UNARY_POSTFIX],"SQRT1_2":["M_SQRT1_2",Blockly.mbed.ORDER_UNARY_POSTFIX],"INFINITY":["INFINITY",Blockly.mbed.ORDER_ATOMIC]};return CONSTANTS[block.getFieldValue("CONSTANT")]};
Blockly.mbed["math_number_property"]=function(block){var number_to_check=Blockly.mbed.valueToCode(block,"NUMBER_TO_CHECK",Blockly.mbed.ORDER_MULTIPLICATIVE)||"0";var dropdown_property=block.getFieldValue("PROPERTY");var code;if(dropdown_property=="PRIME"){var func=["boolean "+Blockly.mbed.DEF_FUNC_NAME+"(int n) {"," // https://en.wikipedia.org/wiki/Primality_test#Naive_methods"," if (n \x3d\x3d 2 || n \x3d\x3d 3) {"," return true;"," }"," // False if n is NaN, negative, is 1."," // And false if n is divisible by 2 or 3.",
" if (isnan(n) || (n \x3c\x3d 1) || (n \x3d\x3d 1) || (n % 2 \x3d\x3d 0) || "+"(n % 3 \x3d\x3d 0)) {"," return false;"," }"," // Check all the numbers of form 6k +/- 1, up to sqrt(n)."," for (int x \x3d 6; x \x3c\x3d sqrt(n) + 1; x +\x3d 6) {"," if (n % (x - 1) \x3d\x3d 0 || n % (x + 1) \x3d\x3d 0) {"," return false;"," }"," }"," return true;","}"];var funcName=Blockly.mbed.addFunction("mathIsPrime",func.join("\n"));Blockly.mbed.addInclude("math","#include \x3cmath.h\x3e");code=
funcName+"("+number_to_check+")";return[code,Blockly.mbed.ORDER_UNARY_POSTFIX]}switch(dropdown_property){case "EVEN":code=number_to_check+" % 2 \x3d\x3d 0";break;case "ODD":code=number_to_check+" % 2 \x3d\x3d 1";break;case "WHOLE":Blockly.mbed.addInclude("math","#include \x3cmath.h\x3e");code="(floor("+number_to_check+") \x3d\x3d "+number_to_check+")";break;case "POSITIVE":code=number_to_check+" \x3e 0";break;case "NEGATIVE":code=number_to_check+" \x3c 0";break;case "DIVISIBLE_BY":var divisor=Blockly.mbed.valueToCode(block,
"DIVISOR",Blockly.mbed.ORDER_MULTIPLICATIVE)||"0";code=number_to_check+" % "+divisor+" \x3d\x3d 0";break}return[code,Blockly.mbed.ORDER_EQUALITY]};Blockly.mbed["math_change"]=function(block){var argument0=Blockly.mbed.valueToCode(block,"DELTA",Blockly.mbed.ORDER_ADDITIVE)||"0";var varName=Blockly.mbed.variableDB_.getName(block.getFieldValue("VAR"),Blockly.Variables.NAME_TYPE);return varName+" +\x3d "+argument0+";\n"};Blockly.mbed["math_round"]=Blockly.mbed["math_single"];
Blockly.mbed["math_trig"]=Blockly.mbed["math_single"];Blockly.mbed["math_on_list"]=Blockly.mbed.noGeneratorCodeInline;Blockly.mbed["math_modulo"]=function(block){var argument0=Blockly.mbed.valueToCode(block,"DIVIDEND",Blockly.mbed.ORDER_MULTIPLICATIVE)||"0";var argument1=Blockly.mbed.valueToCode(block,"DIVISOR",Blockly.mbed.ORDER_MULTIPLICATIVE)||"0";var code=argument0+" % "+argument1;return[code,Blockly.mbed.ORDER_MULTIPLICATIVE]};
Blockly.mbed["math_constrain"]=function(block){var argument0=Blockly.mbed.valueToCode(block,"VALUE",Blockly.mbed.ORDER_NONE)||"0";var argument1=Blockly.mbed.valueToCode(block,"LOW",Blockly.mbed.ORDER_NONE)||"0";var argument2=Blockly.mbed.valueToCode(block,"HIGH",Blockly.mbed.ORDER_NONE)||"0";var code="("+argument0+" \x3c "+argument1+" ? "+argument1+" : ( "+argument0+" \x3e "+argument2+" ? "+argument2+" : "+argument0+"))";return[code,Blockly.mbed.ORDER_UNARY_POSTFIX]};
Blockly.mbed["math_random_int"]=function(block){var argument0=Blockly.mbed.valueToCode(block,"FROM",Blockly.mbed.ORDER_NONE)||"0";var argument1=Blockly.mbed.valueToCode(block,"TO",Blockly.mbed.ORDER_NONE)||"0";var functionName=Blockly.mbed.variableDB_.getDistinctName("math_random_int",Blockly.Generator.NAME_TYPE);Blockly.mbed.math_random_int.random_function=functionName;var func=["int "+Blockly.mbed.DEF_FUNC_NAME+"(int min, int max) {"," if (min \x3e max) {"," // Swap min and max to ensure min is smaller.",
" int temp \x3d min;"," min \x3d max;"," max \x3d temp;"," }"," return min + (rand() % (max - min + 1));","}"];var funcName=Blockly.mbed.addFunction("mathRandomInt",func.join("\n"));var code=funcName+"("+argument0+", "+argument1+")";return[code,Blockly.mbed.ORDER_UNARY_POSTFIX]};Blockly.mbed["math_random_float"]=function(block){return["(rand() / RAND_MAX)",Blockly.mbed.ORDER_UNARY_POSTFIX]};Blockly.mbed.procedures={};
Blockly.mbed["procedures_defreturn"]=function(block){var funcName=Blockly.mbed.variableDB_.getName(block.getFieldValue("NAME"),Blockly.Procedures.NAME_TYPE);var branch=Blockly.mbed.statementToCode(block,"STACK");var bindPin=block.getFieldValue("InterruptPin")||"";var InterruptInSetupCode=null;if(bindPin){var InterruptIn_instance_name="InterruptIn_"+funcName;Blockly.mbed.addDeclaration(InterruptIn_instance_name,"InterruptIn "+InterruptIn_instance_name+"("+bindPin+");");InterruptInSetupCode=InterruptIn_instance_name+
".rise(\x26"+funcName+");"}if(Blockly.mbed.STATEMENT_PREFIX)branch=Blockly.mbed.prefixLines(Blockly.mbed.STATEMENT_PREFIX.replace(/%1/g,"'"+block.id+"'"),Blockly.mbed.INDENT)+branch;if(Blockly.mbed.INFINITE_LOOP_TRAP)branch=Blockly.mbed.INFINITE_LOOP_TRAP.replace(/%1/g,"'"+block.id+"'")+branch;var returnValue=Blockly.mbed.valueToCode(block,"RETURN",Blockly.mbed.ORDER_NONE)||"";if(returnValue)returnValue=" return "+returnValue+";\n";var args=[];for(var x=0;x<block.arguments_.length;x++)args[x]=Blockly.mbed.getmbedType_(block.getArgType(block.arguments_[x]))+
" "+Blockly.mbed.variableDB_.getName(block.arguments_[x],Blockly.Variables.NAME_TYPE);var returnType=Blockly.Types.NULL;if(block.getReturnType)returnType=block.getReturnType();returnType=Blockly.mbed.getmbedType_(returnType);var code=returnType+" "+funcName+"("+args.join(", ")+") {\n"+branch+returnValue+"}";code=Blockly.mbed.scrub_(block,code);Blockly.mbed.userFunctions_[funcName]=code;return InterruptInSetupCode};Blockly.mbed["procedures_defnoreturn"]=Blockly.mbed["procedures_defreturn"];
Blockly.mbed["InterruptIn"]=Blockly.mbed["procedures_defreturn"];Blockly.mbed["procedures_callreturn"]=function(block){var funcName=Blockly.mbed.variableDB_.getName(block.getFieldValue("NAME"),Blockly.Procedures.NAME_TYPE);var args=[];for(var x=0;x<block.arguments_.length;x++)args[x]=Blockly.mbed.valueToCode(block,"ARG"+x,Blockly.mbed.ORDER_NONE)||"null";var code=funcName+"("+args.join(", ")+")";return[code,Blockly.mbed.ORDER_UNARY_POSTFIX]};
Blockly.mbed["procedures_callnoreturn"]=function(block){var funcName=Blockly.mbed.variableDB_.getName(block.getFieldValue("NAME"),Blockly.Procedures.NAME_TYPE);var args=[];for(var x=0;x<block.arguments_.length;x++)args[x]=Blockly.mbed.valueToCode(block,"ARG"+x,Blockly.mbed.ORDER_NONE)||"null";var code=funcName+"("+args.join(", ")+");\n";return code};
Blockly.mbed["procedures_ifreturn"]=function(block){var condition=Blockly.mbed.valueToCode(block,"CONDITION",Blockly.mbed.ORDER_NONE)||"false";var code="if ("+condition+") {\n";if(block.hasReturnValue_){var value=Blockly.mbed.valueToCode(block,"VALUE",Blockly.mbed.ORDER_NONE)||"null";code+=" return "+value+";\n"}else code+=" return;\n";code+="}\n";return code};
Blockly.mbed["mbed_functions"]=function(block){function statementToCodeNoTab(block,name){var targetBlock=block.getInputTargetBlock(name);var code=Blockly.mbed.blockToCode(targetBlock);if(!goog.isString(code))throw'Expecting code from statement block "'+targetBlock.type+'".';return code}var setupBranch=Blockly.mbed.statementToCode(block,"SETUP_FUNC");if(setupBranch)Blockly.mbed.addSetup("userSetupCode",setupBranch,true);var loopBranch=statementToCodeNoTab(block,"LOOP_FUNC");return loopBranch};Blockly.mbed.serial={};Blockly.mbed["print_content"]=function(block){var format_content=Blockly.mbed.valueToCode(block,"format_content",Blockly.mbed.ORDER_ATOMIC);var join_content=Blockly.mbed.valueToCode(block,"join_content",Blockly.mbed.ORDER_ATOMIC)||"";var code;if(join_content)code=format_content+","+join_content;else code=format_content;return[code,Blockly.mbed.ORDER_ATOMIC]};
Blockly.mbed["serial_print"]=function(block){var serialName=block.getFieldValue("SERIAL_Pins");var content=Blockly.mbed.valueToCode(block,"CONTENT",Blockly.mbed.ORDER_ATOMIC)||"0";var content_str=Blockly.mbed.valueToCode(block,"CONTENT_STR",Blockly.mbed.ORDER_ATOMIC)||"";var checkbox_name=block.getFieldValue("NEW_LINE")=="TRUE";if(checkbox_name)content=content.slice(0,content.length-1)+'\\n"';var code;if(content_str)code=serialName+".printf("+content+","+content_str+");\n";else code=serialName+".printf("+
content+");\n";return code};Blockly.mbed["serial_getc"]=function(block){var serialName=block.getFieldValue("SERIAL_Pins");var code;code=serialName+".getc()";return[code,Blockly.mbed.ORDER_ATOMIC]};
Blockly.mbed["serial_setup"]=function(block){var serialId=block.getFieldValue("SERIAL_ID");var serialId_TX=block.getFieldValue("SERIAL_ID_TX");var serialRX=Blockly.mbed.Boards.selected.serialMapper[serialId];var serialTX=Blockly.mbed.Boards.selected.serialMapper[serialId_TX];console.assert(serialRX==serialTX);var serialName=serialRX;var serialSpeed=block.getFieldValue("SPEED");var serialSetupCode=serialName+".baud("+serialSpeed+");";Blockly.mbed.addDeclaration("serial_"+serialId,"Serial "+serialName+
"("+serialId_TX+","+serialId+");");var code=serialSetupCode+"\n";return code};
Blockly.mbed["serial_attach"]=function(block){var serialName=block.getFieldValue("SERIAL_Pins");var branch=Blockly.mbed.statementToCode(block,"function_body");if(Blockly.mbed.STATEMENT_PREFIX)branch=Blockly.mbed.prefixLines(Blockly.mbed.STATEMENT_PREFIX.replace(/%1/g,"'"+block.id+"'"),Blockly.mbed.INDENT)+branch;if(Blockly.mbed.INFINITE_LOOP_TRAP)branch=Blockly.mbed.INFINITE_LOOP_TRAP.replace(/%1/g,"'"+block.id+"'")+branch;var returnValue=Blockly.mbed.valueToCode(block,"RETURN",Blockly.mbed.ORDER_NONE)||
"";if(returnValue)returnValue=" return "+returnValue+";\n";var args=[];for(var x=0;x<block.arguments_.length;x++)args[x]=Blockly.mbed.getmbedType_(block.getArgType(block.arguments_[x]))+" "+Blockly.mbed.variableDB_.getName(block.arguments_[x],Blockly.Variables.NAME_TYPE);var returnType=Blockly.Types.NULL;if(block.getReturnType)returnType=block.getReturnType();returnType=Blockly.mbed.getmbedType_(returnType);var functionName=serialName+"_interrupt_fun";var code=returnType+" "+functionName+"("+args.join(", ")+
") {\n"+branch+returnValue+"}";code=Blockly.mbed.scrub_(block,code);Blockly.mbed.userFunctions_[functionName]=code;code=serialName+".attach(\x26"+functionName+");\n";return code};Blockly.mbed.servo={};
Blockly.mbed["servo_write"]=function(block){var pinKey=block.getFieldValue("SERVO_PIN");var servoPulseWidth=Blockly.mbed.valueToCode(block,"SERVO_PULSEWIDTH",Blockly.mbed.ORDER_ATOMIC)||"1";var servoName="myServo"+pinKey;var timeDomain=block.getFieldValue("TimeDomain");Blockly.mbed.reservePin(block,pinKey,Blockly.mbed.PinTypes.SERVO,"Servo Write");Blockly.mbed.addDeclaration("servo_"+pinKey,"PwmOut "+servoName+"("+pinKey+");");var code=servoName+".period_ms(20);\n";code=code+servoName+".pulsewidth_"+
timeDomain+"("+servoPulseWidth+");\n";return code};
Blockly.mbed["servo_read"]=function(block){var pinKey=block.getFieldValue("SERVO_PIN");var servoName="myServo"+pinKey;Blockly.mbed.reservePin(block,pinKey,Blockly.mbed.PinTypes.SERVO,"Servo Read");Blockly.mbed.addInclude("servo","#include \x3cServo.h\x3e");Blockly.mbed.addDeclaration("servo_"+pinKey,"Servo "+servoName+";");var setupCode=servoName+".attach("+pinKey+");";Blockly.mbed.addSetup("servo_"+pinKey,setupCode,true);var code=servoName+".read()";return[code,Blockly.mbed.ORDER_ATOMIC]};Blockly.mbed.spi={};
Blockly.mbed["spi_setup"]=function(block){var spiId=block.getFieldValue("SPI_ID");var spiFrequency=Blockly.mbed.valueToCode(block,"frequency",Blockly.mbed.ORDER_ATOMIC)||1;var spiMode=block.getFieldValue("SPI_MODE");var cs=block.getFieldValue("PIN");var spi_pins=[];if(spiId=="SPI1"&&block.getFieldValue("SPI1_ID")=="PB_3,PB_4,PB_5")spi_pins=Blockly.mbed.Boards.selected.spi1_alternative;else spi_pins=Blockly.mbed.Boards.selected.spiPins[spiId];var spiName="spi_"+spiId;var digitalOut_Name="myDigitalOut"+
cs;Blockly.mbed.addDeclaration(spiName,"SPI "+spiName+"("+spi_pins["MOSI"]+","+spi_pins["MISO"]+","+spi_pins["SCK"]+");");Blockly.mbed.addDeclaration(digitalOut_Name,"DigitalOut "+digitalOut_Name+"("+cs+");");var code="";code+=spiName+".frequency("+spiFrequency*1E5+");\n";code+=spiName+".format(8,"+spiMode+");\n";code+=digitalOut_Name+".write(0);\n";return code};
Blockly.mbed["spi_transfer"]=function(block){var spiId=block.getFieldValue("SPI_ID");var spiData=Blockly.mbed.valueToCode(block,"SPI_DATA",Blockly.mbed.ORDER_ATOMIC)||"0";var spiName="spi_"+spiId;var code=spiName+".write("+spiData+");\n";return code};
Blockly.mbed["spi_transfer_return"]=function(block){var spiId=block.getFieldValue("SPI_ID");var spiSs=block.getFieldValue("SPI_SS");var spiData=Blockly.mbed.valueToCode(block,"SPI_DATA",Blockly.mbed.ORDER_ATOMIC)||"0";var spiTransferOnlyCode=Blockly.mbed["spi_transfer"](block);if(spiSs==="none")var code=spiId+".transfer("+spiData+")";else{var func=["int "+Blockly.mbed.DEF_FUNC_NAME+"() {"," int spiReturn \x3d 0;"," digitalWrite("+spiSs+", HIGH);"," spiReturn \x3d "+spiId+".transfer("+spiData+");",
" digitalWrite("+spiSs+", LOW);"," return spiReturn;","}"];var functionName=Blockly.mbed.addFunction("spiReturnSlave"+spiSs,func.join("\n"));var code=functionName+"()"}return[code,Blockly.mbed.ORDER_UNARY_POSTFIX]};Blockly.mbed.text={};Blockly.mbed["text"]=function(block){var code=Blockly.mbed.quote_(block.getFieldValue("TEXT"));return[code,Blockly.mbed.ORDER_ATOMIC]};
Blockly.mbed["text_join"]=function(block){var code;if(block.itemCount_==0)return['""',Blockly.mbed.ORDER_ATOMIC];else if(block.itemCount_==1){var argument0=Blockly.mbed.valueToCode(block,"ADD0",Blockly.mbed.ORDER_UNARY_POSTFIX)||'""';code="String("+argument0+")";return[code,Blockly.mbed.ORDER_UNARY_POSTFIX]}else{var argument;code=[];for(var n=0;n<block.itemCount_;n++){argument=Blockly.mbed.valueToCode(block,"ADD"+n,Blockly.mbed.ORDER_NONE);if(argument=="")code[n]='""';else code[n]="String("+argument+
")"}code=code.join(" + ");return[code,Blockly.mbed.ORDER_UNARY_POSTFIX]}};Blockly.mbed["text_append"]=function(block){var varName=Blockly.mbed.variableDB_.getName(block.getFieldValue("VAR"),Blockly.Variables.NAME_TYPE);var argument0=Blockly.mbed.valueToCode(block,"TEXT",Blockly.mbed.ORDER_UNARY_POSTFIX);if(argument0=="")argument0='""';else argument0="String("+argument0+")";return varName+" +\x3d "+argument0+";\n"};
Blockly.mbed["text_length"]=function(block){var argument0=Blockly.mbed.valueToCode(block,"VALUE",Blockly.mbed.ORDER_UNARY_POSTFIX)||'""';var code="String("+argument0+").length()";return[code,Blockly.mbed.ORDER_UNARY_POSTFIX]};
Blockly.mbed["text_isEmpty"]=function(block){var func=[];func.push("boolean "+Blockly.mbed.DEF_FUNC_NAME+"(String msg) {");func.push(" if (msg.length() \x3d\x3d 0) {");func.push(" return true;");func.push(" } else {");func.push(" return false;");func.push(" }");func.push("}");var funcName=Blockly.mbed.addFunction("isStringEmpty",func.join("\n"));var argument0=Blockly.mbed.valueToCode(block,"VALUE",Blockly.mbed.ORDER_UNARY_POSTFIX);if(argument0=="")argument0='""';else argument0="String("+
argument0+")";var code=funcName+"("+argument0+")";return[code,Blockly.mbed.ORDER_UNARY_POSTFIX]};Blockly.mbed["text_trim"]=function(block){Blockly.mbed.text_trim.OPERATORS={LEFT:".trim()",RIGHT:".trim()",BOTH:".trim()"};var mode=block.getFieldValue("MODE");var operator=Blockly.mbed.text_trim.OPERATORS[mode];var argument0=Blockly.mbed.valueToCode(block,"TEXT",Blockly.mbed.ORDER_UNARY_POSTFIX);if(argument0=="")argument0='""';else argument0="String("+argument0+")";return[argument0+operator,Blockly.mbed.ORDER_UNARY_POSTFIX]};
Blockly.mbed["text_print"]=function(block){var serialId=Blockly.mbed.Boards.selected.serial[0][1];var setupCode=serialId+".begin(9600);";Blockly.mbed.addSetup("serial_"+serialId,setupCode,false);var argument0=Blockly.mbed.valueToCode(block,"TEXT",Blockly.mbed.ORDER_NONE);if(argument0=="")argument0='""';else argument0="String("+argument0+")";return serialId+".print("+argument0+");\n"};
Blockly.mbed["text_prompt_ext"]=function(block){var serialId=Blockly.mbed.Boards.selected.serial[0][1];var returnType=block.getFieldValue("TYPE");var func=[];var toNumber=returnType==Blockly.Types.NUMBER.output;if(toNumber)func.push("int "+Blockly.mbed.DEF_FUNC_NAME+"(String msg) {");else func.push("String "+Blockly.mbed.DEF_FUNC_NAME+"(String msg) {");func.push(" "+serialId+".println(msg);");func.push(" boolean stringComplete \x3d false;");if(toNumber)func.push(" int content \x3d 0;");else func.push(' String content \x3d "";');
func.push(" while (stringComplete \x3d\x3d false) {");func.push(" if ("+serialId+".available()) {");if(toNumber){func.push(" content \x3d "+serialId+".parseInt();");func.push(" stringComplete \x3d true;")}else{func.push(" char readChar \x3d (char)"+serialId+".read();");func.push(" if (readChar \x3d\x3d '\\n' || readChar \x3d\x3d '\\r') {");func.push(" stringComplete \x3d true;");func.push(" } else {");func.push(" content +\x3d readChar;");func.push(" }")}func.push(" }");
func.push(" }");func.push(" // Empty incoming serial buffer");func.push(" while(Serial.available()) { Serial.read(); };");func.push(" return content;");func.push("}");var funcName=Blockly.mbed.addFunction("getUserInputPrompt"+returnType,func.join("\n"));var setupCode=serialId+".begin(9600);";Blockly.mbed.addSetup("serial_"+serialId,setupCode,false);var msg=Blockly.mbed.valueToCode(block,"TEXT",Blockly.mbed.ORDER_NONE)||'""';var code=funcName+"("+msg+")";return[code,Blockly.mbed.ORDER_UNARY_POSTFIX]};
Blockly.mbed["text_endString"]=function(block){return["",Blockly.mbed.ORDER_UNARY_POSTFIX]};Blockly.mbed["text_indexOf"]=function(block){return["",Blockly.mbed.ORDER_UNARY_POSTFIX]};Blockly.mbed["text_charAt"]=function(block){return["",Blockly.mbed.ORDER_UNARY_POSTFIX]};Blockly.mbed["text_getSubstring"]=function(block){return["",Blockly.mbed.ORDER_UNARY_POSTFIX]};Blockly.mbed["text_changeCase"]=function(block){return["",Blockly.mbed.ORDER_UNARY_POSTFIX]};
Blockly.mbed["text_prompt"]=function(block){return["",Blockly.mbed.ORDER_UNARY_POSTFIX]};Blockly.mbed.time={};Blockly.mbed["time_delay"]=function(block){var delayTime=Blockly.mbed.valueToCode(block,"DELAY_TIME_MILI",Blockly.mbed.ORDER_ATOMIC)||"0";var code="wait("+delayTime/1E3+");\n";return code};Blockly.mbed["time_delaymicros"]=function(block){var delayTimeMs=Blockly.mbed.valueToCode(block,"DELAY_TIME_MICRO",Blockly.mbed.ORDER_ATOMIC)||"0";var code="delayMicroseconds("+delayTimeMs+");\n";return code};Blockly.mbed["time_millis"]=function(block){var code="millis()";return[code,Blockly.mbed.ORDER_ATOMIC]};
Blockly.mbed["time_micros"]=function(block){var code="micros()";return[code,Blockly.mbed.ORDER_ATOMIC]};Blockly.mbed["infinite_loop"]=function(block){return"while(true);\n"};Blockly.mbed.tone={};Blockly.mbed["io_tone"]=function(block){var pin=block.getFieldValue("TONEPIN");var freq=Blockly.mbed.valueToCode(block,"FREQUENCY",Blockly.mbed.ORDER_ATOMIC);Blockly.mbed.reservePin(block,pin,Blockly.mbed.PinTypes.OUTPUT,"Tone Pin");var pinSetupCode="pinMode("+pin+", OUTPUT);\n";Blockly.mbed.addSetup("io_"+pin,pinSetupCode,false);var code="tone("+pin+","+freq+");\n";return code};
Blockly.mbed["io_notone"]=function(block){var pin=block.getFieldValue("TONEPIN");Blockly.mbed.reservePin(block,pin,Blockly.mbed.PinTypes.OUTPUT,"Tone Pin");var pinSetupCode="pinMode("+pin+", OUTPUT);\n";Blockly.mbed.addSetup("io_"+pin,pinSetupCode,false);var code="noTone("+pin+");\n";return code};Blockly.mbed.variables={};Blockly.mbed["variables_get"]=function(block){var code=Blockly.mbed.variableDB_.getName(block.getFieldValue("VAR"),Blockly.Variables.NAME_TYPE);return[code,Blockly.mbed.ORDER_ATOMIC]};Blockly.mbed["variables_set"]=function(block){var argument0=Blockly.mbed.valueToCode(block,"VALUE",Blockly.mbed.ORDER_ASSIGNMENT)||"0";var varName=Blockly.mbed.variableDB_.getName(block.getFieldValue("VAR"),Blockly.Variables.NAME_TYPE);return varName+" \x3d "+argument0+";\n"};
Blockly.mbed["variables_set_type"]=function(block){var argument0=Blockly.mbed.valueToCode(block,"VARIABLE_SETTYPE_INPUT",Blockly.mbed.ORDER_ASSIGNMENT)||"0";var varType=Blockly.mbed.getmbedType_(Blockly.Types[block.getFieldValue("VARIABLE_SETTYPE_TYPE")]);if(varType==Blockly.Types.DigitalOut.typeId)argument0=argument0.replace(/"/g,"");var code="("+varType+")("+argument0+")";return[code,Blockly.mbed.ORDER_ATOMIC]};