update randomInt function
This commit is contained in:
		
							parent
							
								
									da65e23d3f
								
							
						
					
					
						commit
						59142b4c25
					
				| @ -1,5 +1,4 @@ | |||||||
| 
 | import * as Blockly from "blockly/core"; | ||||||
| import * as Blockly from 'blockly/core'; |  | ||||||
| 
 | 
 | ||||||
| /** | /** | ||||||
|  * @license Licensed under the Apache License, Version 2.0 (the "License"): |  * @license Licensed under the Apache License, Version 2.0 (the "License"): | ||||||
| @ -19,15 +18,15 @@ import * as Blockly from 'blockly/core'; | |||||||
|  * @param {!Blockly.Block} block Block to generate the code from. |  * @param {!Blockly.Block} block Block to generate the code from. | ||||||
|  * @return {array} Completed code with order of operation. |  * @return {array} Completed code with order of operation. | ||||||
|  */ |  */ | ||||||
| Blockly.Arduino['math_number'] = function (block) { | Blockly.Arduino["math_number"] = function (block) { | ||||||
|     // Numeric value.
 |   // Numeric value.
 | ||||||
|     var code = parseFloat(block.getFieldValue('NUM')); |   var code = parseFloat(block.getFieldValue("NUM")); | ||||||
|     if (code === Infinity) { |   if (code === Infinity) { | ||||||
|         code = 'INFINITY'; |     code = "INFINITY"; | ||||||
|     } else if (code === -Infinity) { |   } else if (code === -Infinity) { | ||||||
|         code = '-INFINITY'; |     code = "-INFINITY"; | ||||||
|     } |   } | ||||||
|     return [code, Blockly.Arduino.ORDER_ATOMIC]; |   return [code, Blockly.Arduino.ORDER_ATOMIC]; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| /** | /** | ||||||
| @ -37,27 +36,27 @@ Blockly.Arduino['math_number'] = function (block) { | |||||||
|  * @param {!Blockly.Block} block Block to generate the code from. |  * @param {!Blockly.Block} block Block to generate the code from. | ||||||
|  * @return {array} Completed code with order of operation. |  * @return {array} Completed code with order of operation. | ||||||
|  */ |  */ | ||||||
| Blockly.Arduino['math_arithmetic'] = function (block) { | Blockly.Arduino["math_arithmetic"] = function (block) { | ||||||
|     var OPERATORS = { |   var OPERATORS = { | ||||||
|         ADD: [' + ', Blockly.Arduino.ORDER_ADDITIVE], |     ADD: [" + ", Blockly.Arduino.ORDER_ADDITIVE], | ||||||
|         MINUS: [' - ', Blockly.Arduino.ORDER_ADDITIVE], |     MINUS: [" - ", Blockly.Arduino.ORDER_ADDITIVE], | ||||||
|         MULTIPLY: [' * ', Blockly.Arduino.ORDER_MULTIPLICATIVE], |     MULTIPLY: [" * ", Blockly.Arduino.ORDER_MULTIPLICATIVE], | ||||||
|         DIVIDE: [' / ', Blockly.Arduino.ORDER_MULTIPLICATIVE], |     DIVIDE: [" / ", Blockly.Arduino.ORDER_MULTIPLICATIVE], | ||||||
|         POWER: [null, Blockly.Arduino.ORDER_NONE]  // Handle power separately.
 |     POWER: [null, Blockly.Arduino.ORDER_NONE], // Handle power separately.
 | ||||||
|     }; |   }; | ||||||
|     var tuple = OPERATORS[block.getFieldValue('OP')]; |   var tuple = OPERATORS[block.getFieldValue("OP")]; | ||||||
|     var operator = tuple[0]; |   var operator = tuple[0]; | ||||||
|     var order = tuple[1]; |   var order = tuple[1]; | ||||||
|     var argument0 = Blockly.Arduino.valueToCode(block, 'A', order) || '0'; |   var argument0 = Blockly.Arduino.valueToCode(block, "A", order) || "0"; | ||||||
|     var argument1 = Blockly.Arduino.valueToCode(block, 'B', order) || '0'; |   var argument1 = Blockly.Arduino.valueToCode(block, "B", order) || "0"; | ||||||
|     var code; |   var code; | ||||||
|     // Power in C++ requires a special case since it has no operator.
 |   // Power in C++ requires a special case since it has no operator.
 | ||||||
|     if (!operator) { |   if (!operator) { | ||||||
|         code = 'Math.pow(' + argument0 + ', ' + argument1 + ')'; |     code = "Math.pow(" + argument0 + ", " + argument1 + ")"; | ||||||
|         return [code, Blockly.Arduino.ORDER_UNARY_POSTFIX]; |     return [code, Blockly.Arduino.ORDER_UNARY_POSTFIX]; | ||||||
|     } |   } | ||||||
|     code = argument0 + operator + argument1; |   code = argument0 + operator + argument1; | ||||||
|     return [code, order]; |   return [code, order]; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| /** | /** | ||||||
| @ -66,90 +65,103 @@ Blockly.Arduino['math_arithmetic'] = function (block) { | |||||||
|  * @param {!Blockly.Block} block Block to generate the code from. |  * @param {!Blockly.Block} block Block to generate the code from. | ||||||
|  * @return {array} Completed code with order of operation. |  * @return {array} Completed code with order of operation. | ||||||
|  */ |  */ | ||||||
| Blockly.Arduino['math_single'] = function (block) { | Blockly.Arduino["math_single"] = function (block) { | ||||||
|     var operator = block.getFieldValue('OP'); |   var operator = block.getFieldValue("OP"); | ||||||
|     var code; |   var code; | ||||||
|     var arg; |   var arg; | ||||||
|     if (operator === 'NEG') { |   if (operator === "NEG") { | ||||||
|         // Negation is a special case given its different operator precedents.
 |     // Negation is a special case given its different operator precedents.
 | ||||||
|         arg = Blockly.Arduino.valueToCode(block, 'NUM', |     arg = | ||||||
|             Blockly.Arduino.ORDER_UNARY_PREFIX) || '0'; |       Blockly.Arduino.valueToCode( | ||||||
|         if (arg[0] === '-') { |         block, | ||||||
|             // --3 is not legal in C++ in this context.
 |         "NUM", | ||||||
|             arg = ' ' + arg; |         Blockly.Arduino.ORDER_UNARY_PREFIX | ||||||
|         } |       ) || "0"; | ||||||
|         code = '-' + arg; |     if (arg[0] === "-") { | ||||||
|         return [code, Blockly.Arduino.ORDER_UNARY_PREFIX]; |       // --3 is not legal in C++ in this context.
 | ||||||
|  |       arg = " " + arg; | ||||||
|     } |     } | ||||||
|     if (operator === 'ABS' || operator.substring(0, 5) === 'ROUND') { |     code = "-" + arg; | ||||||
|         arg = Blockly.Arduino.valueToCode(block, 'NUM', |     return [code, Blockly.Arduino.ORDER_UNARY_PREFIX]; | ||||||
|             Blockly.Arduino.ORDER_UNARY_POSTFIX) || '0'; |   } | ||||||
|     } else if (operator === 'SIN' || operator === 'COS' || operator === 'TAN') { |   if (operator === "ABS" || operator.substring(0, 5) === "ROUND") { | ||||||
|         arg = Blockly.Arduino.valueToCode(block, 'NUM', |     arg = | ||||||
|             Blockly.Arduino.ORDER_MULTIPLICATIVE) || '0'; |       Blockly.Arduino.valueToCode( | ||||||
|     } else { |         block, | ||||||
|         arg = Blockly.Arduino.valueToCode(block, 'NUM', |         "NUM", | ||||||
|             Blockly.Arduino.ORDER_NONE) || '0'; |         Blockly.Arduino.ORDER_UNARY_POSTFIX | ||||||
|     } |       ) || "0"; | ||||||
|     // First, handle cases which generate values that don't need parentheses.
 |   } else if (operator === "SIN" || operator === "COS" || operator === "TAN") { | ||||||
|     switch (operator) { |     arg = | ||||||
|         case 'ABS': |       Blockly.Arduino.valueToCode( | ||||||
|             code = 'abs(' + arg + ')'; |         block, | ||||||
|             break; |         "NUM", | ||||||
|         case 'ROOT': |         Blockly.Arduino.ORDER_MULTIPLICATIVE | ||||||
|             code = 'sqrt(' + arg + ')'; |       ) || "0"; | ||||||
|             break; |   } else { | ||||||
|         case 'LN': |     arg = | ||||||
|             code = 'log(' + arg + ')'; |       Blockly.Arduino.valueToCode(block, "NUM", Blockly.Arduino.ORDER_NONE) || | ||||||
|             break; |       "0"; | ||||||
|         case 'EXP': |   } | ||||||
|             code = 'exp(' + arg + ')'; |   // First, handle cases which generate values that don't need parentheses.
 | ||||||
|             break; |   switch (operator) { | ||||||
|         case 'POW10': |     case "ABS": | ||||||
|             code = 'pow(10,' + arg + ')'; |       code = "abs(" + arg + ")"; | ||||||
|             break; |       break; | ||||||
|         case 'ROUND': |     case "ROOT": | ||||||
|             code = 'round(' + arg + ')'; |       code = "sqrt(" + arg + ")"; | ||||||
|             break; |       break; | ||||||
|         case 'ROUNDUP': |     case "LN": | ||||||
|             code = 'ceil(' + arg + ')'; |       code = "log(" + arg + ")"; | ||||||
|             break; |       break; | ||||||
|         case 'ROUNDDOWN': |     case "EXP": | ||||||
|             code = 'floor(' + arg + ')'; |       code = "exp(" + arg + ")"; | ||||||
|             break; |       break; | ||||||
|         case 'SIN': |     case "POW10": | ||||||
|             code = 'sin(' + arg + ' / 180 * Math.PI)'; |       code = "pow(10," + arg + ")"; | ||||||
|             break; |       break; | ||||||
|         case 'COS': |     case "ROUND": | ||||||
|             code = 'cos(' + arg + ' / 180 * Math.PI)'; |       code = "round(" + arg + ")"; | ||||||
|             break; |       break; | ||||||
|         case 'TAN': |     case "ROUNDUP": | ||||||
|             code = 'tan(' + arg + ' / 180 * Math.PI)'; |       code = "ceil(" + arg + ")"; | ||||||
|             break; |       break; | ||||||
|         default: |     case "ROUNDDOWN": | ||||||
|             break; |       code = "floor(" + arg + ")"; | ||||||
|     } |       break; | ||||||
|     if (code) { |     case "SIN": | ||||||
|         return [code, Blockly.Arduino.ORDER_UNARY_POSTFIX]; |       code = "sin(" + arg + " / 180 * Math.PI)"; | ||||||
|     } |       break; | ||||||
|     // Second, handle cases which generate values that may need parentheses.
 |     case "COS": | ||||||
|     switch (operator) { |       code = "cos(" + arg + " / 180 * Math.PI)"; | ||||||
|         case 'LOG10': |       break; | ||||||
|             code = 'log(' + arg + ') / log(10)'; |     case "TAN": | ||||||
|             break; |       code = "tan(" + arg + " / 180 * Math.PI)"; | ||||||
|         case 'ASIN': |       break; | ||||||
|             code = 'asin(' + arg + ') / M_PI * 180'; |     default: | ||||||
|             break; |       break; | ||||||
|         case 'ACOS': |   } | ||||||
|             code = 'acos(' + arg + ') / M_PI * 180'; |   if (code) { | ||||||
|             break; |     return [code, Blockly.Arduino.ORDER_UNARY_POSTFIX]; | ||||||
|         case 'ATAN': |   } | ||||||
|             code = 'atan(' + arg + ') / M_PI * 180'; |   // Second, handle cases which generate values that may need parentheses.
 | ||||||
|             break; |   switch (operator) { | ||||||
|         default: |     case "LOG10": | ||||||
|             throw new Error('Unknown math operator: ' + operator); |       code = "log(" + arg + ") / log(10)"; | ||||||
|     } |       break; | ||||||
|     return [code, Blockly.Arduino.ORDER_MULTIPLICATIVE]; |     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 new Error("Unknown math operator: " + operator); | ||||||
|  |   } | ||||||
|  |   return [code, Blockly.Arduino.ORDER_MULTIPLICATIVE]; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| /** | /** | ||||||
| @ -161,16 +173,16 @@ Blockly.Arduino['math_single'] = function (block) { | |||||||
|  * @param {!Blockly.Block} block Block to generate the code from. |  * @param {!Blockly.Block} block Block to generate the code from. | ||||||
|  * @return {string} Completed code. |  * @return {string} Completed code. | ||||||
|  */ |  */ | ||||||
| Blockly.Arduino['math_constant'] = function (block) { | Blockly.Arduino["math_constant"] = function (block) { | ||||||
|     var CONSTANTS = { |   var CONSTANTS = { | ||||||
|         'PI': ['M_PI', Blockly.Arduino.ORDER_UNARY_POSTFIX], |     PI: ["M_PI", Blockly.Arduino.ORDER_UNARY_POSTFIX], | ||||||
|         'E': ['M_E', Blockly.Arduino.ORDER_UNARY_POSTFIX], |     E: ["M_E", Blockly.Arduino.ORDER_UNARY_POSTFIX], | ||||||
|         'GOLDEN_RATIO': ['(1 + sqrt(5)) / 2', Blockly.Arduino.ORDER_MULTIPLICATIVE], |     GOLDEN_RATIO: ["(1 + sqrt(5)) / 2", Blockly.Arduino.ORDER_MULTIPLICATIVE], | ||||||
|         'SQRT2': ['M_SQRT2', Blockly.Arduino.ORDER_UNARY_POSTFIX], |     SQRT2: ["M_SQRT2", Blockly.Arduino.ORDER_UNARY_POSTFIX], | ||||||
|         'SQRT1_2': ['M_SQRT1_2', Blockly.Arduino.ORDER_UNARY_POSTFIX], |     SQRT1_2: ["M_SQRT1_2", Blockly.Arduino.ORDER_UNARY_POSTFIX], | ||||||
|         'INFINITY': ['INFINITY', Blockly.Arduino.ORDER_ATOMIC] |     INFINITY: ["INFINITY", Blockly.Arduino.ORDER_ATOMIC], | ||||||
|     }; |   }; | ||||||
|     return CONSTANTS[block.getFieldValue('CONSTANT')]; |   return CONSTANTS[block.getFieldValue("CONSTANT")]; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| /** | /** | ||||||
| @ -180,63 +192,72 @@ Blockly.Arduino['math_constant'] = function (block) { | |||||||
|  * @param {!Blockly.Block} block Block to generate the code from. |  * @param {!Blockly.Block} block Block to generate the code from. | ||||||
|  * @return {array} Completed code with order of operation. |  * @return {array} Completed code with order of operation. | ||||||
|  */ |  */ | ||||||
| Blockly.Arduino['math_number_property'] = function (block) { | Blockly.Arduino["math_number_property"] = function (block) { | ||||||
|     var number_to_check = Blockly.Arduino.valueToCode(block, 'NUMBER_TO_CHECK', |   var number_to_check = | ||||||
|         Blockly.Arduino.ORDER_MULTIPLICATIVE) || '0'; |     Blockly.Arduino.valueToCode( | ||||||
|     var dropdown_property = block.getFieldValue('PROPERTY'); |       block, | ||||||
|     var code; |       "NUMBER_TO_CHECK", | ||||||
|     if (dropdown_property === 'PRIME') { |       Blockly.Arduino.ORDER_MULTIPLICATIVE | ||||||
|         var func = [ |     ) || "0"; | ||||||
|             'boolean ' + Blockly.Arduino.DEF_FUNC_NAME + '(int n) {', |   var dropdown_property = block.getFieldValue("PROPERTY"); | ||||||
|             '  // https://en.wikipedia.org/wiki/Primality_test#Naive_methods', |   var code; | ||||||
|             '  if (n == 2 || n == 3) {', |   if (dropdown_property === "PRIME") { | ||||||
|             '    return true;', |     var func = [ | ||||||
|             '  }', |       "boolean " + Blockly.Arduino.DEF_FUNC_NAME + "(int n) {", | ||||||
|             '  // False if n is NaN, negative, is 1.', |       "  // https://en.wikipedia.org/wiki/Primality_test#Naive_methods", | ||||||
|             '  // And false if n is divisible by 2 or 3.', |       "  if (n == 2 || n == 3) {", | ||||||
|             '  if (isnan(n) || (n <= 1) || (n == 1) || (n % 2 == 0) || ' + |       "    return true;", | ||||||
|             '(n % 3 == 0)) {', |       "  }", | ||||||
|             '    return false;', |       "  // False if n is NaN, negative, is 1.", | ||||||
|             '  }', |       "  // And false if n is divisible by 2 or 3.", | ||||||
|             '  // Check all the numbers of form 6k +/- 1, up to sqrt(n).', |       "  if (isnan(n) || (n <= 1) || (n == 1) || (n % 2 == 0) || " + | ||||||
|             '  for (int x = 6; x <= sqrt(n) + 1; x += 6) {', |         "(n % 3 == 0)) {", | ||||||
|             '    if (n % (x - 1) == 0 || n % (x + 1) == 0) {', |       "    return false;", | ||||||
|             '      return false;', |       "  }", | ||||||
|             '    }', |       "  // Check all the numbers of form 6k +/- 1, up to sqrt(n).", | ||||||
|             '  }', |       "  for (int x = 6; x <= sqrt(n) + 1; x += 6) {", | ||||||
|             '  return true;', |       "    if (n % (x - 1) == 0 || n % (x + 1) == 0) {", | ||||||
|             '}']; |       "      return false;", | ||||||
|         var funcName = Blockly.Arduino.addFunction('mathIsPrime', func.join('\n')); |       "    }", | ||||||
|         Blockly.Arduino.addInclude('math', '#include <math.h>'); |       "  }", | ||||||
|         code = funcName + '(' + number_to_check + ')'; |       "  return true;", | ||||||
|         return [code, Blockly.Arduino.ORDER_UNARY_POSTFIX]; |       "}", | ||||||
|     } |     ]; | ||||||
|     switch (dropdown_property) { |     var funcName = Blockly.Arduino.addFunction("mathIsPrime", func.join("\n")); | ||||||
|         case 'EVEN': |     Blockly.Arduino.addInclude("math", "#include <math.h>"); | ||||||
|             code = number_to_check + ' % 2 == 0'; |     code = funcName + "(" + number_to_check + ")"; | ||||||
|             break; |     return [code, Blockly.Arduino.ORDER_UNARY_POSTFIX]; | ||||||
|         case 'ODD': |   } | ||||||
|             code = number_to_check + ' % 2 == 1'; |   switch (dropdown_property) { | ||||||
|             break; |     case "EVEN": | ||||||
|         case 'WHOLE': |       code = number_to_check + " % 2 == 0"; | ||||||
|             Blockly.Arduino.addInclude('math', '#include <math.h>'); |       break; | ||||||
|             code = '(floor(' + number_to_check + ') == ' + number_to_check + ')'; |     case "ODD": | ||||||
|             break; |       code = number_to_check + " % 2 == 1"; | ||||||
|         case 'POSITIVE': |       break; | ||||||
|             code = number_to_check + ' > 0'; |     case "WHOLE": | ||||||
|             break; |       Blockly.Arduino.addInclude("math", "#include <math.h>"); | ||||||
|         case 'NEGATIVE': |       code = "(floor(" + number_to_check + ") == " + number_to_check + ")"; | ||||||
|             code = number_to_check + ' < 0'; |       break; | ||||||
|             break; |     case "POSITIVE": | ||||||
|         case 'DIVISIBLE_BY': |       code = number_to_check + " > 0"; | ||||||
|             var divisor = Blockly.Arduino.valueToCode(block, 'DIVISOR', |       break; | ||||||
|                 Blockly.Arduino.ORDER_MULTIPLICATIVE) || '0'; |     case "NEGATIVE": | ||||||
|             code = number_to_check + ' % ' + divisor + ' == 0'; |       code = number_to_check + " < 0"; | ||||||
|             break; |       break; | ||||||
|         default: |     case "DIVISIBLE_BY": | ||||||
|             break; |       var divisor = | ||||||
|     } |         Blockly.Arduino.valueToCode( | ||||||
|     return [code, Blockly.Arduino.ORDER_EQUALITY]; |           block, | ||||||
|  |           "DIVISOR", | ||||||
|  |           Blockly.Arduino.ORDER_MULTIPLICATIVE | ||||||
|  |         ) || "0"; | ||||||
|  |       code = number_to_check + " % " + divisor + " == 0"; | ||||||
|  |       break; | ||||||
|  |     default: | ||||||
|  |       break; | ||||||
|  |   } | ||||||
|  |   return [code, Blockly.Arduino.ORDER_EQUALITY]; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| /** | /** | ||||||
| @ -247,19 +268,25 @@ Blockly.Arduino['math_number_property'] = function (block) { | |||||||
|  * @param {!Blockly.Block} block Block to generate the code from. |  * @param {!Blockly.Block} block Block to generate the code from. | ||||||
|  * @return {array} Completed code with order of operation. |  * @return {array} Completed code with order of operation. | ||||||
|  */ |  */ | ||||||
| Blockly.Arduino['math_change'] = function (block) { | Blockly.Arduino["math_change"] = function (block) { | ||||||
|     var argument0 = Blockly.Arduino.valueToCode(block, 'DELTA', |   var argument0 = | ||||||
|         Blockly.Arduino.ORDER_ADDITIVE) || '0'; |     Blockly.Arduino.valueToCode( | ||||||
|     var varName = Blockly.Arduino.variableDB_.getName( |       block, | ||||||
|         block.getFieldValue('VAR'), Blockly.Variables.NAME_TYPE); |       "DELTA", | ||||||
|     return varName + ' += ' + argument0 + ';\n'; |       Blockly.Arduino.ORDER_ADDITIVE | ||||||
|  |     ) || "0"; | ||||||
|  |   var varName = Blockly.Arduino.variableDB_.getName( | ||||||
|  |     block.getFieldValue("VAR"), | ||||||
|  |     Blockly.Variables.NAME_TYPE | ||||||
|  |   ); | ||||||
|  |   return varName + " += " + argument0 + ";\n"; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| /** Rounding functions have a single operand. */ | /** Rounding functions have a single operand. */ | ||||||
| Blockly.Arduino['math_round'] = Blockly.Arduino['math_single']; | Blockly.Arduino["math_round"] = Blockly.Arduino["math_single"]; | ||||||
| 
 | 
 | ||||||
| /** Trigonometry functions have a single operand. */ | /** Trigonometry functions have a single operand. */ | ||||||
| Blockly.Arduino['math_trig'] = Blockly.Arduino['math_single']; | Blockly.Arduino["math_trig"] = Blockly.Arduino["math_single"]; | ||||||
| 
 | 
 | ||||||
| /** | /** | ||||||
|  * Generator for the math function to a list. |  * Generator for the math function to a list. | ||||||
| @ -268,7 +295,7 @@ Blockly.Arduino['math_trig'] = Blockly.Arduino['math_single']; | |||||||
|  * @param {!Blockly.Block} block Block to generate the code from. |  * @param {!Blockly.Block} block Block to generate the code from. | ||||||
|  * @return {array} Completed code with order of operation. |  * @return {array} Completed code with order of operation. | ||||||
|  */ |  */ | ||||||
| Blockly.Arduino['math_on_list'] = Blockly.Arduino.noGeneratorCodeInline; | Blockly.Arduino["math_on_list"] = Blockly.Arduino.noGeneratorCodeInline; | ||||||
| 
 | 
 | ||||||
| /** | /** | ||||||
|  * Generator for the math modulo function (calculates remainder of X/Y). |  * Generator for the math modulo function (calculates remainder of X/Y). | ||||||
| @ -276,13 +303,21 @@ Blockly.Arduino['math_on_list'] = Blockly.Arduino.noGeneratorCodeInline; | |||||||
|  * @param {!Blockly.Block} block Block to generate the code from. |  * @param {!Blockly.Block} block Block to generate the code from. | ||||||
|  * @return {array} Completed code with order of operation. |  * @return {array} Completed code with order of operation. | ||||||
|  */ |  */ | ||||||
| Blockly.Arduino['math_modulo'] = function (block) { | Blockly.Arduino["math_modulo"] = function (block) { | ||||||
|     var argument0 = Blockly.Arduino.valueToCode(block, 'DIVIDEND', |   var argument0 = | ||||||
|         Blockly.Arduino.ORDER_MULTIPLICATIVE) || '0'; |     Blockly.Arduino.valueToCode( | ||||||
|     var argument1 = Blockly.Arduino.valueToCode(block, 'DIVISOR', |       block, | ||||||
|         Blockly.Arduino.ORDER_MULTIPLICATIVE) || '0'; |       "DIVIDEND", | ||||||
|     var code = argument0 + ' % ' + argument1; |       Blockly.Arduino.ORDER_MULTIPLICATIVE | ||||||
|     return [code, Blockly.Arduino.ORDER_MULTIPLICATIVE]; |     ) || "0"; | ||||||
|  |   var argument1 = | ||||||
|  |     Blockly.Arduino.valueToCode( | ||||||
|  |       block, | ||||||
|  |       "DIVISOR", | ||||||
|  |       Blockly.Arduino.ORDER_MULTIPLICATIVE | ||||||
|  |     ) || "0"; | ||||||
|  |   var code = argument0 + " % " + argument1; | ||||||
|  |   return [code, Blockly.Arduino.ORDER_MULTIPLICATIVE]; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| /** | /** | ||||||
| @ -291,18 +326,34 @@ Blockly.Arduino['math_modulo'] = function (block) { | |||||||
|  * @param {!Blockly.Block} block Block to generate the code from. |  * @param {!Blockly.Block} block Block to generate the code from. | ||||||
|  * @return {array} Completed code with order of operation. |  * @return {array} Completed code with order of operation. | ||||||
|  */ |  */ | ||||||
| Blockly.Arduino['math_constrain'] = function (block) { | Blockly.Arduino["math_constrain"] = function (block) { | ||||||
|     // Constrain a number between two limits.
 |   // Constrain a number between two limits.
 | ||||||
|     var argument0 = Blockly.Arduino.valueToCode(block, 'VALUE', |   var argument0 = | ||||||
|         Blockly.Arduino.ORDER_NONE) || '0'; |     Blockly.Arduino.valueToCode(block, "VALUE", Blockly.Arduino.ORDER_NONE) || | ||||||
|     var argument1 = Blockly.Arduino.valueToCode(block, 'LOW', |     "0"; | ||||||
|         Blockly.Arduino.ORDER_NONE) || '0'; |   var argument1 = | ||||||
|     var argument2 = Blockly.Arduino.valueToCode(block, 'HIGH', |     Blockly.Arduino.valueToCode(block, "LOW", Blockly.Arduino.ORDER_NONE) || | ||||||
|         Blockly.Arduino.ORDER_NONE) || '0'; |     "0"; | ||||||
|     var code = '(' + argument0 + ' < ' + argument1 + ' ? ' + argument1 + |   var argument2 = | ||||||
|         ' : ( ' + argument0 + ' > ' + argument2 + ' ? ' + argument2 + ' : ' + |     Blockly.Arduino.valueToCode(block, "HIGH", Blockly.Arduino.ORDER_NONE) || | ||||||
|         argument0 + '))'; |     "0"; | ||||||
|     return [code, Blockly.Arduino.ORDER_UNARY_POSTFIX]; |   var code = | ||||||
|  |     "(" + | ||||||
|  |     argument0 + | ||||||
|  |     " < " + | ||||||
|  |     argument1 + | ||||||
|  |     " ? " + | ||||||
|  |     argument1 + | ||||||
|  |     " : ( " + | ||||||
|  |     argument0 + | ||||||
|  |     " > " + | ||||||
|  |     argument2 + | ||||||
|  |     " ? " + | ||||||
|  |     argument2 + | ||||||
|  |     " : " + | ||||||
|  |     argument0 + | ||||||
|  |     "))"; | ||||||
|  |   return [code, Blockly.Arduino.ORDER_UNARY_POSTFIX]; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| /** | /** | ||||||
| @ -312,28 +363,26 @@ Blockly.Arduino['math_constrain'] = function (block) { | |||||||
|  * @param {!Blockly.Block} block Block to generate the code from. |  * @param {!Blockly.Block} block Block to generate the code from. | ||||||
|  * @return {array} Completed code with order of operation. |  * @return {array} Completed code with order of operation. | ||||||
|  */ |  */ | ||||||
| Blockly.Arduino['math_random_int'] = function (block) { | Blockly.Arduino["math_random_int"] = function (block) { | ||||||
|     var argument0 = Blockly.Arduino.valueToCode(block, 'FROM', |   var argument0 = | ||||||
|         Blockly.Arduino.ORDER_NONE) || '0'; |     Blockly.Arduino.valueToCode(block, "FROM", Blockly.Arduino.ORDER_NONE) || | ||||||
|     var argument1 = Blockly.Arduino.valueToCode(block, 'TO', |     "0"; | ||||||
|         Blockly.Arduino.ORDER_NONE) || '0'; |   var argument1 = | ||||||
|     var functionName = Blockly.Arduino.variableDB_.getDistinctName( |     Blockly.Arduino.valueToCode(block, "TO", Blockly.Arduino.ORDER_NONE) || "0"; | ||||||
|         'math_random_int', Blockly.Generator.NAME_TYPE); |   Blockly.Arduino.setupCode_["init_rand"] = "randomSeed(analogRead(0));"; | ||||||
|     Blockly.Arduino.setups_['init_rand'] = 'randomSeed(analogRead(0));'; |   Blockly.Arduino.functionNames_[ | ||||||
|     Blockly.Arduino.math_random_int.random_function = functionName; |     "math_random_int" | ||||||
|     var func = [ |   ] = `int mathRandomInt (int min, int max) {\n | ||||||
|         'int ' + Blockly.Arduino.DEF_FUNC_NAME + '(int min, int max) {', |       if (min > max) { | ||||||
|         '  if (min > max) {', |         int temp = min; | ||||||
|         '    // Swap min and max to ensure min is smaller.', |         min = max; | ||||||
|         '    int temp = min;', |         max = temp; | ||||||
|         '    min = max;', |       } | ||||||
|         '    max = temp;', |       return min + (rand() % (max - min + 1)); | ||||||
|         '  }', |     } | ||||||
|         '  return min + (rand() % (max - min + 1));', |     `;
 | ||||||
|         '}']; |   var code = `mathRandomInt(${argument0},${argument1});`; | ||||||
|     var funcName = Blockly.Arduino.addFunction('mathRandomInt', func.join('\n')); |   return [code, Blockly.Arduino.ORDER_ATOMIC]; | ||||||
|     var code = funcName + '(' + argument0 + ', ' + argument1 + ')'; |  | ||||||
|     return [code, Blockly.Arduino.ORDER_UNARY_POSTFIX]; |  | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| /** | /** | ||||||
| @ -342,6 +391,6 @@ Blockly.Arduino['math_random_int'] = function (block) { | |||||||
|  * @param {!Blockly.Block} block Block to generate the code from. |  * @param {!Blockly.Block} block Block to generate the code from. | ||||||
|  * @return {string} Completed code. |  * @return {string} Completed code. | ||||||
|  */ |  */ | ||||||
| Blockly.Arduino['math_random_float'] = function (block) { | Blockly.Arduino["math_random_float"] = function (block) { | ||||||
|     return ['(rand() / RAND_MAX)', Blockly.Arduino.ORDER_UNARY_POSTFIX]; |   return ["(rand() / RAND_MAX)", Blockly.Arduino.ORDER_UNARY_POSTFIX]; | ||||||
| }; | }; | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user